From 4779ebc5cbc74104f02481b7b5e0e9fb9e076032 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Tue, 28 Apr 2026 23:21:02 -0400 Subject: [PATCH 01/12] WIP: vivid-wren-534 --- src/v3/compiler/src/dag.rs | 34 +++++++++++++++++++ ...impossiblebugs_nested_optional_flatten.dag | 22 ++++++++++++ .../int_literal_cardinality_test.rs | 15 ++++++++ .../integration/t_pb_b_1_dag_runner_test.rs | 13 +++++++ 4 files changed, 84 insertions(+) create mode 100644 src/v3/compiler/tests/dag/t_impossiblebugs_nested_optional_flatten.dag diff --git a/src/v3/compiler/src/dag.rs b/src/v3/compiler/src/dag.rs index df9361d10c6..39e7ab844ed 100644 --- a/src/v3/compiler/src/dag.rs +++ b/src/v3/compiler/src/dag.rs @@ -3945,4 +3945,38 @@ mod tests { canonical `Int?` decl (recursive alias chain, not one step)" ); } + + #[test] + fn cardinality_idempotence_does_not_collapse_non_at_most_one_inner_bound() { + let mut dag = Dag::new(); + dag.populate_primitive_cache(); + let int_decl = dag.int_shape().expect("bootstrap Int").declaration; + let exact_two = push_test_declaration( + &mut dag, + None, + TypeConnective::Cardinality(CardinalityPayload::new_unchecked( + int_decl, + CardinalityBound::Exact(2), + )), + Vec::new(), + ); + + assert_eq!( + cardinality_idempotent_target(&dag, exact_two, CardinalityBound::AtMostOne), + None, + "AtMostOne over Exact(2) is optional fixed-cardinality, not nested optional" + ); + + let optional_exact_two = dag.alloc_cardinality_decl( + exact_two, + CardinalityBound::AtMostOne, + SourceSpan::new("cardinality_exact_spoof_test", 0, 0), + ); + let TypeConnective::Cardinality(payload) = &dag.declaration(optional_exact_two).connective + else { + panic!("optional Exact(2) should remain a Cardinality declaration"); + }; + assert_eq!(payload.element(), exact_two); + assert_eq!(payload.bound(), CardinalityBound::AtMostOne); + } } diff --git a/src/v3/compiler/tests/dag/t_impossiblebugs_nested_optional_flatten.dag b/src/v3/compiler/tests/dag/t_impossiblebugs_nested_optional_flatten.dag new file mode 100644 index 00000000000..0587f9ceb38 --- /dev/null +++ b/src/v3/compiler/tests/dag/t_impossiblebugs_nested_optional_flatten.dag @@ -0,0 +1,22 @@ +// T-ImpossibleBugs nested-optional flatten class-close gate. +// +// The claim program typechecks only if the surface `Int??` parameter lowers to +// the same cardinality shape as `Int?`; without the constructor invariant, the +// return annotation would require `Int?` while the body carries `Int??`. + +module v3.compiler.tests.t_impossiblebugs.nested_optional_flatten + +import std.verification { TestClaim, TestSuite, TestPredicate } + +data nested_optional_flatten_compile_error: TestClaim = { + name: "nested_optional_flatten_compile_error", + source: "fn flatten_probe(x: Int??) -> Int? = x\n", + file_name: "nested_optional_flatten_compile_error.v3", + predicate: Compiles, + requires: [] +} + +data suite_nested_optional_flatten_class_close: TestSuite = { + name: "t-impossiblebugs/nested-optional-flatten/class-close", + claims: [nested_optional_flatten_compile_error] +} diff --git a/src/v3/compiler/tests/integration/int_literal_cardinality_test.rs b/src/v3/compiler/tests/integration/int_literal_cardinality_test.rs index 5f444fc8c4d..ad015c866e1 100644 --- a/src/v3/compiler/tests/integration/int_literal_cardinality_test.rs +++ b/src/v3/compiler/tests/integration/int_literal_cardinality_test.rs @@ -548,6 +548,21 @@ fn nested_optional_flatten_holds_in_bootstrap_dag() { assert_no_nested_at_most_one(&dag, "bootstrap"); } +#[test] +fn nested_optional_flatten_holds_for_surface_double_question() { + let src = "\ +fn flatten_probe(x: Int??) -> Int? = x +"; + let dag = compile_to_dag(src, "nested_optional_surface_double_question.v3") + .expect("surface Int?? should silently normalize to Int?"); + assert!( + dag.diagnostics().is_empty(), + "surface nested optional should be diagnostic-free, got: {:?}", + dag.diagnostics() + ); + assert_no_nested_at_most_one(&dag, "surface T??"); +} + #[test] fn nested_optional_flatten_via_generic_specialization() { // `unwrap_id` is generic over T and takes/returns `T?`. Calling it with diff --git a/src/v3/compiler/tests/integration/t_pb_b_1_dag_runner_test.rs b/src/v3/compiler/tests/integration/t_pb_b_1_dag_runner_test.rs index 815cdf76c59..4008ed57218 100644 --- a/src/v3/compiler/tests/integration/t_pb_b_1_dag_runner_test.rs +++ b/src/v3/compiler/tests/integration/t_pb_b_1_dag_runner_test.rs @@ -126,6 +126,19 @@ fn t_pb_b_1_execute_command_boundary_suite_passes_through_runner() { run_suite_all_pass(&dag, "suite_execute_command_boundary"); } +#[test] +fn t_impossiblebugs_nested_optional_flatten_suite_passes_through_runner() { + let dag = lower( + include_str!("../dag/t_impossiblebugs_nested_optional_flatten.dag"), + "src/v3/compiler/tests/dag/t_impossiblebugs_nested_optional_flatten.dag", + ); + run_suite_all_pass_with_expected_claim_names( + &dag, + "suite_nested_optional_flatten_class_close", + &["nested_optional_flatten_compile_error"], + ); +} + /// R1 gate suites from `tests/fixtures/r1_gates.dag` — same `TestClaim` authority and /// exact `claim_name` receipt as the retired /// `r1_manual_claim_gate_test` / `testgen_structural_coverage_gate_test` shims. From 6224f58adf0feb9bd97fd3b3598a2a39ceaf6e63 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Wed, 29 Apr 2026 03:23:24 +0000 Subject: [PATCH 02/12] test(v3): fix nested optional spoof regression setup --- src/v3/compiler/src/dag.rs | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/v3/compiler/src/dag.rs b/src/v3/compiler/src/dag.rs index 39e7ab844ed..9008248f28f 100644 --- a/src/v3/compiler/src/dag.rs +++ b/src/v3/compiler/src/dag.rs @@ -3951,15 +3951,24 @@ mod tests { let mut dag = Dag::new(); dag.populate_primitive_cache(); let int_decl = dag.int_shape().expect("bootstrap Int").declaration; - let exact_two = push_test_declaration( - &mut dag, - None, - TypeConnective::Cardinality(CardinalityPayload::new_unchecked( + let exact_two = dag.alloc_declaration_id(); + dag.push_declaration(Declaration { + id: exact_two, + name: None, + connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked( int_decl, CardinalityBound::Exact(2), )), - Vec::new(), - ); + type_params: Vec::new(), + phantom_params: Vec::new(), + meta_tag: None, + specialization_parent: None, + inhabits: None, + value_body: None, + refinement: None, + nominal_opacity: None, + span: SourceSpan::new("cardinality_exact_spoof_test", 0, 0), + }); assert_eq!( cardinality_idempotent_target(&dag, exact_two, CardinalityBound::AtMostOne), From c33f36c8cab09938b66c046870743971dccf756d Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Wed, 29 Apr 2026 19:16:05 -0400 Subject: [PATCH 03/12] WIP: vivid-wren-534 --- dsl/std/algebra.dag | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/dsl/std/algebra.dag b/dsl/std/algebra.dag index 104450fe38a..543e5b4073c 100644 --- a/dsl/std/algebra.dag +++ b/dsl/std/algebra.dag @@ -42,7 +42,8 @@ // Lattice | meet ∧ and join ∨ (both idempotent, absorptive) // BoundedLattice | top (⊤) and bottom (⊥) // BooleanAlgebra | complement (¬), distributive -// FreeMonoid | concat + empty; Int-indexed length/count + slice/index +// FreeMonoid | concat + empty; total access via List get(...)->T? +// | plus length/count + slice/first/last // // DENOTATIONAL GROUNDING: // @@ -164,8 +165,8 @@ type Ring { // OrderedRing: ring with a total order compatible with addition. // Adds: compare(T, T) -> Ordering // Derived: less_than, greater_than, min, max, abs -// Euclidean: quotient(T, T) -> T, remainder(T, T) -> T -// satisfying a = quotient(a,b) * b + remainder(a,b) +// Euclidean quotient/remainder are intentionally absent in v3 until a total +// Result-shaped surface exists; `/` is the checked division authority. // // Direct operator fields (sub, div, eq, ne, lt, le, gt, ge) are // declared so that v3's §8.9 inhabitance walk can resolve surface @@ -184,8 +185,6 @@ type OrderedRing { div: fn(T, T) -> Result one: T compare: fn(T, T) -> Ordering - quotient: fn(T, T) -> T - remainder: fn(T, T) -> T eq: fn(T, T) -> Bool ne: fn(T, T) -> Bool lt: fn(T, T) -> Bool @@ -291,8 +290,9 @@ type BooleanAlgebra { // // Declared surface (receiver-shaped fields — matches the record below): // Monoid: concat(self, other), empty, append(element) -// Int-indexed carrier: length(), count(), index(i: Int) -> T, slice(i, j), -// first() -> T?, last() -> T? +// Indexed carrier: length(), count(), slice(i, j), first() -> T?, +// last() -> T?; element lookup is total-only via `get(collection, index) -> T?` +// in std/primitives.dag, not a partial algebra field. // map: endomorphic fn(T) -> T -> FreeMonoid (not fn(T)->U with U free) // fold: monoid-shaped on T — init: T plus step fn(T, T) -> T -> T // (Those two stay on T because executable authority here cannot yet name @@ -303,8 +303,7 @@ type FreeMonoid { concat: fn(FreeMonoid, FreeMonoid) -> FreeMonoid empty: FreeMonoid append: fn(T) -> FreeMonoid - // Positional access — falls out of the carrier being Fin(n) → T - index: fn(Int) -> T + // Positional access — partial direct indexing is intentionally absent. slice: fn(Int, Int) -> FreeMonoid length: fn() -> Int count: fn() -> Int @@ -476,8 +475,6 @@ fn ordered_ring_templates() -> List { { name: "mul", param_types: [ReceiverSelf, ReceiverSelf], return_type: ReceiverSelf, size_effect: none, cost_shape: none, callback_element_position: none }, { name: "one", param_types: [], return_type: ReceiverSelf, size_effect: none, cost_shape: none, callback_element_position: none }, { name: "compare", param_types: [ReceiverSelf, ReceiverSelf], return_type: NamedTemplate { name: "Ordering" }, size_effect: none, cost_shape: none, callback_element_position: none }, - { name: "quotient", param_types: [ReceiverSelf, ReceiverSelf], return_type: ReceiverSelf, size_effect: none, cost_shape: none, callback_element_position: none }, - { name: "remainder", param_types: [ReceiverSelf, ReceiverSelf], return_type: ReceiverSelf, size_effect: none, cost_shape: none, callback_element_position: none }, { name: "clamp", param_types: [ReceiverSelf, ReceiverSelf, ReceiverSelf], return_type: ReceiverSelf, size_effect: none, cost_shape: Some { value: ShapeConstant }, callback_element_position: none } ] } From dcbb1f87b79bd7998d4d675b85d606d4aee4d364 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Wed, 29 Apr 2026 19:19:02 -0400 Subject: [PATCH 04/12] WIP: vivid-wren-534 --- dsl/std/methods.dag | 4 +- src/v3/compiler/src/bootstrap_generated.rs | 4241 ++++++++--------- ...otstrap_generated_without_parse_surface.rs | 4075 ++++++++-------- .../compiler/src/bootstrap_std_generated.rs | 2062 ++++---- 4 files changed, 5130 insertions(+), 5252 deletions(-) diff --git a/dsl/std/methods.dag b/dsl/std/methods.dag index 461e20634ef..7588cf74ad5 100644 --- a/dsl/std/methods.dag +++ b/dsl/std/methods.dag @@ -65,7 +65,7 @@ type MethodDeclaration { // --------------------------------------------------------------------------- // Method-name registry. One `data` binding per unique method name carried by // the seven per-profile algebra template lists in `dsl/std/algebra.dag`. -// Sorted alphabetically; 63 entries. Each binding is a `MethodDeclaration` +// Sorted alphabetically. Each binding is a `MethodDeclaration` // with the `name` field matching the string used in algebra templates. // --------------------------------------------------------------------------- @@ -111,9 +111,7 @@ data member_method: MethodDeclaration = { name: "member" } data mul_method: MethodDeclaration = { name: "mul" } data negate_method: MethodDeclaration = { name: "negate" } data one_method: MethodDeclaration = { name: "one" } -data quotient_method: MethodDeclaration = { name: "quotient" } data reciprocal_method: MethodDeclaration = { name: "reciprocal" } -data remainder_method: MethodDeclaration = { name: "remainder" } data replace_method: MethodDeclaration = { name: "replace" } data reverse_method: MethodDeclaration = { name: "reverse" } data skip_method: MethodDeclaration = { name: "skip" } diff --git a/src/v3/compiler/src/bootstrap_generated.rs b/src/v3/compiler/src/bootstrap_generated.rs index 592b39a225e..249c04a9efb 100644 --- a/src/v3/compiler/src/bootstrap_generated.rs +++ b/src/v3/compiler/src/bootstrap_generated.rs @@ -3,71 +3,71 @@ pub(crate) fn bootstrapped_fixture_dag() -> Dag { Dag { - nodes: vec![Behavior::Transform(TransformNode { id: NodeId(0), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(1), span: SourceSpan::new("src/v3/std/algebra.dag", 9207, 9212) }), Behavior::Transform(TransformNode { id: NodeId(1), target: TransformTarget::Callable(DeclarationId(748)), inputs: vec![PortId(1), PortId(0)], output: PortId(2), span: SourceSpan::new("src/v3/std/algebra.dag", 9198, 9229) }), Behavior::Bind(BindNode { id: NodeId(2), name: "dominate_scan_init".to_string(), value: PortId(2), params: vec![PortId(0)], span: SourceSpan::new("src/v3/std/algebra.dag", 9198, 9229), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(3), target: TransformTarget::Callable(DeclarationId(1644)), inputs: vec![PortId(3)], output: PortId(5), span: SourceSpan::new("src/v3/std/algebra.dag", 10402, 10414) }), Behavior::Transform(TransformNode { id: NodeId(4), target: TransformTarget::Callable(DeclarationId(1646)), inputs: vec![PortId(5)], output: PortId(6), span: SourceSpan::new("src/v3/std/algebra.dag", 10395, 10442) }), Behavior::Transform(TransformNode { id: NodeId(5), target: TransformTarget::Callable(DeclarationId(1606)), inputs: vec![PortId(3), PortId(4), PortId(6)], output: PortId(7), span: SourceSpan::new("src/v3/std/algebra.dag", 10056, 10446) }), Behavior::Bind(BindNode { id: NodeId(6), name: "two_terms".to_string(), value: PortId(7), params: vec![PortId(3), PortId(4)], span: SourceSpan::new("src/v3/std/algebra.dag", 10056, 10446), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(7), target: TransformTarget::Callable(DeclarationId(1608)), inputs: vec![PortId(8), PortId(9), PortId(10)], output: PortId(11), span: SourceSpan::new("src/v3/std/algebra.dag", 10577, 10633) }), Behavior::Bind(BindNode { id: NodeId(8), name: "many_terms".to_string(), value: PortId(11), params: vec![PortId(8), PortId(9), PortId(10)], span: SourceSpan::new("src/v3/std/algebra.dag", 10577, 10633), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(9), target: TransformTarget::Callable(DeclarationId(1647)), inputs: vec![PortId(12)], output: PortId(13), span: SourceSpan::new("src/v3/std/algebra.dag", 10702, 10717) }), Behavior::Transform(TransformNode { id: NodeId(10), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(14), span: SourceSpan::new("src/v3/std/algebra.dag", 10733, 10738) }), Behavior::Transform(TransformNode { id: NodeId(11), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(16), span: SourceSpan::new("src/v3/std/algebra.dag", 10754, 10759) }), Behavior::Branch(BranchNode { id: NodeId(12), input: PortId(13), paths: vec![Path { body: NodeId(10), output: PortId(14), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 10724, 10729) }, binding: None }, Path { body: NodeId(11), output: PortId(16), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 10743, 10750) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(15) }) }], output: PortId(17), span: SourceSpan::new("src/v3/std/algebra.dag", 10696, 10763), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(13), name: "reject_all_symbolic_costs".to_string(), value: PortId(17), params: vec![PortId(12)], span: SourceSpan::new("src/v3/std/algebra.dag", 10696, 10763), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Value(ValueNode { id: NodeId(14), data: LiteralBits::Int(2), output: PortId(19), span: SourceSpan::new("src/v3/std/algebra.dag", 10848, 10849), lane2_workflow: None }), Behavior::Transform(TransformNode { id: NodeId(15), target: TransformTarget::FieldProject { field_label: "previous".to_string(), field_child: None }, inputs: vec![PortId(20)], output: PortId(21), span: SourceSpan::new("src/v3/std/algebra.dag", 10901, 10909) }), Behavior::Transform(TransformNode { id: NodeId(16), target: TransformTarget::Callable(DeclarationId(755)), inputs: vec![PortId(21)], output: PortId(22), span: SourceSpan::new("src/v3/std/algebra.dag", 10882, 10910) }), Behavior::Value(ValueNode { id: NodeId(17), data: LiteralBits::Int(1), output: PortId(23), span: SourceSpan::new("src/v3/std/algebra.dag", 10913, 10914), lane2_workflow: None }), Behavior::Transform(TransformNode { id: NodeId(18), target: TransformTarget::Operator(OperatorKind::Arithmetic(ArithmeticOp::Add)), inputs: vec![PortId(22), PortId(23)], output: PortId(24), span: SourceSpan::new("src/v3/std/algebra.dag", 10882, 10914) }), Behavior::Branch(BranchNode { id: NodeId(19), input: PortId(18), paths: vec![Path { body: NodeId(14), output: PortId(19), pattern: BranchPattern::UnresolvedVariant { name: "DegreeTwo".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 10835, 10844) }, binding: None }, Path { body: NodeId(18), output: PortId(24), pattern: BranchPattern::UnresolvedVariant { name: "DegreeSuccessor".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 10854, 10878) }, binding: Some(PayloadBinding { binding_name: "payload".to_string(), payload_port: PortId(20) }) }], output: PortId(25), span: SourceSpan::new("src/v3/std/algebra.dag", 10816, 10918), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Loop(LoopNode { id: NodeId(20), source: PortId(18), init: PortId(18), body: NodeId(19), bound: LoopBound::Cardinality { count: PortId(18) }, output: PortId(26), span: SourceSpan::new("src/v3/std/algebra.dag", 10816, 10918) }), Behavior::Bind(BindNode { id: NodeId(21), name: "degree_raw".to_string(), value: PortId(26), params: vec![PortId(18)], span: SourceSpan::new("src/v3/std/algebra.dag", 10816, 10918), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(22), target: TransformTarget::Callable(DeclarationId(752)), inputs: vec![PortId(27), PortId(28)], output: PortId(29), span: SourceSpan::new("src/v3/std/algebra.dag", 11240, 11255) }), Behavior::Transform(TransformNode { id: NodeId(23), target: TransformTarget::Callable(DeclarationId(1641)), inputs: vec![PortId(29)], output: PortId(30), span: SourceSpan::new("src/v3/std/algebra.dag", 11232, 11256) }), Behavior::Transform(TransformNode { id: NodeId(24), target: TransformTarget::Callable(DeclarationId(763)), inputs: vec![PortId(30)], output: PortId(31), span: SourceSpan::new("src/v3/std/algebra.dag", 11222, 11257) }), Behavior::Bind(BindNode { id: NodeId(25), name: "sequential".to_string(), value: PortId(31), params: vec![PortId(27), PortId(28)], span: SourceSpan::new("src/v3/std/algebra.dag", 11222, 11257), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(26), target: TransformTarget::Callable(DeclarationId(752)), inputs: vec![PortId(32), PortId(33)], output: PortId(34), span: SourceSpan::new("src/v3/std/algebra.dag", 11537, 11559) }), Behavior::Transform(TransformNode { id: NodeId(27), target: TransformTarget::Callable(DeclarationId(1639)), inputs: vec![PortId(34)], output: PortId(35), span: SourceSpan::new("src/v3/std/algebra.dag", 11525, 11560) }), Behavior::Transform(TransformNode { id: NodeId(28), target: TransformTarget::Callable(DeclarationId(763)), inputs: vec![PortId(35)], output: PortId(36), span: SourceSpan::new("src/v3/std/algebra.dag", 11515, 11561) }), Behavior::Bind(BindNode { id: NodeId(29), name: "iterate".to_string(), value: PortId(36), params: vec![PortId(32), PortId(33)], span: SourceSpan::new("src/v3/std/algebra.dag", 11515, 11561), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(30), target: TransformTarget::Callable(DeclarationId(761)), inputs: vec![PortId(38), PortId(37)], output: PortId(39), span: SourceSpan::new("src/v3/std/algebra.dag", 12505, 12530) }), Behavior::Transform(TransformNode { id: NodeId(31), target: TransformTarget::Callable(DeclarationId(759)), inputs: vec![PortId(37), PortId(38)], output: PortId(40), span: SourceSpan::new("src/v3/std/algebra.dag", 12561, 12588) }), Behavior::Branch(BranchNode { id: NodeId(32), input: PortId(39), paths: vec![Path { body: NodeId(32), output: PortId(38), pattern: BranchPattern::UnresolvedVariant { name: "True".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 12540, 12549) }, binding: None }, Path { body: NodeId(31), output: PortId(40), pattern: BranchPattern::UnresolvedVariant { name: "False".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 12561, 12588) }, binding: None }], output: PortId(41), span: SourceSpan::new("src/v3/std/algebra.dag", 12502, 12588), emit_participation: None }), Behavior::Bind(BindNode { id: NodeId(33), name: "max_path_step".to_string(), value: PortId(41), params: vec![PortId(37), PortId(38)], span: SourceSpan::new("src/v3/std/algebra.dag", 12502, 12588), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(34), target: TransformTarget::Callable(DeclarationId(761)), inputs: vec![PortId(42), PortId(43)], output: PortId(44), span: SourceSpan::new("src/v3/std/algebra.dag", 12672, 12697) }), Behavior::Transform(TransformNode { id: NodeId(35), target: TransformTarget::Callable(DeclarationId(756)), inputs: vec![PortId(42), PortId(43)], output: PortId(45), span: SourceSpan::new("src/v3/std/algebra.dag", 12722, 12748) }), Behavior::Branch(BranchNode { id: NodeId(36), input: PortId(44), paths: vec![Path { body: NodeId(36), output: PortId(42), pattern: BranchPattern::UnresolvedVariant { name: "True".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 12707, 12710) }, binding: None }, Path { body: NodeId(35), output: PortId(45), pattern: BranchPattern::UnresolvedVariant { name: "False".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 12722, 12748) }, binding: None }], output: PortId(46), span: SourceSpan::new("src/v3/std/algebra.dag", 12669, 12748), emit_participation: None }), Behavior::Bind(BindNode { id: NodeId(37), name: "keep_or_sum".to_string(), value: PortId(46), params: vec![PortId(42), PortId(43)], span: SourceSpan::new("src/v3/std/algebra.dag", 12669, 12748), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Value(ValueNode { id: NodeId(38), data: LiteralBits::Int(0), output: PortId(48), span: SourceSpan::new("src/v3/std/algebra.dag", 13134, 13135), lane2_workflow: None }), Behavior::Transform(TransformNode { id: NodeId(39), target: TransformTarget::Callable(DeclarationId(1635)), inputs: vec![PortId(48)], output: PortId(49), span: SourceSpan::new("src/v3/std/algebra.dag", 13121, 13136) }), Behavior::Transform(TransformNode { id: NodeId(40), target: TransformTarget::Callable(DeclarationId(1649)), inputs: vec![PortId(47), PortId(49)], output: PortId(50), span: SourceSpan::new("src/v3/std/algebra.dag", 13109, 13152) }), Behavior::Bind(BindNode { id: NodeId(41), name: "max_path".to_string(), value: PortId(50), params: vec![PortId(47)], span: SourceSpan::new("src/v3/std/algebra.dag", 13109, 13152), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(42), target: TransformTarget::Callable(DeclarationId(430)), inputs: vec![], output: PortId(54), span: SourceSpan::new("src/v3/std/algebra.dag", 14111, 14115) }), Behavior::Transform(TransformNode { id: NodeId(43), target: TransformTarget::Callable(DeclarationId(430)), inputs: vec![], output: PortId(57), span: SourceSpan::new("src/v3/std/algebra.dag", 14182, 14186) }), Behavior::Transform(TransformNode { id: NodeId(44), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(59), span: SourceSpan::new("src/v3/std/algebra.dag", 14213, 14218) }), Behavior::Transform(TransformNode { id: NodeId(45), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(61), span: SourceSpan::new("src/v3/std/algebra.dag", 14244, 14249) }), Behavior::Transform(TransformNode { id: NodeId(46), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(63), span: SourceSpan::new("src/v3/std/algebra.dag", 14279, 14284) }), Behavior::Transform(TransformNode { id: NodeId(47), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(65), span: SourceSpan::new("src/v3/std/algebra.dag", 14311, 14316) }), Behavior::Transform(TransformNode { id: NodeId(48), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(67), span: SourceSpan::new("src/v3/std/algebra.dag", 14339, 14344) }), Behavior::Transform(TransformNode { id: NodeId(49), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(69), span: SourceSpan::new("src/v3/std/algebra.dag", 14367, 14372) }), Behavior::Branch(BranchNode { id: NodeId(50), input: PortId(52), paths: vec![Path { body: NodeId(43), output: PortId(57), pattern: BranchPattern::UnresolvedVariant { name: "ConstantCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14163, 14178) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(56) }) }, Path { body: NodeId(44), output: PortId(59), pattern: BranchPattern::UnresolvedVariant { name: "UnknownCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14195, 14209) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(58) }) }, Path { body: NodeId(45), output: PortId(61), pattern: BranchPattern::UnresolvedVariant { name: "LinearCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14227, 14240) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(60) }) }, Path { body: NodeId(46), output: PortId(63), pattern: BranchPattern::UnresolvedVariant { name: "PolynomialCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14258, 14275) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(62) }) }, Path { body: NodeId(47), output: PortId(65), pattern: BranchPattern::UnresolvedVariant { name: "ProductCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14293, 14307) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(64) }) }, Path { body: NodeId(48), output: PortId(67), pattern: BranchPattern::UnresolvedVariant { name: "SumCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14325, 14335) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(66) }) }, Path { body: NodeId(49), output: PortId(69), pattern: BranchPattern::UnresolvedVariant { name: "LogCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14353, 14363) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(68) }) }], output: PortId(70), span: SourceSpan::new("src/v3/std/algebra.dag", 14145, 14380), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Transform(TransformNode { id: NodeId(51), target: TransformTarget::Callable(DeclarationId(430)), inputs: vec![], output: PortId(73), span: SourceSpan::new("src/v3/std/algebra.dag", 14446, 14450) }), Behavior::Transform(TransformNode { id: NodeId(52), target: TransformTarget::Callable(DeclarationId(430)), inputs: vec![], output: PortId(75), span: SourceSpan::new("src/v3/std/algebra.dag", 14473, 14477) }), Behavior::Transform(TransformNode { id: NodeId(53), target: TransformTarget::Callable(DeclarationId(762)), inputs: vec![PortId(71), PortId(76)], output: PortId(77), span: SourceSpan::new("src/v3/std/algebra.dag", 14504, 14530) }), Behavior::Transform(TransformNode { id: NodeId(54), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(79), span: SourceSpan::new("src/v3/std/algebra.dag", 14576, 14581) }), Behavior::Transform(TransformNode { id: NodeId(55), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(81), span: SourceSpan::new("src/v3/std/algebra.dag", 14608, 14613) }), Behavior::Transform(TransformNode { id: NodeId(56), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(83), span: SourceSpan::new("src/v3/std/algebra.dag", 14640, 14645) }), Behavior::Transform(TransformNode { id: NodeId(57), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(85), span: SourceSpan::new("src/v3/std/algebra.dag", 14668, 14673) }), Behavior::Branch(BranchNode { id: NodeId(58), input: PortId(52), paths: vec![Path { body: NodeId(51), output: PortId(73), pattern: BranchPattern::UnresolvedVariant { name: "ConstantCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14427, 14442) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(72) }) }, Path { body: NodeId(52), output: PortId(75), pattern: BranchPattern::UnresolvedVariant { name: "LogCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14459, 14469) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(74) }) }, Path { body: NodeId(53), output: PortId(77), pattern: BranchPattern::UnresolvedVariant { name: "LinearCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14486, 14500) }, binding: Some(PayloadBinding { binding_name: "vb".to_string(), payload_port: PortId(76) }) }, Path { body: NodeId(54), output: PortId(79), pattern: BranchPattern::UnresolvedVariant { name: "PolynomialCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14539, 14562) }, binding: Some(PayloadBinding { binding_name: "payload".to_string(), payload_port: PortId(78) }) }, Path { body: NodeId(55), output: PortId(81), pattern: BranchPattern::UnresolvedVariant { name: "UnknownCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14590, 14604) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(80) }) }, Path { body: NodeId(56), output: PortId(83), pattern: BranchPattern::UnresolvedVariant { name: "ProductCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14622, 14636) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(82) }) }, Path { body: NodeId(57), output: PortId(85), pattern: BranchPattern::UnresolvedVariant { name: "SumCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14654, 14664) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(84) }) }], output: PortId(86), span: SourceSpan::new("src/v3/std/algebra.dag", 14409, 14681), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Transform(TransformNode { id: NodeId(59), target: TransformTarget::Callable(DeclarationId(430)), inputs: vec![], output: PortId(89), span: SourceSpan::new("src/v3/std/algebra.dag", 14751, 14755) }), Behavior::Transform(TransformNode { id: NodeId(60), target: TransformTarget::Callable(DeclarationId(430)), inputs: vec![], output: PortId(91), span: SourceSpan::new("src/v3/std/algebra.dag", 14778, 14782) }), Behavior::Transform(TransformNode { id: NodeId(61), target: TransformTarget::FieldProject { field_label: "var".to_string(), field_child: None }, inputs: vec![PortId(87)], output: PortId(93), span: SourceSpan::new("src/v3/std/algebra.dag", 14841, 14844) }), Behavior::Transform(TransformNode { id: NodeId(62), target: TransformTarget::Callable(DeclarationId(762)), inputs: vec![PortId(93), PortId(92)], output: PortId(94), span: SourceSpan::new("src/v3/std/algebra.dag", 14819, 14849) }), Behavior::Transform(TransformNode { id: NodeId(63), target: TransformTarget::FieldProject { field_label: "var".to_string(), field_child: None }, inputs: vec![PortId(87)], output: PortId(96), span: SourceSpan::new("src/v3/std/algebra.dag", 14915, 14918) }), Behavior::Transform(TransformNode { id: NodeId(64), target: TransformTarget::FieldProject { field_label: "var".to_string(), field_child: None }, inputs: vec![PortId(95)], output: PortId(97), span: SourceSpan::new("src/v3/std/algebra.dag", 14923, 14926) }), Behavior::Transform(TransformNode { id: NodeId(65), target: TransformTarget::Callable(DeclarationId(762)), inputs: vec![PortId(96), PortId(97)], output: PortId(98), span: SourceSpan::new("src/v3/std/algebra.dag", 14893, 14927) }), Behavior::Transform(TransformNode { id: NodeId(66), target: TransformTarget::FieldProject { field_label: "degree".to_string(), field_child: None }, inputs: vec![PortId(87)], output: PortId(99), span: SourceSpan::new("src/v3/std/algebra.dag", 14959, 14965) }), Behavior::Transform(TransformNode { id: NodeId(67), target: TransformTarget::Callable(DeclarationId(755)), inputs: vec![PortId(99)], output: PortId(100), span: SourceSpan::new("src/v3/std/algebra.dag", 14945, 14966) }), Behavior::Transform(TransformNode { id: NodeId(68), target: TransformTarget::FieldProject { field_label: "degree".to_string(), field_child: None }, inputs: vec![PortId(95)], output: PortId(101), span: SourceSpan::new("src/v3/std/algebra.dag", 14984, 14990) }), Behavior::Transform(TransformNode { id: NodeId(69), target: TransformTarget::Callable(DeclarationId(755)), inputs: vec![PortId(101)], output: PortId(102), span: SourceSpan::new("src/v3/std/algebra.dag", 14970, 14991) }), Behavior::Transform(TransformNode { id: NodeId(70), target: TransformTarget::Operator(OperatorKind::Comparison(ComparisonOp::Ge)), inputs: vec![PortId(100), PortId(102)], output: PortId(103), span: SourceSpan::new("src/v3/std/algebra.dag", 14945, 14991) }), Behavior::Transform(TransformNode { id: NodeId(71), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(104), span: SourceSpan::new("src/v3/std/algebra.dag", 15019, 15024) }), Behavior::Branch(BranchNode { id: NodeId(72), input: PortId(98), paths: vec![Path { body: NodeId(70), output: PortId(103), pattern: BranchPattern::UnresolvedVariant { name: "True".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14945, 14991) }, binding: None }, Path { body: NodeId(71), output: PortId(104), pattern: BranchPattern::UnresolvedVariant { name: "False".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15019, 15024) }, binding: None }], output: PortId(105), span: SourceSpan::new("src/v3/std/algebra.dag", 14890, 15024), emit_participation: None }), Behavior::Transform(TransformNode { id: NodeId(73), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(107), span: SourceSpan::new("src/v3/std/algebra.dag", 15051, 15056) }), Behavior::Transform(TransformNode { id: NodeId(74), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(109), span: SourceSpan::new("src/v3/std/algebra.dag", 15083, 15088) }), Behavior::Transform(TransformNode { id: NodeId(75), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(111), span: SourceSpan::new("src/v3/std/algebra.dag", 15111, 15116) }), Behavior::Branch(BranchNode { id: NodeId(76), input: PortId(52), paths: vec![Path { body: NodeId(59), output: PortId(89), pattern: BranchPattern::UnresolvedVariant { name: "ConstantCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14732, 14747) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(88) }) }, Path { body: NodeId(60), output: PortId(91), pattern: BranchPattern::UnresolvedVariant { name: "LogCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14764, 14774) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(90) }) }, Path { body: NodeId(62), output: PortId(94), pattern: BranchPattern::UnresolvedVariant { name: "LinearCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14791, 14805) }, binding: Some(PayloadBinding { binding_name: "vb".to_string(), payload_port: PortId(92) }) }, Path { body: NodeId(72), output: PortId(105), pattern: BranchPattern::UnresolvedVariant { name: "PolynomialCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14858, 14876) }, binding: Some(PayloadBinding { binding_name: "pb".to_string(), payload_port: PortId(95) }) }, Path { body: NodeId(73), output: PortId(107), pattern: BranchPattern::UnresolvedVariant { name: "UnknownCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15033, 15047) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(106) }) }, Path { body: NodeId(74), output: PortId(109), pattern: BranchPattern::UnresolvedVariant { name: "ProductCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15065, 15079) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(108) }) }, Path { body: NodeId(75), output: PortId(111), pattern: BranchPattern::UnresolvedVariant { name: "SumCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15097, 15107) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(110) }) }], output: PortId(112), span: SourceSpan::new("src/v3/std/algebra.dag", 14714, 15124), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Transform(TransformNode { id: NodeId(77), target: TransformTarget::Callable(DeclarationId(430)), inputs: vec![], output: PortId(115), span: SourceSpan::new("src/v3/std/algebra.dag", 15187, 15191) }), Behavior::Transform(TransformNode { id: NodeId(78), target: TransformTarget::Callable(DeclarationId(762)), inputs: vec![PortId(113), PortId(116)], output: PortId(117), span: SourceSpan::new("src/v3/std/algebra.dag", 15215, 15241) }), Behavior::Transform(TransformNode { id: NodeId(79), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(119), span: SourceSpan::new("src/v3/std/algebra.dag", 15267, 15272) }), Behavior::Transform(TransformNode { id: NodeId(80), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(121), span: SourceSpan::new("src/v3/std/algebra.dag", 15302, 15307) }), Behavior::Transform(TransformNode { id: NodeId(81), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(123), span: SourceSpan::new("src/v3/std/algebra.dag", 15334, 15339) }), Behavior::Transform(TransformNode { id: NodeId(82), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(125), span: SourceSpan::new("src/v3/std/algebra.dag", 15362, 15367) }), Behavior::Transform(TransformNode { id: NodeId(83), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(127), span: SourceSpan::new("src/v3/std/algebra.dag", 15394, 15399) }), Behavior::Branch(BranchNode { id: NodeId(84), input: PortId(52), paths: vec![Path { body: NodeId(77), output: PortId(115), pattern: BranchPattern::UnresolvedVariant { name: "ConstantCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15168, 15183) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(114) }) }, Path { body: NodeId(78), output: PortId(117), pattern: BranchPattern::UnresolvedVariant { name: "LogCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15200, 15211) }, binding: Some(PayloadBinding { binding_name: "vb".to_string(), payload_port: PortId(116) }) }, Path { body: NodeId(79), output: PortId(119), pattern: BranchPattern::UnresolvedVariant { name: "LinearCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15250, 15263) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(118) }) }, Path { body: NodeId(80), output: PortId(121), pattern: BranchPattern::UnresolvedVariant { name: "PolynomialCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15281, 15298) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(120) }) }, Path { body: NodeId(81), output: PortId(123), pattern: BranchPattern::UnresolvedVariant { name: "ProductCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15316, 15330) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(122) }) }, Path { body: NodeId(82), output: PortId(125), pattern: BranchPattern::UnresolvedVariant { name: "SumCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15348, 15358) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(124) }) }, Path { body: NodeId(83), output: PortId(127), pattern: BranchPattern::UnresolvedVariant { name: "UnknownCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15376, 15390) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(126) }) }], output: PortId(128), span: SourceSpan::new("src/v3/std/algebra.dag", 15150, 15407), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Transform(TransformNode { id: NodeId(85), target: TransformTarget::Callable(DeclarationId(764)), inputs: vec![PortId(129)], output: PortId(130), span: SourceSpan::new("src/v3/std/algebra.dag", 15834, 15852) }), Behavior::Transform(TransformNode { id: NodeId(86), target: TransformTarget::Callable(DeclarationId(749)), inputs: vec![PortId(52)], output: PortId(131), span: SourceSpan::new("src/v3/std/algebra.dag", 15864, 15885) }), Behavior::Transform(TransformNode { id: NodeId(87), target: TransformTarget::Callable(DeclarationId(1651)), inputs: vec![PortId(130), PortId(131)], output: PortId(132), span: SourceSpan::new("src/v3/std/algebra.dag", 15818, 15928) }), Behavior::Transform(TransformNode { id: NodeId(88), target: TransformTarget::Callable(DeclarationId(776)), inputs: vec![PortId(132)], output: PortId(133), span: SourceSpan::new("src/v3/std/algebra.dag", 15800, 15936) }), Behavior::Transform(TransformNode { id: NodeId(89), target: TransformTarget::Callable(DeclarationId(764)), inputs: vec![PortId(134)], output: PortId(135), span: SourceSpan::new("src/v3/std/algebra.dag", 15999, 16017) }), Behavior::Transform(TransformNode { id: NodeId(90), target: TransformTarget::Callable(DeclarationId(749)), inputs: vec![PortId(52)], output: PortId(136), span: SourceSpan::new("src/v3/std/algebra.dag", 16029, 16050) }), Behavior::Transform(TransformNode { id: NodeId(91), target: TransformTarget::Callable(DeclarationId(1653)), inputs: vec![PortId(135), PortId(136)], output: PortId(137), span: SourceSpan::new("src/v3/std/algebra.dag", 15983, 16093) }), Behavior::Transform(TransformNode { id: NodeId(92), target: TransformTarget::Callable(DeclarationId(776)), inputs: vec![PortId(137)], output: PortId(138), span: SourceSpan::new("src/v3/std/algebra.dag", 15965, 16101) }), Behavior::Branch(BranchNode { id: NodeId(93), input: PortId(51), paths: vec![Path { body: NodeId(42), output: PortId(54), pattern: BranchPattern::UnresolvedVariant { name: "UnknownCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14093, 14107) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(53) }) }, Path { body: NodeId(50), output: PortId(70), pattern: BranchPattern::UnresolvedVariant { name: "ConstantCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14120, 14135) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(55) }) }, Path { body: NodeId(58), output: PortId(86), pattern: BranchPattern::UnresolvedVariant { name: "LinearCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14385, 14399) }, binding: Some(PayloadBinding { binding_name: "va".to_string(), payload_port: PortId(71) }) }, Path { body: NodeId(76), output: PortId(112), pattern: BranchPattern::UnresolvedVariant { name: "PolynomialCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14686, 14704) }, binding: Some(PayloadBinding { binding_name: "pa".to_string(), payload_port: PortId(87) }) }, Path { body: NodeId(84), output: PortId(128), pattern: BranchPattern::UnresolvedVariant { name: "LogCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15129, 15140) }, binding: Some(PayloadBinding { binding_name: "va".to_string(), payload_port: PortId(113) }) }, Path { body: NodeId(88), output: PortId(133), pattern: BranchPattern::UnresolvedVariant { name: "ProductCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15772, 15790) }, binding: Some(PayloadBinding { binding_name: "terms".to_string(), payload_port: PortId(129) }) }, Path { body: NodeId(92), output: PortId(138), pattern: BranchPattern::UnresolvedVariant { name: "SumCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15941, 15955) }, binding: Some(PayloadBinding { binding_name: "terms".to_string(), payload_port: PortId(134) }) }], output: PortId(139), span: SourceSpan::new("src/v3/std/algebra.dag", 14079, 16105), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(94), name: "dominates".to_string(), value: PortId(139), params: vec![PortId(51), PortId(52)], span: SourceSpan::new("src/v3/std/algebra.dag", 14079, 16105), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(95), target: TransformTarget::FieldProject { field_label: "source_port".to_string(), field_child: Some(DeclarationId(631)) }, inputs: vec![PortId(140)], output: PortId(142), span: SourceSpan::new("src/v3/std/algebra.dag", 16177, 16188) }), Behavior::Transform(TransformNode { id: NodeId(96), target: TransformTarget::FieldProject { field_label: "source_port".to_string(), field_child: Some(DeclarationId(631)) }, inputs: vec![PortId(141)], output: PortId(143), span: SourceSpan::new("src/v3/std/algebra.dag", 16194, 16205) }), Behavior::Transform(TransformNode { id: NodeId(97), target: TransformTarget::Operator(OperatorKind::Comparison(ComparisonOp::Eq)), inputs: vec![PortId(142), PortId(143)], output: PortId(144), span: SourceSpan::new("src/v3/std/algebra.dag", 16175, 16205) }), Behavior::Bind(BindNode { id: NodeId(98), name: "same_size_variable".to_string(), value: PortId(144), params: vec![PortId(140), PortId(141)], span: SourceSpan::new("src/v3/std/algebra.dag", 16175, 16205), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(99), target: TransformTarget::Callable(DeclarationId(764)), inputs: vec![PortId(146)], output: PortId(147), span: SourceSpan::new("src/v3/std/algebra.dag", 17170, 17188) }), Behavior::Transform(TransformNode { id: NodeId(100), target: TransformTarget::Callable(DeclarationId(765)), inputs: vec![PortId(147)], output: PortId(148), span: SourceSpan::new("src/v3/std/algebra.dag", 17160, 17189) }), Behavior::Transform(TransformNode { id: NodeId(101), target: TransformTarget::Callable(DeclarationId(767)), inputs: vec![PortId(148)], output: PortId(149), span: SourceSpan::new("src/v3/std/algebra.dag", 17149, 17190) }), Behavior::Transform(TransformNode { id: NodeId(102), target: TransformTarget::Callable(DeclarationId(764)), inputs: vec![PortId(150)], output: PortId(151), span: SourceSpan::new("src/v3/std/algebra.dag", 17242, 17260) }), Behavior::Transform(TransformNode { id: NodeId(103), target: TransformTarget::Callable(DeclarationId(765)), inputs: vec![PortId(151)], output: PortId(152), span: SourceSpan::new("src/v3/std/algebra.dag", 17232, 17261) }), Behavior::Transform(TransformNode { id: NodeId(104), target: TransformTarget::Callable(DeclarationId(769)), inputs: vec![PortId(152)], output: PortId(153), span: SourceSpan::new("src/v3/std/algebra.dag", 17217, 17262) }), Behavior::Branch(BranchNode { id: NodeId(105), input: PortId(145), paths: vec![Path { body: NodeId(105), output: PortId(145), pattern: BranchPattern::UnresolvedVariant { name: "ConstantCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17027, 17039) }, binding: None }, Path { body: NodeId(105), output: PortId(145), pattern: BranchPattern::UnresolvedVariant { name: "LinearCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17049, 17059) }, binding: None }, Path { body: NodeId(105), output: PortId(145), pattern: BranchPattern::UnresolvedVariant { name: "PolynomialCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17069, 17083) }, binding: None }, Path { body: NodeId(105), output: PortId(145), pattern: BranchPattern::UnresolvedVariant { name: "LogCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17093, 17100) }, binding: None }, Path { body: NodeId(105), output: PortId(145), pattern: BranchPattern::UnresolvedVariant { name: "UnknownCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17110, 17121) }, binding: None }, Path { body: NodeId(101), output: PortId(149), pattern: BranchPattern::UnresolvedVariant { name: "SumCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17131, 17145) }, binding: Some(PayloadBinding { binding_name: "terms".to_string(), payload_port: PortId(146) }) }, Path { body: NodeId(104), output: PortId(153), pattern: BranchPattern::UnresolvedVariant { name: "ProductCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17195, 17213) }, binding: Some(PayloadBinding { binding_name: "terms".to_string(), payload_port: PortId(150) }) }], output: PortId(154), span: SourceSpan::new("src/v3/std/algebra.dag", 17013, 17266), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(106), name: "normalize".to_string(), value: PortId(154), params: vec![PortId(145)], span: SourceSpan::new("src/v3/std/algebra.dag", 17013, 17266), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(107), target: TransformTarget::FieldProject { field_label: "first".to_string(), field_child: Some(DeclarationId(637)) }, inputs: vec![PortId(155)], output: PortId(156), span: SourceSpan::new("src/v3/std/algebra.dag", 17359, 17364) }), Behavior::Transform(TransformNode { id: NodeId(108), target: TransformTarget::FieldProject { field_label: "second".to_string(), field_child: Some(DeclarationId(637)) }, inputs: vec![PortId(155)], output: PortId(157), span: SourceSpan::new("src/v3/std/algebra.dag", 17377, 17383) }), Behavior::Transform(TransformNode { id: NodeId(109), target: TransformTarget::FieldProject { field_label: "rest".to_string(), field_child: Some(DeclarationId(1428)) }, inputs: vec![PortId(155)], output: PortId(158), span: SourceSpan::new("src/v3/std/algebra.dag", 17391, 17395) }), Behavior::Transform(TransformNode { id: NodeId(110), target: TransformTarget::Callable(DeclarationId(1654)), inputs: vec![PortId(157), PortId(158)], output: PortId(159), span: SourceSpan::new("src/v3/std/algebra.dag", 17366, 17396) }), Behavior::Transform(TransformNode { id: NodeId(111), target: TransformTarget::Callable(DeclarationId(1655)), inputs: vec![PortId(156), PortId(159)], output: PortId(160), span: SourceSpan::new("src/v3/std/algebra.dag", 17348, 17397) }), Behavior::Bind(BindNode { id: NodeId(112), name: "nsl_to_list".to_string(), value: PortId(160), params: vec![PortId(155)], span: SourceSpan::new("src/v3/std/algebra.dag", 17348, 17397), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(113), target: TransformTarget::Callable(DeclarationId(1656)), inputs: vec![], output: PortId(162), span: SourceSpan::new("src/v3/std/algebra.dag", 17667, 17674) }), Behavior::Transform(TransformNode { id: NodeId(114), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(163)], output: PortId(164), span: SourceSpan::new("src/v3/std/algebra.dag", 17730, 17734) }), Behavior::Transform(TransformNode { id: NodeId(115), target: TransformTarget::Callable(DeclarationId(766)), inputs: vec![PortId(164)], output: PortId(165), span: SourceSpan::new("src/v3/std/algebra.dag", 17705, 17735) }), Behavior::Transform(TransformNode { id: NodeId(116), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(163)], output: PortId(166), span: SourceSpan::new("src/v3/std/algebra.dag", 17767, 17771) }), Behavior::Transform(TransformNode { id: NodeId(117), target: TransformTarget::Callable(DeclarationId(765)), inputs: vec![PortId(166)], output: PortId(167), span: SourceSpan::new("src/v3/std/algebra.dag", 17749, 17772) }), Behavior::Transform(TransformNode { id: NodeId(118), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(163)], output: PortId(168), span: SourceSpan::new("src/v3/std/algebra.dag", 17805, 17809) }), Behavior::Transform(TransformNode { id: NodeId(119), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(163)], output: PortId(169), span: SourceSpan::new("src/v3/std/algebra.dag", 17829, 17833) }), Behavior::Transform(TransformNode { id: NodeId(120), target: TransformTarget::Callable(DeclarationId(765)), inputs: vec![PortId(169)], output: PortId(170), span: SourceSpan::new("src/v3/std/algebra.dag", 17811, 17834) }), Behavior::Transform(TransformNode { id: NodeId(121), target: TransformTarget::Callable(DeclarationId(1657)), inputs: vec![PortId(168), PortId(170)], output: PortId(171), span: SourceSpan::new("src/v3/std/algebra.dag", 17792, 17835) }), Behavior::Branch(BranchNode { id: NodeId(122), input: PortId(165), paths: vec![Path { body: NodeId(117), output: PortId(167), pattern: BranchPattern::UnresolvedVariant { name: "True".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17749, 17772) }, binding: None }, Path { body: NodeId(121), output: PortId(171), pattern: BranchPattern::UnresolvedVariant { name: "False".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17792, 17835) }, binding: None }], output: PortId(172), span: SourceSpan::new("src/v3/std/algebra.dag", 17702, 17835), emit_participation: None }), Behavior::Branch(BranchNode { id: NodeId(123), input: PortId(161), paths: vec![Path { body: NodeId(113), output: PortId(162), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17658, 17663) }, binding: None }, Path { body: NodeId(122), output: PortId(172), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17679, 17692) }, binding: Some(PayloadBinding { binding_name: "payload".to_string(), payload_port: PortId(163) }) }], output: PortId(173), span: SourceSpan::new("src/v3/std/algebra.dag", 17640, 17839), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Loop(LoopNode { id: NodeId(124), source: PortId(161), init: PortId(161), body: NodeId(123), bound: LoopBound::Cardinality { count: PortId(161) }, output: PortId(174), span: SourceSpan::new("src/v3/std/algebra.dag", 17640, 17839) }), Behavior::Bind(BindNode { id: NodeId(125), name: "drop_zero".to_string(), value: PortId(174), params: vec![PortId(161)], span: SourceSpan::new("src/v3/std/algebra.dag", 17640, 17839), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Value(ValueNode { id: NodeId(126), data: LiteralBits::Int(0), output: PortId(177), span: SourceSpan::new("src/v3/std/algebra.dag", 17928, 17929), lane2_workflow: None }), Behavior::Transform(TransformNode { id: NodeId(127), target: TransformTarget::Operator(OperatorKind::Comparison(ComparisonOp::Eq)), inputs: vec![PortId(176), PortId(177)], output: PortId(178), span: SourceSpan::new("src/v3/std/algebra.dag", 17923, 17929) }), Behavior::Transform(TransformNode { id: NodeId(128), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(180), span: SourceSpan::new("src/v3/std/algebra.dag", 17951, 17956) }), Behavior::Transform(TransformNode { id: NodeId(129), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(182), span: SourceSpan::new("src/v3/std/algebra.dag", 17982, 17987) }), Behavior::Transform(TransformNode { id: NodeId(130), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(184), span: SourceSpan::new("src/v3/std/algebra.dag", 18010, 18015) }), Behavior::Transform(TransformNode { id: NodeId(131), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(186), span: SourceSpan::new("src/v3/std/algebra.dag", 18034, 18039) }), Behavior::Transform(TransformNode { id: NodeId(132), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(188), span: SourceSpan::new("src/v3/std/algebra.dag", 18058, 18063) }), Behavior::Transform(TransformNode { id: NodeId(133), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(190), span: SourceSpan::new("src/v3/std/algebra.dag", 18086, 18091) }), Behavior::Branch(BranchNode { id: NodeId(134), input: PortId(175), paths: vec![Path { body: NodeId(127), output: PortId(178), pattern: BranchPattern::UnresolvedVariant { name: "ConstantCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17904, 17919) }, binding: Some(PayloadBinding { binding_name: "n".to_string(), payload_port: PortId(176) }) }, Path { body: NodeId(128), output: PortId(180), pattern: BranchPattern::UnresolvedVariant { name: "LinearCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17934, 17947) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(179) }) }, Path { body: NodeId(129), output: PortId(182), pattern: BranchPattern::UnresolvedVariant { name: "PolynomialCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17961, 17978) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(181) }) }, Path { body: NodeId(130), output: PortId(184), pattern: BranchPattern::UnresolvedVariant { name: "ProductCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17992, 18006) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(183) }) }, Path { body: NodeId(131), output: PortId(186), pattern: BranchPattern::UnresolvedVariant { name: "SumCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 18020, 18030) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(185) }) }, Path { body: NodeId(132), output: PortId(188), pattern: BranchPattern::UnresolvedVariant { name: "LogCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 18044, 18054) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(187) }) }, Path { body: NodeId(133), output: PortId(190), pattern: BranchPattern::UnresolvedVariant { name: "UnknownCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 18068, 18082) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(189) }) }], output: PortId(191), span: SourceSpan::new("src/v3/std/algebra.dag", 17890, 18095), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(135), name: "is_zero_constant".to_string(), value: PortId(191), params: vec![PortId(175)], span: SourceSpan::new("src/v3/std/algebra.dag", 17890, 18095), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Value(ValueNode { id: NodeId(136), data: LiteralBits::Int(0), output: PortId(193), span: SourceSpan::new("src/v3/std/algebra.dag", 18981, 18982), lane2_workflow: None }), Behavior::Transform(TransformNode { id: NodeId(137), target: TransformTarget::Callable(DeclarationId(1635)), inputs: vec![PortId(193)], output: PortId(194), span: SourceSpan::new("src/v3/std/algebra.dag", 18968, 18983) }), Behavior::Transform(TransformNode { id: NodeId(138), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(195)], output: PortId(196), span: SourceSpan::new("src/v3/std/algebra.dag", 19025, 19029) }), Behavior::Transform(TransformNode { id: NodeId(139), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(195)], output: PortId(197), span: SourceSpan::new("src/v3/std/algebra.dag", 19057, 19061) }), Behavior::Transform(TransformNode { id: NodeId(140), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(195)], output: PortId(199), span: SourceSpan::new("src/v3/std/algebra.dag", 19118, 19122) }), Behavior::Transform(TransformNode { id: NodeId(141), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(195)], output: PortId(200), span: SourceSpan::new("src/v3/std/algebra.dag", 19132, 19136) }), Behavior::Transform(TransformNode { id: NodeId(142), target: TransformTarget::Callable(DeclarationId(1658)), inputs: vec![PortId(199), PortId(200)], output: PortId(201), span: SourceSpan::new("src/v3/std/algebra.dag", 19105, 19137) }), Behavior::Transform(TransformNode { id: NodeId(143), target: TransformTarget::Callable(DeclarationId(779)), inputs: vec![PortId(201)], output: PortId(202), span: SourceSpan::new("src/v3/std/algebra.dag", 19090, 19138) }), Behavior::Transform(TransformNode { id: NodeId(144), target: TransformTarget::Callable(DeclarationId(768)), inputs: vec![PortId(202)], output: PortId(203), span: SourceSpan::new("src/v3/std/algebra.dag", 19081, 19139) }), Behavior::Branch(BranchNode { id: NodeId(145), input: PortId(196), paths: vec![Path { body: NodeId(139), output: PortId(197), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19040, 19045) }, binding: None }, Path { body: NodeId(144), output: PortId(203), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19070, 19077) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(198) }) }], output: PortId(204), span: SourceSpan::new("src/v3/std/algebra.dag", 19011, 19147), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Branch(BranchNode { id: NodeId(146), input: PortId(192), paths: vec![Path { body: NodeId(137), output: PortId(194), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 18959, 18964) }, binding: None }, Path { body: NodeId(145), output: PortId(204), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 18988, 19001) }, binding: Some(PayloadBinding { binding_name: "payload".to_string(), payload_port: PortId(195) }) }], output: PortId(205), span: SourceSpan::new("src/v3/std/algebra.dag", 18941, 19151), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(147), name: "reduce_sum".to_string(), value: PortId(205), params: vec![PortId(192)], span: SourceSpan::new("src/v3/std/algebra.dag", 18941, 19151), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Value(ValueNode { id: NodeId(148), data: LiteralBits::Int(0), output: PortId(207), span: SourceSpan::new("src/v3/std/algebra.dag", 19252, 19253), lane2_workflow: None }), Behavior::Transform(TransformNode { id: NodeId(149), target: TransformTarget::Callable(DeclarationId(1635)), inputs: vec![PortId(207)], output: PortId(208), span: SourceSpan::new("src/v3/std/algebra.dag", 19239, 19254) }), Behavior::Transform(TransformNode { id: NodeId(150), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(209)], output: PortId(210), span: SourceSpan::new("src/v3/std/algebra.dag", 19296, 19300) }), Behavior::Transform(TransformNode { id: NodeId(151), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(209)], output: PortId(211), span: SourceSpan::new("src/v3/std/algebra.dag", 19328, 19332) }), Behavior::Transform(TransformNode { id: NodeId(152), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(209)], output: PortId(213), span: SourceSpan::new("src/v3/std/algebra.dag", 19384, 19388) }), Behavior::Transform(TransformNode { id: NodeId(153), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(212)], output: PortId(214), span: SourceSpan::new("src/v3/std/algebra.dag", 19397, 19401) }), Behavior::Transform(TransformNode { id: NodeId(154), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(212)], output: PortId(215), span: SourceSpan::new("src/v3/std/algebra.dag", 19410, 19414) }), Behavior::Transform(TransformNode { id: NodeId(155), target: TransformTarget::Callable(DeclarationId(753)), inputs: vec![PortId(213), PortId(214), PortId(215)], output: PortId(216), span: SourceSpan::new("src/v3/std/algebra.dag", 19365, 19415) }), Behavior::Transform(TransformNode { id: NodeId(156), target: TransformTarget::Callable(DeclarationId(1641)), inputs: vec![PortId(216)], output: PortId(217), span: SourceSpan::new("src/v3/std/algebra.dag", 19357, 19416) }), Behavior::Branch(BranchNode { id: NodeId(157), input: PortId(210), paths: vec![Path { body: NodeId(151), output: PortId(211), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19311, 19316) }, binding: None }, Path { body: NodeId(156), output: PortId(217), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19341, 19353) }, binding: Some(PayloadBinding { binding_name: "second".to_string(), payload_port: PortId(212) }) }], output: PortId(218), span: SourceSpan::new("src/v3/std/algebra.dag", 19282, 19424), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Branch(BranchNode { id: NodeId(158), input: PortId(206), paths: vec![Path { body: NodeId(149), output: PortId(208), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19230, 19235) }, binding: None }, Path { body: NodeId(157), output: PortId(218), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19259, 19272) }, binding: Some(PayloadBinding { binding_name: "payload".to_string(), payload_port: PortId(209) }) }], output: PortId(219), span: SourceSpan::new("src/v3/std/algebra.dag", 19212, 19428), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(159), name: "wrap_sum".to_string(), value: PortId(219), params: vec![PortId(206)], span: SourceSpan::new("src/v3/std/algebra.dag", 19212, 19428), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Value(ValueNode { id: NodeId(160), data: LiteralBits::Int(0), output: PortId(221), span: SourceSpan::new("src/v3/std/algebra.dag", 19718, 19719), lane2_workflow: None }), Behavior::Transform(TransformNode { id: NodeId(161), target: TransformTarget::Callable(DeclarationId(1635)), inputs: vec![PortId(221)], output: PortId(222), span: SourceSpan::new("src/v3/std/algebra.dag", 19705, 19720) }), Behavior::Transform(TransformNode { id: NodeId(162), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(223)], output: PortId(224), span: SourceSpan::new("src/v3/std/algebra.dag", 19762, 19766) }), Behavior::Transform(TransformNode { id: NodeId(163), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(223)], output: PortId(225), span: SourceSpan::new("src/v3/std/algebra.dag", 19794, 19798) }), Behavior::Transform(TransformNode { id: NodeId(164), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(226)], output: PortId(227), span: SourceSpan::new("src/v3/std/algebra.dag", 19846, 19850) }), Behavior::Transform(TransformNode { id: NodeId(165), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(223)], output: PortId(228), span: SourceSpan::new("src/v3/std/algebra.dag", 19905, 19909) }), Behavior::Transform(TransformNode { id: NodeId(166), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(226)], output: PortId(229), span: SourceSpan::new("src/v3/std/algebra.dag", 19918, 19922) }), Behavior::Transform(TransformNode { id: NodeId(167), target: TransformTarget::Callable(DeclarationId(770)), inputs: vec![PortId(228), PortId(229)], output: PortId(230), span: SourceSpan::new("src/v3/std/algebra.dag", 19874, 19923) }), Behavior::Transform(TransformNode { id: NodeId(168), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(223)], output: PortId(232), span: SourceSpan::new("src/v3/std/algebra.dag", 19978, 19982) }), Behavior::Transform(TransformNode { id: NodeId(169), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(226)], output: PortId(233), span: SourceSpan::new("src/v3/std/algebra.dag", 19991, 19995) }), Behavior::Transform(TransformNode { id: NodeId(170), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(226)], output: PortId(234), span: SourceSpan::new("src/v3/std/algebra.dag", 20004, 20008) }), Behavior::Transform(TransformNode { id: NodeId(171), target: TransformTarget::Callable(DeclarationId(753)), inputs: vec![PortId(232), PortId(233), PortId(234)], output: PortId(235), span: SourceSpan::new("src/v3/std/algebra.dag", 19959, 20009) }), Behavior::Transform(TransformNode { id: NodeId(172), target: TransformTarget::Callable(DeclarationId(1639)), inputs: vec![PortId(235)], output: PortId(236), span: SourceSpan::new("src/v3/std/algebra.dag", 19947, 20010) }), Behavior::Branch(BranchNode { id: NodeId(173), input: PortId(227), paths: vec![Path { body: NodeId(167), output: PortId(230), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19865, 19870) }, binding: None }, Path { body: NodeId(172), output: PortId(236), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19936, 19943) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(231) }) }], output: PortId(237), span: SourceSpan::new("src/v3/std/algebra.dag", 19833, 20022), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Branch(BranchNode { id: NodeId(174), input: PortId(224), paths: vec![Path { body: NodeId(163), output: PortId(225), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19777, 19782) }, binding: None }, Path { body: NodeId(173), output: PortId(237), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19807, 19819) }, binding: Some(PayloadBinding { binding_name: "second".to_string(), payload_port: PortId(226) }) }], output: PortId(238), span: SourceSpan::new("src/v3/std/algebra.dag", 19748, 20030), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Branch(BranchNode { id: NodeId(175), input: PortId(220), paths: vec![Path { body: NodeId(161), output: PortId(222), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19696, 19701) }, binding: None }, Path { body: NodeId(174), output: PortId(238), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19725, 19738) }, binding: Some(PayloadBinding { binding_name: "payload".to_string(), payload_port: PortId(223) }) }], output: PortId(239), span: SourceSpan::new("src/v3/std/algebra.dag", 19678, 20034), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(176), name: "reduce_product".to_string(), value: PortId(239), params: vec![PortId(220)], span: SourceSpan::new("src/v3/std/algebra.dag", 19678, 20034), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(177), target: TransformTarget::Callable(DeclarationId(771)), inputs: vec![PortId(242), PortId(240), PortId(241)], output: PortId(243), span: SourceSpan::new("src/v3/std/algebra.dag", 20311, 20340) }), Behavior::Transform(TransformNode { id: NodeId(178), target: TransformTarget::Callable(DeclarationId(774)), inputs: vec![PortId(240), PortId(241)], output: PortId(245), span: SourceSpan::new("src/v3/std/algebra.dag", 20364, 20382) }), Behavior::Transform(TransformNode { id: NodeId(179), target: TransformTarget::Callable(DeclarationId(774)), inputs: vec![PortId(240), PortId(241)], output: PortId(247), span: SourceSpan::new("src/v3/std/algebra.dag", 20408, 20426) }), Behavior::Transform(TransformNode { id: NodeId(180), target: TransformTarget::Callable(DeclarationId(774)), inputs: vec![PortId(240), PortId(241)], output: PortId(249), span: SourceSpan::new("src/v3/std/algebra.dag", 20445, 20463) }), Behavior::Transform(TransformNode { id: NodeId(181), target: TransformTarget::Callable(DeclarationId(774)), inputs: vec![PortId(240), PortId(241)], output: PortId(251), span: SourceSpan::new("src/v3/std/algebra.dag", 20482, 20500) }), Behavior::Transform(TransformNode { id: NodeId(182), target: TransformTarget::Callable(DeclarationId(774)), inputs: vec![PortId(240), PortId(241)], output: PortId(253), span: SourceSpan::new("src/v3/std/algebra.dag", 20523, 20541) }), Behavior::Transform(TransformNode { id: NodeId(183), target: TransformTarget::Callable(DeclarationId(774)), inputs: vec![PortId(240), PortId(241)], output: PortId(255), span: SourceSpan::new("src/v3/std/algebra.dag", 20564, 20582) }), Behavior::Branch(BranchNode { id: NodeId(184), input: PortId(240), paths: vec![Path { body: NodeId(177), output: PortId(243), pattern: BranchPattern::UnresolvedVariant { name: "LinearCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20293, 20307) }, binding: Some(PayloadBinding { binding_name: "va".to_string(), payload_port: PortId(242) }) }, Path { body: NodeId(178), output: PortId(245), pattern: BranchPattern::UnresolvedVariant { name: "ConstantCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20345, 20360) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(244) }) }, Path { body: NodeId(179), output: PortId(247), pattern: BranchPattern::UnresolvedVariant { name: "PolynomialCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20387, 20404) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(246) }) }, Path { body: NodeId(180), output: PortId(249), pattern: BranchPattern::UnresolvedVariant { name: "LogCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20431, 20441) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(248) }) }, Path { body: NodeId(181), output: PortId(251), pattern: BranchPattern::UnresolvedVariant { name: "SumCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20468, 20478) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(250) }) }, Path { body: NodeId(182), output: PortId(253), pattern: BranchPattern::UnresolvedVariant { name: "ProductCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20505, 20519) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(252) }) }, Path { body: NodeId(183), output: PortId(255), pattern: BranchPattern::UnresolvedVariant { name: "UnknownCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20546, 20560) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(254) }) }], output: PortId(256), span: SourceSpan::new("src/v3/std/algebra.dag", 20279, 20586), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(185), name: "combine_binary_product".to_string(), value: PortId(256), params: vec![PortId(240), PortId(241)], span: SourceSpan::new("src/v3/std/algebra.dag", 20279, 20586), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(186), target: TransformTarget::Callable(DeclarationId(772)), inputs: vec![PortId(257), PortId(260), PortId(258), PortId(259)], output: PortId(261), span: SourceSpan::new("src/v3/std/algebra.dag", 20715, 20751) }), Behavior::Transform(TransformNode { id: NodeId(187), target: TransformTarget::Callable(DeclarationId(774)), inputs: vec![PortId(258), PortId(259)], output: PortId(263), span: SourceSpan::new("src/v3/std/algebra.dag", 20775, 20793) }), Behavior::Transform(TransformNode { id: NodeId(188), target: TransformTarget::Callable(DeclarationId(774)), inputs: vec![PortId(258), PortId(259)], output: PortId(265), span: SourceSpan::new("src/v3/std/algebra.dag", 20819, 20837) }), Behavior::Transform(TransformNode { id: NodeId(189), target: TransformTarget::Callable(DeclarationId(774)), inputs: vec![PortId(258), PortId(259)], output: PortId(267), span: SourceSpan::new("src/v3/std/algebra.dag", 20856, 20874) }), Behavior::Transform(TransformNode { id: NodeId(190), target: TransformTarget::Callable(DeclarationId(774)), inputs: vec![PortId(258), PortId(259)], output: PortId(269), span: SourceSpan::new("src/v3/std/algebra.dag", 20893, 20911) }), Behavior::Transform(TransformNode { id: NodeId(191), target: TransformTarget::Callable(DeclarationId(774)), inputs: vec![PortId(258), PortId(259)], output: PortId(271), span: SourceSpan::new("src/v3/std/algebra.dag", 20934, 20952) }), Behavior::Transform(TransformNode { id: NodeId(192), target: TransformTarget::Callable(DeclarationId(774)), inputs: vec![PortId(258), PortId(259)], output: PortId(273), span: SourceSpan::new("src/v3/std/algebra.dag", 20975, 20993) }), Behavior::Branch(BranchNode { id: NodeId(193), input: PortId(259), paths: vec![Path { body: NodeId(186), output: PortId(261), pattern: BranchPattern::UnresolvedVariant { name: "LinearCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20697, 20711) }, binding: Some(PayloadBinding { binding_name: "vb".to_string(), payload_port: PortId(260) }) }, Path { body: NodeId(187), output: PortId(263), pattern: BranchPattern::UnresolvedVariant { name: "ConstantCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20756, 20771) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(262) }) }, Path { body: NodeId(188), output: PortId(265), pattern: BranchPattern::UnresolvedVariant { name: "PolynomialCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20798, 20815) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(264) }) }, Path { body: NodeId(189), output: PortId(267), pattern: BranchPattern::UnresolvedVariant { name: "LogCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20842, 20852) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(266) }) }, Path { body: NodeId(190), output: PortId(269), pattern: BranchPattern::UnresolvedVariant { name: "SumCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20879, 20889) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(268) }) }, Path { body: NodeId(191), output: PortId(271), pattern: BranchPattern::UnresolvedVariant { name: "ProductCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20916, 20930) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(270) }) }, Path { body: NodeId(192), output: PortId(273), pattern: BranchPattern::UnresolvedVariant { name: "UnknownCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20957, 20971) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(272) }) }], output: PortId(274), span: SourceSpan::new("src/v3/std/algebra.dag", 20683, 20997), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(194), name: "combine_linear_with".to_string(), value: PortId(274), params: vec![PortId(257), PortId(258), PortId(259)], span: SourceSpan::new("src/v3/std/algebra.dag", 20683, 20997), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(195), target: TransformTarget::Callable(DeclarationId(762)), inputs: vec![PortId(275), PortId(276)], output: PortId(279), span: SourceSpan::new("src/v3/std/algebra.dag", 21128, 21154) }), Behavior::Transform(TransformNode { id: NodeId(196), target: TransformTarget::Callable(DeclarationId(773)), inputs: vec![PortId(275)], output: PortId(280), span: SourceSpan::new("src/v3/std/algebra.dag", 21164, 21185) }), Behavior::Transform(TransformNode { id: NodeId(197), target: TransformTarget::Callable(DeclarationId(774)), inputs: vec![PortId(277), PortId(278)], output: PortId(281), span: SourceSpan::new("src/v3/std/algebra.dag", 21197, 21215) }), Behavior::Branch(BranchNode { id: NodeId(198), input: PortId(279), paths: vec![Path { body: NodeId(196), output: PortId(280), pattern: BranchPattern::UnresolvedVariant { name: "True".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 21164, 21185) }, binding: None }, Path { body: NodeId(197), output: PortId(281), pattern: BranchPattern::UnresolvedVariant { name: "False".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 21197, 21215) }, binding: None }], output: PortId(282), span: SourceSpan::new("src/v3/std/algebra.dag", 21125, 21215), emit_participation: None }), Behavior::Bind(BindNode { id: NodeId(199), name: "collapse_linear_square".to_string(), value: PortId(282), params: vec![PortId(275), PortId(276), PortId(277), PortId(278)], span: SourceSpan::new("src/v3/std/algebra.dag", 21125, 21215), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(200), target: TransformTarget::Callable(DeclarationId(752)), inputs: vec![PortId(283), PortId(284)], output: PortId(285), span: SourceSpan::new("src/v3/std/algebra.dag", 21405, 21420) }), Behavior::Transform(TransformNode { id: NodeId(201), target: TransformTarget::Callable(DeclarationId(1639)), inputs: vec![PortId(285)], output: PortId(286), span: SourceSpan::new("src/v3/std/algebra.dag", 21393, 21421) }), Behavior::Bind(BindNode { id: NodeId(202), name: "product_pair".to_string(), value: PortId(286), params: vec![PortId(283), PortId(284)], span: SourceSpan::new("src/v3/std/algebra.dag", 21393, 21421), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(203), target: TransformTarget::FieldProject { field_label: "any".to_string(), field_child: Some(DeclarationId(88)) }, inputs: vec![PortId(287)], output: PortId(289), span: SourceSpan::new("src/v3/std/algebra.dag", 21521, 21524) }), Behavior::Transform(TransformNode { id: NodeId(204), target: TransformTarget::FieldProject { field_label: "pivot".to_string(), field_child: Some(DeclarationId(747)) }, inputs: vec![PortId(287)], output: PortId(290), span: SourceSpan::new("src/v3/std/algebra.dag", 21545, 21550) }), Behavior::Transform(TransformNode { id: NodeId(205), target: TransformTarget::Callable(DeclarationId(761)), inputs: vec![PortId(288), PortId(290)], output: PortId(291), span: SourceSpan::new("src/v3/std/algebra.dag", 21528, 21551) }), Behavior::Transform(TransformNode { id: NodeId(206), target: TransformTarget::Operator(OperatorKind::Logical(LogicalOp::Or)), inputs: vec![PortId(289), PortId(291)], output: PortId(292), span: SourceSpan::new("src/v3/std/algebra.dag", 21517, 21551) }), Behavior::Transform(TransformNode { id: NodeId(207), target: TransformTarget::FieldProject { field_label: "pivot".to_string(), field_child: Some(DeclarationId(747)) }, inputs: vec![PortId(287)], output: PortId(293), span: SourceSpan::new("src/v3/std/algebra.dag", 21565, 21570) }), Behavior::Transform(TransformNode { id: NodeId(208), target: TransformTarget::Callable(DeclarationId(748)), inputs: vec![PortId(292), PortId(293)], output: PortId(294), span: SourceSpan::new("src/v3/std/algebra.dag", 21508, 21572) }), Behavior::Bind(BindNode { id: NodeId(209), name: "fold_or_dominate_scan".to_string(), value: PortId(294), params: vec![PortId(287), PortId(288)], span: SourceSpan::new("src/v3/std/algebra.dag", 21508, 21572), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(210), target: TransformTarget::FieldProject { field_label: "any".to_string(), field_child: Some(DeclarationId(88)) }, inputs: vec![PortId(295)], output: PortId(296), span: SourceSpan::new("src/v3/std/algebra.dag", 21626, 21629) }), Behavior::Bind(BindNode { id: NodeId(211), name: "scan_hit".to_string(), value: PortId(296), params: vec![PortId(295)], span: SourceSpan::new("src/v3/std/algebra.dag", 21621, 21629), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(212), target: TransformTarget::Callable(DeclarationId(1659)), inputs: vec![], output: PortId(299), span: SourceSpan::new("src/v3/std/algebra.dag", 21776, 21783) }), Behavior::Transform(TransformNode { id: NodeId(213), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(300)], output: PortId(301), span: SourceSpan::new("src/v3/std/algebra.dag", 21840, 21844) }), Behavior::Transform(TransformNode { id: NodeId(214), target: TransformTarget::Callable(DeclarationId(761)), inputs: vec![PortId(298), PortId(301)], output: PortId(302), span: SourceSpan::new("src/v3/std/algebra.dag", 21814, 21845) }), Behavior::Transform(TransformNode { id: NodeId(215), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(300)], output: PortId(303), span: SourceSpan::new("src/v3/std/algebra.dag", 21891, 21895) }), Behavior::Transform(TransformNode { id: NodeId(216), target: TransformTarget::Callable(DeclarationId(777)), inputs: vec![PortId(303), PortId(298)], output: PortId(304), span: SourceSpan::new("src/v3/std/algebra.dag", 21859, 21904) }), Behavior::Transform(TransformNode { id: NodeId(217), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(300)], output: PortId(305), span: SourceSpan::new("src/v3/std/algebra.dag", 21937, 21941) }), Behavior::Transform(TransformNode { id: NodeId(218), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(300)], output: PortId(306), span: SourceSpan::new("src/v3/std/algebra.dag", 21975, 21979) }), Behavior::Transform(TransformNode { id: NodeId(219), target: TransformTarget::Callable(DeclarationId(777)), inputs: vec![PortId(306), PortId(298)], output: PortId(307), span: SourceSpan::new("src/v3/std/algebra.dag", 21943, 21988) }), Behavior::Transform(TransformNode { id: NodeId(220), target: TransformTarget::Callable(DeclarationId(1660)), inputs: vec![PortId(305), PortId(307)], output: PortId(308), span: SourceSpan::new("src/v3/std/algebra.dag", 21924, 21989) }), Behavior::Branch(BranchNode { id: NodeId(221), input: PortId(302), paths: vec![Path { body: NodeId(216), output: PortId(304), pattern: BranchPattern::UnresolvedVariant { name: "True".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 21859, 21904) }, binding: None }, Path { body: NodeId(220), output: PortId(308), pattern: BranchPattern::UnresolvedVariant { name: "False".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 21924, 21989) }, binding: None }], output: PortId(309), span: SourceSpan::new("src/v3/std/algebra.dag", 21811, 21989), emit_participation: None }), Behavior::Branch(BranchNode { id: NodeId(222), input: PortId(297), paths: vec![Path { body: NodeId(212), output: PortId(299), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 21767, 21772) }, binding: None }, Path { body: NodeId(221), output: PortId(309), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 21788, 21801) }, binding: Some(PayloadBinding { binding_name: "payload".to_string(), payload_port: PortId(300) }) }], output: PortId(310), span: SourceSpan::new("src/v3/std/algebra.dag", 21744, 21993), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Loop(LoopNode { id: NodeId(223), source: PortId(297), init: PortId(297), body: NodeId(222), bound: LoopBound::Cardinality { count: PortId(297) }, output: PortId(311), span: SourceSpan::new("src/v3/std/algebra.dag", 21744, 21993) }), Behavior::Bind(BindNode { id: NodeId(224), name: "filter_not_dominated_by".to_string(), value: PortId(311), params: vec![PortId(297), PortId(298)], span: SourceSpan::new("src/v3/std/algebra.dag", 21744, 21993), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(225), target: TransformTarget::Callable(DeclarationId(749)), inputs: vec![PortId(313)], output: PortId(314), span: SourceSpan::new("src/v3/std/algebra.dag", 22117, 22141) }), Behavior::Transform(TransformNode { id: NodeId(226), target: TransformTarget::Callable(DeclarationId(1662)), inputs: vec![PortId(312), PortId(314)], output: PortId(315), span: SourceSpan::new("src/v3/std/algebra.dag", 22107, 22165) }), Behavior::Transform(TransformNode { id: NodeId(227), target: TransformTarget::Callable(DeclarationId(776)), inputs: vec![PortId(315)], output: PortId(316), span: SourceSpan::new("src/v3/std/algebra.dag", 22098, 22166) }), Behavior::Transform(TransformNode { id: NodeId(228), target: TransformTarget::Callable(DeclarationId(777)), inputs: vec![PortId(312), PortId(313)], output: PortId(317), span: SourceSpan::new("src/v3/std/algebra.dag", 22202, 22236) }), Behavior::Transform(TransformNode { id: NodeId(229), target: TransformTarget::Callable(DeclarationId(1663)), inputs: vec![PortId(313), PortId(317)], output: PortId(318), span: SourceSpan::new("src/v3/std/algebra.dag", 22191, 22237) }), Behavior::Branch(BranchNode { id: NodeId(230), input: PortId(316), paths: vec![Path { body: NodeId(230), output: PortId(312), pattern: BranchPattern::UnresolvedVariant { name: "True".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 22176, 22179) }, binding: None }, Path { body: NodeId(229), output: PortId(318), pattern: BranchPattern::UnresolvedVariant { name: "False".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 22191, 22237) }, binding: None }], output: PortId(319), span: SourceSpan::new("src/v3/std/algebra.dag", 22095, 22237), emit_participation: None }), Behavior::Bind(BindNode { id: NodeId(231), name: "drop_dominated_step".to_string(), value: PortId(319), params: vec![PortId(312), PortId(313)], span: SourceSpan::new("src/v3/std/algebra.dag", 22095, 22237), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(232), target: TransformTarget::Callable(DeclarationId(1664)), inputs: vec![], output: PortId(321), span: SourceSpan::new("src/v3/std/algebra.dag", 22508, 22515) }), Behavior::Transform(TransformNode { id: NodeId(233), target: TransformTarget::Callable(DeclarationId(1666)), inputs: vec![PortId(320), PortId(321)], output: PortId(322), span: SourceSpan::new("src/v3/std/algebra.dag", 22496, 22537) }), Behavior::Bind(BindNode { id: NodeId(234), name: "drop_dominated".to_string(), value: PortId(322), params: vec![PortId(320)], span: SourceSpan::new("src/v3/std/algebra.dag", 22496, 22537), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(235), target: TransformTarget::FieldProject { field_label: "nodes".to_string(), field_child: Some(DeclarationId(1601)) }, inputs: vec![PortId(323)], output: PortId(324), span: SourceSpan::new("src/v3/std/workflows.dag", 1013, 1018) }), Behavior::Bind(BindNode { id: NodeId(236), name: "behavior_spine".to_string(), value: PortId(324), params: vec![PortId(323)], span: SourceSpan::new("src/v3/std/workflows.dag", 1011, 1018), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Value(ValueNode { id: NodeId(237), data: LiteralBits::String("+".to_string()), output: PortId(327), span: SourceSpan::new("src/v3/compiler/operators.dag", 886, 889), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(238), data: LiteralBits::String("-".to_string()), output: PortId(328), span: SourceSpan::new("src/v3/compiler/operators.dag", 905, 908), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(239), data: LiteralBits::String("*".to_string()), output: PortId(329), span: SourceSpan::new("src/v3/compiler/operators.dag", 924, 927), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(240), data: LiteralBits::String("/".to_string()), output: PortId(330), span: SourceSpan::new("src/v3/compiler/operators.dag", 943, 946), lane2_workflow: None }), Behavior::Branch(BranchNode { id: NodeId(241), input: PortId(326), paths: vec![Path { body: NodeId(237), output: PortId(327), pattern: BranchPattern::UnresolvedVariant { name: "Add".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 879, 882) }, binding: None }, Path { body: NodeId(238), output: PortId(328), pattern: BranchPattern::UnresolvedVariant { name: "Sub".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 898, 901) }, binding: None }, Path { body: NodeId(239), output: PortId(329), pattern: BranchPattern::UnresolvedVariant { name: "Mul".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 917, 920) }, binding: None }, Path { body: NodeId(240), output: PortId(330), pattern: BranchPattern::UnresolvedVariant { name: "Div".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 936, 939) }, binding: None }], output: PortId(331), span: SourceSpan::new("src/v3/compiler/operators.dag", 857, 954), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Value(ValueNode { id: NodeId(242), data: LiteralBits::String("==".to_string()), output: PortId(333), span: SourceSpan::new("src/v3/compiler/operators.dag", 1012, 1016), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(243), data: LiteralBits::String("!=".to_string()), output: PortId(334), span: SourceSpan::new("src/v3/compiler/operators.dag", 1031, 1035), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(244), data: LiteralBits::String("<".to_string()), output: PortId(335), span: SourceSpan::new("src/v3/compiler/operators.dag", 1050, 1053), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(245), data: LiteralBits::String("<=".to_string()), output: PortId(336), span: SourceSpan::new("src/v3/compiler/operators.dag", 1068, 1072), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(246), data: LiteralBits::String(">".to_string()), output: PortId(337), span: SourceSpan::new("src/v3/compiler/operators.dag", 1087, 1090), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(247), data: LiteralBits::String(">=".to_string()), output: PortId(338), span: SourceSpan::new("src/v3/compiler/operators.dag", 1105, 1109), lane2_workflow: None }), Behavior::Branch(BranchNode { id: NodeId(248), input: PortId(332), paths: vec![Path { body: NodeId(242), output: PortId(333), pattern: BranchPattern::UnresolvedVariant { name: "Eq".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1006, 1008) }, binding: None }, Path { body: NodeId(243), output: PortId(334), pattern: BranchPattern::UnresolvedVariant { name: "Ne".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1025, 1027) }, binding: None }, Path { body: NodeId(244), output: PortId(335), pattern: BranchPattern::UnresolvedVariant { name: "Lt".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1044, 1046) }, binding: None }, Path { body: NodeId(245), output: PortId(336), pattern: BranchPattern::UnresolvedVariant { name: "Le".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1062, 1064) }, binding: None }, Path { body: NodeId(246), output: PortId(337), pattern: BranchPattern::UnresolvedVariant { name: "Gt".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1081, 1083) }, binding: None }, Path { body: NodeId(247), output: PortId(338), pattern: BranchPattern::UnresolvedVariant { name: "Ge".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1099, 1101) }, binding: None }], output: PortId(339), span: SourceSpan::new("src/v3/compiler/operators.dag", 985, 1117), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Value(ValueNode { id: NodeId(249), data: LiteralBits::String("&&".to_string()), output: PortId(341), span: SourceSpan::new("src/v3/compiler/operators.dag", 1179, 1183), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(250), data: LiteralBits::String("||".to_string()), output: PortId(342), span: SourceSpan::new("src/v3/compiler/operators.dag", 1198, 1202), lane2_workflow: None }), Behavior::Branch(BranchNode { id: NodeId(251), input: PortId(340), paths: vec![Path { body: NodeId(249), output: PortId(341), pattern: BranchPattern::UnresolvedVariant { name: "And".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1172, 1175) }, binding: None }, Path { body: NodeId(250), output: PortId(342), pattern: BranchPattern::UnresolvedVariant { name: "Or".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1192, 1194) }, binding: None }], output: PortId(343), span: SourceSpan::new("src/v3/compiler/operators.dag", 1148, 1210), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Branch(BranchNode { id: NodeId(252), input: PortId(325), paths: vec![Path { body: NodeId(241), output: PortId(331), pattern: BranchPattern::UnresolvedVariant { name: "Arithmetic".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 830, 847) }, binding: Some(PayloadBinding { binding_name: "arith".to_string(), payload_port: PortId(326) }) }, Path { body: NodeId(248), output: PortId(339), pattern: BranchPattern::UnresolvedVariant { name: "Comparison".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 959, 975) }, binding: Some(PayloadBinding { binding_name: "comp".to_string(), payload_port: PortId(332) }) }, Path { body: NodeId(251), output: PortId(343), pattern: BranchPattern::UnresolvedVariant { name: "Logical".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1122, 1138) }, binding: Some(PayloadBinding { binding_name: "logical".to_string(), payload_port: PortId(340) }) }], output: PortId(344), span: SourceSpan::new("src/v3/compiler/operators.dag", 815, 1214), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(253), name: "symbol".to_string(), value: PortId(344), params: vec![PortId(325)], span: SourceSpan::new("src/v3/compiler/operators.dag", 815, 1214), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Value(ValueNode { id: NodeId(254), data: LiteralBits::String("add".to_string()), output: PortId(347), span: SourceSpan::new("src/v3/compiler/operators.dag", 1341, 1346), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(255), data: LiteralBits::String("sub".to_string()), output: PortId(348), span: SourceSpan::new("src/v3/compiler/operators.dag", 1362, 1367), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(256), data: LiteralBits::String("mul".to_string()), output: PortId(349), span: SourceSpan::new("src/v3/compiler/operators.dag", 1383, 1388), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(257), data: LiteralBits::String("div".to_string()), output: PortId(350), span: SourceSpan::new("src/v3/compiler/operators.dag", 1404, 1409), lane2_workflow: None }), Behavior::Branch(BranchNode { id: NodeId(258), input: PortId(346), paths: vec![Path { body: NodeId(254), output: PortId(347), pattern: BranchPattern::UnresolvedVariant { name: "Add".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1334, 1337) }, binding: None }, Path { body: NodeId(255), output: PortId(348), pattern: BranchPattern::UnresolvedVariant { name: "Sub".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1355, 1358) }, binding: None }, Path { body: NodeId(256), output: PortId(349), pattern: BranchPattern::UnresolvedVariant { name: "Mul".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1376, 1379) }, binding: None }, Path { body: NodeId(257), output: PortId(350), pattern: BranchPattern::UnresolvedVariant { name: "Div".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1397, 1400) }, binding: None }], output: PortId(351), span: SourceSpan::new("src/v3/compiler/operators.dag", 1312, 1417), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Value(ValueNode { id: NodeId(259), data: LiteralBits::String("eq".to_string()), output: PortId(353), span: SourceSpan::new("src/v3/compiler/operators.dag", 1475, 1479), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(260), data: LiteralBits::String("ne".to_string()), output: PortId(354), span: SourceSpan::new("src/v3/compiler/operators.dag", 1494, 1498), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(261), data: LiteralBits::String("lt".to_string()), output: PortId(355), span: SourceSpan::new("src/v3/compiler/operators.dag", 1513, 1517), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(262), data: LiteralBits::String("le".to_string()), output: PortId(356), span: SourceSpan::new("src/v3/compiler/operators.dag", 1532, 1536), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(263), data: LiteralBits::String("gt".to_string()), output: PortId(357), span: SourceSpan::new("src/v3/compiler/operators.dag", 1551, 1555), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(264), data: LiteralBits::String("ge".to_string()), output: PortId(358), span: SourceSpan::new("src/v3/compiler/operators.dag", 1570, 1574), lane2_workflow: None }), Behavior::Branch(BranchNode { id: NodeId(265), input: PortId(352), paths: vec![Path { body: NodeId(259), output: PortId(353), pattern: BranchPattern::UnresolvedVariant { name: "Eq".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1469, 1471) }, binding: None }, Path { body: NodeId(260), output: PortId(354), pattern: BranchPattern::UnresolvedVariant { name: "Ne".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1488, 1490) }, binding: None }, Path { body: NodeId(261), output: PortId(355), pattern: BranchPattern::UnresolvedVariant { name: "Lt".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1507, 1509) }, binding: None }, Path { body: NodeId(262), output: PortId(356), pattern: BranchPattern::UnresolvedVariant { name: "Le".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1526, 1528) }, binding: None }, Path { body: NodeId(263), output: PortId(357), pattern: BranchPattern::UnresolvedVariant { name: "Gt".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1545, 1547) }, binding: None }, Path { body: NodeId(264), output: PortId(358), pattern: BranchPattern::UnresolvedVariant { name: "Ge".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1564, 1566) }, binding: None }], output: PortId(359), span: SourceSpan::new("src/v3/compiler/operators.dag", 1448, 1582), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Value(ValueNode { id: NodeId(266), data: LiteralBits::String("meet".to_string()), output: PortId(361), span: SourceSpan::new("src/v3/compiler/operators.dag", 1978, 1984), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(267), data: LiteralBits::String("join".to_string()), output: PortId(362), span: SourceSpan::new("src/v3/compiler/operators.dag", 1999, 2005), lane2_workflow: None }), Behavior::Branch(BranchNode { id: NodeId(268), input: PortId(360), paths: vec![Path { body: NodeId(266), output: PortId(361), pattern: BranchPattern::UnresolvedVariant { name: "And".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1971, 1974) }, binding: None }, Path { body: NodeId(267), output: PortId(362), pattern: BranchPattern::UnresolvedVariant { name: "Or".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1993, 1995) }, binding: None }], output: PortId(363), span: SourceSpan::new("src/v3/compiler/operators.dag", 1947, 2013), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Branch(BranchNode { id: NodeId(269), input: PortId(345), paths: vec![Path { body: NodeId(258), output: PortId(351), pattern: BranchPattern::UnresolvedVariant { name: "Arithmetic".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1285, 1302) }, binding: Some(PayloadBinding { binding_name: "arith".to_string(), payload_port: PortId(346) }) }, Path { body: NodeId(265), output: PortId(359), pattern: BranchPattern::UnresolvedVariant { name: "Comparison".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1422, 1438) }, binding: Some(PayloadBinding { binding_name: "comp".to_string(), payload_port: PortId(352) }) }, Path { body: NodeId(268), output: PortId(363), pattern: BranchPattern::UnresolvedVariant { name: "Logical".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1921, 1937) }, binding: Some(PayloadBinding { binding_name: "logical".to_string(), payload_port: PortId(360) }) }], output: PortId(364), span: SourceSpan::new("src/v3/compiler/operators.dag", 1270, 2017), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(270), name: "algebra_field_name".to_string(), value: PortId(364), params: vec![PortId(345)], span: SourceSpan::new("src/v3/compiler/operators.dag", 1270, 2017), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) })], + nodes: vec![Behavior::Transform(TransformNode { id: NodeId(0), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(1), span: SourceSpan::new("src/v3/std/algebra.dag", 9207, 9212) }), Behavior::Transform(TransformNode { id: NodeId(1), target: TransformTarget::Callable(DeclarationId(743)), inputs: vec![PortId(1), PortId(0)], output: PortId(2), span: SourceSpan::new("src/v3/std/algebra.dag", 9198, 9229) }), Behavior::Bind(BindNode { id: NodeId(2), name: "dominate_scan_init".to_string(), value: PortId(2), params: vec![PortId(0)], span: SourceSpan::new("src/v3/std/algebra.dag", 9198, 9229), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(3), target: TransformTarget::Callable(DeclarationId(1639)), inputs: vec![PortId(3)], output: PortId(5), span: SourceSpan::new("src/v3/std/algebra.dag", 10402, 10414) }), Behavior::Transform(TransformNode { id: NodeId(4), target: TransformTarget::Callable(DeclarationId(1641)), inputs: vec![PortId(5)], output: PortId(6), span: SourceSpan::new("src/v3/std/algebra.dag", 10395, 10442) }), Behavior::Transform(TransformNode { id: NodeId(5), target: TransformTarget::Callable(DeclarationId(1601)), inputs: vec![PortId(3), PortId(4), PortId(6)], output: PortId(7), span: SourceSpan::new("src/v3/std/algebra.dag", 10056, 10446) }), Behavior::Bind(BindNode { id: NodeId(6), name: "two_terms".to_string(), value: PortId(7), params: vec![PortId(3), PortId(4)], span: SourceSpan::new("src/v3/std/algebra.dag", 10056, 10446), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(7), target: TransformTarget::Callable(DeclarationId(1603)), inputs: vec![PortId(8), PortId(9), PortId(10)], output: PortId(11), span: SourceSpan::new("src/v3/std/algebra.dag", 10577, 10633) }), Behavior::Bind(BindNode { id: NodeId(8), name: "many_terms".to_string(), value: PortId(11), params: vec![PortId(8), PortId(9), PortId(10)], span: SourceSpan::new("src/v3/std/algebra.dag", 10577, 10633), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(9), target: TransformTarget::Callable(DeclarationId(1642)), inputs: vec![PortId(12)], output: PortId(13), span: SourceSpan::new("src/v3/std/algebra.dag", 10702, 10717) }), Behavior::Transform(TransformNode { id: NodeId(10), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(14), span: SourceSpan::new("src/v3/std/algebra.dag", 10733, 10738) }), Behavior::Transform(TransformNode { id: NodeId(11), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(16), span: SourceSpan::new("src/v3/std/algebra.dag", 10754, 10759) }), Behavior::Branch(BranchNode { id: NodeId(12), input: PortId(13), paths: vec![Path { body: NodeId(10), output: PortId(14), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 10724, 10729) }, binding: None }, Path { body: NodeId(11), output: PortId(16), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 10743, 10750) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(15) }) }], output: PortId(17), span: SourceSpan::new("src/v3/std/algebra.dag", 10696, 10763), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(13), name: "reject_all_symbolic_costs".to_string(), value: PortId(17), params: vec![PortId(12)], span: SourceSpan::new("src/v3/std/algebra.dag", 10696, 10763), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Value(ValueNode { id: NodeId(14), data: LiteralBits::Int(2), output: PortId(19), span: SourceSpan::new("src/v3/std/algebra.dag", 10848, 10849), lane2_workflow: None }), Behavior::Transform(TransformNode { id: NodeId(15), target: TransformTarget::FieldProject { field_label: "previous".to_string(), field_child: None }, inputs: vec![PortId(20)], output: PortId(21), span: SourceSpan::new("src/v3/std/algebra.dag", 10901, 10909) }), Behavior::Transform(TransformNode { id: NodeId(16), target: TransformTarget::Callable(DeclarationId(750)), inputs: vec![PortId(21)], output: PortId(22), span: SourceSpan::new("src/v3/std/algebra.dag", 10882, 10910) }), Behavior::Value(ValueNode { id: NodeId(17), data: LiteralBits::Int(1), output: PortId(23), span: SourceSpan::new("src/v3/std/algebra.dag", 10913, 10914), lane2_workflow: None }), Behavior::Transform(TransformNode { id: NodeId(18), target: TransformTarget::Operator(OperatorKind::Arithmetic(ArithmeticOp::Add)), inputs: vec![PortId(22), PortId(23)], output: PortId(24), span: SourceSpan::new("src/v3/std/algebra.dag", 10882, 10914) }), Behavior::Branch(BranchNode { id: NodeId(19), input: PortId(18), paths: vec![Path { body: NodeId(14), output: PortId(19), pattern: BranchPattern::UnresolvedVariant { name: "DegreeTwo".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 10835, 10844) }, binding: None }, Path { body: NodeId(18), output: PortId(24), pattern: BranchPattern::UnresolvedVariant { name: "DegreeSuccessor".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 10854, 10878) }, binding: Some(PayloadBinding { binding_name: "payload".to_string(), payload_port: PortId(20) }) }], output: PortId(25), span: SourceSpan::new("src/v3/std/algebra.dag", 10816, 10918), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Loop(LoopNode { id: NodeId(20), source: PortId(18), init: PortId(18), body: NodeId(19), bound: LoopBound::Cardinality { count: PortId(18) }, output: PortId(26), span: SourceSpan::new("src/v3/std/algebra.dag", 10816, 10918) }), Behavior::Bind(BindNode { id: NodeId(21), name: "degree_raw".to_string(), value: PortId(26), params: vec![PortId(18)], span: SourceSpan::new("src/v3/std/algebra.dag", 10816, 10918), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(22), target: TransformTarget::Callable(DeclarationId(747)), inputs: vec![PortId(27), PortId(28)], output: PortId(29), span: SourceSpan::new("src/v3/std/algebra.dag", 11240, 11255) }), Behavior::Transform(TransformNode { id: NodeId(23), target: TransformTarget::Callable(DeclarationId(1636)), inputs: vec![PortId(29)], output: PortId(30), span: SourceSpan::new("src/v3/std/algebra.dag", 11232, 11256) }), Behavior::Transform(TransformNode { id: NodeId(24), target: TransformTarget::Callable(DeclarationId(758)), inputs: vec![PortId(30)], output: PortId(31), span: SourceSpan::new("src/v3/std/algebra.dag", 11222, 11257) }), Behavior::Bind(BindNode { id: NodeId(25), name: "sequential".to_string(), value: PortId(31), params: vec![PortId(27), PortId(28)], span: SourceSpan::new("src/v3/std/algebra.dag", 11222, 11257), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(26), target: TransformTarget::Callable(DeclarationId(747)), inputs: vec![PortId(32), PortId(33)], output: PortId(34), span: SourceSpan::new("src/v3/std/algebra.dag", 11537, 11559) }), Behavior::Transform(TransformNode { id: NodeId(27), target: TransformTarget::Callable(DeclarationId(1634)), inputs: vec![PortId(34)], output: PortId(35), span: SourceSpan::new("src/v3/std/algebra.dag", 11525, 11560) }), Behavior::Transform(TransformNode { id: NodeId(28), target: TransformTarget::Callable(DeclarationId(758)), inputs: vec![PortId(35)], output: PortId(36), span: SourceSpan::new("src/v3/std/algebra.dag", 11515, 11561) }), Behavior::Bind(BindNode { id: NodeId(29), name: "iterate".to_string(), value: PortId(36), params: vec![PortId(32), PortId(33)], span: SourceSpan::new("src/v3/std/algebra.dag", 11515, 11561), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(30), target: TransformTarget::Callable(DeclarationId(756)), inputs: vec![PortId(38), PortId(37)], output: PortId(39), span: SourceSpan::new("src/v3/std/algebra.dag", 12505, 12530) }), Behavior::Transform(TransformNode { id: NodeId(31), target: TransformTarget::Callable(DeclarationId(754)), inputs: vec![PortId(37), PortId(38)], output: PortId(40), span: SourceSpan::new("src/v3/std/algebra.dag", 12561, 12588) }), Behavior::Branch(BranchNode { id: NodeId(32), input: PortId(39), paths: vec![Path { body: NodeId(32), output: PortId(38), pattern: BranchPattern::UnresolvedVariant { name: "True".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 12540, 12549) }, binding: None }, Path { body: NodeId(31), output: PortId(40), pattern: BranchPattern::UnresolvedVariant { name: "False".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 12561, 12588) }, binding: None }], output: PortId(41), span: SourceSpan::new("src/v3/std/algebra.dag", 12502, 12588), emit_participation: None }), Behavior::Bind(BindNode { id: NodeId(33), name: "max_path_step".to_string(), value: PortId(41), params: vec![PortId(37), PortId(38)], span: SourceSpan::new("src/v3/std/algebra.dag", 12502, 12588), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(34), target: TransformTarget::Callable(DeclarationId(756)), inputs: vec![PortId(42), PortId(43)], output: PortId(44), span: SourceSpan::new("src/v3/std/algebra.dag", 12672, 12697) }), Behavior::Transform(TransformNode { id: NodeId(35), target: TransformTarget::Callable(DeclarationId(751)), inputs: vec![PortId(42), PortId(43)], output: PortId(45), span: SourceSpan::new("src/v3/std/algebra.dag", 12722, 12748) }), Behavior::Branch(BranchNode { id: NodeId(36), input: PortId(44), paths: vec![Path { body: NodeId(36), output: PortId(42), pattern: BranchPattern::UnresolvedVariant { name: "True".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 12707, 12710) }, binding: None }, Path { body: NodeId(35), output: PortId(45), pattern: BranchPattern::UnresolvedVariant { name: "False".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 12722, 12748) }, binding: None }], output: PortId(46), span: SourceSpan::new("src/v3/std/algebra.dag", 12669, 12748), emit_participation: None }), Behavior::Bind(BindNode { id: NodeId(37), name: "keep_or_sum".to_string(), value: PortId(46), params: vec![PortId(42), PortId(43)], span: SourceSpan::new("src/v3/std/algebra.dag", 12669, 12748), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Value(ValueNode { id: NodeId(38), data: LiteralBits::Int(0), output: PortId(48), span: SourceSpan::new("src/v3/std/algebra.dag", 13134, 13135), lane2_workflow: None }), Behavior::Transform(TransformNode { id: NodeId(39), target: TransformTarget::Callable(DeclarationId(1630)), inputs: vec![PortId(48)], output: PortId(49), span: SourceSpan::new("src/v3/std/algebra.dag", 13121, 13136) }), Behavior::Transform(TransformNode { id: NodeId(40), target: TransformTarget::Callable(DeclarationId(1644)), inputs: vec![PortId(47), PortId(49)], output: PortId(50), span: SourceSpan::new("src/v3/std/algebra.dag", 13109, 13152) }), Behavior::Bind(BindNode { id: NodeId(41), name: "max_path".to_string(), value: PortId(50), params: vec![PortId(47)], span: SourceSpan::new("src/v3/std/algebra.dag", 13109, 13152), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(42), target: TransformTarget::Callable(DeclarationId(425)), inputs: vec![], output: PortId(54), span: SourceSpan::new("src/v3/std/algebra.dag", 14111, 14115) }), Behavior::Transform(TransformNode { id: NodeId(43), target: TransformTarget::Callable(DeclarationId(425)), inputs: vec![], output: PortId(57), span: SourceSpan::new("src/v3/std/algebra.dag", 14182, 14186) }), Behavior::Transform(TransformNode { id: NodeId(44), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(59), span: SourceSpan::new("src/v3/std/algebra.dag", 14213, 14218) }), Behavior::Transform(TransformNode { id: NodeId(45), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(61), span: SourceSpan::new("src/v3/std/algebra.dag", 14244, 14249) }), Behavior::Transform(TransformNode { id: NodeId(46), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(63), span: SourceSpan::new("src/v3/std/algebra.dag", 14279, 14284) }), Behavior::Transform(TransformNode { id: NodeId(47), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(65), span: SourceSpan::new("src/v3/std/algebra.dag", 14311, 14316) }), Behavior::Transform(TransformNode { id: NodeId(48), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(67), span: SourceSpan::new("src/v3/std/algebra.dag", 14339, 14344) }), Behavior::Transform(TransformNode { id: NodeId(49), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(69), span: SourceSpan::new("src/v3/std/algebra.dag", 14367, 14372) }), Behavior::Branch(BranchNode { id: NodeId(50), input: PortId(52), paths: vec![Path { body: NodeId(43), output: PortId(57), pattern: BranchPattern::UnresolvedVariant { name: "ConstantCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14163, 14178) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(56) }) }, Path { body: NodeId(44), output: PortId(59), pattern: BranchPattern::UnresolvedVariant { name: "UnknownCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14195, 14209) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(58) }) }, Path { body: NodeId(45), output: PortId(61), pattern: BranchPattern::UnresolvedVariant { name: "LinearCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14227, 14240) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(60) }) }, Path { body: NodeId(46), output: PortId(63), pattern: BranchPattern::UnresolvedVariant { name: "PolynomialCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14258, 14275) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(62) }) }, Path { body: NodeId(47), output: PortId(65), pattern: BranchPattern::UnresolvedVariant { name: "ProductCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14293, 14307) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(64) }) }, Path { body: NodeId(48), output: PortId(67), pattern: BranchPattern::UnresolvedVariant { name: "SumCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14325, 14335) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(66) }) }, Path { body: NodeId(49), output: PortId(69), pattern: BranchPattern::UnresolvedVariant { name: "LogCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14353, 14363) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(68) }) }], output: PortId(70), span: SourceSpan::new("src/v3/std/algebra.dag", 14145, 14380), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Transform(TransformNode { id: NodeId(51), target: TransformTarget::Callable(DeclarationId(425)), inputs: vec![], output: PortId(73), span: SourceSpan::new("src/v3/std/algebra.dag", 14446, 14450) }), Behavior::Transform(TransformNode { id: NodeId(52), target: TransformTarget::Callable(DeclarationId(425)), inputs: vec![], output: PortId(75), span: SourceSpan::new("src/v3/std/algebra.dag", 14473, 14477) }), Behavior::Transform(TransformNode { id: NodeId(53), target: TransformTarget::Callable(DeclarationId(757)), inputs: vec![PortId(71), PortId(76)], output: PortId(77), span: SourceSpan::new("src/v3/std/algebra.dag", 14504, 14530) }), Behavior::Transform(TransformNode { id: NodeId(54), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(79), span: SourceSpan::new("src/v3/std/algebra.dag", 14576, 14581) }), Behavior::Transform(TransformNode { id: NodeId(55), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(81), span: SourceSpan::new("src/v3/std/algebra.dag", 14608, 14613) }), Behavior::Transform(TransformNode { id: NodeId(56), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(83), span: SourceSpan::new("src/v3/std/algebra.dag", 14640, 14645) }), Behavior::Transform(TransformNode { id: NodeId(57), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(85), span: SourceSpan::new("src/v3/std/algebra.dag", 14668, 14673) }), Behavior::Branch(BranchNode { id: NodeId(58), input: PortId(52), paths: vec![Path { body: NodeId(51), output: PortId(73), pattern: BranchPattern::UnresolvedVariant { name: "ConstantCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14427, 14442) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(72) }) }, Path { body: NodeId(52), output: PortId(75), pattern: BranchPattern::UnresolvedVariant { name: "LogCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14459, 14469) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(74) }) }, Path { body: NodeId(53), output: PortId(77), pattern: BranchPattern::UnresolvedVariant { name: "LinearCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14486, 14500) }, binding: Some(PayloadBinding { binding_name: "vb".to_string(), payload_port: PortId(76) }) }, Path { body: NodeId(54), output: PortId(79), pattern: BranchPattern::UnresolvedVariant { name: "PolynomialCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14539, 14562) }, binding: Some(PayloadBinding { binding_name: "payload".to_string(), payload_port: PortId(78) }) }, Path { body: NodeId(55), output: PortId(81), pattern: BranchPattern::UnresolvedVariant { name: "UnknownCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14590, 14604) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(80) }) }, Path { body: NodeId(56), output: PortId(83), pattern: BranchPattern::UnresolvedVariant { name: "ProductCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14622, 14636) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(82) }) }, Path { body: NodeId(57), output: PortId(85), pattern: BranchPattern::UnresolvedVariant { name: "SumCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14654, 14664) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(84) }) }], output: PortId(86), span: SourceSpan::new("src/v3/std/algebra.dag", 14409, 14681), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Transform(TransformNode { id: NodeId(59), target: TransformTarget::Callable(DeclarationId(425)), inputs: vec![], output: PortId(89), span: SourceSpan::new("src/v3/std/algebra.dag", 14751, 14755) }), Behavior::Transform(TransformNode { id: NodeId(60), target: TransformTarget::Callable(DeclarationId(425)), inputs: vec![], output: PortId(91), span: SourceSpan::new("src/v3/std/algebra.dag", 14778, 14782) }), Behavior::Transform(TransformNode { id: NodeId(61), target: TransformTarget::FieldProject { field_label: "var".to_string(), field_child: None }, inputs: vec![PortId(87)], output: PortId(93), span: SourceSpan::new("src/v3/std/algebra.dag", 14841, 14844) }), Behavior::Transform(TransformNode { id: NodeId(62), target: TransformTarget::Callable(DeclarationId(757)), inputs: vec![PortId(93), PortId(92)], output: PortId(94), span: SourceSpan::new("src/v3/std/algebra.dag", 14819, 14849) }), Behavior::Transform(TransformNode { id: NodeId(63), target: TransformTarget::FieldProject { field_label: "var".to_string(), field_child: None }, inputs: vec![PortId(87)], output: PortId(96), span: SourceSpan::new("src/v3/std/algebra.dag", 14915, 14918) }), Behavior::Transform(TransformNode { id: NodeId(64), target: TransformTarget::FieldProject { field_label: "var".to_string(), field_child: None }, inputs: vec![PortId(95)], output: PortId(97), span: SourceSpan::new("src/v3/std/algebra.dag", 14923, 14926) }), Behavior::Transform(TransformNode { id: NodeId(65), target: TransformTarget::Callable(DeclarationId(757)), inputs: vec![PortId(96), PortId(97)], output: PortId(98), span: SourceSpan::new("src/v3/std/algebra.dag", 14893, 14927) }), Behavior::Transform(TransformNode { id: NodeId(66), target: TransformTarget::FieldProject { field_label: "degree".to_string(), field_child: None }, inputs: vec![PortId(87)], output: PortId(99), span: SourceSpan::new("src/v3/std/algebra.dag", 14959, 14965) }), Behavior::Transform(TransformNode { id: NodeId(67), target: TransformTarget::Callable(DeclarationId(750)), inputs: vec![PortId(99)], output: PortId(100), span: SourceSpan::new("src/v3/std/algebra.dag", 14945, 14966) }), Behavior::Transform(TransformNode { id: NodeId(68), target: TransformTarget::FieldProject { field_label: "degree".to_string(), field_child: None }, inputs: vec![PortId(95)], output: PortId(101), span: SourceSpan::new("src/v3/std/algebra.dag", 14984, 14990) }), Behavior::Transform(TransformNode { id: NodeId(69), target: TransformTarget::Callable(DeclarationId(750)), inputs: vec![PortId(101)], output: PortId(102), span: SourceSpan::new("src/v3/std/algebra.dag", 14970, 14991) }), Behavior::Transform(TransformNode { id: NodeId(70), target: TransformTarget::Operator(OperatorKind::Comparison(ComparisonOp::Ge)), inputs: vec![PortId(100), PortId(102)], output: PortId(103), span: SourceSpan::new("src/v3/std/algebra.dag", 14945, 14991) }), Behavior::Transform(TransformNode { id: NodeId(71), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(104), span: SourceSpan::new("src/v3/std/algebra.dag", 15019, 15024) }), Behavior::Branch(BranchNode { id: NodeId(72), input: PortId(98), paths: vec![Path { body: NodeId(70), output: PortId(103), pattern: BranchPattern::UnresolvedVariant { name: "True".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14945, 14991) }, binding: None }, Path { body: NodeId(71), output: PortId(104), pattern: BranchPattern::UnresolvedVariant { name: "False".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15019, 15024) }, binding: None }], output: PortId(105), span: SourceSpan::new("src/v3/std/algebra.dag", 14890, 15024), emit_participation: None }), Behavior::Transform(TransformNode { id: NodeId(73), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(107), span: SourceSpan::new("src/v3/std/algebra.dag", 15051, 15056) }), Behavior::Transform(TransformNode { id: NodeId(74), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(109), span: SourceSpan::new("src/v3/std/algebra.dag", 15083, 15088) }), Behavior::Transform(TransformNode { id: NodeId(75), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(111), span: SourceSpan::new("src/v3/std/algebra.dag", 15111, 15116) }), Behavior::Branch(BranchNode { id: NodeId(76), input: PortId(52), paths: vec![Path { body: NodeId(59), output: PortId(89), pattern: BranchPattern::UnresolvedVariant { name: "ConstantCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14732, 14747) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(88) }) }, Path { body: NodeId(60), output: PortId(91), pattern: BranchPattern::UnresolvedVariant { name: "LogCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14764, 14774) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(90) }) }, Path { body: NodeId(62), output: PortId(94), pattern: BranchPattern::UnresolvedVariant { name: "LinearCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14791, 14805) }, binding: Some(PayloadBinding { binding_name: "vb".to_string(), payload_port: PortId(92) }) }, Path { body: NodeId(72), output: PortId(105), pattern: BranchPattern::UnresolvedVariant { name: "PolynomialCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14858, 14876) }, binding: Some(PayloadBinding { binding_name: "pb".to_string(), payload_port: PortId(95) }) }, Path { body: NodeId(73), output: PortId(107), pattern: BranchPattern::UnresolvedVariant { name: "UnknownCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15033, 15047) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(106) }) }, Path { body: NodeId(74), output: PortId(109), pattern: BranchPattern::UnresolvedVariant { name: "ProductCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15065, 15079) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(108) }) }, Path { body: NodeId(75), output: PortId(111), pattern: BranchPattern::UnresolvedVariant { name: "SumCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15097, 15107) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(110) }) }], output: PortId(112), span: SourceSpan::new("src/v3/std/algebra.dag", 14714, 15124), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Transform(TransformNode { id: NodeId(77), target: TransformTarget::Callable(DeclarationId(425)), inputs: vec![], output: PortId(115), span: SourceSpan::new("src/v3/std/algebra.dag", 15187, 15191) }), Behavior::Transform(TransformNode { id: NodeId(78), target: TransformTarget::Callable(DeclarationId(757)), inputs: vec![PortId(113), PortId(116)], output: PortId(117), span: SourceSpan::new("src/v3/std/algebra.dag", 15215, 15241) }), Behavior::Transform(TransformNode { id: NodeId(79), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(119), span: SourceSpan::new("src/v3/std/algebra.dag", 15267, 15272) }), Behavior::Transform(TransformNode { id: NodeId(80), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(121), span: SourceSpan::new("src/v3/std/algebra.dag", 15302, 15307) }), Behavior::Transform(TransformNode { id: NodeId(81), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(123), span: SourceSpan::new("src/v3/std/algebra.dag", 15334, 15339) }), Behavior::Transform(TransformNode { id: NodeId(82), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(125), span: SourceSpan::new("src/v3/std/algebra.dag", 15362, 15367) }), Behavior::Transform(TransformNode { id: NodeId(83), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(127), span: SourceSpan::new("src/v3/std/algebra.dag", 15394, 15399) }), Behavior::Branch(BranchNode { id: NodeId(84), input: PortId(52), paths: vec![Path { body: NodeId(77), output: PortId(115), pattern: BranchPattern::UnresolvedVariant { name: "ConstantCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15168, 15183) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(114) }) }, Path { body: NodeId(78), output: PortId(117), pattern: BranchPattern::UnresolvedVariant { name: "LogCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15200, 15211) }, binding: Some(PayloadBinding { binding_name: "vb".to_string(), payload_port: PortId(116) }) }, Path { body: NodeId(79), output: PortId(119), pattern: BranchPattern::UnresolvedVariant { name: "LinearCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15250, 15263) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(118) }) }, Path { body: NodeId(80), output: PortId(121), pattern: BranchPattern::UnresolvedVariant { name: "PolynomialCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15281, 15298) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(120) }) }, Path { body: NodeId(81), output: PortId(123), pattern: BranchPattern::UnresolvedVariant { name: "ProductCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15316, 15330) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(122) }) }, Path { body: NodeId(82), output: PortId(125), pattern: BranchPattern::UnresolvedVariant { name: "SumCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15348, 15358) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(124) }) }, Path { body: NodeId(83), output: PortId(127), pattern: BranchPattern::UnresolvedVariant { name: "UnknownCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15376, 15390) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(126) }) }], output: PortId(128), span: SourceSpan::new("src/v3/std/algebra.dag", 15150, 15407), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Transform(TransformNode { id: NodeId(85), target: TransformTarget::Callable(DeclarationId(759)), inputs: vec![PortId(129)], output: PortId(130), span: SourceSpan::new("src/v3/std/algebra.dag", 15834, 15852) }), Behavior::Transform(TransformNode { id: NodeId(86), target: TransformTarget::Callable(DeclarationId(744)), inputs: vec![PortId(52)], output: PortId(131), span: SourceSpan::new("src/v3/std/algebra.dag", 15864, 15885) }), Behavior::Transform(TransformNode { id: NodeId(87), target: TransformTarget::Callable(DeclarationId(1646)), inputs: vec![PortId(130), PortId(131)], output: PortId(132), span: SourceSpan::new("src/v3/std/algebra.dag", 15818, 15928) }), Behavior::Transform(TransformNode { id: NodeId(88), target: TransformTarget::Callable(DeclarationId(771)), inputs: vec![PortId(132)], output: PortId(133), span: SourceSpan::new("src/v3/std/algebra.dag", 15800, 15936) }), Behavior::Transform(TransformNode { id: NodeId(89), target: TransformTarget::Callable(DeclarationId(759)), inputs: vec![PortId(134)], output: PortId(135), span: SourceSpan::new("src/v3/std/algebra.dag", 15999, 16017) }), Behavior::Transform(TransformNode { id: NodeId(90), target: TransformTarget::Callable(DeclarationId(744)), inputs: vec![PortId(52)], output: PortId(136), span: SourceSpan::new("src/v3/std/algebra.dag", 16029, 16050) }), Behavior::Transform(TransformNode { id: NodeId(91), target: TransformTarget::Callable(DeclarationId(1648)), inputs: vec![PortId(135), PortId(136)], output: PortId(137), span: SourceSpan::new("src/v3/std/algebra.dag", 15983, 16093) }), Behavior::Transform(TransformNode { id: NodeId(92), target: TransformTarget::Callable(DeclarationId(771)), inputs: vec![PortId(137)], output: PortId(138), span: SourceSpan::new("src/v3/std/algebra.dag", 15965, 16101) }), Behavior::Branch(BranchNode { id: NodeId(93), input: PortId(51), paths: vec![Path { body: NodeId(42), output: PortId(54), pattern: BranchPattern::UnresolvedVariant { name: "UnknownCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14093, 14107) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(53) }) }, Path { body: NodeId(50), output: PortId(70), pattern: BranchPattern::UnresolvedVariant { name: "ConstantCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14120, 14135) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(55) }) }, Path { body: NodeId(58), output: PortId(86), pattern: BranchPattern::UnresolvedVariant { name: "LinearCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14385, 14399) }, binding: Some(PayloadBinding { binding_name: "va".to_string(), payload_port: PortId(71) }) }, Path { body: NodeId(76), output: PortId(112), pattern: BranchPattern::UnresolvedVariant { name: "PolynomialCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14686, 14704) }, binding: Some(PayloadBinding { binding_name: "pa".to_string(), payload_port: PortId(87) }) }, Path { body: NodeId(84), output: PortId(128), pattern: BranchPattern::UnresolvedVariant { name: "LogCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15129, 15140) }, binding: Some(PayloadBinding { binding_name: "va".to_string(), payload_port: PortId(113) }) }, Path { body: NodeId(88), output: PortId(133), pattern: BranchPattern::UnresolvedVariant { name: "ProductCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15772, 15790) }, binding: Some(PayloadBinding { binding_name: "terms".to_string(), payload_port: PortId(129) }) }, Path { body: NodeId(92), output: PortId(138), pattern: BranchPattern::UnresolvedVariant { name: "SumCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15941, 15955) }, binding: Some(PayloadBinding { binding_name: "terms".to_string(), payload_port: PortId(134) }) }], output: PortId(139), span: SourceSpan::new("src/v3/std/algebra.dag", 14079, 16105), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(94), name: "dominates".to_string(), value: PortId(139), params: vec![PortId(51), PortId(52)], span: SourceSpan::new("src/v3/std/algebra.dag", 14079, 16105), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(95), target: TransformTarget::FieldProject { field_label: "source_port".to_string(), field_child: Some(DeclarationId(626)) }, inputs: vec![PortId(140)], output: PortId(142), span: SourceSpan::new("src/v3/std/algebra.dag", 16177, 16188) }), Behavior::Transform(TransformNode { id: NodeId(96), target: TransformTarget::FieldProject { field_label: "source_port".to_string(), field_child: Some(DeclarationId(626)) }, inputs: vec![PortId(141)], output: PortId(143), span: SourceSpan::new("src/v3/std/algebra.dag", 16194, 16205) }), Behavior::Transform(TransformNode { id: NodeId(97), target: TransformTarget::Operator(OperatorKind::Comparison(ComparisonOp::Eq)), inputs: vec![PortId(142), PortId(143)], output: PortId(144), span: SourceSpan::new("src/v3/std/algebra.dag", 16175, 16205) }), Behavior::Bind(BindNode { id: NodeId(98), name: "same_size_variable".to_string(), value: PortId(144), params: vec![PortId(140), PortId(141)], span: SourceSpan::new("src/v3/std/algebra.dag", 16175, 16205), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(99), target: TransformTarget::Callable(DeclarationId(759)), inputs: vec![PortId(146)], output: PortId(147), span: SourceSpan::new("src/v3/std/algebra.dag", 17170, 17188) }), Behavior::Transform(TransformNode { id: NodeId(100), target: TransformTarget::Callable(DeclarationId(760)), inputs: vec![PortId(147)], output: PortId(148), span: SourceSpan::new("src/v3/std/algebra.dag", 17160, 17189) }), Behavior::Transform(TransformNode { id: NodeId(101), target: TransformTarget::Callable(DeclarationId(762)), inputs: vec![PortId(148)], output: PortId(149), span: SourceSpan::new("src/v3/std/algebra.dag", 17149, 17190) }), Behavior::Transform(TransformNode { id: NodeId(102), target: TransformTarget::Callable(DeclarationId(759)), inputs: vec![PortId(150)], output: PortId(151), span: SourceSpan::new("src/v3/std/algebra.dag", 17242, 17260) }), Behavior::Transform(TransformNode { id: NodeId(103), target: TransformTarget::Callable(DeclarationId(760)), inputs: vec![PortId(151)], output: PortId(152), span: SourceSpan::new("src/v3/std/algebra.dag", 17232, 17261) }), Behavior::Transform(TransformNode { id: NodeId(104), target: TransformTarget::Callable(DeclarationId(764)), inputs: vec![PortId(152)], output: PortId(153), span: SourceSpan::new("src/v3/std/algebra.dag", 17217, 17262) }), Behavior::Branch(BranchNode { id: NodeId(105), input: PortId(145), paths: vec![Path { body: NodeId(105), output: PortId(145), pattern: BranchPattern::UnresolvedVariant { name: "ConstantCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17027, 17039) }, binding: None }, Path { body: NodeId(105), output: PortId(145), pattern: BranchPattern::UnresolvedVariant { name: "LinearCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17049, 17059) }, binding: None }, Path { body: NodeId(105), output: PortId(145), pattern: BranchPattern::UnresolvedVariant { name: "PolynomialCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17069, 17083) }, binding: None }, Path { body: NodeId(105), output: PortId(145), pattern: BranchPattern::UnresolvedVariant { name: "LogCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17093, 17100) }, binding: None }, Path { body: NodeId(105), output: PortId(145), pattern: BranchPattern::UnresolvedVariant { name: "UnknownCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17110, 17121) }, binding: None }, Path { body: NodeId(101), output: PortId(149), pattern: BranchPattern::UnresolvedVariant { name: "SumCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17131, 17145) }, binding: Some(PayloadBinding { binding_name: "terms".to_string(), payload_port: PortId(146) }) }, Path { body: NodeId(104), output: PortId(153), pattern: BranchPattern::UnresolvedVariant { name: "ProductCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17195, 17213) }, binding: Some(PayloadBinding { binding_name: "terms".to_string(), payload_port: PortId(150) }) }], output: PortId(154), span: SourceSpan::new("src/v3/std/algebra.dag", 17013, 17266), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(106), name: "normalize".to_string(), value: PortId(154), params: vec![PortId(145)], span: SourceSpan::new("src/v3/std/algebra.dag", 17013, 17266), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(107), target: TransformTarget::FieldProject { field_label: "first".to_string(), field_child: Some(DeclarationId(632)) }, inputs: vec![PortId(155)], output: PortId(156), span: SourceSpan::new("src/v3/std/algebra.dag", 17359, 17364) }), Behavior::Transform(TransformNode { id: NodeId(108), target: TransformTarget::FieldProject { field_label: "second".to_string(), field_child: Some(DeclarationId(632)) }, inputs: vec![PortId(155)], output: PortId(157), span: SourceSpan::new("src/v3/std/algebra.dag", 17377, 17383) }), Behavior::Transform(TransformNode { id: NodeId(109), target: TransformTarget::FieldProject { field_label: "rest".to_string(), field_child: Some(DeclarationId(1423)) }, inputs: vec![PortId(155)], output: PortId(158), span: SourceSpan::new("src/v3/std/algebra.dag", 17391, 17395) }), Behavior::Transform(TransformNode { id: NodeId(110), target: TransformTarget::Callable(DeclarationId(1649)), inputs: vec![PortId(157), PortId(158)], output: PortId(159), span: SourceSpan::new("src/v3/std/algebra.dag", 17366, 17396) }), Behavior::Transform(TransformNode { id: NodeId(111), target: TransformTarget::Callable(DeclarationId(1650)), inputs: vec![PortId(156), PortId(159)], output: PortId(160), span: SourceSpan::new("src/v3/std/algebra.dag", 17348, 17397) }), Behavior::Bind(BindNode { id: NodeId(112), name: "nsl_to_list".to_string(), value: PortId(160), params: vec![PortId(155)], span: SourceSpan::new("src/v3/std/algebra.dag", 17348, 17397), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(113), target: TransformTarget::Callable(DeclarationId(1651)), inputs: vec![], output: PortId(162), span: SourceSpan::new("src/v3/std/algebra.dag", 17667, 17674) }), Behavior::Transform(TransformNode { id: NodeId(114), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(163)], output: PortId(164), span: SourceSpan::new("src/v3/std/algebra.dag", 17730, 17734) }), Behavior::Transform(TransformNode { id: NodeId(115), target: TransformTarget::Callable(DeclarationId(761)), inputs: vec![PortId(164)], output: PortId(165), span: SourceSpan::new("src/v3/std/algebra.dag", 17705, 17735) }), Behavior::Transform(TransformNode { id: NodeId(116), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(163)], output: PortId(166), span: SourceSpan::new("src/v3/std/algebra.dag", 17767, 17771) }), Behavior::Transform(TransformNode { id: NodeId(117), target: TransformTarget::Callable(DeclarationId(760)), inputs: vec![PortId(166)], output: PortId(167), span: SourceSpan::new("src/v3/std/algebra.dag", 17749, 17772) }), Behavior::Transform(TransformNode { id: NodeId(118), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(163)], output: PortId(168), span: SourceSpan::new("src/v3/std/algebra.dag", 17805, 17809) }), Behavior::Transform(TransformNode { id: NodeId(119), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(163)], output: PortId(169), span: SourceSpan::new("src/v3/std/algebra.dag", 17829, 17833) }), Behavior::Transform(TransformNode { id: NodeId(120), target: TransformTarget::Callable(DeclarationId(760)), inputs: vec![PortId(169)], output: PortId(170), span: SourceSpan::new("src/v3/std/algebra.dag", 17811, 17834) }), Behavior::Transform(TransformNode { id: NodeId(121), target: TransformTarget::Callable(DeclarationId(1652)), inputs: vec![PortId(168), PortId(170)], output: PortId(171), span: SourceSpan::new("src/v3/std/algebra.dag", 17792, 17835) }), Behavior::Branch(BranchNode { id: NodeId(122), input: PortId(165), paths: vec![Path { body: NodeId(117), output: PortId(167), pattern: BranchPattern::UnresolvedVariant { name: "True".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17749, 17772) }, binding: None }, Path { body: NodeId(121), output: PortId(171), pattern: BranchPattern::UnresolvedVariant { name: "False".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17792, 17835) }, binding: None }], output: PortId(172), span: SourceSpan::new("src/v3/std/algebra.dag", 17702, 17835), emit_participation: None }), Behavior::Branch(BranchNode { id: NodeId(123), input: PortId(161), paths: vec![Path { body: NodeId(113), output: PortId(162), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17658, 17663) }, binding: None }, Path { body: NodeId(122), output: PortId(172), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17679, 17692) }, binding: Some(PayloadBinding { binding_name: "payload".to_string(), payload_port: PortId(163) }) }], output: PortId(173), span: SourceSpan::new("src/v3/std/algebra.dag", 17640, 17839), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Loop(LoopNode { id: NodeId(124), source: PortId(161), init: PortId(161), body: NodeId(123), bound: LoopBound::Cardinality { count: PortId(161) }, output: PortId(174), span: SourceSpan::new("src/v3/std/algebra.dag", 17640, 17839) }), Behavior::Bind(BindNode { id: NodeId(125), name: "drop_zero".to_string(), value: PortId(174), params: vec![PortId(161)], span: SourceSpan::new("src/v3/std/algebra.dag", 17640, 17839), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Value(ValueNode { id: NodeId(126), data: LiteralBits::Int(0), output: PortId(177), span: SourceSpan::new("src/v3/std/algebra.dag", 17928, 17929), lane2_workflow: None }), Behavior::Transform(TransformNode { id: NodeId(127), target: TransformTarget::Operator(OperatorKind::Comparison(ComparisonOp::Eq)), inputs: vec![PortId(176), PortId(177)], output: PortId(178), span: SourceSpan::new("src/v3/std/algebra.dag", 17923, 17929) }), Behavior::Transform(TransformNode { id: NodeId(128), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(180), span: SourceSpan::new("src/v3/std/algebra.dag", 17951, 17956) }), Behavior::Transform(TransformNode { id: NodeId(129), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(182), span: SourceSpan::new("src/v3/std/algebra.dag", 17982, 17987) }), Behavior::Transform(TransformNode { id: NodeId(130), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(184), span: SourceSpan::new("src/v3/std/algebra.dag", 18010, 18015) }), Behavior::Transform(TransformNode { id: NodeId(131), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(186), span: SourceSpan::new("src/v3/std/algebra.dag", 18034, 18039) }), Behavior::Transform(TransformNode { id: NodeId(132), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(188), span: SourceSpan::new("src/v3/std/algebra.dag", 18058, 18063) }), Behavior::Transform(TransformNode { id: NodeId(133), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(190), span: SourceSpan::new("src/v3/std/algebra.dag", 18086, 18091) }), Behavior::Branch(BranchNode { id: NodeId(134), input: PortId(175), paths: vec![Path { body: NodeId(127), output: PortId(178), pattern: BranchPattern::UnresolvedVariant { name: "ConstantCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17904, 17919) }, binding: Some(PayloadBinding { binding_name: "n".to_string(), payload_port: PortId(176) }) }, Path { body: NodeId(128), output: PortId(180), pattern: BranchPattern::UnresolvedVariant { name: "LinearCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17934, 17947) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(179) }) }, Path { body: NodeId(129), output: PortId(182), pattern: BranchPattern::UnresolvedVariant { name: "PolynomialCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17961, 17978) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(181) }) }, Path { body: NodeId(130), output: PortId(184), pattern: BranchPattern::UnresolvedVariant { name: "ProductCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17992, 18006) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(183) }) }, Path { body: NodeId(131), output: PortId(186), pattern: BranchPattern::UnresolvedVariant { name: "SumCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 18020, 18030) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(185) }) }, Path { body: NodeId(132), output: PortId(188), pattern: BranchPattern::UnresolvedVariant { name: "LogCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 18044, 18054) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(187) }) }, Path { body: NodeId(133), output: PortId(190), pattern: BranchPattern::UnresolvedVariant { name: "UnknownCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 18068, 18082) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(189) }) }], output: PortId(191), span: SourceSpan::new("src/v3/std/algebra.dag", 17890, 18095), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(135), name: "is_zero_constant".to_string(), value: PortId(191), params: vec![PortId(175)], span: SourceSpan::new("src/v3/std/algebra.dag", 17890, 18095), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Value(ValueNode { id: NodeId(136), data: LiteralBits::Int(0), output: PortId(193), span: SourceSpan::new("src/v3/std/algebra.dag", 18981, 18982), lane2_workflow: None }), Behavior::Transform(TransformNode { id: NodeId(137), target: TransformTarget::Callable(DeclarationId(1630)), inputs: vec![PortId(193)], output: PortId(194), span: SourceSpan::new("src/v3/std/algebra.dag", 18968, 18983) }), Behavior::Transform(TransformNode { id: NodeId(138), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(195)], output: PortId(196), span: SourceSpan::new("src/v3/std/algebra.dag", 19025, 19029) }), Behavior::Transform(TransformNode { id: NodeId(139), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(195)], output: PortId(197), span: SourceSpan::new("src/v3/std/algebra.dag", 19057, 19061) }), Behavior::Transform(TransformNode { id: NodeId(140), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(195)], output: PortId(199), span: SourceSpan::new("src/v3/std/algebra.dag", 19118, 19122) }), Behavior::Transform(TransformNode { id: NodeId(141), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(195)], output: PortId(200), span: SourceSpan::new("src/v3/std/algebra.dag", 19132, 19136) }), Behavior::Transform(TransformNode { id: NodeId(142), target: TransformTarget::Callable(DeclarationId(1653)), inputs: vec![PortId(199), PortId(200)], output: PortId(201), span: SourceSpan::new("src/v3/std/algebra.dag", 19105, 19137) }), Behavior::Transform(TransformNode { id: NodeId(143), target: TransformTarget::Callable(DeclarationId(774)), inputs: vec![PortId(201)], output: PortId(202), span: SourceSpan::new("src/v3/std/algebra.dag", 19090, 19138) }), Behavior::Transform(TransformNode { id: NodeId(144), target: TransformTarget::Callable(DeclarationId(763)), inputs: vec![PortId(202)], output: PortId(203), span: SourceSpan::new("src/v3/std/algebra.dag", 19081, 19139) }), Behavior::Branch(BranchNode { id: NodeId(145), input: PortId(196), paths: vec![Path { body: NodeId(139), output: PortId(197), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19040, 19045) }, binding: None }, Path { body: NodeId(144), output: PortId(203), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19070, 19077) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(198) }) }], output: PortId(204), span: SourceSpan::new("src/v3/std/algebra.dag", 19011, 19147), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Branch(BranchNode { id: NodeId(146), input: PortId(192), paths: vec![Path { body: NodeId(137), output: PortId(194), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 18959, 18964) }, binding: None }, Path { body: NodeId(145), output: PortId(204), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 18988, 19001) }, binding: Some(PayloadBinding { binding_name: "payload".to_string(), payload_port: PortId(195) }) }], output: PortId(205), span: SourceSpan::new("src/v3/std/algebra.dag", 18941, 19151), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(147), name: "reduce_sum".to_string(), value: PortId(205), params: vec![PortId(192)], span: SourceSpan::new("src/v3/std/algebra.dag", 18941, 19151), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Value(ValueNode { id: NodeId(148), data: LiteralBits::Int(0), output: PortId(207), span: SourceSpan::new("src/v3/std/algebra.dag", 19252, 19253), lane2_workflow: None }), Behavior::Transform(TransformNode { id: NodeId(149), target: TransformTarget::Callable(DeclarationId(1630)), inputs: vec![PortId(207)], output: PortId(208), span: SourceSpan::new("src/v3/std/algebra.dag", 19239, 19254) }), Behavior::Transform(TransformNode { id: NodeId(150), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(209)], output: PortId(210), span: SourceSpan::new("src/v3/std/algebra.dag", 19296, 19300) }), Behavior::Transform(TransformNode { id: NodeId(151), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(209)], output: PortId(211), span: SourceSpan::new("src/v3/std/algebra.dag", 19328, 19332) }), Behavior::Transform(TransformNode { id: NodeId(152), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(209)], output: PortId(213), span: SourceSpan::new("src/v3/std/algebra.dag", 19384, 19388) }), Behavior::Transform(TransformNode { id: NodeId(153), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(212)], output: PortId(214), span: SourceSpan::new("src/v3/std/algebra.dag", 19397, 19401) }), Behavior::Transform(TransformNode { id: NodeId(154), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(212)], output: PortId(215), span: SourceSpan::new("src/v3/std/algebra.dag", 19410, 19414) }), Behavior::Transform(TransformNode { id: NodeId(155), target: TransformTarget::Callable(DeclarationId(748)), inputs: vec![PortId(213), PortId(214), PortId(215)], output: PortId(216), span: SourceSpan::new("src/v3/std/algebra.dag", 19365, 19415) }), Behavior::Transform(TransformNode { id: NodeId(156), target: TransformTarget::Callable(DeclarationId(1636)), inputs: vec![PortId(216)], output: PortId(217), span: SourceSpan::new("src/v3/std/algebra.dag", 19357, 19416) }), Behavior::Branch(BranchNode { id: NodeId(157), input: PortId(210), paths: vec![Path { body: NodeId(151), output: PortId(211), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19311, 19316) }, binding: None }, Path { body: NodeId(156), output: PortId(217), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19341, 19353) }, binding: Some(PayloadBinding { binding_name: "second".to_string(), payload_port: PortId(212) }) }], output: PortId(218), span: SourceSpan::new("src/v3/std/algebra.dag", 19282, 19424), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Branch(BranchNode { id: NodeId(158), input: PortId(206), paths: vec![Path { body: NodeId(149), output: PortId(208), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19230, 19235) }, binding: None }, Path { body: NodeId(157), output: PortId(218), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19259, 19272) }, binding: Some(PayloadBinding { binding_name: "payload".to_string(), payload_port: PortId(209) }) }], output: PortId(219), span: SourceSpan::new("src/v3/std/algebra.dag", 19212, 19428), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(159), name: "wrap_sum".to_string(), value: PortId(219), params: vec![PortId(206)], span: SourceSpan::new("src/v3/std/algebra.dag", 19212, 19428), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Value(ValueNode { id: NodeId(160), data: LiteralBits::Int(0), output: PortId(221), span: SourceSpan::new("src/v3/std/algebra.dag", 19718, 19719), lane2_workflow: None }), Behavior::Transform(TransformNode { id: NodeId(161), target: TransformTarget::Callable(DeclarationId(1630)), inputs: vec![PortId(221)], output: PortId(222), span: SourceSpan::new("src/v3/std/algebra.dag", 19705, 19720) }), Behavior::Transform(TransformNode { id: NodeId(162), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(223)], output: PortId(224), span: SourceSpan::new("src/v3/std/algebra.dag", 19762, 19766) }), Behavior::Transform(TransformNode { id: NodeId(163), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(223)], output: PortId(225), span: SourceSpan::new("src/v3/std/algebra.dag", 19794, 19798) }), Behavior::Transform(TransformNode { id: NodeId(164), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(226)], output: PortId(227), span: SourceSpan::new("src/v3/std/algebra.dag", 19846, 19850) }), Behavior::Transform(TransformNode { id: NodeId(165), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(223)], output: PortId(228), span: SourceSpan::new("src/v3/std/algebra.dag", 19905, 19909) }), Behavior::Transform(TransformNode { id: NodeId(166), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(226)], output: PortId(229), span: SourceSpan::new("src/v3/std/algebra.dag", 19918, 19922) }), Behavior::Transform(TransformNode { id: NodeId(167), target: TransformTarget::Callable(DeclarationId(765)), inputs: vec![PortId(228), PortId(229)], output: PortId(230), span: SourceSpan::new("src/v3/std/algebra.dag", 19874, 19923) }), Behavior::Transform(TransformNode { id: NodeId(168), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(223)], output: PortId(232), span: SourceSpan::new("src/v3/std/algebra.dag", 19978, 19982) }), Behavior::Transform(TransformNode { id: NodeId(169), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(226)], output: PortId(233), span: SourceSpan::new("src/v3/std/algebra.dag", 19991, 19995) }), Behavior::Transform(TransformNode { id: NodeId(170), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(226)], output: PortId(234), span: SourceSpan::new("src/v3/std/algebra.dag", 20004, 20008) }), Behavior::Transform(TransformNode { id: NodeId(171), target: TransformTarget::Callable(DeclarationId(748)), inputs: vec![PortId(232), PortId(233), PortId(234)], output: PortId(235), span: SourceSpan::new("src/v3/std/algebra.dag", 19959, 20009) }), Behavior::Transform(TransformNode { id: NodeId(172), target: TransformTarget::Callable(DeclarationId(1634)), inputs: vec![PortId(235)], output: PortId(236), span: SourceSpan::new("src/v3/std/algebra.dag", 19947, 20010) }), Behavior::Branch(BranchNode { id: NodeId(173), input: PortId(227), paths: vec![Path { body: NodeId(167), output: PortId(230), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19865, 19870) }, binding: None }, Path { body: NodeId(172), output: PortId(236), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19936, 19943) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(231) }) }], output: PortId(237), span: SourceSpan::new("src/v3/std/algebra.dag", 19833, 20022), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Branch(BranchNode { id: NodeId(174), input: PortId(224), paths: vec![Path { body: NodeId(163), output: PortId(225), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19777, 19782) }, binding: None }, Path { body: NodeId(173), output: PortId(237), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19807, 19819) }, binding: Some(PayloadBinding { binding_name: "second".to_string(), payload_port: PortId(226) }) }], output: PortId(238), span: SourceSpan::new("src/v3/std/algebra.dag", 19748, 20030), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Branch(BranchNode { id: NodeId(175), input: PortId(220), paths: vec![Path { body: NodeId(161), output: PortId(222), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19696, 19701) }, binding: None }, Path { body: NodeId(174), output: PortId(238), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19725, 19738) }, binding: Some(PayloadBinding { binding_name: "payload".to_string(), payload_port: PortId(223) }) }], output: PortId(239), span: SourceSpan::new("src/v3/std/algebra.dag", 19678, 20034), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(176), name: "reduce_product".to_string(), value: PortId(239), params: vec![PortId(220)], span: SourceSpan::new("src/v3/std/algebra.dag", 19678, 20034), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(177), target: TransformTarget::Callable(DeclarationId(766)), inputs: vec![PortId(242), PortId(240), PortId(241)], output: PortId(243), span: SourceSpan::new("src/v3/std/algebra.dag", 20311, 20340) }), Behavior::Transform(TransformNode { id: NodeId(178), target: TransformTarget::Callable(DeclarationId(769)), inputs: vec![PortId(240), PortId(241)], output: PortId(245), span: SourceSpan::new("src/v3/std/algebra.dag", 20364, 20382) }), Behavior::Transform(TransformNode { id: NodeId(179), target: TransformTarget::Callable(DeclarationId(769)), inputs: vec![PortId(240), PortId(241)], output: PortId(247), span: SourceSpan::new("src/v3/std/algebra.dag", 20408, 20426) }), Behavior::Transform(TransformNode { id: NodeId(180), target: TransformTarget::Callable(DeclarationId(769)), inputs: vec![PortId(240), PortId(241)], output: PortId(249), span: SourceSpan::new("src/v3/std/algebra.dag", 20445, 20463) }), Behavior::Transform(TransformNode { id: NodeId(181), target: TransformTarget::Callable(DeclarationId(769)), inputs: vec![PortId(240), PortId(241)], output: PortId(251), span: SourceSpan::new("src/v3/std/algebra.dag", 20482, 20500) }), Behavior::Transform(TransformNode { id: NodeId(182), target: TransformTarget::Callable(DeclarationId(769)), inputs: vec![PortId(240), PortId(241)], output: PortId(253), span: SourceSpan::new("src/v3/std/algebra.dag", 20523, 20541) }), Behavior::Transform(TransformNode { id: NodeId(183), target: TransformTarget::Callable(DeclarationId(769)), inputs: vec![PortId(240), PortId(241)], output: PortId(255), span: SourceSpan::new("src/v3/std/algebra.dag", 20564, 20582) }), Behavior::Branch(BranchNode { id: NodeId(184), input: PortId(240), paths: vec![Path { body: NodeId(177), output: PortId(243), pattern: BranchPattern::UnresolvedVariant { name: "LinearCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20293, 20307) }, binding: Some(PayloadBinding { binding_name: "va".to_string(), payload_port: PortId(242) }) }, Path { body: NodeId(178), output: PortId(245), pattern: BranchPattern::UnresolvedVariant { name: "ConstantCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20345, 20360) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(244) }) }, Path { body: NodeId(179), output: PortId(247), pattern: BranchPattern::UnresolvedVariant { name: "PolynomialCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20387, 20404) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(246) }) }, Path { body: NodeId(180), output: PortId(249), pattern: BranchPattern::UnresolvedVariant { name: "LogCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20431, 20441) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(248) }) }, Path { body: NodeId(181), output: PortId(251), pattern: BranchPattern::UnresolvedVariant { name: "SumCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20468, 20478) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(250) }) }, Path { body: NodeId(182), output: PortId(253), pattern: BranchPattern::UnresolvedVariant { name: "ProductCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20505, 20519) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(252) }) }, Path { body: NodeId(183), output: PortId(255), pattern: BranchPattern::UnresolvedVariant { name: "UnknownCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20546, 20560) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(254) }) }], output: PortId(256), span: SourceSpan::new("src/v3/std/algebra.dag", 20279, 20586), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(185), name: "combine_binary_product".to_string(), value: PortId(256), params: vec![PortId(240), PortId(241)], span: SourceSpan::new("src/v3/std/algebra.dag", 20279, 20586), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(186), target: TransformTarget::Callable(DeclarationId(767)), inputs: vec![PortId(257), PortId(260), PortId(258), PortId(259)], output: PortId(261), span: SourceSpan::new("src/v3/std/algebra.dag", 20715, 20751) }), Behavior::Transform(TransformNode { id: NodeId(187), target: TransformTarget::Callable(DeclarationId(769)), inputs: vec![PortId(258), PortId(259)], output: PortId(263), span: SourceSpan::new("src/v3/std/algebra.dag", 20775, 20793) }), Behavior::Transform(TransformNode { id: NodeId(188), target: TransformTarget::Callable(DeclarationId(769)), inputs: vec![PortId(258), PortId(259)], output: PortId(265), span: SourceSpan::new("src/v3/std/algebra.dag", 20819, 20837) }), Behavior::Transform(TransformNode { id: NodeId(189), target: TransformTarget::Callable(DeclarationId(769)), inputs: vec![PortId(258), PortId(259)], output: PortId(267), span: SourceSpan::new("src/v3/std/algebra.dag", 20856, 20874) }), Behavior::Transform(TransformNode { id: NodeId(190), target: TransformTarget::Callable(DeclarationId(769)), inputs: vec![PortId(258), PortId(259)], output: PortId(269), span: SourceSpan::new("src/v3/std/algebra.dag", 20893, 20911) }), Behavior::Transform(TransformNode { id: NodeId(191), target: TransformTarget::Callable(DeclarationId(769)), inputs: vec![PortId(258), PortId(259)], output: PortId(271), span: SourceSpan::new("src/v3/std/algebra.dag", 20934, 20952) }), Behavior::Transform(TransformNode { id: NodeId(192), target: TransformTarget::Callable(DeclarationId(769)), inputs: vec![PortId(258), PortId(259)], output: PortId(273), span: SourceSpan::new("src/v3/std/algebra.dag", 20975, 20993) }), Behavior::Branch(BranchNode { id: NodeId(193), input: PortId(259), paths: vec![Path { body: NodeId(186), output: PortId(261), pattern: BranchPattern::UnresolvedVariant { name: "LinearCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20697, 20711) }, binding: Some(PayloadBinding { binding_name: "vb".to_string(), payload_port: PortId(260) }) }, Path { body: NodeId(187), output: PortId(263), pattern: BranchPattern::UnresolvedVariant { name: "ConstantCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20756, 20771) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(262) }) }, Path { body: NodeId(188), output: PortId(265), pattern: BranchPattern::UnresolvedVariant { name: "PolynomialCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20798, 20815) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(264) }) }, Path { body: NodeId(189), output: PortId(267), pattern: BranchPattern::UnresolvedVariant { name: "LogCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20842, 20852) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(266) }) }, Path { body: NodeId(190), output: PortId(269), pattern: BranchPattern::UnresolvedVariant { name: "SumCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20879, 20889) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(268) }) }, Path { body: NodeId(191), output: PortId(271), pattern: BranchPattern::UnresolvedVariant { name: "ProductCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20916, 20930) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(270) }) }, Path { body: NodeId(192), output: PortId(273), pattern: BranchPattern::UnresolvedVariant { name: "UnknownCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20957, 20971) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(272) }) }], output: PortId(274), span: SourceSpan::new("src/v3/std/algebra.dag", 20683, 20997), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(194), name: "combine_linear_with".to_string(), value: PortId(274), params: vec![PortId(257), PortId(258), PortId(259)], span: SourceSpan::new("src/v3/std/algebra.dag", 20683, 20997), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(195), target: TransformTarget::Callable(DeclarationId(757)), inputs: vec![PortId(275), PortId(276)], output: PortId(279), span: SourceSpan::new("src/v3/std/algebra.dag", 21128, 21154) }), Behavior::Transform(TransformNode { id: NodeId(196), target: TransformTarget::Callable(DeclarationId(768)), inputs: vec![PortId(275)], output: PortId(280), span: SourceSpan::new("src/v3/std/algebra.dag", 21164, 21185) }), Behavior::Transform(TransformNode { id: NodeId(197), target: TransformTarget::Callable(DeclarationId(769)), inputs: vec![PortId(277), PortId(278)], output: PortId(281), span: SourceSpan::new("src/v3/std/algebra.dag", 21197, 21215) }), Behavior::Branch(BranchNode { id: NodeId(198), input: PortId(279), paths: vec![Path { body: NodeId(196), output: PortId(280), pattern: BranchPattern::UnresolvedVariant { name: "True".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 21164, 21185) }, binding: None }, Path { body: NodeId(197), output: PortId(281), pattern: BranchPattern::UnresolvedVariant { name: "False".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 21197, 21215) }, binding: None }], output: PortId(282), span: SourceSpan::new("src/v3/std/algebra.dag", 21125, 21215), emit_participation: None }), Behavior::Bind(BindNode { id: NodeId(199), name: "collapse_linear_square".to_string(), value: PortId(282), params: vec![PortId(275), PortId(276), PortId(277), PortId(278)], span: SourceSpan::new("src/v3/std/algebra.dag", 21125, 21215), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(200), target: TransformTarget::Callable(DeclarationId(747)), inputs: vec![PortId(283), PortId(284)], output: PortId(285), span: SourceSpan::new("src/v3/std/algebra.dag", 21405, 21420) }), Behavior::Transform(TransformNode { id: NodeId(201), target: TransformTarget::Callable(DeclarationId(1634)), inputs: vec![PortId(285)], output: PortId(286), span: SourceSpan::new("src/v3/std/algebra.dag", 21393, 21421) }), Behavior::Bind(BindNode { id: NodeId(202), name: "product_pair".to_string(), value: PortId(286), params: vec![PortId(283), PortId(284)], span: SourceSpan::new("src/v3/std/algebra.dag", 21393, 21421), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(203), target: TransformTarget::FieldProject { field_label: "any".to_string(), field_child: Some(DeclarationId(88)) }, inputs: vec![PortId(287)], output: PortId(289), span: SourceSpan::new("src/v3/std/algebra.dag", 21521, 21524) }), Behavior::Transform(TransformNode { id: NodeId(204), target: TransformTarget::FieldProject { field_label: "pivot".to_string(), field_child: Some(DeclarationId(742)) }, inputs: vec![PortId(287)], output: PortId(290), span: SourceSpan::new("src/v3/std/algebra.dag", 21545, 21550) }), Behavior::Transform(TransformNode { id: NodeId(205), target: TransformTarget::Callable(DeclarationId(756)), inputs: vec![PortId(288), PortId(290)], output: PortId(291), span: SourceSpan::new("src/v3/std/algebra.dag", 21528, 21551) }), Behavior::Transform(TransformNode { id: NodeId(206), target: TransformTarget::Operator(OperatorKind::Logical(LogicalOp::Or)), inputs: vec![PortId(289), PortId(291)], output: PortId(292), span: SourceSpan::new("src/v3/std/algebra.dag", 21517, 21551) }), Behavior::Transform(TransformNode { id: NodeId(207), target: TransformTarget::FieldProject { field_label: "pivot".to_string(), field_child: Some(DeclarationId(742)) }, inputs: vec![PortId(287)], output: PortId(293), span: SourceSpan::new("src/v3/std/algebra.dag", 21565, 21570) }), Behavior::Transform(TransformNode { id: NodeId(208), target: TransformTarget::Callable(DeclarationId(743)), inputs: vec![PortId(292), PortId(293)], output: PortId(294), span: SourceSpan::new("src/v3/std/algebra.dag", 21508, 21572) }), Behavior::Bind(BindNode { id: NodeId(209), name: "fold_or_dominate_scan".to_string(), value: PortId(294), params: vec![PortId(287), PortId(288)], span: SourceSpan::new("src/v3/std/algebra.dag", 21508, 21572), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(210), target: TransformTarget::FieldProject { field_label: "any".to_string(), field_child: Some(DeclarationId(88)) }, inputs: vec![PortId(295)], output: PortId(296), span: SourceSpan::new("src/v3/std/algebra.dag", 21626, 21629) }), Behavior::Bind(BindNode { id: NodeId(211), name: "scan_hit".to_string(), value: PortId(296), params: vec![PortId(295)], span: SourceSpan::new("src/v3/std/algebra.dag", 21621, 21629), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(212), target: TransformTarget::Callable(DeclarationId(1654)), inputs: vec![], output: PortId(299), span: SourceSpan::new("src/v3/std/algebra.dag", 21776, 21783) }), Behavior::Transform(TransformNode { id: NodeId(213), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(300)], output: PortId(301), span: SourceSpan::new("src/v3/std/algebra.dag", 21840, 21844) }), Behavior::Transform(TransformNode { id: NodeId(214), target: TransformTarget::Callable(DeclarationId(756)), inputs: vec![PortId(298), PortId(301)], output: PortId(302), span: SourceSpan::new("src/v3/std/algebra.dag", 21814, 21845) }), Behavior::Transform(TransformNode { id: NodeId(215), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(300)], output: PortId(303), span: SourceSpan::new("src/v3/std/algebra.dag", 21891, 21895) }), Behavior::Transform(TransformNode { id: NodeId(216), target: TransformTarget::Callable(DeclarationId(772)), inputs: vec![PortId(303), PortId(298)], output: PortId(304), span: SourceSpan::new("src/v3/std/algebra.dag", 21859, 21904) }), Behavior::Transform(TransformNode { id: NodeId(217), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(300)], output: PortId(305), span: SourceSpan::new("src/v3/std/algebra.dag", 21937, 21941) }), Behavior::Transform(TransformNode { id: NodeId(218), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(300)], output: PortId(306), span: SourceSpan::new("src/v3/std/algebra.dag", 21975, 21979) }), Behavior::Transform(TransformNode { id: NodeId(219), target: TransformTarget::Callable(DeclarationId(772)), inputs: vec![PortId(306), PortId(298)], output: PortId(307), span: SourceSpan::new("src/v3/std/algebra.dag", 21943, 21988) }), Behavior::Transform(TransformNode { id: NodeId(220), target: TransformTarget::Callable(DeclarationId(1655)), inputs: vec![PortId(305), PortId(307)], output: PortId(308), span: SourceSpan::new("src/v3/std/algebra.dag", 21924, 21989) }), Behavior::Branch(BranchNode { id: NodeId(221), input: PortId(302), paths: vec![Path { body: NodeId(216), output: PortId(304), pattern: BranchPattern::UnresolvedVariant { name: "True".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 21859, 21904) }, binding: None }, Path { body: NodeId(220), output: PortId(308), pattern: BranchPattern::UnresolvedVariant { name: "False".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 21924, 21989) }, binding: None }], output: PortId(309), span: SourceSpan::new("src/v3/std/algebra.dag", 21811, 21989), emit_participation: None }), Behavior::Branch(BranchNode { id: NodeId(222), input: PortId(297), paths: vec![Path { body: NodeId(212), output: PortId(299), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 21767, 21772) }, binding: None }, Path { body: NodeId(221), output: PortId(309), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 21788, 21801) }, binding: Some(PayloadBinding { binding_name: "payload".to_string(), payload_port: PortId(300) }) }], output: PortId(310), span: SourceSpan::new("src/v3/std/algebra.dag", 21744, 21993), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Loop(LoopNode { id: NodeId(223), source: PortId(297), init: PortId(297), body: NodeId(222), bound: LoopBound::Cardinality { count: PortId(297) }, output: PortId(311), span: SourceSpan::new("src/v3/std/algebra.dag", 21744, 21993) }), Behavior::Bind(BindNode { id: NodeId(224), name: "filter_not_dominated_by".to_string(), value: PortId(311), params: vec![PortId(297), PortId(298)], span: SourceSpan::new("src/v3/std/algebra.dag", 21744, 21993), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(225), target: TransformTarget::Callable(DeclarationId(744)), inputs: vec![PortId(313)], output: PortId(314), span: SourceSpan::new("src/v3/std/algebra.dag", 22117, 22141) }), Behavior::Transform(TransformNode { id: NodeId(226), target: TransformTarget::Callable(DeclarationId(1657)), inputs: vec![PortId(312), PortId(314)], output: PortId(315), span: SourceSpan::new("src/v3/std/algebra.dag", 22107, 22165) }), Behavior::Transform(TransformNode { id: NodeId(227), target: TransformTarget::Callable(DeclarationId(771)), inputs: vec![PortId(315)], output: PortId(316), span: SourceSpan::new("src/v3/std/algebra.dag", 22098, 22166) }), Behavior::Transform(TransformNode { id: NodeId(228), target: TransformTarget::Callable(DeclarationId(772)), inputs: vec![PortId(312), PortId(313)], output: PortId(317), span: SourceSpan::new("src/v3/std/algebra.dag", 22202, 22236) }), Behavior::Transform(TransformNode { id: NodeId(229), target: TransformTarget::Callable(DeclarationId(1658)), inputs: vec![PortId(313), PortId(317)], output: PortId(318), span: SourceSpan::new("src/v3/std/algebra.dag", 22191, 22237) }), Behavior::Branch(BranchNode { id: NodeId(230), input: PortId(316), paths: vec![Path { body: NodeId(230), output: PortId(312), pattern: BranchPattern::UnresolvedVariant { name: "True".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 22176, 22179) }, binding: None }, Path { body: NodeId(229), output: PortId(318), pattern: BranchPattern::UnresolvedVariant { name: "False".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 22191, 22237) }, binding: None }], output: PortId(319), span: SourceSpan::new("src/v3/std/algebra.dag", 22095, 22237), emit_participation: None }), Behavior::Bind(BindNode { id: NodeId(231), name: "drop_dominated_step".to_string(), value: PortId(319), params: vec![PortId(312), PortId(313)], span: SourceSpan::new("src/v3/std/algebra.dag", 22095, 22237), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(232), target: TransformTarget::Callable(DeclarationId(1659)), inputs: vec![], output: PortId(321), span: SourceSpan::new("src/v3/std/algebra.dag", 22508, 22515) }), Behavior::Transform(TransformNode { id: NodeId(233), target: TransformTarget::Callable(DeclarationId(1661)), inputs: vec![PortId(320), PortId(321)], output: PortId(322), span: SourceSpan::new("src/v3/std/algebra.dag", 22496, 22537) }), Behavior::Bind(BindNode { id: NodeId(234), name: "drop_dominated".to_string(), value: PortId(322), params: vec![PortId(320)], span: SourceSpan::new("src/v3/std/algebra.dag", 22496, 22537), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(235), target: TransformTarget::FieldProject { field_label: "nodes".to_string(), field_child: Some(DeclarationId(1596)) }, inputs: vec![PortId(323)], output: PortId(324), span: SourceSpan::new("src/v3/std/workflows.dag", 1013, 1018) }), Behavior::Bind(BindNode { id: NodeId(236), name: "behavior_spine".to_string(), value: PortId(324), params: vec![PortId(323)], span: SourceSpan::new("src/v3/std/workflows.dag", 1011, 1018), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Value(ValueNode { id: NodeId(237), data: LiteralBits::String("+".to_string()), output: PortId(327), span: SourceSpan::new("src/v3/compiler/operators.dag", 886, 889), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(238), data: LiteralBits::String("-".to_string()), output: PortId(328), span: SourceSpan::new("src/v3/compiler/operators.dag", 905, 908), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(239), data: LiteralBits::String("*".to_string()), output: PortId(329), span: SourceSpan::new("src/v3/compiler/operators.dag", 924, 927), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(240), data: LiteralBits::String("/".to_string()), output: PortId(330), span: SourceSpan::new("src/v3/compiler/operators.dag", 943, 946), lane2_workflow: None }), Behavior::Branch(BranchNode { id: NodeId(241), input: PortId(326), paths: vec![Path { body: NodeId(237), output: PortId(327), pattern: BranchPattern::UnresolvedVariant { name: "Add".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 879, 882) }, binding: None }, Path { body: NodeId(238), output: PortId(328), pattern: BranchPattern::UnresolvedVariant { name: "Sub".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 898, 901) }, binding: None }, Path { body: NodeId(239), output: PortId(329), pattern: BranchPattern::UnresolvedVariant { name: "Mul".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 917, 920) }, binding: None }, Path { body: NodeId(240), output: PortId(330), pattern: BranchPattern::UnresolvedVariant { name: "Div".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 936, 939) }, binding: None }], output: PortId(331), span: SourceSpan::new("src/v3/compiler/operators.dag", 857, 954), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Value(ValueNode { id: NodeId(242), data: LiteralBits::String("==".to_string()), output: PortId(333), span: SourceSpan::new("src/v3/compiler/operators.dag", 1012, 1016), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(243), data: LiteralBits::String("!=".to_string()), output: PortId(334), span: SourceSpan::new("src/v3/compiler/operators.dag", 1031, 1035), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(244), data: LiteralBits::String("<".to_string()), output: PortId(335), span: SourceSpan::new("src/v3/compiler/operators.dag", 1050, 1053), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(245), data: LiteralBits::String("<=".to_string()), output: PortId(336), span: SourceSpan::new("src/v3/compiler/operators.dag", 1068, 1072), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(246), data: LiteralBits::String(">".to_string()), output: PortId(337), span: SourceSpan::new("src/v3/compiler/operators.dag", 1087, 1090), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(247), data: LiteralBits::String(">=".to_string()), output: PortId(338), span: SourceSpan::new("src/v3/compiler/operators.dag", 1105, 1109), lane2_workflow: None }), Behavior::Branch(BranchNode { id: NodeId(248), input: PortId(332), paths: vec![Path { body: NodeId(242), output: PortId(333), pattern: BranchPattern::UnresolvedVariant { name: "Eq".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1006, 1008) }, binding: None }, Path { body: NodeId(243), output: PortId(334), pattern: BranchPattern::UnresolvedVariant { name: "Ne".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1025, 1027) }, binding: None }, Path { body: NodeId(244), output: PortId(335), pattern: BranchPattern::UnresolvedVariant { name: "Lt".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1044, 1046) }, binding: None }, Path { body: NodeId(245), output: PortId(336), pattern: BranchPattern::UnresolvedVariant { name: "Le".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1062, 1064) }, binding: None }, Path { body: NodeId(246), output: PortId(337), pattern: BranchPattern::UnresolvedVariant { name: "Gt".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1081, 1083) }, binding: None }, Path { body: NodeId(247), output: PortId(338), pattern: BranchPattern::UnresolvedVariant { name: "Ge".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1099, 1101) }, binding: None }], output: PortId(339), span: SourceSpan::new("src/v3/compiler/operators.dag", 985, 1117), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Value(ValueNode { id: NodeId(249), data: LiteralBits::String("&&".to_string()), output: PortId(341), span: SourceSpan::new("src/v3/compiler/operators.dag", 1179, 1183), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(250), data: LiteralBits::String("||".to_string()), output: PortId(342), span: SourceSpan::new("src/v3/compiler/operators.dag", 1198, 1202), lane2_workflow: None }), Behavior::Branch(BranchNode { id: NodeId(251), input: PortId(340), paths: vec![Path { body: NodeId(249), output: PortId(341), pattern: BranchPattern::UnresolvedVariant { name: "And".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1172, 1175) }, binding: None }, Path { body: NodeId(250), output: PortId(342), pattern: BranchPattern::UnresolvedVariant { name: "Or".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1192, 1194) }, binding: None }], output: PortId(343), span: SourceSpan::new("src/v3/compiler/operators.dag", 1148, 1210), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Branch(BranchNode { id: NodeId(252), input: PortId(325), paths: vec![Path { body: NodeId(241), output: PortId(331), pattern: BranchPattern::UnresolvedVariant { name: "Arithmetic".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 830, 847) }, binding: Some(PayloadBinding { binding_name: "arith".to_string(), payload_port: PortId(326) }) }, Path { body: NodeId(248), output: PortId(339), pattern: BranchPattern::UnresolvedVariant { name: "Comparison".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 959, 975) }, binding: Some(PayloadBinding { binding_name: "comp".to_string(), payload_port: PortId(332) }) }, Path { body: NodeId(251), output: PortId(343), pattern: BranchPattern::UnresolvedVariant { name: "Logical".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1122, 1138) }, binding: Some(PayloadBinding { binding_name: "logical".to_string(), payload_port: PortId(340) }) }], output: PortId(344), span: SourceSpan::new("src/v3/compiler/operators.dag", 815, 1214), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(253), name: "symbol".to_string(), value: PortId(344), params: vec![PortId(325)], span: SourceSpan::new("src/v3/compiler/operators.dag", 815, 1214), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Value(ValueNode { id: NodeId(254), data: LiteralBits::String("add".to_string()), output: PortId(347), span: SourceSpan::new("src/v3/compiler/operators.dag", 1341, 1346), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(255), data: LiteralBits::String("sub".to_string()), output: PortId(348), span: SourceSpan::new("src/v3/compiler/operators.dag", 1362, 1367), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(256), data: LiteralBits::String("mul".to_string()), output: PortId(349), span: SourceSpan::new("src/v3/compiler/operators.dag", 1383, 1388), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(257), data: LiteralBits::String("div".to_string()), output: PortId(350), span: SourceSpan::new("src/v3/compiler/operators.dag", 1404, 1409), lane2_workflow: None }), Behavior::Branch(BranchNode { id: NodeId(258), input: PortId(346), paths: vec![Path { body: NodeId(254), output: PortId(347), pattern: BranchPattern::UnresolvedVariant { name: "Add".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1334, 1337) }, binding: None }, Path { body: NodeId(255), output: PortId(348), pattern: BranchPattern::UnresolvedVariant { name: "Sub".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1355, 1358) }, binding: None }, Path { body: NodeId(256), output: PortId(349), pattern: BranchPattern::UnresolvedVariant { name: "Mul".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1376, 1379) }, binding: None }, Path { body: NodeId(257), output: PortId(350), pattern: BranchPattern::UnresolvedVariant { name: "Div".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1397, 1400) }, binding: None }], output: PortId(351), span: SourceSpan::new("src/v3/compiler/operators.dag", 1312, 1417), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Value(ValueNode { id: NodeId(259), data: LiteralBits::String("eq".to_string()), output: PortId(353), span: SourceSpan::new("src/v3/compiler/operators.dag", 1475, 1479), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(260), data: LiteralBits::String("ne".to_string()), output: PortId(354), span: SourceSpan::new("src/v3/compiler/operators.dag", 1494, 1498), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(261), data: LiteralBits::String("lt".to_string()), output: PortId(355), span: SourceSpan::new("src/v3/compiler/operators.dag", 1513, 1517), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(262), data: LiteralBits::String("le".to_string()), output: PortId(356), span: SourceSpan::new("src/v3/compiler/operators.dag", 1532, 1536), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(263), data: LiteralBits::String("gt".to_string()), output: PortId(357), span: SourceSpan::new("src/v3/compiler/operators.dag", 1551, 1555), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(264), data: LiteralBits::String("ge".to_string()), output: PortId(358), span: SourceSpan::new("src/v3/compiler/operators.dag", 1570, 1574), lane2_workflow: None }), Behavior::Branch(BranchNode { id: NodeId(265), input: PortId(352), paths: vec![Path { body: NodeId(259), output: PortId(353), pattern: BranchPattern::UnresolvedVariant { name: "Eq".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1469, 1471) }, binding: None }, Path { body: NodeId(260), output: PortId(354), pattern: BranchPattern::UnresolvedVariant { name: "Ne".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1488, 1490) }, binding: None }, Path { body: NodeId(261), output: PortId(355), pattern: BranchPattern::UnresolvedVariant { name: "Lt".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1507, 1509) }, binding: None }, Path { body: NodeId(262), output: PortId(356), pattern: BranchPattern::UnresolvedVariant { name: "Le".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1526, 1528) }, binding: None }, Path { body: NodeId(263), output: PortId(357), pattern: BranchPattern::UnresolvedVariant { name: "Gt".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1545, 1547) }, binding: None }, Path { body: NodeId(264), output: PortId(358), pattern: BranchPattern::UnresolvedVariant { name: "Ge".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1564, 1566) }, binding: None }], output: PortId(359), span: SourceSpan::new("src/v3/compiler/operators.dag", 1448, 1582), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Value(ValueNode { id: NodeId(266), data: LiteralBits::String("meet".to_string()), output: PortId(361), span: SourceSpan::new("src/v3/compiler/operators.dag", 1978, 1984), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(267), data: LiteralBits::String("join".to_string()), output: PortId(362), span: SourceSpan::new("src/v3/compiler/operators.dag", 1999, 2005), lane2_workflow: None }), Behavior::Branch(BranchNode { id: NodeId(268), input: PortId(360), paths: vec![Path { body: NodeId(266), output: PortId(361), pattern: BranchPattern::UnresolvedVariant { name: "And".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1971, 1974) }, binding: None }, Path { body: NodeId(267), output: PortId(362), pattern: BranchPattern::UnresolvedVariant { name: "Or".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1993, 1995) }, binding: None }], output: PortId(363), span: SourceSpan::new("src/v3/compiler/operators.dag", 1947, 2013), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Branch(BranchNode { id: NodeId(269), input: PortId(345), paths: vec![Path { body: NodeId(258), output: PortId(351), pattern: BranchPattern::UnresolvedVariant { name: "Arithmetic".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1285, 1302) }, binding: Some(PayloadBinding { binding_name: "arith".to_string(), payload_port: PortId(346) }) }, Path { body: NodeId(265), output: PortId(359), pattern: BranchPattern::UnresolvedVariant { name: "Comparison".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1422, 1438) }, binding: Some(PayloadBinding { binding_name: "comp".to_string(), payload_port: PortId(352) }) }, Path { body: NodeId(268), output: PortId(363), pattern: BranchPattern::UnresolvedVariant { name: "Logical".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1921, 1937) }, binding: Some(PayloadBinding { binding_name: "logical".to_string(), payload_port: PortId(360) }) }], output: PortId(364), span: SourceSpan::new("src/v3/compiler/operators.dag", 1270, 2017), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(270), name: "algebra_field_name".to_string(), value: PortId(364), params: vec![PortId(345)], span: SourceSpan::new("src/v3/compiler/operators.dag", 1270, 2017), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) })], declarations: vec![ - Declaration { id: DeclarationId(0), name: Some("Classical".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "True".to_string(), ty: DeclarationId(266) }, Field { label: "False".to_string(), ty: DeclarationId(267) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/logic.dag", 287, 316) }, + Declaration { id: DeclarationId(0), name: Some("Classical".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "True".to_string(), ty: DeclarationId(264) }, Field { label: "False".to_string(), ty: DeclarationId(265) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/logic.dag", 287, 316) }, Declaration { id: DeclarationId(1), name: Some("classical_not".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(0)], output: DeclarationId(0), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/logic.dag", 362, 429)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/logic.dag", 318, 429) }, Declaration { id: DeclarationId(2), name: Some("classical_and".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(0), DeclarationId(0)], output: DeclarationId(0), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/logic.dag", 489, 553)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/logic.dag", 431, 553) }, Declaration { id: DeclarationId(3), name: Some("classical_or".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(0), DeclarationId(0)], output: DeclarationId(0), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/logic.dag", 612, 675)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/logic.dag", 555, 675) }, Declaration { id: DeclarationId(4), name: Some("Bit".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(0), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 897, 917) }, - Declaration { id: DeclarationId(5), name: Some("Nibble".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "bits".to_string(), ty: DeclarationId(268) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1003, 1034) }, - Declaration { id: DeclarationId(6), name: Some("Byte".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "bits".to_string(), ty: DeclarationId(269) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1118, 1147) }, - Declaration { id: DeclarationId(7), name: Some("Word16".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "bytes".to_string(), ty: DeclarationId(270) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1251, 1284) }, - Declaration { id: DeclarationId(8), name: Some("Word32".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "bytes".to_string(), ty: DeclarationId(271) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1285, 1318) }, - Declaration { id: DeclarationId(9), name: Some("Word64".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "bytes".to_string(), ty: DeclarationId(272) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1319, 1352) }, - Declaration { id: DeclarationId(10), name: Some("Word128".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "bytes".to_string(), ty: DeclarationId(273) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1353, 1387) }, - Declaration { id: DeclarationId(11), name: Some("Result".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Ok".to_string(), ty: DeclarationId(274) }, Field { label: "Err".to_string(), ty: DeclarationId(275) }] }, type_params: vec![DeclarationId(12), DeclarationId(13)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/error_primitives.dag", 597, 657) }, + Declaration { id: DeclarationId(5), name: Some("Nibble".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "bits".to_string(), ty: DeclarationId(266) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1003, 1034) }, + Declaration { id: DeclarationId(6), name: Some("Byte".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "bits".to_string(), ty: DeclarationId(267) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1118, 1147) }, + Declaration { id: DeclarationId(7), name: Some("Word16".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "bytes".to_string(), ty: DeclarationId(268) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1251, 1284) }, + Declaration { id: DeclarationId(8), name: Some("Word32".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "bytes".to_string(), ty: DeclarationId(269) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1285, 1318) }, + Declaration { id: DeclarationId(9), name: Some("Word64".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "bytes".to_string(), ty: DeclarationId(270) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1319, 1352) }, + Declaration { id: DeclarationId(10), name: Some("Word128".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "bytes".to_string(), ty: DeclarationId(271) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1353, 1387) }, + Declaration { id: DeclarationId(11), name: Some("Result".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Ok".to_string(), ty: DeclarationId(272) }, Field { label: "Err".to_string(), ty: DeclarationId(273) }] }, type_params: vec![DeclarationId(12), DeclarationId(13)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/error_primitives.dag", 597, 657) }, Declaration { id: DeclarationId(12), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("ok".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/error_primitives.dag", 597, 657) }, Declaration { id: DeclarationId(13), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("err".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/error_primitives.dag", 597, 657) }, - Declaration { id: DeclarationId(14), name: Some("DivError".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "DivideByZero".to_string(), ty: DeclarationId(276) }, Field { label: "Overflow".to_string(), ty: DeclarationId(277) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/error_primitives.dag", 920, 959) }, - Declaration { id: DeclarationId(15), name: Some("Magma".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "op".to_string(), ty: DeclarationId(287) }] }, type_params: vec![DeclarationId(16)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 4563, 4600) }, - Declaration { id: DeclarationId(16), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 4563, 4600) }, - Declaration { id: DeclarationId(17), name: Some("Semigroup".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "op".to_string(), ty: DeclarationId(288) }] }, type_params: vec![DeclarationId(18)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 4678, 4800) }, - Declaration { id: DeclarationId(18), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 4678, 4800) }, - Declaration { id: DeclarationId(19), name: Some("Monoid".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "op".to_string(), ty: DeclarationId(289) }, Field { label: "identity".to_string(), ty: DeclarationId(20) }] }, type_params: vec![DeclarationId(20)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 4898, 4950) }, - Declaration { id: DeclarationId(20), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 4898, 4950) }, - Declaration { id: DeclarationId(21), name: Some("CommutativeMonoid".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "op".to_string(), ty: DeclarationId(290) }, Field { label: "identity".to_string(), ty: DeclarationId(22) }] }, type_params: vec![DeclarationId(22)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5009, 5100) }, - Declaration { id: DeclarationId(22), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5009, 5100) }, - Declaration { id: DeclarationId(23), name: Some("Group".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "op".to_string(), ty: DeclarationId(291) }, Field { label: "identity".to_string(), ty: DeclarationId(24) }, Field { label: "inverse".to_string(), ty: DeclarationId(292) }] }, type_params: vec![DeclarationId(24)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5172, 5245) }, - Declaration { id: DeclarationId(24), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5172, 5245) }, - Declaration { id: DeclarationId(25), name: Some("AbelianGroup".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "op".to_string(), ty: DeclarationId(293) }, Field { label: "identity".to_string(), ty: DeclarationId(26) }, Field { label: "inverse".to_string(), ty: DeclarationId(294) }] }, type_params: vec![DeclarationId(26)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5283, 5391) }, - Declaration { id: DeclarationId(26), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5283, 5391) }, - Declaration { id: DeclarationId(27), name: Some("Semiring".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "add".to_string(), ty: DeclarationId(295) }, Field { label: "zero".to_string(), ty: DeclarationId(28) }, Field { label: "mul".to_string(), ty: DeclarationId(296) }, Field { label: "one".to_string(), ty: DeclarationId(28) }] }, type_params: vec![DeclarationId(28)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5825, 5906) }, - Declaration { id: DeclarationId(28), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5825, 5906) }, - Declaration { id: DeclarationId(29), name: Some("Ring".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "add".to_string(), ty: DeclarationId(297) }, Field { label: "zero".to_string(), ty: DeclarationId(30) }, Field { label: "negate".to_string(), ty: DeclarationId(298) }, Field { label: "mul".to_string(), ty: DeclarationId(299) }, Field { label: "one".to_string(), ty: DeclarationId(30) }] }, type_params: vec![DeclarationId(30)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6033, 6131) }, - Declaration { id: DeclarationId(30), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6033, 6131) }, - Declaration { id: DeclarationId(31), name: Some("OrderedRing".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "add".to_string(), ty: DeclarationId(300) }, Field { label: "sub".to_string(), ty: DeclarationId(301) }, Field { label: "zero".to_string(), ty: DeclarationId(32) }, Field { label: "negate".to_string(), ty: DeclarationId(302) }, Field { label: "mul".to_string(), ty: DeclarationId(303) }, Field { label: "div".to_string(), ty: DeclarationId(305) }, Field { label: "one".to_string(), ty: DeclarationId(32) }, Field { label: "compare".to_string(), ty: DeclarationId(306) }, Field { label: "quotient".to_string(), ty: DeclarationId(307) }, Field { label: "remainder".to_string(), ty: DeclarationId(308) }, Field { label: "eq".to_string(), ty: DeclarationId(309) }, Field { label: "ne".to_string(), ty: DeclarationId(310) }, Field { label: "lt".to_string(), ty: DeclarationId(311) }, Field { label: "le".to_string(), ty: DeclarationId(312) }, Field { label: "gt".to_string(), ty: DeclarationId(313) }, Field { label: "ge".to_string(), ty: DeclarationId(314) }] }, type_params: vec![DeclarationId(32)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6854, 7242) }, - Declaration { id: DeclarationId(32), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6854, 7242) }, - Declaration { id: DeclarationId(33), name: Some("Field".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "add".to_string(), ty: DeclarationId(315) }, Field { label: "zero".to_string(), ty: DeclarationId(34) }, Field { label: "negate".to_string(), ty: DeclarationId(316) }, Field { label: "mul".to_string(), ty: DeclarationId(317) }, Field { label: "one".to_string(), ty: DeclarationId(34) }, Field { label: "reciprocal".to_string(), ty: DeclarationId(318) }, Field { label: "compare".to_string(), ty: DeclarationId(319) }] }, type_params: vec![DeclarationId(34)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7380, 7536) }, - Declaration { id: DeclarationId(34), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7380, 7536) }, - Declaration { id: DeclarationId(35), name: Some("Lattice".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "meet".to_string(), ty: DeclarationId(320) }, Field { label: "join".to_string(), ty: DeclarationId(321) }] }, type_params: vec![DeclarationId(36)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7856, 7919) }, - Declaration { id: DeclarationId(36), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7856, 7919) }, - Declaration { id: DeclarationId(37), name: Some("BoundedLattice".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "meet".to_string(), ty: DeclarationId(322) }, Field { label: "join".to_string(), ty: DeclarationId(323) }, Field { label: "top".to_string(), ty: DeclarationId(38) }, Field { label: "bottom".to_string(), ty: DeclarationId(38) }] }, type_params: vec![DeclarationId(38)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 8027, 8118) }, - Declaration { id: DeclarationId(38), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 8027, 8118) }, - Declaration { id: DeclarationId(39), name: Some("BooleanAlgebra".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "meet".to_string(), ty: DeclarationId(324) }, Field { label: "join".to_string(), ty: DeclarationId(325) }, Field { label: "complement".to_string(), ty: DeclarationId(326) }, Field { label: "top".to_string(), ty: DeclarationId(40) }, Field { label: "bottom".to_string(), ty: DeclarationId(40) }] }, type_params: vec![DeclarationId(40)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 8316, 8432) }, - Declaration { id: DeclarationId(40), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 8316, 8432) }, - Declaration { id: DeclarationId(41), name: Some("FreeMonoid".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "concat".to_string(), ty: DeclarationId(330) }, Field { label: "empty".to_string(), ty: DeclarationId(331) }, Field { label: "append".to_string(), ty: DeclarationId(333) }, Field { label: "index".to_string(), ty: DeclarationId(334) }, Field { label: "slice".to_string(), ty: DeclarationId(336) }, Field { label: "length".to_string(), ty: DeclarationId(337) }, Field { label: "count".to_string(), ty: DeclarationId(338) }, Field { label: "first".to_string(), ty: DeclarationId(340) }, Field { label: "last".to_string(), ty: DeclarationId(342) }, Field { label: "map".to_string(), ty: DeclarationId(345) }, Field { label: "filter".to_string(), ty: DeclarationId(348) }, Field { label: "fold".to_string(), ty: DeclarationId(350) }, Field { label: "flat_map".to_string(), ty: DeclarationId(354) }, Field { label: "any".to_string(), ty: DeclarationId(356) }, Field { label: "all".to_string(), ty: DeclarationId(358) }, Field { label: "enumerate".to_string(), ty: DeclarationId(362) }, Field { label: "reverse".to_string(), ty: DeclarationId(364) }, Field { label: "skip".to_string(), ty: DeclarationId(366) }, Field { label: "take".to_string(), ty: DeclarationId(368) }, Field { label: "sort_by".to_string(), ty: DeclarationId(371) }, Field { label: "contains".to_string(), ty: DeclarationId(372) }] }, type_params: vec![DeclarationId(42)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12204, 13158) }, - Declaration { id: DeclarationId(42), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12204, 13158) }, - Declaration { id: DeclarationId(43), name: Some("PartialFunction".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "lookup".to_string(), ty: DeclarationId(374) }, Field { label: "empty".to_string(), ty: DeclarationId(375) }, Field { label: "get".to_string(), ty: DeclarationId(377) }, Field { label: "insert".to_string(), ty: DeclarationId(379) }, Field { label: "merge".to_string(), ty: DeclarationId(382) }, Field { label: "keys".to_string(), ty: DeclarationId(384) }, Field { label: "values".to_string(), ty: DeclarationId(386) }, Field { label: "has".to_string(), ty: DeclarationId(387) }, Field { label: "contains_key".to_string(), ty: DeclarationId(388) }, Field { label: "size".to_string(), ty: DeclarationId(389) }] }, type_params: vec![DeclarationId(44), DeclarationId(45)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13673, 14012) }, - Declaration { id: DeclarationId(44), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("K".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13673, 14012) }, - Declaration { id: DeclarationId(45), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("V".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13673, 14012) }, - Declaration { id: DeclarationId(46), name: Some("Ordering".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Less".to_string(), ty: DeclarationId(390) }, Field { label: "Equal".to_string(), ty: DeclarationId(391) }, Field { label: "Greater".to_string(), ty: DeclarationId(392) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 14213, 14251) }, - Declaration { id: DeclarationId(47), name: Some("AlgebraProfile".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "OrderedRingProfile".to_string(), ty: DeclarationId(393) }, Field { label: "ApproximateFieldProfile".to_string(), ty: DeclarationId(394) }, Field { label: "BooleanAlgebraProfile".to_string(), ty: DeclarationId(395) }, Field { label: "BooleanAlgebraCollectionProfile".to_string(), ty: DeclarationId(396) }, Field { label: "FreeMonoidScalarProfile".to_string(), ty: DeclarationId(397) }, Field { label: "FreeMonoidCollectionProfile".to_string(), ty: DeclarationId(398) }, Field { label: "PartialFunctionProfile".to_string(), ty: DeclarationId(399) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16153, 16372) }, - Declaration { id: DeclarationId(48), name: Some("ContainerSource".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "SameAsReceiver".to_string(), ty: DeclarationId(400) }, Field { label: "Named".to_string(), ty: DeclarationId(401) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16374, 16440) }, - Declaration { id: DeclarationId(49), name: Some("AlgebraTypeTemplate".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ReceiverSelf".to_string(), ty: DeclarationId(402) }, Field { label: "ReceiverElement".to_string(), ty: DeclarationId(403) }, Field { label: "ReceiverKey".to_string(), ty: DeclarationId(404) }, Field { label: "ReceiverValue".to_string(), ty: DeclarationId(405) }, Field { label: "NamedTemplate".to_string(), ty: DeclarationId(406) }, Field { label: "ContainerOf".to_string(), ty: DeclarationId(407) }, Field { label: "OptionalOf".to_string(), ty: DeclarationId(408) }, Field { label: "TupleOf".to_string(), ty: DeclarationId(409) }, Field { label: "CallableOf".to_string(), ty: DeclarationId(411) }, Field { label: "AlgebraTypeVariable".to_string(), ty: DeclarationId(412) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16442, 16890) }, - Declaration { id: DeclarationId(50), name: Some("CollectionSizeEffect".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ShrinkEffect".to_string(), ty: DeclarationId(413) }, Field { label: "ProjectionEffect".to_string(), ty: DeclarationId(414) }, Field { label: "IdentityEffect".to_string(), ty: DeclarationId(415) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 17106, 17283) }, - Declaration { id: DeclarationId(51), name: Some("CostShape".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ShapeConstant".to_string(), ty: DeclarationId(416) }, Field { label: "ShapeLinearScan".to_string(), ty: DeclarationId(417) }, Field { label: "ShapeIterateBody".to_string(), ty: DeclarationId(418) }, Field { label: "ShapeSortBody".to_string(), ty: DeclarationId(419) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 17741, 17926) }, - Declaration { id: DeclarationId(52), name: Some("AlgebraFieldTemplate".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "param_types".to_string(), ty: DeclarationId(420) }, Field { label: "return_type".to_string(), ty: DeclarationId(49) }, Field { label: "size_effect".to_string(), ty: DeclarationId(421) }, Field { label: "cost_shape".to_string(), ty: DeclarationId(422) }, Field { label: "callback_element_position".to_string(), ty: DeclarationId(423) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 17951, 18382) }, - Declaration { id: DeclarationId(53), name: Some("kernel_algebra_profile".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(47) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(424)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Map(FieldMap::from_entries(vec![("Int".to_string(), FieldValue::Variant { constructor: DeclarationId(393), payload: vec![] }), ("Float".to_string(), FieldValue::Variant { constructor: DeclarationId(394), payload: vec![] }), ("Bool".to_string(), FieldValue::Variant { constructor: DeclarationId(395), payload: vec![] }), ("String".to_string(), FieldValue::Variant { constructor: DeclarationId(397), payload: vec![] }), ("List".to_string(), FieldValue::Variant { constructor: DeclarationId(398), payload: vec![] }), ("Set".to_string(), FieldValue::Variant { constructor: DeclarationId(396), payload: vec![] }), ("Map".to_string(), FieldValue::Variant { constructor: DeclarationId(399), payload: vec![] })]).expect("ValueBody::Map"))), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 18384, 18694) }, - Declaration { id: DeclarationId(54), name: Some("ordered_ring_templates".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(278), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 18754, 20229)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 18696, 20229) }, - Declaration { id: DeclarationId(55), name: Some("approximate_field_templates".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(279), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 20294, 21388)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 20231, 21388) }, - Declaration { id: DeclarationId(56), name: Some("boolean_algebra_templates".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(280), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 21451, 22212)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 21390, 22212) }, - Declaration { id: DeclarationId(57), name: Some("boolean_algebra_collection_templates".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(281), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 22577, 25922)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 22505, 25922) }, - Declaration { id: DeclarationId(58), name: Some("free_monoid_scalar_templates".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(282), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 25988, 29055)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 25924, 29055) }, - Declaration { id: DeclarationId(59), name: Some("free_monoid_collection_templates".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(283), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 29125, 34193)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 29057, 34193) }, - Declaration { id: DeclarationId(60), name: Some("partial_function_templates".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(284), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 34257, 37081)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 34195, 37081) }, - Declaration { id: DeclarationId(61), name: Some("algebra_templates_for_profile".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(47)], output: DeclarationId(285), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 37171, 37634)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 37083, 37634) }, - Declaration { id: DeclarationId(62), name: Some("algebra_type_param_names".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(47)], output: DeclarationId(286), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 37976, 38257)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 37907, 38257) }, + Declaration { id: DeclarationId(14), name: Some("DivError".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "DivideByZero".to_string(), ty: DeclarationId(274) }, Field { label: "Overflow".to_string(), ty: DeclarationId(275) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/error_primitives.dag", 920, 959) }, + Declaration { id: DeclarationId(15), name: Some("Magma".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "op".to_string(), ty: DeclarationId(285) }] }, type_params: vec![DeclarationId(16)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 4623, 4660) }, + Declaration { id: DeclarationId(16), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 4623, 4660) }, + Declaration { id: DeclarationId(17), name: Some("Semigroup".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "op".to_string(), ty: DeclarationId(286) }] }, type_params: vec![DeclarationId(18)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 4738, 4860) }, + Declaration { id: DeclarationId(18), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 4738, 4860) }, + Declaration { id: DeclarationId(19), name: Some("Monoid".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "op".to_string(), ty: DeclarationId(287) }, Field { label: "identity".to_string(), ty: DeclarationId(20) }] }, type_params: vec![DeclarationId(20)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 4958, 5010) }, + Declaration { id: DeclarationId(20), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 4958, 5010) }, + Declaration { id: DeclarationId(21), name: Some("CommutativeMonoid".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "op".to_string(), ty: DeclarationId(288) }, Field { label: "identity".to_string(), ty: DeclarationId(22) }] }, type_params: vec![DeclarationId(22)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5069, 5160) }, + Declaration { id: DeclarationId(22), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5069, 5160) }, + Declaration { id: DeclarationId(23), name: Some("Group".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "op".to_string(), ty: DeclarationId(289) }, Field { label: "identity".to_string(), ty: DeclarationId(24) }, Field { label: "inverse".to_string(), ty: DeclarationId(290) }] }, type_params: vec![DeclarationId(24)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5232, 5305) }, + Declaration { id: DeclarationId(24), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5232, 5305) }, + Declaration { id: DeclarationId(25), name: Some("AbelianGroup".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "op".to_string(), ty: DeclarationId(291) }, Field { label: "identity".to_string(), ty: DeclarationId(26) }, Field { label: "inverse".to_string(), ty: DeclarationId(292) }] }, type_params: vec![DeclarationId(26)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5343, 5451) }, + Declaration { id: DeclarationId(26), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5343, 5451) }, + Declaration { id: DeclarationId(27), name: Some("Semiring".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "add".to_string(), ty: DeclarationId(293) }, Field { label: "zero".to_string(), ty: DeclarationId(28) }, Field { label: "mul".to_string(), ty: DeclarationId(294) }, Field { label: "one".to_string(), ty: DeclarationId(28) }] }, type_params: vec![DeclarationId(28)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5885, 5966) }, + Declaration { id: DeclarationId(28), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5885, 5966) }, + Declaration { id: DeclarationId(29), name: Some("Ring".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "add".to_string(), ty: DeclarationId(295) }, Field { label: "zero".to_string(), ty: DeclarationId(30) }, Field { label: "negate".to_string(), ty: DeclarationId(296) }, Field { label: "mul".to_string(), ty: DeclarationId(297) }, Field { label: "one".to_string(), ty: DeclarationId(30) }] }, type_params: vec![DeclarationId(30)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6093, 6191) }, + Declaration { id: DeclarationId(30), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6093, 6191) }, + Declaration { id: DeclarationId(31), name: Some("OrderedRing".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "add".to_string(), ty: DeclarationId(298) }, Field { label: "sub".to_string(), ty: DeclarationId(299) }, Field { label: "zero".to_string(), ty: DeclarationId(32) }, Field { label: "negate".to_string(), ty: DeclarationId(300) }, Field { label: "mul".to_string(), ty: DeclarationId(301) }, Field { label: "div".to_string(), ty: DeclarationId(303) }, Field { label: "one".to_string(), ty: DeclarationId(32) }, Field { label: "compare".to_string(), ty: DeclarationId(304) }, Field { label: "eq".to_string(), ty: DeclarationId(305) }, Field { label: "ne".to_string(), ty: DeclarationId(306) }, Field { label: "lt".to_string(), ty: DeclarationId(307) }, Field { label: "le".to_string(), ty: DeclarationId(308) }, Field { label: "gt".to_string(), ty: DeclarationId(309) }, Field { label: "ge".to_string(), ty: DeclarationId(310) }] }, type_params: vec![DeclarationId(32)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6952, 7287) }, + Declaration { id: DeclarationId(32), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6952, 7287) }, + Declaration { id: DeclarationId(33), name: Some("Field".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "add".to_string(), ty: DeclarationId(311) }, Field { label: "zero".to_string(), ty: DeclarationId(34) }, Field { label: "negate".to_string(), ty: DeclarationId(312) }, Field { label: "mul".to_string(), ty: DeclarationId(313) }, Field { label: "one".to_string(), ty: DeclarationId(34) }, Field { label: "reciprocal".to_string(), ty: DeclarationId(314) }, Field { label: "compare".to_string(), ty: DeclarationId(315) }] }, type_params: vec![DeclarationId(34)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7425, 7581) }, + Declaration { id: DeclarationId(34), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7425, 7581) }, + Declaration { id: DeclarationId(35), name: Some("Lattice".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "meet".to_string(), ty: DeclarationId(316) }, Field { label: "join".to_string(), ty: DeclarationId(317) }] }, type_params: vec![DeclarationId(36)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7901, 7964) }, + Declaration { id: DeclarationId(36), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7901, 7964) }, + Declaration { id: DeclarationId(37), name: Some("BoundedLattice".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "meet".to_string(), ty: DeclarationId(318) }, Field { label: "join".to_string(), ty: DeclarationId(319) }, Field { label: "top".to_string(), ty: DeclarationId(38) }, Field { label: "bottom".to_string(), ty: DeclarationId(38) }] }, type_params: vec![DeclarationId(38)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 8072, 8163) }, + Declaration { id: DeclarationId(38), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 8072, 8163) }, + Declaration { id: DeclarationId(39), name: Some("BooleanAlgebra".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "meet".to_string(), ty: DeclarationId(320) }, Field { label: "join".to_string(), ty: DeclarationId(321) }, Field { label: "complement".to_string(), ty: DeclarationId(322) }, Field { label: "top".to_string(), ty: DeclarationId(40) }, Field { label: "bottom".to_string(), ty: DeclarationId(40) }] }, type_params: vec![DeclarationId(40)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 8361, 8477) }, + Declaration { id: DeclarationId(40), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 8361, 8477) }, + Declaration { id: DeclarationId(41), name: Some("FreeMonoid".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "concat".to_string(), ty: DeclarationId(326) }, Field { label: "empty".to_string(), ty: DeclarationId(327) }, Field { label: "append".to_string(), ty: DeclarationId(329) }, Field { label: "slice".to_string(), ty: DeclarationId(331) }, Field { label: "length".to_string(), ty: DeclarationId(332) }, Field { label: "count".to_string(), ty: DeclarationId(333) }, Field { label: "first".to_string(), ty: DeclarationId(335) }, Field { label: "last".to_string(), ty: DeclarationId(337) }, Field { label: "map".to_string(), ty: DeclarationId(340) }, Field { label: "filter".to_string(), ty: DeclarationId(343) }, Field { label: "fold".to_string(), ty: DeclarationId(345) }, Field { label: "flat_map".to_string(), ty: DeclarationId(349) }, Field { label: "any".to_string(), ty: DeclarationId(351) }, Field { label: "all".to_string(), ty: DeclarationId(353) }, Field { label: "enumerate".to_string(), ty: DeclarationId(357) }, Field { label: "reverse".to_string(), ty: DeclarationId(359) }, Field { label: "skip".to_string(), ty: DeclarationId(361) }, Field { label: "take".to_string(), ty: DeclarationId(363) }, Field { label: "sort_by".to_string(), ty: DeclarationId(366) }, Field { label: "contains".to_string(), ty: DeclarationId(367) }] }, type_params: vec![DeclarationId(42)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12349, 13286) }, + Declaration { id: DeclarationId(42), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12349, 13286) }, + Declaration { id: DeclarationId(43), name: Some("PartialFunction".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "lookup".to_string(), ty: DeclarationId(369) }, Field { label: "empty".to_string(), ty: DeclarationId(370) }, Field { label: "get".to_string(), ty: DeclarationId(372) }, Field { label: "insert".to_string(), ty: DeclarationId(374) }, Field { label: "merge".to_string(), ty: DeclarationId(377) }, Field { label: "keys".to_string(), ty: DeclarationId(379) }, Field { label: "values".to_string(), ty: DeclarationId(381) }, Field { label: "has".to_string(), ty: DeclarationId(382) }, Field { label: "contains_key".to_string(), ty: DeclarationId(383) }, Field { label: "size".to_string(), ty: DeclarationId(384) }] }, type_params: vec![DeclarationId(44), DeclarationId(45)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13801, 14140) }, + Declaration { id: DeclarationId(44), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("K".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13801, 14140) }, + Declaration { id: DeclarationId(45), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("V".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13801, 14140) }, + Declaration { id: DeclarationId(46), name: Some("Ordering".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Less".to_string(), ty: DeclarationId(385) }, Field { label: "Equal".to_string(), ty: DeclarationId(386) }, Field { label: "Greater".to_string(), ty: DeclarationId(387) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 14341, 14379) }, + Declaration { id: DeclarationId(47), name: Some("AlgebraProfile".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "OrderedRingProfile".to_string(), ty: DeclarationId(388) }, Field { label: "ApproximateFieldProfile".to_string(), ty: DeclarationId(389) }, Field { label: "BooleanAlgebraProfile".to_string(), ty: DeclarationId(390) }, Field { label: "BooleanAlgebraCollectionProfile".to_string(), ty: DeclarationId(391) }, Field { label: "FreeMonoidScalarProfile".to_string(), ty: DeclarationId(392) }, Field { label: "FreeMonoidCollectionProfile".to_string(), ty: DeclarationId(393) }, Field { label: "PartialFunctionProfile".to_string(), ty: DeclarationId(394) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16281, 16500) }, + Declaration { id: DeclarationId(48), name: Some("ContainerSource".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "SameAsReceiver".to_string(), ty: DeclarationId(395) }, Field { label: "Named".to_string(), ty: DeclarationId(396) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16502, 16568) }, + Declaration { id: DeclarationId(49), name: Some("AlgebraTypeTemplate".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ReceiverSelf".to_string(), ty: DeclarationId(397) }, Field { label: "ReceiverElement".to_string(), ty: DeclarationId(398) }, Field { label: "ReceiverKey".to_string(), ty: DeclarationId(399) }, Field { label: "ReceiverValue".to_string(), ty: DeclarationId(400) }, Field { label: "NamedTemplate".to_string(), ty: DeclarationId(401) }, Field { label: "ContainerOf".to_string(), ty: DeclarationId(402) }, Field { label: "OptionalOf".to_string(), ty: DeclarationId(403) }, Field { label: "TupleOf".to_string(), ty: DeclarationId(404) }, Field { label: "CallableOf".to_string(), ty: DeclarationId(406) }, Field { label: "AlgebraTypeVariable".to_string(), ty: DeclarationId(407) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16570, 17018) }, + Declaration { id: DeclarationId(50), name: Some("CollectionSizeEffect".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ShrinkEffect".to_string(), ty: DeclarationId(408) }, Field { label: "ProjectionEffect".to_string(), ty: DeclarationId(409) }, Field { label: "IdentityEffect".to_string(), ty: DeclarationId(410) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 17234, 17411) }, + Declaration { id: DeclarationId(51), name: Some("CostShape".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ShapeConstant".to_string(), ty: DeclarationId(411) }, Field { label: "ShapeLinearScan".to_string(), ty: DeclarationId(412) }, Field { label: "ShapeIterateBody".to_string(), ty: DeclarationId(413) }, Field { label: "ShapeSortBody".to_string(), ty: DeclarationId(414) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 17869, 18054) }, + Declaration { id: DeclarationId(52), name: Some("AlgebraFieldTemplate".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "param_types".to_string(), ty: DeclarationId(415) }, Field { label: "return_type".to_string(), ty: DeclarationId(49) }, Field { label: "size_effect".to_string(), ty: DeclarationId(416) }, Field { label: "cost_shape".to_string(), ty: DeclarationId(417) }, Field { label: "callback_element_position".to_string(), ty: DeclarationId(418) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 18079, 18510) }, + Declaration { id: DeclarationId(53), name: Some("kernel_algebra_profile".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(47) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(419)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Map(FieldMap::from_entries(vec![("Int".to_string(), FieldValue::Variant { constructor: DeclarationId(388), payload: vec![] }), ("Float".to_string(), FieldValue::Variant { constructor: DeclarationId(389), payload: vec![] }), ("Bool".to_string(), FieldValue::Variant { constructor: DeclarationId(390), payload: vec![] }), ("String".to_string(), FieldValue::Variant { constructor: DeclarationId(392), payload: vec![] }), ("List".to_string(), FieldValue::Variant { constructor: DeclarationId(393), payload: vec![] }), ("Set".to_string(), FieldValue::Variant { constructor: DeclarationId(391), payload: vec![] }), ("Map".to_string(), FieldValue::Variant { constructor: DeclarationId(394), payload: vec![] })]).expect("ValueBody::Map"))), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 18512, 18822) }, + Declaration { id: DeclarationId(54), name: Some("ordered_ring_templates".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(276), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 18882, 20024)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 18824, 20024) }, + Declaration { id: DeclarationId(55), name: Some("approximate_field_templates".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(277), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 20089, 21183)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 20026, 21183) }, + Declaration { id: DeclarationId(56), name: Some("boolean_algebra_templates".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(278), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 21246, 22007)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 21185, 22007) }, + Declaration { id: DeclarationId(57), name: Some("boolean_algebra_collection_templates".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(279), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 22372, 25717)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 22300, 25717) }, + Declaration { id: DeclarationId(58), name: Some("free_monoid_scalar_templates".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(280), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 25783, 28850)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 25719, 28850) }, + Declaration { id: DeclarationId(59), name: Some("free_monoid_collection_templates".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(281), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 28920, 33988)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 28852, 33988) }, + Declaration { id: DeclarationId(60), name: Some("partial_function_templates".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(282), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 34052, 36876)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 33990, 36876) }, + Declaration { id: DeclarationId(61), name: Some("algebra_templates_for_profile".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(47)], output: DeclarationId(283), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 36966, 37429)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 36878, 37429) }, + Declaration { id: DeclarationId(62), name: Some("algebra_type_param_names".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(47)], output: DeclarationId(284), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 37771, 38052)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 37702, 38052) }, Declaration { id: DeclarationId(63), name: Some("Int8".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(31), arguments: vec![TemplateArgument { parameter: DeclarationId(32), value: DeclarationId(6) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/integer.dag", 1265, 1294) }, Declaration { id: DeclarationId(64), name: Some("Int16".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(31), arguments: vec![TemplateArgument { parameter: DeclarationId(32), value: DeclarationId(7) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/integer.dag", 1295, 1327) }, Declaration { id: DeclarationId(65), name: Some("Int32".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(31), arguments: vec![TemplateArgument { parameter: DeclarationId(32), value: DeclarationId(8) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/integer.dag", 1328, 1360) }, @@ -81,19 +81,19 @@ pub(crate) fn bootstrapped_fixture_dag() -> Dag { Declaration { id: DeclarationId(73), name: Some("Float32".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(33), arguments: vec![TemplateArgument { parameter: DeclarationId(34), value: DeclarationId(8) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/float.dag", 489, 517) }, Declaration { id: DeclarationId(74), name: Some("Float64".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(33), arguments: vec![TemplateArgument { parameter: DeclarationId(34), value: DeclarationId(9) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/float.dag", 518, 546) }, Declaration { id: DeclarationId(75), name: Some("Float".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(74), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/float.dag", 565, 585) }, - Declaration { id: DeclarationId(76), name: Some("kernel_type_set".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(538)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Map(FieldMap::from_entries(vec![("String".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("Int".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("Bool".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("Float".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("Secret".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("Json".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("Unit".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("Bytes".to_string(), FieldValue::Literal(LiteralBits::Bool(true)))]).expect("ValueBody::Map"))), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 3041, 3206) }, + Declaration { id: DeclarationId(76), name: Some("kernel_type_set".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(533)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Map(FieldMap::from_entries(vec![("String".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("Int".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("Bool".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("Float".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("Secret".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("Json".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("Unit".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("Bytes".to_string(), FieldValue::Literal(LiteralBits::Bool(true)))]).expect("ValueBody::Map"))), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 3041, 3206) }, Declaration { id: DeclarationId(77), name: Some("is_kernel_type".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/types.dag", 3248, 3344)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 3208, 3344) }, - Declaration { id: DeclarationId(78), name: Some("container_type_arity".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(539)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Map(FieldMap::from_entries(vec![("List".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("Set".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("Map".to_string(), FieldValue::Literal(LiteralBits::Int(2)))]).expect("ValueBody::Map"))), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 3506, 3587) }, + Declaration { id: DeclarationId(78), name: Some("container_type_arity".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(534)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Map(FieldMap::from_entries(vec![("List".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("Set".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("Map".to_string(), FieldValue::Literal(LiteralBits::Int(2)))]).expect("ValueBody::Map"))), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 3506, 3587) }, Declaration { id: DeclarationId(79), name: Some("is_container_type".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/types.dag", 3632, 3734)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 3589, 3734) }, - Declaration { id: DeclarationId(80), name: Some("container_expected_arity".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(425), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/types.dag", 3786, 3827)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 3736, 3827) }, - Declaration { id: DeclarationId(81), name: Some("container_param_names_for".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(426), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/types.dag", 4067, 4204)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 4003, 4204) }, - Declaration { id: DeclarationId(82), name: Some("container_param_name".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(71)], output: DeclarationId(427), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/types.dag", 4272, 4512)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 4206, 4512) }, - Declaration { id: DeclarationId(83), name: Some("ordered_element_collections".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(540)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Map(FieldMap::from_entries(vec![("List".to_string(), FieldValue::Literal(LiteralBits::Bool(true)))]).expect("ValueBody::Map"))), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 4706, 4778) }, + Declaration { id: DeclarationId(80), name: Some("container_expected_arity".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(420), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/types.dag", 3786, 3827)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 3736, 3827) }, + Declaration { id: DeclarationId(81), name: Some("container_param_names_for".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(421), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/types.dag", 4067, 4204)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 4003, 4204) }, + Declaration { id: DeclarationId(82), name: Some("container_param_name".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(71)], output: DeclarationId(422), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/types.dag", 4272, 4512)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 4206, 4512) }, + Declaration { id: DeclarationId(83), name: Some("ordered_element_collections".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(535)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Map(FieldMap::from_entries(vec![("List".to_string(), FieldValue::Literal(LiteralBits::Bool(true)))]).expect("ValueBody::Map"))), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 4706, 4778) }, Declaration { id: DeclarationId(84), name: Some("is_ordered_element_collection".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/types.dag", 4835, 4892)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 4780, 4892) }, - Declaration { id: DeclarationId(85), name: Some("container_template_algebra_rows".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(541)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Map(FieldMap::from_entries(vec![("List".to_string(), FieldValue::Literal(LiteralBits::String("FreeMonoid".to_string()))), ("list".to_string(), FieldValue::Literal(LiteralBits::String("FreeMonoid".to_string()))), ("Set".to_string(), FieldValue::Literal(LiteralBits::String("BooleanAlgebra".to_string()))), ("set".to_string(), FieldValue::Literal(LiteralBits::String("BooleanAlgebra".to_string()))), ("Map".to_string(), FieldValue::Literal(LiteralBits::String("PartialFunction".to_string()))), ("map".to_string(), FieldValue::Literal(LiteralBits::String("PartialFunction".to_string()))), ("FreeMonoid".to_string(), FieldValue::Literal(LiteralBits::String("FreeMonoid".to_string()))), ("free_monoid".to_string(), FieldValue::Literal(LiteralBits::String("FreeMonoid".to_string()))), ("BooleanAlgebra".to_string(), FieldValue::Literal(LiteralBits::String("BooleanAlgebra".to_string()))), ("boolean_algebra".to_string(), FieldValue::Literal(LiteralBits::String("BooleanAlgebra".to_string()))), ("PartialFunction".to_string(), FieldValue::Literal(LiteralBits::String("PartialFunction".to_string()))), ("partial_function".to_string(), FieldValue::Literal(LiteralBits::String("PartialFunction".to_string())))]).expect("ValueBody::Map"))), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 5684, 6123) }, - Declaration { id: DeclarationId(86), name: Some("container_template_algebra".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(428), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/types.dag", 6180, 6232)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 6125, 6232) }, - Declaration { id: DeclarationId(87), name: Some("canonical_container_names".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(429), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/types.dag", 6521, 6600)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 6474, 6600) }, - Declaration { id: DeclarationId(88), name: Some("Bool".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "True".to_string(), ty: DeclarationId(430) }, Field { label: "False".to_string(), ty: DeclarationId(431) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: Some(DeclarationId(593)), value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 7546, 7570) }, + Declaration { id: DeclarationId(85), name: Some("container_template_algebra_rows".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(536)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Map(FieldMap::from_entries(vec![("List".to_string(), FieldValue::Literal(LiteralBits::String("FreeMonoid".to_string()))), ("list".to_string(), FieldValue::Literal(LiteralBits::String("FreeMonoid".to_string()))), ("Set".to_string(), FieldValue::Literal(LiteralBits::String("BooleanAlgebra".to_string()))), ("set".to_string(), FieldValue::Literal(LiteralBits::String("BooleanAlgebra".to_string()))), ("Map".to_string(), FieldValue::Literal(LiteralBits::String("PartialFunction".to_string()))), ("map".to_string(), FieldValue::Literal(LiteralBits::String("PartialFunction".to_string()))), ("FreeMonoid".to_string(), FieldValue::Literal(LiteralBits::String("FreeMonoid".to_string()))), ("free_monoid".to_string(), FieldValue::Literal(LiteralBits::String("FreeMonoid".to_string()))), ("BooleanAlgebra".to_string(), FieldValue::Literal(LiteralBits::String("BooleanAlgebra".to_string()))), ("boolean_algebra".to_string(), FieldValue::Literal(LiteralBits::String("BooleanAlgebra".to_string()))), ("PartialFunction".to_string(), FieldValue::Literal(LiteralBits::String("PartialFunction".to_string()))), ("partial_function".to_string(), FieldValue::Literal(LiteralBits::String("PartialFunction".to_string())))]).expect("ValueBody::Map"))), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 5684, 6123) }, + Declaration { id: DeclarationId(86), name: Some("container_template_algebra".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(423), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/types.dag", 6180, 6232)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 6125, 6232) }, + Declaration { id: DeclarationId(87), name: Some("canonical_container_names".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(424), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/types.dag", 6521, 6600)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 6474, 6600) }, + Declaration { id: DeclarationId(88), name: Some("Bool".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "True".to_string(), ty: DeclarationId(425) }, Field { label: "False".to_string(), ty: DeclarationId(426) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: Some(DeclarationId(588)), value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 7546, 7570) }, Declaration { id: DeclarationId(89), name: Some("Unit".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 7638, 7647) }, Declaration { id: DeclarationId(90), name: Some("Json".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 7764, 7773) }, Declaration { id: DeclarationId(91), name: Some("Bytes".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 7774, 7784) }, @@ -105,69 +105,69 @@ pub(crate) fn bootstrapped_fixture_dag() -> Dag { Declaration { id: DeclarationId(97), name: Some("Map".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(43), arguments: vec![TemplateArgument { parameter: DeclarationId(44), value: DeclarationId(98) }, TemplateArgument { parameter: DeclarationId(45), value: DeclarationId(99) }] }, type_params: vec![DeclarationId(98), DeclarationId(99)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 9339, 9389) }, Declaration { id: DeclarationId(98), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("key".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 9339, 9389) }, Declaration { id: DeclarationId(99), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("value".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 9339, 9389) }, - Declaration { id: DeclarationId(100), name: Some("CommitSha".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(542)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10147, 10207) }, - Declaration { id: DeclarationId(101), name: Some("Sha256".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(543)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10208, 10268) }, - Declaration { id: DeclarationId(102), name: Some("RetryCount".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(71))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(544)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10269, 10320) }, - Declaration { id: DeclarationId(103), name: Some("HttpStatus".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(71))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(545)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10321, 10376) }, - Declaration { id: DeclarationId(104), name: Some("Email".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(546)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10377, 10442) }, - Declaration { id: DeclarationId(105), name: Some("Port".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(71))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(547)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10443, 10498) }, - Declaration { id: DeclarationId(106), name: Some("GistId".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(548)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10499, 10544) }, + Declaration { id: DeclarationId(100), name: Some("CommitSha".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(537)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10147, 10207) }, + Declaration { id: DeclarationId(101), name: Some("Sha256".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(538)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10208, 10268) }, + Declaration { id: DeclarationId(102), name: Some("RetryCount".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(71))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(539)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10269, 10320) }, + Declaration { id: DeclarationId(103), name: Some("HttpStatus".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(71))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(540)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10321, 10376) }, + Declaration { id: DeclarationId(104), name: Some("Email".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(541)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10377, 10442) }, + Declaration { id: DeclarationId(105), name: Some("Port".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(71))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(542)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10443, 10498) }, + Declaration { id: DeclarationId(106), name: Some("GistId".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(543)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10499, 10544) }, Declaration { id: DeclarationId(107), name: Some("Secret".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(186), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: Some(NominalOpacity { permitted_accessors: vec![] }), span: SourceSpan::new("dsl/std/types.dag", 10545, 10586) }, - Declaration { id: DeclarationId(108), name: Some("SecretValue".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(107))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(549)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10587, 10629) }, - Declaration { id: DeclarationId(109), name: Some("Url".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(550)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10630, 10684) }, - Declaration { id: DeclarationId(110), name: Some("SemVer".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(551)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10685, 10748) }, - Declaration { id: DeclarationId(111), name: Some("NonEmptyStr".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(552)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10749, 10794) }, - Declaration { id: DeclarationId(112), name: Some("LanguageId".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(553)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10795, 10840) }, - Declaration { id: DeclarationId(113), name: Some("SecretName".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(554)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10841, 10886) }, - Declaration { id: DeclarationId(114), name: Some("PositiveInt".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(71))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(555)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10887, 10933) }, - Declaration { id: DeclarationId(115), name: Some("NonNegativeInt".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(71))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(556)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10934, 10980) }, - Declaration { id: DeclarationId(116), name: Some("PathSegment".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(557)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11151, 11210) }, - Declaration { id: DeclarationId(117), name: Some("GlobSegment".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(558)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11211, 11270) }, - Declaration { id: DeclarationId(118), name: Some("FilePathParts".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "segments".to_string(), ty: DeclarationId(432) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11271, 11323) }, - Declaration { id: DeclarationId(119), name: Some("GlobPattern".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "segments".to_string(), ty: DeclarationId(433) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11324, 11374) }, - Declaration { id: DeclarationId(120), name: Some("FilePath".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(559)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11375, 11418) }, + Declaration { id: DeclarationId(108), name: Some("SecretValue".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(107))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(544)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10587, 10629) }, + Declaration { id: DeclarationId(109), name: Some("Url".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(545)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10630, 10684) }, + Declaration { id: DeclarationId(110), name: Some("SemVer".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(546)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10685, 10748) }, + Declaration { id: DeclarationId(111), name: Some("NonEmptyStr".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(547)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10749, 10794) }, + Declaration { id: DeclarationId(112), name: Some("LanguageId".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(548)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10795, 10840) }, + Declaration { id: DeclarationId(113), name: Some("SecretName".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(549)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10841, 10886) }, + Declaration { id: DeclarationId(114), name: Some("PositiveInt".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(71))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(550)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10887, 10933) }, + Declaration { id: DeclarationId(115), name: Some("NonNegativeInt".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(71))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(551)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10934, 10980) }, + Declaration { id: DeclarationId(116), name: Some("PathSegment".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(552)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11151, 11210) }, + Declaration { id: DeclarationId(117), name: Some("GlobSegment".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(553)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11211, 11270) }, + Declaration { id: DeclarationId(118), name: Some("FilePathParts".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "segments".to_string(), ty: DeclarationId(427) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11271, 11323) }, + Declaration { id: DeclarationId(119), name: Some("GlobPattern".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "segments".to_string(), ty: DeclarationId(428) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11324, 11374) }, + Declaration { id: DeclarationId(120), name: Some("FilePath".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(554)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11375, 11418) }, Declaration { id: DeclarationId(121), name: Some("SourceSpan".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "file".to_string(), ty: DeclarationId(120) }, Field { label: "start".to_string(), ty: DeclarationId(71) }, Field { label: "end".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12036, 12096) }, - Declaration { id: DeclarationId(122), name: Some("Timestamp".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(560)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12098, 12196) }, - Declaration { id: DeclarationId(123), name: Some("EpochMs".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(71))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(561)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12197, 12241) }, - Declaration { id: DeclarationId(124), name: Some("Duration".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(71))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(562)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12242, 12286) }, - Declaration { id: DeclarationId(125), name: Some("Milliseconds".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(71))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(563)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12287, 12354) }, - Declaration { id: DeclarationId(126), name: Some("Seconds".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(71))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(564)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12355, 12417) }, - Declaration { id: DeclarationId(127), name: Some("IntentId".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(565)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12941, 12996) }, - Declaration { id: DeclarationId(128), name: Some("IssueId".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(566)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12997, 13051) }, - Declaration { id: DeclarationId(129), name: Some("RunKey".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(567)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13052, 13105) }, - Declaration { id: DeclarationId(130), name: Some("ArtifactId".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(568)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13106, 13163) }, - Declaration { id: DeclarationId(131), name: Some("LeaseToken".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(569)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13164, 13221) }, - Declaration { id: DeclarationId(132), name: Some("WorkerId".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(570)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13222, 13277) }, - Declaration { id: DeclarationId(133), name: Some("CommentId".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(571)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13278, 13334) }, - Declaration { id: DeclarationId(134), name: Some("SignalKey".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(572)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13335, 13391) }, - Declaration { id: DeclarationId(135), name: Some("ContentHash".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(573)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13392, 13450) }, - Declaration { id: DeclarationId(136), name: Some("GitRef".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(574)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13530, 13572) }, - Declaration { id: DeclarationId(137), name: Some("GcpProjectId".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(575)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13779, 13864) }, - Declaration { id: DeclarationId(138), name: Some("ServiceAccountEmail".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(576)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13865, 13974) }, - Declaration { id: DeclarationId(139), name: Some("Platform".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Linux".to_string(), ty: DeclarationId(434) }, Field { label: "Macos".to_string(), ty: DeclarationId(435) }, Field { label: "Windows".to_string(), ty: DeclarationId(436) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14360, 14403) }, - Declaration { id: DeclarationId(140), name: Some("TopologyNodeKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Pure".to_string(), ty: DeclarationId(437) }, Field { label: "Transport".to_string(), ty: DeclarationId(438) }, Field { label: "SubDag".to_string(), ty: DeclarationId(439) }, Field { label: "Env".to_string(), ty: DeclarationId(440) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14531, 14586) }, - Declaration { id: DeclarationId(141), name: Some("DocSourceKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Template".to_string(), ty: DeclarationId(441) }, Field { label: "Generated".to_string(), ty: DeclarationId(442) }, Field { label: "Static".to_string(), ty: DeclarationId(443) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14587, 14640) }, - Declaration { id: DeclarationId(142), name: Some("FermiDepth".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Xs".to_string(), ty: DeclarationId(444) }, Field { label: "S".to_string(), ty: DeclarationId(445) }, Field { label: "M".to_string(), ty: DeclarationId(446) }, Field { label: "L".to_string(), ty: DeclarationId(447) }, Field { label: "Xl".to_string(), ty: DeclarationId(448) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14642, 14679) }, - Declaration { id: DeclarationId(143), name: Some("CredentialFlow".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Stored".to_string(), ty: DeclarationId(449) }, Field { label: "PlatformInjected".to_string(), ty: DeclarationId(450) }, Field { label: "WorkloadIdentity".to_string(), ty: DeclarationId(453) }, Field { label: "InteractiveAuth".to_string(), ty: DeclarationId(455) }, Field { label: "Chained".to_string(), ty: DeclarationId(457) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14927, 15249) }, - Declaration { id: DeclarationId(144), name: Some("Arch".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "X86_64".to_string(), ty: DeclarationId(458) }, Field { label: "X86".to_string(), ty: DeclarationId(459) }, Field { label: "Aarch64".to_string(), ty: DeclarationId(460) }, Field { label: "Arm".to_string(), ty: DeclarationId(461) }, Field { label: "Armv7".to_string(), ty: DeclarationId(462) }, Field { label: "Mips".to_string(), ty: DeclarationId(463) }, Field { label: "Mipsel".to_string(), ty: DeclarationId(464) }, Field { label: "Mips64".to_string(), ty: DeclarationId(465) }, Field { label: "Mips64el".to_string(), ty: DeclarationId(466) }, Field { label: "Riscv64".to_string(), ty: DeclarationId(467) }, Field { label: "Wasm32".to_string(), ty: DeclarationId(468) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15324, 15427) }, - Declaration { id: DeclarationId(145), name: Some("Vendor".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "UnknownVendor".to_string(), ty: DeclarationId(469) }, Field { label: "Pc".to_string(), ty: DeclarationId(470) }, Field { label: "Apple".to_string(), ty: DeclarationId(471) }, Field { label: "W64".to_string(), ty: DeclarationId(472) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15428, 15474) }, - Declaration { id: DeclarationId(146), name: Some("Os".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Linux".to_string(), ty: DeclarationId(473) }, Field { label: "Macos".to_string(), ty: DeclarationId(474) }, Field { label: "Windows".to_string(), ty: DeclarationId(475) }, Field { label: "Freebsd".to_string(), ty: DeclarationId(476) }, Field { label: "Android".to_string(), ty: DeclarationId(477) }, Field { label: "Ios".to_string(), ty: DeclarationId(478) }, Field { label: "Wasi".to_string(), ty: DeclarationId(479) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15475, 15541) }, - Declaration { id: DeclarationId(147), name: Some("AbiEnv".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "NoneAbi".to_string(), ty: DeclarationId(480) }, Field { label: "Gnu".to_string(), ty: DeclarationId(481) }, Field { label: "GnuEabi".to_string(), ty: DeclarationId(482) }, Field { label: "GnuEabihf".to_string(), ty: DeclarationId(483) }, Field { label: "Musl".to_string(), ty: DeclarationId(484) }, Field { label: "Msvc".to_string(), ty: DeclarationId(485) }, Field { label: "AndroidAbi".to_string(), ty: DeclarationId(486) }, Field { label: "Eabi".to_string(), ty: DeclarationId(487) }, Field { label: "Eabihf".to_string(), ty: DeclarationId(488) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15542, 15634) }, - Declaration { id: DeclarationId(148), name: Some("ExecutionEnv".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Native".to_string(), ty: DeclarationId(489) }, Field { label: "Wsl".to_string(), ty: DeclarationId(490) }, Field { label: "Container".to_string(), ty: DeclarationId(491) }, Field { label: "Ci".to_string(), ty: DeclarationId(492) }, Field { label: "Emulator".to_string(), ty: DeclarationId(493) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15635, 15695) }, - Declaration { id: DeclarationId(149), name: Some("TargetTriple".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "arch".to_string(), ty: DeclarationId(144) }, Field { label: "vendor".to_string(), ty: DeclarationId(145) }, Field { label: "os".to_string(), ty: DeclarationId(146) }, Field { label: "env".to_string(), ty: DeclarationId(494) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15697, 15772) }, + Declaration { id: DeclarationId(122), name: Some("Timestamp".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(555)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12098, 12196) }, + Declaration { id: DeclarationId(123), name: Some("EpochMs".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(71))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(556)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12197, 12241) }, + Declaration { id: DeclarationId(124), name: Some("Duration".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(71))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(557)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12242, 12286) }, + Declaration { id: DeclarationId(125), name: Some("Milliseconds".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(71))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(558)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12287, 12354) }, + Declaration { id: DeclarationId(126), name: Some("Seconds".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(71))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(559)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12355, 12417) }, + Declaration { id: DeclarationId(127), name: Some("IntentId".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(560)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12941, 12996) }, + Declaration { id: DeclarationId(128), name: Some("IssueId".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(561)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12997, 13051) }, + Declaration { id: DeclarationId(129), name: Some("RunKey".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(562)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13052, 13105) }, + Declaration { id: DeclarationId(130), name: Some("ArtifactId".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(563)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13106, 13163) }, + Declaration { id: DeclarationId(131), name: Some("LeaseToken".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(564)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13164, 13221) }, + Declaration { id: DeclarationId(132), name: Some("WorkerId".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(565)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13222, 13277) }, + Declaration { id: DeclarationId(133), name: Some("CommentId".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(566)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13278, 13334) }, + Declaration { id: DeclarationId(134), name: Some("SignalKey".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(567)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13335, 13391) }, + Declaration { id: DeclarationId(135), name: Some("ContentHash".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(568)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13392, 13450) }, + Declaration { id: DeclarationId(136), name: Some("GitRef".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(569)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13530, 13572) }, + Declaration { id: DeclarationId(137), name: Some("GcpProjectId".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(570)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13779, 13864) }, + Declaration { id: DeclarationId(138), name: Some("ServiceAccountEmail".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(571)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13865, 13974) }, + Declaration { id: DeclarationId(139), name: Some("Platform".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Linux".to_string(), ty: DeclarationId(429) }, Field { label: "Macos".to_string(), ty: DeclarationId(430) }, Field { label: "Windows".to_string(), ty: DeclarationId(431) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14360, 14403) }, + Declaration { id: DeclarationId(140), name: Some("TopologyNodeKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Pure".to_string(), ty: DeclarationId(432) }, Field { label: "Transport".to_string(), ty: DeclarationId(433) }, Field { label: "SubDag".to_string(), ty: DeclarationId(434) }, Field { label: "Env".to_string(), ty: DeclarationId(435) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14531, 14586) }, + Declaration { id: DeclarationId(141), name: Some("DocSourceKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Template".to_string(), ty: DeclarationId(436) }, Field { label: "Generated".to_string(), ty: DeclarationId(437) }, Field { label: "Static".to_string(), ty: DeclarationId(438) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14587, 14640) }, + Declaration { id: DeclarationId(142), name: Some("FermiDepth".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Xs".to_string(), ty: DeclarationId(439) }, Field { label: "S".to_string(), ty: DeclarationId(440) }, Field { label: "M".to_string(), ty: DeclarationId(441) }, Field { label: "L".to_string(), ty: DeclarationId(442) }, Field { label: "Xl".to_string(), ty: DeclarationId(443) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14642, 14679) }, + Declaration { id: DeclarationId(143), name: Some("CredentialFlow".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Stored".to_string(), ty: DeclarationId(444) }, Field { label: "PlatformInjected".to_string(), ty: DeclarationId(445) }, Field { label: "WorkloadIdentity".to_string(), ty: DeclarationId(448) }, Field { label: "InteractiveAuth".to_string(), ty: DeclarationId(450) }, Field { label: "Chained".to_string(), ty: DeclarationId(452) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14927, 15249) }, + Declaration { id: DeclarationId(144), name: Some("Arch".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "X86_64".to_string(), ty: DeclarationId(453) }, Field { label: "X86".to_string(), ty: DeclarationId(454) }, Field { label: "Aarch64".to_string(), ty: DeclarationId(455) }, Field { label: "Arm".to_string(), ty: DeclarationId(456) }, Field { label: "Armv7".to_string(), ty: DeclarationId(457) }, Field { label: "Mips".to_string(), ty: DeclarationId(458) }, Field { label: "Mipsel".to_string(), ty: DeclarationId(459) }, Field { label: "Mips64".to_string(), ty: DeclarationId(460) }, Field { label: "Mips64el".to_string(), ty: DeclarationId(461) }, Field { label: "Riscv64".to_string(), ty: DeclarationId(462) }, Field { label: "Wasm32".to_string(), ty: DeclarationId(463) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15324, 15427) }, + Declaration { id: DeclarationId(145), name: Some("Vendor".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "UnknownVendor".to_string(), ty: DeclarationId(464) }, Field { label: "Pc".to_string(), ty: DeclarationId(465) }, Field { label: "Apple".to_string(), ty: DeclarationId(466) }, Field { label: "W64".to_string(), ty: DeclarationId(467) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15428, 15474) }, + Declaration { id: DeclarationId(146), name: Some("Os".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Linux".to_string(), ty: DeclarationId(468) }, Field { label: "Macos".to_string(), ty: DeclarationId(469) }, Field { label: "Windows".to_string(), ty: DeclarationId(470) }, Field { label: "Freebsd".to_string(), ty: DeclarationId(471) }, Field { label: "Android".to_string(), ty: DeclarationId(472) }, Field { label: "Ios".to_string(), ty: DeclarationId(473) }, Field { label: "Wasi".to_string(), ty: DeclarationId(474) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15475, 15541) }, + Declaration { id: DeclarationId(147), name: Some("AbiEnv".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "NoneAbi".to_string(), ty: DeclarationId(475) }, Field { label: "Gnu".to_string(), ty: DeclarationId(476) }, Field { label: "GnuEabi".to_string(), ty: DeclarationId(477) }, Field { label: "GnuEabihf".to_string(), ty: DeclarationId(478) }, Field { label: "Musl".to_string(), ty: DeclarationId(479) }, Field { label: "Msvc".to_string(), ty: DeclarationId(480) }, Field { label: "AndroidAbi".to_string(), ty: DeclarationId(481) }, Field { label: "Eabi".to_string(), ty: DeclarationId(482) }, Field { label: "Eabihf".to_string(), ty: DeclarationId(483) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15542, 15634) }, + Declaration { id: DeclarationId(148), name: Some("ExecutionEnv".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Native".to_string(), ty: DeclarationId(484) }, Field { label: "Wsl".to_string(), ty: DeclarationId(485) }, Field { label: "Container".to_string(), ty: DeclarationId(486) }, Field { label: "Ci".to_string(), ty: DeclarationId(487) }, Field { label: "Emulator".to_string(), ty: DeclarationId(488) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15635, 15695) }, + Declaration { id: DeclarationId(149), name: Some("TargetTriple".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "arch".to_string(), ty: DeclarationId(144) }, Field { label: "vendor".to_string(), ty: DeclarationId(145) }, Field { label: "os".to_string(), ty: DeclarationId(146) }, Field { label: "env".to_string(), ty: DeclarationId(489) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15697, 15772) }, Declaration { id: DeclarationId(150), name: Some("RuntimePlatform".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "host".to_string(), ty: DeclarationId(149) }, Field { label: "env".to_string(), ty: DeclarationId(148) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15774, 15839) }, - Declaration { id: DeclarationId(151), name: Some("EntryKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "RegularFile".to_string(), ty: DeclarationId(495) }, Field { label: "Directory".to_string(), ty: DeclarationId(496) }, Field { label: "Symlink".to_string(), ty: DeclarationId(497) }, Field { label: "Missing".to_string(), ty: DeclarationId(498) }, Field { label: "Other".to_string(), ty: DeclarationId(499) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16148, 16226) }, - Declaration { id: DeclarationId(152), name: Some("SymlinkTarget".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "TargetFile".to_string(), ty: DeclarationId(500) }, Field { label: "TargetDir".to_string(), ty: DeclarationId(501) }, Field { label: "Broken".to_string(), ty: DeclarationId(502) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16356, 16414) }, - Declaration { id: DeclarationId(153), name: Some("TextFilePath".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(120))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(577)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 17397, 17447) }, - Declaration { id: DeclarationId(154), name: Some("BinaryFilePath".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(120))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(578)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 17448, 17500) }, - Declaration { id: DeclarationId(155), name: Some("MimeType".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(579)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 17641, 17702) }, - Declaration { id: DeclarationId(156), name: Some("HttpMethod".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "GET".to_string(), ty: DeclarationId(503) }, Field { label: "POST".to_string(), ty: DeclarationId(504) }, Field { label: "PUT".to_string(), ty: DeclarationId(505) }, Field { label: "PATCH".to_string(), ty: DeclarationId(506) }, Field { label: "DELETE".to_string(), ty: DeclarationId(507) }, Field { label: "HEAD".to_string(), ty: DeclarationId(508) }, Field { label: "OPTIONS".to_string(), ty: DeclarationId(509) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 18446, 18514) }, - Declaration { id: DeclarationId(157), name: Some("AuthScheme".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Bearer".to_string(), ty: DeclarationId(510) }, Field { label: "Header".to_string(), ty: DeclarationId(511) }, Field { label: "Basic".to_string(), ty: DeclarationId(512) }, Field { label: "ApiKey".to_string(), ty: DeclarationId(513) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 18982, 19078) }, - Declaration { id: DeclarationId(158), name: Some("AccessToken".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "token".to_string(), ty: DeclarationId(107) }, Field { label: "scheme".to_string(), ty: DeclarationId(157) }, Field { label: "expires_at".to_string(), ty: DeclarationId(514) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19200, 19333) }, - Declaration { id: DeclarationId(159), name: Some("Credential".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "token".to_string(), ty: DeclarationId(107) }, Field { label: "scheme".to_string(), ty: DeclarationId(157) }, Field { label: "header_name".to_string(), ty: DeclarationId(515) }, Field { label: "source_id".to_string(), ty: DeclarationId(186) }, Field { label: "required_scopes".to_string(), ty: DeclarationId(516) }, Field { label: "expires_in".to_string(), ty: DeclarationId(517) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19335, 19485) }, - Declaration { id: DeclarationId(160), name: Some("FilesystemHandle".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(120))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(580)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19562, 19626) }, - Declaration { id: DeclarationId(161), name: Some("NetworkHandle".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(89))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(581)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19627, 19684) }, - Declaration { id: DeclarationId(162), name: Some("ToolHandle".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(582)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19685, 19741) }, + Declaration { id: DeclarationId(151), name: Some("EntryKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "RegularFile".to_string(), ty: DeclarationId(490) }, Field { label: "Directory".to_string(), ty: DeclarationId(491) }, Field { label: "Symlink".to_string(), ty: DeclarationId(492) }, Field { label: "Missing".to_string(), ty: DeclarationId(493) }, Field { label: "Other".to_string(), ty: DeclarationId(494) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16148, 16226) }, + Declaration { id: DeclarationId(152), name: Some("SymlinkTarget".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "TargetFile".to_string(), ty: DeclarationId(495) }, Field { label: "TargetDir".to_string(), ty: DeclarationId(496) }, Field { label: "Broken".to_string(), ty: DeclarationId(497) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16356, 16414) }, + Declaration { id: DeclarationId(153), name: Some("TextFilePath".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(120))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(572)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 17397, 17447) }, + Declaration { id: DeclarationId(154), name: Some("BinaryFilePath".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(120))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(573)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 17448, 17500) }, + Declaration { id: DeclarationId(155), name: Some("MimeType".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(574)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 17641, 17702) }, + Declaration { id: DeclarationId(156), name: Some("HttpMethod".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "GET".to_string(), ty: DeclarationId(498) }, Field { label: "POST".to_string(), ty: DeclarationId(499) }, Field { label: "PUT".to_string(), ty: DeclarationId(500) }, Field { label: "PATCH".to_string(), ty: DeclarationId(501) }, Field { label: "DELETE".to_string(), ty: DeclarationId(502) }, Field { label: "HEAD".to_string(), ty: DeclarationId(503) }, Field { label: "OPTIONS".to_string(), ty: DeclarationId(504) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 18446, 18514) }, + Declaration { id: DeclarationId(157), name: Some("AuthScheme".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Bearer".to_string(), ty: DeclarationId(505) }, Field { label: "Header".to_string(), ty: DeclarationId(506) }, Field { label: "Basic".to_string(), ty: DeclarationId(507) }, Field { label: "ApiKey".to_string(), ty: DeclarationId(508) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 18982, 19078) }, + Declaration { id: DeclarationId(158), name: Some("AccessToken".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "token".to_string(), ty: DeclarationId(107) }, Field { label: "scheme".to_string(), ty: DeclarationId(157) }, Field { label: "expires_at".to_string(), ty: DeclarationId(509) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19200, 19333) }, + Declaration { id: DeclarationId(159), name: Some("Credential".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "token".to_string(), ty: DeclarationId(107) }, Field { label: "scheme".to_string(), ty: DeclarationId(157) }, Field { label: "header_name".to_string(), ty: DeclarationId(510) }, Field { label: "source_id".to_string(), ty: DeclarationId(186) }, Field { label: "required_scopes".to_string(), ty: DeclarationId(511) }, Field { label: "expires_in".to_string(), ty: DeclarationId(512) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19335, 19485) }, + Declaration { id: DeclarationId(160), name: Some("FilesystemHandle".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(120))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(575)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19562, 19626) }, + Declaration { id: DeclarationId(161), name: Some("NetworkHandle".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(89))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(576)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19627, 19684) }, + Declaration { id: DeclarationId(162), name: Some("ToolHandle".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(577)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19685, 19741) }, Declaration { id: DeclarationId(163), name: Some("TransportRequest".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "method".to_string(), ty: DeclarationId(156) }, Field { label: "url".to_string(), ty: DeclarationId(186) }, Field { label: "headers".to_string(), ty: DeclarationId(90) }, Field { label: "body".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19818, 19909) }, Declaration { id: DeclarationId(164), name: Some("TransportResponse".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "status".to_string(), ty: DeclarationId(71) }, Field { label: "headers".to_string(), ty: DeclarationId(90) }, Field { label: "body".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19911, 19982) }, Declaration { id: DeclarationId(165), name: Some("FileResponse".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "path".to_string(), ty: DeclarationId(186) }, Field { label: "success".to_string(), ty: DeclarationId(88) }, Field { label: "content".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19984, 20054) }, @@ -177,29 +177,29 @@ pub(crate) fn bootstrapped_fixture_dag() -> Dag { Declaration { id: DeclarationId(169), name: Some("Summary".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "total".to_string(), ty: DeclarationId(71) }, Field { label: "passed".to_string(), ty: DeclarationId(71) }, Field { label: "failed".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 20381, 20438) }, Declaration { id: DeclarationId(170), name: Some("StageResult".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "success".to_string(), ty: DeclarationId(88) }, Field { label: "stdout".to_string(), ty: DeclarationId(186) }, Field { label: "stderr".to_string(), ty: DeclarationId(186) }, Field { label: "skipped".to_string(), ty: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 20440, 20541) }, Declaration { id: DeclarationId(171), name: Some("DocumentLine".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "text".to_string(), ty: DeclarationId(186) }, Field { label: "is_comment".to_string(), ty: DeclarationId(88) }, Field { label: "is_blank".to_string(), ty: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 20694, 20766) }, - Declaration { id: DeclarationId(172), name: Some("DocumentSection".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "title".to_string(), ty: DeclarationId(186) }, Field { label: "has_title".to_string(), ty: DeclarationId(88) }, Field { label: "lines".to_string(), ty: DeclarationId(518) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 20768, 20854) }, - Declaration { id: DeclarationId(173), name: Some("Document".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "header".to_string(), ty: DeclarationId(186) }, Field { label: "has_header".to_string(), ty: DeclarationId(88) }, Field { label: "comment_prefix".to_string(), ty: DeclarationId(186) }, Field { label: "sections".to_string(), ty: DeclarationId(519) }, Field { label: "trailing_newline".to_string(), ty: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 20856, 20993) }, + Declaration { id: DeclarationId(172), name: Some("DocumentSection".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "title".to_string(), ty: DeclarationId(186) }, Field { label: "has_title".to_string(), ty: DeclarationId(88) }, Field { label: "lines".to_string(), ty: DeclarationId(513) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 20768, 20854) }, + Declaration { id: DeclarationId(173), name: Some("Document".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "header".to_string(), ty: DeclarationId(186) }, Field { label: "has_header".to_string(), ty: DeclarationId(88) }, Field { label: "comment_prefix".to_string(), ty: DeclarationId(186) }, Field { label: "sections".to_string(), ty: DeclarationId(514) }, Field { label: "trailing_newline".to_string(), ty: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 20856, 20993) }, Declaration { id: DeclarationId(174), name: Some("TextFile".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "path".to_string(), ty: DeclarationId(186) }, Field { label: "document".to_string(), ty: DeclarationId(173) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 20995, 21048) }, Declaration { id: DeclarationId(175), name: Some("RenderedTextFile".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "path".to_string(), ty: DeclarationId(186) }, Field { label: "content".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21050, 21108) }, - Declaration { id: DeclarationId(176), name: Some("ToolEntry".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "command".to_string(), ty: DeclarationId(186) }, Field { label: "description".to_string(), ty: DeclarationId(520) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21185, 21259) }, - Declaration { id: DeclarationId(177), name: Some("ToolRegistry".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "tools".to_string(), ty: DeclarationId(521) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21261, 21307) }, - Declaration { id: DeclarationId(178), name: Some("DagTopology".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "nodes".to_string(), ty: DeclarationId(522) }, Field { label: "edges".to_string(), ty: DeclarationId(523) }, Field { label: "subdag_boundaries".to_string(), ty: DeclarationId(524) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21566, 21676) }, - Declaration { id: DeclarationId(179), name: Some("TopologyNode".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "id".to_string(), ty: DeclarationId(186) }, Field { label: "label".to_string(), ty: DeclarationId(186) }, Field { label: "kind".to_string(), ty: DeclarationId(140) }, Field { label: "parent".to_string(), ty: DeclarationId(525) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21678, 21798) }, - Declaration { id: DeclarationId(180), name: Some("TopologyEdge".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "from".to_string(), ty: DeclarationId(186) }, Field { label: "to".to_string(), ty: DeclarationId(186) }, Field { label: "port".to_string(), ty: DeclarationId(526) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21800, 21865) }, - Declaration { id: DeclarationId(181), name: Some("DagDiff".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "added".to_string(), ty: DeclarationId(527) }, Field { label: "removed".to_string(), ty: DeclarationId(528) }, Field { label: "changed".to_string(), ty: DeclarationId(529) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21867, 21953) }, - Declaration { id: DeclarationId(182), name: Some("CodegenTarget".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "path".to_string(), ty: DeclarationId(120) }, Field { label: "backend".to_string(), ty: DeclarationId(530) }, Field { label: "target".to_string(), ty: DeclarationId(531) }, Field { label: "runtime_env".to_string(), ty: DeclarationId(532) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22022, 22156) }, - Declaration { id: DeclarationId(183), name: Some("CodegenBackend".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Rust".to_string(), ty: DeclarationId(533) }, Field { label: "Go".to_string(), ty: DeclarationId(534) }, Field { label: "C".to_string(), ty: DeclarationId(535) }, Field { label: "Mips".to_string(), ty: DeclarationId(536) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22158, 22200) }, - Declaration { id: DeclarationId(184), name: Some("PragmaDirective".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "key".to_string(), ty: DeclarationId(186) }, Field { label: "value".to_string(), ty: DeclarationId(186) }, Field { label: "scope".to_string(), ty: DeclarationId(537) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22202, 22273) }, + Declaration { id: DeclarationId(176), name: Some("ToolEntry".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "command".to_string(), ty: DeclarationId(186) }, Field { label: "description".to_string(), ty: DeclarationId(515) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21185, 21259) }, + Declaration { id: DeclarationId(177), name: Some("ToolRegistry".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "tools".to_string(), ty: DeclarationId(516) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21261, 21307) }, + Declaration { id: DeclarationId(178), name: Some("DagTopology".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "nodes".to_string(), ty: DeclarationId(517) }, Field { label: "edges".to_string(), ty: DeclarationId(518) }, Field { label: "subdag_boundaries".to_string(), ty: DeclarationId(519) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21566, 21676) }, + Declaration { id: DeclarationId(179), name: Some("TopologyNode".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "id".to_string(), ty: DeclarationId(186) }, Field { label: "label".to_string(), ty: DeclarationId(186) }, Field { label: "kind".to_string(), ty: DeclarationId(140) }, Field { label: "parent".to_string(), ty: DeclarationId(520) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21678, 21798) }, + Declaration { id: DeclarationId(180), name: Some("TopologyEdge".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "from".to_string(), ty: DeclarationId(186) }, Field { label: "to".to_string(), ty: DeclarationId(186) }, Field { label: "port".to_string(), ty: DeclarationId(521) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21800, 21865) }, + Declaration { id: DeclarationId(181), name: Some("DagDiff".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "added".to_string(), ty: DeclarationId(522) }, Field { label: "removed".to_string(), ty: DeclarationId(523) }, Field { label: "changed".to_string(), ty: DeclarationId(524) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21867, 21953) }, + Declaration { id: DeclarationId(182), name: Some("CodegenTarget".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "path".to_string(), ty: DeclarationId(120) }, Field { label: "backend".to_string(), ty: DeclarationId(525) }, Field { label: "target".to_string(), ty: DeclarationId(526) }, Field { label: "runtime_env".to_string(), ty: DeclarationId(527) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22022, 22156) }, + Declaration { id: DeclarationId(183), name: Some("CodegenBackend".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Rust".to_string(), ty: DeclarationId(528) }, Field { label: "Go".to_string(), ty: DeclarationId(529) }, Field { label: "C".to_string(), ty: DeclarationId(530) }, Field { label: "Mips".to_string(), ty: DeclarationId(531) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22158, 22200) }, + Declaration { id: DeclarationId(184), name: Some("PragmaDirective".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "key".to_string(), ty: DeclarationId(186) }, Field { label: "value".to_string(), ty: DeclarationId(186) }, Field { label: "scope".to_string(), ty: DeclarationId(532) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22202, 22273) }, Declaration { id: DeclarationId(185), name: Some("DocSource".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "path".to_string(), ty: DeclarationId(120) }, Field { label: "kind".to_string(), ty: DeclarationId(141) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22414, 22471) }, Declaration { id: DeclarationId(186), name: Some("String".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(92) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/string_type.dag", 520, 550) }, - Declaration { id: DeclarationId(187), name: Some("CharClass".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Whitespace".to_string(), ty: DeclarationId(583) }, Field { label: "Digit".to_string(), ty: DeclarationId(584) }, Field { label: "IdentStart".to_string(), ty: DeclarationId(585) }, Field { label: "IdentContinue".to_string(), ty: DeclarationId(586) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 3662, 3726) }, + Declaration { id: DeclarationId(187), name: Some("CharClass".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Whitespace".to_string(), ty: DeclarationId(578) }, Field { label: "Digit".to_string(), ty: DeclarationId(579) }, Field { label: "IdentStart".to_string(), ty: DeclarationId(580) }, Field { label: "IdentContinue".to_string(), ty: DeclarationId(581) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 3662, 3726) }, Declaration { id: DeclarationId(188), name: Some("char_in_class".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(92), DeclarationId(187)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/unicode.dag", 3780, 4378)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 3728, 4378) }, - Declaration { id: DeclarationId(189), name: Some("DisplayWidth".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ZeroWidth".to_string(), ty: DeclarationId(587) }, Field { label: "Narrow".to_string(), ty: DeclarationId(588) }, Field { label: "Wide".to_string(), ty: DeclarationId(589) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 4742, 4787) }, + Declaration { id: DeclarationId(189), name: Some("DisplayWidth".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ZeroWidth".to_string(), ty: DeclarationId(582) }, Field { label: "Narrow".to_string(), ty: DeclarationId(583) }, Field { label: "Wide".to_string(), ty: DeclarationId(584) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 4742, 4787) }, Declaration { id: DeclarationId(190), name: Some("display_width_columns".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(189)], output: DeclarationId(71), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/unicode.dag", 4838, 4914)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 4789, 4914) }, Declaration { id: DeclarationId(191), name: Some("UnicodeBlock".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "start".to_string(), ty: DeclarationId(71) }, Field { label: "end_inclusive".to_string(), ty: DeclarationId(71) }, Field { label: "default_width".to_string(), ty: DeclarationId(189) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 5149, 5249) }, - Declaration { id: DeclarationId(192), name: Some("zero_width_blocks".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(191) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(590)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Combining Diacritical Marks".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(768))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(879))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(587), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Combining Diacritical Marks Extended".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(6832))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(6911))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(587), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Combining Diacritical Marks Supplement".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(7616))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(7679))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(587), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Combining Marks for Symbols".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(8400))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(8447))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(587), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Variation Selectors".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(65024))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(65039))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(587), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Combining Half Marks".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(65056))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(65071))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(587), payload: vec![] })])])), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 5311, 6060) }, - Declaration { id: DeclarationId(193), name: Some("zero_width_codepoints".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(591)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![FieldValue::Literal(LiteralBits::Int(8203)), FieldValue::Literal(LiteralBits::Int(8204)), FieldValue::Literal(LiteralBits::Int(8205)), FieldValue::Literal(LiteralBits::Int(65279))])), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 6127, 6339) }, - Declaration { id: DeclarationId(194), name: Some("wide_blocks".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(191) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(592)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Hangul Jamo".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(4352))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(4447))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(589), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("CJK Radicals and Symbols".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(11904))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(12350))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(589), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Hiragana / Katakana / CJK Compat".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(12353))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(13247))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(589), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("CJK Extension A".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(13312))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(19903))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(589), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("CJK Unified Ideographs".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(19968))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(40959))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(589), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Yi Syllables and Radicals".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(40960))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(42191))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(589), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Hangul Syllables".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(44032))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(55215))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(589), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("CJK Compatibility Ideographs".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(63744))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(64255))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(589), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("CJK Compatibility Forms".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(65072))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(65135))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(589), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Fullwidth ASCII".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(65281))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(65376))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(589), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Fullwidth Signs".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(65504))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(65510))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(589), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("CJK Extension B+".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(131072))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(196607))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(589), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("CJK Extension G+".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(196608))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(262143))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(589), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Misc Symbols and Dingbats".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(9728))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(10175))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(589), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Symbols / Pictographs / Emoticons".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(127744))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(129535))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(589), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Symbols Extended".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(129536))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(131071))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(589), payload: vec![] })])])), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 6386, 8175) }, + Declaration { id: DeclarationId(192), name: Some("zero_width_blocks".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(191) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(585)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Combining Diacritical Marks".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(768))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(879))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(582), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Combining Diacritical Marks Extended".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(6832))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(6911))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(582), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Combining Diacritical Marks Supplement".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(7616))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(7679))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(582), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Combining Marks for Symbols".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(8400))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(8447))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(582), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Variation Selectors".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(65024))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(65039))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(582), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Combining Half Marks".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(65056))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(65071))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(582), payload: vec![] })])])), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 5311, 6060) }, + Declaration { id: DeclarationId(193), name: Some("zero_width_codepoints".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(586)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![FieldValue::Literal(LiteralBits::Int(8203)), FieldValue::Literal(LiteralBits::Int(8204)), FieldValue::Literal(LiteralBits::Int(8205)), FieldValue::Literal(LiteralBits::Int(65279))])), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 6127, 6339) }, + Declaration { id: DeclarationId(194), name: Some("wide_blocks".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(191) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(587)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Hangul Jamo".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(4352))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(4447))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(584), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("CJK Radicals and Symbols".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(11904))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(12350))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(584), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Hiragana / Katakana / CJK Compat".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(12353))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(13247))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(584), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("CJK Extension A".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(13312))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(19903))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(584), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("CJK Unified Ideographs".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(19968))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(40959))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(584), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Yi Syllables and Radicals".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(40960))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(42191))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(584), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Hangul Syllables".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(44032))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(55215))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(584), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("CJK Compatibility Ideographs".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(63744))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(64255))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(584), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("CJK Compatibility Forms".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(65072))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(65135))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(584), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Fullwidth ASCII".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(65281))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(65376))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(584), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Fullwidth Signs".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(65504))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(65510))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(584), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("CJK Extension B+".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(131072))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(196607))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(584), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("CJK Extension G+".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(196608))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(262143))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(584), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Misc Symbols and Dingbats".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(9728))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(10175))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(584), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Symbols / Pictographs / Emoticons".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(127744))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(129535))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(584), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Symbols Extended".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(129536))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(131071))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(584), payload: vec![] })])])), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 6386, 8175) }, Declaration { id: DeclarationId(195), name: Some("code_point".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(92)], output: DeclarationId(71), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/unicode.dag", 8355, 8366)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 8325, 8366) }, Declaration { id: DeclarationId(196), name: Some("in_block".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71), DeclarationId(191)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/unicode.dag", 8418, 8470)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 8368, 8470) }, Declaration { id: DeclarationId(197), name: Some("char_display_width".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(92)], output: DeclarationId(189), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/unicode.dag", 8519, 8822)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 8472, 8822) }, @@ -208,1924 +208,1919 @@ pub(crate) fn bootstrapped_fixture_dag() -> Dag { Declaration { id: DeclarationId(200), name: Some("repeat_string_loop".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(186), DeclarationId(71)], output: DeclarationId(186), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/render_repeat_string_bootstrap.dag", 598, 717)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/render_repeat_string_bootstrap.dag", 526, 717) }, Declaration { id: DeclarationId(201), name: Some("repeat_string".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(71)], output: DeclarationId(186), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/render_repeat_string_bootstrap.dag", 765, 818)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/render_repeat_string_bootstrap.dag", 719, 818) }, Declaration { id: DeclarationId(202), name: Some("MethodDeclaration".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 3320, 3361) }, - Declaration { id: DeclarationId(203), name: Some("add_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("add".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 3822, 3874) }, - Declaration { id: DeclarationId(204), name: Some("all_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("all".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 3875, 3927) }, - Declaration { id: DeclarationId(205), name: Some("any_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("any".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 3928, 3980) }, - Declaration { id: DeclarationId(206), name: Some("append_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("append".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 3981, 4039) }, - Declaration { id: DeclarationId(207), name: Some("bottom_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("bottom".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4040, 4098) }, - Declaration { id: DeclarationId(208), name: Some("chars_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("chars".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4099, 4155) }, - Declaration { id: DeclarationId(209), name: Some("clamp_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("clamp".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4156, 4212) }, - Declaration { id: DeclarationId(210), name: Some("compare_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("compare".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4213, 4273) }, - Declaration { id: DeclarationId(211), name: Some("complement_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("complement".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4274, 4340) }, - Declaration { id: DeclarationId(212), name: Some("concat_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("concat".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4341, 4399) }, - Declaration { id: DeclarationId(213), name: Some("contains_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("contains".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4400, 4462) }, - Declaration { id: DeclarationId(214), name: Some("count_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("count".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4463, 4519) }, - Declaration { id: DeclarationId(215), name: Some("diff_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("diff".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4520, 4574) }, - Declaration { id: DeclarationId(216), name: Some("empty_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("empty".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4575, 4631) }, - Declaration { id: DeclarationId(217), name: Some("ends_with_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("ends_with".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4632, 4696) }, - Declaration { id: DeclarationId(218), name: Some("enumerate_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("enumerate".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4697, 4761) }, - Declaration { id: DeclarationId(219), name: Some("filter_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("filter".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4762, 4820) }, - Declaration { id: DeclarationId(220), name: Some("first_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("first".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4821, 4877) }, - Declaration { id: DeclarationId(221), name: Some("flat_map_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("flat_map".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4878, 4940) }, - Declaration { id: DeclarationId(222), name: Some("fold_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("fold".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4941, 4995) }, - Declaration { id: DeclarationId(223), name: Some("get_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("get".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4996, 5048) }, - Declaration { id: DeclarationId(224), name: Some("has_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("has".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5049, 5101) }, - Declaration { id: DeclarationId(225), name: Some("intersect_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("intersect".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5102, 5166) }, - Declaration { id: DeclarationId(226), name: Some("join_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("join".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5167, 5221) }, - Declaration { id: DeclarationId(227), name: Some("keys_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("keys".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5222, 5276) }, - Declaration { id: DeclarationId(228), name: Some("last_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("last".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5277, 5331) }, - Declaration { id: DeclarationId(229), name: Some("length_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("length".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5332, 5390) }, - Declaration { id: DeclarationId(230), name: Some("list_push_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("list_push".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5391, 5455) }, - Declaration { id: DeclarationId(231), name: Some("lookup_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("lookup".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5456, 5514) }, - Declaration { id: DeclarationId(232), name: Some("map_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("map".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5515, 5567) }, - Declaration { id: DeclarationId(233), name: Some("map_contains_key_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("map_contains_key".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5568, 5646) }, - Declaration { id: DeclarationId(234), name: Some("map_get_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("map_get".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5647, 5707) }, - Declaration { id: DeclarationId(235), name: Some("map_has_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("map_has".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5708, 5768) }, - Declaration { id: DeclarationId(236), name: Some("map_insert_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("map_insert".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5769, 5835) }, - Declaration { id: DeclarationId(237), name: Some("map_keys_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("map_keys".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5836, 5898) }, - Declaration { id: DeclarationId(238), name: Some("map_merge_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("map_merge".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5899, 5963) }, - Declaration { id: DeclarationId(239), name: Some("map_values_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("map_values".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5964, 6030) }, - Declaration { id: DeclarationId(240), name: Some("meet_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("meet".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6031, 6085) }, - Declaration { id: DeclarationId(241), name: Some("member_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("member".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6086, 6144) }, - Declaration { id: DeclarationId(242), name: Some("mul_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("mul".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6145, 6197) }, - Declaration { id: DeclarationId(243), name: Some("negate_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("negate".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6198, 6256) }, - Declaration { id: DeclarationId(244), name: Some("one_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("one".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6257, 6309) }, - Declaration { id: DeclarationId(245), name: Some("quotient_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("quotient".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6310, 6372) }, - Declaration { id: DeclarationId(246), name: Some("reciprocal_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("reciprocal".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6373, 6439) }, - Declaration { id: DeclarationId(247), name: Some("remainder_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("remainder".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6440, 6504) }, - Declaration { id: DeclarationId(248), name: Some("replace_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("replace".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6505, 6565) }, - Declaration { id: DeclarationId(249), name: Some("reverse_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("reverse".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6566, 6626) }, - Declaration { id: DeclarationId(250), name: Some("skip_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("skip".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6627, 6681) }, - Declaration { id: DeclarationId(251), name: Some("sort_by_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("sort_by".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6682, 6742) }, - Declaration { id: DeclarationId(252), name: Some("split_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("split".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6743, 6799) }, - Declaration { id: DeclarationId(253), name: Some("starts_with_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("starts_with".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6800, 6868) }, - Declaration { id: DeclarationId(254), name: Some("substring_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("substring".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6869, 6933) }, - Declaration { id: DeclarationId(255), name: Some("take_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("take".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6934, 6988) }, - Declaration { id: DeclarationId(256), name: Some("to_int_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("to_int".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6989, 7047) }, - Declaration { id: DeclarationId(257), name: Some("to_lower_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("to_lower".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 7048, 7110) }, - Declaration { id: DeclarationId(258), name: Some("to_string_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("to_string".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 7111, 7175) }, - Declaration { id: DeclarationId(259), name: Some("to_upper_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("to_upper".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 7176, 7238) }, - Declaration { id: DeclarationId(260), name: Some("top_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("top".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 7239, 7291) }, - Declaration { id: DeclarationId(261), name: Some("trim_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("trim".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 7292, 7346) }, - Declaration { id: DeclarationId(262), name: Some("union_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("union".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 7347, 7403) }, - Declaration { id: DeclarationId(263), name: Some("values_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("values".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 7404, 7462) }, - Declaration { id: DeclarationId(264), name: Some("with_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("with".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 7463, 7517) }, - Declaration { id: DeclarationId(265), name: Some("zero_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("zero".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 7518, 7572) }, - Declaration { id: DeclarationId(266), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/logic.dag", 304, 308) }, - Declaration { id: DeclarationId(267), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/logic.dag", 311, 316) }, - Declaration { id: DeclarationId(268), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(4) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1023, 1032) }, - Declaration { id: DeclarationId(269), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(4) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1136, 1145) }, - Declaration { id: DeclarationId(270), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(6) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1272, 1282) }, - Declaration { id: DeclarationId(271), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(6) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1306, 1316) }, - Declaration { id: DeclarationId(272), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(6) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1340, 1350) }, - Declaration { id: DeclarationId(273), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(6) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1375, 1385) }, - Declaration { id: DeclarationId(274), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "value".to_string(), ty: DeclarationId(12) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/error_primitives.dag", 620, 636) }, - Declaration { id: DeclarationId(275), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "value".to_string(), ty: DeclarationId(13) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/error_primitives.dag", 639, 657) }, - Declaration { id: DeclarationId(276), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/error_primitives.dag", 936, 948) }, - Declaration { id: DeclarationId(277), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/error_primitives.dag", 951, 959) }, - Declaration { id: DeclarationId(278), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(52) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 18727, 18753) }, - Declaration { id: DeclarationId(279), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(52) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 20267, 20293) }, - Declaration { id: DeclarationId(280), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(52) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 21424, 21450) }, - Declaration { id: DeclarationId(281), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(52) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 22550, 22576) }, - Declaration { id: DeclarationId(282), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(52) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 25961, 25987) }, - Declaration { id: DeclarationId(283), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(52) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 29098, 29124) }, - Declaration { id: DeclarationId(284), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(52) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 34230, 34256) }, - Declaration { id: DeclarationId(285), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(52) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 37144, 37170) }, - Declaration { id: DeclarationId(286), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 37963, 37975) }, - Declaration { id: DeclarationId(287), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(16), DeclarationId(16)], output: DeclarationId(16), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 4585, 4598) }, - Declaration { id: DeclarationId(288), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(18), DeclarationId(18)], output: DeclarationId(18), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 4704, 4717) }, - Declaration { id: DeclarationId(289), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(20), DeclarationId(20)], output: DeclarationId(20), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 4921, 4934) }, - Declaration { id: DeclarationId(290), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(22), DeclarationId(22)], output: DeclarationId(22), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5043, 5056) }, - Declaration { id: DeclarationId(291), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(24), DeclarationId(24)], output: DeclarationId(24), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5194, 5207) }, - Declaration { id: DeclarationId(292), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(24)], output: DeclarationId(24), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5233, 5243) }, - Declaration { id: DeclarationId(293), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(26), DeclarationId(26)], output: DeclarationId(26), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5312, 5325) }, - Declaration { id: DeclarationId(294), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(26)], output: DeclarationId(26), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5351, 5361) }, - Declaration { id: DeclarationId(295), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(28), DeclarationId(28)], output: DeclarationId(28), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5851, 5864) }, - Declaration { id: DeclarationId(296), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(28), DeclarationId(28)], output: DeclarationId(28), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5882, 5895) }, - Declaration { id: DeclarationId(297), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(30), DeclarationId(30)], output: DeclarationId(30), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6055, 6068) }, - Declaration { id: DeclarationId(298), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(30)], output: DeclarationId(30), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6089, 6099) }, - Declaration { id: DeclarationId(299), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(30), DeclarationId(30)], output: DeclarationId(30), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6107, 6120) }, - Declaration { id: DeclarationId(300), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(32), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6883, 6896) }, - Declaration { id: DeclarationId(301), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(32), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6904, 6917) }, - Declaration { id: DeclarationId(302), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32)], output: DeclarationId(32), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6938, 6948) }, - Declaration { id: DeclarationId(303), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(32), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6956, 6969) }, - Declaration { id: DeclarationId(304), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(11), arguments: vec![TemplateArgument { parameter: DeclarationId(12), value: DeclarationId(32) }, TemplateArgument { parameter: DeclarationId(13), value: DeclarationId(14) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6989, 7008) }, - Declaration { id: DeclarationId(305), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(304), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6977, 7008) }, - Declaration { id: DeclarationId(306), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(46), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7029, 7049) }, - Declaration { id: DeclarationId(307), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(32), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7062, 7075) }, - Declaration { id: DeclarationId(308), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(32), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7089, 7102) }, - Declaration { id: DeclarationId(309), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7109, 7125) }, - Declaration { id: DeclarationId(310), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7132, 7148) }, - Declaration { id: DeclarationId(311), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7155, 7171) }, - Declaration { id: DeclarationId(312), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7178, 7194) }, - Declaration { id: DeclarationId(313), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7201, 7217) }, - Declaration { id: DeclarationId(314), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7224, 7240) }, - Declaration { id: DeclarationId(315), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(34), DeclarationId(34)], output: DeclarationId(34), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7403, 7416) }, - Declaration { id: DeclarationId(316), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(34)], output: DeclarationId(34), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7437, 7447) }, - Declaration { id: DeclarationId(317), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(34), DeclarationId(34)], output: DeclarationId(34), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7455, 7468) }, - Declaration { id: DeclarationId(318), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(34)], output: DeclarationId(34), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7492, 7502) }, - Declaration { id: DeclarationId(319), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(34), DeclarationId(34)], output: DeclarationId(46), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7514, 7534) }, - Declaration { id: DeclarationId(320), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(36), DeclarationId(36)], output: DeclarationId(36), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7882, 7895) }, - Declaration { id: DeclarationId(321), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(36), DeclarationId(36)], output: DeclarationId(36), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7904, 7917) }, - Declaration { id: DeclarationId(322), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(38), DeclarationId(38)], output: DeclarationId(38), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 8060, 8073) }, - Declaration { id: DeclarationId(323), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(38), DeclarationId(38)], output: DeclarationId(38), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 8082, 8095) }, - Declaration { id: DeclarationId(324), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(40), DeclarationId(40)], output: DeclarationId(40), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 8349, 8362) }, - Declaration { id: DeclarationId(325), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(40), DeclarationId(40)], output: DeclarationId(40), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 8371, 8384) }, - Declaration { id: DeclarationId(326), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(40)], output: DeclarationId(40), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 8399, 8409) }, - Declaration { id: DeclarationId(327), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12261, 12274) }, - Declaration { id: DeclarationId(328), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12276, 12289) }, - Declaration { id: DeclarationId(329), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12294, 12307) }, - Declaration { id: DeclarationId(330), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(327), DeclarationId(328)], output: DeclarationId(329), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12258, 12307) }, - Declaration { id: DeclarationId(331), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12317, 12330) }, - Declaration { id: DeclarationId(332), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12350, 12363) }, - Declaration { id: DeclarationId(333), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42)], output: DeclarationId(332), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12341, 12363) }, - Declaration { id: DeclarationId(334), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71)], output: DeclarationId(42), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12444, 12456) }, - Declaration { id: DeclarationId(335), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12482, 12495) }, - Declaration { id: DeclarationId(336), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71), DeclarationId(71)], output: DeclarationId(335), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12466, 12495) }, - Declaration { id: DeclarationId(337), name: None, connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(71), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12506, 12517) }, - Declaration { id: DeclarationId(338), name: None, connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(71), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12527, 12538) }, - Declaration { id: DeclarationId(339), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(42), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12556, 12558) }, - Declaration { id: DeclarationId(340), name: None, connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(339), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12548, 12558) }, - Declaration { id: DeclarationId(341), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(42), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12575, 12577) }, - Declaration { id: DeclarationId(342), name: None, connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(341), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12567, 12577) }, - Declaration { id: DeclarationId(343), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42)], output: DeclarationId(42), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12675, 12685) }, - Declaration { id: DeclarationId(344), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12690, 12703) }, - Declaration { id: DeclarationId(345), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(343)], output: DeclarationId(344), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12672, 12703) }, - Declaration { id: DeclarationId(346), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12717, 12730) }, - Declaration { id: DeclarationId(347), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12735, 12748) }, - Declaration { id: DeclarationId(348), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(346)], output: DeclarationId(347), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12714, 12748) }, - Declaration { id: DeclarationId(349), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42), DeclarationId(42)], output: DeclarationId(42), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12763, 12776) }, - Declaration { id: DeclarationId(350), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42), DeclarationId(349)], output: DeclarationId(42), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12757, 12782) }, - Declaration { id: DeclarationId(351), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12807, 12820) }, - Declaration { id: DeclarationId(352), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42)], output: DeclarationId(351), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12798, 12820) }, - Declaration { id: DeclarationId(353), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12825, 12838) }, - Declaration { id: DeclarationId(354), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(352)], output: DeclarationId(353), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12795, 12838) }, - Declaration { id: DeclarationId(355), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12849, 12862) }, - Declaration { id: DeclarationId(356), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(355)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12846, 12871) }, - Declaration { id: DeclarationId(357), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12882, 12895) }, - Declaration { id: DeclarationId(358), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(357)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12879, 12904) }, - Declaration { id: DeclarationId(359), name: None, connective: TypeConnective::Atom(AtomPayload::UnresolvedIdentifier("Tuple".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12969, 12982) }, - Declaration { id: DeclarationId(360), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(359), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12969, 12982) }, - Declaration { id: DeclarationId(361), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(360) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12958, 12983) }, - Declaration { id: DeclarationId(362), name: None, connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(361), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12950, 12983) }, - Declaration { id: DeclarationId(363), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13003, 13016) }, - Declaration { id: DeclarationId(364), name: None, connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(363), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12995, 13016) }, - Declaration { id: DeclarationId(365), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13036, 13049) }, - Declaration { id: DeclarationId(366), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71)], output: DeclarationId(365), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13025, 13049) }, - Declaration { id: DeclarationId(367), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13069, 13082) }, - Declaration { id: DeclarationId(368), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71)], output: DeclarationId(367), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13058, 13082) }, - Declaration { id: DeclarationId(369), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42), DeclarationId(42)], output: DeclarationId(71), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13097, 13112) }, - Declaration { id: DeclarationId(370), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13117, 13130) }, - Declaration { id: DeclarationId(371), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(369)], output: DeclarationId(370), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13094, 13130) }, - Declaration { id: DeclarationId(372), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13143, 13156) }, - Declaration { id: DeclarationId(373), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(45), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13721, 13723) }, - Declaration { id: DeclarationId(374), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(44)], output: DeclarationId(373), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13712, 13723) }, - Declaration { id: DeclarationId(375), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(43), arguments: vec![TemplateArgument { parameter: DeclarationId(44), value: DeclarationId(44) }, TemplateArgument { parameter: DeclarationId(45), value: DeclarationId(45) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13733, 13754) }, - Declaration { id: DeclarationId(376), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(45), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13771, 13773) }, - Declaration { id: DeclarationId(377), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(44)], output: DeclarationId(376), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13762, 13773) }, - Declaration { id: DeclarationId(378), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(43), arguments: vec![TemplateArgument { parameter: DeclarationId(44), value: DeclarationId(44) }, TemplateArgument { parameter: DeclarationId(45), value: DeclarationId(45) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13796, 13817) }, - Declaration { id: DeclarationId(379), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(44), DeclarationId(45)], output: DeclarationId(378), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13784, 13817) }, - Declaration { id: DeclarationId(380), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(43), arguments: vec![TemplateArgument { parameter: DeclarationId(44), value: DeclarationId(44) }, TemplateArgument { parameter: DeclarationId(45), value: DeclarationId(45) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13830, 13851) }, - Declaration { id: DeclarationId(381), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(43), arguments: vec![TemplateArgument { parameter: DeclarationId(44), value: DeclarationId(44) }, TemplateArgument { parameter: DeclarationId(45), value: DeclarationId(45) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13856, 13877) }, - Declaration { id: DeclarationId(382), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(380)], output: DeclarationId(381), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13827, 13877) }, - Declaration { id: DeclarationId(383), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(44) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13894, 13907) }, - Declaration { id: DeclarationId(384), name: None, connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(383), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13886, 13907) }, - Declaration { id: DeclarationId(385), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(45) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13926, 13939) }, - Declaration { id: DeclarationId(386), name: None, connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(385), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13918, 13939) }, - Declaration { id: DeclarationId(387), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(44)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13947, 13960) }, - Declaration { id: DeclarationId(388), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(44)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13977, 13990) }, - Declaration { id: DeclarationId(389), name: None, connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(71), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13999, 14010) }, - Declaration { id: DeclarationId(390), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 14229, 14233) }, - Declaration { id: DeclarationId(391), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 14236, 14241) }, - Declaration { id: DeclarationId(392), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 14244, 14251) }, - Declaration { id: DeclarationId(393), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16177, 16195) }, - Declaration { id: DeclarationId(394), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16200, 16223) }, - Declaration { id: DeclarationId(395), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16228, 16249) }, - Declaration { id: DeclarationId(396), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16254, 16285) }, - Declaration { id: DeclarationId(397), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16290, 16313) }, - Declaration { id: DeclarationId(398), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16318, 16345) }, - Declaration { id: DeclarationId(399), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16350, 16372) }, - Declaration { id: DeclarationId(400), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16399, 16413) }, - Declaration { id: DeclarationId(401), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16418, 16440) }, - Declaration { id: DeclarationId(402), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16471, 16483) }, - Declaration { id: DeclarationId(403), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16488, 16503) }, - Declaration { id: DeclarationId(404), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16508, 16519) }, - Declaration { id: DeclarationId(405), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16524, 16537) }, - Declaration { id: DeclarationId(406), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16542, 16572) }, - Declaration { id: DeclarationId(407), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "source".to_string(), ty: DeclarationId(48) }, Field { label: "element".to_string(), ty: DeclarationId(49) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16577, 16646) }, - Declaration { id: DeclarationId(408), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "inner".to_string(), ty: DeclarationId(49) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16651, 16692) }, - Declaration { id: DeclarationId(409), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "first".to_string(), ty: DeclarationId(49) }, Field { label: "second".to_string(), ty: DeclarationId(49) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16697, 16764) }, - Declaration { id: DeclarationId(410), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(49) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16790, 16815) }, - Declaration { id: DeclarationId(411), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "params".to_string(), ty: DeclarationId(410) }, Field { label: "return_type".to_string(), ty: DeclarationId(49) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16769, 16851) }, - Declaration { id: DeclarationId(412), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "id".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16856, 16890) }, - Declaration { id: DeclarationId(413), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 17136, 17148) }, - Declaration { id: DeclarationId(414), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 17206, 17222) }, - Declaration { id: DeclarationId(415), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 17269, 17283) }, - Declaration { id: DeclarationId(416), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 17760, 17773) }, - Declaration { id: DeclarationId(417), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 17789, 17804) }, - Declaration { id: DeclarationId(418), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 17850, 17866) }, - Declaration { id: DeclarationId(419), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 17913, 17926) }, - Declaration { id: DeclarationId(420), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(49) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 18009, 18034) }, - Declaration { id: DeclarationId(421), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(50), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 18085, 18106) }, - Declaration { id: DeclarationId(422), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(51), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 18121, 18131) }, - Declaration { id: DeclarationId(423), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 18376, 18380) }, - Declaration { id: DeclarationId(424), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(47) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 18413, 18440) }, - Declaration { id: DeclarationId(425), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 3781, 3785) }, - Declaration { id: DeclarationId(426), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 4054, 4066) }, - Declaration { id: DeclarationId(427), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 4264, 4271) }, - Declaration { id: DeclarationId(428), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 6172, 6179) }, - Declaration { id: DeclarationId(429), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 6508, 6520) }, - Declaration { id: DeclarationId(430), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 7558, 7562) }, - Declaration { id: DeclarationId(431), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 7565, 7570) }, - Declaration { id: DeclarationId(432), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(116) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11304, 11321) }, - Declaration { id: DeclarationId(433), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(117) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11355, 11372) }, - Declaration { id: DeclarationId(434), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14380, 14385) }, - Declaration { id: DeclarationId(435), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14388, 14393) }, - Declaration { id: DeclarationId(436), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14396, 14403) }, - Declaration { id: DeclarationId(437), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14555, 14559) }, - Declaration { id: DeclarationId(438), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14562, 14571) }, - Declaration { id: DeclarationId(439), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14574, 14580) }, - Declaration { id: DeclarationId(440), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14583, 14586) }, - Declaration { id: DeclarationId(441), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14611, 14619) }, - Declaration { id: DeclarationId(442), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14622, 14631) }, - Declaration { id: DeclarationId(443), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14634, 14640) }, - Declaration { id: DeclarationId(444), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14660, 14662) }, - Declaration { id: DeclarationId(445), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14665, 14666) }, - Declaration { id: DeclarationId(446), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14669, 14670) }, - Declaration { id: DeclarationId(447), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14673, 14674) }, - Declaration { id: DeclarationId(448), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14677, 14679) }, - Declaration { id: DeclarationId(449), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "secret_name".to_string(), ty: DeclarationId(111) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14951, 14986) }, - Declaration { id: DeclarationId(450), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "env_var".to_string(), ty: DeclarationId(111) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14991, 15032) }, - Declaration { id: DeclarationId(451), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(138), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15107, 15127) }, - Declaration { id: DeclarationId(452), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15142, 15154) }, - Declaration { id: DeclarationId(453), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "audience".to_string(), ty: DeclarationId(111) }, Field { label: "service_account".to_string(), ty: DeclarationId(451) }, Field { label: "scopes".to_string(), ty: DeclarationId(452) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15037, 15160) }, - Declaration { id: DeclarationId(454), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15191, 15203) }, - Declaration { id: DeclarationId(455), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "scopes".to_string(), ty: DeclarationId(454) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15165, 15205) }, - Declaration { id: DeclarationId(456), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(143) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15227, 15247) }, - Declaration { id: DeclarationId(457), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "steps".to_string(), ty: DeclarationId(456) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15210, 15249) }, - Declaration { id: DeclarationId(458), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15336, 15342) }, - Declaration { id: DeclarationId(459), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15345, 15348) }, - Declaration { id: DeclarationId(460), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15351, 15358) }, - Declaration { id: DeclarationId(461), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15361, 15364) }, - Declaration { id: DeclarationId(462), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15367, 15372) }, - Declaration { id: DeclarationId(463), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15375, 15379) }, - Declaration { id: DeclarationId(464), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15382, 15388) }, - Declaration { id: DeclarationId(465), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15391, 15397) }, - Declaration { id: DeclarationId(466), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15400, 15408) }, - Declaration { id: DeclarationId(467), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15411, 15418) }, - Declaration { id: DeclarationId(468), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15421, 15427) }, - Declaration { id: DeclarationId(469), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15442, 15455) }, - Declaration { id: DeclarationId(470), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15458, 15460) }, - Declaration { id: DeclarationId(471), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15463, 15468) }, - Declaration { id: DeclarationId(472), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15471, 15474) }, - Declaration { id: DeclarationId(473), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15485, 15490) }, - Declaration { id: DeclarationId(474), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15493, 15498) }, - Declaration { id: DeclarationId(475), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15501, 15508) }, - Declaration { id: DeclarationId(476), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15511, 15518) }, - Declaration { id: DeclarationId(477), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15521, 15528) }, - Declaration { id: DeclarationId(478), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15531, 15534) }, - Declaration { id: DeclarationId(479), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15537, 15541) }, - Declaration { id: DeclarationId(480), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15556, 15563) }, - Declaration { id: DeclarationId(481), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15566, 15569) }, - Declaration { id: DeclarationId(482), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15572, 15579) }, - Declaration { id: DeclarationId(483), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15582, 15591) }, - Declaration { id: DeclarationId(484), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15594, 15598) }, - Declaration { id: DeclarationId(485), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15601, 15605) }, - Declaration { id: DeclarationId(486), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15608, 15618) }, - Declaration { id: DeclarationId(487), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15621, 15625) }, - Declaration { id: DeclarationId(488), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15628, 15634) }, - Declaration { id: DeclarationId(489), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15655, 15661) }, - Declaration { id: DeclarationId(490), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15664, 15667) }, - Declaration { id: DeclarationId(491), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15670, 15679) }, - Declaration { id: DeclarationId(492), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15682, 15684) }, - Declaration { id: DeclarationId(493), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15687, 15695) }, - Declaration { id: DeclarationId(494), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(147), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15763, 15770) }, - Declaration { id: DeclarationId(495), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16167, 16178) }, - Declaration { id: DeclarationId(496), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16183, 16192) }, - Declaration { id: DeclarationId(497), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16197, 16204) }, - Declaration { id: DeclarationId(498), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16209, 16216) }, - Declaration { id: DeclarationId(499), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16221, 16226) }, - Declaration { id: DeclarationId(500), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16379, 16389) }, - Declaration { id: DeclarationId(501), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16394, 16403) }, - Declaration { id: DeclarationId(502), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16408, 16414) }, - Declaration { id: DeclarationId(503), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 18464, 18467) }, - Declaration { id: DeclarationId(504), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 18470, 18474) }, - Declaration { id: DeclarationId(505), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 18477, 18480) }, - Declaration { id: DeclarationId(506), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 18483, 18488) }, - Declaration { id: DeclarationId(507), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 18491, 18497) }, - Declaration { id: DeclarationId(508), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 18500, 18504) }, - Declaration { id: DeclarationId(509), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 18507, 18514) }, - Declaration { id: DeclarationId(510), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19002, 19008) }, - Declaration { id: DeclarationId(511), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19013, 19036) }, - Declaration { id: DeclarationId(512), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "username".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19041, 19067) }, - Declaration { id: DeclarationId(513), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19072, 19078) }, - Declaration { id: DeclarationId(514), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(122), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19270, 19280) }, - Declaration { id: DeclarationId(515), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19405, 19412) }, - Declaration { id: DeclarationId(516), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19452, 19464) }, - Declaration { id: DeclarationId(517), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19479, 19483) }, - Declaration { id: DeclarationId(518), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(171) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 20834, 20852) }, - Declaration { id: DeclarationId(519), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(172) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 20945, 20966) }, - Declaration { id: DeclarationId(520), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21250, 21257) }, - Declaration { id: DeclarationId(521), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(176) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21290, 21305) }, - Declaration { id: DeclarationId(522), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(179) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21594, 21612) }, - Declaration { id: DeclarationId(523), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(180) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21622, 21640) }, - Declaration { id: DeclarationId(524), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21662, 21674) }, - Declaration { id: DeclarationId(525), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21762, 21769) }, - Declaration { id: DeclarationId(526), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21856, 21863) }, - Declaration { id: DeclarationId(527), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21891, 21903) }, - Declaration { id: DeclarationId(528), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21915, 21927) }, - Declaration { id: DeclarationId(529), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21939, 21951) }, - Declaration { id: DeclarationId(530), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(183), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22086, 22101) }, - Declaration { id: DeclarationId(531), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(149), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22112, 22125) }, - Declaration { id: DeclarationId(532), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(148), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22141, 22154) }, - Declaration { id: DeclarationId(533), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22180, 22184) }, - Declaration { id: DeclarationId(534), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22187, 22189) }, - Declaration { id: DeclarationId(535), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22192, 22193) }, - Declaration { id: DeclarationId(536), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22196, 22200) }, - Declaration { id: DeclarationId(537), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22264, 22271) }, - Declaration { id: DeclarationId(538), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 3063, 3080) }, - Declaration { id: DeclarationId(539), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 3533, 3549) }, - Declaration { id: DeclarationId(540), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 4740, 4757) }, - Declaration { id: DeclarationId(541), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 5722, 5741) }, - Declaration { id: DeclarationId(542), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10147, 10207) }, - Declaration { id: DeclarationId(543), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10208, 10268) }, - Declaration { id: DeclarationId(544), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10269, 10320) }, - Declaration { id: DeclarationId(545), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10321, 10376) }, - Declaration { id: DeclarationId(546), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10377, 10442) }, - Declaration { id: DeclarationId(547), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10443, 10498) }, - Declaration { id: DeclarationId(548), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10499, 10544) }, - Declaration { id: DeclarationId(549), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10587, 10629) }, - Declaration { id: DeclarationId(550), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10630, 10684) }, - Declaration { id: DeclarationId(551), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10685, 10748) }, - Declaration { id: DeclarationId(552), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10749, 10794) }, - Declaration { id: DeclarationId(553), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10795, 10840) }, - Declaration { id: DeclarationId(554), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10841, 10886) }, - Declaration { id: DeclarationId(555), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10887, 10933) }, - Declaration { id: DeclarationId(556), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10934, 10980) }, - Declaration { id: DeclarationId(557), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11151, 11210) }, - Declaration { id: DeclarationId(558), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11211, 11270) }, - Declaration { id: DeclarationId(559), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11375, 11418) }, - Declaration { id: DeclarationId(560), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12098, 12196) }, - Declaration { id: DeclarationId(561), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12197, 12241) }, - Declaration { id: DeclarationId(562), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12242, 12286) }, - Declaration { id: DeclarationId(563), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12287, 12354) }, - Declaration { id: DeclarationId(564), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12355, 12417) }, - Declaration { id: DeclarationId(565), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12941, 12996) }, - Declaration { id: DeclarationId(566), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12997, 13051) }, - Declaration { id: DeclarationId(567), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13052, 13105) }, - Declaration { id: DeclarationId(568), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13106, 13163) }, - Declaration { id: DeclarationId(569), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13164, 13221) }, - Declaration { id: DeclarationId(570), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13222, 13277) }, - Declaration { id: DeclarationId(571), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13278, 13334) }, - Declaration { id: DeclarationId(572), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13335, 13391) }, - Declaration { id: DeclarationId(573), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13392, 13450) }, - Declaration { id: DeclarationId(574), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13530, 13572) }, - Declaration { id: DeclarationId(575), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13779, 13864) }, - Declaration { id: DeclarationId(576), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13865, 13974) }, - Declaration { id: DeclarationId(577), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 17397, 17447) }, - Declaration { id: DeclarationId(578), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 17448, 17500) }, - Declaration { id: DeclarationId(579), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 17641, 17702) }, - Declaration { id: DeclarationId(580), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19562, 19626) }, - Declaration { id: DeclarationId(581), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19627, 19684) }, - Declaration { id: DeclarationId(582), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19685, 19741) }, - Declaration { id: DeclarationId(583), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 3679, 3689) }, - Declaration { id: DeclarationId(584), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 3692, 3697) }, - Declaration { id: DeclarationId(585), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 3700, 3710) }, - Declaration { id: DeclarationId(586), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 3713, 3726) }, - Declaration { id: DeclarationId(587), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 4762, 4771) }, - Declaration { id: DeclarationId(588), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 4774, 4780) }, - Declaration { id: DeclarationId(589), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 4783, 4787) }, - Declaration { id: DeclarationId(590), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(191) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 5335, 5353) }, - Declaration { id: DeclarationId(591), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 6155, 6164) }, - Declaration { id: DeclarationId(592), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(191) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 6404, 6422) }, - Declaration { id: DeclarationId(593), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(39), arguments: vec![TemplateArgument { parameter: DeclarationId(40), value: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 7546, 7570) }, - Declaration { id: DeclarationId(594), name: Some("List".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Empty".to_string(), ty: DeclarationId(1424) }, Field { label: "Cons".to_string(), ty: DeclarationId(1426) }] }, type_params: vec![DeclarationId(595)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 2083, 2159) }, - Declaration { id: DeclarationId(595), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("element".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 2083, 2159) }, - Declaration { id: DeclarationId(596), name: Some("empty".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(1394), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 3273, 3284)) }, type_params: vec![DeclarationId(597)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3236, 3284) }, - Declaration { id: DeclarationId(597), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("element".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3236, 3284) }, - Declaration { id: DeclarationId(598), name: Some("cons".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(599), DeclarationId(1395)], output: DeclarationId(1396), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 3453, 3475)) }, type_params: vec![DeclarationId(599)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3383, 3475) }, - Declaration { id: DeclarationId(599), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("element".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3383, 3475) }, - Declaration { id: DeclarationId(600), name: Some("singleton".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(601)], output: DeclarationId(1397), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 3570, 3590)) }, type_params: vec![DeclarationId(601)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3519, 3590) }, - Declaration { id: DeclarationId(601), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("element".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3519, 3590) }, - Declaration { id: DeclarationId(602), name: Some("fold".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1398), DeclarationId(604), DeclarationId(1399)], output: DeclarationId(604), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 4203, 4307)) }, type_params: vec![DeclarationId(603), DeclarationId(604)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4142, 4307) }, - Declaration { id: DeclarationId(603), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4142, 4307) }, - Declaration { id: DeclarationId(604), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("U".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4142, 4307) }, - Declaration { id: DeclarationId(605), name: Some("fold_right".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1400), DeclarationId(607), DeclarationId(1401)], output: DeclarationId(607), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 4658, 4768)) }, type_params: vec![DeclarationId(606), DeclarationId(607)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4591, 4768) }, - Declaration { id: DeclarationId(606), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4591, 4768) }, - Declaration { id: DeclarationId(607), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("U".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4591, 4768) }, - Declaration { id: DeclarationId(608), name: Some("concat".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1402), DeclarationId(1403)], output: DeclarationId(1404), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 5386, 5414)) }, type_params: vec![DeclarationId(609)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5314, 5414) }, - Declaration { id: DeclarationId(609), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("element".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5314, 5414) }, - Declaration { id: DeclarationId(610), name: Some("map".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1405), DeclarationId(1406)], output: DeclarationId(1407), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 5721, 5778)) }, type_params: vec![DeclarationId(611), DeclarationId(612)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5667, 5778) }, - Declaration { id: DeclarationId(611), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("A".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5667, 5778) }, - Declaration { id: DeclarationId(612), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("B".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5667, 5778) }, - Declaration { id: DeclarationId(613), name: Some("filter".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1408), DeclarationId(1409)], output: DeclarationId(1410), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 5905, 5988)) }, type_params: vec![DeclarationId(614)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5848, 5988) }, - Declaration { id: DeclarationId(614), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5848, 5988) }, - Declaration { id: DeclarationId(615), name: Some("flat_map".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1411), DeclarationId(1413)], output: DeclarationId(1414), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 6171, 6230)) }, type_params: vec![DeclarationId(616), DeclarationId(617)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6106, 6230) }, - Declaration { id: DeclarationId(616), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("A".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6106, 6230) }, - Declaration { id: DeclarationId(617), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("B".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6106, 6230) }, - Declaration { id: DeclarationId(618), name: Some("length".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1415)], output: DeclarationId(71), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 6372, 6409)) }, type_params: vec![DeclarationId(619)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6337, 6409) }, - Declaration { id: DeclarationId(619), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6337, 6409) }, - Declaration { id: DeclarationId(620), name: Some("is_empty".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1416)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 6605, 6671)) }, type_params: vec![DeclarationId(621)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6567, 6671) }, - Declaration { id: DeclarationId(621), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6567, 6671) }, - Declaration { id: DeclarationId(622), name: Some("IndexedElement".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "index".to_string(), ty: DeclarationId(71) }, Field { label: "value".to_string(), ty: DeclarationId(623) }] }, type_params: vec![DeclarationId(623)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6993, 7055) }, - Declaration { id: DeclarationId(623), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("element".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6993, 7055) }, - Declaration { id: DeclarationId(624), name: Some("enumerate".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1417)], output: DeclarationId(1419), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 7238, 7269)) }, type_params: vec![DeclarationId(625)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7180, 7269) }, - Declaration { id: DeclarationId(625), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7180, 7269) }, - Declaration { id: DeclarationId(626), name: Some("enumerate_helper".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1420), DeclarationId(71)], output: DeclarationId(1422), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 7463, 7644)) }, type_params: vec![DeclarationId(627)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7386, 7644) }, - Declaration { id: DeclarationId(627), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7386, 7644) }, - Declaration { id: DeclarationId(628), name: Some("contains".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1423), DeclarationId(629)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 8205, 8332)) }, type_params: vec![DeclarationId(629)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 8156, 8332) }, - Declaration { id: DeclarationId(629), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 8156, 8332) }, - Declaration { id: DeclarationId(630), name: Some("NodeId".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1364, 1375) }, - Declaration { id: DeclarationId(631), name: Some("PortId".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1376, 1387) }, - Declaration { id: DeclarationId(632), name: Some("DeclarationId".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1388, 1406) }, - Declaration { id: DeclarationId(633), name: Some("ClusterId".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1407, 1421) }, - Declaration { id: DeclarationId(634), name: Some("NonEmptyList".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "first".to_string(), ty: DeclarationId(635) }, Field { label: "rest".to_string(), ty: DeclarationId(1427) }] }, type_params: vec![DeclarationId(635)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1423, 1492) }, - Declaration { id: DeclarationId(635), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("element".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1423, 1492) }, - Declaration { id: DeclarationId(636), name: Some("NonSingletonList".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "first".to_string(), ty: DeclarationId(637) }, Field { label: "second".to_string(), ty: DeclarationId(637) }, Field { label: "rest".to_string(), ty: DeclarationId(1428) }] }, type_params: vec![DeclarationId(637)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1494, 1585) }, - Declaration { id: DeclarationId(637), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("element".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1494, 1585) }, - Declaration { id: DeclarationId(638), name: Some("UrlPathToken".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "LiteralToken".to_string(), ty: DeclarationId(1443) }, Field { label: "ParamToken".to_string(), ty: DeclarationId(1444) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 7510, 7595) }, - Declaration { id: DeclarationId(639), name: Some("PathTemplate".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "tokens".to_string(), ty: DeclarationId(1445) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 7597, 7647) }, - Declaration { id: DeclarationId(640), name: Some("PathSegmentTokensResult".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ParsedSegmentTokens".to_string(), ty: DeclarationId(1447) }, Field { label: "MalformedPathSegment".to_string(), ty: DeclarationId(1448) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 8003, 8147) }, - Declaration { id: DeclarationId(641), name: Some("PathTemplateParseResult".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ParsedPathTemplate".to_string(), ty: DeclarationId(1449) }, Field { label: "MalformedPathTemplate".to_string(), ty: DeclarationId(1450) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 8477, 8630) }, - Declaration { id: DeclarationId(642), name: Some("parse_path_template".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(641), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 8695, 10000)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 8632, 10000) }, - Declaration { id: DeclarationId(643), name: Some("parse_segment_tokens".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(640), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 10066, 11705)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 10002, 11705) }, - Declaration { id: DeclarationId(644), name: Some("last_path_param".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(639)], output: DeclarationId(1429), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 11761, 12044)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 11707, 12044) }, - Declaration { id: DeclarationId(645), name: Some("IdempotentShape".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ReadEffect".to_string(), ty: DeclarationId(1451) }, Field { label: "UpsertEffect".to_string(), ty: DeclarationId(1452) }, Field { label: "DeleteEffect".to_string(), ty: DeclarationId(1453) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 14330, 14451) }, - Declaration { id: DeclarationId(646), name: Some("BreakingShape".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "CreateEffect".to_string(), ty: DeclarationId(1454) }, Field { label: "AppendEffect".to_string(), ty: DeclarationId(1455) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 14674, 14749) }, - Declaration { id: DeclarationId(647), name: Some("EffectShape".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "IsIdempotent".to_string(), ty: DeclarationId(1456) }, Field { label: "IsBreaking".to_string(), ty: DeclarationId(1457) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 15150, 15230) }, - Declaration { id: DeclarationId(648), name: Some("CreateCause".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "PostAlways".to_string(), ty: DeclarationId(1458) }, Field { label: "KeylessFallback".to_string(), ty: DeclarationId(1459) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 15722, 15796) }, - Declaration { id: DeclarationId(649), name: Some("KeySource".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "PathParam".to_string(), ty: DeclarationId(1460) }, Field { label: "InputField".to_string(), ty: DeclarationId(1461) }, Field { label: "CompositeKey".to_string(), ty: DeclarationId(1463) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 16482, 16603) }, - Declaration { id: DeclarationId(650), name: Some("IdempotencyEvidence".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "LatticeEffect".to_string(), ty: DeclarationId(1464) }, Field { label: "IdentityEffect".to_string(), ty: DeclarationId(1465) }, Field { label: "NonIdempotent".to_string(), ty: DeclarationId(1466) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 17251, 17349) }, - Declaration { id: DeclarationId(651), name: Some("is_idempotent_effect".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(647)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 17576, 17648)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 17524, 17648) }, - Declaration { id: DeclarationId(652), name: Some("derive_idempotency_evidence".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(647)], output: DeclarationId(650), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 17861, 18381)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 17787, 18381) }, - Declaration { id: DeclarationId(653), name: Some("OperationEffect".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "operation_name".to_string(), ty: DeclarationId(186) }, Field { label: "shape".to_string(), ty: DeclarationId(647) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 19065, 19135) }, - Declaration { id: DeclarationId(654), name: Some("DeriveOpEffectResult".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "DerivedEffect".to_string(), ty: DeclarationId(1467) }, Field { label: "UnknownHttpMethodInput".to_string(), ty: DeclarationId(1468) }, Field { label: "MalformedPathInput".to_string(), ty: DeclarationId(1469) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 19489, 19789) }, - Declaration { id: DeclarationId(655), name: Some("CompositionVerdict".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "IdempotentComposition".to_string(), ty: DeclarationId(1470) }, Field { label: "BrokenBy".to_string(), ty: DeclarationId(1472) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 20510, 20619) }, - Declaration { id: DeclarationId(656), name: Some("operation_is_breaking".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(653)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 20809, 20884)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 20755, 20884) }, - Declaration { id: DeclarationId(657), name: Some("breaker_ref".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71)], output: DeclarationId(1430), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 20944, 20966)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 20886, 20966) }, - Declaration { id: DeclarationId(658), name: Some("indexed_breaker_ref".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1431)], output: DeclarationId(1433), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 21060, 21153)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 20968, 21153) }, - Declaration { id: DeclarationId(659), name: Some("first_breaker_ref".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1434)], output: DeclarationId(1436), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 21240, 21423)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 21155, 21423) }, - Declaration { id: DeclarationId(660), name: Some("compose_effects".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1437)], output: DeclarationId(655), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 22313, 22436)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 22240, 22436) }, - Declaration { id: DeclarationId(661), name: Some("BoolPortRef".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "port".to_string(), ty: DeclarationId(631) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 23637, 23672) }, - Declaration { id: DeclarationId(662), name: Some("BranchArm".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "condition".to_string(), ty: DeclarationId(661) }, Field { label: "body".to_string(), ty: DeclarationId(663) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 23757, 23823) }, - Declaration { id: DeclarationId(663), name: Some("WorkflowEffect".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "LinearEffect".to_string(), ty: DeclarationId(1474) }, Field { label: "BranchEffect".to_string(), ty: DeclarationId(1476) }, Field { label: "LoopEffect".to_string(), ty: DeclarationId(1477) }, Field { label: "ParallelEffect".to_string(), ty: DeclarationId(1479) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 24499, 24727) }, - Declaration { id: DeclarationId(664), name: Some("IdempotencyUnsupportedDetail".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "variant_name".to_string(), ty: DeclarationId(186) }, Field { label: "downstream_stage".to_string(), ty: DeclarationId(186) }, Field { label: "reason".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 25086, 25190) }, - Declaration { id: DeclarationId(665), name: Some("WorkflowIdempotencyReport".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "WorkflowCompositionVerdict".to_string(), ty: DeclarationId(1480) }, Field { label: "IdempotencyUnsupported".to_string(), ty: DeclarationId(1481) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 25329, 25467) }, - Declaration { id: DeclarationId(666), name: Some("report_unsupported_workflow_variant".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(186), DeclarationId(186)], output: DeclarationId(665), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 25609, 25765)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 25469, 25765) }, - Declaration { id: DeclarationId(667), name: Some("ParallelismUnsupportedKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "NoWorkflowProjection".to_string(), ty: DeclarationId(1482) }, Field { label: "NotParallelEffectRoot".to_string(), ty: DeclarationId(1483) }, Field { label: "NonLinearParallelBranch".to_string(), ty: DeclarationId(1484) }, Field { label: "PairwiseNonCommute".to_string(), ty: DeclarationId(1485) }, Field { label: "LensSurfacePending".to_string(), ty: DeclarationId(1486) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 25928, 26084) }, - Declaration { id: DeclarationId(668), name: Some("ParallelismUnsupportedDetail".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "kind".to_string(), ty: DeclarationId(667) }, Field { label: "downstream_stage".to_string(), ty: DeclarationId(186) }, Field { label: "reason".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 26086, 26202) }, - Declaration { id: DeclarationId(669), name: Some("WorkflowParallelismReport".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ParallelCompositionVerdict".to_string(), ty: DeclarationId(1487) }, Field { label: "ParallelismUnsupported".to_string(), ty: DeclarationId(1488) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 26366, 26504) }, - Declaration { id: DeclarationId(670), name: Some("report_parallelism_unsupported".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(667), DeclarationId(186)], output: DeclarationId(669), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 26625, 26780)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 26506, 26780) }, - Declaration { id: DeclarationId(671), name: Some("lane2_workflow_idempotency_report".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(663)], output: DeclarationId(665), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 27018, 27848)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 26932, 27848) }, - Declaration { id: DeclarationId(672), name: Some("parse_http_method".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(1438), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 29707, 30005)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 29658, 30005) }, - Declaration { id: DeclarationId(673), name: Some("keyless_create".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(156)], output: DeclarationId(647), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 30060, 30136)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 30007, 30136) }, - Declaration { id: DeclarationId(674), name: Some("upsert_or_create".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1439), DeclarationId(156)], output: DeclarationId(647), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 30476, 30628)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 30400, 30628) }, - Declaration { id: DeclarationId(675), name: Some("delete_or_create".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1440), DeclarationId(156)], output: DeclarationId(647), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 30706, 30858)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 30630, 30858) }, - Declaration { id: DeclarationId(676), name: Some("derive_effect_shape".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(156), DeclarationId(639)], output: DeclarationId(647), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 30944, 31429)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 30860, 31429) }, - Declaration { id: DeclarationId(677), name: Some("derive_op_effect".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(186), DeclarationId(186)], output: DeclarationId(654), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 31545, 32387)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 31431, 32387) }, - Declaration { id: DeclarationId(678), name: Some("ModifierAgreement".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Agrees".to_string(), ty: DeclarationId(1489) }, Field { label: "Disagrees".to_string(), ty: DeclarationId(1490) }, Field { label: "DerivationUnknown".to_string(), ty: DeclarationId(1491) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 33087, 33204) }, - Declaration { id: DeclarationId(679), name: Some("ModifierAxisCheck".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ModifierNotDeclared".to_string(), ty: DeclarationId(1492) }, Field { label: "ModifierDeclared".to_string(), ty: DeclarationId(1493) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 33651, 33751) }, - Declaration { id: DeclarationId(680), name: Some("ModifierCheck".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "operation_name".to_string(), ty: DeclarationId(186) }, Field { label: "derived_shape".to_string(), ty: DeclarationId(647) }, Field { label: "idempotent_check".to_string(), ty: DeclarationId(679) }, Field { label: "readonly_check".to_string(), ty: DeclarationId(679) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 33753, 33903) }, - Declaration { id: DeclarationId(681), name: Some("classify_idempotent_disagreement".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(646)], output: DeclarationId(678), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 34542, 35084)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 34463, 35084) }, - Declaration { id: DeclarationId(682), name: Some("classify_readonly_agreement".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(647)], output: DeclarationId(678), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 35488, 35930)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 35416, 35930) }, - Declaration { id: DeclarationId(683), name: Some("check_modifier_vs_derivation".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(653), DeclarationId(88), DeclarationId(88)], output: DeclarationId(680), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 36062, 36711)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 35932, 36711) }, - Declaration { id: DeclarationId(684), name: Some("IdempotencyTestObligation".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "operation_name".to_string(), ty: DeclarationId(186) }, Field { label: "effect_shape".to_string(), ty: DeclarationId(647) }, Field { label: "claim".to_string(), ty: DeclarationId(186) }, Field { label: "witness_required".to_string(), ty: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 37063, 37191) }, - Declaration { id: DeclarationId(685), name: Some("generate_idempotency_obligations".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1441)], output: DeclarationId(1442), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 37296, 37566)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 37193, 37566) }, - Declaration { id: DeclarationId(686), name: Some("WorkflowEffectConcern".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "workflow_name".to_string(), ty: DeclarationId(186) }, Field { label: "create_op".to_string(), ty: DeclarationId(186) }, Field { label: "reason".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 37883, 37974) }, - Declaration { id: DeclarationId(687), name: Some("TypeShape".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "declaration".to_string(), ty: DeclarationId(632) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 247, 294) }, - Declaration { id: DeclarationId(688), name: Some("PortState".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Uninferred".to_string(), ty: DeclarationId(1501) }, Field { label: "Resolved".to_string(), ty: DeclarationId(1502) }, Field { label: "Unresolved".to_string(), ty: DeclarationId(1503) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 437, 505) }, - Declaration { id: DeclarationId(689), name: Some("DagPort".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "id".to_string(), ty: DeclarationId(631) }, Field { label: "state".to_string(), ty: DeclarationId(688) }, Field { label: "produced_by".to_string(), ty: DeclarationId(1504) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 507, 578) }, - Declaration { id: DeclarationId(690), name: Some("LiteralBits".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "LitInt".to_string(), ty: DeclarationId(1505) }, Field { label: "LitBool".to_string(), ty: DeclarationId(1506) }, Field { label: "LitString".to_string(), ty: DeclarationId(1507) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 747, 819) }, - Declaration { id: DeclarationId(691), name: Some("AtomPayload".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Literal".to_string(), ty: DeclarationId(1508) }, Field { label: "UnresolvedIdentifier".to_string(), ty: DeclarationId(1509) }, Field { label: "ResolvedByStructure".to_string(), ty: DeclarationId(1510) }, Field { label: "ResolvedByName".to_string(), ty: DeclarationId(1511) }, Field { label: "TypeParam".to_string(), ty: DeclarationId(1512) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 2829, 2998) }, - Declaration { id: DeclarationId(692), name: Some("PositiveIntervalWidth".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "OneUnit".to_string(), ty: DeclarationId(1513) }, Field { label: "AdditionalUnit".to_string(), ty: DeclarationId(1514) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 3571, 3664) }, - Declaration { id: DeclarationId(693), name: Some("IntervalWidth".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ZeroWidth".to_string(), ty: DeclarationId(1515) }, Field { label: "PositiveWidth".to_string(), ty: DeclarationId(1516) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 3666, 3739) }, - Declaration { id: DeclarationId(694), name: Some("Interval".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "BoundedInterval".to_string(), ty: DeclarationId(1517) }, Field { label: "Unbounded".to_string(), ty: DeclarationId(1518) }] }, type_params: vec![DeclarationId(695)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4030, 4115) }, - Declaration { id: DeclarationId(695), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("D".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4030, 4115) }, - Declaration { id: DeclarationId(696), name: Some("CardinalityBound".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Exact".to_string(), ty: DeclarationId(1519) }, Field { label: "AtMostOne".to_string(), ty: DeclarationId(1520) }, Field { label: "Unbounded".to_string(), ty: DeclarationId(1521) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4340, 4404) }, - Declaration { id: DeclarationId(697), name: Some("ConjField".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "label".to_string(), ty: DeclarationId(186) }, Field { label: "ty".to_string(), ty: DeclarationId(632) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4406, 4460) }, - Declaration { id: DeclarationId(698), name: Some("TemplateArgument".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "parameter".to_string(), ty: DeclarationId(632) }, Field { label: "value".to_string(), ty: DeclarationId(632) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4462, 4537) }, - Declaration { id: DeclarationId(699), name: Some("FieldEntry".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "label".to_string(), ty: DeclarationId(186) }, Field { label: "value".to_string(), ty: DeclarationId(700) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4539, 4594) }, - Declaration { id: DeclarationId(700), name: Some("FieldValue".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Literal".to_string(), ty: DeclarationId(1522) }, Field { label: "Reference".to_string(), ty: DeclarationId(1523) }, Field { label: "Record".to_string(), ty: DeclarationId(1525) }, Field { label: "List".to_string(), ty: DeclarationId(1527) }, Field { label: "Map".to_string(), ty: DeclarationId(1529) }, Field { label: "Variant".to_string(), ty: DeclarationId(1531) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4811, 5047) }, - Declaration { id: DeclarationId(701), name: Some("ValueBody".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ValueBodyUnparsed".to_string(), ty: DeclarationId(1532) }, Field { label: "ValueBodyStructural".to_string(), ty: DeclarationId(1534) }, Field { label: "ValueBodyMap".to_string(), ty: DeclarationId(1536) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5187, 5323) }, - Declaration { id: DeclarationId(702), name: Some("ArrowBody".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "UserDefined".to_string(), ty: DeclarationId(1537) }, Field { label: "ExternalRealization".to_string(), ty: DeclarationId(1538) }, Field { label: "Pending".to_string(), ty: DeclarationId(1539) }, Field { label: "NoBody".to_string(), ty: DeclarationId(1540) }, Field { label: "Unparsed".to_string(), ty: DeclarationId(1541) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5639, 5764) }, - Declaration { id: DeclarationId(703), name: Some("TypeConnective".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Atom".to_string(), ty: DeclarationId(1542) }, Field { label: "Conj".to_string(), ty: DeclarationId(1544) }, Field { label: "Disj".to_string(), ty: DeclarationId(1546) }, Field { label: "Arrow".to_string(), ty: DeclarationId(1548) }, Field { label: "Cardinality".to_string(), ty: DeclarationId(1549) }, Field { label: "Instantiation".to_string(), ty: DeclarationId(1551) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5969, 6369) }, - Declaration { id: DeclarationId(704), name: Some("Declaration".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "id".to_string(), ty: DeclarationId(632) }, Field { label: "name".to_string(), ty: DeclarationId(1552) }, Field { label: "connective".to_string(), ty: DeclarationId(703) }, Field { label: "type_params".to_string(), ty: DeclarationId(1553) }, Field { label: "phantom_params".to_string(), ty: DeclarationId(1554) }, Field { label: "meta_tag".to_string(), ty: DeclarationId(1555) }, Field { label: "inhabits".to_string(), ty: DeclarationId(1556) }, Field { label: "value_body".to_string(), ty: DeclarationId(1557) }, Field { label: "nominal_opacity".to_string(), ty: DeclarationId(1558) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6371, 6665) }, - Declaration { id: DeclarationId(705), name: Some("PhantomParameter".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "parameter".to_string(), ty: DeclarationId(632) }, Field { label: "algebra".to_string(), ty: DeclarationId(632) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 7138, 7215) }, - Declaration { id: DeclarationId(706), name: Some("NominalOpacity".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "permitted_accessors".to_string(), ty: DeclarationId(1559) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 7722, 7788) }, - Declaration { id: DeclarationId(707), name: Some("ArithmeticOp".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Add".to_string(), ty: DeclarationId(1560) }, Field { label: "Sub".to_string(), ty: DeclarationId(1561) }, Field { label: "Mul".to_string(), ty: DeclarationId(1562) }, Field { label: "Div".to_string(), ty: DeclarationId(1563) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8045, 8094) }, - Declaration { id: DeclarationId(708), name: Some("ComparisonOp".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Eq".to_string(), ty: DeclarationId(1564) }, Field { label: "Ne".to_string(), ty: DeclarationId(1565) }, Field { label: "Lt".to_string(), ty: DeclarationId(1566) }, Field { label: "Le".to_string(), ty: DeclarationId(1567) }, Field { label: "Gt".to_string(), ty: DeclarationId(1568) }, Field { label: "Ge".to_string(), ty: DeclarationId(1569) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8196, 8255) }, - Declaration { id: DeclarationId(709), name: Some("LogicalOp".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "And".to_string(), ty: DeclarationId(1570) }, Field { label: "Or".to_string(), ty: DeclarationId(1571) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8489, 8518) }, - Declaration { id: DeclarationId(710), name: Some("OperatorKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Arithmetic".to_string(), ty: DeclarationId(1572) }, Field { label: "Comparison".to_string(), ty: DeclarationId(1573) }, Field { label: "Logical".to_string(), ty: DeclarationId(1574) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8732, 8830) }, - Declaration { id: DeclarationId(711), name: Some("TransformTarget".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Callable".to_string(), ty: DeclarationId(1575) }, Field { label: "FieldProject".to_string(), ty: DeclarationId(1577) }, Field { label: "Operator".to_string(), ty: DeclarationId(1578) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8992, 9152) }, - Declaration { id: DeclarationId(712), name: Some("BranchPattern".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "UnresolvedVariant".to_string(), ty: DeclarationId(1579) }, Field { label: "ResolvedVariant".to_string(), ty: DeclarationId(1580) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9254, 9364) }, - Declaration { id: DeclarationId(713), name: Some("PayloadBinding".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "binding_name".to_string(), ty: DeclarationId(186) }, Field { label: "payload_port".to_string(), ty: DeclarationId(631) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9366, 9435) }, - Declaration { id: DeclarationId(714), name: Some("BranchPath".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "body".to_string(), ty: DeclarationId(630) }, Field { label: "result_port".to_string(), ty: DeclarationId(631) }, Field { label: "pattern".to_string(), ty: DeclarationId(712) }, Field { label: "binding".to_string(), ty: DeclarationId(1581) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9437, 9545) }, - Declaration { id: DeclarationId(715), name: Some("ParamRef".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "member".to_string(), ty: DeclarationId(630) }, Field { label: "slot".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 10144, 10190) }, - Declaration { id: DeclarationId(716), name: Some("TransformRef".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "node".to_string(), ty: DeclarationId(630) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 10702, 10738) }, - Declaration { id: DeclarationId(717), name: Some("ElementRef".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "index".to_string(), ty: DeclarationId(71) }] }, type_params: vec![DeclarationId(718)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 11355, 11396) }, - Declaration { id: DeclarationId(718), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("element".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 11355, 11396) }, - Declaration { id: DeclarationId(719), name: Some("MemberDescent".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(715) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 11398, 11438) }, - Declaration { id: DeclarationId(720), name: Some("IntraClusterCall".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "transform".to_string(), ty: DeclarationId(716) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 11440, 11491) }, - Declaration { id: DeclarationId(721), name: Some("Cluster".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "members".to_string(), ty: DeclarationId(1582) }, Field { label: "intra_cluster_calls".to_string(), ty: DeclarationId(1583) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 11493, 11606) }, - Declaration { id: DeclarationId(722), name: Some("LoopBound".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Cardinality".to_string(), ty: DeclarationId(1584) }, Field { label: "Descent".to_string(), ty: DeclarationId(1585) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12011, 12094) }, - Declaration { id: DeclarationId(723), name: Some("ValueNode".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "id".to_string(), ty: DeclarationId(630) }, Field { label: "payload".to_string(), ty: DeclarationId(690) }, Field { label: "result_port".to_string(), ty: DeclarationId(631) }, Field { label: "span".to_string(), ty: DeclarationId(121) }, Field { label: "lane2_workflow".to_string(), ty: DeclarationId(1586) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12096, 12225) }, - Declaration { id: DeclarationId(724), name: Some("TransformNode".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "id".to_string(), ty: DeclarationId(630) }, Field { label: "target".to_string(), ty: DeclarationId(711) }, Field { label: "inputs".to_string(), ty: DeclarationId(1587) }, Field { label: "result_port".to_string(), ty: DeclarationId(631) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12227, 12352) }, - Declaration { id: DeclarationId(725), name: Some("BranchEmitParticipation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1588), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12517, 12559) }, - Declaration { id: DeclarationId(726), name: Some("BranchNode".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "id".to_string(), ty: DeclarationId(630) }, Field { label: "input".to_string(), ty: DeclarationId(631) }, Field { label: "paths".to_string(), ty: DeclarationId(1589) }, Field { label: "result_port".to_string(), ty: DeclarationId(631) }, Field { label: "span".to_string(), ty: DeclarationId(121) }, Field { label: "emit_participation".to_string(), ty: DeclarationId(1590) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12561, 12723) }, - Declaration { id: DeclarationId(727), name: Some("LoopNode".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "id".to_string(), ty: DeclarationId(630) }, Field { label: "source".to_string(), ty: DeclarationId(631) }, Field { label: "init".to_string(), ty: DeclarationId(631) }, Field { label: "body".to_string(), ty: DeclarationId(630) }, Field { label: "bound".to_string(), ty: DeclarationId(722) }, Field { label: "result_port".to_string(), ty: DeclarationId(631) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12725, 12862) }, - Declaration { id: DeclarationId(728), name: Some("BindEmitParticipation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1591), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13104, 13147) }, - Declaration { id: DeclarationId(729), name: Some("BindNode".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "id".to_string(), ty: DeclarationId(630) }, Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "result_port".to_string(), ty: DeclarationId(631) }, Field { label: "params".to_string(), ty: DeclarationId(1592) }, Field { label: "span".to_string(), ty: DeclarationId(121) }, Field { label: "lane2_workflow".to_string(), ty: DeclarationId(1593) }, Field { label: "emit_participation".to_string(), ty: DeclarationId(1594) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13149, 13337) }, - Declaration { id: DeclarationId(730), name: Some("Behavior".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Value".to_string(), ty: DeclarationId(1595) }, Field { label: "Transform".to_string(), ty: DeclarationId(1596) }, Field { label: "Branch".to_string(), ty: DeclarationId(1597) }, Field { label: "Loop".to_string(), ty: DeclarationId(1598) }, Field { label: "Bind".to_string(), ty: DeclarationId(1599) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13409, 13533) }, - Declaration { id: DeclarationId(731), name: Some("Dag".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "declarations".to_string(), ty: DeclarationId(1600) }, Field { label: "nodes".to_string(), ty: DeclarationId(1601) }, Field { label: "ports".to_string(), ty: DeclarationId(1602) }, Field { label: "clusters".to_string(), ty: DeclarationId(1603) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13535, 13654) }, - Declaration { id: DeclarationId(732), name: Some("SubstrateAccessorRealization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "carrier".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 15006, 15061) }, - Declaration { id: DeclarationId(733), name: Some("SubstrateAccessorBinding".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "accessor".to_string(), ty: DeclarationId(1021) }, Field { label: "realization".to_string(), ty: DeclarationId(1021) }, Field { label: "language".to_string(), ty: DeclarationId(1021) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 15828, 15945) }, - Declaration { id: DeclarationId(734), name: Some("port".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(731), DeclarationId(631)], output: DeclarationId(1494), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/substrate.dag", 15987, 16002)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 15947, 16002) }, - Declaration { id: DeclarationId(735), name: Some("node".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(731), DeclarationId(630)], output: DeclarationId(1495), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/substrate.dag", 16045, 16060)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 16004, 16060) }, - Declaration { id: DeclarationId(736), name: Some("resolve_producer".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(731), DeclarationId(631)], output: DeclarationId(1496), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/substrate.dag", 16120, 16147)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 16062, 16147) }, - Declaration { id: DeclarationId(737), name: Some("declaration_by_id".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(731), DeclarationId(632)], output: DeclarationId(1497), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/substrate.dag", 16509, 16537)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 16445, 16537) }, - Declaration { id: DeclarationId(738), name: Some("lane2_workflow_at".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(731), DeclarationId(630)], output: DeclarationId(1498), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/substrate.dag", 16833, 16868)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 16773, 16868) }, - Declaration { id: DeclarationId(739), name: Some("miss_declaration_id_lookup".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(1499), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/substrate.dag", 17225, 17235)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 17168, 17235) }, - Declaration { id: DeclarationId(740), name: Some("hit_declaration_id_lookup".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(632)], output: DeclarationId(1500), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/substrate.dag", 17310, 17323)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 17237, 17323) }, - Declaration { id: DeclarationId(741), name: Some("MethodRef".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "decl".to_string(), ty: DeclarationId(1021) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/methods.dag", 1474, 1515) }, - Declaration { id: DeclarationId(742), name: Some("CollectionSizeEffect".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ShrinkEffect".to_string(), ty: DeclarationId(1623) }, Field { label: "ProjectionEffect".to_string(), ty: DeclarationId(1624) }, Field { label: "IdentityEffect".to_string(), ty: DeclarationId(1625) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 4775, 4857) }, - Declaration { id: DeclarationId(743), name: Some("CostShape".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ShapeConstant".to_string(), ty: DeclarationId(1626) }, Field { label: "ShapeLinearScan".to_string(), ty: DeclarationId(1627) }, Field { label: "ShapeIterateBody".to_string(), ty: DeclarationId(1628) }, Field { label: "ShapeSortBody".to_string(), ty: DeclarationId(1629) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 5688, 5779) }, - Declaration { id: DeclarationId(744), name: Some("MethodContract".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "algebra_id".to_string(), ty: DeclarationId(632) }, Field { label: "method_id".to_string(), ty: DeclarationId(632) }, Field { label: "size_effect".to_string(), ty: DeclarationId(1630) }, Field { label: "cost_shape".to_string(), ty: DeclarationId(1631) }, Field { label: "callback_element_position".to_string(), ty: DeclarationId(1632) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 6540, 6714) }, - Declaration { id: DeclarationId(745), name: Some("SizeVariable".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "source_port".to_string(), ty: DeclarationId(631) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 7365, 7408) }, - Declaration { id: DeclarationId(746), name: Some("DegreeAtLeastTwo".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "DegreeTwo".to_string(), ty: DeclarationId(1633) }, Field { label: "DegreeSuccessor".to_string(), ty: DeclarationId(1634) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8155, 8241) }, - Declaration { id: DeclarationId(747), name: Some("SymbolicCost".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ConstantCost".to_string(), ty: DeclarationId(1635) }, Field { label: "LinearCost".to_string(), ty: DeclarationId(1636) }, Field { label: "PolynomialCost".to_string(), ty: DeclarationId(1637) }, Field { label: "ProductCost".to_string(), ty: DeclarationId(1639) }, Field { label: "SumCost".to_string(), ty: DeclarationId(1641) }, Field { label: "LogCost".to_string(), ty: DeclarationId(1642) }, Field { label: "UnknownCost".to_string(), ty: DeclarationId(1643) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8391, 8668) }, - Declaration { id: DeclarationId(748), name: Some("DominateScanAcc".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "any".to_string(), ty: DeclarationId(88) }, Field { label: "pivot".to_string(), ty: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 9074, 9132) }, - Declaration { id: DeclarationId(749), name: Some("dominate_scan_init".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(747)], output: DeclarationId(748), body: ArrowBody::UserDefined(NodeId(2)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 9134, 9229) }, - Declaration { id: DeclarationId(750), name: Some("miss_symbolic_cost_lookup".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(1604), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/algebra.dag", 9870, 9880)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 9815, 9880) }, - Declaration { id: DeclarationId(751), name: Some("hit_symbolic_cost_lookup".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(747)], output: DeclarationId(1605), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/algebra.dag", 9954, 9969)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 9882, 9969) }, - Declaration { id: DeclarationId(752), name: Some("two_terms".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(747), DeclarationId(747)], output: DeclarationId(1606), body: ArrowBody::UserDefined(NodeId(6)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 9971, 10446) }, - Declaration { id: DeclarationId(753), name: Some("many_terms".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(747), DeclarationId(747), DeclarationId(1607)], output: DeclarationId(1608), body: ArrowBody::UserDefined(NodeId(8)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 10448, 10633) }, - Declaration { id: DeclarationId(754), name: Some("reject_all_symbolic_costs".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(747)], output: DeclarationId(88), body: ArrowBody::UserDefined(NodeId(13)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 10635, 10763) }, - Declaration { id: DeclarationId(755), name: Some("degree_raw".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(746)], output: DeclarationId(71), body: ArrowBody::UserDefined(NodeId(21)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 10765, 10918) }, - Declaration { id: DeclarationId(756), name: Some("sequential".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(747), DeclarationId(747)], output: DeclarationId(747), body: ArrowBody::UserDefined(NodeId(25)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 11154, 11257) }, - Declaration { id: DeclarationId(757), name: Some("iterate".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(747), DeclarationId(747)], output: DeclarationId(747), body: ArrowBody::UserDefined(NodeId(29)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 11443, 11561) }, - Declaration { id: DeclarationId(758), name: Some("max_path_step".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(747), DeclarationId(747)], output: DeclarationId(747), body: ArrowBody::UserDefined(NodeId(33)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 12421, 12588) }, - Declaration { id: DeclarationId(759), name: Some("keep_or_sum".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(747), DeclarationId(747)], output: DeclarationId(747), body: ArrowBody::UserDefined(NodeId(37)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 12590, 12748) }, - Declaration { id: DeclarationId(760), name: Some("max_path".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1609)], output: DeclarationId(747), body: ArrowBody::UserDefined(NodeId(41)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 13050, 13152) }, - Declaration { id: DeclarationId(761), name: Some("dominates".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(747), DeclarationId(747)], output: DeclarationId(88), body: ArrowBody::UserDefined(NodeId(94)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 14020, 16105) }, - Declaration { id: DeclarationId(762), name: Some("same_size_variable".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(745), DeclarationId(745)], output: DeclarationId(88), body: ArrowBody::UserDefined(NodeId(98)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 16107, 16205) }, - Declaration { id: DeclarationId(763), name: Some("normalize".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(747)], output: DeclarationId(747), body: ArrowBody::UserDefined(NodeId(106)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 16963, 17266) }, - Declaration { id: DeclarationId(764), name: Some("nsl_to_list".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1610)], output: DeclarationId(1611), body: ArrowBody::UserDefined(NodeId(112)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17268, 17397) }, - Declaration { id: DeclarationId(765), name: Some("drop_zero".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1612)], output: DeclarationId(1613), body: ArrowBody::UserDefined(NodeId(125)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17574, 17839) }, - Declaration { id: DeclarationId(766), name: Some("is_zero_constant".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(747)], output: DeclarationId(88), body: ArrowBody::UserDefined(NodeId(135)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17841, 18095) }, - Declaration { id: DeclarationId(767), name: Some("reduce_sum".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1614)], output: DeclarationId(747), body: ArrowBody::UserDefined(NodeId(147)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 18880, 19151) }, - Declaration { id: DeclarationId(768), name: Some("wrap_sum".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1615)], output: DeclarationId(747), body: ArrowBody::UserDefined(NodeId(159)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 19153, 19428) }, - Declaration { id: DeclarationId(769), name: Some("reduce_product".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1616)], output: DeclarationId(747), body: ArrowBody::UserDefined(NodeId(176)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 19613, 20034) }, - Declaration { id: DeclarationId(770), name: Some("combine_binary_product".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(747), DeclarationId(747)], output: DeclarationId(747), body: ArrowBody::UserDefined(NodeId(185)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 20199, 20586) }, - Declaration { id: DeclarationId(771), name: Some("combine_linear_with".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(745), DeclarationId(747), DeclarationId(747)], output: DeclarationId(747), body: ArrowBody::UserDefined(NodeId(194)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 20588, 20997) }, - Declaration { id: DeclarationId(772), name: Some("collapse_linear_square".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(745), DeclarationId(745), DeclarationId(747), DeclarationId(747)], output: DeclarationId(747), body: ArrowBody::UserDefined(NodeId(199)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 20999, 21215) }, - Declaration { id: DeclarationId(773), name: Some("polynomial_square".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(745)], output: DeclarationId(747), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/algebra.dag", 21271, 21321)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21217, 21321) }, - Declaration { id: DeclarationId(774), name: Some("product_pair".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(747), DeclarationId(747)], output: DeclarationId(747), body: ArrowBody::UserDefined(NodeId(202)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21323, 21421) }, - Declaration { id: DeclarationId(775), name: Some("fold_or_dominate_scan".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(748), DeclarationId(747)], output: DeclarationId(748), body: ArrowBody::UserDefined(NodeId(209)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21423, 21572) }, - Declaration { id: DeclarationId(776), name: Some("scan_hit".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(748)], output: DeclarationId(88), body: ArrowBody::UserDefined(NodeId(211)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21574, 21629) }, - Declaration { id: DeclarationId(777), name: Some("filter_not_dominated_by".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1617), DeclarationId(747)], output: DeclarationId(1618), body: ArrowBody::UserDefined(NodeId(224)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21631, 21993) }, - Declaration { id: DeclarationId(778), name: Some("drop_dominated_step".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1619), DeclarationId(747)], output: DeclarationId(1620), body: ArrowBody::UserDefined(NodeId(231)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21995, 22237) }, - Declaration { id: DeclarationId(779), name: Some("drop_dominated".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1621)], output: DeclarationId(1622), body: ArrowBody::UserDefined(NodeId(234)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 22425, 22537) }, - Declaration { id: DeclarationId(780), name: Some("CleanEmissionContract".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "expression_wrapping".to_string(), ty: DeclarationId(782) }, Field { label: "pattern_bindings".to_string(), ty: DeclarationId(783) }, Field { label: "variant_payload_field_access".to_string(), ty: DeclarationId(784) }, Field { label: "imports".to_string(), ty: DeclarationId(785) }, Field { label: "block_return".to_string(), ty: DeclarationId(786) }, Field { label: "variable_bindings".to_string(), ty: DeclarationId(787) }, Field { label: "match_arm_body".to_string(), ty: DeclarationId(788) }, Field { label: "correction_style".to_string(), ty: DeclarationId(789) }, Field { label: "post_emit_verifier".to_string(), ty: DeclarationId(790) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 562, 944) }, - Declaration { id: DeclarationId(781), name: Some("TargetCleanEmissionBinding".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "language".to_string(), ty: DeclarationId(883) }, Field { label: "clean_emission".to_string(), ty: DeclarationId(780) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 1748, 1848) }, - Declaration { id: DeclarationId(782), name: Some("ExpressionWrappingRule".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "WrapEverything".to_string(), ty: DeclarationId(1667) }, Field { label: "WrapOnlyInOperandPosition".to_string(), ty: DeclarationId(1668) }, Field { label: "NoWrapping".to_string(), ty: DeclarationId(1669) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 2192, 2283) }, - Declaration { id: DeclarationId(783), name: Some("PatternBindingRule".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "EmitBindingAlways".to_string(), ty: DeclarationId(1670) }, Field { label: "EmitUnderscoreWhenUnused".to_string(), ty: DeclarationId(1671) }, Field { label: "EmitPrefixedUnderscoreWhenUnused".to_string(), ty: DeclarationId(1672) }, Field { label: "NotApplicablePatternBinding".to_string(), ty: DeclarationId(1673) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 2520, 2663) }, - Declaration { id: DeclarationId(784), name: Some("VariantPayloadFieldAccessRule".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "AccessFromPayloadBinding".to_string(), ty: DeclarationId(1674) }, Field { label: "OverrideNamedFieldsAtBindingSite".to_string(), ty: DeclarationId(1675) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3330, 3430) }, - Declaration { id: DeclarationId(785), name: Some("ImportRule".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ImportEverythingDeclared".to_string(), ty: DeclarationId(1676) }, Field { label: "IncludeOnlyReferenced".to_string(), ty: DeclarationId(1677) }, Field { label: "ImportPerUsageSite".to_string(), ty: DeclarationId(1678) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3544, 3637) }, - Declaration { id: DeclarationId(786), name: Some("BlockReturnRule".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "WrapReturnValue".to_string(), ty: DeclarationId(1679) }, Field { label: "NoWrappingOnTerminalExpression".to_string(), ty: DeclarationId(1680) }, Field { label: "ExplicitReturnKeyword".to_string(), ty: DeclarationId(1681) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3756, 3857) }, - Declaration { id: DeclarationId(787), name: Some("VariableBindingRule".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "EmitLetBindingAlways".to_string(), ty: DeclarationId(1682) }, Field { label: "EmitLetUnderscoreWhenUnused".to_string(), ty: DeclarationId(1683) }, Field { label: "OmitLetBinding".to_string(), ty: DeclarationId(1684) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3995, 4095) }, - Declaration { id: DeclarationId(788), name: Some("MatchArmBodyRule".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "WrapBody".to_string(), ty: DeclarationId(1685) }, Field { label: "NoWrappingOnNonComplexBody".to_string(), ty: DeclarationId(1686) }, Field { label: "NotApplicableMatchArmBody".to_string(), ty: DeclarationId(1687) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 4328, 4423) }, - Declaration { id: DeclarationId(789), name: Some("CorrectionStyle".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "indent_unit".to_string(), ty: DeclarationId(186) }, Field { label: "line_ending".to_string(), ty: DeclarationId(186) }, Field { label: "string_quote".to_string(), ty: DeclarationId(186) }, Field { label: "trailing_semicolon".to_string(), ty: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 4736, 4854) }, - Declaration { id: DeclarationId(790), name: Some("PostEmitVerifier".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "command".to_string(), ty: DeclarationId(186) }, Field { label: "args".to_string(), ty: DeclarationId(1688) }, Field { label: "syntax_only".to_string(), ty: DeclarationId(88) }, Field { label: "expected_exit_code".to_string(), ty: DeclarationId(71) }, Field { label: "output_policy".to_string(), ty: DeclarationId(791) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 5270, 5418) }, - Declaration { id: DeclarationId(791), name: Some("VerifierOutputPolicy".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "IgnoreVerifierOutput".to_string(), ty: DeclarationId(1689) }, Field { label: "RequireEmptyStdout".to_string(), ty: DeclarationId(1690) }, Field { label: "RequireEmptyStderr".to_string(), ty: DeclarationId(1691) }, Field { label: "RequireEmptyStdoutAndStderr".to_string(), ty: DeclarationId(1692) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 5663, 5791) }, - Declaration { id: DeclarationId(792), name: Some("SizeBound".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "CollectionSize".to_string(), ty: DeclarationId(1697) }, Field { label: "ParserStreamSize".to_string(), ty: DeclarationId(1698) }, Field { label: "WorklistDrainSize".to_string(), ty: DeclarationId(1699) }, Field { label: "TreeSize".to_string(), ty: DeclarationId(1700) }, Field { label: "ArithmeticParam".to_string(), ty: DeclarationId(1701) }, Field { label: "ExplicitCountZero".to_string(), ty: DeclarationId(1702) }, Field { label: "ExplicitCountPositive".to_string(), ty: DeclarationId(1703) }, Field { label: "Forever".to_string(), ty: DeclarationId(1704) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1337, 1633) }, - Declaration { id: DeclarationId(793), name: Some("tree_size_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(792), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/computation.dag", 1682, 1713)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1635, 1713) }, - Declaration { id: DeclarationId(794), name: Some("positive_descent_count".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(976)], output: DeclarationId(71), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/computation.dag", 1778, 1893)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1715, 1893) }, - Declaration { id: DeclarationId(795), name: Some("CallPattern".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ChildAccessorCall".to_string(), ty: DeclarationId(1705) }, Field { label: "CollectionShrinkCall".to_string(), ty: DeclarationId(1706) }, Field { label: "ArithmeticSubtractCall".to_string(), ty: DeclarationId(1707) }, Field { label: "ArithmeticDivideCall".to_string(), ty: DeclarationId(1708) }, Field { label: "ParserAdvanceCall".to_string(), ty: DeclarationId(1709) }, Field { label: "WorklistDrainCall".to_string(), ty: DeclarationId(1710) }, Field { label: "FoldBodyCall".to_string(), ty: DeclarationId(1711) }, Field { label: "SameArgumentCall".to_string(), ty: DeclarationId(1712) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2144, 2591) }, - Declaration { id: DeclarationId(796), name: Some("ShrinkFactor".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "UnitShrink".to_string(), ty: DeclarationId(1713) }, Field { label: "ConstantShrink".to_string(), ty: DeclarationId(1714) }, Field { label: "ProportionalShrink".to_string(), ty: DeclarationId(1715) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2781, 2921) }, - Declaration { id: DeclarationId(797), name: Some("IterationPrimitive".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Fold".to_string(), ty: DeclarationId(1716) }, Field { label: "Descend".to_string(), ty: DeclarationId(1717) }, Field { label: "Repeat".to_string(), ty: DeclarationId(1718) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 3083, 3138) }, - Declaration { id: DeclarationId(798), name: Some("LoweringTarget".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "primitive".to_string(), ty: DeclarationId(797) }, Field { label: "bound".to_string(), ty: DeclarationId(792) }, Field { label: "evidence".to_string(), ty: DeclarationId(968) }, Field { label: "factor".to_string(), ty: DeclarationId(1719) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 3330, 3456) }, - Declaration { id: DeclarationId(799), name: Some("lower_call_pattern".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(795)], output: DeclarationId(798), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/computation.dag", 3767, 5318)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 3705, 5318) }, - Declaration { id: DeclarationId(800), name: Some("size_bound_param".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(792)], output: DeclarationId(1693), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/computation.dag", 5369, 5794)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 5320, 5794) }, - Declaration { id: DeclarationId(801), name: Some("is_constant_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(792)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/computation.dag", 5843, 6014)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 5796, 6014) }, - Declaration { id: DeclarationId(802), name: Some("forever_iteration_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(71), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/computation.dag", 6131, 6154)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 6095, 6154) }, - Declaration { id: DeclarationId(803), name: Some("constant_bound_value".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(792)], output: DeclarationId(1694), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/computation.dag", 6297, 6569)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 6247, 6569) }, - Declaration { id: DeclarationId(804), name: Some("IterationDimension".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "TreeDescent".to_string(), ty: DeclarationId(1720) }, Field { label: "CollectionFold".to_string(), ty: DeclarationId(1721) }, Field { label: "ArithmeticRepeat".to_string(), ty: DeclarationId(1722) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 7054, 7237) }, - Declaration { id: DeclarationId(805), name: Some("algebra_profile_to_dimension".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(47)], output: DeclarationId(1695), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/computation.dag", 7370, 7863)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 7290, 7863) }, - Declaration { id: DeclarationId(806), name: Some("type_iteration_dimension".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(1696), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/computation.dag", 7935, 8154)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 7865, 8154) }, - Declaration { id: DeclarationId(807), name: Some("Mutability".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Immutable".to_string(), ty: DeclarationId(1723) }, Field { label: "Mutable".to_string(), ty: DeclarationId(1724) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 340, 381) }, - Declaration { id: DeclarationId(808), name: Some("Purity".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Pure".to_string(), ty: DeclarationId(1725) }, Field { label: "Effectful".to_string(), ty: DeclarationId(1726) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 598, 632) }, - Declaration { id: DeclarationId(809), name: Some("Structure".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ExplicitDAG".to_string(), ty: DeclarationId(1727) }, Field { label: "Arbitrary".to_string(), ty: DeclarationId(1728) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 891, 935) }, - Declaration { id: DeclarationId(810), name: Some("Iteration".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Bounded".to_string(), ty: DeclarationId(1729) }, Field { label: "Unbounded".to_string(), ty: DeclarationId(1730) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 1147, 1187) }, - Declaration { id: DeclarationId(811), name: Some("ComputationModel".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "mutability".to_string(), ty: DeclarationId(807) }, Field { label: "purity".to_string(), ty: DeclarationId(808) }, Field { label: "structure".to_string(), ty: DeclarationId(809) }, Field { label: "iteration".to_string(), ty: DeclarationId(810) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 1387, 1500) }, - Declaration { id: DeclarationId(812), name: Some("dag_model".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(811), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(811)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("mutability".to_string(), FieldValue::Variant { constructor: DeclarationId(1723), payload: vec![] }), ("purity".to_string(), FieldValue::Variant { constructor: DeclarationId(1725), payload: vec![] }), ("structure".to_string(), FieldValue::Variant { constructor: DeclarationId(1727), payload: vec![] }), ("iteration".to_string(), FieldValue::Variant { constructor: DeclarationId(1729), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 1502, 1625) }, - Declaration { id: DeclarationId(813), name: Some("MemoryModel".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ValueOnly".to_string(), ty: DeclarationId(1731) }, Field { label: "GarbageCollected".to_string(), ty: DeclarationId(1732) }, Field { label: "RefCounted".to_string(), ty: DeclarationId(1733) }, Field { label: "OwnershipBased".to_string(), ty: DeclarationId(1734) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2014, 2099) }, - Declaration { id: DeclarationId(814), name: Some("ScopeModel".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "LexicalScoping".to_string(), ty: DeclarationId(1735) }, Field { label: "DynamicScoping".to_string(), ty: DeclarationId(1736) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2365, 2418) }, - Declaration { id: DeclarationId(815), name: Some("TargetExecutionModel".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "memory".to_string(), ty: DeclarationId(813) }, Field { label: "scope".to_string(), ty: DeclarationId(814) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2561, 2632) }, - Declaration { id: DeclarationId(816), name: Some("SourceFiltering".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "excluded_prefixes".to_string(), ty: DeclarationId(1737) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2774, 2832) }, - Declaration { id: DeclarationId(817), name: Some("ShapeATargetSourceFiltering".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "internal".to_string(), ty: DeclarationId(816) }, Field { label: "additional_excluded_prefixes".to_string(), ty: DeclarationId(1738) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 3115, 3224) }, - Declaration { id: DeclarationId(818), name: Some("internal_source_filtering".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(816), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(816)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("excluded_prefixes".to_string(), FieldValue::List(vec![FieldValue::Literal(LiteralBits::String("dsl/std/".to_string())), FieldValue::Literal(LiteralBits::String("dsl/extdeps/".to_string())), FieldValue::Literal(LiteralBits::String("src/v3/std/".to_string())), FieldValue::Literal(LiteralBits::String("src/v3/spec/".to_string()))]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 3226, 3381) }, - Declaration { id: DeclarationId(819), name: Some("ExecutionModelRequirement".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "OwnershipBased".to_string(), ty: DeclarationId(1739) }, Field { label: "GarbageCollected".to_string(), ty: DeclarationId(1740) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 3659, 3729) }, - Declaration { id: DeclarationId(820), name: Some("CompilerDiagnosticKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "TokenizerError".to_string(), ty: DeclarationId(1741) }, Field { label: "ParseError".to_string(), ty: DeclarationId(1742) }, Field { label: "TypeMismatch".to_string(), ty: DeclarationId(1743) }, Field { label: "UnitMismatch".to_string(), ty: DeclarationId(1744) }, Field { label: "ArityMismatch".to_string(), ty: DeclarationId(1745) }, Field { label: "ResolveError".to_string(), ty: DeclarationId(1746) }, Field { label: "NominalOpacityViolation".to_string(), ty: DeclarationId(1747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 990, 1148) }, - Declaration { id: DeclarationId(821), name: Some("Correction".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "description".to_string(), ty: DeclarationId(186) }, Field { label: "span".to_string(), ty: DeclarationId(121) }, Field { label: "new_source".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 1354, 1607) }, - Declaration { id: DeclarationId(822), name: Some("DiagnosticKindDecl".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "payload".to_string(), ty: DeclarationId(687) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 2387, 2450) }, - Declaration { id: DeclarationId(823), name: Some("LensInstanceKindWitness".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "kind_decl".to_string(), ty: DeclarationId(1021) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 4652, 4712) }, - Declaration { id: DeclarationId(824), name: Some("AnyDiagnosticKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "CompilerKind".to_string(), ty: DeclarationId(1748) }, Field { label: "LensInstanceKind".to_string(), ty: DeclarationId(1749) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 5321, 5430) }, - Declaration { id: DeclarationId(825), name: Some("Diagnostic".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "kind".to_string(), ty: DeclarationId(824) }, Field { label: "span".to_string(), ty: DeclarationId(121) }, Field { label: "message".to_string(), ty: DeclarationId(186) }, Field { label: "fixes".to_string(), ty: DeclarationId(1750) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 5799, 5907) }, - Declaration { id: DeclarationId(826), name: Some("Witness".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Inhabits".to_string(), ty: DeclarationId(1765) }, Field { label: "Violates".to_string(), ty: DeclarationId(1766) }] }, type_params: vec![DeclarationId(827)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 1600, 1689) }, - Declaration { id: DeclarationId(827), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Carrier".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 1600, 1689) }, - Declaration { id: DeclarationId(828), name: Some("OptionalDiagnostic".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "NoDiagnostic".to_string(), ty: DeclarationId(1767) }, Field { label: "SomeDiagnostic".to_string(), ty: DeclarationId(1768) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 1843, 1924) }, - Declaration { id: DeclarationId(829), name: Some("DimensionReport".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "DimensionOk".to_string(), ty: DeclarationId(1771) }, Field { label: "DimensionFail".to_string(), ty: DeclarationId(1775) }] }, type_params: vec![DeclarationId(830)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 2283, 2559) }, - Declaration { id: DeclarationId(830), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Carrier".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 2283, 2559) }, - Declaration { id: DeclarationId(831), name: Some("AnalysisDimension".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "witness_of".to_string(), ty: DeclarationId(1777) }, Field { label: "compose".to_string(), ty: DeclarationId(1778) }, Field { label: "identity".to_string(), ty: DeclarationId(832) }, Field { label: "break_diagnostic".to_string(), ty: DeclarationId(1779) }] }, type_params: vec![DeclarationId(832)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 3132, 3361) }, - Declaration { id: DeclarationId(832), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Carrier".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 3132, 3361) }, - Declaration { id: DeclarationId(833), name: Some("Dimension".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "value".to_string(), ty: DeclarationId(835) }] }, type_params: vec![DeclarationId(834), DeclarationId(835)], phantom_params: vec![PhantomParameter { parameter: DeclarationId(834), algebra: DeclarationId(1780) }], meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4002, 4052) }, - Declaration { id: DeclarationId(834), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Unit".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4002, 4052) }, - Declaration { id: DeclarationId(835), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Carrier".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4002, 4052) }, - Declaration { id: DeclarationId(836), name: Some("Meters".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4054, 4065) }, - Declaration { id: DeclarationId(837), name: Some("Seconds".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4066, 4078) }, - Declaration { id: DeclarationId(838), name: Some("Kilograms".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4079, 4093) }, - Declaration { id: DeclarationId(839), name: Some("Amperes".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4094, 4106) }, - Declaration { id: DeclarationId(840), name: Some("Kelvin".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4107, 4118) }, - Declaration { id: DeclarationId(841), name: Some("Moles".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4119, 4129) }, - Declaration { id: DeclarationId(842), name: Some("Candela".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4130, 4142) }, - Declaration { id: DeclarationId(843), name: Some("add_dimension".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1751), DeclarationId(1752), DeclarationId(1753)], output: DeclarationId(1754), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/dimensions.dag", 4316, 4338)) }, type_params: vec![DeclarationId(844), DeclarationId(845)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4144, 4338) }, - Declaration { id: DeclarationId(844), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Unit".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4144, 4338) }, - Declaration { id: DeclarationId(845), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Carrier".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4144, 4338) }, - Declaration { id: DeclarationId(846), name: Some("sub_dimension".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1755), DeclarationId(1756), DeclarationId(1757)], output: DeclarationId(1758), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/dimensions.dag", 4512, 4534)) }, type_params: vec![DeclarationId(847), DeclarationId(848)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4340, 4534) }, - Declaration { id: DeclarationId(847), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Unit".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4340, 4534) }, - Declaration { id: DeclarationId(848), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Carrier".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4340, 4534) }, - Declaration { id: DeclarationId(849), name: Some("mul_dimension_scalar".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1759), DeclarationId(1760), DeclarationId(851)], output: DeclarationId(1761), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/dimensions.dag", 4700, 4729)) }, type_params: vec![DeclarationId(850), DeclarationId(851)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4536, 4729) }, - Declaration { id: DeclarationId(850), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Unit".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4536, 4729) }, - Declaration { id: DeclarationId(851), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Carrier".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4536, 4729) }, - Declaration { id: DeclarationId(852), name: Some("div_dimension_scalar".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1762), DeclarationId(1763), DeclarationId(854)], output: DeclarationId(1764), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/dimensions.dag", 4895, 4924)) }, type_params: vec![DeclarationId(853), DeclarationId(854)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4731, 4924) }, - Declaration { id: DeclarationId(853), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Unit".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4731, 4924) }, - Declaration { id: DeclarationId(854), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Carrier".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4731, 4924) }, - Declaration { id: DeclarationId(855), name: Some("TypeRealization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "language".to_string(), ty: DeclarationId(1021) }, Field { label: "target".to_string(), ty: DeclarationId(1021) }, Field { label: "carrier".to_string(), ty: DeclarationId(186) }, Field { label: "is_copy".to_string(), ty: DeclarationId(88) }, Field { label: "fields".to_string(), ty: DeclarationId(1781) }, Field { label: "cost".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 696, 847) }, - Declaration { id: DeclarationId(856), name: Some("FieldBinding".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "dag_name".to_string(), ty: DeclarationId(186) }, Field { label: "access".to_string(), ty: DeclarationId(857) }, Field { label: "borrowed_read".to_string(), ty: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 849, 933) }, - Declaration { id: DeclarationId(857), name: Some("FieldAccess".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "DirectField".to_string(), ty: DeclarationId(1782) }, Field { label: "AccessorMethod".to_string(), ty: DeclarationId(1783) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 1316, 1383) }, - Declaration { id: DeclarationId(858), name: Some("OperatorRealization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "language".to_string(), ty: DeclarationId(1021) }, Field { label: "target".to_string(), ty: DeclarationId(1021) }, Field { label: "op".to_string(), ty: DeclarationId(1021) }, Field { label: "carrier".to_string(), ty: DeclarationId(186) }, Field { label: "cost".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 1385, 1516) }, - Declaration { id: DeclarationId(859), name: Some("BehaviorRealization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "language".to_string(), ty: DeclarationId(1021) }, Field { label: "target".to_string(), ty: DeclarationId(1021) }, Field { label: "carrier".to_string(), ty: DeclarationId(186) }, Field { label: "cost".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 1518, 1628) }, - Declaration { id: DeclarationId(860), name: Some("CallableRealization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "language".to_string(), ty: DeclarationId(1021) }, Field { label: "target".to_string(), ty: DeclarationId(1021) }, Field { label: "strategy".to_string(), ty: DeclarationId(864) }, Field { label: "parameters".to_string(), ty: DeclarationId(1784) }, Field { label: "cost".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 1630, 1789) }, - Declaration { id: DeclarationId(861), name: Some("CallableParameter".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "slot".to_string(), ty: DeclarationId(71) }, Field { label: "disposition".to_string(), ty: DeclarationId(862) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 2211, 2285) }, - Declaration { id: DeclarationId(862), name: Some("ParameterDisposition".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Borrowed".to_string(), ty: DeclarationId(1785) }, Field { label: "Consumed".to_string(), ty: DeclarationId(1786) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 2742, 2793) }, - Declaration { id: DeclarationId(863), name: Some("TypeInstantiationRealization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "language".to_string(), ty: DeclarationId(1021) }, Field { label: "target".to_string(), ty: DeclarationId(1021) }, Field { label: "carrier".to_string(), ty: DeclarationId(186) }, Field { label: "cost".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 2795, 2914) }, - Declaration { id: DeclarationId(864), name: Some("CallableStrategy".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ListEmpty".to_string(), ty: DeclarationId(1787) }, Field { label: "ListSingleton".to_string(), ty: DeclarationId(1788) }, Field { label: "ListCons".to_string(), ty: DeclarationId(1789) }, Field { label: "ListConcat".to_string(), ty: DeclarationId(1790) }, Field { label: "ListLength".to_string(), ty: DeclarationId(1791) }, Field { label: "ListIsEmpty".to_string(), ty: DeclarationId(1792) }, Field { label: "ListFold".to_string(), ty: DeclarationId(1793) }, Field { label: "ListMap".to_string(), ty: DeclarationId(1794) }, Field { label: "ListFilter".to_string(), ty: DeclarationId(1795) }, Field { label: "ListContains".to_string(), ty: DeclarationId(1796) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3319, 3488) }, - Declaration { id: DeclarationId(865), name: Some("PatternRealization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "language".to_string(), ty: DeclarationId(1021) }, Field { label: "target".to_string(), ty: DeclarationId(1021) }, Field { label: "strategy".to_string(), ty: DeclarationId(866) }, Field { label: "empty_variant".to_string(), ty: DeclarationId(1021) }, Field { label: "cons_variant".to_string(), ty: DeclarationId(1021) }, Field { label: "scrutinee".to_string(), ty: DeclarationId(186) }, Field { label: "empty_pattern".to_string(), ty: DeclarationId(186) }, Field { label: "cons_pattern".to_string(), ty: DeclarationId(186) }, Field { label: "head_expr".to_string(), ty: DeclarationId(186) }, Field { label: "tail_expr".to_string(), ty: DeclarationId(186) }, Field { label: "cost".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 5427, 5716) }, - Declaration { id: DeclarationId(866), name: Some("PatternStrategy".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "PlaceholderPatternStrategy".to_string(), ty: DeclarationId(1797) }, Field { label: "VectorList".to_string(), ty: DeclarationId(1798) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6156, 6222) }, - Declaration { id: DeclarationId(867), name: Some("StatementSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "let_binding".to_string(), ty: DeclarationId(186) }, Field { label: "let_binding_inferred".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6224, 6301) }, - Declaration { id: DeclarationId(868), name: Some("ExpressionSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "field_access".to_string(), ty: DeclarationId(186) }, Field { label: "function_call".to_string(), ty: DeclarationId(186) }, Field { label: "closure".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6303, 6393) }, - Declaration { id: DeclarationId(869), name: Some("ForEachSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "prefix".to_string(), ty: DeclarationId(186) }, Field { label: "separator".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6395, 6454) }, - Declaration { id: DeclarationId(870), name: Some("ControlFlowSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "if_else".to_string(), ty: DeclarationId(186) }, Field { label: "match_arm".to_string(), ty: DeclarationId(186) }, Field { label: "for_each_syntax".to_string(), ty: DeclarationId(869) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6456, 6553) }, - Declaration { id: DeclarationId(871), name: Some("LiteralSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "true_keyword".to_string(), ty: DeclarationId(186) }, Field { label: "false_keyword".to_string(), ty: DeclarationId(186) }, Field { label: "string_delimiter".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6555, 6651) }, - Declaration { id: DeclarationId(872), name: Some("ModuleSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "path_separator".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6653, 6699) }, - Declaration { id: DeclarationId(873), name: Some("FunctionSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "definition".to_string(), ty: DeclarationId(186) }, Field { label: "definition_exported".to_string(), ty: DeclarationId(186) }, Field { label: "definition_void".to_string(), ty: DeclarationId(186) }, Field { label: "param_with_type".to_string(), ty: DeclarationId(186) }, Field { label: "param_separator".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6701, 6853) }, - Declaration { id: DeclarationId(874), name: Some("TypeApplicationSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "optional".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6855, 6904) }, - Declaration { id: DeclarationId(875), name: Some("TypeDefinitionSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "struct_def".to_string(), ty: DeclarationId(186) }, Field { label: "struct_field".to_string(), ty: DeclarationId(186) }, Field { label: "enum_def".to_string(), ty: DeclarationId(186) }, Field { label: "enum_unit_variant".to_string(), ty: DeclarationId(186) }, Field { label: "enum_data_variant".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 7118, 7266) }, - Declaration { id: DeclarationId(876), name: Some("RecordDeriveTemplateBundle".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "struct_def_no_debug".to_string(), ty: DeclarationId(186) }, Field { label: "enum_def_no_debug".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 7927, 8020) }, - Declaration { id: DeclarationId(877), name: Some("PatternMatchSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "match_expr".to_string(), ty: DeclarationId(186) }, Field { label: "match_arm".to_string(), ty: DeclarationId(186) }, Field { label: "variant_pattern".to_string(), ty: DeclarationId(186) }, Field { label: "variant_pattern_positional".to_string(), ty: DeclarationId(186) }, Field { label: "variant_pattern_empty".to_string(), ty: DeclarationId(186) }, Field { label: "field_binding".to_string(), ty: DeclarationId(186) }, Field { label: "field_binding_separator".to_string(), ty: DeclarationId(186) }, Field { label: "wildcard".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 8724, 8964) }, - Declaration { id: DeclarationId(878), name: Some("CollectionOps".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "concat".to_string(), ty: DeclarationId(186) }, Field { label: "length".to_string(), ty: DeclarationId(186) }, Field { label: "is_empty".to_string(), ty: DeclarationId(186) }, Field { label: "fold".to_string(), ty: DeclarationId(186) }, Field { label: "map".to_string(), ty: DeclarationId(186) }, Field { label: "filter".to_string(), ty: DeclarationId(186) }, Field { label: "contains".to_string(), ty: DeclarationId(186) }, Field { label: "empty_list".to_string(), ty: DeclarationId(186) }, Field { label: "list_literal".to_string(), ty: DeclarationId(186) }, Field { label: "cons".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 8966, 9165) }, - Declaration { id: DeclarationId(879), name: Some("ValueConstructionSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "struct_literal".to_string(), ty: DeclarationId(186) }, Field { label: "struct_field_init".to_string(), ty: DeclarationId(186) }, Field { label: "struct_field_separator".to_string(), ty: DeclarationId(186) }, Field { label: "variant_construction".to_string(), ty: DeclarationId(186) }, Field { label: "variant_named_construction".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 9167, 9353) }, - Declaration { id: DeclarationId(880), name: Some("RenderingModel".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "read".to_string(), ty: DeclarationId(881) }, Field { label: "construct".to_string(), ty: DeclarationId(882) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 9355, 9430) }, - Declaration { id: DeclarationId(881), name: Some("ReadStrategy".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Borrow".to_string(), ty: DeclarationId(1799) }, Field { label: "PassByValue".to_string(), ty: DeclarationId(1800) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 9928, 9972) }, - Declaration { id: DeclarationId(882), name: Some("ConstructStrategy".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "CopyOrClone".to_string(), ty: DeclarationId(1801) }, Field { label: "PassByValue".to_string(), ty: DeclarationId(1802) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 10265, 10319) }, - Declaration { id: DeclarationId(883), name: Some("LanguageSpec".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "statements".to_string(), ty: DeclarationId(1021) }, Field { label: "expressions".to_string(), ty: DeclarationId(1021) }, Field { label: "control_flow".to_string(), ty: DeclarationId(1021) }, Field { label: "literals".to_string(), ty: DeclarationId(1021) }, Field { label: "modules".to_string(), ty: DeclarationId(1021) }, Field { label: "functions".to_string(), ty: DeclarationId(1021) }, Field { label: "type_applications".to_string(), ty: DeclarationId(1021) }, Field { label: "type_definitions".to_string(), ty: DeclarationId(1021) }, Field { label: "record_derive_templates".to_string(), ty: DeclarationId(1021) }, Field { label: "patterns".to_string(), ty: DeclarationId(1021) }, Field { label: "collection_ops".to_string(), ty: DeclarationId(1021) }, Field { label: "values".to_string(), ty: DeclarationId(1021) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 10321, 10847) }, - Declaration { id: DeclarationId(884), name: Some("PlaceholderConvention".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "IndexedArgs".to_string(), ty: DeclarationId(1803) }, Field { label: "NamedArg".to_string(), ty: DeclarationId(1804) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 12221, 12276) }, - Declaration { id: DeclarationId(885), name: Some("MethodTemplateContract".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "dag_method".to_string(), ty: DeclarationId(741) }, Field { label: "runtime_template".to_string(), ty: DeclarationId(186) }, Field { label: "emit_template".to_string(), ty: DeclarationId(186) }, Field { label: "wraps_result".to_string(), ty: DeclarationId(88) }, Field { label: "placeholder_convention".to_string(), ty: DeclarationId(884) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 14069, 14244) }, - Declaration { id: DeclarationId(886), name: Some("BootstrapFixture".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "virtual_path".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/extdeps_bootstrap_fixtures.dag", 1395, 1443) }, - Declaration { id: DeclarationId(887), name: Some("BootstrapFixtureSet".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "rust_pilot_primitives".to_string(), ty: DeclarationId(886) }, Field { label: "rust_method_template_contracts".to_string(), ty: DeclarationId(886) }, Field { label: "python_method_template_contracts".to_string(), ty: DeclarationId(886) }, Field { label: "go_method_template_contracts".to_string(), ty: DeclarationId(886) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/extdeps_bootstrap_fixtures.dag", 1600, 1823) }, - Declaration { id: DeclarationId(888), name: Some("bootstrap_fixture_authority".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(887), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(887)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("rust_pilot_primitives".to_string(), FieldValue::Record(vec![("virtual_path".to_string(), FieldValue::Literal(LiteralBits::String("dsl/extdeps/languages/rust/primitives.dag".to_string())))])), ("rust_method_template_contracts".to_string(), FieldValue::Record(vec![("virtual_path".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/std/rust_method_template_contracts.dag".to_string())))])), ("python_method_template_contracts".to_string(), FieldValue::Record(vec![("virtual_path".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/std/python_method_template_contracts.dag".to_string())))])), ("go_method_template_contracts".to_string(), FieldValue::Record(vec![("virtual_path".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/std/go_method_template_contracts.dag".to_string())))]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/extdeps_bootstrap_fixtures.dag", 1825, 2298) }, - Declaration { id: DeclarationId(889), name: Some("go_method_template_contracts".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(885) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1805)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(214)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("len({recv})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("len({recv})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(226)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("strings.Join({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("strings.Join({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(252)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("strings.Split({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("strings.Split({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(212)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("append({recv}, {arg}...)".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("append({recv}, {arg}...)".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(232)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.Map({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.Map({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(219)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.Filter({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.Filter({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(205)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.Any({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.Any({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(204)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.All({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.All({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(221)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.FlatMap({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.FlatMap({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(250)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[{arg}:]".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[{arg}:]".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(255)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[:{arg}]".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[:{arg}]".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(222)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.Fold({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.Fold({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(251)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.SortBy({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.SortBy({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(206)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("append({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("append({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })])])), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/go_method_template_contracts.dag", 2405, 5333) }, - Declaration { id: DeclarationId(890), name: Some("RecursionShape".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "DirectRecursion".to_string(), ty: DeclarationId(1815) }, Field { label: "ListRecursion".to_string(), ty: DeclarationId(1816) }, Field { label: "OptionalRecursion".to_string(), ty: DeclarationId(1817) }, Field { label: "SetRecursion".to_string(), ty: DeclarationId(1818) }, Field { label: "MapValueRecursion".to_string(), ty: DeclarationId(1819) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 5538, 5811) }, - Declaration { id: DeclarationId(891), name: Some("InductiveField".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "type_name".to_string(), ty: DeclarationId(186) }, Field { label: "variant_name".to_string(), ty: DeclarationId(186) }, Field { label: "field_name".to_string(), ty: DeclarationId(186) }, Field { label: "shape".to_string(), ty: DeclarationId(890) }, Field { label: "element_type".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 7103, 7525) }, - Declaration { id: DeclarationId(892), name: Some("recursion_shape_eq".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(890), DeclarationId(890)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 7595, 7967)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 7527, 7967) }, - Declaration { id: DeclarationId(893), name: Some("inductive_field_eq".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(891), DeclarationId(891)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 8037, 8235)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 7969, 8235) }, - Declaration { id: DeclarationId(894), name: Some("inductive_field_to_dimension".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(891), DeclarationId(186)], output: DeclarationId(975), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 8701, 8732)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 8611, 8732) }, - Declaration { id: DeclarationId(895), name: Some("SubValueRelation".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "StrictSubValue".to_string(), ty: DeclarationId(1820) }, Field { label: "IteratedSubValue".to_string(), ty: DeclarationId(1821) }, Field { label: "ArithmeticDescent".to_string(), ty: DeclarationId(1822) }, Field { label: "PreservedValue".to_string(), ty: DeclarationId(1823) }, Field { label: "SubValueUnknown".to_string(), ty: DeclarationId(1824) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 9878, 10114) }, - Declaration { id: DeclarationId(896), name: Some("sub_value_to_evidence".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(895)], output: DeclarationId(968), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 11067, 11670)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 10995, 11670) }, - Declaration { id: DeclarationId(897), name: Some("shrink_factor_eq".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(796), DeclarationId(796)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 12177, 12677)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 12115, 12677) }, - Declaration { id: DeclarationId(898), name: Some("meet_sub_value".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(895), DeclarationId(895)], output: DeclarationId(895), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 13200, 14612)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 13120, 14612) }, - Declaration { id: DeclarationId(899), name: Some("join_sub_value".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(895), DeclarationId(895)], output: DeclarationId(895), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 14944, 16247)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 14864, 16247) }, - Declaration { id: DeclarationId(900), name: Some("compose_sub_value".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(895), DeclarationId(891)], output: DeclarationId(895), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 17356, 17478)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 17268, 17478) }, - Declaration { id: DeclarationId(901), name: Some("compose_sub_value_relations".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(895), DeclarationId(895)], output: DeclarationId(895), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 18334, 19680)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 18226, 19680) }, - Declaration { id: DeclarationId(902), name: Some("sub_value_to_call_pattern".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(895)], output: DeclarationId(1806), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 20455, 21251)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 20382, 21251) }, - Declaration { id: DeclarationId(903), name: Some("sub_value_to_lowering_target".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(895)], output: DeclarationId(1807), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 21843, 22748)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 21764, 22748) }, - Declaration { id: DeclarationId(904), name: Some("PolynomialExponent".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "IntegerExpZero".to_string(), ty: DeclarationId(1825) }, Field { label: "IntegerExpPos".to_string(), ty: DeclarationId(1826) }, Field { label: "FractionExp".to_string(), ty: DeclarationId(1827) }, Field { label: "LogBasedExp".to_string(), ty: DeclarationId(1828) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 23991, 24246) }, - Declaration { id: DeclarationId(905), name: Some("poly_exp_degree_one".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(904), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 24295, 24334)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 24248, 24334) }, - Declaration { id: DeclarationId(906), name: Some("AtomicCost".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "PolyCost".to_string(), ty: DeclarationId(1829) }, Field { label: "LogCost".to_string(), ty: DeclarationId(1830) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 24846, 24963) }, - Declaration { id: DeclarationId(907), name: Some("CostBound".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ConstantBound".to_string(), ty: DeclarationId(1831) }, Field { label: "AtomicBound".to_string(), ty: DeclarationId(1832) }, Field { label: "ProductBound".to_string(), ty: DeclarationId(1834) }, Field { label: "SumOfProductsBound".to_string(), ty: DeclarationId(1837) }, Field { label: "SumBound".to_string(), ty: DeclarationId(1839) }, Field { label: "ForeverBound".to_string(), ty: DeclarationId(1840) }, Field { label: "ErrorBound".to_string(), ty: DeclarationId(1841) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 26593, 27353) }, - Declaration { id: DeclarationId(908), name: Some("sum_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1808)], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 27764, 27870)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 27714, 27870) }, - Declaration { id: DeclarationId(909), name: Some("cost_bound_is_sum_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(907)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 28194, 28447)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 28145, 28447) }, - Declaration { id: DeclarationId(910), name: Some("cost_constant".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 28481, 28498)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 28449, 28498) }, - Declaration { id: DeclarationId(911), name: Some("cost_linear".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 28542, 28626)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 28499, 28626) }, - Declaration { id: DeclarationId(912), name: Some("cost_poly".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(71)], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 28681, 29080)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 28627, 29080) }, - Declaration { id: DeclarationId(913), name: Some("cost_root".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(71)], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 29130, 29404)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 29081, 29404) }, - Declaration { id: DeclarationId(914), name: Some("cost_sqrt".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 29446, 29479)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 29405, 29479) }, - Declaration { id: DeclarationId(915), name: Some("cost_cbrt".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 29521, 29554)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 29480, 29554) }, - Declaration { id: DeclarationId(916), name: Some("cost_log".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 29595, 29645)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 29555, 29645) }, - Declaration { id: DeclarationId(917), name: Some("cost_nlogn".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 29689, 29807)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 29647, 29807) }, - Declaration { id: DeclarationId(918), name: Some("cost_graph_linear".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(186)], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 29877, 30053)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 29809, 30053) }, - Declaration { id: DeclarationId(919), name: Some("RecurrenceForm".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }, Field { label: "branches".to_string(), ty: DeclarationId(71) }, Field { label: "divisor".to_string(), ty: DeclarationId(71) }, Field { label: "work_exponent".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 31210, 31301) }, - Declaration { id: DeclarationId(920), name: Some("int_add_checked".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71), DeclarationId(71)], output: DeclarationId(1809), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 31892, 32143)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 31849, 32143) }, - Declaration { id: DeclarationId(921), name: Some("int_mul_checked".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71), DeclarationId(71)], output: DeclarationId(1810), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 32188, 32977)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 32145, 32977) }, - Declaration { id: DeclarationId(922), name: Some("bounded_int_pow_exponent".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71)], output: DeclarationId(1811), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 33437, 33560)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 33393, 33560) }, - Declaration { id: DeclarationId(923), name: Some("int_pow_bounded".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71), DeclarationId(71)], output: DeclarationId(1812), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 33912, 34957)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 33864, 34957) }, - Declaration { id: DeclarationId(924), name: Some("ceil_log".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71), DeclarationId(71)], output: DeclarationId(1813), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 35175, 35290)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 35129, 35290) }, - Declaration { id: DeclarationId(925), name: Some("ceil_log_iter".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71), DeclarationId(71), DeclarationId(71), DeclarationId(71)], output: DeclarationId(1814), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 35447, 35809)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 35376, 35809) }, - Declaration { id: DeclarationId(926), name: Some("master_theorem".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(919)], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 35864, 37901)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 35811, 37901) }, - Declaration { id: DeclarationId(927), name: Some("catamorphism_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(71)], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 38254, 38412)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 38184, 38412) }, - Declaration { id: DeclarationId(928), name: Some("derive_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(71), DeclarationId(796), DeclarationId(71)], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 38911, 39935)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 38810, 39935) }, - Declaration { id: DeclarationId(929), name: Some("tree_traversal_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 40268, 40325)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 40229, 40325) }, - Declaration { id: DeclarationId(930), name: Some("nested_iteration_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 40368, 40426)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 40327, 40426) }, - Declaration { id: DeclarationId(931), name: Some("linear_scan_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 40526, 40581)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 40490, 40581) }, - Declaration { id: DeclarationId(932), name: Some("binary_search_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 40778, 40893)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 40740, 40893) }, - Declaration { id: DeclarationId(933), name: Some("mergesort_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 40973, 41088)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 40939, 41088) }, - Declaration { id: DeclarationId(934), name: Some("karatsuba_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 41255, 41374)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 41221, 41374) }, - Declaration { id: DeclarationId(935), name: Some("strassen_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 41539, 41653)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 41506, 41653) }, - Declaration { id: DeclarationId(936), name: Some("trial_division_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 41770, 41795)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 41731, 41795) }, - Declaration { id: DeclarationId(937), name: Some("cube_root_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 41830, 41855)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 41796, 41855) }, - Declaration { id: DeclarationId(938), name: Some("kth_root_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71)], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 41937, 41968)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 41898, 41968) }, - Declaration { id: DeclarationId(939), name: Some("bfs_dfs_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 42204, 42255)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 42172, 42255) }, - Declaration { id: DeclarationId(940), name: Some("dijkstra_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 42346, 42628)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 42313, 42628) }, - Declaration { id: DeclarationId(941), name: Some("bellman_ford_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 42731, 42891)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 42694, 42891) }, - Declaration { id: DeclarationId(942), name: Some("floyd_warshall_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 42998, 43036)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 42959, 43036) }, - Declaration { id: DeclarationId(943), name: Some("Lens".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "read".to_string(), ty: DeclarationId(1843) }, Field { label: "sequential".to_string(), ty: DeclarationId(1844) }, Field { label: "branch".to_string(), ty: DeclarationId(1845) }, Field { label: "iterate".to_string(), ty: DeclarationId(1846) }, Field { label: "validate".to_string(), ty: DeclarationId(1847) }] }, type_params: vec![DeclarationId(944)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lens.dag", 4121, 4318) }, - Declaration { id: DeclarationId(944), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("C".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lens.dag", 4121, 4318) }, - Declaration { id: DeclarationId(945), name: Some("Lookup".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Miss".to_string(), ty: DeclarationId(1850) }, Field { label: "Hit".to_string(), ty: DeclarationId(1851) }] }, type_params: vec![DeclarationId(946)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lookup.dag", 4509, 4551) }, - Declaration { id: DeclarationId(946), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("value".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lookup.dag", 4509, 4551) }, - Declaration { id: DeclarationId(947), name: Some("miss_int_lookup".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(1848), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/lookup.dag", 4589, 4599)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lookup.dag", 4553, 4599) }, - Declaration { id: DeclarationId(948), name: Some("hit_int_lookup".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71)], output: DeclarationId(1849), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/lookup.dag", 4642, 4654)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lookup.dag", 4601, 4654) }, - Declaration { id: DeclarationId(949), name: Some("DagDifference".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "detail".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 684, 723) }, - Declaration { id: DeclarationId(950), name: Some("SurfaceModule".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "items".to_string(), ty: DeclarationId(1852) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 1149, 1198) }, - Declaration { id: DeclarationId(951), name: Some("SurfaceParam".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "ty".to_string(), ty: DeclarationId(955) }, Field { label: "refinement".to_string(), ty: DeclarationId(1853) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 1200, 1281) }, - Declaration { id: DeclarationId(952), name: Some("SurfaceField".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "ty".to_string(), ty: DeclarationId(955) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 1283, 1337) }, - Declaration { id: DeclarationId(953), name: Some("SurfaceVariant".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "payload".to_string(), ty: DeclarationId(954) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 1339, 1422) }, - Declaration { id: DeclarationId(954), name: Some("VariantPayload".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Positional".to_string(), ty: DeclarationId(1855) }, Field { label: "Record".to_string(), ty: DeclarationId(1857) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 1712, 1796) }, - Declaration { id: DeclarationId(955), name: Some("SurfaceType".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Named".to_string(), ty: DeclarationId(1858) }, Field { label: "Parameterized".to_string(), ty: DeclarationId(1860) }, Field { label: "Optional".to_string(), ty: DeclarationId(1861) }, Field { label: "Arrow".to_string(), ty: DeclarationId(1863) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 2052, 2379) }, - Declaration { id: DeclarationId(956), name: Some("SurfaceRecordField".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "value".to_string(), ty: DeclarationId(962) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 2381, 2463) }, - Declaration { id: DeclarationId(957), name: Some("SurfaceMapEntry".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "key".to_string(), ty: DeclarationId(186) }, Field { label: "key_span".to_string(), ty: DeclarationId(121) }, Field { label: "value".to_string(), ty: DeclarationId(962) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 3353, 3454) }, - Declaration { id: DeclarationId(958), name: Some("SurfaceMatchArm".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "pattern".to_string(), ty: DeclarationId(960) }, Field { label: "body".to_string(), ty: DeclarationId(962) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 3456, 3545) }, - Declaration { id: DeclarationId(959), name: Some("SurfacePatternField".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "binding".to_string(), ty: DeclarationId(186) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 3547, 3627) }, - Declaration { id: DeclarationId(960), name: Some("SurfacePattern".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "BareVariant".to_string(), ty: DeclarationId(1864) }, Field { label: "VariantWith".to_string(), ty: DeclarationId(1865) }, Field { label: "VariantFields".to_string(), ty: DeclarationId(1867) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 3725, 3991) }, - Declaration { id: DeclarationId(961), name: Some("SurfaceLiteral".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Int".to_string(), ty: DeclarationId(1868) }, Field { label: "Bool".to_string(), ty: DeclarationId(1869) }, Field { label: "String".to_string(), ty: DeclarationId(1870) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 4554, 4620) }, - Declaration { id: DeclarationId(962), name: Some("SurfaceExpr".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Literal".to_string(), ty: DeclarationId(1871) }, Field { label: "Var".to_string(), ty: DeclarationId(1872) }, Field { label: "Path".to_string(), ty: DeclarationId(1875) }, Field { label: "Call".to_string(), ty: DeclarationId(1877) }, Field { label: "VariantRecord".to_string(), ty: DeclarationId(1879) }, Field { label: "Operator".to_string(), ty: DeclarationId(1881) }, Field { label: "Lambda".to_string(), ty: DeclarationId(1883) }, Field { label: "If".to_string(), ty: DeclarationId(1884) }, Field { label: "Match".to_string(), ty: DeclarationId(1886) }, Field { label: "Record".to_string(), ty: DeclarationId(1888) }, Field { label: "List".to_string(), ty: DeclarationId(1890) }, Field { label: "Map".to_string(), ty: DeclarationId(1892) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 4713, 7852) }, - Declaration { id: DeclarationId(963), name: Some("SurfaceItem".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Let".to_string(), ty: DeclarationId(1894) }, Field { label: "Fn".to_string(), ty: DeclarationId(1897) }, Field { label: "FnExternalBody".to_string(), ty: DeclarationId(1900) }, Field { label: "Data".to_string(), ty: DeclarationId(1902) }, Field { label: "Module".to_string(), ty: DeclarationId(1904) }, Field { label: "Import".to_string(), ty: DeclarationId(1907) }, Field { label: "TypeAtom".to_string(), ty: DeclarationId(1909) }, Field { label: "TypeRecord".to_string(), ty: DeclarationId(1912) }, Field { label: "TypeSum".to_string(), ty: DeclarationId(1916) }, Field { label: "TypeAlias".to_string(), ty: DeclarationId(1919) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 8721, 10039) }, - Declaration { id: DeclarationId(964), name: Some("python_method_template_contracts".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(885) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1920)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(214)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("len({recv})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("len({recv})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(226)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{arg}.join({recv})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{arg}.join({recv})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(252)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.split({arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.split({arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(228)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[-1] if {recv} else None".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[-1] if {recv} else None".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(220)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[0] if {recv} else None".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[0] if {recv} else None".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(218)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("list(enumerate({recv}))".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("list(enumerate({recv}))".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(208)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("[ord(c) for c in {recv}]".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("[ord(c) for c in {recv}]".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(212)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv} + {arg}".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv} + {arg}".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(232)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("[{arg}(x) for x in {recv}]".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("[{arg}(x) for x in {recv}]".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(219)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("[x for x in {recv} if {arg}(x)]".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("[x for x in {recv} if {arg}(x)]".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(205)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("any({arg}(x) for x in {recv})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("any({arg}(x) for x in {recv})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(204)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("all({arg}(x) for x in {recv})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("all({arg}(x) for x in {recv})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(221)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("[y for x in {recv} for y in {arg}(x)]".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("[y for x in {recv} for y in {arg}(x)]".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(250)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[{arg}:]".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[{arg}:]".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(255)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[:{arg}]".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[:{arg}]".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(222)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("functools.reduce({arg}, {recv})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("functools.reduce({arg}, {recv})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(251)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("sorted({recv}, key={arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("sorted({recv}, key={arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(206)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv} + [{arg}]".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv} + [{arg}]".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })])])), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/python_method_template_contracts.dag", 2053, 5846) }, - Declaration { id: DeclarationId(965), name: Some("ResourceHandle".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "type".to_string(), ty: DeclarationId(186) }, Field { label: "resource_id".to_string(), ty: DeclarationId(186) }, Field { label: "key".to_string(), ty: DeclarationId(186) }, Field { label: "cap".to_string(), ty: DeclarationId(107) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/resources.dag", 739, 827) }, - Declaration { id: DeclarationId(966), name: Some("ResourceReference".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "target".to_string(), ty: DeclarationId(1021) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/resources.dag", 829, 880) }, - Declaration { id: DeclarationId(967), name: Some("rust_method_template_contracts".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(885) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1921)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(214)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.len()".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("({recv}.len() as i64)".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(226)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.join(&{arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.join(&{arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(252)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.split(&{arg}).map(|s| s.to_string()).collect::>()".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.split(&{arg}).map(|s| s.to_string()).collect::>()".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(228)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.last().cloned()".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.last().cloned()".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(220)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.first().cloned()".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.first().cloned()".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(218)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.iter().enumerate().map(|(i, v)| (i, v.clone())).collect::>()".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(208)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.chars().map(|c| c as i64).collect::>()".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.chars().map(|c| c as i64).collect::>()".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(250)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.iter().cloned().skip({arg} as usize).collect::>()".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.iter().cloned().skip({arg} as usize).collect::>()".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(255)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.iter().cloned().take({arg} as usize).collect::>()".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.iter().cloned().take({arg} as usize).collect::>()".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1804), payload: vec![] })])])), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/rust_method_template_contracts.dag", 4006, 6310) }, - Declaration { id: DeclarationId(968), name: Some("DescentEvidence".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Strict".to_string(), ty: DeclarationId(1929) }, Field { label: "NonIncreasing".to_string(), ty: DeclarationId(1930) }, Field { label: "DescentUnknown".to_string(), ty: DeclarationId(1931) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 642, 710) }, - Declaration { id: DeclarationId(969), name: Some("evidence_rank".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(968)], output: DeclarationId(71), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 756, 838)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 712, 838) }, - Declaration { id: DeclarationId(970), name: Some("merge_evidence".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(968), DeclarationId(968)], output: DeclarationId(968), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 982, 1310)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 905, 1310) }, - Declaration { id: DeclarationId(971), name: Some("join_evidence".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(968), DeclarationId(968)], output: DeclarationId(968), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 1456, 1655)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 1380, 1655) }, - Declaration { id: DeclarationId(972), name: Some("promote_to_strict".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(968)], output: DeclarationId(968), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 2117, 2236)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 2050, 2236) }, - Declaration { id: DeclarationId(973), name: Some("optional_evidence_meet".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1922), DeclarationId(1923)], output: DeclarationId(1924), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 2388, 2564)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 2300, 2564) }, - Declaration { id: DeclarationId(974), name: Some("map_evidence_merge_at".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1925), DeclarationId(186), DeclarationId(968)], output: DeclarationId(1926), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 2733, 2907)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 2601, 2907) }, - Declaration { id: DeclarationId(975), name: Some("RankingDimension".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "TreeSize".to_string(), ty: DeclarationId(1932) }, Field { label: "ListLength".to_string(), ty: DeclarationId(1933) }, Field { label: "ArithmeticValue".to_string(), ty: DeclarationId(1934) }, Field { label: "TokenPosition".to_string(), ty: DeclarationId(1935) }, Field { label: "SetCardinality".to_string(), ty: DeclarationId(1936) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 3206, 3402) }, - Declaration { id: DeclarationId(976), name: Some("PositiveDescentAmount".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "OneStep".to_string(), ty: DeclarationId(1937) }, Field { label: "AdditionalStep".to_string(), ty: DeclarationId(1938) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 4378, 4471) }, - Declaration { id: DeclarationId(977), name: Some("ProportionalDivisor".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "DivideByTwo".to_string(), ty: DeclarationId(1939) }, Field { label: "StrictlyLarger".to_string(), ty: DeclarationId(1940) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 4937, 5027) }, - Declaration { id: DeclarationId(978), name: Some("proportional_divisor_to_int".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(977)], output: DeclarationId(71), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 5091, 5204)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 5029, 5204) }, - Declaration { id: DeclarationId(979), name: Some("peano_literal_materialization_cap".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(71), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 5434, 5441)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 5388, 5441) }, - Declaration { id: DeclarationId(980), name: Some("positive_descent_amount_from_positive_int".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71)], output: DeclarationId(1927), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 5902, 6262)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 5823, 6262) }, - Declaration { id: DeclarationId(981), name: Some("proportional_divisor_from_int_at_least_two".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71)], output: DeclarationId(1928), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 6342, 6703)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 6264, 6703) }, - Declaration { id: DeclarationId(982), name: Some("DescentSource".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ChildAccessor".to_string(), ty: DeclarationId(1941) }, Field { label: "ListShrink".to_string(), ty: DeclarationId(1942) }, Field { label: "ArithmeticSubtractDescent".to_string(), ty: DeclarationId(1943) }, Field { label: "ArithmeticDivideDescent".to_string(), ty: DeclarationId(1944) }, Field { label: "ParserAdvance".to_string(), ty: DeclarationId(1945) }, Field { label: "SetRemoval".to_string(), ty: DeclarationId(1946) }, Field { label: "FoldIteration".to_string(), ty: DeclarationId(1947) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7108, 7429) }, - Declaration { id: DeclarationId(983), name: Some("TerminationProof".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "dimensions".to_string(), ty: DeclarationId(1948) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7431, 7493) }, - Declaration { id: DeclarationId(984), name: Some("ProofEdge".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "caller".to_string(), ty: DeclarationId(186) }, Field { label: "callee".to_string(), ty: DeclarationId(186) }, Field { label: "evidence".to_string(), ty: DeclarationId(1949) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7638, 7724) }, - Declaration { id: DeclarationId(985), name: Some("TokenKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "KwLet".to_string(), ty: DeclarationId(1950) }, Field { label: "KwIf".to_string(), ty: DeclarationId(1951) }, Field { label: "KwThen".to_string(), ty: DeclarationId(1952) }, Field { label: "KwElse".to_string(), ty: DeclarationId(1953) }, Field { label: "KwFn".to_string(), ty: DeclarationId(1954) }, Field { label: "KwType".to_string(), ty: DeclarationId(1955) }, Field { label: "KwModule".to_string(), ty: DeclarationId(1956) }, Field { label: "KwImport".to_string(), ty: DeclarationId(1957) }, Field { label: "KwMatch".to_string(), ty: DeclarationId(1958) }, Field { label: "KwData".to_string(), ty: DeclarationId(1959) }, Field { label: "KwWhere".to_string(), ty: DeclarationId(1960) }, Field { label: "KwTrue".to_string(), ty: DeclarationId(1961) }, Field { label: "KwFalse".to_string(), ty: DeclarationId(1962) }, Field { label: "Ident".to_string(), ty: DeclarationId(1963) }, Field { label: "IntLit".to_string(), ty: DeclarationId(1964) }, Field { label: "StringLit".to_string(), ty: DeclarationId(1965) }, Field { label: "Eq".to_string(), ty: DeclarationId(1966) }, Field { label: "EqEq".to_string(), ty: DeclarationId(1967) }, Field { label: "NotEq".to_string(), ty: DeclarationId(1968) }, Field { label: "Lt".to_string(), ty: DeclarationId(1969) }, Field { label: "Le".to_string(), ty: DeclarationId(1970) }, Field { label: "Gt".to_string(), ty: DeclarationId(1971) }, Field { label: "Ge".to_string(), ty: DeclarationId(1972) }, Field { label: "Plus".to_string(), ty: DeclarationId(1973) }, Field { label: "Minus".to_string(), ty: DeclarationId(1974) }, Field { label: "Star".to_string(), ty: DeclarationId(1975) }, Field { label: "Slash".to_string(), ty: DeclarationId(1976) }, Field { label: "AmpAmp".to_string(), ty: DeclarationId(1977) }, Field { label: "PipePipe".to_string(), ty: DeclarationId(1978) }, Field { label: "Colon".to_string(), ty: DeclarationId(1979) }, Field { label: "Arrow".to_string(), ty: DeclarationId(1980) }, Field { label: "FatArrow".to_string(), ty: DeclarationId(1981) }, Field { label: "PipeArrow".to_string(), ty: DeclarationId(1982) }, Field { label: "Dot".to_string(), ty: DeclarationId(1983) }, Field { label: "LParen".to_string(), ty: DeclarationId(1984) }, Field { label: "RParen".to_string(), ty: DeclarationId(1985) }, Field { label: "LBrace".to_string(), ty: DeclarationId(1986) }, Field { label: "RBrace".to_string(), ty: DeclarationId(1987) }, Field { label: "LBracket".to_string(), ty: DeclarationId(1988) }, Field { label: "RBracket".to_string(), ty: DeclarationId(1989) }, Field { label: "Comma".to_string(), ty: DeclarationId(1990) }, Field { label: "Semicolon".to_string(), ty: DeclarationId(1991) }, Field { label: "Pipe".to_string(), ty: DeclarationId(1992) }, Field { label: "Question".to_string(), ty: DeclarationId(1993) }, Field { label: "Eof".to_string(), ty: DeclarationId(1994) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 627, 1137) }, - Declaration { id: DeclarationId(986), name: Some("Token".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "kind".to_string(), ty: DeclarationId(985) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1272, 1323) }, - Declaration { id: DeclarationId(987), name: Some("KeywordTokenKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "KwLet".to_string(), ty: DeclarationId(1995) }, Field { label: "KwIf".to_string(), ty: DeclarationId(1996) }, Field { label: "KwThen".to_string(), ty: DeclarationId(1997) }, Field { label: "KwElse".to_string(), ty: DeclarationId(1998) }, Field { label: "KwFn".to_string(), ty: DeclarationId(1999) }, Field { label: "KwType".to_string(), ty: DeclarationId(2000) }, Field { label: "KwModule".to_string(), ty: DeclarationId(2001) }, Field { label: "KwImport".to_string(), ty: DeclarationId(2002) }, Field { label: "KwMatch".to_string(), ty: DeclarationId(2003) }, Field { label: "KwData".to_string(), ty: DeclarationId(2004) }, Field { label: "KwWhere".to_string(), ty: DeclarationId(2005) }, Field { label: "KwTrue".to_string(), ty: DeclarationId(2006) }, Field { label: "KwFalse".to_string(), ty: DeclarationId(2007) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1682, 1848) }, - Declaration { id: DeclarationId(988), name: Some("PunctTokenKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Eq".to_string(), ty: DeclarationId(2008) }, Field { label: "EqEq".to_string(), ty: DeclarationId(2009) }, Field { label: "NotEq".to_string(), ty: DeclarationId(2010) }, Field { label: "Lt".to_string(), ty: DeclarationId(2011) }, Field { label: "Le".to_string(), ty: DeclarationId(2012) }, Field { label: "Gt".to_string(), ty: DeclarationId(2013) }, Field { label: "Ge".to_string(), ty: DeclarationId(2014) }, Field { label: "Plus".to_string(), ty: DeclarationId(2015) }, Field { label: "Minus".to_string(), ty: DeclarationId(2016) }, Field { label: "Star".to_string(), ty: DeclarationId(2017) }, Field { label: "Slash".to_string(), ty: DeclarationId(2018) }, Field { label: "AmpAmp".to_string(), ty: DeclarationId(2019) }, Field { label: "PipePipe".to_string(), ty: DeclarationId(2020) }, Field { label: "Colon".to_string(), ty: DeclarationId(2021) }, Field { label: "Arrow".to_string(), ty: DeclarationId(2022) }, Field { label: "FatArrow".to_string(), ty: DeclarationId(2023) }, Field { label: "PipeArrow".to_string(), ty: DeclarationId(2024) }, Field { label: "Dot".to_string(), ty: DeclarationId(2025) }, Field { label: "LParen".to_string(), ty: DeclarationId(2026) }, Field { label: "RParen".to_string(), ty: DeclarationId(2027) }, Field { label: "LBrace".to_string(), ty: DeclarationId(2028) }, Field { label: "RBrace".to_string(), ty: DeclarationId(2029) }, Field { label: "LBracket".to_string(), ty: DeclarationId(2030) }, Field { label: "RBracket".to_string(), ty: DeclarationId(2031) }, Field { label: "Comma".to_string(), ty: DeclarationId(2032) }, Field { label: "Semicolon".to_string(), ty: DeclarationId(2033) }, Field { label: "Pipe".to_string(), ty: DeclarationId(2034) }, Field { label: "Question".to_string(), ty: DeclarationId(2035) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2264, 2570) }, - Declaration { id: DeclarationId(989), name: Some("LocalPunctSpec".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "pattern".to_string(), ty: DeclarationId(186) }, Field { label: "kind".to_string(), ty: DeclarationId(988) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2780, 2844) }, - Declaration { id: DeclarationId(990), name: Some("StringEscapeSpec".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "suffix".to_string(), ty: DeclarationId(186) }, Field { label: "output_codepoint".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 3231, 3297) }, - Declaration { id: DeclarationId(991), name: Some("Path".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(120), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 1292, 1312) }, - Declaration { id: DeclarationId(992), name: Some("SnapshotRef".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(111), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 1313, 1343) }, - Declaration { id: DeclarationId(993), name: Some("CensusListConstant".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 1480, 1506) }, - Declaration { id: DeclarationId(994), name: Some("expected_hand_authored_non_test".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(993), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(993)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 1508, 1569) }, - Declaration { id: DeclarationId(995), name: Some("expected_hand_authored_test".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(993), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(993)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 1570, 1627) }, - Declaration { id: DeclarationId(996), name: Some("LensProducerFilesSubsetPredicate".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 1759, 1799) }, - Declaration { id: DeclarationId(997), name: Some("lens_producer_files_subset_predicate".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(996), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(996)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 1801, 1881) }, - Declaration { id: DeclarationId(998), name: Some("CompilerStdPositiveSetRatchet".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 1960, 1997) }, - Declaration { id: DeclarationId(999), name: Some("compiler_std_positive_set_ratchet".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(998), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(998)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 1999, 2073) }, - Declaration { id: DeclarationId(1000), name: Some("DiagnosticKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "TokenizerError".to_string(), ty: DeclarationId(2039) }, Field { label: "ParseError".to_string(), ty: DeclarationId(2040) }, Field { label: "TypeMismatch".to_string(), ty: DeclarationId(2041) }, Field { label: "UnitMismatch".to_string(), ty: DeclarationId(2042) }, Field { label: "ArityMismatch".to_string(), ty: DeclarationId(2043) }, Field { label: "ResolveError".to_string(), ty: DeclarationId(2044) }, Field { label: "NominalOpacityViolation".to_string(), ty: DeclarationId(2045) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2408, 2558) }, - Declaration { id: DeclarationId(1001), name: Some("DiagnosticDetailExpectation".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "AnyDetail".to_string(), ty: DeclarationId(2046) }, Field { label: "Contains".to_string(), ty: DeclarationId(2047) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2927, 2994) }, - Declaration { id: DeclarationId(1002), name: Some("DiagnosticReference".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "kind".to_string(), ty: DeclarationId(1000) }, Field { label: "detail_contains".to_string(), ty: DeclarationId(1001) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 3138, 3236) }, - Declaration { id: DeclarationId(1003), name: Some("PortStateExpectation".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Resolved".to_string(), ty: DeclarationId(2048) }, Field { label: "Unresolved".to_string(), ty: DeclarationId(2049) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 3623, 3676) }, - Declaration { id: DeclarationId(1004), name: Some("AlgebraicLawKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Associativity".to_string(), ty: DeclarationId(2050) }, Field { label: "Commutativity".to_string(), ty: DeclarationId(2051) }, Field { label: "Identity".to_string(), ty: DeclarationId(2052) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4465, 4535) }, - Declaration { id: DeclarationId(1005), name: Some("TestPredicate".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Compiles".to_string(), ty: DeclarationId(2053) }, Field { label: "FailsWithDiagnostic".to_string(), ty: DeclarationId(2054) }, Field { label: "OutputEquals".to_string(), ty: DeclarationId(2055) }, Field { label: "PortHasState".to_string(), ty: DeclarationId(2056) }, Field { label: "DeclarationHasRefinement".to_string(), ty: DeclarationId(2057) }, Field { label: "CostBounded".to_string(), ty: DeclarationId(2058) }, Field { label: "BehavioralObservation".to_string(), ty: DeclarationId(2059) }, Field { label: "MockBackedInvariant".to_string(), ty: DeclarationId(2060) }, Field { label: "ExecuteCommand".to_string(), ty: DeclarationId(2062) }, Field { label: "ForAllTargets".to_string(), ty: DeclarationId(2064) }, Field { label: "LensOutputEquals".to_string(), ty: DeclarationId(2065) }, Field { label: "DifferentialEquals".to_string(), ty: DeclarationId(2066) }, Field { label: "AlgebraicLaw".to_string(), ty: DeclarationId(2067) }, Field { label: "CensusBoundCheck".to_string(), ty: DeclarationId(2068) }, Field { label: "CensusSubsetCount".to_string(), ty: DeclarationId(2069) }, Field { label: "FixedPointConverges".to_string(), ty: DeclarationId(2070) }, Field { label: "RatchetZero".to_string(), ty: DeclarationId(2071) }, Field { label: "GeneratedFromDag".to_string(), ty: DeclarationId(2073) }, Field { label: "ReleaseDeferredClaim".to_string(), ty: DeclarationId(2074) }, Field { label: "SubstrateResearchDeferredClaim".to_string(), ty: DeclarationId(2075) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4537, 11180) }, - Declaration { id: DeclarationId(1006), name: Some("ProgramInput".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 11288, 11308) }, - Declaration { id: DeclarationId(1007), name: Some("ProgramOutputBind".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "output_ref".to_string(), ty: DeclarationId(1021) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 11451, 11506) }, - Declaration { id: DeclarationId(1008), name: Some("TestClaim".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "source".to_string(), ty: DeclarationId(186) }, Field { label: "file_name".to_string(), ty: DeclarationId(186) }, Field { label: "predicate".to_string(), ty: DeclarationId(1005) }, Field { label: "requires".to_string(), ty: DeclarationId(2076) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12116, 12249) }, - Declaration { id: DeclarationId(1009), name: Some("TestSuite".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "claims".to_string(), ty: DeclarationId(2077) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12251, 12310) }, - Declaration { id: DeclarationId(1010), name: Some("TestObligation".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "claim_name".to_string(), ty: DeclarationId(186) }, Field { label: "resources".to_string(), ty: DeclarationId(2078) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12508, 12589) }, - Declaration { id: DeclarationId(1011), name: Some("claim_obligation_resources".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1008)], output: DeclarationId(2036), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/verification.dag", 13031, 13047)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12960, 13047) }, - Declaration { id: DeclarationId(1012), name: Some("obligation_for_claim".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1008)], output: DeclarationId(1010), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/verification.dag", 13105, 13190)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 13049, 13190) }, - Declaration { id: DeclarationId(1013), name: Some("materialize_test_obligations".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(2037)], output: DeclarationId(2038), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/verification.dag", 13273, 13312)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 13192, 13312) }, - Declaration { id: DeclarationId(1014), name: Some("behavior_spine".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(731)], output: DeclarationId(2079), body: ArrowBody::UserDefined(NodeId(236)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/workflows.dag", 963, 1018) }, - Declaration { id: DeclarationId(1015), name: Some("Value".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/v3_l1.dag", 2788, 2801) }, - Declaration { id: DeclarationId(1016), name: Some("Transform".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/v3_l1.dag", 2802, 2819) }, - Declaration { id: DeclarationId(1017), name: Some("Branch".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/v3_l1.dag", 2820, 2834) }, - Declaration { id: DeclarationId(1018), name: Some("Loop".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/v3_l1.dag", 2835, 2847) }, - Declaration { id: DeclarationId(1019), name: Some("Bind".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/v3_l1.dag", 2848, 2860) }, - Declaration { id: DeclarationId(1020), name: Some("Main".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/v3_l1.dag", 2861, 2873) }, - Declaration { id: DeclarationId(1021), name: Some("DeclarationRef".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/v3_l1.dag", 3283, 3305) }, - Declaration { id: DeclarationId(1022), name: Some("go_execution_model".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(815), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(815)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("memory".to_string(), FieldValue::Variant { constructor: DeclarationId(1732), payload: vec![] }), ("scope".to_string(), FieldValue::Variant { constructor: DeclarationId(1735), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 1538, 1640) }, - Declaration { id: DeclarationId(1023), name: Some("go_source_filtering".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(817), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(817)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("internal".to_string(), FieldValue::Reference(DeclarationId(818))), ("additional_excluded_prefixes".to_string(), FieldValue::List(vec![FieldValue::Literal(LiteralBits::String("src/v3/compiler/".to_string()))]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 1642, 1792) }, - Declaration { id: DeclarationId(1024), name: Some("go_execution_requirement".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(819), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(819)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/go.dag", 1853, 1869))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 1794, 1869) }, - Declaration { id: DeclarationId(1025), name: Some("go_int".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("int64".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 1871, 2001) }, - Declaration { id: DeclarationId(1026), name: Some("go_bool".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(88))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("bool".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 2003, 2134) }, - Declaration { id: DeclarationId(1027), name: Some("go_string".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(186))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("string".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 2136, 2273) }, - Declaration { id: DeclarationId(1028), name: Some("go_node_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(630))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NodeId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 2275, 2413) }, - Declaration { id: DeclarationId(1029), name: Some("go_port_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(631))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PortId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 2415, 2553) }, - Declaration { id: DeclarationId(1030), name: Some("go_declaration_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(632))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("DeclarationId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 2555, 2714) }, - Declaration { id: DeclarationId(1031), name: Some("go_cluster_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(633))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ClusterId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 2716, 2863) }, - Declaration { id: DeclarationId(1032), name: Some("go_type_shape".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(687))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TypeShape".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("declaration".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("declaration".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 2865, 3106) }, - Declaration { id: DeclarationId(1033), name: Some("go_port_state".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(688))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PortState".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 3108, 3256) }, - Declaration { id: DeclarationId(1034), name: Some("go_port".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(689))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("DagPort".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("state".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("state".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("produced_by".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("produced_by".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 3258, 3641) }, - Declaration { id: DeclarationId(1035), name: Some("go_source_span".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(121))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SourceSpan".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("file".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("file".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("start".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("byte_start".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("end".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("byte_end".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 3643, 4037) }, - Declaration { id: DeclarationId(1036), name: Some("go_literal_bits".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(690))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("LiteralBits".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 4039, 4193) }, - Declaration { id: DeclarationId(1037), name: Some("go_atom_payload".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(691))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("AtomPayload".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 4195, 4349) }, - Declaration { id: DeclarationId(1038), name: Some("go_cardinality_bound".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(696))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("CardinalityBound".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 4351, 4520) }, - Declaration { id: DeclarationId(1039), name: Some("go_interval".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(694))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Interval".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 4522, 4666) }, - Declaration { id: DeclarationId(1040), name: Some("go_positive_interval_width".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(692))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PositiveIntervalWidth".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 4668, 4853) }, - Declaration { id: DeclarationId(1041), name: Some("go_interval_width".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(693))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("IntervalWidth".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 4855, 5015) }, - Declaration { id: DeclarationId(1042), name: Some("go_conj_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(697))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ConjField".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("label".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("label".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("ty".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("ty".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 5017, 5319) }, - Declaration { id: DeclarationId(1043), name: Some("go_template_argument".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(698))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TemplateArgument".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("parameter".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("parameter".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("value".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("value".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 5321, 5658) }, - Declaration { id: DeclarationId(1044), name: Some("go_phantom_parameter".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(705))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PhantomParameter".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("parameter".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("parameter".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("algebra".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("algebra".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 5660, 6001) }, - Declaration { id: DeclarationId(1045), name: Some("go_nominal_opacity".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(706))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NominalOpacity".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("permitted_accessors".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("permitted_accessors".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 6003, 6275) }, - Declaration { id: DeclarationId(1046), name: Some("go_field_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(699))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("FieldEntry".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("label".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("label".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("value".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("value".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 6277, 6588) }, - Declaration { id: DeclarationId(1047), name: Some("go_non_empty_list".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(634))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NonEmptyList".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("first".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("first".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("rest".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("rest".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 6590, 6906) }, - Declaration { id: DeclarationId(1048), name: Some("go_non_singleton_list".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(636))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NonSingletonList".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("first".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("first".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("second".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("second".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("rest".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("rest".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 6908, 7317) }, - Declaration { id: DeclarationId(1049), name: Some("go_param_ref".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(715))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ParamRef".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("member".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1783), payload: vec![FieldValue::Literal(LiteralBits::String("member_of".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("slot".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1783), payload: vec![FieldValue::Literal(LiteralBits::String("slot_of".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 7319, 7635) }, - Declaration { id: DeclarationId(1050), name: Some("go_transform_ref".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(716))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TransformRef".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("node".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1783), payload: vec![FieldValue::Literal(LiteralBits::String("node_id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 7637, 7878) }, - Declaration { id: DeclarationId(1051), name: Some("go_member_descent".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(719))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("MemberDescent".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("param".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("param".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 7880, 8121) }, - Declaration { id: DeclarationId(1052), name: Some("go_intra_cluster_call".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(720))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("IntraClusterCall".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("transform".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("transform".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 8123, 8382) }, - Declaration { id: DeclarationId(1053), name: Some("go_cluster".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(721))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Cluster".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("members".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("members".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("intra_cluster_calls".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("intra_cluster_calls".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 8384, 8717) }, - Declaration { id: DeclarationId(1054), name: Some("go_field_value".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(700))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("FieldValue".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 8719, 8870) }, - Declaration { id: DeclarationId(1055), name: Some("go_value_body".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(701))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ValueBody".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 8872, 9020) }, - Declaration { id: DeclarationId(1056), name: Some("go_arrow_body".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(702))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ArrowBody".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 9022, 9170) }, - Declaration { id: DeclarationId(1057), name: Some("go_type_connective".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(703))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TypeConnective".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 9172, 9335) }, - Declaration { id: DeclarationId(1058), name: Some("go_declaration".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(704))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Declaration".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("connective".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("connective".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("type_params".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("type_params".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("phantom_params".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("phantom_params".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("meta_tag".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("meta_tag".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("inhabits".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("inhabits".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("value_body".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("value_body".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("nominal_opacity".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("nominal_opacity".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 9337, 10354) }, - Declaration { id: DeclarationId(1059), name: Some("go_arithmetic_op".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(707))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ArithmeticOp".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 10356, 10513) }, - Declaration { id: DeclarationId(1060), name: Some("go_comparison_op".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(708))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ComparisonOp".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 10515, 10672) }, - Declaration { id: DeclarationId(1061), name: Some("go_logical_op".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(709))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("LogicalOp".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 10674, 10822) }, - Declaration { id: DeclarationId(1062), name: Some("go_operator_kind".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(710))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("OperatorKind".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 10824, 10981) }, - Declaration { id: DeclarationId(1063), name: Some("go_transform_target".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(711))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TransformTarget".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 10983, 11149) }, - Declaration { id: DeclarationId(1064), name: Some("go_branch_pattern".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(712))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BranchPattern".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 11151, 11311) }, - Declaration { id: DeclarationId(1065), name: Some("go_payload_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(713))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PayloadBinding".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("binding_name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("binding_name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("payload_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("payload_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 11313, 11664) }, - Declaration { id: DeclarationId(1066), name: Some("go_branch_path".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(714))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BranchPath".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("body".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("body".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("pattern".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("pattern".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("binding".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("binding".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 11666, 12153) }, - Declaration { id: DeclarationId(1067), name: Some("go_loop_bound".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(722))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("LoopBound".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 12155, 12303) }, - Declaration { id: DeclarationId(1068), name: Some("go_value_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(723))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ValueNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("payload".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("payload".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 12777, 13251) }, - Declaration { id: DeclarationId(1069), name: Some("go_transform_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(724))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TransformNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("target".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("target".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("inputs".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("inputs".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 13253, 13818) }, - Declaration { id: DeclarationId(1070), name: Some("go_branch_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(726))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BranchNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("input".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("input".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("paths".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("paths".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("emit_participation".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("emit_participation".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 13820, 14477) }, - Declaration { id: DeclarationId(1071), name: Some("go_loop_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(727))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("LoopNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("source".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("source".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("init".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("init".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("body".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("body".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("bound".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("bound".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 14479, 15181) }, - Declaration { id: DeclarationId(1072), name: Some("go_bind_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(729))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BindNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("params".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("params".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("emit_participation".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("emit_participation".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 15183, 15834) }, - Declaration { id: DeclarationId(1073), name: Some("go_behavior".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(730))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Behavior".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 15836, 15980) }, - Declaration { id: DeclarationId(1074), name: Some("go_dag".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(731))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Dag".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("declarations".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("declarations".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("nodes".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("nodes".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("ports".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("ports".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("clusters".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("clusters".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 15982, 16449) }, - Declaration { id: DeclarationId(1075), name: Some("go_surface_module".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(950))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceModule".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("items".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("items".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 16752, 16993) }, - Declaration { id: DeclarationId(1076), name: Some("go_surface_item".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(963))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceItem".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 16995, 17149) }, - Declaration { id: DeclarationId(1077), name: Some("go_surface_param".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(951))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceParam".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("ty".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("ty".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("refinement".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("refinement".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 17151, 17549) }, - Declaration { id: DeclarationId(1078), name: Some("go_surface_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(952))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceField".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("ty".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("ty".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 17551, 17860) }, - Declaration { id: DeclarationId(1079), name: Some("go_surface_variant".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(953))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceVariant".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("payload".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("payload".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 17862, 18264) }, - Declaration { id: DeclarationId(1080), name: Some("go_variant_payload".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(954))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("VariantPayload".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 18266, 18429) }, - Declaration { id: DeclarationId(1081), name: Some("go_surface_type".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(955))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceType".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 18431, 18585) }, - Declaration { id: DeclarationId(1082), name: Some("go_surface_record_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(956))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceRecordField".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("value".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("value".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 18587, 18998) }, - Declaration { id: DeclarationId(1083), name: Some("go_surface_map_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(957))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceMapEntry".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("key".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("key".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("key_span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("key_span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("value".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("value".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 19000, 19485) }, - Declaration { id: DeclarationId(1084), name: Some("go_surface_match_arm".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(958))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceMatchArm".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("pattern".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("pattern".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("body".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("body".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 19487, 19893) }, - Declaration { id: DeclarationId(1085), name: Some("go_surface_pattern_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(959))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfacePatternField".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("binding".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("binding".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 19895, 20313) }, - Declaration { id: DeclarationId(1086), name: Some("go_surface_pattern".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(960))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfacePattern".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 20315, 20478) }, - Declaration { id: DeclarationId(1087), name: Some("go_surface_literal".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(961))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceLiteral".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 20480, 20643) }, - Declaration { id: DeclarationId(1088), name: Some("go_surface_expr".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(962))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceExpr".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 20645, 20799) }, - Declaration { id: DeclarationId(1089), name: Some("go_int_add".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(300))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} + {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 20801, 20942) }, - Declaration { id: DeclarationId(1090), name: Some("go_int_sub".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(301))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} - {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 20944, 21085) }, - Declaration { id: DeclarationId(1091), name: Some("go_int_mul".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(303))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} * {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 21087, 21228) }, - Declaration { id: DeclarationId(1092), name: Some("go_int_div".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(305))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("v3intdiv({lhs}, {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 21230, 21378) }, - Declaration { id: DeclarationId(1093), name: Some("go_int_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(309))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 21380, 21520) }, - Declaration { id: DeclarationId(1094), name: Some("go_node_id_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(630))), ("op".to_string(), FieldValue::Reference(DeclarationId(309))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 21522, 21669) }, - Declaration { id: DeclarationId(1095), name: Some("go_port_id_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(631))), ("op".to_string(), FieldValue::Reference(DeclarationId(309))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 21671, 21818) }, - Declaration { id: DeclarationId(1096), name: Some("go_declaration_id_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(632))), ("op".to_string(), FieldValue::Reference(DeclarationId(309))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 21820, 21981) }, - Declaration { id: DeclarationId(1097), name: Some("go_int_ne".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(310))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} != {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 21983, 22123) }, - Declaration { id: DeclarationId(1098), name: Some("go_node_id_ne".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(630))), ("op".to_string(), FieldValue::Reference(DeclarationId(310))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} != {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 22125, 22272) }, - Declaration { id: DeclarationId(1099), name: Some("go_port_id_ne".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(631))), ("op".to_string(), FieldValue::Reference(DeclarationId(310))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} != {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 22274, 22421) }, - Declaration { id: DeclarationId(1100), name: Some("go_declaration_id_ne".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(632))), ("op".to_string(), FieldValue::Reference(DeclarationId(310))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} != {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 22423, 22584) }, - Declaration { id: DeclarationId(1101), name: Some("go_int_lt".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(311))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} < {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 22586, 22725) }, - Declaration { id: DeclarationId(1102), name: Some("go_int_le".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(312))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} <= {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 22727, 22867) }, - Declaration { id: DeclarationId(1103), name: Some("go_int_gt".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(313))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} > {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 22869, 23008) }, - Declaration { id: DeclarationId(1104), name: Some("go_int_ge".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(314))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} >= {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 23010, 23150) }, - Declaration { id: DeclarationId(1105), name: Some("go_bool_meet".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(88))), ("op".to_string(), FieldValue::Reference(DeclarationId(324))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} && {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 23152, 23301) }, - Declaration { id: DeclarationId(1106), name: Some("go_bool_join".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(88))), ("op".to_string(), FieldValue::Reference(DeclarationId(325))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} || {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 23303, 23452) }, - Declaration { id: DeclarationId(1107), name: Some("go_let_stmt".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(859), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(859)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(1019))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("var {name} {type} = {value}".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(0)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 23454, 23587) }, - Declaration { id: DeclarationId(1108), name: Some("go_if_expr".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(859), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(859)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(1017))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("if {cond} { {then} } else { {else} }".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(0)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 23589, 23732) }, - Declaration { id: DeclarationId(1109), name: Some("go_main_wrap".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(859), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(859)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(1020))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("func main() {\n{body}\nfmt.Println({final})\n}".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(0)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 23734, 23887) }, - Declaration { id: DeclarationId(1110), name: Some("go_empty_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(596))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1787), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 23889, 24027) }, - Declaration { id: DeclarationId(1111), name: Some("go_singleton_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(600))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1788), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1786), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 24029, 24221) }, - Declaration { id: DeclarationId(1112), name: Some("go_cons_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(598))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1786), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1786), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 24223, 24440) }, - Declaration { id: DeclarationId(1113), name: Some("go_concat_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(608))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1790), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1786), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1786), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 24442, 24665) }, - Declaration { id: DeclarationId(1114), name: Some("go_length_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(618))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1791), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1785), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 24667, 24850) }, - Declaration { id: DeclarationId(1115), name: Some("go_list_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(863), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(863)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(594))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("[]{element}".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 24852, 24988) }, - Declaration { id: DeclarationId(1116), name: Some("go_result_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(863), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(863)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(11))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("v3Result[{key}, {value}]".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 25674, 25827) }, - Declaration { id: DeclarationId(1117), name: Some("go_map_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(863), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(863)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(97))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("map[{key}]{value}".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 25829, 25969) }, - Declaration { id: DeclarationId(1118), name: Some("go_is_empty_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(620))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1792), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1785), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 25971, 26159) }, - Declaration { id: DeclarationId(1119), name: Some("go_fold_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(602))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1793), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1785), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1786), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(2))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1785), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 26161, 26418) }, - Declaration { id: DeclarationId(1120), name: Some("go_map_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(610))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1794), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1785), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1785), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 26420, 26634) }, - Declaration { id: DeclarationId(1121), name: Some("go_filter_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(613))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1795), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1785), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1785), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 26636, 26859) }, - Declaration { id: DeclarationId(1122), name: Some("go_contains_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(628))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1796), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1785), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1785), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 26861, 27090) }, - Declaration { id: DeclarationId(1123), name: Some("go_list_pattern".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(865), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(865)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("target".to_string(), FieldValue::Reference(DeclarationId(594))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1798), payload: vec![] }), ("empty_variant".to_string(), FieldValue::Reference(DeclarationId(1424))), ("cons_variant".to_string(), FieldValue::Reference(DeclarationId(1426))), ("scrutinee".to_string(), FieldValue::Literal(LiteralBits::String("{expr}".to_string()))), ("empty_pattern".to_string(), FieldValue::Literal(LiteralBits::String("len({expr}) == 0".to_string()))), ("cons_pattern".to_string(), FieldValue::Literal(LiteralBits::String("{expr}".to_string()))), ("head_expr".to_string(), FieldValue::Literal(LiteralBits::String("{list}[0]".to_string()))), ("tail_expr".to_string(), FieldValue::Literal(LiteralBits::String("{list}[1:]".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 27177, 27483) }, - Declaration { id: DeclarationId(1124), name: Some("go_statements".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(867), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(867)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("let_binding".to_string(), FieldValue::Literal(LiteralBits::String("var {name} {type} = {value}".to_string()))), ("let_binding_inferred".to_string(), FieldValue::Literal(LiteralBits::String("{name} := {value}".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 27485, 27615) }, - Declaration { id: DeclarationId(1125), name: Some("go_expressions".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(868), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(868)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("field_access".to_string(), FieldValue::Literal(LiteralBits::String("({object}).{field}".to_string()))), ("function_call".to_string(), FieldValue::Literal(LiteralBits::String("{func}({args})".to_string()))), ("closure".to_string(), FieldValue::Literal(LiteralBits::String("func({params}) { return {body} }".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 27617, 27777) }, - Declaration { id: DeclarationId(1126), name: Some("go_control_flow".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(870), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(870)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("if_else".to_string(), FieldValue::Literal(LiteralBits::String("if {cond} { {then} } else { {else} }".to_string()))), ("match_arm".to_string(), FieldValue::Literal(LiteralBits::String("{pattern}: return {body}".to_string()))), ("for_each_syntax".to_string(), FieldValue::Record(vec![("prefix".to_string(), FieldValue::Literal(LiteralBits::String("for _, ".to_string()))), ("separator".to_string(), FieldValue::Literal(LiteralBits::String(" := range ".to_string())))]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 27779, 27980) }, - Declaration { id: DeclarationId(1127), name: Some("go_literals".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(871), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(871)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("true_keyword".to_string(), FieldValue::Literal(LiteralBits::String("true".to_string()))), ("false_keyword".to_string(), FieldValue::Literal(LiteralBits::String("false".to_string()))), ("string_delimiter".to_string(), FieldValue::Literal(LiteralBits::String("%Q".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 27982, 28092) }, - Declaration { id: DeclarationId(1128), name: Some("go_modules".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(872), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(872)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("path_separator".to_string(), FieldValue::Literal(LiteralBits::String(".".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 28094, 28151) }, - Declaration { id: DeclarationId(1129), name: Some("go_functions".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(873), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(873)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("definition".to_string(), FieldValue::Literal(LiteralBits::String("func {name}({params}) {ret} { return {body} }".to_string()))), ("definition_exported".to_string(), FieldValue::Literal(LiteralBits::String("func {name}({params}) {ret} { return {body} }".to_string()))), ("definition_void".to_string(), FieldValue::Literal(LiteralBits::String("func {name}({params}) { {body} }".to_string()))), ("param_with_type".to_string(), FieldValue::Literal(LiteralBits::String("{name} {type}".to_string()))), ("param_separator".to_string(), FieldValue::Literal(LiteralBits::String(", ".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 28153, 28438) }, - Declaration { id: DeclarationId(1130), name: Some("go_type_applications".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(874), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(874)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("optional".to_string(), FieldValue::Literal(LiteralBits::String("*{element}".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 28440, 28519) }, - Declaration { id: DeclarationId(1131), name: Some("go_type_defs".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(875), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(875)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("struct_def".to_string(), FieldValue::Literal(LiteralBits::String("type {name} struct { {fields} }".to_string()))), ("struct_field".to_string(), FieldValue::Literal(LiteralBits::String("{name} {type}".to_string()))), ("enum_def".to_string(), FieldValue::Literal(LiteralBits::String("type {name} interface{}".to_string()))), ("enum_unit_variant".to_string(), FieldValue::Literal(LiteralBits::String("{name}".to_string()))), ("enum_data_variant".to_string(), FieldValue::Literal(LiteralBits::String("{name}".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 28521, 28744) }, - Declaration { id: DeclarationId(1132), name: Some("go_patterns".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(877), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(877)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("match_expr".to_string(), FieldValue::Literal(LiteralBits::String("{expr}".to_string()))), ("match_arm".to_string(), FieldValue::Literal(LiteralBits::String("{pattern}: return {body}".to_string()))), ("variant_pattern".to_string(), FieldValue::Literal(LiteralBits::String("{name}".to_string()))), ("variant_pattern_positional".to_string(), FieldValue::Literal(LiteralBits::String("{name}".to_string()))), ("variant_pattern_empty".to_string(), FieldValue::Literal(LiteralBits::String("{name}".to_string()))), ("field_binding".to_string(), FieldValue::Literal(LiteralBits::String("{field}: {binding}".to_string()))), ("field_binding_separator".to_string(), FieldValue::Literal(LiteralBits::String(", ".to_string()))), ("wildcard".to_string(), FieldValue::Literal(LiteralBits::String("_".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 28746, 29038) }, - Declaration { id: DeclarationId(1133), name: Some("go_collection_ops".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(878), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(878)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("concat".to_string(), FieldValue::Literal(LiteralBits::String("append({left}, {right}...)".to_string()))), ("length".to_string(), FieldValue::Literal(LiteralBits::String("int64(len({recv}))".to_string()))), ("is_empty".to_string(), FieldValue::Literal(LiteralBits::String("len({recv}) == 0".to_string()))), ("fold".to_string(), FieldValue::Literal(LiteralBits::String("/* fold({recv}, {init}, {body}) */".to_string()))), ("map".to_string(), FieldValue::Literal(LiteralBits::String("/* map({recv}, {body}) */".to_string()))), ("filter".to_string(), FieldValue::Literal(LiteralBits::String("/* filter({recv}, {body}) */".to_string()))), ("contains".to_string(), FieldValue::Literal(LiteralBits::String("/* contains({recv}, {item}) */".to_string()))), ("empty_list".to_string(), FieldValue::Literal(LiteralBits::String("nil".to_string()))), ("list_literal".to_string(), FieldValue::Literal(LiteralBits::String("[]{element_type}{{{elements}}}".to_string()))), ("cons".to_string(), FieldValue::Literal(LiteralBits::String("append([]{element_type}{{{head}}}, {tail}...)".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 29040, 29475) }, - Declaration { id: DeclarationId(1134), name: Some("go_value_construction".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(879), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(879)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("struct_literal".to_string(), FieldValue::Literal(LiteralBits::String("{type}{{ {fields} }}".to_string()))), ("struct_field_init".to_string(), FieldValue::Literal(LiteralBits::String("{name}: {value}".to_string()))), ("struct_field_separator".to_string(), FieldValue::Literal(LiteralBits::String(", ".to_string()))), ("variant_construction".to_string(), FieldValue::Literal(LiteralBits::String("{variant}({args})".to_string()))), ("variant_named_construction".to_string(), FieldValue::Literal(LiteralBits::String("{variant}{{ {fields} }}".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 29477, 29745) }, - Declaration { id: DeclarationId(1135), name: Some("go_record_derive_templates".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(876), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(876)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("struct_def_no_debug".to_string(), FieldValue::Literal(LiteralBits::String("".to_string()))), ("enum_def_no_debug".to_string(), FieldValue::Literal(LiteralBits::String("".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 30502, 30617) }, - Declaration { id: DeclarationId(1136), name: Some("go_language".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(883), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(883)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("statements".to_string(), FieldValue::Reference(DeclarationId(1124))), ("expressions".to_string(), FieldValue::Reference(DeclarationId(1125))), ("control_flow".to_string(), FieldValue::Reference(DeclarationId(1126))), ("literals".to_string(), FieldValue::Reference(DeclarationId(1127))), ("modules".to_string(), FieldValue::Reference(DeclarationId(1128))), ("functions".to_string(), FieldValue::Reference(DeclarationId(1129))), ("type_applications".to_string(), FieldValue::Reference(DeclarationId(1130))), ("type_definitions".to_string(), FieldValue::Reference(DeclarationId(1131))), ("record_derive_templates".to_string(), FieldValue::Reference(DeclarationId(1135))), ("patterns".to_string(), FieldValue::Reference(DeclarationId(1132))), ("collection_ops".to_string(), FieldValue::Reference(DeclarationId(1133))), ("values".to_string(), FieldValue::Reference(DeclarationId(1134)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 30619, 31038) }, - Declaration { id: DeclarationId(1137), name: Some("go_correction_style".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(789), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(789)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("indent_unit".to_string(), FieldValue::Literal(LiteralBits::String("\t".to_string()))), ("line_ending".to_string(), FieldValue::Literal(LiteralBits::String("\n".to_string()))), ("string_quote".to_string(), FieldValue::Literal(LiteralBits::String("%Q".to_string()))), ("trailing_semicolon".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 32705, 32841) }, - Declaration { id: DeclarationId(1138), name: Some("go_clean_emission".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(780), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(780)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("expression_wrapping".to_string(), FieldValue::Variant { constructor: DeclarationId(1668), payload: vec![] }), ("pattern_bindings".to_string(), FieldValue::Variant { constructor: DeclarationId(1671), payload: vec![] }), ("variant_payload_field_access".to_string(), FieldValue::Variant { constructor: DeclarationId(1674), payload: vec![] }), ("imports".to_string(), FieldValue::Variant { constructor: DeclarationId(1677), payload: vec![] }), ("block_return".to_string(), FieldValue::Variant { constructor: DeclarationId(1681), payload: vec![] }), ("variable_bindings".to_string(), FieldValue::Variant { constructor: DeclarationId(1683), payload: vec![] }), ("match_arm_body".to_string(), FieldValue::Variant { constructor: DeclarationId(1687), payload: vec![] }), ("correction_style".to_string(), FieldValue::Reference(DeclarationId(1137))), ("post_emit_verifier".to_string(), FieldValue::Record(vec![("command".to_string(), FieldValue::Literal(LiteralBits::String("gofmt".to_string()))), ("args".to_string(), FieldValue::List(vec![FieldValue::Literal(LiteralBits::String("-l".to_string()))])), ("syntax_only".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("expected_exit_code".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("output_policy".to_string(), FieldValue::Variant { constructor: DeclarationId(1690), payload: vec![] })]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 32843, 33401) }, - Declaration { id: DeclarationId(1139), name: Some("go_clean_emission_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(781), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(781)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1136))), ("clean_emission".to_string(), FieldValue::Reference(DeclarationId(1138)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 33403, 33527) }, - Declaration { id: DeclarationId(1140), name: Some("python_statements".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(867), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(867)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("let_binding".to_string(), FieldValue::Literal(LiteralBits::String("{name} = {value}".to_string()))), ("let_binding_inferred".to_string(), FieldValue::Literal(LiteralBits::String("{name} = {value}".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 1797, 1919) }, - Declaration { id: DeclarationId(1141), name: Some("python_expressions".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(868), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(868)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("field_access".to_string(), FieldValue::Literal(LiteralBits::String("{object}.{field}".to_string()))), ("function_call".to_string(), FieldValue::Literal(LiteralBits::String("{func}({args})".to_string()))), ("closure".to_string(), FieldValue::Literal(LiteralBits::String("lambda {params}: {body}".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 1921, 2074) }, - Declaration { id: DeclarationId(1142), name: Some("python_control_flow".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(870), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(870)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("if_else".to_string(), FieldValue::Literal(LiteralBits::String("({then} if {cond} else {else})".to_string()))), ("match_arm".to_string(), FieldValue::Literal(LiteralBits::String("{pattern}: {body}".to_string()))), ("for_each_syntax".to_string(), FieldValue::Record(vec![("prefix".to_string(), FieldValue::Literal(LiteralBits::String("for {item} in {iter}:\n{body}".to_string()))), ("separator".to_string(), FieldValue::Literal(LiteralBits::String("\n".to_string())))]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 2076, 2291) }, - Declaration { id: DeclarationId(1143), name: Some("python_literals".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(871), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(871)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("true_keyword".to_string(), FieldValue::Literal(LiteralBits::String("True".to_string()))), ("false_keyword".to_string(), FieldValue::Literal(LiteralBits::String("False".to_string()))), ("string_delimiter".to_string(), FieldValue::Literal(LiteralBits::String("%Q".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 2293, 2407) }, - Declaration { id: DeclarationId(1144), name: Some("python_modules".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(872), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(872)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("path_separator".to_string(), FieldValue::Literal(LiteralBits::String(".".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 2409, 2470) }, - Declaration { id: DeclarationId(1145), name: Some("python_functions".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(873), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(873)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("definition".to_string(), FieldValue::Literal(LiteralBits::String("def {name}({params}) -> {ret}:\n return {body}".to_string()))), ("definition_exported".to_string(), FieldValue::Literal(LiteralBits::String("def {name}({params}) -> {ret}:\n return {body}".to_string()))), ("definition_void".to_string(), FieldValue::Literal(LiteralBits::String("def {name}({params}) -> None:\n {body}".to_string()))), ("param_with_type".to_string(), FieldValue::Literal(LiteralBits::String("{name}: {type}".to_string()))), ("param_separator".to_string(), FieldValue::Literal(LiteralBits::String(", ".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 2472, 2779) }, - Declaration { id: DeclarationId(1146), name: Some("python_type_applications".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(874), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(874)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("optional".to_string(), FieldValue::Literal(LiteralBits::String("typing.Optional[{element}]".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 2781, 2880) }, - Declaration { id: DeclarationId(1147), name: Some("python_type_definitions".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(875), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(875)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("struct_def".to_string(), FieldValue::Literal(LiteralBits::String("@dataclass\nclass {name}:\n{fields}".to_string()))), ("struct_field".to_string(), FieldValue::Literal(LiteralBits::String("{name}: {type}".to_string()))), ("enum_def".to_string(), FieldValue::Literal(LiteralBits::String("class {name}:\n pass\n\n{variants}".to_string()))), ("enum_unit_variant".to_string(), FieldValue::Literal(LiteralBits::String("@dataclass\nclass {name}({parent}):\n pass".to_string()))), ("enum_data_variant".to_string(), FieldValue::Literal(LiteralBits::String("@dataclass\nclass {name}({parent}):\n{fields}".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 2882, 3213) }, - Declaration { id: DeclarationId(1148), name: Some("python_patterns".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(877), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(877)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("match_expr".to_string(), FieldValue::Literal(LiteralBits::String("match {expr} { {arms} }".to_string()))), ("match_arm".to_string(), FieldValue::Literal(LiteralBits::String("{pattern}: {body}".to_string()))), ("variant_pattern".to_string(), FieldValue::Literal(LiteralBits::String("{name}({bindings})".to_string()))), ("variant_pattern_positional".to_string(), FieldValue::Literal(LiteralBits::String("{name}({binding})".to_string()))), ("variant_pattern_empty".to_string(), FieldValue::Literal(LiteralBits::String("{name}()".to_string()))), ("field_binding".to_string(), FieldValue::Literal(LiteralBits::String("{field}={binding}".to_string()))), ("field_binding_separator".to_string(), FieldValue::Literal(LiteralBits::String(", ".to_string()))), ("wildcard".to_string(), FieldValue::Literal(LiteralBits::String("_".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 3215, 3545) }, - Declaration { id: DeclarationId(1149), name: Some("python_collections".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(878), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(878)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("concat".to_string(), FieldValue::Literal(LiteralBits::String("[*{left}, *{right}]".to_string()))), ("length".to_string(), FieldValue::Literal(LiteralBits::String("len({recv})".to_string()))), ("is_empty".to_string(), FieldValue::Literal(LiteralBits::String("(len({recv}) == 0)".to_string()))), ("fold".to_string(), FieldValue::Literal(LiteralBits::String("__v3_fold({recv}, {init}, {body})".to_string()))), ("map".to_string(), FieldValue::Literal(LiteralBits::String("[{body} for {item} in {recv}]".to_string()))), ("filter".to_string(), FieldValue::Literal(LiteralBits::String("[{item_push} for {item} in {recv} if {predicate}]".to_string()))), ("contains".to_string(), FieldValue::Literal(LiteralBits::String("({item} in {recv})".to_string()))), ("empty_list".to_string(), FieldValue::Literal(LiteralBits::String("[]".to_string()))), ("list_literal".to_string(), FieldValue::Literal(LiteralBits::String("[{elements}]".to_string()))), ("cons".to_string(), FieldValue::Literal(LiteralBits::String("[{head}, *{tail}]".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 3547, 3936) }, - Declaration { id: DeclarationId(1150), name: Some("python_value_construction".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(879), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(879)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("struct_literal".to_string(), FieldValue::Literal(LiteralBits::String("{name}({fields})".to_string()))), ("struct_field_init".to_string(), FieldValue::Literal(LiteralBits::String("{field}={value}".to_string()))), ("struct_field_separator".to_string(), FieldValue::Literal(LiteralBits::String(", ".to_string()))), ("variant_construction".to_string(), FieldValue::Literal(LiteralBits::String("{name}()".to_string()))), ("variant_named_construction".to_string(), FieldValue::Literal(LiteralBits::String("{name}({fields})".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 3938, 4190) }, - Declaration { id: DeclarationId(1151), name: Some("python_record_derive_templates".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(876), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(876)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("struct_def_no_debug".to_string(), FieldValue::Literal(LiteralBits::String("".to_string()))), ("enum_def_no_debug".to_string(), FieldValue::Literal(LiteralBits::String("".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 4393, 4512) }, - Declaration { id: DeclarationId(1152), name: Some("python_language".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(883), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(883)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("statements".to_string(), FieldValue::Reference(DeclarationId(1140))), ("expressions".to_string(), FieldValue::Reference(DeclarationId(1141))), ("control_flow".to_string(), FieldValue::Reference(DeclarationId(1142))), ("literals".to_string(), FieldValue::Reference(DeclarationId(1143))), ("modules".to_string(), FieldValue::Reference(DeclarationId(1144))), ("functions".to_string(), FieldValue::Reference(DeclarationId(1145))), ("type_applications".to_string(), FieldValue::Reference(DeclarationId(1146))), ("type_definitions".to_string(), FieldValue::Reference(DeclarationId(1147))), ("record_derive_templates".to_string(), FieldValue::Reference(DeclarationId(1151))), ("patterns".to_string(), FieldValue::Reference(DeclarationId(1148))), ("collection_ops".to_string(), FieldValue::Reference(DeclarationId(1149))), ("values".to_string(), FieldValue::Reference(DeclarationId(1150)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 4514, 4989) }, - Declaration { id: DeclarationId(1153), name: Some("python_target".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(815), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(815)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("memory".to_string(), FieldValue::Variant { constructor: DeclarationId(1732), payload: vec![] }), ("scope".to_string(), FieldValue::Variant { constructor: DeclarationId(1735), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 4991, 5088) }, - Declaration { id: DeclarationId(1154), name: Some("python_source_filtering".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(817), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(817)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("internal".to_string(), FieldValue::Reference(DeclarationId(818))), ("additional_excluded_prefixes".to_string(), FieldValue::List(vec![]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 5090, 5226) }, - Declaration { id: DeclarationId(1155), name: Some("python_execution_requirement".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(819), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(819)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/python.dag", 5291, 5307))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 5228, 5307) }, - Declaration { id: DeclarationId(1156), name: Some("python_int".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("int".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 5309, 5445) }, - Declaration { id: DeclarationId(1157), name: Some("python_bool".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(88))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("bool".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 5447, 5586) }, - Declaration { id: DeclarationId(1158), name: Some("python_string".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(186))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("str".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 5588, 5730) }, - Declaration { id: DeclarationId(1159), name: Some("python_node_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(630))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NodeId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 5732, 5878) }, - Declaration { id: DeclarationId(1160), name: Some("python_port_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(631))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PortId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 5880, 6026) }, - Declaration { id: DeclarationId(1161), name: Some("python_declaration_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(632))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("DeclarationId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 6028, 6195) }, - Declaration { id: DeclarationId(1162), name: Some("python_declaration_ref".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(1021))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("DeclarationId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 6197, 6366) }, - Declaration { id: DeclarationId(1163), name: Some("python_source_span".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(121))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SourceSpan".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 6368, 6527) }, - Declaration { id: DeclarationId(1164), name: Some("python_dag_port".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(689))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("DagPort".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 6529, 6679) }, - Declaration { id: DeclarationId(1165), name: Some("python_branch_path".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(714))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BranchPath".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 6681, 6840) }, - Declaration { id: DeclarationId(1166), name: Some("python_value_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(723))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ValueNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 6842, 6998) }, - Declaration { id: DeclarationId(1167), name: Some("python_transform_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(724))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TransformNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 7000, 7168) }, - Declaration { id: DeclarationId(1168), name: Some("python_branch_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(726))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BranchNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 7170, 7329) }, - Declaration { id: DeclarationId(1169), name: Some("python_loop_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(727))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("LoopNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 7331, 7484) }, - Declaration { id: DeclarationId(1170), name: Some("python_bind_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(729))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BindNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 7486, 7639) }, - Declaration { id: DeclarationId(1171), name: Some("python_behavior".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(730))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Behavior".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 7641, 7793) }, - Declaration { id: DeclarationId(1172), name: Some("python_dag".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(731))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Dag".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 7795, 7932) }, - Declaration { id: DeclarationId(1173), name: Some("python_surface_module".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(950))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceModule".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("items".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("items".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 8006, 8255) }, - Declaration { id: DeclarationId(1174), name: Some("python_surface_item".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(963))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceItem".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 8257, 8419) }, - Declaration { id: DeclarationId(1175), name: Some("python_surface_param".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(951))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceParam".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("ty".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("ty".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("refinement".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("refinement".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 8421, 8827) }, - Declaration { id: DeclarationId(1176), name: Some("python_surface_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(952))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceField".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("ty".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("ty".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 8829, 9146) }, - Declaration { id: DeclarationId(1177), name: Some("python_surface_variant".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(953))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceVariant".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("payload".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("payload".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 9148, 9558) }, - Declaration { id: DeclarationId(1178), name: Some("python_variant_payload".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(954))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("VariantPayload".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 9560, 9731) }, - Declaration { id: DeclarationId(1179), name: Some("python_surface_type".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(955))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceType".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 9733, 9895) }, - Declaration { id: DeclarationId(1180), name: Some("python_surface_record_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(956))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceRecordField".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("value".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("value".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 9897, 10316) }, - Declaration { id: DeclarationId(1181), name: Some("python_surface_map_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(957))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceMapEntry".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("key".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("key".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("key_span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("key_span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("value".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("value".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 10318, 10811) }, - Declaration { id: DeclarationId(1182), name: Some("python_surface_match_arm".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(958))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceMatchArm".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("pattern".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("pattern".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("body".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("body".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 10813, 11227) }, - Declaration { id: DeclarationId(1183), name: Some("python_surface_pattern_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(959))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfacePatternField".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("binding".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("binding".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 11229, 11655) }, - Declaration { id: DeclarationId(1184), name: Some("python_surface_pattern".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(960))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfacePattern".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 11657, 11828) }, - Declaration { id: DeclarationId(1185), name: Some("python_surface_literal".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(961))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceLiteral".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 11830, 12001) }, - Declaration { id: DeclarationId(1186), name: Some("python_surface_expr".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(962))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceExpr".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 12003, 12165) }, - Declaration { id: DeclarationId(1187), name: Some("python_int_add".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(300))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} + {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 12167, 12316) }, - Declaration { id: DeclarationId(1188), name: Some("python_int_sub".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(301))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} - {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 12318, 12467) }, - Declaration { id: DeclarationId(1189), name: Some("python_int_mul".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(303))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} * {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 12469, 12618) }, - Declaration { id: DeclarationId(1190), name: Some("python_int_div".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(305))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("(__v3_idiv({lhs}, {rhs}))".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 12620, 12779) }, - Declaration { id: DeclarationId(1191), name: Some("python_int_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(309))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 12781, 12929) }, - Declaration { id: DeclarationId(1192), name: Some("python_node_id_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(630))), ("op".to_string(), FieldValue::Reference(DeclarationId(309))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 12931, 13086) }, - Declaration { id: DeclarationId(1193), name: Some("python_port_id_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(631))), ("op".to_string(), FieldValue::Reference(DeclarationId(309))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 13088, 13243) }, - Declaration { id: DeclarationId(1194), name: Some("python_declaration_id_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(632))), ("op".to_string(), FieldValue::Reference(DeclarationId(309))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 13245, 13414) }, - Declaration { id: DeclarationId(1195), name: Some("python_int_ne".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(310))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} != {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 13416, 13564) }, - Declaration { id: DeclarationId(1196), name: Some("python_int_lt".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(311))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} < {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 13566, 13713) }, - Declaration { id: DeclarationId(1197), name: Some("python_int_le".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(312))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} <= {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 13715, 13863) }, - Declaration { id: DeclarationId(1198), name: Some("python_int_gt".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(313))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} > {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 13865, 14012) }, - Declaration { id: DeclarationId(1199), name: Some("python_int_ge".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(314))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} >= {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 14014, 14162) }, - Declaration { id: DeclarationId(1200), name: Some("python_bool_meet".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(88))), ("op".to_string(), FieldValue::Reference(DeclarationId(324))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} and {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 14164, 14322) }, - Declaration { id: DeclarationId(1201), name: Some("python_bool_join".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(88))), ("op".to_string(), FieldValue::Reference(DeclarationId(325))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} or {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 14324, 14481) }, - Declaration { id: DeclarationId(1202), name: Some("python_empty_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(596))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1787), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 14483, 14629) }, - Declaration { id: DeclarationId(1203), name: Some("python_singleton_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(600))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1788), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1786), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 14631, 14831) }, - Declaration { id: DeclarationId(1204), name: Some("python_cons_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(598))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1786), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1786), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 14833, 15058) }, - Declaration { id: DeclarationId(1205), name: Some("python_concat_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(608))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1790), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1786), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1786), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 15060, 15291) }, - Declaration { id: DeclarationId(1206), name: Some("python_length_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(618))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1791), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1785), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 15293, 15484) }, - Declaration { id: DeclarationId(1207), name: Some("python_is_empty_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(620))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1792), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1785), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 15486, 15682) }, - Declaration { id: DeclarationId(1208), name: Some("python_fold_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(602))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1793), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1785), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1786), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(2))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1785), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 15684, 15949) }, - Declaration { id: DeclarationId(1209), name: Some("python_map_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(610))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1794), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1785), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1785), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 15951, 16173) }, - Declaration { id: DeclarationId(1210), name: Some("python_filter_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(613))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1795), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1785), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1785), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 16175, 16406) }, - Declaration { id: DeclarationId(1211), name: Some("python_contains_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(628))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1796), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1785), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1785), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 16408, 16645) }, - Declaration { id: DeclarationId(1212), name: Some("python_list_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(863), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(863)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(594))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("list[{element}]".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 16647, 16795) }, - Declaration { id: DeclarationId(1213), name: Some("python_result_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(863), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(863)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(11))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("typing.Union[typing.Tuple[typing.Literal['Ok'], {key}], typing.Tuple[typing.Literal['Err'], {value}]]".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 16911, 17149) }, - Declaration { id: DeclarationId(1214), name: Some("python_non_empty_list_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(863), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(863)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(634))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NonEmptyList[{element}]".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 17240, 17414) }, - Declaration { id: DeclarationId(1215), name: Some("python_non_singleton_list_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(863), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(863)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(636))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NonSingletonList[{element}]".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 17416, 17602) }, - Declaration { id: DeclarationId(1216), name: Some("python_list_pattern".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(865), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(865)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("target".to_string(), FieldValue::Reference(DeclarationId(594))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1798), payload: vec![] }), ("empty_variant".to_string(), FieldValue::Reference(DeclarationId(1424))), ("cons_variant".to_string(), FieldValue::Reference(DeclarationId(1426))), ("scrutinee".to_string(), FieldValue::Literal(LiteralBits::String("{expr}".to_string()))), ("empty_pattern".to_string(), FieldValue::Literal(LiteralBits::String("len({expr}) == 0".to_string()))), ("cons_pattern".to_string(), FieldValue::Literal(LiteralBits::String("{expr}".to_string()))), ("head_expr".to_string(), FieldValue::Literal(LiteralBits::String("{list}[0]".to_string()))), ("tail_expr".to_string(), FieldValue::Literal(LiteralBits::String("{list}[1:]".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 17603, 17917) }, - Declaration { id: DeclarationId(1217), name: Some("python_correction_style".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(789), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(789)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("indent_unit".to_string(), FieldValue::Literal(LiteralBits::String(" ".to_string()))), ("line_ending".to_string(), FieldValue::Literal(LiteralBits::String("\n".to_string()))), ("string_quote".to_string(), FieldValue::Literal(LiteralBits::String("%Q".to_string()))), ("trailing_semicolon".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 19982, 20124) }, - Declaration { id: DeclarationId(1218), name: Some("python_clean_emission".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(780), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(780)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("expression_wrapping".to_string(), FieldValue::Variant { constructor: DeclarationId(1668), payload: vec![] }), ("pattern_bindings".to_string(), FieldValue::Variant { constructor: DeclarationId(1673), payload: vec![] }), ("variant_payload_field_access".to_string(), FieldValue::Variant { constructor: DeclarationId(1674), payload: vec![] }), ("imports".to_string(), FieldValue::Variant { constructor: DeclarationId(1677), payload: vec![] }), ("block_return".to_string(), FieldValue::Variant { constructor: DeclarationId(1681), payload: vec![] }), ("variable_bindings".to_string(), FieldValue::Variant { constructor: DeclarationId(1682), payload: vec![] }), ("match_arm_body".to_string(), FieldValue::Variant { constructor: DeclarationId(1687), payload: vec![] }), ("correction_style".to_string(), FieldValue::Reference(DeclarationId(1217))), ("post_emit_verifier".to_string(), FieldValue::Record(vec![("command".to_string(), FieldValue::Literal(LiteralBits::String("python3".to_string()))), ("args".to_string(), FieldValue::List(vec![FieldValue::Literal(LiteralBits::String("-m".to_string())), FieldValue::Literal(LiteralBits::String("py_compile".to_string()))])), ("syntax_only".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("expected_exit_code".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("output_policy".to_string(), FieldValue::Variant { constructor: DeclarationId(1689), payload: vec![] })]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 20126, 20706) }, - Declaration { id: DeclarationId(1219), name: Some("python_clean_emission_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(781), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(781)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1152))), ("clean_emission".to_string(), FieldValue::Reference(DeclarationId(1218)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 20708, 20844) }, - Declaration { id: DeclarationId(1220), name: Some("rust_execution_model".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(815), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(815)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("memory".to_string(), FieldValue::Variant { constructor: DeclarationId(1734), payload: vec![] }), ("scope".to_string(), FieldValue::Variant { constructor: DeclarationId(1735), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 4357, 4459) }, - Declaration { id: DeclarationId(1221), name: Some("rust_source_filtering".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(817), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(817)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("internal".to_string(), FieldValue::Reference(DeclarationId(818))), ("additional_excluded_prefixes".to_string(), FieldValue::List(vec![FieldValue::Literal(LiteralBits::String("src/v3/compiler/".to_string()))]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 4461, 4613) }, - Declaration { id: DeclarationId(1222), name: Some("rust_execution_requirement".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(819), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(819)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/rust.dag", 4676, 4690))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 4615, 4690) }, - Declaration { id: DeclarationId(1223), name: Some("rust_int".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("i64".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 5141, 5273) }, - Declaration { id: DeclarationId(1224), name: Some("rust_uint8".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(67))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("u8".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 5275, 5410) }, - Declaration { id: DeclarationId(1225), name: Some("rust_bool".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(88))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("bool".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 5412, 5547) }, - Declaration { id: DeclarationId(1226), name: Some("rust_string".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(186))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("String".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 5549, 5691) }, - Declaration { id: DeclarationId(1227), name: Some("rust_node_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(630))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NodeId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 5693, 5835) }, - Declaration { id: DeclarationId(1228), name: Some("rust_port_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(631))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PortId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 5837, 5979) }, - Declaration { id: DeclarationId(1229), name: Some("rust_declaration_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(632))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("DeclarationId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 5981, 6144) }, - Declaration { id: DeclarationId(1230), name: Some("rust_cluster_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(633))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ClusterId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 6146, 6297) }, - Declaration { id: DeclarationId(1231), name: Some("rust_type_shape".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(687))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TypeShape".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("declaration".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("declaration".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 6299, 6544) }, - Declaration { id: DeclarationId(1232), name: Some("rust_port_state".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(688))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PortState".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 6546, 6698) }, - Declaration { id: DeclarationId(1233), name: Some("rust_port".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(689))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Port".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1783), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("state".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1783), payload: vec![FieldValue::Literal(LiteralBits::String("state_value".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("produced_by".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("produced_by".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 6700, 7096) }, - Declaration { id: DeclarationId(1234), name: Some("rust_source_span".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(121))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SourceSpan".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("file".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("file".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("start".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("byte_start".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("end".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("byte_end".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 7098, 7496) }, - Declaration { id: DeclarationId(1235), name: Some("rust_literal_bits".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(690))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("LiteralBits".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 7498, 7656) }, - Declaration { id: DeclarationId(1236), name: Some("rust_atom_payload".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(691))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("AtomPayload".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 7658, 7816) }, - Declaration { id: DeclarationId(1237), name: Some("rust_cardinality_bound".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(696))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("CardinalityBound".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 7818, 7991) }, - Declaration { id: DeclarationId(1238), name: Some("rust_interval".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(694))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Interval".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 7993, 8141) }, - Declaration { id: DeclarationId(1239), name: Some("rust_positive_interval_width".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(692))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PositiveIntervalWidth".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 8143, 8332) }, - Declaration { id: DeclarationId(1240), name: Some("rust_interval_width".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(693))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("IntervalWidth".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 8334, 8498) }, - Declaration { id: DeclarationId(1241), name: Some("rust_conj_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(697))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Field".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("label".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("label".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("ty".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("ty".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 8500, 8802) }, - Declaration { id: DeclarationId(1242), name: Some("rust_template_argument".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(698))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TemplateArgument".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("parameter".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("parameter".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("value".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("value".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 8804, 9145) }, - Declaration { id: DeclarationId(1243), name: Some("rust_phantom_parameter".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(705))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PhantomParameter".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("parameter".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("parameter".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("algebra".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("algebra".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 9147, 9492) }, - Declaration { id: DeclarationId(1244), name: Some("rust_nominal_opacity".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(706))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NominalOpacity".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("permitted_accessors".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("permitted_accessors".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 9494, 9770) }, - Declaration { id: DeclarationId(1245), name: Some("rust_field_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(699))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("(String, FieldValue)".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("label".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("0".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("value".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("1".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 9772, 10089) }, - Declaration { id: DeclarationId(1246), name: Some("rust_non_empty_list".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(634))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NonEmptyList".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("first".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("first".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("rest".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("rest".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 10091, 10411) }, - Declaration { id: DeclarationId(1247), name: Some("rust_non_singleton_list".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(636))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NonSingletonList".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("first".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("first".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("second".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("second".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("rest".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("rest".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 10413, 10826) }, - Declaration { id: DeclarationId(1248), name: Some("rust_element_ref".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(717))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ElementRef".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("index".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1783), payload: vec![FieldValue::Literal(LiteralBits::String("index_of".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 10828, 11069) }, - Declaration { id: DeclarationId(1249), name: Some("rust_param_ref".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(715))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ParamRef".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("member".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1783), payload: vec![FieldValue::Literal(LiteralBits::String("member_of".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("slot".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1783), payload: vec![FieldValue::Literal(LiteralBits::String("slot_of".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 11071, 11391) }, - Declaration { id: DeclarationId(1250), name: Some("rust_transform_ref".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(716))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TransformRef".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("node".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1783), payload: vec![FieldValue::Literal(LiteralBits::String("node_id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 11393, 11638) }, - Declaration { id: DeclarationId(1251), name: Some("rust_member_descent".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(719))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("MemberDescent".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("param".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("param".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 11640, 11885) }, - Declaration { id: DeclarationId(1252), name: Some("rust_intra_cluster_call".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(720))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("IntraClusterCall".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("transform".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("transform".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 11887, 12150) }, - Declaration { id: DeclarationId(1253), name: Some("rust_cluster".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(721))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Cluster".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("members".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("members".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("intra_cluster_calls".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("intra_cluster_calls".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 12152, 12489) }, - Declaration { id: DeclarationId(1254), name: Some("rust_field_value".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(700))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("FieldValue".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 12491, 12646) }, - Declaration { id: DeclarationId(1255), name: Some("rust_value_body".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(701))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ValueBody".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 12648, 12800) }, - Declaration { id: DeclarationId(1256), name: Some("rust_arrow_body".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(702))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ArrowBody".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 12802, 12954) }, - Declaration { id: DeclarationId(1257), name: Some("rust_type_connective".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(703))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TypeConnective".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 12956, 13123) }, - Declaration { id: DeclarationId(1258), name: Some("rust_declaration".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(704))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Declaration".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("connective".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("connective".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("type_params".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("type_params".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("phantom_params".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("phantom_params".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("meta_tag".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("meta_tag".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("inhabits".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("inhabits".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("value_body".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("value_body".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("nominal_opacity".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("nominal_opacity".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 13125, 14146) }, - Declaration { id: DeclarationId(1259), name: Some("rust_arithmetic_op".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(707))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ArithmeticOp".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 14148, 14309) }, - Declaration { id: DeclarationId(1260), name: Some("rust_comparison_op".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(708))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ComparisonOp".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 14311, 14472) }, - Declaration { id: DeclarationId(1261), name: Some("rust_logical_op".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(709))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("LogicalOp".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 14474, 14626) }, - Declaration { id: DeclarationId(1262), name: Some("rust_operator_kind".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(710))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("OperatorKind".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 14628, 14789) }, - Declaration { id: DeclarationId(1263), name: Some("rust_transform_target".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(711))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TransformTarget".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 14791, 14961) }, - Declaration { id: DeclarationId(1264), name: Some("rust_branch_pattern".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(712))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BranchPattern".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 14963, 15127) }, - Declaration { id: DeclarationId(1265), name: Some("rust_payload_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(713))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PayloadBinding".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("binding_name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("binding_name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("payload_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("payload_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 15129, 15484) }, - Declaration { id: DeclarationId(1266), name: Some("rust_branch_path".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(714))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Path".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("body".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("body".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1783), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("pattern".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("pattern".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("binding".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("binding".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 15486, 15974) }, - Declaration { id: DeclarationId(1267), name: Some("rust_loop_bound".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(722))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("LoopBound".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 15976, 16128) }, - Declaration { id: DeclarationId(1268), name: Some("rust_value_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(723))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ValueNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("payload".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("data".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1783), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("lane2_workflow".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1783), payload: vec![FieldValue::Literal(LiteralBits::String("lane2_workflow".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(true)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 16130, 16903) }, - Declaration { id: DeclarationId(1269), name: Some("rust_transform_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(724))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TransformNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("target".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("target".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("inputs".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("inputs".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1783), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 16905, 17477) }, - Declaration { id: DeclarationId(1270), name: Some("rust_branch_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(726))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BranchNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("input".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("input".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("paths".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("paths".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1783), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("emit_participation".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1783), payload: vec![FieldValue::Literal(LiteralBits::String("emit_participation".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 17479, 18146) }, - Declaration { id: DeclarationId(1271), name: Some("rust_loop_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(727))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("LoopNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("source".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("source".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("init".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("init".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("body".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("body".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("bound".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("bound".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1783), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 18148, 18857) }, - Declaration { id: DeclarationId(1272), name: Some("rust_bind_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(729))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BindNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1783), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("params".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("params".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("lane2_workflow".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1783), payload: vec![FieldValue::Literal(LiteralBits::String("lane2_workflow".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(true)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("emit_participation".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1783), payload: vec![FieldValue::Literal(LiteralBits::String("emit_participation".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 18859, 19619) }, - Declaration { id: DeclarationId(1273), name: Some("rust_behavior".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(730))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Behavior".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 19621, 19769) }, - Declaration { id: DeclarationId(1274), name: Some("rust_dag".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(731))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Dag".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("declarations".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1783), payload: vec![FieldValue::Literal(LiteralBits::String("declarations".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(true)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("nodes".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1783), payload: vec![FieldValue::Literal(LiteralBits::String("nodes".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(true)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("ports".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1783), payload: vec![FieldValue::Literal(LiteralBits::String("ports".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("clusters".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1783), payload: vec![FieldValue::Literal(LiteralBits::String("clusters".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(true)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 19771, 20251) }, - Declaration { id: DeclarationId(1275), name: Some("rust_surface_module".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(950))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("parse_surface::SurfaceModule".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("items".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("items".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 20464, 20724) }, - Declaration { id: DeclarationId(1276), name: Some("rust_surface_item".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(963))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("parse_surface::SurfaceItem".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 20726, 20899) }, - Declaration { id: DeclarationId(1277), name: Some("rust_surface_param".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(951))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("parse_surface::SurfaceParam".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("ty".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("ty".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("refinement".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("refinement".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 20901, 21318) }, - Declaration { id: DeclarationId(1278), name: Some("rust_surface_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(952))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("parse_surface::SurfaceField".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("ty".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("ty".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 21320, 21648) }, - Declaration { id: DeclarationId(1279), name: Some("rust_surface_variant".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(953))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("parse_surface::SurfaceVariant".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("payload".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("payload".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 21650, 22071) }, - Declaration { id: DeclarationId(1280), name: Some("rust_variant_payload".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(954))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("parse_surface::VariantPayload".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 22073, 22255) }, - Declaration { id: DeclarationId(1281), name: Some("rust_surface_type".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(955))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("parse_surface::SurfaceType".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 22257, 22430) }, - Declaration { id: DeclarationId(1282), name: Some("rust_surface_record_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(956))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("parse_surface::SurfaceRecordField".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("value".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("value".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 22432, 22862) }, - Declaration { id: DeclarationId(1283), name: Some("rust_surface_map_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(957))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("parse_surface::SurfaceMapEntry".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("key".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("key".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("key_span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("key_span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("value".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("value".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 22864, 23368) }, - Declaration { id: DeclarationId(1284), name: Some("rust_surface_match_arm".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(958))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("parse_surface::SurfaceMatchArm".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("pattern".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("pattern".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("body".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("body".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 23370, 23795) }, - Declaration { id: DeclarationId(1285), name: Some("rust_surface_pattern_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(959))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("parse_surface::SurfacePatternField".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("binding".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("binding".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 23797, 24234) }, - Declaration { id: DeclarationId(1286), name: Some("rust_surface_pattern".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(960))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("parse_surface::SurfacePattern".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 24236, 24418) }, - Declaration { id: DeclarationId(1287), name: Some("rust_surface_literal".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(961))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("parse_surface::SurfaceLiteral".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 24420, 24602) }, - Declaration { id: DeclarationId(1288), name: Some("rust_surface_expr".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(962))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("parse_surface::SurfaceExpr".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 24604, 24777) }, - Declaration { id: DeclarationId(1289), name: Some("rust_int_add".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(300))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} + {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 25632, 25777) }, - Declaration { id: DeclarationId(1290), name: Some("rust_int_sub".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(301))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} - {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 25779, 25924) }, - Declaration { id: DeclarationId(1291), name: Some("rust_int_mul".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(303))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} * {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 25926, 26071) }, - Declaration { id: DeclarationId(1292), name: Some("rust_int_div".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(305))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("(__v3_int_div({lhs}, {rhs}))".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 26073, 26231) }, - Declaration { id: DeclarationId(1293), name: Some("rust_int_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(309))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 26681, 26825) }, - Declaration { id: DeclarationId(1294), name: Some("rust_node_id_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(630))), ("op".to_string(), FieldValue::Reference(DeclarationId(309))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 26827, 26978) }, - Declaration { id: DeclarationId(1295), name: Some("rust_port_id_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(631))), ("op".to_string(), FieldValue::Reference(DeclarationId(309))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 26980, 27131) }, - Declaration { id: DeclarationId(1296), name: Some("rust_declaration_id_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(632))), ("op".to_string(), FieldValue::Reference(DeclarationId(309))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 27133, 27298) }, - Declaration { id: DeclarationId(1297), name: Some("rust_string_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(186))), ("op".to_string(), FieldValue::Reference(DeclarationId(309))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 27491, 27641) }, - Declaration { id: DeclarationId(1298), name: Some("rust_int_ne".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(310))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} != {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 27643, 27787) }, - Declaration { id: DeclarationId(1299), name: Some("rust_node_id_ne".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(630))), ("op".to_string(), FieldValue::Reference(DeclarationId(310))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} != {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 27789, 27940) }, - Declaration { id: DeclarationId(1300), name: Some("rust_port_id_ne".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(631))), ("op".to_string(), FieldValue::Reference(DeclarationId(310))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} != {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 27942, 28093) }, - Declaration { id: DeclarationId(1301), name: Some("rust_declaration_id_ne".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(632))), ("op".to_string(), FieldValue::Reference(DeclarationId(310))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} != {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 28095, 28260) }, - Declaration { id: DeclarationId(1302), name: Some("rust_int_lt".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(311))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} < {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 28262, 28405) }, - Declaration { id: DeclarationId(1303), name: Some("rust_int_le".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(312))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} <= {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 28407, 28551) }, - Declaration { id: DeclarationId(1304), name: Some("rust_int_gt".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(313))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} > {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 28553, 28696) }, - Declaration { id: DeclarationId(1305), name: Some("rust_int_ge".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(314))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} >= {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 28698, 28842) }, - Declaration { id: DeclarationId(1306), name: Some("rust_bool_meet".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(88))), ("op".to_string(), FieldValue::Reference(DeclarationId(324))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} && {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 28844, 28997) }, - Declaration { id: DeclarationId(1307), name: Some("rust_bool_join".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(88))), ("op".to_string(), FieldValue::Reference(DeclarationId(325))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} || {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 28999, 29152) }, - Declaration { id: DeclarationId(1308), name: Some("rust_let_stmt".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(859), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(859)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(1019))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("let {name}: {type} = {value};".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(0)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 29902, 30041) }, - Declaration { id: DeclarationId(1309), name: Some("rust_if_expr".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(859), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(859)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(1017))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("if {cond} { {then} } else { {else} }".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(0)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 30043, 30190) }, - Declaration { id: DeclarationId(1310), name: Some("rust_main_wrap".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(859), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(859)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(1020))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("fn main() { {body} println!({quote}{{}}{quote}, {final}); }".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(0)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 30192, 30362) }, - Declaration { id: DeclarationId(1311), name: Some("rust_empty_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(596))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1787), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 31739, 31881) }, - Declaration { id: DeclarationId(1312), name: Some("rust_singleton_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(600))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1788), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1786), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 31883, 32079) }, - Declaration { id: DeclarationId(1313), name: Some("rust_cons_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(598))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1786), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1786), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 32081, 32302) }, - Declaration { id: DeclarationId(1314), name: Some("rust_concat_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(608))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1790), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1786), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1786), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 32304, 32531) }, - Declaration { id: DeclarationId(1315), name: Some("rust_length_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(618))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1791), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1785), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 32533, 32720) }, - Declaration { id: DeclarationId(1316), name: Some("rust_list_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(863), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(863)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(594))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Vec<{element}>".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 32722, 32865) }, - Declaration { id: DeclarationId(1317), name: Some("rust_result_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(863), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(863)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(11))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("::core::result::Result<{key}, {value}>".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 33144, 33315) }, - Declaration { id: DeclarationId(1318), name: Some("rust_lookup_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(863), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(863)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(945))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Lookup<{element}>".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 33317, 33467) }, - Declaration { id: DeclarationId(1319), name: Some("rust_map_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(863), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(863)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(97))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("HashMap<{key}, {value}>".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 33469, 33619) }, - Declaration { id: DeclarationId(1320), name: Some("rust_is_empty_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(620))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1792), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1785), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 33621, 33813) }, - Declaration { id: DeclarationId(1321), name: Some("rust_fold_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(602))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1793), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1785), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1786), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(2))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1785), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 33815, 34076) }, - Declaration { id: DeclarationId(1322), name: Some("rust_map_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(610))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1794), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1785), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1785), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 34078, 34296) }, - Declaration { id: DeclarationId(1323), name: Some("rust_filter_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(613))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1795), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1785), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1785), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 34298, 34525) }, - Declaration { id: DeclarationId(1324), name: Some("rust_contains_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(628))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1796), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1785), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1785), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 34527, 34760) }, - Declaration { id: DeclarationId(1325), name: Some("rust_list_pattern".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(865), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(865)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("target".to_string(), FieldValue::Reference(DeclarationId(594))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1798), payload: vec![] }), ("empty_variant".to_string(), FieldValue::Reference(DeclarationId(1424))), ("cons_variant".to_string(), FieldValue::Reference(DeclarationId(1426))), ("scrutinee".to_string(), FieldValue::Literal(LiteralBits::String("{expr}".to_string()))), ("empty_pattern".to_string(), FieldValue::Literal(LiteralBits::String("[]".to_string()))), ("cons_pattern".to_string(), FieldValue::Literal(LiteralBits::String("[{head}, {tail} @ ..]".to_string()))), ("head_expr".to_string(), FieldValue::Literal(LiteralBits::String("{head}".to_string()))), ("tail_expr".to_string(), FieldValue::Literal(LiteralBits::String("{tail}".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 34988, 35292) }, - Declaration { id: DeclarationId(1326), name: Some("rust_statements".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(867), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(867)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("let_binding".to_string(), FieldValue::Literal(LiteralBits::String("let {name}: {type} = {value};".to_string()))), ("let_binding_inferred".to_string(), FieldValue::Literal(LiteralBits::String("let {name} = {value};".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 35294, 35432) }, - Declaration { id: DeclarationId(1327), name: Some("rust_expressions".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(868), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(868)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("field_access".to_string(), FieldValue::Literal(LiteralBits::String("({object}).{field}".to_string()))), ("function_call".to_string(), FieldValue::Literal(LiteralBits::String("{func}({args})".to_string()))), ("closure".to_string(), FieldValue::Literal(LiteralBits::String("|{params}| {{ {body} }}".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 35434, 35587) }, - Declaration { id: DeclarationId(1328), name: Some("rust_control_flow".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(870), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(870)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("if_else".to_string(), FieldValue::Literal(LiteralBits::String("if {cond} { {then} } else { {else} }".to_string()))), ("match_arm".to_string(), FieldValue::Literal(LiteralBits::String("{pattern} => {body},".to_string()))), ("for_each_syntax".to_string(), FieldValue::Record(vec![("prefix".to_string(), FieldValue::Literal(LiteralBits::String("for ".to_string()))), ("separator".to_string(), FieldValue::Literal(LiteralBits::String(" in ".to_string())))]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 35589, 35779) }, - Declaration { id: DeclarationId(1329), name: Some("rust_literals".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(871), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(871)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("true_keyword".to_string(), FieldValue::Literal(LiteralBits::String("true".to_string()))), ("false_keyword".to_string(), FieldValue::Literal(LiteralBits::String("false".to_string()))), ("string_delimiter".to_string(), FieldValue::Literal(LiteralBits::String("%Q".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 35781, 35893) }, - Declaration { id: DeclarationId(1330), name: Some("rust_modules".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(872), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(872)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("path_separator".to_string(), FieldValue::Literal(LiteralBits::String("::".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 35895, 35955) }, - Declaration { id: DeclarationId(1331), name: Some("rust_functions".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(873), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(873)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("definition".to_string(), FieldValue::Literal(LiteralBits::String("fn {name}({params}) -> {ret} { {body} }".to_string()))), ("definition_exported".to_string(), FieldValue::Literal(LiteralBits::String("pub fn {name}({params}) -> {ret} { {body} }".to_string()))), ("definition_void".to_string(), FieldValue::Literal(LiteralBits::String("fn {name}({params}) { {body} }".to_string()))), ("param_with_type".to_string(), FieldValue::Literal(LiteralBits::String("{name}: {type}".to_string()))), ("param_separator".to_string(), FieldValue::Literal(LiteralBits::String(", ".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 35957, 36235) }, - Declaration { id: DeclarationId(1332), name: Some("rust_type_applications".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(874), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(874)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("optional".to_string(), FieldValue::Literal(LiteralBits::String("Option<{element}>".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 36237, 36325) }, - Declaration { id: DeclarationId(1333), name: Some("rust_type_defs".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(875), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(875)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("struct_def".to_string(), FieldValue::Literal(LiteralBits::String("#[derive(Clone, Debug)]\npub struct {name} { {fields} }".to_string()))), ("struct_field".to_string(), FieldValue::Literal(LiteralBits::String("pub {name}: {type},".to_string()))), ("enum_def".to_string(), FieldValue::Literal(LiteralBits::String("#[derive(Clone, Debug)]\npub enum {name} { {variants} }".to_string()))), ("enum_unit_variant".to_string(), FieldValue::Literal(LiteralBits::String("{name},".to_string()))), ("enum_data_variant".to_string(), FieldValue::Literal(LiteralBits::String("{name} { {fields} },".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 36327, 36629) }, - Declaration { id: DeclarationId(1334), name: Some("rust_record_derive_templates".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(876), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(876)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("struct_def_no_debug".to_string(), FieldValue::Literal(LiteralBits::String("#[derive(Clone)]\npub struct {name} { {fields} }".to_string()))), ("enum_def_no_debug".to_string(), FieldValue::Literal(LiteralBits::String("#[derive(Clone)]\npub enum {name} { {variants} }".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 36631, 36844) }, - Declaration { id: DeclarationId(1335), name: Some("rust_patterns".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(877), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(877)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("match_expr".to_string(), FieldValue::Literal(LiteralBits::String("match {expr} { {arms} }".to_string()))), ("match_arm".to_string(), FieldValue::Literal(LiteralBits::String("{pattern} => {body},".to_string()))), ("variant_pattern".to_string(), FieldValue::Literal(LiteralBits::String("{name} {{ {bindings} }}".to_string()))), ("variant_pattern_positional".to_string(), FieldValue::Literal(LiteralBits::String("{name}({binding})".to_string()))), ("variant_pattern_empty".to_string(), FieldValue::Literal(LiteralBits::String("{name}".to_string()))), ("field_binding".to_string(), FieldValue::Literal(LiteralBits::String("{field}: {binding}".to_string()))), ("field_binding_separator".to_string(), FieldValue::Literal(LiteralBits::String(", ".to_string()))), ("wildcard".to_string(), FieldValue::Literal(LiteralBits::String("_".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 36846, 37181) }, - Declaration { id: DeclarationId(1336), name: Some("rust_collection_ops".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(878), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(878)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("concat".to_string(), FieldValue::Literal(LiteralBits::String("{ let mut __left = {left}; __left.extend({right}); __left }".to_string()))), ("length".to_string(), FieldValue::Literal(LiteralBits::String("({recv}).len() as i64".to_string()))), ("is_empty".to_string(), FieldValue::Literal(LiteralBits::String("({recv}).is_empty()".to_string()))), ("fold".to_string(), FieldValue::Literal(LiteralBits::String("({recv}).iter().fold({init}, {body})".to_string()))), ("map".to_string(), FieldValue::Literal(LiteralBits::String("({recv}).iter().map({body}).collect::>()".to_string()))), ("filter".to_string(), FieldValue::Literal(LiteralBits::String("{ let mut __out = Vec::new(); for {item} in ({recv}).iter() { if {predicate} { __out.push({item_push}); } } __out }".to_string()))), ("contains".to_string(), FieldValue::Literal(LiteralBits::String("({recv}).contains({item})".to_string()))), ("empty_list".to_string(), FieldValue::Literal(LiteralBits::String("Vec::new()".to_string()))), ("list_literal".to_string(), FieldValue::Literal(LiteralBits::String("vec![{elements}]".to_string()))), ("cons".to_string(), FieldValue::Literal(LiteralBits::String("{ let mut __list = {tail}; __list.insert(0, {head}); __list }".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 37183, 37774) }, - Declaration { id: DeclarationId(1337), name: Some("rust_value_construction".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(879), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(879)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("struct_literal".to_string(), FieldValue::Literal(LiteralBits::String("{type} {{ {fields} }}".to_string()))), ("struct_field_init".to_string(), FieldValue::Literal(LiteralBits::String("{name}: {value}".to_string()))), ("struct_field_separator".to_string(), FieldValue::Literal(LiteralBits::String(", ".to_string()))), ("variant_construction".to_string(), FieldValue::Literal(LiteralBits::String("{variant}({args})".to_string()))), ("variant_named_construction".to_string(), FieldValue::Literal(LiteralBits::String("{variant} {{ {fields} }}".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 37776, 38048) }, - Declaration { id: DeclarationId(1338), name: Some("rust_rendering".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(880), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(880)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("read".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] }), ("construct".to_string(), FieldValue::Variant { constructor: DeclarationId(1801), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 38050, 38131) }, - Declaration { id: DeclarationId(1339), name: Some("rust_language".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(883), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(883)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("statements".to_string(), FieldValue::Reference(DeclarationId(1326))), ("expressions".to_string(), FieldValue::Reference(DeclarationId(1327))), ("control_flow".to_string(), FieldValue::Reference(DeclarationId(1328))), ("literals".to_string(), FieldValue::Reference(DeclarationId(1329))), ("modules".to_string(), FieldValue::Reference(DeclarationId(1330))), ("functions".to_string(), FieldValue::Reference(DeclarationId(1331))), ("type_applications".to_string(), FieldValue::Reference(DeclarationId(1332))), ("type_definitions".to_string(), FieldValue::Reference(DeclarationId(1333))), ("record_derive_templates".to_string(), FieldValue::Reference(DeclarationId(1334))), ("patterns".to_string(), FieldValue::Reference(DeclarationId(1335))), ("collection_ops".to_string(), FieldValue::Reference(DeclarationId(1336))), ("values".to_string(), FieldValue::Reference(DeclarationId(1337)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 38133, 38578) }, - Declaration { id: DeclarationId(1340), name: Some("rust_correction_style".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(789), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(789)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("indent_unit".to_string(), FieldValue::Literal(LiteralBits::String(" ".to_string()))), ("line_ending".to_string(), FieldValue::Literal(LiteralBits::String("\n".to_string()))), ("string_quote".to_string(), FieldValue::Literal(LiteralBits::String("%Q".to_string()))), ("trailing_semicolon".to_string(), FieldValue::Literal(LiteralBits::Bool(true)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 40002, 40141) }, - Declaration { id: DeclarationId(1341), name: Some("rust_clean_emission".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(780), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(780)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("expression_wrapping".to_string(), FieldValue::Variant { constructor: DeclarationId(1668), payload: vec![] }), ("pattern_bindings".to_string(), FieldValue::Variant { constructor: DeclarationId(1671), payload: vec![] }), ("variant_payload_field_access".to_string(), FieldValue::Variant { constructor: DeclarationId(1675), payload: vec![] }), ("imports".to_string(), FieldValue::Variant { constructor: DeclarationId(1677), payload: vec![] }), ("block_return".to_string(), FieldValue::Variant { constructor: DeclarationId(1680), payload: vec![] }), ("variable_bindings".to_string(), FieldValue::Variant { constructor: DeclarationId(1683), payload: vec![] }), ("match_arm_body".to_string(), FieldValue::Variant { constructor: DeclarationId(1686), payload: vec![] }), ("correction_style".to_string(), FieldValue::Reference(DeclarationId(1340))), ("post_emit_verifier".to_string(), FieldValue::Record(vec![("command".to_string(), FieldValue::Literal(LiteralBits::String("rustc".to_string()))), ("args".to_string(), FieldValue::List(vec![FieldValue::Literal(LiteralBits::String("--edition=2021".to_string())), FieldValue::Literal(LiteralBits::String("-D".to_string())), FieldValue::Literal(LiteralBits::String("warnings".to_string()))])), ("syntax_only".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("expected_exit_code".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("output_policy".to_string(), FieldValue::Variant { constructor: DeclarationId(1689), payload: vec![] })]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 40143, 40756) }, - Declaration { id: DeclarationId(1342), name: Some("rust_clean_emission_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(781), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(781)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1339))), ("clean_emission".to_string(), FieldValue::Reference(DeclarationId(1341)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 40758, 40888) }, - Declaration { id: DeclarationId(1343), name: Some("rust_port_accessor".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(732), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(732)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({p0}).port_opt({p1}).cloned()".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 41990, 42093) }, - Declaration { id: DeclarationId(1344), name: Some("rust_node_accessor".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(732), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(732)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({p0}).node_opt({p1}).cloned()".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 42095, 42198) }, - Declaration { id: DeclarationId(1345), name: Some("rust_resolve_producer_accessor".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(732), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(732)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({p0}).resolve_producer_opt({p1}).cloned()".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 42200, 42327) }, - Declaration { id: DeclarationId(1346), name: Some("port_binding_rust".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(733), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(733)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("accessor".to_string(), FieldValue::Reference(DeclarationId(734))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1343))), ("language".to_string(), FieldValue::Reference(DeclarationId(1339)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 42329, 42460) }, - Declaration { id: DeclarationId(1347), name: Some("node_binding_rust".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(733), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(733)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("accessor".to_string(), FieldValue::Reference(DeclarationId(735))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1344))), ("language".to_string(), FieldValue::Reference(DeclarationId(1339)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 42462, 42593) }, - Declaration { id: DeclarationId(1348), name: Some("resolve_producer_binding_rust".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(733), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(733)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("accessor".to_string(), FieldValue::Reference(DeclarationId(736))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1345))), ("language".to_string(), FieldValue::Reference(DeclarationId(1339)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 42595, 42762) }, - Declaration { id: DeclarationId(1349), name: Some("rust_lane2_workflow_accessor".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(732), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(732)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({p0}).lane2_workflow_effect_at({p1}).cloned()".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 43273, 43402) }, - Declaration { id: DeclarationId(1350), name: Some("lane2_workflow_at_binding_rust".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(733), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(733)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("accessor".to_string(), FieldValue::Reference(DeclarationId(738))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1349))), ("language".to_string(), FieldValue::Reference(DeclarationId(1339)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 43404, 43571) }, - Declaration { id: DeclarationId(1351), name: Some("rust_declaration_by_id_accessor".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(732), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(732)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({p0}).declaration_opt({p1}).cloned()".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 43898, 44021) }, - Declaration { id: DeclarationId(1352), name: Some("declaration_by_id_binding_rust".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(733), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(733)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("accessor".to_string(), FieldValue::Reference(DeclarationId(737))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1351))), ("language".to_string(), FieldValue::Reference(DeclarationId(1339)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 44023, 44193) }, - Declaration { id: DeclarationId(1353), name: Some("CompilerHostRealization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 453, 502) }, - Declaration { id: DeclarationId(1354), name: Some("PipelineSnapshotKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "SnapshotSurface".to_string(), ty: DeclarationId(2080) }, Field { label: "SnapshotDag".to_string(), ty: DeclarationId(2081) }, Field { label: "SnapshotText".to_string(), ty: DeclarationId(2082) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 504, 576) }, - Declaration { id: DeclarationId(1355), name: Some("PipelineStageBinding".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "stage".to_string(), ty: DeclarationId(1021) }, Field { label: "realization".to_string(), ty: DeclarationId(1021) }, Field { label: "snapshot".to_string(), ty: DeclarationId(1354) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 578, 694) }, - Declaration { id: DeclarationId(1356), name: Some("parse_realization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1353)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("symbol".to_string(), FieldValue::Literal(LiteralBits::String("v3_compiler::parse".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 696, 780) }, - Declaration { id: DeclarationId(1357), name: Some("lower_realization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1353)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("symbol".to_string(), FieldValue::Literal(LiteralBits::String("v3_compiler::lower".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 782, 866) }, - Declaration { id: DeclarationId(1358), name: Some("infer_realization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1353)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("symbol".to_string(), FieldValue::Literal(LiteralBits::String("v3_compiler::infer".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 868, 952) }, - Declaration { id: DeclarationId(1359), name: Some("compute_ownership_realization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1353)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("symbol".to_string(), FieldValue::Literal(LiteralBits::String("v3_compiler::compute_ownership".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 954, 1062) }, - Declaration { id: DeclarationId(1360), name: Some("emit_realization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1353)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("symbol".to_string(), FieldValue::Literal(LiteralBits::String("v3_compiler::emit".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1064, 1146) }, - Declaration { id: DeclarationId(1361), name: Some("lens_complexity_realization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1353)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("symbol".to_string(), FieldValue::Literal(LiteralBits::String("v3_compiler::lens_complexity".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1148, 1252) }, - Declaration { id: DeclarationId(1362), name: Some("parse_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1355), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1355)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1368))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1356))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(2080), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1254, 1382) }, - Declaration { id: DeclarationId(1363), name: Some("lower_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1355), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1355)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1369))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1357))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(2081), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1384, 1508) }, - Declaration { id: DeclarationId(1364), name: Some("infer_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1355), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1355)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1370))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1358))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(2081), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1510, 1634) }, - Declaration { id: DeclarationId(1365), name: Some("compute_ownership_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1355), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1355)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1371))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1359))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(2081), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1636, 1796) }, - Declaration { id: DeclarationId(1366), name: Some("lens_complexity_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1355), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1355)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1372))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1361))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(2081), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1798, 1952) }, - Declaration { id: DeclarationId(1367), name: Some("emit_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1355), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1355)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1373))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1360))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(2082), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1954, 2076) }, - Declaration { id: DeclarationId(1368), name: Some("parse".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(186)], output: DeclarationId(731), body: ArrowBody::ExternalRealization(DeclarationId(1356)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2078, 2140) }, - Declaration { id: DeclarationId(1369), name: Some("lower".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(731)], output: DeclarationId(731), body: ArrowBody::ExternalRealization(DeclarationId(1357)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2142, 2184) }, - Declaration { id: DeclarationId(1370), name: Some("infer".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(731)], output: DeclarationId(731), body: ArrowBody::ExternalRealization(DeclarationId(1358)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2186, 2228) }, - Declaration { id: DeclarationId(1371), name: Some("compute_ownership".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(731)], output: DeclarationId(731), body: ArrowBody::ExternalRealization(DeclarationId(1359)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2230, 2288) }, - Declaration { id: DeclarationId(1372), name: Some("lens_complexity".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(731)], output: DeclarationId(731), body: ArrowBody::ExternalRealization(DeclarationId(1361)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2290, 2347) }, - Declaration { id: DeclarationId(1373), name: Some("emit".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(731), DeclarationId(731), DeclarationId(731), DeclarationId(883)], output: DeclarationId(186), body: ArrowBody::ExternalRealization(DeclarationId(1360)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2349, 2460) }, - Declaration { id: DeclarationId(1374), name: Some("compile".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(186), DeclarationId(883)], output: DeclarationId(186), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/compiler/pipeline.dag", 2533, 2605)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2462, 2605) }, - Declaration { id: DeclarationId(1375), name: Some("from_symbol".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(2083), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/compiler/operators.dag", 156, 771)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/operators.dag", 108, 771) }, - Declaration { id: DeclarationId(1376), name: Some("symbol".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(710)], output: DeclarationId(186), body: ArrowBody::UserDefined(NodeId(253)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/operators.dag", 773, 1214) }, - Declaration { id: DeclarationId(1377), name: Some("algebra_field_name".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(710)], output: DeclarationId(186), body: ArrowBody::UserDefined(NodeId(270)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/operators.dag", 1216, 2017) }, - Declaration { id: DeclarationId(1378), name: Some("LensRegistryEntry".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(111) }, Field { label: "lens_file".to_string(), ty: DeclarationId(120) }, Field { label: "generated_file".to_string(), ty: DeclarationId(120) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 1950, 2045) }, - Declaration { id: DeclarationId(1379), name: Some("lens_cost_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1378), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1378)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("cost".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/complexity.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/lens_cost_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 2047, 2214) }, - Declaration { id: DeclarationId(1380), name: Some("lens_cost_symbolic_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1378), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1378)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("cost_symbolic".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/cost.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/lens_cost_symbolic_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 2216, 2404) }, - Declaration { id: DeclarationId(1381), name: Some("lens_effect_enumeration_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1378), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1378)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("effect_enumeration".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/effect_enumeration.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/lens_effect_enumeration_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 2406, 2623) }, - Declaration { id: DeclarationId(1382), name: Some("lens_provenance_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1378), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1378)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("provenance".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/provenance.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/lens_provenance_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 2625, 2810) }, - Declaration { id: DeclarationId(1383), name: Some("lens_structural_resolution_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1378), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1378)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("structural_resolution".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/structural_resolution.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/lens_structural_resolution_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 2812, 3041) }, - Declaration { id: DeclarationId(1384), name: Some("lens_unused_parameters_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1378), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1378)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("unused_parameters".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/unused_parameters.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/lens_unused_parameters_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 3043, 3256) }, - Declaration { id: DeclarationId(1385), name: Some("lens_infer_helpers_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1378), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1378)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("infer_helpers".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/infer_helpers.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/infer_helpers_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 3883, 4075) }, - Declaration { id: DeclarationId(1386), name: Some("lens_variant_payload_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1378), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1378)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("variant_payload".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/variant_payload.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/variant_payload_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 4077, 4277) }, - Declaration { id: DeclarationId(1387), name: Some("lens_lower_helpers_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1378), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1378)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("lower_helpers".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/lower_helpers.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/lower_helpers_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 4527, 4719) }, - Declaration { id: DeclarationId(1388), name: Some("IntegerAlgebra".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "OrderedRingAlgebra".to_string(), ty: DeclarationId(2084) }, Field { label: "SemiringAlgebra".to_string(), ty: DeclarationId(2085) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5230, 5292) }, - Declaration { id: DeclarationId(1389), name: Some("NonIntegerAlgebra".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "BooleanAlgebraAlgebra".to_string(), ty: DeclarationId(2086) }, Field { label: "TerminalAlgebra".to_string(), ty: DeclarationId(2087) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5294, 5362) }, - Declaration { id: DeclarationId(1390), name: Some("TargetCarrier".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "BitCarrier".to_string(), ty: DeclarationId(2088) }, Field { label: "ByteCarrier".to_string(), ty: DeclarationId(2089) }, Field { label: "Word16Carrier".to_string(), ty: DeclarationId(2090) }, Field { label: "Word32Carrier".to_string(), ty: DeclarationId(2091) }, Field { label: "Word64Carrier".to_string(), ty: DeclarationId(2092) }, Field { label: "TerminalCarrier".to_string(), ty: DeclarationId(2093) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6852, 6975) }, - Declaration { id: DeclarationId(1391), name: Some("IntegerOverflow".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "TwoComplementWrap".to_string(), ty: DeclarationId(2094) }, Field { label: "Saturating".to_string(), ty: DeclarationId(2095) }, Field { label: "Trap".to_string(), ty: DeclarationId(2096) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 7692, 7758) }, - Declaration { id: DeclarationId(1392), name: Some("RustPrimitive".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "IntegerPrimitive".to_string(), ty: DeclarationId(2097) }, Field { label: "NonIntegerPrimitive".to_string(), ty: DeclarationId(2098) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 8513, 9295) }, - Declaration { id: DeclarationId(1393), name: Some("rust_pilot_primitives".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(1392) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(2099)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![FieldValue::Variant { constructor: DeclarationId(2097), payload: vec![FieldValue::Literal(LiteralBits::String("i8".to_string())), FieldValue::Variant { constructor: DeclarationId(2084), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2089), payload: vec![] }, FieldValue::Literal(LiteralBits::String("-128".to_string())), FieldValue::Literal(LiteralBits::String("127".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2094), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2097), payload: vec![FieldValue::Literal(LiteralBits::String("i16".to_string())), FieldValue::Variant { constructor: DeclarationId(2084), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2090), payload: vec![] }, FieldValue::Literal(LiteralBits::String("-32768".to_string())), FieldValue::Literal(LiteralBits::String("32767".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2094), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2097), payload: vec![FieldValue::Literal(LiteralBits::String("i32".to_string())), FieldValue::Variant { constructor: DeclarationId(2084), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2091), payload: vec![] }, FieldValue::Literal(LiteralBits::String("-2147483648".to_string())), FieldValue::Literal(LiteralBits::String("2147483647".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2094), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2097), payload: vec![FieldValue::Literal(LiteralBits::String("i64".to_string())), FieldValue::Variant { constructor: DeclarationId(2084), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2092), payload: vec![] }, FieldValue::Literal(LiteralBits::String("-9223372036854775808".to_string())), FieldValue::Literal(LiteralBits::String("9223372036854775807".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2094), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2097), payload: vec![FieldValue::Literal(LiteralBits::String("u8".to_string())), FieldValue::Variant { constructor: DeclarationId(2085), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2089), payload: vec![] }, FieldValue::Literal(LiteralBits::String("0".to_string())), FieldValue::Literal(LiteralBits::String("255".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2094), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2097), payload: vec![FieldValue::Literal(LiteralBits::String("u16".to_string())), FieldValue::Variant { constructor: DeclarationId(2085), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2090), payload: vec![] }, FieldValue::Literal(LiteralBits::String("0".to_string())), FieldValue::Literal(LiteralBits::String("65535".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2094), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2097), payload: vec![FieldValue::Literal(LiteralBits::String("u32".to_string())), FieldValue::Variant { constructor: DeclarationId(2085), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2091), payload: vec![] }, FieldValue::Literal(LiteralBits::String("0".to_string())), FieldValue::Literal(LiteralBits::String("4294967295".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2094), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2097), payload: vec![FieldValue::Literal(LiteralBits::String("u64".to_string())), FieldValue::Variant { constructor: DeclarationId(2085), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2092), payload: vec![] }, FieldValue::Literal(LiteralBits::String("0".to_string())), FieldValue::Literal(LiteralBits::String("18446744073709551615".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2094), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2098), payload: vec![FieldValue::Literal(LiteralBits::String("bool".to_string())), FieldValue::Variant { constructor: DeclarationId(2086), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2088), payload: vec![] }, FieldValue::Literal(LiteralBits::Bool(true))] }, FieldValue::Variant { constructor: DeclarationId(2098), payload: vec![FieldValue::Literal(LiteralBits::String("()".to_string())), FieldValue::Variant { constructor: DeclarationId(2087), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2093), payload: vec![] }, FieldValue::Literal(LiteralBits::Bool(true))] }])), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 9595, 12449) }, - Declaration { id: DeclarationId(1394), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(597) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3259, 3272) }, - Declaration { id: DeclarationId(1395), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(599) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3421, 3434) }, - Declaration { id: DeclarationId(1396), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(599) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3439, 3452) }, - Declaration { id: DeclarationId(1397), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(601) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3556, 3569) }, - Declaration { id: DeclarationId(1398), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(603) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4162, 4169) }, - Declaration { id: DeclarationId(1399), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(604), DeclarationId(603)], output: DeclarationId(604), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4183, 4196) }, - Declaration { id: DeclarationId(1400), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(606) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4617, 4624) }, - Declaration { id: DeclarationId(1401), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(606), DeclarationId(607)], output: DeclarationId(607), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4638, 4651) }, - Declaration { id: DeclarationId(1402), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(609) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5336, 5349) }, - Declaration { id: DeclarationId(1403), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(609) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5354, 5367) }, - Declaration { id: DeclarationId(1404), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(609) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5372, 5385) }, - Declaration { id: DeclarationId(1405), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(611) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5686, 5693) }, - Declaration { id: DeclarationId(1406), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(611)], output: DeclarationId(612), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5698, 5708) }, - Declaration { id: DeclarationId(1407), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(612) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5713, 5720) }, - Declaration { id: DeclarationId(1408), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(614) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5867, 5874) }, - Declaration { id: DeclarationId(1409), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(614)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5879, 5892) }, - Declaration { id: DeclarationId(1410), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(614) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5897, 5904) }, - Declaration { id: DeclarationId(1411), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(616) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6130, 6137) }, - Declaration { id: DeclarationId(1412), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(617) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6151, 6158) }, - Declaration { id: DeclarationId(1413), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(616)], output: DeclarationId(1412), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6142, 6158) }, - Declaration { id: DeclarationId(1414), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(617) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6163, 6170) }, - Declaration { id: DeclarationId(1415), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(619) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6356, 6363) }, - Declaration { id: DeclarationId(1416), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(621) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6588, 6595) }, - Declaration { id: DeclarationId(1417), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(625) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7202, 7209) }, - Declaration { id: DeclarationId(1418), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(622), arguments: vec![TemplateArgument { parameter: DeclarationId(623), value: DeclarationId(625) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7219, 7236) }, - Declaration { id: DeclarationId(1419), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(1418) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7214, 7237) }, - Declaration { id: DeclarationId(1420), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(627) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7415, 7422) }, - Declaration { id: DeclarationId(1421), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(622), arguments: vec![TemplateArgument { parameter: DeclarationId(623), value: DeclarationId(627) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7444, 7461) }, - Declaration { id: DeclarationId(1422), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(1421) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7439, 7462) }, - Declaration { id: DeclarationId(1423), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(629) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 8177, 8184) }, - Declaration { id: DeclarationId(1424), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 2106, 2111) }, - Declaration { id: DeclarationId(1425), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(595) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 2144, 2157) }, - Declaration { id: DeclarationId(1426), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "head".to_string(), ty: DeclarationId(595) }, Field { label: "tail".to_string(), ty: DeclarationId(1425) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 2116, 2159) }, - Declaration { id: DeclarationId(1427), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(635) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1477, 1490) }, - Declaration { id: DeclarationId(1428), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(637) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1570, 1583) }, - Declaration { id: DeclarationId(1429), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 11753, 11760) }, - Declaration { id: DeclarationId(1430), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(717), arguments: vec![TemplateArgument { parameter: DeclarationId(718), value: DeclarationId(653) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 20916, 20943) }, - Declaration { id: DeclarationId(1431), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(622), arguments: vec![TemplateArgument { parameter: DeclarationId(623), value: DeclarationId(653) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 20995, 21026) }, - Declaration { id: DeclarationId(1432), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(717), arguments: vec![TemplateArgument { parameter: DeclarationId(718), value: DeclarationId(653) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 21031, 21058) }, - Declaration { id: DeclarationId(1433), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(1432), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 21031, 21059) }, - Declaration { id: DeclarationId(1434), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(653) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 21185, 21206) }, - Declaration { id: DeclarationId(1435), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(717), arguments: vec![TemplateArgument { parameter: DeclarationId(718), value: DeclarationId(653) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 21211, 21238) }, - Declaration { id: DeclarationId(1436), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(1435), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 21211, 21239) }, - Declaration { id: DeclarationId(1437), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(653) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 22268, 22289) }, - Declaration { id: DeclarationId(1438), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(156), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 29695, 29706) }, - Declaration { id: DeclarationId(1439), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 30432, 30439) }, - Declaration { id: DeclarationId(1440), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 30662, 30669) }, - Declaration { id: DeclarationId(1441), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(653) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 37237, 37258) }, - Declaration { id: DeclarationId(1442), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(684) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 37264, 37295) }, - Declaration { id: DeclarationId(1443), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "text".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 7532, 7561) }, - Declaration { id: DeclarationId(1444), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 7566, 7595) }, - Declaration { id: DeclarationId(1445), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(638) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 7627, 7645) }, - Declaration { id: DeclarationId(1446), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(638) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 8066, 8084) }, - Declaration { id: DeclarationId(1447), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "tokens".to_string(), ty: DeclarationId(1446) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 8036, 8086) }, - Declaration { id: DeclarationId(1448), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "segment".to_string(), ty: DeclarationId(186) }, Field { label: "reason".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 8091, 8147) }, - Declaration { id: DeclarationId(1449), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "template".to_string(), ty: DeclarationId(639) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 8510, 8555) }, - Declaration { id: DeclarationId(1450), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "raw".to_string(), ty: DeclarationId(186) }, Field { label: "segment".to_string(), ty: DeclarationId(186) }, Field { label: "reason".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 8560, 8630) }, - Declaration { id: DeclarationId(1451), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 14355, 14365) }, - Declaration { id: DeclarationId(1452), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "key_source".to_string(), ty: DeclarationId(649) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 14370, 14408) }, - Declaration { id: DeclarationId(1453), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "key_source".to_string(), ty: DeclarationId(649) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 14413, 14451) }, - Declaration { id: DeclarationId(1454), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "cause".to_string(), ty: DeclarationId(648) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 14697, 14732) }, - Declaration { id: DeclarationId(1455), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 14737, 14749) }, - Declaration { id: DeclarationId(1456), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(645) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 15171, 15200) }, - Declaration { id: DeclarationId(1457), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(646) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 15205, 15230) }, - Declaration { id: DeclarationId(1458), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 15743, 15753) }, - Declaration { id: DeclarationId(1459), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "method".to_string(), ty: DeclarationId(156) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 15758, 15796) }, - Declaration { id: DeclarationId(1460), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 16501, 16528) }, - Declaration { id: DeclarationId(1461), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "field".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 16533, 16561) }, - Declaration { id: DeclarationId(1462), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 16589, 16601) }, - Declaration { id: DeclarationId(1463), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "fields".to_string(), ty: DeclarationId(1462) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 16566, 16603) }, - Declaration { id: DeclarationId(1464), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 17280, 17293) }, - Declaration { id: DeclarationId(1465), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 17298, 17312) }, - Declaration { id: DeclarationId(1466), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "reason".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 17317, 17349) }, - Declaration { id: DeclarationId(1467), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "effect".to_string(), ty: DeclarationId(653) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 19519, 19560) }, - Declaration { id: DeclarationId(1468), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "operation_name".to_string(), ty: DeclarationId(186) }, Field { label: "method_str".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 19565, 19634) }, - Declaration { id: DeclarationId(1469), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "operation_name".to_string(), ty: DeclarationId(186) }, Field { label: "method".to_string(), ty: DeclarationId(156) }, Field { label: "raw_path".to_string(), ty: DeclarationId(186) }, Field { label: "segment".to_string(), ty: DeclarationId(186) }, Field { label: "reason".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 19639, 19789) }, - Declaration { id: DeclarationId(1470), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 20538, 20559) }, - Declaration { id: DeclarationId(1471), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(717), arguments: vec![TemplateArgument { parameter: DeclarationId(718), value: DeclarationId(653) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 20590, 20617) }, - Declaration { id: DeclarationId(1472), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "first_breaker".to_string(), ty: DeclarationId(1471) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 20564, 20619) }, - Declaration { id: DeclarationId(1473), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(653) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 24543, 24564) }, - Declaration { id: DeclarationId(1474), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "ops".to_string(), ty: DeclarationId(1473) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 24523, 24566) }, - Declaration { id: DeclarationId(1475), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(636), arguments: vec![TemplateArgument { parameter: DeclarationId(637), value: DeclarationId(662) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 24592, 24619) }, - Declaration { id: DeclarationId(1476), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "arms".to_string(), ty: DeclarationId(1475) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 24571, 24621) }, - Declaration { id: DeclarationId(1477), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "body".to_string(), ty: DeclarationId(663) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 24626, 24661) }, - Declaration { id: DeclarationId(1478), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(636), arguments: vec![TemplateArgument { parameter: DeclarationId(637), value: DeclarationId(663) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 24693, 24725) }, - Declaration { id: DeclarationId(1479), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "branches".to_string(), ty: DeclarationId(1478) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 24666, 24727) }, - Declaration { id: DeclarationId(1480), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(655) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 25364, 25410) }, - Declaration { id: DeclarationId(1481), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(664) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 25415, 25467) }, - Declaration { id: DeclarationId(1482), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 25964, 25984) }, - Declaration { id: DeclarationId(1483), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 25989, 26010) }, - Declaration { id: DeclarationId(1484), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 26015, 26038) }, - Declaration { id: DeclarationId(1485), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 26043, 26061) }, - Declaration { id: DeclarationId(1486), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 26066, 26084) }, - Declaration { id: DeclarationId(1487), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(655) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 26401, 26447) }, - Declaration { id: DeclarationId(1488), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(668) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 26452, 26504) }, - Declaration { id: DeclarationId(1489), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 33114, 33120) }, - Declaration { id: DeclarationId(1490), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "reason".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 33125, 33162) }, - Declaration { id: DeclarationId(1491), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "reason".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 33167, 33204) }, - Declaration { id: DeclarationId(1492), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 33678, 33697) }, - Declaration { id: DeclarationId(1493), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "agreement".to_string(), ty: DeclarationId(678) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 33702, 33751) }, - Declaration { id: DeclarationId(1494), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(689), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 15978, 15986) }, - Declaration { id: DeclarationId(1495), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(730), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 16035, 16044) }, - Declaration { id: DeclarationId(1496), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(730), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 16110, 16119) }, - Declaration { id: DeclarationId(1497), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(704), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 16496, 16508) }, - Declaration { id: DeclarationId(1498), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(663), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 16817, 16832) }, - Declaration { id: DeclarationId(1499), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(945), arguments: vec![TemplateArgument { parameter: DeclarationId(946), value: DeclarationId(632) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 17203, 17224) }, - Declaration { id: DeclarationId(1500), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(945), arguments: vec![TemplateArgument { parameter: DeclarationId(946), value: DeclarationId(632) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 17288, 17309) }, - Declaration { id: DeclarationId(1501), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 456, 466) }, - Declaration { id: DeclarationId(1502), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(687) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 471, 490) }, - Declaration { id: DeclarationId(1503), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 495, 505) }, - Declaration { id: DeclarationId(1504), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(630), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 569, 576) }, - Declaration { id: DeclarationId(1505), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 768, 779) }, - Declaration { id: DeclarationId(1506), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 784, 797) }, - Declaration { id: DeclarationId(1507), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 802, 819) }, - Declaration { id: DeclarationId(1508), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(690) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 2850, 2870) }, - Declaration { id: DeclarationId(1509), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 2875, 2903) }, - Declaration { id: DeclarationId(1510), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(632) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 2908, 2942) }, - Declaration { id: DeclarationId(1511), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(632) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 2947, 2976) }, - Declaration { id: DeclarationId(1512), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 2981, 2998) }, - Declaration { id: DeclarationId(1513), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 3602, 3609) }, - Declaration { id: DeclarationId(1514), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "previous".to_string(), ty: DeclarationId(692) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 3614, 3664) }, - Declaration { id: DeclarationId(1515), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 3689, 3698) }, - Declaration { id: DeclarationId(1516), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(692) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 3703, 3739) }, - Declaration { id: DeclarationId(1517), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "lower".to_string(), ty: DeclarationId(695) }, Field { label: "width".to_string(), ty: DeclarationId(693) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4051, 4101) }, - Declaration { id: DeclarationId(1518), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4106, 4115) }, - Declaration { id: DeclarationId(1519), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4366, 4376) }, - Declaration { id: DeclarationId(1520), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4381, 4390) }, - Declaration { id: DeclarationId(1521), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4395, 4404) }, - Declaration { id: DeclarationId(1522), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(690) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4831, 4851) }, - Declaration { id: DeclarationId(1523), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(632) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4856, 4880) }, - Declaration { id: DeclarationId(1524), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(699) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4892, 4908) }, - Declaration { id: DeclarationId(1525), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(1524) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4885, 4909) }, - Declaration { id: DeclarationId(1526), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(700) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4919, 4935) }, - Declaration { id: DeclarationId(1527), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(1526) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4914, 4936) }, - Declaration { id: DeclarationId(1528), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(699) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4945, 4961) }, - Declaration { id: DeclarationId(1529), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(1528) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4941, 4962) }, - Declaration { id: DeclarationId(1530), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(700) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5025, 5041) }, - Declaration { id: DeclarationId(1531), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "constructor".to_string(), ty: DeclarationId(632) }, Field { label: "payload".to_string(), ty: DeclarationId(1530) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4967, 5047) }, - Declaration { id: DeclarationId(1532), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5206, 5235) }, - Declaration { id: DeclarationId(1533), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(699) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5270, 5286) }, - Declaration { id: DeclarationId(1534), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "fields".to_string(), ty: DeclarationId(1533) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5240, 5288) }, - Declaration { id: DeclarationId(1535), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(699) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5306, 5322) }, - Declaration { id: DeclarationId(1536), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(1535) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5293, 5323) }, - Declaration { id: DeclarationId(1537), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(630) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5658, 5677) }, - Declaration { id: DeclarationId(1538), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(632) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5682, 5716) }, - Declaration { id: DeclarationId(1539), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5721, 5728) }, - Declaration { id: DeclarationId(1540), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5733, 5739) }, - Declaration { id: DeclarationId(1541), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5744, 5764) }, - Declaration { id: DeclarationId(1542), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(691) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5993, 6010) }, - Declaration { id: DeclarationId(1543), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(697) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6032, 6047) }, - Declaration { id: DeclarationId(1544), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "children".to_string(), ty: DeclarationId(1543) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6015, 6049) }, - Declaration { id: DeclarationId(1545), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(697) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6071, 6086) }, - Declaration { id: DeclarationId(1546), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "variants".to_string(), ty: DeclarationId(1545) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6054, 6088) }, - Declaration { id: DeclarationId(1547), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(632) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6115, 6134) }, - Declaration { id: DeclarationId(1548), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "inputs".to_string(), ty: DeclarationId(1547) }, Field { label: "output".to_string(), ty: DeclarationId(632) }, Field { label: "body".to_string(), ty: DeclarationId(702) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6093, 6190) }, - Declaration { id: DeclarationId(1549), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "element".to_string(), ty: DeclarationId(632) }, Field { label: "bound".to_string(), ty: DeclarationId(696) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6195, 6273) }, - Declaration { id: DeclarationId(1550), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(698) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6341, 6363) }, - Declaration { id: DeclarationId(1551), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "template".to_string(), ty: DeclarationId(632) }, Field { label: "arguments".to_string(), ty: DeclarationId(1550) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6278, 6369) }, - Declaration { id: DeclarationId(1552), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6418, 6425) }, - Declaration { id: DeclarationId(1553), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(632) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6470, 6489) }, - Declaration { id: DeclarationId(1554), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(705) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6508, 6530) }, - Declaration { id: DeclarationId(1555), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(632), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6543, 6557) }, - Declaration { id: DeclarationId(1556), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(632), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6570, 6584) }, - Declaration { id: DeclarationId(1557), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(701), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6599, 6609) }, - Declaration { id: DeclarationId(1558), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(706), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6629, 6644) }, - Declaration { id: DeclarationId(1559), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(632) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 7767, 7786) }, - Declaration { id: DeclarationId(1560), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8067, 8070) }, - Declaration { id: DeclarationId(1561), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8075, 8078) }, - Declaration { id: DeclarationId(1562), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8083, 8086) }, - Declaration { id: DeclarationId(1563), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8091, 8094) }, - Declaration { id: DeclarationId(1564), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8218, 8220) }, - Declaration { id: DeclarationId(1565), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8225, 8227) }, - Declaration { id: DeclarationId(1566), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8232, 8234) }, - Declaration { id: DeclarationId(1567), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8239, 8241) }, - Declaration { id: DeclarationId(1568), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8246, 8248) }, - Declaration { id: DeclarationId(1569), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8253, 8255) }, - Declaration { id: DeclarationId(1570), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8508, 8511) }, - Declaration { id: DeclarationId(1571), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8516, 8518) }, - Declaration { id: DeclarationId(1572), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(707) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8754, 8778) }, - Declaration { id: DeclarationId(1573), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(708) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8783, 8807) }, - Declaration { id: DeclarationId(1574), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(709) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8812, 8830) }, - Declaration { id: DeclarationId(1575), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(632) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9017, 9040) }, - Declaration { id: DeclarationId(1576), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(632), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9105, 9119) }, - Declaration { id: DeclarationId(1577), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "field_label".to_string(), ty: DeclarationId(186) }, Field { label: "field_child".to_string(), ty: DeclarationId(1576) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9045, 9125) }, - Declaration { id: DeclarationId(1578), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(710) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9130, 9152) }, - Declaration { id: DeclarationId(1579), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9277, 9329) }, - Declaration { id: DeclarationId(1580), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(632) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9334, 9364) }, - Declaration { id: DeclarationId(1581), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(713), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9528, 9543) }, - Declaration { id: DeclarationId(1582), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(636), arguments: vec![TemplateArgument { parameter: DeclarationId(637), value: DeclarationId(719) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 11519, 11550) }, - Declaration { id: DeclarationId(1583), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(634), arguments: vec![TemplateArgument { parameter: DeclarationId(635), value: DeclarationId(720) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 11574, 11604) }, - Declaration { id: DeclarationId(1584), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "count".to_string(), ty: DeclarationId(631) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12030, 12059) }, - Declaration { id: DeclarationId(1585), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "cluster".to_string(), ty: DeclarationId(633) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12064, 12094) }, - Declaration { id: DeclarationId(1586), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(663), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12208, 12223) }, - Declaration { id: DeclarationId(1587), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(631) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12297, 12309) }, - Declaration { id: DeclarationId(1588), name: None, connective: TypeConnective::Atom(AtomPayload::UnresolvedIdentifier("UserMatch".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12550, 12559) }, - Declaration { id: DeclarationId(1589), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(714) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12617, 12633) }, - Declaration { id: DeclarationId(1590), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(725), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12697, 12721) }, - Declaration { id: DeclarationId(1591), name: None, connective: TypeConnective::Atom(AtomPayload::UnresolvedIdentifier("UserCallable".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13135, 13147) }, - Declaration { id: DeclarationId(1592), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(631) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13225, 13237) }, - Declaration { id: DeclarationId(1593), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(663), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13275, 13290) }, - Declaration { id: DeclarationId(1594), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(728), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13313, 13335) }, - Declaration { id: DeclarationId(1595), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(723) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13427, 13443) }, - Declaration { id: DeclarationId(1596), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(724) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13448, 13472) }, - Declaration { id: DeclarationId(1597), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(726) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13477, 13495) }, - Declaration { id: DeclarationId(1598), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(727) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13500, 13514) }, - Declaration { id: DeclarationId(1599), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(729) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13519, 13533) }, - Declaration { id: DeclarationId(1600), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(704) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13562, 13579) }, - Declaration { id: DeclarationId(1601), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(730) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13589, 13603) }, - Declaration { id: DeclarationId(1602), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(689) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13613, 13626) }, - Declaration { id: DeclarationId(1603), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(721) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13639, 13652) }, - Declaration { id: DeclarationId(1604), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(945), arguments: vec![TemplateArgument { parameter: DeclarationId(946), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 9849, 9869) }, - Declaration { id: DeclarationId(1605), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(945), arguments: vec![TemplateArgument { parameter: DeclarationId(946), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 9933, 9953) }, - Declaration { id: DeclarationId(1606), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(636), arguments: vec![TemplateArgument { parameter: DeclarationId(637), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 10021, 10051) }, - Declaration { id: DeclarationId(1607), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 10518, 10536) }, - Declaration { id: DeclarationId(1608), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(636), arguments: vec![TemplateArgument { parameter: DeclarationId(637), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 10542, 10572) }, - Declaration { id: DeclarationId(1609), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 13069, 13087) }, - Declaration { id: DeclarationId(1610), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(636), arguments: vec![TemplateArgument { parameter: DeclarationId(637), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17290, 17320) }, - Declaration { id: DeclarationId(1611), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17325, 17343) }, - Declaration { id: DeclarationId(1612), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17594, 17612) }, - Declaration { id: DeclarationId(1613), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17617, 17635) }, - Declaration { id: DeclarationId(1614), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 18901, 18919) }, - Declaration { id: DeclarationId(1615), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 19172, 19190) }, - Declaration { id: DeclarationId(1616), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 19638, 19656) }, - Declaration { id: DeclarationId(1617), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21673, 21691) }, - Declaration { id: DeclarationId(1618), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21721, 21739) }, - Declaration { id: DeclarationId(1619), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 22026, 22044) }, - Declaration { id: DeclarationId(1620), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 22072, 22090) }, - Declaration { id: DeclarationId(1621), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 22450, 22468) }, - Declaration { id: DeclarationId(1622), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 22473, 22491) }, - Declaration { id: DeclarationId(1623), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 4805, 4817) }, - Declaration { id: DeclarationId(1624), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 4822, 4838) }, - Declaration { id: DeclarationId(1625), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 4843, 4857) }, - Declaration { id: DeclarationId(1626), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 5707, 5720) }, - Declaration { id: DeclarationId(1627), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 5725, 5740) }, - Declaration { id: DeclarationId(1628), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 5745, 5761) }, - Declaration { id: DeclarationId(1629), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 5766, 5779) }, - Declaration { id: DeclarationId(1630), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(742), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 6632, 6653) }, - Declaration { id: DeclarationId(1631), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(743), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 6668, 6678) }, - Declaration { id: DeclarationId(1632), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 6708, 6712) }, - Declaration { id: DeclarationId(1633), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8181, 8190) }, - Declaration { id: DeclarationId(1634), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "previous".to_string(), ty: DeclarationId(746) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8195, 8241) }, - Declaration { id: DeclarationId(1635), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8413, 8430) }, - Declaration { id: DeclarationId(1636), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(745) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8435, 8459) }, - Declaration { id: DeclarationId(1637), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "var".to_string(), ty: DeclarationId(745) }, Field { label: "degree".to_string(), ty: DeclarationId(746) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8464, 8526) }, - Declaration { id: DeclarationId(1638), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(636), arguments: vec![TemplateArgument { parameter: DeclarationId(637), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8543, 8573) }, - Declaration { id: DeclarationId(1639), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(1638) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8531, 8574) }, - Declaration { id: DeclarationId(1640), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(636), arguments: vec![TemplateArgument { parameter: DeclarationId(637), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8587, 8617) }, - Declaration { id: DeclarationId(1641), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(1640) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8579, 8618) }, - Declaration { id: DeclarationId(1642), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(745) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8623, 8644) }, - Declaration { id: DeclarationId(1643), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8649, 8668) }, - Declaration { id: DeclarationId(1644), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(600), arguments: vec![TemplateArgument { parameter: DeclarationId(601), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 10402, 10414) }, - Declaration { id: DeclarationId(1645), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(637)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5879, 5892) }, - Declaration { id: DeclarationId(1646), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(613), arguments: vec![TemplateArgument { parameter: DeclarationId(614), value: DeclarationId(747) }, TemplateArgument { parameter: DeclarationId(1409), value: DeclarationId(754) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 10395, 10442) }, - Declaration { id: DeclarationId(1647), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(600), arguments: vec![TemplateArgument { parameter: DeclarationId(601), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 10702, 10717) }, - Declaration { id: DeclarationId(1648), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(747), DeclarationId(747)], output: DeclarationId(747), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4183, 4196) }, - Declaration { id: DeclarationId(1649), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(602), arguments: vec![TemplateArgument { parameter: DeclarationId(604), value: DeclarationId(747) }, TemplateArgument { parameter: DeclarationId(603), value: DeclarationId(747) }, TemplateArgument { parameter: DeclarationId(1399), value: DeclarationId(758) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 13109, 13152) }, - Declaration { id: DeclarationId(1650), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(748), DeclarationId(603)], output: DeclarationId(748), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4183, 4196) }, - Declaration { id: DeclarationId(1651), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(602), arguments: vec![TemplateArgument { parameter: DeclarationId(604), value: DeclarationId(748) }, TemplateArgument { parameter: DeclarationId(1399), value: DeclarationId(775) }, TemplateArgument { parameter: DeclarationId(603), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 15818, 15928) }, - Declaration { id: DeclarationId(1652), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(748), DeclarationId(603)], output: DeclarationId(748), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4183, 4196) }, - Declaration { id: DeclarationId(1653), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(602), arguments: vec![TemplateArgument { parameter: DeclarationId(604), value: DeclarationId(748) }, TemplateArgument { parameter: DeclarationId(1399), value: DeclarationId(775) }, TemplateArgument { parameter: DeclarationId(603), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 15983, 16093) }, - Declaration { id: DeclarationId(1654), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(598), arguments: vec![TemplateArgument { parameter: DeclarationId(599), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17366, 17396) }, - Declaration { id: DeclarationId(1655), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(598), arguments: vec![TemplateArgument { parameter: DeclarationId(599), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17348, 17397) }, - Declaration { id: DeclarationId(1656), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(596), arguments: vec![TemplateArgument { parameter: DeclarationId(597), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17667, 17674) }, - Declaration { id: DeclarationId(1657), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(598), arguments: vec![TemplateArgument { parameter: DeclarationId(599), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17792, 17835) }, - Declaration { id: DeclarationId(1658), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(598), arguments: vec![TemplateArgument { parameter: DeclarationId(599), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 19105, 19137) }, - Declaration { id: DeclarationId(1659), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(596), arguments: vec![TemplateArgument { parameter: DeclarationId(597), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21776, 21783) }, - Declaration { id: DeclarationId(1660), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(598), arguments: vec![TemplateArgument { parameter: DeclarationId(599), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21924, 21989) }, - Declaration { id: DeclarationId(1661), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(748), DeclarationId(747)], output: DeclarationId(748), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4183, 4196) }, - Declaration { id: DeclarationId(1662), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(602), arguments: vec![TemplateArgument { parameter: DeclarationId(604), value: DeclarationId(748) }, TemplateArgument { parameter: DeclarationId(603), value: DeclarationId(747) }, TemplateArgument { parameter: DeclarationId(1399), value: DeclarationId(775) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 22107, 22165) }, - Declaration { id: DeclarationId(1663), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(598), arguments: vec![TemplateArgument { parameter: DeclarationId(599), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 22191, 22237) }, - Declaration { id: DeclarationId(1664), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(596), arguments: vec![TemplateArgument { parameter: DeclarationId(597), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 22508, 22515) }, - Declaration { id: DeclarationId(1665), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1622), DeclarationId(747)], output: DeclarationId(1622), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4183, 4196) }, - Declaration { id: DeclarationId(1666), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(602), arguments: vec![TemplateArgument { parameter: DeclarationId(604), value: DeclarationId(1622) }, TemplateArgument { parameter: DeclarationId(603), value: DeclarationId(747) }, TemplateArgument { parameter: DeclarationId(1399), value: DeclarationId(778) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 22496, 22537) }, - Declaration { id: DeclarationId(1667), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 2224, 2238) }, - Declaration { id: DeclarationId(1668), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 2243, 2268) }, - Declaration { id: DeclarationId(1669), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 2273, 2283) }, - Declaration { id: DeclarationId(1670), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 2548, 2565) }, - Declaration { id: DeclarationId(1671), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 2570, 2594) }, - Declaration { id: DeclarationId(1672), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 2599, 2631) }, - Declaration { id: DeclarationId(1673), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 2636, 2663) }, - Declaration { id: DeclarationId(1674), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3369, 3393) }, - Declaration { id: DeclarationId(1675), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3398, 3430) }, - Declaration { id: DeclarationId(1676), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3564, 3588) }, - Declaration { id: DeclarationId(1677), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3593, 3614) }, - Declaration { id: DeclarationId(1678), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3619, 3637) }, - Declaration { id: DeclarationId(1679), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3781, 3796) }, - Declaration { id: DeclarationId(1680), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3801, 3831) }, - Declaration { id: DeclarationId(1681), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3836, 3857) }, - Declaration { id: DeclarationId(1682), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 4024, 4044) }, - Declaration { id: DeclarationId(1683), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 4049, 4076) }, - Declaration { id: DeclarationId(1684), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 4081, 4095) }, - Declaration { id: DeclarationId(1685), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 4354, 4362) }, - Declaration { id: DeclarationId(1686), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 4367, 4393) }, - Declaration { id: DeclarationId(1687), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 4398, 4423) }, - Declaration { id: DeclarationId(1688), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 5320, 5332) }, - Declaration { id: DeclarationId(1689), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 5693, 5713) }, - Declaration { id: DeclarationId(1690), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 5718, 5736) }, - Declaration { id: DeclarationId(1691), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 5741, 5759) }, - Declaration { id: DeclarationId(1692), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 5764, 5791) }, - Declaration { id: DeclarationId(1693), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 5361, 5368) }, - Declaration { id: DeclarationId(1694), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 6292, 6296) }, - Declaration { id: DeclarationId(1695), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(804), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 7350, 7369) }, - Declaration { id: DeclarationId(1696), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(804), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 7915, 7934) }, - Declaration { id: DeclarationId(1697), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1356, 1388) }, - Declaration { id: DeclarationId(1698), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "witness".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1393, 1429) }, - Declaration { id: DeclarationId(1699), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "element".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1434, 1471) }, - Declaration { id: DeclarationId(1700), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1476, 1502) }, - Declaration { id: DeclarationId(1701), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1507, 1540) }, - Declaration { id: DeclarationId(1702), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1545, 1562) }, - Declaration { id: DeclarationId(1703), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "steps".to_string(), ty: DeclarationId(976) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1567, 1621) }, - Declaration { id: DeclarationId(1704), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1626, 1633) }, - Declaration { id: DeclarationId(1705), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "accessor".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2165, 2203) }, - Declaration { id: DeclarationId(1706), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "amount".to_string(), ty: DeclarationId(976) }, Field { label: "collection".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2208, 2282) }, - Declaration { id: DeclarationId(1707), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "steps".to_string(), ty: DeclarationId(976) }, Field { label: "ring_param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2287, 2362) }, - Declaration { id: DeclarationId(1708), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "divisor".to_string(), ty: DeclarationId(977) }, Field { label: "ring_param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2367, 2440) }, - Declaration { id: DeclarationId(1709), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "witness".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2445, 2482) }, - Declaration { id: DeclarationId(1710), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "element".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2487, 2524) }, - Declaration { id: DeclarationId(1711), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "outer_collection".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2529, 2570) }, - Declaration { id: DeclarationId(1712), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2575, 2591) }, - Declaration { id: DeclarationId(1713), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2803, 2813) }, - Declaration { id: DeclarationId(1714), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "steps".to_string(), ty: DeclarationId(976) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2818, 2865) }, - Declaration { id: DeclarationId(1715), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "divisor".to_string(), ty: DeclarationId(977) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2870, 2921) }, - Declaration { id: DeclarationId(1716), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 3111, 3115) }, - Declaration { id: DeclarationId(1717), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 3120, 3127) }, - Declaration { id: DeclarationId(1718), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 3132, 3138) }, - Declaration { id: DeclarationId(1719), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(796), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 3441, 3454) }, - Declaration { id: DeclarationId(1720), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 7082, 7093) }, - Declaration { id: DeclarationId(1721), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 7142, 7156) }, - Declaration { id: DeclarationId(1722), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 7221, 7237) }, - Declaration { id: DeclarationId(1723), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 360, 369) }, - Declaration { id: DeclarationId(1724), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 374, 381) }, - Declaration { id: DeclarationId(1725), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 614, 618) }, - Declaration { id: DeclarationId(1726), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 623, 632) }, - Declaration { id: DeclarationId(1727), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 910, 921) }, - Declaration { id: DeclarationId(1728), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 926, 935) }, - Declaration { id: DeclarationId(1729), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 1166, 1173) }, - Declaration { id: DeclarationId(1730), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 1178, 1187) }, - Declaration { id: DeclarationId(1731), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2035, 2044) }, - Declaration { id: DeclarationId(1732), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2049, 2065) }, - Declaration { id: DeclarationId(1733), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2070, 2080) }, - Declaration { id: DeclarationId(1734), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2085, 2099) }, - Declaration { id: DeclarationId(1735), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2385, 2399) }, - Declaration { id: DeclarationId(1736), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2404, 2418) }, - Declaration { id: DeclarationId(1737), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2818, 2830) }, - Declaration { id: DeclarationId(1738), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 3210, 3222) }, - Declaration { id: DeclarationId(1739), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 3694, 3708) }, - Declaration { id: DeclarationId(1740), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 3713, 3729) }, - Declaration { id: DeclarationId(1741), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 1022, 1036) }, - Declaration { id: DeclarationId(1742), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 1041, 1051) }, - Declaration { id: DeclarationId(1743), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 1056, 1068) }, - Declaration { id: DeclarationId(1744), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 1073, 1085) }, - Declaration { id: DeclarationId(1745), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 1090, 1103) }, - Declaration { id: DeclarationId(1746), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 1108, 1120) }, - Declaration { id: DeclarationId(1747), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 1125, 1148) }, - Declaration { id: DeclarationId(1748), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(820) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 5348, 5384) }, - Declaration { id: DeclarationId(1749), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(823) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 5389, 5430) }, - Declaration { id: DeclarationId(1750), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(821) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 5889, 5905) }, - Declaration { id: DeclarationId(1751), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(31), arguments: vec![TemplateArgument { parameter: DeclarationId(32), value: DeclarationId(845) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4196, 4216) }, - Declaration { id: DeclarationId(1752), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(833), arguments: vec![TemplateArgument { parameter: DeclarationId(834), value: DeclarationId(844) }, TemplateArgument { parameter: DeclarationId(835), value: DeclarationId(845) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4226, 4250) }, - Declaration { id: DeclarationId(1753), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(833), arguments: vec![TemplateArgument { parameter: DeclarationId(834), value: DeclarationId(844) }, TemplateArgument { parameter: DeclarationId(835), value: DeclarationId(845) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4261, 4285) }, - Declaration { id: DeclarationId(1754), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(833), arguments: vec![TemplateArgument { parameter: DeclarationId(834), value: DeclarationId(844) }, TemplateArgument { parameter: DeclarationId(835), value: DeclarationId(845) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4291, 4315) }, - Declaration { id: DeclarationId(1755), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(31), arguments: vec![TemplateArgument { parameter: DeclarationId(32), value: DeclarationId(848) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4392, 4412) }, - Declaration { id: DeclarationId(1756), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(833), arguments: vec![TemplateArgument { parameter: DeclarationId(834), value: DeclarationId(847) }, TemplateArgument { parameter: DeclarationId(835), value: DeclarationId(848) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4422, 4446) }, - Declaration { id: DeclarationId(1757), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(833), arguments: vec![TemplateArgument { parameter: DeclarationId(834), value: DeclarationId(847) }, TemplateArgument { parameter: DeclarationId(835), value: DeclarationId(848) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4457, 4481) }, - Declaration { id: DeclarationId(1758), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(833), arguments: vec![TemplateArgument { parameter: DeclarationId(834), value: DeclarationId(847) }, TemplateArgument { parameter: DeclarationId(835), value: DeclarationId(848) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4487, 4511) }, - Declaration { id: DeclarationId(1759), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(31), arguments: vec![TemplateArgument { parameter: DeclarationId(32), value: DeclarationId(851) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4595, 4615) }, - Declaration { id: DeclarationId(1760), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(833), arguments: vec![TemplateArgument { parameter: DeclarationId(834), value: DeclarationId(850) }, TemplateArgument { parameter: DeclarationId(835), value: DeclarationId(851) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4626, 4650) }, - Declaration { id: DeclarationId(1761), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(833), arguments: vec![TemplateArgument { parameter: DeclarationId(834), value: DeclarationId(850) }, TemplateArgument { parameter: DeclarationId(835), value: DeclarationId(851) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4675, 4699) }, - Declaration { id: DeclarationId(1762), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(31), arguments: vec![TemplateArgument { parameter: DeclarationId(32), value: DeclarationId(854) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4790, 4810) }, - Declaration { id: DeclarationId(1763), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(833), arguments: vec![TemplateArgument { parameter: DeclarationId(834), value: DeclarationId(853) }, TemplateArgument { parameter: DeclarationId(835), value: DeclarationId(854) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4821, 4845) }, - Declaration { id: DeclarationId(1764), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(833), arguments: vec![TemplateArgument { parameter: DeclarationId(834), value: DeclarationId(853) }, TemplateArgument { parameter: DeclarationId(835), value: DeclarationId(854) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4870, 4894) }, - Declaration { id: DeclarationId(1765), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(827) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 1626, 1643) }, - Declaration { id: DeclarationId(1766), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "reason".to_string(), ty: DeclarationId(186) }, Field { label: "at".to_string(), ty: DeclarationId(730) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 1648, 1689) }, - Declaration { id: DeclarationId(1767), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 1871, 1883) }, - Declaration { id: DeclarationId(1768), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "value".to_string(), ty: DeclarationId(825) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 1888, 1924) }, - Declaration { id: DeclarationId(1769), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(826), arguments: vec![TemplateArgument { parameter: DeclarationId(827), value: DeclarationId(830) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 2406, 2422) }, - Declaration { id: DeclarationId(1770), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(1769) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 2401, 2423) }, - Declaration { id: DeclarationId(1771), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "dimension_name".to_string(), ty: DeclarationId(186) }, Field { label: "composed".to_string(), ty: DeclarationId(830) }, Field { label: "witnesses".to_string(), ty: DeclarationId(1770) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 2317, 2429) }, - Declaration { id: DeclarationId(1772), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(825) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 2497, 2513) }, - Declaration { id: DeclarationId(1773), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(826), arguments: vec![TemplateArgument { parameter: DeclarationId(827), value: DeclarationId(830) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 2536, 2552) }, - Declaration { id: DeclarationId(1774), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(1773) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 2531, 2553) }, - Declaration { id: DeclarationId(1775), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "dimension_name".to_string(), ty: DeclarationId(186) }, Field { label: "violations".to_string(), ty: DeclarationId(1772) }, Field { label: "witnesses".to_string(), ty: DeclarationId(1774) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 2434, 2559) }, - Declaration { id: DeclarationId(1776), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(826), arguments: vec![TemplateArgument { parameter: DeclarationId(827), value: DeclarationId(832) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 3216, 3232) }, - Declaration { id: DeclarationId(1777), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(731), DeclarationId(730)], output: DeclarationId(1776), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 3195, 3232) }, - Declaration { id: DeclarationId(1778), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(832), DeclarationId(832)], output: DeclarationId(832), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 3244, 3275) }, - Declaration { id: DeclarationId(1779), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(730), DeclarationId(832)], output: DeclarationId(828), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 3316, 3359) }, - Declaration { id: DeclarationId(1780), name: Some("DimensionUnitAbelianGroup".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(25), arguments: vec![TemplateArgument { parameter: DeclarationId(26), value: DeclarationId(834) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4002, 4052) }, - Declaration { id: DeclarationId(1781), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(856) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 815, 833) }, - Declaration { id: DeclarationId(1782), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 1337, 1356) }, - Declaration { id: DeclarationId(1783), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 1361, 1383) }, - Declaration { id: DeclarationId(1784), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(861) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 1752, 1775) }, - Declaration { id: DeclarationId(1785), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 2772, 2780) }, - Declaration { id: DeclarationId(1786), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 2785, 2793) }, - Declaration { id: DeclarationId(1787), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3345, 3354) }, - Declaration { id: DeclarationId(1788), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3359, 3372) }, - Declaration { id: DeclarationId(1789), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3377, 3385) }, - Declaration { id: DeclarationId(1790), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3390, 3400) }, - Declaration { id: DeclarationId(1791), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3405, 3415) }, - Declaration { id: DeclarationId(1792), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3420, 3431) }, - Declaration { id: DeclarationId(1793), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3436, 3444) }, - Declaration { id: DeclarationId(1794), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3449, 3456) }, - Declaration { id: DeclarationId(1795), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3461, 3471) }, - Declaration { id: DeclarationId(1796), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3476, 3488) }, - Declaration { id: DeclarationId(1797), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6181, 6207) }, - Declaration { id: DeclarationId(1798), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6212, 6222) }, - Declaration { id: DeclarationId(1799), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 9950, 9956) }, - Declaration { id: DeclarationId(1800), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 9961, 9972) }, - Declaration { id: DeclarationId(1801), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 10292, 10303) }, - Declaration { id: DeclarationId(1802), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 10308, 10319) }, - Declaration { id: DeclarationId(1803), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 12252, 12263) }, - Declaration { id: DeclarationId(1804), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 12268, 12276) }, - Declaration { id: DeclarationId(1805), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(885) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/go_method_template_contracts.dag", 2440, 2468) }, - Declaration { id: DeclarationId(1806), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(795), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 20442, 20454) }, - Declaration { id: DeclarationId(1807), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(798), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 21827, 21842) }, - Declaration { id: DeclarationId(1808), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(907) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 27734, 27749) }, - Declaration { id: DeclarationId(1809), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 31887, 31891) }, - Declaration { id: DeclarationId(1810), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 32183, 32187) }, - Declaration { id: DeclarationId(1811), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 33432, 33436) }, - Declaration { id: DeclarationId(1812), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 33907, 33911) }, - Declaration { id: DeclarationId(1813), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 35170, 35174) }, - Declaration { id: DeclarationId(1814), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 35442, 35446) }, - Declaration { id: DeclarationId(1815), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 5562, 5577) }, - Declaration { id: DeclarationId(1816), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 5617, 5630) }, - Declaration { id: DeclarationId(1817), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 5678, 5695) }, - Declaration { id: DeclarationId(1818), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 5734, 5746) }, - Declaration { id: DeclarationId(1819), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 5794, 5811) }, - Declaration { id: DeclarationId(1820), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "field".to_string(), ty: DeclarationId(891) }, Field { label: "factor".to_string(), ty: DeclarationId(796) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 9904, 9966) }, - Declaration { id: DeclarationId(1821), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "field".to_string(), ty: DeclarationId(891) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 9971, 10013) }, - Declaration { id: DeclarationId(1822), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }, Field { label: "factor".to_string(), ty: DeclarationId(796) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 10018, 10075) }, - Declaration { id: DeclarationId(1823), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 10080, 10094) }, - Declaration { id: DeclarationId(1824), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 10099, 10114) }, - Declaration { id: DeclarationId(1825), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 24019, 24033) }, - Declaration { id: DeclarationId(1826), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "degree".to_string(), ty: DeclarationId(976) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 24038, 24085) }, - Declaration { id: DeclarationId(1827), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "numerator".to_string(), ty: DeclarationId(976) }, Field { label: "root".to_string(), ty: DeclarationId(976) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 24090, 24167) }, - Declaration { id: DeclarationId(1828), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "base".to_string(), ty: DeclarationId(977) }, Field { label: "argument".to_string(), ty: DeclarationId(976) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 24172, 24246) }, - Declaration { id: DeclarationId(1829), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }, Field { label: "exponent".to_string(), ty: DeclarationId(904) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 24866, 24922) }, - Declaration { id: DeclarationId(1830), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 24938, 24963) }, - Declaration { id: DeclarationId(1831), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 26612, 26625) }, - Declaration { id: DeclarationId(1832), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "cost".to_string(), ty: DeclarationId(906) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 26669, 26701) }, - Declaration { id: DeclarationId(1833), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(906) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 26764, 26780) }, - Declaration { id: DeclarationId(1834), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "factors".to_string(), ty: DeclarationId(1833) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 26740, 26782) }, - Declaration { id: DeclarationId(1835), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(906) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 26844, 26860) }, - Declaration { id: DeclarationId(1836), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(1835) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 26839, 26861) }, - Declaration { id: DeclarationId(1837), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "terms".to_string(), ty: DeclarationId(1836) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 26811, 26863) }, - Declaration { id: DeclarationId(1838), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(907) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 27161, 27176) }, - Declaration { id: DeclarationId(1839), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "terms".to_string(), ty: DeclarationId(1838) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 27143, 27178) }, - Declaration { id: DeclarationId(1840), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 27261, 27273) }, - Declaration { id: DeclarationId(1841), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 27343, 27353) }, - Declaration { id: DeclarationId(1842), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(826), arguments: vec![TemplateArgument { parameter: DeclarationId(827), value: DeclarationId(944) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lens.dag", 4180, 4190) }, - Declaration { id: DeclarationId(1843), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(731), DeclarationId(730)], output: DeclarationId(1842), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lens.dag", 4159, 4190) }, - Declaration { id: DeclarationId(1844), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(19), arguments: vec![TemplateArgument { parameter: DeclarationId(20), value: DeclarationId(944) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lens.dag", 4205, 4214) }, - Declaration { id: DeclarationId(1845), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(944), DeclarationId(944)], output: DeclarationId(944), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lens.dag", 4225, 4238) }, - Declaration { id: DeclarationId(1846), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(944), DeclarationId(722)], output: DeclarationId(944), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lens.dag", 4250, 4271) }, - Declaration { id: DeclarationId(1847), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(731), DeclarationId(944)], output: DeclarationId(828), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lens.dag", 4284, 4316) }, - Declaration { id: DeclarationId(1848), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(945), arguments: vec![TemplateArgument { parameter: DeclarationId(946), value: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lookup.dag", 4577, 4588) }, - Declaration { id: DeclarationId(1849), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(945), arguments: vec![TemplateArgument { parameter: DeclarationId(946), value: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lookup.dag", 4630, 4641) }, - Declaration { id: DeclarationId(1850), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lookup.dag", 4532, 4536) }, - Declaration { id: DeclarationId(1851), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(946) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lookup.dag", 4541, 4551) }, - Declaration { id: DeclarationId(1852), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(963) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 1179, 1196) }, - Declaration { id: DeclarationId(1853), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(962), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 1267, 1279) }, - Declaration { id: DeclarationId(1854), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(955) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 1747, 1764) }, - Declaration { id: DeclarationId(1855), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(1854) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 1736, 1765) }, - Declaration { id: DeclarationId(1856), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(952) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 1777, 1795) }, - Declaration { id: DeclarationId(1857), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(1856) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 1770, 1796) }, - Declaration { id: DeclarationId(1858), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 2073, 2113) }, - Declaration { id: DeclarationId(1859), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(955) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 2165, 2182) }, - Declaration { id: DeclarationId(1860), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "args".to_string(), ty: DeclarationId(1859) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 2118, 2211) }, - Declaration { id: DeclarationId(1861), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "inner".to_string(), ty: DeclarationId(955) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 2216, 2280) }, - Declaration { id: DeclarationId(1862), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(955) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 2307, 2324) }, - Declaration { id: DeclarationId(1863), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "inputs".to_string(), ty: DeclarationId(1862) }, Field { label: "output".to_string(), ty: DeclarationId(955) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 2285, 2379) }, - Declaration { id: DeclarationId(1864), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 3749, 3795) }, - Declaration { id: DeclarationId(1865), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "binding".to_string(), ty: DeclarationId(186) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 3800, 3883) }, - Declaration { id: DeclarationId(1866), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(959) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 3937, 3962) }, - Declaration { id: DeclarationId(1867), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "fields".to_string(), ty: DeclarationId(1866) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 3888, 3991) }, - Declaration { id: DeclarationId(1868), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 4578, 4586) }, - Declaration { id: DeclarationId(1869), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 4591, 4601) }, - Declaration { id: DeclarationId(1870), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 4606, 4620) }, - Declaration { id: DeclarationId(1871), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "value".to_string(), ty: DeclarationId(961) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 4734, 4785) }, - Declaration { id: DeclarationId(1872), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 4790, 4828) }, - Declaration { id: DeclarationId(1873), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 4856, 4868) }, - Declaration { id: DeclarationId(1874), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 4890, 4906) }, - Declaration { id: DeclarationId(1875), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "segments".to_string(), ty: DeclarationId(1873) }, Field { label: "segment_spans".to_string(), ty: DeclarationId(1874) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 4833, 4935) }, - Declaration { id: DeclarationId(1876), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(962) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 4980, 4997) }, - Declaration { id: DeclarationId(1877), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "target".to_string(), ty: DeclarationId(186) }, Field { label: "args".to_string(), ty: DeclarationId(1876) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 4940, 5026) }, - Declaration { id: DeclarationId(1878), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(956) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 5082, 5106) }, - Declaration { id: DeclarationId(1879), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "target".to_string(), ty: DeclarationId(186) }, Field { label: "fields".to_string(), ty: DeclarationId(1878) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 5031, 5135) }, - Declaration { id: DeclarationId(1880), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(962) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 5186, 5203) }, - Declaration { id: DeclarationId(1881), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "op".to_string(), ty: DeclarationId(710) }, Field { label: "args".to_string(), ty: DeclarationId(1880) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 5140, 5232) }, - Declaration { id: DeclarationId(1882), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 5260, 5272) }, - Declaration { id: DeclarationId(1883), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "params".to_string(), ty: DeclarationId(1882) }, Field { label: "body".to_string(), ty: DeclarationId(962) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 5237, 5325) }, - Declaration { id: DeclarationId(1884), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "cond".to_string(), ty: DeclarationId(962) }, Field { label: "then_branch".to_string(), ty: DeclarationId(962) }, Field { label: "else_branch".to_string(), ty: DeclarationId(962) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 5330, 5449) }, - Declaration { id: DeclarationId(1885), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(958) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 5503, 5524) }, - Declaration { id: DeclarationId(1886), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "scrutinee".to_string(), ty: DeclarationId(962) }, Field { label: "arms".to_string(), ty: DeclarationId(1885) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 5454, 5553) }, - Declaration { id: DeclarationId(1887), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(956) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 5581, 5605) }, - Declaration { id: DeclarationId(1888), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "fields".to_string(), ty: DeclarationId(1887) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 5558, 5634) }, - Declaration { id: DeclarationId(1889), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(962) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 5662, 5679) }, - Declaration { id: DeclarationId(1890), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "elements".to_string(), ty: DeclarationId(1889) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 5639, 5708) }, - Declaration { id: DeclarationId(1891), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(957) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 7802, 7823) }, - Declaration { id: DeclarationId(1892), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "entries".to_string(), ty: DeclarationId(1891) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 7781, 7852) }, - Declaration { id: DeclarationId(1893), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(955), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 8783, 8795) }, - Declaration { id: DeclarationId(1894), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "type_ann".to_string(), ty: DeclarationId(1893) }, Field { label: "expr".to_string(), ty: DeclarationId(962) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 8742, 8825) }, - Declaration { id: DeclarationId(1895), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 8873, 8885) }, - Declaration { id: DeclarationId(1896), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(951) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 8900, 8918) }, - Declaration { id: DeclarationId(1897), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "type_params".to_string(), ty: DeclarationId(1895) }, Field { label: "params".to_string(), ty: DeclarationId(1896) }, Field { label: "return_type".to_string(), ty: DeclarationId(955) }, Field { label: "body".to_string(), ty: DeclarationId(962) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 8830, 9002) }, - Declaration { id: DeclarationId(1898), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9062, 9074) }, - Declaration { id: DeclarationId(1899), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(951) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9089, 9107) }, - Declaration { id: DeclarationId(1900), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "type_params".to_string(), ty: DeclarationId(1898) }, Field { label: "params".to_string(), ty: DeclarationId(1899) }, Field { label: "return_type".to_string(), ty: DeclarationId(955) }, Field { label: "body_span".to_string(), ty: DeclarationId(121) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9007, 9195) }, - Declaration { id: DeclarationId(1901), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(962), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9260, 9272) }, - Declaration { id: DeclarationId(1902), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "ty".to_string(), ty: DeclarationId(955) }, Field { label: "body".to_string(), ty: DeclarationId(1901) }, Field { label: "body_span".to_string(), ty: DeclarationId(121) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9200, 9329) }, - Declaration { id: DeclarationId(1903), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9349, 9361) }, - Declaration { id: DeclarationId(1904), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "path".to_string(), ty: DeclarationId(1903) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9334, 9381) }, - Declaration { id: DeclarationId(1905), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9407, 9419) }, - Declaration { id: DeclarationId(1906), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9433, 9445) }, - Declaration { id: DeclarationId(1907), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "path".to_string(), ty: DeclarationId(1905) }, Field { label: "names".to_string(), ty: DeclarationId(1906) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9386, 9474) }, - Declaration { id: DeclarationId(1908), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9528, 9540) }, - Declaration { id: DeclarationId(1909), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "type_params".to_string(), ty: DeclarationId(1908) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9479, 9569) }, - Declaration { id: DeclarationId(1910), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9625, 9637) }, - Declaration { id: DeclarationId(1911), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(952) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9652, 9670) }, - Declaration { id: DeclarationId(1912), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "type_params".to_string(), ty: DeclarationId(1910) }, Field { label: "fields".to_string(), ty: DeclarationId(1911) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9574, 9699) }, - Declaration { id: DeclarationId(1913), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9752, 9764) }, - Declaration { id: DeclarationId(1914), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(953) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9781, 9801) }, - Declaration { id: DeclarationId(1915), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(955), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9818, 9830) }, - Declaration { id: DeclarationId(1916), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "type_params".to_string(), ty: DeclarationId(1913) }, Field { label: "variants".to_string(), ty: DeclarationId(1914) }, Field { label: "inhabits".to_string(), ty: DeclarationId(1915) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9704, 9859) }, - Declaration { id: DeclarationId(1917), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9914, 9926) }, - Declaration { id: DeclarationId(1918), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(962), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9998, 10010) }, - Declaration { id: DeclarationId(1919), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "type_params".to_string(), ty: DeclarationId(1917) }, Field { label: "nominal_opaque".to_string(), ty: DeclarationId(88) }, Field { label: "target".to_string(), ty: DeclarationId(955) }, Field { label: "refinement".to_string(), ty: DeclarationId(1918) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9864, 10039) }, - Declaration { id: DeclarationId(1920), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(885) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/python_method_template_contracts.dag", 2092, 2120) }, - Declaration { id: DeclarationId(1921), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(885) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/rust_method_template_contracts.dag", 4043, 4071) }, - Declaration { id: DeclarationId(1922), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(968), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 2329, 2345) }, - Declaration { id: DeclarationId(1923), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(968), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 2350, 2366) }, - Declaration { id: DeclarationId(1924), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(968), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 2371, 2387) }, - Declaration { id: DeclarationId(1925), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(968) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 2632, 2660) }, - Declaration { id: DeclarationId(1926), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(968) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 2704, 2732) }, - Declaration { id: DeclarationId(1927), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(976), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 5879, 5901) }, - Declaration { id: DeclarationId(1928), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(977), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 6321, 6341) }, - Declaration { id: DeclarationId(1929), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 667, 673) }, - Declaration { id: DeclarationId(1930), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 678, 691) }, - Declaration { id: DeclarationId(1931), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 696, 710) }, - Declaration { id: DeclarationId(1932), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 3232, 3258) }, - Declaration { id: DeclarationId(1933), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 3263, 3291) }, - Declaration { id: DeclarationId(1934), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 3296, 3329) }, - Declaration { id: DeclarationId(1935), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 3334, 3365) }, - Declaration { id: DeclarationId(1936), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 3370, 3402) }, - Declaration { id: DeclarationId(1937), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 4409, 4416) }, - Declaration { id: DeclarationId(1938), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "previous".to_string(), ty: DeclarationId(976) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 4421, 4471) }, - Declaration { id: DeclarationId(1939), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 4966, 4977) }, - Declaration { id: DeclarationId(1940), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "inner".to_string(), ty: DeclarationId(977) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 4982, 5027) }, - Declaration { id: DeclarationId(1941), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "accessor".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7131, 7165) }, - Declaration { id: DeclarationId(1942), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "amount".to_string(), ty: DeclarationId(976) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7170, 7214) }, - Declaration { id: DeclarationId(1943), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "steps".to_string(), ty: DeclarationId(976) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7219, 7277) }, - Declaration { id: DeclarationId(1944), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "divisor".to_string(), ty: DeclarationId(977) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7282, 7338) }, - Declaration { id: DeclarationId(1945), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "witness".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7343, 7376) }, - Declaration { id: DeclarationId(1946), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "element".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7381, 7411) }, - Declaration { id: DeclarationId(1947), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7416, 7429) }, - Declaration { id: DeclarationId(1948), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(975) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7469, 7491) }, - Declaration { id: DeclarationId(1949), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(968) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7701, 7722) }, - Declaration { id: DeclarationId(1950), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 646, 651) }, - Declaration { id: DeclarationId(1951), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 656, 660) }, - Declaration { id: DeclarationId(1952), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 665, 671) }, - Declaration { id: DeclarationId(1953), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 676, 682) }, - Declaration { id: DeclarationId(1954), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 687, 691) }, - Declaration { id: DeclarationId(1955), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 696, 702) }, - Declaration { id: DeclarationId(1956), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 707, 715) }, - Declaration { id: DeclarationId(1957), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 720, 728) }, - Declaration { id: DeclarationId(1958), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 733, 740) }, - Declaration { id: DeclarationId(1959), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 745, 751) }, - Declaration { id: DeclarationId(1960), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 756, 763) }, - Declaration { id: DeclarationId(1961), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 768, 774) }, - Declaration { id: DeclarationId(1962), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 779, 786) }, - Declaration { id: DeclarationId(1963), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 791, 804) }, - Declaration { id: DeclarationId(1964), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 809, 820) }, - Declaration { id: DeclarationId(1965), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 825, 842) }, - Declaration { id: DeclarationId(1966), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 847, 849) }, - Declaration { id: DeclarationId(1967), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 854, 858) }, - Declaration { id: DeclarationId(1968), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 863, 868) }, - Declaration { id: DeclarationId(1969), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 873, 875) }, - Declaration { id: DeclarationId(1970), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 880, 882) }, - Declaration { id: DeclarationId(1971), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 887, 889) }, - Declaration { id: DeclarationId(1972), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 894, 896) }, - Declaration { id: DeclarationId(1973), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 901, 905) }, - Declaration { id: DeclarationId(1974), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 910, 915) }, - Declaration { id: DeclarationId(1975), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 920, 924) }, - Declaration { id: DeclarationId(1976), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 929, 934) }, - Declaration { id: DeclarationId(1977), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 939, 945) }, - Declaration { id: DeclarationId(1978), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 950, 958) }, - Declaration { id: DeclarationId(1979), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 963, 968) }, - Declaration { id: DeclarationId(1980), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 973, 978) }, - Declaration { id: DeclarationId(1981), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 983, 991) }, - Declaration { id: DeclarationId(1982), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 996, 1005) }, - Declaration { id: DeclarationId(1983), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1010, 1013) }, - Declaration { id: DeclarationId(1984), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1018, 1024) }, - Declaration { id: DeclarationId(1985), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1029, 1035) }, - Declaration { id: DeclarationId(1986), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1040, 1046) }, - Declaration { id: DeclarationId(1987), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1051, 1057) }, - Declaration { id: DeclarationId(1988), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1062, 1070) }, - Declaration { id: DeclarationId(1989), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1075, 1083) }, - Declaration { id: DeclarationId(1990), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1088, 1093) }, - Declaration { id: DeclarationId(1991), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1098, 1107) }, - Declaration { id: DeclarationId(1992), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1112, 1116) }, - Declaration { id: DeclarationId(1993), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1121, 1129) }, - Declaration { id: DeclarationId(1994), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1134, 1137) }, - Declaration { id: DeclarationId(1995), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1708, 1713) }, - Declaration { id: DeclarationId(1996), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1718, 1722) }, - Declaration { id: DeclarationId(1997), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1727, 1733) }, - Declaration { id: DeclarationId(1998), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1738, 1744) }, - Declaration { id: DeclarationId(1999), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1749, 1753) }, - Declaration { id: DeclarationId(2000), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1758, 1764) }, - Declaration { id: DeclarationId(2001), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1769, 1777) }, - Declaration { id: DeclarationId(2002), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1782, 1790) }, - Declaration { id: DeclarationId(2003), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1795, 1802) }, - Declaration { id: DeclarationId(2004), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1807, 1813) }, - Declaration { id: DeclarationId(2005), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1818, 1825) }, - Declaration { id: DeclarationId(2006), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1830, 1836) }, - Declaration { id: DeclarationId(2007), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1841, 1848) }, - Declaration { id: DeclarationId(2008), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2288, 2290) }, - Declaration { id: DeclarationId(2009), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2295, 2299) }, - Declaration { id: DeclarationId(2010), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2304, 2309) }, - Declaration { id: DeclarationId(2011), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2314, 2316) }, - Declaration { id: DeclarationId(2012), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2321, 2323) }, - Declaration { id: DeclarationId(2013), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2328, 2330) }, - Declaration { id: DeclarationId(2014), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2335, 2337) }, - Declaration { id: DeclarationId(2015), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2342, 2346) }, - Declaration { id: DeclarationId(2016), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2351, 2356) }, - Declaration { id: DeclarationId(2017), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2361, 2365) }, - Declaration { id: DeclarationId(2018), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2370, 2375) }, - Declaration { id: DeclarationId(2019), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2380, 2386) }, - Declaration { id: DeclarationId(2020), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2391, 2399) }, - Declaration { id: DeclarationId(2021), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2404, 2409) }, - Declaration { id: DeclarationId(2022), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2414, 2419) }, - Declaration { id: DeclarationId(2023), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2424, 2432) }, - Declaration { id: DeclarationId(2024), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2437, 2446) }, - Declaration { id: DeclarationId(2025), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2451, 2454) }, - Declaration { id: DeclarationId(2026), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2459, 2465) }, - Declaration { id: DeclarationId(2027), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2470, 2476) }, - Declaration { id: DeclarationId(2028), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2481, 2487) }, - Declaration { id: DeclarationId(2029), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2492, 2498) }, - Declaration { id: DeclarationId(2030), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2503, 2511) }, - Declaration { id: DeclarationId(2031), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2516, 2524) }, - Declaration { id: DeclarationId(2032), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2529, 2534) }, - Declaration { id: DeclarationId(2033), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2539, 2548) }, - Declaration { id: DeclarationId(2034), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2553, 2557) }, - Declaration { id: DeclarationId(2035), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2562, 2570) }, - Declaration { id: DeclarationId(2036), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(966) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 13007, 13030) }, - Declaration { id: DeclarationId(2037), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(1008) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 13232, 13247) }, - Declaration { id: DeclarationId(2038), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(1010) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 13252, 13272) }, - Declaration { id: DeclarationId(2039), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2432, 2446) }, - Declaration { id: DeclarationId(2040), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2451, 2461) }, - Declaration { id: DeclarationId(2041), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2466, 2478) }, - Declaration { id: DeclarationId(2042), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2483, 2495) }, - Declaration { id: DeclarationId(2043), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2500, 2513) }, - Declaration { id: DeclarationId(2044), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2518, 2530) }, - Declaration { id: DeclarationId(2045), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2535, 2558) }, - Declaration { id: DeclarationId(2046), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2964, 2973) }, - Declaration { id: DeclarationId(2047), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2978, 2994) }, - Declaration { id: DeclarationId(2048), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 3653, 3661) }, - Declaration { id: DeclarationId(2049), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 3666, 3676) }, - Declaration { id: DeclarationId(2050), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4491, 4504) }, - Declaration { id: DeclarationId(2051), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4509, 4522) }, - Declaration { id: DeclarationId(2052), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4527, 4535) }, - Declaration { id: DeclarationId(2053), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4560, 4568) }, - Declaration { id: DeclarationId(2054), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(1002) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4573, 4613) }, - Declaration { id: DeclarationId(2055), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "expected".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4618, 4651) }, - Declaration { id: DeclarationId(2056), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "bind_name".to_string(), ty: DeclarationId(186) }, Field { label: "state".to_string(), ty: DeclarationId(1003) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4656, 4734) }, - Declaration { id: DeclarationId(2057), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "declaration_name".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4900, 4963) }, - Declaration { id: DeclarationId(2058), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "bind_name".to_string(), ty: DeclarationId(186) }, Field { label: "comparator".to_string(), ty: DeclarationId(708) }, Field { label: "bound".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4968, 5059) }, - Declaration { id: DeclarationId(2059), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "subject".to_string(), ty: DeclarationId(1021) }, Field { label: "input_sample".to_string(), ty: DeclarationId(1021) }, Field { label: "expected_output".to_string(), ty: DeclarationId(1021) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 5064, 5196) }, - Declaration { id: DeclarationId(2060), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "subject".to_string(), ty: DeclarationId(1021) }, Field { label: "invariant".to_string(), ty: DeclarationId(1021) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 5411, 5500) }, - Declaration { id: DeclarationId(2061), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 6300, 6312) }, - Declaration { id: DeclarationId(2062), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "command".to_string(), ty: DeclarationId(186) }, Field { label: "args".to_string(), ty: DeclarationId(2061) }, Field { label: "expect_exit_code".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 6249, 6346) }, - Declaration { id: DeclarationId(2063), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 7046, 7058) }, - Declaration { id: DeclarationId(2064), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "command".to_string(), ty: DeclarationId(186) }, Field { label: "args".to_string(), ty: DeclarationId(2063) }, Field { label: "expect_exit_code".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 6996, 7092) }, - Declaration { id: DeclarationId(2065), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "lens_ref".to_string(), ty: DeclarationId(1021) }, Field { label: "input_ref".to_string(), ty: DeclarationId(1021) }, Field { label: "expected_ref".to_string(), ty: DeclarationId(1021) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 7390, 7512) }, - Declaration { id: DeclarationId(2066), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "subject_ref".to_string(), ty: DeclarationId(1021) }, Field { label: "oracle_ref".to_string(), ty: DeclarationId(1021) }, Field { label: "input_ref".to_string(), ty: DeclarationId(1021) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 7774, 7899) }, - Declaration { id: DeclarationId(2067), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "law".to_string(), ty: DeclarationId(1004) }, Field { label: "lens_ref".to_string(), ty: DeclarationId(1021) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 8495, 8574) }, - Declaration { id: DeclarationId(2068), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "authority".to_string(), ty: DeclarationId(1021) }, Field { label: "list_constant".to_string(), ty: DeclarationId(993) }, Field { label: "bound".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 8794, 8907) }, - Declaration { id: DeclarationId(2069), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "authority".to_string(), ty: DeclarationId(1021) }, Field { label: "list_constant".to_string(), ty: DeclarationId(993) }, Field { label: "subset_predicate".to_string(), ty: DeclarationId(1021) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 8912, 9048) }, - Declaration { id: DeclarationId(2070), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "compile_target".to_string(), ty: DeclarationId(991) }, Field { label: "expected".to_string(), ty: DeclarationId(992) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 9053, 9135) }, - Declaration { id: DeclarationId(2071), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "authority".to_string(), ty: DeclarationId(1021) }, Field { label: "ratchet_kind".to_string(), ty: DeclarationId(1021) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 9140, 9226) }, - Declaration { id: DeclarationId(2072), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(991) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 9305, 9315) }, - Declaration { id: DeclarationId(2073), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "authority".to_string(), ty: DeclarationId(1021) }, Field { label: "generated_paths".to_string(), ty: DeclarationId(2072) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 9231, 9321) }, - Declaration { id: DeclarationId(2074), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "deferred_gate".to_string(), ty: DeclarationId(1021) }, Field { label: "target_lane".to_string(), ty: DeclarationId(1021) }, Field { label: "authority_doc".to_string(), ty: DeclarationId(1021) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 10263, 10397) }, - Declaration { id: DeclarationId(2075), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "deferred_gate".to_string(), ty: DeclarationId(1021) }, Field { label: "target_lane".to_string(), ty: DeclarationId(1021) }, Field { label: "authority_doc".to_string(), ty: DeclarationId(1021) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 11036, 11180) }, - Declaration { id: DeclarationId(2076), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(966) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12224, 12247) }, - Declaration { id: DeclarationId(2077), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(1008) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12293, 12308) }, - Declaration { id: DeclarationId(2078), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(966) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12564, 12587) }, - Declaration { id: DeclarationId(2079), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(730) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/workflows.dag", 992, 1006) }, - Declaration { id: DeclarationId(2080), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 532, 547) }, - Declaration { id: DeclarationId(2081), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 550, 561) }, - Declaration { id: DeclarationId(2082), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 564, 576) }, - Declaration { id: DeclarationId(2083), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(710), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/operators.dag", 142, 155) }, - Declaration { id: DeclarationId(2084), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5254, 5272) }, - Declaration { id: DeclarationId(2085), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5277, 5292) }, - Declaration { id: DeclarationId(2086), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5321, 5342) }, - Declaration { id: DeclarationId(2087), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5347, 5362) }, - Declaration { id: DeclarationId(2088), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6875, 6885) }, - Declaration { id: DeclarationId(2089), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6890, 6901) }, - Declaration { id: DeclarationId(2090), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6906, 6919) }, - Declaration { id: DeclarationId(2091), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6924, 6937) }, - Declaration { id: DeclarationId(2092), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6942, 6955) }, - Declaration { id: DeclarationId(2093), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6960, 6975) }, - Declaration { id: DeclarationId(2094), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 7717, 7734) }, - Declaration { id: DeclarationId(2095), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 7739, 7749) }, - Declaration { id: DeclarationId(2096), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 7754, 7758) }, - Declaration { id: DeclarationId(2097), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "target_name".to_string(), ty: DeclarationId(186) }, Field { label: "algebra".to_string(), ty: DeclarationId(1388) }, Field { label: "carrier".to_string(), ty: DeclarationId(1390) }, Field { label: "range_min_inclusive".to_string(), ty: DeclarationId(186) }, Field { label: "range_max_inclusive".to_string(), ty: DeclarationId(186) }, Field { label: "is_copy".to_string(), ty: DeclarationId(88) }, Field { label: "overflow".to_string(), ty: DeclarationId(1391) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 8536, 9108) }, - Declaration { id: DeclarationId(2098), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "target_name".to_string(), ty: DeclarationId(186) }, Field { label: "algebra".to_string(), ty: DeclarationId(1389) }, Field { label: "carrier".to_string(), ty: DeclarationId(1390) }, Field { label: "is_copy".to_string(), ty: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 9113, 9295) }, - Declaration { id: DeclarationId(2099), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(1392) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 9623, 9642) }, + Declaration { id: DeclarationId(203), name: Some("add_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("add".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 3810, 3862) }, + Declaration { id: DeclarationId(204), name: Some("all_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("all".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 3863, 3915) }, + Declaration { id: DeclarationId(205), name: Some("any_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("any".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 3916, 3968) }, + Declaration { id: DeclarationId(206), name: Some("append_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("append".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 3969, 4027) }, + Declaration { id: DeclarationId(207), name: Some("bottom_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("bottom".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4028, 4086) }, + Declaration { id: DeclarationId(208), name: Some("chars_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("chars".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4087, 4143) }, + Declaration { id: DeclarationId(209), name: Some("clamp_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("clamp".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4144, 4200) }, + Declaration { id: DeclarationId(210), name: Some("compare_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("compare".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4201, 4261) }, + Declaration { id: DeclarationId(211), name: Some("complement_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("complement".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4262, 4328) }, + Declaration { id: DeclarationId(212), name: Some("concat_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("concat".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4329, 4387) }, + Declaration { id: DeclarationId(213), name: Some("contains_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("contains".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4388, 4450) }, + Declaration { id: DeclarationId(214), name: Some("count_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("count".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4451, 4507) }, + Declaration { id: DeclarationId(215), name: Some("diff_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("diff".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4508, 4562) }, + Declaration { id: DeclarationId(216), name: Some("empty_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("empty".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4563, 4619) }, + Declaration { id: DeclarationId(217), name: Some("ends_with_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("ends_with".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4620, 4684) }, + Declaration { id: DeclarationId(218), name: Some("enumerate_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("enumerate".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4685, 4749) }, + Declaration { id: DeclarationId(219), name: Some("filter_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("filter".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4750, 4808) }, + Declaration { id: DeclarationId(220), name: Some("first_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("first".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4809, 4865) }, + Declaration { id: DeclarationId(221), name: Some("flat_map_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("flat_map".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4866, 4928) }, + Declaration { id: DeclarationId(222), name: Some("fold_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("fold".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4929, 4983) }, + Declaration { id: DeclarationId(223), name: Some("get_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("get".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4984, 5036) }, + Declaration { id: DeclarationId(224), name: Some("has_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("has".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5037, 5089) }, + Declaration { id: DeclarationId(225), name: Some("intersect_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("intersect".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5090, 5154) }, + Declaration { id: DeclarationId(226), name: Some("join_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("join".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5155, 5209) }, + Declaration { id: DeclarationId(227), name: Some("keys_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("keys".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5210, 5264) }, + Declaration { id: DeclarationId(228), name: Some("last_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("last".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5265, 5319) }, + Declaration { id: DeclarationId(229), name: Some("length_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("length".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5320, 5378) }, + Declaration { id: DeclarationId(230), name: Some("list_push_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("list_push".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5379, 5443) }, + Declaration { id: DeclarationId(231), name: Some("lookup_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("lookup".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5444, 5502) }, + Declaration { id: DeclarationId(232), name: Some("map_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("map".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5503, 5555) }, + Declaration { id: DeclarationId(233), name: Some("map_contains_key_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("map_contains_key".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5556, 5634) }, + Declaration { id: DeclarationId(234), name: Some("map_get_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("map_get".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5635, 5695) }, + Declaration { id: DeclarationId(235), name: Some("map_has_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("map_has".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5696, 5756) }, + Declaration { id: DeclarationId(236), name: Some("map_insert_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("map_insert".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5757, 5823) }, + Declaration { id: DeclarationId(237), name: Some("map_keys_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("map_keys".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5824, 5886) }, + Declaration { id: DeclarationId(238), name: Some("map_merge_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("map_merge".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5887, 5951) }, + Declaration { id: DeclarationId(239), name: Some("map_values_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("map_values".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5952, 6018) }, + Declaration { id: DeclarationId(240), name: Some("meet_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("meet".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6019, 6073) }, + Declaration { id: DeclarationId(241), name: Some("member_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("member".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6074, 6132) }, + Declaration { id: DeclarationId(242), name: Some("mul_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("mul".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6133, 6185) }, + Declaration { id: DeclarationId(243), name: Some("negate_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("negate".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6186, 6244) }, + Declaration { id: DeclarationId(244), name: Some("one_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("one".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6245, 6297) }, + Declaration { id: DeclarationId(245), name: Some("reciprocal_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("reciprocal".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6298, 6364) }, + Declaration { id: DeclarationId(246), name: Some("replace_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("replace".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6365, 6425) }, + Declaration { id: DeclarationId(247), name: Some("reverse_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("reverse".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6426, 6486) }, + Declaration { id: DeclarationId(248), name: Some("skip_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("skip".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6487, 6541) }, + Declaration { id: DeclarationId(249), name: Some("sort_by_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("sort_by".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6542, 6602) }, + Declaration { id: DeclarationId(250), name: Some("split_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("split".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6603, 6659) }, + Declaration { id: DeclarationId(251), name: Some("starts_with_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("starts_with".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6660, 6728) }, + Declaration { id: DeclarationId(252), name: Some("substring_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("substring".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6729, 6793) }, + Declaration { id: DeclarationId(253), name: Some("take_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("take".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6794, 6848) }, + Declaration { id: DeclarationId(254), name: Some("to_int_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("to_int".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6849, 6907) }, + Declaration { id: DeclarationId(255), name: Some("to_lower_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("to_lower".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6908, 6970) }, + Declaration { id: DeclarationId(256), name: Some("to_string_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("to_string".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6971, 7035) }, + Declaration { id: DeclarationId(257), name: Some("to_upper_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("to_upper".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 7036, 7098) }, + Declaration { id: DeclarationId(258), name: Some("top_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("top".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 7099, 7151) }, + Declaration { id: DeclarationId(259), name: Some("trim_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("trim".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 7152, 7206) }, + Declaration { id: DeclarationId(260), name: Some("union_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("union".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 7207, 7263) }, + Declaration { id: DeclarationId(261), name: Some("values_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("values".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 7264, 7322) }, + Declaration { id: DeclarationId(262), name: Some("with_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("with".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 7323, 7377) }, + Declaration { id: DeclarationId(263), name: Some("zero_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("zero".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 7378, 7432) }, + Declaration { id: DeclarationId(264), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/logic.dag", 304, 308) }, + Declaration { id: DeclarationId(265), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/logic.dag", 311, 316) }, + Declaration { id: DeclarationId(266), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(4) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1023, 1032) }, + Declaration { id: DeclarationId(267), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(4) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1136, 1145) }, + Declaration { id: DeclarationId(268), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(6) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1272, 1282) }, + Declaration { id: DeclarationId(269), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(6) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1306, 1316) }, + Declaration { id: DeclarationId(270), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(6) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1340, 1350) }, + Declaration { id: DeclarationId(271), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(6) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1375, 1385) }, + Declaration { id: DeclarationId(272), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "value".to_string(), ty: DeclarationId(12) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/error_primitives.dag", 620, 636) }, + Declaration { id: DeclarationId(273), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "value".to_string(), ty: DeclarationId(13) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/error_primitives.dag", 639, 657) }, + Declaration { id: DeclarationId(274), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/error_primitives.dag", 936, 948) }, + Declaration { id: DeclarationId(275), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/error_primitives.dag", 951, 959) }, + Declaration { id: DeclarationId(276), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(52) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 18855, 18881) }, + Declaration { id: DeclarationId(277), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(52) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 20062, 20088) }, + Declaration { id: DeclarationId(278), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(52) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 21219, 21245) }, + Declaration { id: DeclarationId(279), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(52) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 22345, 22371) }, + Declaration { id: DeclarationId(280), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(52) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 25756, 25782) }, + Declaration { id: DeclarationId(281), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(52) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 28893, 28919) }, + Declaration { id: DeclarationId(282), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(52) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 34025, 34051) }, + Declaration { id: DeclarationId(283), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(52) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 36939, 36965) }, + Declaration { id: DeclarationId(284), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 37758, 37770) }, + Declaration { id: DeclarationId(285), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(16), DeclarationId(16)], output: DeclarationId(16), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 4645, 4658) }, + Declaration { id: DeclarationId(286), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(18), DeclarationId(18)], output: DeclarationId(18), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 4764, 4777) }, + Declaration { id: DeclarationId(287), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(20), DeclarationId(20)], output: DeclarationId(20), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 4981, 4994) }, + Declaration { id: DeclarationId(288), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(22), DeclarationId(22)], output: DeclarationId(22), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5103, 5116) }, + Declaration { id: DeclarationId(289), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(24), DeclarationId(24)], output: DeclarationId(24), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5254, 5267) }, + Declaration { id: DeclarationId(290), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(24)], output: DeclarationId(24), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5293, 5303) }, + Declaration { id: DeclarationId(291), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(26), DeclarationId(26)], output: DeclarationId(26), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5372, 5385) }, + Declaration { id: DeclarationId(292), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(26)], output: DeclarationId(26), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5411, 5421) }, + Declaration { id: DeclarationId(293), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(28), DeclarationId(28)], output: DeclarationId(28), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5911, 5924) }, + Declaration { id: DeclarationId(294), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(28), DeclarationId(28)], output: DeclarationId(28), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5942, 5955) }, + Declaration { id: DeclarationId(295), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(30), DeclarationId(30)], output: DeclarationId(30), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6115, 6128) }, + Declaration { id: DeclarationId(296), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(30)], output: DeclarationId(30), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6149, 6159) }, + Declaration { id: DeclarationId(297), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(30), DeclarationId(30)], output: DeclarationId(30), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6167, 6180) }, + Declaration { id: DeclarationId(298), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(32), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6981, 6994) }, + Declaration { id: DeclarationId(299), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(32), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7002, 7015) }, + Declaration { id: DeclarationId(300), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32)], output: DeclarationId(32), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7036, 7046) }, + Declaration { id: DeclarationId(301), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(32), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7054, 7067) }, + Declaration { id: DeclarationId(302), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(11), arguments: vec![TemplateArgument { parameter: DeclarationId(12), value: DeclarationId(32) }, TemplateArgument { parameter: DeclarationId(13), value: DeclarationId(14) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7087, 7106) }, + Declaration { id: DeclarationId(303), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(302), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7075, 7106) }, + Declaration { id: DeclarationId(304), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(46), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7127, 7147) }, + Declaration { id: DeclarationId(305), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7154, 7170) }, + Declaration { id: DeclarationId(306), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7177, 7193) }, + Declaration { id: DeclarationId(307), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7200, 7216) }, + Declaration { id: DeclarationId(308), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7223, 7239) }, + Declaration { id: DeclarationId(309), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7246, 7262) }, + Declaration { id: DeclarationId(310), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7269, 7285) }, + Declaration { id: DeclarationId(311), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(34), DeclarationId(34)], output: DeclarationId(34), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7448, 7461) }, + Declaration { id: DeclarationId(312), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(34)], output: DeclarationId(34), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7482, 7492) }, + Declaration { id: DeclarationId(313), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(34), DeclarationId(34)], output: DeclarationId(34), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7500, 7513) }, + Declaration { id: DeclarationId(314), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(34)], output: DeclarationId(34), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7537, 7547) }, + Declaration { id: DeclarationId(315), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(34), DeclarationId(34)], output: DeclarationId(46), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7559, 7579) }, + Declaration { id: DeclarationId(316), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(36), DeclarationId(36)], output: DeclarationId(36), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7927, 7940) }, + Declaration { id: DeclarationId(317), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(36), DeclarationId(36)], output: DeclarationId(36), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7949, 7962) }, + Declaration { id: DeclarationId(318), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(38), DeclarationId(38)], output: DeclarationId(38), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 8105, 8118) }, + Declaration { id: DeclarationId(319), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(38), DeclarationId(38)], output: DeclarationId(38), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 8127, 8140) }, + Declaration { id: DeclarationId(320), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(40), DeclarationId(40)], output: DeclarationId(40), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 8394, 8407) }, + Declaration { id: DeclarationId(321), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(40), DeclarationId(40)], output: DeclarationId(40), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 8416, 8429) }, + Declaration { id: DeclarationId(322), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(40)], output: DeclarationId(40), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 8444, 8454) }, + Declaration { id: DeclarationId(323), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12406, 12419) }, + Declaration { id: DeclarationId(324), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12421, 12434) }, + Declaration { id: DeclarationId(325), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12439, 12452) }, + Declaration { id: DeclarationId(326), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(323), DeclarationId(324)], output: DeclarationId(325), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12403, 12452) }, + Declaration { id: DeclarationId(327), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12462, 12475) }, + Declaration { id: DeclarationId(328), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12495, 12508) }, + Declaration { id: DeclarationId(329), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42)], output: DeclarationId(328), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12486, 12508) }, + Declaration { id: DeclarationId(330), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12610, 12623) }, + Declaration { id: DeclarationId(331), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71), DeclarationId(71)], output: DeclarationId(330), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12594, 12623) }, + Declaration { id: DeclarationId(332), name: None, connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(71), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12634, 12645) }, + Declaration { id: DeclarationId(333), name: None, connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(71), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12655, 12666) }, + Declaration { id: DeclarationId(334), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(42), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12684, 12686) }, + Declaration { id: DeclarationId(335), name: None, connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(334), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12676, 12686) }, + Declaration { id: DeclarationId(336), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(42), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12703, 12705) }, + Declaration { id: DeclarationId(337), name: None, connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(336), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12695, 12705) }, + Declaration { id: DeclarationId(338), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42)], output: DeclarationId(42), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12803, 12813) }, + Declaration { id: DeclarationId(339), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12818, 12831) }, + Declaration { id: DeclarationId(340), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(338)], output: DeclarationId(339), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12800, 12831) }, + Declaration { id: DeclarationId(341), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12845, 12858) }, + Declaration { id: DeclarationId(342), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12863, 12876) }, + Declaration { id: DeclarationId(343), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(341)], output: DeclarationId(342), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12842, 12876) }, + Declaration { id: DeclarationId(344), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42), DeclarationId(42)], output: DeclarationId(42), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12891, 12904) }, + Declaration { id: DeclarationId(345), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42), DeclarationId(344)], output: DeclarationId(42), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12885, 12910) }, + Declaration { id: DeclarationId(346), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12935, 12948) }, + Declaration { id: DeclarationId(347), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42)], output: DeclarationId(346), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12926, 12948) }, + Declaration { id: DeclarationId(348), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12953, 12966) }, + Declaration { id: DeclarationId(349), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(347)], output: DeclarationId(348), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12923, 12966) }, + Declaration { id: DeclarationId(350), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12977, 12990) }, + Declaration { id: DeclarationId(351), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(350)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12974, 12999) }, + Declaration { id: DeclarationId(352), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13010, 13023) }, + Declaration { id: DeclarationId(353), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(352)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13007, 13032) }, + Declaration { id: DeclarationId(354), name: None, connective: TypeConnective::Atom(AtomPayload::UnresolvedIdentifier("Tuple".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13097, 13110) }, + Declaration { id: DeclarationId(355), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(354), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13097, 13110) }, + Declaration { id: DeclarationId(356), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(355) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13086, 13111) }, + Declaration { id: DeclarationId(357), name: None, connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(356), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13078, 13111) }, + Declaration { id: DeclarationId(358), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13131, 13144) }, + Declaration { id: DeclarationId(359), name: None, connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(358), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13123, 13144) }, + Declaration { id: DeclarationId(360), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13164, 13177) }, + Declaration { id: DeclarationId(361), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71)], output: DeclarationId(360), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13153, 13177) }, + Declaration { id: DeclarationId(362), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13197, 13210) }, + Declaration { id: DeclarationId(363), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71)], output: DeclarationId(362), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13186, 13210) }, + Declaration { id: DeclarationId(364), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42), DeclarationId(42)], output: DeclarationId(71), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13225, 13240) }, + Declaration { id: DeclarationId(365), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13245, 13258) }, + Declaration { id: DeclarationId(366), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(364)], output: DeclarationId(365), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13222, 13258) }, + Declaration { id: DeclarationId(367), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13271, 13284) }, + Declaration { id: DeclarationId(368), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(45), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13849, 13851) }, + Declaration { id: DeclarationId(369), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(44)], output: DeclarationId(368), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13840, 13851) }, + Declaration { id: DeclarationId(370), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(43), arguments: vec![TemplateArgument { parameter: DeclarationId(44), value: DeclarationId(44) }, TemplateArgument { parameter: DeclarationId(45), value: DeclarationId(45) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13861, 13882) }, + Declaration { id: DeclarationId(371), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(45), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13899, 13901) }, + Declaration { id: DeclarationId(372), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(44)], output: DeclarationId(371), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13890, 13901) }, + Declaration { id: DeclarationId(373), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(43), arguments: vec![TemplateArgument { parameter: DeclarationId(44), value: DeclarationId(44) }, TemplateArgument { parameter: DeclarationId(45), value: DeclarationId(45) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13924, 13945) }, + Declaration { id: DeclarationId(374), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(44), DeclarationId(45)], output: DeclarationId(373), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13912, 13945) }, + Declaration { id: DeclarationId(375), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(43), arguments: vec![TemplateArgument { parameter: DeclarationId(44), value: DeclarationId(44) }, TemplateArgument { parameter: DeclarationId(45), value: DeclarationId(45) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13958, 13979) }, + Declaration { id: DeclarationId(376), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(43), arguments: vec![TemplateArgument { parameter: DeclarationId(44), value: DeclarationId(44) }, TemplateArgument { parameter: DeclarationId(45), value: DeclarationId(45) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13984, 14005) }, + Declaration { id: DeclarationId(377), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(375)], output: DeclarationId(376), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13955, 14005) }, + Declaration { id: DeclarationId(378), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(44) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 14022, 14035) }, + Declaration { id: DeclarationId(379), name: None, connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(378), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 14014, 14035) }, + Declaration { id: DeclarationId(380), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(45) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 14054, 14067) }, + Declaration { id: DeclarationId(381), name: None, connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(380), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 14046, 14067) }, + Declaration { id: DeclarationId(382), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(44)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 14075, 14088) }, + Declaration { id: DeclarationId(383), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(44)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 14105, 14118) }, + Declaration { id: DeclarationId(384), name: None, connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(71), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 14127, 14138) }, + Declaration { id: DeclarationId(385), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 14357, 14361) }, + Declaration { id: DeclarationId(386), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 14364, 14369) }, + Declaration { id: DeclarationId(387), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 14372, 14379) }, + Declaration { id: DeclarationId(388), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16305, 16323) }, + Declaration { id: DeclarationId(389), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16328, 16351) }, + Declaration { id: DeclarationId(390), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16356, 16377) }, + Declaration { id: DeclarationId(391), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16382, 16413) }, + Declaration { id: DeclarationId(392), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16418, 16441) }, + Declaration { id: DeclarationId(393), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16446, 16473) }, + Declaration { id: DeclarationId(394), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16478, 16500) }, + Declaration { id: DeclarationId(395), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16527, 16541) }, + Declaration { id: DeclarationId(396), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16546, 16568) }, + Declaration { id: DeclarationId(397), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16599, 16611) }, + Declaration { id: DeclarationId(398), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16616, 16631) }, + Declaration { id: DeclarationId(399), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16636, 16647) }, + Declaration { id: DeclarationId(400), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16652, 16665) }, + Declaration { id: DeclarationId(401), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16670, 16700) }, + Declaration { id: DeclarationId(402), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "source".to_string(), ty: DeclarationId(48) }, Field { label: "element".to_string(), ty: DeclarationId(49) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16705, 16774) }, + Declaration { id: DeclarationId(403), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "inner".to_string(), ty: DeclarationId(49) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16779, 16820) }, + Declaration { id: DeclarationId(404), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "first".to_string(), ty: DeclarationId(49) }, Field { label: "second".to_string(), ty: DeclarationId(49) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16825, 16892) }, + Declaration { id: DeclarationId(405), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(49) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16918, 16943) }, + Declaration { id: DeclarationId(406), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "params".to_string(), ty: DeclarationId(405) }, Field { label: "return_type".to_string(), ty: DeclarationId(49) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16897, 16979) }, + Declaration { id: DeclarationId(407), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "id".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16984, 17018) }, + Declaration { id: DeclarationId(408), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 17264, 17276) }, + Declaration { id: DeclarationId(409), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 17334, 17350) }, + Declaration { id: DeclarationId(410), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 17397, 17411) }, + Declaration { id: DeclarationId(411), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 17888, 17901) }, + Declaration { id: DeclarationId(412), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 17917, 17932) }, + Declaration { id: DeclarationId(413), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 17978, 17994) }, + Declaration { id: DeclarationId(414), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 18041, 18054) }, + Declaration { id: DeclarationId(415), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(49) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 18137, 18162) }, + Declaration { id: DeclarationId(416), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(50), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 18213, 18234) }, + Declaration { id: DeclarationId(417), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(51), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 18249, 18259) }, + Declaration { id: DeclarationId(418), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 18504, 18508) }, + Declaration { id: DeclarationId(419), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(47) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 18541, 18568) }, + Declaration { id: DeclarationId(420), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 3781, 3785) }, + Declaration { id: DeclarationId(421), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 4054, 4066) }, + Declaration { id: DeclarationId(422), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 4264, 4271) }, + Declaration { id: DeclarationId(423), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 6172, 6179) }, + Declaration { id: DeclarationId(424), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 6508, 6520) }, + Declaration { id: DeclarationId(425), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 7558, 7562) }, + Declaration { id: DeclarationId(426), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 7565, 7570) }, + Declaration { id: DeclarationId(427), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(116) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11304, 11321) }, + Declaration { id: DeclarationId(428), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(117) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11355, 11372) }, + Declaration { id: DeclarationId(429), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14380, 14385) }, + Declaration { id: DeclarationId(430), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14388, 14393) }, + Declaration { id: DeclarationId(431), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14396, 14403) }, + Declaration { id: DeclarationId(432), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14555, 14559) }, + Declaration { id: DeclarationId(433), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14562, 14571) }, + Declaration { id: DeclarationId(434), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14574, 14580) }, + Declaration { id: DeclarationId(435), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14583, 14586) }, + Declaration { id: DeclarationId(436), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14611, 14619) }, + Declaration { id: DeclarationId(437), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14622, 14631) }, + Declaration { id: DeclarationId(438), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14634, 14640) }, + Declaration { id: DeclarationId(439), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14660, 14662) }, + Declaration { id: DeclarationId(440), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14665, 14666) }, + Declaration { id: DeclarationId(441), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14669, 14670) }, + Declaration { id: DeclarationId(442), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14673, 14674) }, + Declaration { id: DeclarationId(443), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14677, 14679) }, + Declaration { id: DeclarationId(444), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "secret_name".to_string(), ty: DeclarationId(111) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14951, 14986) }, + Declaration { id: DeclarationId(445), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "env_var".to_string(), ty: DeclarationId(111) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14991, 15032) }, + Declaration { id: DeclarationId(446), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(138), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15107, 15127) }, + Declaration { id: DeclarationId(447), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15142, 15154) }, + Declaration { id: DeclarationId(448), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "audience".to_string(), ty: DeclarationId(111) }, Field { label: "service_account".to_string(), ty: DeclarationId(446) }, Field { label: "scopes".to_string(), ty: DeclarationId(447) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15037, 15160) }, + Declaration { id: DeclarationId(449), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15191, 15203) }, + Declaration { id: DeclarationId(450), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "scopes".to_string(), ty: DeclarationId(449) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15165, 15205) }, + Declaration { id: DeclarationId(451), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(143) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15227, 15247) }, + Declaration { id: DeclarationId(452), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "steps".to_string(), ty: DeclarationId(451) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15210, 15249) }, + Declaration { id: DeclarationId(453), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15336, 15342) }, + Declaration { id: DeclarationId(454), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15345, 15348) }, + Declaration { id: DeclarationId(455), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15351, 15358) }, + Declaration { id: DeclarationId(456), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15361, 15364) }, + Declaration { id: DeclarationId(457), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15367, 15372) }, + Declaration { id: DeclarationId(458), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15375, 15379) }, + Declaration { id: DeclarationId(459), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15382, 15388) }, + Declaration { id: DeclarationId(460), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15391, 15397) }, + Declaration { id: DeclarationId(461), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15400, 15408) }, + Declaration { id: DeclarationId(462), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15411, 15418) }, + Declaration { id: DeclarationId(463), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15421, 15427) }, + Declaration { id: DeclarationId(464), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15442, 15455) }, + Declaration { id: DeclarationId(465), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15458, 15460) }, + Declaration { id: DeclarationId(466), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15463, 15468) }, + Declaration { id: DeclarationId(467), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15471, 15474) }, + Declaration { id: DeclarationId(468), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15485, 15490) }, + Declaration { id: DeclarationId(469), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15493, 15498) }, + Declaration { id: DeclarationId(470), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15501, 15508) }, + Declaration { id: DeclarationId(471), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15511, 15518) }, + Declaration { id: DeclarationId(472), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15521, 15528) }, + Declaration { id: DeclarationId(473), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15531, 15534) }, + Declaration { id: DeclarationId(474), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15537, 15541) }, + Declaration { id: DeclarationId(475), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15556, 15563) }, + Declaration { id: DeclarationId(476), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15566, 15569) }, + Declaration { id: DeclarationId(477), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15572, 15579) }, + Declaration { id: DeclarationId(478), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15582, 15591) }, + Declaration { id: DeclarationId(479), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15594, 15598) }, + Declaration { id: DeclarationId(480), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15601, 15605) }, + Declaration { id: DeclarationId(481), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15608, 15618) }, + Declaration { id: DeclarationId(482), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15621, 15625) }, + Declaration { id: DeclarationId(483), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15628, 15634) }, + Declaration { id: DeclarationId(484), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15655, 15661) }, + Declaration { id: DeclarationId(485), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15664, 15667) }, + Declaration { id: DeclarationId(486), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15670, 15679) }, + Declaration { id: DeclarationId(487), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15682, 15684) }, + Declaration { id: DeclarationId(488), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15687, 15695) }, + Declaration { id: DeclarationId(489), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(147), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15763, 15770) }, + Declaration { id: DeclarationId(490), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16167, 16178) }, + Declaration { id: DeclarationId(491), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16183, 16192) }, + Declaration { id: DeclarationId(492), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16197, 16204) }, + Declaration { id: DeclarationId(493), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16209, 16216) }, + Declaration { id: DeclarationId(494), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16221, 16226) }, + Declaration { id: DeclarationId(495), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16379, 16389) }, + Declaration { id: DeclarationId(496), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16394, 16403) }, + Declaration { id: DeclarationId(497), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16408, 16414) }, + Declaration { id: DeclarationId(498), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 18464, 18467) }, + Declaration { id: DeclarationId(499), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 18470, 18474) }, + Declaration { id: DeclarationId(500), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 18477, 18480) }, + Declaration { id: DeclarationId(501), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 18483, 18488) }, + Declaration { id: DeclarationId(502), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 18491, 18497) }, + Declaration { id: DeclarationId(503), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 18500, 18504) }, + Declaration { id: DeclarationId(504), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 18507, 18514) }, + Declaration { id: DeclarationId(505), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19002, 19008) }, + Declaration { id: DeclarationId(506), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19013, 19036) }, + Declaration { id: DeclarationId(507), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "username".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19041, 19067) }, + Declaration { id: DeclarationId(508), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19072, 19078) }, + Declaration { id: DeclarationId(509), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(122), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19270, 19280) }, + Declaration { id: DeclarationId(510), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19405, 19412) }, + Declaration { id: DeclarationId(511), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19452, 19464) }, + Declaration { id: DeclarationId(512), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19479, 19483) }, + Declaration { id: DeclarationId(513), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(171) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 20834, 20852) }, + Declaration { id: DeclarationId(514), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(172) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 20945, 20966) }, + Declaration { id: DeclarationId(515), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21250, 21257) }, + Declaration { id: DeclarationId(516), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(176) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21290, 21305) }, + Declaration { id: DeclarationId(517), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(179) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21594, 21612) }, + Declaration { id: DeclarationId(518), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(180) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21622, 21640) }, + Declaration { id: DeclarationId(519), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21662, 21674) }, + Declaration { id: DeclarationId(520), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21762, 21769) }, + Declaration { id: DeclarationId(521), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21856, 21863) }, + Declaration { id: DeclarationId(522), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21891, 21903) }, + Declaration { id: DeclarationId(523), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21915, 21927) }, + Declaration { id: DeclarationId(524), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21939, 21951) }, + Declaration { id: DeclarationId(525), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(183), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22086, 22101) }, + Declaration { id: DeclarationId(526), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(149), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22112, 22125) }, + Declaration { id: DeclarationId(527), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(148), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22141, 22154) }, + Declaration { id: DeclarationId(528), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22180, 22184) }, + Declaration { id: DeclarationId(529), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22187, 22189) }, + Declaration { id: DeclarationId(530), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22192, 22193) }, + Declaration { id: DeclarationId(531), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22196, 22200) }, + Declaration { id: DeclarationId(532), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22264, 22271) }, + Declaration { id: DeclarationId(533), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 3063, 3080) }, + Declaration { id: DeclarationId(534), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 3533, 3549) }, + Declaration { id: DeclarationId(535), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 4740, 4757) }, + Declaration { id: DeclarationId(536), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 5722, 5741) }, + Declaration { id: DeclarationId(537), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10147, 10207) }, + Declaration { id: DeclarationId(538), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10208, 10268) }, + Declaration { id: DeclarationId(539), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10269, 10320) }, + Declaration { id: DeclarationId(540), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10321, 10376) }, + Declaration { id: DeclarationId(541), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10377, 10442) }, + Declaration { id: DeclarationId(542), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10443, 10498) }, + Declaration { id: DeclarationId(543), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10499, 10544) }, + Declaration { id: DeclarationId(544), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10587, 10629) }, + Declaration { id: DeclarationId(545), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10630, 10684) }, + Declaration { id: DeclarationId(546), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10685, 10748) }, + Declaration { id: DeclarationId(547), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10749, 10794) }, + Declaration { id: DeclarationId(548), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10795, 10840) }, + Declaration { id: DeclarationId(549), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10841, 10886) }, + Declaration { id: DeclarationId(550), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10887, 10933) }, + Declaration { id: DeclarationId(551), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10934, 10980) }, + Declaration { id: DeclarationId(552), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11151, 11210) }, + Declaration { id: DeclarationId(553), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11211, 11270) }, + Declaration { id: DeclarationId(554), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11375, 11418) }, + Declaration { id: DeclarationId(555), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12098, 12196) }, + Declaration { id: DeclarationId(556), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12197, 12241) }, + Declaration { id: DeclarationId(557), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12242, 12286) }, + Declaration { id: DeclarationId(558), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12287, 12354) }, + Declaration { id: DeclarationId(559), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12355, 12417) }, + Declaration { id: DeclarationId(560), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12941, 12996) }, + Declaration { id: DeclarationId(561), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12997, 13051) }, + Declaration { id: DeclarationId(562), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13052, 13105) }, + Declaration { id: DeclarationId(563), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13106, 13163) }, + Declaration { id: DeclarationId(564), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13164, 13221) }, + Declaration { id: DeclarationId(565), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13222, 13277) }, + Declaration { id: DeclarationId(566), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13278, 13334) }, + Declaration { id: DeclarationId(567), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13335, 13391) }, + Declaration { id: DeclarationId(568), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13392, 13450) }, + Declaration { id: DeclarationId(569), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13530, 13572) }, + Declaration { id: DeclarationId(570), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13779, 13864) }, + Declaration { id: DeclarationId(571), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13865, 13974) }, + Declaration { id: DeclarationId(572), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 17397, 17447) }, + Declaration { id: DeclarationId(573), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 17448, 17500) }, + Declaration { id: DeclarationId(574), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 17641, 17702) }, + Declaration { id: DeclarationId(575), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19562, 19626) }, + Declaration { id: DeclarationId(576), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19627, 19684) }, + Declaration { id: DeclarationId(577), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19685, 19741) }, + Declaration { id: DeclarationId(578), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 3679, 3689) }, + Declaration { id: DeclarationId(579), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 3692, 3697) }, + Declaration { id: DeclarationId(580), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 3700, 3710) }, + Declaration { id: DeclarationId(581), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 3713, 3726) }, + Declaration { id: DeclarationId(582), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 4762, 4771) }, + Declaration { id: DeclarationId(583), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 4774, 4780) }, + Declaration { id: DeclarationId(584), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 4783, 4787) }, + Declaration { id: DeclarationId(585), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(191) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 5335, 5353) }, + Declaration { id: DeclarationId(586), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 6155, 6164) }, + Declaration { id: DeclarationId(587), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(191) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 6404, 6422) }, + Declaration { id: DeclarationId(588), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(39), arguments: vec![TemplateArgument { parameter: DeclarationId(40), value: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 7546, 7570) }, + Declaration { id: DeclarationId(589), name: Some("List".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Empty".to_string(), ty: DeclarationId(1419) }, Field { label: "Cons".to_string(), ty: DeclarationId(1421) }] }, type_params: vec![DeclarationId(590)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 2083, 2159) }, + Declaration { id: DeclarationId(590), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("element".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 2083, 2159) }, + Declaration { id: DeclarationId(591), name: Some("empty".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(1389), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 3273, 3284)) }, type_params: vec![DeclarationId(592)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3236, 3284) }, + Declaration { id: DeclarationId(592), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("element".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3236, 3284) }, + Declaration { id: DeclarationId(593), name: Some("cons".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(594), DeclarationId(1390)], output: DeclarationId(1391), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 3453, 3475)) }, type_params: vec![DeclarationId(594)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3383, 3475) }, + Declaration { id: DeclarationId(594), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("element".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3383, 3475) }, + Declaration { id: DeclarationId(595), name: Some("singleton".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(596)], output: DeclarationId(1392), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 3570, 3590)) }, type_params: vec![DeclarationId(596)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3519, 3590) }, + Declaration { id: DeclarationId(596), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("element".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3519, 3590) }, + Declaration { id: DeclarationId(597), name: Some("fold".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1393), DeclarationId(599), DeclarationId(1394)], output: DeclarationId(599), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 4203, 4307)) }, type_params: vec![DeclarationId(598), DeclarationId(599)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4142, 4307) }, + Declaration { id: DeclarationId(598), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4142, 4307) }, + Declaration { id: DeclarationId(599), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("U".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4142, 4307) }, + Declaration { id: DeclarationId(600), name: Some("fold_right".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1395), DeclarationId(602), DeclarationId(1396)], output: DeclarationId(602), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 4658, 4768)) }, type_params: vec![DeclarationId(601), DeclarationId(602)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4591, 4768) }, + Declaration { id: DeclarationId(601), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4591, 4768) }, + Declaration { id: DeclarationId(602), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("U".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4591, 4768) }, + Declaration { id: DeclarationId(603), name: Some("concat".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1397), DeclarationId(1398)], output: DeclarationId(1399), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 5386, 5414)) }, type_params: vec![DeclarationId(604)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5314, 5414) }, + Declaration { id: DeclarationId(604), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("element".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5314, 5414) }, + Declaration { id: DeclarationId(605), name: Some("map".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1400), DeclarationId(1401)], output: DeclarationId(1402), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 5721, 5778)) }, type_params: vec![DeclarationId(606), DeclarationId(607)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5667, 5778) }, + Declaration { id: DeclarationId(606), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("A".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5667, 5778) }, + Declaration { id: DeclarationId(607), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("B".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5667, 5778) }, + Declaration { id: DeclarationId(608), name: Some("filter".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1403), DeclarationId(1404)], output: DeclarationId(1405), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 5905, 5988)) }, type_params: vec![DeclarationId(609)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5848, 5988) }, + Declaration { id: DeclarationId(609), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5848, 5988) }, + Declaration { id: DeclarationId(610), name: Some("flat_map".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1406), DeclarationId(1408)], output: DeclarationId(1409), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 6171, 6230)) }, type_params: vec![DeclarationId(611), DeclarationId(612)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6106, 6230) }, + Declaration { id: DeclarationId(611), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("A".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6106, 6230) }, + Declaration { id: DeclarationId(612), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("B".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6106, 6230) }, + Declaration { id: DeclarationId(613), name: Some("length".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1410)], output: DeclarationId(71), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 6372, 6409)) }, type_params: vec![DeclarationId(614)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6337, 6409) }, + Declaration { id: DeclarationId(614), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6337, 6409) }, + Declaration { id: DeclarationId(615), name: Some("is_empty".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1411)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 6605, 6671)) }, type_params: vec![DeclarationId(616)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6567, 6671) }, + Declaration { id: DeclarationId(616), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6567, 6671) }, + Declaration { id: DeclarationId(617), name: Some("IndexedElement".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "index".to_string(), ty: DeclarationId(71) }, Field { label: "value".to_string(), ty: DeclarationId(618) }] }, type_params: vec![DeclarationId(618)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6993, 7055) }, + Declaration { id: DeclarationId(618), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("element".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6993, 7055) }, + Declaration { id: DeclarationId(619), name: Some("enumerate".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1412)], output: DeclarationId(1414), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 7238, 7269)) }, type_params: vec![DeclarationId(620)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7180, 7269) }, + Declaration { id: DeclarationId(620), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7180, 7269) }, + Declaration { id: DeclarationId(621), name: Some("enumerate_helper".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1415), DeclarationId(71)], output: DeclarationId(1417), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 7463, 7644)) }, type_params: vec![DeclarationId(622)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7386, 7644) }, + Declaration { id: DeclarationId(622), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7386, 7644) }, + Declaration { id: DeclarationId(623), name: Some("contains".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1418), DeclarationId(624)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 8205, 8332)) }, type_params: vec![DeclarationId(624)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 8156, 8332) }, + Declaration { id: DeclarationId(624), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 8156, 8332) }, + Declaration { id: DeclarationId(625), name: Some("NodeId".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1364, 1375) }, + Declaration { id: DeclarationId(626), name: Some("PortId".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1376, 1387) }, + Declaration { id: DeclarationId(627), name: Some("DeclarationId".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1388, 1406) }, + Declaration { id: DeclarationId(628), name: Some("ClusterId".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1407, 1421) }, + Declaration { id: DeclarationId(629), name: Some("NonEmptyList".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "first".to_string(), ty: DeclarationId(630) }, Field { label: "rest".to_string(), ty: DeclarationId(1422) }] }, type_params: vec![DeclarationId(630)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1423, 1492) }, + Declaration { id: DeclarationId(630), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("element".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1423, 1492) }, + Declaration { id: DeclarationId(631), name: Some("NonSingletonList".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "first".to_string(), ty: DeclarationId(632) }, Field { label: "second".to_string(), ty: DeclarationId(632) }, Field { label: "rest".to_string(), ty: DeclarationId(1423) }] }, type_params: vec![DeclarationId(632)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1494, 1585) }, + Declaration { id: DeclarationId(632), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("element".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1494, 1585) }, + Declaration { id: DeclarationId(633), name: Some("UrlPathToken".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "LiteralToken".to_string(), ty: DeclarationId(1438) }, Field { label: "ParamToken".to_string(), ty: DeclarationId(1439) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 7510, 7595) }, + Declaration { id: DeclarationId(634), name: Some("PathTemplate".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "tokens".to_string(), ty: DeclarationId(1440) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 7597, 7647) }, + Declaration { id: DeclarationId(635), name: Some("PathSegmentTokensResult".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ParsedSegmentTokens".to_string(), ty: DeclarationId(1442) }, Field { label: "MalformedPathSegment".to_string(), ty: DeclarationId(1443) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 8003, 8147) }, + Declaration { id: DeclarationId(636), name: Some("PathTemplateParseResult".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ParsedPathTemplate".to_string(), ty: DeclarationId(1444) }, Field { label: "MalformedPathTemplate".to_string(), ty: DeclarationId(1445) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 8477, 8630) }, + Declaration { id: DeclarationId(637), name: Some("parse_path_template".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(636), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 8695, 10000)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 8632, 10000) }, + Declaration { id: DeclarationId(638), name: Some("parse_segment_tokens".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(635), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 10066, 11705)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 10002, 11705) }, + Declaration { id: DeclarationId(639), name: Some("last_path_param".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(634)], output: DeclarationId(1424), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 11761, 12044)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 11707, 12044) }, + Declaration { id: DeclarationId(640), name: Some("IdempotentShape".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ReadEffect".to_string(), ty: DeclarationId(1446) }, Field { label: "UpsertEffect".to_string(), ty: DeclarationId(1447) }, Field { label: "DeleteEffect".to_string(), ty: DeclarationId(1448) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 14330, 14451) }, + Declaration { id: DeclarationId(641), name: Some("BreakingShape".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "CreateEffect".to_string(), ty: DeclarationId(1449) }, Field { label: "AppendEffect".to_string(), ty: DeclarationId(1450) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 14674, 14749) }, + Declaration { id: DeclarationId(642), name: Some("EffectShape".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "IsIdempotent".to_string(), ty: DeclarationId(1451) }, Field { label: "IsBreaking".to_string(), ty: DeclarationId(1452) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 15150, 15230) }, + Declaration { id: DeclarationId(643), name: Some("CreateCause".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "PostAlways".to_string(), ty: DeclarationId(1453) }, Field { label: "KeylessFallback".to_string(), ty: DeclarationId(1454) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 15722, 15796) }, + Declaration { id: DeclarationId(644), name: Some("KeySource".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "PathParam".to_string(), ty: DeclarationId(1455) }, Field { label: "InputField".to_string(), ty: DeclarationId(1456) }, Field { label: "CompositeKey".to_string(), ty: DeclarationId(1458) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 16482, 16603) }, + Declaration { id: DeclarationId(645), name: Some("IdempotencyEvidence".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "LatticeEffect".to_string(), ty: DeclarationId(1459) }, Field { label: "IdentityEffect".to_string(), ty: DeclarationId(1460) }, Field { label: "NonIdempotent".to_string(), ty: DeclarationId(1461) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 17251, 17349) }, + Declaration { id: DeclarationId(646), name: Some("is_idempotent_effect".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(642)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 17576, 17648)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 17524, 17648) }, + Declaration { id: DeclarationId(647), name: Some("derive_idempotency_evidence".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(642)], output: DeclarationId(645), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 17861, 18381)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 17787, 18381) }, + Declaration { id: DeclarationId(648), name: Some("OperationEffect".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "operation_name".to_string(), ty: DeclarationId(186) }, Field { label: "shape".to_string(), ty: DeclarationId(642) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 19065, 19135) }, + Declaration { id: DeclarationId(649), name: Some("DeriveOpEffectResult".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "DerivedEffect".to_string(), ty: DeclarationId(1462) }, Field { label: "UnknownHttpMethodInput".to_string(), ty: DeclarationId(1463) }, Field { label: "MalformedPathInput".to_string(), ty: DeclarationId(1464) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 19489, 19789) }, + Declaration { id: DeclarationId(650), name: Some("CompositionVerdict".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "IdempotentComposition".to_string(), ty: DeclarationId(1465) }, Field { label: "BrokenBy".to_string(), ty: DeclarationId(1467) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 20510, 20619) }, + Declaration { id: DeclarationId(651), name: Some("operation_is_breaking".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(648)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 20809, 20884)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 20755, 20884) }, + Declaration { id: DeclarationId(652), name: Some("breaker_ref".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71)], output: DeclarationId(1425), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 20944, 20966)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 20886, 20966) }, + Declaration { id: DeclarationId(653), name: Some("indexed_breaker_ref".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1426)], output: DeclarationId(1428), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 21060, 21153)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 20968, 21153) }, + Declaration { id: DeclarationId(654), name: Some("first_breaker_ref".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1429)], output: DeclarationId(1431), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 21240, 21423)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 21155, 21423) }, + Declaration { id: DeclarationId(655), name: Some("compose_effects".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1432)], output: DeclarationId(650), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 22313, 22436)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 22240, 22436) }, + Declaration { id: DeclarationId(656), name: Some("BoolPortRef".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "port".to_string(), ty: DeclarationId(626) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 23637, 23672) }, + Declaration { id: DeclarationId(657), name: Some("BranchArm".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "condition".to_string(), ty: DeclarationId(656) }, Field { label: "body".to_string(), ty: DeclarationId(658) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 23757, 23823) }, + Declaration { id: DeclarationId(658), name: Some("WorkflowEffect".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "LinearEffect".to_string(), ty: DeclarationId(1469) }, Field { label: "BranchEffect".to_string(), ty: DeclarationId(1471) }, Field { label: "LoopEffect".to_string(), ty: DeclarationId(1472) }, Field { label: "ParallelEffect".to_string(), ty: DeclarationId(1474) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 24499, 24727) }, + Declaration { id: DeclarationId(659), name: Some("IdempotencyUnsupportedDetail".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "variant_name".to_string(), ty: DeclarationId(186) }, Field { label: "downstream_stage".to_string(), ty: DeclarationId(186) }, Field { label: "reason".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 25086, 25190) }, + Declaration { id: DeclarationId(660), name: Some("WorkflowIdempotencyReport".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "WorkflowCompositionVerdict".to_string(), ty: DeclarationId(1475) }, Field { label: "IdempotencyUnsupported".to_string(), ty: DeclarationId(1476) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 25329, 25467) }, + Declaration { id: DeclarationId(661), name: Some("report_unsupported_workflow_variant".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(186), DeclarationId(186)], output: DeclarationId(660), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 25609, 25765)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 25469, 25765) }, + Declaration { id: DeclarationId(662), name: Some("ParallelismUnsupportedKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "NoWorkflowProjection".to_string(), ty: DeclarationId(1477) }, Field { label: "NotParallelEffectRoot".to_string(), ty: DeclarationId(1478) }, Field { label: "NonLinearParallelBranch".to_string(), ty: DeclarationId(1479) }, Field { label: "PairwiseNonCommute".to_string(), ty: DeclarationId(1480) }, Field { label: "LensSurfacePending".to_string(), ty: DeclarationId(1481) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 25928, 26084) }, + Declaration { id: DeclarationId(663), name: Some("ParallelismUnsupportedDetail".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "kind".to_string(), ty: DeclarationId(662) }, Field { label: "downstream_stage".to_string(), ty: DeclarationId(186) }, Field { label: "reason".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 26086, 26202) }, + Declaration { id: DeclarationId(664), name: Some("WorkflowParallelismReport".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ParallelCompositionVerdict".to_string(), ty: DeclarationId(1482) }, Field { label: "ParallelismUnsupported".to_string(), ty: DeclarationId(1483) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 26366, 26504) }, + Declaration { id: DeclarationId(665), name: Some("report_parallelism_unsupported".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(662), DeclarationId(186)], output: DeclarationId(664), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 26625, 26780)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 26506, 26780) }, + Declaration { id: DeclarationId(666), name: Some("lane2_workflow_idempotency_report".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(658)], output: DeclarationId(660), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 27018, 27848)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 26932, 27848) }, + Declaration { id: DeclarationId(667), name: Some("parse_http_method".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(1433), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 29707, 30005)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 29658, 30005) }, + Declaration { id: DeclarationId(668), name: Some("keyless_create".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(156)], output: DeclarationId(642), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 30060, 30136)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 30007, 30136) }, + Declaration { id: DeclarationId(669), name: Some("upsert_or_create".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1434), DeclarationId(156)], output: DeclarationId(642), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 30476, 30628)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 30400, 30628) }, + Declaration { id: DeclarationId(670), name: Some("delete_or_create".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1435), DeclarationId(156)], output: DeclarationId(642), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 30706, 30858)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 30630, 30858) }, + Declaration { id: DeclarationId(671), name: Some("derive_effect_shape".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(156), DeclarationId(634)], output: DeclarationId(642), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 30944, 31429)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 30860, 31429) }, + Declaration { id: DeclarationId(672), name: Some("derive_op_effect".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(186), DeclarationId(186)], output: DeclarationId(649), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 31545, 32387)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 31431, 32387) }, + Declaration { id: DeclarationId(673), name: Some("ModifierAgreement".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Agrees".to_string(), ty: DeclarationId(1484) }, Field { label: "Disagrees".to_string(), ty: DeclarationId(1485) }, Field { label: "DerivationUnknown".to_string(), ty: DeclarationId(1486) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 33087, 33204) }, + Declaration { id: DeclarationId(674), name: Some("ModifierAxisCheck".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ModifierNotDeclared".to_string(), ty: DeclarationId(1487) }, Field { label: "ModifierDeclared".to_string(), ty: DeclarationId(1488) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 33651, 33751) }, + Declaration { id: DeclarationId(675), name: Some("ModifierCheck".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "operation_name".to_string(), ty: DeclarationId(186) }, Field { label: "derived_shape".to_string(), ty: DeclarationId(642) }, Field { label: "idempotent_check".to_string(), ty: DeclarationId(674) }, Field { label: "readonly_check".to_string(), ty: DeclarationId(674) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 33753, 33903) }, + Declaration { id: DeclarationId(676), name: Some("classify_idempotent_disagreement".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(641)], output: DeclarationId(673), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 34542, 35084)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 34463, 35084) }, + Declaration { id: DeclarationId(677), name: Some("classify_readonly_agreement".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(642)], output: DeclarationId(673), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 35488, 35930)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 35416, 35930) }, + Declaration { id: DeclarationId(678), name: Some("check_modifier_vs_derivation".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(648), DeclarationId(88), DeclarationId(88)], output: DeclarationId(675), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 36062, 36711)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 35932, 36711) }, + Declaration { id: DeclarationId(679), name: Some("IdempotencyTestObligation".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "operation_name".to_string(), ty: DeclarationId(186) }, Field { label: "effect_shape".to_string(), ty: DeclarationId(642) }, Field { label: "claim".to_string(), ty: DeclarationId(186) }, Field { label: "witness_required".to_string(), ty: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 37063, 37191) }, + Declaration { id: DeclarationId(680), name: Some("generate_idempotency_obligations".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1436)], output: DeclarationId(1437), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 37296, 37566)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 37193, 37566) }, + Declaration { id: DeclarationId(681), name: Some("WorkflowEffectConcern".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "workflow_name".to_string(), ty: DeclarationId(186) }, Field { label: "create_op".to_string(), ty: DeclarationId(186) }, Field { label: "reason".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 37883, 37974) }, + Declaration { id: DeclarationId(682), name: Some("TypeShape".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "declaration".to_string(), ty: DeclarationId(627) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 247, 294) }, + Declaration { id: DeclarationId(683), name: Some("PortState".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Uninferred".to_string(), ty: DeclarationId(1496) }, Field { label: "Resolved".to_string(), ty: DeclarationId(1497) }, Field { label: "Unresolved".to_string(), ty: DeclarationId(1498) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 437, 505) }, + Declaration { id: DeclarationId(684), name: Some("DagPort".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "id".to_string(), ty: DeclarationId(626) }, Field { label: "state".to_string(), ty: DeclarationId(683) }, Field { label: "produced_by".to_string(), ty: DeclarationId(1499) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 507, 578) }, + Declaration { id: DeclarationId(685), name: Some("LiteralBits".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "LitInt".to_string(), ty: DeclarationId(1500) }, Field { label: "LitBool".to_string(), ty: DeclarationId(1501) }, Field { label: "LitString".to_string(), ty: DeclarationId(1502) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 747, 819) }, + Declaration { id: DeclarationId(686), name: Some("AtomPayload".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Literal".to_string(), ty: DeclarationId(1503) }, Field { label: "UnresolvedIdentifier".to_string(), ty: DeclarationId(1504) }, Field { label: "ResolvedByStructure".to_string(), ty: DeclarationId(1505) }, Field { label: "ResolvedByName".to_string(), ty: DeclarationId(1506) }, Field { label: "TypeParam".to_string(), ty: DeclarationId(1507) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 2829, 2998) }, + Declaration { id: DeclarationId(687), name: Some("PositiveIntervalWidth".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "OneUnit".to_string(), ty: DeclarationId(1508) }, Field { label: "AdditionalUnit".to_string(), ty: DeclarationId(1509) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 3571, 3664) }, + Declaration { id: DeclarationId(688), name: Some("IntervalWidth".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ZeroWidth".to_string(), ty: DeclarationId(1510) }, Field { label: "PositiveWidth".to_string(), ty: DeclarationId(1511) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 3666, 3739) }, + Declaration { id: DeclarationId(689), name: Some("Interval".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "BoundedInterval".to_string(), ty: DeclarationId(1512) }, Field { label: "Unbounded".to_string(), ty: DeclarationId(1513) }] }, type_params: vec![DeclarationId(690)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4030, 4115) }, + Declaration { id: DeclarationId(690), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("D".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4030, 4115) }, + Declaration { id: DeclarationId(691), name: Some("CardinalityBound".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Exact".to_string(), ty: DeclarationId(1514) }, Field { label: "AtMostOne".to_string(), ty: DeclarationId(1515) }, Field { label: "Unbounded".to_string(), ty: DeclarationId(1516) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4340, 4404) }, + Declaration { id: DeclarationId(692), name: Some("ConjField".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "label".to_string(), ty: DeclarationId(186) }, Field { label: "ty".to_string(), ty: DeclarationId(627) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4406, 4460) }, + Declaration { id: DeclarationId(693), name: Some("TemplateArgument".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "parameter".to_string(), ty: DeclarationId(627) }, Field { label: "value".to_string(), ty: DeclarationId(627) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4462, 4537) }, + Declaration { id: DeclarationId(694), name: Some("FieldEntry".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "label".to_string(), ty: DeclarationId(186) }, Field { label: "value".to_string(), ty: DeclarationId(695) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4539, 4594) }, + Declaration { id: DeclarationId(695), name: Some("FieldValue".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Literal".to_string(), ty: DeclarationId(1517) }, Field { label: "Reference".to_string(), ty: DeclarationId(1518) }, Field { label: "Record".to_string(), ty: DeclarationId(1520) }, Field { label: "List".to_string(), ty: DeclarationId(1522) }, Field { label: "Map".to_string(), ty: DeclarationId(1524) }, Field { label: "Variant".to_string(), ty: DeclarationId(1526) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4811, 5047) }, + Declaration { id: DeclarationId(696), name: Some("ValueBody".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ValueBodyUnparsed".to_string(), ty: DeclarationId(1527) }, Field { label: "ValueBodyStructural".to_string(), ty: DeclarationId(1529) }, Field { label: "ValueBodyMap".to_string(), ty: DeclarationId(1531) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5187, 5323) }, + Declaration { id: DeclarationId(697), name: Some("ArrowBody".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "UserDefined".to_string(), ty: DeclarationId(1532) }, Field { label: "ExternalRealization".to_string(), ty: DeclarationId(1533) }, Field { label: "Pending".to_string(), ty: DeclarationId(1534) }, Field { label: "NoBody".to_string(), ty: DeclarationId(1535) }, Field { label: "Unparsed".to_string(), ty: DeclarationId(1536) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5639, 5764) }, + Declaration { id: DeclarationId(698), name: Some("TypeConnective".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Atom".to_string(), ty: DeclarationId(1537) }, Field { label: "Conj".to_string(), ty: DeclarationId(1539) }, Field { label: "Disj".to_string(), ty: DeclarationId(1541) }, Field { label: "Arrow".to_string(), ty: DeclarationId(1543) }, Field { label: "Cardinality".to_string(), ty: DeclarationId(1544) }, Field { label: "Instantiation".to_string(), ty: DeclarationId(1546) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5969, 6369) }, + Declaration { id: DeclarationId(699), name: Some("Declaration".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "id".to_string(), ty: DeclarationId(627) }, Field { label: "name".to_string(), ty: DeclarationId(1547) }, Field { label: "connective".to_string(), ty: DeclarationId(698) }, Field { label: "type_params".to_string(), ty: DeclarationId(1548) }, Field { label: "phantom_params".to_string(), ty: DeclarationId(1549) }, Field { label: "meta_tag".to_string(), ty: DeclarationId(1550) }, Field { label: "inhabits".to_string(), ty: DeclarationId(1551) }, Field { label: "value_body".to_string(), ty: DeclarationId(1552) }, Field { label: "nominal_opacity".to_string(), ty: DeclarationId(1553) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6371, 6665) }, + Declaration { id: DeclarationId(700), name: Some("PhantomParameter".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "parameter".to_string(), ty: DeclarationId(627) }, Field { label: "algebra".to_string(), ty: DeclarationId(627) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 7138, 7215) }, + Declaration { id: DeclarationId(701), name: Some("NominalOpacity".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "permitted_accessors".to_string(), ty: DeclarationId(1554) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 7722, 7788) }, + Declaration { id: DeclarationId(702), name: Some("ArithmeticOp".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Add".to_string(), ty: DeclarationId(1555) }, Field { label: "Sub".to_string(), ty: DeclarationId(1556) }, Field { label: "Mul".to_string(), ty: DeclarationId(1557) }, Field { label: "Div".to_string(), ty: DeclarationId(1558) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8045, 8094) }, + Declaration { id: DeclarationId(703), name: Some("ComparisonOp".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Eq".to_string(), ty: DeclarationId(1559) }, Field { label: "Ne".to_string(), ty: DeclarationId(1560) }, Field { label: "Lt".to_string(), ty: DeclarationId(1561) }, Field { label: "Le".to_string(), ty: DeclarationId(1562) }, Field { label: "Gt".to_string(), ty: DeclarationId(1563) }, Field { label: "Ge".to_string(), ty: DeclarationId(1564) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8196, 8255) }, + Declaration { id: DeclarationId(704), name: Some("LogicalOp".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "And".to_string(), ty: DeclarationId(1565) }, Field { label: "Or".to_string(), ty: DeclarationId(1566) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8489, 8518) }, + Declaration { id: DeclarationId(705), name: Some("OperatorKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Arithmetic".to_string(), ty: DeclarationId(1567) }, Field { label: "Comparison".to_string(), ty: DeclarationId(1568) }, Field { label: "Logical".to_string(), ty: DeclarationId(1569) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8732, 8830) }, + Declaration { id: DeclarationId(706), name: Some("TransformTarget".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Callable".to_string(), ty: DeclarationId(1570) }, Field { label: "FieldProject".to_string(), ty: DeclarationId(1572) }, Field { label: "Operator".to_string(), ty: DeclarationId(1573) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8992, 9152) }, + Declaration { id: DeclarationId(707), name: Some("BranchPattern".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "UnresolvedVariant".to_string(), ty: DeclarationId(1574) }, Field { label: "ResolvedVariant".to_string(), ty: DeclarationId(1575) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9254, 9364) }, + Declaration { id: DeclarationId(708), name: Some("PayloadBinding".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "binding_name".to_string(), ty: DeclarationId(186) }, Field { label: "payload_port".to_string(), ty: DeclarationId(626) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9366, 9435) }, + Declaration { id: DeclarationId(709), name: Some("BranchPath".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "body".to_string(), ty: DeclarationId(625) }, Field { label: "result_port".to_string(), ty: DeclarationId(626) }, Field { label: "pattern".to_string(), ty: DeclarationId(707) }, Field { label: "binding".to_string(), ty: DeclarationId(1576) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9437, 9545) }, + Declaration { id: DeclarationId(710), name: Some("ParamRef".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "member".to_string(), ty: DeclarationId(625) }, Field { label: "slot".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 10144, 10190) }, + Declaration { id: DeclarationId(711), name: Some("TransformRef".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "node".to_string(), ty: DeclarationId(625) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 10702, 10738) }, + Declaration { id: DeclarationId(712), name: Some("ElementRef".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "index".to_string(), ty: DeclarationId(71) }] }, type_params: vec![DeclarationId(713)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 11355, 11396) }, + Declaration { id: DeclarationId(713), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("element".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 11355, 11396) }, + Declaration { id: DeclarationId(714), name: Some("MemberDescent".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(710) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 11398, 11438) }, + Declaration { id: DeclarationId(715), name: Some("IntraClusterCall".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "transform".to_string(), ty: DeclarationId(711) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 11440, 11491) }, + Declaration { id: DeclarationId(716), name: Some("Cluster".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "members".to_string(), ty: DeclarationId(1577) }, Field { label: "intra_cluster_calls".to_string(), ty: DeclarationId(1578) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 11493, 11606) }, + Declaration { id: DeclarationId(717), name: Some("LoopBound".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Cardinality".to_string(), ty: DeclarationId(1579) }, Field { label: "Descent".to_string(), ty: DeclarationId(1580) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12011, 12094) }, + Declaration { id: DeclarationId(718), name: Some("ValueNode".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "id".to_string(), ty: DeclarationId(625) }, Field { label: "payload".to_string(), ty: DeclarationId(685) }, Field { label: "result_port".to_string(), ty: DeclarationId(626) }, Field { label: "span".to_string(), ty: DeclarationId(121) }, Field { label: "lane2_workflow".to_string(), ty: DeclarationId(1581) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12096, 12225) }, + Declaration { id: DeclarationId(719), name: Some("TransformNode".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "id".to_string(), ty: DeclarationId(625) }, Field { label: "target".to_string(), ty: DeclarationId(706) }, Field { label: "inputs".to_string(), ty: DeclarationId(1582) }, Field { label: "result_port".to_string(), ty: DeclarationId(626) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12227, 12352) }, + Declaration { id: DeclarationId(720), name: Some("BranchEmitParticipation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1583), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12517, 12559) }, + Declaration { id: DeclarationId(721), name: Some("BranchNode".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "id".to_string(), ty: DeclarationId(625) }, Field { label: "input".to_string(), ty: DeclarationId(626) }, Field { label: "paths".to_string(), ty: DeclarationId(1584) }, Field { label: "result_port".to_string(), ty: DeclarationId(626) }, Field { label: "span".to_string(), ty: DeclarationId(121) }, Field { label: "emit_participation".to_string(), ty: DeclarationId(1585) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12561, 12723) }, + Declaration { id: DeclarationId(722), name: Some("LoopNode".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "id".to_string(), ty: DeclarationId(625) }, Field { label: "source".to_string(), ty: DeclarationId(626) }, Field { label: "init".to_string(), ty: DeclarationId(626) }, Field { label: "body".to_string(), ty: DeclarationId(625) }, Field { label: "bound".to_string(), ty: DeclarationId(717) }, Field { label: "result_port".to_string(), ty: DeclarationId(626) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12725, 12862) }, + Declaration { id: DeclarationId(723), name: Some("BindEmitParticipation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1586), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13104, 13147) }, + Declaration { id: DeclarationId(724), name: Some("BindNode".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "id".to_string(), ty: DeclarationId(625) }, Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "result_port".to_string(), ty: DeclarationId(626) }, Field { label: "params".to_string(), ty: DeclarationId(1587) }, Field { label: "span".to_string(), ty: DeclarationId(121) }, Field { label: "lane2_workflow".to_string(), ty: DeclarationId(1588) }, Field { label: "emit_participation".to_string(), ty: DeclarationId(1589) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13149, 13337) }, + Declaration { id: DeclarationId(725), name: Some("Behavior".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Value".to_string(), ty: DeclarationId(1590) }, Field { label: "Transform".to_string(), ty: DeclarationId(1591) }, Field { label: "Branch".to_string(), ty: DeclarationId(1592) }, Field { label: "Loop".to_string(), ty: DeclarationId(1593) }, Field { label: "Bind".to_string(), ty: DeclarationId(1594) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13409, 13533) }, + Declaration { id: DeclarationId(726), name: Some("Dag".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "declarations".to_string(), ty: DeclarationId(1595) }, Field { label: "nodes".to_string(), ty: DeclarationId(1596) }, Field { label: "ports".to_string(), ty: DeclarationId(1597) }, Field { label: "clusters".to_string(), ty: DeclarationId(1598) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13535, 13654) }, + Declaration { id: DeclarationId(727), name: Some("SubstrateAccessorRealization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "carrier".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 15006, 15061) }, + Declaration { id: DeclarationId(728), name: Some("SubstrateAccessorBinding".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "accessor".to_string(), ty: DeclarationId(1016) }, Field { label: "realization".to_string(), ty: DeclarationId(1016) }, Field { label: "language".to_string(), ty: DeclarationId(1016) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 15828, 15945) }, + Declaration { id: DeclarationId(729), name: Some("port".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(726), DeclarationId(626)], output: DeclarationId(1489), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/substrate.dag", 15987, 16002)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 15947, 16002) }, + Declaration { id: DeclarationId(730), name: Some("node".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(726), DeclarationId(625)], output: DeclarationId(1490), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/substrate.dag", 16045, 16060)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 16004, 16060) }, + Declaration { id: DeclarationId(731), name: Some("resolve_producer".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(726), DeclarationId(626)], output: DeclarationId(1491), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/substrate.dag", 16120, 16147)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 16062, 16147) }, + Declaration { id: DeclarationId(732), name: Some("declaration_by_id".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(726), DeclarationId(627)], output: DeclarationId(1492), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/substrate.dag", 16509, 16537)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 16445, 16537) }, + Declaration { id: DeclarationId(733), name: Some("lane2_workflow_at".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(726), DeclarationId(625)], output: DeclarationId(1493), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/substrate.dag", 16833, 16868)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 16773, 16868) }, + Declaration { id: DeclarationId(734), name: Some("miss_declaration_id_lookup".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(1494), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/substrate.dag", 17225, 17235)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 17168, 17235) }, + Declaration { id: DeclarationId(735), name: Some("hit_declaration_id_lookup".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(627)], output: DeclarationId(1495), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/substrate.dag", 17310, 17323)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 17237, 17323) }, + Declaration { id: DeclarationId(736), name: Some("MethodRef".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "decl".to_string(), ty: DeclarationId(1016) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/methods.dag", 1474, 1515) }, + Declaration { id: DeclarationId(737), name: Some("CollectionSizeEffect".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ShrinkEffect".to_string(), ty: DeclarationId(1618) }, Field { label: "ProjectionEffect".to_string(), ty: DeclarationId(1619) }, Field { label: "IdentityEffect".to_string(), ty: DeclarationId(1620) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 4775, 4857) }, + Declaration { id: DeclarationId(738), name: Some("CostShape".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ShapeConstant".to_string(), ty: DeclarationId(1621) }, Field { label: "ShapeLinearScan".to_string(), ty: DeclarationId(1622) }, Field { label: "ShapeIterateBody".to_string(), ty: DeclarationId(1623) }, Field { label: "ShapeSortBody".to_string(), ty: DeclarationId(1624) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 5688, 5779) }, + Declaration { id: DeclarationId(739), name: Some("MethodContract".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "algebra_id".to_string(), ty: DeclarationId(627) }, Field { label: "method_id".to_string(), ty: DeclarationId(627) }, Field { label: "size_effect".to_string(), ty: DeclarationId(1625) }, Field { label: "cost_shape".to_string(), ty: DeclarationId(1626) }, Field { label: "callback_element_position".to_string(), ty: DeclarationId(1627) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 6540, 6714) }, + Declaration { id: DeclarationId(740), name: Some("SizeVariable".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "source_port".to_string(), ty: DeclarationId(626) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 7365, 7408) }, + Declaration { id: DeclarationId(741), name: Some("DegreeAtLeastTwo".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "DegreeTwo".to_string(), ty: DeclarationId(1628) }, Field { label: "DegreeSuccessor".to_string(), ty: DeclarationId(1629) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8155, 8241) }, + Declaration { id: DeclarationId(742), name: Some("SymbolicCost".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ConstantCost".to_string(), ty: DeclarationId(1630) }, Field { label: "LinearCost".to_string(), ty: DeclarationId(1631) }, Field { label: "PolynomialCost".to_string(), ty: DeclarationId(1632) }, Field { label: "ProductCost".to_string(), ty: DeclarationId(1634) }, Field { label: "SumCost".to_string(), ty: DeclarationId(1636) }, Field { label: "LogCost".to_string(), ty: DeclarationId(1637) }, Field { label: "UnknownCost".to_string(), ty: DeclarationId(1638) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8391, 8668) }, + Declaration { id: DeclarationId(743), name: Some("DominateScanAcc".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "any".to_string(), ty: DeclarationId(88) }, Field { label: "pivot".to_string(), ty: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 9074, 9132) }, + Declaration { id: DeclarationId(744), name: Some("dominate_scan_init".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(742)], output: DeclarationId(743), body: ArrowBody::UserDefined(NodeId(2)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 9134, 9229) }, + Declaration { id: DeclarationId(745), name: Some("miss_symbolic_cost_lookup".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(1599), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/algebra.dag", 9870, 9880)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 9815, 9880) }, + Declaration { id: DeclarationId(746), name: Some("hit_symbolic_cost_lookup".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(742)], output: DeclarationId(1600), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/algebra.dag", 9954, 9969)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 9882, 9969) }, + Declaration { id: DeclarationId(747), name: Some("two_terms".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(742), DeclarationId(742)], output: DeclarationId(1601), body: ArrowBody::UserDefined(NodeId(6)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 9971, 10446) }, + Declaration { id: DeclarationId(748), name: Some("many_terms".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(742), DeclarationId(742), DeclarationId(1602)], output: DeclarationId(1603), body: ArrowBody::UserDefined(NodeId(8)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 10448, 10633) }, + Declaration { id: DeclarationId(749), name: Some("reject_all_symbolic_costs".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(742)], output: DeclarationId(88), body: ArrowBody::UserDefined(NodeId(13)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 10635, 10763) }, + Declaration { id: DeclarationId(750), name: Some("degree_raw".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(741)], output: DeclarationId(71), body: ArrowBody::UserDefined(NodeId(21)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 10765, 10918) }, + Declaration { id: DeclarationId(751), name: Some("sequential".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(742), DeclarationId(742)], output: DeclarationId(742), body: ArrowBody::UserDefined(NodeId(25)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 11154, 11257) }, + Declaration { id: DeclarationId(752), name: Some("iterate".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(742), DeclarationId(742)], output: DeclarationId(742), body: ArrowBody::UserDefined(NodeId(29)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 11443, 11561) }, + Declaration { id: DeclarationId(753), name: Some("max_path_step".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(742), DeclarationId(742)], output: DeclarationId(742), body: ArrowBody::UserDefined(NodeId(33)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 12421, 12588) }, + Declaration { id: DeclarationId(754), name: Some("keep_or_sum".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(742), DeclarationId(742)], output: DeclarationId(742), body: ArrowBody::UserDefined(NodeId(37)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 12590, 12748) }, + Declaration { id: DeclarationId(755), name: Some("max_path".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1604)], output: DeclarationId(742), body: ArrowBody::UserDefined(NodeId(41)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 13050, 13152) }, + Declaration { id: DeclarationId(756), name: Some("dominates".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(742), DeclarationId(742)], output: DeclarationId(88), body: ArrowBody::UserDefined(NodeId(94)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 14020, 16105) }, + Declaration { id: DeclarationId(757), name: Some("same_size_variable".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(740), DeclarationId(740)], output: DeclarationId(88), body: ArrowBody::UserDefined(NodeId(98)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 16107, 16205) }, + Declaration { id: DeclarationId(758), name: Some("normalize".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(742)], output: DeclarationId(742), body: ArrowBody::UserDefined(NodeId(106)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 16963, 17266) }, + Declaration { id: DeclarationId(759), name: Some("nsl_to_list".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1605)], output: DeclarationId(1606), body: ArrowBody::UserDefined(NodeId(112)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17268, 17397) }, + Declaration { id: DeclarationId(760), name: Some("drop_zero".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1607)], output: DeclarationId(1608), body: ArrowBody::UserDefined(NodeId(125)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17574, 17839) }, + Declaration { id: DeclarationId(761), name: Some("is_zero_constant".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(742)], output: DeclarationId(88), body: ArrowBody::UserDefined(NodeId(135)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17841, 18095) }, + Declaration { id: DeclarationId(762), name: Some("reduce_sum".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1609)], output: DeclarationId(742), body: ArrowBody::UserDefined(NodeId(147)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 18880, 19151) }, + Declaration { id: DeclarationId(763), name: Some("wrap_sum".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1610)], output: DeclarationId(742), body: ArrowBody::UserDefined(NodeId(159)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 19153, 19428) }, + Declaration { id: DeclarationId(764), name: Some("reduce_product".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1611)], output: DeclarationId(742), body: ArrowBody::UserDefined(NodeId(176)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 19613, 20034) }, + Declaration { id: DeclarationId(765), name: Some("combine_binary_product".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(742), DeclarationId(742)], output: DeclarationId(742), body: ArrowBody::UserDefined(NodeId(185)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 20199, 20586) }, + Declaration { id: DeclarationId(766), name: Some("combine_linear_with".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(740), DeclarationId(742), DeclarationId(742)], output: DeclarationId(742), body: ArrowBody::UserDefined(NodeId(194)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 20588, 20997) }, + Declaration { id: DeclarationId(767), name: Some("collapse_linear_square".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(740), DeclarationId(740), DeclarationId(742), DeclarationId(742)], output: DeclarationId(742), body: ArrowBody::UserDefined(NodeId(199)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 20999, 21215) }, + Declaration { id: DeclarationId(768), name: Some("polynomial_square".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(740)], output: DeclarationId(742), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/algebra.dag", 21271, 21321)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21217, 21321) }, + Declaration { id: DeclarationId(769), name: Some("product_pair".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(742), DeclarationId(742)], output: DeclarationId(742), body: ArrowBody::UserDefined(NodeId(202)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21323, 21421) }, + Declaration { id: DeclarationId(770), name: Some("fold_or_dominate_scan".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(743), DeclarationId(742)], output: DeclarationId(743), body: ArrowBody::UserDefined(NodeId(209)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21423, 21572) }, + Declaration { id: DeclarationId(771), name: Some("scan_hit".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(743)], output: DeclarationId(88), body: ArrowBody::UserDefined(NodeId(211)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21574, 21629) }, + Declaration { id: DeclarationId(772), name: Some("filter_not_dominated_by".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1612), DeclarationId(742)], output: DeclarationId(1613), body: ArrowBody::UserDefined(NodeId(224)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21631, 21993) }, + Declaration { id: DeclarationId(773), name: Some("drop_dominated_step".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1614), DeclarationId(742)], output: DeclarationId(1615), body: ArrowBody::UserDefined(NodeId(231)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21995, 22237) }, + Declaration { id: DeclarationId(774), name: Some("drop_dominated".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1616)], output: DeclarationId(1617), body: ArrowBody::UserDefined(NodeId(234)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 22425, 22537) }, + Declaration { id: DeclarationId(775), name: Some("CleanEmissionContract".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "expression_wrapping".to_string(), ty: DeclarationId(777) }, Field { label: "pattern_bindings".to_string(), ty: DeclarationId(778) }, Field { label: "variant_payload_field_access".to_string(), ty: DeclarationId(779) }, Field { label: "imports".to_string(), ty: DeclarationId(780) }, Field { label: "block_return".to_string(), ty: DeclarationId(781) }, Field { label: "variable_bindings".to_string(), ty: DeclarationId(782) }, Field { label: "match_arm_body".to_string(), ty: DeclarationId(783) }, Field { label: "correction_style".to_string(), ty: DeclarationId(784) }, Field { label: "post_emit_verifier".to_string(), ty: DeclarationId(785) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 562, 944) }, + Declaration { id: DeclarationId(776), name: Some("TargetCleanEmissionBinding".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "language".to_string(), ty: DeclarationId(878) }, Field { label: "clean_emission".to_string(), ty: DeclarationId(775) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 1748, 1848) }, + Declaration { id: DeclarationId(777), name: Some("ExpressionWrappingRule".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "WrapEverything".to_string(), ty: DeclarationId(1662) }, Field { label: "WrapOnlyInOperandPosition".to_string(), ty: DeclarationId(1663) }, Field { label: "NoWrapping".to_string(), ty: DeclarationId(1664) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 2192, 2283) }, + Declaration { id: DeclarationId(778), name: Some("PatternBindingRule".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "EmitBindingAlways".to_string(), ty: DeclarationId(1665) }, Field { label: "EmitUnderscoreWhenUnused".to_string(), ty: DeclarationId(1666) }, Field { label: "EmitPrefixedUnderscoreWhenUnused".to_string(), ty: DeclarationId(1667) }, Field { label: "NotApplicablePatternBinding".to_string(), ty: DeclarationId(1668) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 2520, 2663) }, + Declaration { id: DeclarationId(779), name: Some("VariantPayloadFieldAccessRule".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "AccessFromPayloadBinding".to_string(), ty: DeclarationId(1669) }, Field { label: "OverrideNamedFieldsAtBindingSite".to_string(), ty: DeclarationId(1670) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3330, 3430) }, + Declaration { id: DeclarationId(780), name: Some("ImportRule".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ImportEverythingDeclared".to_string(), ty: DeclarationId(1671) }, Field { label: "IncludeOnlyReferenced".to_string(), ty: DeclarationId(1672) }, Field { label: "ImportPerUsageSite".to_string(), ty: DeclarationId(1673) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3544, 3637) }, + Declaration { id: DeclarationId(781), name: Some("BlockReturnRule".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "WrapReturnValue".to_string(), ty: DeclarationId(1674) }, Field { label: "NoWrappingOnTerminalExpression".to_string(), ty: DeclarationId(1675) }, Field { label: "ExplicitReturnKeyword".to_string(), ty: DeclarationId(1676) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3756, 3857) }, + Declaration { id: DeclarationId(782), name: Some("VariableBindingRule".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "EmitLetBindingAlways".to_string(), ty: DeclarationId(1677) }, Field { label: "EmitLetUnderscoreWhenUnused".to_string(), ty: DeclarationId(1678) }, Field { label: "OmitLetBinding".to_string(), ty: DeclarationId(1679) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3995, 4095) }, + Declaration { id: DeclarationId(783), name: Some("MatchArmBodyRule".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "WrapBody".to_string(), ty: DeclarationId(1680) }, Field { label: "NoWrappingOnNonComplexBody".to_string(), ty: DeclarationId(1681) }, Field { label: "NotApplicableMatchArmBody".to_string(), ty: DeclarationId(1682) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 4328, 4423) }, + Declaration { id: DeclarationId(784), name: Some("CorrectionStyle".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "indent_unit".to_string(), ty: DeclarationId(186) }, Field { label: "line_ending".to_string(), ty: DeclarationId(186) }, Field { label: "string_quote".to_string(), ty: DeclarationId(186) }, Field { label: "trailing_semicolon".to_string(), ty: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 4736, 4854) }, + Declaration { id: DeclarationId(785), name: Some("PostEmitVerifier".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "command".to_string(), ty: DeclarationId(186) }, Field { label: "args".to_string(), ty: DeclarationId(1683) }, Field { label: "syntax_only".to_string(), ty: DeclarationId(88) }, Field { label: "expected_exit_code".to_string(), ty: DeclarationId(71) }, Field { label: "output_policy".to_string(), ty: DeclarationId(786) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 5270, 5418) }, + Declaration { id: DeclarationId(786), name: Some("VerifierOutputPolicy".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "IgnoreVerifierOutput".to_string(), ty: DeclarationId(1684) }, Field { label: "RequireEmptyStdout".to_string(), ty: DeclarationId(1685) }, Field { label: "RequireEmptyStderr".to_string(), ty: DeclarationId(1686) }, Field { label: "RequireEmptyStdoutAndStderr".to_string(), ty: DeclarationId(1687) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 5663, 5791) }, + Declaration { id: DeclarationId(787), name: Some("SizeBound".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "CollectionSize".to_string(), ty: DeclarationId(1692) }, Field { label: "ParserStreamSize".to_string(), ty: DeclarationId(1693) }, Field { label: "WorklistDrainSize".to_string(), ty: DeclarationId(1694) }, Field { label: "TreeSize".to_string(), ty: DeclarationId(1695) }, Field { label: "ArithmeticParam".to_string(), ty: DeclarationId(1696) }, Field { label: "ExplicitCountZero".to_string(), ty: DeclarationId(1697) }, Field { label: "ExplicitCountPositive".to_string(), ty: DeclarationId(1698) }, Field { label: "Forever".to_string(), ty: DeclarationId(1699) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1337, 1633) }, + Declaration { id: DeclarationId(788), name: Some("tree_size_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(787), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/computation.dag", 1682, 1713)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1635, 1713) }, + Declaration { id: DeclarationId(789), name: Some("positive_descent_count".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(971)], output: DeclarationId(71), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/computation.dag", 1778, 1893)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1715, 1893) }, + Declaration { id: DeclarationId(790), name: Some("CallPattern".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ChildAccessorCall".to_string(), ty: DeclarationId(1700) }, Field { label: "CollectionShrinkCall".to_string(), ty: DeclarationId(1701) }, Field { label: "ArithmeticSubtractCall".to_string(), ty: DeclarationId(1702) }, Field { label: "ArithmeticDivideCall".to_string(), ty: DeclarationId(1703) }, Field { label: "ParserAdvanceCall".to_string(), ty: DeclarationId(1704) }, Field { label: "WorklistDrainCall".to_string(), ty: DeclarationId(1705) }, Field { label: "FoldBodyCall".to_string(), ty: DeclarationId(1706) }, Field { label: "SameArgumentCall".to_string(), ty: DeclarationId(1707) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2144, 2591) }, + Declaration { id: DeclarationId(791), name: Some("ShrinkFactor".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "UnitShrink".to_string(), ty: DeclarationId(1708) }, Field { label: "ConstantShrink".to_string(), ty: DeclarationId(1709) }, Field { label: "ProportionalShrink".to_string(), ty: DeclarationId(1710) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2781, 2921) }, + Declaration { id: DeclarationId(792), name: Some("IterationPrimitive".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Fold".to_string(), ty: DeclarationId(1711) }, Field { label: "Descend".to_string(), ty: DeclarationId(1712) }, Field { label: "Repeat".to_string(), ty: DeclarationId(1713) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 3083, 3138) }, + Declaration { id: DeclarationId(793), name: Some("LoweringTarget".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "primitive".to_string(), ty: DeclarationId(792) }, Field { label: "bound".to_string(), ty: DeclarationId(787) }, Field { label: "evidence".to_string(), ty: DeclarationId(963) }, Field { label: "factor".to_string(), ty: DeclarationId(1714) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 3330, 3456) }, + Declaration { id: DeclarationId(794), name: Some("lower_call_pattern".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(790)], output: DeclarationId(793), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/computation.dag", 3767, 5318)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 3705, 5318) }, + Declaration { id: DeclarationId(795), name: Some("size_bound_param".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(787)], output: DeclarationId(1688), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/computation.dag", 5369, 5794)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 5320, 5794) }, + Declaration { id: DeclarationId(796), name: Some("is_constant_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(787)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/computation.dag", 5843, 6014)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 5796, 6014) }, + Declaration { id: DeclarationId(797), name: Some("forever_iteration_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(71), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/computation.dag", 6131, 6154)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 6095, 6154) }, + Declaration { id: DeclarationId(798), name: Some("constant_bound_value".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(787)], output: DeclarationId(1689), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/computation.dag", 6297, 6569)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 6247, 6569) }, + Declaration { id: DeclarationId(799), name: Some("IterationDimension".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "TreeDescent".to_string(), ty: DeclarationId(1715) }, Field { label: "CollectionFold".to_string(), ty: DeclarationId(1716) }, Field { label: "ArithmeticRepeat".to_string(), ty: DeclarationId(1717) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 7054, 7237) }, + Declaration { id: DeclarationId(800), name: Some("algebra_profile_to_dimension".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(47)], output: DeclarationId(1690), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/computation.dag", 7370, 7863)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 7290, 7863) }, + Declaration { id: DeclarationId(801), name: Some("type_iteration_dimension".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(1691), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/computation.dag", 7935, 8154)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 7865, 8154) }, + Declaration { id: DeclarationId(802), name: Some("Mutability".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Immutable".to_string(), ty: DeclarationId(1718) }, Field { label: "Mutable".to_string(), ty: DeclarationId(1719) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 340, 381) }, + Declaration { id: DeclarationId(803), name: Some("Purity".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Pure".to_string(), ty: DeclarationId(1720) }, Field { label: "Effectful".to_string(), ty: DeclarationId(1721) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 598, 632) }, + Declaration { id: DeclarationId(804), name: Some("Structure".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ExplicitDAG".to_string(), ty: DeclarationId(1722) }, Field { label: "Arbitrary".to_string(), ty: DeclarationId(1723) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 891, 935) }, + Declaration { id: DeclarationId(805), name: Some("Iteration".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Bounded".to_string(), ty: DeclarationId(1724) }, Field { label: "Unbounded".to_string(), ty: DeclarationId(1725) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 1147, 1187) }, + Declaration { id: DeclarationId(806), name: Some("ComputationModel".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "mutability".to_string(), ty: DeclarationId(802) }, Field { label: "purity".to_string(), ty: DeclarationId(803) }, Field { label: "structure".to_string(), ty: DeclarationId(804) }, Field { label: "iteration".to_string(), ty: DeclarationId(805) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 1387, 1500) }, + Declaration { id: DeclarationId(807), name: Some("dag_model".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(806), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(806)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("mutability".to_string(), FieldValue::Variant { constructor: DeclarationId(1718), payload: vec![] }), ("purity".to_string(), FieldValue::Variant { constructor: DeclarationId(1720), payload: vec![] }), ("structure".to_string(), FieldValue::Variant { constructor: DeclarationId(1722), payload: vec![] }), ("iteration".to_string(), FieldValue::Variant { constructor: DeclarationId(1724), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 1502, 1625) }, + Declaration { id: DeclarationId(808), name: Some("MemoryModel".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ValueOnly".to_string(), ty: DeclarationId(1726) }, Field { label: "GarbageCollected".to_string(), ty: DeclarationId(1727) }, Field { label: "RefCounted".to_string(), ty: DeclarationId(1728) }, Field { label: "OwnershipBased".to_string(), ty: DeclarationId(1729) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2014, 2099) }, + Declaration { id: DeclarationId(809), name: Some("ScopeModel".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "LexicalScoping".to_string(), ty: DeclarationId(1730) }, Field { label: "DynamicScoping".to_string(), ty: DeclarationId(1731) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2365, 2418) }, + Declaration { id: DeclarationId(810), name: Some("TargetExecutionModel".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "memory".to_string(), ty: DeclarationId(808) }, Field { label: "scope".to_string(), ty: DeclarationId(809) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2561, 2632) }, + Declaration { id: DeclarationId(811), name: Some("SourceFiltering".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "excluded_prefixes".to_string(), ty: DeclarationId(1732) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2774, 2832) }, + Declaration { id: DeclarationId(812), name: Some("ShapeATargetSourceFiltering".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "internal".to_string(), ty: DeclarationId(811) }, Field { label: "additional_excluded_prefixes".to_string(), ty: DeclarationId(1733) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 3115, 3224) }, + Declaration { id: DeclarationId(813), name: Some("internal_source_filtering".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(811), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(811)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("excluded_prefixes".to_string(), FieldValue::List(vec![FieldValue::Literal(LiteralBits::String("dsl/std/".to_string())), FieldValue::Literal(LiteralBits::String("dsl/extdeps/".to_string())), FieldValue::Literal(LiteralBits::String("src/v3/std/".to_string())), FieldValue::Literal(LiteralBits::String("src/v3/spec/".to_string()))]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 3226, 3381) }, + Declaration { id: DeclarationId(814), name: Some("ExecutionModelRequirement".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "OwnershipBased".to_string(), ty: DeclarationId(1734) }, Field { label: "GarbageCollected".to_string(), ty: DeclarationId(1735) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 3659, 3729) }, + Declaration { id: DeclarationId(815), name: Some("CompilerDiagnosticKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "TokenizerError".to_string(), ty: DeclarationId(1736) }, Field { label: "ParseError".to_string(), ty: DeclarationId(1737) }, Field { label: "TypeMismatch".to_string(), ty: DeclarationId(1738) }, Field { label: "UnitMismatch".to_string(), ty: DeclarationId(1739) }, Field { label: "ArityMismatch".to_string(), ty: DeclarationId(1740) }, Field { label: "ResolveError".to_string(), ty: DeclarationId(1741) }, Field { label: "NominalOpacityViolation".to_string(), ty: DeclarationId(1742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 990, 1148) }, + Declaration { id: DeclarationId(816), name: Some("Correction".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "description".to_string(), ty: DeclarationId(186) }, Field { label: "span".to_string(), ty: DeclarationId(121) }, Field { label: "new_source".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 1354, 1607) }, + Declaration { id: DeclarationId(817), name: Some("DiagnosticKindDecl".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "payload".to_string(), ty: DeclarationId(682) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 2387, 2450) }, + Declaration { id: DeclarationId(818), name: Some("LensInstanceKindWitness".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "kind_decl".to_string(), ty: DeclarationId(1016) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 4652, 4712) }, + Declaration { id: DeclarationId(819), name: Some("AnyDiagnosticKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "CompilerKind".to_string(), ty: DeclarationId(1743) }, Field { label: "LensInstanceKind".to_string(), ty: DeclarationId(1744) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 5321, 5430) }, + Declaration { id: DeclarationId(820), name: Some("Diagnostic".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "kind".to_string(), ty: DeclarationId(819) }, Field { label: "span".to_string(), ty: DeclarationId(121) }, Field { label: "message".to_string(), ty: DeclarationId(186) }, Field { label: "fixes".to_string(), ty: DeclarationId(1745) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 5799, 5907) }, + Declaration { id: DeclarationId(821), name: Some("Witness".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Inhabits".to_string(), ty: DeclarationId(1760) }, Field { label: "Violates".to_string(), ty: DeclarationId(1761) }] }, type_params: vec![DeclarationId(822)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 1600, 1689) }, + Declaration { id: DeclarationId(822), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Carrier".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 1600, 1689) }, + Declaration { id: DeclarationId(823), name: Some("OptionalDiagnostic".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "NoDiagnostic".to_string(), ty: DeclarationId(1762) }, Field { label: "SomeDiagnostic".to_string(), ty: DeclarationId(1763) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 1843, 1924) }, + Declaration { id: DeclarationId(824), name: Some("DimensionReport".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "DimensionOk".to_string(), ty: DeclarationId(1766) }, Field { label: "DimensionFail".to_string(), ty: DeclarationId(1770) }] }, type_params: vec![DeclarationId(825)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 2283, 2559) }, + Declaration { id: DeclarationId(825), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Carrier".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 2283, 2559) }, + Declaration { id: DeclarationId(826), name: Some("AnalysisDimension".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "witness_of".to_string(), ty: DeclarationId(1772) }, Field { label: "compose".to_string(), ty: DeclarationId(1773) }, Field { label: "identity".to_string(), ty: DeclarationId(827) }, Field { label: "break_diagnostic".to_string(), ty: DeclarationId(1774) }] }, type_params: vec![DeclarationId(827)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 3132, 3361) }, + Declaration { id: DeclarationId(827), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Carrier".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 3132, 3361) }, + Declaration { id: DeclarationId(828), name: Some("Dimension".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "value".to_string(), ty: DeclarationId(830) }] }, type_params: vec![DeclarationId(829), DeclarationId(830)], phantom_params: vec![PhantomParameter { parameter: DeclarationId(829), algebra: DeclarationId(1775) }], meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4002, 4052) }, + Declaration { id: DeclarationId(829), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Unit".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4002, 4052) }, + Declaration { id: DeclarationId(830), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Carrier".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4002, 4052) }, + Declaration { id: DeclarationId(831), name: Some("Meters".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4054, 4065) }, + Declaration { id: DeclarationId(832), name: Some("Seconds".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4066, 4078) }, + Declaration { id: DeclarationId(833), name: Some("Kilograms".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4079, 4093) }, + Declaration { id: DeclarationId(834), name: Some("Amperes".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4094, 4106) }, + Declaration { id: DeclarationId(835), name: Some("Kelvin".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4107, 4118) }, + Declaration { id: DeclarationId(836), name: Some("Moles".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4119, 4129) }, + Declaration { id: DeclarationId(837), name: Some("Candela".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4130, 4142) }, + Declaration { id: DeclarationId(838), name: Some("add_dimension".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1746), DeclarationId(1747), DeclarationId(1748)], output: DeclarationId(1749), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/dimensions.dag", 4316, 4338)) }, type_params: vec![DeclarationId(839), DeclarationId(840)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4144, 4338) }, + Declaration { id: DeclarationId(839), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Unit".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4144, 4338) }, + Declaration { id: DeclarationId(840), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Carrier".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4144, 4338) }, + Declaration { id: DeclarationId(841), name: Some("sub_dimension".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1750), DeclarationId(1751), DeclarationId(1752)], output: DeclarationId(1753), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/dimensions.dag", 4512, 4534)) }, type_params: vec![DeclarationId(842), DeclarationId(843)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4340, 4534) }, + Declaration { id: DeclarationId(842), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Unit".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4340, 4534) }, + Declaration { id: DeclarationId(843), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Carrier".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4340, 4534) }, + Declaration { id: DeclarationId(844), name: Some("mul_dimension_scalar".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1754), DeclarationId(1755), DeclarationId(846)], output: DeclarationId(1756), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/dimensions.dag", 4700, 4729)) }, type_params: vec![DeclarationId(845), DeclarationId(846)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4536, 4729) }, + Declaration { id: DeclarationId(845), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Unit".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4536, 4729) }, + Declaration { id: DeclarationId(846), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Carrier".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4536, 4729) }, + Declaration { id: DeclarationId(847), name: Some("div_dimension_scalar".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1757), DeclarationId(1758), DeclarationId(849)], output: DeclarationId(1759), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/dimensions.dag", 4895, 4924)) }, type_params: vec![DeclarationId(848), DeclarationId(849)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4731, 4924) }, + Declaration { id: DeclarationId(848), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Unit".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4731, 4924) }, + Declaration { id: DeclarationId(849), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Carrier".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4731, 4924) }, + Declaration { id: DeclarationId(850), name: Some("TypeRealization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "language".to_string(), ty: DeclarationId(1016) }, Field { label: "target".to_string(), ty: DeclarationId(1016) }, Field { label: "carrier".to_string(), ty: DeclarationId(186) }, Field { label: "is_copy".to_string(), ty: DeclarationId(88) }, Field { label: "fields".to_string(), ty: DeclarationId(1776) }, Field { label: "cost".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 696, 847) }, + Declaration { id: DeclarationId(851), name: Some("FieldBinding".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "dag_name".to_string(), ty: DeclarationId(186) }, Field { label: "access".to_string(), ty: DeclarationId(852) }, Field { label: "borrowed_read".to_string(), ty: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 849, 933) }, + Declaration { id: DeclarationId(852), name: Some("FieldAccess".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "DirectField".to_string(), ty: DeclarationId(1777) }, Field { label: "AccessorMethod".to_string(), ty: DeclarationId(1778) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 1316, 1383) }, + Declaration { id: DeclarationId(853), name: Some("OperatorRealization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "language".to_string(), ty: DeclarationId(1016) }, Field { label: "target".to_string(), ty: DeclarationId(1016) }, Field { label: "op".to_string(), ty: DeclarationId(1016) }, Field { label: "carrier".to_string(), ty: DeclarationId(186) }, Field { label: "cost".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 1385, 1516) }, + Declaration { id: DeclarationId(854), name: Some("BehaviorRealization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "language".to_string(), ty: DeclarationId(1016) }, Field { label: "target".to_string(), ty: DeclarationId(1016) }, Field { label: "carrier".to_string(), ty: DeclarationId(186) }, Field { label: "cost".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 1518, 1628) }, + Declaration { id: DeclarationId(855), name: Some("CallableRealization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "language".to_string(), ty: DeclarationId(1016) }, Field { label: "target".to_string(), ty: DeclarationId(1016) }, Field { label: "strategy".to_string(), ty: DeclarationId(859) }, Field { label: "parameters".to_string(), ty: DeclarationId(1779) }, Field { label: "cost".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 1630, 1789) }, + Declaration { id: DeclarationId(856), name: Some("CallableParameter".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "slot".to_string(), ty: DeclarationId(71) }, Field { label: "disposition".to_string(), ty: DeclarationId(857) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 2211, 2285) }, + Declaration { id: DeclarationId(857), name: Some("ParameterDisposition".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Borrowed".to_string(), ty: DeclarationId(1780) }, Field { label: "Consumed".to_string(), ty: DeclarationId(1781) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 2742, 2793) }, + Declaration { id: DeclarationId(858), name: Some("TypeInstantiationRealization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "language".to_string(), ty: DeclarationId(1016) }, Field { label: "target".to_string(), ty: DeclarationId(1016) }, Field { label: "carrier".to_string(), ty: DeclarationId(186) }, Field { label: "cost".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 2795, 2914) }, + Declaration { id: DeclarationId(859), name: Some("CallableStrategy".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ListEmpty".to_string(), ty: DeclarationId(1782) }, Field { label: "ListSingleton".to_string(), ty: DeclarationId(1783) }, Field { label: "ListCons".to_string(), ty: DeclarationId(1784) }, Field { label: "ListConcat".to_string(), ty: DeclarationId(1785) }, Field { label: "ListLength".to_string(), ty: DeclarationId(1786) }, Field { label: "ListIsEmpty".to_string(), ty: DeclarationId(1787) }, Field { label: "ListFold".to_string(), ty: DeclarationId(1788) }, Field { label: "ListMap".to_string(), ty: DeclarationId(1789) }, Field { label: "ListFilter".to_string(), ty: DeclarationId(1790) }, Field { label: "ListContains".to_string(), ty: DeclarationId(1791) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3319, 3488) }, + Declaration { id: DeclarationId(860), name: Some("PatternRealization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "language".to_string(), ty: DeclarationId(1016) }, Field { label: "target".to_string(), ty: DeclarationId(1016) }, Field { label: "strategy".to_string(), ty: DeclarationId(861) }, Field { label: "empty_variant".to_string(), ty: DeclarationId(1016) }, Field { label: "cons_variant".to_string(), ty: DeclarationId(1016) }, Field { label: "scrutinee".to_string(), ty: DeclarationId(186) }, Field { label: "empty_pattern".to_string(), ty: DeclarationId(186) }, Field { label: "cons_pattern".to_string(), ty: DeclarationId(186) }, Field { label: "head_expr".to_string(), ty: DeclarationId(186) }, Field { label: "tail_expr".to_string(), ty: DeclarationId(186) }, Field { label: "cost".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 5427, 5716) }, + Declaration { id: DeclarationId(861), name: Some("PatternStrategy".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "PlaceholderPatternStrategy".to_string(), ty: DeclarationId(1792) }, Field { label: "VectorList".to_string(), ty: DeclarationId(1793) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6156, 6222) }, + Declaration { id: DeclarationId(862), name: Some("StatementSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "let_binding".to_string(), ty: DeclarationId(186) }, Field { label: "let_binding_inferred".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6224, 6301) }, + Declaration { id: DeclarationId(863), name: Some("ExpressionSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "field_access".to_string(), ty: DeclarationId(186) }, Field { label: "function_call".to_string(), ty: DeclarationId(186) }, Field { label: "closure".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6303, 6393) }, + Declaration { id: DeclarationId(864), name: Some("ForEachSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "prefix".to_string(), ty: DeclarationId(186) }, Field { label: "separator".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6395, 6454) }, + Declaration { id: DeclarationId(865), name: Some("ControlFlowSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "if_else".to_string(), ty: DeclarationId(186) }, Field { label: "match_arm".to_string(), ty: DeclarationId(186) }, Field { label: "for_each_syntax".to_string(), ty: DeclarationId(864) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6456, 6553) }, + Declaration { id: DeclarationId(866), name: Some("LiteralSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "true_keyword".to_string(), ty: DeclarationId(186) }, Field { label: "false_keyword".to_string(), ty: DeclarationId(186) }, Field { label: "string_delimiter".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6555, 6651) }, + Declaration { id: DeclarationId(867), name: Some("ModuleSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "path_separator".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6653, 6699) }, + Declaration { id: DeclarationId(868), name: Some("FunctionSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "definition".to_string(), ty: DeclarationId(186) }, Field { label: "definition_exported".to_string(), ty: DeclarationId(186) }, Field { label: "definition_void".to_string(), ty: DeclarationId(186) }, Field { label: "param_with_type".to_string(), ty: DeclarationId(186) }, Field { label: "param_separator".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6701, 6853) }, + Declaration { id: DeclarationId(869), name: Some("TypeApplicationSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "optional".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6855, 6904) }, + Declaration { id: DeclarationId(870), name: Some("TypeDefinitionSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "struct_def".to_string(), ty: DeclarationId(186) }, Field { label: "struct_field".to_string(), ty: DeclarationId(186) }, Field { label: "enum_def".to_string(), ty: DeclarationId(186) }, Field { label: "enum_unit_variant".to_string(), ty: DeclarationId(186) }, Field { label: "enum_data_variant".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 7118, 7266) }, + Declaration { id: DeclarationId(871), name: Some("RecordDeriveTemplateBundle".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "struct_def_no_debug".to_string(), ty: DeclarationId(186) }, Field { label: "enum_def_no_debug".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 7927, 8020) }, + Declaration { id: DeclarationId(872), name: Some("PatternMatchSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "match_expr".to_string(), ty: DeclarationId(186) }, Field { label: "match_arm".to_string(), ty: DeclarationId(186) }, Field { label: "variant_pattern".to_string(), ty: DeclarationId(186) }, Field { label: "variant_pattern_positional".to_string(), ty: DeclarationId(186) }, Field { label: "variant_pattern_empty".to_string(), ty: DeclarationId(186) }, Field { label: "field_binding".to_string(), ty: DeclarationId(186) }, Field { label: "field_binding_separator".to_string(), ty: DeclarationId(186) }, Field { label: "wildcard".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 8724, 8964) }, + Declaration { id: DeclarationId(873), name: Some("CollectionOps".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "concat".to_string(), ty: DeclarationId(186) }, Field { label: "length".to_string(), ty: DeclarationId(186) }, Field { label: "is_empty".to_string(), ty: DeclarationId(186) }, Field { label: "fold".to_string(), ty: DeclarationId(186) }, Field { label: "map".to_string(), ty: DeclarationId(186) }, Field { label: "filter".to_string(), ty: DeclarationId(186) }, Field { label: "contains".to_string(), ty: DeclarationId(186) }, Field { label: "empty_list".to_string(), ty: DeclarationId(186) }, Field { label: "list_literal".to_string(), ty: DeclarationId(186) }, Field { label: "cons".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 8966, 9165) }, + Declaration { id: DeclarationId(874), name: Some("ValueConstructionSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "struct_literal".to_string(), ty: DeclarationId(186) }, Field { label: "struct_field_init".to_string(), ty: DeclarationId(186) }, Field { label: "struct_field_separator".to_string(), ty: DeclarationId(186) }, Field { label: "variant_construction".to_string(), ty: DeclarationId(186) }, Field { label: "variant_named_construction".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 9167, 9353) }, + Declaration { id: DeclarationId(875), name: Some("RenderingModel".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "read".to_string(), ty: DeclarationId(876) }, Field { label: "construct".to_string(), ty: DeclarationId(877) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 9355, 9430) }, + Declaration { id: DeclarationId(876), name: Some("ReadStrategy".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Borrow".to_string(), ty: DeclarationId(1794) }, Field { label: "PassByValue".to_string(), ty: DeclarationId(1795) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 9928, 9972) }, + Declaration { id: DeclarationId(877), name: Some("ConstructStrategy".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "CopyOrClone".to_string(), ty: DeclarationId(1796) }, Field { label: "PassByValue".to_string(), ty: DeclarationId(1797) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 10265, 10319) }, + Declaration { id: DeclarationId(878), name: Some("LanguageSpec".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "statements".to_string(), ty: DeclarationId(1016) }, Field { label: "expressions".to_string(), ty: DeclarationId(1016) }, Field { label: "control_flow".to_string(), ty: DeclarationId(1016) }, Field { label: "literals".to_string(), ty: DeclarationId(1016) }, Field { label: "modules".to_string(), ty: DeclarationId(1016) }, Field { label: "functions".to_string(), ty: DeclarationId(1016) }, Field { label: "type_applications".to_string(), ty: DeclarationId(1016) }, Field { label: "type_definitions".to_string(), ty: DeclarationId(1016) }, Field { label: "record_derive_templates".to_string(), ty: DeclarationId(1016) }, Field { label: "patterns".to_string(), ty: DeclarationId(1016) }, Field { label: "collection_ops".to_string(), ty: DeclarationId(1016) }, Field { label: "values".to_string(), ty: DeclarationId(1016) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 10321, 10847) }, + Declaration { id: DeclarationId(879), name: Some("PlaceholderConvention".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "IndexedArgs".to_string(), ty: DeclarationId(1798) }, Field { label: "NamedArg".to_string(), ty: DeclarationId(1799) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 12221, 12276) }, + Declaration { id: DeclarationId(880), name: Some("MethodTemplateContract".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "dag_method".to_string(), ty: DeclarationId(736) }, Field { label: "runtime_template".to_string(), ty: DeclarationId(186) }, Field { label: "emit_template".to_string(), ty: DeclarationId(186) }, Field { label: "wraps_result".to_string(), ty: DeclarationId(88) }, Field { label: "placeholder_convention".to_string(), ty: DeclarationId(879) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 14069, 14244) }, + Declaration { id: DeclarationId(881), name: Some("BootstrapFixture".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "virtual_path".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/extdeps_bootstrap_fixtures.dag", 1395, 1443) }, + Declaration { id: DeclarationId(882), name: Some("BootstrapFixtureSet".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "rust_pilot_primitives".to_string(), ty: DeclarationId(881) }, Field { label: "rust_method_template_contracts".to_string(), ty: DeclarationId(881) }, Field { label: "python_method_template_contracts".to_string(), ty: DeclarationId(881) }, Field { label: "go_method_template_contracts".to_string(), ty: DeclarationId(881) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/extdeps_bootstrap_fixtures.dag", 1600, 1823) }, + Declaration { id: DeclarationId(883), name: Some("bootstrap_fixture_authority".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(882), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(882)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("rust_pilot_primitives".to_string(), FieldValue::Record(vec![("virtual_path".to_string(), FieldValue::Literal(LiteralBits::String("dsl/extdeps/languages/rust/primitives.dag".to_string())))])), ("rust_method_template_contracts".to_string(), FieldValue::Record(vec![("virtual_path".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/std/rust_method_template_contracts.dag".to_string())))])), ("python_method_template_contracts".to_string(), FieldValue::Record(vec![("virtual_path".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/std/python_method_template_contracts.dag".to_string())))])), ("go_method_template_contracts".to_string(), FieldValue::Record(vec![("virtual_path".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/std/go_method_template_contracts.dag".to_string())))]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/extdeps_bootstrap_fixtures.dag", 1825, 2298) }, + Declaration { id: DeclarationId(884), name: Some("go_method_template_contracts".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(880) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1800)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(214)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("len({recv})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("len({recv})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(226)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("strings.Join({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("strings.Join({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(250)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("strings.Split({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("strings.Split({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(212)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("append({recv}, {arg}...)".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("append({recv}, {arg}...)".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(232)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.Map({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.Map({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(219)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.Filter({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.Filter({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(205)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.Any({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.Any({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(204)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.All({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.All({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(221)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.FlatMap({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.FlatMap({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(248)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[{arg}:]".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[{arg}:]".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(253)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[:{arg}]".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[:{arg}]".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(222)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.Fold({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.Fold({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(249)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.SortBy({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.SortBy({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(206)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("append({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("append({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })])])), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/go_method_template_contracts.dag", 2405, 5333) }, + Declaration { id: DeclarationId(885), name: Some("RecursionShape".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "DirectRecursion".to_string(), ty: DeclarationId(1810) }, Field { label: "ListRecursion".to_string(), ty: DeclarationId(1811) }, Field { label: "OptionalRecursion".to_string(), ty: DeclarationId(1812) }, Field { label: "SetRecursion".to_string(), ty: DeclarationId(1813) }, Field { label: "MapValueRecursion".to_string(), ty: DeclarationId(1814) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 5538, 5811) }, + Declaration { id: DeclarationId(886), name: Some("InductiveField".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "type_name".to_string(), ty: DeclarationId(186) }, Field { label: "variant_name".to_string(), ty: DeclarationId(186) }, Field { label: "field_name".to_string(), ty: DeclarationId(186) }, Field { label: "shape".to_string(), ty: DeclarationId(885) }, Field { label: "element_type".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 7103, 7525) }, + Declaration { id: DeclarationId(887), name: Some("recursion_shape_eq".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(885), DeclarationId(885)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 7595, 7967)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 7527, 7967) }, + Declaration { id: DeclarationId(888), name: Some("inductive_field_eq".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(886), DeclarationId(886)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 8037, 8235)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 7969, 8235) }, + Declaration { id: DeclarationId(889), name: Some("inductive_field_to_dimension".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(886), DeclarationId(186)], output: DeclarationId(970), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 8701, 8732)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 8611, 8732) }, + Declaration { id: DeclarationId(890), name: Some("SubValueRelation".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "StrictSubValue".to_string(), ty: DeclarationId(1815) }, Field { label: "IteratedSubValue".to_string(), ty: DeclarationId(1816) }, Field { label: "ArithmeticDescent".to_string(), ty: DeclarationId(1817) }, Field { label: "PreservedValue".to_string(), ty: DeclarationId(1818) }, Field { label: "SubValueUnknown".to_string(), ty: DeclarationId(1819) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 9878, 10114) }, + Declaration { id: DeclarationId(891), name: Some("sub_value_to_evidence".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(890)], output: DeclarationId(963), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 11067, 11670)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 10995, 11670) }, + Declaration { id: DeclarationId(892), name: Some("shrink_factor_eq".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(791), DeclarationId(791)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 12177, 12677)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 12115, 12677) }, + Declaration { id: DeclarationId(893), name: Some("meet_sub_value".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(890), DeclarationId(890)], output: DeclarationId(890), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 13200, 14612)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 13120, 14612) }, + Declaration { id: DeclarationId(894), name: Some("join_sub_value".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(890), DeclarationId(890)], output: DeclarationId(890), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 14944, 16247)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 14864, 16247) }, + Declaration { id: DeclarationId(895), name: Some("compose_sub_value".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(890), DeclarationId(886)], output: DeclarationId(890), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 17356, 17478)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 17268, 17478) }, + Declaration { id: DeclarationId(896), name: Some("compose_sub_value_relations".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(890), DeclarationId(890)], output: DeclarationId(890), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 18334, 19680)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 18226, 19680) }, + Declaration { id: DeclarationId(897), name: Some("sub_value_to_call_pattern".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(890)], output: DeclarationId(1801), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 20455, 21251)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 20382, 21251) }, + Declaration { id: DeclarationId(898), name: Some("sub_value_to_lowering_target".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(890)], output: DeclarationId(1802), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 21843, 22748)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 21764, 22748) }, + Declaration { id: DeclarationId(899), name: Some("PolynomialExponent".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "IntegerExpZero".to_string(), ty: DeclarationId(1820) }, Field { label: "IntegerExpPos".to_string(), ty: DeclarationId(1821) }, Field { label: "FractionExp".to_string(), ty: DeclarationId(1822) }, Field { label: "LogBasedExp".to_string(), ty: DeclarationId(1823) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 23991, 24246) }, + Declaration { id: DeclarationId(900), name: Some("poly_exp_degree_one".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(899), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 24295, 24334)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 24248, 24334) }, + Declaration { id: DeclarationId(901), name: Some("AtomicCost".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "PolyCost".to_string(), ty: DeclarationId(1824) }, Field { label: "LogCost".to_string(), ty: DeclarationId(1825) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 24846, 24963) }, + Declaration { id: DeclarationId(902), name: Some("CostBound".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ConstantBound".to_string(), ty: DeclarationId(1826) }, Field { label: "AtomicBound".to_string(), ty: DeclarationId(1827) }, Field { label: "ProductBound".to_string(), ty: DeclarationId(1829) }, Field { label: "SumOfProductsBound".to_string(), ty: DeclarationId(1832) }, Field { label: "SumBound".to_string(), ty: DeclarationId(1834) }, Field { label: "ForeverBound".to_string(), ty: DeclarationId(1835) }, Field { label: "ErrorBound".to_string(), ty: DeclarationId(1836) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 26593, 27353) }, + Declaration { id: DeclarationId(903), name: Some("sum_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1803)], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 27764, 27870)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 27714, 27870) }, + Declaration { id: DeclarationId(904), name: Some("cost_bound_is_sum_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(902)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 28194, 28447)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 28145, 28447) }, + Declaration { id: DeclarationId(905), name: Some("cost_constant".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 28481, 28498)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 28449, 28498) }, + Declaration { id: DeclarationId(906), name: Some("cost_linear".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 28542, 28626)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 28499, 28626) }, + Declaration { id: DeclarationId(907), name: Some("cost_poly".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(71)], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 28681, 29080)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 28627, 29080) }, + Declaration { id: DeclarationId(908), name: Some("cost_root".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(71)], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 29130, 29404)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 29081, 29404) }, + Declaration { id: DeclarationId(909), name: Some("cost_sqrt".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 29446, 29479)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 29405, 29479) }, + Declaration { id: DeclarationId(910), name: Some("cost_cbrt".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 29521, 29554)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 29480, 29554) }, + Declaration { id: DeclarationId(911), name: Some("cost_log".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 29595, 29645)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 29555, 29645) }, + Declaration { id: DeclarationId(912), name: Some("cost_nlogn".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 29689, 29807)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 29647, 29807) }, + Declaration { id: DeclarationId(913), name: Some("cost_graph_linear".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(186)], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 29877, 30053)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 29809, 30053) }, + Declaration { id: DeclarationId(914), name: Some("RecurrenceForm".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }, Field { label: "branches".to_string(), ty: DeclarationId(71) }, Field { label: "divisor".to_string(), ty: DeclarationId(71) }, Field { label: "work_exponent".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 31210, 31301) }, + Declaration { id: DeclarationId(915), name: Some("int_add_checked".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71), DeclarationId(71)], output: DeclarationId(1804), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 31892, 32143)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 31849, 32143) }, + Declaration { id: DeclarationId(916), name: Some("int_mul_checked".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71), DeclarationId(71)], output: DeclarationId(1805), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 32188, 32977)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 32145, 32977) }, + Declaration { id: DeclarationId(917), name: Some("bounded_int_pow_exponent".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71)], output: DeclarationId(1806), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 33437, 33560)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 33393, 33560) }, + Declaration { id: DeclarationId(918), name: Some("int_pow_bounded".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71), DeclarationId(71)], output: DeclarationId(1807), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 33912, 34957)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 33864, 34957) }, + Declaration { id: DeclarationId(919), name: Some("ceil_log".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71), DeclarationId(71)], output: DeclarationId(1808), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 35175, 35290)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 35129, 35290) }, + Declaration { id: DeclarationId(920), name: Some("ceil_log_iter".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71), DeclarationId(71), DeclarationId(71), DeclarationId(71)], output: DeclarationId(1809), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 35447, 35809)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 35376, 35809) }, + Declaration { id: DeclarationId(921), name: Some("master_theorem".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(914)], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 35864, 37901)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 35811, 37901) }, + Declaration { id: DeclarationId(922), name: Some("catamorphism_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(71)], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 38254, 38412)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 38184, 38412) }, + Declaration { id: DeclarationId(923), name: Some("derive_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(71), DeclarationId(791), DeclarationId(71)], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 38911, 39935)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 38810, 39935) }, + Declaration { id: DeclarationId(924), name: Some("tree_traversal_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 40268, 40325)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 40229, 40325) }, + Declaration { id: DeclarationId(925), name: Some("nested_iteration_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 40368, 40426)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 40327, 40426) }, + Declaration { id: DeclarationId(926), name: Some("linear_scan_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 40526, 40581)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 40490, 40581) }, + Declaration { id: DeclarationId(927), name: Some("binary_search_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 40778, 40893)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 40740, 40893) }, + Declaration { id: DeclarationId(928), name: Some("mergesort_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 40973, 41088)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 40939, 41088) }, + Declaration { id: DeclarationId(929), name: Some("karatsuba_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 41255, 41374)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 41221, 41374) }, + Declaration { id: DeclarationId(930), name: Some("strassen_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 41539, 41653)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 41506, 41653) }, + Declaration { id: DeclarationId(931), name: Some("trial_division_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 41770, 41795)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 41731, 41795) }, + Declaration { id: DeclarationId(932), name: Some("cube_root_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 41830, 41855)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 41796, 41855) }, + Declaration { id: DeclarationId(933), name: Some("kth_root_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71)], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 41937, 41968)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 41898, 41968) }, + Declaration { id: DeclarationId(934), name: Some("bfs_dfs_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 42204, 42255)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 42172, 42255) }, + Declaration { id: DeclarationId(935), name: Some("dijkstra_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 42346, 42628)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 42313, 42628) }, + Declaration { id: DeclarationId(936), name: Some("bellman_ford_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 42731, 42891)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 42694, 42891) }, + Declaration { id: DeclarationId(937), name: Some("floyd_warshall_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 42998, 43036)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 42959, 43036) }, + Declaration { id: DeclarationId(938), name: Some("Lens".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "read".to_string(), ty: DeclarationId(1838) }, Field { label: "sequential".to_string(), ty: DeclarationId(1839) }, Field { label: "branch".to_string(), ty: DeclarationId(1840) }, Field { label: "iterate".to_string(), ty: DeclarationId(1841) }, Field { label: "validate".to_string(), ty: DeclarationId(1842) }] }, type_params: vec![DeclarationId(939)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lens.dag", 4121, 4318) }, + Declaration { id: DeclarationId(939), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("C".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lens.dag", 4121, 4318) }, + Declaration { id: DeclarationId(940), name: Some("Lookup".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Miss".to_string(), ty: DeclarationId(1845) }, Field { label: "Hit".to_string(), ty: DeclarationId(1846) }] }, type_params: vec![DeclarationId(941)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lookup.dag", 4509, 4551) }, + Declaration { id: DeclarationId(941), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("value".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lookup.dag", 4509, 4551) }, + Declaration { id: DeclarationId(942), name: Some("miss_int_lookup".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(1843), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/lookup.dag", 4589, 4599)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lookup.dag", 4553, 4599) }, + Declaration { id: DeclarationId(943), name: Some("hit_int_lookup".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71)], output: DeclarationId(1844), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/lookup.dag", 4642, 4654)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lookup.dag", 4601, 4654) }, + Declaration { id: DeclarationId(944), name: Some("DagDifference".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "detail".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 684, 723) }, + Declaration { id: DeclarationId(945), name: Some("SurfaceModule".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "items".to_string(), ty: DeclarationId(1847) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 1149, 1198) }, + Declaration { id: DeclarationId(946), name: Some("SurfaceParam".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "ty".to_string(), ty: DeclarationId(950) }, Field { label: "refinement".to_string(), ty: DeclarationId(1848) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 1200, 1281) }, + Declaration { id: DeclarationId(947), name: Some("SurfaceField".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "ty".to_string(), ty: DeclarationId(950) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 1283, 1337) }, + Declaration { id: DeclarationId(948), name: Some("SurfaceVariant".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "payload".to_string(), ty: DeclarationId(949) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 1339, 1422) }, + Declaration { id: DeclarationId(949), name: Some("VariantPayload".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Positional".to_string(), ty: DeclarationId(1850) }, Field { label: "Record".to_string(), ty: DeclarationId(1852) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 1712, 1796) }, + Declaration { id: DeclarationId(950), name: Some("SurfaceType".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Named".to_string(), ty: DeclarationId(1853) }, Field { label: "Parameterized".to_string(), ty: DeclarationId(1855) }, Field { label: "Optional".to_string(), ty: DeclarationId(1856) }, Field { label: "Arrow".to_string(), ty: DeclarationId(1858) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 2052, 2379) }, + Declaration { id: DeclarationId(951), name: Some("SurfaceRecordField".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "value".to_string(), ty: DeclarationId(957) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 2381, 2463) }, + Declaration { id: DeclarationId(952), name: Some("SurfaceMapEntry".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "key".to_string(), ty: DeclarationId(186) }, Field { label: "key_span".to_string(), ty: DeclarationId(121) }, Field { label: "value".to_string(), ty: DeclarationId(957) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 3353, 3454) }, + Declaration { id: DeclarationId(953), name: Some("SurfaceMatchArm".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "pattern".to_string(), ty: DeclarationId(955) }, Field { label: "body".to_string(), ty: DeclarationId(957) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 3456, 3545) }, + Declaration { id: DeclarationId(954), name: Some("SurfacePatternField".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "binding".to_string(), ty: DeclarationId(186) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 3547, 3627) }, + Declaration { id: DeclarationId(955), name: Some("SurfacePattern".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "BareVariant".to_string(), ty: DeclarationId(1859) }, Field { label: "VariantWith".to_string(), ty: DeclarationId(1860) }, Field { label: "VariantFields".to_string(), ty: DeclarationId(1862) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 3725, 3991) }, + Declaration { id: DeclarationId(956), name: Some("SurfaceLiteral".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Int".to_string(), ty: DeclarationId(1863) }, Field { label: "Bool".to_string(), ty: DeclarationId(1864) }, Field { label: "String".to_string(), ty: DeclarationId(1865) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 4554, 4620) }, + Declaration { id: DeclarationId(957), name: Some("SurfaceExpr".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Literal".to_string(), ty: DeclarationId(1866) }, Field { label: "Var".to_string(), ty: DeclarationId(1867) }, Field { label: "Path".to_string(), ty: DeclarationId(1870) }, Field { label: "Call".to_string(), ty: DeclarationId(1872) }, Field { label: "VariantRecord".to_string(), ty: DeclarationId(1874) }, Field { label: "Operator".to_string(), ty: DeclarationId(1876) }, Field { label: "Lambda".to_string(), ty: DeclarationId(1878) }, Field { label: "If".to_string(), ty: DeclarationId(1879) }, Field { label: "Match".to_string(), ty: DeclarationId(1881) }, Field { label: "Record".to_string(), ty: DeclarationId(1883) }, Field { label: "List".to_string(), ty: DeclarationId(1885) }, Field { label: "Map".to_string(), ty: DeclarationId(1887) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 4713, 7852) }, + Declaration { id: DeclarationId(958), name: Some("SurfaceItem".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Let".to_string(), ty: DeclarationId(1889) }, Field { label: "Fn".to_string(), ty: DeclarationId(1892) }, Field { label: "FnExternalBody".to_string(), ty: DeclarationId(1895) }, Field { label: "Data".to_string(), ty: DeclarationId(1897) }, Field { label: "Module".to_string(), ty: DeclarationId(1899) }, Field { label: "Import".to_string(), ty: DeclarationId(1902) }, Field { label: "TypeAtom".to_string(), ty: DeclarationId(1904) }, Field { label: "TypeRecord".to_string(), ty: DeclarationId(1907) }, Field { label: "TypeSum".to_string(), ty: DeclarationId(1911) }, Field { label: "TypeAlias".to_string(), ty: DeclarationId(1914) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 8721, 10039) }, + Declaration { id: DeclarationId(959), name: Some("python_method_template_contracts".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(880) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1915)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(214)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("len({recv})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("len({recv})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(226)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{arg}.join({recv})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{arg}.join({recv})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(250)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.split({arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.split({arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(228)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[-1] if {recv} else None".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[-1] if {recv} else None".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(220)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[0] if {recv} else None".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[0] if {recv} else None".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(218)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("list(enumerate({recv}))".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("list(enumerate({recv}))".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(208)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("[ord(c) for c in {recv}]".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("[ord(c) for c in {recv}]".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(212)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv} + {arg}".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv} + {arg}".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(232)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("[{arg}(x) for x in {recv}]".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("[{arg}(x) for x in {recv}]".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(219)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("[x for x in {recv} if {arg}(x)]".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("[x for x in {recv} if {arg}(x)]".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(205)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("any({arg}(x) for x in {recv})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("any({arg}(x) for x in {recv})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(204)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("all({arg}(x) for x in {recv})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("all({arg}(x) for x in {recv})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(221)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("[y for x in {recv} for y in {arg}(x)]".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("[y for x in {recv} for y in {arg}(x)]".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(248)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[{arg}:]".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[{arg}:]".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(253)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[:{arg}]".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[:{arg}]".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(222)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("functools.reduce({arg}, {recv})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("functools.reduce({arg}, {recv})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(249)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("sorted({recv}, key={arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("sorted({recv}, key={arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(206)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv} + [{arg}]".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv} + [{arg}]".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })])])), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/python_method_template_contracts.dag", 2053, 5846) }, + Declaration { id: DeclarationId(960), name: Some("ResourceHandle".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "type".to_string(), ty: DeclarationId(186) }, Field { label: "resource_id".to_string(), ty: DeclarationId(186) }, Field { label: "key".to_string(), ty: DeclarationId(186) }, Field { label: "cap".to_string(), ty: DeclarationId(107) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/resources.dag", 739, 827) }, + Declaration { id: DeclarationId(961), name: Some("ResourceReference".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "target".to_string(), ty: DeclarationId(1016) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/resources.dag", 829, 880) }, + Declaration { id: DeclarationId(962), name: Some("rust_method_template_contracts".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(880) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1916)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(214)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.len()".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("({recv}.len() as i64)".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(226)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.join(&{arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.join(&{arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(250)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.split(&{arg}).map(|s| s.to_string()).collect::>()".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.split(&{arg}).map(|s| s.to_string()).collect::>()".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(228)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.last().cloned()".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.last().cloned()".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(220)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.first().cloned()".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.first().cloned()".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(218)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.iter().enumerate().map(|(i, v)| (i, v.clone())).collect::>()".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(208)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.chars().map(|c| c as i64).collect::>()".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.chars().map(|c| c as i64).collect::>()".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(248)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.iter().cloned().skip({arg} as usize).collect::>()".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.iter().cloned().skip({arg} as usize).collect::>()".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(253)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.iter().cloned().take({arg} as usize).collect::>()".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.iter().cloned().take({arg} as usize).collect::>()".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1799), payload: vec![] })])])), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/rust_method_template_contracts.dag", 4006, 6310) }, + Declaration { id: DeclarationId(963), name: Some("DescentEvidence".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Strict".to_string(), ty: DeclarationId(1924) }, Field { label: "NonIncreasing".to_string(), ty: DeclarationId(1925) }, Field { label: "DescentUnknown".to_string(), ty: DeclarationId(1926) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 642, 710) }, + Declaration { id: DeclarationId(964), name: Some("evidence_rank".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(963)], output: DeclarationId(71), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 756, 838)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 712, 838) }, + Declaration { id: DeclarationId(965), name: Some("merge_evidence".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(963), DeclarationId(963)], output: DeclarationId(963), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 982, 1310)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 905, 1310) }, + Declaration { id: DeclarationId(966), name: Some("join_evidence".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(963), DeclarationId(963)], output: DeclarationId(963), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 1456, 1655)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 1380, 1655) }, + Declaration { id: DeclarationId(967), name: Some("promote_to_strict".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(963)], output: DeclarationId(963), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 2117, 2236)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 2050, 2236) }, + Declaration { id: DeclarationId(968), name: Some("optional_evidence_meet".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1917), DeclarationId(1918)], output: DeclarationId(1919), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 2388, 2564)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 2300, 2564) }, + Declaration { id: DeclarationId(969), name: Some("map_evidence_merge_at".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1920), DeclarationId(186), DeclarationId(963)], output: DeclarationId(1921), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 2733, 2907)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 2601, 2907) }, + Declaration { id: DeclarationId(970), name: Some("RankingDimension".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "TreeSize".to_string(), ty: DeclarationId(1927) }, Field { label: "ListLength".to_string(), ty: DeclarationId(1928) }, Field { label: "ArithmeticValue".to_string(), ty: DeclarationId(1929) }, Field { label: "TokenPosition".to_string(), ty: DeclarationId(1930) }, Field { label: "SetCardinality".to_string(), ty: DeclarationId(1931) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 3206, 3402) }, + Declaration { id: DeclarationId(971), name: Some("PositiveDescentAmount".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "OneStep".to_string(), ty: DeclarationId(1932) }, Field { label: "AdditionalStep".to_string(), ty: DeclarationId(1933) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 4378, 4471) }, + Declaration { id: DeclarationId(972), name: Some("ProportionalDivisor".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "DivideByTwo".to_string(), ty: DeclarationId(1934) }, Field { label: "StrictlyLarger".to_string(), ty: DeclarationId(1935) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 4937, 5027) }, + Declaration { id: DeclarationId(973), name: Some("proportional_divisor_to_int".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(972)], output: DeclarationId(71), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 5091, 5204)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 5029, 5204) }, + Declaration { id: DeclarationId(974), name: Some("peano_literal_materialization_cap".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(71), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 5434, 5441)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 5388, 5441) }, + Declaration { id: DeclarationId(975), name: Some("positive_descent_amount_from_positive_int".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71)], output: DeclarationId(1922), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 5902, 6262)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 5823, 6262) }, + Declaration { id: DeclarationId(976), name: Some("proportional_divisor_from_int_at_least_two".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71)], output: DeclarationId(1923), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 6342, 6703)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 6264, 6703) }, + Declaration { id: DeclarationId(977), name: Some("DescentSource".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ChildAccessor".to_string(), ty: DeclarationId(1936) }, Field { label: "ListShrink".to_string(), ty: DeclarationId(1937) }, Field { label: "ArithmeticSubtractDescent".to_string(), ty: DeclarationId(1938) }, Field { label: "ArithmeticDivideDescent".to_string(), ty: DeclarationId(1939) }, Field { label: "ParserAdvance".to_string(), ty: DeclarationId(1940) }, Field { label: "SetRemoval".to_string(), ty: DeclarationId(1941) }, Field { label: "FoldIteration".to_string(), ty: DeclarationId(1942) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7108, 7429) }, + Declaration { id: DeclarationId(978), name: Some("TerminationProof".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "dimensions".to_string(), ty: DeclarationId(1943) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7431, 7493) }, + Declaration { id: DeclarationId(979), name: Some("ProofEdge".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "caller".to_string(), ty: DeclarationId(186) }, Field { label: "callee".to_string(), ty: DeclarationId(186) }, Field { label: "evidence".to_string(), ty: DeclarationId(1944) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7638, 7724) }, + Declaration { id: DeclarationId(980), name: Some("TokenKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "KwLet".to_string(), ty: DeclarationId(1945) }, Field { label: "KwIf".to_string(), ty: DeclarationId(1946) }, Field { label: "KwThen".to_string(), ty: DeclarationId(1947) }, Field { label: "KwElse".to_string(), ty: DeclarationId(1948) }, Field { label: "KwFn".to_string(), ty: DeclarationId(1949) }, Field { label: "KwType".to_string(), ty: DeclarationId(1950) }, Field { label: "KwModule".to_string(), ty: DeclarationId(1951) }, Field { label: "KwImport".to_string(), ty: DeclarationId(1952) }, Field { label: "KwMatch".to_string(), ty: DeclarationId(1953) }, Field { label: "KwData".to_string(), ty: DeclarationId(1954) }, Field { label: "KwWhere".to_string(), ty: DeclarationId(1955) }, Field { label: "KwTrue".to_string(), ty: DeclarationId(1956) }, Field { label: "KwFalse".to_string(), ty: DeclarationId(1957) }, Field { label: "Ident".to_string(), ty: DeclarationId(1958) }, Field { label: "IntLit".to_string(), ty: DeclarationId(1959) }, Field { label: "StringLit".to_string(), ty: DeclarationId(1960) }, Field { label: "Eq".to_string(), ty: DeclarationId(1961) }, Field { label: "EqEq".to_string(), ty: DeclarationId(1962) }, Field { label: "NotEq".to_string(), ty: DeclarationId(1963) }, Field { label: "Lt".to_string(), ty: DeclarationId(1964) }, Field { label: "Le".to_string(), ty: DeclarationId(1965) }, Field { label: "Gt".to_string(), ty: DeclarationId(1966) }, Field { label: "Ge".to_string(), ty: DeclarationId(1967) }, Field { label: "Plus".to_string(), ty: DeclarationId(1968) }, Field { label: "Minus".to_string(), ty: DeclarationId(1969) }, Field { label: "Star".to_string(), ty: DeclarationId(1970) }, Field { label: "Slash".to_string(), ty: DeclarationId(1971) }, Field { label: "AmpAmp".to_string(), ty: DeclarationId(1972) }, Field { label: "PipePipe".to_string(), ty: DeclarationId(1973) }, Field { label: "Colon".to_string(), ty: DeclarationId(1974) }, Field { label: "Arrow".to_string(), ty: DeclarationId(1975) }, Field { label: "FatArrow".to_string(), ty: DeclarationId(1976) }, Field { label: "PipeArrow".to_string(), ty: DeclarationId(1977) }, Field { label: "Dot".to_string(), ty: DeclarationId(1978) }, Field { label: "LParen".to_string(), ty: DeclarationId(1979) }, Field { label: "RParen".to_string(), ty: DeclarationId(1980) }, Field { label: "LBrace".to_string(), ty: DeclarationId(1981) }, Field { label: "RBrace".to_string(), ty: DeclarationId(1982) }, Field { label: "LBracket".to_string(), ty: DeclarationId(1983) }, Field { label: "RBracket".to_string(), ty: DeclarationId(1984) }, Field { label: "Comma".to_string(), ty: DeclarationId(1985) }, Field { label: "Semicolon".to_string(), ty: DeclarationId(1986) }, Field { label: "Pipe".to_string(), ty: DeclarationId(1987) }, Field { label: "Question".to_string(), ty: DeclarationId(1988) }, Field { label: "Eof".to_string(), ty: DeclarationId(1989) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 627, 1137) }, + Declaration { id: DeclarationId(981), name: Some("Token".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "kind".to_string(), ty: DeclarationId(980) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1272, 1323) }, + Declaration { id: DeclarationId(982), name: Some("KeywordTokenKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "KwLet".to_string(), ty: DeclarationId(1990) }, Field { label: "KwIf".to_string(), ty: DeclarationId(1991) }, Field { label: "KwThen".to_string(), ty: DeclarationId(1992) }, Field { label: "KwElse".to_string(), ty: DeclarationId(1993) }, Field { label: "KwFn".to_string(), ty: DeclarationId(1994) }, Field { label: "KwType".to_string(), ty: DeclarationId(1995) }, Field { label: "KwModule".to_string(), ty: DeclarationId(1996) }, Field { label: "KwImport".to_string(), ty: DeclarationId(1997) }, Field { label: "KwMatch".to_string(), ty: DeclarationId(1998) }, Field { label: "KwData".to_string(), ty: DeclarationId(1999) }, Field { label: "KwWhere".to_string(), ty: DeclarationId(2000) }, Field { label: "KwTrue".to_string(), ty: DeclarationId(2001) }, Field { label: "KwFalse".to_string(), ty: DeclarationId(2002) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1682, 1848) }, + Declaration { id: DeclarationId(983), name: Some("PunctTokenKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Eq".to_string(), ty: DeclarationId(2003) }, Field { label: "EqEq".to_string(), ty: DeclarationId(2004) }, Field { label: "NotEq".to_string(), ty: DeclarationId(2005) }, Field { label: "Lt".to_string(), ty: DeclarationId(2006) }, Field { label: "Le".to_string(), ty: DeclarationId(2007) }, Field { label: "Gt".to_string(), ty: DeclarationId(2008) }, Field { label: "Ge".to_string(), ty: DeclarationId(2009) }, Field { label: "Plus".to_string(), ty: DeclarationId(2010) }, Field { label: "Minus".to_string(), ty: DeclarationId(2011) }, Field { label: "Star".to_string(), ty: DeclarationId(2012) }, Field { label: "Slash".to_string(), ty: DeclarationId(2013) }, Field { label: "AmpAmp".to_string(), ty: DeclarationId(2014) }, Field { label: "PipePipe".to_string(), ty: DeclarationId(2015) }, Field { label: "Colon".to_string(), ty: DeclarationId(2016) }, Field { label: "Arrow".to_string(), ty: DeclarationId(2017) }, Field { label: "FatArrow".to_string(), ty: DeclarationId(2018) }, Field { label: "PipeArrow".to_string(), ty: DeclarationId(2019) }, Field { label: "Dot".to_string(), ty: DeclarationId(2020) }, Field { label: "LParen".to_string(), ty: DeclarationId(2021) }, Field { label: "RParen".to_string(), ty: DeclarationId(2022) }, Field { label: "LBrace".to_string(), ty: DeclarationId(2023) }, Field { label: "RBrace".to_string(), ty: DeclarationId(2024) }, Field { label: "LBracket".to_string(), ty: DeclarationId(2025) }, Field { label: "RBracket".to_string(), ty: DeclarationId(2026) }, Field { label: "Comma".to_string(), ty: DeclarationId(2027) }, Field { label: "Semicolon".to_string(), ty: DeclarationId(2028) }, Field { label: "Pipe".to_string(), ty: DeclarationId(2029) }, Field { label: "Question".to_string(), ty: DeclarationId(2030) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2264, 2570) }, + Declaration { id: DeclarationId(984), name: Some("LocalPunctSpec".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "pattern".to_string(), ty: DeclarationId(186) }, Field { label: "kind".to_string(), ty: DeclarationId(983) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2780, 2844) }, + Declaration { id: DeclarationId(985), name: Some("StringEscapeSpec".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "suffix".to_string(), ty: DeclarationId(186) }, Field { label: "output_codepoint".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 3231, 3297) }, + Declaration { id: DeclarationId(986), name: Some("Path".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(120), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 1292, 1312) }, + Declaration { id: DeclarationId(987), name: Some("SnapshotRef".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(111), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 1313, 1343) }, + Declaration { id: DeclarationId(988), name: Some("CensusListConstant".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 1480, 1506) }, + Declaration { id: DeclarationId(989), name: Some("expected_hand_authored_non_test".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(988), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(988)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 1508, 1569) }, + Declaration { id: DeclarationId(990), name: Some("expected_hand_authored_test".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(988), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(988)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 1570, 1627) }, + Declaration { id: DeclarationId(991), name: Some("LensProducerFilesSubsetPredicate".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 1759, 1799) }, + Declaration { id: DeclarationId(992), name: Some("lens_producer_files_subset_predicate".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(991), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(991)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 1801, 1881) }, + Declaration { id: DeclarationId(993), name: Some("CompilerStdPositiveSetRatchet".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 1960, 1997) }, + Declaration { id: DeclarationId(994), name: Some("compiler_std_positive_set_ratchet".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(993), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(993)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 1999, 2073) }, + Declaration { id: DeclarationId(995), name: Some("DiagnosticKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "TokenizerError".to_string(), ty: DeclarationId(2034) }, Field { label: "ParseError".to_string(), ty: DeclarationId(2035) }, Field { label: "TypeMismatch".to_string(), ty: DeclarationId(2036) }, Field { label: "UnitMismatch".to_string(), ty: DeclarationId(2037) }, Field { label: "ArityMismatch".to_string(), ty: DeclarationId(2038) }, Field { label: "ResolveError".to_string(), ty: DeclarationId(2039) }, Field { label: "NominalOpacityViolation".to_string(), ty: DeclarationId(2040) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2408, 2558) }, + Declaration { id: DeclarationId(996), name: Some("DiagnosticDetailExpectation".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "AnyDetail".to_string(), ty: DeclarationId(2041) }, Field { label: "Contains".to_string(), ty: DeclarationId(2042) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2927, 2994) }, + Declaration { id: DeclarationId(997), name: Some("DiagnosticReference".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "kind".to_string(), ty: DeclarationId(995) }, Field { label: "detail_contains".to_string(), ty: DeclarationId(996) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 3138, 3236) }, + Declaration { id: DeclarationId(998), name: Some("PortStateExpectation".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Resolved".to_string(), ty: DeclarationId(2043) }, Field { label: "Unresolved".to_string(), ty: DeclarationId(2044) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 3623, 3676) }, + Declaration { id: DeclarationId(999), name: Some("AlgebraicLawKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Associativity".to_string(), ty: DeclarationId(2045) }, Field { label: "Commutativity".to_string(), ty: DeclarationId(2046) }, Field { label: "Identity".to_string(), ty: DeclarationId(2047) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4465, 4535) }, + Declaration { id: DeclarationId(1000), name: Some("TestPredicate".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Compiles".to_string(), ty: DeclarationId(2048) }, Field { label: "FailsWithDiagnostic".to_string(), ty: DeclarationId(2049) }, Field { label: "OutputEquals".to_string(), ty: DeclarationId(2050) }, Field { label: "PortHasState".to_string(), ty: DeclarationId(2051) }, Field { label: "DeclarationHasRefinement".to_string(), ty: DeclarationId(2052) }, Field { label: "CostBounded".to_string(), ty: DeclarationId(2053) }, Field { label: "BehavioralObservation".to_string(), ty: DeclarationId(2054) }, Field { label: "MockBackedInvariant".to_string(), ty: DeclarationId(2055) }, Field { label: "ExecuteCommand".to_string(), ty: DeclarationId(2057) }, Field { label: "ForAllTargets".to_string(), ty: DeclarationId(2059) }, Field { label: "LensOutputEquals".to_string(), ty: DeclarationId(2060) }, Field { label: "DifferentialEquals".to_string(), ty: DeclarationId(2061) }, Field { label: "AlgebraicLaw".to_string(), ty: DeclarationId(2062) }, Field { label: "CensusBoundCheck".to_string(), ty: DeclarationId(2063) }, Field { label: "CensusSubsetCount".to_string(), ty: DeclarationId(2064) }, Field { label: "FixedPointConverges".to_string(), ty: DeclarationId(2065) }, Field { label: "RatchetZero".to_string(), ty: DeclarationId(2066) }, Field { label: "GeneratedFromDag".to_string(), ty: DeclarationId(2068) }, Field { label: "ReleaseDeferredClaim".to_string(), ty: DeclarationId(2069) }, Field { label: "SubstrateResearchDeferredClaim".to_string(), ty: DeclarationId(2070) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4537, 11180) }, + Declaration { id: DeclarationId(1001), name: Some("ProgramInput".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 11288, 11308) }, + Declaration { id: DeclarationId(1002), name: Some("ProgramOutputBind".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "output_ref".to_string(), ty: DeclarationId(1016) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 11451, 11506) }, + Declaration { id: DeclarationId(1003), name: Some("TestClaim".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "source".to_string(), ty: DeclarationId(186) }, Field { label: "file_name".to_string(), ty: DeclarationId(186) }, Field { label: "predicate".to_string(), ty: DeclarationId(1000) }, Field { label: "requires".to_string(), ty: DeclarationId(2071) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12116, 12249) }, + Declaration { id: DeclarationId(1004), name: Some("TestSuite".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "claims".to_string(), ty: DeclarationId(2072) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12251, 12310) }, + Declaration { id: DeclarationId(1005), name: Some("TestObligation".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "claim_name".to_string(), ty: DeclarationId(186) }, Field { label: "resources".to_string(), ty: DeclarationId(2073) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12508, 12589) }, + Declaration { id: DeclarationId(1006), name: Some("claim_obligation_resources".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1003)], output: DeclarationId(2031), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/verification.dag", 13031, 13047)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12960, 13047) }, + Declaration { id: DeclarationId(1007), name: Some("obligation_for_claim".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1003)], output: DeclarationId(1005), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/verification.dag", 13105, 13190)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 13049, 13190) }, + Declaration { id: DeclarationId(1008), name: Some("materialize_test_obligations".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(2032)], output: DeclarationId(2033), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/verification.dag", 13273, 13312)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 13192, 13312) }, + Declaration { id: DeclarationId(1009), name: Some("behavior_spine".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(726)], output: DeclarationId(2074), body: ArrowBody::UserDefined(NodeId(236)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/workflows.dag", 963, 1018) }, + Declaration { id: DeclarationId(1010), name: Some("Value".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/v3_l1.dag", 2788, 2801) }, + Declaration { id: DeclarationId(1011), name: Some("Transform".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/v3_l1.dag", 2802, 2819) }, + Declaration { id: DeclarationId(1012), name: Some("Branch".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/v3_l1.dag", 2820, 2834) }, + Declaration { id: DeclarationId(1013), name: Some("Loop".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/v3_l1.dag", 2835, 2847) }, + Declaration { id: DeclarationId(1014), name: Some("Bind".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/v3_l1.dag", 2848, 2860) }, + Declaration { id: DeclarationId(1015), name: Some("Main".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/v3_l1.dag", 2861, 2873) }, + Declaration { id: DeclarationId(1016), name: Some("DeclarationRef".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/v3_l1.dag", 3283, 3305) }, + Declaration { id: DeclarationId(1017), name: Some("go_execution_model".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(810), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(810)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("memory".to_string(), FieldValue::Variant { constructor: DeclarationId(1727), payload: vec![] }), ("scope".to_string(), FieldValue::Variant { constructor: DeclarationId(1730), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 1538, 1640) }, + Declaration { id: DeclarationId(1018), name: Some("go_source_filtering".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(812), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(812)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("internal".to_string(), FieldValue::Reference(DeclarationId(813))), ("additional_excluded_prefixes".to_string(), FieldValue::List(vec![FieldValue::Literal(LiteralBits::String("src/v3/compiler/".to_string()))]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 1642, 1792) }, + Declaration { id: DeclarationId(1019), name: Some("go_execution_requirement".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(814), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(814)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/go.dag", 1853, 1869))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 1794, 1869) }, + Declaration { id: DeclarationId(1020), name: Some("go_int".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("int64".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 1871, 2001) }, + Declaration { id: DeclarationId(1021), name: Some("go_bool".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(88))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("bool".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 2003, 2134) }, + Declaration { id: DeclarationId(1022), name: Some("go_string".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(186))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("string".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 2136, 2273) }, + Declaration { id: DeclarationId(1023), name: Some("go_node_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(625))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NodeId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 2275, 2413) }, + Declaration { id: DeclarationId(1024), name: Some("go_port_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(626))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PortId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 2415, 2553) }, + Declaration { id: DeclarationId(1025), name: Some("go_declaration_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(627))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("DeclarationId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 2555, 2714) }, + Declaration { id: DeclarationId(1026), name: Some("go_cluster_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(628))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ClusterId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 2716, 2863) }, + Declaration { id: DeclarationId(1027), name: Some("go_type_shape".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(682))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TypeShape".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("declaration".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("declaration".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 2865, 3106) }, + Declaration { id: DeclarationId(1028), name: Some("go_port_state".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(683))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PortState".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 3108, 3256) }, + Declaration { id: DeclarationId(1029), name: Some("go_port".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(684))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("DagPort".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("state".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("state".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("produced_by".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("produced_by".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 3258, 3641) }, + Declaration { id: DeclarationId(1030), name: Some("go_source_span".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(121))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SourceSpan".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("file".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("file".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("start".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("byte_start".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("end".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("byte_end".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 3643, 4037) }, + Declaration { id: DeclarationId(1031), name: Some("go_literal_bits".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(685))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("LiteralBits".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 4039, 4193) }, + Declaration { id: DeclarationId(1032), name: Some("go_atom_payload".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(686))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("AtomPayload".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 4195, 4349) }, + Declaration { id: DeclarationId(1033), name: Some("go_cardinality_bound".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(691))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("CardinalityBound".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 4351, 4520) }, + Declaration { id: DeclarationId(1034), name: Some("go_interval".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(689))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Interval".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 4522, 4666) }, + Declaration { id: DeclarationId(1035), name: Some("go_positive_interval_width".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(687))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PositiveIntervalWidth".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 4668, 4853) }, + Declaration { id: DeclarationId(1036), name: Some("go_interval_width".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(688))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("IntervalWidth".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 4855, 5015) }, + Declaration { id: DeclarationId(1037), name: Some("go_conj_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(692))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ConjField".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("label".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("label".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("ty".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("ty".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 5017, 5319) }, + Declaration { id: DeclarationId(1038), name: Some("go_template_argument".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(693))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TemplateArgument".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("parameter".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("parameter".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("value".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("value".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 5321, 5658) }, + Declaration { id: DeclarationId(1039), name: Some("go_phantom_parameter".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(700))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PhantomParameter".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("parameter".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("parameter".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("algebra".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("algebra".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 5660, 6001) }, + Declaration { id: DeclarationId(1040), name: Some("go_nominal_opacity".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(701))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NominalOpacity".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("permitted_accessors".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("permitted_accessors".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 6003, 6275) }, + Declaration { id: DeclarationId(1041), name: Some("go_field_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(694))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("FieldEntry".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("label".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("label".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("value".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("value".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 6277, 6588) }, + Declaration { id: DeclarationId(1042), name: Some("go_non_empty_list".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(629))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NonEmptyList".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("first".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("first".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("rest".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("rest".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 6590, 6906) }, + Declaration { id: DeclarationId(1043), name: Some("go_non_singleton_list".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(631))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NonSingletonList".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("first".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("first".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("second".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("second".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("rest".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("rest".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 6908, 7317) }, + Declaration { id: DeclarationId(1044), name: Some("go_param_ref".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(710))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ParamRef".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("member".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1778), payload: vec![FieldValue::Literal(LiteralBits::String("member_of".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("slot".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1778), payload: vec![FieldValue::Literal(LiteralBits::String("slot_of".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 7319, 7635) }, + Declaration { id: DeclarationId(1045), name: Some("go_transform_ref".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(711))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TransformRef".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("node".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1778), payload: vec![FieldValue::Literal(LiteralBits::String("node_id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 7637, 7878) }, + Declaration { id: DeclarationId(1046), name: Some("go_member_descent".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(714))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("MemberDescent".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("param".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("param".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 7880, 8121) }, + Declaration { id: DeclarationId(1047), name: Some("go_intra_cluster_call".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(715))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("IntraClusterCall".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("transform".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("transform".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 8123, 8382) }, + Declaration { id: DeclarationId(1048), name: Some("go_cluster".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(716))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Cluster".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("members".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("members".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("intra_cluster_calls".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("intra_cluster_calls".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 8384, 8717) }, + Declaration { id: DeclarationId(1049), name: Some("go_field_value".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(695))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("FieldValue".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 8719, 8870) }, + Declaration { id: DeclarationId(1050), name: Some("go_value_body".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(696))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ValueBody".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 8872, 9020) }, + Declaration { id: DeclarationId(1051), name: Some("go_arrow_body".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(697))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ArrowBody".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 9022, 9170) }, + Declaration { id: DeclarationId(1052), name: Some("go_type_connective".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(698))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TypeConnective".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 9172, 9335) }, + Declaration { id: DeclarationId(1053), name: Some("go_declaration".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(699))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Declaration".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("connective".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("connective".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("type_params".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("type_params".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("phantom_params".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("phantom_params".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("meta_tag".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("meta_tag".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("inhabits".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("inhabits".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("value_body".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("value_body".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("nominal_opacity".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("nominal_opacity".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 9337, 10354) }, + Declaration { id: DeclarationId(1054), name: Some("go_arithmetic_op".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(702))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ArithmeticOp".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 10356, 10513) }, + Declaration { id: DeclarationId(1055), name: Some("go_comparison_op".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(703))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ComparisonOp".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 10515, 10672) }, + Declaration { id: DeclarationId(1056), name: Some("go_logical_op".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(704))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("LogicalOp".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 10674, 10822) }, + Declaration { id: DeclarationId(1057), name: Some("go_operator_kind".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(705))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("OperatorKind".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 10824, 10981) }, + Declaration { id: DeclarationId(1058), name: Some("go_transform_target".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(706))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TransformTarget".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 10983, 11149) }, + Declaration { id: DeclarationId(1059), name: Some("go_branch_pattern".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(707))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BranchPattern".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 11151, 11311) }, + Declaration { id: DeclarationId(1060), name: Some("go_payload_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(708))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PayloadBinding".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("binding_name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("binding_name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("payload_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("payload_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 11313, 11664) }, + Declaration { id: DeclarationId(1061), name: Some("go_branch_path".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(709))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BranchPath".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("body".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("body".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("pattern".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("pattern".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("binding".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("binding".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 11666, 12153) }, + Declaration { id: DeclarationId(1062), name: Some("go_loop_bound".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(717))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("LoopBound".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 12155, 12303) }, + Declaration { id: DeclarationId(1063), name: Some("go_value_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(718))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ValueNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("payload".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("payload".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 12777, 13251) }, + Declaration { id: DeclarationId(1064), name: Some("go_transform_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(719))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TransformNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("target".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("target".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("inputs".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("inputs".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 13253, 13818) }, + Declaration { id: DeclarationId(1065), name: Some("go_branch_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(721))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BranchNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("input".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("input".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("paths".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("paths".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("emit_participation".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("emit_participation".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 13820, 14477) }, + Declaration { id: DeclarationId(1066), name: Some("go_loop_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(722))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("LoopNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("source".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("source".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("init".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("init".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("body".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("body".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("bound".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("bound".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 14479, 15181) }, + Declaration { id: DeclarationId(1067), name: Some("go_bind_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(724))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BindNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("params".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("params".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("emit_participation".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("emit_participation".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 15183, 15834) }, + Declaration { id: DeclarationId(1068), name: Some("go_behavior".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(725))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Behavior".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 15836, 15980) }, + Declaration { id: DeclarationId(1069), name: Some("go_dag".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(726))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Dag".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("declarations".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("declarations".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("nodes".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("nodes".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("ports".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("ports".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("clusters".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("clusters".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 15982, 16449) }, + Declaration { id: DeclarationId(1070), name: Some("go_surface_module".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(945))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceModule".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("items".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("items".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 16752, 16993) }, + Declaration { id: DeclarationId(1071), name: Some("go_surface_item".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(958))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceItem".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 16995, 17149) }, + Declaration { id: DeclarationId(1072), name: Some("go_surface_param".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(946))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceParam".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("ty".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("ty".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("refinement".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("refinement".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 17151, 17549) }, + Declaration { id: DeclarationId(1073), name: Some("go_surface_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(947))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceField".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("ty".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("ty".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 17551, 17860) }, + Declaration { id: DeclarationId(1074), name: Some("go_surface_variant".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(948))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceVariant".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("payload".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("payload".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 17862, 18264) }, + Declaration { id: DeclarationId(1075), name: Some("go_variant_payload".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(949))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("VariantPayload".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 18266, 18429) }, + Declaration { id: DeclarationId(1076), name: Some("go_surface_type".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(950))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceType".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 18431, 18585) }, + Declaration { id: DeclarationId(1077), name: Some("go_surface_record_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(951))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceRecordField".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("value".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("value".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 18587, 18998) }, + Declaration { id: DeclarationId(1078), name: Some("go_surface_map_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(952))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceMapEntry".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("key".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("key".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("key_span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("key_span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("value".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("value".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 19000, 19485) }, + Declaration { id: DeclarationId(1079), name: Some("go_surface_match_arm".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(953))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceMatchArm".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("pattern".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("pattern".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("body".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("body".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 19487, 19893) }, + Declaration { id: DeclarationId(1080), name: Some("go_surface_pattern_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(954))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfacePatternField".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("binding".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("binding".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 19895, 20313) }, + Declaration { id: DeclarationId(1081), name: Some("go_surface_pattern".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(955))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfacePattern".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 20315, 20478) }, + Declaration { id: DeclarationId(1082), name: Some("go_surface_literal".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(956))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceLiteral".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 20480, 20643) }, + Declaration { id: DeclarationId(1083), name: Some("go_surface_expr".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(957))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceExpr".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 20645, 20799) }, + Declaration { id: DeclarationId(1084), name: Some("go_int_add".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(298))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} + {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 20801, 20942) }, + Declaration { id: DeclarationId(1085), name: Some("go_int_sub".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(299))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} - {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 20944, 21085) }, + Declaration { id: DeclarationId(1086), name: Some("go_int_mul".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(301))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} * {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 21087, 21228) }, + Declaration { id: DeclarationId(1087), name: Some("go_int_div".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(303))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("v3intdiv({lhs}, {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 21230, 21378) }, + Declaration { id: DeclarationId(1088), name: Some("go_int_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(305))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 21380, 21520) }, + Declaration { id: DeclarationId(1089), name: Some("go_node_id_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(625))), ("op".to_string(), FieldValue::Reference(DeclarationId(305))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 21522, 21669) }, + Declaration { id: DeclarationId(1090), name: Some("go_port_id_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(626))), ("op".to_string(), FieldValue::Reference(DeclarationId(305))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 21671, 21818) }, + Declaration { id: DeclarationId(1091), name: Some("go_declaration_id_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(627))), ("op".to_string(), FieldValue::Reference(DeclarationId(305))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 21820, 21981) }, + Declaration { id: DeclarationId(1092), name: Some("go_int_ne".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(306))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} != {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 21983, 22123) }, + Declaration { id: DeclarationId(1093), name: Some("go_node_id_ne".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(625))), ("op".to_string(), FieldValue::Reference(DeclarationId(306))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} != {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 22125, 22272) }, + Declaration { id: DeclarationId(1094), name: Some("go_port_id_ne".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(626))), ("op".to_string(), FieldValue::Reference(DeclarationId(306))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} != {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 22274, 22421) }, + Declaration { id: DeclarationId(1095), name: Some("go_declaration_id_ne".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(627))), ("op".to_string(), FieldValue::Reference(DeclarationId(306))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} != {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 22423, 22584) }, + Declaration { id: DeclarationId(1096), name: Some("go_int_lt".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(307))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} < {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 22586, 22725) }, + Declaration { id: DeclarationId(1097), name: Some("go_int_le".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(308))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} <= {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 22727, 22867) }, + Declaration { id: DeclarationId(1098), name: Some("go_int_gt".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(309))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} > {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 22869, 23008) }, + Declaration { id: DeclarationId(1099), name: Some("go_int_ge".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(310))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} >= {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 23010, 23150) }, + Declaration { id: DeclarationId(1100), name: Some("go_bool_meet".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(88))), ("op".to_string(), FieldValue::Reference(DeclarationId(320))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} && {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 23152, 23301) }, + Declaration { id: DeclarationId(1101), name: Some("go_bool_join".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(88))), ("op".to_string(), FieldValue::Reference(DeclarationId(321))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} || {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 23303, 23452) }, + Declaration { id: DeclarationId(1102), name: Some("go_let_stmt".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(854), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(854)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(1014))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("var {name} {type} = {value}".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(0)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 23454, 23587) }, + Declaration { id: DeclarationId(1103), name: Some("go_if_expr".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(854), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(854)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(1012))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("if {cond} { {then} } else { {else} }".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(0)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 23589, 23732) }, + Declaration { id: DeclarationId(1104), name: Some("go_main_wrap".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(854), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(854)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(1015))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("func main() {\n{body}\nfmt.Println({final})\n}".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(0)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 23734, 23887) }, + Declaration { id: DeclarationId(1105), name: Some("go_empty_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(591))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 23889, 24027) }, + Declaration { id: DeclarationId(1106), name: Some("go_singleton_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(595))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1783), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1781), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 24029, 24221) }, + Declaration { id: DeclarationId(1107), name: Some("go_cons_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(593))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1781), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1781), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 24223, 24440) }, + Declaration { id: DeclarationId(1108), name: Some("go_concat_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(603))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1785), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1781), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1781), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 24442, 24665) }, + Declaration { id: DeclarationId(1109), name: Some("go_length_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(613))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1786), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1780), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 24667, 24850) }, + Declaration { id: DeclarationId(1110), name: Some("go_list_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(589))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("[]{element}".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 24852, 24988) }, + Declaration { id: DeclarationId(1111), name: Some("go_result_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(11))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("v3Result[{key}, {value}]".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 25674, 25827) }, + Declaration { id: DeclarationId(1112), name: Some("go_map_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(97))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("map[{key}]{value}".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 25829, 25969) }, + Declaration { id: DeclarationId(1113), name: Some("go_is_empty_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(615))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1787), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1780), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 25971, 26159) }, + Declaration { id: DeclarationId(1114), name: Some("go_fold_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(597))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1788), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1780), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1781), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(2))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1780), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 26161, 26418) }, + Declaration { id: DeclarationId(1115), name: Some("go_map_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(605))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1780), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1780), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 26420, 26634) }, + Declaration { id: DeclarationId(1116), name: Some("go_filter_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(608))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1790), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1780), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1780), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 26636, 26859) }, + Declaration { id: DeclarationId(1117), name: Some("go_contains_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(623))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1791), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1780), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1780), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 26861, 27090) }, + Declaration { id: DeclarationId(1118), name: Some("go_list_pattern".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("target".to_string(), FieldValue::Reference(DeclarationId(589))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1793), payload: vec![] }), ("empty_variant".to_string(), FieldValue::Reference(DeclarationId(1419))), ("cons_variant".to_string(), FieldValue::Reference(DeclarationId(1421))), ("scrutinee".to_string(), FieldValue::Literal(LiteralBits::String("{expr}".to_string()))), ("empty_pattern".to_string(), FieldValue::Literal(LiteralBits::String("len({expr}) == 0".to_string()))), ("cons_pattern".to_string(), FieldValue::Literal(LiteralBits::String("{expr}".to_string()))), ("head_expr".to_string(), FieldValue::Literal(LiteralBits::String("{list}[0]".to_string()))), ("tail_expr".to_string(), FieldValue::Literal(LiteralBits::String("{list}[1:]".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 27177, 27483) }, + Declaration { id: DeclarationId(1119), name: Some("go_statements".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(862), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(862)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("let_binding".to_string(), FieldValue::Literal(LiteralBits::String("var {name} {type} = {value}".to_string()))), ("let_binding_inferred".to_string(), FieldValue::Literal(LiteralBits::String("{name} := {value}".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 27485, 27615) }, + Declaration { id: DeclarationId(1120), name: Some("go_expressions".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(863), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(863)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("field_access".to_string(), FieldValue::Literal(LiteralBits::String("({object}).{field}".to_string()))), ("function_call".to_string(), FieldValue::Literal(LiteralBits::String("{func}({args})".to_string()))), ("closure".to_string(), FieldValue::Literal(LiteralBits::String("func({params}) { return {body} }".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 27617, 27777) }, + Declaration { id: DeclarationId(1121), name: Some("go_control_flow".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(865), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(865)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("if_else".to_string(), FieldValue::Literal(LiteralBits::String("if {cond} { {then} } else { {else} }".to_string()))), ("match_arm".to_string(), FieldValue::Literal(LiteralBits::String("{pattern}: return {body}".to_string()))), ("for_each_syntax".to_string(), FieldValue::Record(vec![("prefix".to_string(), FieldValue::Literal(LiteralBits::String("for _, ".to_string()))), ("separator".to_string(), FieldValue::Literal(LiteralBits::String(" := range ".to_string())))]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 27779, 27980) }, + Declaration { id: DeclarationId(1122), name: Some("go_literals".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(866), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(866)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("true_keyword".to_string(), FieldValue::Literal(LiteralBits::String("true".to_string()))), ("false_keyword".to_string(), FieldValue::Literal(LiteralBits::String("false".to_string()))), ("string_delimiter".to_string(), FieldValue::Literal(LiteralBits::String("%Q".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 27982, 28092) }, + Declaration { id: DeclarationId(1123), name: Some("go_modules".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(867), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(867)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("path_separator".to_string(), FieldValue::Literal(LiteralBits::String(".".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 28094, 28151) }, + Declaration { id: DeclarationId(1124), name: Some("go_functions".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(868), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(868)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("definition".to_string(), FieldValue::Literal(LiteralBits::String("func {name}({params}) {ret} { return {body} }".to_string()))), ("definition_exported".to_string(), FieldValue::Literal(LiteralBits::String("func {name}({params}) {ret} { return {body} }".to_string()))), ("definition_void".to_string(), FieldValue::Literal(LiteralBits::String("func {name}({params}) { {body} }".to_string()))), ("param_with_type".to_string(), FieldValue::Literal(LiteralBits::String("{name} {type}".to_string()))), ("param_separator".to_string(), FieldValue::Literal(LiteralBits::String(", ".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 28153, 28438) }, + Declaration { id: DeclarationId(1125), name: Some("go_type_applications".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(869), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(869)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("optional".to_string(), FieldValue::Literal(LiteralBits::String("*{element}".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 28440, 28519) }, + Declaration { id: DeclarationId(1126), name: Some("go_type_defs".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(870), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(870)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("struct_def".to_string(), FieldValue::Literal(LiteralBits::String("type {name} struct { {fields} }".to_string()))), ("struct_field".to_string(), FieldValue::Literal(LiteralBits::String("{name} {type}".to_string()))), ("enum_def".to_string(), FieldValue::Literal(LiteralBits::String("type {name} interface{}".to_string()))), ("enum_unit_variant".to_string(), FieldValue::Literal(LiteralBits::String("{name}".to_string()))), ("enum_data_variant".to_string(), FieldValue::Literal(LiteralBits::String("{name}".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 28521, 28744) }, + Declaration { id: DeclarationId(1127), name: Some("go_patterns".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(872), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(872)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("match_expr".to_string(), FieldValue::Literal(LiteralBits::String("{expr}".to_string()))), ("match_arm".to_string(), FieldValue::Literal(LiteralBits::String("{pattern}: return {body}".to_string()))), ("variant_pattern".to_string(), FieldValue::Literal(LiteralBits::String("{name}".to_string()))), ("variant_pattern_positional".to_string(), FieldValue::Literal(LiteralBits::String("{name}".to_string()))), ("variant_pattern_empty".to_string(), FieldValue::Literal(LiteralBits::String("{name}".to_string()))), ("field_binding".to_string(), FieldValue::Literal(LiteralBits::String("{field}: {binding}".to_string()))), ("field_binding_separator".to_string(), FieldValue::Literal(LiteralBits::String(", ".to_string()))), ("wildcard".to_string(), FieldValue::Literal(LiteralBits::String("_".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 28746, 29038) }, + Declaration { id: DeclarationId(1128), name: Some("go_collection_ops".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(873), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(873)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("concat".to_string(), FieldValue::Literal(LiteralBits::String("append({left}, {right}...)".to_string()))), ("length".to_string(), FieldValue::Literal(LiteralBits::String("int64(len({recv}))".to_string()))), ("is_empty".to_string(), FieldValue::Literal(LiteralBits::String("len({recv}) == 0".to_string()))), ("fold".to_string(), FieldValue::Literal(LiteralBits::String("/* fold({recv}, {init}, {body}) */".to_string()))), ("map".to_string(), FieldValue::Literal(LiteralBits::String("/* map({recv}, {body}) */".to_string()))), ("filter".to_string(), FieldValue::Literal(LiteralBits::String("/* filter({recv}, {body}) */".to_string()))), ("contains".to_string(), FieldValue::Literal(LiteralBits::String("/* contains({recv}, {item}) */".to_string()))), ("empty_list".to_string(), FieldValue::Literal(LiteralBits::String("nil".to_string()))), ("list_literal".to_string(), FieldValue::Literal(LiteralBits::String("[]{element_type}{{{elements}}}".to_string()))), ("cons".to_string(), FieldValue::Literal(LiteralBits::String("append([]{element_type}{{{head}}}, {tail}...)".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 29040, 29475) }, + Declaration { id: DeclarationId(1129), name: Some("go_value_construction".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(874), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(874)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("struct_literal".to_string(), FieldValue::Literal(LiteralBits::String("{type}{{ {fields} }}".to_string()))), ("struct_field_init".to_string(), FieldValue::Literal(LiteralBits::String("{name}: {value}".to_string()))), ("struct_field_separator".to_string(), FieldValue::Literal(LiteralBits::String(", ".to_string()))), ("variant_construction".to_string(), FieldValue::Literal(LiteralBits::String("{variant}({args})".to_string()))), ("variant_named_construction".to_string(), FieldValue::Literal(LiteralBits::String("{variant}{{ {fields} }}".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 29477, 29745) }, + Declaration { id: DeclarationId(1130), name: Some("go_record_derive_templates".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(871), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(871)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("struct_def_no_debug".to_string(), FieldValue::Literal(LiteralBits::String("".to_string()))), ("enum_def_no_debug".to_string(), FieldValue::Literal(LiteralBits::String("".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 30502, 30617) }, + Declaration { id: DeclarationId(1131), name: Some("go_language".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(878), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(878)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("statements".to_string(), FieldValue::Reference(DeclarationId(1119))), ("expressions".to_string(), FieldValue::Reference(DeclarationId(1120))), ("control_flow".to_string(), FieldValue::Reference(DeclarationId(1121))), ("literals".to_string(), FieldValue::Reference(DeclarationId(1122))), ("modules".to_string(), FieldValue::Reference(DeclarationId(1123))), ("functions".to_string(), FieldValue::Reference(DeclarationId(1124))), ("type_applications".to_string(), FieldValue::Reference(DeclarationId(1125))), ("type_definitions".to_string(), FieldValue::Reference(DeclarationId(1126))), ("record_derive_templates".to_string(), FieldValue::Reference(DeclarationId(1130))), ("patterns".to_string(), FieldValue::Reference(DeclarationId(1127))), ("collection_ops".to_string(), FieldValue::Reference(DeclarationId(1128))), ("values".to_string(), FieldValue::Reference(DeclarationId(1129)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 30619, 31038) }, + Declaration { id: DeclarationId(1132), name: Some("go_correction_style".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(784), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(784)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("indent_unit".to_string(), FieldValue::Literal(LiteralBits::String("\t".to_string()))), ("line_ending".to_string(), FieldValue::Literal(LiteralBits::String("\n".to_string()))), ("string_quote".to_string(), FieldValue::Literal(LiteralBits::String("%Q".to_string()))), ("trailing_semicolon".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 32705, 32841) }, + Declaration { id: DeclarationId(1133), name: Some("go_clean_emission".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(775), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(775)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("expression_wrapping".to_string(), FieldValue::Variant { constructor: DeclarationId(1663), payload: vec![] }), ("pattern_bindings".to_string(), FieldValue::Variant { constructor: DeclarationId(1666), payload: vec![] }), ("variant_payload_field_access".to_string(), FieldValue::Variant { constructor: DeclarationId(1669), payload: vec![] }), ("imports".to_string(), FieldValue::Variant { constructor: DeclarationId(1672), payload: vec![] }), ("block_return".to_string(), FieldValue::Variant { constructor: DeclarationId(1676), payload: vec![] }), ("variable_bindings".to_string(), FieldValue::Variant { constructor: DeclarationId(1678), payload: vec![] }), ("match_arm_body".to_string(), FieldValue::Variant { constructor: DeclarationId(1682), payload: vec![] }), ("correction_style".to_string(), FieldValue::Reference(DeclarationId(1132))), ("post_emit_verifier".to_string(), FieldValue::Record(vec![("command".to_string(), FieldValue::Literal(LiteralBits::String("gofmt".to_string()))), ("args".to_string(), FieldValue::List(vec![FieldValue::Literal(LiteralBits::String("-l".to_string()))])), ("syntax_only".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("expected_exit_code".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("output_policy".to_string(), FieldValue::Variant { constructor: DeclarationId(1685), payload: vec![] })]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 32843, 33401) }, + Declaration { id: DeclarationId(1134), name: Some("go_clean_emission_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(776), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(776)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1131))), ("clean_emission".to_string(), FieldValue::Reference(DeclarationId(1133)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 33403, 33527) }, + Declaration { id: DeclarationId(1135), name: Some("python_statements".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(862), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(862)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("let_binding".to_string(), FieldValue::Literal(LiteralBits::String("{name} = {value}".to_string()))), ("let_binding_inferred".to_string(), FieldValue::Literal(LiteralBits::String("{name} = {value}".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 1797, 1919) }, + Declaration { id: DeclarationId(1136), name: Some("python_expressions".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(863), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(863)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("field_access".to_string(), FieldValue::Literal(LiteralBits::String("{object}.{field}".to_string()))), ("function_call".to_string(), FieldValue::Literal(LiteralBits::String("{func}({args})".to_string()))), ("closure".to_string(), FieldValue::Literal(LiteralBits::String("lambda {params}: {body}".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 1921, 2074) }, + Declaration { id: DeclarationId(1137), name: Some("python_control_flow".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(865), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(865)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("if_else".to_string(), FieldValue::Literal(LiteralBits::String("({then} if {cond} else {else})".to_string()))), ("match_arm".to_string(), FieldValue::Literal(LiteralBits::String("{pattern}: {body}".to_string()))), ("for_each_syntax".to_string(), FieldValue::Record(vec![("prefix".to_string(), FieldValue::Literal(LiteralBits::String("for {item} in {iter}:\n{body}".to_string()))), ("separator".to_string(), FieldValue::Literal(LiteralBits::String("\n".to_string())))]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 2076, 2291) }, + Declaration { id: DeclarationId(1138), name: Some("python_literals".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(866), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(866)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("true_keyword".to_string(), FieldValue::Literal(LiteralBits::String("True".to_string()))), ("false_keyword".to_string(), FieldValue::Literal(LiteralBits::String("False".to_string()))), ("string_delimiter".to_string(), FieldValue::Literal(LiteralBits::String("%Q".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 2293, 2407) }, + Declaration { id: DeclarationId(1139), name: Some("python_modules".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(867), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(867)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("path_separator".to_string(), FieldValue::Literal(LiteralBits::String(".".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 2409, 2470) }, + Declaration { id: DeclarationId(1140), name: Some("python_functions".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(868), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(868)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("definition".to_string(), FieldValue::Literal(LiteralBits::String("def {name}({params}) -> {ret}:\n return {body}".to_string()))), ("definition_exported".to_string(), FieldValue::Literal(LiteralBits::String("def {name}({params}) -> {ret}:\n return {body}".to_string()))), ("definition_void".to_string(), FieldValue::Literal(LiteralBits::String("def {name}({params}) -> None:\n {body}".to_string()))), ("param_with_type".to_string(), FieldValue::Literal(LiteralBits::String("{name}: {type}".to_string()))), ("param_separator".to_string(), FieldValue::Literal(LiteralBits::String(", ".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 2472, 2779) }, + Declaration { id: DeclarationId(1141), name: Some("python_type_applications".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(869), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(869)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("optional".to_string(), FieldValue::Literal(LiteralBits::String("typing.Optional[{element}]".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 2781, 2880) }, + Declaration { id: DeclarationId(1142), name: Some("python_type_definitions".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(870), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(870)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("struct_def".to_string(), FieldValue::Literal(LiteralBits::String("@dataclass\nclass {name}:\n{fields}".to_string()))), ("struct_field".to_string(), FieldValue::Literal(LiteralBits::String("{name}: {type}".to_string()))), ("enum_def".to_string(), FieldValue::Literal(LiteralBits::String("class {name}:\n pass\n\n{variants}".to_string()))), ("enum_unit_variant".to_string(), FieldValue::Literal(LiteralBits::String("@dataclass\nclass {name}({parent}):\n pass".to_string()))), ("enum_data_variant".to_string(), FieldValue::Literal(LiteralBits::String("@dataclass\nclass {name}({parent}):\n{fields}".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 2882, 3213) }, + Declaration { id: DeclarationId(1143), name: Some("python_patterns".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(872), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(872)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("match_expr".to_string(), FieldValue::Literal(LiteralBits::String("match {expr} { {arms} }".to_string()))), ("match_arm".to_string(), FieldValue::Literal(LiteralBits::String("{pattern}: {body}".to_string()))), ("variant_pattern".to_string(), FieldValue::Literal(LiteralBits::String("{name}({bindings})".to_string()))), ("variant_pattern_positional".to_string(), FieldValue::Literal(LiteralBits::String("{name}({binding})".to_string()))), ("variant_pattern_empty".to_string(), FieldValue::Literal(LiteralBits::String("{name}()".to_string()))), ("field_binding".to_string(), FieldValue::Literal(LiteralBits::String("{field}={binding}".to_string()))), ("field_binding_separator".to_string(), FieldValue::Literal(LiteralBits::String(", ".to_string()))), ("wildcard".to_string(), FieldValue::Literal(LiteralBits::String("_".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 3215, 3545) }, + Declaration { id: DeclarationId(1144), name: Some("python_collections".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(873), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(873)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("concat".to_string(), FieldValue::Literal(LiteralBits::String("[*{left}, *{right}]".to_string()))), ("length".to_string(), FieldValue::Literal(LiteralBits::String("len({recv})".to_string()))), ("is_empty".to_string(), FieldValue::Literal(LiteralBits::String("(len({recv}) == 0)".to_string()))), ("fold".to_string(), FieldValue::Literal(LiteralBits::String("__v3_fold({recv}, {init}, {body})".to_string()))), ("map".to_string(), FieldValue::Literal(LiteralBits::String("[{body} for {item} in {recv}]".to_string()))), ("filter".to_string(), FieldValue::Literal(LiteralBits::String("[{item_push} for {item} in {recv} if {predicate}]".to_string()))), ("contains".to_string(), FieldValue::Literal(LiteralBits::String("({item} in {recv})".to_string()))), ("empty_list".to_string(), FieldValue::Literal(LiteralBits::String("[]".to_string()))), ("list_literal".to_string(), FieldValue::Literal(LiteralBits::String("[{elements}]".to_string()))), ("cons".to_string(), FieldValue::Literal(LiteralBits::String("[{head}, *{tail}]".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 3547, 3936) }, + Declaration { id: DeclarationId(1145), name: Some("python_value_construction".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(874), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(874)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("struct_literal".to_string(), FieldValue::Literal(LiteralBits::String("{name}({fields})".to_string()))), ("struct_field_init".to_string(), FieldValue::Literal(LiteralBits::String("{field}={value}".to_string()))), ("struct_field_separator".to_string(), FieldValue::Literal(LiteralBits::String(", ".to_string()))), ("variant_construction".to_string(), FieldValue::Literal(LiteralBits::String("{name}()".to_string()))), ("variant_named_construction".to_string(), FieldValue::Literal(LiteralBits::String("{name}({fields})".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 3938, 4190) }, + Declaration { id: DeclarationId(1146), name: Some("python_record_derive_templates".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(871), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(871)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("struct_def_no_debug".to_string(), FieldValue::Literal(LiteralBits::String("".to_string()))), ("enum_def_no_debug".to_string(), FieldValue::Literal(LiteralBits::String("".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 4393, 4512) }, + Declaration { id: DeclarationId(1147), name: Some("python_language".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(878), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(878)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("statements".to_string(), FieldValue::Reference(DeclarationId(1135))), ("expressions".to_string(), FieldValue::Reference(DeclarationId(1136))), ("control_flow".to_string(), FieldValue::Reference(DeclarationId(1137))), ("literals".to_string(), FieldValue::Reference(DeclarationId(1138))), ("modules".to_string(), FieldValue::Reference(DeclarationId(1139))), ("functions".to_string(), FieldValue::Reference(DeclarationId(1140))), ("type_applications".to_string(), FieldValue::Reference(DeclarationId(1141))), ("type_definitions".to_string(), FieldValue::Reference(DeclarationId(1142))), ("record_derive_templates".to_string(), FieldValue::Reference(DeclarationId(1146))), ("patterns".to_string(), FieldValue::Reference(DeclarationId(1143))), ("collection_ops".to_string(), FieldValue::Reference(DeclarationId(1144))), ("values".to_string(), FieldValue::Reference(DeclarationId(1145)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 4514, 4989) }, + Declaration { id: DeclarationId(1148), name: Some("python_target".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(810), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(810)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("memory".to_string(), FieldValue::Variant { constructor: DeclarationId(1727), payload: vec![] }), ("scope".to_string(), FieldValue::Variant { constructor: DeclarationId(1730), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 4991, 5088) }, + Declaration { id: DeclarationId(1149), name: Some("python_source_filtering".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(812), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(812)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("internal".to_string(), FieldValue::Reference(DeclarationId(813))), ("additional_excluded_prefixes".to_string(), FieldValue::List(vec![]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 5090, 5226) }, + Declaration { id: DeclarationId(1150), name: Some("python_execution_requirement".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(814), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(814)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/python.dag", 5291, 5307))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 5228, 5307) }, + Declaration { id: DeclarationId(1151), name: Some("python_int".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("int".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 5309, 5445) }, + Declaration { id: DeclarationId(1152), name: Some("python_bool".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(88))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("bool".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 5447, 5586) }, + Declaration { id: DeclarationId(1153), name: Some("python_string".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(186))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("str".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 5588, 5730) }, + Declaration { id: DeclarationId(1154), name: Some("python_node_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(625))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NodeId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 5732, 5878) }, + Declaration { id: DeclarationId(1155), name: Some("python_port_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(626))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PortId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 5880, 6026) }, + Declaration { id: DeclarationId(1156), name: Some("python_declaration_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(627))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("DeclarationId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 6028, 6195) }, + Declaration { id: DeclarationId(1157), name: Some("python_declaration_ref".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(1016))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("DeclarationId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 6197, 6366) }, + Declaration { id: DeclarationId(1158), name: Some("python_source_span".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(121))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SourceSpan".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 6368, 6527) }, + Declaration { id: DeclarationId(1159), name: Some("python_dag_port".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(684))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("DagPort".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 6529, 6679) }, + Declaration { id: DeclarationId(1160), name: Some("python_branch_path".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(709))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BranchPath".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 6681, 6840) }, + Declaration { id: DeclarationId(1161), name: Some("python_value_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(718))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ValueNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 6842, 6998) }, + Declaration { id: DeclarationId(1162), name: Some("python_transform_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(719))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TransformNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 7000, 7168) }, + Declaration { id: DeclarationId(1163), name: Some("python_branch_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(721))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BranchNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 7170, 7329) }, + Declaration { id: DeclarationId(1164), name: Some("python_loop_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(722))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("LoopNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 7331, 7484) }, + Declaration { id: DeclarationId(1165), name: Some("python_bind_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(724))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BindNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 7486, 7639) }, + Declaration { id: DeclarationId(1166), name: Some("python_behavior".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(725))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Behavior".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 7641, 7793) }, + Declaration { id: DeclarationId(1167), name: Some("python_dag".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(726))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Dag".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 7795, 7932) }, + Declaration { id: DeclarationId(1168), name: Some("python_surface_module".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(945))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceModule".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("items".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("items".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 8006, 8255) }, + Declaration { id: DeclarationId(1169), name: Some("python_surface_item".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(958))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceItem".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 8257, 8419) }, + Declaration { id: DeclarationId(1170), name: Some("python_surface_param".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(946))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceParam".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("ty".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("ty".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("refinement".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("refinement".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 8421, 8827) }, + Declaration { id: DeclarationId(1171), name: Some("python_surface_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(947))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceField".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("ty".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("ty".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 8829, 9146) }, + Declaration { id: DeclarationId(1172), name: Some("python_surface_variant".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(948))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceVariant".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("payload".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("payload".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 9148, 9558) }, + Declaration { id: DeclarationId(1173), name: Some("python_variant_payload".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(949))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("VariantPayload".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 9560, 9731) }, + Declaration { id: DeclarationId(1174), name: Some("python_surface_type".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(950))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceType".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 9733, 9895) }, + Declaration { id: DeclarationId(1175), name: Some("python_surface_record_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(951))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceRecordField".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("value".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("value".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 9897, 10316) }, + Declaration { id: DeclarationId(1176), name: Some("python_surface_map_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(952))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceMapEntry".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("key".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("key".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("key_span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("key_span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("value".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("value".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 10318, 10811) }, + Declaration { id: DeclarationId(1177), name: Some("python_surface_match_arm".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(953))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceMatchArm".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("pattern".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("pattern".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("body".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("body".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 10813, 11227) }, + Declaration { id: DeclarationId(1178), name: Some("python_surface_pattern_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(954))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfacePatternField".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("binding".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("binding".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 11229, 11655) }, + Declaration { id: DeclarationId(1179), name: Some("python_surface_pattern".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(955))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfacePattern".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 11657, 11828) }, + Declaration { id: DeclarationId(1180), name: Some("python_surface_literal".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(956))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceLiteral".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 11830, 12001) }, + Declaration { id: DeclarationId(1181), name: Some("python_surface_expr".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(957))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SurfaceExpr".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 12003, 12165) }, + Declaration { id: DeclarationId(1182), name: Some("python_int_add".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(298))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} + {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 12167, 12316) }, + Declaration { id: DeclarationId(1183), name: Some("python_int_sub".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(299))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} - {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 12318, 12467) }, + Declaration { id: DeclarationId(1184), name: Some("python_int_mul".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(301))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} * {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 12469, 12618) }, + Declaration { id: DeclarationId(1185), name: Some("python_int_div".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(303))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("(__v3_idiv({lhs}, {rhs}))".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 12620, 12779) }, + Declaration { id: DeclarationId(1186), name: Some("python_int_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(305))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 12781, 12929) }, + Declaration { id: DeclarationId(1187), name: Some("python_node_id_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(625))), ("op".to_string(), FieldValue::Reference(DeclarationId(305))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 12931, 13086) }, + Declaration { id: DeclarationId(1188), name: Some("python_port_id_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(626))), ("op".to_string(), FieldValue::Reference(DeclarationId(305))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 13088, 13243) }, + Declaration { id: DeclarationId(1189), name: Some("python_declaration_id_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(627))), ("op".to_string(), FieldValue::Reference(DeclarationId(305))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 13245, 13414) }, + Declaration { id: DeclarationId(1190), name: Some("python_int_ne".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(306))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} != {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 13416, 13564) }, + Declaration { id: DeclarationId(1191), name: Some("python_int_lt".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(307))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} < {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 13566, 13713) }, + Declaration { id: DeclarationId(1192), name: Some("python_int_le".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(308))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} <= {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 13715, 13863) }, + Declaration { id: DeclarationId(1193), name: Some("python_int_gt".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(309))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} > {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 13865, 14012) }, + Declaration { id: DeclarationId(1194), name: Some("python_int_ge".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(310))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} >= {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 14014, 14162) }, + Declaration { id: DeclarationId(1195), name: Some("python_bool_meet".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(88))), ("op".to_string(), FieldValue::Reference(DeclarationId(320))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} and {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 14164, 14322) }, + Declaration { id: DeclarationId(1196), name: Some("python_bool_join".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(88))), ("op".to_string(), FieldValue::Reference(DeclarationId(321))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} or {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 14324, 14481) }, + Declaration { id: DeclarationId(1197), name: Some("python_empty_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(591))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 14483, 14629) }, + Declaration { id: DeclarationId(1198), name: Some("python_singleton_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(595))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1783), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1781), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 14631, 14831) }, + Declaration { id: DeclarationId(1199), name: Some("python_cons_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(593))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1781), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1781), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 14833, 15058) }, + Declaration { id: DeclarationId(1200), name: Some("python_concat_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(603))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1785), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1781), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1781), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 15060, 15291) }, + Declaration { id: DeclarationId(1201), name: Some("python_length_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(613))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1786), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1780), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 15293, 15484) }, + Declaration { id: DeclarationId(1202), name: Some("python_is_empty_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(615))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1787), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1780), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 15486, 15682) }, + Declaration { id: DeclarationId(1203), name: Some("python_fold_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(597))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1788), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1780), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1781), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(2))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1780), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 15684, 15949) }, + Declaration { id: DeclarationId(1204), name: Some("python_map_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(605))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1780), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1780), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 15951, 16173) }, + Declaration { id: DeclarationId(1205), name: Some("python_filter_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(608))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1790), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1780), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1780), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 16175, 16406) }, + Declaration { id: DeclarationId(1206), name: Some("python_contains_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(623))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1791), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1780), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1780), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 16408, 16645) }, + Declaration { id: DeclarationId(1207), name: Some("python_list_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(589))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("list[{element}]".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 16647, 16795) }, + Declaration { id: DeclarationId(1208), name: Some("python_result_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(11))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("typing.Union[typing.Tuple[typing.Literal['Ok'], {key}], typing.Tuple[typing.Literal['Err'], {value}]]".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 16911, 17149) }, + Declaration { id: DeclarationId(1209), name: Some("python_non_empty_list_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(629))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NonEmptyList[{element}]".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 17240, 17414) }, + Declaration { id: DeclarationId(1210), name: Some("python_non_singleton_list_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(631))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NonSingletonList[{element}]".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 17416, 17602) }, + Declaration { id: DeclarationId(1211), name: Some("python_list_pattern".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("target".to_string(), FieldValue::Reference(DeclarationId(589))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1793), payload: vec![] }), ("empty_variant".to_string(), FieldValue::Reference(DeclarationId(1419))), ("cons_variant".to_string(), FieldValue::Reference(DeclarationId(1421))), ("scrutinee".to_string(), FieldValue::Literal(LiteralBits::String("{expr}".to_string()))), ("empty_pattern".to_string(), FieldValue::Literal(LiteralBits::String("len({expr}) == 0".to_string()))), ("cons_pattern".to_string(), FieldValue::Literal(LiteralBits::String("{expr}".to_string()))), ("head_expr".to_string(), FieldValue::Literal(LiteralBits::String("{list}[0]".to_string()))), ("tail_expr".to_string(), FieldValue::Literal(LiteralBits::String("{list}[1:]".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 17603, 17917) }, + Declaration { id: DeclarationId(1212), name: Some("python_correction_style".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(784), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(784)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("indent_unit".to_string(), FieldValue::Literal(LiteralBits::String(" ".to_string()))), ("line_ending".to_string(), FieldValue::Literal(LiteralBits::String("\n".to_string()))), ("string_quote".to_string(), FieldValue::Literal(LiteralBits::String("%Q".to_string()))), ("trailing_semicolon".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 19982, 20124) }, + Declaration { id: DeclarationId(1213), name: Some("python_clean_emission".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(775), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(775)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("expression_wrapping".to_string(), FieldValue::Variant { constructor: DeclarationId(1663), payload: vec![] }), ("pattern_bindings".to_string(), FieldValue::Variant { constructor: DeclarationId(1668), payload: vec![] }), ("variant_payload_field_access".to_string(), FieldValue::Variant { constructor: DeclarationId(1669), payload: vec![] }), ("imports".to_string(), FieldValue::Variant { constructor: DeclarationId(1672), payload: vec![] }), ("block_return".to_string(), FieldValue::Variant { constructor: DeclarationId(1676), payload: vec![] }), ("variable_bindings".to_string(), FieldValue::Variant { constructor: DeclarationId(1677), payload: vec![] }), ("match_arm_body".to_string(), FieldValue::Variant { constructor: DeclarationId(1682), payload: vec![] }), ("correction_style".to_string(), FieldValue::Reference(DeclarationId(1212))), ("post_emit_verifier".to_string(), FieldValue::Record(vec![("command".to_string(), FieldValue::Literal(LiteralBits::String("python3".to_string()))), ("args".to_string(), FieldValue::List(vec![FieldValue::Literal(LiteralBits::String("-m".to_string())), FieldValue::Literal(LiteralBits::String("py_compile".to_string()))])), ("syntax_only".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("expected_exit_code".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("output_policy".to_string(), FieldValue::Variant { constructor: DeclarationId(1684), payload: vec![] })]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 20126, 20706) }, + Declaration { id: DeclarationId(1214), name: Some("python_clean_emission_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(776), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(776)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1147))), ("clean_emission".to_string(), FieldValue::Reference(DeclarationId(1213)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 20708, 20844) }, + Declaration { id: DeclarationId(1215), name: Some("rust_execution_model".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(810), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(810)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("memory".to_string(), FieldValue::Variant { constructor: DeclarationId(1729), payload: vec![] }), ("scope".to_string(), FieldValue::Variant { constructor: DeclarationId(1730), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 4357, 4459) }, + Declaration { id: DeclarationId(1216), name: Some("rust_source_filtering".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(812), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(812)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("internal".to_string(), FieldValue::Reference(DeclarationId(813))), ("additional_excluded_prefixes".to_string(), FieldValue::List(vec![FieldValue::Literal(LiteralBits::String("src/v3/compiler/".to_string()))]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 4461, 4613) }, + Declaration { id: DeclarationId(1217), name: Some("rust_execution_requirement".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(814), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(814)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/rust.dag", 4676, 4690))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 4615, 4690) }, + Declaration { id: DeclarationId(1218), name: Some("rust_int".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("i64".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 5141, 5273) }, + Declaration { id: DeclarationId(1219), name: Some("rust_uint8".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(67))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("u8".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 5275, 5410) }, + Declaration { id: DeclarationId(1220), name: Some("rust_bool".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(88))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("bool".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 5412, 5547) }, + Declaration { id: DeclarationId(1221), name: Some("rust_string".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(186))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("String".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 5549, 5691) }, + Declaration { id: DeclarationId(1222), name: Some("rust_node_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(625))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NodeId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 5693, 5835) }, + Declaration { id: DeclarationId(1223), name: Some("rust_port_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(626))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PortId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 5837, 5979) }, + Declaration { id: DeclarationId(1224), name: Some("rust_declaration_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(627))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("DeclarationId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 5981, 6144) }, + Declaration { id: DeclarationId(1225), name: Some("rust_cluster_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(628))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ClusterId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 6146, 6297) }, + Declaration { id: DeclarationId(1226), name: Some("rust_type_shape".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(682))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TypeShape".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("declaration".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("declaration".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 6299, 6544) }, + Declaration { id: DeclarationId(1227), name: Some("rust_port_state".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(683))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PortState".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 6546, 6698) }, + Declaration { id: DeclarationId(1228), name: Some("rust_port".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(684))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Port".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1778), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("state".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1778), payload: vec![FieldValue::Literal(LiteralBits::String("state_value".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("produced_by".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("produced_by".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 6700, 7096) }, + Declaration { id: DeclarationId(1229), name: Some("rust_source_span".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(121))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SourceSpan".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("file".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("file".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("start".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("byte_start".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("end".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("byte_end".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 7098, 7496) }, + Declaration { id: DeclarationId(1230), name: Some("rust_literal_bits".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(685))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("LiteralBits".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 7498, 7656) }, + Declaration { id: DeclarationId(1231), name: Some("rust_atom_payload".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(686))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("AtomPayload".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 7658, 7816) }, + Declaration { id: DeclarationId(1232), name: Some("rust_cardinality_bound".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(691))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("CardinalityBound".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 7818, 7991) }, + Declaration { id: DeclarationId(1233), name: Some("rust_interval".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(689))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Interval".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 7993, 8141) }, + Declaration { id: DeclarationId(1234), name: Some("rust_positive_interval_width".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(687))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PositiveIntervalWidth".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 8143, 8332) }, + Declaration { id: DeclarationId(1235), name: Some("rust_interval_width".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(688))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("IntervalWidth".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 8334, 8498) }, + Declaration { id: DeclarationId(1236), name: Some("rust_conj_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(692))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Field".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("label".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("label".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("ty".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("ty".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 8500, 8802) }, + Declaration { id: DeclarationId(1237), name: Some("rust_template_argument".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(693))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TemplateArgument".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("parameter".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("parameter".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("value".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("value".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 8804, 9145) }, + Declaration { id: DeclarationId(1238), name: Some("rust_phantom_parameter".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(700))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PhantomParameter".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("parameter".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("parameter".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("algebra".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("algebra".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 9147, 9492) }, + Declaration { id: DeclarationId(1239), name: Some("rust_nominal_opacity".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(701))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NominalOpacity".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("permitted_accessors".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("permitted_accessors".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 9494, 9770) }, + Declaration { id: DeclarationId(1240), name: Some("rust_field_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(694))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("(String, FieldValue)".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("label".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("0".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("value".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("1".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 9772, 10089) }, + Declaration { id: DeclarationId(1241), name: Some("rust_non_empty_list".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(629))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NonEmptyList".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("first".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("first".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("rest".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("rest".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 10091, 10411) }, + Declaration { id: DeclarationId(1242), name: Some("rust_non_singleton_list".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(631))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NonSingletonList".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("first".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("first".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("second".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("second".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("rest".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("rest".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 10413, 10826) }, + Declaration { id: DeclarationId(1243), name: Some("rust_element_ref".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(712))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ElementRef".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("index".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1778), payload: vec![FieldValue::Literal(LiteralBits::String("index_of".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 10828, 11069) }, + Declaration { id: DeclarationId(1244), name: Some("rust_param_ref".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(710))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ParamRef".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("member".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1778), payload: vec![FieldValue::Literal(LiteralBits::String("member_of".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("slot".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1778), payload: vec![FieldValue::Literal(LiteralBits::String("slot_of".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 11071, 11391) }, + Declaration { id: DeclarationId(1245), name: Some("rust_transform_ref".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(711))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TransformRef".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("node".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1778), payload: vec![FieldValue::Literal(LiteralBits::String("node_id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 11393, 11638) }, + Declaration { id: DeclarationId(1246), name: Some("rust_member_descent".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(714))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("MemberDescent".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("param".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("param".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 11640, 11885) }, + Declaration { id: DeclarationId(1247), name: Some("rust_intra_cluster_call".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(715))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("IntraClusterCall".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("transform".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("transform".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 11887, 12150) }, + Declaration { id: DeclarationId(1248), name: Some("rust_cluster".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(716))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Cluster".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("members".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("members".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("intra_cluster_calls".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("intra_cluster_calls".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 12152, 12489) }, + Declaration { id: DeclarationId(1249), name: Some("rust_field_value".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(695))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("FieldValue".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 12491, 12646) }, + Declaration { id: DeclarationId(1250), name: Some("rust_value_body".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(696))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ValueBody".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 12648, 12800) }, + Declaration { id: DeclarationId(1251), name: Some("rust_arrow_body".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(697))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ArrowBody".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 12802, 12954) }, + Declaration { id: DeclarationId(1252), name: Some("rust_type_connective".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(698))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TypeConnective".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 12956, 13123) }, + Declaration { id: DeclarationId(1253), name: Some("rust_declaration".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(699))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Declaration".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("connective".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("connective".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("type_params".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("type_params".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("phantom_params".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("phantom_params".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("meta_tag".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("meta_tag".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("inhabits".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("inhabits".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("value_body".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("value_body".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("nominal_opacity".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("nominal_opacity".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 13125, 14146) }, + Declaration { id: DeclarationId(1254), name: Some("rust_arithmetic_op".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(702))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ArithmeticOp".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 14148, 14309) }, + Declaration { id: DeclarationId(1255), name: Some("rust_comparison_op".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(703))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ComparisonOp".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 14311, 14472) }, + Declaration { id: DeclarationId(1256), name: Some("rust_logical_op".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(704))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("LogicalOp".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 14474, 14626) }, + Declaration { id: DeclarationId(1257), name: Some("rust_operator_kind".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(705))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("OperatorKind".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 14628, 14789) }, + Declaration { id: DeclarationId(1258), name: Some("rust_transform_target".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(706))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TransformTarget".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 14791, 14961) }, + Declaration { id: DeclarationId(1259), name: Some("rust_branch_pattern".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(707))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BranchPattern".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 14963, 15127) }, + Declaration { id: DeclarationId(1260), name: Some("rust_payload_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(708))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PayloadBinding".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("binding_name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("binding_name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("payload_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("payload_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 15129, 15484) }, + Declaration { id: DeclarationId(1261), name: Some("rust_branch_path".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(709))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Path".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("body".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("body".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1778), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("pattern".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("pattern".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("binding".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("binding".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 15486, 15974) }, + Declaration { id: DeclarationId(1262), name: Some("rust_loop_bound".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(717))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("LoopBound".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 15976, 16128) }, + Declaration { id: DeclarationId(1263), name: Some("rust_value_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(718))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ValueNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("payload".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("data".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1778), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("lane2_workflow".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1778), payload: vec![FieldValue::Literal(LiteralBits::String("lane2_workflow".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(true)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 16130, 16903) }, + Declaration { id: DeclarationId(1264), name: Some("rust_transform_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(719))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TransformNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("target".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("target".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("inputs".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("inputs".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1778), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 16905, 17477) }, + Declaration { id: DeclarationId(1265), name: Some("rust_branch_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(721))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BranchNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("input".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("input".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("paths".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("paths".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1778), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("emit_participation".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1778), payload: vec![FieldValue::Literal(LiteralBits::String("emit_participation".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 17479, 18146) }, + Declaration { id: DeclarationId(1266), name: Some("rust_loop_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(722))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("LoopNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("source".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("source".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("init".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("init".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("body".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("body".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("bound".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("bound".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1778), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 18148, 18857) }, + Declaration { id: DeclarationId(1267), name: Some("rust_bind_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(724))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BindNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1778), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("params".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("params".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("lane2_workflow".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1778), payload: vec![FieldValue::Literal(LiteralBits::String("lane2_workflow".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(true)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("emit_participation".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1778), payload: vec![FieldValue::Literal(LiteralBits::String("emit_participation".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 18859, 19619) }, + Declaration { id: DeclarationId(1268), name: Some("rust_behavior".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(725))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Behavior".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 19621, 19769) }, + Declaration { id: DeclarationId(1269), name: Some("rust_dag".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(726))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Dag".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("declarations".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1778), payload: vec![FieldValue::Literal(LiteralBits::String("declarations".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(true)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("nodes".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1778), payload: vec![FieldValue::Literal(LiteralBits::String("nodes".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(true)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("ports".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1778), payload: vec![FieldValue::Literal(LiteralBits::String("ports".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("clusters".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1778), payload: vec![FieldValue::Literal(LiteralBits::String("clusters".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(true)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 19771, 20251) }, + Declaration { id: DeclarationId(1270), name: Some("rust_surface_module".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(945))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("parse_surface::SurfaceModule".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("items".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("items".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 20464, 20724) }, + Declaration { id: DeclarationId(1271), name: Some("rust_surface_item".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(958))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("parse_surface::SurfaceItem".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 20726, 20899) }, + Declaration { id: DeclarationId(1272), name: Some("rust_surface_param".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(946))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("parse_surface::SurfaceParam".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("ty".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("ty".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("refinement".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("refinement".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 20901, 21318) }, + Declaration { id: DeclarationId(1273), name: Some("rust_surface_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(947))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("parse_surface::SurfaceField".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("ty".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("ty".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 21320, 21648) }, + Declaration { id: DeclarationId(1274), name: Some("rust_surface_variant".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(948))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("parse_surface::SurfaceVariant".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("payload".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("payload".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 21650, 22071) }, + Declaration { id: DeclarationId(1275), name: Some("rust_variant_payload".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(949))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("parse_surface::VariantPayload".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 22073, 22255) }, + Declaration { id: DeclarationId(1276), name: Some("rust_surface_type".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(950))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("parse_surface::SurfaceType".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 22257, 22430) }, + Declaration { id: DeclarationId(1277), name: Some("rust_surface_record_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(951))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("parse_surface::SurfaceRecordField".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("value".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("value".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 22432, 22862) }, + Declaration { id: DeclarationId(1278), name: Some("rust_surface_map_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(952))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("parse_surface::SurfaceMapEntry".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("key".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("key".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("key_span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("key_span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("value".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("value".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 22864, 23368) }, + Declaration { id: DeclarationId(1279), name: Some("rust_surface_match_arm".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(953))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("parse_surface::SurfaceMatchArm".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("pattern".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("pattern".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("body".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("body".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 23370, 23795) }, + Declaration { id: DeclarationId(1280), name: Some("rust_surface_pattern_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(954))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("parse_surface::SurfacePatternField".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("binding".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("binding".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 23797, 24234) }, + Declaration { id: DeclarationId(1281), name: Some("rust_surface_pattern".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(955))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("parse_surface::SurfacePattern".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 24236, 24418) }, + Declaration { id: DeclarationId(1282), name: Some("rust_surface_literal".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(956))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("parse_surface::SurfaceLiteral".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 24420, 24602) }, + Declaration { id: DeclarationId(1283), name: Some("rust_surface_expr".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(957))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("parse_surface::SurfaceExpr".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 24604, 24777) }, + Declaration { id: DeclarationId(1284), name: Some("rust_int_add".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(298))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} + {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 25632, 25777) }, + Declaration { id: DeclarationId(1285), name: Some("rust_int_sub".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(299))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} - {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 25779, 25924) }, + Declaration { id: DeclarationId(1286), name: Some("rust_int_mul".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(301))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} * {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 25926, 26071) }, + Declaration { id: DeclarationId(1287), name: Some("rust_int_div".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(303))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("(__v3_int_div({lhs}, {rhs}))".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 26073, 26231) }, + Declaration { id: DeclarationId(1288), name: Some("rust_int_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(305))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 26681, 26825) }, + Declaration { id: DeclarationId(1289), name: Some("rust_node_id_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(625))), ("op".to_string(), FieldValue::Reference(DeclarationId(305))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 26827, 26978) }, + Declaration { id: DeclarationId(1290), name: Some("rust_port_id_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(626))), ("op".to_string(), FieldValue::Reference(DeclarationId(305))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 26980, 27131) }, + Declaration { id: DeclarationId(1291), name: Some("rust_declaration_id_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(627))), ("op".to_string(), FieldValue::Reference(DeclarationId(305))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 27133, 27298) }, + Declaration { id: DeclarationId(1292), name: Some("rust_string_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(186))), ("op".to_string(), FieldValue::Reference(DeclarationId(305))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 27491, 27641) }, + Declaration { id: DeclarationId(1293), name: Some("rust_int_ne".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(306))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} != {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 27643, 27787) }, + Declaration { id: DeclarationId(1294), name: Some("rust_node_id_ne".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(625))), ("op".to_string(), FieldValue::Reference(DeclarationId(306))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} != {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 27789, 27940) }, + Declaration { id: DeclarationId(1295), name: Some("rust_port_id_ne".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(626))), ("op".to_string(), FieldValue::Reference(DeclarationId(306))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} != {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 27942, 28093) }, + Declaration { id: DeclarationId(1296), name: Some("rust_declaration_id_ne".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(627))), ("op".to_string(), FieldValue::Reference(DeclarationId(306))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} != {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 28095, 28260) }, + Declaration { id: DeclarationId(1297), name: Some("rust_int_lt".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(307))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} < {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 28262, 28405) }, + Declaration { id: DeclarationId(1298), name: Some("rust_int_le".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(308))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} <= {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 28407, 28551) }, + Declaration { id: DeclarationId(1299), name: Some("rust_int_gt".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(309))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} > {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 28553, 28696) }, + Declaration { id: DeclarationId(1300), name: Some("rust_int_ge".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(310))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} >= {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 28698, 28842) }, + Declaration { id: DeclarationId(1301), name: Some("rust_bool_meet".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(88))), ("op".to_string(), FieldValue::Reference(DeclarationId(320))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} && {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 28844, 28997) }, + Declaration { id: DeclarationId(1302), name: Some("rust_bool_join".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(88))), ("op".to_string(), FieldValue::Reference(DeclarationId(321))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} || {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 28999, 29152) }, + Declaration { id: DeclarationId(1303), name: Some("rust_let_stmt".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(854), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(854)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(1014))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("let {name}: {type} = {value};".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(0)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 29902, 30041) }, + Declaration { id: DeclarationId(1304), name: Some("rust_if_expr".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(854), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(854)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(1012))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("if {cond} { {then} } else { {else} }".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(0)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 30043, 30190) }, + Declaration { id: DeclarationId(1305), name: Some("rust_main_wrap".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(854), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(854)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(1015))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("fn main() { {body} println!({quote}{{}}{quote}, {final}); }".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(0)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 30192, 30362) }, + Declaration { id: DeclarationId(1306), name: Some("rust_empty_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(591))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1782), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 31739, 31881) }, + Declaration { id: DeclarationId(1307), name: Some("rust_singleton_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(595))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1783), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1781), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 31883, 32079) }, + Declaration { id: DeclarationId(1308), name: Some("rust_cons_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(593))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1781), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1781), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 32081, 32302) }, + Declaration { id: DeclarationId(1309), name: Some("rust_concat_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(603))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1785), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1781), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1781), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 32304, 32531) }, + Declaration { id: DeclarationId(1310), name: Some("rust_length_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(613))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1786), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1780), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 32533, 32720) }, + Declaration { id: DeclarationId(1311), name: Some("rust_list_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(589))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Vec<{element}>".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 32722, 32865) }, + Declaration { id: DeclarationId(1312), name: Some("rust_result_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(11))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("::core::result::Result<{key}, {value}>".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 33144, 33315) }, + Declaration { id: DeclarationId(1313), name: Some("rust_lookup_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(940))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Lookup<{element}>".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 33317, 33467) }, + Declaration { id: DeclarationId(1314), name: Some("rust_map_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(97))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("HashMap<{key}, {value}>".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 33469, 33619) }, + Declaration { id: DeclarationId(1315), name: Some("rust_is_empty_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(615))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1787), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1780), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 33621, 33813) }, + Declaration { id: DeclarationId(1316), name: Some("rust_fold_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(597))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1788), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1780), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1781), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(2))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1780), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 33815, 34076) }, + Declaration { id: DeclarationId(1317), name: Some("rust_map_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(605))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1780), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1780), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 34078, 34296) }, + Declaration { id: DeclarationId(1318), name: Some("rust_filter_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(608))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1790), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1780), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1780), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 34298, 34525) }, + Declaration { id: DeclarationId(1319), name: Some("rust_contains_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(623))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1791), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1780), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1780), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 34527, 34760) }, + Declaration { id: DeclarationId(1320), name: Some("rust_list_pattern".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("target".to_string(), FieldValue::Reference(DeclarationId(589))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1793), payload: vec![] }), ("empty_variant".to_string(), FieldValue::Reference(DeclarationId(1419))), ("cons_variant".to_string(), FieldValue::Reference(DeclarationId(1421))), ("scrutinee".to_string(), FieldValue::Literal(LiteralBits::String("{expr}".to_string()))), ("empty_pattern".to_string(), FieldValue::Literal(LiteralBits::String("[]".to_string()))), ("cons_pattern".to_string(), FieldValue::Literal(LiteralBits::String("[{head}, {tail} @ ..]".to_string()))), ("head_expr".to_string(), FieldValue::Literal(LiteralBits::String("{head}".to_string()))), ("tail_expr".to_string(), FieldValue::Literal(LiteralBits::String("{tail}".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 34988, 35292) }, + Declaration { id: DeclarationId(1321), name: Some("rust_statements".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(862), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(862)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("let_binding".to_string(), FieldValue::Literal(LiteralBits::String("let {name}: {type} = {value};".to_string()))), ("let_binding_inferred".to_string(), FieldValue::Literal(LiteralBits::String("let {name} = {value};".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 35294, 35432) }, + Declaration { id: DeclarationId(1322), name: Some("rust_expressions".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(863), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(863)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("field_access".to_string(), FieldValue::Literal(LiteralBits::String("({object}).{field}".to_string()))), ("function_call".to_string(), FieldValue::Literal(LiteralBits::String("{func}({args})".to_string()))), ("closure".to_string(), FieldValue::Literal(LiteralBits::String("|{params}| {{ {body} }}".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 35434, 35587) }, + Declaration { id: DeclarationId(1323), name: Some("rust_control_flow".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(865), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(865)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("if_else".to_string(), FieldValue::Literal(LiteralBits::String("if {cond} { {then} } else { {else} }".to_string()))), ("match_arm".to_string(), FieldValue::Literal(LiteralBits::String("{pattern} => {body},".to_string()))), ("for_each_syntax".to_string(), FieldValue::Record(vec![("prefix".to_string(), FieldValue::Literal(LiteralBits::String("for ".to_string()))), ("separator".to_string(), FieldValue::Literal(LiteralBits::String(" in ".to_string())))]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 35589, 35779) }, + Declaration { id: DeclarationId(1324), name: Some("rust_literals".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(866), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(866)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("true_keyword".to_string(), FieldValue::Literal(LiteralBits::String("true".to_string()))), ("false_keyword".to_string(), FieldValue::Literal(LiteralBits::String("false".to_string()))), ("string_delimiter".to_string(), FieldValue::Literal(LiteralBits::String("%Q".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 35781, 35893) }, + Declaration { id: DeclarationId(1325), name: Some("rust_modules".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(867), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(867)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("path_separator".to_string(), FieldValue::Literal(LiteralBits::String("::".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 35895, 35955) }, + Declaration { id: DeclarationId(1326), name: Some("rust_functions".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(868), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(868)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("definition".to_string(), FieldValue::Literal(LiteralBits::String("fn {name}({params}) -> {ret} { {body} }".to_string()))), ("definition_exported".to_string(), FieldValue::Literal(LiteralBits::String("pub fn {name}({params}) -> {ret} { {body} }".to_string()))), ("definition_void".to_string(), FieldValue::Literal(LiteralBits::String("fn {name}({params}) { {body} }".to_string()))), ("param_with_type".to_string(), FieldValue::Literal(LiteralBits::String("{name}: {type}".to_string()))), ("param_separator".to_string(), FieldValue::Literal(LiteralBits::String(", ".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 35957, 36235) }, + Declaration { id: DeclarationId(1327), name: Some("rust_type_applications".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(869), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(869)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("optional".to_string(), FieldValue::Literal(LiteralBits::String("Option<{element}>".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 36237, 36325) }, + Declaration { id: DeclarationId(1328), name: Some("rust_type_defs".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(870), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(870)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("struct_def".to_string(), FieldValue::Literal(LiteralBits::String("#[derive(Clone, Debug)]\npub struct {name} { {fields} }".to_string()))), ("struct_field".to_string(), FieldValue::Literal(LiteralBits::String("pub {name}: {type},".to_string()))), ("enum_def".to_string(), FieldValue::Literal(LiteralBits::String("#[derive(Clone, Debug)]\npub enum {name} { {variants} }".to_string()))), ("enum_unit_variant".to_string(), FieldValue::Literal(LiteralBits::String("{name},".to_string()))), ("enum_data_variant".to_string(), FieldValue::Literal(LiteralBits::String("{name} { {fields} },".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 36327, 36629) }, + Declaration { id: DeclarationId(1329), name: Some("rust_record_derive_templates".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(871), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(871)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("struct_def_no_debug".to_string(), FieldValue::Literal(LiteralBits::String("#[derive(Clone)]\npub struct {name} { {fields} }".to_string()))), ("enum_def_no_debug".to_string(), FieldValue::Literal(LiteralBits::String("#[derive(Clone)]\npub enum {name} { {variants} }".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 36631, 36844) }, + Declaration { id: DeclarationId(1330), name: Some("rust_patterns".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(872), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(872)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("match_expr".to_string(), FieldValue::Literal(LiteralBits::String("match {expr} { {arms} }".to_string()))), ("match_arm".to_string(), FieldValue::Literal(LiteralBits::String("{pattern} => {body},".to_string()))), ("variant_pattern".to_string(), FieldValue::Literal(LiteralBits::String("{name} {{ {bindings} }}".to_string()))), ("variant_pattern_positional".to_string(), FieldValue::Literal(LiteralBits::String("{name}({binding})".to_string()))), ("variant_pattern_empty".to_string(), FieldValue::Literal(LiteralBits::String("{name}".to_string()))), ("field_binding".to_string(), FieldValue::Literal(LiteralBits::String("{field}: {binding}".to_string()))), ("field_binding_separator".to_string(), FieldValue::Literal(LiteralBits::String(", ".to_string()))), ("wildcard".to_string(), FieldValue::Literal(LiteralBits::String("_".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 36846, 37181) }, + Declaration { id: DeclarationId(1331), name: Some("rust_collection_ops".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(873), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(873)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("concat".to_string(), FieldValue::Literal(LiteralBits::String("{ let mut __left = {left}; __left.extend({right}); __left }".to_string()))), ("length".to_string(), FieldValue::Literal(LiteralBits::String("({recv}).len() as i64".to_string()))), ("is_empty".to_string(), FieldValue::Literal(LiteralBits::String("({recv}).is_empty()".to_string()))), ("fold".to_string(), FieldValue::Literal(LiteralBits::String("({recv}).iter().fold({init}, {body})".to_string()))), ("map".to_string(), FieldValue::Literal(LiteralBits::String("({recv}).iter().map({body}).collect::>()".to_string()))), ("filter".to_string(), FieldValue::Literal(LiteralBits::String("{ let mut __out = Vec::new(); for {item} in ({recv}).iter() { if {predicate} { __out.push({item_push}); } } __out }".to_string()))), ("contains".to_string(), FieldValue::Literal(LiteralBits::String("({recv}).contains({item})".to_string()))), ("empty_list".to_string(), FieldValue::Literal(LiteralBits::String("Vec::new()".to_string()))), ("list_literal".to_string(), FieldValue::Literal(LiteralBits::String("vec![{elements}]".to_string()))), ("cons".to_string(), FieldValue::Literal(LiteralBits::String("{ let mut __list = {tail}; __list.insert(0, {head}); __list }".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 37183, 37774) }, + Declaration { id: DeclarationId(1332), name: Some("rust_value_construction".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(874), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(874)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("struct_literal".to_string(), FieldValue::Literal(LiteralBits::String("{type} {{ {fields} }}".to_string()))), ("struct_field_init".to_string(), FieldValue::Literal(LiteralBits::String("{name}: {value}".to_string()))), ("struct_field_separator".to_string(), FieldValue::Literal(LiteralBits::String(", ".to_string()))), ("variant_construction".to_string(), FieldValue::Literal(LiteralBits::String("{variant}({args})".to_string()))), ("variant_named_construction".to_string(), FieldValue::Literal(LiteralBits::String("{variant} {{ {fields} }}".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 37776, 38048) }, + Declaration { id: DeclarationId(1333), name: Some("rust_rendering".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(875), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(875)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("read".to_string(), FieldValue::Variant { constructor: DeclarationId(1794), payload: vec![] }), ("construct".to_string(), FieldValue::Variant { constructor: DeclarationId(1796), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 38050, 38131) }, + Declaration { id: DeclarationId(1334), name: Some("rust_language".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(878), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(878)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("statements".to_string(), FieldValue::Reference(DeclarationId(1321))), ("expressions".to_string(), FieldValue::Reference(DeclarationId(1322))), ("control_flow".to_string(), FieldValue::Reference(DeclarationId(1323))), ("literals".to_string(), FieldValue::Reference(DeclarationId(1324))), ("modules".to_string(), FieldValue::Reference(DeclarationId(1325))), ("functions".to_string(), FieldValue::Reference(DeclarationId(1326))), ("type_applications".to_string(), FieldValue::Reference(DeclarationId(1327))), ("type_definitions".to_string(), FieldValue::Reference(DeclarationId(1328))), ("record_derive_templates".to_string(), FieldValue::Reference(DeclarationId(1329))), ("patterns".to_string(), FieldValue::Reference(DeclarationId(1330))), ("collection_ops".to_string(), FieldValue::Reference(DeclarationId(1331))), ("values".to_string(), FieldValue::Reference(DeclarationId(1332)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 38133, 38578) }, + Declaration { id: DeclarationId(1335), name: Some("rust_correction_style".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(784), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(784)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("indent_unit".to_string(), FieldValue::Literal(LiteralBits::String(" ".to_string()))), ("line_ending".to_string(), FieldValue::Literal(LiteralBits::String("\n".to_string()))), ("string_quote".to_string(), FieldValue::Literal(LiteralBits::String("%Q".to_string()))), ("trailing_semicolon".to_string(), FieldValue::Literal(LiteralBits::Bool(true)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 40002, 40141) }, + Declaration { id: DeclarationId(1336), name: Some("rust_clean_emission".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(775), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(775)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("expression_wrapping".to_string(), FieldValue::Variant { constructor: DeclarationId(1663), payload: vec![] }), ("pattern_bindings".to_string(), FieldValue::Variant { constructor: DeclarationId(1666), payload: vec![] }), ("variant_payload_field_access".to_string(), FieldValue::Variant { constructor: DeclarationId(1670), payload: vec![] }), ("imports".to_string(), FieldValue::Variant { constructor: DeclarationId(1672), payload: vec![] }), ("block_return".to_string(), FieldValue::Variant { constructor: DeclarationId(1675), payload: vec![] }), ("variable_bindings".to_string(), FieldValue::Variant { constructor: DeclarationId(1678), payload: vec![] }), ("match_arm_body".to_string(), FieldValue::Variant { constructor: DeclarationId(1681), payload: vec![] }), ("correction_style".to_string(), FieldValue::Reference(DeclarationId(1335))), ("post_emit_verifier".to_string(), FieldValue::Record(vec![("command".to_string(), FieldValue::Literal(LiteralBits::String("rustc".to_string()))), ("args".to_string(), FieldValue::List(vec![FieldValue::Literal(LiteralBits::String("--edition=2021".to_string())), FieldValue::Literal(LiteralBits::String("-D".to_string())), FieldValue::Literal(LiteralBits::String("warnings".to_string()))])), ("syntax_only".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("expected_exit_code".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("output_policy".to_string(), FieldValue::Variant { constructor: DeclarationId(1684), payload: vec![] })]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 40143, 40756) }, + Declaration { id: DeclarationId(1337), name: Some("rust_clean_emission_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(776), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(776)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1334))), ("clean_emission".to_string(), FieldValue::Reference(DeclarationId(1336)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 40758, 40888) }, + Declaration { id: DeclarationId(1338), name: Some("rust_port_accessor".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(727), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(727)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({p0}).port_opt({p1}).cloned()".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 41990, 42093) }, + Declaration { id: DeclarationId(1339), name: Some("rust_node_accessor".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(727), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(727)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({p0}).node_opt({p1}).cloned()".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 42095, 42198) }, + Declaration { id: DeclarationId(1340), name: Some("rust_resolve_producer_accessor".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(727), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(727)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({p0}).resolve_producer_opt({p1}).cloned()".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 42200, 42327) }, + Declaration { id: DeclarationId(1341), name: Some("port_binding_rust".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(728), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(728)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("accessor".to_string(), FieldValue::Reference(DeclarationId(729))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1338))), ("language".to_string(), FieldValue::Reference(DeclarationId(1334)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 42329, 42460) }, + Declaration { id: DeclarationId(1342), name: Some("node_binding_rust".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(728), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(728)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("accessor".to_string(), FieldValue::Reference(DeclarationId(730))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1339))), ("language".to_string(), FieldValue::Reference(DeclarationId(1334)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 42462, 42593) }, + Declaration { id: DeclarationId(1343), name: Some("resolve_producer_binding_rust".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(728), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(728)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("accessor".to_string(), FieldValue::Reference(DeclarationId(731))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1340))), ("language".to_string(), FieldValue::Reference(DeclarationId(1334)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 42595, 42762) }, + Declaration { id: DeclarationId(1344), name: Some("rust_lane2_workflow_accessor".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(727), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(727)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({p0}).lane2_workflow_effect_at({p1}).cloned()".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 43273, 43402) }, + Declaration { id: DeclarationId(1345), name: Some("lane2_workflow_at_binding_rust".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(728), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(728)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("accessor".to_string(), FieldValue::Reference(DeclarationId(733))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1344))), ("language".to_string(), FieldValue::Reference(DeclarationId(1334)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 43404, 43571) }, + Declaration { id: DeclarationId(1346), name: Some("rust_declaration_by_id_accessor".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(727), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(727)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({p0}).declaration_opt({p1}).cloned()".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 43898, 44021) }, + Declaration { id: DeclarationId(1347), name: Some("declaration_by_id_binding_rust".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(728), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(728)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("accessor".to_string(), FieldValue::Reference(DeclarationId(732))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1346))), ("language".to_string(), FieldValue::Reference(DeclarationId(1334)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 44023, 44193) }, + Declaration { id: DeclarationId(1348), name: Some("CompilerHostRealization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 453, 502) }, + Declaration { id: DeclarationId(1349), name: Some("PipelineSnapshotKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "SnapshotSurface".to_string(), ty: DeclarationId(2075) }, Field { label: "SnapshotDag".to_string(), ty: DeclarationId(2076) }, Field { label: "SnapshotText".to_string(), ty: DeclarationId(2077) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 504, 576) }, + Declaration { id: DeclarationId(1350), name: Some("PipelineStageBinding".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "stage".to_string(), ty: DeclarationId(1016) }, Field { label: "realization".to_string(), ty: DeclarationId(1016) }, Field { label: "snapshot".to_string(), ty: DeclarationId(1349) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 578, 694) }, + Declaration { id: DeclarationId(1351), name: Some("parse_realization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1348)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("symbol".to_string(), FieldValue::Literal(LiteralBits::String("v3_compiler::parse".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 696, 780) }, + Declaration { id: DeclarationId(1352), name: Some("lower_realization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1348)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("symbol".to_string(), FieldValue::Literal(LiteralBits::String("v3_compiler::lower".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 782, 866) }, + Declaration { id: DeclarationId(1353), name: Some("infer_realization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1348)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("symbol".to_string(), FieldValue::Literal(LiteralBits::String("v3_compiler::infer".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 868, 952) }, + Declaration { id: DeclarationId(1354), name: Some("compute_ownership_realization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1348)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("symbol".to_string(), FieldValue::Literal(LiteralBits::String("v3_compiler::compute_ownership".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 954, 1062) }, + Declaration { id: DeclarationId(1355), name: Some("emit_realization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1348)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("symbol".to_string(), FieldValue::Literal(LiteralBits::String("v3_compiler::emit".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1064, 1146) }, + Declaration { id: DeclarationId(1356), name: Some("lens_complexity_realization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1348)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("symbol".to_string(), FieldValue::Literal(LiteralBits::String("v3_compiler::lens_complexity".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1148, 1252) }, + Declaration { id: DeclarationId(1357), name: Some("parse_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1350), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1350)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1363))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1351))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(2075), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1254, 1382) }, + Declaration { id: DeclarationId(1358), name: Some("lower_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1350), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1350)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1364))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1352))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(2076), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1384, 1508) }, + Declaration { id: DeclarationId(1359), name: Some("infer_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1350), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1350)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1365))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1353))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(2076), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1510, 1634) }, + Declaration { id: DeclarationId(1360), name: Some("compute_ownership_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1350), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1350)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1366))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1354))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(2076), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1636, 1796) }, + Declaration { id: DeclarationId(1361), name: Some("lens_complexity_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1350), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1350)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1367))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1356))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(2076), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1798, 1952) }, + Declaration { id: DeclarationId(1362), name: Some("emit_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1350), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1350)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1368))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1355))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(2077), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1954, 2076) }, + Declaration { id: DeclarationId(1363), name: Some("parse".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(186)], output: DeclarationId(726), body: ArrowBody::ExternalRealization(DeclarationId(1351)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2078, 2140) }, + Declaration { id: DeclarationId(1364), name: Some("lower".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(726)], output: DeclarationId(726), body: ArrowBody::ExternalRealization(DeclarationId(1352)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2142, 2184) }, + Declaration { id: DeclarationId(1365), name: Some("infer".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(726)], output: DeclarationId(726), body: ArrowBody::ExternalRealization(DeclarationId(1353)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2186, 2228) }, + Declaration { id: DeclarationId(1366), name: Some("compute_ownership".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(726)], output: DeclarationId(726), body: ArrowBody::ExternalRealization(DeclarationId(1354)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2230, 2288) }, + Declaration { id: DeclarationId(1367), name: Some("lens_complexity".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(726)], output: DeclarationId(726), body: ArrowBody::ExternalRealization(DeclarationId(1356)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2290, 2347) }, + Declaration { id: DeclarationId(1368), name: Some("emit".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(726), DeclarationId(726), DeclarationId(726), DeclarationId(878)], output: DeclarationId(186), body: ArrowBody::ExternalRealization(DeclarationId(1355)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2349, 2460) }, + Declaration { id: DeclarationId(1369), name: Some("compile".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(186), DeclarationId(878)], output: DeclarationId(186), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/compiler/pipeline.dag", 2533, 2605)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2462, 2605) }, + Declaration { id: DeclarationId(1370), name: Some("from_symbol".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(2078), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/compiler/operators.dag", 156, 771)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/operators.dag", 108, 771) }, + Declaration { id: DeclarationId(1371), name: Some("symbol".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(705)], output: DeclarationId(186), body: ArrowBody::UserDefined(NodeId(253)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/operators.dag", 773, 1214) }, + Declaration { id: DeclarationId(1372), name: Some("algebra_field_name".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(705)], output: DeclarationId(186), body: ArrowBody::UserDefined(NodeId(270)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/operators.dag", 1216, 2017) }, + Declaration { id: DeclarationId(1373), name: Some("LensRegistryEntry".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(111) }, Field { label: "lens_file".to_string(), ty: DeclarationId(120) }, Field { label: "generated_file".to_string(), ty: DeclarationId(120) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 1950, 2045) }, + Declaration { id: DeclarationId(1374), name: Some("lens_cost_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1373), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1373)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("cost".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/complexity.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/lens_cost_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 2047, 2214) }, + Declaration { id: DeclarationId(1375), name: Some("lens_cost_symbolic_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1373), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1373)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("cost_symbolic".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/cost.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/lens_cost_symbolic_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 2216, 2404) }, + Declaration { id: DeclarationId(1376), name: Some("lens_effect_enumeration_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1373), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1373)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("effect_enumeration".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/effect_enumeration.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/lens_effect_enumeration_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 2406, 2623) }, + Declaration { id: DeclarationId(1377), name: Some("lens_provenance_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1373), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1373)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("provenance".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/provenance.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/lens_provenance_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 2625, 2810) }, + Declaration { id: DeclarationId(1378), name: Some("lens_structural_resolution_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1373), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1373)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("structural_resolution".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/structural_resolution.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/lens_structural_resolution_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 2812, 3041) }, + Declaration { id: DeclarationId(1379), name: Some("lens_unused_parameters_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1373), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1373)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("unused_parameters".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/unused_parameters.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/lens_unused_parameters_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 3043, 3256) }, + Declaration { id: DeclarationId(1380), name: Some("lens_infer_helpers_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1373), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1373)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("infer_helpers".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/infer_helpers.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/infer_helpers_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 3883, 4075) }, + Declaration { id: DeclarationId(1381), name: Some("lens_variant_payload_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1373), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1373)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("variant_payload".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/variant_payload.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/variant_payload_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 4077, 4277) }, + Declaration { id: DeclarationId(1382), name: Some("lens_lower_helpers_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1373), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1373)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("lower_helpers".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/lower_helpers.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/lower_helpers_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 4527, 4719) }, + Declaration { id: DeclarationId(1383), name: Some("IntegerAlgebra".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "OrderedRingAlgebra".to_string(), ty: DeclarationId(2079) }, Field { label: "SemiringAlgebra".to_string(), ty: DeclarationId(2080) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5230, 5292) }, + Declaration { id: DeclarationId(1384), name: Some("NonIntegerAlgebra".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "BooleanAlgebraAlgebra".to_string(), ty: DeclarationId(2081) }, Field { label: "TerminalAlgebra".to_string(), ty: DeclarationId(2082) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5294, 5362) }, + Declaration { id: DeclarationId(1385), name: Some("TargetCarrier".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "BitCarrier".to_string(), ty: DeclarationId(2083) }, Field { label: "ByteCarrier".to_string(), ty: DeclarationId(2084) }, Field { label: "Word16Carrier".to_string(), ty: DeclarationId(2085) }, Field { label: "Word32Carrier".to_string(), ty: DeclarationId(2086) }, Field { label: "Word64Carrier".to_string(), ty: DeclarationId(2087) }, Field { label: "TerminalCarrier".to_string(), ty: DeclarationId(2088) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6852, 6975) }, + Declaration { id: DeclarationId(1386), name: Some("IntegerOverflow".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "TwoComplementWrap".to_string(), ty: DeclarationId(2089) }, Field { label: "Saturating".to_string(), ty: DeclarationId(2090) }, Field { label: "Trap".to_string(), ty: DeclarationId(2091) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 7692, 7758) }, + Declaration { id: DeclarationId(1387), name: Some("RustPrimitive".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "IntegerPrimitive".to_string(), ty: DeclarationId(2092) }, Field { label: "NonIntegerPrimitive".to_string(), ty: DeclarationId(2093) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 8513, 9295) }, + Declaration { id: DeclarationId(1388), name: Some("rust_pilot_primitives".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(1387) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(2094)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![FieldValue::Variant { constructor: DeclarationId(2092), payload: vec![FieldValue::Literal(LiteralBits::String("i8".to_string())), FieldValue::Variant { constructor: DeclarationId(2079), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2084), payload: vec![] }, FieldValue::Literal(LiteralBits::String("-128".to_string())), FieldValue::Literal(LiteralBits::String("127".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2089), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2092), payload: vec![FieldValue::Literal(LiteralBits::String("i16".to_string())), FieldValue::Variant { constructor: DeclarationId(2079), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2085), payload: vec![] }, FieldValue::Literal(LiteralBits::String("-32768".to_string())), FieldValue::Literal(LiteralBits::String("32767".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2089), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2092), payload: vec![FieldValue::Literal(LiteralBits::String("i32".to_string())), FieldValue::Variant { constructor: DeclarationId(2079), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2086), payload: vec![] }, FieldValue::Literal(LiteralBits::String("-2147483648".to_string())), FieldValue::Literal(LiteralBits::String("2147483647".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2089), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2092), payload: vec![FieldValue::Literal(LiteralBits::String("i64".to_string())), FieldValue::Variant { constructor: DeclarationId(2079), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2087), payload: vec![] }, FieldValue::Literal(LiteralBits::String("-9223372036854775808".to_string())), FieldValue::Literal(LiteralBits::String("9223372036854775807".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2089), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2092), payload: vec![FieldValue::Literal(LiteralBits::String("u8".to_string())), FieldValue::Variant { constructor: DeclarationId(2080), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2084), payload: vec![] }, FieldValue::Literal(LiteralBits::String("0".to_string())), FieldValue::Literal(LiteralBits::String("255".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2089), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2092), payload: vec![FieldValue::Literal(LiteralBits::String("u16".to_string())), FieldValue::Variant { constructor: DeclarationId(2080), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2085), payload: vec![] }, FieldValue::Literal(LiteralBits::String("0".to_string())), FieldValue::Literal(LiteralBits::String("65535".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2089), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2092), payload: vec![FieldValue::Literal(LiteralBits::String("u32".to_string())), FieldValue::Variant { constructor: DeclarationId(2080), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2086), payload: vec![] }, FieldValue::Literal(LiteralBits::String("0".to_string())), FieldValue::Literal(LiteralBits::String("4294967295".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2089), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2092), payload: vec![FieldValue::Literal(LiteralBits::String("u64".to_string())), FieldValue::Variant { constructor: DeclarationId(2080), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2087), payload: vec![] }, FieldValue::Literal(LiteralBits::String("0".to_string())), FieldValue::Literal(LiteralBits::String("18446744073709551615".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2089), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2093), payload: vec![FieldValue::Literal(LiteralBits::String("bool".to_string())), FieldValue::Variant { constructor: DeclarationId(2081), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2083), payload: vec![] }, FieldValue::Literal(LiteralBits::Bool(true))] }, FieldValue::Variant { constructor: DeclarationId(2093), payload: vec![FieldValue::Literal(LiteralBits::String("()".to_string())), FieldValue::Variant { constructor: DeclarationId(2082), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2088), payload: vec![] }, FieldValue::Literal(LiteralBits::Bool(true))] }])), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 9595, 12449) }, + Declaration { id: DeclarationId(1389), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(592) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3259, 3272) }, + Declaration { id: DeclarationId(1390), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(594) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3421, 3434) }, + Declaration { id: DeclarationId(1391), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(594) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3439, 3452) }, + Declaration { id: DeclarationId(1392), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(596) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3556, 3569) }, + Declaration { id: DeclarationId(1393), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(598) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4162, 4169) }, + Declaration { id: DeclarationId(1394), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(599), DeclarationId(598)], output: DeclarationId(599), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4183, 4196) }, + Declaration { id: DeclarationId(1395), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(601) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4617, 4624) }, + Declaration { id: DeclarationId(1396), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(601), DeclarationId(602)], output: DeclarationId(602), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4638, 4651) }, + Declaration { id: DeclarationId(1397), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(604) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5336, 5349) }, + Declaration { id: DeclarationId(1398), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(604) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5354, 5367) }, + Declaration { id: DeclarationId(1399), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(604) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5372, 5385) }, + Declaration { id: DeclarationId(1400), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(606) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5686, 5693) }, + Declaration { id: DeclarationId(1401), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(606)], output: DeclarationId(607), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5698, 5708) }, + Declaration { id: DeclarationId(1402), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(607) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5713, 5720) }, + Declaration { id: DeclarationId(1403), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(609) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5867, 5874) }, + Declaration { id: DeclarationId(1404), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(609)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5879, 5892) }, + Declaration { id: DeclarationId(1405), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(609) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5897, 5904) }, + Declaration { id: DeclarationId(1406), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(611) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6130, 6137) }, + Declaration { id: DeclarationId(1407), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(612) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6151, 6158) }, + Declaration { id: DeclarationId(1408), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(611)], output: DeclarationId(1407), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6142, 6158) }, + Declaration { id: DeclarationId(1409), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(612) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6163, 6170) }, + Declaration { id: DeclarationId(1410), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(614) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6356, 6363) }, + Declaration { id: DeclarationId(1411), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(616) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6588, 6595) }, + Declaration { id: DeclarationId(1412), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(620) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7202, 7209) }, + Declaration { id: DeclarationId(1413), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(617), arguments: vec![TemplateArgument { parameter: DeclarationId(618), value: DeclarationId(620) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7219, 7236) }, + Declaration { id: DeclarationId(1414), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(1413) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7214, 7237) }, + Declaration { id: DeclarationId(1415), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(622) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7415, 7422) }, + Declaration { id: DeclarationId(1416), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(617), arguments: vec![TemplateArgument { parameter: DeclarationId(618), value: DeclarationId(622) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7444, 7461) }, + Declaration { id: DeclarationId(1417), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(1416) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7439, 7462) }, + Declaration { id: DeclarationId(1418), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(624) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 8177, 8184) }, + Declaration { id: DeclarationId(1419), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 2106, 2111) }, + Declaration { id: DeclarationId(1420), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(590) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 2144, 2157) }, + Declaration { id: DeclarationId(1421), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "head".to_string(), ty: DeclarationId(590) }, Field { label: "tail".to_string(), ty: DeclarationId(1420) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 2116, 2159) }, + Declaration { id: DeclarationId(1422), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(630) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1477, 1490) }, + Declaration { id: DeclarationId(1423), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(632) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1570, 1583) }, + Declaration { id: DeclarationId(1424), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 11753, 11760) }, + Declaration { id: DeclarationId(1425), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(712), arguments: vec![TemplateArgument { parameter: DeclarationId(713), value: DeclarationId(648) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 20916, 20943) }, + Declaration { id: DeclarationId(1426), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(617), arguments: vec![TemplateArgument { parameter: DeclarationId(618), value: DeclarationId(648) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 20995, 21026) }, + Declaration { id: DeclarationId(1427), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(712), arguments: vec![TemplateArgument { parameter: DeclarationId(713), value: DeclarationId(648) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 21031, 21058) }, + Declaration { id: DeclarationId(1428), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(1427), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 21031, 21059) }, + Declaration { id: DeclarationId(1429), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(648) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 21185, 21206) }, + Declaration { id: DeclarationId(1430), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(712), arguments: vec![TemplateArgument { parameter: DeclarationId(713), value: DeclarationId(648) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 21211, 21238) }, + Declaration { id: DeclarationId(1431), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(1430), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 21211, 21239) }, + Declaration { id: DeclarationId(1432), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(648) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 22268, 22289) }, + Declaration { id: DeclarationId(1433), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(156), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 29695, 29706) }, + Declaration { id: DeclarationId(1434), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 30432, 30439) }, + Declaration { id: DeclarationId(1435), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 30662, 30669) }, + Declaration { id: DeclarationId(1436), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(648) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 37237, 37258) }, + Declaration { id: DeclarationId(1437), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(679) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 37264, 37295) }, + Declaration { id: DeclarationId(1438), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "text".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 7532, 7561) }, + Declaration { id: DeclarationId(1439), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 7566, 7595) }, + Declaration { id: DeclarationId(1440), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(633) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 7627, 7645) }, + Declaration { id: DeclarationId(1441), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(633) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 8066, 8084) }, + Declaration { id: DeclarationId(1442), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "tokens".to_string(), ty: DeclarationId(1441) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 8036, 8086) }, + Declaration { id: DeclarationId(1443), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "segment".to_string(), ty: DeclarationId(186) }, Field { label: "reason".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 8091, 8147) }, + Declaration { id: DeclarationId(1444), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "template".to_string(), ty: DeclarationId(634) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 8510, 8555) }, + Declaration { id: DeclarationId(1445), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "raw".to_string(), ty: DeclarationId(186) }, Field { label: "segment".to_string(), ty: DeclarationId(186) }, Field { label: "reason".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 8560, 8630) }, + Declaration { id: DeclarationId(1446), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 14355, 14365) }, + Declaration { id: DeclarationId(1447), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "key_source".to_string(), ty: DeclarationId(644) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 14370, 14408) }, + Declaration { id: DeclarationId(1448), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "key_source".to_string(), ty: DeclarationId(644) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 14413, 14451) }, + Declaration { id: DeclarationId(1449), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "cause".to_string(), ty: DeclarationId(643) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 14697, 14732) }, + Declaration { id: DeclarationId(1450), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 14737, 14749) }, + Declaration { id: DeclarationId(1451), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(640) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 15171, 15200) }, + Declaration { id: DeclarationId(1452), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(641) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 15205, 15230) }, + Declaration { id: DeclarationId(1453), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 15743, 15753) }, + Declaration { id: DeclarationId(1454), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "method".to_string(), ty: DeclarationId(156) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 15758, 15796) }, + Declaration { id: DeclarationId(1455), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 16501, 16528) }, + Declaration { id: DeclarationId(1456), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "field".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 16533, 16561) }, + Declaration { id: DeclarationId(1457), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 16589, 16601) }, + Declaration { id: DeclarationId(1458), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "fields".to_string(), ty: DeclarationId(1457) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 16566, 16603) }, + Declaration { id: DeclarationId(1459), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 17280, 17293) }, + Declaration { id: DeclarationId(1460), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 17298, 17312) }, + Declaration { id: DeclarationId(1461), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "reason".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 17317, 17349) }, + Declaration { id: DeclarationId(1462), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "effect".to_string(), ty: DeclarationId(648) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 19519, 19560) }, + Declaration { id: DeclarationId(1463), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "operation_name".to_string(), ty: DeclarationId(186) }, Field { label: "method_str".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 19565, 19634) }, + Declaration { id: DeclarationId(1464), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "operation_name".to_string(), ty: DeclarationId(186) }, Field { label: "method".to_string(), ty: DeclarationId(156) }, Field { label: "raw_path".to_string(), ty: DeclarationId(186) }, Field { label: "segment".to_string(), ty: DeclarationId(186) }, Field { label: "reason".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 19639, 19789) }, + Declaration { id: DeclarationId(1465), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 20538, 20559) }, + Declaration { id: DeclarationId(1466), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(712), arguments: vec![TemplateArgument { parameter: DeclarationId(713), value: DeclarationId(648) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 20590, 20617) }, + Declaration { id: DeclarationId(1467), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "first_breaker".to_string(), ty: DeclarationId(1466) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 20564, 20619) }, + Declaration { id: DeclarationId(1468), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(648) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 24543, 24564) }, + Declaration { id: DeclarationId(1469), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "ops".to_string(), ty: DeclarationId(1468) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 24523, 24566) }, + Declaration { id: DeclarationId(1470), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(631), arguments: vec![TemplateArgument { parameter: DeclarationId(632), value: DeclarationId(657) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 24592, 24619) }, + Declaration { id: DeclarationId(1471), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "arms".to_string(), ty: DeclarationId(1470) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 24571, 24621) }, + Declaration { id: DeclarationId(1472), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "body".to_string(), ty: DeclarationId(658) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 24626, 24661) }, + Declaration { id: DeclarationId(1473), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(631), arguments: vec![TemplateArgument { parameter: DeclarationId(632), value: DeclarationId(658) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 24693, 24725) }, + Declaration { id: DeclarationId(1474), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "branches".to_string(), ty: DeclarationId(1473) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 24666, 24727) }, + Declaration { id: DeclarationId(1475), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(650) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 25364, 25410) }, + Declaration { id: DeclarationId(1476), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(659) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 25415, 25467) }, + Declaration { id: DeclarationId(1477), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 25964, 25984) }, + Declaration { id: DeclarationId(1478), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 25989, 26010) }, + Declaration { id: DeclarationId(1479), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 26015, 26038) }, + Declaration { id: DeclarationId(1480), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 26043, 26061) }, + Declaration { id: DeclarationId(1481), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 26066, 26084) }, + Declaration { id: DeclarationId(1482), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(650) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 26401, 26447) }, + Declaration { id: DeclarationId(1483), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(663) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 26452, 26504) }, + Declaration { id: DeclarationId(1484), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 33114, 33120) }, + Declaration { id: DeclarationId(1485), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "reason".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 33125, 33162) }, + Declaration { id: DeclarationId(1486), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "reason".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 33167, 33204) }, + Declaration { id: DeclarationId(1487), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 33678, 33697) }, + Declaration { id: DeclarationId(1488), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "agreement".to_string(), ty: DeclarationId(673) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 33702, 33751) }, + Declaration { id: DeclarationId(1489), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(684), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 15978, 15986) }, + Declaration { id: DeclarationId(1490), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(725), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 16035, 16044) }, + Declaration { id: DeclarationId(1491), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(725), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 16110, 16119) }, + Declaration { id: DeclarationId(1492), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(699), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 16496, 16508) }, + Declaration { id: DeclarationId(1493), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(658), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 16817, 16832) }, + Declaration { id: DeclarationId(1494), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(940), arguments: vec![TemplateArgument { parameter: DeclarationId(941), value: DeclarationId(627) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 17203, 17224) }, + Declaration { id: DeclarationId(1495), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(940), arguments: vec![TemplateArgument { parameter: DeclarationId(941), value: DeclarationId(627) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 17288, 17309) }, + Declaration { id: DeclarationId(1496), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 456, 466) }, + Declaration { id: DeclarationId(1497), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(682) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 471, 490) }, + Declaration { id: DeclarationId(1498), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 495, 505) }, + Declaration { id: DeclarationId(1499), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(625), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 569, 576) }, + Declaration { id: DeclarationId(1500), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 768, 779) }, + Declaration { id: DeclarationId(1501), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 784, 797) }, + Declaration { id: DeclarationId(1502), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 802, 819) }, + Declaration { id: DeclarationId(1503), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(685) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 2850, 2870) }, + Declaration { id: DeclarationId(1504), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 2875, 2903) }, + Declaration { id: DeclarationId(1505), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(627) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 2908, 2942) }, + Declaration { id: DeclarationId(1506), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(627) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 2947, 2976) }, + Declaration { id: DeclarationId(1507), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 2981, 2998) }, + Declaration { id: DeclarationId(1508), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 3602, 3609) }, + Declaration { id: DeclarationId(1509), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "previous".to_string(), ty: DeclarationId(687) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 3614, 3664) }, + Declaration { id: DeclarationId(1510), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 3689, 3698) }, + Declaration { id: DeclarationId(1511), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(687) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 3703, 3739) }, + Declaration { id: DeclarationId(1512), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "lower".to_string(), ty: DeclarationId(690) }, Field { label: "width".to_string(), ty: DeclarationId(688) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4051, 4101) }, + Declaration { id: DeclarationId(1513), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4106, 4115) }, + Declaration { id: DeclarationId(1514), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4366, 4376) }, + Declaration { id: DeclarationId(1515), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4381, 4390) }, + Declaration { id: DeclarationId(1516), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4395, 4404) }, + Declaration { id: DeclarationId(1517), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(685) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4831, 4851) }, + Declaration { id: DeclarationId(1518), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(627) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4856, 4880) }, + Declaration { id: DeclarationId(1519), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(694) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4892, 4908) }, + Declaration { id: DeclarationId(1520), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(1519) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4885, 4909) }, + Declaration { id: DeclarationId(1521), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(695) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4919, 4935) }, + Declaration { id: DeclarationId(1522), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(1521) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4914, 4936) }, + Declaration { id: DeclarationId(1523), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(694) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4945, 4961) }, + Declaration { id: DeclarationId(1524), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(1523) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4941, 4962) }, + Declaration { id: DeclarationId(1525), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(695) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5025, 5041) }, + Declaration { id: DeclarationId(1526), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "constructor".to_string(), ty: DeclarationId(627) }, Field { label: "payload".to_string(), ty: DeclarationId(1525) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4967, 5047) }, + Declaration { id: DeclarationId(1527), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5206, 5235) }, + Declaration { id: DeclarationId(1528), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(694) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5270, 5286) }, + Declaration { id: DeclarationId(1529), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "fields".to_string(), ty: DeclarationId(1528) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5240, 5288) }, + Declaration { id: DeclarationId(1530), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(694) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5306, 5322) }, + Declaration { id: DeclarationId(1531), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(1530) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5293, 5323) }, + Declaration { id: DeclarationId(1532), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(625) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5658, 5677) }, + Declaration { id: DeclarationId(1533), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(627) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5682, 5716) }, + Declaration { id: DeclarationId(1534), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5721, 5728) }, + Declaration { id: DeclarationId(1535), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5733, 5739) }, + Declaration { id: DeclarationId(1536), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5744, 5764) }, + Declaration { id: DeclarationId(1537), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(686) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5993, 6010) }, + Declaration { id: DeclarationId(1538), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(692) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6032, 6047) }, + Declaration { id: DeclarationId(1539), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "children".to_string(), ty: DeclarationId(1538) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6015, 6049) }, + Declaration { id: DeclarationId(1540), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(692) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6071, 6086) }, + Declaration { id: DeclarationId(1541), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "variants".to_string(), ty: DeclarationId(1540) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6054, 6088) }, + Declaration { id: DeclarationId(1542), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(627) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6115, 6134) }, + Declaration { id: DeclarationId(1543), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "inputs".to_string(), ty: DeclarationId(1542) }, Field { label: "output".to_string(), ty: DeclarationId(627) }, Field { label: "body".to_string(), ty: DeclarationId(697) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6093, 6190) }, + Declaration { id: DeclarationId(1544), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "element".to_string(), ty: DeclarationId(627) }, Field { label: "bound".to_string(), ty: DeclarationId(691) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6195, 6273) }, + Declaration { id: DeclarationId(1545), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(693) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6341, 6363) }, + Declaration { id: DeclarationId(1546), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "template".to_string(), ty: DeclarationId(627) }, Field { label: "arguments".to_string(), ty: DeclarationId(1545) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6278, 6369) }, + Declaration { id: DeclarationId(1547), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6418, 6425) }, + Declaration { id: DeclarationId(1548), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(627) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6470, 6489) }, + Declaration { id: DeclarationId(1549), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(700) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6508, 6530) }, + Declaration { id: DeclarationId(1550), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(627), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6543, 6557) }, + Declaration { id: DeclarationId(1551), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(627), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6570, 6584) }, + Declaration { id: DeclarationId(1552), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(696), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6599, 6609) }, + Declaration { id: DeclarationId(1553), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(701), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6629, 6644) }, + Declaration { id: DeclarationId(1554), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(627) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 7767, 7786) }, + Declaration { id: DeclarationId(1555), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8067, 8070) }, + Declaration { id: DeclarationId(1556), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8075, 8078) }, + Declaration { id: DeclarationId(1557), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8083, 8086) }, + Declaration { id: DeclarationId(1558), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8091, 8094) }, + Declaration { id: DeclarationId(1559), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8218, 8220) }, + Declaration { id: DeclarationId(1560), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8225, 8227) }, + Declaration { id: DeclarationId(1561), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8232, 8234) }, + Declaration { id: DeclarationId(1562), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8239, 8241) }, + Declaration { id: DeclarationId(1563), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8246, 8248) }, + Declaration { id: DeclarationId(1564), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8253, 8255) }, + Declaration { id: DeclarationId(1565), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8508, 8511) }, + Declaration { id: DeclarationId(1566), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8516, 8518) }, + Declaration { id: DeclarationId(1567), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(702) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8754, 8778) }, + Declaration { id: DeclarationId(1568), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(703) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8783, 8807) }, + Declaration { id: DeclarationId(1569), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(704) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8812, 8830) }, + Declaration { id: DeclarationId(1570), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(627) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9017, 9040) }, + Declaration { id: DeclarationId(1571), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(627), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9105, 9119) }, + Declaration { id: DeclarationId(1572), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "field_label".to_string(), ty: DeclarationId(186) }, Field { label: "field_child".to_string(), ty: DeclarationId(1571) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9045, 9125) }, + Declaration { id: DeclarationId(1573), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(705) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9130, 9152) }, + Declaration { id: DeclarationId(1574), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9277, 9329) }, + Declaration { id: DeclarationId(1575), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(627) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9334, 9364) }, + Declaration { id: DeclarationId(1576), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(708), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9528, 9543) }, + Declaration { id: DeclarationId(1577), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(631), arguments: vec![TemplateArgument { parameter: DeclarationId(632), value: DeclarationId(714) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 11519, 11550) }, + Declaration { id: DeclarationId(1578), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(629), arguments: vec![TemplateArgument { parameter: DeclarationId(630), value: DeclarationId(715) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 11574, 11604) }, + Declaration { id: DeclarationId(1579), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "count".to_string(), ty: DeclarationId(626) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12030, 12059) }, + Declaration { id: DeclarationId(1580), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "cluster".to_string(), ty: DeclarationId(628) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12064, 12094) }, + Declaration { id: DeclarationId(1581), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(658), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12208, 12223) }, + Declaration { id: DeclarationId(1582), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(626) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12297, 12309) }, + Declaration { id: DeclarationId(1583), name: None, connective: TypeConnective::Atom(AtomPayload::UnresolvedIdentifier("UserMatch".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12550, 12559) }, + Declaration { id: DeclarationId(1584), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(709) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12617, 12633) }, + Declaration { id: DeclarationId(1585), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(720), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12697, 12721) }, + Declaration { id: DeclarationId(1586), name: None, connective: TypeConnective::Atom(AtomPayload::UnresolvedIdentifier("UserCallable".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13135, 13147) }, + Declaration { id: DeclarationId(1587), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(626) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13225, 13237) }, + Declaration { id: DeclarationId(1588), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(658), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13275, 13290) }, + Declaration { id: DeclarationId(1589), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(723), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13313, 13335) }, + Declaration { id: DeclarationId(1590), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(718) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13427, 13443) }, + Declaration { id: DeclarationId(1591), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(719) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13448, 13472) }, + Declaration { id: DeclarationId(1592), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(721) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13477, 13495) }, + Declaration { id: DeclarationId(1593), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(722) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13500, 13514) }, + Declaration { id: DeclarationId(1594), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(724) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13519, 13533) }, + Declaration { id: DeclarationId(1595), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(699) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13562, 13579) }, + Declaration { id: DeclarationId(1596), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(725) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13589, 13603) }, + Declaration { id: DeclarationId(1597), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(684) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13613, 13626) }, + Declaration { id: DeclarationId(1598), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(716) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13639, 13652) }, + Declaration { id: DeclarationId(1599), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(940), arguments: vec![TemplateArgument { parameter: DeclarationId(941), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 9849, 9869) }, + Declaration { id: DeclarationId(1600), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(940), arguments: vec![TemplateArgument { parameter: DeclarationId(941), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 9933, 9953) }, + Declaration { id: DeclarationId(1601), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(631), arguments: vec![TemplateArgument { parameter: DeclarationId(632), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 10021, 10051) }, + Declaration { id: DeclarationId(1602), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 10518, 10536) }, + Declaration { id: DeclarationId(1603), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(631), arguments: vec![TemplateArgument { parameter: DeclarationId(632), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 10542, 10572) }, + Declaration { id: DeclarationId(1604), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 13069, 13087) }, + Declaration { id: DeclarationId(1605), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(631), arguments: vec![TemplateArgument { parameter: DeclarationId(632), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17290, 17320) }, + Declaration { id: DeclarationId(1606), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17325, 17343) }, + Declaration { id: DeclarationId(1607), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17594, 17612) }, + Declaration { id: DeclarationId(1608), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17617, 17635) }, + Declaration { id: DeclarationId(1609), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 18901, 18919) }, + Declaration { id: DeclarationId(1610), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 19172, 19190) }, + Declaration { id: DeclarationId(1611), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 19638, 19656) }, + Declaration { id: DeclarationId(1612), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21673, 21691) }, + Declaration { id: DeclarationId(1613), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21721, 21739) }, + Declaration { id: DeclarationId(1614), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 22026, 22044) }, + Declaration { id: DeclarationId(1615), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 22072, 22090) }, + Declaration { id: DeclarationId(1616), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 22450, 22468) }, + Declaration { id: DeclarationId(1617), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 22473, 22491) }, + Declaration { id: DeclarationId(1618), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 4805, 4817) }, + Declaration { id: DeclarationId(1619), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 4822, 4838) }, + Declaration { id: DeclarationId(1620), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 4843, 4857) }, + Declaration { id: DeclarationId(1621), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 5707, 5720) }, + Declaration { id: DeclarationId(1622), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 5725, 5740) }, + Declaration { id: DeclarationId(1623), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 5745, 5761) }, + Declaration { id: DeclarationId(1624), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 5766, 5779) }, + Declaration { id: DeclarationId(1625), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(737), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 6632, 6653) }, + Declaration { id: DeclarationId(1626), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(738), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 6668, 6678) }, + Declaration { id: DeclarationId(1627), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 6708, 6712) }, + Declaration { id: DeclarationId(1628), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8181, 8190) }, + Declaration { id: DeclarationId(1629), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "previous".to_string(), ty: DeclarationId(741) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8195, 8241) }, + Declaration { id: DeclarationId(1630), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8413, 8430) }, + Declaration { id: DeclarationId(1631), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(740) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8435, 8459) }, + Declaration { id: DeclarationId(1632), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "var".to_string(), ty: DeclarationId(740) }, Field { label: "degree".to_string(), ty: DeclarationId(741) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8464, 8526) }, + Declaration { id: DeclarationId(1633), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(631), arguments: vec![TemplateArgument { parameter: DeclarationId(632), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8543, 8573) }, + Declaration { id: DeclarationId(1634), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(1633) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8531, 8574) }, + Declaration { id: DeclarationId(1635), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(631), arguments: vec![TemplateArgument { parameter: DeclarationId(632), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8587, 8617) }, + Declaration { id: DeclarationId(1636), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(1635) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8579, 8618) }, + Declaration { id: DeclarationId(1637), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(740) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8623, 8644) }, + Declaration { id: DeclarationId(1638), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8649, 8668) }, + Declaration { id: DeclarationId(1639), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(595), arguments: vec![TemplateArgument { parameter: DeclarationId(596), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 10402, 10414) }, + Declaration { id: DeclarationId(1640), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(632)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5879, 5892) }, + Declaration { id: DeclarationId(1641), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(608), arguments: vec![TemplateArgument { parameter: DeclarationId(609), value: DeclarationId(742) }, TemplateArgument { parameter: DeclarationId(1404), value: DeclarationId(749) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 10395, 10442) }, + Declaration { id: DeclarationId(1642), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(595), arguments: vec![TemplateArgument { parameter: DeclarationId(596), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 10702, 10717) }, + Declaration { id: DeclarationId(1643), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(742), DeclarationId(742)], output: DeclarationId(742), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4183, 4196) }, + Declaration { id: DeclarationId(1644), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(597), arguments: vec![TemplateArgument { parameter: DeclarationId(599), value: DeclarationId(742) }, TemplateArgument { parameter: DeclarationId(598), value: DeclarationId(742) }, TemplateArgument { parameter: DeclarationId(1394), value: DeclarationId(753) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 13109, 13152) }, + Declaration { id: DeclarationId(1645), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(743), DeclarationId(598)], output: DeclarationId(743), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4183, 4196) }, + Declaration { id: DeclarationId(1646), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(597), arguments: vec![TemplateArgument { parameter: DeclarationId(599), value: DeclarationId(743) }, TemplateArgument { parameter: DeclarationId(1394), value: DeclarationId(770) }, TemplateArgument { parameter: DeclarationId(598), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 15818, 15928) }, + Declaration { id: DeclarationId(1647), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(743), DeclarationId(598)], output: DeclarationId(743), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4183, 4196) }, + Declaration { id: DeclarationId(1648), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(597), arguments: vec![TemplateArgument { parameter: DeclarationId(599), value: DeclarationId(743) }, TemplateArgument { parameter: DeclarationId(1394), value: DeclarationId(770) }, TemplateArgument { parameter: DeclarationId(598), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 15983, 16093) }, + Declaration { id: DeclarationId(1649), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(593), arguments: vec![TemplateArgument { parameter: DeclarationId(594), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17366, 17396) }, + Declaration { id: DeclarationId(1650), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(593), arguments: vec![TemplateArgument { parameter: DeclarationId(594), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17348, 17397) }, + Declaration { id: DeclarationId(1651), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(591), arguments: vec![TemplateArgument { parameter: DeclarationId(592), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17667, 17674) }, + Declaration { id: DeclarationId(1652), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(593), arguments: vec![TemplateArgument { parameter: DeclarationId(594), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17792, 17835) }, + Declaration { id: DeclarationId(1653), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(593), arguments: vec![TemplateArgument { parameter: DeclarationId(594), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 19105, 19137) }, + Declaration { id: DeclarationId(1654), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(591), arguments: vec![TemplateArgument { parameter: DeclarationId(592), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21776, 21783) }, + Declaration { id: DeclarationId(1655), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(593), arguments: vec![TemplateArgument { parameter: DeclarationId(594), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21924, 21989) }, + Declaration { id: DeclarationId(1656), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(743), DeclarationId(742)], output: DeclarationId(743), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4183, 4196) }, + Declaration { id: DeclarationId(1657), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(597), arguments: vec![TemplateArgument { parameter: DeclarationId(599), value: DeclarationId(743) }, TemplateArgument { parameter: DeclarationId(598), value: DeclarationId(742) }, TemplateArgument { parameter: DeclarationId(1394), value: DeclarationId(770) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 22107, 22165) }, + Declaration { id: DeclarationId(1658), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(593), arguments: vec![TemplateArgument { parameter: DeclarationId(594), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 22191, 22237) }, + Declaration { id: DeclarationId(1659), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(591), arguments: vec![TemplateArgument { parameter: DeclarationId(592), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 22508, 22515) }, + Declaration { id: DeclarationId(1660), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1617), DeclarationId(742)], output: DeclarationId(1617), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4183, 4196) }, + Declaration { id: DeclarationId(1661), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(597), arguments: vec![TemplateArgument { parameter: DeclarationId(599), value: DeclarationId(1617) }, TemplateArgument { parameter: DeclarationId(598), value: DeclarationId(742) }, TemplateArgument { parameter: DeclarationId(1394), value: DeclarationId(773) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 22496, 22537) }, + Declaration { id: DeclarationId(1662), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 2224, 2238) }, + Declaration { id: DeclarationId(1663), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 2243, 2268) }, + Declaration { id: DeclarationId(1664), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 2273, 2283) }, + Declaration { id: DeclarationId(1665), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 2548, 2565) }, + Declaration { id: DeclarationId(1666), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 2570, 2594) }, + Declaration { id: DeclarationId(1667), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 2599, 2631) }, + Declaration { id: DeclarationId(1668), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 2636, 2663) }, + Declaration { id: DeclarationId(1669), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3369, 3393) }, + Declaration { id: DeclarationId(1670), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3398, 3430) }, + Declaration { id: DeclarationId(1671), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3564, 3588) }, + Declaration { id: DeclarationId(1672), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3593, 3614) }, + Declaration { id: DeclarationId(1673), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3619, 3637) }, + Declaration { id: DeclarationId(1674), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3781, 3796) }, + Declaration { id: DeclarationId(1675), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3801, 3831) }, + Declaration { id: DeclarationId(1676), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3836, 3857) }, + Declaration { id: DeclarationId(1677), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 4024, 4044) }, + Declaration { id: DeclarationId(1678), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 4049, 4076) }, + Declaration { id: DeclarationId(1679), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 4081, 4095) }, + Declaration { id: DeclarationId(1680), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 4354, 4362) }, + Declaration { id: DeclarationId(1681), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 4367, 4393) }, + Declaration { id: DeclarationId(1682), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 4398, 4423) }, + Declaration { id: DeclarationId(1683), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 5320, 5332) }, + Declaration { id: DeclarationId(1684), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 5693, 5713) }, + Declaration { id: DeclarationId(1685), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 5718, 5736) }, + Declaration { id: DeclarationId(1686), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 5741, 5759) }, + Declaration { id: DeclarationId(1687), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 5764, 5791) }, + Declaration { id: DeclarationId(1688), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 5361, 5368) }, + Declaration { id: DeclarationId(1689), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 6292, 6296) }, + Declaration { id: DeclarationId(1690), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(799), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 7350, 7369) }, + Declaration { id: DeclarationId(1691), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(799), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 7915, 7934) }, + Declaration { id: DeclarationId(1692), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1356, 1388) }, + Declaration { id: DeclarationId(1693), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "witness".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1393, 1429) }, + Declaration { id: DeclarationId(1694), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "element".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1434, 1471) }, + Declaration { id: DeclarationId(1695), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1476, 1502) }, + Declaration { id: DeclarationId(1696), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1507, 1540) }, + Declaration { id: DeclarationId(1697), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1545, 1562) }, + Declaration { id: DeclarationId(1698), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "steps".to_string(), ty: DeclarationId(971) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1567, 1621) }, + Declaration { id: DeclarationId(1699), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1626, 1633) }, + Declaration { id: DeclarationId(1700), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "accessor".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2165, 2203) }, + Declaration { id: DeclarationId(1701), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "amount".to_string(), ty: DeclarationId(971) }, Field { label: "collection".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2208, 2282) }, + Declaration { id: DeclarationId(1702), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "steps".to_string(), ty: DeclarationId(971) }, Field { label: "ring_param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2287, 2362) }, + Declaration { id: DeclarationId(1703), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "divisor".to_string(), ty: DeclarationId(972) }, Field { label: "ring_param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2367, 2440) }, + Declaration { id: DeclarationId(1704), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "witness".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2445, 2482) }, + Declaration { id: DeclarationId(1705), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "element".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2487, 2524) }, + Declaration { id: DeclarationId(1706), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "outer_collection".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2529, 2570) }, + Declaration { id: DeclarationId(1707), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2575, 2591) }, + Declaration { id: DeclarationId(1708), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2803, 2813) }, + Declaration { id: DeclarationId(1709), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "steps".to_string(), ty: DeclarationId(971) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2818, 2865) }, + Declaration { id: DeclarationId(1710), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "divisor".to_string(), ty: DeclarationId(972) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2870, 2921) }, + Declaration { id: DeclarationId(1711), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 3111, 3115) }, + Declaration { id: DeclarationId(1712), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 3120, 3127) }, + Declaration { id: DeclarationId(1713), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 3132, 3138) }, + Declaration { id: DeclarationId(1714), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(791), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 3441, 3454) }, + Declaration { id: DeclarationId(1715), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 7082, 7093) }, + Declaration { id: DeclarationId(1716), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 7142, 7156) }, + Declaration { id: DeclarationId(1717), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 7221, 7237) }, + Declaration { id: DeclarationId(1718), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 360, 369) }, + Declaration { id: DeclarationId(1719), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 374, 381) }, + Declaration { id: DeclarationId(1720), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 614, 618) }, + Declaration { id: DeclarationId(1721), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 623, 632) }, + Declaration { id: DeclarationId(1722), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 910, 921) }, + Declaration { id: DeclarationId(1723), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 926, 935) }, + Declaration { id: DeclarationId(1724), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 1166, 1173) }, + Declaration { id: DeclarationId(1725), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 1178, 1187) }, + Declaration { id: DeclarationId(1726), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2035, 2044) }, + Declaration { id: DeclarationId(1727), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2049, 2065) }, + Declaration { id: DeclarationId(1728), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2070, 2080) }, + Declaration { id: DeclarationId(1729), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2085, 2099) }, + Declaration { id: DeclarationId(1730), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2385, 2399) }, + Declaration { id: DeclarationId(1731), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2404, 2418) }, + Declaration { id: DeclarationId(1732), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2818, 2830) }, + Declaration { id: DeclarationId(1733), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 3210, 3222) }, + Declaration { id: DeclarationId(1734), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 3694, 3708) }, + Declaration { id: DeclarationId(1735), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 3713, 3729) }, + Declaration { id: DeclarationId(1736), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 1022, 1036) }, + Declaration { id: DeclarationId(1737), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 1041, 1051) }, + Declaration { id: DeclarationId(1738), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 1056, 1068) }, + Declaration { id: DeclarationId(1739), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 1073, 1085) }, + Declaration { id: DeclarationId(1740), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 1090, 1103) }, + Declaration { id: DeclarationId(1741), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 1108, 1120) }, + Declaration { id: DeclarationId(1742), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 1125, 1148) }, + Declaration { id: DeclarationId(1743), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(815) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 5348, 5384) }, + Declaration { id: DeclarationId(1744), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(818) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 5389, 5430) }, + Declaration { id: DeclarationId(1745), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(816) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 5889, 5905) }, + Declaration { id: DeclarationId(1746), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(31), arguments: vec![TemplateArgument { parameter: DeclarationId(32), value: DeclarationId(840) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4196, 4216) }, + Declaration { id: DeclarationId(1747), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(828), arguments: vec![TemplateArgument { parameter: DeclarationId(829), value: DeclarationId(839) }, TemplateArgument { parameter: DeclarationId(830), value: DeclarationId(840) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4226, 4250) }, + Declaration { id: DeclarationId(1748), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(828), arguments: vec![TemplateArgument { parameter: DeclarationId(829), value: DeclarationId(839) }, TemplateArgument { parameter: DeclarationId(830), value: DeclarationId(840) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4261, 4285) }, + Declaration { id: DeclarationId(1749), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(828), arguments: vec![TemplateArgument { parameter: DeclarationId(829), value: DeclarationId(839) }, TemplateArgument { parameter: DeclarationId(830), value: DeclarationId(840) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4291, 4315) }, + Declaration { id: DeclarationId(1750), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(31), arguments: vec![TemplateArgument { parameter: DeclarationId(32), value: DeclarationId(843) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4392, 4412) }, + Declaration { id: DeclarationId(1751), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(828), arguments: vec![TemplateArgument { parameter: DeclarationId(829), value: DeclarationId(842) }, TemplateArgument { parameter: DeclarationId(830), value: DeclarationId(843) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4422, 4446) }, + Declaration { id: DeclarationId(1752), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(828), arguments: vec![TemplateArgument { parameter: DeclarationId(829), value: DeclarationId(842) }, TemplateArgument { parameter: DeclarationId(830), value: DeclarationId(843) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4457, 4481) }, + Declaration { id: DeclarationId(1753), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(828), arguments: vec![TemplateArgument { parameter: DeclarationId(829), value: DeclarationId(842) }, TemplateArgument { parameter: DeclarationId(830), value: DeclarationId(843) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4487, 4511) }, + Declaration { id: DeclarationId(1754), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(31), arguments: vec![TemplateArgument { parameter: DeclarationId(32), value: DeclarationId(846) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4595, 4615) }, + Declaration { id: DeclarationId(1755), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(828), arguments: vec![TemplateArgument { parameter: DeclarationId(829), value: DeclarationId(845) }, TemplateArgument { parameter: DeclarationId(830), value: DeclarationId(846) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4626, 4650) }, + Declaration { id: DeclarationId(1756), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(828), arguments: vec![TemplateArgument { parameter: DeclarationId(829), value: DeclarationId(845) }, TemplateArgument { parameter: DeclarationId(830), value: DeclarationId(846) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4675, 4699) }, + Declaration { id: DeclarationId(1757), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(31), arguments: vec![TemplateArgument { parameter: DeclarationId(32), value: DeclarationId(849) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4790, 4810) }, + Declaration { id: DeclarationId(1758), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(828), arguments: vec![TemplateArgument { parameter: DeclarationId(829), value: DeclarationId(848) }, TemplateArgument { parameter: DeclarationId(830), value: DeclarationId(849) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4821, 4845) }, + Declaration { id: DeclarationId(1759), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(828), arguments: vec![TemplateArgument { parameter: DeclarationId(829), value: DeclarationId(848) }, TemplateArgument { parameter: DeclarationId(830), value: DeclarationId(849) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4870, 4894) }, + Declaration { id: DeclarationId(1760), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(822) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 1626, 1643) }, + Declaration { id: DeclarationId(1761), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "reason".to_string(), ty: DeclarationId(186) }, Field { label: "at".to_string(), ty: DeclarationId(725) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 1648, 1689) }, + Declaration { id: DeclarationId(1762), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 1871, 1883) }, + Declaration { id: DeclarationId(1763), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "value".to_string(), ty: DeclarationId(820) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 1888, 1924) }, + Declaration { id: DeclarationId(1764), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(821), arguments: vec![TemplateArgument { parameter: DeclarationId(822), value: DeclarationId(825) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 2406, 2422) }, + Declaration { id: DeclarationId(1765), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(1764) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 2401, 2423) }, + Declaration { id: DeclarationId(1766), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "dimension_name".to_string(), ty: DeclarationId(186) }, Field { label: "composed".to_string(), ty: DeclarationId(825) }, Field { label: "witnesses".to_string(), ty: DeclarationId(1765) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 2317, 2429) }, + Declaration { id: DeclarationId(1767), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(820) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 2497, 2513) }, + Declaration { id: DeclarationId(1768), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(821), arguments: vec![TemplateArgument { parameter: DeclarationId(822), value: DeclarationId(825) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 2536, 2552) }, + Declaration { id: DeclarationId(1769), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(1768) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 2531, 2553) }, + Declaration { id: DeclarationId(1770), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "dimension_name".to_string(), ty: DeclarationId(186) }, Field { label: "violations".to_string(), ty: DeclarationId(1767) }, Field { label: "witnesses".to_string(), ty: DeclarationId(1769) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 2434, 2559) }, + Declaration { id: DeclarationId(1771), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(821), arguments: vec![TemplateArgument { parameter: DeclarationId(822), value: DeclarationId(827) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 3216, 3232) }, + Declaration { id: DeclarationId(1772), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(726), DeclarationId(725)], output: DeclarationId(1771), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 3195, 3232) }, + Declaration { id: DeclarationId(1773), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(827), DeclarationId(827)], output: DeclarationId(827), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 3244, 3275) }, + Declaration { id: DeclarationId(1774), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(725), DeclarationId(827)], output: DeclarationId(823), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 3316, 3359) }, + Declaration { id: DeclarationId(1775), name: Some("DimensionUnitAbelianGroup".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(25), arguments: vec![TemplateArgument { parameter: DeclarationId(26), value: DeclarationId(829) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4002, 4052) }, + Declaration { id: DeclarationId(1776), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(851) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 815, 833) }, + Declaration { id: DeclarationId(1777), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 1337, 1356) }, + Declaration { id: DeclarationId(1778), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 1361, 1383) }, + Declaration { id: DeclarationId(1779), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(856) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 1752, 1775) }, + Declaration { id: DeclarationId(1780), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 2772, 2780) }, + Declaration { id: DeclarationId(1781), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 2785, 2793) }, + Declaration { id: DeclarationId(1782), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3345, 3354) }, + Declaration { id: DeclarationId(1783), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3359, 3372) }, + Declaration { id: DeclarationId(1784), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3377, 3385) }, + Declaration { id: DeclarationId(1785), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3390, 3400) }, + Declaration { id: DeclarationId(1786), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3405, 3415) }, + Declaration { id: DeclarationId(1787), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3420, 3431) }, + Declaration { id: DeclarationId(1788), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3436, 3444) }, + Declaration { id: DeclarationId(1789), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3449, 3456) }, + Declaration { id: DeclarationId(1790), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3461, 3471) }, + Declaration { id: DeclarationId(1791), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3476, 3488) }, + Declaration { id: DeclarationId(1792), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6181, 6207) }, + Declaration { id: DeclarationId(1793), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6212, 6222) }, + Declaration { id: DeclarationId(1794), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 9950, 9956) }, + Declaration { id: DeclarationId(1795), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 9961, 9972) }, + Declaration { id: DeclarationId(1796), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 10292, 10303) }, + Declaration { id: DeclarationId(1797), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 10308, 10319) }, + Declaration { id: DeclarationId(1798), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 12252, 12263) }, + Declaration { id: DeclarationId(1799), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 12268, 12276) }, + Declaration { id: DeclarationId(1800), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(880) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/go_method_template_contracts.dag", 2440, 2468) }, + Declaration { id: DeclarationId(1801), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(790), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 20442, 20454) }, + Declaration { id: DeclarationId(1802), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(793), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 21827, 21842) }, + Declaration { id: DeclarationId(1803), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(902) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 27734, 27749) }, + Declaration { id: DeclarationId(1804), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 31887, 31891) }, + Declaration { id: DeclarationId(1805), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 32183, 32187) }, + Declaration { id: DeclarationId(1806), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 33432, 33436) }, + Declaration { id: DeclarationId(1807), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 33907, 33911) }, + Declaration { id: DeclarationId(1808), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 35170, 35174) }, + Declaration { id: DeclarationId(1809), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 35442, 35446) }, + Declaration { id: DeclarationId(1810), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 5562, 5577) }, + Declaration { id: DeclarationId(1811), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 5617, 5630) }, + Declaration { id: DeclarationId(1812), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 5678, 5695) }, + Declaration { id: DeclarationId(1813), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 5734, 5746) }, + Declaration { id: DeclarationId(1814), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 5794, 5811) }, + Declaration { id: DeclarationId(1815), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "field".to_string(), ty: DeclarationId(886) }, Field { label: "factor".to_string(), ty: DeclarationId(791) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 9904, 9966) }, + Declaration { id: DeclarationId(1816), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "field".to_string(), ty: DeclarationId(886) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 9971, 10013) }, + Declaration { id: DeclarationId(1817), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }, Field { label: "factor".to_string(), ty: DeclarationId(791) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 10018, 10075) }, + Declaration { id: DeclarationId(1818), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 10080, 10094) }, + Declaration { id: DeclarationId(1819), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 10099, 10114) }, + Declaration { id: DeclarationId(1820), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 24019, 24033) }, + Declaration { id: DeclarationId(1821), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "degree".to_string(), ty: DeclarationId(971) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 24038, 24085) }, + Declaration { id: DeclarationId(1822), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "numerator".to_string(), ty: DeclarationId(971) }, Field { label: "root".to_string(), ty: DeclarationId(971) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 24090, 24167) }, + Declaration { id: DeclarationId(1823), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "base".to_string(), ty: DeclarationId(972) }, Field { label: "argument".to_string(), ty: DeclarationId(971) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 24172, 24246) }, + Declaration { id: DeclarationId(1824), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }, Field { label: "exponent".to_string(), ty: DeclarationId(899) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 24866, 24922) }, + Declaration { id: DeclarationId(1825), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 24938, 24963) }, + Declaration { id: DeclarationId(1826), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 26612, 26625) }, + Declaration { id: DeclarationId(1827), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "cost".to_string(), ty: DeclarationId(901) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 26669, 26701) }, + Declaration { id: DeclarationId(1828), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(901) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 26764, 26780) }, + Declaration { id: DeclarationId(1829), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "factors".to_string(), ty: DeclarationId(1828) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 26740, 26782) }, + Declaration { id: DeclarationId(1830), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(901) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 26844, 26860) }, + Declaration { id: DeclarationId(1831), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(1830) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 26839, 26861) }, + Declaration { id: DeclarationId(1832), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "terms".to_string(), ty: DeclarationId(1831) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 26811, 26863) }, + Declaration { id: DeclarationId(1833), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(902) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 27161, 27176) }, + Declaration { id: DeclarationId(1834), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "terms".to_string(), ty: DeclarationId(1833) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 27143, 27178) }, + Declaration { id: DeclarationId(1835), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 27261, 27273) }, + Declaration { id: DeclarationId(1836), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 27343, 27353) }, + Declaration { id: DeclarationId(1837), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(821), arguments: vec![TemplateArgument { parameter: DeclarationId(822), value: DeclarationId(939) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lens.dag", 4180, 4190) }, + Declaration { id: DeclarationId(1838), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(726), DeclarationId(725)], output: DeclarationId(1837), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lens.dag", 4159, 4190) }, + Declaration { id: DeclarationId(1839), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(19), arguments: vec![TemplateArgument { parameter: DeclarationId(20), value: DeclarationId(939) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lens.dag", 4205, 4214) }, + Declaration { id: DeclarationId(1840), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(939), DeclarationId(939)], output: DeclarationId(939), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lens.dag", 4225, 4238) }, + Declaration { id: DeclarationId(1841), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(939), DeclarationId(717)], output: DeclarationId(939), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lens.dag", 4250, 4271) }, + Declaration { id: DeclarationId(1842), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(726), DeclarationId(939)], output: DeclarationId(823), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lens.dag", 4284, 4316) }, + Declaration { id: DeclarationId(1843), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(940), arguments: vec![TemplateArgument { parameter: DeclarationId(941), value: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lookup.dag", 4577, 4588) }, + Declaration { id: DeclarationId(1844), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(940), arguments: vec![TemplateArgument { parameter: DeclarationId(941), value: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lookup.dag", 4630, 4641) }, + Declaration { id: DeclarationId(1845), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lookup.dag", 4532, 4536) }, + Declaration { id: DeclarationId(1846), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(941) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lookup.dag", 4541, 4551) }, + Declaration { id: DeclarationId(1847), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(958) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 1179, 1196) }, + Declaration { id: DeclarationId(1848), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(957), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 1267, 1279) }, + Declaration { id: DeclarationId(1849), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(950) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 1747, 1764) }, + Declaration { id: DeclarationId(1850), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(1849) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 1736, 1765) }, + Declaration { id: DeclarationId(1851), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(947) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 1777, 1795) }, + Declaration { id: DeclarationId(1852), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(1851) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 1770, 1796) }, + Declaration { id: DeclarationId(1853), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 2073, 2113) }, + Declaration { id: DeclarationId(1854), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(950) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 2165, 2182) }, + Declaration { id: DeclarationId(1855), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "args".to_string(), ty: DeclarationId(1854) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 2118, 2211) }, + Declaration { id: DeclarationId(1856), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "inner".to_string(), ty: DeclarationId(950) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 2216, 2280) }, + Declaration { id: DeclarationId(1857), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(950) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 2307, 2324) }, + Declaration { id: DeclarationId(1858), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "inputs".to_string(), ty: DeclarationId(1857) }, Field { label: "output".to_string(), ty: DeclarationId(950) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 2285, 2379) }, + Declaration { id: DeclarationId(1859), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 3749, 3795) }, + Declaration { id: DeclarationId(1860), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "binding".to_string(), ty: DeclarationId(186) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 3800, 3883) }, + Declaration { id: DeclarationId(1861), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(954) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 3937, 3962) }, + Declaration { id: DeclarationId(1862), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "fields".to_string(), ty: DeclarationId(1861) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 3888, 3991) }, + Declaration { id: DeclarationId(1863), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 4578, 4586) }, + Declaration { id: DeclarationId(1864), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 4591, 4601) }, + Declaration { id: DeclarationId(1865), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 4606, 4620) }, + Declaration { id: DeclarationId(1866), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "value".to_string(), ty: DeclarationId(956) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 4734, 4785) }, + Declaration { id: DeclarationId(1867), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 4790, 4828) }, + Declaration { id: DeclarationId(1868), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 4856, 4868) }, + Declaration { id: DeclarationId(1869), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 4890, 4906) }, + Declaration { id: DeclarationId(1870), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "segments".to_string(), ty: DeclarationId(1868) }, Field { label: "segment_spans".to_string(), ty: DeclarationId(1869) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 4833, 4935) }, + Declaration { id: DeclarationId(1871), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(957) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 4980, 4997) }, + Declaration { id: DeclarationId(1872), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "target".to_string(), ty: DeclarationId(186) }, Field { label: "args".to_string(), ty: DeclarationId(1871) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 4940, 5026) }, + Declaration { id: DeclarationId(1873), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(951) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 5082, 5106) }, + Declaration { id: DeclarationId(1874), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "target".to_string(), ty: DeclarationId(186) }, Field { label: "fields".to_string(), ty: DeclarationId(1873) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 5031, 5135) }, + Declaration { id: DeclarationId(1875), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(957) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 5186, 5203) }, + Declaration { id: DeclarationId(1876), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "op".to_string(), ty: DeclarationId(705) }, Field { label: "args".to_string(), ty: DeclarationId(1875) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 5140, 5232) }, + Declaration { id: DeclarationId(1877), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 5260, 5272) }, + Declaration { id: DeclarationId(1878), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "params".to_string(), ty: DeclarationId(1877) }, Field { label: "body".to_string(), ty: DeclarationId(957) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 5237, 5325) }, + Declaration { id: DeclarationId(1879), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "cond".to_string(), ty: DeclarationId(957) }, Field { label: "then_branch".to_string(), ty: DeclarationId(957) }, Field { label: "else_branch".to_string(), ty: DeclarationId(957) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 5330, 5449) }, + Declaration { id: DeclarationId(1880), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(953) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 5503, 5524) }, + Declaration { id: DeclarationId(1881), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "scrutinee".to_string(), ty: DeclarationId(957) }, Field { label: "arms".to_string(), ty: DeclarationId(1880) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 5454, 5553) }, + Declaration { id: DeclarationId(1882), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(951) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 5581, 5605) }, + Declaration { id: DeclarationId(1883), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "fields".to_string(), ty: DeclarationId(1882) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 5558, 5634) }, + Declaration { id: DeclarationId(1884), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(957) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 5662, 5679) }, + Declaration { id: DeclarationId(1885), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "elements".to_string(), ty: DeclarationId(1884) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 5639, 5708) }, + Declaration { id: DeclarationId(1886), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(952) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 7802, 7823) }, + Declaration { id: DeclarationId(1887), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "entries".to_string(), ty: DeclarationId(1886) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 7781, 7852) }, + Declaration { id: DeclarationId(1888), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(950), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 8783, 8795) }, + Declaration { id: DeclarationId(1889), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "type_ann".to_string(), ty: DeclarationId(1888) }, Field { label: "expr".to_string(), ty: DeclarationId(957) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 8742, 8825) }, + Declaration { id: DeclarationId(1890), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 8873, 8885) }, + Declaration { id: DeclarationId(1891), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(946) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 8900, 8918) }, + Declaration { id: DeclarationId(1892), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "type_params".to_string(), ty: DeclarationId(1890) }, Field { label: "params".to_string(), ty: DeclarationId(1891) }, Field { label: "return_type".to_string(), ty: DeclarationId(950) }, Field { label: "body".to_string(), ty: DeclarationId(957) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 8830, 9002) }, + Declaration { id: DeclarationId(1893), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9062, 9074) }, + Declaration { id: DeclarationId(1894), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(946) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9089, 9107) }, + Declaration { id: DeclarationId(1895), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "type_params".to_string(), ty: DeclarationId(1893) }, Field { label: "params".to_string(), ty: DeclarationId(1894) }, Field { label: "return_type".to_string(), ty: DeclarationId(950) }, Field { label: "body_span".to_string(), ty: DeclarationId(121) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9007, 9195) }, + Declaration { id: DeclarationId(1896), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(957), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9260, 9272) }, + Declaration { id: DeclarationId(1897), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "ty".to_string(), ty: DeclarationId(950) }, Field { label: "body".to_string(), ty: DeclarationId(1896) }, Field { label: "body_span".to_string(), ty: DeclarationId(121) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9200, 9329) }, + Declaration { id: DeclarationId(1898), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9349, 9361) }, + Declaration { id: DeclarationId(1899), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "path".to_string(), ty: DeclarationId(1898) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9334, 9381) }, + Declaration { id: DeclarationId(1900), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9407, 9419) }, + Declaration { id: DeclarationId(1901), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9433, 9445) }, + Declaration { id: DeclarationId(1902), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "path".to_string(), ty: DeclarationId(1900) }, Field { label: "names".to_string(), ty: DeclarationId(1901) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9386, 9474) }, + Declaration { id: DeclarationId(1903), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9528, 9540) }, + Declaration { id: DeclarationId(1904), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "type_params".to_string(), ty: DeclarationId(1903) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9479, 9569) }, + Declaration { id: DeclarationId(1905), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9625, 9637) }, + Declaration { id: DeclarationId(1906), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(947) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9652, 9670) }, + Declaration { id: DeclarationId(1907), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "type_params".to_string(), ty: DeclarationId(1905) }, Field { label: "fields".to_string(), ty: DeclarationId(1906) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9574, 9699) }, + Declaration { id: DeclarationId(1908), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9752, 9764) }, + Declaration { id: DeclarationId(1909), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(948) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9781, 9801) }, + Declaration { id: DeclarationId(1910), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(950), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9818, 9830) }, + Declaration { id: DeclarationId(1911), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "type_params".to_string(), ty: DeclarationId(1908) }, Field { label: "variants".to_string(), ty: DeclarationId(1909) }, Field { label: "inhabits".to_string(), ty: DeclarationId(1910) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9704, 9859) }, + Declaration { id: DeclarationId(1912), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9914, 9926) }, + Declaration { id: DeclarationId(1913), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(957), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9998, 10010) }, + Declaration { id: DeclarationId(1914), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "type_params".to_string(), ty: DeclarationId(1912) }, Field { label: "nominal_opaque".to_string(), ty: DeclarationId(88) }, Field { label: "target".to_string(), ty: DeclarationId(950) }, Field { label: "refinement".to_string(), ty: DeclarationId(1913) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/parse_surface.dag", 9864, 10039) }, + Declaration { id: DeclarationId(1915), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(880) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/python_method_template_contracts.dag", 2092, 2120) }, + Declaration { id: DeclarationId(1916), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(880) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/rust_method_template_contracts.dag", 4043, 4071) }, + Declaration { id: DeclarationId(1917), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(963), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 2329, 2345) }, + Declaration { id: DeclarationId(1918), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(963), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 2350, 2366) }, + Declaration { id: DeclarationId(1919), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(963), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 2371, 2387) }, + Declaration { id: DeclarationId(1920), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(963) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 2632, 2660) }, + Declaration { id: DeclarationId(1921), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(963) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 2704, 2732) }, + Declaration { id: DeclarationId(1922), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(971), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 5879, 5901) }, + Declaration { id: DeclarationId(1923), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(972), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 6321, 6341) }, + Declaration { id: DeclarationId(1924), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 667, 673) }, + Declaration { id: DeclarationId(1925), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 678, 691) }, + Declaration { id: DeclarationId(1926), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 696, 710) }, + Declaration { id: DeclarationId(1927), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 3232, 3258) }, + Declaration { id: DeclarationId(1928), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 3263, 3291) }, + Declaration { id: DeclarationId(1929), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 3296, 3329) }, + Declaration { id: DeclarationId(1930), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 3334, 3365) }, + Declaration { id: DeclarationId(1931), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 3370, 3402) }, + Declaration { id: DeclarationId(1932), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 4409, 4416) }, + Declaration { id: DeclarationId(1933), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "previous".to_string(), ty: DeclarationId(971) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 4421, 4471) }, + Declaration { id: DeclarationId(1934), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 4966, 4977) }, + Declaration { id: DeclarationId(1935), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "inner".to_string(), ty: DeclarationId(972) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 4982, 5027) }, + Declaration { id: DeclarationId(1936), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "accessor".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7131, 7165) }, + Declaration { id: DeclarationId(1937), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "amount".to_string(), ty: DeclarationId(971) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7170, 7214) }, + Declaration { id: DeclarationId(1938), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "steps".to_string(), ty: DeclarationId(971) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7219, 7277) }, + Declaration { id: DeclarationId(1939), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "divisor".to_string(), ty: DeclarationId(972) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7282, 7338) }, + Declaration { id: DeclarationId(1940), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "witness".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7343, 7376) }, + Declaration { id: DeclarationId(1941), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "element".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7381, 7411) }, + Declaration { id: DeclarationId(1942), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7416, 7429) }, + Declaration { id: DeclarationId(1943), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(970) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7469, 7491) }, + Declaration { id: DeclarationId(1944), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(963) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7701, 7722) }, + Declaration { id: DeclarationId(1945), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 646, 651) }, + Declaration { id: DeclarationId(1946), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 656, 660) }, + Declaration { id: DeclarationId(1947), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 665, 671) }, + Declaration { id: DeclarationId(1948), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 676, 682) }, + Declaration { id: DeclarationId(1949), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 687, 691) }, + Declaration { id: DeclarationId(1950), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 696, 702) }, + Declaration { id: DeclarationId(1951), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 707, 715) }, + Declaration { id: DeclarationId(1952), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 720, 728) }, + Declaration { id: DeclarationId(1953), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 733, 740) }, + Declaration { id: DeclarationId(1954), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 745, 751) }, + Declaration { id: DeclarationId(1955), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 756, 763) }, + Declaration { id: DeclarationId(1956), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 768, 774) }, + Declaration { id: DeclarationId(1957), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 779, 786) }, + Declaration { id: DeclarationId(1958), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 791, 804) }, + Declaration { id: DeclarationId(1959), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 809, 820) }, + Declaration { id: DeclarationId(1960), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 825, 842) }, + Declaration { id: DeclarationId(1961), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 847, 849) }, + Declaration { id: DeclarationId(1962), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 854, 858) }, + Declaration { id: DeclarationId(1963), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 863, 868) }, + Declaration { id: DeclarationId(1964), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 873, 875) }, + Declaration { id: DeclarationId(1965), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 880, 882) }, + Declaration { id: DeclarationId(1966), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 887, 889) }, + Declaration { id: DeclarationId(1967), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 894, 896) }, + Declaration { id: DeclarationId(1968), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 901, 905) }, + Declaration { id: DeclarationId(1969), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 910, 915) }, + Declaration { id: DeclarationId(1970), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 920, 924) }, + Declaration { id: DeclarationId(1971), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 929, 934) }, + Declaration { id: DeclarationId(1972), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 939, 945) }, + Declaration { id: DeclarationId(1973), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 950, 958) }, + Declaration { id: DeclarationId(1974), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 963, 968) }, + Declaration { id: DeclarationId(1975), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 973, 978) }, + Declaration { id: DeclarationId(1976), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 983, 991) }, + Declaration { id: DeclarationId(1977), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 996, 1005) }, + Declaration { id: DeclarationId(1978), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1010, 1013) }, + Declaration { id: DeclarationId(1979), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1018, 1024) }, + Declaration { id: DeclarationId(1980), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1029, 1035) }, + Declaration { id: DeclarationId(1981), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1040, 1046) }, + Declaration { id: DeclarationId(1982), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1051, 1057) }, + Declaration { id: DeclarationId(1983), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1062, 1070) }, + Declaration { id: DeclarationId(1984), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1075, 1083) }, + Declaration { id: DeclarationId(1985), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1088, 1093) }, + Declaration { id: DeclarationId(1986), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1098, 1107) }, + Declaration { id: DeclarationId(1987), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1112, 1116) }, + Declaration { id: DeclarationId(1988), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1121, 1129) }, + Declaration { id: DeclarationId(1989), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1134, 1137) }, + Declaration { id: DeclarationId(1990), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1708, 1713) }, + Declaration { id: DeclarationId(1991), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1718, 1722) }, + Declaration { id: DeclarationId(1992), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1727, 1733) }, + Declaration { id: DeclarationId(1993), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1738, 1744) }, + Declaration { id: DeclarationId(1994), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1749, 1753) }, + Declaration { id: DeclarationId(1995), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1758, 1764) }, + Declaration { id: DeclarationId(1996), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1769, 1777) }, + Declaration { id: DeclarationId(1997), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1782, 1790) }, + Declaration { id: DeclarationId(1998), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1795, 1802) }, + Declaration { id: DeclarationId(1999), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1807, 1813) }, + Declaration { id: DeclarationId(2000), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1818, 1825) }, + Declaration { id: DeclarationId(2001), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1830, 1836) }, + Declaration { id: DeclarationId(2002), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1841, 1848) }, + Declaration { id: DeclarationId(2003), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2288, 2290) }, + Declaration { id: DeclarationId(2004), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2295, 2299) }, + Declaration { id: DeclarationId(2005), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2304, 2309) }, + Declaration { id: DeclarationId(2006), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2314, 2316) }, + Declaration { id: DeclarationId(2007), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2321, 2323) }, + Declaration { id: DeclarationId(2008), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2328, 2330) }, + Declaration { id: DeclarationId(2009), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2335, 2337) }, + Declaration { id: DeclarationId(2010), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2342, 2346) }, + Declaration { id: DeclarationId(2011), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2351, 2356) }, + Declaration { id: DeclarationId(2012), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2361, 2365) }, + Declaration { id: DeclarationId(2013), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2370, 2375) }, + Declaration { id: DeclarationId(2014), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2380, 2386) }, + Declaration { id: DeclarationId(2015), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2391, 2399) }, + Declaration { id: DeclarationId(2016), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2404, 2409) }, + Declaration { id: DeclarationId(2017), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2414, 2419) }, + Declaration { id: DeclarationId(2018), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2424, 2432) }, + Declaration { id: DeclarationId(2019), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2437, 2446) }, + Declaration { id: DeclarationId(2020), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2451, 2454) }, + Declaration { id: DeclarationId(2021), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2459, 2465) }, + Declaration { id: DeclarationId(2022), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2470, 2476) }, + Declaration { id: DeclarationId(2023), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2481, 2487) }, + Declaration { id: DeclarationId(2024), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2492, 2498) }, + Declaration { id: DeclarationId(2025), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2503, 2511) }, + Declaration { id: DeclarationId(2026), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2516, 2524) }, + Declaration { id: DeclarationId(2027), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2529, 2534) }, + Declaration { id: DeclarationId(2028), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2539, 2548) }, + Declaration { id: DeclarationId(2029), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2553, 2557) }, + Declaration { id: DeclarationId(2030), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2562, 2570) }, + Declaration { id: DeclarationId(2031), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(961) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 13007, 13030) }, + Declaration { id: DeclarationId(2032), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(1003) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 13232, 13247) }, + Declaration { id: DeclarationId(2033), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(1005) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 13252, 13272) }, + Declaration { id: DeclarationId(2034), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2432, 2446) }, + Declaration { id: DeclarationId(2035), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2451, 2461) }, + Declaration { id: DeclarationId(2036), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2466, 2478) }, + Declaration { id: DeclarationId(2037), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2483, 2495) }, + Declaration { id: DeclarationId(2038), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2500, 2513) }, + Declaration { id: DeclarationId(2039), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2518, 2530) }, + Declaration { id: DeclarationId(2040), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2535, 2558) }, + Declaration { id: DeclarationId(2041), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2964, 2973) }, + Declaration { id: DeclarationId(2042), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2978, 2994) }, + Declaration { id: DeclarationId(2043), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 3653, 3661) }, + Declaration { id: DeclarationId(2044), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 3666, 3676) }, + Declaration { id: DeclarationId(2045), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4491, 4504) }, + Declaration { id: DeclarationId(2046), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4509, 4522) }, + Declaration { id: DeclarationId(2047), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4527, 4535) }, + Declaration { id: DeclarationId(2048), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4560, 4568) }, + Declaration { id: DeclarationId(2049), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(997) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4573, 4613) }, + Declaration { id: DeclarationId(2050), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "expected".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4618, 4651) }, + Declaration { id: DeclarationId(2051), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "bind_name".to_string(), ty: DeclarationId(186) }, Field { label: "state".to_string(), ty: DeclarationId(998) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4656, 4734) }, + Declaration { id: DeclarationId(2052), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "declaration_name".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4900, 4963) }, + Declaration { id: DeclarationId(2053), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "bind_name".to_string(), ty: DeclarationId(186) }, Field { label: "comparator".to_string(), ty: DeclarationId(703) }, Field { label: "bound".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4968, 5059) }, + Declaration { id: DeclarationId(2054), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "subject".to_string(), ty: DeclarationId(1016) }, Field { label: "input_sample".to_string(), ty: DeclarationId(1016) }, Field { label: "expected_output".to_string(), ty: DeclarationId(1016) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 5064, 5196) }, + Declaration { id: DeclarationId(2055), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "subject".to_string(), ty: DeclarationId(1016) }, Field { label: "invariant".to_string(), ty: DeclarationId(1016) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 5411, 5500) }, + Declaration { id: DeclarationId(2056), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 6300, 6312) }, + Declaration { id: DeclarationId(2057), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "command".to_string(), ty: DeclarationId(186) }, Field { label: "args".to_string(), ty: DeclarationId(2056) }, Field { label: "expect_exit_code".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 6249, 6346) }, + Declaration { id: DeclarationId(2058), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 7046, 7058) }, + Declaration { id: DeclarationId(2059), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "command".to_string(), ty: DeclarationId(186) }, Field { label: "args".to_string(), ty: DeclarationId(2058) }, Field { label: "expect_exit_code".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 6996, 7092) }, + Declaration { id: DeclarationId(2060), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "lens_ref".to_string(), ty: DeclarationId(1016) }, Field { label: "input_ref".to_string(), ty: DeclarationId(1016) }, Field { label: "expected_ref".to_string(), ty: DeclarationId(1016) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 7390, 7512) }, + Declaration { id: DeclarationId(2061), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "subject_ref".to_string(), ty: DeclarationId(1016) }, Field { label: "oracle_ref".to_string(), ty: DeclarationId(1016) }, Field { label: "input_ref".to_string(), ty: DeclarationId(1016) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 7774, 7899) }, + Declaration { id: DeclarationId(2062), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "law".to_string(), ty: DeclarationId(999) }, Field { label: "lens_ref".to_string(), ty: DeclarationId(1016) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 8495, 8574) }, + Declaration { id: DeclarationId(2063), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "authority".to_string(), ty: DeclarationId(1016) }, Field { label: "list_constant".to_string(), ty: DeclarationId(988) }, Field { label: "bound".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 8794, 8907) }, + Declaration { id: DeclarationId(2064), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "authority".to_string(), ty: DeclarationId(1016) }, Field { label: "list_constant".to_string(), ty: DeclarationId(988) }, Field { label: "subset_predicate".to_string(), ty: DeclarationId(1016) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 8912, 9048) }, + Declaration { id: DeclarationId(2065), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "compile_target".to_string(), ty: DeclarationId(986) }, Field { label: "expected".to_string(), ty: DeclarationId(987) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 9053, 9135) }, + Declaration { id: DeclarationId(2066), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "authority".to_string(), ty: DeclarationId(1016) }, Field { label: "ratchet_kind".to_string(), ty: DeclarationId(1016) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 9140, 9226) }, + Declaration { id: DeclarationId(2067), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(986) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 9305, 9315) }, + Declaration { id: DeclarationId(2068), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "authority".to_string(), ty: DeclarationId(1016) }, Field { label: "generated_paths".to_string(), ty: DeclarationId(2067) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 9231, 9321) }, + Declaration { id: DeclarationId(2069), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "deferred_gate".to_string(), ty: DeclarationId(1016) }, Field { label: "target_lane".to_string(), ty: DeclarationId(1016) }, Field { label: "authority_doc".to_string(), ty: DeclarationId(1016) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 10263, 10397) }, + Declaration { id: DeclarationId(2070), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "deferred_gate".to_string(), ty: DeclarationId(1016) }, Field { label: "target_lane".to_string(), ty: DeclarationId(1016) }, Field { label: "authority_doc".to_string(), ty: DeclarationId(1016) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 11036, 11180) }, + Declaration { id: DeclarationId(2071), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(961) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12224, 12247) }, + Declaration { id: DeclarationId(2072), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(1003) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12293, 12308) }, + Declaration { id: DeclarationId(2073), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(961) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12564, 12587) }, + Declaration { id: DeclarationId(2074), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(725) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/workflows.dag", 992, 1006) }, + Declaration { id: DeclarationId(2075), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 532, 547) }, + Declaration { id: DeclarationId(2076), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 550, 561) }, + Declaration { id: DeclarationId(2077), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 564, 576) }, + Declaration { id: DeclarationId(2078), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(705), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/operators.dag", 142, 155) }, + Declaration { id: DeclarationId(2079), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5254, 5272) }, + Declaration { id: DeclarationId(2080), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5277, 5292) }, + Declaration { id: DeclarationId(2081), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5321, 5342) }, + Declaration { id: DeclarationId(2082), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5347, 5362) }, + Declaration { id: DeclarationId(2083), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6875, 6885) }, + Declaration { id: DeclarationId(2084), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6890, 6901) }, + Declaration { id: DeclarationId(2085), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6906, 6919) }, + Declaration { id: DeclarationId(2086), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6924, 6937) }, + Declaration { id: DeclarationId(2087), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6942, 6955) }, + Declaration { id: DeclarationId(2088), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6960, 6975) }, + Declaration { id: DeclarationId(2089), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 7717, 7734) }, + Declaration { id: DeclarationId(2090), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 7739, 7749) }, + Declaration { id: DeclarationId(2091), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 7754, 7758) }, + Declaration { id: DeclarationId(2092), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "target_name".to_string(), ty: DeclarationId(186) }, Field { label: "algebra".to_string(), ty: DeclarationId(1383) }, Field { label: "carrier".to_string(), ty: DeclarationId(1385) }, Field { label: "range_min_inclusive".to_string(), ty: DeclarationId(186) }, Field { label: "range_max_inclusive".to_string(), ty: DeclarationId(186) }, Field { label: "is_copy".to_string(), ty: DeclarationId(88) }, Field { label: "overflow".to_string(), ty: DeclarationId(1386) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 8536, 9108) }, + Declaration { id: DeclarationId(2093), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "target_name".to_string(), ty: DeclarationId(186) }, Field { label: "algebra".to_string(), ty: DeclarationId(1384) }, Field { label: "carrier".to_string(), ty: DeclarationId(1385) }, Field { label: "is_copy".to_string(), ty: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 9113, 9295) }, + Declaration { id: DeclarationId(2094), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(1387) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 9623, 9642) }, ], ports: { let mut ports = HashMap::new(); - ports.insert(PortId(0), Port { id: PortId(0), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); + ports.insert(PortId(0), Port { id: PortId(0), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); ports.insert(PortId(1), Port { id: PortId(1), state: PortState::Uninferred, produced_by: Some(NodeId(0)) }); - ports.insert(PortId(2), Port { id: PortId(2), state: PortState::Resolved(TypeShape::new(DeclarationId(748))), produced_by: Some(NodeId(1)) }); - ports.insert(PortId(3), Port { id: PortId(3), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); - ports.insert(PortId(4), Port { id: PortId(4), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); + ports.insert(PortId(2), Port { id: PortId(2), state: PortState::Resolved(TypeShape::new(DeclarationId(743))), produced_by: Some(NodeId(1)) }); + ports.insert(PortId(3), Port { id: PortId(3), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); + ports.insert(PortId(4), Port { id: PortId(4), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); ports.insert(PortId(5), Port { id: PortId(5), state: PortState::Uninferred, produced_by: Some(NodeId(3)) }); ports.insert(PortId(6), Port { id: PortId(6), state: PortState::Uninferred, produced_by: Some(NodeId(4)) }); - ports.insert(PortId(7), Port { id: PortId(7), state: PortState::Resolved(TypeShape::new(DeclarationId(1606))), produced_by: Some(NodeId(5)) }); - ports.insert(PortId(8), Port { id: PortId(8), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); - ports.insert(PortId(9), Port { id: PortId(9), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); - ports.insert(PortId(10), Port { id: PortId(10), state: PortState::Resolved(TypeShape::new(DeclarationId(1607))), produced_by: None }); - ports.insert(PortId(11), Port { id: PortId(11), state: PortState::Resolved(TypeShape::new(DeclarationId(1608))), produced_by: Some(NodeId(7)) }); - ports.insert(PortId(12), Port { id: PortId(12), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); + ports.insert(PortId(7), Port { id: PortId(7), state: PortState::Resolved(TypeShape::new(DeclarationId(1601))), produced_by: Some(NodeId(5)) }); + ports.insert(PortId(8), Port { id: PortId(8), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); + ports.insert(PortId(9), Port { id: PortId(9), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); + ports.insert(PortId(10), Port { id: PortId(10), state: PortState::Resolved(TypeShape::new(DeclarationId(1602))), produced_by: None }); + ports.insert(PortId(11), Port { id: PortId(11), state: PortState::Resolved(TypeShape::new(DeclarationId(1603))), produced_by: Some(NodeId(7)) }); + ports.insert(PortId(12), Port { id: PortId(12), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); ports.insert(PortId(13), Port { id: PortId(13), state: PortState::Uninferred, produced_by: Some(NodeId(9)) }); ports.insert(PortId(14), Port { id: PortId(14), state: PortState::Uninferred, produced_by: Some(NodeId(10)) }); ports.insert(PortId(15), Port { id: PortId(15), state: PortState::Uninferred, produced_by: None }); ports.insert(PortId(16), Port { id: PortId(16), state: PortState::Uninferred, produced_by: Some(NodeId(11)) }); ports.insert(PortId(17), Port { id: PortId(17), state: PortState::Resolved(TypeShape::new(DeclarationId(88))), produced_by: Some(NodeId(12)) }); - ports.insert(PortId(18), Port { id: PortId(18), state: PortState::Resolved(TypeShape::new(DeclarationId(746))), produced_by: None }); + ports.insert(PortId(18), Port { id: PortId(18), state: PortState::Resolved(TypeShape::new(DeclarationId(741))), produced_by: None }); ports.insert(PortId(19), Port { id: PortId(19), state: PortState::Uninferred, produced_by: Some(NodeId(14)) }); ports.insert(PortId(20), Port { id: PortId(20), state: PortState::Uninferred, produced_by: None }); ports.insert(PortId(21), Port { id: PortId(21), state: PortState::Uninferred, produced_by: Some(NodeId(15)) }); @@ -2134,32 +2129,32 @@ pub(crate) fn bootstrapped_fixture_dag() -> Dag { ports.insert(PortId(24), Port { id: PortId(24), state: PortState::Uninferred, produced_by: Some(NodeId(18)) }); ports.insert(PortId(25), Port { id: PortId(25), state: PortState::Uninferred, produced_by: Some(NodeId(19)) }); ports.insert(PortId(26), Port { id: PortId(26), state: PortState::Resolved(TypeShape::new(DeclarationId(71))), produced_by: Some(NodeId(20)) }); - ports.insert(PortId(27), Port { id: PortId(27), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); - ports.insert(PortId(28), Port { id: PortId(28), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); + ports.insert(PortId(27), Port { id: PortId(27), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); + ports.insert(PortId(28), Port { id: PortId(28), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); ports.insert(PortId(29), Port { id: PortId(29), state: PortState::Uninferred, produced_by: Some(NodeId(22)) }); ports.insert(PortId(30), Port { id: PortId(30), state: PortState::Uninferred, produced_by: Some(NodeId(23)) }); - ports.insert(PortId(31), Port { id: PortId(31), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: Some(NodeId(24)) }); - ports.insert(PortId(32), Port { id: PortId(32), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); - ports.insert(PortId(33), Port { id: PortId(33), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); + ports.insert(PortId(31), Port { id: PortId(31), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: Some(NodeId(24)) }); + ports.insert(PortId(32), Port { id: PortId(32), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); + ports.insert(PortId(33), Port { id: PortId(33), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); ports.insert(PortId(34), Port { id: PortId(34), state: PortState::Uninferred, produced_by: Some(NodeId(26)) }); ports.insert(PortId(35), Port { id: PortId(35), state: PortState::Uninferred, produced_by: Some(NodeId(27)) }); - ports.insert(PortId(36), Port { id: PortId(36), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: Some(NodeId(28)) }); - ports.insert(PortId(37), Port { id: PortId(37), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); - ports.insert(PortId(38), Port { id: PortId(38), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); + ports.insert(PortId(36), Port { id: PortId(36), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: Some(NodeId(28)) }); + ports.insert(PortId(37), Port { id: PortId(37), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); + ports.insert(PortId(38), Port { id: PortId(38), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); ports.insert(PortId(39), Port { id: PortId(39), state: PortState::Uninferred, produced_by: Some(NodeId(30)) }); ports.insert(PortId(40), Port { id: PortId(40), state: PortState::Uninferred, produced_by: Some(NodeId(31)) }); - ports.insert(PortId(41), Port { id: PortId(41), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: Some(NodeId(32)) }); - ports.insert(PortId(42), Port { id: PortId(42), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); - ports.insert(PortId(43), Port { id: PortId(43), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); + ports.insert(PortId(41), Port { id: PortId(41), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: Some(NodeId(32)) }); + ports.insert(PortId(42), Port { id: PortId(42), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); + ports.insert(PortId(43), Port { id: PortId(43), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); ports.insert(PortId(44), Port { id: PortId(44), state: PortState::Uninferred, produced_by: Some(NodeId(34)) }); ports.insert(PortId(45), Port { id: PortId(45), state: PortState::Uninferred, produced_by: Some(NodeId(35)) }); - ports.insert(PortId(46), Port { id: PortId(46), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: Some(NodeId(36)) }); - ports.insert(PortId(47), Port { id: PortId(47), state: PortState::Resolved(TypeShape::new(DeclarationId(1609))), produced_by: None }); + ports.insert(PortId(46), Port { id: PortId(46), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: Some(NodeId(36)) }); + ports.insert(PortId(47), Port { id: PortId(47), state: PortState::Resolved(TypeShape::new(DeclarationId(1604))), produced_by: None }); ports.insert(PortId(48), Port { id: PortId(48), state: PortState::Uninferred, produced_by: Some(NodeId(38)) }); ports.insert(PortId(49), Port { id: PortId(49), state: PortState::Uninferred, produced_by: Some(NodeId(39)) }); - ports.insert(PortId(50), Port { id: PortId(50), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: Some(NodeId(40)) }); - ports.insert(PortId(51), Port { id: PortId(51), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); - ports.insert(PortId(52), Port { id: PortId(52), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); + ports.insert(PortId(50), Port { id: PortId(50), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: Some(NodeId(40)) }); + ports.insert(PortId(51), Port { id: PortId(51), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); + ports.insert(PortId(52), Port { id: PortId(52), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); ports.insert(PortId(53), Port { id: PortId(53), state: PortState::Uninferred, produced_by: None }); ports.insert(PortId(54), Port { id: PortId(54), state: PortState::Uninferred, produced_by: Some(NodeId(42)) }); ports.insert(PortId(55), Port { id: PortId(55), state: PortState::Uninferred, produced_by: None }); @@ -2247,12 +2242,12 @@ pub(crate) fn bootstrapped_fixture_dag() -> Dag { ports.insert(PortId(137), Port { id: PortId(137), state: PortState::Uninferred, produced_by: Some(NodeId(91)) }); ports.insert(PortId(138), Port { id: PortId(138), state: PortState::Uninferred, produced_by: Some(NodeId(92)) }); ports.insert(PortId(139), Port { id: PortId(139), state: PortState::Resolved(TypeShape::new(DeclarationId(88))), produced_by: Some(NodeId(93)) }); - ports.insert(PortId(140), Port { id: PortId(140), state: PortState::Resolved(TypeShape::new(DeclarationId(745))), produced_by: None }); - ports.insert(PortId(141), Port { id: PortId(141), state: PortState::Resolved(TypeShape::new(DeclarationId(745))), produced_by: None }); - ports.insert(PortId(142), Port { id: PortId(142), state: PortState::Resolved(TypeShape::new(DeclarationId(631))), produced_by: Some(NodeId(95)) }); - ports.insert(PortId(143), Port { id: PortId(143), state: PortState::Resolved(TypeShape::new(DeclarationId(631))), produced_by: Some(NodeId(96)) }); + ports.insert(PortId(140), Port { id: PortId(140), state: PortState::Resolved(TypeShape::new(DeclarationId(740))), produced_by: None }); + ports.insert(PortId(141), Port { id: PortId(141), state: PortState::Resolved(TypeShape::new(DeclarationId(740))), produced_by: None }); + ports.insert(PortId(142), Port { id: PortId(142), state: PortState::Resolved(TypeShape::new(DeclarationId(626))), produced_by: Some(NodeId(95)) }); + ports.insert(PortId(143), Port { id: PortId(143), state: PortState::Resolved(TypeShape::new(DeclarationId(626))), produced_by: Some(NodeId(96)) }); ports.insert(PortId(144), Port { id: PortId(144), state: PortState::Resolved(TypeShape::new(DeclarationId(88))), produced_by: Some(NodeId(97)) }); - ports.insert(PortId(145), Port { id: PortId(145), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); + ports.insert(PortId(145), Port { id: PortId(145), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); ports.insert(PortId(146), Port { id: PortId(146), state: PortState::Uninferred, produced_by: None }); ports.insert(PortId(147), Port { id: PortId(147), state: PortState::Uninferred, produced_by: Some(NodeId(99)) }); ports.insert(PortId(148), Port { id: PortId(148), state: PortState::Uninferred, produced_by: Some(NodeId(100)) }); @@ -2261,14 +2256,14 @@ pub(crate) fn bootstrapped_fixture_dag() -> Dag { ports.insert(PortId(151), Port { id: PortId(151), state: PortState::Uninferred, produced_by: Some(NodeId(102)) }); ports.insert(PortId(152), Port { id: PortId(152), state: PortState::Uninferred, produced_by: Some(NodeId(103)) }); ports.insert(PortId(153), Port { id: PortId(153), state: PortState::Uninferred, produced_by: Some(NodeId(104)) }); - ports.insert(PortId(154), Port { id: PortId(154), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: Some(NodeId(105)) }); - ports.insert(PortId(155), Port { id: PortId(155), state: PortState::Resolved(TypeShape::new(DeclarationId(1610))), produced_by: None }); - ports.insert(PortId(156), Port { id: PortId(156), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: Some(NodeId(107)) }); - ports.insert(PortId(157), Port { id: PortId(157), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: Some(NodeId(108)) }); - ports.insert(PortId(158), Port { id: PortId(158), state: PortState::Resolved(TypeShape::new(DeclarationId(1607))), produced_by: Some(NodeId(109)) }); + ports.insert(PortId(154), Port { id: PortId(154), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: Some(NodeId(105)) }); + ports.insert(PortId(155), Port { id: PortId(155), state: PortState::Resolved(TypeShape::new(DeclarationId(1605))), produced_by: None }); + ports.insert(PortId(156), Port { id: PortId(156), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: Some(NodeId(107)) }); + ports.insert(PortId(157), Port { id: PortId(157), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: Some(NodeId(108)) }); + ports.insert(PortId(158), Port { id: PortId(158), state: PortState::Resolved(TypeShape::new(DeclarationId(1602))), produced_by: Some(NodeId(109)) }); ports.insert(PortId(159), Port { id: PortId(159), state: PortState::Uninferred, produced_by: Some(NodeId(110)) }); - ports.insert(PortId(160), Port { id: PortId(160), state: PortState::Resolved(TypeShape::new(DeclarationId(1611))), produced_by: Some(NodeId(111)) }); - ports.insert(PortId(161), Port { id: PortId(161), state: PortState::Resolved(TypeShape::new(DeclarationId(1612))), produced_by: None }); + ports.insert(PortId(160), Port { id: PortId(160), state: PortState::Resolved(TypeShape::new(DeclarationId(1606))), produced_by: Some(NodeId(111)) }); + ports.insert(PortId(161), Port { id: PortId(161), state: PortState::Resolved(TypeShape::new(DeclarationId(1607))), produced_by: None }); ports.insert(PortId(162), Port { id: PortId(162), state: PortState::Uninferred, produced_by: Some(NodeId(113)) }); ports.insert(PortId(163), Port { id: PortId(163), state: PortState::Uninferred, produced_by: None }); ports.insert(PortId(164), Port { id: PortId(164), state: PortState::Uninferred, produced_by: Some(NodeId(114)) }); @@ -2281,8 +2276,8 @@ pub(crate) fn bootstrapped_fixture_dag() -> Dag { ports.insert(PortId(171), Port { id: PortId(171), state: PortState::Uninferred, produced_by: Some(NodeId(121)) }); ports.insert(PortId(172), Port { id: PortId(172), state: PortState::Uninferred, produced_by: Some(NodeId(122)) }); ports.insert(PortId(173), Port { id: PortId(173), state: PortState::Uninferred, produced_by: Some(NodeId(123)) }); - ports.insert(PortId(174), Port { id: PortId(174), state: PortState::Resolved(TypeShape::new(DeclarationId(1613))), produced_by: Some(NodeId(124)) }); - ports.insert(PortId(175), Port { id: PortId(175), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); + ports.insert(PortId(174), Port { id: PortId(174), state: PortState::Resolved(TypeShape::new(DeclarationId(1608))), produced_by: Some(NodeId(124)) }); + ports.insert(PortId(175), Port { id: PortId(175), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); ports.insert(PortId(176), Port { id: PortId(176), state: PortState::Uninferred, produced_by: None }); ports.insert(PortId(177), Port { id: PortId(177), state: PortState::Uninferred, produced_by: Some(NodeId(126)) }); ports.insert(PortId(178), Port { id: PortId(178), state: PortState::Uninferred, produced_by: Some(NodeId(127)) }); @@ -2299,7 +2294,7 @@ pub(crate) fn bootstrapped_fixture_dag() -> Dag { ports.insert(PortId(189), Port { id: PortId(189), state: PortState::Uninferred, produced_by: None }); ports.insert(PortId(190), Port { id: PortId(190), state: PortState::Uninferred, produced_by: Some(NodeId(133)) }); ports.insert(PortId(191), Port { id: PortId(191), state: PortState::Resolved(TypeShape::new(DeclarationId(88))), produced_by: Some(NodeId(134)) }); - ports.insert(PortId(192), Port { id: PortId(192), state: PortState::Resolved(TypeShape::new(DeclarationId(1614))), produced_by: None }); + ports.insert(PortId(192), Port { id: PortId(192), state: PortState::Resolved(TypeShape::new(DeclarationId(1609))), produced_by: None }); ports.insert(PortId(193), Port { id: PortId(193), state: PortState::Uninferred, produced_by: Some(NodeId(136)) }); ports.insert(PortId(194), Port { id: PortId(194), state: PortState::Uninferred, produced_by: Some(NodeId(137)) }); ports.insert(PortId(195), Port { id: PortId(195), state: PortState::Uninferred, produced_by: None }); @@ -2312,8 +2307,8 @@ pub(crate) fn bootstrapped_fixture_dag() -> Dag { ports.insert(PortId(202), Port { id: PortId(202), state: PortState::Uninferred, produced_by: Some(NodeId(143)) }); ports.insert(PortId(203), Port { id: PortId(203), state: PortState::Uninferred, produced_by: Some(NodeId(144)) }); ports.insert(PortId(204), Port { id: PortId(204), state: PortState::Uninferred, produced_by: Some(NodeId(145)) }); - ports.insert(PortId(205), Port { id: PortId(205), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: Some(NodeId(146)) }); - ports.insert(PortId(206), Port { id: PortId(206), state: PortState::Resolved(TypeShape::new(DeclarationId(1615))), produced_by: None }); + ports.insert(PortId(205), Port { id: PortId(205), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: Some(NodeId(146)) }); + ports.insert(PortId(206), Port { id: PortId(206), state: PortState::Resolved(TypeShape::new(DeclarationId(1610))), produced_by: None }); ports.insert(PortId(207), Port { id: PortId(207), state: PortState::Uninferred, produced_by: Some(NodeId(148)) }); ports.insert(PortId(208), Port { id: PortId(208), state: PortState::Uninferred, produced_by: Some(NodeId(149)) }); ports.insert(PortId(209), Port { id: PortId(209), state: PortState::Uninferred, produced_by: None }); @@ -2326,8 +2321,8 @@ pub(crate) fn bootstrapped_fixture_dag() -> Dag { ports.insert(PortId(216), Port { id: PortId(216), state: PortState::Uninferred, produced_by: Some(NodeId(155)) }); ports.insert(PortId(217), Port { id: PortId(217), state: PortState::Uninferred, produced_by: Some(NodeId(156)) }); ports.insert(PortId(218), Port { id: PortId(218), state: PortState::Uninferred, produced_by: Some(NodeId(157)) }); - ports.insert(PortId(219), Port { id: PortId(219), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: Some(NodeId(158)) }); - ports.insert(PortId(220), Port { id: PortId(220), state: PortState::Resolved(TypeShape::new(DeclarationId(1616))), produced_by: None }); + ports.insert(PortId(219), Port { id: PortId(219), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: Some(NodeId(158)) }); + ports.insert(PortId(220), Port { id: PortId(220), state: PortState::Resolved(TypeShape::new(DeclarationId(1611))), produced_by: None }); ports.insert(PortId(221), Port { id: PortId(221), state: PortState::Uninferred, produced_by: Some(NodeId(160)) }); ports.insert(PortId(222), Port { id: PortId(222), state: PortState::Uninferred, produced_by: Some(NodeId(161)) }); ports.insert(PortId(223), Port { id: PortId(223), state: PortState::Uninferred, produced_by: None }); @@ -2346,9 +2341,9 @@ pub(crate) fn bootstrapped_fixture_dag() -> Dag { ports.insert(PortId(236), Port { id: PortId(236), state: PortState::Uninferred, produced_by: Some(NodeId(172)) }); ports.insert(PortId(237), Port { id: PortId(237), state: PortState::Uninferred, produced_by: Some(NodeId(173)) }); ports.insert(PortId(238), Port { id: PortId(238), state: PortState::Uninferred, produced_by: Some(NodeId(174)) }); - ports.insert(PortId(239), Port { id: PortId(239), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: Some(NodeId(175)) }); - ports.insert(PortId(240), Port { id: PortId(240), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); - ports.insert(PortId(241), Port { id: PortId(241), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); + ports.insert(PortId(239), Port { id: PortId(239), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: Some(NodeId(175)) }); + ports.insert(PortId(240), Port { id: PortId(240), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); + ports.insert(PortId(241), Port { id: PortId(241), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); ports.insert(PortId(242), Port { id: PortId(242), state: PortState::Uninferred, produced_by: None }); ports.insert(PortId(243), Port { id: PortId(243), state: PortState::Uninferred, produced_by: Some(NodeId(177)) }); ports.insert(PortId(244), Port { id: PortId(244), state: PortState::Uninferred, produced_by: None }); @@ -2363,10 +2358,10 @@ pub(crate) fn bootstrapped_fixture_dag() -> Dag { ports.insert(PortId(253), Port { id: PortId(253), state: PortState::Uninferred, produced_by: Some(NodeId(182)) }); ports.insert(PortId(254), Port { id: PortId(254), state: PortState::Uninferred, produced_by: None }); ports.insert(PortId(255), Port { id: PortId(255), state: PortState::Uninferred, produced_by: Some(NodeId(183)) }); - ports.insert(PortId(256), Port { id: PortId(256), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: Some(NodeId(184)) }); - ports.insert(PortId(257), Port { id: PortId(257), state: PortState::Resolved(TypeShape::new(DeclarationId(745))), produced_by: None }); - ports.insert(PortId(258), Port { id: PortId(258), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); - ports.insert(PortId(259), Port { id: PortId(259), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); + ports.insert(PortId(256), Port { id: PortId(256), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: Some(NodeId(184)) }); + ports.insert(PortId(257), Port { id: PortId(257), state: PortState::Resolved(TypeShape::new(DeclarationId(740))), produced_by: None }); + ports.insert(PortId(258), Port { id: PortId(258), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); + ports.insert(PortId(259), Port { id: PortId(259), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); ports.insert(PortId(260), Port { id: PortId(260), state: PortState::Uninferred, produced_by: None }); ports.insert(PortId(261), Port { id: PortId(261), state: PortState::Uninferred, produced_by: Some(NodeId(186)) }); ports.insert(PortId(262), Port { id: PortId(262), state: PortState::Uninferred, produced_by: None }); @@ -2381,31 +2376,31 @@ pub(crate) fn bootstrapped_fixture_dag() -> Dag { ports.insert(PortId(271), Port { id: PortId(271), state: PortState::Uninferred, produced_by: Some(NodeId(191)) }); ports.insert(PortId(272), Port { id: PortId(272), state: PortState::Uninferred, produced_by: None }); ports.insert(PortId(273), Port { id: PortId(273), state: PortState::Uninferred, produced_by: Some(NodeId(192)) }); - ports.insert(PortId(274), Port { id: PortId(274), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: Some(NodeId(193)) }); - ports.insert(PortId(275), Port { id: PortId(275), state: PortState::Resolved(TypeShape::new(DeclarationId(745))), produced_by: None }); - ports.insert(PortId(276), Port { id: PortId(276), state: PortState::Resolved(TypeShape::new(DeclarationId(745))), produced_by: None }); - ports.insert(PortId(277), Port { id: PortId(277), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); - ports.insert(PortId(278), Port { id: PortId(278), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); + ports.insert(PortId(274), Port { id: PortId(274), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: Some(NodeId(193)) }); + ports.insert(PortId(275), Port { id: PortId(275), state: PortState::Resolved(TypeShape::new(DeclarationId(740))), produced_by: None }); + ports.insert(PortId(276), Port { id: PortId(276), state: PortState::Resolved(TypeShape::new(DeclarationId(740))), produced_by: None }); + ports.insert(PortId(277), Port { id: PortId(277), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); + ports.insert(PortId(278), Port { id: PortId(278), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); ports.insert(PortId(279), Port { id: PortId(279), state: PortState::Uninferred, produced_by: Some(NodeId(195)) }); ports.insert(PortId(280), Port { id: PortId(280), state: PortState::Uninferred, produced_by: Some(NodeId(196)) }); ports.insert(PortId(281), Port { id: PortId(281), state: PortState::Uninferred, produced_by: Some(NodeId(197)) }); - ports.insert(PortId(282), Port { id: PortId(282), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: Some(NodeId(198)) }); - ports.insert(PortId(283), Port { id: PortId(283), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); - ports.insert(PortId(284), Port { id: PortId(284), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); + ports.insert(PortId(282), Port { id: PortId(282), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: Some(NodeId(198)) }); + ports.insert(PortId(283), Port { id: PortId(283), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); + ports.insert(PortId(284), Port { id: PortId(284), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); ports.insert(PortId(285), Port { id: PortId(285), state: PortState::Uninferred, produced_by: Some(NodeId(200)) }); - ports.insert(PortId(286), Port { id: PortId(286), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: Some(NodeId(201)) }); - ports.insert(PortId(287), Port { id: PortId(287), state: PortState::Resolved(TypeShape::new(DeclarationId(748))), produced_by: None }); - ports.insert(PortId(288), Port { id: PortId(288), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); + ports.insert(PortId(286), Port { id: PortId(286), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: Some(NodeId(201)) }); + ports.insert(PortId(287), Port { id: PortId(287), state: PortState::Resolved(TypeShape::new(DeclarationId(743))), produced_by: None }); + ports.insert(PortId(288), Port { id: PortId(288), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); ports.insert(PortId(289), Port { id: PortId(289), state: PortState::Resolved(TypeShape::new(DeclarationId(88))), produced_by: Some(NodeId(203)) }); - ports.insert(PortId(290), Port { id: PortId(290), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: Some(NodeId(204)) }); + ports.insert(PortId(290), Port { id: PortId(290), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: Some(NodeId(204)) }); ports.insert(PortId(291), Port { id: PortId(291), state: PortState::Uninferred, produced_by: Some(NodeId(205)) }); ports.insert(PortId(292), Port { id: PortId(292), state: PortState::Uninferred, produced_by: Some(NodeId(206)) }); - ports.insert(PortId(293), Port { id: PortId(293), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: Some(NodeId(207)) }); - ports.insert(PortId(294), Port { id: PortId(294), state: PortState::Resolved(TypeShape::new(DeclarationId(748))), produced_by: Some(NodeId(208)) }); - ports.insert(PortId(295), Port { id: PortId(295), state: PortState::Resolved(TypeShape::new(DeclarationId(748))), produced_by: None }); + ports.insert(PortId(293), Port { id: PortId(293), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: Some(NodeId(207)) }); + ports.insert(PortId(294), Port { id: PortId(294), state: PortState::Resolved(TypeShape::new(DeclarationId(743))), produced_by: Some(NodeId(208)) }); + ports.insert(PortId(295), Port { id: PortId(295), state: PortState::Resolved(TypeShape::new(DeclarationId(743))), produced_by: None }); ports.insert(PortId(296), Port { id: PortId(296), state: PortState::Resolved(TypeShape::new(DeclarationId(88))), produced_by: Some(NodeId(210)) }); - ports.insert(PortId(297), Port { id: PortId(297), state: PortState::Resolved(TypeShape::new(DeclarationId(1617))), produced_by: None }); - ports.insert(PortId(298), Port { id: PortId(298), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); + ports.insert(PortId(297), Port { id: PortId(297), state: PortState::Resolved(TypeShape::new(DeclarationId(1612))), produced_by: None }); + ports.insert(PortId(298), Port { id: PortId(298), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); ports.insert(PortId(299), Port { id: PortId(299), state: PortState::Uninferred, produced_by: Some(NodeId(212)) }); ports.insert(PortId(300), Port { id: PortId(300), state: PortState::Uninferred, produced_by: None }); ports.insert(PortId(301), Port { id: PortId(301), state: PortState::Uninferred, produced_by: Some(NodeId(213)) }); @@ -2418,21 +2413,21 @@ pub(crate) fn bootstrapped_fixture_dag() -> Dag { ports.insert(PortId(308), Port { id: PortId(308), state: PortState::Uninferred, produced_by: Some(NodeId(220)) }); ports.insert(PortId(309), Port { id: PortId(309), state: PortState::Uninferred, produced_by: Some(NodeId(221)) }); ports.insert(PortId(310), Port { id: PortId(310), state: PortState::Uninferred, produced_by: Some(NodeId(222)) }); - ports.insert(PortId(311), Port { id: PortId(311), state: PortState::Resolved(TypeShape::new(DeclarationId(1618))), produced_by: Some(NodeId(223)) }); - ports.insert(PortId(312), Port { id: PortId(312), state: PortState::Resolved(TypeShape::new(DeclarationId(1619))), produced_by: None }); - ports.insert(PortId(313), Port { id: PortId(313), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); + ports.insert(PortId(311), Port { id: PortId(311), state: PortState::Resolved(TypeShape::new(DeclarationId(1613))), produced_by: Some(NodeId(223)) }); + ports.insert(PortId(312), Port { id: PortId(312), state: PortState::Resolved(TypeShape::new(DeclarationId(1614))), produced_by: None }); + ports.insert(PortId(313), Port { id: PortId(313), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); ports.insert(PortId(314), Port { id: PortId(314), state: PortState::Uninferred, produced_by: Some(NodeId(225)) }); ports.insert(PortId(315), Port { id: PortId(315), state: PortState::Uninferred, produced_by: Some(NodeId(226)) }); ports.insert(PortId(316), Port { id: PortId(316), state: PortState::Uninferred, produced_by: Some(NodeId(227)) }); ports.insert(PortId(317), Port { id: PortId(317), state: PortState::Uninferred, produced_by: Some(NodeId(228)) }); ports.insert(PortId(318), Port { id: PortId(318), state: PortState::Uninferred, produced_by: Some(NodeId(229)) }); - ports.insert(PortId(319), Port { id: PortId(319), state: PortState::Resolved(TypeShape::new(DeclarationId(1620))), produced_by: Some(NodeId(230)) }); - ports.insert(PortId(320), Port { id: PortId(320), state: PortState::Resolved(TypeShape::new(DeclarationId(1621))), produced_by: None }); + ports.insert(PortId(319), Port { id: PortId(319), state: PortState::Resolved(TypeShape::new(DeclarationId(1615))), produced_by: Some(NodeId(230)) }); + ports.insert(PortId(320), Port { id: PortId(320), state: PortState::Resolved(TypeShape::new(DeclarationId(1616))), produced_by: None }); ports.insert(PortId(321), Port { id: PortId(321), state: PortState::Uninferred, produced_by: Some(NodeId(232)) }); - ports.insert(PortId(322), Port { id: PortId(322), state: PortState::Resolved(TypeShape::new(DeclarationId(1622))), produced_by: Some(NodeId(233)) }); - ports.insert(PortId(323), Port { id: PortId(323), state: PortState::Resolved(TypeShape::new(DeclarationId(731))), produced_by: None }); - ports.insert(PortId(324), Port { id: PortId(324), state: PortState::Resolved(TypeShape::new(DeclarationId(2079))), produced_by: Some(NodeId(235)) }); - ports.insert(PortId(325), Port { id: PortId(325), state: PortState::Resolved(TypeShape::new(DeclarationId(710))), produced_by: None }); + ports.insert(PortId(322), Port { id: PortId(322), state: PortState::Resolved(TypeShape::new(DeclarationId(1617))), produced_by: Some(NodeId(233)) }); + ports.insert(PortId(323), Port { id: PortId(323), state: PortState::Resolved(TypeShape::new(DeclarationId(726))), produced_by: None }); + ports.insert(PortId(324), Port { id: PortId(324), state: PortState::Resolved(TypeShape::new(DeclarationId(2074))), produced_by: Some(NodeId(235)) }); + ports.insert(PortId(325), Port { id: PortId(325), state: PortState::Resolved(TypeShape::new(DeclarationId(705))), produced_by: None }); ports.insert(PortId(326), Port { id: PortId(326), state: PortState::Uninferred, produced_by: None }); ports.insert(PortId(327), Port { id: PortId(327), state: PortState::Uninferred, produced_by: Some(NodeId(237)) }); ports.insert(PortId(328), Port { id: PortId(328), state: PortState::Uninferred, produced_by: Some(NodeId(238)) }); @@ -2452,7 +2447,7 @@ pub(crate) fn bootstrapped_fixture_dag() -> Dag { ports.insert(PortId(342), Port { id: PortId(342), state: PortState::Uninferred, produced_by: Some(NodeId(250)) }); ports.insert(PortId(343), Port { id: PortId(343), state: PortState::Uninferred, produced_by: Some(NodeId(251)) }); ports.insert(PortId(344), Port { id: PortId(344), state: PortState::Resolved(TypeShape::new(DeclarationId(186))), produced_by: Some(NodeId(252)) }); - ports.insert(PortId(345), Port { id: PortId(345), state: PortState::Resolved(TypeShape::new(DeclarationId(710))), produced_by: None }); + ports.insert(PortId(345), Port { id: PortId(345), state: PortState::Resolved(TypeShape::new(DeclarationId(705))), produced_by: None }); ports.insert(PortId(346), Port { id: PortId(346), state: PortState::Uninferred, produced_by: None }); ports.insert(PortId(347), Port { id: PortId(347), state: PortState::Uninferred, produced_by: Some(NodeId(254)) }); ports.insert(PortId(348), Port { id: PortId(348), state: PortState::Uninferred, produced_by: Some(NodeId(255)) }); @@ -2476,7 +2471,7 @@ pub(crate) fn bootstrapped_fixture_dag() -> Dag { , diagnostics: DiagnosticTable::new(), next_node_id: 271, - next_declaration_id: 2100, + next_declaration_id: 2095, next_port_id: 365, primitives: PrimitiveCache::default(), substrate_markers: SubstrateMarkers::default(), @@ -2490,6 +2485,6 @@ pub(crate) fn bootstrapped_fixture_dag() -> Dag { callable_strategy_variants: CallableStrategyVariants::default(), clusters: vec![], optional_match_disjs: HashMap::new(), - declaration_append_begin_after_bootstrap: 2100, + declaration_append_begin_after_bootstrap: 2095, } } diff --git a/src/v3/compiler/src/bootstrap_generated_without_parse_surface.rs b/src/v3/compiler/src/bootstrap_generated_without_parse_surface.rs index 3ed7f18b8bf..ef02390ec54 100644 --- a/src/v3/compiler/src/bootstrap_generated_without_parse_surface.rs +++ b/src/v3/compiler/src/bootstrap_generated_without_parse_surface.rs @@ -3,71 +3,71 @@ pub(crate) fn bootstrapped_fixture_without_parse_surface_dag() -> Dag { Dag { - nodes: vec![Behavior::Transform(TransformNode { id: NodeId(0), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(1), span: SourceSpan::new("src/v3/std/algebra.dag", 9207, 9212) }), Behavior::Transform(TransformNode { id: NodeId(1), target: TransformTarget::Callable(DeclarationId(748)), inputs: vec![PortId(1), PortId(0)], output: PortId(2), span: SourceSpan::new("src/v3/std/algebra.dag", 9198, 9229) }), Behavior::Bind(BindNode { id: NodeId(2), name: "dominate_scan_init".to_string(), value: PortId(2), params: vec![PortId(0)], span: SourceSpan::new("src/v3/std/algebra.dag", 9198, 9229), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(3), target: TransformTarget::Callable(DeclarationId(1629)), inputs: vec![PortId(3)], output: PortId(5), span: SourceSpan::new("src/v3/std/algebra.dag", 10402, 10414) }), Behavior::Transform(TransformNode { id: NodeId(4), target: TransformTarget::Callable(DeclarationId(1631)), inputs: vec![PortId(5)], output: PortId(6), span: SourceSpan::new("src/v3/std/algebra.dag", 10395, 10442) }), Behavior::Transform(TransformNode { id: NodeId(5), target: TransformTarget::Callable(DeclarationId(1591)), inputs: vec![PortId(3), PortId(4), PortId(6)], output: PortId(7), span: SourceSpan::new("src/v3/std/algebra.dag", 10056, 10446) }), Behavior::Bind(BindNode { id: NodeId(6), name: "two_terms".to_string(), value: PortId(7), params: vec![PortId(3), PortId(4)], span: SourceSpan::new("src/v3/std/algebra.dag", 10056, 10446), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(7), target: TransformTarget::Callable(DeclarationId(1593)), inputs: vec![PortId(8), PortId(9), PortId(10)], output: PortId(11), span: SourceSpan::new("src/v3/std/algebra.dag", 10577, 10633) }), Behavior::Bind(BindNode { id: NodeId(8), name: "many_terms".to_string(), value: PortId(11), params: vec![PortId(8), PortId(9), PortId(10)], span: SourceSpan::new("src/v3/std/algebra.dag", 10577, 10633), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(9), target: TransformTarget::Callable(DeclarationId(1632)), inputs: vec![PortId(12)], output: PortId(13), span: SourceSpan::new("src/v3/std/algebra.dag", 10702, 10717) }), Behavior::Transform(TransformNode { id: NodeId(10), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(14), span: SourceSpan::new("src/v3/std/algebra.dag", 10733, 10738) }), Behavior::Transform(TransformNode { id: NodeId(11), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(16), span: SourceSpan::new("src/v3/std/algebra.dag", 10754, 10759) }), Behavior::Branch(BranchNode { id: NodeId(12), input: PortId(13), paths: vec![Path { body: NodeId(10), output: PortId(14), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 10724, 10729) }, binding: None }, Path { body: NodeId(11), output: PortId(16), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 10743, 10750) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(15) }) }], output: PortId(17), span: SourceSpan::new("src/v3/std/algebra.dag", 10696, 10763), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(13), name: "reject_all_symbolic_costs".to_string(), value: PortId(17), params: vec![PortId(12)], span: SourceSpan::new("src/v3/std/algebra.dag", 10696, 10763), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Value(ValueNode { id: NodeId(14), data: LiteralBits::Int(2), output: PortId(19), span: SourceSpan::new("src/v3/std/algebra.dag", 10848, 10849), lane2_workflow: None }), Behavior::Transform(TransformNode { id: NodeId(15), target: TransformTarget::FieldProject { field_label: "previous".to_string(), field_child: None }, inputs: vec![PortId(20)], output: PortId(21), span: SourceSpan::new("src/v3/std/algebra.dag", 10901, 10909) }), Behavior::Transform(TransformNode { id: NodeId(16), target: TransformTarget::Callable(DeclarationId(755)), inputs: vec![PortId(21)], output: PortId(22), span: SourceSpan::new("src/v3/std/algebra.dag", 10882, 10910) }), Behavior::Value(ValueNode { id: NodeId(17), data: LiteralBits::Int(1), output: PortId(23), span: SourceSpan::new("src/v3/std/algebra.dag", 10913, 10914), lane2_workflow: None }), Behavior::Transform(TransformNode { id: NodeId(18), target: TransformTarget::Operator(OperatorKind::Arithmetic(ArithmeticOp::Add)), inputs: vec![PortId(22), PortId(23)], output: PortId(24), span: SourceSpan::new("src/v3/std/algebra.dag", 10882, 10914) }), Behavior::Branch(BranchNode { id: NodeId(19), input: PortId(18), paths: vec![Path { body: NodeId(14), output: PortId(19), pattern: BranchPattern::UnresolvedVariant { name: "DegreeTwo".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 10835, 10844) }, binding: None }, Path { body: NodeId(18), output: PortId(24), pattern: BranchPattern::UnresolvedVariant { name: "DegreeSuccessor".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 10854, 10878) }, binding: Some(PayloadBinding { binding_name: "payload".to_string(), payload_port: PortId(20) }) }], output: PortId(25), span: SourceSpan::new("src/v3/std/algebra.dag", 10816, 10918), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Loop(LoopNode { id: NodeId(20), source: PortId(18), init: PortId(18), body: NodeId(19), bound: LoopBound::Cardinality { count: PortId(18) }, output: PortId(26), span: SourceSpan::new("src/v3/std/algebra.dag", 10816, 10918) }), Behavior::Bind(BindNode { id: NodeId(21), name: "degree_raw".to_string(), value: PortId(26), params: vec![PortId(18)], span: SourceSpan::new("src/v3/std/algebra.dag", 10816, 10918), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(22), target: TransformTarget::Callable(DeclarationId(752)), inputs: vec![PortId(27), PortId(28)], output: PortId(29), span: SourceSpan::new("src/v3/std/algebra.dag", 11240, 11255) }), Behavior::Transform(TransformNode { id: NodeId(23), target: TransformTarget::Callable(DeclarationId(1626)), inputs: vec![PortId(29)], output: PortId(30), span: SourceSpan::new("src/v3/std/algebra.dag", 11232, 11256) }), Behavior::Transform(TransformNode { id: NodeId(24), target: TransformTarget::Callable(DeclarationId(763)), inputs: vec![PortId(30)], output: PortId(31), span: SourceSpan::new("src/v3/std/algebra.dag", 11222, 11257) }), Behavior::Bind(BindNode { id: NodeId(25), name: "sequential".to_string(), value: PortId(31), params: vec![PortId(27), PortId(28)], span: SourceSpan::new("src/v3/std/algebra.dag", 11222, 11257), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(26), target: TransformTarget::Callable(DeclarationId(752)), inputs: vec![PortId(32), PortId(33)], output: PortId(34), span: SourceSpan::new("src/v3/std/algebra.dag", 11537, 11559) }), Behavior::Transform(TransformNode { id: NodeId(27), target: TransformTarget::Callable(DeclarationId(1624)), inputs: vec![PortId(34)], output: PortId(35), span: SourceSpan::new("src/v3/std/algebra.dag", 11525, 11560) }), Behavior::Transform(TransformNode { id: NodeId(28), target: TransformTarget::Callable(DeclarationId(763)), inputs: vec![PortId(35)], output: PortId(36), span: SourceSpan::new("src/v3/std/algebra.dag", 11515, 11561) }), Behavior::Bind(BindNode { id: NodeId(29), name: "iterate".to_string(), value: PortId(36), params: vec![PortId(32), PortId(33)], span: SourceSpan::new("src/v3/std/algebra.dag", 11515, 11561), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(30), target: TransformTarget::Callable(DeclarationId(761)), inputs: vec![PortId(38), PortId(37)], output: PortId(39), span: SourceSpan::new("src/v3/std/algebra.dag", 12505, 12530) }), Behavior::Transform(TransformNode { id: NodeId(31), target: TransformTarget::Callable(DeclarationId(759)), inputs: vec![PortId(37), PortId(38)], output: PortId(40), span: SourceSpan::new("src/v3/std/algebra.dag", 12561, 12588) }), Behavior::Branch(BranchNode { id: NodeId(32), input: PortId(39), paths: vec![Path { body: NodeId(32), output: PortId(38), pattern: BranchPattern::UnresolvedVariant { name: "True".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 12540, 12549) }, binding: None }, Path { body: NodeId(31), output: PortId(40), pattern: BranchPattern::UnresolvedVariant { name: "False".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 12561, 12588) }, binding: None }], output: PortId(41), span: SourceSpan::new("src/v3/std/algebra.dag", 12502, 12588), emit_participation: None }), Behavior::Bind(BindNode { id: NodeId(33), name: "max_path_step".to_string(), value: PortId(41), params: vec![PortId(37), PortId(38)], span: SourceSpan::new("src/v3/std/algebra.dag", 12502, 12588), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(34), target: TransformTarget::Callable(DeclarationId(761)), inputs: vec![PortId(42), PortId(43)], output: PortId(44), span: SourceSpan::new("src/v3/std/algebra.dag", 12672, 12697) }), Behavior::Transform(TransformNode { id: NodeId(35), target: TransformTarget::Callable(DeclarationId(756)), inputs: vec![PortId(42), PortId(43)], output: PortId(45), span: SourceSpan::new("src/v3/std/algebra.dag", 12722, 12748) }), Behavior::Branch(BranchNode { id: NodeId(36), input: PortId(44), paths: vec![Path { body: NodeId(36), output: PortId(42), pattern: BranchPattern::UnresolvedVariant { name: "True".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 12707, 12710) }, binding: None }, Path { body: NodeId(35), output: PortId(45), pattern: BranchPattern::UnresolvedVariant { name: "False".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 12722, 12748) }, binding: None }], output: PortId(46), span: SourceSpan::new("src/v3/std/algebra.dag", 12669, 12748), emit_participation: None }), Behavior::Bind(BindNode { id: NodeId(37), name: "keep_or_sum".to_string(), value: PortId(46), params: vec![PortId(42), PortId(43)], span: SourceSpan::new("src/v3/std/algebra.dag", 12669, 12748), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Value(ValueNode { id: NodeId(38), data: LiteralBits::Int(0), output: PortId(48), span: SourceSpan::new("src/v3/std/algebra.dag", 13134, 13135), lane2_workflow: None }), Behavior::Transform(TransformNode { id: NodeId(39), target: TransformTarget::Callable(DeclarationId(1620)), inputs: vec![PortId(48)], output: PortId(49), span: SourceSpan::new("src/v3/std/algebra.dag", 13121, 13136) }), Behavior::Transform(TransformNode { id: NodeId(40), target: TransformTarget::Callable(DeclarationId(1634)), inputs: vec![PortId(47), PortId(49)], output: PortId(50), span: SourceSpan::new("src/v3/std/algebra.dag", 13109, 13152) }), Behavior::Bind(BindNode { id: NodeId(41), name: "max_path".to_string(), value: PortId(50), params: vec![PortId(47)], span: SourceSpan::new("src/v3/std/algebra.dag", 13109, 13152), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(42), target: TransformTarget::Callable(DeclarationId(430)), inputs: vec![], output: PortId(54), span: SourceSpan::new("src/v3/std/algebra.dag", 14111, 14115) }), Behavior::Transform(TransformNode { id: NodeId(43), target: TransformTarget::Callable(DeclarationId(430)), inputs: vec![], output: PortId(57), span: SourceSpan::new("src/v3/std/algebra.dag", 14182, 14186) }), Behavior::Transform(TransformNode { id: NodeId(44), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(59), span: SourceSpan::new("src/v3/std/algebra.dag", 14213, 14218) }), Behavior::Transform(TransformNode { id: NodeId(45), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(61), span: SourceSpan::new("src/v3/std/algebra.dag", 14244, 14249) }), Behavior::Transform(TransformNode { id: NodeId(46), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(63), span: SourceSpan::new("src/v3/std/algebra.dag", 14279, 14284) }), Behavior::Transform(TransformNode { id: NodeId(47), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(65), span: SourceSpan::new("src/v3/std/algebra.dag", 14311, 14316) }), Behavior::Transform(TransformNode { id: NodeId(48), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(67), span: SourceSpan::new("src/v3/std/algebra.dag", 14339, 14344) }), Behavior::Transform(TransformNode { id: NodeId(49), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(69), span: SourceSpan::new("src/v3/std/algebra.dag", 14367, 14372) }), Behavior::Branch(BranchNode { id: NodeId(50), input: PortId(52), paths: vec![Path { body: NodeId(43), output: PortId(57), pattern: BranchPattern::UnresolvedVariant { name: "ConstantCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14163, 14178) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(56) }) }, Path { body: NodeId(44), output: PortId(59), pattern: BranchPattern::UnresolvedVariant { name: "UnknownCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14195, 14209) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(58) }) }, Path { body: NodeId(45), output: PortId(61), pattern: BranchPattern::UnresolvedVariant { name: "LinearCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14227, 14240) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(60) }) }, Path { body: NodeId(46), output: PortId(63), pattern: BranchPattern::UnresolvedVariant { name: "PolynomialCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14258, 14275) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(62) }) }, Path { body: NodeId(47), output: PortId(65), pattern: BranchPattern::UnresolvedVariant { name: "ProductCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14293, 14307) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(64) }) }, Path { body: NodeId(48), output: PortId(67), pattern: BranchPattern::UnresolvedVariant { name: "SumCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14325, 14335) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(66) }) }, Path { body: NodeId(49), output: PortId(69), pattern: BranchPattern::UnresolvedVariant { name: "LogCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14353, 14363) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(68) }) }], output: PortId(70), span: SourceSpan::new("src/v3/std/algebra.dag", 14145, 14380), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Transform(TransformNode { id: NodeId(51), target: TransformTarget::Callable(DeclarationId(430)), inputs: vec![], output: PortId(73), span: SourceSpan::new("src/v3/std/algebra.dag", 14446, 14450) }), Behavior::Transform(TransformNode { id: NodeId(52), target: TransformTarget::Callable(DeclarationId(430)), inputs: vec![], output: PortId(75), span: SourceSpan::new("src/v3/std/algebra.dag", 14473, 14477) }), Behavior::Transform(TransformNode { id: NodeId(53), target: TransformTarget::Callable(DeclarationId(762)), inputs: vec![PortId(71), PortId(76)], output: PortId(77), span: SourceSpan::new("src/v3/std/algebra.dag", 14504, 14530) }), Behavior::Transform(TransformNode { id: NodeId(54), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(79), span: SourceSpan::new("src/v3/std/algebra.dag", 14576, 14581) }), Behavior::Transform(TransformNode { id: NodeId(55), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(81), span: SourceSpan::new("src/v3/std/algebra.dag", 14608, 14613) }), Behavior::Transform(TransformNode { id: NodeId(56), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(83), span: SourceSpan::new("src/v3/std/algebra.dag", 14640, 14645) }), Behavior::Transform(TransformNode { id: NodeId(57), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(85), span: SourceSpan::new("src/v3/std/algebra.dag", 14668, 14673) }), Behavior::Branch(BranchNode { id: NodeId(58), input: PortId(52), paths: vec![Path { body: NodeId(51), output: PortId(73), pattern: BranchPattern::UnresolvedVariant { name: "ConstantCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14427, 14442) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(72) }) }, Path { body: NodeId(52), output: PortId(75), pattern: BranchPattern::UnresolvedVariant { name: "LogCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14459, 14469) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(74) }) }, Path { body: NodeId(53), output: PortId(77), pattern: BranchPattern::UnresolvedVariant { name: "LinearCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14486, 14500) }, binding: Some(PayloadBinding { binding_name: "vb".to_string(), payload_port: PortId(76) }) }, Path { body: NodeId(54), output: PortId(79), pattern: BranchPattern::UnresolvedVariant { name: "PolynomialCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14539, 14562) }, binding: Some(PayloadBinding { binding_name: "payload".to_string(), payload_port: PortId(78) }) }, Path { body: NodeId(55), output: PortId(81), pattern: BranchPattern::UnresolvedVariant { name: "UnknownCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14590, 14604) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(80) }) }, Path { body: NodeId(56), output: PortId(83), pattern: BranchPattern::UnresolvedVariant { name: "ProductCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14622, 14636) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(82) }) }, Path { body: NodeId(57), output: PortId(85), pattern: BranchPattern::UnresolvedVariant { name: "SumCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14654, 14664) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(84) }) }], output: PortId(86), span: SourceSpan::new("src/v3/std/algebra.dag", 14409, 14681), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Transform(TransformNode { id: NodeId(59), target: TransformTarget::Callable(DeclarationId(430)), inputs: vec![], output: PortId(89), span: SourceSpan::new("src/v3/std/algebra.dag", 14751, 14755) }), Behavior::Transform(TransformNode { id: NodeId(60), target: TransformTarget::Callable(DeclarationId(430)), inputs: vec![], output: PortId(91), span: SourceSpan::new("src/v3/std/algebra.dag", 14778, 14782) }), Behavior::Transform(TransformNode { id: NodeId(61), target: TransformTarget::FieldProject { field_label: "var".to_string(), field_child: None }, inputs: vec![PortId(87)], output: PortId(93), span: SourceSpan::new("src/v3/std/algebra.dag", 14841, 14844) }), Behavior::Transform(TransformNode { id: NodeId(62), target: TransformTarget::Callable(DeclarationId(762)), inputs: vec![PortId(93), PortId(92)], output: PortId(94), span: SourceSpan::new("src/v3/std/algebra.dag", 14819, 14849) }), Behavior::Transform(TransformNode { id: NodeId(63), target: TransformTarget::FieldProject { field_label: "var".to_string(), field_child: None }, inputs: vec![PortId(87)], output: PortId(96), span: SourceSpan::new("src/v3/std/algebra.dag", 14915, 14918) }), Behavior::Transform(TransformNode { id: NodeId(64), target: TransformTarget::FieldProject { field_label: "var".to_string(), field_child: None }, inputs: vec![PortId(95)], output: PortId(97), span: SourceSpan::new("src/v3/std/algebra.dag", 14923, 14926) }), Behavior::Transform(TransformNode { id: NodeId(65), target: TransformTarget::Callable(DeclarationId(762)), inputs: vec![PortId(96), PortId(97)], output: PortId(98), span: SourceSpan::new("src/v3/std/algebra.dag", 14893, 14927) }), Behavior::Transform(TransformNode { id: NodeId(66), target: TransformTarget::FieldProject { field_label: "degree".to_string(), field_child: None }, inputs: vec![PortId(87)], output: PortId(99), span: SourceSpan::new("src/v3/std/algebra.dag", 14959, 14965) }), Behavior::Transform(TransformNode { id: NodeId(67), target: TransformTarget::Callable(DeclarationId(755)), inputs: vec![PortId(99)], output: PortId(100), span: SourceSpan::new("src/v3/std/algebra.dag", 14945, 14966) }), Behavior::Transform(TransformNode { id: NodeId(68), target: TransformTarget::FieldProject { field_label: "degree".to_string(), field_child: None }, inputs: vec![PortId(95)], output: PortId(101), span: SourceSpan::new("src/v3/std/algebra.dag", 14984, 14990) }), Behavior::Transform(TransformNode { id: NodeId(69), target: TransformTarget::Callable(DeclarationId(755)), inputs: vec![PortId(101)], output: PortId(102), span: SourceSpan::new("src/v3/std/algebra.dag", 14970, 14991) }), Behavior::Transform(TransformNode { id: NodeId(70), target: TransformTarget::Operator(OperatorKind::Comparison(ComparisonOp::Ge)), inputs: vec![PortId(100), PortId(102)], output: PortId(103), span: SourceSpan::new("src/v3/std/algebra.dag", 14945, 14991) }), Behavior::Transform(TransformNode { id: NodeId(71), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(104), span: SourceSpan::new("src/v3/std/algebra.dag", 15019, 15024) }), Behavior::Branch(BranchNode { id: NodeId(72), input: PortId(98), paths: vec![Path { body: NodeId(70), output: PortId(103), pattern: BranchPattern::UnresolvedVariant { name: "True".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14945, 14991) }, binding: None }, Path { body: NodeId(71), output: PortId(104), pattern: BranchPattern::UnresolvedVariant { name: "False".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15019, 15024) }, binding: None }], output: PortId(105), span: SourceSpan::new("src/v3/std/algebra.dag", 14890, 15024), emit_participation: None }), Behavior::Transform(TransformNode { id: NodeId(73), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(107), span: SourceSpan::new("src/v3/std/algebra.dag", 15051, 15056) }), Behavior::Transform(TransformNode { id: NodeId(74), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(109), span: SourceSpan::new("src/v3/std/algebra.dag", 15083, 15088) }), Behavior::Transform(TransformNode { id: NodeId(75), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(111), span: SourceSpan::new("src/v3/std/algebra.dag", 15111, 15116) }), Behavior::Branch(BranchNode { id: NodeId(76), input: PortId(52), paths: vec![Path { body: NodeId(59), output: PortId(89), pattern: BranchPattern::UnresolvedVariant { name: "ConstantCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14732, 14747) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(88) }) }, Path { body: NodeId(60), output: PortId(91), pattern: BranchPattern::UnresolvedVariant { name: "LogCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14764, 14774) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(90) }) }, Path { body: NodeId(62), output: PortId(94), pattern: BranchPattern::UnresolvedVariant { name: "LinearCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14791, 14805) }, binding: Some(PayloadBinding { binding_name: "vb".to_string(), payload_port: PortId(92) }) }, Path { body: NodeId(72), output: PortId(105), pattern: BranchPattern::UnresolvedVariant { name: "PolynomialCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14858, 14876) }, binding: Some(PayloadBinding { binding_name: "pb".to_string(), payload_port: PortId(95) }) }, Path { body: NodeId(73), output: PortId(107), pattern: BranchPattern::UnresolvedVariant { name: "UnknownCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15033, 15047) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(106) }) }, Path { body: NodeId(74), output: PortId(109), pattern: BranchPattern::UnresolvedVariant { name: "ProductCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15065, 15079) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(108) }) }, Path { body: NodeId(75), output: PortId(111), pattern: BranchPattern::UnresolvedVariant { name: "SumCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15097, 15107) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(110) }) }], output: PortId(112), span: SourceSpan::new("src/v3/std/algebra.dag", 14714, 15124), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Transform(TransformNode { id: NodeId(77), target: TransformTarget::Callable(DeclarationId(430)), inputs: vec![], output: PortId(115), span: SourceSpan::new("src/v3/std/algebra.dag", 15187, 15191) }), Behavior::Transform(TransformNode { id: NodeId(78), target: TransformTarget::Callable(DeclarationId(762)), inputs: vec![PortId(113), PortId(116)], output: PortId(117), span: SourceSpan::new("src/v3/std/algebra.dag", 15215, 15241) }), Behavior::Transform(TransformNode { id: NodeId(79), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(119), span: SourceSpan::new("src/v3/std/algebra.dag", 15267, 15272) }), Behavior::Transform(TransformNode { id: NodeId(80), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(121), span: SourceSpan::new("src/v3/std/algebra.dag", 15302, 15307) }), Behavior::Transform(TransformNode { id: NodeId(81), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(123), span: SourceSpan::new("src/v3/std/algebra.dag", 15334, 15339) }), Behavior::Transform(TransformNode { id: NodeId(82), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(125), span: SourceSpan::new("src/v3/std/algebra.dag", 15362, 15367) }), Behavior::Transform(TransformNode { id: NodeId(83), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(127), span: SourceSpan::new("src/v3/std/algebra.dag", 15394, 15399) }), Behavior::Branch(BranchNode { id: NodeId(84), input: PortId(52), paths: vec![Path { body: NodeId(77), output: PortId(115), pattern: BranchPattern::UnresolvedVariant { name: "ConstantCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15168, 15183) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(114) }) }, Path { body: NodeId(78), output: PortId(117), pattern: BranchPattern::UnresolvedVariant { name: "LogCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15200, 15211) }, binding: Some(PayloadBinding { binding_name: "vb".to_string(), payload_port: PortId(116) }) }, Path { body: NodeId(79), output: PortId(119), pattern: BranchPattern::UnresolvedVariant { name: "LinearCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15250, 15263) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(118) }) }, Path { body: NodeId(80), output: PortId(121), pattern: BranchPattern::UnresolvedVariant { name: "PolynomialCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15281, 15298) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(120) }) }, Path { body: NodeId(81), output: PortId(123), pattern: BranchPattern::UnresolvedVariant { name: "ProductCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15316, 15330) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(122) }) }, Path { body: NodeId(82), output: PortId(125), pattern: BranchPattern::UnresolvedVariant { name: "SumCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15348, 15358) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(124) }) }, Path { body: NodeId(83), output: PortId(127), pattern: BranchPattern::UnresolvedVariant { name: "UnknownCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15376, 15390) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(126) }) }], output: PortId(128), span: SourceSpan::new("src/v3/std/algebra.dag", 15150, 15407), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Transform(TransformNode { id: NodeId(85), target: TransformTarget::Callable(DeclarationId(764)), inputs: vec![PortId(129)], output: PortId(130), span: SourceSpan::new("src/v3/std/algebra.dag", 15834, 15852) }), Behavior::Transform(TransformNode { id: NodeId(86), target: TransformTarget::Callable(DeclarationId(749)), inputs: vec![PortId(52)], output: PortId(131), span: SourceSpan::new("src/v3/std/algebra.dag", 15864, 15885) }), Behavior::Transform(TransformNode { id: NodeId(87), target: TransformTarget::Callable(DeclarationId(1636)), inputs: vec![PortId(130), PortId(131)], output: PortId(132), span: SourceSpan::new("src/v3/std/algebra.dag", 15818, 15928) }), Behavior::Transform(TransformNode { id: NodeId(88), target: TransformTarget::Callable(DeclarationId(776)), inputs: vec![PortId(132)], output: PortId(133), span: SourceSpan::new("src/v3/std/algebra.dag", 15800, 15936) }), Behavior::Transform(TransformNode { id: NodeId(89), target: TransformTarget::Callable(DeclarationId(764)), inputs: vec![PortId(134)], output: PortId(135), span: SourceSpan::new("src/v3/std/algebra.dag", 15999, 16017) }), Behavior::Transform(TransformNode { id: NodeId(90), target: TransformTarget::Callable(DeclarationId(749)), inputs: vec![PortId(52)], output: PortId(136), span: SourceSpan::new("src/v3/std/algebra.dag", 16029, 16050) }), Behavior::Transform(TransformNode { id: NodeId(91), target: TransformTarget::Callable(DeclarationId(1638)), inputs: vec![PortId(135), PortId(136)], output: PortId(137), span: SourceSpan::new("src/v3/std/algebra.dag", 15983, 16093) }), Behavior::Transform(TransformNode { id: NodeId(92), target: TransformTarget::Callable(DeclarationId(776)), inputs: vec![PortId(137)], output: PortId(138), span: SourceSpan::new("src/v3/std/algebra.dag", 15965, 16101) }), Behavior::Branch(BranchNode { id: NodeId(93), input: PortId(51), paths: vec![Path { body: NodeId(42), output: PortId(54), pattern: BranchPattern::UnresolvedVariant { name: "UnknownCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14093, 14107) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(53) }) }, Path { body: NodeId(50), output: PortId(70), pattern: BranchPattern::UnresolvedVariant { name: "ConstantCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14120, 14135) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(55) }) }, Path { body: NodeId(58), output: PortId(86), pattern: BranchPattern::UnresolvedVariant { name: "LinearCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14385, 14399) }, binding: Some(PayloadBinding { binding_name: "va".to_string(), payload_port: PortId(71) }) }, Path { body: NodeId(76), output: PortId(112), pattern: BranchPattern::UnresolvedVariant { name: "PolynomialCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14686, 14704) }, binding: Some(PayloadBinding { binding_name: "pa".to_string(), payload_port: PortId(87) }) }, Path { body: NodeId(84), output: PortId(128), pattern: BranchPattern::UnresolvedVariant { name: "LogCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15129, 15140) }, binding: Some(PayloadBinding { binding_name: "va".to_string(), payload_port: PortId(113) }) }, Path { body: NodeId(88), output: PortId(133), pattern: BranchPattern::UnresolvedVariant { name: "ProductCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15772, 15790) }, binding: Some(PayloadBinding { binding_name: "terms".to_string(), payload_port: PortId(129) }) }, Path { body: NodeId(92), output: PortId(138), pattern: BranchPattern::UnresolvedVariant { name: "SumCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15941, 15955) }, binding: Some(PayloadBinding { binding_name: "terms".to_string(), payload_port: PortId(134) }) }], output: PortId(139), span: SourceSpan::new("src/v3/std/algebra.dag", 14079, 16105), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(94), name: "dominates".to_string(), value: PortId(139), params: vec![PortId(51), PortId(52)], span: SourceSpan::new("src/v3/std/algebra.dag", 14079, 16105), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(95), target: TransformTarget::FieldProject { field_label: "source_port".to_string(), field_child: Some(DeclarationId(631)) }, inputs: vec![PortId(140)], output: PortId(142), span: SourceSpan::new("src/v3/std/algebra.dag", 16177, 16188) }), Behavior::Transform(TransformNode { id: NodeId(96), target: TransformTarget::FieldProject { field_label: "source_port".to_string(), field_child: Some(DeclarationId(631)) }, inputs: vec![PortId(141)], output: PortId(143), span: SourceSpan::new("src/v3/std/algebra.dag", 16194, 16205) }), Behavior::Transform(TransformNode { id: NodeId(97), target: TransformTarget::Operator(OperatorKind::Comparison(ComparisonOp::Eq)), inputs: vec![PortId(142), PortId(143)], output: PortId(144), span: SourceSpan::new("src/v3/std/algebra.dag", 16175, 16205) }), Behavior::Bind(BindNode { id: NodeId(98), name: "same_size_variable".to_string(), value: PortId(144), params: vec![PortId(140), PortId(141)], span: SourceSpan::new("src/v3/std/algebra.dag", 16175, 16205), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(99), target: TransformTarget::Callable(DeclarationId(764)), inputs: vec![PortId(146)], output: PortId(147), span: SourceSpan::new("src/v3/std/algebra.dag", 17170, 17188) }), Behavior::Transform(TransformNode { id: NodeId(100), target: TransformTarget::Callable(DeclarationId(765)), inputs: vec![PortId(147)], output: PortId(148), span: SourceSpan::new("src/v3/std/algebra.dag", 17160, 17189) }), Behavior::Transform(TransformNode { id: NodeId(101), target: TransformTarget::Callable(DeclarationId(767)), inputs: vec![PortId(148)], output: PortId(149), span: SourceSpan::new("src/v3/std/algebra.dag", 17149, 17190) }), Behavior::Transform(TransformNode { id: NodeId(102), target: TransformTarget::Callable(DeclarationId(764)), inputs: vec![PortId(150)], output: PortId(151), span: SourceSpan::new("src/v3/std/algebra.dag", 17242, 17260) }), Behavior::Transform(TransformNode { id: NodeId(103), target: TransformTarget::Callable(DeclarationId(765)), inputs: vec![PortId(151)], output: PortId(152), span: SourceSpan::new("src/v3/std/algebra.dag", 17232, 17261) }), Behavior::Transform(TransformNode { id: NodeId(104), target: TransformTarget::Callable(DeclarationId(769)), inputs: vec![PortId(152)], output: PortId(153), span: SourceSpan::new("src/v3/std/algebra.dag", 17217, 17262) }), Behavior::Branch(BranchNode { id: NodeId(105), input: PortId(145), paths: vec![Path { body: NodeId(105), output: PortId(145), pattern: BranchPattern::UnresolvedVariant { name: "ConstantCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17027, 17039) }, binding: None }, Path { body: NodeId(105), output: PortId(145), pattern: BranchPattern::UnresolvedVariant { name: "LinearCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17049, 17059) }, binding: None }, Path { body: NodeId(105), output: PortId(145), pattern: BranchPattern::UnresolvedVariant { name: "PolynomialCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17069, 17083) }, binding: None }, Path { body: NodeId(105), output: PortId(145), pattern: BranchPattern::UnresolvedVariant { name: "LogCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17093, 17100) }, binding: None }, Path { body: NodeId(105), output: PortId(145), pattern: BranchPattern::UnresolvedVariant { name: "UnknownCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17110, 17121) }, binding: None }, Path { body: NodeId(101), output: PortId(149), pattern: BranchPattern::UnresolvedVariant { name: "SumCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17131, 17145) }, binding: Some(PayloadBinding { binding_name: "terms".to_string(), payload_port: PortId(146) }) }, Path { body: NodeId(104), output: PortId(153), pattern: BranchPattern::UnresolvedVariant { name: "ProductCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17195, 17213) }, binding: Some(PayloadBinding { binding_name: "terms".to_string(), payload_port: PortId(150) }) }], output: PortId(154), span: SourceSpan::new("src/v3/std/algebra.dag", 17013, 17266), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(106), name: "normalize".to_string(), value: PortId(154), params: vec![PortId(145)], span: SourceSpan::new("src/v3/std/algebra.dag", 17013, 17266), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(107), target: TransformTarget::FieldProject { field_label: "first".to_string(), field_child: Some(DeclarationId(637)) }, inputs: vec![PortId(155)], output: PortId(156), span: SourceSpan::new("src/v3/std/algebra.dag", 17359, 17364) }), Behavior::Transform(TransformNode { id: NodeId(108), target: TransformTarget::FieldProject { field_label: "second".to_string(), field_child: Some(DeclarationId(637)) }, inputs: vec![PortId(155)], output: PortId(157), span: SourceSpan::new("src/v3/std/algebra.dag", 17377, 17383) }), Behavior::Transform(TransformNode { id: NodeId(109), target: TransformTarget::FieldProject { field_label: "rest".to_string(), field_child: Some(DeclarationId(1413)) }, inputs: vec![PortId(155)], output: PortId(158), span: SourceSpan::new("src/v3/std/algebra.dag", 17391, 17395) }), Behavior::Transform(TransformNode { id: NodeId(110), target: TransformTarget::Callable(DeclarationId(1639)), inputs: vec![PortId(157), PortId(158)], output: PortId(159), span: SourceSpan::new("src/v3/std/algebra.dag", 17366, 17396) }), Behavior::Transform(TransformNode { id: NodeId(111), target: TransformTarget::Callable(DeclarationId(1640)), inputs: vec![PortId(156), PortId(159)], output: PortId(160), span: SourceSpan::new("src/v3/std/algebra.dag", 17348, 17397) }), Behavior::Bind(BindNode { id: NodeId(112), name: "nsl_to_list".to_string(), value: PortId(160), params: vec![PortId(155)], span: SourceSpan::new("src/v3/std/algebra.dag", 17348, 17397), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(113), target: TransformTarget::Callable(DeclarationId(1641)), inputs: vec![], output: PortId(162), span: SourceSpan::new("src/v3/std/algebra.dag", 17667, 17674) }), Behavior::Transform(TransformNode { id: NodeId(114), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(163)], output: PortId(164), span: SourceSpan::new("src/v3/std/algebra.dag", 17730, 17734) }), Behavior::Transform(TransformNode { id: NodeId(115), target: TransformTarget::Callable(DeclarationId(766)), inputs: vec![PortId(164)], output: PortId(165), span: SourceSpan::new("src/v3/std/algebra.dag", 17705, 17735) }), Behavior::Transform(TransformNode { id: NodeId(116), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(163)], output: PortId(166), span: SourceSpan::new("src/v3/std/algebra.dag", 17767, 17771) }), Behavior::Transform(TransformNode { id: NodeId(117), target: TransformTarget::Callable(DeclarationId(765)), inputs: vec![PortId(166)], output: PortId(167), span: SourceSpan::new("src/v3/std/algebra.dag", 17749, 17772) }), Behavior::Transform(TransformNode { id: NodeId(118), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(163)], output: PortId(168), span: SourceSpan::new("src/v3/std/algebra.dag", 17805, 17809) }), Behavior::Transform(TransformNode { id: NodeId(119), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(163)], output: PortId(169), span: SourceSpan::new("src/v3/std/algebra.dag", 17829, 17833) }), Behavior::Transform(TransformNode { id: NodeId(120), target: TransformTarget::Callable(DeclarationId(765)), inputs: vec![PortId(169)], output: PortId(170), span: SourceSpan::new("src/v3/std/algebra.dag", 17811, 17834) }), Behavior::Transform(TransformNode { id: NodeId(121), target: TransformTarget::Callable(DeclarationId(1642)), inputs: vec![PortId(168), PortId(170)], output: PortId(171), span: SourceSpan::new("src/v3/std/algebra.dag", 17792, 17835) }), Behavior::Branch(BranchNode { id: NodeId(122), input: PortId(165), paths: vec![Path { body: NodeId(117), output: PortId(167), pattern: BranchPattern::UnresolvedVariant { name: "True".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17749, 17772) }, binding: None }, Path { body: NodeId(121), output: PortId(171), pattern: BranchPattern::UnresolvedVariant { name: "False".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17792, 17835) }, binding: None }], output: PortId(172), span: SourceSpan::new("src/v3/std/algebra.dag", 17702, 17835), emit_participation: None }), Behavior::Branch(BranchNode { id: NodeId(123), input: PortId(161), paths: vec![Path { body: NodeId(113), output: PortId(162), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17658, 17663) }, binding: None }, Path { body: NodeId(122), output: PortId(172), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17679, 17692) }, binding: Some(PayloadBinding { binding_name: "payload".to_string(), payload_port: PortId(163) }) }], output: PortId(173), span: SourceSpan::new("src/v3/std/algebra.dag", 17640, 17839), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Loop(LoopNode { id: NodeId(124), source: PortId(161), init: PortId(161), body: NodeId(123), bound: LoopBound::Cardinality { count: PortId(161) }, output: PortId(174), span: SourceSpan::new("src/v3/std/algebra.dag", 17640, 17839) }), Behavior::Bind(BindNode { id: NodeId(125), name: "drop_zero".to_string(), value: PortId(174), params: vec![PortId(161)], span: SourceSpan::new("src/v3/std/algebra.dag", 17640, 17839), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Value(ValueNode { id: NodeId(126), data: LiteralBits::Int(0), output: PortId(177), span: SourceSpan::new("src/v3/std/algebra.dag", 17928, 17929), lane2_workflow: None }), Behavior::Transform(TransformNode { id: NodeId(127), target: TransformTarget::Operator(OperatorKind::Comparison(ComparisonOp::Eq)), inputs: vec![PortId(176), PortId(177)], output: PortId(178), span: SourceSpan::new("src/v3/std/algebra.dag", 17923, 17929) }), Behavior::Transform(TransformNode { id: NodeId(128), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(180), span: SourceSpan::new("src/v3/std/algebra.dag", 17951, 17956) }), Behavior::Transform(TransformNode { id: NodeId(129), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(182), span: SourceSpan::new("src/v3/std/algebra.dag", 17982, 17987) }), Behavior::Transform(TransformNode { id: NodeId(130), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(184), span: SourceSpan::new("src/v3/std/algebra.dag", 18010, 18015) }), Behavior::Transform(TransformNode { id: NodeId(131), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(186), span: SourceSpan::new("src/v3/std/algebra.dag", 18034, 18039) }), Behavior::Transform(TransformNode { id: NodeId(132), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(188), span: SourceSpan::new("src/v3/std/algebra.dag", 18058, 18063) }), Behavior::Transform(TransformNode { id: NodeId(133), target: TransformTarget::Callable(DeclarationId(431)), inputs: vec![], output: PortId(190), span: SourceSpan::new("src/v3/std/algebra.dag", 18086, 18091) }), Behavior::Branch(BranchNode { id: NodeId(134), input: PortId(175), paths: vec![Path { body: NodeId(127), output: PortId(178), pattern: BranchPattern::UnresolvedVariant { name: "ConstantCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17904, 17919) }, binding: Some(PayloadBinding { binding_name: "n".to_string(), payload_port: PortId(176) }) }, Path { body: NodeId(128), output: PortId(180), pattern: BranchPattern::UnresolvedVariant { name: "LinearCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17934, 17947) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(179) }) }, Path { body: NodeId(129), output: PortId(182), pattern: BranchPattern::UnresolvedVariant { name: "PolynomialCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17961, 17978) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(181) }) }, Path { body: NodeId(130), output: PortId(184), pattern: BranchPattern::UnresolvedVariant { name: "ProductCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17992, 18006) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(183) }) }, Path { body: NodeId(131), output: PortId(186), pattern: BranchPattern::UnresolvedVariant { name: "SumCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 18020, 18030) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(185) }) }, Path { body: NodeId(132), output: PortId(188), pattern: BranchPattern::UnresolvedVariant { name: "LogCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 18044, 18054) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(187) }) }, Path { body: NodeId(133), output: PortId(190), pattern: BranchPattern::UnresolvedVariant { name: "UnknownCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 18068, 18082) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(189) }) }], output: PortId(191), span: SourceSpan::new("src/v3/std/algebra.dag", 17890, 18095), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(135), name: "is_zero_constant".to_string(), value: PortId(191), params: vec![PortId(175)], span: SourceSpan::new("src/v3/std/algebra.dag", 17890, 18095), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Value(ValueNode { id: NodeId(136), data: LiteralBits::Int(0), output: PortId(193), span: SourceSpan::new("src/v3/std/algebra.dag", 18981, 18982), lane2_workflow: None }), Behavior::Transform(TransformNode { id: NodeId(137), target: TransformTarget::Callable(DeclarationId(1620)), inputs: vec![PortId(193)], output: PortId(194), span: SourceSpan::new("src/v3/std/algebra.dag", 18968, 18983) }), Behavior::Transform(TransformNode { id: NodeId(138), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(195)], output: PortId(196), span: SourceSpan::new("src/v3/std/algebra.dag", 19025, 19029) }), Behavior::Transform(TransformNode { id: NodeId(139), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(195)], output: PortId(197), span: SourceSpan::new("src/v3/std/algebra.dag", 19057, 19061) }), Behavior::Transform(TransformNode { id: NodeId(140), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(195)], output: PortId(199), span: SourceSpan::new("src/v3/std/algebra.dag", 19118, 19122) }), Behavior::Transform(TransformNode { id: NodeId(141), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(195)], output: PortId(200), span: SourceSpan::new("src/v3/std/algebra.dag", 19132, 19136) }), Behavior::Transform(TransformNode { id: NodeId(142), target: TransformTarget::Callable(DeclarationId(1643)), inputs: vec![PortId(199), PortId(200)], output: PortId(201), span: SourceSpan::new("src/v3/std/algebra.dag", 19105, 19137) }), Behavior::Transform(TransformNode { id: NodeId(143), target: TransformTarget::Callable(DeclarationId(779)), inputs: vec![PortId(201)], output: PortId(202), span: SourceSpan::new("src/v3/std/algebra.dag", 19090, 19138) }), Behavior::Transform(TransformNode { id: NodeId(144), target: TransformTarget::Callable(DeclarationId(768)), inputs: vec![PortId(202)], output: PortId(203), span: SourceSpan::new("src/v3/std/algebra.dag", 19081, 19139) }), Behavior::Branch(BranchNode { id: NodeId(145), input: PortId(196), paths: vec![Path { body: NodeId(139), output: PortId(197), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19040, 19045) }, binding: None }, Path { body: NodeId(144), output: PortId(203), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19070, 19077) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(198) }) }], output: PortId(204), span: SourceSpan::new("src/v3/std/algebra.dag", 19011, 19147), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Branch(BranchNode { id: NodeId(146), input: PortId(192), paths: vec![Path { body: NodeId(137), output: PortId(194), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 18959, 18964) }, binding: None }, Path { body: NodeId(145), output: PortId(204), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 18988, 19001) }, binding: Some(PayloadBinding { binding_name: "payload".to_string(), payload_port: PortId(195) }) }], output: PortId(205), span: SourceSpan::new("src/v3/std/algebra.dag", 18941, 19151), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(147), name: "reduce_sum".to_string(), value: PortId(205), params: vec![PortId(192)], span: SourceSpan::new("src/v3/std/algebra.dag", 18941, 19151), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Value(ValueNode { id: NodeId(148), data: LiteralBits::Int(0), output: PortId(207), span: SourceSpan::new("src/v3/std/algebra.dag", 19252, 19253), lane2_workflow: None }), Behavior::Transform(TransformNode { id: NodeId(149), target: TransformTarget::Callable(DeclarationId(1620)), inputs: vec![PortId(207)], output: PortId(208), span: SourceSpan::new("src/v3/std/algebra.dag", 19239, 19254) }), Behavior::Transform(TransformNode { id: NodeId(150), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(209)], output: PortId(210), span: SourceSpan::new("src/v3/std/algebra.dag", 19296, 19300) }), Behavior::Transform(TransformNode { id: NodeId(151), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(209)], output: PortId(211), span: SourceSpan::new("src/v3/std/algebra.dag", 19328, 19332) }), Behavior::Transform(TransformNode { id: NodeId(152), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(209)], output: PortId(213), span: SourceSpan::new("src/v3/std/algebra.dag", 19384, 19388) }), Behavior::Transform(TransformNode { id: NodeId(153), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(212)], output: PortId(214), span: SourceSpan::new("src/v3/std/algebra.dag", 19397, 19401) }), Behavior::Transform(TransformNode { id: NodeId(154), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(212)], output: PortId(215), span: SourceSpan::new("src/v3/std/algebra.dag", 19410, 19414) }), Behavior::Transform(TransformNode { id: NodeId(155), target: TransformTarget::Callable(DeclarationId(753)), inputs: vec![PortId(213), PortId(214), PortId(215)], output: PortId(216), span: SourceSpan::new("src/v3/std/algebra.dag", 19365, 19415) }), Behavior::Transform(TransformNode { id: NodeId(156), target: TransformTarget::Callable(DeclarationId(1626)), inputs: vec![PortId(216)], output: PortId(217), span: SourceSpan::new("src/v3/std/algebra.dag", 19357, 19416) }), Behavior::Branch(BranchNode { id: NodeId(157), input: PortId(210), paths: vec![Path { body: NodeId(151), output: PortId(211), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19311, 19316) }, binding: None }, Path { body: NodeId(156), output: PortId(217), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19341, 19353) }, binding: Some(PayloadBinding { binding_name: "second".to_string(), payload_port: PortId(212) }) }], output: PortId(218), span: SourceSpan::new("src/v3/std/algebra.dag", 19282, 19424), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Branch(BranchNode { id: NodeId(158), input: PortId(206), paths: vec![Path { body: NodeId(149), output: PortId(208), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19230, 19235) }, binding: None }, Path { body: NodeId(157), output: PortId(218), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19259, 19272) }, binding: Some(PayloadBinding { binding_name: "payload".to_string(), payload_port: PortId(209) }) }], output: PortId(219), span: SourceSpan::new("src/v3/std/algebra.dag", 19212, 19428), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(159), name: "wrap_sum".to_string(), value: PortId(219), params: vec![PortId(206)], span: SourceSpan::new("src/v3/std/algebra.dag", 19212, 19428), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Value(ValueNode { id: NodeId(160), data: LiteralBits::Int(0), output: PortId(221), span: SourceSpan::new("src/v3/std/algebra.dag", 19718, 19719), lane2_workflow: None }), Behavior::Transform(TransformNode { id: NodeId(161), target: TransformTarget::Callable(DeclarationId(1620)), inputs: vec![PortId(221)], output: PortId(222), span: SourceSpan::new("src/v3/std/algebra.dag", 19705, 19720) }), Behavior::Transform(TransformNode { id: NodeId(162), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(223)], output: PortId(224), span: SourceSpan::new("src/v3/std/algebra.dag", 19762, 19766) }), Behavior::Transform(TransformNode { id: NodeId(163), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(223)], output: PortId(225), span: SourceSpan::new("src/v3/std/algebra.dag", 19794, 19798) }), Behavior::Transform(TransformNode { id: NodeId(164), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(226)], output: PortId(227), span: SourceSpan::new("src/v3/std/algebra.dag", 19846, 19850) }), Behavior::Transform(TransformNode { id: NodeId(165), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(223)], output: PortId(228), span: SourceSpan::new("src/v3/std/algebra.dag", 19905, 19909) }), Behavior::Transform(TransformNode { id: NodeId(166), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(226)], output: PortId(229), span: SourceSpan::new("src/v3/std/algebra.dag", 19918, 19922) }), Behavior::Transform(TransformNode { id: NodeId(167), target: TransformTarget::Callable(DeclarationId(770)), inputs: vec![PortId(228), PortId(229)], output: PortId(230), span: SourceSpan::new("src/v3/std/algebra.dag", 19874, 19923) }), Behavior::Transform(TransformNode { id: NodeId(168), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(223)], output: PortId(232), span: SourceSpan::new("src/v3/std/algebra.dag", 19978, 19982) }), Behavior::Transform(TransformNode { id: NodeId(169), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(226)], output: PortId(233), span: SourceSpan::new("src/v3/std/algebra.dag", 19991, 19995) }), Behavior::Transform(TransformNode { id: NodeId(170), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(226)], output: PortId(234), span: SourceSpan::new("src/v3/std/algebra.dag", 20004, 20008) }), Behavior::Transform(TransformNode { id: NodeId(171), target: TransformTarget::Callable(DeclarationId(753)), inputs: vec![PortId(232), PortId(233), PortId(234)], output: PortId(235), span: SourceSpan::new("src/v3/std/algebra.dag", 19959, 20009) }), Behavior::Transform(TransformNode { id: NodeId(172), target: TransformTarget::Callable(DeclarationId(1624)), inputs: vec![PortId(235)], output: PortId(236), span: SourceSpan::new("src/v3/std/algebra.dag", 19947, 20010) }), Behavior::Branch(BranchNode { id: NodeId(173), input: PortId(227), paths: vec![Path { body: NodeId(167), output: PortId(230), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19865, 19870) }, binding: None }, Path { body: NodeId(172), output: PortId(236), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19936, 19943) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(231) }) }], output: PortId(237), span: SourceSpan::new("src/v3/std/algebra.dag", 19833, 20022), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Branch(BranchNode { id: NodeId(174), input: PortId(224), paths: vec![Path { body: NodeId(163), output: PortId(225), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19777, 19782) }, binding: None }, Path { body: NodeId(173), output: PortId(237), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19807, 19819) }, binding: Some(PayloadBinding { binding_name: "second".to_string(), payload_port: PortId(226) }) }], output: PortId(238), span: SourceSpan::new("src/v3/std/algebra.dag", 19748, 20030), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Branch(BranchNode { id: NodeId(175), input: PortId(220), paths: vec![Path { body: NodeId(161), output: PortId(222), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19696, 19701) }, binding: None }, Path { body: NodeId(174), output: PortId(238), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19725, 19738) }, binding: Some(PayloadBinding { binding_name: "payload".to_string(), payload_port: PortId(223) }) }], output: PortId(239), span: SourceSpan::new("src/v3/std/algebra.dag", 19678, 20034), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(176), name: "reduce_product".to_string(), value: PortId(239), params: vec![PortId(220)], span: SourceSpan::new("src/v3/std/algebra.dag", 19678, 20034), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(177), target: TransformTarget::Callable(DeclarationId(771)), inputs: vec![PortId(242), PortId(240), PortId(241)], output: PortId(243), span: SourceSpan::new("src/v3/std/algebra.dag", 20311, 20340) }), Behavior::Transform(TransformNode { id: NodeId(178), target: TransformTarget::Callable(DeclarationId(774)), inputs: vec![PortId(240), PortId(241)], output: PortId(245), span: SourceSpan::new("src/v3/std/algebra.dag", 20364, 20382) }), Behavior::Transform(TransformNode { id: NodeId(179), target: TransformTarget::Callable(DeclarationId(774)), inputs: vec![PortId(240), PortId(241)], output: PortId(247), span: SourceSpan::new("src/v3/std/algebra.dag", 20408, 20426) }), Behavior::Transform(TransformNode { id: NodeId(180), target: TransformTarget::Callable(DeclarationId(774)), inputs: vec![PortId(240), PortId(241)], output: PortId(249), span: SourceSpan::new("src/v3/std/algebra.dag", 20445, 20463) }), Behavior::Transform(TransformNode { id: NodeId(181), target: TransformTarget::Callable(DeclarationId(774)), inputs: vec![PortId(240), PortId(241)], output: PortId(251), span: SourceSpan::new("src/v3/std/algebra.dag", 20482, 20500) }), Behavior::Transform(TransformNode { id: NodeId(182), target: TransformTarget::Callable(DeclarationId(774)), inputs: vec![PortId(240), PortId(241)], output: PortId(253), span: SourceSpan::new("src/v3/std/algebra.dag", 20523, 20541) }), Behavior::Transform(TransformNode { id: NodeId(183), target: TransformTarget::Callable(DeclarationId(774)), inputs: vec![PortId(240), PortId(241)], output: PortId(255), span: SourceSpan::new("src/v3/std/algebra.dag", 20564, 20582) }), Behavior::Branch(BranchNode { id: NodeId(184), input: PortId(240), paths: vec![Path { body: NodeId(177), output: PortId(243), pattern: BranchPattern::UnresolvedVariant { name: "LinearCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20293, 20307) }, binding: Some(PayloadBinding { binding_name: "va".to_string(), payload_port: PortId(242) }) }, Path { body: NodeId(178), output: PortId(245), pattern: BranchPattern::UnresolvedVariant { name: "ConstantCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20345, 20360) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(244) }) }, Path { body: NodeId(179), output: PortId(247), pattern: BranchPattern::UnresolvedVariant { name: "PolynomialCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20387, 20404) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(246) }) }, Path { body: NodeId(180), output: PortId(249), pattern: BranchPattern::UnresolvedVariant { name: "LogCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20431, 20441) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(248) }) }, Path { body: NodeId(181), output: PortId(251), pattern: BranchPattern::UnresolvedVariant { name: "SumCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20468, 20478) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(250) }) }, Path { body: NodeId(182), output: PortId(253), pattern: BranchPattern::UnresolvedVariant { name: "ProductCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20505, 20519) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(252) }) }, Path { body: NodeId(183), output: PortId(255), pattern: BranchPattern::UnresolvedVariant { name: "UnknownCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20546, 20560) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(254) }) }], output: PortId(256), span: SourceSpan::new("src/v3/std/algebra.dag", 20279, 20586), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(185), name: "combine_binary_product".to_string(), value: PortId(256), params: vec![PortId(240), PortId(241)], span: SourceSpan::new("src/v3/std/algebra.dag", 20279, 20586), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(186), target: TransformTarget::Callable(DeclarationId(772)), inputs: vec![PortId(257), PortId(260), PortId(258), PortId(259)], output: PortId(261), span: SourceSpan::new("src/v3/std/algebra.dag", 20715, 20751) }), Behavior::Transform(TransformNode { id: NodeId(187), target: TransformTarget::Callable(DeclarationId(774)), inputs: vec![PortId(258), PortId(259)], output: PortId(263), span: SourceSpan::new("src/v3/std/algebra.dag", 20775, 20793) }), Behavior::Transform(TransformNode { id: NodeId(188), target: TransformTarget::Callable(DeclarationId(774)), inputs: vec![PortId(258), PortId(259)], output: PortId(265), span: SourceSpan::new("src/v3/std/algebra.dag", 20819, 20837) }), Behavior::Transform(TransformNode { id: NodeId(189), target: TransformTarget::Callable(DeclarationId(774)), inputs: vec![PortId(258), PortId(259)], output: PortId(267), span: SourceSpan::new("src/v3/std/algebra.dag", 20856, 20874) }), Behavior::Transform(TransformNode { id: NodeId(190), target: TransformTarget::Callable(DeclarationId(774)), inputs: vec![PortId(258), PortId(259)], output: PortId(269), span: SourceSpan::new("src/v3/std/algebra.dag", 20893, 20911) }), Behavior::Transform(TransformNode { id: NodeId(191), target: TransformTarget::Callable(DeclarationId(774)), inputs: vec![PortId(258), PortId(259)], output: PortId(271), span: SourceSpan::new("src/v3/std/algebra.dag", 20934, 20952) }), Behavior::Transform(TransformNode { id: NodeId(192), target: TransformTarget::Callable(DeclarationId(774)), inputs: vec![PortId(258), PortId(259)], output: PortId(273), span: SourceSpan::new("src/v3/std/algebra.dag", 20975, 20993) }), Behavior::Branch(BranchNode { id: NodeId(193), input: PortId(259), paths: vec![Path { body: NodeId(186), output: PortId(261), pattern: BranchPattern::UnresolvedVariant { name: "LinearCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20697, 20711) }, binding: Some(PayloadBinding { binding_name: "vb".to_string(), payload_port: PortId(260) }) }, Path { body: NodeId(187), output: PortId(263), pattern: BranchPattern::UnresolvedVariant { name: "ConstantCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20756, 20771) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(262) }) }, Path { body: NodeId(188), output: PortId(265), pattern: BranchPattern::UnresolvedVariant { name: "PolynomialCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20798, 20815) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(264) }) }, Path { body: NodeId(189), output: PortId(267), pattern: BranchPattern::UnresolvedVariant { name: "LogCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20842, 20852) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(266) }) }, Path { body: NodeId(190), output: PortId(269), pattern: BranchPattern::UnresolvedVariant { name: "SumCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20879, 20889) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(268) }) }, Path { body: NodeId(191), output: PortId(271), pattern: BranchPattern::UnresolvedVariant { name: "ProductCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20916, 20930) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(270) }) }, Path { body: NodeId(192), output: PortId(273), pattern: BranchPattern::UnresolvedVariant { name: "UnknownCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20957, 20971) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(272) }) }], output: PortId(274), span: SourceSpan::new("src/v3/std/algebra.dag", 20683, 20997), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(194), name: "combine_linear_with".to_string(), value: PortId(274), params: vec![PortId(257), PortId(258), PortId(259)], span: SourceSpan::new("src/v3/std/algebra.dag", 20683, 20997), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(195), target: TransformTarget::Callable(DeclarationId(762)), inputs: vec![PortId(275), PortId(276)], output: PortId(279), span: SourceSpan::new("src/v3/std/algebra.dag", 21128, 21154) }), Behavior::Transform(TransformNode { id: NodeId(196), target: TransformTarget::Callable(DeclarationId(773)), inputs: vec![PortId(275)], output: PortId(280), span: SourceSpan::new("src/v3/std/algebra.dag", 21164, 21185) }), Behavior::Transform(TransformNode { id: NodeId(197), target: TransformTarget::Callable(DeclarationId(774)), inputs: vec![PortId(277), PortId(278)], output: PortId(281), span: SourceSpan::new("src/v3/std/algebra.dag", 21197, 21215) }), Behavior::Branch(BranchNode { id: NodeId(198), input: PortId(279), paths: vec![Path { body: NodeId(196), output: PortId(280), pattern: BranchPattern::UnresolvedVariant { name: "True".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 21164, 21185) }, binding: None }, Path { body: NodeId(197), output: PortId(281), pattern: BranchPattern::UnresolvedVariant { name: "False".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 21197, 21215) }, binding: None }], output: PortId(282), span: SourceSpan::new("src/v3/std/algebra.dag", 21125, 21215), emit_participation: None }), Behavior::Bind(BindNode { id: NodeId(199), name: "collapse_linear_square".to_string(), value: PortId(282), params: vec![PortId(275), PortId(276), PortId(277), PortId(278)], span: SourceSpan::new("src/v3/std/algebra.dag", 21125, 21215), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(200), target: TransformTarget::Callable(DeclarationId(752)), inputs: vec![PortId(283), PortId(284)], output: PortId(285), span: SourceSpan::new("src/v3/std/algebra.dag", 21405, 21420) }), Behavior::Transform(TransformNode { id: NodeId(201), target: TransformTarget::Callable(DeclarationId(1624)), inputs: vec![PortId(285)], output: PortId(286), span: SourceSpan::new("src/v3/std/algebra.dag", 21393, 21421) }), Behavior::Bind(BindNode { id: NodeId(202), name: "product_pair".to_string(), value: PortId(286), params: vec![PortId(283), PortId(284)], span: SourceSpan::new("src/v3/std/algebra.dag", 21393, 21421), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(203), target: TransformTarget::FieldProject { field_label: "any".to_string(), field_child: Some(DeclarationId(88)) }, inputs: vec![PortId(287)], output: PortId(289), span: SourceSpan::new("src/v3/std/algebra.dag", 21521, 21524) }), Behavior::Transform(TransformNode { id: NodeId(204), target: TransformTarget::FieldProject { field_label: "pivot".to_string(), field_child: Some(DeclarationId(747)) }, inputs: vec![PortId(287)], output: PortId(290), span: SourceSpan::new("src/v3/std/algebra.dag", 21545, 21550) }), Behavior::Transform(TransformNode { id: NodeId(205), target: TransformTarget::Callable(DeclarationId(761)), inputs: vec![PortId(288), PortId(290)], output: PortId(291), span: SourceSpan::new("src/v3/std/algebra.dag", 21528, 21551) }), Behavior::Transform(TransformNode { id: NodeId(206), target: TransformTarget::Operator(OperatorKind::Logical(LogicalOp::Or)), inputs: vec![PortId(289), PortId(291)], output: PortId(292), span: SourceSpan::new("src/v3/std/algebra.dag", 21517, 21551) }), Behavior::Transform(TransformNode { id: NodeId(207), target: TransformTarget::FieldProject { field_label: "pivot".to_string(), field_child: Some(DeclarationId(747)) }, inputs: vec![PortId(287)], output: PortId(293), span: SourceSpan::new("src/v3/std/algebra.dag", 21565, 21570) }), Behavior::Transform(TransformNode { id: NodeId(208), target: TransformTarget::Callable(DeclarationId(748)), inputs: vec![PortId(292), PortId(293)], output: PortId(294), span: SourceSpan::new("src/v3/std/algebra.dag", 21508, 21572) }), Behavior::Bind(BindNode { id: NodeId(209), name: "fold_or_dominate_scan".to_string(), value: PortId(294), params: vec![PortId(287), PortId(288)], span: SourceSpan::new("src/v3/std/algebra.dag", 21508, 21572), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(210), target: TransformTarget::FieldProject { field_label: "any".to_string(), field_child: Some(DeclarationId(88)) }, inputs: vec![PortId(295)], output: PortId(296), span: SourceSpan::new("src/v3/std/algebra.dag", 21626, 21629) }), Behavior::Bind(BindNode { id: NodeId(211), name: "scan_hit".to_string(), value: PortId(296), params: vec![PortId(295)], span: SourceSpan::new("src/v3/std/algebra.dag", 21621, 21629), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(212), target: TransformTarget::Callable(DeclarationId(1644)), inputs: vec![], output: PortId(299), span: SourceSpan::new("src/v3/std/algebra.dag", 21776, 21783) }), Behavior::Transform(TransformNode { id: NodeId(213), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(300)], output: PortId(301), span: SourceSpan::new("src/v3/std/algebra.dag", 21840, 21844) }), Behavior::Transform(TransformNode { id: NodeId(214), target: TransformTarget::Callable(DeclarationId(761)), inputs: vec![PortId(298), PortId(301)], output: PortId(302), span: SourceSpan::new("src/v3/std/algebra.dag", 21814, 21845) }), Behavior::Transform(TransformNode { id: NodeId(215), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(300)], output: PortId(303), span: SourceSpan::new("src/v3/std/algebra.dag", 21891, 21895) }), Behavior::Transform(TransformNode { id: NodeId(216), target: TransformTarget::Callable(DeclarationId(777)), inputs: vec![PortId(303), PortId(298)], output: PortId(304), span: SourceSpan::new("src/v3/std/algebra.dag", 21859, 21904) }), Behavior::Transform(TransformNode { id: NodeId(217), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(300)], output: PortId(305), span: SourceSpan::new("src/v3/std/algebra.dag", 21937, 21941) }), Behavior::Transform(TransformNode { id: NodeId(218), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(300)], output: PortId(306), span: SourceSpan::new("src/v3/std/algebra.dag", 21975, 21979) }), Behavior::Transform(TransformNode { id: NodeId(219), target: TransformTarget::Callable(DeclarationId(777)), inputs: vec![PortId(306), PortId(298)], output: PortId(307), span: SourceSpan::new("src/v3/std/algebra.dag", 21943, 21988) }), Behavior::Transform(TransformNode { id: NodeId(220), target: TransformTarget::Callable(DeclarationId(1645)), inputs: vec![PortId(305), PortId(307)], output: PortId(308), span: SourceSpan::new("src/v3/std/algebra.dag", 21924, 21989) }), Behavior::Branch(BranchNode { id: NodeId(221), input: PortId(302), paths: vec![Path { body: NodeId(216), output: PortId(304), pattern: BranchPattern::UnresolvedVariant { name: "True".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 21859, 21904) }, binding: None }, Path { body: NodeId(220), output: PortId(308), pattern: BranchPattern::UnresolvedVariant { name: "False".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 21924, 21989) }, binding: None }], output: PortId(309), span: SourceSpan::new("src/v3/std/algebra.dag", 21811, 21989), emit_participation: None }), Behavior::Branch(BranchNode { id: NodeId(222), input: PortId(297), paths: vec![Path { body: NodeId(212), output: PortId(299), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 21767, 21772) }, binding: None }, Path { body: NodeId(221), output: PortId(309), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 21788, 21801) }, binding: Some(PayloadBinding { binding_name: "payload".to_string(), payload_port: PortId(300) }) }], output: PortId(310), span: SourceSpan::new("src/v3/std/algebra.dag", 21744, 21993), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Loop(LoopNode { id: NodeId(223), source: PortId(297), init: PortId(297), body: NodeId(222), bound: LoopBound::Cardinality { count: PortId(297) }, output: PortId(311), span: SourceSpan::new("src/v3/std/algebra.dag", 21744, 21993) }), Behavior::Bind(BindNode { id: NodeId(224), name: "filter_not_dominated_by".to_string(), value: PortId(311), params: vec![PortId(297), PortId(298)], span: SourceSpan::new("src/v3/std/algebra.dag", 21744, 21993), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(225), target: TransformTarget::Callable(DeclarationId(749)), inputs: vec![PortId(313)], output: PortId(314), span: SourceSpan::new("src/v3/std/algebra.dag", 22117, 22141) }), Behavior::Transform(TransformNode { id: NodeId(226), target: TransformTarget::Callable(DeclarationId(1647)), inputs: vec![PortId(312), PortId(314)], output: PortId(315), span: SourceSpan::new("src/v3/std/algebra.dag", 22107, 22165) }), Behavior::Transform(TransformNode { id: NodeId(227), target: TransformTarget::Callable(DeclarationId(776)), inputs: vec![PortId(315)], output: PortId(316), span: SourceSpan::new("src/v3/std/algebra.dag", 22098, 22166) }), Behavior::Transform(TransformNode { id: NodeId(228), target: TransformTarget::Callable(DeclarationId(777)), inputs: vec![PortId(312), PortId(313)], output: PortId(317), span: SourceSpan::new("src/v3/std/algebra.dag", 22202, 22236) }), Behavior::Transform(TransformNode { id: NodeId(229), target: TransformTarget::Callable(DeclarationId(1648)), inputs: vec![PortId(313), PortId(317)], output: PortId(318), span: SourceSpan::new("src/v3/std/algebra.dag", 22191, 22237) }), Behavior::Branch(BranchNode { id: NodeId(230), input: PortId(316), paths: vec![Path { body: NodeId(230), output: PortId(312), pattern: BranchPattern::UnresolvedVariant { name: "True".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 22176, 22179) }, binding: None }, Path { body: NodeId(229), output: PortId(318), pattern: BranchPattern::UnresolvedVariant { name: "False".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 22191, 22237) }, binding: None }], output: PortId(319), span: SourceSpan::new("src/v3/std/algebra.dag", 22095, 22237), emit_participation: None }), Behavior::Bind(BindNode { id: NodeId(231), name: "drop_dominated_step".to_string(), value: PortId(319), params: vec![PortId(312), PortId(313)], span: SourceSpan::new("src/v3/std/algebra.dag", 22095, 22237), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(232), target: TransformTarget::Callable(DeclarationId(1649)), inputs: vec![], output: PortId(321), span: SourceSpan::new("src/v3/std/algebra.dag", 22508, 22515) }), Behavior::Transform(TransformNode { id: NodeId(233), target: TransformTarget::Callable(DeclarationId(1651)), inputs: vec![PortId(320), PortId(321)], output: PortId(322), span: SourceSpan::new("src/v3/std/algebra.dag", 22496, 22537) }), Behavior::Bind(BindNode { id: NodeId(234), name: "drop_dominated".to_string(), value: PortId(322), params: vec![PortId(320)], span: SourceSpan::new("src/v3/std/algebra.dag", 22496, 22537), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(235), target: TransformTarget::FieldProject { field_label: "nodes".to_string(), field_child: Some(DeclarationId(1586)) }, inputs: vec![PortId(323)], output: PortId(324), span: SourceSpan::new("src/v3/std/workflows.dag", 1013, 1018) }), Behavior::Bind(BindNode { id: NodeId(236), name: "behavior_spine".to_string(), value: PortId(324), params: vec![PortId(323)], span: SourceSpan::new("src/v3/std/workflows.dag", 1011, 1018), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Value(ValueNode { id: NodeId(237), data: LiteralBits::String("+".to_string()), output: PortId(327), span: SourceSpan::new("src/v3/compiler/operators.dag", 886, 889), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(238), data: LiteralBits::String("-".to_string()), output: PortId(328), span: SourceSpan::new("src/v3/compiler/operators.dag", 905, 908), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(239), data: LiteralBits::String("*".to_string()), output: PortId(329), span: SourceSpan::new("src/v3/compiler/operators.dag", 924, 927), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(240), data: LiteralBits::String("/".to_string()), output: PortId(330), span: SourceSpan::new("src/v3/compiler/operators.dag", 943, 946), lane2_workflow: None }), Behavior::Branch(BranchNode { id: NodeId(241), input: PortId(326), paths: vec![Path { body: NodeId(237), output: PortId(327), pattern: BranchPattern::UnresolvedVariant { name: "Add".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 879, 882) }, binding: None }, Path { body: NodeId(238), output: PortId(328), pattern: BranchPattern::UnresolvedVariant { name: "Sub".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 898, 901) }, binding: None }, Path { body: NodeId(239), output: PortId(329), pattern: BranchPattern::UnresolvedVariant { name: "Mul".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 917, 920) }, binding: None }, Path { body: NodeId(240), output: PortId(330), pattern: BranchPattern::UnresolvedVariant { name: "Div".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 936, 939) }, binding: None }], output: PortId(331), span: SourceSpan::new("src/v3/compiler/operators.dag", 857, 954), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Value(ValueNode { id: NodeId(242), data: LiteralBits::String("==".to_string()), output: PortId(333), span: SourceSpan::new("src/v3/compiler/operators.dag", 1012, 1016), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(243), data: LiteralBits::String("!=".to_string()), output: PortId(334), span: SourceSpan::new("src/v3/compiler/operators.dag", 1031, 1035), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(244), data: LiteralBits::String("<".to_string()), output: PortId(335), span: SourceSpan::new("src/v3/compiler/operators.dag", 1050, 1053), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(245), data: LiteralBits::String("<=".to_string()), output: PortId(336), span: SourceSpan::new("src/v3/compiler/operators.dag", 1068, 1072), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(246), data: LiteralBits::String(">".to_string()), output: PortId(337), span: SourceSpan::new("src/v3/compiler/operators.dag", 1087, 1090), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(247), data: LiteralBits::String(">=".to_string()), output: PortId(338), span: SourceSpan::new("src/v3/compiler/operators.dag", 1105, 1109), lane2_workflow: None }), Behavior::Branch(BranchNode { id: NodeId(248), input: PortId(332), paths: vec![Path { body: NodeId(242), output: PortId(333), pattern: BranchPattern::UnresolvedVariant { name: "Eq".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1006, 1008) }, binding: None }, Path { body: NodeId(243), output: PortId(334), pattern: BranchPattern::UnresolvedVariant { name: "Ne".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1025, 1027) }, binding: None }, Path { body: NodeId(244), output: PortId(335), pattern: BranchPattern::UnresolvedVariant { name: "Lt".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1044, 1046) }, binding: None }, Path { body: NodeId(245), output: PortId(336), pattern: BranchPattern::UnresolvedVariant { name: "Le".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1062, 1064) }, binding: None }, Path { body: NodeId(246), output: PortId(337), pattern: BranchPattern::UnresolvedVariant { name: "Gt".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1081, 1083) }, binding: None }, Path { body: NodeId(247), output: PortId(338), pattern: BranchPattern::UnresolvedVariant { name: "Ge".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1099, 1101) }, binding: None }], output: PortId(339), span: SourceSpan::new("src/v3/compiler/operators.dag", 985, 1117), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Value(ValueNode { id: NodeId(249), data: LiteralBits::String("&&".to_string()), output: PortId(341), span: SourceSpan::new("src/v3/compiler/operators.dag", 1179, 1183), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(250), data: LiteralBits::String("||".to_string()), output: PortId(342), span: SourceSpan::new("src/v3/compiler/operators.dag", 1198, 1202), lane2_workflow: None }), Behavior::Branch(BranchNode { id: NodeId(251), input: PortId(340), paths: vec![Path { body: NodeId(249), output: PortId(341), pattern: BranchPattern::UnresolvedVariant { name: "And".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1172, 1175) }, binding: None }, Path { body: NodeId(250), output: PortId(342), pattern: BranchPattern::UnresolvedVariant { name: "Or".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1192, 1194) }, binding: None }], output: PortId(343), span: SourceSpan::new("src/v3/compiler/operators.dag", 1148, 1210), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Branch(BranchNode { id: NodeId(252), input: PortId(325), paths: vec![Path { body: NodeId(241), output: PortId(331), pattern: BranchPattern::UnresolvedVariant { name: "Arithmetic".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 830, 847) }, binding: Some(PayloadBinding { binding_name: "arith".to_string(), payload_port: PortId(326) }) }, Path { body: NodeId(248), output: PortId(339), pattern: BranchPattern::UnresolvedVariant { name: "Comparison".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 959, 975) }, binding: Some(PayloadBinding { binding_name: "comp".to_string(), payload_port: PortId(332) }) }, Path { body: NodeId(251), output: PortId(343), pattern: BranchPattern::UnresolvedVariant { name: "Logical".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1122, 1138) }, binding: Some(PayloadBinding { binding_name: "logical".to_string(), payload_port: PortId(340) }) }], output: PortId(344), span: SourceSpan::new("src/v3/compiler/operators.dag", 815, 1214), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(253), name: "symbol".to_string(), value: PortId(344), params: vec![PortId(325)], span: SourceSpan::new("src/v3/compiler/operators.dag", 815, 1214), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Value(ValueNode { id: NodeId(254), data: LiteralBits::String("add".to_string()), output: PortId(347), span: SourceSpan::new("src/v3/compiler/operators.dag", 1341, 1346), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(255), data: LiteralBits::String("sub".to_string()), output: PortId(348), span: SourceSpan::new("src/v3/compiler/operators.dag", 1362, 1367), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(256), data: LiteralBits::String("mul".to_string()), output: PortId(349), span: SourceSpan::new("src/v3/compiler/operators.dag", 1383, 1388), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(257), data: LiteralBits::String("div".to_string()), output: PortId(350), span: SourceSpan::new("src/v3/compiler/operators.dag", 1404, 1409), lane2_workflow: None }), Behavior::Branch(BranchNode { id: NodeId(258), input: PortId(346), paths: vec![Path { body: NodeId(254), output: PortId(347), pattern: BranchPattern::UnresolvedVariant { name: "Add".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1334, 1337) }, binding: None }, Path { body: NodeId(255), output: PortId(348), pattern: BranchPattern::UnresolvedVariant { name: "Sub".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1355, 1358) }, binding: None }, Path { body: NodeId(256), output: PortId(349), pattern: BranchPattern::UnresolvedVariant { name: "Mul".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1376, 1379) }, binding: None }, Path { body: NodeId(257), output: PortId(350), pattern: BranchPattern::UnresolvedVariant { name: "Div".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1397, 1400) }, binding: None }], output: PortId(351), span: SourceSpan::new("src/v3/compiler/operators.dag", 1312, 1417), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Value(ValueNode { id: NodeId(259), data: LiteralBits::String("eq".to_string()), output: PortId(353), span: SourceSpan::new("src/v3/compiler/operators.dag", 1475, 1479), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(260), data: LiteralBits::String("ne".to_string()), output: PortId(354), span: SourceSpan::new("src/v3/compiler/operators.dag", 1494, 1498), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(261), data: LiteralBits::String("lt".to_string()), output: PortId(355), span: SourceSpan::new("src/v3/compiler/operators.dag", 1513, 1517), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(262), data: LiteralBits::String("le".to_string()), output: PortId(356), span: SourceSpan::new("src/v3/compiler/operators.dag", 1532, 1536), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(263), data: LiteralBits::String("gt".to_string()), output: PortId(357), span: SourceSpan::new("src/v3/compiler/operators.dag", 1551, 1555), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(264), data: LiteralBits::String("ge".to_string()), output: PortId(358), span: SourceSpan::new("src/v3/compiler/operators.dag", 1570, 1574), lane2_workflow: None }), Behavior::Branch(BranchNode { id: NodeId(265), input: PortId(352), paths: vec![Path { body: NodeId(259), output: PortId(353), pattern: BranchPattern::UnresolvedVariant { name: "Eq".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1469, 1471) }, binding: None }, Path { body: NodeId(260), output: PortId(354), pattern: BranchPattern::UnresolvedVariant { name: "Ne".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1488, 1490) }, binding: None }, Path { body: NodeId(261), output: PortId(355), pattern: BranchPattern::UnresolvedVariant { name: "Lt".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1507, 1509) }, binding: None }, Path { body: NodeId(262), output: PortId(356), pattern: BranchPattern::UnresolvedVariant { name: "Le".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1526, 1528) }, binding: None }, Path { body: NodeId(263), output: PortId(357), pattern: BranchPattern::UnresolvedVariant { name: "Gt".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1545, 1547) }, binding: None }, Path { body: NodeId(264), output: PortId(358), pattern: BranchPattern::UnresolvedVariant { name: "Ge".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1564, 1566) }, binding: None }], output: PortId(359), span: SourceSpan::new("src/v3/compiler/operators.dag", 1448, 1582), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Value(ValueNode { id: NodeId(266), data: LiteralBits::String("meet".to_string()), output: PortId(361), span: SourceSpan::new("src/v3/compiler/operators.dag", 1978, 1984), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(267), data: LiteralBits::String("join".to_string()), output: PortId(362), span: SourceSpan::new("src/v3/compiler/operators.dag", 1999, 2005), lane2_workflow: None }), Behavior::Branch(BranchNode { id: NodeId(268), input: PortId(360), paths: vec![Path { body: NodeId(266), output: PortId(361), pattern: BranchPattern::UnresolvedVariant { name: "And".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1971, 1974) }, binding: None }, Path { body: NodeId(267), output: PortId(362), pattern: BranchPattern::UnresolvedVariant { name: "Or".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1993, 1995) }, binding: None }], output: PortId(363), span: SourceSpan::new("src/v3/compiler/operators.dag", 1947, 2013), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Branch(BranchNode { id: NodeId(269), input: PortId(345), paths: vec![Path { body: NodeId(258), output: PortId(351), pattern: BranchPattern::UnresolvedVariant { name: "Arithmetic".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1285, 1302) }, binding: Some(PayloadBinding { binding_name: "arith".to_string(), payload_port: PortId(346) }) }, Path { body: NodeId(265), output: PortId(359), pattern: BranchPattern::UnresolvedVariant { name: "Comparison".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1422, 1438) }, binding: Some(PayloadBinding { binding_name: "comp".to_string(), payload_port: PortId(352) }) }, Path { body: NodeId(268), output: PortId(363), pattern: BranchPattern::UnresolvedVariant { name: "Logical".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1921, 1937) }, binding: Some(PayloadBinding { binding_name: "logical".to_string(), payload_port: PortId(360) }) }], output: PortId(364), span: SourceSpan::new("src/v3/compiler/operators.dag", 1270, 2017), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(270), name: "algebra_field_name".to_string(), value: PortId(364), params: vec![PortId(345)], span: SourceSpan::new("src/v3/compiler/operators.dag", 1270, 2017), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) })], + nodes: vec![Behavior::Transform(TransformNode { id: NodeId(0), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(1), span: SourceSpan::new("src/v3/std/algebra.dag", 9207, 9212) }), Behavior::Transform(TransformNode { id: NodeId(1), target: TransformTarget::Callable(DeclarationId(743)), inputs: vec![PortId(1), PortId(0)], output: PortId(2), span: SourceSpan::new("src/v3/std/algebra.dag", 9198, 9229) }), Behavior::Bind(BindNode { id: NodeId(2), name: "dominate_scan_init".to_string(), value: PortId(2), params: vec![PortId(0)], span: SourceSpan::new("src/v3/std/algebra.dag", 9198, 9229), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(3), target: TransformTarget::Callable(DeclarationId(1624)), inputs: vec![PortId(3)], output: PortId(5), span: SourceSpan::new("src/v3/std/algebra.dag", 10402, 10414) }), Behavior::Transform(TransformNode { id: NodeId(4), target: TransformTarget::Callable(DeclarationId(1626)), inputs: vec![PortId(5)], output: PortId(6), span: SourceSpan::new("src/v3/std/algebra.dag", 10395, 10442) }), Behavior::Transform(TransformNode { id: NodeId(5), target: TransformTarget::Callable(DeclarationId(1586)), inputs: vec![PortId(3), PortId(4), PortId(6)], output: PortId(7), span: SourceSpan::new("src/v3/std/algebra.dag", 10056, 10446) }), Behavior::Bind(BindNode { id: NodeId(6), name: "two_terms".to_string(), value: PortId(7), params: vec![PortId(3), PortId(4)], span: SourceSpan::new("src/v3/std/algebra.dag", 10056, 10446), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(7), target: TransformTarget::Callable(DeclarationId(1588)), inputs: vec![PortId(8), PortId(9), PortId(10)], output: PortId(11), span: SourceSpan::new("src/v3/std/algebra.dag", 10577, 10633) }), Behavior::Bind(BindNode { id: NodeId(8), name: "many_terms".to_string(), value: PortId(11), params: vec![PortId(8), PortId(9), PortId(10)], span: SourceSpan::new("src/v3/std/algebra.dag", 10577, 10633), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(9), target: TransformTarget::Callable(DeclarationId(1627)), inputs: vec![PortId(12)], output: PortId(13), span: SourceSpan::new("src/v3/std/algebra.dag", 10702, 10717) }), Behavior::Transform(TransformNode { id: NodeId(10), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(14), span: SourceSpan::new("src/v3/std/algebra.dag", 10733, 10738) }), Behavior::Transform(TransformNode { id: NodeId(11), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(16), span: SourceSpan::new("src/v3/std/algebra.dag", 10754, 10759) }), Behavior::Branch(BranchNode { id: NodeId(12), input: PortId(13), paths: vec![Path { body: NodeId(10), output: PortId(14), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 10724, 10729) }, binding: None }, Path { body: NodeId(11), output: PortId(16), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 10743, 10750) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(15) }) }], output: PortId(17), span: SourceSpan::new("src/v3/std/algebra.dag", 10696, 10763), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(13), name: "reject_all_symbolic_costs".to_string(), value: PortId(17), params: vec![PortId(12)], span: SourceSpan::new("src/v3/std/algebra.dag", 10696, 10763), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Value(ValueNode { id: NodeId(14), data: LiteralBits::Int(2), output: PortId(19), span: SourceSpan::new("src/v3/std/algebra.dag", 10848, 10849), lane2_workflow: None }), Behavior::Transform(TransformNode { id: NodeId(15), target: TransformTarget::FieldProject { field_label: "previous".to_string(), field_child: None }, inputs: vec![PortId(20)], output: PortId(21), span: SourceSpan::new("src/v3/std/algebra.dag", 10901, 10909) }), Behavior::Transform(TransformNode { id: NodeId(16), target: TransformTarget::Callable(DeclarationId(750)), inputs: vec![PortId(21)], output: PortId(22), span: SourceSpan::new("src/v3/std/algebra.dag", 10882, 10910) }), Behavior::Value(ValueNode { id: NodeId(17), data: LiteralBits::Int(1), output: PortId(23), span: SourceSpan::new("src/v3/std/algebra.dag", 10913, 10914), lane2_workflow: None }), Behavior::Transform(TransformNode { id: NodeId(18), target: TransformTarget::Operator(OperatorKind::Arithmetic(ArithmeticOp::Add)), inputs: vec![PortId(22), PortId(23)], output: PortId(24), span: SourceSpan::new("src/v3/std/algebra.dag", 10882, 10914) }), Behavior::Branch(BranchNode { id: NodeId(19), input: PortId(18), paths: vec![Path { body: NodeId(14), output: PortId(19), pattern: BranchPattern::UnresolvedVariant { name: "DegreeTwo".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 10835, 10844) }, binding: None }, Path { body: NodeId(18), output: PortId(24), pattern: BranchPattern::UnresolvedVariant { name: "DegreeSuccessor".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 10854, 10878) }, binding: Some(PayloadBinding { binding_name: "payload".to_string(), payload_port: PortId(20) }) }], output: PortId(25), span: SourceSpan::new("src/v3/std/algebra.dag", 10816, 10918), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Loop(LoopNode { id: NodeId(20), source: PortId(18), init: PortId(18), body: NodeId(19), bound: LoopBound::Cardinality { count: PortId(18) }, output: PortId(26), span: SourceSpan::new("src/v3/std/algebra.dag", 10816, 10918) }), Behavior::Bind(BindNode { id: NodeId(21), name: "degree_raw".to_string(), value: PortId(26), params: vec![PortId(18)], span: SourceSpan::new("src/v3/std/algebra.dag", 10816, 10918), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(22), target: TransformTarget::Callable(DeclarationId(747)), inputs: vec![PortId(27), PortId(28)], output: PortId(29), span: SourceSpan::new("src/v3/std/algebra.dag", 11240, 11255) }), Behavior::Transform(TransformNode { id: NodeId(23), target: TransformTarget::Callable(DeclarationId(1621)), inputs: vec![PortId(29)], output: PortId(30), span: SourceSpan::new("src/v3/std/algebra.dag", 11232, 11256) }), Behavior::Transform(TransformNode { id: NodeId(24), target: TransformTarget::Callable(DeclarationId(758)), inputs: vec![PortId(30)], output: PortId(31), span: SourceSpan::new("src/v3/std/algebra.dag", 11222, 11257) }), Behavior::Bind(BindNode { id: NodeId(25), name: "sequential".to_string(), value: PortId(31), params: vec![PortId(27), PortId(28)], span: SourceSpan::new("src/v3/std/algebra.dag", 11222, 11257), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(26), target: TransformTarget::Callable(DeclarationId(747)), inputs: vec![PortId(32), PortId(33)], output: PortId(34), span: SourceSpan::new("src/v3/std/algebra.dag", 11537, 11559) }), Behavior::Transform(TransformNode { id: NodeId(27), target: TransformTarget::Callable(DeclarationId(1619)), inputs: vec![PortId(34)], output: PortId(35), span: SourceSpan::new("src/v3/std/algebra.dag", 11525, 11560) }), Behavior::Transform(TransformNode { id: NodeId(28), target: TransformTarget::Callable(DeclarationId(758)), inputs: vec![PortId(35)], output: PortId(36), span: SourceSpan::new("src/v3/std/algebra.dag", 11515, 11561) }), Behavior::Bind(BindNode { id: NodeId(29), name: "iterate".to_string(), value: PortId(36), params: vec![PortId(32), PortId(33)], span: SourceSpan::new("src/v3/std/algebra.dag", 11515, 11561), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(30), target: TransformTarget::Callable(DeclarationId(756)), inputs: vec![PortId(38), PortId(37)], output: PortId(39), span: SourceSpan::new("src/v3/std/algebra.dag", 12505, 12530) }), Behavior::Transform(TransformNode { id: NodeId(31), target: TransformTarget::Callable(DeclarationId(754)), inputs: vec![PortId(37), PortId(38)], output: PortId(40), span: SourceSpan::new("src/v3/std/algebra.dag", 12561, 12588) }), Behavior::Branch(BranchNode { id: NodeId(32), input: PortId(39), paths: vec![Path { body: NodeId(32), output: PortId(38), pattern: BranchPattern::UnresolvedVariant { name: "True".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 12540, 12549) }, binding: None }, Path { body: NodeId(31), output: PortId(40), pattern: BranchPattern::UnresolvedVariant { name: "False".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 12561, 12588) }, binding: None }], output: PortId(41), span: SourceSpan::new("src/v3/std/algebra.dag", 12502, 12588), emit_participation: None }), Behavior::Bind(BindNode { id: NodeId(33), name: "max_path_step".to_string(), value: PortId(41), params: vec![PortId(37), PortId(38)], span: SourceSpan::new("src/v3/std/algebra.dag", 12502, 12588), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(34), target: TransformTarget::Callable(DeclarationId(756)), inputs: vec![PortId(42), PortId(43)], output: PortId(44), span: SourceSpan::new("src/v3/std/algebra.dag", 12672, 12697) }), Behavior::Transform(TransformNode { id: NodeId(35), target: TransformTarget::Callable(DeclarationId(751)), inputs: vec![PortId(42), PortId(43)], output: PortId(45), span: SourceSpan::new("src/v3/std/algebra.dag", 12722, 12748) }), Behavior::Branch(BranchNode { id: NodeId(36), input: PortId(44), paths: vec![Path { body: NodeId(36), output: PortId(42), pattern: BranchPattern::UnresolvedVariant { name: "True".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 12707, 12710) }, binding: None }, Path { body: NodeId(35), output: PortId(45), pattern: BranchPattern::UnresolvedVariant { name: "False".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 12722, 12748) }, binding: None }], output: PortId(46), span: SourceSpan::new("src/v3/std/algebra.dag", 12669, 12748), emit_participation: None }), Behavior::Bind(BindNode { id: NodeId(37), name: "keep_or_sum".to_string(), value: PortId(46), params: vec![PortId(42), PortId(43)], span: SourceSpan::new("src/v3/std/algebra.dag", 12669, 12748), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Value(ValueNode { id: NodeId(38), data: LiteralBits::Int(0), output: PortId(48), span: SourceSpan::new("src/v3/std/algebra.dag", 13134, 13135), lane2_workflow: None }), Behavior::Transform(TransformNode { id: NodeId(39), target: TransformTarget::Callable(DeclarationId(1615)), inputs: vec![PortId(48)], output: PortId(49), span: SourceSpan::new("src/v3/std/algebra.dag", 13121, 13136) }), Behavior::Transform(TransformNode { id: NodeId(40), target: TransformTarget::Callable(DeclarationId(1629)), inputs: vec![PortId(47), PortId(49)], output: PortId(50), span: SourceSpan::new("src/v3/std/algebra.dag", 13109, 13152) }), Behavior::Bind(BindNode { id: NodeId(41), name: "max_path".to_string(), value: PortId(50), params: vec![PortId(47)], span: SourceSpan::new("src/v3/std/algebra.dag", 13109, 13152), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(42), target: TransformTarget::Callable(DeclarationId(425)), inputs: vec![], output: PortId(54), span: SourceSpan::new("src/v3/std/algebra.dag", 14111, 14115) }), Behavior::Transform(TransformNode { id: NodeId(43), target: TransformTarget::Callable(DeclarationId(425)), inputs: vec![], output: PortId(57), span: SourceSpan::new("src/v3/std/algebra.dag", 14182, 14186) }), Behavior::Transform(TransformNode { id: NodeId(44), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(59), span: SourceSpan::new("src/v3/std/algebra.dag", 14213, 14218) }), Behavior::Transform(TransformNode { id: NodeId(45), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(61), span: SourceSpan::new("src/v3/std/algebra.dag", 14244, 14249) }), Behavior::Transform(TransformNode { id: NodeId(46), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(63), span: SourceSpan::new("src/v3/std/algebra.dag", 14279, 14284) }), Behavior::Transform(TransformNode { id: NodeId(47), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(65), span: SourceSpan::new("src/v3/std/algebra.dag", 14311, 14316) }), Behavior::Transform(TransformNode { id: NodeId(48), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(67), span: SourceSpan::new("src/v3/std/algebra.dag", 14339, 14344) }), Behavior::Transform(TransformNode { id: NodeId(49), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(69), span: SourceSpan::new("src/v3/std/algebra.dag", 14367, 14372) }), Behavior::Branch(BranchNode { id: NodeId(50), input: PortId(52), paths: vec![Path { body: NodeId(43), output: PortId(57), pattern: BranchPattern::UnresolvedVariant { name: "ConstantCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14163, 14178) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(56) }) }, Path { body: NodeId(44), output: PortId(59), pattern: BranchPattern::UnresolvedVariant { name: "UnknownCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14195, 14209) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(58) }) }, Path { body: NodeId(45), output: PortId(61), pattern: BranchPattern::UnresolvedVariant { name: "LinearCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14227, 14240) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(60) }) }, Path { body: NodeId(46), output: PortId(63), pattern: BranchPattern::UnresolvedVariant { name: "PolynomialCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14258, 14275) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(62) }) }, Path { body: NodeId(47), output: PortId(65), pattern: BranchPattern::UnresolvedVariant { name: "ProductCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14293, 14307) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(64) }) }, Path { body: NodeId(48), output: PortId(67), pattern: BranchPattern::UnresolvedVariant { name: "SumCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14325, 14335) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(66) }) }, Path { body: NodeId(49), output: PortId(69), pattern: BranchPattern::UnresolvedVariant { name: "LogCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14353, 14363) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(68) }) }], output: PortId(70), span: SourceSpan::new("src/v3/std/algebra.dag", 14145, 14380), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Transform(TransformNode { id: NodeId(51), target: TransformTarget::Callable(DeclarationId(425)), inputs: vec![], output: PortId(73), span: SourceSpan::new("src/v3/std/algebra.dag", 14446, 14450) }), Behavior::Transform(TransformNode { id: NodeId(52), target: TransformTarget::Callable(DeclarationId(425)), inputs: vec![], output: PortId(75), span: SourceSpan::new("src/v3/std/algebra.dag", 14473, 14477) }), Behavior::Transform(TransformNode { id: NodeId(53), target: TransformTarget::Callable(DeclarationId(757)), inputs: vec![PortId(71), PortId(76)], output: PortId(77), span: SourceSpan::new("src/v3/std/algebra.dag", 14504, 14530) }), Behavior::Transform(TransformNode { id: NodeId(54), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(79), span: SourceSpan::new("src/v3/std/algebra.dag", 14576, 14581) }), Behavior::Transform(TransformNode { id: NodeId(55), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(81), span: SourceSpan::new("src/v3/std/algebra.dag", 14608, 14613) }), Behavior::Transform(TransformNode { id: NodeId(56), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(83), span: SourceSpan::new("src/v3/std/algebra.dag", 14640, 14645) }), Behavior::Transform(TransformNode { id: NodeId(57), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(85), span: SourceSpan::new("src/v3/std/algebra.dag", 14668, 14673) }), Behavior::Branch(BranchNode { id: NodeId(58), input: PortId(52), paths: vec![Path { body: NodeId(51), output: PortId(73), pattern: BranchPattern::UnresolvedVariant { name: "ConstantCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14427, 14442) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(72) }) }, Path { body: NodeId(52), output: PortId(75), pattern: BranchPattern::UnresolvedVariant { name: "LogCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14459, 14469) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(74) }) }, Path { body: NodeId(53), output: PortId(77), pattern: BranchPattern::UnresolvedVariant { name: "LinearCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14486, 14500) }, binding: Some(PayloadBinding { binding_name: "vb".to_string(), payload_port: PortId(76) }) }, Path { body: NodeId(54), output: PortId(79), pattern: BranchPattern::UnresolvedVariant { name: "PolynomialCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14539, 14562) }, binding: Some(PayloadBinding { binding_name: "payload".to_string(), payload_port: PortId(78) }) }, Path { body: NodeId(55), output: PortId(81), pattern: BranchPattern::UnresolvedVariant { name: "UnknownCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14590, 14604) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(80) }) }, Path { body: NodeId(56), output: PortId(83), pattern: BranchPattern::UnresolvedVariant { name: "ProductCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14622, 14636) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(82) }) }, Path { body: NodeId(57), output: PortId(85), pattern: BranchPattern::UnresolvedVariant { name: "SumCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14654, 14664) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(84) }) }], output: PortId(86), span: SourceSpan::new("src/v3/std/algebra.dag", 14409, 14681), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Transform(TransformNode { id: NodeId(59), target: TransformTarget::Callable(DeclarationId(425)), inputs: vec![], output: PortId(89), span: SourceSpan::new("src/v3/std/algebra.dag", 14751, 14755) }), Behavior::Transform(TransformNode { id: NodeId(60), target: TransformTarget::Callable(DeclarationId(425)), inputs: vec![], output: PortId(91), span: SourceSpan::new("src/v3/std/algebra.dag", 14778, 14782) }), Behavior::Transform(TransformNode { id: NodeId(61), target: TransformTarget::FieldProject { field_label: "var".to_string(), field_child: None }, inputs: vec![PortId(87)], output: PortId(93), span: SourceSpan::new("src/v3/std/algebra.dag", 14841, 14844) }), Behavior::Transform(TransformNode { id: NodeId(62), target: TransformTarget::Callable(DeclarationId(757)), inputs: vec![PortId(93), PortId(92)], output: PortId(94), span: SourceSpan::new("src/v3/std/algebra.dag", 14819, 14849) }), Behavior::Transform(TransformNode { id: NodeId(63), target: TransformTarget::FieldProject { field_label: "var".to_string(), field_child: None }, inputs: vec![PortId(87)], output: PortId(96), span: SourceSpan::new("src/v3/std/algebra.dag", 14915, 14918) }), Behavior::Transform(TransformNode { id: NodeId(64), target: TransformTarget::FieldProject { field_label: "var".to_string(), field_child: None }, inputs: vec![PortId(95)], output: PortId(97), span: SourceSpan::new("src/v3/std/algebra.dag", 14923, 14926) }), Behavior::Transform(TransformNode { id: NodeId(65), target: TransformTarget::Callable(DeclarationId(757)), inputs: vec![PortId(96), PortId(97)], output: PortId(98), span: SourceSpan::new("src/v3/std/algebra.dag", 14893, 14927) }), Behavior::Transform(TransformNode { id: NodeId(66), target: TransformTarget::FieldProject { field_label: "degree".to_string(), field_child: None }, inputs: vec![PortId(87)], output: PortId(99), span: SourceSpan::new("src/v3/std/algebra.dag", 14959, 14965) }), Behavior::Transform(TransformNode { id: NodeId(67), target: TransformTarget::Callable(DeclarationId(750)), inputs: vec![PortId(99)], output: PortId(100), span: SourceSpan::new("src/v3/std/algebra.dag", 14945, 14966) }), Behavior::Transform(TransformNode { id: NodeId(68), target: TransformTarget::FieldProject { field_label: "degree".to_string(), field_child: None }, inputs: vec![PortId(95)], output: PortId(101), span: SourceSpan::new("src/v3/std/algebra.dag", 14984, 14990) }), Behavior::Transform(TransformNode { id: NodeId(69), target: TransformTarget::Callable(DeclarationId(750)), inputs: vec![PortId(101)], output: PortId(102), span: SourceSpan::new("src/v3/std/algebra.dag", 14970, 14991) }), Behavior::Transform(TransformNode { id: NodeId(70), target: TransformTarget::Operator(OperatorKind::Comparison(ComparisonOp::Ge)), inputs: vec![PortId(100), PortId(102)], output: PortId(103), span: SourceSpan::new("src/v3/std/algebra.dag", 14945, 14991) }), Behavior::Transform(TransformNode { id: NodeId(71), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(104), span: SourceSpan::new("src/v3/std/algebra.dag", 15019, 15024) }), Behavior::Branch(BranchNode { id: NodeId(72), input: PortId(98), paths: vec![Path { body: NodeId(70), output: PortId(103), pattern: BranchPattern::UnresolvedVariant { name: "True".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14945, 14991) }, binding: None }, Path { body: NodeId(71), output: PortId(104), pattern: BranchPattern::UnresolvedVariant { name: "False".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15019, 15024) }, binding: None }], output: PortId(105), span: SourceSpan::new("src/v3/std/algebra.dag", 14890, 15024), emit_participation: None }), Behavior::Transform(TransformNode { id: NodeId(73), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(107), span: SourceSpan::new("src/v3/std/algebra.dag", 15051, 15056) }), Behavior::Transform(TransformNode { id: NodeId(74), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(109), span: SourceSpan::new("src/v3/std/algebra.dag", 15083, 15088) }), Behavior::Transform(TransformNode { id: NodeId(75), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(111), span: SourceSpan::new("src/v3/std/algebra.dag", 15111, 15116) }), Behavior::Branch(BranchNode { id: NodeId(76), input: PortId(52), paths: vec![Path { body: NodeId(59), output: PortId(89), pattern: BranchPattern::UnresolvedVariant { name: "ConstantCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14732, 14747) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(88) }) }, Path { body: NodeId(60), output: PortId(91), pattern: BranchPattern::UnresolvedVariant { name: "LogCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14764, 14774) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(90) }) }, Path { body: NodeId(62), output: PortId(94), pattern: BranchPattern::UnresolvedVariant { name: "LinearCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14791, 14805) }, binding: Some(PayloadBinding { binding_name: "vb".to_string(), payload_port: PortId(92) }) }, Path { body: NodeId(72), output: PortId(105), pattern: BranchPattern::UnresolvedVariant { name: "PolynomialCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14858, 14876) }, binding: Some(PayloadBinding { binding_name: "pb".to_string(), payload_port: PortId(95) }) }, Path { body: NodeId(73), output: PortId(107), pattern: BranchPattern::UnresolvedVariant { name: "UnknownCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15033, 15047) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(106) }) }, Path { body: NodeId(74), output: PortId(109), pattern: BranchPattern::UnresolvedVariant { name: "ProductCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15065, 15079) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(108) }) }, Path { body: NodeId(75), output: PortId(111), pattern: BranchPattern::UnresolvedVariant { name: "SumCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15097, 15107) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(110) }) }], output: PortId(112), span: SourceSpan::new("src/v3/std/algebra.dag", 14714, 15124), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Transform(TransformNode { id: NodeId(77), target: TransformTarget::Callable(DeclarationId(425)), inputs: vec![], output: PortId(115), span: SourceSpan::new("src/v3/std/algebra.dag", 15187, 15191) }), Behavior::Transform(TransformNode { id: NodeId(78), target: TransformTarget::Callable(DeclarationId(757)), inputs: vec![PortId(113), PortId(116)], output: PortId(117), span: SourceSpan::new("src/v3/std/algebra.dag", 15215, 15241) }), Behavior::Transform(TransformNode { id: NodeId(79), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(119), span: SourceSpan::new("src/v3/std/algebra.dag", 15267, 15272) }), Behavior::Transform(TransformNode { id: NodeId(80), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(121), span: SourceSpan::new("src/v3/std/algebra.dag", 15302, 15307) }), Behavior::Transform(TransformNode { id: NodeId(81), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(123), span: SourceSpan::new("src/v3/std/algebra.dag", 15334, 15339) }), Behavior::Transform(TransformNode { id: NodeId(82), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(125), span: SourceSpan::new("src/v3/std/algebra.dag", 15362, 15367) }), Behavior::Transform(TransformNode { id: NodeId(83), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(127), span: SourceSpan::new("src/v3/std/algebra.dag", 15394, 15399) }), Behavior::Branch(BranchNode { id: NodeId(84), input: PortId(52), paths: vec![Path { body: NodeId(77), output: PortId(115), pattern: BranchPattern::UnresolvedVariant { name: "ConstantCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15168, 15183) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(114) }) }, Path { body: NodeId(78), output: PortId(117), pattern: BranchPattern::UnresolvedVariant { name: "LogCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15200, 15211) }, binding: Some(PayloadBinding { binding_name: "vb".to_string(), payload_port: PortId(116) }) }, Path { body: NodeId(79), output: PortId(119), pattern: BranchPattern::UnresolvedVariant { name: "LinearCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15250, 15263) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(118) }) }, Path { body: NodeId(80), output: PortId(121), pattern: BranchPattern::UnresolvedVariant { name: "PolynomialCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15281, 15298) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(120) }) }, Path { body: NodeId(81), output: PortId(123), pattern: BranchPattern::UnresolvedVariant { name: "ProductCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15316, 15330) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(122) }) }, Path { body: NodeId(82), output: PortId(125), pattern: BranchPattern::UnresolvedVariant { name: "SumCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15348, 15358) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(124) }) }, Path { body: NodeId(83), output: PortId(127), pattern: BranchPattern::UnresolvedVariant { name: "UnknownCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15376, 15390) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(126) }) }], output: PortId(128), span: SourceSpan::new("src/v3/std/algebra.dag", 15150, 15407), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Transform(TransformNode { id: NodeId(85), target: TransformTarget::Callable(DeclarationId(759)), inputs: vec![PortId(129)], output: PortId(130), span: SourceSpan::new("src/v3/std/algebra.dag", 15834, 15852) }), Behavior::Transform(TransformNode { id: NodeId(86), target: TransformTarget::Callable(DeclarationId(744)), inputs: vec![PortId(52)], output: PortId(131), span: SourceSpan::new("src/v3/std/algebra.dag", 15864, 15885) }), Behavior::Transform(TransformNode { id: NodeId(87), target: TransformTarget::Callable(DeclarationId(1631)), inputs: vec![PortId(130), PortId(131)], output: PortId(132), span: SourceSpan::new("src/v3/std/algebra.dag", 15818, 15928) }), Behavior::Transform(TransformNode { id: NodeId(88), target: TransformTarget::Callable(DeclarationId(771)), inputs: vec![PortId(132)], output: PortId(133), span: SourceSpan::new("src/v3/std/algebra.dag", 15800, 15936) }), Behavior::Transform(TransformNode { id: NodeId(89), target: TransformTarget::Callable(DeclarationId(759)), inputs: vec![PortId(134)], output: PortId(135), span: SourceSpan::new("src/v3/std/algebra.dag", 15999, 16017) }), Behavior::Transform(TransformNode { id: NodeId(90), target: TransformTarget::Callable(DeclarationId(744)), inputs: vec![PortId(52)], output: PortId(136), span: SourceSpan::new("src/v3/std/algebra.dag", 16029, 16050) }), Behavior::Transform(TransformNode { id: NodeId(91), target: TransformTarget::Callable(DeclarationId(1633)), inputs: vec![PortId(135), PortId(136)], output: PortId(137), span: SourceSpan::new("src/v3/std/algebra.dag", 15983, 16093) }), Behavior::Transform(TransformNode { id: NodeId(92), target: TransformTarget::Callable(DeclarationId(771)), inputs: vec![PortId(137)], output: PortId(138), span: SourceSpan::new("src/v3/std/algebra.dag", 15965, 16101) }), Behavior::Branch(BranchNode { id: NodeId(93), input: PortId(51), paths: vec![Path { body: NodeId(42), output: PortId(54), pattern: BranchPattern::UnresolvedVariant { name: "UnknownCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14093, 14107) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(53) }) }, Path { body: NodeId(50), output: PortId(70), pattern: BranchPattern::UnresolvedVariant { name: "ConstantCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14120, 14135) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(55) }) }, Path { body: NodeId(58), output: PortId(86), pattern: BranchPattern::UnresolvedVariant { name: "LinearCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14385, 14399) }, binding: Some(PayloadBinding { binding_name: "va".to_string(), payload_port: PortId(71) }) }, Path { body: NodeId(76), output: PortId(112), pattern: BranchPattern::UnresolvedVariant { name: "PolynomialCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 14686, 14704) }, binding: Some(PayloadBinding { binding_name: "pa".to_string(), payload_port: PortId(87) }) }, Path { body: NodeId(84), output: PortId(128), pattern: BranchPattern::UnresolvedVariant { name: "LogCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15129, 15140) }, binding: Some(PayloadBinding { binding_name: "va".to_string(), payload_port: PortId(113) }) }, Path { body: NodeId(88), output: PortId(133), pattern: BranchPattern::UnresolvedVariant { name: "ProductCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15772, 15790) }, binding: Some(PayloadBinding { binding_name: "terms".to_string(), payload_port: PortId(129) }) }, Path { body: NodeId(92), output: PortId(138), pattern: BranchPattern::UnresolvedVariant { name: "SumCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 15941, 15955) }, binding: Some(PayloadBinding { binding_name: "terms".to_string(), payload_port: PortId(134) }) }], output: PortId(139), span: SourceSpan::new("src/v3/std/algebra.dag", 14079, 16105), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(94), name: "dominates".to_string(), value: PortId(139), params: vec![PortId(51), PortId(52)], span: SourceSpan::new("src/v3/std/algebra.dag", 14079, 16105), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(95), target: TransformTarget::FieldProject { field_label: "source_port".to_string(), field_child: Some(DeclarationId(626)) }, inputs: vec![PortId(140)], output: PortId(142), span: SourceSpan::new("src/v3/std/algebra.dag", 16177, 16188) }), Behavior::Transform(TransformNode { id: NodeId(96), target: TransformTarget::FieldProject { field_label: "source_port".to_string(), field_child: Some(DeclarationId(626)) }, inputs: vec![PortId(141)], output: PortId(143), span: SourceSpan::new("src/v3/std/algebra.dag", 16194, 16205) }), Behavior::Transform(TransformNode { id: NodeId(97), target: TransformTarget::Operator(OperatorKind::Comparison(ComparisonOp::Eq)), inputs: vec![PortId(142), PortId(143)], output: PortId(144), span: SourceSpan::new("src/v3/std/algebra.dag", 16175, 16205) }), Behavior::Bind(BindNode { id: NodeId(98), name: "same_size_variable".to_string(), value: PortId(144), params: vec![PortId(140), PortId(141)], span: SourceSpan::new("src/v3/std/algebra.dag", 16175, 16205), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(99), target: TransformTarget::Callable(DeclarationId(759)), inputs: vec![PortId(146)], output: PortId(147), span: SourceSpan::new("src/v3/std/algebra.dag", 17170, 17188) }), Behavior::Transform(TransformNode { id: NodeId(100), target: TransformTarget::Callable(DeclarationId(760)), inputs: vec![PortId(147)], output: PortId(148), span: SourceSpan::new("src/v3/std/algebra.dag", 17160, 17189) }), Behavior::Transform(TransformNode { id: NodeId(101), target: TransformTarget::Callable(DeclarationId(762)), inputs: vec![PortId(148)], output: PortId(149), span: SourceSpan::new("src/v3/std/algebra.dag", 17149, 17190) }), Behavior::Transform(TransformNode { id: NodeId(102), target: TransformTarget::Callable(DeclarationId(759)), inputs: vec![PortId(150)], output: PortId(151), span: SourceSpan::new("src/v3/std/algebra.dag", 17242, 17260) }), Behavior::Transform(TransformNode { id: NodeId(103), target: TransformTarget::Callable(DeclarationId(760)), inputs: vec![PortId(151)], output: PortId(152), span: SourceSpan::new("src/v3/std/algebra.dag", 17232, 17261) }), Behavior::Transform(TransformNode { id: NodeId(104), target: TransformTarget::Callable(DeclarationId(764)), inputs: vec![PortId(152)], output: PortId(153), span: SourceSpan::new("src/v3/std/algebra.dag", 17217, 17262) }), Behavior::Branch(BranchNode { id: NodeId(105), input: PortId(145), paths: vec![Path { body: NodeId(105), output: PortId(145), pattern: BranchPattern::UnresolvedVariant { name: "ConstantCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17027, 17039) }, binding: None }, Path { body: NodeId(105), output: PortId(145), pattern: BranchPattern::UnresolvedVariant { name: "LinearCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17049, 17059) }, binding: None }, Path { body: NodeId(105), output: PortId(145), pattern: BranchPattern::UnresolvedVariant { name: "PolynomialCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17069, 17083) }, binding: None }, Path { body: NodeId(105), output: PortId(145), pattern: BranchPattern::UnresolvedVariant { name: "LogCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17093, 17100) }, binding: None }, Path { body: NodeId(105), output: PortId(145), pattern: BranchPattern::UnresolvedVariant { name: "UnknownCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17110, 17121) }, binding: None }, Path { body: NodeId(101), output: PortId(149), pattern: BranchPattern::UnresolvedVariant { name: "SumCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17131, 17145) }, binding: Some(PayloadBinding { binding_name: "terms".to_string(), payload_port: PortId(146) }) }, Path { body: NodeId(104), output: PortId(153), pattern: BranchPattern::UnresolvedVariant { name: "ProductCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17195, 17213) }, binding: Some(PayloadBinding { binding_name: "terms".to_string(), payload_port: PortId(150) }) }], output: PortId(154), span: SourceSpan::new("src/v3/std/algebra.dag", 17013, 17266), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(106), name: "normalize".to_string(), value: PortId(154), params: vec![PortId(145)], span: SourceSpan::new("src/v3/std/algebra.dag", 17013, 17266), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(107), target: TransformTarget::FieldProject { field_label: "first".to_string(), field_child: Some(DeclarationId(632)) }, inputs: vec![PortId(155)], output: PortId(156), span: SourceSpan::new("src/v3/std/algebra.dag", 17359, 17364) }), Behavior::Transform(TransformNode { id: NodeId(108), target: TransformTarget::FieldProject { field_label: "second".to_string(), field_child: Some(DeclarationId(632)) }, inputs: vec![PortId(155)], output: PortId(157), span: SourceSpan::new("src/v3/std/algebra.dag", 17377, 17383) }), Behavior::Transform(TransformNode { id: NodeId(109), target: TransformTarget::FieldProject { field_label: "rest".to_string(), field_child: Some(DeclarationId(1408)) }, inputs: vec![PortId(155)], output: PortId(158), span: SourceSpan::new("src/v3/std/algebra.dag", 17391, 17395) }), Behavior::Transform(TransformNode { id: NodeId(110), target: TransformTarget::Callable(DeclarationId(1634)), inputs: vec![PortId(157), PortId(158)], output: PortId(159), span: SourceSpan::new("src/v3/std/algebra.dag", 17366, 17396) }), Behavior::Transform(TransformNode { id: NodeId(111), target: TransformTarget::Callable(DeclarationId(1635)), inputs: vec![PortId(156), PortId(159)], output: PortId(160), span: SourceSpan::new("src/v3/std/algebra.dag", 17348, 17397) }), Behavior::Bind(BindNode { id: NodeId(112), name: "nsl_to_list".to_string(), value: PortId(160), params: vec![PortId(155)], span: SourceSpan::new("src/v3/std/algebra.dag", 17348, 17397), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(113), target: TransformTarget::Callable(DeclarationId(1636)), inputs: vec![], output: PortId(162), span: SourceSpan::new("src/v3/std/algebra.dag", 17667, 17674) }), Behavior::Transform(TransformNode { id: NodeId(114), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(163)], output: PortId(164), span: SourceSpan::new("src/v3/std/algebra.dag", 17730, 17734) }), Behavior::Transform(TransformNode { id: NodeId(115), target: TransformTarget::Callable(DeclarationId(761)), inputs: vec![PortId(164)], output: PortId(165), span: SourceSpan::new("src/v3/std/algebra.dag", 17705, 17735) }), Behavior::Transform(TransformNode { id: NodeId(116), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(163)], output: PortId(166), span: SourceSpan::new("src/v3/std/algebra.dag", 17767, 17771) }), Behavior::Transform(TransformNode { id: NodeId(117), target: TransformTarget::Callable(DeclarationId(760)), inputs: vec![PortId(166)], output: PortId(167), span: SourceSpan::new("src/v3/std/algebra.dag", 17749, 17772) }), Behavior::Transform(TransformNode { id: NodeId(118), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(163)], output: PortId(168), span: SourceSpan::new("src/v3/std/algebra.dag", 17805, 17809) }), Behavior::Transform(TransformNode { id: NodeId(119), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(163)], output: PortId(169), span: SourceSpan::new("src/v3/std/algebra.dag", 17829, 17833) }), Behavior::Transform(TransformNode { id: NodeId(120), target: TransformTarget::Callable(DeclarationId(760)), inputs: vec![PortId(169)], output: PortId(170), span: SourceSpan::new("src/v3/std/algebra.dag", 17811, 17834) }), Behavior::Transform(TransformNode { id: NodeId(121), target: TransformTarget::Callable(DeclarationId(1637)), inputs: vec![PortId(168), PortId(170)], output: PortId(171), span: SourceSpan::new("src/v3/std/algebra.dag", 17792, 17835) }), Behavior::Branch(BranchNode { id: NodeId(122), input: PortId(165), paths: vec![Path { body: NodeId(117), output: PortId(167), pattern: BranchPattern::UnresolvedVariant { name: "True".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17749, 17772) }, binding: None }, Path { body: NodeId(121), output: PortId(171), pattern: BranchPattern::UnresolvedVariant { name: "False".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17792, 17835) }, binding: None }], output: PortId(172), span: SourceSpan::new("src/v3/std/algebra.dag", 17702, 17835), emit_participation: None }), Behavior::Branch(BranchNode { id: NodeId(123), input: PortId(161), paths: vec![Path { body: NodeId(113), output: PortId(162), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17658, 17663) }, binding: None }, Path { body: NodeId(122), output: PortId(172), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17679, 17692) }, binding: Some(PayloadBinding { binding_name: "payload".to_string(), payload_port: PortId(163) }) }], output: PortId(173), span: SourceSpan::new("src/v3/std/algebra.dag", 17640, 17839), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Loop(LoopNode { id: NodeId(124), source: PortId(161), init: PortId(161), body: NodeId(123), bound: LoopBound::Cardinality { count: PortId(161) }, output: PortId(174), span: SourceSpan::new("src/v3/std/algebra.dag", 17640, 17839) }), Behavior::Bind(BindNode { id: NodeId(125), name: "drop_zero".to_string(), value: PortId(174), params: vec![PortId(161)], span: SourceSpan::new("src/v3/std/algebra.dag", 17640, 17839), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Value(ValueNode { id: NodeId(126), data: LiteralBits::Int(0), output: PortId(177), span: SourceSpan::new("src/v3/std/algebra.dag", 17928, 17929), lane2_workflow: None }), Behavior::Transform(TransformNode { id: NodeId(127), target: TransformTarget::Operator(OperatorKind::Comparison(ComparisonOp::Eq)), inputs: vec![PortId(176), PortId(177)], output: PortId(178), span: SourceSpan::new("src/v3/std/algebra.dag", 17923, 17929) }), Behavior::Transform(TransformNode { id: NodeId(128), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(180), span: SourceSpan::new("src/v3/std/algebra.dag", 17951, 17956) }), Behavior::Transform(TransformNode { id: NodeId(129), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(182), span: SourceSpan::new("src/v3/std/algebra.dag", 17982, 17987) }), Behavior::Transform(TransformNode { id: NodeId(130), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(184), span: SourceSpan::new("src/v3/std/algebra.dag", 18010, 18015) }), Behavior::Transform(TransformNode { id: NodeId(131), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(186), span: SourceSpan::new("src/v3/std/algebra.dag", 18034, 18039) }), Behavior::Transform(TransformNode { id: NodeId(132), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(188), span: SourceSpan::new("src/v3/std/algebra.dag", 18058, 18063) }), Behavior::Transform(TransformNode { id: NodeId(133), target: TransformTarget::Callable(DeclarationId(426)), inputs: vec![], output: PortId(190), span: SourceSpan::new("src/v3/std/algebra.dag", 18086, 18091) }), Behavior::Branch(BranchNode { id: NodeId(134), input: PortId(175), paths: vec![Path { body: NodeId(127), output: PortId(178), pattern: BranchPattern::UnresolvedVariant { name: "ConstantCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17904, 17919) }, binding: Some(PayloadBinding { binding_name: "n".to_string(), payload_port: PortId(176) }) }, Path { body: NodeId(128), output: PortId(180), pattern: BranchPattern::UnresolvedVariant { name: "LinearCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17934, 17947) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(179) }) }, Path { body: NodeId(129), output: PortId(182), pattern: BranchPattern::UnresolvedVariant { name: "PolynomialCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17961, 17978) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(181) }) }, Path { body: NodeId(130), output: PortId(184), pattern: BranchPattern::UnresolvedVariant { name: "ProductCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 17992, 18006) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(183) }) }, Path { body: NodeId(131), output: PortId(186), pattern: BranchPattern::UnresolvedVariant { name: "SumCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 18020, 18030) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(185) }) }, Path { body: NodeId(132), output: PortId(188), pattern: BranchPattern::UnresolvedVariant { name: "LogCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 18044, 18054) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(187) }) }, Path { body: NodeId(133), output: PortId(190), pattern: BranchPattern::UnresolvedVariant { name: "UnknownCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 18068, 18082) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(189) }) }], output: PortId(191), span: SourceSpan::new("src/v3/std/algebra.dag", 17890, 18095), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(135), name: "is_zero_constant".to_string(), value: PortId(191), params: vec![PortId(175)], span: SourceSpan::new("src/v3/std/algebra.dag", 17890, 18095), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Value(ValueNode { id: NodeId(136), data: LiteralBits::Int(0), output: PortId(193), span: SourceSpan::new("src/v3/std/algebra.dag", 18981, 18982), lane2_workflow: None }), Behavior::Transform(TransformNode { id: NodeId(137), target: TransformTarget::Callable(DeclarationId(1615)), inputs: vec![PortId(193)], output: PortId(194), span: SourceSpan::new("src/v3/std/algebra.dag", 18968, 18983) }), Behavior::Transform(TransformNode { id: NodeId(138), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(195)], output: PortId(196), span: SourceSpan::new("src/v3/std/algebra.dag", 19025, 19029) }), Behavior::Transform(TransformNode { id: NodeId(139), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(195)], output: PortId(197), span: SourceSpan::new("src/v3/std/algebra.dag", 19057, 19061) }), Behavior::Transform(TransformNode { id: NodeId(140), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(195)], output: PortId(199), span: SourceSpan::new("src/v3/std/algebra.dag", 19118, 19122) }), Behavior::Transform(TransformNode { id: NodeId(141), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(195)], output: PortId(200), span: SourceSpan::new("src/v3/std/algebra.dag", 19132, 19136) }), Behavior::Transform(TransformNode { id: NodeId(142), target: TransformTarget::Callable(DeclarationId(1638)), inputs: vec![PortId(199), PortId(200)], output: PortId(201), span: SourceSpan::new("src/v3/std/algebra.dag", 19105, 19137) }), Behavior::Transform(TransformNode { id: NodeId(143), target: TransformTarget::Callable(DeclarationId(774)), inputs: vec![PortId(201)], output: PortId(202), span: SourceSpan::new("src/v3/std/algebra.dag", 19090, 19138) }), Behavior::Transform(TransformNode { id: NodeId(144), target: TransformTarget::Callable(DeclarationId(763)), inputs: vec![PortId(202)], output: PortId(203), span: SourceSpan::new("src/v3/std/algebra.dag", 19081, 19139) }), Behavior::Branch(BranchNode { id: NodeId(145), input: PortId(196), paths: vec![Path { body: NodeId(139), output: PortId(197), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19040, 19045) }, binding: None }, Path { body: NodeId(144), output: PortId(203), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19070, 19077) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(198) }) }], output: PortId(204), span: SourceSpan::new("src/v3/std/algebra.dag", 19011, 19147), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Branch(BranchNode { id: NodeId(146), input: PortId(192), paths: vec![Path { body: NodeId(137), output: PortId(194), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 18959, 18964) }, binding: None }, Path { body: NodeId(145), output: PortId(204), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 18988, 19001) }, binding: Some(PayloadBinding { binding_name: "payload".to_string(), payload_port: PortId(195) }) }], output: PortId(205), span: SourceSpan::new("src/v3/std/algebra.dag", 18941, 19151), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(147), name: "reduce_sum".to_string(), value: PortId(205), params: vec![PortId(192)], span: SourceSpan::new("src/v3/std/algebra.dag", 18941, 19151), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Value(ValueNode { id: NodeId(148), data: LiteralBits::Int(0), output: PortId(207), span: SourceSpan::new("src/v3/std/algebra.dag", 19252, 19253), lane2_workflow: None }), Behavior::Transform(TransformNode { id: NodeId(149), target: TransformTarget::Callable(DeclarationId(1615)), inputs: vec![PortId(207)], output: PortId(208), span: SourceSpan::new("src/v3/std/algebra.dag", 19239, 19254) }), Behavior::Transform(TransformNode { id: NodeId(150), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(209)], output: PortId(210), span: SourceSpan::new("src/v3/std/algebra.dag", 19296, 19300) }), Behavior::Transform(TransformNode { id: NodeId(151), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(209)], output: PortId(211), span: SourceSpan::new("src/v3/std/algebra.dag", 19328, 19332) }), Behavior::Transform(TransformNode { id: NodeId(152), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(209)], output: PortId(213), span: SourceSpan::new("src/v3/std/algebra.dag", 19384, 19388) }), Behavior::Transform(TransformNode { id: NodeId(153), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(212)], output: PortId(214), span: SourceSpan::new("src/v3/std/algebra.dag", 19397, 19401) }), Behavior::Transform(TransformNode { id: NodeId(154), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(212)], output: PortId(215), span: SourceSpan::new("src/v3/std/algebra.dag", 19410, 19414) }), Behavior::Transform(TransformNode { id: NodeId(155), target: TransformTarget::Callable(DeclarationId(748)), inputs: vec![PortId(213), PortId(214), PortId(215)], output: PortId(216), span: SourceSpan::new("src/v3/std/algebra.dag", 19365, 19415) }), Behavior::Transform(TransformNode { id: NodeId(156), target: TransformTarget::Callable(DeclarationId(1621)), inputs: vec![PortId(216)], output: PortId(217), span: SourceSpan::new("src/v3/std/algebra.dag", 19357, 19416) }), Behavior::Branch(BranchNode { id: NodeId(157), input: PortId(210), paths: vec![Path { body: NodeId(151), output: PortId(211), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19311, 19316) }, binding: None }, Path { body: NodeId(156), output: PortId(217), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19341, 19353) }, binding: Some(PayloadBinding { binding_name: "second".to_string(), payload_port: PortId(212) }) }], output: PortId(218), span: SourceSpan::new("src/v3/std/algebra.dag", 19282, 19424), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Branch(BranchNode { id: NodeId(158), input: PortId(206), paths: vec![Path { body: NodeId(149), output: PortId(208), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19230, 19235) }, binding: None }, Path { body: NodeId(157), output: PortId(218), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19259, 19272) }, binding: Some(PayloadBinding { binding_name: "payload".to_string(), payload_port: PortId(209) }) }], output: PortId(219), span: SourceSpan::new("src/v3/std/algebra.dag", 19212, 19428), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(159), name: "wrap_sum".to_string(), value: PortId(219), params: vec![PortId(206)], span: SourceSpan::new("src/v3/std/algebra.dag", 19212, 19428), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Value(ValueNode { id: NodeId(160), data: LiteralBits::Int(0), output: PortId(221), span: SourceSpan::new("src/v3/std/algebra.dag", 19718, 19719), lane2_workflow: None }), Behavior::Transform(TransformNode { id: NodeId(161), target: TransformTarget::Callable(DeclarationId(1615)), inputs: vec![PortId(221)], output: PortId(222), span: SourceSpan::new("src/v3/std/algebra.dag", 19705, 19720) }), Behavior::Transform(TransformNode { id: NodeId(162), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(223)], output: PortId(224), span: SourceSpan::new("src/v3/std/algebra.dag", 19762, 19766) }), Behavior::Transform(TransformNode { id: NodeId(163), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(223)], output: PortId(225), span: SourceSpan::new("src/v3/std/algebra.dag", 19794, 19798) }), Behavior::Transform(TransformNode { id: NodeId(164), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(226)], output: PortId(227), span: SourceSpan::new("src/v3/std/algebra.dag", 19846, 19850) }), Behavior::Transform(TransformNode { id: NodeId(165), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(223)], output: PortId(228), span: SourceSpan::new("src/v3/std/algebra.dag", 19905, 19909) }), Behavior::Transform(TransformNode { id: NodeId(166), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(226)], output: PortId(229), span: SourceSpan::new("src/v3/std/algebra.dag", 19918, 19922) }), Behavior::Transform(TransformNode { id: NodeId(167), target: TransformTarget::Callable(DeclarationId(765)), inputs: vec![PortId(228), PortId(229)], output: PortId(230), span: SourceSpan::new("src/v3/std/algebra.dag", 19874, 19923) }), Behavior::Transform(TransformNode { id: NodeId(168), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(223)], output: PortId(232), span: SourceSpan::new("src/v3/std/algebra.dag", 19978, 19982) }), Behavior::Transform(TransformNode { id: NodeId(169), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(226)], output: PortId(233), span: SourceSpan::new("src/v3/std/algebra.dag", 19991, 19995) }), Behavior::Transform(TransformNode { id: NodeId(170), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(226)], output: PortId(234), span: SourceSpan::new("src/v3/std/algebra.dag", 20004, 20008) }), Behavior::Transform(TransformNode { id: NodeId(171), target: TransformTarget::Callable(DeclarationId(748)), inputs: vec![PortId(232), PortId(233), PortId(234)], output: PortId(235), span: SourceSpan::new("src/v3/std/algebra.dag", 19959, 20009) }), Behavior::Transform(TransformNode { id: NodeId(172), target: TransformTarget::Callable(DeclarationId(1619)), inputs: vec![PortId(235)], output: PortId(236), span: SourceSpan::new("src/v3/std/algebra.dag", 19947, 20010) }), Behavior::Branch(BranchNode { id: NodeId(173), input: PortId(227), paths: vec![Path { body: NodeId(167), output: PortId(230), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19865, 19870) }, binding: None }, Path { body: NodeId(172), output: PortId(236), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19936, 19943) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(231) }) }], output: PortId(237), span: SourceSpan::new("src/v3/std/algebra.dag", 19833, 20022), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Branch(BranchNode { id: NodeId(174), input: PortId(224), paths: vec![Path { body: NodeId(163), output: PortId(225), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19777, 19782) }, binding: None }, Path { body: NodeId(173), output: PortId(237), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19807, 19819) }, binding: Some(PayloadBinding { binding_name: "second".to_string(), payload_port: PortId(226) }) }], output: PortId(238), span: SourceSpan::new("src/v3/std/algebra.dag", 19748, 20030), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Branch(BranchNode { id: NodeId(175), input: PortId(220), paths: vec![Path { body: NodeId(161), output: PortId(222), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19696, 19701) }, binding: None }, Path { body: NodeId(174), output: PortId(238), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 19725, 19738) }, binding: Some(PayloadBinding { binding_name: "payload".to_string(), payload_port: PortId(223) }) }], output: PortId(239), span: SourceSpan::new("src/v3/std/algebra.dag", 19678, 20034), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(176), name: "reduce_product".to_string(), value: PortId(239), params: vec![PortId(220)], span: SourceSpan::new("src/v3/std/algebra.dag", 19678, 20034), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(177), target: TransformTarget::Callable(DeclarationId(766)), inputs: vec![PortId(242), PortId(240), PortId(241)], output: PortId(243), span: SourceSpan::new("src/v3/std/algebra.dag", 20311, 20340) }), Behavior::Transform(TransformNode { id: NodeId(178), target: TransformTarget::Callable(DeclarationId(769)), inputs: vec![PortId(240), PortId(241)], output: PortId(245), span: SourceSpan::new("src/v3/std/algebra.dag", 20364, 20382) }), Behavior::Transform(TransformNode { id: NodeId(179), target: TransformTarget::Callable(DeclarationId(769)), inputs: vec![PortId(240), PortId(241)], output: PortId(247), span: SourceSpan::new("src/v3/std/algebra.dag", 20408, 20426) }), Behavior::Transform(TransformNode { id: NodeId(180), target: TransformTarget::Callable(DeclarationId(769)), inputs: vec![PortId(240), PortId(241)], output: PortId(249), span: SourceSpan::new("src/v3/std/algebra.dag", 20445, 20463) }), Behavior::Transform(TransformNode { id: NodeId(181), target: TransformTarget::Callable(DeclarationId(769)), inputs: vec![PortId(240), PortId(241)], output: PortId(251), span: SourceSpan::new("src/v3/std/algebra.dag", 20482, 20500) }), Behavior::Transform(TransformNode { id: NodeId(182), target: TransformTarget::Callable(DeclarationId(769)), inputs: vec![PortId(240), PortId(241)], output: PortId(253), span: SourceSpan::new("src/v3/std/algebra.dag", 20523, 20541) }), Behavior::Transform(TransformNode { id: NodeId(183), target: TransformTarget::Callable(DeclarationId(769)), inputs: vec![PortId(240), PortId(241)], output: PortId(255), span: SourceSpan::new("src/v3/std/algebra.dag", 20564, 20582) }), Behavior::Branch(BranchNode { id: NodeId(184), input: PortId(240), paths: vec![Path { body: NodeId(177), output: PortId(243), pattern: BranchPattern::UnresolvedVariant { name: "LinearCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20293, 20307) }, binding: Some(PayloadBinding { binding_name: "va".to_string(), payload_port: PortId(242) }) }, Path { body: NodeId(178), output: PortId(245), pattern: BranchPattern::UnresolvedVariant { name: "ConstantCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20345, 20360) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(244) }) }, Path { body: NodeId(179), output: PortId(247), pattern: BranchPattern::UnresolvedVariant { name: "PolynomialCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20387, 20404) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(246) }) }, Path { body: NodeId(180), output: PortId(249), pattern: BranchPattern::UnresolvedVariant { name: "LogCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20431, 20441) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(248) }) }, Path { body: NodeId(181), output: PortId(251), pattern: BranchPattern::UnresolvedVariant { name: "SumCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20468, 20478) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(250) }) }, Path { body: NodeId(182), output: PortId(253), pattern: BranchPattern::UnresolvedVariant { name: "ProductCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20505, 20519) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(252) }) }, Path { body: NodeId(183), output: PortId(255), pattern: BranchPattern::UnresolvedVariant { name: "UnknownCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20546, 20560) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(254) }) }], output: PortId(256), span: SourceSpan::new("src/v3/std/algebra.dag", 20279, 20586), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(185), name: "combine_binary_product".to_string(), value: PortId(256), params: vec![PortId(240), PortId(241)], span: SourceSpan::new("src/v3/std/algebra.dag", 20279, 20586), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(186), target: TransformTarget::Callable(DeclarationId(767)), inputs: vec![PortId(257), PortId(260), PortId(258), PortId(259)], output: PortId(261), span: SourceSpan::new("src/v3/std/algebra.dag", 20715, 20751) }), Behavior::Transform(TransformNode { id: NodeId(187), target: TransformTarget::Callable(DeclarationId(769)), inputs: vec![PortId(258), PortId(259)], output: PortId(263), span: SourceSpan::new("src/v3/std/algebra.dag", 20775, 20793) }), Behavior::Transform(TransformNode { id: NodeId(188), target: TransformTarget::Callable(DeclarationId(769)), inputs: vec![PortId(258), PortId(259)], output: PortId(265), span: SourceSpan::new("src/v3/std/algebra.dag", 20819, 20837) }), Behavior::Transform(TransformNode { id: NodeId(189), target: TransformTarget::Callable(DeclarationId(769)), inputs: vec![PortId(258), PortId(259)], output: PortId(267), span: SourceSpan::new("src/v3/std/algebra.dag", 20856, 20874) }), Behavior::Transform(TransformNode { id: NodeId(190), target: TransformTarget::Callable(DeclarationId(769)), inputs: vec![PortId(258), PortId(259)], output: PortId(269), span: SourceSpan::new("src/v3/std/algebra.dag", 20893, 20911) }), Behavior::Transform(TransformNode { id: NodeId(191), target: TransformTarget::Callable(DeclarationId(769)), inputs: vec![PortId(258), PortId(259)], output: PortId(271), span: SourceSpan::new("src/v3/std/algebra.dag", 20934, 20952) }), Behavior::Transform(TransformNode { id: NodeId(192), target: TransformTarget::Callable(DeclarationId(769)), inputs: vec![PortId(258), PortId(259)], output: PortId(273), span: SourceSpan::new("src/v3/std/algebra.dag", 20975, 20993) }), Behavior::Branch(BranchNode { id: NodeId(193), input: PortId(259), paths: vec![Path { body: NodeId(186), output: PortId(261), pattern: BranchPattern::UnresolvedVariant { name: "LinearCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20697, 20711) }, binding: Some(PayloadBinding { binding_name: "vb".to_string(), payload_port: PortId(260) }) }, Path { body: NodeId(187), output: PortId(263), pattern: BranchPattern::UnresolvedVariant { name: "ConstantCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20756, 20771) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(262) }) }, Path { body: NodeId(188), output: PortId(265), pattern: BranchPattern::UnresolvedVariant { name: "PolynomialCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20798, 20815) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(264) }) }, Path { body: NodeId(189), output: PortId(267), pattern: BranchPattern::UnresolvedVariant { name: "LogCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20842, 20852) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(266) }) }, Path { body: NodeId(190), output: PortId(269), pattern: BranchPattern::UnresolvedVariant { name: "SumCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20879, 20889) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(268) }) }, Path { body: NodeId(191), output: PortId(271), pattern: BranchPattern::UnresolvedVariant { name: "ProductCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20916, 20930) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(270) }) }, Path { body: NodeId(192), output: PortId(273), pattern: BranchPattern::UnresolvedVariant { name: "UnknownCost".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 20957, 20971) }, binding: Some(PayloadBinding { binding_name: "_".to_string(), payload_port: PortId(272) }) }], output: PortId(274), span: SourceSpan::new("src/v3/std/algebra.dag", 20683, 20997), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(194), name: "combine_linear_with".to_string(), value: PortId(274), params: vec![PortId(257), PortId(258), PortId(259)], span: SourceSpan::new("src/v3/std/algebra.dag", 20683, 20997), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(195), target: TransformTarget::Callable(DeclarationId(757)), inputs: vec![PortId(275), PortId(276)], output: PortId(279), span: SourceSpan::new("src/v3/std/algebra.dag", 21128, 21154) }), Behavior::Transform(TransformNode { id: NodeId(196), target: TransformTarget::Callable(DeclarationId(768)), inputs: vec![PortId(275)], output: PortId(280), span: SourceSpan::new("src/v3/std/algebra.dag", 21164, 21185) }), Behavior::Transform(TransformNode { id: NodeId(197), target: TransformTarget::Callable(DeclarationId(769)), inputs: vec![PortId(277), PortId(278)], output: PortId(281), span: SourceSpan::new("src/v3/std/algebra.dag", 21197, 21215) }), Behavior::Branch(BranchNode { id: NodeId(198), input: PortId(279), paths: vec![Path { body: NodeId(196), output: PortId(280), pattern: BranchPattern::UnresolvedVariant { name: "True".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 21164, 21185) }, binding: None }, Path { body: NodeId(197), output: PortId(281), pattern: BranchPattern::UnresolvedVariant { name: "False".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 21197, 21215) }, binding: None }], output: PortId(282), span: SourceSpan::new("src/v3/std/algebra.dag", 21125, 21215), emit_participation: None }), Behavior::Bind(BindNode { id: NodeId(199), name: "collapse_linear_square".to_string(), value: PortId(282), params: vec![PortId(275), PortId(276), PortId(277), PortId(278)], span: SourceSpan::new("src/v3/std/algebra.dag", 21125, 21215), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(200), target: TransformTarget::Callable(DeclarationId(747)), inputs: vec![PortId(283), PortId(284)], output: PortId(285), span: SourceSpan::new("src/v3/std/algebra.dag", 21405, 21420) }), Behavior::Transform(TransformNode { id: NodeId(201), target: TransformTarget::Callable(DeclarationId(1619)), inputs: vec![PortId(285)], output: PortId(286), span: SourceSpan::new("src/v3/std/algebra.dag", 21393, 21421) }), Behavior::Bind(BindNode { id: NodeId(202), name: "product_pair".to_string(), value: PortId(286), params: vec![PortId(283), PortId(284)], span: SourceSpan::new("src/v3/std/algebra.dag", 21393, 21421), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(203), target: TransformTarget::FieldProject { field_label: "any".to_string(), field_child: Some(DeclarationId(88)) }, inputs: vec![PortId(287)], output: PortId(289), span: SourceSpan::new("src/v3/std/algebra.dag", 21521, 21524) }), Behavior::Transform(TransformNode { id: NodeId(204), target: TransformTarget::FieldProject { field_label: "pivot".to_string(), field_child: Some(DeclarationId(742)) }, inputs: vec![PortId(287)], output: PortId(290), span: SourceSpan::new("src/v3/std/algebra.dag", 21545, 21550) }), Behavior::Transform(TransformNode { id: NodeId(205), target: TransformTarget::Callable(DeclarationId(756)), inputs: vec![PortId(288), PortId(290)], output: PortId(291), span: SourceSpan::new("src/v3/std/algebra.dag", 21528, 21551) }), Behavior::Transform(TransformNode { id: NodeId(206), target: TransformTarget::Operator(OperatorKind::Logical(LogicalOp::Or)), inputs: vec![PortId(289), PortId(291)], output: PortId(292), span: SourceSpan::new("src/v3/std/algebra.dag", 21517, 21551) }), Behavior::Transform(TransformNode { id: NodeId(207), target: TransformTarget::FieldProject { field_label: "pivot".to_string(), field_child: Some(DeclarationId(742)) }, inputs: vec![PortId(287)], output: PortId(293), span: SourceSpan::new("src/v3/std/algebra.dag", 21565, 21570) }), Behavior::Transform(TransformNode { id: NodeId(208), target: TransformTarget::Callable(DeclarationId(743)), inputs: vec![PortId(292), PortId(293)], output: PortId(294), span: SourceSpan::new("src/v3/std/algebra.dag", 21508, 21572) }), Behavior::Bind(BindNode { id: NodeId(209), name: "fold_or_dominate_scan".to_string(), value: PortId(294), params: vec![PortId(287), PortId(288)], span: SourceSpan::new("src/v3/std/algebra.dag", 21508, 21572), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(210), target: TransformTarget::FieldProject { field_label: "any".to_string(), field_child: Some(DeclarationId(88)) }, inputs: vec![PortId(295)], output: PortId(296), span: SourceSpan::new("src/v3/std/algebra.dag", 21626, 21629) }), Behavior::Bind(BindNode { id: NodeId(211), name: "scan_hit".to_string(), value: PortId(296), params: vec![PortId(295)], span: SourceSpan::new("src/v3/std/algebra.dag", 21621, 21629), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(212), target: TransformTarget::Callable(DeclarationId(1639)), inputs: vec![], output: PortId(299), span: SourceSpan::new("src/v3/std/algebra.dag", 21776, 21783) }), Behavior::Transform(TransformNode { id: NodeId(213), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(300)], output: PortId(301), span: SourceSpan::new("src/v3/std/algebra.dag", 21840, 21844) }), Behavior::Transform(TransformNode { id: NodeId(214), target: TransformTarget::Callable(DeclarationId(756)), inputs: vec![PortId(298), PortId(301)], output: PortId(302), span: SourceSpan::new("src/v3/std/algebra.dag", 21814, 21845) }), Behavior::Transform(TransformNode { id: NodeId(215), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(300)], output: PortId(303), span: SourceSpan::new("src/v3/std/algebra.dag", 21891, 21895) }), Behavior::Transform(TransformNode { id: NodeId(216), target: TransformTarget::Callable(DeclarationId(772)), inputs: vec![PortId(303), PortId(298)], output: PortId(304), span: SourceSpan::new("src/v3/std/algebra.dag", 21859, 21904) }), Behavior::Transform(TransformNode { id: NodeId(217), target: TransformTarget::FieldProject { field_label: "head".to_string(), field_child: None }, inputs: vec![PortId(300)], output: PortId(305), span: SourceSpan::new("src/v3/std/algebra.dag", 21937, 21941) }), Behavior::Transform(TransformNode { id: NodeId(218), target: TransformTarget::FieldProject { field_label: "tail".to_string(), field_child: None }, inputs: vec![PortId(300)], output: PortId(306), span: SourceSpan::new("src/v3/std/algebra.dag", 21975, 21979) }), Behavior::Transform(TransformNode { id: NodeId(219), target: TransformTarget::Callable(DeclarationId(772)), inputs: vec![PortId(306), PortId(298)], output: PortId(307), span: SourceSpan::new("src/v3/std/algebra.dag", 21943, 21988) }), Behavior::Transform(TransformNode { id: NodeId(220), target: TransformTarget::Callable(DeclarationId(1640)), inputs: vec![PortId(305), PortId(307)], output: PortId(308), span: SourceSpan::new("src/v3/std/algebra.dag", 21924, 21989) }), Behavior::Branch(BranchNode { id: NodeId(221), input: PortId(302), paths: vec![Path { body: NodeId(216), output: PortId(304), pattern: BranchPattern::UnresolvedVariant { name: "True".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 21859, 21904) }, binding: None }, Path { body: NodeId(220), output: PortId(308), pattern: BranchPattern::UnresolvedVariant { name: "False".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 21924, 21989) }, binding: None }], output: PortId(309), span: SourceSpan::new("src/v3/std/algebra.dag", 21811, 21989), emit_participation: None }), Behavior::Branch(BranchNode { id: NodeId(222), input: PortId(297), paths: vec![Path { body: NodeId(212), output: PortId(299), pattern: BranchPattern::UnresolvedVariant { name: "Empty".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 21767, 21772) }, binding: None }, Path { body: NodeId(221), output: PortId(309), pattern: BranchPattern::UnresolvedVariant { name: "Cons".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 21788, 21801) }, binding: Some(PayloadBinding { binding_name: "payload".to_string(), payload_port: PortId(300) }) }], output: PortId(310), span: SourceSpan::new("src/v3/std/algebra.dag", 21744, 21993), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Loop(LoopNode { id: NodeId(223), source: PortId(297), init: PortId(297), body: NodeId(222), bound: LoopBound::Cardinality { count: PortId(297) }, output: PortId(311), span: SourceSpan::new("src/v3/std/algebra.dag", 21744, 21993) }), Behavior::Bind(BindNode { id: NodeId(224), name: "filter_not_dominated_by".to_string(), value: PortId(311), params: vec![PortId(297), PortId(298)], span: SourceSpan::new("src/v3/std/algebra.dag", 21744, 21993), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(225), target: TransformTarget::Callable(DeclarationId(744)), inputs: vec![PortId(313)], output: PortId(314), span: SourceSpan::new("src/v3/std/algebra.dag", 22117, 22141) }), Behavior::Transform(TransformNode { id: NodeId(226), target: TransformTarget::Callable(DeclarationId(1642)), inputs: vec![PortId(312), PortId(314)], output: PortId(315), span: SourceSpan::new("src/v3/std/algebra.dag", 22107, 22165) }), Behavior::Transform(TransformNode { id: NodeId(227), target: TransformTarget::Callable(DeclarationId(771)), inputs: vec![PortId(315)], output: PortId(316), span: SourceSpan::new("src/v3/std/algebra.dag", 22098, 22166) }), Behavior::Transform(TransformNode { id: NodeId(228), target: TransformTarget::Callable(DeclarationId(772)), inputs: vec![PortId(312), PortId(313)], output: PortId(317), span: SourceSpan::new("src/v3/std/algebra.dag", 22202, 22236) }), Behavior::Transform(TransformNode { id: NodeId(229), target: TransformTarget::Callable(DeclarationId(1643)), inputs: vec![PortId(313), PortId(317)], output: PortId(318), span: SourceSpan::new("src/v3/std/algebra.dag", 22191, 22237) }), Behavior::Branch(BranchNode { id: NodeId(230), input: PortId(316), paths: vec![Path { body: NodeId(230), output: PortId(312), pattern: BranchPattern::UnresolvedVariant { name: "True".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 22176, 22179) }, binding: None }, Path { body: NodeId(229), output: PortId(318), pattern: BranchPattern::UnresolvedVariant { name: "False".to_string(), span: SourceSpan::new("src/v3/std/algebra.dag", 22191, 22237) }, binding: None }], output: PortId(319), span: SourceSpan::new("src/v3/std/algebra.dag", 22095, 22237), emit_participation: None }), Behavior::Bind(BindNode { id: NodeId(231), name: "drop_dominated_step".to_string(), value: PortId(319), params: vec![PortId(312), PortId(313)], span: SourceSpan::new("src/v3/std/algebra.dag", 22095, 22237), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(232), target: TransformTarget::Callable(DeclarationId(1644)), inputs: vec![], output: PortId(321), span: SourceSpan::new("src/v3/std/algebra.dag", 22508, 22515) }), Behavior::Transform(TransformNode { id: NodeId(233), target: TransformTarget::Callable(DeclarationId(1646)), inputs: vec![PortId(320), PortId(321)], output: PortId(322), span: SourceSpan::new("src/v3/std/algebra.dag", 22496, 22537) }), Behavior::Bind(BindNode { id: NodeId(234), name: "drop_dominated".to_string(), value: PortId(322), params: vec![PortId(320)], span: SourceSpan::new("src/v3/std/algebra.dag", 22496, 22537), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Transform(TransformNode { id: NodeId(235), target: TransformTarget::FieldProject { field_label: "nodes".to_string(), field_child: Some(DeclarationId(1581)) }, inputs: vec![PortId(323)], output: PortId(324), span: SourceSpan::new("src/v3/std/workflows.dag", 1013, 1018) }), Behavior::Bind(BindNode { id: NodeId(236), name: "behavior_spine".to_string(), value: PortId(324), params: vec![PortId(323)], span: SourceSpan::new("src/v3/std/workflows.dag", 1011, 1018), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Value(ValueNode { id: NodeId(237), data: LiteralBits::String("+".to_string()), output: PortId(327), span: SourceSpan::new("src/v3/compiler/operators.dag", 886, 889), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(238), data: LiteralBits::String("-".to_string()), output: PortId(328), span: SourceSpan::new("src/v3/compiler/operators.dag", 905, 908), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(239), data: LiteralBits::String("*".to_string()), output: PortId(329), span: SourceSpan::new("src/v3/compiler/operators.dag", 924, 927), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(240), data: LiteralBits::String("/".to_string()), output: PortId(330), span: SourceSpan::new("src/v3/compiler/operators.dag", 943, 946), lane2_workflow: None }), Behavior::Branch(BranchNode { id: NodeId(241), input: PortId(326), paths: vec![Path { body: NodeId(237), output: PortId(327), pattern: BranchPattern::UnresolvedVariant { name: "Add".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 879, 882) }, binding: None }, Path { body: NodeId(238), output: PortId(328), pattern: BranchPattern::UnresolvedVariant { name: "Sub".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 898, 901) }, binding: None }, Path { body: NodeId(239), output: PortId(329), pattern: BranchPattern::UnresolvedVariant { name: "Mul".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 917, 920) }, binding: None }, Path { body: NodeId(240), output: PortId(330), pattern: BranchPattern::UnresolvedVariant { name: "Div".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 936, 939) }, binding: None }], output: PortId(331), span: SourceSpan::new("src/v3/compiler/operators.dag", 857, 954), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Value(ValueNode { id: NodeId(242), data: LiteralBits::String("==".to_string()), output: PortId(333), span: SourceSpan::new("src/v3/compiler/operators.dag", 1012, 1016), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(243), data: LiteralBits::String("!=".to_string()), output: PortId(334), span: SourceSpan::new("src/v3/compiler/operators.dag", 1031, 1035), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(244), data: LiteralBits::String("<".to_string()), output: PortId(335), span: SourceSpan::new("src/v3/compiler/operators.dag", 1050, 1053), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(245), data: LiteralBits::String("<=".to_string()), output: PortId(336), span: SourceSpan::new("src/v3/compiler/operators.dag", 1068, 1072), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(246), data: LiteralBits::String(">".to_string()), output: PortId(337), span: SourceSpan::new("src/v3/compiler/operators.dag", 1087, 1090), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(247), data: LiteralBits::String(">=".to_string()), output: PortId(338), span: SourceSpan::new("src/v3/compiler/operators.dag", 1105, 1109), lane2_workflow: None }), Behavior::Branch(BranchNode { id: NodeId(248), input: PortId(332), paths: vec![Path { body: NodeId(242), output: PortId(333), pattern: BranchPattern::UnresolvedVariant { name: "Eq".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1006, 1008) }, binding: None }, Path { body: NodeId(243), output: PortId(334), pattern: BranchPattern::UnresolvedVariant { name: "Ne".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1025, 1027) }, binding: None }, Path { body: NodeId(244), output: PortId(335), pattern: BranchPattern::UnresolvedVariant { name: "Lt".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1044, 1046) }, binding: None }, Path { body: NodeId(245), output: PortId(336), pattern: BranchPattern::UnresolvedVariant { name: "Le".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1062, 1064) }, binding: None }, Path { body: NodeId(246), output: PortId(337), pattern: BranchPattern::UnresolvedVariant { name: "Gt".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1081, 1083) }, binding: None }, Path { body: NodeId(247), output: PortId(338), pattern: BranchPattern::UnresolvedVariant { name: "Ge".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1099, 1101) }, binding: None }], output: PortId(339), span: SourceSpan::new("src/v3/compiler/operators.dag", 985, 1117), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Value(ValueNode { id: NodeId(249), data: LiteralBits::String("&&".to_string()), output: PortId(341), span: SourceSpan::new("src/v3/compiler/operators.dag", 1179, 1183), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(250), data: LiteralBits::String("||".to_string()), output: PortId(342), span: SourceSpan::new("src/v3/compiler/operators.dag", 1198, 1202), lane2_workflow: None }), Behavior::Branch(BranchNode { id: NodeId(251), input: PortId(340), paths: vec![Path { body: NodeId(249), output: PortId(341), pattern: BranchPattern::UnresolvedVariant { name: "And".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1172, 1175) }, binding: None }, Path { body: NodeId(250), output: PortId(342), pattern: BranchPattern::UnresolvedVariant { name: "Or".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1192, 1194) }, binding: None }], output: PortId(343), span: SourceSpan::new("src/v3/compiler/operators.dag", 1148, 1210), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Branch(BranchNode { id: NodeId(252), input: PortId(325), paths: vec![Path { body: NodeId(241), output: PortId(331), pattern: BranchPattern::UnresolvedVariant { name: "Arithmetic".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 830, 847) }, binding: Some(PayloadBinding { binding_name: "arith".to_string(), payload_port: PortId(326) }) }, Path { body: NodeId(248), output: PortId(339), pattern: BranchPattern::UnresolvedVariant { name: "Comparison".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 959, 975) }, binding: Some(PayloadBinding { binding_name: "comp".to_string(), payload_port: PortId(332) }) }, Path { body: NodeId(251), output: PortId(343), pattern: BranchPattern::UnresolvedVariant { name: "Logical".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1122, 1138) }, binding: Some(PayloadBinding { binding_name: "logical".to_string(), payload_port: PortId(340) }) }], output: PortId(344), span: SourceSpan::new("src/v3/compiler/operators.dag", 815, 1214), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(253), name: "symbol".to_string(), value: PortId(344), params: vec![PortId(325)], span: SourceSpan::new("src/v3/compiler/operators.dag", 815, 1214), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) }), Behavior::Value(ValueNode { id: NodeId(254), data: LiteralBits::String("add".to_string()), output: PortId(347), span: SourceSpan::new("src/v3/compiler/operators.dag", 1341, 1346), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(255), data: LiteralBits::String("sub".to_string()), output: PortId(348), span: SourceSpan::new("src/v3/compiler/operators.dag", 1362, 1367), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(256), data: LiteralBits::String("mul".to_string()), output: PortId(349), span: SourceSpan::new("src/v3/compiler/operators.dag", 1383, 1388), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(257), data: LiteralBits::String("div".to_string()), output: PortId(350), span: SourceSpan::new("src/v3/compiler/operators.dag", 1404, 1409), lane2_workflow: None }), Behavior::Branch(BranchNode { id: NodeId(258), input: PortId(346), paths: vec![Path { body: NodeId(254), output: PortId(347), pattern: BranchPattern::UnresolvedVariant { name: "Add".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1334, 1337) }, binding: None }, Path { body: NodeId(255), output: PortId(348), pattern: BranchPattern::UnresolvedVariant { name: "Sub".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1355, 1358) }, binding: None }, Path { body: NodeId(256), output: PortId(349), pattern: BranchPattern::UnresolvedVariant { name: "Mul".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1376, 1379) }, binding: None }, Path { body: NodeId(257), output: PortId(350), pattern: BranchPattern::UnresolvedVariant { name: "Div".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1397, 1400) }, binding: None }], output: PortId(351), span: SourceSpan::new("src/v3/compiler/operators.dag", 1312, 1417), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Value(ValueNode { id: NodeId(259), data: LiteralBits::String("eq".to_string()), output: PortId(353), span: SourceSpan::new("src/v3/compiler/operators.dag", 1475, 1479), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(260), data: LiteralBits::String("ne".to_string()), output: PortId(354), span: SourceSpan::new("src/v3/compiler/operators.dag", 1494, 1498), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(261), data: LiteralBits::String("lt".to_string()), output: PortId(355), span: SourceSpan::new("src/v3/compiler/operators.dag", 1513, 1517), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(262), data: LiteralBits::String("le".to_string()), output: PortId(356), span: SourceSpan::new("src/v3/compiler/operators.dag", 1532, 1536), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(263), data: LiteralBits::String("gt".to_string()), output: PortId(357), span: SourceSpan::new("src/v3/compiler/operators.dag", 1551, 1555), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(264), data: LiteralBits::String("ge".to_string()), output: PortId(358), span: SourceSpan::new("src/v3/compiler/operators.dag", 1570, 1574), lane2_workflow: None }), Behavior::Branch(BranchNode { id: NodeId(265), input: PortId(352), paths: vec![Path { body: NodeId(259), output: PortId(353), pattern: BranchPattern::UnresolvedVariant { name: "Eq".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1469, 1471) }, binding: None }, Path { body: NodeId(260), output: PortId(354), pattern: BranchPattern::UnresolvedVariant { name: "Ne".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1488, 1490) }, binding: None }, Path { body: NodeId(261), output: PortId(355), pattern: BranchPattern::UnresolvedVariant { name: "Lt".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1507, 1509) }, binding: None }, Path { body: NodeId(262), output: PortId(356), pattern: BranchPattern::UnresolvedVariant { name: "Le".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1526, 1528) }, binding: None }, Path { body: NodeId(263), output: PortId(357), pattern: BranchPattern::UnresolvedVariant { name: "Gt".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1545, 1547) }, binding: None }, Path { body: NodeId(264), output: PortId(358), pattern: BranchPattern::UnresolvedVariant { name: "Ge".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1564, 1566) }, binding: None }], output: PortId(359), span: SourceSpan::new("src/v3/compiler/operators.dag", 1448, 1582), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Value(ValueNode { id: NodeId(266), data: LiteralBits::String("meet".to_string()), output: PortId(361), span: SourceSpan::new("src/v3/compiler/operators.dag", 1978, 1984), lane2_workflow: None }), Behavior::Value(ValueNode { id: NodeId(267), data: LiteralBits::String("join".to_string()), output: PortId(362), span: SourceSpan::new("src/v3/compiler/operators.dag", 1999, 2005), lane2_workflow: None }), Behavior::Branch(BranchNode { id: NodeId(268), input: PortId(360), paths: vec![Path { body: NodeId(266), output: PortId(361), pattern: BranchPattern::UnresolvedVariant { name: "And".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1971, 1974) }, binding: None }, Path { body: NodeId(267), output: PortId(362), pattern: BranchPattern::UnresolvedVariant { name: "Or".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1993, 1995) }, binding: None }], output: PortId(363), span: SourceSpan::new("src/v3/compiler/operators.dag", 1947, 2013), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Branch(BranchNode { id: NodeId(269), input: PortId(345), paths: vec![Path { body: NodeId(258), output: PortId(351), pattern: BranchPattern::UnresolvedVariant { name: "Arithmetic".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1285, 1302) }, binding: Some(PayloadBinding { binding_name: "arith".to_string(), payload_port: PortId(346) }) }, Path { body: NodeId(265), output: PortId(359), pattern: BranchPattern::UnresolvedVariant { name: "Comparison".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1422, 1438) }, binding: Some(PayloadBinding { binding_name: "comp".to_string(), payload_port: PortId(352) }) }, Path { body: NodeId(268), output: PortId(363), pattern: BranchPattern::UnresolvedVariant { name: "Logical".to_string(), span: SourceSpan::new("src/v3/compiler/operators.dag", 1921, 1937) }, binding: Some(PayloadBinding { binding_name: "logical".to_string(), payload_port: PortId(360) }) }], output: PortId(364), span: SourceSpan::new("src/v3/compiler/operators.dag", 1270, 2017), emit_participation: Some(BranchEmitParticipation::UserMatch) }), Behavior::Bind(BindNode { id: NodeId(270), name: "algebra_field_name".to_string(), value: PortId(364), params: vec![PortId(345)], span: SourceSpan::new("src/v3/compiler/operators.dag", 1270, 2017), lane2_workflow: None, emit_participation: Some(BindEmitParticipation::UserCallable) })], declarations: vec![ - Declaration { id: DeclarationId(0), name: Some("Classical".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "True".to_string(), ty: DeclarationId(266) }, Field { label: "False".to_string(), ty: DeclarationId(267) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/logic.dag", 287, 316) }, + Declaration { id: DeclarationId(0), name: Some("Classical".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "True".to_string(), ty: DeclarationId(264) }, Field { label: "False".to_string(), ty: DeclarationId(265) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/logic.dag", 287, 316) }, Declaration { id: DeclarationId(1), name: Some("classical_not".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(0)], output: DeclarationId(0), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/logic.dag", 362, 429)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/logic.dag", 318, 429) }, Declaration { id: DeclarationId(2), name: Some("classical_and".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(0), DeclarationId(0)], output: DeclarationId(0), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/logic.dag", 489, 553)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/logic.dag", 431, 553) }, Declaration { id: DeclarationId(3), name: Some("classical_or".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(0), DeclarationId(0)], output: DeclarationId(0), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/logic.dag", 612, 675)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/logic.dag", 555, 675) }, Declaration { id: DeclarationId(4), name: Some("Bit".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(0), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 897, 917) }, - Declaration { id: DeclarationId(5), name: Some("Nibble".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "bits".to_string(), ty: DeclarationId(268) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1003, 1034) }, - Declaration { id: DeclarationId(6), name: Some("Byte".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "bits".to_string(), ty: DeclarationId(269) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1118, 1147) }, - Declaration { id: DeclarationId(7), name: Some("Word16".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "bytes".to_string(), ty: DeclarationId(270) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1251, 1284) }, - Declaration { id: DeclarationId(8), name: Some("Word32".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "bytes".to_string(), ty: DeclarationId(271) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1285, 1318) }, - Declaration { id: DeclarationId(9), name: Some("Word64".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "bytes".to_string(), ty: DeclarationId(272) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1319, 1352) }, - Declaration { id: DeclarationId(10), name: Some("Word128".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "bytes".to_string(), ty: DeclarationId(273) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1353, 1387) }, - Declaration { id: DeclarationId(11), name: Some("Result".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Ok".to_string(), ty: DeclarationId(274) }, Field { label: "Err".to_string(), ty: DeclarationId(275) }] }, type_params: vec![DeclarationId(12), DeclarationId(13)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/error_primitives.dag", 597, 657) }, + Declaration { id: DeclarationId(5), name: Some("Nibble".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "bits".to_string(), ty: DeclarationId(266) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1003, 1034) }, + Declaration { id: DeclarationId(6), name: Some("Byte".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "bits".to_string(), ty: DeclarationId(267) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1118, 1147) }, + Declaration { id: DeclarationId(7), name: Some("Word16".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "bytes".to_string(), ty: DeclarationId(268) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1251, 1284) }, + Declaration { id: DeclarationId(8), name: Some("Word32".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "bytes".to_string(), ty: DeclarationId(269) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1285, 1318) }, + Declaration { id: DeclarationId(9), name: Some("Word64".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "bytes".to_string(), ty: DeclarationId(270) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1319, 1352) }, + Declaration { id: DeclarationId(10), name: Some("Word128".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "bytes".to_string(), ty: DeclarationId(271) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1353, 1387) }, + Declaration { id: DeclarationId(11), name: Some("Result".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Ok".to_string(), ty: DeclarationId(272) }, Field { label: "Err".to_string(), ty: DeclarationId(273) }] }, type_params: vec![DeclarationId(12), DeclarationId(13)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/error_primitives.dag", 597, 657) }, Declaration { id: DeclarationId(12), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("ok".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/error_primitives.dag", 597, 657) }, Declaration { id: DeclarationId(13), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("err".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/error_primitives.dag", 597, 657) }, - Declaration { id: DeclarationId(14), name: Some("DivError".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "DivideByZero".to_string(), ty: DeclarationId(276) }, Field { label: "Overflow".to_string(), ty: DeclarationId(277) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/error_primitives.dag", 920, 959) }, - Declaration { id: DeclarationId(15), name: Some("Magma".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "op".to_string(), ty: DeclarationId(287) }] }, type_params: vec![DeclarationId(16)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 4563, 4600) }, - Declaration { id: DeclarationId(16), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 4563, 4600) }, - Declaration { id: DeclarationId(17), name: Some("Semigroup".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "op".to_string(), ty: DeclarationId(288) }] }, type_params: vec![DeclarationId(18)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 4678, 4800) }, - Declaration { id: DeclarationId(18), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 4678, 4800) }, - Declaration { id: DeclarationId(19), name: Some("Monoid".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "op".to_string(), ty: DeclarationId(289) }, Field { label: "identity".to_string(), ty: DeclarationId(20) }] }, type_params: vec![DeclarationId(20)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 4898, 4950) }, - Declaration { id: DeclarationId(20), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 4898, 4950) }, - Declaration { id: DeclarationId(21), name: Some("CommutativeMonoid".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "op".to_string(), ty: DeclarationId(290) }, Field { label: "identity".to_string(), ty: DeclarationId(22) }] }, type_params: vec![DeclarationId(22)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5009, 5100) }, - Declaration { id: DeclarationId(22), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5009, 5100) }, - Declaration { id: DeclarationId(23), name: Some("Group".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "op".to_string(), ty: DeclarationId(291) }, Field { label: "identity".to_string(), ty: DeclarationId(24) }, Field { label: "inverse".to_string(), ty: DeclarationId(292) }] }, type_params: vec![DeclarationId(24)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5172, 5245) }, - Declaration { id: DeclarationId(24), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5172, 5245) }, - Declaration { id: DeclarationId(25), name: Some("AbelianGroup".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "op".to_string(), ty: DeclarationId(293) }, Field { label: "identity".to_string(), ty: DeclarationId(26) }, Field { label: "inverse".to_string(), ty: DeclarationId(294) }] }, type_params: vec![DeclarationId(26)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5283, 5391) }, - Declaration { id: DeclarationId(26), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5283, 5391) }, - Declaration { id: DeclarationId(27), name: Some("Semiring".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "add".to_string(), ty: DeclarationId(295) }, Field { label: "zero".to_string(), ty: DeclarationId(28) }, Field { label: "mul".to_string(), ty: DeclarationId(296) }, Field { label: "one".to_string(), ty: DeclarationId(28) }] }, type_params: vec![DeclarationId(28)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5825, 5906) }, - Declaration { id: DeclarationId(28), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5825, 5906) }, - Declaration { id: DeclarationId(29), name: Some("Ring".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "add".to_string(), ty: DeclarationId(297) }, Field { label: "zero".to_string(), ty: DeclarationId(30) }, Field { label: "negate".to_string(), ty: DeclarationId(298) }, Field { label: "mul".to_string(), ty: DeclarationId(299) }, Field { label: "one".to_string(), ty: DeclarationId(30) }] }, type_params: vec![DeclarationId(30)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6033, 6131) }, - Declaration { id: DeclarationId(30), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6033, 6131) }, - Declaration { id: DeclarationId(31), name: Some("OrderedRing".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "add".to_string(), ty: DeclarationId(300) }, Field { label: "sub".to_string(), ty: DeclarationId(301) }, Field { label: "zero".to_string(), ty: DeclarationId(32) }, Field { label: "negate".to_string(), ty: DeclarationId(302) }, Field { label: "mul".to_string(), ty: DeclarationId(303) }, Field { label: "div".to_string(), ty: DeclarationId(305) }, Field { label: "one".to_string(), ty: DeclarationId(32) }, Field { label: "compare".to_string(), ty: DeclarationId(306) }, Field { label: "quotient".to_string(), ty: DeclarationId(307) }, Field { label: "remainder".to_string(), ty: DeclarationId(308) }, Field { label: "eq".to_string(), ty: DeclarationId(309) }, Field { label: "ne".to_string(), ty: DeclarationId(310) }, Field { label: "lt".to_string(), ty: DeclarationId(311) }, Field { label: "le".to_string(), ty: DeclarationId(312) }, Field { label: "gt".to_string(), ty: DeclarationId(313) }, Field { label: "ge".to_string(), ty: DeclarationId(314) }] }, type_params: vec![DeclarationId(32)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6854, 7242) }, - Declaration { id: DeclarationId(32), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6854, 7242) }, - Declaration { id: DeclarationId(33), name: Some("Field".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "add".to_string(), ty: DeclarationId(315) }, Field { label: "zero".to_string(), ty: DeclarationId(34) }, Field { label: "negate".to_string(), ty: DeclarationId(316) }, Field { label: "mul".to_string(), ty: DeclarationId(317) }, Field { label: "one".to_string(), ty: DeclarationId(34) }, Field { label: "reciprocal".to_string(), ty: DeclarationId(318) }, Field { label: "compare".to_string(), ty: DeclarationId(319) }] }, type_params: vec![DeclarationId(34)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7380, 7536) }, - Declaration { id: DeclarationId(34), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7380, 7536) }, - Declaration { id: DeclarationId(35), name: Some("Lattice".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "meet".to_string(), ty: DeclarationId(320) }, Field { label: "join".to_string(), ty: DeclarationId(321) }] }, type_params: vec![DeclarationId(36)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7856, 7919) }, - Declaration { id: DeclarationId(36), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7856, 7919) }, - Declaration { id: DeclarationId(37), name: Some("BoundedLattice".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "meet".to_string(), ty: DeclarationId(322) }, Field { label: "join".to_string(), ty: DeclarationId(323) }, Field { label: "top".to_string(), ty: DeclarationId(38) }, Field { label: "bottom".to_string(), ty: DeclarationId(38) }] }, type_params: vec![DeclarationId(38)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 8027, 8118) }, - Declaration { id: DeclarationId(38), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 8027, 8118) }, - Declaration { id: DeclarationId(39), name: Some("BooleanAlgebra".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "meet".to_string(), ty: DeclarationId(324) }, Field { label: "join".to_string(), ty: DeclarationId(325) }, Field { label: "complement".to_string(), ty: DeclarationId(326) }, Field { label: "top".to_string(), ty: DeclarationId(40) }, Field { label: "bottom".to_string(), ty: DeclarationId(40) }] }, type_params: vec![DeclarationId(40)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 8316, 8432) }, - Declaration { id: DeclarationId(40), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 8316, 8432) }, - Declaration { id: DeclarationId(41), name: Some("FreeMonoid".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "concat".to_string(), ty: DeclarationId(330) }, Field { label: "empty".to_string(), ty: DeclarationId(331) }, Field { label: "append".to_string(), ty: DeclarationId(333) }, Field { label: "index".to_string(), ty: DeclarationId(334) }, Field { label: "slice".to_string(), ty: DeclarationId(336) }, Field { label: "length".to_string(), ty: DeclarationId(337) }, Field { label: "count".to_string(), ty: DeclarationId(338) }, Field { label: "first".to_string(), ty: DeclarationId(340) }, Field { label: "last".to_string(), ty: DeclarationId(342) }, Field { label: "map".to_string(), ty: DeclarationId(345) }, Field { label: "filter".to_string(), ty: DeclarationId(348) }, Field { label: "fold".to_string(), ty: DeclarationId(350) }, Field { label: "flat_map".to_string(), ty: DeclarationId(354) }, Field { label: "any".to_string(), ty: DeclarationId(356) }, Field { label: "all".to_string(), ty: DeclarationId(358) }, Field { label: "enumerate".to_string(), ty: DeclarationId(362) }, Field { label: "reverse".to_string(), ty: DeclarationId(364) }, Field { label: "skip".to_string(), ty: DeclarationId(366) }, Field { label: "take".to_string(), ty: DeclarationId(368) }, Field { label: "sort_by".to_string(), ty: DeclarationId(371) }, Field { label: "contains".to_string(), ty: DeclarationId(372) }] }, type_params: vec![DeclarationId(42)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12204, 13158) }, - Declaration { id: DeclarationId(42), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12204, 13158) }, - Declaration { id: DeclarationId(43), name: Some("PartialFunction".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "lookup".to_string(), ty: DeclarationId(374) }, Field { label: "empty".to_string(), ty: DeclarationId(375) }, Field { label: "get".to_string(), ty: DeclarationId(377) }, Field { label: "insert".to_string(), ty: DeclarationId(379) }, Field { label: "merge".to_string(), ty: DeclarationId(382) }, Field { label: "keys".to_string(), ty: DeclarationId(384) }, Field { label: "values".to_string(), ty: DeclarationId(386) }, Field { label: "has".to_string(), ty: DeclarationId(387) }, Field { label: "contains_key".to_string(), ty: DeclarationId(388) }, Field { label: "size".to_string(), ty: DeclarationId(389) }] }, type_params: vec![DeclarationId(44), DeclarationId(45)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13673, 14012) }, - Declaration { id: DeclarationId(44), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("K".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13673, 14012) }, - Declaration { id: DeclarationId(45), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("V".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13673, 14012) }, - Declaration { id: DeclarationId(46), name: Some("Ordering".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Less".to_string(), ty: DeclarationId(390) }, Field { label: "Equal".to_string(), ty: DeclarationId(391) }, Field { label: "Greater".to_string(), ty: DeclarationId(392) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 14213, 14251) }, - Declaration { id: DeclarationId(47), name: Some("AlgebraProfile".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "OrderedRingProfile".to_string(), ty: DeclarationId(393) }, Field { label: "ApproximateFieldProfile".to_string(), ty: DeclarationId(394) }, Field { label: "BooleanAlgebraProfile".to_string(), ty: DeclarationId(395) }, Field { label: "BooleanAlgebraCollectionProfile".to_string(), ty: DeclarationId(396) }, Field { label: "FreeMonoidScalarProfile".to_string(), ty: DeclarationId(397) }, Field { label: "FreeMonoidCollectionProfile".to_string(), ty: DeclarationId(398) }, Field { label: "PartialFunctionProfile".to_string(), ty: DeclarationId(399) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16153, 16372) }, - Declaration { id: DeclarationId(48), name: Some("ContainerSource".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "SameAsReceiver".to_string(), ty: DeclarationId(400) }, Field { label: "Named".to_string(), ty: DeclarationId(401) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16374, 16440) }, - Declaration { id: DeclarationId(49), name: Some("AlgebraTypeTemplate".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ReceiverSelf".to_string(), ty: DeclarationId(402) }, Field { label: "ReceiverElement".to_string(), ty: DeclarationId(403) }, Field { label: "ReceiverKey".to_string(), ty: DeclarationId(404) }, Field { label: "ReceiverValue".to_string(), ty: DeclarationId(405) }, Field { label: "NamedTemplate".to_string(), ty: DeclarationId(406) }, Field { label: "ContainerOf".to_string(), ty: DeclarationId(407) }, Field { label: "OptionalOf".to_string(), ty: DeclarationId(408) }, Field { label: "TupleOf".to_string(), ty: DeclarationId(409) }, Field { label: "CallableOf".to_string(), ty: DeclarationId(411) }, Field { label: "AlgebraTypeVariable".to_string(), ty: DeclarationId(412) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16442, 16890) }, - Declaration { id: DeclarationId(50), name: Some("CollectionSizeEffect".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ShrinkEffect".to_string(), ty: DeclarationId(413) }, Field { label: "ProjectionEffect".to_string(), ty: DeclarationId(414) }, Field { label: "IdentityEffect".to_string(), ty: DeclarationId(415) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 17106, 17283) }, - Declaration { id: DeclarationId(51), name: Some("CostShape".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ShapeConstant".to_string(), ty: DeclarationId(416) }, Field { label: "ShapeLinearScan".to_string(), ty: DeclarationId(417) }, Field { label: "ShapeIterateBody".to_string(), ty: DeclarationId(418) }, Field { label: "ShapeSortBody".to_string(), ty: DeclarationId(419) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 17741, 17926) }, - Declaration { id: DeclarationId(52), name: Some("AlgebraFieldTemplate".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "param_types".to_string(), ty: DeclarationId(420) }, Field { label: "return_type".to_string(), ty: DeclarationId(49) }, Field { label: "size_effect".to_string(), ty: DeclarationId(421) }, Field { label: "cost_shape".to_string(), ty: DeclarationId(422) }, Field { label: "callback_element_position".to_string(), ty: DeclarationId(423) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 17951, 18382) }, - Declaration { id: DeclarationId(53), name: Some("kernel_algebra_profile".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(47) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(424)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Map(FieldMap::from_entries(vec![("Int".to_string(), FieldValue::Variant { constructor: DeclarationId(393), payload: vec![] }), ("Float".to_string(), FieldValue::Variant { constructor: DeclarationId(394), payload: vec![] }), ("Bool".to_string(), FieldValue::Variant { constructor: DeclarationId(395), payload: vec![] }), ("String".to_string(), FieldValue::Variant { constructor: DeclarationId(397), payload: vec![] }), ("List".to_string(), FieldValue::Variant { constructor: DeclarationId(398), payload: vec![] }), ("Set".to_string(), FieldValue::Variant { constructor: DeclarationId(396), payload: vec![] }), ("Map".to_string(), FieldValue::Variant { constructor: DeclarationId(399), payload: vec![] })]).expect("ValueBody::Map"))), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 18384, 18694) }, - Declaration { id: DeclarationId(54), name: Some("ordered_ring_templates".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(278), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 18754, 20229)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 18696, 20229) }, - Declaration { id: DeclarationId(55), name: Some("approximate_field_templates".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(279), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 20294, 21388)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 20231, 21388) }, - Declaration { id: DeclarationId(56), name: Some("boolean_algebra_templates".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(280), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 21451, 22212)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 21390, 22212) }, - Declaration { id: DeclarationId(57), name: Some("boolean_algebra_collection_templates".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(281), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 22577, 25922)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 22505, 25922) }, - Declaration { id: DeclarationId(58), name: Some("free_monoid_scalar_templates".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(282), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 25988, 29055)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 25924, 29055) }, - Declaration { id: DeclarationId(59), name: Some("free_monoid_collection_templates".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(283), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 29125, 34193)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 29057, 34193) }, - Declaration { id: DeclarationId(60), name: Some("partial_function_templates".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(284), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 34257, 37081)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 34195, 37081) }, - Declaration { id: DeclarationId(61), name: Some("algebra_templates_for_profile".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(47)], output: DeclarationId(285), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 37171, 37634)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 37083, 37634) }, - Declaration { id: DeclarationId(62), name: Some("algebra_type_param_names".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(47)], output: DeclarationId(286), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 37976, 38257)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 37907, 38257) }, + Declaration { id: DeclarationId(14), name: Some("DivError".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "DivideByZero".to_string(), ty: DeclarationId(274) }, Field { label: "Overflow".to_string(), ty: DeclarationId(275) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/error_primitives.dag", 920, 959) }, + Declaration { id: DeclarationId(15), name: Some("Magma".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "op".to_string(), ty: DeclarationId(285) }] }, type_params: vec![DeclarationId(16)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 4623, 4660) }, + Declaration { id: DeclarationId(16), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 4623, 4660) }, + Declaration { id: DeclarationId(17), name: Some("Semigroup".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "op".to_string(), ty: DeclarationId(286) }] }, type_params: vec![DeclarationId(18)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 4738, 4860) }, + Declaration { id: DeclarationId(18), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 4738, 4860) }, + Declaration { id: DeclarationId(19), name: Some("Monoid".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "op".to_string(), ty: DeclarationId(287) }, Field { label: "identity".to_string(), ty: DeclarationId(20) }] }, type_params: vec![DeclarationId(20)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 4958, 5010) }, + Declaration { id: DeclarationId(20), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 4958, 5010) }, + Declaration { id: DeclarationId(21), name: Some("CommutativeMonoid".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "op".to_string(), ty: DeclarationId(288) }, Field { label: "identity".to_string(), ty: DeclarationId(22) }] }, type_params: vec![DeclarationId(22)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5069, 5160) }, + Declaration { id: DeclarationId(22), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5069, 5160) }, + Declaration { id: DeclarationId(23), name: Some("Group".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "op".to_string(), ty: DeclarationId(289) }, Field { label: "identity".to_string(), ty: DeclarationId(24) }, Field { label: "inverse".to_string(), ty: DeclarationId(290) }] }, type_params: vec![DeclarationId(24)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5232, 5305) }, + Declaration { id: DeclarationId(24), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5232, 5305) }, + Declaration { id: DeclarationId(25), name: Some("AbelianGroup".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "op".to_string(), ty: DeclarationId(291) }, Field { label: "identity".to_string(), ty: DeclarationId(26) }, Field { label: "inverse".to_string(), ty: DeclarationId(292) }] }, type_params: vec![DeclarationId(26)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5343, 5451) }, + Declaration { id: DeclarationId(26), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5343, 5451) }, + Declaration { id: DeclarationId(27), name: Some("Semiring".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "add".to_string(), ty: DeclarationId(293) }, Field { label: "zero".to_string(), ty: DeclarationId(28) }, Field { label: "mul".to_string(), ty: DeclarationId(294) }, Field { label: "one".to_string(), ty: DeclarationId(28) }] }, type_params: vec![DeclarationId(28)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5885, 5966) }, + Declaration { id: DeclarationId(28), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5885, 5966) }, + Declaration { id: DeclarationId(29), name: Some("Ring".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "add".to_string(), ty: DeclarationId(295) }, Field { label: "zero".to_string(), ty: DeclarationId(30) }, Field { label: "negate".to_string(), ty: DeclarationId(296) }, Field { label: "mul".to_string(), ty: DeclarationId(297) }, Field { label: "one".to_string(), ty: DeclarationId(30) }] }, type_params: vec![DeclarationId(30)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6093, 6191) }, + Declaration { id: DeclarationId(30), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6093, 6191) }, + Declaration { id: DeclarationId(31), name: Some("OrderedRing".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "add".to_string(), ty: DeclarationId(298) }, Field { label: "sub".to_string(), ty: DeclarationId(299) }, Field { label: "zero".to_string(), ty: DeclarationId(32) }, Field { label: "negate".to_string(), ty: DeclarationId(300) }, Field { label: "mul".to_string(), ty: DeclarationId(301) }, Field { label: "div".to_string(), ty: DeclarationId(303) }, Field { label: "one".to_string(), ty: DeclarationId(32) }, Field { label: "compare".to_string(), ty: DeclarationId(304) }, Field { label: "eq".to_string(), ty: DeclarationId(305) }, Field { label: "ne".to_string(), ty: DeclarationId(306) }, Field { label: "lt".to_string(), ty: DeclarationId(307) }, Field { label: "le".to_string(), ty: DeclarationId(308) }, Field { label: "gt".to_string(), ty: DeclarationId(309) }, Field { label: "ge".to_string(), ty: DeclarationId(310) }] }, type_params: vec![DeclarationId(32)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6952, 7287) }, + Declaration { id: DeclarationId(32), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6952, 7287) }, + Declaration { id: DeclarationId(33), name: Some("Field".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "add".to_string(), ty: DeclarationId(311) }, Field { label: "zero".to_string(), ty: DeclarationId(34) }, Field { label: "negate".to_string(), ty: DeclarationId(312) }, Field { label: "mul".to_string(), ty: DeclarationId(313) }, Field { label: "one".to_string(), ty: DeclarationId(34) }, Field { label: "reciprocal".to_string(), ty: DeclarationId(314) }, Field { label: "compare".to_string(), ty: DeclarationId(315) }] }, type_params: vec![DeclarationId(34)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7425, 7581) }, + Declaration { id: DeclarationId(34), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7425, 7581) }, + Declaration { id: DeclarationId(35), name: Some("Lattice".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "meet".to_string(), ty: DeclarationId(316) }, Field { label: "join".to_string(), ty: DeclarationId(317) }] }, type_params: vec![DeclarationId(36)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7901, 7964) }, + Declaration { id: DeclarationId(36), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7901, 7964) }, + Declaration { id: DeclarationId(37), name: Some("BoundedLattice".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "meet".to_string(), ty: DeclarationId(318) }, Field { label: "join".to_string(), ty: DeclarationId(319) }, Field { label: "top".to_string(), ty: DeclarationId(38) }, Field { label: "bottom".to_string(), ty: DeclarationId(38) }] }, type_params: vec![DeclarationId(38)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 8072, 8163) }, + Declaration { id: DeclarationId(38), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 8072, 8163) }, + Declaration { id: DeclarationId(39), name: Some("BooleanAlgebra".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "meet".to_string(), ty: DeclarationId(320) }, Field { label: "join".to_string(), ty: DeclarationId(321) }, Field { label: "complement".to_string(), ty: DeclarationId(322) }, Field { label: "top".to_string(), ty: DeclarationId(40) }, Field { label: "bottom".to_string(), ty: DeclarationId(40) }] }, type_params: vec![DeclarationId(40)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 8361, 8477) }, + Declaration { id: DeclarationId(40), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 8361, 8477) }, + Declaration { id: DeclarationId(41), name: Some("FreeMonoid".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "concat".to_string(), ty: DeclarationId(326) }, Field { label: "empty".to_string(), ty: DeclarationId(327) }, Field { label: "append".to_string(), ty: DeclarationId(329) }, Field { label: "slice".to_string(), ty: DeclarationId(331) }, Field { label: "length".to_string(), ty: DeclarationId(332) }, Field { label: "count".to_string(), ty: DeclarationId(333) }, Field { label: "first".to_string(), ty: DeclarationId(335) }, Field { label: "last".to_string(), ty: DeclarationId(337) }, Field { label: "map".to_string(), ty: DeclarationId(340) }, Field { label: "filter".to_string(), ty: DeclarationId(343) }, Field { label: "fold".to_string(), ty: DeclarationId(345) }, Field { label: "flat_map".to_string(), ty: DeclarationId(349) }, Field { label: "any".to_string(), ty: DeclarationId(351) }, Field { label: "all".to_string(), ty: DeclarationId(353) }, Field { label: "enumerate".to_string(), ty: DeclarationId(357) }, Field { label: "reverse".to_string(), ty: DeclarationId(359) }, Field { label: "skip".to_string(), ty: DeclarationId(361) }, Field { label: "take".to_string(), ty: DeclarationId(363) }, Field { label: "sort_by".to_string(), ty: DeclarationId(366) }, Field { label: "contains".to_string(), ty: DeclarationId(367) }] }, type_params: vec![DeclarationId(42)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12349, 13286) }, + Declaration { id: DeclarationId(42), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12349, 13286) }, + Declaration { id: DeclarationId(43), name: Some("PartialFunction".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "lookup".to_string(), ty: DeclarationId(369) }, Field { label: "empty".to_string(), ty: DeclarationId(370) }, Field { label: "get".to_string(), ty: DeclarationId(372) }, Field { label: "insert".to_string(), ty: DeclarationId(374) }, Field { label: "merge".to_string(), ty: DeclarationId(377) }, Field { label: "keys".to_string(), ty: DeclarationId(379) }, Field { label: "values".to_string(), ty: DeclarationId(381) }, Field { label: "has".to_string(), ty: DeclarationId(382) }, Field { label: "contains_key".to_string(), ty: DeclarationId(383) }, Field { label: "size".to_string(), ty: DeclarationId(384) }] }, type_params: vec![DeclarationId(44), DeclarationId(45)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13801, 14140) }, + Declaration { id: DeclarationId(44), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("K".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13801, 14140) }, + Declaration { id: DeclarationId(45), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("V".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13801, 14140) }, + Declaration { id: DeclarationId(46), name: Some("Ordering".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Less".to_string(), ty: DeclarationId(385) }, Field { label: "Equal".to_string(), ty: DeclarationId(386) }, Field { label: "Greater".to_string(), ty: DeclarationId(387) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 14341, 14379) }, + Declaration { id: DeclarationId(47), name: Some("AlgebraProfile".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "OrderedRingProfile".to_string(), ty: DeclarationId(388) }, Field { label: "ApproximateFieldProfile".to_string(), ty: DeclarationId(389) }, Field { label: "BooleanAlgebraProfile".to_string(), ty: DeclarationId(390) }, Field { label: "BooleanAlgebraCollectionProfile".to_string(), ty: DeclarationId(391) }, Field { label: "FreeMonoidScalarProfile".to_string(), ty: DeclarationId(392) }, Field { label: "FreeMonoidCollectionProfile".to_string(), ty: DeclarationId(393) }, Field { label: "PartialFunctionProfile".to_string(), ty: DeclarationId(394) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16281, 16500) }, + Declaration { id: DeclarationId(48), name: Some("ContainerSource".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "SameAsReceiver".to_string(), ty: DeclarationId(395) }, Field { label: "Named".to_string(), ty: DeclarationId(396) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16502, 16568) }, + Declaration { id: DeclarationId(49), name: Some("AlgebraTypeTemplate".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ReceiverSelf".to_string(), ty: DeclarationId(397) }, Field { label: "ReceiverElement".to_string(), ty: DeclarationId(398) }, Field { label: "ReceiverKey".to_string(), ty: DeclarationId(399) }, Field { label: "ReceiverValue".to_string(), ty: DeclarationId(400) }, Field { label: "NamedTemplate".to_string(), ty: DeclarationId(401) }, Field { label: "ContainerOf".to_string(), ty: DeclarationId(402) }, Field { label: "OptionalOf".to_string(), ty: DeclarationId(403) }, Field { label: "TupleOf".to_string(), ty: DeclarationId(404) }, Field { label: "CallableOf".to_string(), ty: DeclarationId(406) }, Field { label: "AlgebraTypeVariable".to_string(), ty: DeclarationId(407) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16570, 17018) }, + Declaration { id: DeclarationId(50), name: Some("CollectionSizeEffect".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ShrinkEffect".to_string(), ty: DeclarationId(408) }, Field { label: "ProjectionEffect".to_string(), ty: DeclarationId(409) }, Field { label: "IdentityEffect".to_string(), ty: DeclarationId(410) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 17234, 17411) }, + Declaration { id: DeclarationId(51), name: Some("CostShape".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ShapeConstant".to_string(), ty: DeclarationId(411) }, Field { label: "ShapeLinearScan".to_string(), ty: DeclarationId(412) }, Field { label: "ShapeIterateBody".to_string(), ty: DeclarationId(413) }, Field { label: "ShapeSortBody".to_string(), ty: DeclarationId(414) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 17869, 18054) }, + Declaration { id: DeclarationId(52), name: Some("AlgebraFieldTemplate".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "param_types".to_string(), ty: DeclarationId(415) }, Field { label: "return_type".to_string(), ty: DeclarationId(49) }, Field { label: "size_effect".to_string(), ty: DeclarationId(416) }, Field { label: "cost_shape".to_string(), ty: DeclarationId(417) }, Field { label: "callback_element_position".to_string(), ty: DeclarationId(418) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 18079, 18510) }, + Declaration { id: DeclarationId(53), name: Some("kernel_algebra_profile".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(47) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(419)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Map(FieldMap::from_entries(vec![("Int".to_string(), FieldValue::Variant { constructor: DeclarationId(388), payload: vec![] }), ("Float".to_string(), FieldValue::Variant { constructor: DeclarationId(389), payload: vec![] }), ("Bool".to_string(), FieldValue::Variant { constructor: DeclarationId(390), payload: vec![] }), ("String".to_string(), FieldValue::Variant { constructor: DeclarationId(392), payload: vec![] }), ("List".to_string(), FieldValue::Variant { constructor: DeclarationId(393), payload: vec![] }), ("Set".to_string(), FieldValue::Variant { constructor: DeclarationId(391), payload: vec![] }), ("Map".to_string(), FieldValue::Variant { constructor: DeclarationId(394), payload: vec![] })]).expect("ValueBody::Map"))), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 18512, 18822) }, + Declaration { id: DeclarationId(54), name: Some("ordered_ring_templates".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(276), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 18882, 20024)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 18824, 20024) }, + Declaration { id: DeclarationId(55), name: Some("approximate_field_templates".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(277), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 20089, 21183)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 20026, 21183) }, + Declaration { id: DeclarationId(56), name: Some("boolean_algebra_templates".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(278), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 21246, 22007)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 21185, 22007) }, + Declaration { id: DeclarationId(57), name: Some("boolean_algebra_collection_templates".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(279), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 22372, 25717)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 22300, 25717) }, + Declaration { id: DeclarationId(58), name: Some("free_monoid_scalar_templates".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(280), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 25783, 28850)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 25719, 28850) }, + Declaration { id: DeclarationId(59), name: Some("free_monoid_collection_templates".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(281), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 28920, 33988)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 28852, 33988) }, + Declaration { id: DeclarationId(60), name: Some("partial_function_templates".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(282), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 34052, 36876)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 33990, 36876) }, + Declaration { id: DeclarationId(61), name: Some("algebra_templates_for_profile".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(47)], output: DeclarationId(283), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 36966, 37429)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 36878, 37429) }, + Declaration { id: DeclarationId(62), name: Some("algebra_type_param_names".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(47)], output: DeclarationId(284), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 37771, 38052)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 37702, 38052) }, Declaration { id: DeclarationId(63), name: Some("Int8".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(31), arguments: vec![TemplateArgument { parameter: DeclarationId(32), value: DeclarationId(6) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/integer.dag", 1265, 1294) }, Declaration { id: DeclarationId(64), name: Some("Int16".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(31), arguments: vec![TemplateArgument { parameter: DeclarationId(32), value: DeclarationId(7) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/integer.dag", 1295, 1327) }, Declaration { id: DeclarationId(65), name: Some("Int32".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(31), arguments: vec![TemplateArgument { parameter: DeclarationId(32), value: DeclarationId(8) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/integer.dag", 1328, 1360) }, @@ -81,19 +81,19 @@ pub(crate) fn bootstrapped_fixture_without_parse_surface_dag() -> Dag { Declaration { id: DeclarationId(73), name: Some("Float32".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(33), arguments: vec![TemplateArgument { parameter: DeclarationId(34), value: DeclarationId(8) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/float.dag", 489, 517) }, Declaration { id: DeclarationId(74), name: Some("Float64".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(33), arguments: vec![TemplateArgument { parameter: DeclarationId(34), value: DeclarationId(9) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/float.dag", 518, 546) }, Declaration { id: DeclarationId(75), name: Some("Float".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(74), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/float.dag", 565, 585) }, - Declaration { id: DeclarationId(76), name: Some("kernel_type_set".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(538)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Map(FieldMap::from_entries(vec![("String".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("Int".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("Bool".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("Float".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("Secret".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("Json".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("Unit".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("Bytes".to_string(), FieldValue::Literal(LiteralBits::Bool(true)))]).expect("ValueBody::Map"))), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 3041, 3206) }, + Declaration { id: DeclarationId(76), name: Some("kernel_type_set".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(533)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Map(FieldMap::from_entries(vec![("String".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("Int".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("Bool".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("Float".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("Secret".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("Json".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("Unit".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("Bytes".to_string(), FieldValue::Literal(LiteralBits::Bool(true)))]).expect("ValueBody::Map"))), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 3041, 3206) }, Declaration { id: DeclarationId(77), name: Some("is_kernel_type".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/types.dag", 3248, 3344)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 3208, 3344) }, - Declaration { id: DeclarationId(78), name: Some("container_type_arity".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(539)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Map(FieldMap::from_entries(vec![("List".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("Set".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("Map".to_string(), FieldValue::Literal(LiteralBits::Int(2)))]).expect("ValueBody::Map"))), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 3506, 3587) }, + Declaration { id: DeclarationId(78), name: Some("container_type_arity".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(534)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Map(FieldMap::from_entries(vec![("List".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("Set".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("Map".to_string(), FieldValue::Literal(LiteralBits::Int(2)))]).expect("ValueBody::Map"))), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 3506, 3587) }, Declaration { id: DeclarationId(79), name: Some("is_container_type".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/types.dag", 3632, 3734)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 3589, 3734) }, - Declaration { id: DeclarationId(80), name: Some("container_expected_arity".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(425), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/types.dag", 3786, 3827)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 3736, 3827) }, - Declaration { id: DeclarationId(81), name: Some("container_param_names_for".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(426), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/types.dag", 4067, 4204)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 4003, 4204) }, - Declaration { id: DeclarationId(82), name: Some("container_param_name".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(71)], output: DeclarationId(427), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/types.dag", 4272, 4512)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 4206, 4512) }, - Declaration { id: DeclarationId(83), name: Some("ordered_element_collections".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(540)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Map(FieldMap::from_entries(vec![("List".to_string(), FieldValue::Literal(LiteralBits::Bool(true)))]).expect("ValueBody::Map"))), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 4706, 4778) }, + Declaration { id: DeclarationId(80), name: Some("container_expected_arity".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(420), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/types.dag", 3786, 3827)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 3736, 3827) }, + Declaration { id: DeclarationId(81), name: Some("container_param_names_for".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(421), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/types.dag", 4067, 4204)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 4003, 4204) }, + Declaration { id: DeclarationId(82), name: Some("container_param_name".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(71)], output: DeclarationId(422), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/types.dag", 4272, 4512)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 4206, 4512) }, + Declaration { id: DeclarationId(83), name: Some("ordered_element_collections".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(535)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Map(FieldMap::from_entries(vec![("List".to_string(), FieldValue::Literal(LiteralBits::Bool(true)))]).expect("ValueBody::Map"))), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 4706, 4778) }, Declaration { id: DeclarationId(84), name: Some("is_ordered_element_collection".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/types.dag", 4835, 4892)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 4780, 4892) }, - Declaration { id: DeclarationId(85), name: Some("container_template_algebra_rows".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(541)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Map(FieldMap::from_entries(vec![("List".to_string(), FieldValue::Literal(LiteralBits::String("FreeMonoid".to_string()))), ("list".to_string(), FieldValue::Literal(LiteralBits::String("FreeMonoid".to_string()))), ("Set".to_string(), FieldValue::Literal(LiteralBits::String("BooleanAlgebra".to_string()))), ("set".to_string(), FieldValue::Literal(LiteralBits::String("BooleanAlgebra".to_string()))), ("Map".to_string(), FieldValue::Literal(LiteralBits::String("PartialFunction".to_string()))), ("map".to_string(), FieldValue::Literal(LiteralBits::String("PartialFunction".to_string()))), ("FreeMonoid".to_string(), FieldValue::Literal(LiteralBits::String("FreeMonoid".to_string()))), ("free_monoid".to_string(), FieldValue::Literal(LiteralBits::String("FreeMonoid".to_string()))), ("BooleanAlgebra".to_string(), FieldValue::Literal(LiteralBits::String("BooleanAlgebra".to_string()))), ("boolean_algebra".to_string(), FieldValue::Literal(LiteralBits::String("BooleanAlgebra".to_string()))), ("PartialFunction".to_string(), FieldValue::Literal(LiteralBits::String("PartialFunction".to_string()))), ("partial_function".to_string(), FieldValue::Literal(LiteralBits::String("PartialFunction".to_string())))]).expect("ValueBody::Map"))), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 5684, 6123) }, - Declaration { id: DeclarationId(86), name: Some("container_template_algebra".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(428), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/types.dag", 6180, 6232)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 6125, 6232) }, - Declaration { id: DeclarationId(87), name: Some("canonical_container_names".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(429), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/types.dag", 6521, 6600)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 6474, 6600) }, - Declaration { id: DeclarationId(88), name: Some("Bool".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "True".to_string(), ty: DeclarationId(430) }, Field { label: "False".to_string(), ty: DeclarationId(431) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: Some(DeclarationId(593)), value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 7546, 7570) }, + Declaration { id: DeclarationId(85), name: Some("container_template_algebra_rows".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(536)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Map(FieldMap::from_entries(vec![("List".to_string(), FieldValue::Literal(LiteralBits::String("FreeMonoid".to_string()))), ("list".to_string(), FieldValue::Literal(LiteralBits::String("FreeMonoid".to_string()))), ("Set".to_string(), FieldValue::Literal(LiteralBits::String("BooleanAlgebra".to_string()))), ("set".to_string(), FieldValue::Literal(LiteralBits::String("BooleanAlgebra".to_string()))), ("Map".to_string(), FieldValue::Literal(LiteralBits::String("PartialFunction".to_string()))), ("map".to_string(), FieldValue::Literal(LiteralBits::String("PartialFunction".to_string()))), ("FreeMonoid".to_string(), FieldValue::Literal(LiteralBits::String("FreeMonoid".to_string()))), ("free_monoid".to_string(), FieldValue::Literal(LiteralBits::String("FreeMonoid".to_string()))), ("BooleanAlgebra".to_string(), FieldValue::Literal(LiteralBits::String("BooleanAlgebra".to_string()))), ("boolean_algebra".to_string(), FieldValue::Literal(LiteralBits::String("BooleanAlgebra".to_string()))), ("PartialFunction".to_string(), FieldValue::Literal(LiteralBits::String("PartialFunction".to_string()))), ("partial_function".to_string(), FieldValue::Literal(LiteralBits::String("PartialFunction".to_string())))]).expect("ValueBody::Map"))), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 5684, 6123) }, + Declaration { id: DeclarationId(86), name: Some("container_template_algebra".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(423), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/types.dag", 6180, 6232)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 6125, 6232) }, + Declaration { id: DeclarationId(87), name: Some("canonical_container_names".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(424), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/types.dag", 6521, 6600)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 6474, 6600) }, + Declaration { id: DeclarationId(88), name: Some("Bool".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "True".to_string(), ty: DeclarationId(425) }, Field { label: "False".to_string(), ty: DeclarationId(426) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: Some(DeclarationId(588)), value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 7546, 7570) }, Declaration { id: DeclarationId(89), name: Some("Unit".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 7638, 7647) }, Declaration { id: DeclarationId(90), name: Some("Json".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 7764, 7773) }, Declaration { id: DeclarationId(91), name: Some("Bytes".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 7774, 7784) }, @@ -105,69 +105,69 @@ pub(crate) fn bootstrapped_fixture_without_parse_surface_dag() -> Dag { Declaration { id: DeclarationId(97), name: Some("Map".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(43), arguments: vec![TemplateArgument { parameter: DeclarationId(44), value: DeclarationId(98) }, TemplateArgument { parameter: DeclarationId(45), value: DeclarationId(99) }] }, type_params: vec![DeclarationId(98), DeclarationId(99)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 9339, 9389) }, Declaration { id: DeclarationId(98), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("key".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 9339, 9389) }, Declaration { id: DeclarationId(99), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("value".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 9339, 9389) }, - Declaration { id: DeclarationId(100), name: Some("CommitSha".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(542)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10147, 10207) }, - Declaration { id: DeclarationId(101), name: Some("Sha256".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(543)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10208, 10268) }, - Declaration { id: DeclarationId(102), name: Some("RetryCount".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(71))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(544)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10269, 10320) }, - Declaration { id: DeclarationId(103), name: Some("HttpStatus".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(71))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(545)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10321, 10376) }, - Declaration { id: DeclarationId(104), name: Some("Email".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(546)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10377, 10442) }, - Declaration { id: DeclarationId(105), name: Some("Port".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(71))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(547)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10443, 10498) }, - Declaration { id: DeclarationId(106), name: Some("GistId".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(548)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10499, 10544) }, + Declaration { id: DeclarationId(100), name: Some("CommitSha".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(537)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10147, 10207) }, + Declaration { id: DeclarationId(101), name: Some("Sha256".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(538)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10208, 10268) }, + Declaration { id: DeclarationId(102), name: Some("RetryCount".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(71))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(539)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10269, 10320) }, + Declaration { id: DeclarationId(103), name: Some("HttpStatus".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(71))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(540)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10321, 10376) }, + Declaration { id: DeclarationId(104), name: Some("Email".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(541)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10377, 10442) }, + Declaration { id: DeclarationId(105), name: Some("Port".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(71))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(542)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10443, 10498) }, + Declaration { id: DeclarationId(106), name: Some("GistId".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(543)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10499, 10544) }, Declaration { id: DeclarationId(107), name: Some("Secret".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(186), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: Some(NominalOpacity { permitted_accessors: vec![] }), span: SourceSpan::new("dsl/std/types.dag", 10545, 10586) }, - Declaration { id: DeclarationId(108), name: Some("SecretValue".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(107))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(549)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10587, 10629) }, - Declaration { id: DeclarationId(109), name: Some("Url".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(550)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10630, 10684) }, - Declaration { id: DeclarationId(110), name: Some("SemVer".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(551)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10685, 10748) }, - Declaration { id: DeclarationId(111), name: Some("NonEmptyStr".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(552)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10749, 10794) }, - Declaration { id: DeclarationId(112), name: Some("LanguageId".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(553)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10795, 10840) }, - Declaration { id: DeclarationId(113), name: Some("SecretName".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(554)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10841, 10886) }, - Declaration { id: DeclarationId(114), name: Some("PositiveInt".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(71))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(555)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10887, 10933) }, - Declaration { id: DeclarationId(115), name: Some("NonNegativeInt".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(71))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(556)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10934, 10980) }, - Declaration { id: DeclarationId(116), name: Some("PathSegment".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(557)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11151, 11210) }, - Declaration { id: DeclarationId(117), name: Some("GlobSegment".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(558)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11211, 11270) }, - Declaration { id: DeclarationId(118), name: Some("FilePathParts".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "segments".to_string(), ty: DeclarationId(432) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11271, 11323) }, - Declaration { id: DeclarationId(119), name: Some("GlobPattern".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "segments".to_string(), ty: DeclarationId(433) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11324, 11374) }, - Declaration { id: DeclarationId(120), name: Some("FilePath".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(559)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11375, 11418) }, + Declaration { id: DeclarationId(108), name: Some("SecretValue".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(107))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(544)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10587, 10629) }, + Declaration { id: DeclarationId(109), name: Some("Url".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(545)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10630, 10684) }, + Declaration { id: DeclarationId(110), name: Some("SemVer".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(546)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10685, 10748) }, + Declaration { id: DeclarationId(111), name: Some("NonEmptyStr".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(547)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10749, 10794) }, + Declaration { id: DeclarationId(112), name: Some("LanguageId".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(548)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10795, 10840) }, + Declaration { id: DeclarationId(113), name: Some("SecretName".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(549)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10841, 10886) }, + Declaration { id: DeclarationId(114), name: Some("PositiveInt".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(71))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(550)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10887, 10933) }, + Declaration { id: DeclarationId(115), name: Some("NonNegativeInt".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(71))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(551)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10934, 10980) }, + Declaration { id: DeclarationId(116), name: Some("PathSegment".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(552)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11151, 11210) }, + Declaration { id: DeclarationId(117), name: Some("GlobSegment".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(553)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11211, 11270) }, + Declaration { id: DeclarationId(118), name: Some("FilePathParts".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "segments".to_string(), ty: DeclarationId(427) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11271, 11323) }, + Declaration { id: DeclarationId(119), name: Some("GlobPattern".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "segments".to_string(), ty: DeclarationId(428) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11324, 11374) }, + Declaration { id: DeclarationId(120), name: Some("FilePath".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(554)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11375, 11418) }, Declaration { id: DeclarationId(121), name: Some("SourceSpan".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "file".to_string(), ty: DeclarationId(120) }, Field { label: "start".to_string(), ty: DeclarationId(71) }, Field { label: "end".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12036, 12096) }, - Declaration { id: DeclarationId(122), name: Some("Timestamp".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(560)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12098, 12196) }, - Declaration { id: DeclarationId(123), name: Some("EpochMs".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(71))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(561)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12197, 12241) }, - Declaration { id: DeclarationId(124), name: Some("Duration".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(71))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(562)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12242, 12286) }, - Declaration { id: DeclarationId(125), name: Some("Milliseconds".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(71))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(563)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12287, 12354) }, - Declaration { id: DeclarationId(126), name: Some("Seconds".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(71))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(564)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12355, 12417) }, - Declaration { id: DeclarationId(127), name: Some("IntentId".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(565)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12941, 12996) }, - Declaration { id: DeclarationId(128), name: Some("IssueId".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(566)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12997, 13051) }, - Declaration { id: DeclarationId(129), name: Some("RunKey".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(567)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13052, 13105) }, - Declaration { id: DeclarationId(130), name: Some("ArtifactId".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(568)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13106, 13163) }, - Declaration { id: DeclarationId(131), name: Some("LeaseToken".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(569)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13164, 13221) }, - Declaration { id: DeclarationId(132), name: Some("WorkerId".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(570)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13222, 13277) }, - Declaration { id: DeclarationId(133), name: Some("CommentId".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(571)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13278, 13334) }, - Declaration { id: DeclarationId(134), name: Some("SignalKey".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(572)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13335, 13391) }, - Declaration { id: DeclarationId(135), name: Some("ContentHash".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(573)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13392, 13450) }, - Declaration { id: DeclarationId(136), name: Some("GitRef".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(574)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13530, 13572) }, - Declaration { id: DeclarationId(137), name: Some("GcpProjectId".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(575)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13779, 13864) }, - Declaration { id: DeclarationId(138), name: Some("ServiceAccountEmail".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(576)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13865, 13974) }, - Declaration { id: DeclarationId(139), name: Some("Platform".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Linux".to_string(), ty: DeclarationId(434) }, Field { label: "Macos".to_string(), ty: DeclarationId(435) }, Field { label: "Windows".to_string(), ty: DeclarationId(436) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14360, 14403) }, - Declaration { id: DeclarationId(140), name: Some("TopologyNodeKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Pure".to_string(), ty: DeclarationId(437) }, Field { label: "Transport".to_string(), ty: DeclarationId(438) }, Field { label: "SubDag".to_string(), ty: DeclarationId(439) }, Field { label: "Env".to_string(), ty: DeclarationId(440) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14531, 14586) }, - Declaration { id: DeclarationId(141), name: Some("DocSourceKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Template".to_string(), ty: DeclarationId(441) }, Field { label: "Generated".to_string(), ty: DeclarationId(442) }, Field { label: "Static".to_string(), ty: DeclarationId(443) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14587, 14640) }, - Declaration { id: DeclarationId(142), name: Some("FermiDepth".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Xs".to_string(), ty: DeclarationId(444) }, Field { label: "S".to_string(), ty: DeclarationId(445) }, Field { label: "M".to_string(), ty: DeclarationId(446) }, Field { label: "L".to_string(), ty: DeclarationId(447) }, Field { label: "Xl".to_string(), ty: DeclarationId(448) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14642, 14679) }, - Declaration { id: DeclarationId(143), name: Some("CredentialFlow".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Stored".to_string(), ty: DeclarationId(449) }, Field { label: "PlatformInjected".to_string(), ty: DeclarationId(450) }, Field { label: "WorkloadIdentity".to_string(), ty: DeclarationId(453) }, Field { label: "InteractiveAuth".to_string(), ty: DeclarationId(455) }, Field { label: "Chained".to_string(), ty: DeclarationId(457) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14927, 15249) }, - Declaration { id: DeclarationId(144), name: Some("Arch".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "X86_64".to_string(), ty: DeclarationId(458) }, Field { label: "X86".to_string(), ty: DeclarationId(459) }, Field { label: "Aarch64".to_string(), ty: DeclarationId(460) }, Field { label: "Arm".to_string(), ty: DeclarationId(461) }, Field { label: "Armv7".to_string(), ty: DeclarationId(462) }, Field { label: "Mips".to_string(), ty: DeclarationId(463) }, Field { label: "Mipsel".to_string(), ty: DeclarationId(464) }, Field { label: "Mips64".to_string(), ty: DeclarationId(465) }, Field { label: "Mips64el".to_string(), ty: DeclarationId(466) }, Field { label: "Riscv64".to_string(), ty: DeclarationId(467) }, Field { label: "Wasm32".to_string(), ty: DeclarationId(468) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15324, 15427) }, - Declaration { id: DeclarationId(145), name: Some("Vendor".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "UnknownVendor".to_string(), ty: DeclarationId(469) }, Field { label: "Pc".to_string(), ty: DeclarationId(470) }, Field { label: "Apple".to_string(), ty: DeclarationId(471) }, Field { label: "W64".to_string(), ty: DeclarationId(472) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15428, 15474) }, - Declaration { id: DeclarationId(146), name: Some("Os".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Linux".to_string(), ty: DeclarationId(473) }, Field { label: "Macos".to_string(), ty: DeclarationId(474) }, Field { label: "Windows".to_string(), ty: DeclarationId(475) }, Field { label: "Freebsd".to_string(), ty: DeclarationId(476) }, Field { label: "Android".to_string(), ty: DeclarationId(477) }, Field { label: "Ios".to_string(), ty: DeclarationId(478) }, Field { label: "Wasi".to_string(), ty: DeclarationId(479) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15475, 15541) }, - Declaration { id: DeclarationId(147), name: Some("AbiEnv".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "NoneAbi".to_string(), ty: DeclarationId(480) }, Field { label: "Gnu".to_string(), ty: DeclarationId(481) }, Field { label: "GnuEabi".to_string(), ty: DeclarationId(482) }, Field { label: "GnuEabihf".to_string(), ty: DeclarationId(483) }, Field { label: "Musl".to_string(), ty: DeclarationId(484) }, Field { label: "Msvc".to_string(), ty: DeclarationId(485) }, Field { label: "AndroidAbi".to_string(), ty: DeclarationId(486) }, Field { label: "Eabi".to_string(), ty: DeclarationId(487) }, Field { label: "Eabihf".to_string(), ty: DeclarationId(488) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15542, 15634) }, - Declaration { id: DeclarationId(148), name: Some("ExecutionEnv".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Native".to_string(), ty: DeclarationId(489) }, Field { label: "Wsl".to_string(), ty: DeclarationId(490) }, Field { label: "Container".to_string(), ty: DeclarationId(491) }, Field { label: "Ci".to_string(), ty: DeclarationId(492) }, Field { label: "Emulator".to_string(), ty: DeclarationId(493) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15635, 15695) }, - Declaration { id: DeclarationId(149), name: Some("TargetTriple".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "arch".to_string(), ty: DeclarationId(144) }, Field { label: "vendor".to_string(), ty: DeclarationId(145) }, Field { label: "os".to_string(), ty: DeclarationId(146) }, Field { label: "env".to_string(), ty: DeclarationId(494) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15697, 15772) }, + Declaration { id: DeclarationId(122), name: Some("Timestamp".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(555)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12098, 12196) }, + Declaration { id: DeclarationId(123), name: Some("EpochMs".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(71))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(556)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12197, 12241) }, + Declaration { id: DeclarationId(124), name: Some("Duration".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(71))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(557)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12242, 12286) }, + Declaration { id: DeclarationId(125), name: Some("Milliseconds".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(71))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(558)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12287, 12354) }, + Declaration { id: DeclarationId(126), name: Some("Seconds".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(71))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(559)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12355, 12417) }, + Declaration { id: DeclarationId(127), name: Some("IntentId".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(560)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12941, 12996) }, + Declaration { id: DeclarationId(128), name: Some("IssueId".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(561)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12997, 13051) }, + Declaration { id: DeclarationId(129), name: Some("RunKey".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(562)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13052, 13105) }, + Declaration { id: DeclarationId(130), name: Some("ArtifactId".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(563)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13106, 13163) }, + Declaration { id: DeclarationId(131), name: Some("LeaseToken".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(564)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13164, 13221) }, + Declaration { id: DeclarationId(132), name: Some("WorkerId".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(565)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13222, 13277) }, + Declaration { id: DeclarationId(133), name: Some("CommentId".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(566)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13278, 13334) }, + Declaration { id: DeclarationId(134), name: Some("SignalKey".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(567)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13335, 13391) }, + Declaration { id: DeclarationId(135), name: Some("ContentHash".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(111))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(568)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13392, 13450) }, + Declaration { id: DeclarationId(136), name: Some("GitRef".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(569)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13530, 13572) }, + Declaration { id: DeclarationId(137), name: Some("GcpProjectId".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(570)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13779, 13864) }, + Declaration { id: DeclarationId(138), name: Some("ServiceAccountEmail".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(571)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13865, 13974) }, + Declaration { id: DeclarationId(139), name: Some("Platform".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Linux".to_string(), ty: DeclarationId(429) }, Field { label: "Macos".to_string(), ty: DeclarationId(430) }, Field { label: "Windows".to_string(), ty: DeclarationId(431) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14360, 14403) }, + Declaration { id: DeclarationId(140), name: Some("TopologyNodeKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Pure".to_string(), ty: DeclarationId(432) }, Field { label: "Transport".to_string(), ty: DeclarationId(433) }, Field { label: "SubDag".to_string(), ty: DeclarationId(434) }, Field { label: "Env".to_string(), ty: DeclarationId(435) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14531, 14586) }, + Declaration { id: DeclarationId(141), name: Some("DocSourceKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Template".to_string(), ty: DeclarationId(436) }, Field { label: "Generated".to_string(), ty: DeclarationId(437) }, Field { label: "Static".to_string(), ty: DeclarationId(438) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14587, 14640) }, + Declaration { id: DeclarationId(142), name: Some("FermiDepth".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Xs".to_string(), ty: DeclarationId(439) }, Field { label: "S".to_string(), ty: DeclarationId(440) }, Field { label: "M".to_string(), ty: DeclarationId(441) }, Field { label: "L".to_string(), ty: DeclarationId(442) }, Field { label: "Xl".to_string(), ty: DeclarationId(443) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14642, 14679) }, + Declaration { id: DeclarationId(143), name: Some("CredentialFlow".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Stored".to_string(), ty: DeclarationId(444) }, Field { label: "PlatformInjected".to_string(), ty: DeclarationId(445) }, Field { label: "WorkloadIdentity".to_string(), ty: DeclarationId(448) }, Field { label: "InteractiveAuth".to_string(), ty: DeclarationId(450) }, Field { label: "Chained".to_string(), ty: DeclarationId(452) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14927, 15249) }, + Declaration { id: DeclarationId(144), name: Some("Arch".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "X86_64".to_string(), ty: DeclarationId(453) }, Field { label: "X86".to_string(), ty: DeclarationId(454) }, Field { label: "Aarch64".to_string(), ty: DeclarationId(455) }, Field { label: "Arm".to_string(), ty: DeclarationId(456) }, Field { label: "Armv7".to_string(), ty: DeclarationId(457) }, Field { label: "Mips".to_string(), ty: DeclarationId(458) }, Field { label: "Mipsel".to_string(), ty: DeclarationId(459) }, Field { label: "Mips64".to_string(), ty: DeclarationId(460) }, Field { label: "Mips64el".to_string(), ty: DeclarationId(461) }, Field { label: "Riscv64".to_string(), ty: DeclarationId(462) }, Field { label: "Wasm32".to_string(), ty: DeclarationId(463) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15324, 15427) }, + Declaration { id: DeclarationId(145), name: Some("Vendor".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "UnknownVendor".to_string(), ty: DeclarationId(464) }, Field { label: "Pc".to_string(), ty: DeclarationId(465) }, Field { label: "Apple".to_string(), ty: DeclarationId(466) }, Field { label: "W64".to_string(), ty: DeclarationId(467) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15428, 15474) }, + Declaration { id: DeclarationId(146), name: Some("Os".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Linux".to_string(), ty: DeclarationId(468) }, Field { label: "Macos".to_string(), ty: DeclarationId(469) }, Field { label: "Windows".to_string(), ty: DeclarationId(470) }, Field { label: "Freebsd".to_string(), ty: DeclarationId(471) }, Field { label: "Android".to_string(), ty: DeclarationId(472) }, Field { label: "Ios".to_string(), ty: DeclarationId(473) }, Field { label: "Wasi".to_string(), ty: DeclarationId(474) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15475, 15541) }, + Declaration { id: DeclarationId(147), name: Some("AbiEnv".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "NoneAbi".to_string(), ty: DeclarationId(475) }, Field { label: "Gnu".to_string(), ty: DeclarationId(476) }, Field { label: "GnuEabi".to_string(), ty: DeclarationId(477) }, Field { label: "GnuEabihf".to_string(), ty: DeclarationId(478) }, Field { label: "Musl".to_string(), ty: DeclarationId(479) }, Field { label: "Msvc".to_string(), ty: DeclarationId(480) }, Field { label: "AndroidAbi".to_string(), ty: DeclarationId(481) }, Field { label: "Eabi".to_string(), ty: DeclarationId(482) }, Field { label: "Eabihf".to_string(), ty: DeclarationId(483) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15542, 15634) }, + Declaration { id: DeclarationId(148), name: Some("ExecutionEnv".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Native".to_string(), ty: DeclarationId(484) }, Field { label: "Wsl".to_string(), ty: DeclarationId(485) }, Field { label: "Container".to_string(), ty: DeclarationId(486) }, Field { label: "Ci".to_string(), ty: DeclarationId(487) }, Field { label: "Emulator".to_string(), ty: DeclarationId(488) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15635, 15695) }, + Declaration { id: DeclarationId(149), name: Some("TargetTriple".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "arch".to_string(), ty: DeclarationId(144) }, Field { label: "vendor".to_string(), ty: DeclarationId(145) }, Field { label: "os".to_string(), ty: DeclarationId(146) }, Field { label: "env".to_string(), ty: DeclarationId(489) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15697, 15772) }, Declaration { id: DeclarationId(150), name: Some("RuntimePlatform".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "host".to_string(), ty: DeclarationId(149) }, Field { label: "env".to_string(), ty: DeclarationId(148) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15774, 15839) }, - Declaration { id: DeclarationId(151), name: Some("EntryKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "RegularFile".to_string(), ty: DeclarationId(495) }, Field { label: "Directory".to_string(), ty: DeclarationId(496) }, Field { label: "Symlink".to_string(), ty: DeclarationId(497) }, Field { label: "Missing".to_string(), ty: DeclarationId(498) }, Field { label: "Other".to_string(), ty: DeclarationId(499) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16148, 16226) }, - Declaration { id: DeclarationId(152), name: Some("SymlinkTarget".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "TargetFile".to_string(), ty: DeclarationId(500) }, Field { label: "TargetDir".to_string(), ty: DeclarationId(501) }, Field { label: "Broken".to_string(), ty: DeclarationId(502) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16356, 16414) }, - Declaration { id: DeclarationId(153), name: Some("TextFilePath".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(120))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(577)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 17397, 17447) }, - Declaration { id: DeclarationId(154), name: Some("BinaryFilePath".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(120))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(578)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 17448, 17500) }, - Declaration { id: DeclarationId(155), name: Some("MimeType".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(579)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 17641, 17702) }, - Declaration { id: DeclarationId(156), name: Some("HttpMethod".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "GET".to_string(), ty: DeclarationId(503) }, Field { label: "POST".to_string(), ty: DeclarationId(504) }, Field { label: "PUT".to_string(), ty: DeclarationId(505) }, Field { label: "PATCH".to_string(), ty: DeclarationId(506) }, Field { label: "DELETE".to_string(), ty: DeclarationId(507) }, Field { label: "HEAD".to_string(), ty: DeclarationId(508) }, Field { label: "OPTIONS".to_string(), ty: DeclarationId(509) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 18446, 18514) }, - Declaration { id: DeclarationId(157), name: Some("AuthScheme".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Bearer".to_string(), ty: DeclarationId(510) }, Field { label: "Header".to_string(), ty: DeclarationId(511) }, Field { label: "Basic".to_string(), ty: DeclarationId(512) }, Field { label: "ApiKey".to_string(), ty: DeclarationId(513) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 18982, 19078) }, - Declaration { id: DeclarationId(158), name: Some("AccessToken".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "token".to_string(), ty: DeclarationId(107) }, Field { label: "scheme".to_string(), ty: DeclarationId(157) }, Field { label: "expires_at".to_string(), ty: DeclarationId(514) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19200, 19333) }, - Declaration { id: DeclarationId(159), name: Some("Credential".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "token".to_string(), ty: DeclarationId(107) }, Field { label: "scheme".to_string(), ty: DeclarationId(157) }, Field { label: "header_name".to_string(), ty: DeclarationId(515) }, Field { label: "source_id".to_string(), ty: DeclarationId(186) }, Field { label: "required_scopes".to_string(), ty: DeclarationId(516) }, Field { label: "expires_in".to_string(), ty: DeclarationId(517) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19335, 19485) }, - Declaration { id: DeclarationId(160), name: Some("FilesystemHandle".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(120))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(580)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19562, 19626) }, - Declaration { id: DeclarationId(161), name: Some("NetworkHandle".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(89))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(581)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19627, 19684) }, - Declaration { id: DeclarationId(162), name: Some("ToolHandle".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(582)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19685, 19741) }, + Declaration { id: DeclarationId(151), name: Some("EntryKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "RegularFile".to_string(), ty: DeclarationId(490) }, Field { label: "Directory".to_string(), ty: DeclarationId(491) }, Field { label: "Symlink".to_string(), ty: DeclarationId(492) }, Field { label: "Missing".to_string(), ty: DeclarationId(493) }, Field { label: "Other".to_string(), ty: DeclarationId(494) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16148, 16226) }, + Declaration { id: DeclarationId(152), name: Some("SymlinkTarget".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "TargetFile".to_string(), ty: DeclarationId(495) }, Field { label: "TargetDir".to_string(), ty: DeclarationId(496) }, Field { label: "Broken".to_string(), ty: DeclarationId(497) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16356, 16414) }, + Declaration { id: DeclarationId(153), name: Some("TextFilePath".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(120))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(572)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 17397, 17447) }, + Declaration { id: DeclarationId(154), name: Some("BinaryFilePath".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(120))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(573)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 17448, 17500) }, + Declaration { id: DeclarationId(155), name: Some("MimeType".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(574)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 17641, 17702) }, + Declaration { id: DeclarationId(156), name: Some("HttpMethod".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "GET".to_string(), ty: DeclarationId(498) }, Field { label: "POST".to_string(), ty: DeclarationId(499) }, Field { label: "PUT".to_string(), ty: DeclarationId(500) }, Field { label: "PATCH".to_string(), ty: DeclarationId(501) }, Field { label: "DELETE".to_string(), ty: DeclarationId(502) }, Field { label: "HEAD".to_string(), ty: DeclarationId(503) }, Field { label: "OPTIONS".to_string(), ty: DeclarationId(504) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 18446, 18514) }, + Declaration { id: DeclarationId(157), name: Some("AuthScheme".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Bearer".to_string(), ty: DeclarationId(505) }, Field { label: "Header".to_string(), ty: DeclarationId(506) }, Field { label: "Basic".to_string(), ty: DeclarationId(507) }, Field { label: "ApiKey".to_string(), ty: DeclarationId(508) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 18982, 19078) }, + Declaration { id: DeclarationId(158), name: Some("AccessToken".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "token".to_string(), ty: DeclarationId(107) }, Field { label: "scheme".to_string(), ty: DeclarationId(157) }, Field { label: "expires_at".to_string(), ty: DeclarationId(509) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19200, 19333) }, + Declaration { id: DeclarationId(159), name: Some("Credential".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "token".to_string(), ty: DeclarationId(107) }, Field { label: "scheme".to_string(), ty: DeclarationId(157) }, Field { label: "header_name".to_string(), ty: DeclarationId(510) }, Field { label: "source_id".to_string(), ty: DeclarationId(186) }, Field { label: "required_scopes".to_string(), ty: DeclarationId(511) }, Field { label: "expires_in".to_string(), ty: DeclarationId(512) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19335, 19485) }, + Declaration { id: DeclarationId(160), name: Some("FilesystemHandle".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(120))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(575)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19562, 19626) }, + Declaration { id: DeclarationId(161), name: Some("NetworkHandle".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(89))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(576)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19627, 19684) }, + Declaration { id: DeclarationId(162), name: Some("ToolHandle".to_string()), connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(DeclarationId(186))), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: Some(DeclarationId(577)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19685, 19741) }, Declaration { id: DeclarationId(163), name: Some("TransportRequest".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "method".to_string(), ty: DeclarationId(156) }, Field { label: "url".to_string(), ty: DeclarationId(186) }, Field { label: "headers".to_string(), ty: DeclarationId(90) }, Field { label: "body".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19818, 19909) }, Declaration { id: DeclarationId(164), name: Some("TransportResponse".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "status".to_string(), ty: DeclarationId(71) }, Field { label: "headers".to_string(), ty: DeclarationId(90) }, Field { label: "body".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19911, 19982) }, Declaration { id: DeclarationId(165), name: Some("FileResponse".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "path".to_string(), ty: DeclarationId(186) }, Field { label: "success".to_string(), ty: DeclarationId(88) }, Field { label: "content".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19984, 20054) }, @@ -177,29 +177,29 @@ pub(crate) fn bootstrapped_fixture_without_parse_surface_dag() -> Dag { Declaration { id: DeclarationId(169), name: Some("Summary".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "total".to_string(), ty: DeclarationId(71) }, Field { label: "passed".to_string(), ty: DeclarationId(71) }, Field { label: "failed".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 20381, 20438) }, Declaration { id: DeclarationId(170), name: Some("StageResult".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "success".to_string(), ty: DeclarationId(88) }, Field { label: "stdout".to_string(), ty: DeclarationId(186) }, Field { label: "stderr".to_string(), ty: DeclarationId(186) }, Field { label: "skipped".to_string(), ty: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 20440, 20541) }, Declaration { id: DeclarationId(171), name: Some("DocumentLine".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "text".to_string(), ty: DeclarationId(186) }, Field { label: "is_comment".to_string(), ty: DeclarationId(88) }, Field { label: "is_blank".to_string(), ty: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 20694, 20766) }, - Declaration { id: DeclarationId(172), name: Some("DocumentSection".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "title".to_string(), ty: DeclarationId(186) }, Field { label: "has_title".to_string(), ty: DeclarationId(88) }, Field { label: "lines".to_string(), ty: DeclarationId(518) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 20768, 20854) }, - Declaration { id: DeclarationId(173), name: Some("Document".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "header".to_string(), ty: DeclarationId(186) }, Field { label: "has_header".to_string(), ty: DeclarationId(88) }, Field { label: "comment_prefix".to_string(), ty: DeclarationId(186) }, Field { label: "sections".to_string(), ty: DeclarationId(519) }, Field { label: "trailing_newline".to_string(), ty: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 20856, 20993) }, + Declaration { id: DeclarationId(172), name: Some("DocumentSection".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "title".to_string(), ty: DeclarationId(186) }, Field { label: "has_title".to_string(), ty: DeclarationId(88) }, Field { label: "lines".to_string(), ty: DeclarationId(513) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 20768, 20854) }, + Declaration { id: DeclarationId(173), name: Some("Document".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "header".to_string(), ty: DeclarationId(186) }, Field { label: "has_header".to_string(), ty: DeclarationId(88) }, Field { label: "comment_prefix".to_string(), ty: DeclarationId(186) }, Field { label: "sections".to_string(), ty: DeclarationId(514) }, Field { label: "trailing_newline".to_string(), ty: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 20856, 20993) }, Declaration { id: DeclarationId(174), name: Some("TextFile".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "path".to_string(), ty: DeclarationId(186) }, Field { label: "document".to_string(), ty: DeclarationId(173) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 20995, 21048) }, Declaration { id: DeclarationId(175), name: Some("RenderedTextFile".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "path".to_string(), ty: DeclarationId(186) }, Field { label: "content".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21050, 21108) }, - Declaration { id: DeclarationId(176), name: Some("ToolEntry".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "command".to_string(), ty: DeclarationId(186) }, Field { label: "description".to_string(), ty: DeclarationId(520) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21185, 21259) }, - Declaration { id: DeclarationId(177), name: Some("ToolRegistry".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "tools".to_string(), ty: DeclarationId(521) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21261, 21307) }, - Declaration { id: DeclarationId(178), name: Some("DagTopology".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "nodes".to_string(), ty: DeclarationId(522) }, Field { label: "edges".to_string(), ty: DeclarationId(523) }, Field { label: "subdag_boundaries".to_string(), ty: DeclarationId(524) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21566, 21676) }, - Declaration { id: DeclarationId(179), name: Some("TopologyNode".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "id".to_string(), ty: DeclarationId(186) }, Field { label: "label".to_string(), ty: DeclarationId(186) }, Field { label: "kind".to_string(), ty: DeclarationId(140) }, Field { label: "parent".to_string(), ty: DeclarationId(525) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21678, 21798) }, - Declaration { id: DeclarationId(180), name: Some("TopologyEdge".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "from".to_string(), ty: DeclarationId(186) }, Field { label: "to".to_string(), ty: DeclarationId(186) }, Field { label: "port".to_string(), ty: DeclarationId(526) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21800, 21865) }, - Declaration { id: DeclarationId(181), name: Some("DagDiff".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "added".to_string(), ty: DeclarationId(527) }, Field { label: "removed".to_string(), ty: DeclarationId(528) }, Field { label: "changed".to_string(), ty: DeclarationId(529) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21867, 21953) }, - Declaration { id: DeclarationId(182), name: Some("CodegenTarget".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "path".to_string(), ty: DeclarationId(120) }, Field { label: "backend".to_string(), ty: DeclarationId(530) }, Field { label: "target".to_string(), ty: DeclarationId(531) }, Field { label: "runtime_env".to_string(), ty: DeclarationId(532) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22022, 22156) }, - Declaration { id: DeclarationId(183), name: Some("CodegenBackend".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Rust".to_string(), ty: DeclarationId(533) }, Field { label: "Go".to_string(), ty: DeclarationId(534) }, Field { label: "C".to_string(), ty: DeclarationId(535) }, Field { label: "Mips".to_string(), ty: DeclarationId(536) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22158, 22200) }, - Declaration { id: DeclarationId(184), name: Some("PragmaDirective".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "key".to_string(), ty: DeclarationId(186) }, Field { label: "value".to_string(), ty: DeclarationId(186) }, Field { label: "scope".to_string(), ty: DeclarationId(537) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22202, 22273) }, + Declaration { id: DeclarationId(176), name: Some("ToolEntry".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "command".to_string(), ty: DeclarationId(186) }, Field { label: "description".to_string(), ty: DeclarationId(515) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21185, 21259) }, + Declaration { id: DeclarationId(177), name: Some("ToolRegistry".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "tools".to_string(), ty: DeclarationId(516) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21261, 21307) }, + Declaration { id: DeclarationId(178), name: Some("DagTopology".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "nodes".to_string(), ty: DeclarationId(517) }, Field { label: "edges".to_string(), ty: DeclarationId(518) }, Field { label: "subdag_boundaries".to_string(), ty: DeclarationId(519) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21566, 21676) }, + Declaration { id: DeclarationId(179), name: Some("TopologyNode".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "id".to_string(), ty: DeclarationId(186) }, Field { label: "label".to_string(), ty: DeclarationId(186) }, Field { label: "kind".to_string(), ty: DeclarationId(140) }, Field { label: "parent".to_string(), ty: DeclarationId(520) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21678, 21798) }, + Declaration { id: DeclarationId(180), name: Some("TopologyEdge".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "from".to_string(), ty: DeclarationId(186) }, Field { label: "to".to_string(), ty: DeclarationId(186) }, Field { label: "port".to_string(), ty: DeclarationId(521) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21800, 21865) }, + Declaration { id: DeclarationId(181), name: Some("DagDiff".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "added".to_string(), ty: DeclarationId(522) }, Field { label: "removed".to_string(), ty: DeclarationId(523) }, Field { label: "changed".to_string(), ty: DeclarationId(524) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21867, 21953) }, + Declaration { id: DeclarationId(182), name: Some("CodegenTarget".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "path".to_string(), ty: DeclarationId(120) }, Field { label: "backend".to_string(), ty: DeclarationId(525) }, Field { label: "target".to_string(), ty: DeclarationId(526) }, Field { label: "runtime_env".to_string(), ty: DeclarationId(527) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22022, 22156) }, + Declaration { id: DeclarationId(183), name: Some("CodegenBackend".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Rust".to_string(), ty: DeclarationId(528) }, Field { label: "Go".to_string(), ty: DeclarationId(529) }, Field { label: "C".to_string(), ty: DeclarationId(530) }, Field { label: "Mips".to_string(), ty: DeclarationId(531) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22158, 22200) }, + Declaration { id: DeclarationId(184), name: Some("PragmaDirective".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "key".to_string(), ty: DeclarationId(186) }, Field { label: "value".to_string(), ty: DeclarationId(186) }, Field { label: "scope".to_string(), ty: DeclarationId(532) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22202, 22273) }, Declaration { id: DeclarationId(185), name: Some("DocSource".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "path".to_string(), ty: DeclarationId(120) }, Field { label: "kind".to_string(), ty: DeclarationId(141) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22414, 22471) }, Declaration { id: DeclarationId(186), name: Some("String".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(92) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/string_type.dag", 520, 550) }, - Declaration { id: DeclarationId(187), name: Some("CharClass".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Whitespace".to_string(), ty: DeclarationId(583) }, Field { label: "Digit".to_string(), ty: DeclarationId(584) }, Field { label: "IdentStart".to_string(), ty: DeclarationId(585) }, Field { label: "IdentContinue".to_string(), ty: DeclarationId(586) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 3662, 3726) }, + Declaration { id: DeclarationId(187), name: Some("CharClass".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Whitespace".to_string(), ty: DeclarationId(578) }, Field { label: "Digit".to_string(), ty: DeclarationId(579) }, Field { label: "IdentStart".to_string(), ty: DeclarationId(580) }, Field { label: "IdentContinue".to_string(), ty: DeclarationId(581) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 3662, 3726) }, Declaration { id: DeclarationId(188), name: Some("char_in_class".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(92), DeclarationId(187)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/unicode.dag", 3780, 4378)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 3728, 4378) }, - Declaration { id: DeclarationId(189), name: Some("DisplayWidth".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ZeroWidth".to_string(), ty: DeclarationId(587) }, Field { label: "Narrow".to_string(), ty: DeclarationId(588) }, Field { label: "Wide".to_string(), ty: DeclarationId(589) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 4742, 4787) }, + Declaration { id: DeclarationId(189), name: Some("DisplayWidth".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ZeroWidth".to_string(), ty: DeclarationId(582) }, Field { label: "Narrow".to_string(), ty: DeclarationId(583) }, Field { label: "Wide".to_string(), ty: DeclarationId(584) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 4742, 4787) }, Declaration { id: DeclarationId(190), name: Some("display_width_columns".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(189)], output: DeclarationId(71), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/unicode.dag", 4838, 4914)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 4789, 4914) }, Declaration { id: DeclarationId(191), name: Some("UnicodeBlock".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "start".to_string(), ty: DeclarationId(71) }, Field { label: "end_inclusive".to_string(), ty: DeclarationId(71) }, Field { label: "default_width".to_string(), ty: DeclarationId(189) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 5149, 5249) }, - Declaration { id: DeclarationId(192), name: Some("zero_width_blocks".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(191) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(590)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Combining Diacritical Marks".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(768))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(879))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(587), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Combining Diacritical Marks Extended".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(6832))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(6911))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(587), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Combining Diacritical Marks Supplement".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(7616))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(7679))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(587), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Combining Marks for Symbols".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(8400))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(8447))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(587), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Variation Selectors".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(65024))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(65039))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(587), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Combining Half Marks".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(65056))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(65071))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(587), payload: vec![] })])])), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 5311, 6060) }, - Declaration { id: DeclarationId(193), name: Some("zero_width_codepoints".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(591)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![FieldValue::Literal(LiteralBits::Int(8203)), FieldValue::Literal(LiteralBits::Int(8204)), FieldValue::Literal(LiteralBits::Int(8205)), FieldValue::Literal(LiteralBits::Int(65279))])), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 6127, 6339) }, - Declaration { id: DeclarationId(194), name: Some("wide_blocks".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(191) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(592)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Hangul Jamo".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(4352))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(4447))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(589), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("CJK Radicals and Symbols".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(11904))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(12350))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(589), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Hiragana / Katakana / CJK Compat".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(12353))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(13247))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(589), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("CJK Extension A".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(13312))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(19903))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(589), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("CJK Unified Ideographs".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(19968))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(40959))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(589), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Yi Syllables and Radicals".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(40960))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(42191))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(589), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Hangul Syllables".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(44032))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(55215))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(589), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("CJK Compatibility Ideographs".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(63744))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(64255))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(589), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("CJK Compatibility Forms".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(65072))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(65135))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(589), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Fullwidth ASCII".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(65281))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(65376))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(589), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Fullwidth Signs".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(65504))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(65510))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(589), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("CJK Extension B+".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(131072))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(196607))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(589), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("CJK Extension G+".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(196608))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(262143))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(589), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Misc Symbols and Dingbats".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(9728))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(10175))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(589), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Symbols / Pictographs / Emoticons".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(127744))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(129535))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(589), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Symbols Extended".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(129536))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(131071))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(589), payload: vec![] })])])), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 6386, 8175) }, + Declaration { id: DeclarationId(192), name: Some("zero_width_blocks".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(191) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(585)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Combining Diacritical Marks".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(768))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(879))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(582), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Combining Diacritical Marks Extended".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(6832))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(6911))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(582), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Combining Diacritical Marks Supplement".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(7616))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(7679))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(582), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Combining Marks for Symbols".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(8400))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(8447))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(582), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Variation Selectors".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(65024))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(65039))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(582), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Combining Half Marks".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(65056))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(65071))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(582), payload: vec![] })])])), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 5311, 6060) }, + Declaration { id: DeclarationId(193), name: Some("zero_width_codepoints".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(586)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![FieldValue::Literal(LiteralBits::Int(8203)), FieldValue::Literal(LiteralBits::Int(8204)), FieldValue::Literal(LiteralBits::Int(8205)), FieldValue::Literal(LiteralBits::Int(65279))])), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 6127, 6339) }, + Declaration { id: DeclarationId(194), name: Some("wide_blocks".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(191) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(587)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Hangul Jamo".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(4352))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(4447))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(584), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("CJK Radicals and Symbols".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(11904))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(12350))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(584), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Hiragana / Katakana / CJK Compat".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(12353))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(13247))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(584), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("CJK Extension A".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(13312))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(19903))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(584), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("CJK Unified Ideographs".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(19968))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(40959))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(584), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Yi Syllables and Radicals".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(40960))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(42191))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(584), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Hangul Syllables".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(44032))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(55215))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(584), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("CJK Compatibility Ideographs".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(63744))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(64255))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(584), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("CJK Compatibility Forms".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(65072))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(65135))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(584), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Fullwidth ASCII".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(65281))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(65376))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(584), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Fullwidth Signs".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(65504))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(65510))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(584), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("CJK Extension B+".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(131072))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(196607))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(584), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("CJK Extension G+".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(196608))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(262143))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(584), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Misc Symbols and Dingbats".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(9728))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(10175))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(584), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Symbols / Pictographs / Emoticons".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(127744))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(129535))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(584), payload: vec![] })]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("Symbols Extended".to_string()))), ("start".to_string(), FieldValue::Literal(LiteralBits::Int(129536))), ("end_inclusive".to_string(), FieldValue::Literal(LiteralBits::Int(131071))), ("default_width".to_string(), FieldValue::Variant { constructor: DeclarationId(584), payload: vec![] })])])), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 6386, 8175) }, Declaration { id: DeclarationId(195), name: Some("code_point".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(92)], output: DeclarationId(71), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/unicode.dag", 8355, 8366)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 8325, 8366) }, Declaration { id: DeclarationId(196), name: Some("in_block".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71), DeclarationId(191)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/unicode.dag", 8418, 8470)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 8368, 8470) }, Declaration { id: DeclarationId(197), name: Some("char_display_width".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(92)], output: DeclarationId(189), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/unicode.dag", 8519, 8822)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 8472, 8822) }, @@ -208,1841 +208,1836 @@ pub(crate) fn bootstrapped_fixture_without_parse_surface_dag() -> Dag { Declaration { id: DeclarationId(200), name: Some("repeat_string_loop".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(186), DeclarationId(71)], output: DeclarationId(186), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/render_repeat_string_bootstrap.dag", 598, 717)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/render_repeat_string_bootstrap.dag", 526, 717) }, Declaration { id: DeclarationId(201), name: Some("repeat_string".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(71)], output: DeclarationId(186), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/render_repeat_string_bootstrap.dag", 765, 818)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/render_repeat_string_bootstrap.dag", 719, 818) }, Declaration { id: DeclarationId(202), name: Some("MethodDeclaration".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 3320, 3361) }, - Declaration { id: DeclarationId(203), name: Some("add_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("add".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 3822, 3874) }, - Declaration { id: DeclarationId(204), name: Some("all_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("all".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 3875, 3927) }, - Declaration { id: DeclarationId(205), name: Some("any_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("any".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 3928, 3980) }, - Declaration { id: DeclarationId(206), name: Some("append_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("append".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 3981, 4039) }, - Declaration { id: DeclarationId(207), name: Some("bottom_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("bottom".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4040, 4098) }, - Declaration { id: DeclarationId(208), name: Some("chars_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("chars".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4099, 4155) }, - Declaration { id: DeclarationId(209), name: Some("clamp_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("clamp".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4156, 4212) }, - Declaration { id: DeclarationId(210), name: Some("compare_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("compare".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4213, 4273) }, - Declaration { id: DeclarationId(211), name: Some("complement_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("complement".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4274, 4340) }, - Declaration { id: DeclarationId(212), name: Some("concat_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("concat".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4341, 4399) }, - Declaration { id: DeclarationId(213), name: Some("contains_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("contains".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4400, 4462) }, - Declaration { id: DeclarationId(214), name: Some("count_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("count".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4463, 4519) }, - Declaration { id: DeclarationId(215), name: Some("diff_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("diff".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4520, 4574) }, - Declaration { id: DeclarationId(216), name: Some("empty_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("empty".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4575, 4631) }, - Declaration { id: DeclarationId(217), name: Some("ends_with_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("ends_with".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4632, 4696) }, - Declaration { id: DeclarationId(218), name: Some("enumerate_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("enumerate".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4697, 4761) }, - Declaration { id: DeclarationId(219), name: Some("filter_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("filter".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4762, 4820) }, - Declaration { id: DeclarationId(220), name: Some("first_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("first".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4821, 4877) }, - Declaration { id: DeclarationId(221), name: Some("flat_map_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("flat_map".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4878, 4940) }, - Declaration { id: DeclarationId(222), name: Some("fold_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("fold".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4941, 4995) }, - Declaration { id: DeclarationId(223), name: Some("get_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("get".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4996, 5048) }, - Declaration { id: DeclarationId(224), name: Some("has_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("has".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5049, 5101) }, - Declaration { id: DeclarationId(225), name: Some("intersect_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("intersect".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5102, 5166) }, - Declaration { id: DeclarationId(226), name: Some("join_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("join".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5167, 5221) }, - Declaration { id: DeclarationId(227), name: Some("keys_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("keys".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5222, 5276) }, - Declaration { id: DeclarationId(228), name: Some("last_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("last".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5277, 5331) }, - Declaration { id: DeclarationId(229), name: Some("length_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("length".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5332, 5390) }, - Declaration { id: DeclarationId(230), name: Some("list_push_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("list_push".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5391, 5455) }, - Declaration { id: DeclarationId(231), name: Some("lookup_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("lookup".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5456, 5514) }, - Declaration { id: DeclarationId(232), name: Some("map_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("map".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5515, 5567) }, - Declaration { id: DeclarationId(233), name: Some("map_contains_key_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("map_contains_key".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5568, 5646) }, - Declaration { id: DeclarationId(234), name: Some("map_get_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("map_get".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5647, 5707) }, - Declaration { id: DeclarationId(235), name: Some("map_has_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("map_has".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5708, 5768) }, - Declaration { id: DeclarationId(236), name: Some("map_insert_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("map_insert".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5769, 5835) }, - Declaration { id: DeclarationId(237), name: Some("map_keys_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("map_keys".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5836, 5898) }, - Declaration { id: DeclarationId(238), name: Some("map_merge_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("map_merge".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5899, 5963) }, - Declaration { id: DeclarationId(239), name: Some("map_values_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("map_values".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5964, 6030) }, - Declaration { id: DeclarationId(240), name: Some("meet_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("meet".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6031, 6085) }, - Declaration { id: DeclarationId(241), name: Some("member_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("member".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6086, 6144) }, - Declaration { id: DeclarationId(242), name: Some("mul_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("mul".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6145, 6197) }, - Declaration { id: DeclarationId(243), name: Some("negate_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("negate".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6198, 6256) }, - Declaration { id: DeclarationId(244), name: Some("one_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("one".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6257, 6309) }, - Declaration { id: DeclarationId(245), name: Some("quotient_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("quotient".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6310, 6372) }, - Declaration { id: DeclarationId(246), name: Some("reciprocal_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("reciprocal".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6373, 6439) }, - Declaration { id: DeclarationId(247), name: Some("remainder_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("remainder".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6440, 6504) }, - Declaration { id: DeclarationId(248), name: Some("replace_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("replace".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6505, 6565) }, - Declaration { id: DeclarationId(249), name: Some("reverse_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("reverse".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6566, 6626) }, - Declaration { id: DeclarationId(250), name: Some("skip_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("skip".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6627, 6681) }, - Declaration { id: DeclarationId(251), name: Some("sort_by_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("sort_by".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6682, 6742) }, - Declaration { id: DeclarationId(252), name: Some("split_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("split".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6743, 6799) }, - Declaration { id: DeclarationId(253), name: Some("starts_with_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("starts_with".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6800, 6868) }, - Declaration { id: DeclarationId(254), name: Some("substring_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("substring".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6869, 6933) }, - Declaration { id: DeclarationId(255), name: Some("take_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("take".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6934, 6988) }, - Declaration { id: DeclarationId(256), name: Some("to_int_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("to_int".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6989, 7047) }, - Declaration { id: DeclarationId(257), name: Some("to_lower_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("to_lower".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 7048, 7110) }, - Declaration { id: DeclarationId(258), name: Some("to_string_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("to_string".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 7111, 7175) }, - Declaration { id: DeclarationId(259), name: Some("to_upper_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("to_upper".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 7176, 7238) }, - Declaration { id: DeclarationId(260), name: Some("top_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("top".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 7239, 7291) }, - Declaration { id: DeclarationId(261), name: Some("trim_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("trim".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 7292, 7346) }, - Declaration { id: DeclarationId(262), name: Some("union_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("union".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 7347, 7403) }, - Declaration { id: DeclarationId(263), name: Some("values_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("values".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 7404, 7462) }, - Declaration { id: DeclarationId(264), name: Some("with_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("with".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 7463, 7517) }, - Declaration { id: DeclarationId(265), name: Some("zero_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("zero".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 7518, 7572) }, - Declaration { id: DeclarationId(266), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/logic.dag", 304, 308) }, - Declaration { id: DeclarationId(267), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/logic.dag", 311, 316) }, - Declaration { id: DeclarationId(268), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(4) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1023, 1032) }, - Declaration { id: DeclarationId(269), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(4) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1136, 1145) }, - Declaration { id: DeclarationId(270), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(6) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1272, 1282) }, - Declaration { id: DeclarationId(271), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(6) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1306, 1316) }, - Declaration { id: DeclarationId(272), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(6) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1340, 1350) }, - Declaration { id: DeclarationId(273), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(6) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1375, 1385) }, - Declaration { id: DeclarationId(274), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "value".to_string(), ty: DeclarationId(12) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/error_primitives.dag", 620, 636) }, - Declaration { id: DeclarationId(275), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "value".to_string(), ty: DeclarationId(13) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/error_primitives.dag", 639, 657) }, - Declaration { id: DeclarationId(276), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/error_primitives.dag", 936, 948) }, - Declaration { id: DeclarationId(277), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/error_primitives.dag", 951, 959) }, - Declaration { id: DeclarationId(278), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(52) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 18727, 18753) }, - Declaration { id: DeclarationId(279), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(52) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 20267, 20293) }, - Declaration { id: DeclarationId(280), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(52) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 21424, 21450) }, - Declaration { id: DeclarationId(281), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(52) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 22550, 22576) }, - Declaration { id: DeclarationId(282), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(52) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 25961, 25987) }, - Declaration { id: DeclarationId(283), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(52) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 29098, 29124) }, - Declaration { id: DeclarationId(284), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(52) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 34230, 34256) }, - Declaration { id: DeclarationId(285), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(52) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 37144, 37170) }, - Declaration { id: DeclarationId(286), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 37963, 37975) }, - Declaration { id: DeclarationId(287), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(16), DeclarationId(16)], output: DeclarationId(16), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 4585, 4598) }, - Declaration { id: DeclarationId(288), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(18), DeclarationId(18)], output: DeclarationId(18), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 4704, 4717) }, - Declaration { id: DeclarationId(289), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(20), DeclarationId(20)], output: DeclarationId(20), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 4921, 4934) }, - Declaration { id: DeclarationId(290), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(22), DeclarationId(22)], output: DeclarationId(22), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5043, 5056) }, - Declaration { id: DeclarationId(291), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(24), DeclarationId(24)], output: DeclarationId(24), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5194, 5207) }, - Declaration { id: DeclarationId(292), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(24)], output: DeclarationId(24), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5233, 5243) }, - Declaration { id: DeclarationId(293), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(26), DeclarationId(26)], output: DeclarationId(26), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5312, 5325) }, - Declaration { id: DeclarationId(294), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(26)], output: DeclarationId(26), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5351, 5361) }, - Declaration { id: DeclarationId(295), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(28), DeclarationId(28)], output: DeclarationId(28), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5851, 5864) }, - Declaration { id: DeclarationId(296), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(28), DeclarationId(28)], output: DeclarationId(28), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5882, 5895) }, - Declaration { id: DeclarationId(297), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(30), DeclarationId(30)], output: DeclarationId(30), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6055, 6068) }, - Declaration { id: DeclarationId(298), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(30)], output: DeclarationId(30), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6089, 6099) }, - Declaration { id: DeclarationId(299), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(30), DeclarationId(30)], output: DeclarationId(30), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6107, 6120) }, - Declaration { id: DeclarationId(300), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(32), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6883, 6896) }, - Declaration { id: DeclarationId(301), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(32), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6904, 6917) }, - Declaration { id: DeclarationId(302), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32)], output: DeclarationId(32), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6938, 6948) }, - Declaration { id: DeclarationId(303), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(32), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6956, 6969) }, - Declaration { id: DeclarationId(304), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(11), arguments: vec![TemplateArgument { parameter: DeclarationId(12), value: DeclarationId(32) }, TemplateArgument { parameter: DeclarationId(13), value: DeclarationId(14) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6989, 7008) }, - Declaration { id: DeclarationId(305), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(304), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6977, 7008) }, - Declaration { id: DeclarationId(306), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(46), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7029, 7049) }, - Declaration { id: DeclarationId(307), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(32), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7062, 7075) }, - Declaration { id: DeclarationId(308), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(32), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7089, 7102) }, - Declaration { id: DeclarationId(309), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7109, 7125) }, - Declaration { id: DeclarationId(310), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7132, 7148) }, - Declaration { id: DeclarationId(311), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7155, 7171) }, - Declaration { id: DeclarationId(312), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7178, 7194) }, - Declaration { id: DeclarationId(313), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7201, 7217) }, - Declaration { id: DeclarationId(314), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7224, 7240) }, - Declaration { id: DeclarationId(315), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(34), DeclarationId(34)], output: DeclarationId(34), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7403, 7416) }, - Declaration { id: DeclarationId(316), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(34)], output: DeclarationId(34), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7437, 7447) }, - Declaration { id: DeclarationId(317), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(34), DeclarationId(34)], output: DeclarationId(34), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7455, 7468) }, - Declaration { id: DeclarationId(318), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(34)], output: DeclarationId(34), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7492, 7502) }, - Declaration { id: DeclarationId(319), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(34), DeclarationId(34)], output: DeclarationId(46), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7514, 7534) }, - Declaration { id: DeclarationId(320), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(36), DeclarationId(36)], output: DeclarationId(36), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7882, 7895) }, - Declaration { id: DeclarationId(321), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(36), DeclarationId(36)], output: DeclarationId(36), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7904, 7917) }, - Declaration { id: DeclarationId(322), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(38), DeclarationId(38)], output: DeclarationId(38), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 8060, 8073) }, - Declaration { id: DeclarationId(323), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(38), DeclarationId(38)], output: DeclarationId(38), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 8082, 8095) }, - Declaration { id: DeclarationId(324), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(40), DeclarationId(40)], output: DeclarationId(40), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 8349, 8362) }, - Declaration { id: DeclarationId(325), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(40), DeclarationId(40)], output: DeclarationId(40), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 8371, 8384) }, - Declaration { id: DeclarationId(326), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(40)], output: DeclarationId(40), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 8399, 8409) }, - Declaration { id: DeclarationId(327), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12261, 12274) }, - Declaration { id: DeclarationId(328), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12276, 12289) }, - Declaration { id: DeclarationId(329), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12294, 12307) }, - Declaration { id: DeclarationId(330), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(327), DeclarationId(328)], output: DeclarationId(329), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12258, 12307) }, - Declaration { id: DeclarationId(331), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12317, 12330) }, - Declaration { id: DeclarationId(332), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12350, 12363) }, - Declaration { id: DeclarationId(333), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42)], output: DeclarationId(332), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12341, 12363) }, - Declaration { id: DeclarationId(334), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71)], output: DeclarationId(42), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12444, 12456) }, - Declaration { id: DeclarationId(335), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12482, 12495) }, - Declaration { id: DeclarationId(336), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71), DeclarationId(71)], output: DeclarationId(335), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12466, 12495) }, - Declaration { id: DeclarationId(337), name: None, connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(71), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12506, 12517) }, - Declaration { id: DeclarationId(338), name: None, connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(71), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12527, 12538) }, - Declaration { id: DeclarationId(339), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(42), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12556, 12558) }, - Declaration { id: DeclarationId(340), name: None, connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(339), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12548, 12558) }, - Declaration { id: DeclarationId(341), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(42), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12575, 12577) }, - Declaration { id: DeclarationId(342), name: None, connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(341), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12567, 12577) }, - Declaration { id: DeclarationId(343), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42)], output: DeclarationId(42), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12675, 12685) }, - Declaration { id: DeclarationId(344), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12690, 12703) }, - Declaration { id: DeclarationId(345), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(343)], output: DeclarationId(344), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12672, 12703) }, - Declaration { id: DeclarationId(346), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12717, 12730) }, - Declaration { id: DeclarationId(347), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12735, 12748) }, - Declaration { id: DeclarationId(348), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(346)], output: DeclarationId(347), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12714, 12748) }, - Declaration { id: DeclarationId(349), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42), DeclarationId(42)], output: DeclarationId(42), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12763, 12776) }, - Declaration { id: DeclarationId(350), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42), DeclarationId(349)], output: DeclarationId(42), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12757, 12782) }, - Declaration { id: DeclarationId(351), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12807, 12820) }, - Declaration { id: DeclarationId(352), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42)], output: DeclarationId(351), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12798, 12820) }, - Declaration { id: DeclarationId(353), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12825, 12838) }, - Declaration { id: DeclarationId(354), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(352)], output: DeclarationId(353), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12795, 12838) }, - Declaration { id: DeclarationId(355), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12849, 12862) }, - Declaration { id: DeclarationId(356), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(355)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12846, 12871) }, - Declaration { id: DeclarationId(357), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12882, 12895) }, - Declaration { id: DeclarationId(358), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(357)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12879, 12904) }, - Declaration { id: DeclarationId(359), name: None, connective: TypeConnective::Atom(AtomPayload::UnresolvedIdentifier("Tuple".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12969, 12982) }, - Declaration { id: DeclarationId(360), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(359), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12969, 12982) }, - Declaration { id: DeclarationId(361), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(360) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12958, 12983) }, - Declaration { id: DeclarationId(362), name: None, connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(361), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12950, 12983) }, - Declaration { id: DeclarationId(363), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13003, 13016) }, - Declaration { id: DeclarationId(364), name: None, connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(363), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12995, 13016) }, - Declaration { id: DeclarationId(365), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13036, 13049) }, - Declaration { id: DeclarationId(366), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71)], output: DeclarationId(365), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13025, 13049) }, - Declaration { id: DeclarationId(367), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13069, 13082) }, - Declaration { id: DeclarationId(368), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71)], output: DeclarationId(367), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13058, 13082) }, - Declaration { id: DeclarationId(369), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42), DeclarationId(42)], output: DeclarationId(71), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13097, 13112) }, - Declaration { id: DeclarationId(370), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13117, 13130) }, - Declaration { id: DeclarationId(371), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(369)], output: DeclarationId(370), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13094, 13130) }, - Declaration { id: DeclarationId(372), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13143, 13156) }, - Declaration { id: DeclarationId(373), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(45), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13721, 13723) }, - Declaration { id: DeclarationId(374), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(44)], output: DeclarationId(373), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13712, 13723) }, - Declaration { id: DeclarationId(375), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(43), arguments: vec![TemplateArgument { parameter: DeclarationId(44), value: DeclarationId(44) }, TemplateArgument { parameter: DeclarationId(45), value: DeclarationId(45) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13733, 13754) }, - Declaration { id: DeclarationId(376), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(45), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13771, 13773) }, - Declaration { id: DeclarationId(377), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(44)], output: DeclarationId(376), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13762, 13773) }, - Declaration { id: DeclarationId(378), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(43), arguments: vec![TemplateArgument { parameter: DeclarationId(44), value: DeclarationId(44) }, TemplateArgument { parameter: DeclarationId(45), value: DeclarationId(45) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13796, 13817) }, - Declaration { id: DeclarationId(379), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(44), DeclarationId(45)], output: DeclarationId(378), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13784, 13817) }, - Declaration { id: DeclarationId(380), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(43), arguments: vec![TemplateArgument { parameter: DeclarationId(44), value: DeclarationId(44) }, TemplateArgument { parameter: DeclarationId(45), value: DeclarationId(45) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13830, 13851) }, - Declaration { id: DeclarationId(381), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(43), arguments: vec![TemplateArgument { parameter: DeclarationId(44), value: DeclarationId(44) }, TemplateArgument { parameter: DeclarationId(45), value: DeclarationId(45) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13856, 13877) }, - Declaration { id: DeclarationId(382), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(380)], output: DeclarationId(381), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13827, 13877) }, - Declaration { id: DeclarationId(383), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(44) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13894, 13907) }, - Declaration { id: DeclarationId(384), name: None, connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(383), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13886, 13907) }, - Declaration { id: DeclarationId(385), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(45) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13926, 13939) }, - Declaration { id: DeclarationId(386), name: None, connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(385), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13918, 13939) }, - Declaration { id: DeclarationId(387), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(44)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13947, 13960) }, - Declaration { id: DeclarationId(388), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(44)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13977, 13990) }, - Declaration { id: DeclarationId(389), name: None, connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(71), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13999, 14010) }, - Declaration { id: DeclarationId(390), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 14229, 14233) }, - Declaration { id: DeclarationId(391), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 14236, 14241) }, - Declaration { id: DeclarationId(392), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 14244, 14251) }, - Declaration { id: DeclarationId(393), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16177, 16195) }, - Declaration { id: DeclarationId(394), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16200, 16223) }, - Declaration { id: DeclarationId(395), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16228, 16249) }, - Declaration { id: DeclarationId(396), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16254, 16285) }, - Declaration { id: DeclarationId(397), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16290, 16313) }, - Declaration { id: DeclarationId(398), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16318, 16345) }, - Declaration { id: DeclarationId(399), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16350, 16372) }, - Declaration { id: DeclarationId(400), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16399, 16413) }, - Declaration { id: DeclarationId(401), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16418, 16440) }, - Declaration { id: DeclarationId(402), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16471, 16483) }, - Declaration { id: DeclarationId(403), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16488, 16503) }, - Declaration { id: DeclarationId(404), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16508, 16519) }, - Declaration { id: DeclarationId(405), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16524, 16537) }, - Declaration { id: DeclarationId(406), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16542, 16572) }, - Declaration { id: DeclarationId(407), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "source".to_string(), ty: DeclarationId(48) }, Field { label: "element".to_string(), ty: DeclarationId(49) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16577, 16646) }, - Declaration { id: DeclarationId(408), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "inner".to_string(), ty: DeclarationId(49) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16651, 16692) }, - Declaration { id: DeclarationId(409), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "first".to_string(), ty: DeclarationId(49) }, Field { label: "second".to_string(), ty: DeclarationId(49) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16697, 16764) }, - Declaration { id: DeclarationId(410), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(49) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16790, 16815) }, - Declaration { id: DeclarationId(411), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "params".to_string(), ty: DeclarationId(410) }, Field { label: "return_type".to_string(), ty: DeclarationId(49) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16769, 16851) }, - Declaration { id: DeclarationId(412), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "id".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16856, 16890) }, - Declaration { id: DeclarationId(413), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 17136, 17148) }, - Declaration { id: DeclarationId(414), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 17206, 17222) }, - Declaration { id: DeclarationId(415), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 17269, 17283) }, - Declaration { id: DeclarationId(416), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 17760, 17773) }, - Declaration { id: DeclarationId(417), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 17789, 17804) }, - Declaration { id: DeclarationId(418), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 17850, 17866) }, - Declaration { id: DeclarationId(419), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 17913, 17926) }, - Declaration { id: DeclarationId(420), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(49) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 18009, 18034) }, - Declaration { id: DeclarationId(421), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(50), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 18085, 18106) }, - Declaration { id: DeclarationId(422), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(51), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 18121, 18131) }, - Declaration { id: DeclarationId(423), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 18376, 18380) }, - Declaration { id: DeclarationId(424), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(47) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 18413, 18440) }, - Declaration { id: DeclarationId(425), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 3781, 3785) }, - Declaration { id: DeclarationId(426), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 4054, 4066) }, - Declaration { id: DeclarationId(427), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 4264, 4271) }, - Declaration { id: DeclarationId(428), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 6172, 6179) }, - Declaration { id: DeclarationId(429), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 6508, 6520) }, - Declaration { id: DeclarationId(430), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 7558, 7562) }, - Declaration { id: DeclarationId(431), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 7565, 7570) }, - Declaration { id: DeclarationId(432), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(116) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11304, 11321) }, - Declaration { id: DeclarationId(433), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(117) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11355, 11372) }, - Declaration { id: DeclarationId(434), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14380, 14385) }, - Declaration { id: DeclarationId(435), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14388, 14393) }, - Declaration { id: DeclarationId(436), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14396, 14403) }, - Declaration { id: DeclarationId(437), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14555, 14559) }, - Declaration { id: DeclarationId(438), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14562, 14571) }, - Declaration { id: DeclarationId(439), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14574, 14580) }, - Declaration { id: DeclarationId(440), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14583, 14586) }, - Declaration { id: DeclarationId(441), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14611, 14619) }, - Declaration { id: DeclarationId(442), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14622, 14631) }, - Declaration { id: DeclarationId(443), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14634, 14640) }, - Declaration { id: DeclarationId(444), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14660, 14662) }, - Declaration { id: DeclarationId(445), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14665, 14666) }, - Declaration { id: DeclarationId(446), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14669, 14670) }, - Declaration { id: DeclarationId(447), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14673, 14674) }, - Declaration { id: DeclarationId(448), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14677, 14679) }, - Declaration { id: DeclarationId(449), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "secret_name".to_string(), ty: DeclarationId(111) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14951, 14986) }, - Declaration { id: DeclarationId(450), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "env_var".to_string(), ty: DeclarationId(111) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14991, 15032) }, - Declaration { id: DeclarationId(451), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(138), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15107, 15127) }, - Declaration { id: DeclarationId(452), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15142, 15154) }, - Declaration { id: DeclarationId(453), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "audience".to_string(), ty: DeclarationId(111) }, Field { label: "service_account".to_string(), ty: DeclarationId(451) }, Field { label: "scopes".to_string(), ty: DeclarationId(452) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15037, 15160) }, - Declaration { id: DeclarationId(454), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15191, 15203) }, - Declaration { id: DeclarationId(455), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "scopes".to_string(), ty: DeclarationId(454) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15165, 15205) }, - Declaration { id: DeclarationId(456), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(143) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15227, 15247) }, - Declaration { id: DeclarationId(457), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "steps".to_string(), ty: DeclarationId(456) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15210, 15249) }, - Declaration { id: DeclarationId(458), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15336, 15342) }, - Declaration { id: DeclarationId(459), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15345, 15348) }, - Declaration { id: DeclarationId(460), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15351, 15358) }, - Declaration { id: DeclarationId(461), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15361, 15364) }, - Declaration { id: DeclarationId(462), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15367, 15372) }, - Declaration { id: DeclarationId(463), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15375, 15379) }, - Declaration { id: DeclarationId(464), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15382, 15388) }, - Declaration { id: DeclarationId(465), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15391, 15397) }, - Declaration { id: DeclarationId(466), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15400, 15408) }, - Declaration { id: DeclarationId(467), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15411, 15418) }, - Declaration { id: DeclarationId(468), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15421, 15427) }, - Declaration { id: DeclarationId(469), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15442, 15455) }, - Declaration { id: DeclarationId(470), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15458, 15460) }, - Declaration { id: DeclarationId(471), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15463, 15468) }, - Declaration { id: DeclarationId(472), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15471, 15474) }, - Declaration { id: DeclarationId(473), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15485, 15490) }, - Declaration { id: DeclarationId(474), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15493, 15498) }, - Declaration { id: DeclarationId(475), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15501, 15508) }, - Declaration { id: DeclarationId(476), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15511, 15518) }, - Declaration { id: DeclarationId(477), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15521, 15528) }, - Declaration { id: DeclarationId(478), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15531, 15534) }, - Declaration { id: DeclarationId(479), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15537, 15541) }, - Declaration { id: DeclarationId(480), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15556, 15563) }, - Declaration { id: DeclarationId(481), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15566, 15569) }, - Declaration { id: DeclarationId(482), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15572, 15579) }, - Declaration { id: DeclarationId(483), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15582, 15591) }, - Declaration { id: DeclarationId(484), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15594, 15598) }, - Declaration { id: DeclarationId(485), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15601, 15605) }, - Declaration { id: DeclarationId(486), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15608, 15618) }, - Declaration { id: DeclarationId(487), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15621, 15625) }, - Declaration { id: DeclarationId(488), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15628, 15634) }, - Declaration { id: DeclarationId(489), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15655, 15661) }, - Declaration { id: DeclarationId(490), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15664, 15667) }, - Declaration { id: DeclarationId(491), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15670, 15679) }, - Declaration { id: DeclarationId(492), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15682, 15684) }, - Declaration { id: DeclarationId(493), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15687, 15695) }, - Declaration { id: DeclarationId(494), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(147), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15763, 15770) }, - Declaration { id: DeclarationId(495), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16167, 16178) }, - Declaration { id: DeclarationId(496), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16183, 16192) }, - Declaration { id: DeclarationId(497), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16197, 16204) }, - Declaration { id: DeclarationId(498), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16209, 16216) }, - Declaration { id: DeclarationId(499), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16221, 16226) }, - Declaration { id: DeclarationId(500), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16379, 16389) }, - Declaration { id: DeclarationId(501), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16394, 16403) }, - Declaration { id: DeclarationId(502), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16408, 16414) }, - Declaration { id: DeclarationId(503), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 18464, 18467) }, - Declaration { id: DeclarationId(504), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 18470, 18474) }, - Declaration { id: DeclarationId(505), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 18477, 18480) }, - Declaration { id: DeclarationId(506), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 18483, 18488) }, - Declaration { id: DeclarationId(507), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 18491, 18497) }, - Declaration { id: DeclarationId(508), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 18500, 18504) }, - Declaration { id: DeclarationId(509), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 18507, 18514) }, - Declaration { id: DeclarationId(510), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19002, 19008) }, - Declaration { id: DeclarationId(511), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19013, 19036) }, - Declaration { id: DeclarationId(512), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "username".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19041, 19067) }, - Declaration { id: DeclarationId(513), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19072, 19078) }, - Declaration { id: DeclarationId(514), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(122), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19270, 19280) }, - Declaration { id: DeclarationId(515), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19405, 19412) }, - Declaration { id: DeclarationId(516), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19452, 19464) }, - Declaration { id: DeclarationId(517), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19479, 19483) }, - Declaration { id: DeclarationId(518), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(171) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 20834, 20852) }, - Declaration { id: DeclarationId(519), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(172) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 20945, 20966) }, - Declaration { id: DeclarationId(520), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21250, 21257) }, - Declaration { id: DeclarationId(521), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(176) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21290, 21305) }, - Declaration { id: DeclarationId(522), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(179) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21594, 21612) }, - Declaration { id: DeclarationId(523), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(180) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21622, 21640) }, - Declaration { id: DeclarationId(524), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21662, 21674) }, - Declaration { id: DeclarationId(525), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21762, 21769) }, - Declaration { id: DeclarationId(526), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21856, 21863) }, - Declaration { id: DeclarationId(527), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21891, 21903) }, - Declaration { id: DeclarationId(528), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21915, 21927) }, - Declaration { id: DeclarationId(529), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21939, 21951) }, - Declaration { id: DeclarationId(530), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(183), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22086, 22101) }, - Declaration { id: DeclarationId(531), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(149), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22112, 22125) }, - Declaration { id: DeclarationId(532), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(148), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22141, 22154) }, - Declaration { id: DeclarationId(533), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22180, 22184) }, - Declaration { id: DeclarationId(534), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22187, 22189) }, - Declaration { id: DeclarationId(535), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22192, 22193) }, - Declaration { id: DeclarationId(536), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22196, 22200) }, - Declaration { id: DeclarationId(537), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22264, 22271) }, - Declaration { id: DeclarationId(538), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 3063, 3080) }, - Declaration { id: DeclarationId(539), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 3533, 3549) }, - Declaration { id: DeclarationId(540), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 4740, 4757) }, - Declaration { id: DeclarationId(541), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 5722, 5741) }, - Declaration { id: DeclarationId(542), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10147, 10207) }, - Declaration { id: DeclarationId(543), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10208, 10268) }, - Declaration { id: DeclarationId(544), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10269, 10320) }, - Declaration { id: DeclarationId(545), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10321, 10376) }, - Declaration { id: DeclarationId(546), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10377, 10442) }, - Declaration { id: DeclarationId(547), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10443, 10498) }, - Declaration { id: DeclarationId(548), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10499, 10544) }, - Declaration { id: DeclarationId(549), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10587, 10629) }, - Declaration { id: DeclarationId(550), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10630, 10684) }, - Declaration { id: DeclarationId(551), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10685, 10748) }, - Declaration { id: DeclarationId(552), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10749, 10794) }, - Declaration { id: DeclarationId(553), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10795, 10840) }, - Declaration { id: DeclarationId(554), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10841, 10886) }, - Declaration { id: DeclarationId(555), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10887, 10933) }, - Declaration { id: DeclarationId(556), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10934, 10980) }, - Declaration { id: DeclarationId(557), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11151, 11210) }, - Declaration { id: DeclarationId(558), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11211, 11270) }, - Declaration { id: DeclarationId(559), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11375, 11418) }, - Declaration { id: DeclarationId(560), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12098, 12196) }, - Declaration { id: DeclarationId(561), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12197, 12241) }, - Declaration { id: DeclarationId(562), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12242, 12286) }, - Declaration { id: DeclarationId(563), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12287, 12354) }, - Declaration { id: DeclarationId(564), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12355, 12417) }, - Declaration { id: DeclarationId(565), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12941, 12996) }, - Declaration { id: DeclarationId(566), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12997, 13051) }, - Declaration { id: DeclarationId(567), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13052, 13105) }, - Declaration { id: DeclarationId(568), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13106, 13163) }, - Declaration { id: DeclarationId(569), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13164, 13221) }, - Declaration { id: DeclarationId(570), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13222, 13277) }, - Declaration { id: DeclarationId(571), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13278, 13334) }, - Declaration { id: DeclarationId(572), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13335, 13391) }, - Declaration { id: DeclarationId(573), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13392, 13450) }, - Declaration { id: DeclarationId(574), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13530, 13572) }, - Declaration { id: DeclarationId(575), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13779, 13864) }, - Declaration { id: DeclarationId(576), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13865, 13974) }, - Declaration { id: DeclarationId(577), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 17397, 17447) }, - Declaration { id: DeclarationId(578), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 17448, 17500) }, - Declaration { id: DeclarationId(579), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 17641, 17702) }, - Declaration { id: DeclarationId(580), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19562, 19626) }, - Declaration { id: DeclarationId(581), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19627, 19684) }, - Declaration { id: DeclarationId(582), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19685, 19741) }, - Declaration { id: DeclarationId(583), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 3679, 3689) }, - Declaration { id: DeclarationId(584), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 3692, 3697) }, - Declaration { id: DeclarationId(585), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 3700, 3710) }, - Declaration { id: DeclarationId(586), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 3713, 3726) }, - Declaration { id: DeclarationId(587), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 4762, 4771) }, - Declaration { id: DeclarationId(588), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 4774, 4780) }, - Declaration { id: DeclarationId(589), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 4783, 4787) }, - Declaration { id: DeclarationId(590), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(191) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 5335, 5353) }, - Declaration { id: DeclarationId(591), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 6155, 6164) }, - Declaration { id: DeclarationId(592), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(191) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 6404, 6422) }, - Declaration { id: DeclarationId(593), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(39), arguments: vec![TemplateArgument { parameter: DeclarationId(40), value: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 7546, 7570) }, - Declaration { id: DeclarationId(594), name: Some("List".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Empty".to_string(), ty: DeclarationId(1409) }, Field { label: "Cons".to_string(), ty: DeclarationId(1411) }] }, type_params: vec![DeclarationId(595)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 2083, 2159) }, - Declaration { id: DeclarationId(595), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("element".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 2083, 2159) }, - Declaration { id: DeclarationId(596), name: Some("empty".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(1379), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 3273, 3284)) }, type_params: vec![DeclarationId(597)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3236, 3284) }, - Declaration { id: DeclarationId(597), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("element".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3236, 3284) }, - Declaration { id: DeclarationId(598), name: Some("cons".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(599), DeclarationId(1380)], output: DeclarationId(1381), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 3453, 3475)) }, type_params: vec![DeclarationId(599)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3383, 3475) }, - Declaration { id: DeclarationId(599), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("element".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3383, 3475) }, - Declaration { id: DeclarationId(600), name: Some("singleton".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(601)], output: DeclarationId(1382), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 3570, 3590)) }, type_params: vec![DeclarationId(601)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3519, 3590) }, - Declaration { id: DeclarationId(601), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("element".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3519, 3590) }, - Declaration { id: DeclarationId(602), name: Some("fold".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1383), DeclarationId(604), DeclarationId(1384)], output: DeclarationId(604), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 4203, 4307)) }, type_params: vec![DeclarationId(603), DeclarationId(604)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4142, 4307) }, - Declaration { id: DeclarationId(603), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4142, 4307) }, - Declaration { id: DeclarationId(604), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("U".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4142, 4307) }, - Declaration { id: DeclarationId(605), name: Some("fold_right".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1385), DeclarationId(607), DeclarationId(1386)], output: DeclarationId(607), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 4658, 4768)) }, type_params: vec![DeclarationId(606), DeclarationId(607)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4591, 4768) }, - Declaration { id: DeclarationId(606), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4591, 4768) }, - Declaration { id: DeclarationId(607), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("U".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4591, 4768) }, - Declaration { id: DeclarationId(608), name: Some("concat".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1387), DeclarationId(1388)], output: DeclarationId(1389), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 5386, 5414)) }, type_params: vec![DeclarationId(609)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5314, 5414) }, - Declaration { id: DeclarationId(609), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("element".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5314, 5414) }, - Declaration { id: DeclarationId(610), name: Some("map".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1390), DeclarationId(1391)], output: DeclarationId(1392), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 5721, 5778)) }, type_params: vec![DeclarationId(611), DeclarationId(612)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5667, 5778) }, - Declaration { id: DeclarationId(611), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("A".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5667, 5778) }, - Declaration { id: DeclarationId(612), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("B".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5667, 5778) }, - Declaration { id: DeclarationId(613), name: Some("filter".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1393), DeclarationId(1394)], output: DeclarationId(1395), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 5905, 5988)) }, type_params: vec![DeclarationId(614)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5848, 5988) }, - Declaration { id: DeclarationId(614), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5848, 5988) }, - Declaration { id: DeclarationId(615), name: Some("flat_map".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1396), DeclarationId(1398)], output: DeclarationId(1399), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 6171, 6230)) }, type_params: vec![DeclarationId(616), DeclarationId(617)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6106, 6230) }, - Declaration { id: DeclarationId(616), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("A".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6106, 6230) }, - Declaration { id: DeclarationId(617), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("B".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6106, 6230) }, - Declaration { id: DeclarationId(618), name: Some("length".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1400)], output: DeclarationId(71), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 6372, 6409)) }, type_params: vec![DeclarationId(619)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6337, 6409) }, - Declaration { id: DeclarationId(619), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6337, 6409) }, - Declaration { id: DeclarationId(620), name: Some("is_empty".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1401)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 6605, 6671)) }, type_params: vec![DeclarationId(621)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6567, 6671) }, - Declaration { id: DeclarationId(621), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6567, 6671) }, - Declaration { id: DeclarationId(622), name: Some("IndexedElement".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "index".to_string(), ty: DeclarationId(71) }, Field { label: "value".to_string(), ty: DeclarationId(623) }] }, type_params: vec![DeclarationId(623)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6993, 7055) }, - Declaration { id: DeclarationId(623), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("element".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6993, 7055) }, - Declaration { id: DeclarationId(624), name: Some("enumerate".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1402)], output: DeclarationId(1404), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 7238, 7269)) }, type_params: vec![DeclarationId(625)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7180, 7269) }, - Declaration { id: DeclarationId(625), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7180, 7269) }, - Declaration { id: DeclarationId(626), name: Some("enumerate_helper".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1405), DeclarationId(71)], output: DeclarationId(1407), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 7463, 7644)) }, type_params: vec![DeclarationId(627)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7386, 7644) }, - Declaration { id: DeclarationId(627), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7386, 7644) }, - Declaration { id: DeclarationId(628), name: Some("contains".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1408), DeclarationId(629)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 8205, 8332)) }, type_params: vec![DeclarationId(629)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 8156, 8332) }, - Declaration { id: DeclarationId(629), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 8156, 8332) }, - Declaration { id: DeclarationId(630), name: Some("NodeId".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1364, 1375) }, - Declaration { id: DeclarationId(631), name: Some("PortId".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1376, 1387) }, - Declaration { id: DeclarationId(632), name: Some("DeclarationId".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1388, 1406) }, - Declaration { id: DeclarationId(633), name: Some("ClusterId".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1407, 1421) }, - Declaration { id: DeclarationId(634), name: Some("NonEmptyList".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "first".to_string(), ty: DeclarationId(635) }, Field { label: "rest".to_string(), ty: DeclarationId(1412) }] }, type_params: vec![DeclarationId(635)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1423, 1492) }, - Declaration { id: DeclarationId(635), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("element".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1423, 1492) }, - Declaration { id: DeclarationId(636), name: Some("NonSingletonList".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "first".to_string(), ty: DeclarationId(637) }, Field { label: "second".to_string(), ty: DeclarationId(637) }, Field { label: "rest".to_string(), ty: DeclarationId(1413) }] }, type_params: vec![DeclarationId(637)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1494, 1585) }, - Declaration { id: DeclarationId(637), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("element".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1494, 1585) }, - Declaration { id: DeclarationId(638), name: Some("UrlPathToken".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "LiteralToken".to_string(), ty: DeclarationId(1428) }, Field { label: "ParamToken".to_string(), ty: DeclarationId(1429) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 7510, 7595) }, - Declaration { id: DeclarationId(639), name: Some("PathTemplate".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "tokens".to_string(), ty: DeclarationId(1430) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 7597, 7647) }, - Declaration { id: DeclarationId(640), name: Some("PathSegmentTokensResult".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ParsedSegmentTokens".to_string(), ty: DeclarationId(1432) }, Field { label: "MalformedPathSegment".to_string(), ty: DeclarationId(1433) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 8003, 8147) }, - Declaration { id: DeclarationId(641), name: Some("PathTemplateParseResult".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ParsedPathTemplate".to_string(), ty: DeclarationId(1434) }, Field { label: "MalformedPathTemplate".to_string(), ty: DeclarationId(1435) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 8477, 8630) }, - Declaration { id: DeclarationId(642), name: Some("parse_path_template".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(641), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 8695, 10000)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 8632, 10000) }, - Declaration { id: DeclarationId(643), name: Some("parse_segment_tokens".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(640), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 10066, 11705)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 10002, 11705) }, - Declaration { id: DeclarationId(644), name: Some("last_path_param".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(639)], output: DeclarationId(1414), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 11761, 12044)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 11707, 12044) }, - Declaration { id: DeclarationId(645), name: Some("IdempotentShape".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ReadEffect".to_string(), ty: DeclarationId(1436) }, Field { label: "UpsertEffect".to_string(), ty: DeclarationId(1437) }, Field { label: "DeleteEffect".to_string(), ty: DeclarationId(1438) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 14330, 14451) }, - Declaration { id: DeclarationId(646), name: Some("BreakingShape".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "CreateEffect".to_string(), ty: DeclarationId(1439) }, Field { label: "AppendEffect".to_string(), ty: DeclarationId(1440) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 14674, 14749) }, - Declaration { id: DeclarationId(647), name: Some("EffectShape".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "IsIdempotent".to_string(), ty: DeclarationId(1441) }, Field { label: "IsBreaking".to_string(), ty: DeclarationId(1442) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 15150, 15230) }, - Declaration { id: DeclarationId(648), name: Some("CreateCause".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "PostAlways".to_string(), ty: DeclarationId(1443) }, Field { label: "KeylessFallback".to_string(), ty: DeclarationId(1444) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 15722, 15796) }, - Declaration { id: DeclarationId(649), name: Some("KeySource".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "PathParam".to_string(), ty: DeclarationId(1445) }, Field { label: "InputField".to_string(), ty: DeclarationId(1446) }, Field { label: "CompositeKey".to_string(), ty: DeclarationId(1448) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 16482, 16603) }, - Declaration { id: DeclarationId(650), name: Some("IdempotencyEvidence".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "LatticeEffect".to_string(), ty: DeclarationId(1449) }, Field { label: "IdentityEffect".to_string(), ty: DeclarationId(1450) }, Field { label: "NonIdempotent".to_string(), ty: DeclarationId(1451) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 17251, 17349) }, - Declaration { id: DeclarationId(651), name: Some("is_idempotent_effect".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(647)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 17576, 17648)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 17524, 17648) }, - Declaration { id: DeclarationId(652), name: Some("derive_idempotency_evidence".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(647)], output: DeclarationId(650), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 17861, 18381)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 17787, 18381) }, - Declaration { id: DeclarationId(653), name: Some("OperationEffect".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "operation_name".to_string(), ty: DeclarationId(186) }, Field { label: "shape".to_string(), ty: DeclarationId(647) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 19065, 19135) }, - Declaration { id: DeclarationId(654), name: Some("DeriveOpEffectResult".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "DerivedEffect".to_string(), ty: DeclarationId(1452) }, Field { label: "UnknownHttpMethodInput".to_string(), ty: DeclarationId(1453) }, Field { label: "MalformedPathInput".to_string(), ty: DeclarationId(1454) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 19489, 19789) }, - Declaration { id: DeclarationId(655), name: Some("CompositionVerdict".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "IdempotentComposition".to_string(), ty: DeclarationId(1455) }, Field { label: "BrokenBy".to_string(), ty: DeclarationId(1457) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 20510, 20619) }, - Declaration { id: DeclarationId(656), name: Some("operation_is_breaking".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(653)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 20809, 20884)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 20755, 20884) }, - Declaration { id: DeclarationId(657), name: Some("breaker_ref".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71)], output: DeclarationId(1415), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 20944, 20966)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 20886, 20966) }, - Declaration { id: DeclarationId(658), name: Some("indexed_breaker_ref".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1416)], output: DeclarationId(1418), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 21060, 21153)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 20968, 21153) }, - Declaration { id: DeclarationId(659), name: Some("first_breaker_ref".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1419)], output: DeclarationId(1421), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 21240, 21423)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 21155, 21423) }, - Declaration { id: DeclarationId(660), name: Some("compose_effects".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1422)], output: DeclarationId(655), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 22313, 22436)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 22240, 22436) }, - Declaration { id: DeclarationId(661), name: Some("BoolPortRef".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "port".to_string(), ty: DeclarationId(631) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 23637, 23672) }, - Declaration { id: DeclarationId(662), name: Some("BranchArm".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "condition".to_string(), ty: DeclarationId(661) }, Field { label: "body".to_string(), ty: DeclarationId(663) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 23757, 23823) }, - Declaration { id: DeclarationId(663), name: Some("WorkflowEffect".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "LinearEffect".to_string(), ty: DeclarationId(1459) }, Field { label: "BranchEffect".to_string(), ty: DeclarationId(1461) }, Field { label: "LoopEffect".to_string(), ty: DeclarationId(1462) }, Field { label: "ParallelEffect".to_string(), ty: DeclarationId(1464) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 24499, 24727) }, - Declaration { id: DeclarationId(664), name: Some("IdempotencyUnsupportedDetail".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "variant_name".to_string(), ty: DeclarationId(186) }, Field { label: "downstream_stage".to_string(), ty: DeclarationId(186) }, Field { label: "reason".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 25086, 25190) }, - Declaration { id: DeclarationId(665), name: Some("WorkflowIdempotencyReport".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "WorkflowCompositionVerdict".to_string(), ty: DeclarationId(1465) }, Field { label: "IdempotencyUnsupported".to_string(), ty: DeclarationId(1466) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 25329, 25467) }, - Declaration { id: DeclarationId(666), name: Some("report_unsupported_workflow_variant".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(186), DeclarationId(186)], output: DeclarationId(665), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 25609, 25765)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 25469, 25765) }, - Declaration { id: DeclarationId(667), name: Some("ParallelismUnsupportedKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "NoWorkflowProjection".to_string(), ty: DeclarationId(1467) }, Field { label: "NotParallelEffectRoot".to_string(), ty: DeclarationId(1468) }, Field { label: "NonLinearParallelBranch".to_string(), ty: DeclarationId(1469) }, Field { label: "PairwiseNonCommute".to_string(), ty: DeclarationId(1470) }, Field { label: "LensSurfacePending".to_string(), ty: DeclarationId(1471) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 25928, 26084) }, - Declaration { id: DeclarationId(668), name: Some("ParallelismUnsupportedDetail".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "kind".to_string(), ty: DeclarationId(667) }, Field { label: "downstream_stage".to_string(), ty: DeclarationId(186) }, Field { label: "reason".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 26086, 26202) }, - Declaration { id: DeclarationId(669), name: Some("WorkflowParallelismReport".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ParallelCompositionVerdict".to_string(), ty: DeclarationId(1472) }, Field { label: "ParallelismUnsupported".to_string(), ty: DeclarationId(1473) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 26366, 26504) }, - Declaration { id: DeclarationId(670), name: Some("report_parallelism_unsupported".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(667), DeclarationId(186)], output: DeclarationId(669), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 26625, 26780)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 26506, 26780) }, - Declaration { id: DeclarationId(671), name: Some("lane2_workflow_idempotency_report".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(663)], output: DeclarationId(665), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 27018, 27848)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 26932, 27848) }, - Declaration { id: DeclarationId(672), name: Some("parse_http_method".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(1423), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 29707, 30005)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 29658, 30005) }, - Declaration { id: DeclarationId(673), name: Some("keyless_create".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(156)], output: DeclarationId(647), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 30060, 30136)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 30007, 30136) }, - Declaration { id: DeclarationId(674), name: Some("upsert_or_create".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1424), DeclarationId(156)], output: DeclarationId(647), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 30476, 30628)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 30400, 30628) }, - Declaration { id: DeclarationId(675), name: Some("delete_or_create".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1425), DeclarationId(156)], output: DeclarationId(647), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 30706, 30858)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 30630, 30858) }, - Declaration { id: DeclarationId(676), name: Some("derive_effect_shape".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(156), DeclarationId(639)], output: DeclarationId(647), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 30944, 31429)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 30860, 31429) }, - Declaration { id: DeclarationId(677), name: Some("derive_op_effect".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(186), DeclarationId(186)], output: DeclarationId(654), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 31545, 32387)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 31431, 32387) }, - Declaration { id: DeclarationId(678), name: Some("ModifierAgreement".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Agrees".to_string(), ty: DeclarationId(1474) }, Field { label: "Disagrees".to_string(), ty: DeclarationId(1475) }, Field { label: "DerivationUnknown".to_string(), ty: DeclarationId(1476) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 33087, 33204) }, - Declaration { id: DeclarationId(679), name: Some("ModifierAxisCheck".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ModifierNotDeclared".to_string(), ty: DeclarationId(1477) }, Field { label: "ModifierDeclared".to_string(), ty: DeclarationId(1478) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 33651, 33751) }, - Declaration { id: DeclarationId(680), name: Some("ModifierCheck".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "operation_name".to_string(), ty: DeclarationId(186) }, Field { label: "derived_shape".to_string(), ty: DeclarationId(647) }, Field { label: "idempotent_check".to_string(), ty: DeclarationId(679) }, Field { label: "readonly_check".to_string(), ty: DeclarationId(679) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 33753, 33903) }, - Declaration { id: DeclarationId(681), name: Some("classify_idempotent_disagreement".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(646)], output: DeclarationId(678), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 34542, 35084)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 34463, 35084) }, - Declaration { id: DeclarationId(682), name: Some("classify_readonly_agreement".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(647)], output: DeclarationId(678), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 35488, 35930)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 35416, 35930) }, - Declaration { id: DeclarationId(683), name: Some("check_modifier_vs_derivation".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(653), DeclarationId(88), DeclarationId(88)], output: DeclarationId(680), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 36062, 36711)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 35932, 36711) }, - Declaration { id: DeclarationId(684), name: Some("IdempotencyTestObligation".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "operation_name".to_string(), ty: DeclarationId(186) }, Field { label: "effect_shape".to_string(), ty: DeclarationId(647) }, Field { label: "claim".to_string(), ty: DeclarationId(186) }, Field { label: "witness_required".to_string(), ty: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 37063, 37191) }, - Declaration { id: DeclarationId(685), name: Some("generate_idempotency_obligations".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1426)], output: DeclarationId(1427), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 37296, 37566)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 37193, 37566) }, - Declaration { id: DeclarationId(686), name: Some("WorkflowEffectConcern".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "workflow_name".to_string(), ty: DeclarationId(186) }, Field { label: "create_op".to_string(), ty: DeclarationId(186) }, Field { label: "reason".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 37883, 37974) }, - Declaration { id: DeclarationId(687), name: Some("TypeShape".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "declaration".to_string(), ty: DeclarationId(632) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 247, 294) }, - Declaration { id: DeclarationId(688), name: Some("PortState".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Uninferred".to_string(), ty: DeclarationId(1486) }, Field { label: "Resolved".to_string(), ty: DeclarationId(1487) }, Field { label: "Unresolved".to_string(), ty: DeclarationId(1488) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 437, 505) }, - Declaration { id: DeclarationId(689), name: Some("DagPort".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "id".to_string(), ty: DeclarationId(631) }, Field { label: "state".to_string(), ty: DeclarationId(688) }, Field { label: "produced_by".to_string(), ty: DeclarationId(1489) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 507, 578) }, - Declaration { id: DeclarationId(690), name: Some("LiteralBits".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "LitInt".to_string(), ty: DeclarationId(1490) }, Field { label: "LitBool".to_string(), ty: DeclarationId(1491) }, Field { label: "LitString".to_string(), ty: DeclarationId(1492) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 747, 819) }, - Declaration { id: DeclarationId(691), name: Some("AtomPayload".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Literal".to_string(), ty: DeclarationId(1493) }, Field { label: "UnresolvedIdentifier".to_string(), ty: DeclarationId(1494) }, Field { label: "ResolvedByStructure".to_string(), ty: DeclarationId(1495) }, Field { label: "ResolvedByName".to_string(), ty: DeclarationId(1496) }, Field { label: "TypeParam".to_string(), ty: DeclarationId(1497) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 2829, 2998) }, - Declaration { id: DeclarationId(692), name: Some("PositiveIntervalWidth".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "OneUnit".to_string(), ty: DeclarationId(1498) }, Field { label: "AdditionalUnit".to_string(), ty: DeclarationId(1499) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 3571, 3664) }, - Declaration { id: DeclarationId(693), name: Some("IntervalWidth".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ZeroWidth".to_string(), ty: DeclarationId(1500) }, Field { label: "PositiveWidth".to_string(), ty: DeclarationId(1501) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 3666, 3739) }, - Declaration { id: DeclarationId(694), name: Some("Interval".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "BoundedInterval".to_string(), ty: DeclarationId(1502) }, Field { label: "Unbounded".to_string(), ty: DeclarationId(1503) }] }, type_params: vec![DeclarationId(695)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4030, 4115) }, - Declaration { id: DeclarationId(695), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("D".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4030, 4115) }, - Declaration { id: DeclarationId(696), name: Some("CardinalityBound".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Exact".to_string(), ty: DeclarationId(1504) }, Field { label: "AtMostOne".to_string(), ty: DeclarationId(1505) }, Field { label: "Unbounded".to_string(), ty: DeclarationId(1506) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4340, 4404) }, - Declaration { id: DeclarationId(697), name: Some("ConjField".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "label".to_string(), ty: DeclarationId(186) }, Field { label: "ty".to_string(), ty: DeclarationId(632) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4406, 4460) }, - Declaration { id: DeclarationId(698), name: Some("TemplateArgument".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "parameter".to_string(), ty: DeclarationId(632) }, Field { label: "value".to_string(), ty: DeclarationId(632) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4462, 4537) }, - Declaration { id: DeclarationId(699), name: Some("FieldEntry".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "label".to_string(), ty: DeclarationId(186) }, Field { label: "value".to_string(), ty: DeclarationId(700) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4539, 4594) }, - Declaration { id: DeclarationId(700), name: Some("FieldValue".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Literal".to_string(), ty: DeclarationId(1507) }, Field { label: "Reference".to_string(), ty: DeclarationId(1508) }, Field { label: "Record".to_string(), ty: DeclarationId(1510) }, Field { label: "List".to_string(), ty: DeclarationId(1512) }, Field { label: "Map".to_string(), ty: DeclarationId(1514) }, Field { label: "Variant".to_string(), ty: DeclarationId(1516) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4811, 5047) }, - Declaration { id: DeclarationId(701), name: Some("ValueBody".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ValueBodyUnparsed".to_string(), ty: DeclarationId(1517) }, Field { label: "ValueBodyStructural".to_string(), ty: DeclarationId(1519) }, Field { label: "ValueBodyMap".to_string(), ty: DeclarationId(1521) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5187, 5323) }, - Declaration { id: DeclarationId(702), name: Some("ArrowBody".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "UserDefined".to_string(), ty: DeclarationId(1522) }, Field { label: "ExternalRealization".to_string(), ty: DeclarationId(1523) }, Field { label: "Pending".to_string(), ty: DeclarationId(1524) }, Field { label: "NoBody".to_string(), ty: DeclarationId(1525) }, Field { label: "Unparsed".to_string(), ty: DeclarationId(1526) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5639, 5764) }, - Declaration { id: DeclarationId(703), name: Some("TypeConnective".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Atom".to_string(), ty: DeclarationId(1527) }, Field { label: "Conj".to_string(), ty: DeclarationId(1529) }, Field { label: "Disj".to_string(), ty: DeclarationId(1531) }, Field { label: "Arrow".to_string(), ty: DeclarationId(1533) }, Field { label: "Cardinality".to_string(), ty: DeclarationId(1534) }, Field { label: "Instantiation".to_string(), ty: DeclarationId(1536) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5969, 6369) }, - Declaration { id: DeclarationId(704), name: Some("Declaration".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "id".to_string(), ty: DeclarationId(632) }, Field { label: "name".to_string(), ty: DeclarationId(1537) }, Field { label: "connective".to_string(), ty: DeclarationId(703) }, Field { label: "type_params".to_string(), ty: DeclarationId(1538) }, Field { label: "phantom_params".to_string(), ty: DeclarationId(1539) }, Field { label: "meta_tag".to_string(), ty: DeclarationId(1540) }, Field { label: "inhabits".to_string(), ty: DeclarationId(1541) }, Field { label: "value_body".to_string(), ty: DeclarationId(1542) }, Field { label: "nominal_opacity".to_string(), ty: DeclarationId(1543) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6371, 6665) }, - Declaration { id: DeclarationId(705), name: Some("PhantomParameter".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "parameter".to_string(), ty: DeclarationId(632) }, Field { label: "algebra".to_string(), ty: DeclarationId(632) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 7138, 7215) }, - Declaration { id: DeclarationId(706), name: Some("NominalOpacity".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "permitted_accessors".to_string(), ty: DeclarationId(1544) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 7722, 7788) }, - Declaration { id: DeclarationId(707), name: Some("ArithmeticOp".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Add".to_string(), ty: DeclarationId(1545) }, Field { label: "Sub".to_string(), ty: DeclarationId(1546) }, Field { label: "Mul".to_string(), ty: DeclarationId(1547) }, Field { label: "Div".to_string(), ty: DeclarationId(1548) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8045, 8094) }, - Declaration { id: DeclarationId(708), name: Some("ComparisonOp".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Eq".to_string(), ty: DeclarationId(1549) }, Field { label: "Ne".to_string(), ty: DeclarationId(1550) }, Field { label: "Lt".to_string(), ty: DeclarationId(1551) }, Field { label: "Le".to_string(), ty: DeclarationId(1552) }, Field { label: "Gt".to_string(), ty: DeclarationId(1553) }, Field { label: "Ge".to_string(), ty: DeclarationId(1554) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8196, 8255) }, - Declaration { id: DeclarationId(709), name: Some("LogicalOp".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "And".to_string(), ty: DeclarationId(1555) }, Field { label: "Or".to_string(), ty: DeclarationId(1556) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8489, 8518) }, - Declaration { id: DeclarationId(710), name: Some("OperatorKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Arithmetic".to_string(), ty: DeclarationId(1557) }, Field { label: "Comparison".to_string(), ty: DeclarationId(1558) }, Field { label: "Logical".to_string(), ty: DeclarationId(1559) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8732, 8830) }, - Declaration { id: DeclarationId(711), name: Some("TransformTarget".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Callable".to_string(), ty: DeclarationId(1560) }, Field { label: "FieldProject".to_string(), ty: DeclarationId(1562) }, Field { label: "Operator".to_string(), ty: DeclarationId(1563) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8992, 9152) }, - Declaration { id: DeclarationId(712), name: Some("BranchPattern".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "UnresolvedVariant".to_string(), ty: DeclarationId(1564) }, Field { label: "ResolvedVariant".to_string(), ty: DeclarationId(1565) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9254, 9364) }, - Declaration { id: DeclarationId(713), name: Some("PayloadBinding".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "binding_name".to_string(), ty: DeclarationId(186) }, Field { label: "payload_port".to_string(), ty: DeclarationId(631) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9366, 9435) }, - Declaration { id: DeclarationId(714), name: Some("BranchPath".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "body".to_string(), ty: DeclarationId(630) }, Field { label: "result_port".to_string(), ty: DeclarationId(631) }, Field { label: "pattern".to_string(), ty: DeclarationId(712) }, Field { label: "binding".to_string(), ty: DeclarationId(1566) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9437, 9545) }, - Declaration { id: DeclarationId(715), name: Some("ParamRef".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "member".to_string(), ty: DeclarationId(630) }, Field { label: "slot".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 10144, 10190) }, - Declaration { id: DeclarationId(716), name: Some("TransformRef".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "node".to_string(), ty: DeclarationId(630) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 10702, 10738) }, - Declaration { id: DeclarationId(717), name: Some("ElementRef".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "index".to_string(), ty: DeclarationId(71) }] }, type_params: vec![DeclarationId(718)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 11355, 11396) }, - Declaration { id: DeclarationId(718), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("element".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 11355, 11396) }, - Declaration { id: DeclarationId(719), name: Some("MemberDescent".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(715) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 11398, 11438) }, - Declaration { id: DeclarationId(720), name: Some("IntraClusterCall".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "transform".to_string(), ty: DeclarationId(716) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 11440, 11491) }, - Declaration { id: DeclarationId(721), name: Some("Cluster".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "members".to_string(), ty: DeclarationId(1567) }, Field { label: "intra_cluster_calls".to_string(), ty: DeclarationId(1568) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 11493, 11606) }, - Declaration { id: DeclarationId(722), name: Some("LoopBound".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Cardinality".to_string(), ty: DeclarationId(1569) }, Field { label: "Descent".to_string(), ty: DeclarationId(1570) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12011, 12094) }, - Declaration { id: DeclarationId(723), name: Some("ValueNode".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "id".to_string(), ty: DeclarationId(630) }, Field { label: "payload".to_string(), ty: DeclarationId(690) }, Field { label: "result_port".to_string(), ty: DeclarationId(631) }, Field { label: "span".to_string(), ty: DeclarationId(121) }, Field { label: "lane2_workflow".to_string(), ty: DeclarationId(1571) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12096, 12225) }, - Declaration { id: DeclarationId(724), name: Some("TransformNode".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "id".to_string(), ty: DeclarationId(630) }, Field { label: "target".to_string(), ty: DeclarationId(711) }, Field { label: "inputs".to_string(), ty: DeclarationId(1572) }, Field { label: "result_port".to_string(), ty: DeclarationId(631) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12227, 12352) }, - Declaration { id: DeclarationId(725), name: Some("BranchEmitParticipation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1573), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12517, 12559) }, - Declaration { id: DeclarationId(726), name: Some("BranchNode".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "id".to_string(), ty: DeclarationId(630) }, Field { label: "input".to_string(), ty: DeclarationId(631) }, Field { label: "paths".to_string(), ty: DeclarationId(1574) }, Field { label: "result_port".to_string(), ty: DeclarationId(631) }, Field { label: "span".to_string(), ty: DeclarationId(121) }, Field { label: "emit_participation".to_string(), ty: DeclarationId(1575) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12561, 12723) }, - Declaration { id: DeclarationId(727), name: Some("LoopNode".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "id".to_string(), ty: DeclarationId(630) }, Field { label: "source".to_string(), ty: DeclarationId(631) }, Field { label: "init".to_string(), ty: DeclarationId(631) }, Field { label: "body".to_string(), ty: DeclarationId(630) }, Field { label: "bound".to_string(), ty: DeclarationId(722) }, Field { label: "result_port".to_string(), ty: DeclarationId(631) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12725, 12862) }, - Declaration { id: DeclarationId(728), name: Some("BindEmitParticipation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1576), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13104, 13147) }, - Declaration { id: DeclarationId(729), name: Some("BindNode".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "id".to_string(), ty: DeclarationId(630) }, Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "result_port".to_string(), ty: DeclarationId(631) }, Field { label: "params".to_string(), ty: DeclarationId(1577) }, Field { label: "span".to_string(), ty: DeclarationId(121) }, Field { label: "lane2_workflow".to_string(), ty: DeclarationId(1578) }, Field { label: "emit_participation".to_string(), ty: DeclarationId(1579) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13149, 13337) }, - Declaration { id: DeclarationId(730), name: Some("Behavior".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Value".to_string(), ty: DeclarationId(1580) }, Field { label: "Transform".to_string(), ty: DeclarationId(1581) }, Field { label: "Branch".to_string(), ty: DeclarationId(1582) }, Field { label: "Loop".to_string(), ty: DeclarationId(1583) }, Field { label: "Bind".to_string(), ty: DeclarationId(1584) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13409, 13533) }, - Declaration { id: DeclarationId(731), name: Some("Dag".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "declarations".to_string(), ty: DeclarationId(1585) }, Field { label: "nodes".to_string(), ty: DeclarationId(1586) }, Field { label: "ports".to_string(), ty: DeclarationId(1587) }, Field { label: "clusters".to_string(), ty: DeclarationId(1588) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13535, 13654) }, - Declaration { id: DeclarationId(732), name: Some("SubstrateAccessorRealization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "carrier".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 15006, 15061) }, - Declaration { id: DeclarationId(733), name: Some("SubstrateAccessorBinding".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "accessor".to_string(), ty: DeclarationId(1006) }, Field { label: "realization".to_string(), ty: DeclarationId(1006) }, Field { label: "language".to_string(), ty: DeclarationId(1006) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 15828, 15945) }, - Declaration { id: DeclarationId(734), name: Some("port".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(731), DeclarationId(631)], output: DeclarationId(1479), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/substrate.dag", 15987, 16002)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 15947, 16002) }, - Declaration { id: DeclarationId(735), name: Some("node".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(731), DeclarationId(630)], output: DeclarationId(1480), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/substrate.dag", 16045, 16060)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 16004, 16060) }, - Declaration { id: DeclarationId(736), name: Some("resolve_producer".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(731), DeclarationId(631)], output: DeclarationId(1481), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/substrate.dag", 16120, 16147)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 16062, 16147) }, - Declaration { id: DeclarationId(737), name: Some("declaration_by_id".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(731), DeclarationId(632)], output: DeclarationId(1482), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/substrate.dag", 16509, 16537)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 16445, 16537) }, - Declaration { id: DeclarationId(738), name: Some("lane2_workflow_at".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(731), DeclarationId(630)], output: DeclarationId(1483), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/substrate.dag", 16833, 16868)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 16773, 16868) }, - Declaration { id: DeclarationId(739), name: Some("miss_declaration_id_lookup".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(1484), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/substrate.dag", 17225, 17235)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 17168, 17235) }, - Declaration { id: DeclarationId(740), name: Some("hit_declaration_id_lookup".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(632)], output: DeclarationId(1485), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/substrate.dag", 17310, 17323)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 17237, 17323) }, - Declaration { id: DeclarationId(741), name: Some("MethodRef".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "decl".to_string(), ty: DeclarationId(1006) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/methods.dag", 1474, 1515) }, - Declaration { id: DeclarationId(742), name: Some("CollectionSizeEffect".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ShrinkEffect".to_string(), ty: DeclarationId(1608) }, Field { label: "ProjectionEffect".to_string(), ty: DeclarationId(1609) }, Field { label: "IdentityEffect".to_string(), ty: DeclarationId(1610) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 4775, 4857) }, - Declaration { id: DeclarationId(743), name: Some("CostShape".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ShapeConstant".to_string(), ty: DeclarationId(1611) }, Field { label: "ShapeLinearScan".to_string(), ty: DeclarationId(1612) }, Field { label: "ShapeIterateBody".to_string(), ty: DeclarationId(1613) }, Field { label: "ShapeSortBody".to_string(), ty: DeclarationId(1614) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 5688, 5779) }, - Declaration { id: DeclarationId(744), name: Some("MethodContract".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "algebra_id".to_string(), ty: DeclarationId(632) }, Field { label: "method_id".to_string(), ty: DeclarationId(632) }, Field { label: "size_effect".to_string(), ty: DeclarationId(1615) }, Field { label: "cost_shape".to_string(), ty: DeclarationId(1616) }, Field { label: "callback_element_position".to_string(), ty: DeclarationId(1617) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 6540, 6714) }, - Declaration { id: DeclarationId(745), name: Some("SizeVariable".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "source_port".to_string(), ty: DeclarationId(631) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 7365, 7408) }, - Declaration { id: DeclarationId(746), name: Some("DegreeAtLeastTwo".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "DegreeTwo".to_string(), ty: DeclarationId(1618) }, Field { label: "DegreeSuccessor".to_string(), ty: DeclarationId(1619) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8155, 8241) }, - Declaration { id: DeclarationId(747), name: Some("SymbolicCost".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ConstantCost".to_string(), ty: DeclarationId(1620) }, Field { label: "LinearCost".to_string(), ty: DeclarationId(1621) }, Field { label: "PolynomialCost".to_string(), ty: DeclarationId(1622) }, Field { label: "ProductCost".to_string(), ty: DeclarationId(1624) }, Field { label: "SumCost".to_string(), ty: DeclarationId(1626) }, Field { label: "LogCost".to_string(), ty: DeclarationId(1627) }, Field { label: "UnknownCost".to_string(), ty: DeclarationId(1628) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8391, 8668) }, - Declaration { id: DeclarationId(748), name: Some("DominateScanAcc".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "any".to_string(), ty: DeclarationId(88) }, Field { label: "pivot".to_string(), ty: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 9074, 9132) }, - Declaration { id: DeclarationId(749), name: Some("dominate_scan_init".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(747)], output: DeclarationId(748), body: ArrowBody::UserDefined(NodeId(2)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 9134, 9229) }, - Declaration { id: DeclarationId(750), name: Some("miss_symbolic_cost_lookup".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(1589), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/algebra.dag", 9870, 9880)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 9815, 9880) }, - Declaration { id: DeclarationId(751), name: Some("hit_symbolic_cost_lookup".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(747)], output: DeclarationId(1590), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/algebra.dag", 9954, 9969)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 9882, 9969) }, - Declaration { id: DeclarationId(752), name: Some("two_terms".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(747), DeclarationId(747)], output: DeclarationId(1591), body: ArrowBody::UserDefined(NodeId(6)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 9971, 10446) }, - Declaration { id: DeclarationId(753), name: Some("many_terms".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(747), DeclarationId(747), DeclarationId(1592)], output: DeclarationId(1593), body: ArrowBody::UserDefined(NodeId(8)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 10448, 10633) }, - Declaration { id: DeclarationId(754), name: Some("reject_all_symbolic_costs".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(747)], output: DeclarationId(88), body: ArrowBody::UserDefined(NodeId(13)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 10635, 10763) }, - Declaration { id: DeclarationId(755), name: Some("degree_raw".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(746)], output: DeclarationId(71), body: ArrowBody::UserDefined(NodeId(21)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 10765, 10918) }, - Declaration { id: DeclarationId(756), name: Some("sequential".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(747), DeclarationId(747)], output: DeclarationId(747), body: ArrowBody::UserDefined(NodeId(25)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 11154, 11257) }, - Declaration { id: DeclarationId(757), name: Some("iterate".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(747), DeclarationId(747)], output: DeclarationId(747), body: ArrowBody::UserDefined(NodeId(29)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 11443, 11561) }, - Declaration { id: DeclarationId(758), name: Some("max_path_step".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(747), DeclarationId(747)], output: DeclarationId(747), body: ArrowBody::UserDefined(NodeId(33)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 12421, 12588) }, - Declaration { id: DeclarationId(759), name: Some("keep_or_sum".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(747), DeclarationId(747)], output: DeclarationId(747), body: ArrowBody::UserDefined(NodeId(37)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 12590, 12748) }, - Declaration { id: DeclarationId(760), name: Some("max_path".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1594)], output: DeclarationId(747), body: ArrowBody::UserDefined(NodeId(41)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 13050, 13152) }, - Declaration { id: DeclarationId(761), name: Some("dominates".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(747), DeclarationId(747)], output: DeclarationId(88), body: ArrowBody::UserDefined(NodeId(94)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 14020, 16105) }, - Declaration { id: DeclarationId(762), name: Some("same_size_variable".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(745), DeclarationId(745)], output: DeclarationId(88), body: ArrowBody::UserDefined(NodeId(98)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 16107, 16205) }, - Declaration { id: DeclarationId(763), name: Some("normalize".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(747)], output: DeclarationId(747), body: ArrowBody::UserDefined(NodeId(106)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 16963, 17266) }, - Declaration { id: DeclarationId(764), name: Some("nsl_to_list".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1595)], output: DeclarationId(1596), body: ArrowBody::UserDefined(NodeId(112)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17268, 17397) }, - Declaration { id: DeclarationId(765), name: Some("drop_zero".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1597)], output: DeclarationId(1598), body: ArrowBody::UserDefined(NodeId(125)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17574, 17839) }, - Declaration { id: DeclarationId(766), name: Some("is_zero_constant".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(747)], output: DeclarationId(88), body: ArrowBody::UserDefined(NodeId(135)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17841, 18095) }, - Declaration { id: DeclarationId(767), name: Some("reduce_sum".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1599)], output: DeclarationId(747), body: ArrowBody::UserDefined(NodeId(147)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 18880, 19151) }, - Declaration { id: DeclarationId(768), name: Some("wrap_sum".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1600)], output: DeclarationId(747), body: ArrowBody::UserDefined(NodeId(159)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 19153, 19428) }, - Declaration { id: DeclarationId(769), name: Some("reduce_product".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1601)], output: DeclarationId(747), body: ArrowBody::UserDefined(NodeId(176)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 19613, 20034) }, - Declaration { id: DeclarationId(770), name: Some("combine_binary_product".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(747), DeclarationId(747)], output: DeclarationId(747), body: ArrowBody::UserDefined(NodeId(185)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 20199, 20586) }, - Declaration { id: DeclarationId(771), name: Some("combine_linear_with".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(745), DeclarationId(747), DeclarationId(747)], output: DeclarationId(747), body: ArrowBody::UserDefined(NodeId(194)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 20588, 20997) }, - Declaration { id: DeclarationId(772), name: Some("collapse_linear_square".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(745), DeclarationId(745), DeclarationId(747), DeclarationId(747)], output: DeclarationId(747), body: ArrowBody::UserDefined(NodeId(199)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 20999, 21215) }, - Declaration { id: DeclarationId(773), name: Some("polynomial_square".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(745)], output: DeclarationId(747), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/algebra.dag", 21271, 21321)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21217, 21321) }, - Declaration { id: DeclarationId(774), name: Some("product_pair".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(747), DeclarationId(747)], output: DeclarationId(747), body: ArrowBody::UserDefined(NodeId(202)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21323, 21421) }, - Declaration { id: DeclarationId(775), name: Some("fold_or_dominate_scan".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(748), DeclarationId(747)], output: DeclarationId(748), body: ArrowBody::UserDefined(NodeId(209)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21423, 21572) }, - Declaration { id: DeclarationId(776), name: Some("scan_hit".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(748)], output: DeclarationId(88), body: ArrowBody::UserDefined(NodeId(211)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21574, 21629) }, - Declaration { id: DeclarationId(777), name: Some("filter_not_dominated_by".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1602), DeclarationId(747)], output: DeclarationId(1603), body: ArrowBody::UserDefined(NodeId(224)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21631, 21993) }, - Declaration { id: DeclarationId(778), name: Some("drop_dominated_step".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1604), DeclarationId(747)], output: DeclarationId(1605), body: ArrowBody::UserDefined(NodeId(231)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21995, 22237) }, - Declaration { id: DeclarationId(779), name: Some("drop_dominated".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1606)], output: DeclarationId(1607), body: ArrowBody::UserDefined(NodeId(234)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 22425, 22537) }, - Declaration { id: DeclarationId(780), name: Some("CleanEmissionContract".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "expression_wrapping".to_string(), ty: DeclarationId(782) }, Field { label: "pattern_bindings".to_string(), ty: DeclarationId(783) }, Field { label: "variant_payload_field_access".to_string(), ty: DeclarationId(784) }, Field { label: "imports".to_string(), ty: DeclarationId(785) }, Field { label: "block_return".to_string(), ty: DeclarationId(786) }, Field { label: "variable_bindings".to_string(), ty: DeclarationId(787) }, Field { label: "match_arm_body".to_string(), ty: DeclarationId(788) }, Field { label: "correction_style".to_string(), ty: DeclarationId(789) }, Field { label: "post_emit_verifier".to_string(), ty: DeclarationId(790) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 562, 944) }, - Declaration { id: DeclarationId(781), name: Some("TargetCleanEmissionBinding".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "language".to_string(), ty: DeclarationId(883) }, Field { label: "clean_emission".to_string(), ty: DeclarationId(780) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 1748, 1848) }, - Declaration { id: DeclarationId(782), name: Some("ExpressionWrappingRule".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "WrapEverything".to_string(), ty: DeclarationId(1652) }, Field { label: "WrapOnlyInOperandPosition".to_string(), ty: DeclarationId(1653) }, Field { label: "NoWrapping".to_string(), ty: DeclarationId(1654) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 2192, 2283) }, - Declaration { id: DeclarationId(783), name: Some("PatternBindingRule".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "EmitBindingAlways".to_string(), ty: DeclarationId(1655) }, Field { label: "EmitUnderscoreWhenUnused".to_string(), ty: DeclarationId(1656) }, Field { label: "EmitPrefixedUnderscoreWhenUnused".to_string(), ty: DeclarationId(1657) }, Field { label: "NotApplicablePatternBinding".to_string(), ty: DeclarationId(1658) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 2520, 2663) }, - Declaration { id: DeclarationId(784), name: Some("VariantPayloadFieldAccessRule".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "AccessFromPayloadBinding".to_string(), ty: DeclarationId(1659) }, Field { label: "OverrideNamedFieldsAtBindingSite".to_string(), ty: DeclarationId(1660) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3330, 3430) }, - Declaration { id: DeclarationId(785), name: Some("ImportRule".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ImportEverythingDeclared".to_string(), ty: DeclarationId(1661) }, Field { label: "IncludeOnlyReferenced".to_string(), ty: DeclarationId(1662) }, Field { label: "ImportPerUsageSite".to_string(), ty: DeclarationId(1663) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3544, 3637) }, - Declaration { id: DeclarationId(786), name: Some("BlockReturnRule".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "WrapReturnValue".to_string(), ty: DeclarationId(1664) }, Field { label: "NoWrappingOnTerminalExpression".to_string(), ty: DeclarationId(1665) }, Field { label: "ExplicitReturnKeyword".to_string(), ty: DeclarationId(1666) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3756, 3857) }, - Declaration { id: DeclarationId(787), name: Some("VariableBindingRule".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "EmitLetBindingAlways".to_string(), ty: DeclarationId(1667) }, Field { label: "EmitLetUnderscoreWhenUnused".to_string(), ty: DeclarationId(1668) }, Field { label: "OmitLetBinding".to_string(), ty: DeclarationId(1669) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3995, 4095) }, - Declaration { id: DeclarationId(788), name: Some("MatchArmBodyRule".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "WrapBody".to_string(), ty: DeclarationId(1670) }, Field { label: "NoWrappingOnNonComplexBody".to_string(), ty: DeclarationId(1671) }, Field { label: "NotApplicableMatchArmBody".to_string(), ty: DeclarationId(1672) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 4328, 4423) }, - Declaration { id: DeclarationId(789), name: Some("CorrectionStyle".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "indent_unit".to_string(), ty: DeclarationId(186) }, Field { label: "line_ending".to_string(), ty: DeclarationId(186) }, Field { label: "string_quote".to_string(), ty: DeclarationId(186) }, Field { label: "trailing_semicolon".to_string(), ty: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 4736, 4854) }, - Declaration { id: DeclarationId(790), name: Some("PostEmitVerifier".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "command".to_string(), ty: DeclarationId(186) }, Field { label: "args".to_string(), ty: DeclarationId(1673) }, Field { label: "syntax_only".to_string(), ty: DeclarationId(88) }, Field { label: "expected_exit_code".to_string(), ty: DeclarationId(71) }, Field { label: "output_policy".to_string(), ty: DeclarationId(791) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 5270, 5418) }, - Declaration { id: DeclarationId(791), name: Some("VerifierOutputPolicy".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "IgnoreVerifierOutput".to_string(), ty: DeclarationId(1674) }, Field { label: "RequireEmptyStdout".to_string(), ty: DeclarationId(1675) }, Field { label: "RequireEmptyStderr".to_string(), ty: DeclarationId(1676) }, Field { label: "RequireEmptyStdoutAndStderr".to_string(), ty: DeclarationId(1677) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 5663, 5791) }, - Declaration { id: DeclarationId(792), name: Some("SizeBound".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "CollectionSize".to_string(), ty: DeclarationId(1682) }, Field { label: "ParserStreamSize".to_string(), ty: DeclarationId(1683) }, Field { label: "WorklistDrainSize".to_string(), ty: DeclarationId(1684) }, Field { label: "TreeSize".to_string(), ty: DeclarationId(1685) }, Field { label: "ArithmeticParam".to_string(), ty: DeclarationId(1686) }, Field { label: "ExplicitCountZero".to_string(), ty: DeclarationId(1687) }, Field { label: "ExplicitCountPositive".to_string(), ty: DeclarationId(1688) }, Field { label: "Forever".to_string(), ty: DeclarationId(1689) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1337, 1633) }, - Declaration { id: DeclarationId(793), name: Some("tree_size_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(792), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/computation.dag", 1682, 1713)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1635, 1713) }, - Declaration { id: DeclarationId(794), name: Some("positive_descent_count".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(961)], output: DeclarationId(71), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/computation.dag", 1778, 1893)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1715, 1893) }, - Declaration { id: DeclarationId(795), name: Some("CallPattern".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ChildAccessorCall".to_string(), ty: DeclarationId(1690) }, Field { label: "CollectionShrinkCall".to_string(), ty: DeclarationId(1691) }, Field { label: "ArithmeticSubtractCall".to_string(), ty: DeclarationId(1692) }, Field { label: "ArithmeticDivideCall".to_string(), ty: DeclarationId(1693) }, Field { label: "ParserAdvanceCall".to_string(), ty: DeclarationId(1694) }, Field { label: "WorklistDrainCall".to_string(), ty: DeclarationId(1695) }, Field { label: "FoldBodyCall".to_string(), ty: DeclarationId(1696) }, Field { label: "SameArgumentCall".to_string(), ty: DeclarationId(1697) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2144, 2591) }, - Declaration { id: DeclarationId(796), name: Some("ShrinkFactor".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "UnitShrink".to_string(), ty: DeclarationId(1698) }, Field { label: "ConstantShrink".to_string(), ty: DeclarationId(1699) }, Field { label: "ProportionalShrink".to_string(), ty: DeclarationId(1700) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2781, 2921) }, - Declaration { id: DeclarationId(797), name: Some("IterationPrimitive".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Fold".to_string(), ty: DeclarationId(1701) }, Field { label: "Descend".to_string(), ty: DeclarationId(1702) }, Field { label: "Repeat".to_string(), ty: DeclarationId(1703) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 3083, 3138) }, - Declaration { id: DeclarationId(798), name: Some("LoweringTarget".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "primitive".to_string(), ty: DeclarationId(797) }, Field { label: "bound".to_string(), ty: DeclarationId(792) }, Field { label: "evidence".to_string(), ty: DeclarationId(953) }, Field { label: "factor".to_string(), ty: DeclarationId(1704) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 3330, 3456) }, - Declaration { id: DeclarationId(799), name: Some("lower_call_pattern".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(795)], output: DeclarationId(798), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/computation.dag", 3767, 5318)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 3705, 5318) }, - Declaration { id: DeclarationId(800), name: Some("size_bound_param".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(792)], output: DeclarationId(1678), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/computation.dag", 5369, 5794)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 5320, 5794) }, - Declaration { id: DeclarationId(801), name: Some("is_constant_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(792)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/computation.dag", 5843, 6014)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 5796, 6014) }, - Declaration { id: DeclarationId(802), name: Some("forever_iteration_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(71), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/computation.dag", 6131, 6154)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 6095, 6154) }, - Declaration { id: DeclarationId(803), name: Some("constant_bound_value".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(792)], output: DeclarationId(1679), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/computation.dag", 6297, 6569)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 6247, 6569) }, - Declaration { id: DeclarationId(804), name: Some("IterationDimension".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "TreeDescent".to_string(), ty: DeclarationId(1705) }, Field { label: "CollectionFold".to_string(), ty: DeclarationId(1706) }, Field { label: "ArithmeticRepeat".to_string(), ty: DeclarationId(1707) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 7054, 7237) }, - Declaration { id: DeclarationId(805), name: Some("algebra_profile_to_dimension".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(47)], output: DeclarationId(1680), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/computation.dag", 7370, 7863)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 7290, 7863) }, - Declaration { id: DeclarationId(806), name: Some("type_iteration_dimension".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(1681), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/computation.dag", 7935, 8154)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 7865, 8154) }, - Declaration { id: DeclarationId(807), name: Some("Mutability".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Immutable".to_string(), ty: DeclarationId(1708) }, Field { label: "Mutable".to_string(), ty: DeclarationId(1709) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 340, 381) }, - Declaration { id: DeclarationId(808), name: Some("Purity".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Pure".to_string(), ty: DeclarationId(1710) }, Field { label: "Effectful".to_string(), ty: DeclarationId(1711) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 598, 632) }, - Declaration { id: DeclarationId(809), name: Some("Structure".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ExplicitDAG".to_string(), ty: DeclarationId(1712) }, Field { label: "Arbitrary".to_string(), ty: DeclarationId(1713) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 891, 935) }, - Declaration { id: DeclarationId(810), name: Some("Iteration".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Bounded".to_string(), ty: DeclarationId(1714) }, Field { label: "Unbounded".to_string(), ty: DeclarationId(1715) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 1147, 1187) }, - Declaration { id: DeclarationId(811), name: Some("ComputationModel".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "mutability".to_string(), ty: DeclarationId(807) }, Field { label: "purity".to_string(), ty: DeclarationId(808) }, Field { label: "structure".to_string(), ty: DeclarationId(809) }, Field { label: "iteration".to_string(), ty: DeclarationId(810) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 1387, 1500) }, - Declaration { id: DeclarationId(812), name: Some("dag_model".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(811), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(811)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("mutability".to_string(), FieldValue::Variant { constructor: DeclarationId(1708), payload: vec![] }), ("purity".to_string(), FieldValue::Variant { constructor: DeclarationId(1710), payload: vec![] }), ("structure".to_string(), FieldValue::Variant { constructor: DeclarationId(1712), payload: vec![] }), ("iteration".to_string(), FieldValue::Variant { constructor: DeclarationId(1714), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 1502, 1625) }, - Declaration { id: DeclarationId(813), name: Some("MemoryModel".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ValueOnly".to_string(), ty: DeclarationId(1716) }, Field { label: "GarbageCollected".to_string(), ty: DeclarationId(1717) }, Field { label: "RefCounted".to_string(), ty: DeclarationId(1718) }, Field { label: "OwnershipBased".to_string(), ty: DeclarationId(1719) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2014, 2099) }, - Declaration { id: DeclarationId(814), name: Some("ScopeModel".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "LexicalScoping".to_string(), ty: DeclarationId(1720) }, Field { label: "DynamicScoping".to_string(), ty: DeclarationId(1721) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2365, 2418) }, - Declaration { id: DeclarationId(815), name: Some("TargetExecutionModel".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "memory".to_string(), ty: DeclarationId(813) }, Field { label: "scope".to_string(), ty: DeclarationId(814) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2561, 2632) }, - Declaration { id: DeclarationId(816), name: Some("SourceFiltering".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "excluded_prefixes".to_string(), ty: DeclarationId(1722) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2774, 2832) }, - Declaration { id: DeclarationId(817), name: Some("ShapeATargetSourceFiltering".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "internal".to_string(), ty: DeclarationId(816) }, Field { label: "additional_excluded_prefixes".to_string(), ty: DeclarationId(1723) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 3115, 3224) }, - Declaration { id: DeclarationId(818), name: Some("internal_source_filtering".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(816), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(816)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("excluded_prefixes".to_string(), FieldValue::List(vec![FieldValue::Literal(LiteralBits::String("dsl/std/".to_string())), FieldValue::Literal(LiteralBits::String("dsl/extdeps/".to_string())), FieldValue::Literal(LiteralBits::String("src/v3/std/".to_string())), FieldValue::Literal(LiteralBits::String("src/v3/spec/".to_string()))]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 3226, 3381) }, - Declaration { id: DeclarationId(819), name: Some("ExecutionModelRequirement".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "OwnershipBased".to_string(), ty: DeclarationId(1724) }, Field { label: "GarbageCollected".to_string(), ty: DeclarationId(1725) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 3659, 3729) }, - Declaration { id: DeclarationId(820), name: Some("CompilerDiagnosticKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "TokenizerError".to_string(), ty: DeclarationId(1726) }, Field { label: "ParseError".to_string(), ty: DeclarationId(1727) }, Field { label: "TypeMismatch".to_string(), ty: DeclarationId(1728) }, Field { label: "UnitMismatch".to_string(), ty: DeclarationId(1729) }, Field { label: "ArityMismatch".to_string(), ty: DeclarationId(1730) }, Field { label: "ResolveError".to_string(), ty: DeclarationId(1731) }, Field { label: "NominalOpacityViolation".to_string(), ty: DeclarationId(1732) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 990, 1148) }, - Declaration { id: DeclarationId(821), name: Some("Correction".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "description".to_string(), ty: DeclarationId(186) }, Field { label: "span".to_string(), ty: DeclarationId(121) }, Field { label: "new_source".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 1354, 1607) }, - Declaration { id: DeclarationId(822), name: Some("DiagnosticKindDecl".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "payload".to_string(), ty: DeclarationId(687) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 2387, 2450) }, - Declaration { id: DeclarationId(823), name: Some("LensInstanceKindWitness".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "kind_decl".to_string(), ty: DeclarationId(1006) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 4652, 4712) }, - Declaration { id: DeclarationId(824), name: Some("AnyDiagnosticKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "CompilerKind".to_string(), ty: DeclarationId(1733) }, Field { label: "LensInstanceKind".to_string(), ty: DeclarationId(1734) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 5321, 5430) }, - Declaration { id: DeclarationId(825), name: Some("Diagnostic".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "kind".to_string(), ty: DeclarationId(824) }, Field { label: "span".to_string(), ty: DeclarationId(121) }, Field { label: "message".to_string(), ty: DeclarationId(186) }, Field { label: "fixes".to_string(), ty: DeclarationId(1735) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 5799, 5907) }, - Declaration { id: DeclarationId(826), name: Some("Witness".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Inhabits".to_string(), ty: DeclarationId(1750) }, Field { label: "Violates".to_string(), ty: DeclarationId(1751) }] }, type_params: vec![DeclarationId(827)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 1600, 1689) }, - Declaration { id: DeclarationId(827), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Carrier".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 1600, 1689) }, - Declaration { id: DeclarationId(828), name: Some("OptionalDiagnostic".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "NoDiagnostic".to_string(), ty: DeclarationId(1752) }, Field { label: "SomeDiagnostic".to_string(), ty: DeclarationId(1753) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 1843, 1924) }, - Declaration { id: DeclarationId(829), name: Some("DimensionReport".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "DimensionOk".to_string(), ty: DeclarationId(1756) }, Field { label: "DimensionFail".to_string(), ty: DeclarationId(1760) }] }, type_params: vec![DeclarationId(830)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 2283, 2559) }, - Declaration { id: DeclarationId(830), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Carrier".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 2283, 2559) }, - Declaration { id: DeclarationId(831), name: Some("AnalysisDimension".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "witness_of".to_string(), ty: DeclarationId(1762) }, Field { label: "compose".to_string(), ty: DeclarationId(1763) }, Field { label: "identity".to_string(), ty: DeclarationId(832) }, Field { label: "break_diagnostic".to_string(), ty: DeclarationId(1764) }] }, type_params: vec![DeclarationId(832)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 3132, 3361) }, - Declaration { id: DeclarationId(832), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Carrier".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 3132, 3361) }, - Declaration { id: DeclarationId(833), name: Some("Dimension".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "value".to_string(), ty: DeclarationId(835) }] }, type_params: vec![DeclarationId(834), DeclarationId(835)], phantom_params: vec![PhantomParameter { parameter: DeclarationId(834), algebra: DeclarationId(1765) }], meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4002, 4052) }, - Declaration { id: DeclarationId(834), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Unit".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4002, 4052) }, - Declaration { id: DeclarationId(835), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Carrier".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4002, 4052) }, - Declaration { id: DeclarationId(836), name: Some("Meters".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4054, 4065) }, - Declaration { id: DeclarationId(837), name: Some("Seconds".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4066, 4078) }, - Declaration { id: DeclarationId(838), name: Some("Kilograms".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4079, 4093) }, - Declaration { id: DeclarationId(839), name: Some("Amperes".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4094, 4106) }, - Declaration { id: DeclarationId(840), name: Some("Kelvin".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4107, 4118) }, - Declaration { id: DeclarationId(841), name: Some("Moles".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4119, 4129) }, - Declaration { id: DeclarationId(842), name: Some("Candela".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4130, 4142) }, - Declaration { id: DeclarationId(843), name: Some("add_dimension".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1736), DeclarationId(1737), DeclarationId(1738)], output: DeclarationId(1739), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/dimensions.dag", 4316, 4338)) }, type_params: vec![DeclarationId(844), DeclarationId(845)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4144, 4338) }, - Declaration { id: DeclarationId(844), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Unit".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4144, 4338) }, - Declaration { id: DeclarationId(845), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Carrier".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4144, 4338) }, - Declaration { id: DeclarationId(846), name: Some("sub_dimension".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1740), DeclarationId(1741), DeclarationId(1742)], output: DeclarationId(1743), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/dimensions.dag", 4512, 4534)) }, type_params: vec![DeclarationId(847), DeclarationId(848)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4340, 4534) }, - Declaration { id: DeclarationId(847), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Unit".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4340, 4534) }, - Declaration { id: DeclarationId(848), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Carrier".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4340, 4534) }, - Declaration { id: DeclarationId(849), name: Some("mul_dimension_scalar".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1744), DeclarationId(1745), DeclarationId(851)], output: DeclarationId(1746), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/dimensions.dag", 4700, 4729)) }, type_params: vec![DeclarationId(850), DeclarationId(851)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4536, 4729) }, - Declaration { id: DeclarationId(850), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Unit".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4536, 4729) }, - Declaration { id: DeclarationId(851), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Carrier".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4536, 4729) }, - Declaration { id: DeclarationId(852), name: Some("div_dimension_scalar".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1747), DeclarationId(1748), DeclarationId(854)], output: DeclarationId(1749), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/dimensions.dag", 4895, 4924)) }, type_params: vec![DeclarationId(853), DeclarationId(854)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4731, 4924) }, - Declaration { id: DeclarationId(853), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Unit".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4731, 4924) }, - Declaration { id: DeclarationId(854), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Carrier".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4731, 4924) }, - Declaration { id: DeclarationId(855), name: Some("TypeRealization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "language".to_string(), ty: DeclarationId(1006) }, Field { label: "target".to_string(), ty: DeclarationId(1006) }, Field { label: "carrier".to_string(), ty: DeclarationId(186) }, Field { label: "is_copy".to_string(), ty: DeclarationId(88) }, Field { label: "fields".to_string(), ty: DeclarationId(1766) }, Field { label: "cost".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 696, 847) }, - Declaration { id: DeclarationId(856), name: Some("FieldBinding".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "dag_name".to_string(), ty: DeclarationId(186) }, Field { label: "access".to_string(), ty: DeclarationId(857) }, Field { label: "borrowed_read".to_string(), ty: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 849, 933) }, - Declaration { id: DeclarationId(857), name: Some("FieldAccess".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "DirectField".to_string(), ty: DeclarationId(1767) }, Field { label: "AccessorMethod".to_string(), ty: DeclarationId(1768) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 1316, 1383) }, - Declaration { id: DeclarationId(858), name: Some("OperatorRealization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "language".to_string(), ty: DeclarationId(1006) }, Field { label: "target".to_string(), ty: DeclarationId(1006) }, Field { label: "op".to_string(), ty: DeclarationId(1006) }, Field { label: "carrier".to_string(), ty: DeclarationId(186) }, Field { label: "cost".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 1385, 1516) }, - Declaration { id: DeclarationId(859), name: Some("BehaviorRealization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "language".to_string(), ty: DeclarationId(1006) }, Field { label: "target".to_string(), ty: DeclarationId(1006) }, Field { label: "carrier".to_string(), ty: DeclarationId(186) }, Field { label: "cost".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 1518, 1628) }, - Declaration { id: DeclarationId(860), name: Some("CallableRealization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "language".to_string(), ty: DeclarationId(1006) }, Field { label: "target".to_string(), ty: DeclarationId(1006) }, Field { label: "strategy".to_string(), ty: DeclarationId(864) }, Field { label: "parameters".to_string(), ty: DeclarationId(1769) }, Field { label: "cost".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 1630, 1789) }, - Declaration { id: DeclarationId(861), name: Some("CallableParameter".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "slot".to_string(), ty: DeclarationId(71) }, Field { label: "disposition".to_string(), ty: DeclarationId(862) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 2211, 2285) }, - Declaration { id: DeclarationId(862), name: Some("ParameterDisposition".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Borrowed".to_string(), ty: DeclarationId(1770) }, Field { label: "Consumed".to_string(), ty: DeclarationId(1771) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 2742, 2793) }, - Declaration { id: DeclarationId(863), name: Some("TypeInstantiationRealization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "language".to_string(), ty: DeclarationId(1006) }, Field { label: "target".to_string(), ty: DeclarationId(1006) }, Field { label: "carrier".to_string(), ty: DeclarationId(186) }, Field { label: "cost".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 2795, 2914) }, - Declaration { id: DeclarationId(864), name: Some("CallableStrategy".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ListEmpty".to_string(), ty: DeclarationId(1772) }, Field { label: "ListSingleton".to_string(), ty: DeclarationId(1773) }, Field { label: "ListCons".to_string(), ty: DeclarationId(1774) }, Field { label: "ListConcat".to_string(), ty: DeclarationId(1775) }, Field { label: "ListLength".to_string(), ty: DeclarationId(1776) }, Field { label: "ListIsEmpty".to_string(), ty: DeclarationId(1777) }, Field { label: "ListFold".to_string(), ty: DeclarationId(1778) }, Field { label: "ListMap".to_string(), ty: DeclarationId(1779) }, Field { label: "ListFilter".to_string(), ty: DeclarationId(1780) }, Field { label: "ListContains".to_string(), ty: DeclarationId(1781) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3319, 3488) }, - Declaration { id: DeclarationId(865), name: Some("PatternRealization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "language".to_string(), ty: DeclarationId(1006) }, Field { label: "target".to_string(), ty: DeclarationId(1006) }, Field { label: "strategy".to_string(), ty: DeclarationId(866) }, Field { label: "empty_variant".to_string(), ty: DeclarationId(1006) }, Field { label: "cons_variant".to_string(), ty: DeclarationId(1006) }, Field { label: "scrutinee".to_string(), ty: DeclarationId(186) }, Field { label: "empty_pattern".to_string(), ty: DeclarationId(186) }, Field { label: "cons_pattern".to_string(), ty: DeclarationId(186) }, Field { label: "head_expr".to_string(), ty: DeclarationId(186) }, Field { label: "tail_expr".to_string(), ty: DeclarationId(186) }, Field { label: "cost".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 5427, 5716) }, - Declaration { id: DeclarationId(866), name: Some("PatternStrategy".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "PlaceholderPatternStrategy".to_string(), ty: DeclarationId(1782) }, Field { label: "VectorList".to_string(), ty: DeclarationId(1783) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6156, 6222) }, - Declaration { id: DeclarationId(867), name: Some("StatementSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "let_binding".to_string(), ty: DeclarationId(186) }, Field { label: "let_binding_inferred".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6224, 6301) }, - Declaration { id: DeclarationId(868), name: Some("ExpressionSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "field_access".to_string(), ty: DeclarationId(186) }, Field { label: "function_call".to_string(), ty: DeclarationId(186) }, Field { label: "closure".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6303, 6393) }, - Declaration { id: DeclarationId(869), name: Some("ForEachSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "prefix".to_string(), ty: DeclarationId(186) }, Field { label: "separator".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6395, 6454) }, - Declaration { id: DeclarationId(870), name: Some("ControlFlowSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "if_else".to_string(), ty: DeclarationId(186) }, Field { label: "match_arm".to_string(), ty: DeclarationId(186) }, Field { label: "for_each_syntax".to_string(), ty: DeclarationId(869) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6456, 6553) }, - Declaration { id: DeclarationId(871), name: Some("LiteralSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "true_keyword".to_string(), ty: DeclarationId(186) }, Field { label: "false_keyword".to_string(), ty: DeclarationId(186) }, Field { label: "string_delimiter".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6555, 6651) }, - Declaration { id: DeclarationId(872), name: Some("ModuleSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "path_separator".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6653, 6699) }, - Declaration { id: DeclarationId(873), name: Some("FunctionSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "definition".to_string(), ty: DeclarationId(186) }, Field { label: "definition_exported".to_string(), ty: DeclarationId(186) }, Field { label: "definition_void".to_string(), ty: DeclarationId(186) }, Field { label: "param_with_type".to_string(), ty: DeclarationId(186) }, Field { label: "param_separator".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6701, 6853) }, - Declaration { id: DeclarationId(874), name: Some("TypeApplicationSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "optional".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6855, 6904) }, - Declaration { id: DeclarationId(875), name: Some("TypeDefinitionSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "struct_def".to_string(), ty: DeclarationId(186) }, Field { label: "struct_field".to_string(), ty: DeclarationId(186) }, Field { label: "enum_def".to_string(), ty: DeclarationId(186) }, Field { label: "enum_unit_variant".to_string(), ty: DeclarationId(186) }, Field { label: "enum_data_variant".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 7118, 7266) }, - Declaration { id: DeclarationId(876), name: Some("RecordDeriveTemplateBundle".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "struct_def_no_debug".to_string(), ty: DeclarationId(186) }, Field { label: "enum_def_no_debug".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 7927, 8020) }, - Declaration { id: DeclarationId(877), name: Some("PatternMatchSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "match_expr".to_string(), ty: DeclarationId(186) }, Field { label: "match_arm".to_string(), ty: DeclarationId(186) }, Field { label: "variant_pattern".to_string(), ty: DeclarationId(186) }, Field { label: "variant_pattern_positional".to_string(), ty: DeclarationId(186) }, Field { label: "variant_pattern_empty".to_string(), ty: DeclarationId(186) }, Field { label: "field_binding".to_string(), ty: DeclarationId(186) }, Field { label: "field_binding_separator".to_string(), ty: DeclarationId(186) }, Field { label: "wildcard".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 8724, 8964) }, - Declaration { id: DeclarationId(878), name: Some("CollectionOps".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "concat".to_string(), ty: DeclarationId(186) }, Field { label: "length".to_string(), ty: DeclarationId(186) }, Field { label: "is_empty".to_string(), ty: DeclarationId(186) }, Field { label: "fold".to_string(), ty: DeclarationId(186) }, Field { label: "map".to_string(), ty: DeclarationId(186) }, Field { label: "filter".to_string(), ty: DeclarationId(186) }, Field { label: "contains".to_string(), ty: DeclarationId(186) }, Field { label: "empty_list".to_string(), ty: DeclarationId(186) }, Field { label: "list_literal".to_string(), ty: DeclarationId(186) }, Field { label: "cons".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 8966, 9165) }, - Declaration { id: DeclarationId(879), name: Some("ValueConstructionSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "struct_literal".to_string(), ty: DeclarationId(186) }, Field { label: "struct_field_init".to_string(), ty: DeclarationId(186) }, Field { label: "struct_field_separator".to_string(), ty: DeclarationId(186) }, Field { label: "variant_construction".to_string(), ty: DeclarationId(186) }, Field { label: "variant_named_construction".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 9167, 9353) }, - Declaration { id: DeclarationId(880), name: Some("RenderingModel".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "read".to_string(), ty: DeclarationId(881) }, Field { label: "construct".to_string(), ty: DeclarationId(882) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 9355, 9430) }, - Declaration { id: DeclarationId(881), name: Some("ReadStrategy".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Borrow".to_string(), ty: DeclarationId(1784) }, Field { label: "PassByValue".to_string(), ty: DeclarationId(1785) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 9928, 9972) }, - Declaration { id: DeclarationId(882), name: Some("ConstructStrategy".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "CopyOrClone".to_string(), ty: DeclarationId(1786) }, Field { label: "PassByValue".to_string(), ty: DeclarationId(1787) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 10265, 10319) }, - Declaration { id: DeclarationId(883), name: Some("LanguageSpec".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "statements".to_string(), ty: DeclarationId(1006) }, Field { label: "expressions".to_string(), ty: DeclarationId(1006) }, Field { label: "control_flow".to_string(), ty: DeclarationId(1006) }, Field { label: "literals".to_string(), ty: DeclarationId(1006) }, Field { label: "modules".to_string(), ty: DeclarationId(1006) }, Field { label: "functions".to_string(), ty: DeclarationId(1006) }, Field { label: "type_applications".to_string(), ty: DeclarationId(1006) }, Field { label: "type_definitions".to_string(), ty: DeclarationId(1006) }, Field { label: "record_derive_templates".to_string(), ty: DeclarationId(1006) }, Field { label: "patterns".to_string(), ty: DeclarationId(1006) }, Field { label: "collection_ops".to_string(), ty: DeclarationId(1006) }, Field { label: "values".to_string(), ty: DeclarationId(1006) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 10321, 10847) }, - Declaration { id: DeclarationId(884), name: Some("PlaceholderConvention".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "IndexedArgs".to_string(), ty: DeclarationId(1788) }, Field { label: "NamedArg".to_string(), ty: DeclarationId(1789) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 12221, 12276) }, - Declaration { id: DeclarationId(885), name: Some("MethodTemplateContract".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "dag_method".to_string(), ty: DeclarationId(741) }, Field { label: "runtime_template".to_string(), ty: DeclarationId(186) }, Field { label: "emit_template".to_string(), ty: DeclarationId(186) }, Field { label: "wraps_result".to_string(), ty: DeclarationId(88) }, Field { label: "placeholder_convention".to_string(), ty: DeclarationId(884) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 14069, 14244) }, - Declaration { id: DeclarationId(886), name: Some("BootstrapFixture".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "virtual_path".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/extdeps_bootstrap_fixtures.dag", 1395, 1443) }, - Declaration { id: DeclarationId(887), name: Some("BootstrapFixtureSet".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "rust_pilot_primitives".to_string(), ty: DeclarationId(886) }, Field { label: "rust_method_template_contracts".to_string(), ty: DeclarationId(886) }, Field { label: "python_method_template_contracts".to_string(), ty: DeclarationId(886) }, Field { label: "go_method_template_contracts".to_string(), ty: DeclarationId(886) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/extdeps_bootstrap_fixtures.dag", 1600, 1823) }, - Declaration { id: DeclarationId(888), name: Some("bootstrap_fixture_authority".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(887), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(887)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("rust_pilot_primitives".to_string(), FieldValue::Record(vec![("virtual_path".to_string(), FieldValue::Literal(LiteralBits::String("dsl/extdeps/languages/rust/primitives.dag".to_string())))])), ("rust_method_template_contracts".to_string(), FieldValue::Record(vec![("virtual_path".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/std/rust_method_template_contracts.dag".to_string())))])), ("python_method_template_contracts".to_string(), FieldValue::Record(vec![("virtual_path".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/std/python_method_template_contracts.dag".to_string())))])), ("go_method_template_contracts".to_string(), FieldValue::Record(vec![("virtual_path".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/std/go_method_template_contracts.dag".to_string())))]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/extdeps_bootstrap_fixtures.dag", 1825, 2298) }, - Declaration { id: DeclarationId(889), name: Some("go_method_template_contracts".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(885) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1790)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(214)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("len({recv})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("len({recv})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(226)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("strings.Join({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("strings.Join({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(252)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("strings.Split({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("strings.Split({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(212)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("append({recv}, {arg}...)".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("append({recv}, {arg}...)".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(232)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.Map({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.Map({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(219)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.Filter({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.Filter({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(205)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.Any({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.Any({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(204)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.All({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.All({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(221)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.FlatMap({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.FlatMap({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(250)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[{arg}:]".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[{arg}:]".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(255)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[:{arg}]".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[:{arg}]".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(222)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.Fold({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.Fold({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(251)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.SortBy({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.SortBy({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(206)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("append({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("append({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })])])), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/go_method_template_contracts.dag", 2405, 5333) }, - Declaration { id: DeclarationId(890), name: Some("RecursionShape".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "DirectRecursion".to_string(), ty: DeclarationId(1800) }, Field { label: "ListRecursion".to_string(), ty: DeclarationId(1801) }, Field { label: "OptionalRecursion".to_string(), ty: DeclarationId(1802) }, Field { label: "SetRecursion".to_string(), ty: DeclarationId(1803) }, Field { label: "MapValueRecursion".to_string(), ty: DeclarationId(1804) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 5538, 5811) }, - Declaration { id: DeclarationId(891), name: Some("InductiveField".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "type_name".to_string(), ty: DeclarationId(186) }, Field { label: "variant_name".to_string(), ty: DeclarationId(186) }, Field { label: "field_name".to_string(), ty: DeclarationId(186) }, Field { label: "shape".to_string(), ty: DeclarationId(890) }, Field { label: "element_type".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 7103, 7525) }, - Declaration { id: DeclarationId(892), name: Some("recursion_shape_eq".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(890), DeclarationId(890)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 7595, 7967)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 7527, 7967) }, - Declaration { id: DeclarationId(893), name: Some("inductive_field_eq".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(891), DeclarationId(891)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 8037, 8235)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 7969, 8235) }, - Declaration { id: DeclarationId(894), name: Some("inductive_field_to_dimension".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(891), DeclarationId(186)], output: DeclarationId(960), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 8701, 8732)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 8611, 8732) }, - Declaration { id: DeclarationId(895), name: Some("SubValueRelation".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "StrictSubValue".to_string(), ty: DeclarationId(1805) }, Field { label: "IteratedSubValue".to_string(), ty: DeclarationId(1806) }, Field { label: "ArithmeticDescent".to_string(), ty: DeclarationId(1807) }, Field { label: "PreservedValue".to_string(), ty: DeclarationId(1808) }, Field { label: "SubValueUnknown".to_string(), ty: DeclarationId(1809) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 9878, 10114) }, - Declaration { id: DeclarationId(896), name: Some("sub_value_to_evidence".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(895)], output: DeclarationId(953), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 11067, 11670)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 10995, 11670) }, - Declaration { id: DeclarationId(897), name: Some("shrink_factor_eq".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(796), DeclarationId(796)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 12177, 12677)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 12115, 12677) }, - Declaration { id: DeclarationId(898), name: Some("meet_sub_value".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(895), DeclarationId(895)], output: DeclarationId(895), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 13200, 14612)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 13120, 14612) }, - Declaration { id: DeclarationId(899), name: Some("join_sub_value".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(895), DeclarationId(895)], output: DeclarationId(895), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 14944, 16247)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 14864, 16247) }, - Declaration { id: DeclarationId(900), name: Some("compose_sub_value".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(895), DeclarationId(891)], output: DeclarationId(895), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 17356, 17478)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 17268, 17478) }, - Declaration { id: DeclarationId(901), name: Some("compose_sub_value_relations".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(895), DeclarationId(895)], output: DeclarationId(895), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 18334, 19680)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 18226, 19680) }, - Declaration { id: DeclarationId(902), name: Some("sub_value_to_call_pattern".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(895)], output: DeclarationId(1791), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 20455, 21251)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 20382, 21251) }, - Declaration { id: DeclarationId(903), name: Some("sub_value_to_lowering_target".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(895)], output: DeclarationId(1792), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 21843, 22748)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 21764, 22748) }, - Declaration { id: DeclarationId(904), name: Some("PolynomialExponent".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "IntegerExpZero".to_string(), ty: DeclarationId(1810) }, Field { label: "IntegerExpPos".to_string(), ty: DeclarationId(1811) }, Field { label: "FractionExp".to_string(), ty: DeclarationId(1812) }, Field { label: "LogBasedExp".to_string(), ty: DeclarationId(1813) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 23991, 24246) }, - Declaration { id: DeclarationId(905), name: Some("poly_exp_degree_one".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(904), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 24295, 24334)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 24248, 24334) }, - Declaration { id: DeclarationId(906), name: Some("AtomicCost".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "PolyCost".to_string(), ty: DeclarationId(1814) }, Field { label: "LogCost".to_string(), ty: DeclarationId(1815) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 24846, 24963) }, - Declaration { id: DeclarationId(907), name: Some("CostBound".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ConstantBound".to_string(), ty: DeclarationId(1816) }, Field { label: "AtomicBound".to_string(), ty: DeclarationId(1817) }, Field { label: "ProductBound".to_string(), ty: DeclarationId(1819) }, Field { label: "SumOfProductsBound".to_string(), ty: DeclarationId(1822) }, Field { label: "SumBound".to_string(), ty: DeclarationId(1824) }, Field { label: "ForeverBound".to_string(), ty: DeclarationId(1825) }, Field { label: "ErrorBound".to_string(), ty: DeclarationId(1826) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 26593, 27353) }, - Declaration { id: DeclarationId(908), name: Some("sum_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1793)], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 27764, 27870)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 27714, 27870) }, - Declaration { id: DeclarationId(909), name: Some("cost_bound_is_sum_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(907)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 28194, 28447)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 28145, 28447) }, - Declaration { id: DeclarationId(910), name: Some("cost_constant".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 28481, 28498)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 28449, 28498) }, - Declaration { id: DeclarationId(911), name: Some("cost_linear".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 28542, 28626)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 28499, 28626) }, - Declaration { id: DeclarationId(912), name: Some("cost_poly".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(71)], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 28681, 29080)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 28627, 29080) }, - Declaration { id: DeclarationId(913), name: Some("cost_root".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(71)], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 29130, 29404)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 29081, 29404) }, - Declaration { id: DeclarationId(914), name: Some("cost_sqrt".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 29446, 29479)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 29405, 29479) }, - Declaration { id: DeclarationId(915), name: Some("cost_cbrt".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 29521, 29554)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 29480, 29554) }, - Declaration { id: DeclarationId(916), name: Some("cost_log".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 29595, 29645)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 29555, 29645) }, - Declaration { id: DeclarationId(917), name: Some("cost_nlogn".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 29689, 29807)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 29647, 29807) }, - Declaration { id: DeclarationId(918), name: Some("cost_graph_linear".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(186)], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 29877, 30053)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 29809, 30053) }, - Declaration { id: DeclarationId(919), name: Some("RecurrenceForm".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }, Field { label: "branches".to_string(), ty: DeclarationId(71) }, Field { label: "divisor".to_string(), ty: DeclarationId(71) }, Field { label: "work_exponent".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 31210, 31301) }, - Declaration { id: DeclarationId(920), name: Some("int_add_checked".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71), DeclarationId(71)], output: DeclarationId(1794), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 31892, 32143)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 31849, 32143) }, - Declaration { id: DeclarationId(921), name: Some("int_mul_checked".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71), DeclarationId(71)], output: DeclarationId(1795), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 32188, 32977)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 32145, 32977) }, - Declaration { id: DeclarationId(922), name: Some("bounded_int_pow_exponent".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71)], output: DeclarationId(1796), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 33437, 33560)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 33393, 33560) }, - Declaration { id: DeclarationId(923), name: Some("int_pow_bounded".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71), DeclarationId(71)], output: DeclarationId(1797), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 33912, 34957)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 33864, 34957) }, - Declaration { id: DeclarationId(924), name: Some("ceil_log".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71), DeclarationId(71)], output: DeclarationId(1798), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 35175, 35290)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 35129, 35290) }, - Declaration { id: DeclarationId(925), name: Some("ceil_log_iter".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71), DeclarationId(71), DeclarationId(71), DeclarationId(71)], output: DeclarationId(1799), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 35447, 35809)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 35376, 35809) }, - Declaration { id: DeclarationId(926), name: Some("master_theorem".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(919)], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 35864, 37901)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 35811, 37901) }, - Declaration { id: DeclarationId(927), name: Some("catamorphism_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(71)], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 38254, 38412)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 38184, 38412) }, - Declaration { id: DeclarationId(928), name: Some("derive_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(71), DeclarationId(796), DeclarationId(71)], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 38911, 39935)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 38810, 39935) }, - Declaration { id: DeclarationId(929), name: Some("tree_traversal_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 40268, 40325)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 40229, 40325) }, - Declaration { id: DeclarationId(930), name: Some("nested_iteration_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 40368, 40426)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 40327, 40426) }, - Declaration { id: DeclarationId(931), name: Some("linear_scan_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 40526, 40581)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 40490, 40581) }, - Declaration { id: DeclarationId(932), name: Some("binary_search_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 40778, 40893)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 40740, 40893) }, - Declaration { id: DeclarationId(933), name: Some("mergesort_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 40973, 41088)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 40939, 41088) }, - Declaration { id: DeclarationId(934), name: Some("karatsuba_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 41255, 41374)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 41221, 41374) }, - Declaration { id: DeclarationId(935), name: Some("strassen_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 41539, 41653)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 41506, 41653) }, - Declaration { id: DeclarationId(936), name: Some("trial_division_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 41770, 41795)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 41731, 41795) }, - Declaration { id: DeclarationId(937), name: Some("cube_root_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 41830, 41855)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 41796, 41855) }, - Declaration { id: DeclarationId(938), name: Some("kth_root_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71)], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 41937, 41968)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 41898, 41968) }, - Declaration { id: DeclarationId(939), name: Some("bfs_dfs_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 42204, 42255)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 42172, 42255) }, - Declaration { id: DeclarationId(940), name: Some("dijkstra_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 42346, 42628)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 42313, 42628) }, - Declaration { id: DeclarationId(941), name: Some("bellman_ford_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 42731, 42891)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 42694, 42891) }, - Declaration { id: DeclarationId(942), name: Some("floyd_warshall_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(907), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 42998, 43036)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 42959, 43036) }, - Declaration { id: DeclarationId(943), name: Some("Lens".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "read".to_string(), ty: DeclarationId(1828) }, Field { label: "sequential".to_string(), ty: DeclarationId(1829) }, Field { label: "branch".to_string(), ty: DeclarationId(1830) }, Field { label: "iterate".to_string(), ty: DeclarationId(1831) }, Field { label: "validate".to_string(), ty: DeclarationId(1832) }] }, type_params: vec![DeclarationId(944)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lens.dag", 4121, 4318) }, - Declaration { id: DeclarationId(944), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("C".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lens.dag", 4121, 4318) }, - Declaration { id: DeclarationId(945), name: Some("Lookup".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Miss".to_string(), ty: DeclarationId(1835) }, Field { label: "Hit".to_string(), ty: DeclarationId(1836) }] }, type_params: vec![DeclarationId(946)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lookup.dag", 4509, 4551) }, - Declaration { id: DeclarationId(946), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("value".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lookup.dag", 4509, 4551) }, - Declaration { id: DeclarationId(947), name: Some("miss_int_lookup".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(1833), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/lookup.dag", 4589, 4599)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lookup.dag", 4553, 4599) }, - Declaration { id: DeclarationId(948), name: Some("hit_int_lookup".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71)], output: DeclarationId(1834), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/lookup.dag", 4642, 4654)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lookup.dag", 4601, 4654) }, - Declaration { id: DeclarationId(949), name: Some("python_method_template_contracts".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(885) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1837)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(214)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("len({recv})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("len({recv})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(226)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{arg}.join({recv})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{arg}.join({recv})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(252)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.split({arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.split({arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(228)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[-1] if {recv} else None".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[-1] if {recv} else None".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(220)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[0] if {recv} else None".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[0] if {recv} else None".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(218)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("list(enumerate({recv}))".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("list(enumerate({recv}))".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(208)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("[ord(c) for c in {recv}]".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("[ord(c) for c in {recv}]".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(212)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv} + {arg}".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv} + {arg}".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(232)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("[{arg}(x) for x in {recv}]".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("[{arg}(x) for x in {recv}]".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(219)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("[x for x in {recv} if {arg}(x)]".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("[x for x in {recv} if {arg}(x)]".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(205)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("any({arg}(x) for x in {recv})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("any({arg}(x) for x in {recv})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(204)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("all({arg}(x) for x in {recv})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("all({arg}(x) for x in {recv})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(221)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("[y for x in {recv} for y in {arg}(x)]".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("[y for x in {recv} for y in {arg}(x)]".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(250)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[{arg}:]".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[{arg}:]".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(255)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[:{arg}]".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[:{arg}]".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(222)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("functools.reduce({arg}, {recv})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("functools.reduce({arg}, {recv})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(251)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("sorted({recv}, key={arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("sorted({recv}, key={arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(206)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv} + [{arg}]".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv} + [{arg}]".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })])])), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/python_method_template_contracts.dag", 2053, 5846) }, - Declaration { id: DeclarationId(950), name: Some("ResourceHandle".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "type".to_string(), ty: DeclarationId(186) }, Field { label: "resource_id".to_string(), ty: DeclarationId(186) }, Field { label: "key".to_string(), ty: DeclarationId(186) }, Field { label: "cap".to_string(), ty: DeclarationId(107) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/resources.dag", 739, 827) }, - Declaration { id: DeclarationId(951), name: Some("ResourceReference".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "target".to_string(), ty: DeclarationId(1006) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/resources.dag", 829, 880) }, - Declaration { id: DeclarationId(952), name: Some("rust_method_template_contracts".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(885) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1838)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(214)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.len()".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("({recv}.len() as i64)".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(226)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.join(&{arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.join(&{arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(252)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.split(&{arg}).map(|s| s.to_string()).collect::>()".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.split(&{arg}).map(|s| s.to_string()).collect::>()".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(228)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.last().cloned()".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.last().cloned()".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(220)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.first().cloned()".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.first().cloned()".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(218)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.iter().enumerate().map(|(i, v)| (i, v.clone())).collect::>()".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(208)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.chars().map(|c| c as i64).collect::>()".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.chars().map(|c| c as i64).collect::>()".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(250)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.iter().cloned().skip({arg} as usize).collect::>()".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.iter().cloned().skip({arg} as usize).collect::>()".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(255)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.iter().cloned().take({arg} as usize).collect::>()".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.iter().cloned().take({arg} as usize).collect::>()".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1789), payload: vec![] })])])), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/rust_method_template_contracts.dag", 4006, 6310) }, - Declaration { id: DeclarationId(953), name: Some("DescentEvidence".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Strict".to_string(), ty: DeclarationId(1846) }, Field { label: "NonIncreasing".to_string(), ty: DeclarationId(1847) }, Field { label: "DescentUnknown".to_string(), ty: DeclarationId(1848) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 642, 710) }, - Declaration { id: DeclarationId(954), name: Some("evidence_rank".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(953)], output: DeclarationId(71), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 756, 838)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 712, 838) }, - Declaration { id: DeclarationId(955), name: Some("merge_evidence".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(953), DeclarationId(953)], output: DeclarationId(953), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 982, 1310)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 905, 1310) }, - Declaration { id: DeclarationId(956), name: Some("join_evidence".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(953), DeclarationId(953)], output: DeclarationId(953), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 1456, 1655)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 1380, 1655) }, - Declaration { id: DeclarationId(957), name: Some("promote_to_strict".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(953)], output: DeclarationId(953), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 2117, 2236)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 2050, 2236) }, - Declaration { id: DeclarationId(958), name: Some("optional_evidence_meet".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1839), DeclarationId(1840)], output: DeclarationId(1841), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 2388, 2564)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 2300, 2564) }, - Declaration { id: DeclarationId(959), name: Some("map_evidence_merge_at".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1842), DeclarationId(186), DeclarationId(953)], output: DeclarationId(1843), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 2733, 2907)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 2601, 2907) }, - Declaration { id: DeclarationId(960), name: Some("RankingDimension".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "TreeSize".to_string(), ty: DeclarationId(1849) }, Field { label: "ListLength".to_string(), ty: DeclarationId(1850) }, Field { label: "ArithmeticValue".to_string(), ty: DeclarationId(1851) }, Field { label: "TokenPosition".to_string(), ty: DeclarationId(1852) }, Field { label: "SetCardinality".to_string(), ty: DeclarationId(1853) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 3206, 3402) }, - Declaration { id: DeclarationId(961), name: Some("PositiveDescentAmount".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "OneStep".to_string(), ty: DeclarationId(1854) }, Field { label: "AdditionalStep".to_string(), ty: DeclarationId(1855) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 4378, 4471) }, - Declaration { id: DeclarationId(962), name: Some("ProportionalDivisor".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "DivideByTwo".to_string(), ty: DeclarationId(1856) }, Field { label: "StrictlyLarger".to_string(), ty: DeclarationId(1857) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 4937, 5027) }, - Declaration { id: DeclarationId(963), name: Some("proportional_divisor_to_int".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(962)], output: DeclarationId(71), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 5091, 5204)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 5029, 5204) }, - Declaration { id: DeclarationId(964), name: Some("peano_literal_materialization_cap".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(71), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 5434, 5441)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 5388, 5441) }, - Declaration { id: DeclarationId(965), name: Some("positive_descent_amount_from_positive_int".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71)], output: DeclarationId(1844), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 5902, 6262)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 5823, 6262) }, - Declaration { id: DeclarationId(966), name: Some("proportional_divisor_from_int_at_least_two".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71)], output: DeclarationId(1845), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 6342, 6703)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 6264, 6703) }, - Declaration { id: DeclarationId(967), name: Some("DescentSource".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ChildAccessor".to_string(), ty: DeclarationId(1858) }, Field { label: "ListShrink".to_string(), ty: DeclarationId(1859) }, Field { label: "ArithmeticSubtractDescent".to_string(), ty: DeclarationId(1860) }, Field { label: "ArithmeticDivideDescent".to_string(), ty: DeclarationId(1861) }, Field { label: "ParserAdvance".to_string(), ty: DeclarationId(1862) }, Field { label: "SetRemoval".to_string(), ty: DeclarationId(1863) }, Field { label: "FoldIteration".to_string(), ty: DeclarationId(1864) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7108, 7429) }, - Declaration { id: DeclarationId(968), name: Some("TerminationProof".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "dimensions".to_string(), ty: DeclarationId(1865) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7431, 7493) }, - Declaration { id: DeclarationId(969), name: Some("ProofEdge".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "caller".to_string(), ty: DeclarationId(186) }, Field { label: "callee".to_string(), ty: DeclarationId(186) }, Field { label: "evidence".to_string(), ty: DeclarationId(1866) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7638, 7724) }, - Declaration { id: DeclarationId(970), name: Some("TokenKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "KwLet".to_string(), ty: DeclarationId(1867) }, Field { label: "KwIf".to_string(), ty: DeclarationId(1868) }, Field { label: "KwThen".to_string(), ty: DeclarationId(1869) }, Field { label: "KwElse".to_string(), ty: DeclarationId(1870) }, Field { label: "KwFn".to_string(), ty: DeclarationId(1871) }, Field { label: "KwType".to_string(), ty: DeclarationId(1872) }, Field { label: "KwModule".to_string(), ty: DeclarationId(1873) }, Field { label: "KwImport".to_string(), ty: DeclarationId(1874) }, Field { label: "KwMatch".to_string(), ty: DeclarationId(1875) }, Field { label: "KwData".to_string(), ty: DeclarationId(1876) }, Field { label: "KwWhere".to_string(), ty: DeclarationId(1877) }, Field { label: "KwTrue".to_string(), ty: DeclarationId(1878) }, Field { label: "KwFalse".to_string(), ty: DeclarationId(1879) }, Field { label: "Ident".to_string(), ty: DeclarationId(1880) }, Field { label: "IntLit".to_string(), ty: DeclarationId(1881) }, Field { label: "StringLit".to_string(), ty: DeclarationId(1882) }, Field { label: "Eq".to_string(), ty: DeclarationId(1883) }, Field { label: "EqEq".to_string(), ty: DeclarationId(1884) }, Field { label: "NotEq".to_string(), ty: DeclarationId(1885) }, Field { label: "Lt".to_string(), ty: DeclarationId(1886) }, Field { label: "Le".to_string(), ty: DeclarationId(1887) }, Field { label: "Gt".to_string(), ty: DeclarationId(1888) }, Field { label: "Ge".to_string(), ty: DeclarationId(1889) }, Field { label: "Plus".to_string(), ty: DeclarationId(1890) }, Field { label: "Minus".to_string(), ty: DeclarationId(1891) }, Field { label: "Star".to_string(), ty: DeclarationId(1892) }, Field { label: "Slash".to_string(), ty: DeclarationId(1893) }, Field { label: "AmpAmp".to_string(), ty: DeclarationId(1894) }, Field { label: "PipePipe".to_string(), ty: DeclarationId(1895) }, Field { label: "Colon".to_string(), ty: DeclarationId(1896) }, Field { label: "Arrow".to_string(), ty: DeclarationId(1897) }, Field { label: "FatArrow".to_string(), ty: DeclarationId(1898) }, Field { label: "PipeArrow".to_string(), ty: DeclarationId(1899) }, Field { label: "Dot".to_string(), ty: DeclarationId(1900) }, Field { label: "LParen".to_string(), ty: DeclarationId(1901) }, Field { label: "RParen".to_string(), ty: DeclarationId(1902) }, Field { label: "LBrace".to_string(), ty: DeclarationId(1903) }, Field { label: "RBrace".to_string(), ty: DeclarationId(1904) }, Field { label: "LBracket".to_string(), ty: DeclarationId(1905) }, Field { label: "RBracket".to_string(), ty: DeclarationId(1906) }, Field { label: "Comma".to_string(), ty: DeclarationId(1907) }, Field { label: "Semicolon".to_string(), ty: DeclarationId(1908) }, Field { label: "Pipe".to_string(), ty: DeclarationId(1909) }, Field { label: "Question".to_string(), ty: DeclarationId(1910) }, Field { label: "Eof".to_string(), ty: DeclarationId(1911) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 627, 1137) }, - Declaration { id: DeclarationId(971), name: Some("Token".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "kind".to_string(), ty: DeclarationId(970) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1272, 1323) }, - Declaration { id: DeclarationId(972), name: Some("KeywordTokenKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "KwLet".to_string(), ty: DeclarationId(1912) }, Field { label: "KwIf".to_string(), ty: DeclarationId(1913) }, Field { label: "KwThen".to_string(), ty: DeclarationId(1914) }, Field { label: "KwElse".to_string(), ty: DeclarationId(1915) }, Field { label: "KwFn".to_string(), ty: DeclarationId(1916) }, Field { label: "KwType".to_string(), ty: DeclarationId(1917) }, Field { label: "KwModule".to_string(), ty: DeclarationId(1918) }, Field { label: "KwImport".to_string(), ty: DeclarationId(1919) }, Field { label: "KwMatch".to_string(), ty: DeclarationId(1920) }, Field { label: "KwData".to_string(), ty: DeclarationId(1921) }, Field { label: "KwWhere".to_string(), ty: DeclarationId(1922) }, Field { label: "KwTrue".to_string(), ty: DeclarationId(1923) }, Field { label: "KwFalse".to_string(), ty: DeclarationId(1924) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1682, 1848) }, - Declaration { id: DeclarationId(973), name: Some("PunctTokenKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Eq".to_string(), ty: DeclarationId(1925) }, Field { label: "EqEq".to_string(), ty: DeclarationId(1926) }, Field { label: "NotEq".to_string(), ty: DeclarationId(1927) }, Field { label: "Lt".to_string(), ty: DeclarationId(1928) }, Field { label: "Le".to_string(), ty: DeclarationId(1929) }, Field { label: "Gt".to_string(), ty: DeclarationId(1930) }, Field { label: "Ge".to_string(), ty: DeclarationId(1931) }, Field { label: "Plus".to_string(), ty: DeclarationId(1932) }, Field { label: "Minus".to_string(), ty: DeclarationId(1933) }, Field { label: "Star".to_string(), ty: DeclarationId(1934) }, Field { label: "Slash".to_string(), ty: DeclarationId(1935) }, Field { label: "AmpAmp".to_string(), ty: DeclarationId(1936) }, Field { label: "PipePipe".to_string(), ty: DeclarationId(1937) }, Field { label: "Colon".to_string(), ty: DeclarationId(1938) }, Field { label: "Arrow".to_string(), ty: DeclarationId(1939) }, Field { label: "FatArrow".to_string(), ty: DeclarationId(1940) }, Field { label: "PipeArrow".to_string(), ty: DeclarationId(1941) }, Field { label: "Dot".to_string(), ty: DeclarationId(1942) }, Field { label: "LParen".to_string(), ty: DeclarationId(1943) }, Field { label: "RParen".to_string(), ty: DeclarationId(1944) }, Field { label: "LBrace".to_string(), ty: DeclarationId(1945) }, Field { label: "RBrace".to_string(), ty: DeclarationId(1946) }, Field { label: "LBracket".to_string(), ty: DeclarationId(1947) }, Field { label: "RBracket".to_string(), ty: DeclarationId(1948) }, Field { label: "Comma".to_string(), ty: DeclarationId(1949) }, Field { label: "Semicolon".to_string(), ty: DeclarationId(1950) }, Field { label: "Pipe".to_string(), ty: DeclarationId(1951) }, Field { label: "Question".to_string(), ty: DeclarationId(1952) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2264, 2570) }, - Declaration { id: DeclarationId(974), name: Some("LocalPunctSpec".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "pattern".to_string(), ty: DeclarationId(186) }, Field { label: "kind".to_string(), ty: DeclarationId(973) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2780, 2844) }, - Declaration { id: DeclarationId(975), name: Some("StringEscapeSpec".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "suffix".to_string(), ty: DeclarationId(186) }, Field { label: "output_codepoint".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 3231, 3297) }, - Declaration { id: DeclarationId(976), name: Some("Path".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(120), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 1292, 1312) }, - Declaration { id: DeclarationId(977), name: Some("SnapshotRef".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(111), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 1313, 1343) }, - Declaration { id: DeclarationId(978), name: Some("CensusListConstant".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 1480, 1506) }, - Declaration { id: DeclarationId(979), name: Some("expected_hand_authored_non_test".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(978), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(978)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 1508, 1569) }, - Declaration { id: DeclarationId(980), name: Some("expected_hand_authored_test".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(978), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(978)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 1570, 1627) }, - Declaration { id: DeclarationId(981), name: Some("LensProducerFilesSubsetPredicate".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 1759, 1799) }, - Declaration { id: DeclarationId(982), name: Some("lens_producer_files_subset_predicate".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(981), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(981)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 1801, 1881) }, - Declaration { id: DeclarationId(983), name: Some("CompilerStdPositiveSetRatchet".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 1960, 1997) }, - Declaration { id: DeclarationId(984), name: Some("compiler_std_positive_set_ratchet".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(983), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(983)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 1999, 2073) }, - Declaration { id: DeclarationId(985), name: Some("DiagnosticKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "TokenizerError".to_string(), ty: DeclarationId(1956) }, Field { label: "ParseError".to_string(), ty: DeclarationId(1957) }, Field { label: "TypeMismatch".to_string(), ty: DeclarationId(1958) }, Field { label: "UnitMismatch".to_string(), ty: DeclarationId(1959) }, Field { label: "ArityMismatch".to_string(), ty: DeclarationId(1960) }, Field { label: "ResolveError".to_string(), ty: DeclarationId(1961) }, Field { label: "NominalOpacityViolation".to_string(), ty: DeclarationId(1962) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2408, 2558) }, - Declaration { id: DeclarationId(986), name: Some("DiagnosticDetailExpectation".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "AnyDetail".to_string(), ty: DeclarationId(1963) }, Field { label: "Contains".to_string(), ty: DeclarationId(1964) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2927, 2994) }, - Declaration { id: DeclarationId(987), name: Some("DiagnosticReference".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "kind".to_string(), ty: DeclarationId(985) }, Field { label: "detail_contains".to_string(), ty: DeclarationId(986) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 3138, 3236) }, - Declaration { id: DeclarationId(988), name: Some("PortStateExpectation".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Resolved".to_string(), ty: DeclarationId(1965) }, Field { label: "Unresolved".to_string(), ty: DeclarationId(1966) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 3623, 3676) }, - Declaration { id: DeclarationId(989), name: Some("AlgebraicLawKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Associativity".to_string(), ty: DeclarationId(1967) }, Field { label: "Commutativity".to_string(), ty: DeclarationId(1968) }, Field { label: "Identity".to_string(), ty: DeclarationId(1969) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4465, 4535) }, - Declaration { id: DeclarationId(990), name: Some("TestPredicate".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Compiles".to_string(), ty: DeclarationId(1970) }, Field { label: "FailsWithDiagnostic".to_string(), ty: DeclarationId(1971) }, Field { label: "OutputEquals".to_string(), ty: DeclarationId(1972) }, Field { label: "PortHasState".to_string(), ty: DeclarationId(1973) }, Field { label: "DeclarationHasRefinement".to_string(), ty: DeclarationId(1974) }, Field { label: "CostBounded".to_string(), ty: DeclarationId(1975) }, Field { label: "BehavioralObservation".to_string(), ty: DeclarationId(1976) }, Field { label: "MockBackedInvariant".to_string(), ty: DeclarationId(1977) }, Field { label: "ExecuteCommand".to_string(), ty: DeclarationId(1979) }, Field { label: "ForAllTargets".to_string(), ty: DeclarationId(1981) }, Field { label: "LensOutputEquals".to_string(), ty: DeclarationId(1982) }, Field { label: "DifferentialEquals".to_string(), ty: DeclarationId(1983) }, Field { label: "AlgebraicLaw".to_string(), ty: DeclarationId(1984) }, Field { label: "CensusBoundCheck".to_string(), ty: DeclarationId(1985) }, Field { label: "CensusSubsetCount".to_string(), ty: DeclarationId(1986) }, Field { label: "FixedPointConverges".to_string(), ty: DeclarationId(1987) }, Field { label: "RatchetZero".to_string(), ty: DeclarationId(1988) }, Field { label: "GeneratedFromDag".to_string(), ty: DeclarationId(1990) }, Field { label: "ReleaseDeferredClaim".to_string(), ty: DeclarationId(1991) }, Field { label: "SubstrateResearchDeferredClaim".to_string(), ty: DeclarationId(1992) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4537, 11180) }, - Declaration { id: DeclarationId(991), name: Some("ProgramInput".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 11288, 11308) }, - Declaration { id: DeclarationId(992), name: Some("ProgramOutputBind".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "output_ref".to_string(), ty: DeclarationId(1006) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 11451, 11506) }, - Declaration { id: DeclarationId(993), name: Some("TestClaim".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "source".to_string(), ty: DeclarationId(186) }, Field { label: "file_name".to_string(), ty: DeclarationId(186) }, Field { label: "predicate".to_string(), ty: DeclarationId(990) }, Field { label: "requires".to_string(), ty: DeclarationId(1993) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12116, 12249) }, - Declaration { id: DeclarationId(994), name: Some("TestSuite".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "claims".to_string(), ty: DeclarationId(1994) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12251, 12310) }, - Declaration { id: DeclarationId(995), name: Some("TestObligation".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "claim_name".to_string(), ty: DeclarationId(186) }, Field { label: "resources".to_string(), ty: DeclarationId(1995) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12508, 12589) }, - Declaration { id: DeclarationId(996), name: Some("claim_obligation_resources".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(993)], output: DeclarationId(1953), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/verification.dag", 13031, 13047)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12960, 13047) }, - Declaration { id: DeclarationId(997), name: Some("obligation_for_claim".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(993)], output: DeclarationId(995), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/verification.dag", 13105, 13190)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 13049, 13190) }, - Declaration { id: DeclarationId(998), name: Some("materialize_test_obligations".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1954)], output: DeclarationId(1955), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/verification.dag", 13273, 13312)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 13192, 13312) }, - Declaration { id: DeclarationId(999), name: Some("behavior_spine".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(731)], output: DeclarationId(1996), body: ArrowBody::UserDefined(NodeId(236)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/workflows.dag", 963, 1018) }, - Declaration { id: DeclarationId(1000), name: Some("Value".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/v3_l1.dag", 2788, 2801) }, - Declaration { id: DeclarationId(1001), name: Some("Transform".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/v3_l1.dag", 2802, 2819) }, - Declaration { id: DeclarationId(1002), name: Some("Branch".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/v3_l1.dag", 2820, 2834) }, - Declaration { id: DeclarationId(1003), name: Some("Loop".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/v3_l1.dag", 2835, 2847) }, - Declaration { id: DeclarationId(1004), name: Some("Bind".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/v3_l1.dag", 2848, 2860) }, - Declaration { id: DeclarationId(1005), name: Some("Main".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/v3_l1.dag", 2861, 2873) }, - Declaration { id: DeclarationId(1006), name: Some("DeclarationRef".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/v3_l1.dag", 3283, 3305) }, - Declaration { id: DeclarationId(1007), name: Some("go_execution_model".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(815), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(815)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("memory".to_string(), FieldValue::Variant { constructor: DeclarationId(1717), payload: vec![] }), ("scope".to_string(), FieldValue::Variant { constructor: DeclarationId(1720), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 1538, 1640) }, - Declaration { id: DeclarationId(1008), name: Some("go_source_filtering".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(817), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(817)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("internal".to_string(), FieldValue::Reference(DeclarationId(818))), ("additional_excluded_prefixes".to_string(), FieldValue::List(vec![FieldValue::Literal(LiteralBits::String("src/v3/compiler/".to_string()))]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 1642, 1792) }, - Declaration { id: DeclarationId(1009), name: Some("go_execution_requirement".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(819), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(819)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/go.dag", 1853, 1869))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 1794, 1869) }, - Declaration { id: DeclarationId(1010), name: Some("go_int".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("int64".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 1871, 2001) }, - Declaration { id: DeclarationId(1011), name: Some("go_bool".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(88))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("bool".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 2003, 2134) }, - Declaration { id: DeclarationId(1012), name: Some("go_string".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(186))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("string".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 2136, 2273) }, - Declaration { id: DeclarationId(1013), name: Some("go_node_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(630))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NodeId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 2275, 2413) }, - Declaration { id: DeclarationId(1014), name: Some("go_port_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(631))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PortId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 2415, 2553) }, - Declaration { id: DeclarationId(1015), name: Some("go_declaration_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(632))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("DeclarationId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 2555, 2714) }, - Declaration { id: DeclarationId(1016), name: Some("go_cluster_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(633))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ClusterId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 2716, 2863) }, - Declaration { id: DeclarationId(1017), name: Some("go_type_shape".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(687))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TypeShape".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("declaration".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("declaration".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 2865, 3106) }, - Declaration { id: DeclarationId(1018), name: Some("go_port_state".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(688))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PortState".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 3108, 3256) }, - Declaration { id: DeclarationId(1019), name: Some("go_port".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(689))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("DagPort".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("state".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("state".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("produced_by".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("produced_by".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 3258, 3641) }, - Declaration { id: DeclarationId(1020), name: Some("go_source_span".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(121))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SourceSpan".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("file".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("file".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("start".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("byte_start".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("end".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("byte_end".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 3643, 4037) }, - Declaration { id: DeclarationId(1021), name: Some("go_literal_bits".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(690))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("LiteralBits".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 4039, 4193) }, - Declaration { id: DeclarationId(1022), name: Some("go_atom_payload".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(691))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("AtomPayload".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 4195, 4349) }, - Declaration { id: DeclarationId(1023), name: Some("go_cardinality_bound".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(696))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("CardinalityBound".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 4351, 4520) }, - Declaration { id: DeclarationId(1024), name: Some("go_interval".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(694))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Interval".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 4522, 4666) }, - Declaration { id: DeclarationId(1025), name: Some("go_positive_interval_width".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(692))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PositiveIntervalWidth".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 4668, 4853) }, - Declaration { id: DeclarationId(1026), name: Some("go_interval_width".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(693))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("IntervalWidth".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 4855, 5015) }, - Declaration { id: DeclarationId(1027), name: Some("go_conj_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(697))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ConjField".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("label".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("label".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("ty".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("ty".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 5017, 5319) }, - Declaration { id: DeclarationId(1028), name: Some("go_template_argument".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(698))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TemplateArgument".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("parameter".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("parameter".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("value".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("value".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 5321, 5658) }, - Declaration { id: DeclarationId(1029), name: Some("go_phantom_parameter".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(705))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PhantomParameter".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("parameter".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("parameter".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("algebra".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("algebra".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 5660, 6001) }, - Declaration { id: DeclarationId(1030), name: Some("go_nominal_opacity".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(706))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NominalOpacity".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("permitted_accessors".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("permitted_accessors".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 6003, 6275) }, - Declaration { id: DeclarationId(1031), name: Some("go_field_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(699))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("FieldEntry".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("label".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("label".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("value".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("value".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 6277, 6588) }, - Declaration { id: DeclarationId(1032), name: Some("go_non_empty_list".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(634))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NonEmptyList".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("first".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("first".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("rest".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("rest".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 6590, 6906) }, - Declaration { id: DeclarationId(1033), name: Some("go_non_singleton_list".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(636))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NonSingletonList".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("first".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("first".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("second".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("second".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("rest".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("rest".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 6908, 7317) }, - Declaration { id: DeclarationId(1034), name: Some("go_param_ref".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(715))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ParamRef".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("member".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1768), payload: vec![FieldValue::Literal(LiteralBits::String("member_of".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("slot".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1768), payload: vec![FieldValue::Literal(LiteralBits::String("slot_of".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 7319, 7635) }, - Declaration { id: DeclarationId(1035), name: Some("go_transform_ref".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(716))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TransformRef".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("node".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1768), payload: vec![FieldValue::Literal(LiteralBits::String("node_id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 7637, 7878) }, - Declaration { id: DeclarationId(1036), name: Some("go_member_descent".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(719))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("MemberDescent".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("param".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("param".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 7880, 8121) }, - Declaration { id: DeclarationId(1037), name: Some("go_intra_cluster_call".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(720))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("IntraClusterCall".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("transform".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("transform".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 8123, 8382) }, - Declaration { id: DeclarationId(1038), name: Some("go_cluster".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(721))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Cluster".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("members".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("members".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("intra_cluster_calls".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("intra_cluster_calls".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 8384, 8717) }, - Declaration { id: DeclarationId(1039), name: Some("go_field_value".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(700))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("FieldValue".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 8719, 8870) }, - Declaration { id: DeclarationId(1040), name: Some("go_value_body".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(701))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ValueBody".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 8872, 9020) }, - Declaration { id: DeclarationId(1041), name: Some("go_arrow_body".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(702))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ArrowBody".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 9022, 9170) }, - Declaration { id: DeclarationId(1042), name: Some("go_type_connective".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(703))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TypeConnective".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 9172, 9335) }, - Declaration { id: DeclarationId(1043), name: Some("go_declaration".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(704))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Declaration".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("connective".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("connective".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("type_params".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("type_params".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("phantom_params".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("phantom_params".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("meta_tag".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("meta_tag".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("inhabits".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("inhabits".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("value_body".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("value_body".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("nominal_opacity".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("nominal_opacity".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 9337, 10354) }, - Declaration { id: DeclarationId(1044), name: Some("go_arithmetic_op".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(707))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ArithmeticOp".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 10356, 10513) }, - Declaration { id: DeclarationId(1045), name: Some("go_comparison_op".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(708))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ComparisonOp".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 10515, 10672) }, - Declaration { id: DeclarationId(1046), name: Some("go_logical_op".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(709))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("LogicalOp".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 10674, 10822) }, - Declaration { id: DeclarationId(1047), name: Some("go_operator_kind".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(710))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("OperatorKind".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 10824, 10981) }, - Declaration { id: DeclarationId(1048), name: Some("go_transform_target".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(711))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TransformTarget".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 10983, 11149) }, - Declaration { id: DeclarationId(1049), name: Some("go_branch_pattern".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(712))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BranchPattern".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 11151, 11311) }, - Declaration { id: DeclarationId(1050), name: Some("go_payload_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(713))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PayloadBinding".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("binding_name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("binding_name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("payload_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("payload_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 11313, 11664) }, - Declaration { id: DeclarationId(1051), name: Some("go_branch_path".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(714))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BranchPath".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("body".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("body".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("pattern".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("pattern".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("binding".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("binding".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 11666, 12153) }, - Declaration { id: DeclarationId(1052), name: Some("go_loop_bound".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(722))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("LoopBound".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 12155, 12303) }, - Declaration { id: DeclarationId(1053), name: Some("go_value_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(723))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ValueNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("payload".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("payload".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 12777, 13251) }, - Declaration { id: DeclarationId(1054), name: Some("go_transform_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(724))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TransformNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("target".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("target".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("inputs".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("inputs".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 13253, 13818) }, - Declaration { id: DeclarationId(1055), name: Some("go_branch_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(726))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BranchNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("input".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("input".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("paths".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("paths".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("emit_participation".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("emit_participation".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 13820, 14477) }, - Declaration { id: DeclarationId(1056), name: Some("go_loop_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(727))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("LoopNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("source".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("source".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("init".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("init".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("body".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("body".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("bound".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("bound".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 14479, 15181) }, - Declaration { id: DeclarationId(1057), name: Some("go_bind_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(729))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BindNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("params".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("params".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("emit_participation".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("emit_participation".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 15183, 15834) }, - Declaration { id: DeclarationId(1058), name: Some("go_behavior".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(730))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Behavior".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 15836, 15980) }, - Declaration { id: DeclarationId(1059), name: Some("go_dag".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(731))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Dag".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("declarations".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("declarations".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("nodes".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("nodes".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("ports".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("ports".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("clusters".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("clusters".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 15982, 16449) }, - Declaration { id: DeclarationId(1060), name: Some("go_surface_module".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/go.dag", 16794, 16993))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 16752, 16993) }, - Declaration { id: DeclarationId(1061), name: Some("go_surface_item".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/go.dag", 17035, 17149))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 16995, 17149) }, - Declaration { id: DeclarationId(1062), name: Some("go_surface_param".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/go.dag", 17192, 17549))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 17151, 17549) }, - Declaration { id: DeclarationId(1063), name: Some("go_surface_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/go.dag", 17592, 17860))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 17551, 17860) }, - Declaration { id: DeclarationId(1064), name: Some("go_surface_variant".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/go.dag", 17905, 18264))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 17862, 18264) }, - Declaration { id: DeclarationId(1065), name: Some("go_variant_payload".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/go.dag", 18309, 18429))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 18266, 18429) }, - Declaration { id: DeclarationId(1066), name: Some("go_surface_type".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/go.dag", 18471, 18585))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 18431, 18585) }, - Declaration { id: DeclarationId(1067), name: Some("go_surface_record_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/go.dag", 18635, 18998))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 18587, 18998) }, - Declaration { id: DeclarationId(1068), name: Some("go_surface_map_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/go.dag", 19045, 19485))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 19000, 19485) }, - Declaration { id: DeclarationId(1069), name: Some("go_surface_match_arm".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/go.dag", 19532, 19893))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 19487, 19893) }, - Declaration { id: DeclarationId(1070), name: Some("go_surface_pattern_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/go.dag", 19944, 20313))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 19895, 20313) }, - Declaration { id: DeclarationId(1071), name: Some("go_surface_pattern".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/go.dag", 20358, 20478))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 20315, 20478) }, - Declaration { id: DeclarationId(1072), name: Some("go_surface_literal".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/go.dag", 20523, 20643))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 20480, 20643) }, - Declaration { id: DeclarationId(1073), name: Some("go_surface_expr".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/go.dag", 20685, 20799))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 20645, 20799) }, - Declaration { id: DeclarationId(1074), name: Some("go_int_add".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(300))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} + {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 20801, 20942) }, - Declaration { id: DeclarationId(1075), name: Some("go_int_sub".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(301))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} - {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 20944, 21085) }, - Declaration { id: DeclarationId(1076), name: Some("go_int_mul".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(303))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} * {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 21087, 21228) }, - Declaration { id: DeclarationId(1077), name: Some("go_int_div".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(305))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("v3intdiv({lhs}, {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 21230, 21378) }, - Declaration { id: DeclarationId(1078), name: Some("go_int_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(309))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 21380, 21520) }, - Declaration { id: DeclarationId(1079), name: Some("go_node_id_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(630))), ("op".to_string(), FieldValue::Reference(DeclarationId(309))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 21522, 21669) }, - Declaration { id: DeclarationId(1080), name: Some("go_port_id_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(631))), ("op".to_string(), FieldValue::Reference(DeclarationId(309))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 21671, 21818) }, - Declaration { id: DeclarationId(1081), name: Some("go_declaration_id_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(632))), ("op".to_string(), FieldValue::Reference(DeclarationId(309))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 21820, 21981) }, - Declaration { id: DeclarationId(1082), name: Some("go_int_ne".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(310))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} != {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 21983, 22123) }, - Declaration { id: DeclarationId(1083), name: Some("go_node_id_ne".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(630))), ("op".to_string(), FieldValue::Reference(DeclarationId(310))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} != {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 22125, 22272) }, - Declaration { id: DeclarationId(1084), name: Some("go_port_id_ne".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(631))), ("op".to_string(), FieldValue::Reference(DeclarationId(310))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} != {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 22274, 22421) }, - Declaration { id: DeclarationId(1085), name: Some("go_declaration_id_ne".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(632))), ("op".to_string(), FieldValue::Reference(DeclarationId(310))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} != {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 22423, 22584) }, - Declaration { id: DeclarationId(1086), name: Some("go_int_lt".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(311))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} < {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 22586, 22725) }, - Declaration { id: DeclarationId(1087), name: Some("go_int_le".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(312))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} <= {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 22727, 22867) }, - Declaration { id: DeclarationId(1088), name: Some("go_int_gt".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(313))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} > {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 22869, 23008) }, - Declaration { id: DeclarationId(1089), name: Some("go_int_ge".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(314))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} >= {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 23010, 23150) }, - Declaration { id: DeclarationId(1090), name: Some("go_bool_meet".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(88))), ("op".to_string(), FieldValue::Reference(DeclarationId(324))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} && {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 23152, 23301) }, - Declaration { id: DeclarationId(1091), name: Some("go_bool_join".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(88))), ("op".to_string(), FieldValue::Reference(DeclarationId(325))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} || {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 23303, 23452) }, - Declaration { id: DeclarationId(1092), name: Some("go_let_stmt".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(859), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(859)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(1004))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("var {name} {type} = {value}".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(0)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 23454, 23587) }, - Declaration { id: DeclarationId(1093), name: Some("go_if_expr".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(859), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(859)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(1002))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("if {cond} { {then} } else { {else} }".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(0)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 23589, 23732) }, - Declaration { id: DeclarationId(1094), name: Some("go_main_wrap".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(859), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(859)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(1005))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("func main() {\n{body}\nfmt.Println({final})\n}".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(0)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 23734, 23887) }, - Declaration { id: DeclarationId(1095), name: Some("go_empty_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(596))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1772), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 23889, 24027) }, - Declaration { id: DeclarationId(1096), name: Some("go_singleton_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(600))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1773), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1771), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 24029, 24221) }, - Declaration { id: DeclarationId(1097), name: Some("go_cons_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(598))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1774), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1771), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1771), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 24223, 24440) }, - Declaration { id: DeclarationId(1098), name: Some("go_concat_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(608))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1775), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1771), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1771), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 24442, 24665) }, - Declaration { id: DeclarationId(1099), name: Some("go_length_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(618))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1776), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1770), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 24667, 24850) }, - Declaration { id: DeclarationId(1100), name: Some("go_list_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(863), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(863)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(594))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("[]{element}".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 24852, 24988) }, - Declaration { id: DeclarationId(1101), name: Some("go_result_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(863), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(863)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(11))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("v3Result[{key}, {value}]".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 25674, 25827) }, - Declaration { id: DeclarationId(1102), name: Some("go_map_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(863), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(863)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(97))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("map[{key}]{value}".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 25829, 25969) }, - Declaration { id: DeclarationId(1103), name: Some("go_is_empty_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(620))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1770), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 25971, 26159) }, - Declaration { id: DeclarationId(1104), name: Some("go_fold_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(602))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1778), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1770), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1771), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(2))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1770), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 26161, 26418) }, - Declaration { id: DeclarationId(1105), name: Some("go_map_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(610))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1779), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1770), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1770), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 26420, 26634) }, - Declaration { id: DeclarationId(1106), name: Some("go_filter_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(613))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1780), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1770), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1770), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 26636, 26859) }, - Declaration { id: DeclarationId(1107), name: Some("go_contains_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(628))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1781), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1770), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1770), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 26861, 27090) }, - Declaration { id: DeclarationId(1108), name: Some("go_list_pattern".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(865), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(865)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("target".to_string(), FieldValue::Reference(DeclarationId(594))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1783), payload: vec![] }), ("empty_variant".to_string(), FieldValue::Reference(DeclarationId(1409))), ("cons_variant".to_string(), FieldValue::Reference(DeclarationId(1411))), ("scrutinee".to_string(), FieldValue::Literal(LiteralBits::String("{expr}".to_string()))), ("empty_pattern".to_string(), FieldValue::Literal(LiteralBits::String("len({expr}) == 0".to_string()))), ("cons_pattern".to_string(), FieldValue::Literal(LiteralBits::String("{expr}".to_string()))), ("head_expr".to_string(), FieldValue::Literal(LiteralBits::String("{list}[0]".to_string()))), ("tail_expr".to_string(), FieldValue::Literal(LiteralBits::String("{list}[1:]".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 27177, 27483) }, - Declaration { id: DeclarationId(1109), name: Some("go_statements".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(867), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(867)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("let_binding".to_string(), FieldValue::Literal(LiteralBits::String("var {name} {type} = {value}".to_string()))), ("let_binding_inferred".to_string(), FieldValue::Literal(LiteralBits::String("{name} := {value}".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 27485, 27615) }, - Declaration { id: DeclarationId(1110), name: Some("go_expressions".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(868), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(868)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("field_access".to_string(), FieldValue::Literal(LiteralBits::String("({object}).{field}".to_string()))), ("function_call".to_string(), FieldValue::Literal(LiteralBits::String("{func}({args})".to_string()))), ("closure".to_string(), FieldValue::Literal(LiteralBits::String("func({params}) { return {body} }".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 27617, 27777) }, - Declaration { id: DeclarationId(1111), name: Some("go_control_flow".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(870), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(870)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("if_else".to_string(), FieldValue::Literal(LiteralBits::String("if {cond} { {then} } else { {else} }".to_string()))), ("match_arm".to_string(), FieldValue::Literal(LiteralBits::String("{pattern}: return {body}".to_string()))), ("for_each_syntax".to_string(), FieldValue::Record(vec![("prefix".to_string(), FieldValue::Literal(LiteralBits::String("for _, ".to_string()))), ("separator".to_string(), FieldValue::Literal(LiteralBits::String(" := range ".to_string())))]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 27779, 27980) }, - Declaration { id: DeclarationId(1112), name: Some("go_literals".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(871), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(871)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("true_keyword".to_string(), FieldValue::Literal(LiteralBits::String("true".to_string()))), ("false_keyword".to_string(), FieldValue::Literal(LiteralBits::String("false".to_string()))), ("string_delimiter".to_string(), FieldValue::Literal(LiteralBits::String("%Q".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 27982, 28092) }, - Declaration { id: DeclarationId(1113), name: Some("go_modules".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(872), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(872)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("path_separator".to_string(), FieldValue::Literal(LiteralBits::String(".".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 28094, 28151) }, - Declaration { id: DeclarationId(1114), name: Some("go_functions".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(873), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(873)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("definition".to_string(), FieldValue::Literal(LiteralBits::String("func {name}({params}) {ret} { return {body} }".to_string()))), ("definition_exported".to_string(), FieldValue::Literal(LiteralBits::String("func {name}({params}) {ret} { return {body} }".to_string()))), ("definition_void".to_string(), FieldValue::Literal(LiteralBits::String("func {name}({params}) { {body} }".to_string()))), ("param_with_type".to_string(), FieldValue::Literal(LiteralBits::String("{name} {type}".to_string()))), ("param_separator".to_string(), FieldValue::Literal(LiteralBits::String(", ".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 28153, 28438) }, - Declaration { id: DeclarationId(1115), name: Some("go_type_applications".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(874), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(874)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("optional".to_string(), FieldValue::Literal(LiteralBits::String("*{element}".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 28440, 28519) }, - Declaration { id: DeclarationId(1116), name: Some("go_type_defs".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(875), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(875)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("struct_def".to_string(), FieldValue::Literal(LiteralBits::String("type {name} struct { {fields} }".to_string()))), ("struct_field".to_string(), FieldValue::Literal(LiteralBits::String("{name} {type}".to_string()))), ("enum_def".to_string(), FieldValue::Literal(LiteralBits::String("type {name} interface{}".to_string()))), ("enum_unit_variant".to_string(), FieldValue::Literal(LiteralBits::String("{name}".to_string()))), ("enum_data_variant".to_string(), FieldValue::Literal(LiteralBits::String("{name}".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 28521, 28744) }, - Declaration { id: DeclarationId(1117), name: Some("go_patterns".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(877), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(877)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("match_expr".to_string(), FieldValue::Literal(LiteralBits::String("{expr}".to_string()))), ("match_arm".to_string(), FieldValue::Literal(LiteralBits::String("{pattern}: return {body}".to_string()))), ("variant_pattern".to_string(), FieldValue::Literal(LiteralBits::String("{name}".to_string()))), ("variant_pattern_positional".to_string(), FieldValue::Literal(LiteralBits::String("{name}".to_string()))), ("variant_pattern_empty".to_string(), FieldValue::Literal(LiteralBits::String("{name}".to_string()))), ("field_binding".to_string(), FieldValue::Literal(LiteralBits::String("{field}: {binding}".to_string()))), ("field_binding_separator".to_string(), FieldValue::Literal(LiteralBits::String(", ".to_string()))), ("wildcard".to_string(), FieldValue::Literal(LiteralBits::String("_".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 28746, 29038) }, - Declaration { id: DeclarationId(1118), name: Some("go_collection_ops".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(878), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(878)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("concat".to_string(), FieldValue::Literal(LiteralBits::String("append({left}, {right}...)".to_string()))), ("length".to_string(), FieldValue::Literal(LiteralBits::String("int64(len({recv}))".to_string()))), ("is_empty".to_string(), FieldValue::Literal(LiteralBits::String("len({recv}) == 0".to_string()))), ("fold".to_string(), FieldValue::Literal(LiteralBits::String("/* fold({recv}, {init}, {body}) */".to_string()))), ("map".to_string(), FieldValue::Literal(LiteralBits::String("/* map({recv}, {body}) */".to_string()))), ("filter".to_string(), FieldValue::Literal(LiteralBits::String("/* filter({recv}, {body}) */".to_string()))), ("contains".to_string(), FieldValue::Literal(LiteralBits::String("/* contains({recv}, {item}) */".to_string()))), ("empty_list".to_string(), FieldValue::Literal(LiteralBits::String("nil".to_string()))), ("list_literal".to_string(), FieldValue::Literal(LiteralBits::String("[]{element_type}{{{elements}}}".to_string()))), ("cons".to_string(), FieldValue::Literal(LiteralBits::String("append([]{element_type}{{{head}}}, {tail}...)".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 29040, 29475) }, - Declaration { id: DeclarationId(1119), name: Some("go_value_construction".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(879), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(879)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("struct_literal".to_string(), FieldValue::Literal(LiteralBits::String("{type}{{ {fields} }}".to_string()))), ("struct_field_init".to_string(), FieldValue::Literal(LiteralBits::String("{name}: {value}".to_string()))), ("struct_field_separator".to_string(), FieldValue::Literal(LiteralBits::String(", ".to_string()))), ("variant_construction".to_string(), FieldValue::Literal(LiteralBits::String("{variant}({args})".to_string()))), ("variant_named_construction".to_string(), FieldValue::Literal(LiteralBits::String("{variant}{{ {fields} }}".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 29477, 29745) }, - Declaration { id: DeclarationId(1120), name: Some("go_record_derive_templates".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(876), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(876)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("struct_def_no_debug".to_string(), FieldValue::Literal(LiteralBits::String("".to_string()))), ("enum_def_no_debug".to_string(), FieldValue::Literal(LiteralBits::String("".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 30502, 30617) }, - Declaration { id: DeclarationId(1121), name: Some("go_language".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(883), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(883)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("statements".to_string(), FieldValue::Reference(DeclarationId(1109))), ("expressions".to_string(), FieldValue::Reference(DeclarationId(1110))), ("control_flow".to_string(), FieldValue::Reference(DeclarationId(1111))), ("literals".to_string(), FieldValue::Reference(DeclarationId(1112))), ("modules".to_string(), FieldValue::Reference(DeclarationId(1113))), ("functions".to_string(), FieldValue::Reference(DeclarationId(1114))), ("type_applications".to_string(), FieldValue::Reference(DeclarationId(1115))), ("type_definitions".to_string(), FieldValue::Reference(DeclarationId(1116))), ("record_derive_templates".to_string(), FieldValue::Reference(DeclarationId(1120))), ("patterns".to_string(), FieldValue::Reference(DeclarationId(1117))), ("collection_ops".to_string(), FieldValue::Reference(DeclarationId(1118))), ("values".to_string(), FieldValue::Reference(DeclarationId(1119)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 30619, 31038) }, - Declaration { id: DeclarationId(1122), name: Some("go_correction_style".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(789), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(789)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("indent_unit".to_string(), FieldValue::Literal(LiteralBits::String("\t".to_string()))), ("line_ending".to_string(), FieldValue::Literal(LiteralBits::String("\n".to_string()))), ("string_quote".to_string(), FieldValue::Literal(LiteralBits::String("%Q".to_string()))), ("trailing_semicolon".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 32705, 32841) }, - Declaration { id: DeclarationId(1123), name: Some("go_clean_emission".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(780), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(780)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("expression_wrapping".to_string(), FieldValue::Variant { constructor: DeclarationId(1653), payload: vec![] }), ("pattern_bindings".to_string(), FieldValue::Variant { constructor: DeclarationId(1656), payload: vec![] }), ("variant_payload_field_access".to_string(), FieldValue::Variant { constructor: DeclarationId(1659), payload: vec![] }), ("imports".to_string(), FieldValue::Variant { constructor: DeclarationId(1662), payload: vec![] }), ("block_return".to_string(), FieldValue::Variant { constructor: DeclarationId(1666), payload: vec![] }), ("variable_bindings".to_string(), FieldValue::Variant { constructor: DeclarationId(1668), payload: vec![] }), ("match_arm_body".to_string(), FieldValue::Variant { constructor: DeclarationId(1672), payload: vec![] }), ("correction_style".to_string(), FieldValue::Reference(DeclarationId(1122))), ("post_emit_verifier".to_string(), FieldValue::Record(vec![("command".to_string(), FieldValue::Literal(LiteralBits::String("gofmt".to_string()))), ("args".to_string(), FieldValue::List(vec![FieldValue::Literal(LiteralBits::String("-l".to_string()))])), ("syntax_only".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("expected_exit_code".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("output_policy".to_string(), FieldValue::Variant { constructor: DeclarationId(1675), payload: vec![] })]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 32843, 33401) }, - Declaration { id: DeclarationId(1124), name: Some("go_clean_emission_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(781), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(781)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1121))), ("clean_emission".to_string(), FieldValue::Reference(DeclarationId(1123)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 33403, 33527) }, - Declaration { id: DeclarationId(1125), name: Some("python_statements".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(867), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(867)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("let_binding".to_string(), FieldValue::Literal(LiteralBits::String("{name} = {value}".to_string()))), ("let_binding_inferred".to_string(), FieldValue::Literal(LiteralBits::String("{name} = {value}".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 1797, 1919) }, - Declaration { id: DeclarationId(1126), name: Some("python_expressions".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(868), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(868)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("field_access".to_string(), FieldValue::Literal(LiteralBits::String("{object}.{field}".to_string()))), ("function_call".to_string(), FieldValue::Literal(LiteralBits::String("{func}({args})".to_string()))), ("closure".to_string(), FieldValue::Literal(LiteralBits::String("lambda {params}: {body}".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 1921, 2074) }, - Declaration { id: DeclarationId(1127), name: Some("python_control_flow".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(870), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(870)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("if_else".to_string(), FieldValue::Literal(LiteralBits::String("({then} if {cond} else {else})".to_string()))), ("match_arm".to_string(), FieldValue::Literal(LiteralBits::String("{pattern}: {body}".to_string()))), ("for_each_syntax".to_string(), FieldValue::Record(vec![("prefix".to_string(), FieldValue::Literal(LiteralBits::String("for {item} in {iter}:\n{body}".to_string()))), ("separator".to_string(), FieldValue::Literal(LiteralBits::String("\n".to_string())))]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 2076, 2291) }, - Declaration { id: DeclarationId(1128), name: Some("python_literals".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(871), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(871)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("true_keyword".to_string(), FieldValue::Literal(LiteralBits::String("True".to_string()))), ("false_keyword".to_string(), FieldValue::Literal(LiteralBits::String("False".to_string()))), ("string_delimiter".to_string(), FieldValue::Literal(LiteralBits::String("%Q".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 2293, 2407) }, - Declaration { id: DeclarationId(1129), name: Some("python_modules".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(872), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(872)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("path_separator".to_string(), FieldValue::Literal(LiteralBits::String(".".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 2409, 2470) }, - Declaration { id: DeclarationId(1130), name: Some("python_functions".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(873), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(873)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("definition".to_string(), FieldValue::Literal(LiteralBits::String("def {name}({params}) -> {ret}:\n return {body}".to_string()))), ("definition_exported".to_string(), FieldValue::Literal(LiteralBits::String("def {name}({params}) -> {ret}:\n return {body}".to_string()))), ("definition_void".to_string(), FieldValue::Literal(LiteralBits::String("def {name}({params}) -> None:\n {body}".to_string()))), ("param_with_type".to_string(), FieldValue::Literal(LiteralBits::String("{name}: {type}".to_string()))), ("param_separator".to_string(), FieldValue::Literal(LiteralBits::String(", ".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 2472, 2779) }, - Declaration { id: DeclarationId(1131), name: Some("python_type_applications".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(874), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(874)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("optional".to_string(), FieldValue::Literal(LiteralBits::String("typing.Optional[{element}]".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 2781, 2880) }, - Declaration { id: DeclarationId(1132), name: Some("python_type_definitions".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(875), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(875)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("struct_def".to_string(), FieldValue::Literal(LiteralBits::String("@dataclass\nclass {name}:\n{fields}".to_string()))), ("struct_field".to_string(), FieldValue::Literal(LiteralBits::String("{name}: {type}".to_string()))), ("enum_def".to_string(), FieldValue::Literal(LiteralBits::String("class {name}:\n pass\n\n{variants}".to_string()))), ("enum_unit_variant".to_string(), FieldValue::Literal(LiteralBits::String("@dataclass\nclass {name}({parent}):\n pass".to_string()))), ("enum_data_variant".to_string(), FieldValue::Literal(LiteralBits::String("@dataclass\nclass {name}({parent}):\n{fields}".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 2882, 3213) }, - Declaration { id: DeclarationId(1133), name: Some("python_patterns".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(877), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(877)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("match_expr".to_string(), FieldValue::Literal(LiteralBits::String("match {expr} { {arms} }".to_string()))), ("match_arm".to_string(), FieldValue::Literal(LiteralBits::String("{pattern}: {body}".to_string()))), ("variant_pattern".to_string(), FieldValue::Literal(LiteralBits::String("{name}({bindings})".to_string()))), ("variant_pattern_positional".to_string(), FieldValue::Literal(LiteralBits::String("{name}({binding})".to_string()))), ("variant_pattern_empty".to_string(), FieldValue::Literal(LiteralBits::String("{name}()".to_string()))), ("field_binding".to_string(), FieldValue::Literal(LiteralBits::String("{field}={binding}".to_string()))), ("field_binding_separator".to_string(), FieldValue::Literal(LiteralBits::String(", ".to_string()))), ("wildcard".to_string(), FieldValue::Literal(LiteralBits::String("_".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 3215, 3545) }, - Declaration { id: DeclarationId(1134), name: Some("python_collections".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(878), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(878)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("concat".to_string(), FieldValue::Literal(LiteralBits::String("[*{left}, *{right}]".to_string()))), ("length".to_string(), FieldValue::Literal(LiteralBits::String("len({recv})".to_string()))), ("is_empty".to_string(), FieldValue::Literal(LiteralBits::String("(len({recv}) == 0)".to_string()))), ("fold".to_string(), FieldValue::Literal(LiteralBits::String("__v3_fold({recv}, {init}, {body})".to_string()))), ("map".to_string(), FieldValue::Literal(LiteralBits::String("[{body} for {item} in {recv}]".to_string()))), ("filter".to_string(), FieldValue::Literal(LiteralBits::String("[{item_push} for {item} in {recv} if {predicate}]".to_string()))), ("contains".to_string(), FieldValue::Literal(LiteralBits::String("({item} in {recv})".to_string()))), ("empty_list".to_string(), FieldValue::Literal(LiteralBits::String("[]".to_string()))), ("list_literal".to_string(), FieldValue::Literal(LiteralBits::String("[{elements}]".to_string()))), ("cons".to_string(), FieldValue::Literal(LiteralBits::String("[{head}, *{tail}]".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 3547, 3936) }, - Declaration { id: DeclarationId(1135), name: Some("python_value_construction".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(879), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(879)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("struct_literal".to_string(), FieldValue::Literal(LiteralBits::String("{name}({fields})".to_string()))), ("struct_field_init".to_string(), FieldValue::Literal(LiteralBits::String("{field}={value}".to_string()))), ("struct_field_separator".to_string(), FieldValue::Literal(LiteralBits::String(", ".to_string()))), ("variant_construction".to_string(), FieldValue::Literal(LiteralBits::String("{name}()".to_string()))), ("variant_named_construction".to_string(), FieldValue::Literal(LiteralBits::String("{name}({fields})".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 3938, 4190) }, - Declaration { id: DeclarationId(1136), name: Some("python_record_derive_templates".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(876), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(876)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("struct_def_no_debug".to_string(), FieldValue::Literal(LiteralBits::String("".to_string()))), ("enum_def_no_debug".to_string(), FieldValue::Literal(LiteralBits::String("".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 4393, 4512) }, - Declaration { id: DeclarationId(1137), name: Some("python_language".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(883), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(883)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("statements".to_string(), FieldValue::Reference(DeclarationId(1125))), ("expressions".to_string(), FieldValue::Reference(DeclarationId(1126))), ("control_flow".to_string(), FieldValue::Reference(DeclarationId(1127))), ("literals".to_string(), FieldValue::Reference(DeclarationId(1128))), ("modules".to_string(), FieldValue::Reference(DeclarationId(1129))), ("functions".to_string(), FieldValue::Reference(DeclarationId(1130))), ("type_applications".to_string(), FieldValue::Reference(DeclarationId(1131))), ("type_definitions".to_string(), FieldValue::Reference(DeclarationId(1132))), ("record_derive_templates".to_string(), FieldValue::Reference(DeclarationId(1136))), ("patterns".to_string(), FieldValue::Reference(DeclarationId(1133))), ("collection_ops".to_string(), FieldValue::Reference(DeclarationId(1134))), ("values".to_string(), FieldValue::Reference(DeclarationId(1135)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 4514, 4989) }, - Declaration { id: DeclarationId(1138), name: Some("python_target".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(815), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(815)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("memory".to_string(), FieldValue::Variant { constructor: DeclarationId(1717), payload: vec![] }), ("scope".to_string(), FieldValue::Variant { constructor: DeclarationId(1720), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 4991, 5088) }, - Declaration { id: DeclarationId(1139), name: Some("python_source_filtering".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(817), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(817)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("internal".to_string(), FieldValue::Reference(DeclarationId(818))), ("additional_excluded_prefixes".to_string(), FieldValue::List(vec![]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 5090, 5226) }, - Declaration { id: DeclarationId(1140), name: Some("python_execution_requirement".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(819), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(819)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/python.dag", 5291, 5307))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 5228, 5307) }, - Declaration { id: DeclarationId(1141), name: Some("python_int".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("int".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 5309, 5445) }, - Declaration { id: DeclarationId(1142), name: Some("python_bool".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(88))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("bool".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 5447, 5586) }, - Declaration { id: DeclarationId(1143), name: Some("python_string".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(186))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("str".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 5588, 5730) }, - Declaration { id: DeclarationId(1144), name: Some("python_node_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(630))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NodeId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 5732, 5878) }, - Declaration { id: DeclarationId(1145), name: Some("python_port_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(631))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PortId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 5880, 6026) }, - Declaration { id: DeclarationId(1146), name: Some("python_declaration_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(632))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("DeclarationId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 6028, 6195) }, - Declaration { id: DeclarationId(1147), name: Some("python_declaration_ref".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(1006))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("DeclarationId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 6197, 6366) }, - Declaration { id: DeclarationId(1148), name: Some("python_source_span".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(121))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SourceSpan".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 6368, 6527) }, - Declaration { id: DeclarationId(1149), name: Some("python_dag_port".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(689))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("DagPort".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 6529, 6679) }, - Declaration { id: DeclarationId(1150), name: Some("python_branch_path".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(714))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BranchPath".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 6681, 6840) }, - Declaration { id: DeclarationId(1151), name: Some("python_value_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(723))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ValueNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 6842, 6998) }, - Declaration { id: DeclarationId(1152), name: Some("python_transform_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(724))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TransformNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 7000, 7168) }, - Declaration { id: DeclarationId(1153), name: Some("python_branch_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(726))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BranchNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 7170, 7329) }, - Declaration { id: DeclarationId(1154), name: Some("python_loop_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(727))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("LoopNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 7331, 7484) }, - Declaration { id: DeclarationId(1155), name: Some("python_bind_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(729))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BindNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 7486, 7639) }, - Declaration { id: DeclarationId(1156), name: Some("python_behavior".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(730))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Behavior".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 7641, 7793) }, - Declaration { id: DeclarationId(1157), name: Some("python_dag".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(731))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Dag".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 7795, 7932) }, - Declaration { id: DeclarationId(1158), name: Some("python_surface_module".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/python.dag", 8052, 8255))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 8006, 8255) }, - Declaration { id: DeclarationId(1159), name: Some("python_surface_item".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/python.dag", 8301, 8419))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 8257, 8419) }, - Declaration { id: DeclarationId(1160), name: Some("python_surface_param".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/python.dag", 8466, 8827))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 8421, 8827) }, - Declaration { id: DeclarationId(1161), name: Some("python_surface_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/python.dag", 8874, 9146))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 8829, 9146) }, - Declaration { id: DeclarationId(1162), name: Some("python_surface_variant".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/python.dag", 9195, 9558))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 9148, 9558) }, - Declaration { id: DeclarationId(1163), name: Some("python_variant_payload".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/python.dag", 9607, 9731))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 9560, 9731) }, - Declaration { id: DeclarationId(1164), name: Some("python_surface_type".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/python.dag", 9777, 9895))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 9733, 9895) }, - Declaration { id: DeclarationId(1165), name: Some("python_surface_record_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/python.dag", 9949, 10316))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 9897, 10316) }, - Declaration { id: DeclarationId(1166), name: Some("python_surface_map_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/python.dag", 10367, 10811))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 10318, 10811) }, - Declaration { id: DeclarationId(1167), name: Some("python_surface_match_arm".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/python.dag", 10862, 11227))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 10813, 11227) }, - Declaration { id: DeclarationId(1168), name: Some("python_surface_pattern_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/python.dag", 11282, 11655))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 11229, 11655) }, - Declaration { id: DeclarationId(1169), name: Some("python_surface_pattern".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/python.dag", 11704, 11828))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 11657, 11828) }, - Declaration { id: DeclarationId(1170), name: Some("python_surface_literal".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/python.dag", 11877, 12001))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 11830, 12001) }, - Declaration { id: DeclarationId(1171), name: Some("python_surface_expr".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/python.dag", 12047, 12165))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 12003, 12165) }, - Declaration { id: DeclarationId(1172), name: Some("python_int_add".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(300))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} + {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 12167, 12316) }, - Declaration { id: DeclarationId(1173), name: Some("python_int_sub".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(301))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} - {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 12318, 12467) }, - Declaration { id: DeclarationId(1174), name: Some("python_int_mul".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(303))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} * {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 12469, 12618) }, - Declaration { id: DeclarationId(1175), name: Some("python_int_div".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(305))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("(__v3_idiv({lhs}, {rhs}))".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 12620, 12779) }, - Declaration { id: DeclarationId(1176), name: Some("python_int_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(309))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 12781, 12929) }, - Declaration { id: DeclarationId(1177), name: Some("python_node_id_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(630))), ("op".to_string(), FieldValue::Reference(DeclarationId(309))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 12931, 13086) }, - Declaration { id: DeclarationId(1178), name: Some("python_port_id_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(631))), ("op".to_string(), FieldValue::Reference(DeclarationId(309))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 13088, 13243) }, - Declaration { id: DeclarationId(1179), name: Some("python_declaration_id_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(632))), ("op".to_string(), FieldValue::Reference(DeclarationId(309))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 13245, 13414) }, - Declaration { id: DeclarationId(1180), name: Some("python_int_ne".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(310))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} != {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 13416, 13564) }, - Declaration { id: DeclarationId(1181), name: Some("python_int_lt".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(311))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} < {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 13566, 13713) }, - Declaration { id: DeclarationId(1182), name: Some("python_int_le".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(312))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} <= {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 13715, 13863) }, - Declaration { id: DeclarationId(1183), name: Some("python_int_gt".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(313))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} > {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 13865, 14012) }, - Declaration { id: DeclarationId(1184), name: Some("python_int_ge".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(314))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} >= {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 14014, 14162) }, - Declaration { id: DeclarationId(1185), name: Some("python_bool_meet".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(88))), ("op".to_string(), FieldValue::Reference(DeclarationId(324))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} and {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 14164, 14322) }, - Declaration { id: DeclarationId(1186), name: Some("python_bool_join".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(88))), ("op".to_string(), FieldValue::Reference(DeclarationId(325))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} or {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 14324, 14481) }, - Declaration { id: DeclarationId(1187), name: Some("python_empty_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(596))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1772), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 14483, 14629) }, - Declaration { id: DeclarationId(1188), name: Some("python_singleton_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(600))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1773), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1771), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 14631, 14831) }, - Declaration { id: DeclarationId(1189), name: Some("python_cons_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(598))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1774), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1771), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1771), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 14833, 15058) }, - Declaration { id: DeclarationId(1190), name: Some("python_concat_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(608))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1775), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1771), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1771), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 15060, 15291) }, - Declaration { id: DeclarationId(1191), name: Some("python_length_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(618))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1776), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1770), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 15293, 15484) }, - Declaration { id: DeclarationId(1192), name: Some("python_is_empty_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(620))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1770), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 15486, 15682) }, - Declaration { id: DeclarationId(1193), name: Some("python_fold_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(602))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1778), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1770), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1771), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(2))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1770), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 15684, 15949) }, - Declaration { id: DeclarationId(1194), name: Some("python_map_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(610))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1779), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1770), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1770), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 15951, 16173) }, - Declaration { id: DeclarationId(1195), name: Some("python_filter_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(613))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1780), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1770), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1770), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 16175, 16406) }, - Declaration { id: DeclarationId(1196), name: Some("python_contains_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(628))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1781), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1770), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1770), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 16408, 16645) }, - Declaration { id: DeclarationId(1197), name: Some("python_list_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(863), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(863)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(594))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("list[{element}]".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 16647, 16795) }, - Declaration { id: DeclarationId(1198), name: Some("python_result_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(863), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(863)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(11))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("typing.Union[typing.Tuple[typing.Literal['Ok'], {key}], typing.Tuple[typing.Literal['Err'], {value}]]".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 16911, 17149) }, - Declaration { id: DeclarationId(1199), name: Some("python_non_empty_list_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(863), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(863)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(634))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NonEmptyList[{element}]".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 17240, 17414) }, - Declaration { id: DeclarationId(1200), name: Some("python_non_singleton_list_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(863), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(863)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(636))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NonSingletonList[{element}]".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 17416, 17602) }, - Declaration { id: DeclarationId(1201), name: Some("python_list_pattern".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(865), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(865)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("target".to_string(), FieldValue::Reference(DeclarationId(594))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1783), payload: vec![] }), ("empty_variant".to_string(), FieldValue::Reference(DeclarationId(1409))), ("cons_variant".to_string(), FieldValue::Reference(DeclarationId(1411))), ("scrutinee".to_string(), FieldValue::Literal(LiteralBits::String("{expr}".to_string()))), ("empty_pattern".to_string(), FieldValue::Literal(LiteralBits::String("len({expr}) == 0".to_string()))), ("cons_pattern".to_string(), FieldValue::Literal(LiteralBits::String("{expr}".to_string()))), ("head_expr".to_string(), FieldValue::Literal(LiteralBits::String("{list}[0]".to_string()))), ("tail_expr".to_string(), FieldValue::Literal(LiteralBits::String("{list}[1:]".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 17603, 17917) }, - Declaration { id: DeclarationId(1202), name: Some("python_correction_style".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(789), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(789)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("indent_unit".to_string(), FieldValue::Literal(LiteralBits::String(" ".to_string()))), ("line_ending".to_string(), FieldValue::Literal(LiteralBits::String("\n".to_string()))), ("string_quote".to_string(), FieldValue::Literal(LiteralBits::String("%Q".to_string()))), ("trailing_semicolon".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 19982, 20124) }, - Declaration { id: DeclarationId(1203), name: Some("python_clean_emission".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(780), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(780)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("expression_wrapping".to_string(), FieldValue::Variant { constructor: DeclarationId(1653), payload: vec![] }), ("pattern_bindings".to_string(), FieldValue::Variant { constructor: DeclarationId(1658), payload: vec![] }), ("variant_payload_field_access".to_string(), FieldValue::Variant { constructor: DeclarationId(1659), payload: vec![] }), ("imports".to_string(), FieldValue::Variant { constructor: DeclarationId(1662), payload: vec![] }), ("block_return".to_string(), FieldValue::Variant { constructor: DeclarationId(1666), payload: vec![] }), ("variable_bindings".to_string(), FieldValue::Variant { constructor: DeclarationId(1667), payload: vec![] }), ("match_arm_body".to_string(), FieldValue::Variant { constructor: DeclarationId(1672), payload: vec![] }), ("correction_style".to_string(), FieldValue::Reference(DeclarationId(1202))), ("post_emit_verifier".to_string(), FieldValue::Record(vec![("command".to_string(), FieldValue::Literal(LiteralBits::String("python3".to_string()))), ("args".to_string(), FieldValue::List(vec![FieldValue::Literal(LiteralBits::String("-m".to_string())), FieldValue::Literal(LiteralBits::String("py_compile".to_string()))])), ("syntax_only".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("expected_exit_code".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("output_policy".to_string(), FieldValue::Variant { constructor: DeclarationId(1674), payload: vec![] })]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 20126, 20706) }, - Declaration { id: DeclarationId(1204), name: Some("python_clean_emission_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(781), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(781)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1137))), ("clean_emission".to_string(), FieldValue::Reference(DeclarationId(1203)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 20708, 20844) }, - Declaration { id: DeclarationId(1205), name: Some("rust_execution_model".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(815), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(815)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("memory".to_string(), FieldValue::Variant { constructor: DeclarationId(1719), payload: vec![] }), ("scope".to_string(), FieldValue::Variant { constructor: DeclarationId(1720), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 4357, 4459) }, - Declaration { id: DeclarationId(1206), name: Some("rust_source_filtering".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(817), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(817)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("internal".to_string(), FieldValue::Reference(DeclarationId(818))), ("additional_excluded_prefixes".to_string(), FieldValue::List(vec![FieldValue::Literal(LiteralBits::String("src/v3/compiler/".to_string()))]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 4461, 4613) }, - Declaration { id: DeclarationId(1207), name: Some("rust_execution_requirement".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(819), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(819)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/rust.dag", 4676, 4690))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 4615, 4690) }, - Declaration { id: DeclarationId(1208), name: Some("rust_int".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("i64".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 5141, 5273) }, - Declaration { id: DeclarationId(1209), name: Some("rust_uint8".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(67))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("u8".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 5275, 5410) }, - Declaration { id: DeclarationId(1210), name: Some("rust_bool".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(88))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("bool".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 5412, 5547) }, - Declaration { id: DeclarationId(1211), name: Some("rust_string".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(186))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("String".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 5549, 5691) }, - Declaration { id: DeclarationId(1212), name: Some("rust_node_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(630))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NodeId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 5693, 5835) }, - Declaration { id: DeclarationId(1213), name: Some("rust_port_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(631))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PortId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 5837, 5979) }, - Declaration { id: DeclarationId(1214), name: Some("rust_declaration_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(632))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("DeclarationId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 5981, 6144) }, - Declaration { id: DeclarationId(1215), name: Some("rust_cluster_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(633))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ClusterId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 6146, 6297) }, - Declaration { id: DeclarationId(1216), name: Some("rust_type_shape".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(687))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TypeShape".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("declaration".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("declaration".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 6299, 6544) }, - Declaration { id: DeclarationId(1217), name: Some("rust_port_state".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(688))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PortState".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 6546, 6698) }, - Declaration { id: DeclarationId(1218), name: Some("rust_port".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(689))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Port".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1768), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("state".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1768), payload: vec![FieldValue::Literal(LiteralBits::String("state_value".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("produced_by".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("produced_by".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 6700, 7096) }, - Declaration { id: DeclarationId(1219), name: Some("rust_source_span".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(121))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SourceSpan".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("file".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("file".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("start".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("byte_start".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("end".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("byte_end".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 7098, 7496) }, - Declaration { id: DeclarationId(1220), name: Some("rust_literal_bits".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(690))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("LiteralBits".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 7498, 7656) }, - Declaration { id: DeclarationId(1221), name: Some("rust_atom_payload".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(691))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("AtomPayload".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 7658, 7816) }, - Declaration { id: DeclarationId(1222), name: Some("rust_cardinality_bound".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(696))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("CardinalityBound".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 7818, 7991) }, - Declaration { id: DeclarationId(1223), name: Some("rust_interval".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(694))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Interval".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 7993, 8141) }, - Declaration { id: DeclarationId(1224), name: Some("rust_positive_interval_width".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(692))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PositiveIntervalWidth".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 8143, 8332) }, - Declaration { id: DeclarationId(1225), name: Some("rust_interval_width".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(693))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("IntervalWidth".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 8334, 8498) }, - Declaration { id: DeclarationId(1226), name: Some("rust_conj_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(697))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Field".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("label".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("label".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("ty".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("ty".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 8500, 8802) }, - Declaration { id: DeclarationId(1227), name: Some("rust_template_argument".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(698))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TemplateArgument".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("parameter".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("parameter".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("value".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("value".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 8804, 9145) }, - Declaration { id: DeclarationId(1228), name: Some("rust_phantom_parameter".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(705))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PhantomParameter".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("parameter".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("parameter".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("algebra".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("algebra".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 9147, 9492) }, - Declaration { id: DeclarationId(1229), name: Some("rust_nominal_opacity".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(706))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NominalOpacity".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("permitted_accessors".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("permitted_accessors".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 9494, 9770) }, - Declaration { id: DeclarationId(1230), name: Some("rust_field_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(699))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("(String, FieldValue)".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("label".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("0".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("value".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("1".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 9772, 10089) }, - Declaration { id: DeclarationId(1231), name: Some("rust_non_empty_list".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(634))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NonEmptyList".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("first".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("first".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("rest".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("rest".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 10091, 10411) }, - Declaration { id: DeclarationId(1232), name: Some("rust_non_singleton_list".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(636))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NonSingletonList".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("first".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("first".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("second".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("second".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("rest".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("rest".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 10413, 10826) }, - Declaration { id: DeclarationId(1233), name: Some("rust_element_ref".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(717))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ElementRef".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("index".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1768), payload: vec![FieldValue::Literal(LiteralBits::String("index_of".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 10828, 11069) }, - Declaration { id: DeclarationId(1234), name: Some("rust_param_ref".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(715))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ParamRef".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("member".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1768), payload: vec![FieldValue::Literal(LiteralBits::String("member_of".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("slot".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1768), payload: vec![FieldValue::Literal(LiteralBits::String("slot_of".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 11071, 11391) }, - Declaration { id: DeclarationId(1235), name: Some("rust_transform_ref".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(716))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TransformRef".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("node".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1768), payload: vec![FieldValue::Literal(LiteralBits::String("node_id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 11393, 11638) }, - Declaration { id: DeclarationId(1236), name: Some("rust_member_descent".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(719))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("MemberDescent".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("param".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("param".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 11640, 11885) }, - Declaration { id: DeclarationId(1237), name: Some("rust_intra_cluster_call".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(720))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("IntraClusterCall".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("transform".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("transform".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 11887, 12150) }, - Declaration { id: DeclarationId(1238), name: Some("rust_cluster".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(721))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Cluster".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("members".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("members".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("intra_cluster_calls".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("intra_cluster_calls".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 12152, 12489) }, - Declaration { id: DeclarationId(1239), name: Some("rust_field_value".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(700))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("FieldValue".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 12491, 12646) }, - Declaration { id: DeclarationId(1240), name: Some("rust_value_body".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(701))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ValueBody".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 12648, 12800) }, - Declaration { id: DeclarationId(1241), name: Some("rust_arrow_body".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(702))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ArrowBody".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 12802, 12954) }, - Declaration { id: DeclarationId(1242), name: Some("rust_type_connective".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(703))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TypeConnective".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 12956, 13123) }, - Declaration { id: DeclarationId(1243), name: Some("rust_declaration".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(704))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Declaration".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("connective".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("connective".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("type_params".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("type_params".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("phantom_params".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("phantom_params".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("meta_tag".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("meta_tag".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("inhabits".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("inhabits".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("value_body".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("value_body".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("nominal_opacity".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("nominal_opacity".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 13125, 14146) }, - Declaration { id: DeclarationId(1244), name: Some("rust_arithmetic_op".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(707))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ArithmeticOp".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 14148, 14309) }, - Declaration { id: DeclarationId(1245), name: Some("rust_comparison_op".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(708))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ComparisonOp".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 14311, 14472) }, - Declaration { id: DeclarationId(1246), name: Some("rust_logical_op".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(709))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("LogicalOp".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 14474, 14626) }, - Declaration { id: DeclarationId(1247), name: Some("rust_operator_kind".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(710))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("OperatorKind".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 14628, 14789) }, - Declaration { id: DeclarationId(1248), name: Some("rust_transform_target".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(711))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TransformTarget".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 14791, 14961) }, - Declaration { id: DeclarationId(1249), name: Some("rust_branch_pattern".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(712))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BranchPattern".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 14963, 15127) }, - Declaration { id: DeclarationId(1250), name: Some("rust_payload_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(713))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PayloadBinding".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("binding_name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("binding_name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("payload_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("payload_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 15129, 15484) }, - Declaration { id: DeclarationId(1251), name: Some("rust_branch_path".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(714))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Path".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("body".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("body".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1768), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("pattern".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("pattern".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("binding".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("binding".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 15486, 15974) }, - Declaration { id: DeclarationId(1252), name: Some("rust_loop_bound".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(722))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("LoopBound".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 15976, 16128) }, - Declaration { id: DeclarationId(1253), name: Some("rust_value_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(723))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ValueNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("payload".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("data".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1768), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("lane2_workflow".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1768), payload: vec![FieldValue::Literal(LiteralBits::String("lane2_workflow".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(true)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 16130, 16903) }, - Declaration { id: DeclarationId(1254), name: Some("rust_transform_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(724))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TransformNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("target".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("target".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("inputs".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("inputs".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1768), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 16905, 17477) }, - Declaration { id: DeclarationId(1255), name: Some("rust_branch_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(726))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BranchNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("input".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("input".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("paths".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("paths".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1768), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("emit_participation".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1768), payload: vec![FieldValue::Literal(LiteralBits::String("emit_participation".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 17479, 18146) }, - Declaration { id: DeclarationId(1256), name: Some("rust_loop_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(727))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("LoopNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("source".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("source".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("init".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("init".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("body".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("body".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("bound".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("bound".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1768), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 18148, 18857) }, - Declaration { id: DeclarationId(1257), name: Some("rust_bind_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(729))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BindNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1768), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("params".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("params".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("lane2_workflow".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1768), payload: vec![FieldValue::Literal(LiteralBits::String("lane2_workflow".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(true)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("emit_participation".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1768), payload: vec![FieldValue::Literal(LiteralBits::String("emit_participation".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 18859, 19619) }, - Declaration { id: DeclarationId(1258), name: Some("rust_behavior".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(730))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Behavior".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 19621, 19769) }, - Declaration { id: DeclarationId(1259), name: Some("rust_dag".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(731))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Dag".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("declarations".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1768), payload: vec![FieldValue::Literal(LiteralBits::String("declarations".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(true)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("nodes".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1768), payload: vec![FieldValue::Literal(LiteralBits::String("nodes".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(true)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("ports".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1768), payload: vec![FieldValue::Literal(LiteralBits::String("ports".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("clusters".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1768), payload: vec![FieldValue::Literal(LiteralBits::String("clusters".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(true)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 19771, 20251) }, - Declaration { id: DeclarationId(1260), name: Some("rust_surface_module".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/rust.dag", 20508, 20724))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 20464, 20724) }, - Declaration { id: DeclarationId(1261), name: Some("rust_surface_item".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/rust.dag", 20768, 20899))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 20726, 20899) }, - Declaration { id: DeclarationId(1262), name: Some("rust_surface_param".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/rust.dag", 20944, 21318))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 20901, 21318) }, - Declaration { id: DeclarationId(1263), name: Some("rust_surface_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/rust.dag", 21363, 21648))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 21320, 21648) }, - Declaration { id: DeclarationId(1264), name: Some("rust_surface_variant".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/rust.dag", 21695, 22071))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 21650, 22071) }, - Declaration { id: DeclarationId(1265), name: Some("rust_variant_payload".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/rust.dag", 22118, 22255))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 22073, 22255) }, - Declaration { id: DeclarationId(1266), name: Some("rust_surface_type".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/rust.dag", 22299, 22430))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 22257, 22430) }, - Declaration { id: DeclarationId(1267), name: Some("rust_surface_record_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/rust.dag", 22482, 22862))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 22432, 22862) }, - Declaration { id: DeclarationId(1268), name: Some("rust_surface_map_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/rust.dag", 22911, 23368))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 22864, 23368) }, - Declaration { id: DeclarationId(1269), name: Some("rust_surface_match_arm".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/rust.dag", 23417, 23795))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 23370, 23795) }, - Declaration { id: DeclarationId(1270), name: Some("rust_surface_pattern_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/rust.dag", 23848, 24234))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 23797, 24234) }, - Declaration { id: DeclarationId(1271), name: Some("rust_surface_pattern".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/rust.dag", 24281, 24418))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 24236, 24418) }, - Declaration { id: DeclarationId(1272), name: Some("rust_surface_literal".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/rust.dag", 24465, 24602))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 24420, 24602) }, - Declaration { id: DeclarationId(1273), name: Some("rust_surface_expr".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/rust.dag", 24646, 24777))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 24604, 24777) }, - Declaration { id: DeclarationId(1274), name: Some("rust_int_add".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(300))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} + {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 25632, 25777) }, - Declaration { id: DeclarationId(1275), name: Some("rust_int_sub".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(301))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} - {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 25779, 25924) }, - Declaration { id: DeclarationId(1276), name: Some("rust_int_mul".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(303))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} * {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 25926, 26071) }, - Declaration { id: DeclarationId(1277), name: Some("rust_int_div".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(305))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("(__v3_int_div({lhs}, {rhs}))".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 26073, 26231) }, - Declaration { id: DeclarationId(1278), name: Some("rust_int_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(309))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 26681, 26825) }, - Declaration { id: DeclarationId(1279), name: Some("rust_node_id_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(630))), ("op".to_string(), FieldValue::Reference(DeclarationId(309))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 26827, 26978) }, - Declaration { id: DeclarationId(1280), name: Some("rust_port_id_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(631))), ("op".to_string(), FieldValue::Reference(DeclarationId(309))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 26980, 27131) }, - Declaration { id: DeclarationId(1281), name: Some("rust_declaration_id_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(632))), ("op".to_string(), FieldValue::Reference(DeclarationId(309))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 27133, 27298) }, - Declaration { id: DeclarationId(1282), name: Some("rust_string_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(186))), ("op".to_string(), FieldValue::Reference(DeclarationId(309))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 27491, 27641) }, - Declaration { id: DeclarationId(1283), name: Some("rust_int_ne".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(310))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} != {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 27643, 27787) }, - Declaration { id: DeclarationId(1284), name: Some("rust_node_id_ne".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(630))), ("op".to_string(), FieldValue::Reference(DeclarationId(310))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} != {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 27789, 27940) }, - Declaration { id: DeclarationId(1285), name: Some("rust_port_id_ne".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(631))), ("op".to_string(), FieldValue::Reference(DeclarationId(310))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} != {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 27942, 28093) }, - Declaration { id: DeclarationId(1286), name: Some("rust_declaration_id_ne".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(632))), ("op".to_string(), FieldValue::Reference(DeclarationId(310))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} != {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 28095, 28260) }, - Declaration { id: DeclarationId(1287), name: Some("rust_int_lt".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(311))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} < {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 28262, 28405) }, - Declaration { id: DeclarationId(1288), name: Some("rust_int_le".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(312))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} <= {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 28407, 28551) }, - Declaration { id: DeclarationId(1289), name: Some("rust_int_gt".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(313))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} > {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 28553, 28696) }, - Declaration { id: DeclarationId(1290), name: Some("rust_int_ge".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(314))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} >= {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 28698, 28842) }, - Declaration { id: DeclarationId(1291), name: Some("rust_bool_meet".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(88))), ("op".to_string(), FieldValue::Reference(DeclarationId(324))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} && {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 28844, 28997) }, - Declaration { id: DeclarationId(1292), name: Some("rust_bool_join".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(88))), ("op".to_string(), FieldValue::Reference(DeclarationId(325))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} || {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 28999, 29152) }, - Declaration { id: DeclarationId(1293), name: Some("rust_let_stmt".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(859), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(859)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(1004))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("let {name}: {type} = {value};".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(0)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 29902, 30041) }, - Declaration { id: DeclarationId(1294), name: Some("rust_if_expr".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(859), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(859)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(1002))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("if {cond} { {then} } else { {else} }".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(0)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 30043, 30190) }, - Declaration { id: DeclarationId(1295), name: Some("rust_main_wrap".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(859), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(859)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(1005))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("fn main() { {body} println!({quote}{{}}{quote}, {final}); }".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(0)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 30192, 30362) }, - Declaration { id: DeclarationId(1296), name: Some("rust_empty_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(596))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1772), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 31739, 31881) }, - Declaration { id: DeclarationId(1297), name: Some("rust_singleton_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(600))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1773), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1771), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 31883, 32079) }, - Declaration { id: DeclarationId(1298), name: Some("rust_cons_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(598))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1774), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1771), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1771), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 32081, 32302) }, - Declaration { id: DeclarationId(1299), name: Some("rust_concat_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(608))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1775), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1771), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1771), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 32304, 32531) }, - Declaration { id: DeclarationId(1300), name: Some("rust_length_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(618))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1776), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1770), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 32533, 32720) }, - Declaration { id: DeclarationId(1301), name: Some("rust_list_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(863), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(863)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(594))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Vec<{element}>".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 32722, 32865) }, - Declaration { id: DeclarationId(1302), name: Some("rust_result_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(863), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(863)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(11))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("::core::result::Result<{key}, {value}>".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 33144, 33315) }, - Declaration { id: DeclarationId(1303), name: Some("rust_lookup_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(863), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(863)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(945))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Lookup<{element}>".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 33317, 33467) }, - Declaration { id: DeclarationId(1304), name: Some("rust_map_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(863), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(863)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(97))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("HashMap<{key}, {value}>".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 33469, 33619) }, - Declaration { id: DeclarationId(1305), name: Some("rust_is_empty_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(620))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1777), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1770), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 33621, 33813) }, - Declaration { id: DeclarationId(1306), name: Some("rust_fold_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(602))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1778), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1770), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1771), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(2))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1770), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 33815, 34076) }, - Declaration { id: DeclarationId(1307), name: Some("rust_map_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(610))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1779), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1770), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1770), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 34078, 34296) }, - Declaration { id: DeclarationId(1308), name: Some("rust_filter_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(613))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1780), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1770), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1770), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 34298, 34525) }, - Declaration { id: DeclarationId(1309), name: Some("rust_contains_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(628))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1781), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1770), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1770), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 34527, 34760) }, - Declaration { id: DeclarationId(1310), name: Some("rust_list_pattern".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(865), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(865)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("target".to_string(), FieldValue::Reference(DeclarationId(594))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1783), payload: vec![] }), ("empty_variant".to_string(), FieldValue::Reference(DeclarationId(1409))), ("cons_variant".to_string(), FieldValue::Reference(DeclarationId(1411))), ("scrutinee".to_string(), FieldValue::Literal(LiteralBits::String("{expr}".to_string()))), ("empty_pattern".to_string(), FieldValue::Literal(LiteralBits::String("[]".to_string()))), ("cons_pattern".to_string(), FieldValue::Literal(LiteralBits::String("[{head}, {tail} @ ..]".to_string()))), ("head_expr".to_string(), FieldValue::Literal(LiteralBits::String("{head}".to_string()))), ("tail_expr".to_string(), FieldValue::Literal(LiteralBits::String("{tail}".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 34988, 35292) }, - Declaration { id: DeclarationId(1311), name: Some("rust_statements".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(867), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(867)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("let_binding".to_string(), FieldValue::Literal(LiteralBits::String("let {name}: {type} = {value};".to_string()))), ("let_binding_inferred".to_string(), FieldValue::Literal(LiteralBits::String("let {name} = {value};".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 35294, 35432) }, - Declaration { id: DeclarationId(1312), name: Some("rust_expressions".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(868), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(868)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("field_access".to_string(), FieldValue::Literal(LiteralBits::String("({object}).{field}".to_string()))), ("function_call".to_string(), FieldValue::Literal(LiteralBits::String("{func}({args})".to_string()))), ("closure".to_string(), FieldValue::Literal(LiteralBits::String("|{params}| {{ {body} }}".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 35434, 35587) }, - Declaration { id: DeclarationId(1313), name: Some("rust_control_flow".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(870), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(870)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("if_else".to_string(), FieldValue::Literal(LiteralBits::String("if {cond} { {then} } else { {else} }".to_string()))), ("match_arm".to_string(), FieldValue::Literal(LiteralBits::String("{pattern} => {body},".to_string()))), ("for_each_syntax".to_string(), FieldValue::Record(vec![("prefix".to_string(), FieldValue::Literal(LiteralBits::String("for ".to_string()))), ("separator".to_string(), FieldValue::Literal(LiteralBits::String(" in ".to_string())))]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 35589, 35779) }, - Declaration { id: DeclarationId(1314), name: Some("rust_literals".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(871), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(871)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("true_keyword".to_string(), FieldValue::Literal(LiteralBits::String("true".to_string()))), ("false_keyword".to_string(), FieldValue::Literal(LiteralBits::String("false".to_string()))), ("string_delimiter".to_string(), FieldValue::Literal(LiteralBits::String("%Q".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 35781, 35893) }, - Declaration { id: DeclarationId(1315), name: Some("rust_modules".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(872), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(872)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("path_separator".to_string(), FieldValue::Literal(LiteralBits::String("::".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 35895, 35955) }, - Declaration { id: DeclarationId(1316), name: Some("rust_functions".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(873), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(873)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("definition".to_string(), FieldValue::Literal(LiteralBits::String("fn {name}({params}) -> {ret} { {body} }".to_string()))), ("definition_exported".to_string(), FieldValue::Literal(LiteralBits::String("pub fn {name}({params}) -> {ret} { {body} }".to_string()))), ("definition_void".to_string(), FieldValue::Literal(LiteralBits::String("fn {name}({params}) { {body} }".to_string()))), ("param_with_type".to_string(), FieldValue::Literal(LiteralBits::String("{name}: {type}".to_string()))), ("param_separator".to_string(), FieldValue::Literal(LiteralBits::String(", ".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 35957, 36235) }, - Declaration { id: DeclarationId(1317), name: Some("rust_type_applications".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(874), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(874)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("optional".to_string(), FieldValue::Literal(LiteralBits::String("Option<{element}>".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 36237, 36325) }, - Declaration { id: DeclarationId(1318), name: Some("rust_type_defs".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(875), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(875)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("struct_def".to_string(), FieldValue::Literal(LiteralBits::String("#[derive(Clone, Debug)]\npub struct {name} { {fields} }".to_string()))), ("struct_field".to_string(), FieldValue::Literal(LiteralBits::String("pub {name}: {type},".to_string()))), ("enum_def".to_string(), FieldValue::Literal(LiteralBits::String("#[derive(Clone, Debug)]\npub enum {name} { {variants} }".to_string()))), ("enum_unit_variant".to_string(), FieldValue::Literal(LiteralBits::String("{name},".to_string()))), ("enum_data_variant".to_string(), FieldValue::Literal(LiteralBits::String("{name} { {fields} },".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 36327, 36629) }, - Declaration { id: DeclarationId(1319), name: Some("rust_record_derive_templates".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(876), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(876)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("struct_def_no_debug".to_string(), FieldValue::Literal(LiteralBits::String("#[derive(Clone)]\npub struct {name} { {fields} }".to_string()))), ("enum_def_no_debug".to_string(), FieldValue::Literal(LiteralBits::String("#[derive(Clone)]\npub enum {name} { {variants} }".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 36631, 36844) }, - Declaration { id: DeclarationId(1320), name: Some("rust_patterns".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(877), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(877)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("match_expr".to_string(), FieldValue::Literal(LiteralBits::String("match {expr} { {arms} }".to_string()))), ("match_arm".to_string(), FieldValue::Literal(LiteralBits::String("{pattern} => {body},".to_string()))), ("variant_pattern".to_string(), FieldValue::Literal(LiteralBits::String("{name} {{ {bindings} }}".to_string()))), ("variant_pattern_positional".to_string(), FieldValue::Literal(LiteralBits::String("{name}({binding})".to_string()))), ("variant_pattern_empty".to_string(), FieldValue::Literal(LiteralBits::String("{name}".to_string()))), ("field_binding".to_string(), FieldValue::Literal(LiteralBits::String("{field}: {binding}".to_string()))), ("field_binding_separator".to_string(), FieldValue::Literal(LiteralBits::String(", ".to_string()))), ("wildcard".to_string(), FieldValue::Literal(LiteralBits::String("_".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 36846, 37181) }, - Declaration { id: DeclarationId(1321), name: Some("rust_collection_ops".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(878), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(878)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("concat".to_string(), FieldValue::Literal(LiteralBits::String("{ let mut __left = {left}; __left.extend({right}); __left }".to_string()))), ("length".to_string(), FieldValue::Literal(LiteralBits::String("({recv}).len() as i64".to_string()))), ("is_empty".to_string(), FieldValue::Literal(LiteralBits::String("({recv}).is_empty()".to_string()))), ("fold".to_string(), FieldValue::Literal(LiteralBits::String("({recv}).iter().fold({init}, {body})".to_string()))), ("map".to_string(), FieldValue::Literal(LiteralBits::String("({recv}).iter().map({body}).collect::>()".to_string()))), ("filter".to_string(), FieldValue::Literal(LiteralBits::String("{ let mut __out = Vec::new(); for {item} in ({recv}).iter() { if {predicate} { __out.push({item_push}); } } __out }".to_string()))), ("contains".to_string(), FieldValue::Literal(LiteralBits::String("({recv}).contains({item})".to_string()))), ("empty_list".to_string(), FieldValue::Literal(LiteralBits::String("Vec::new()".to_string()))), ("list_literal".to_string(), FieldValue::Literal(LiteralBits::String("vec![{elements}]".to_string()))), ("cons".to_string(), FieldValue::Literal(LiteralBits::String("{ let mut __list = {tail}; __list.insert(0, {head}); __list }".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 37183, 37774) }, - Declaration { id: DeclarationId(1322), name: Some("rust_value_construction".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(879), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(879)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("struct_literal".to_string(), FieldValue::Literal(LiteralBits::String("{type} {{ {fields} }}".to_string()))), ("struct_field_init".to_string(), FieldValue::Literal(LiteralBits::String("{name}: {value}".to_string()))), ("struct_field_separator".to_string(), FieldValue::Literal(LiteralBits::String(", ".to_string()))), ("variant_construction".to_string(), FieldValue::Literal(LiteralBits::String("{variant}({args})".to_string()))), ("variant_named_construction".to_string(), FieldValue::Literal(LiteralBits::String("{variant} {{ {fields} }}".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 37776, 38048) }, - Declaration { id: DeclarationId(1323), name: Some("rust_rendering".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(880), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(880)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("read".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] }), ("construct".to_string(), FieldValue::Variant { constructor: DeclarationId(1786), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 38050, 38131) }, - Declaration { id: DeclarationId(1324), name: Some("rust_language".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(883), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(883)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("statements".to_string(), FieldValue::Reference(DeclarationId(1311))), ("expressions".to_string(), FieldValue::Reference(DeclarationId(1312))), ("control_flow".to_string(), FieldValue::Reference(DeclarationId(1313))), ("literals".to_string(), FieldValue::Reference(DeclarationId(1314))), ("modules".to_string(), FieldValue::Reference(DeclarationId(1315))), ("functions".to_string(), FieldValue::Reference(DeclarationId(1316))), ("type_applications".to_string(), FieldValue::Reference(DeclarationId(1317))), ("type_definitions".to_string(), FieldValue::Reference(DeclarationId(1318))), ("record_derive_templates".to_string(), FieldValue::Reference(DeclarationId(1319))), ("patterns".to_string(), FieldValue::Reference(DeclarationId(1320))), ("collection_ops".to_string(), FieldValue::Reference(DeclarationId(1321))), ("values".to_string(), FieldValue::Reference(DeclarationId(1322)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 38133, 38578) }, - Declaration { id: DeclarationId(1325), name: Some("rust_correction_style".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(789), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(789)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("indent_unit".to_string(), FieldValue::Literal(LiteralBits::String(" ".to_string()))), ("line_ending".to_string(), FieldValue::Literal(LiteralBits::String("\n".to_string()))), ("string_quote".to_string(), FieldValue::Literal(LiteralBits::String("%Q".to_string()))), ("trailing_semicolon".to_string(), FieldValue::Literal(LiteralBits::Bool(true)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 40002, 40141) }, - Declaration { id: DeclarationId(1326), name: Some("rust_clean_emission".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(780), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(780)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("expression_wrapping".to_string(), FieldValue::Variant { constructor: DeclarationId(1653), payload: vec![] }), ("pattern_bindings".to_string(), FieldValue::Variant { constructor: DeclarationId(1656), payload: vec![] }), ("variant_payload_field_access".to_string(), FieldValue::Variant { constructor: DeclarationId(1660), payload: vec![] }), ("imports".to_string(), FieldValue::Variant { constructor: DeclarationId(1662), payload: vec![] }), ("block_return".to_string(), FieldValue::Variant { constructor: DeclarationId(1665), payload: vec![] }), ("variable_bindings".to_string(), FieldValue::Variant { constructor: DeclarationId(1668), payload: vec![] }), ("match_arm_body".to_string(), FieldValue::Variant { constructor: DeclarationId(1671), payload: vec![] }), ("correction_style".to_string(), FieldValue::Reference(DeclarationId(1325))), ("post_emit_verifier".to_string(), FieldValue::Record(vec![("command".to_string(), FieldValue::Literal(LiteralBits::String("rustc".to_string()))), ("args".to_string(), FieldValue::List(vec![FieldValue::Literal(LiteralBits::String("--edition=2021".to_string())), FieldValue::Literal(LiteralBits::String("-D".to_string())), FieldValue::Literal(LiteralBits::String("warnings".to_string()))])), ("syntax_only".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("expected_exit_code".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("output_policy".to_string(), FieldValue::Variant { constructor: DeclarationId(1674), payload: vec![] })]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 40143, 40756) }, - Declaration { id: DeclarationId(1327), name: Some("rust_clean_emission_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(781), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(781)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1324))), ("clean_emission".to_string(), FieldValue::Reference(DeclarationId(1326)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 40758, 40888) }, - Declaration { id: DeclarationId(1328), name: Some("rust_port_accessor".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(732), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(732)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({p0}).port_opt({p1}).cloned()".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 41990, 42093) }, - Declaration { id: DeclarationId(1329), name: Some("rust_node_accessor".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(732), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(732)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({p0}).node_opt({p1}).cloned()".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 42095, 42198) }, - Declaration { id: DeclarationId(1330), name: Some("rust_resolve_producer_accessor".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(732), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(732)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({p0}).resolve_producer_opt({p1}).cloned()".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 42200, 42327) }, - Declaration { id: DeclarationId(1331), name: Some("port_binding_rust".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(733), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(733)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("accessor".to_string(), FieldValue::Reference(DeclarationId(734))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1328))), ("language".to_string(), FieldValue::Reference(DeclarationId(1324)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 42329, 42460) }, - Declaration { id: DeclarationId(1332), name: Some("node_binding_rust".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(733), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(733)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("accessor".to_string(), FieldValue::Reference(DeclarationId(735))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1329))), ("language".to_string(), FieldValue::Reference(DeclarationId(1324)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 42462, 42593) }, - Declaration { id: DeclarationId(1333), name: Some("resolve_producer_binding_rust".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(733), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(733)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("accessor".to_string(), FieldValue::Reference(DeclarationId(736))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1330))), ("language".to_string(), FieldValue::Reference(DeclarationId(1324)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 42595, 42762) }, - Declaration { id: DeclarationId(1334), name: Some("rust_lane2_workflow_accessor".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(732), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(732)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({p0}).lane2_workflow_effect_at({p1}).cloned()".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 43273, 43402) }, - Declaration { id: DeclarationId(1335), name: Some("lane2_workflow_at_binding_rust".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(733), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(733)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("accessor".to_string(), FieldValue::Reference(DeclarationId(738))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1334))), ("language".to_string(), FieldValue::Reference(DeclarationId(1324)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 43404, 43571) }, - Declaration { id: DeclarationId(1336), name: Some("rust_declaration_by_id_accessor".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(732), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(732)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({p0}).declaration_opt({p1}).cloned()".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 43898, 44021) }, - Declaration { id: DeclarationId(1337), name: Some("declaration_by_id_binding_rust".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(733), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(733)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("accessor".to_string(), FieldValue::Reference(DeclarationId(737))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1336))), ("language".to_string(), FieldValue::Reference(DeclarationId(1324)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 44023, 44193) }, - Declaration { id: DeclarationId(1338), name: Some("CompilerHostRealization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 453, 502) }, - Declaration { id: DeclarationId(1339), name: Some("PipelineSnapshotKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "SnapshotSurface".to_string(), ty: DeclarationId(1997) }, Field { label: "SnapshotDag".to_string(), ty: DeclarationId(1998) }, Field { label: "SnapshotText".to_string(), ty: DeclarationId(1999) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 504, 576) }, - Declaration { id: DeclarationId(1340), name: Some("PipelineStageBinding".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "stage".to_string(), ty: DeclarationId(1006) }, Field { label: "realization".to_string(), ty: DeclarationId(1006) }, Field { label: "snapshot".to_string(), ty: DeclarationId(1339) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 578, 694) }, - Declaration { id: DeclarationId(1341), name: Some("parse_realization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1338)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("symbol".to_string(), FieldValue::Literal(LiteralBits::String("v3_compiler::parse".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 696, 780) }, - Declaration { id: DeclarationId(1342), name: Some("lower_realization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1338)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("symbol".to_string(), FieldValue::Literal(LiteralBits::String("v3_compiler::lower".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 782, 866) }, - Declaration { id: DeclarationId(1343), name: Some("infer_realization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1338)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("symbol".to_string(), FieldValue::Literal(LiteralBits::String("v3_compiler::infer".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 868, 952) }, - Declaration { id: DeclarationId(1344), name: Some("compute_ownership_realization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1338)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("symbol".to_string(), FieldValue::Literal(LiteralBits::String("v3_compiler::compute_ownership".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 954, 1062) }, - Declaration { id: DeclarationId(1345), name: Some("emit_realization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1338)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("symbol".to_string(), FieldValue::Literal(LiteralBits::String("v3_compiler::emit".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1064, 1146) }, - Declaration { id: DeclarationId(1346), name: Some("lens_complexity_realization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1338)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("symbol".to_string(), FieldValue::Literal(LiteralBits::String("v3_compiler::lens_complexity".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1148, 1252) }, - Declaration { id: DeclarationId(1347), name: Some("parse_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1340), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1340)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1353))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1341))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(1997), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1254, 1382) }, - Declaration { id: DeclarationId(1348), name: Some("lower_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1340), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1340)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1354))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1342))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(1998), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1384, 1508) }, - Declaration { id: DeclarationId(1349), name: Some("infer_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1340), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1340)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1355))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1343))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(1998), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1510, 1634) }, - Declaration { id: DeclarationId(1350), name: Some("compute_ownership_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1340), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1340)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1356))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1344))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(1998), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1636, 1796) }, - Declaration { id: DeclarationId(1351), name: Some("lens_complexity_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1340), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1340)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1357))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1346))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(1998), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1798, 1952) }, - Declaration { id: DeclarationId(1352), name: Some("emit_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1340), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1340)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1358))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1345))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(1999), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1954, 2076) }, - Declaration { id: DeclarationId(1353), name: Some("parse".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(186)], output: DeclarationId(731), body: ArrowBody::ExternalRealization(DeclarationId(1341)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2078, 2140) }, - Declaration { id: DeclarationId(1354), name: Some("lower".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(731)], output: DeclarationId(731), body: ArrowBody::ExternalRealization(DeclarationId(1342)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2142, 2184) }, - Declaration { id: DeclarationId(1355), name: Some("infer".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(731)], output: DeclarationId(731), body: ArrowBody::ExternalRealization(DeclarationId(1343)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2186, 2228) }, - Declaration { id: DeclarationId(1356), name: Some("compute_ownership".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(731)], output: DeclarationId(731), body: ArrowBody::ExternalRealization(DeclarationId(1344)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2230, 2288) }, - Declaration { id: DeclarationId(1357), name: Some("lens_complexity".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(731)], output: DeclarationId(731), body: ArrowBody::ExternalRealization(DeclarationId(1346)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2290, 2347) }, - Declaration { id: DeclarationId(1358), name: Some("emit".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(731), DeclarationId(731), DeclarationId(731), DeclarationId(883)], output: DeclarationId(186), body: ArrowBody::ExternalRealization(DeclarationId(1345)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2349, 2460) }, - Declaration { id: DeclarationId(1359), name: Some("compile".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(186), DeclarationId(883)], output: DeclarationId(186), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/compiler/pipeline.dag", 2533, 2605)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2462, 2605) }, - Declaration { id: DeclarationId(1360), name: Some("from_symbol".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(2000), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/compiler/operators.dag", 156, 771)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/operators.dag", 108, 771) }, - Declaration { id: DeclarationId(1361), name: Some("symbol".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(710)], output: DeclarationId(186), body: ArrowBody::UserDefined(NodeId(253)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/operators.dag", 773, 1214) }, - Declaration { id: DeclarationId(1362), name: Some("algebra_field_name".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(710)], output: DeclarationId(186), body: ArrowBody::UserDefined(NodeId(270)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/operators.dag", 1216, 2017) }, - Declaration { id: DeclarationId(1363), name: Some("LensRegistryEntry".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(111) }, Field { label: "lens_file".to_string(), ty: DeclarationId(120) }, Field { label: "generated_file".to_string(), ty: DeclarationId(120) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 1950, 2045) }, - Declaration { id: DeclarationId(1364), name: Some("lens_cost_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1363), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1363)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("cost".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/complexity.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/lens_cost_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 2047, 2214) }, - Declaration { id: DeclarationId(1365), name: Some("lens_cost_symbolic_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1363), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1363)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("cost_symbolic".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/cost.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/lens_cost_symbolic_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 2216, 2404) }, - Declaration { id: DeclarationId(1366), name: Some("lens_effect_enumeration_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1363), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1363)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("effect_enumeration".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/effect_enumeration.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/lens_effect_enumeration_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 2406, 2623) }, - Declaration { id: DeclarationId(1367), name: Some("lens_provenance_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1363), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1363)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("provenance".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/provenance.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/lens_provenance_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 2625, 2810) }, - Declaration { id: DeclarationId(1368), name: Some("lens_structural_resolution_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1363), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1363)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("structural_resolution".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/structural_resolution.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/lens_structural_resolution_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 2812, 3041) }, - Declaration { id: DeclarationId(1369), name: Some("lens_unused_parameters_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1363), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1363)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("unused_parameters".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/unused_parameters.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/lens_unused_parameters_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 3043, 3256) }, - Declaration { id: DeclarationId(1370), name: Some("lens_infer_helpers_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1363), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1363)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("infer_helpers".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/infer_helpers.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/infer_helpers_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 3883, 4075) }, - Declaration { id: DeclarationId(1371), name: Some("lens_variant_payload_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1363), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1363)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("variant_payload".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/variant_payload.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/variant_payload_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 4077, 4277) }, - Declaration { id: DeclarationId(1372), name: Some("lens_lower_helpers_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1363), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1363)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("lower_helpers".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/lower_helpers.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/lower_helpers_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 4527, 4719) }, - Declaration { id: DeclarationId(1373), name: Some("IntegerAlgebra".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "OrderedRingAlgebra".to_string(), ty: DeclarationId(2001) }, Field { label: "SemiringAlgebra".to_string(), ty: DeclarationId(2002) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5230, 5292) }, - Declaration { id: DeclarationId(1374), name: Some("NonIntegerAlgebra".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "BooleanAlgebraAlgebra".to_string(), ty: DeclarationId(2003) }, Field { label: "TerminalAlgebra".to_string(), ty: DeclarationId(2004) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5294, 5362) }, - Declaration { id: DeclarationId(1375), name: Some("TargetCarrier".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "BitCarrier".to_string(), ty: DeclarationId(2005) }, Field { label: "ByteCarrier".to_string(), ty: DeclarationId(2006) }, Field { label: "Word16Carrier".to_string(), ty: DeclarationId(2007) }, Field { label: "Word32Carrier".to_string(), ty: DeclarationId(2008) }, Field { label: "Word64Carrier".to_string(), ty: DeclarationId(2009) }, Field { label: "TerminalCarrier".to_string(), ty: DeclarationId(2010) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6852, 6975) }, - Declaration { id: DeclarationId(1376), name: Some("IntegerOverflow".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "TwoComplementWrap".to_string(), ty: DeclarationId(2011) }, Field { label: "Saturating".to_string(), ty: DeclarationId(2012) }, Field { label: "Trap".to_string(), ty: DeclarationId(2013) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 7692, 7758) }, - Declaration { id: DeclarationId(1377), name: Some("RustPrimitive".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "IntegerPrimitive".to_string(), ty: DeclarationId(2014) }, Field { label: "NonIntegerPrimitive".to_string(), ty: DeclarationId(2015) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 8513, 9295) }, - Declaration { id: DeclarationId(1378), name: Some("rust_pilot_primitives".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(1377) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(2016)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![FieldValue::Variant { constructor: DeclarationId(2014), payload: vec![FieldValue::Literal(LiteralBits::String("i8".to_string())), FieldValue::Variant { constructor: DeclarationId(2001), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2006), payload: vec![] }, FieldValue::Literal(LiteralBits::String("-128".to_string())), FieldValue::Literal(LiteralBits::String("127".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2011), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2014), payload: vec![FieldValue::Literal(LiteralBits::String("i16".to_string())), FieldValue::Variant { constructor: DeclarationId(2001), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2007), payload: vec![] }, FieldValue::Literal(LiteralBits::String("-32768".to_string())), FieldValue::Literal(LiteralBits::String("32767".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2011), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2014), payload: vec![FieldValue::Literal(LiteralBits::String("i32".to_string())), FieldValue::Variant { constructor: DeclarationId(2001), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2008), payload: vec![] }, FieldValue::Literal(LiteralBits::String("-2147483648".to_string())), FieldValue::Literal(LiteralBits::String("2147483647".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2011), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2014), payload: vec![FieldValue::Literal(LiteralBits::String("i64".to_string())), FieldValue::Variant { constructor: DeclarationId(2001), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2009), payload: vec![] }, FieldValue::Literal(LiteralBits::String("-9223372036854775808".to_string())), FieldValue::Literal(LiteralBits::String("9223372036854775807".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2011), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2014), payload: vec![FieldValue::Literal(LiteralBits::String("u8".to_string())), FieldValue::Variant { constructor: DeclarationId(2002), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2006), payload: vec![] }, FieldValue::Literal(LiteralBits::String("0".to_string())), FieldValue::Literal(LiteralBits::String("255".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2011), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2014), payload: vec![FieldValue::Literal(LiteralBits::String("u16".to_string())), FieldValue::Variant { constructor: DeclarationId(2002), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2007), payload: vec![] }, FieldValue::Literal(LiteralBits::String("0".to_string())), FieldValue::Literal(LiteralBits::String("65535".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2011), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2014), payload: vec![FieldValue::Literal(LiteralBits::String("u32".to_string())), FieldValue::Variant { constructor: DeclarationId(2002), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2008), payload: vec![] }, FieldValue::Literal(LiteralBits::String("0".to_string())), FieldValue::Literal(LiteralBits::String("4294967295".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2011), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2014), payload: vec![FieldValue::Literal(LiteralBits::String("u64".to_string())), FieldValue::Variant { constructor: DeclarationId(2002), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2009), payload: vec![] }, FieldValue::Literal(LiteralBits::String("0".to_string())), FieldValue::Literal(LiteralBits::String("18446744073709551615".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2011), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2015), payload: vec![FieldValue::Literal(LiteralBits::String("bool".to_string())), FieldValue::Variant { constructor: DeclarationId(2003), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2005), payload: vec![] }, FieldValue::Literal(LiteralBits::Bool(true))] }, FieldValue::Variant { constructor: DeclarationId(2015), payload: vec![FieldValue::Literal(LiteralBits::String("()".to_string())), FieldValue::Variant { constructor: DeclarationId(2004), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2010), payload: vec![] }, FieldValue::Literal(LiteralBits::Bool(true))] }])), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 9595, 12449) }, - Declaration { id: DeclarationId(1379), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(597) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3259, 3272) }, - Declaration { id: DeclarationId(1380), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(599) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3421, 3434) }, - Declaration { id: DeclarationId(1381), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(599) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3439, 3452) }, - Declaration { id: DeclarationId(1382), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(601) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3556, 3569) }, - Declaration { id: DeclarationId(1383), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(603) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4162, 4169) }, - Declaration { id: DeclarationId(1384), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(604), DeclarationId(603)], output: DeclarationId(604), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4183, 4196) }, - Declaration { id: DeclarationId(1385), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(606) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4617, 4624) }, - Declaration { id: DeclarationId(1386), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(606), DeclarationId(607)], output: DeclarationId(607), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4638, 4651) }, - Declaration { id: DeclarationId(1387), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(609) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5336, 5349) }, - Declaration { id: DeclarationId(1388), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(609) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5354, 5367) }, - Declaration { id: DeclarationId(1389), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(609) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5372, 5385) }, - Declaration { id: DeclarationId(1390), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(611) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5686, 5693) }, - Declaration { id: DeclarationId(1391), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(611)], output: DeclarationId(612), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5698, 5708) }, - Declaration { id: DeclarationId(1392), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(612) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5713, 5720) }, - Declaration { id: DeclarationId(1393), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(614) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5867, 5874) }, - Declaration { id: DeclarationId(1394), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(614)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5879, 5892) }, - Declaration { id: DeclarationId(1395), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(614) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5897, 5904) }, - Declaration { id: DeclarationId(1396), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(616) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6130, 6137) }, - Declaration { id: DeclarationId(1397), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(617) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6151, 6158) }, - Declaration { id: DeclarationId(1398), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(616)], output: DeclarationId(1397), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6142, 6158) }, - Declaration { id: DeclarationId(1399), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(617) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6163, 6170) }, - Declaration { id: DeclarationId(1400), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(619) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6356, 6363) }, - Declaration { id: DeclarationId(1401), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(621) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6588, 6595) }, - Declaration { id: DeclarationId(1402), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(625) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7202, 7209) }, - Declaration { id: DeclarationId(1403), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(622), arguments: vec![TemplateArgument { parameter: DeclarationId(623), value: DeclarationId(625) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7219, 7236) }, - Declaration { id: DeclarationId(1404), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(1403) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7214, 7237) }, - Declaration { id: DeclarationId(1405), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(627) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7415, 7422) }, - Declaration { id: DeclarationId(1406), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(622), arguments: vec![TemplateArgument { parameter: DeclarationId(623), value: DeclarationId(627) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7444, 7461) }, - Declaration { id: DeclarationId(1407), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(1406) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7439, 7462) }, - Declaration { id: DeclarationId(1408), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(629) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 8177, 8184) }, - Declaration { id: DeclarationId(1409), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 2106, 2111) }, - Declaration { id: DeclarationId(1410), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(595) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 2144, 2157) }, - Declaration { id: DeclarationId(1411), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "head".to_string(), ty: DeclarationId(595) }, Field { label: "tail".to_string(), ty: DeclarationId(1410) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 2116, 2159) }, - Declaration { id: DeclarationId(1412), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(635) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1477, 1490) }, - Declaration { id: DeclarationId(1413), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(637) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1570, 1583) }, - Declaration { id: DeclarationId(1414), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 11753, 11760) }, - Declaration { id: DeclarationId(1415), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(717), arguments: vec![TemplateArgument { parameter: DeclarationId(718), value: DeclarationId(653) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 20916, 20943) }, - Declaration { id: DeclarationId(1416), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(622), arguments: vec![TemplateArgument { parameter: DeclarationId(623), value: DeclarationId(653) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 20995, 21026) }, - Declaration { id: DeclarationId(1417), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(717), arguments: vec![TemplateArgument { parameter: DeclarationId(718), value: DeclarationId(653) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 21031, 21058) }, - Declaration { id: DeclarationId(1418), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(1417), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 21031, 21059) }, - Declaration { id: DeclarationId(1419), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(653) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 21185, 21206) }, - Declaration { id: DeclarationId(1420), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(717), arguments: vec![TemplateArgument { parameter: DeclarationId(718), value: DeclarationId(653) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 21211, 21238) }, - Declaration { id: DeclarationId(1421), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(1420), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 21211, 21239) }, - Declaration { id: DeclarationId(1422), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(653) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 22268, 22289) }, - Declaration { id: DeclarationId(1423), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(156), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 29695, 29706) }, - Declaration { id: DeclarationId(1424), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 30432, 30439) }, - Declaration { id: DeclarationId(1425), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 30662, 30669) }, - Declaration { id: DeclarationId(1426), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(653) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 37237, 37258) }, - Declaration { id: DeclarationId(1427), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(684) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 37264, 37295) }, - Declaration { id: DeclarationId(1428), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "text".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 7532, 7561) }, - Declaration { id: DeclarationId(1429), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 7566, 7595) }, - Declaration { id: DeclarationId(1430), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(638) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 7627, 7645) }, - Declaration { id: DeclarationId(1431), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(638) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 8066, 8084) }, - Declaration { id: DeclarationId(1432), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "tokens".to_string(), ty: DeclarationId(1431) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 8036, 8086) }, - Declaration { id: DeclarationId(1433), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "segment".to_string(), ty: DeclarationId(186) }, Field { label: "reason".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 8091, 8147) }, - Declaration { id: DeclarationId(1434), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "template".to_string(), ty: DeclarationId(639) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 8510, 8555) }, - Declaration { id: DeclarationId(1435), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "raw".to_string(), ty: DeclarationId(186) }, Field { label: "segment".to_string(), ty: DeclarationId(186) }, Field { label: "reason".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 8560, 8630) }, - Declaration { id: DeclarationId(1436), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 14355, 14365) }, - Declaration { id: DeclarationId(1437), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "key_source".to_string(), ty: DeclarationId(649) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 14370, 14408) }, - Declaration { id: DeclarationId(1438), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "key_source".to_string(), ty: DeclarationId(649) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 14413, 14451) }, - Declaration { id: DeclarationId(1439), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "cause".to_string(), ty: DeclarationId(648) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 14697, 14732) }, - Declaration { id: DeclarationId(1440), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 14737, 14749) }, - Declaration { id: DeclarationId(1441), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(645) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 15171, 15200) }, - Declaration { id: DeclarationId(1442), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(646) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 15205, 15230) }, - Declaration { id: DeclarationId(1443), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 15743, 15753) }, - Declaration { id: DeclarationId(1444), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "method".to_string(), ty: DeclarationId(156) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 15758, 15796) }, - Declaration { id: DeclarationId(1445), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 16501, 16528) }, - Declaration { id: DeclarationId(1446), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "field".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 16533, 16561) }, - Declaration { id: DeclarationId(1447), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 16589, 16601) }, - Declaration { id: DeclarationId(1448), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "fields".to_string(), ty: DeclarationId(1447) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 16566, 16603) }, - Declaration { id: DeclarationId(1449), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 17280, 17293) }, - Declaration { id: DeclarationId(1450), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 17298, 17312) }, - Declaration { id: DeclarationId(1451), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "reason".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 17317, 17349) }, - Declaration { id: DeclarationId(1452), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "effect".to_string(), ty: DeclarationId(653) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 19519, 19560) }, - Declaration { id: DeclarationId(1453), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "operation_name".to_string(), ty: DeclarationId(186) }, Field { label: "method_str".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 19565, 19634) }, - Declaration { id: DeclarationId(1454), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "operation_name".to_string(), ty: DeclarationId(186) }, Field { label: "method".to_string(), ty: DeclarationId(156) }, Field { label: "raw_path".to_string(), ty: DeclarationId(186) }, Field { label: "segment".to_string(), ty: DeclarationId(186) }, Field { label: "reason".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 19639, 19789) }, - Declaration { id: DeclarationId(1455), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 20538, 20559) }, - Declaration { id: DeclarationId(1456), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(717), arguments: vec![TemplateArgument { parameter: DeclarationId(718), value: DeclarationId(653) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 20590, 20617) }, - Declaration { id: DeclarationId(1457), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "first_breaker".to_string(), ty: DeclarationId(1456) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 20564, 20619) }, - Declaration { id: DeclarationId(1458), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(653) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 24543, 24564) }, - Declaration { id: DeclarationId(1459), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "ops".to_string(), ty: DeclarationId(1458) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 24523, 24566) }, - Declaration { id: DeclarationId(1460), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(636), arguments: vec![TemplateArgument { parameter: DeclarationId(637), value: DeclarationId(662) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 24592, 24619) }, - Declaration { id: DeclarationId(1461), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "arms".to_string(), ty: DeclarationId(1460) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 24571, 24621) }, - Declaration { id: DeclarationId(1462), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "body".to_string(), ty: DeclarationId(663) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 24626, 24661) }, - Declaration { id: DeclarationId(1463), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(636), arguments: vec![TemplateArgument { parameter: DeclarationId(637), value: DeclarationId(663) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 24693, 24725) }, - Declaration { id: DeclarationId(1464), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "branches".to_string(), ty: DeclarationId(1463) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 24666, 24727) }, - Declaration { id: DeclarationId(1465), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(655) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 25364, 25410) }, - Declaration { id: DeclarationId(1466), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(664) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 25415, 25467) }, - Declaration { id: DeclarationId(1467), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 25964, 25984) }, - Declaration { id: DeclarationId(1468), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 25989, 26010) }, - Declaration { id: DeclarationId(1469), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 26015, 26038) }, - Declaration { id: DeclarationId(1470), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 26043, 26061) }, - Declaration { id: DeclarationId(1471), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 26066, 26084) }, - Declaration { id: DeclarationId(1472), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(655) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 26401, 26447) }, - Declaration { id: DeclarationId(1473), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(668) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 26452, 26504) }, - Declaration { id: DeclarationId(1474), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 33114, 33120) }, - Declaration { id: DeclarationId(1475), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "reason".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 33125, 33162) }, - Declaration { id: DeclarationId(1476), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "reason".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 33167, 33204) }, - Declaration { id: DeclarationId(1477), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 33678, 33697) }, - Declaration { id: DeclarationId(1478), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "agreement".to_string(), ty: DeclarationId(678) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 33702, 33751) }, - Declaration { id: DeclarationId(1479), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(689), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 15978, 15986) }, - Declaration { id: DeclarationId(1480), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(730), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 16035, 16044) }, - Declaration { id: DeclarationId(1481), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(730), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 16110, 16119) }, - Declaration { id: DeclarationId(1482), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(704), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 16496, 16508) }, - Declaration { id: DeclarationId(1483), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(663), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 16817, 16832) }, - Declaration { id: DeclarationId(1484), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(945), arguments: vec![TemplateArgument { parameter: DeclarationId(946), value: DeclarationId(632) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 17203, 17224) }, - Declaration { id: DeclarationId(1485), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(945), arguments: vec![TemplateArgument { parameter: DeclarationId(946), value: DeclarationId(632) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 17288, 17309) }, - Declaration { id: DeclarationId(1486), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 456, 466) }, - Declaration { id: DeclarationId(1487), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(687) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 471, 490) }, - Declaration { id: DeclarationId(1488), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 495, 505) }, - Declaration { id: DeclarationId(1489), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(630), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 569, 576) }, - Declaration { id: DeclarationId(1490), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 768, 779) }, - Declaration { id: DeclarationId(1491), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 784, 797) }, - Declaration { id: DeclarationId(1492), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 802, 819) }, - Declaration { id: DeclarationId(1493), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(690) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 2850, 2870) }, - Declaration { id: DeclarationId(1494), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 2875, 2903) }, - Declaration { id: DeclarationId(1495), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(632) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 2908, 2942) }, - Declaration { id: DeclarationId(1496), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(632) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 2947, 2976) }, - Declaration { id: DeclarationId(1497), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 2981, 2998) }, - Declaration { id: DeclarationId(1498), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 3602, 3609) }, - Declaration { id: DeclarationId(1499), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "previous".to_string(), ty: DeclarationId(692) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 3614, 3664) }, - Declaration { id: DeclarationId(1500), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 3689, 3698) }, - Declaration { id: DeclarationId(1501), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(692) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 3703, 3739) }, - Declaration { id: DeclarationId(1502), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "lower".to_string(), ty: DeclarationId(695) }, Field { label: "width".to_string(), ty: DeclarationId(693) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4051, 4101) }, - Declaration { id: DeclarationId(1503), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4106, 4115) }, - Declaration { id: DeclarationId(1504), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4366, 4376) }, - Declaration { id: DeclarationId(1505), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4381, 4390) }, - Declaration { id: DeclarationId(1506), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4395, 4404) }, - Declaration { id: DeclarationId(1507), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(690) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4831, 4851) }, - Declaration { id: DeclarationId(1508), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(632) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4856, 4880) }, - Declaration { id: DeclarationId(1509), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(699) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4892, 4908) }, - Declaration { id: DeclarationId(1510), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(1509) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4885, 4909) }, - Declaration { id: DeclarationId(1511), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(700) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4919, 4935) }, - Declaration { id: DeclarationId(1512), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(1511) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4914, 4936) }, - Declaration { id: DeclarationId(1513), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(699) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4945, 4961) }, - Declaration { id: DeclarationId(1514), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(1513) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4941, 4962) }, - Declaration { id: DeclarationId(1515), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(700) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5025, 5041) }, - Declaration { id: DeclarationId(1516), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "constructor".to_string(), ty: DeclarationId(632) }, Field { label: "payload".to_string(), ty: DeclarationId(1515) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4967, 5047) }, - Declaration { id: DeclarationId(1517), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5206, 5235) }, - Declaration { id: DeclarationId(1518), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(699) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5270, 5286) }, - Declaration { id: DeclarationId(1519), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "fields".to_string(), ty: DeclarationId(1518) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5240, 5288) }, - Declaration { id: DeclarationId(1520), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(699) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5306, 5322) }, - Declaration { id: DeclarationId(1521), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(1520) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5293, 5323) }, - Declaration { id: DeclarationId(1522), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(630) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5658, 5677) }, - Declaration { id: DeclarationId(1523), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(632) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5682, 5716) }, - Declaration { id: DeclarationId(1524), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5721, 5728) }, - Declaration { id: DeclarationId(1525), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5733, 5739) }, - Declaration { id: DeclarationId(1526), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5744, 5764) }, - Declaration { id: DeclarationId(1527), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(691) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5993, 6010) }, - Declaration { id: DeclarationId(1528), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(697) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6032, 6047) }, - Declaration { id: DeclarationId(1529), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "children".to_string(), ty: DeclarationId(1528) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6015, 6049) }, - Declaration { id: DeclarationId(1530), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(697) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6071, 6086) }, - Declaration { id: DeclarationId(1531), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "variants".to_string(), ty: DeclarationId(1530) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6054, 6088) }, - Declaration { id: DeclarationId(1532), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(632) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6115, 6134) }, - Declaration { id: DeclarationId(1533), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "inputs".to_string(), ty: DeclarationId(1532) }, Field { label: "output".to_string(), ty: DeclarationId(632) }, Field { label: "body".to_string(), ty: DeclarationId(702) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6093, 6190) }, - Declaration { id: DeclarationId(1534), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "element".to_string(), ty: DeclarationId(632) }, Field { label: "bound".to_string(), ty: DeclarationId(696) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6195, 6273) }, - Declaration { id: DeclarationId(1535), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(698) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6341, 6363) }, - Declaration { id: DeclarationId(1536), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "template".to_string(), ty: DeclarationId(632) }, Field { label: "arguments".to_string(), ty: DeclarationId(1535) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6278, 6369) }, - Declaration { id: DeclarationId(1537), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6418, 6425) }, - Declaration { id: DeclarationId(1538), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(632) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6470, 6489) }, - Declaration { id: DeclarationId(1539), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(705) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6508, 6530) }, - Declaration { id: DeclarationId(1540), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(632), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6543, 6557) }, - Declaration { id: DeclarationId(1541), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(632), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6570, 6584) }, - Declaration { id: DeclarationId(1542), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(701), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6599, 6609) }, - Declaration { id: DeclarationId(1543), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(706), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6629, 6644) }, - Declaration { id: DeclarationId(1544), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(632) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 7767, 7786) }, - Declaration { id: DeclarationId(1545), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8067, 8070) }, - Declaration { id: DeclarationId(1546), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8075, 8078) }, - Declaration { id: DeclarationId(1547), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8083, 8086) }, - Declaration { id: DeclarationId(1548), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8091, 8094) }, - Declaration { id: DeclarationId(1549), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8218, 8220) }, - Declaration { id: DeclarationId(1550), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8225, 8227) }, - Declaration { id: DeclarationId(1551), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8232, 8234) }, - Declaration { id: DeclarationId(1552), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8239, 8241) }, - Declaration { id: DeclarationId(1553), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8246, 8248) }, - Declaration { id: DeclarationId(1554), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8253, 8255) }, - Declaration { id: DeclarationId(1555), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8508, 8511) }, - Declaration { id: DeclarationId(1556), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8516, 8518) }, - Declaration { id: DeclarationId(1557), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(707) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8754, 8778) }, - Declaration { id: DeclarationId(1558), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(708) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8783, 8807) }, - Declaration { id: DeclarationId(1559), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(709) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8812, 8830) }, - Declaration { id: DeclarationId(1560), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(632) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9017, 9040) }, - Declaration { id: DeclarationId(1561), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(632), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9105, 9119) }, - Declaration { id: DeclarationId(1562), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "field_label".to_string(), ty: DeclarationId(186) }, Field { label: "field_child".to_string(), ty: DeclarationId(1561) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9045, 9125) }, - Declaration { id: DeclarationId(1563), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(710) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9130, 9152) }, - Declaration { id: DeclarationId(1564), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9277, 9329) }, - Declaration { id: DeclarationId(1565), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(632) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9334, 9364) }, - Declaration { id: DeclarationId(1566), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(713), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9528, 9543) }, - Declaration { id: DeclarationId(1567), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(636), arguments: vec![TemplateArgument { parameter: DeclarationId(637), value: DeclarationId(719) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 11519, 11550) }, - Declaration { id: DeclarationId(1568), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(634), arguments: vec![TemplateArgument { parameter: DeclarationId(635), value: DeclarationId(720) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 11574, 11604) }, - Declaration { id: DeclarationId(1569), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "count".to_string(), ty: DeclarationId(631) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12030, 12059) }, - Declaration { id: DeclarationId(1570), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "cluster".to_string(), ty: DeclarationId(633) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12064, 12094) }, - Declaration { id: DeclarationId(1571), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(663), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12208, 12223) }, - Declaration { id: DeclarationId(1572), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(631) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12297, 12309) }, - Declaration { id: DeclarationId(1573), name: None, connective: TypeConnective::Atom(AtomPayload::UnresolvedIdentifier("UserMatch".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12550, 12559) }, - Declaration { id: DeclarationId(1574), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(714) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12617, 12633) }, - Declaration { id: DeclarationId(1575), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(725), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12697, 12721) }, - Declaration { id: DeclarationId(1576), name: None, connective: TypeConnective::Atom(AtomPayload::UnresolvedIdentifier("UserCallable".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13135, 13147) }, - Declaration { id: DeclarationId(1577), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(631) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13225, 13237) }, - Declaration { id: DeclarationId(1578), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(663), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13275, 13290) }, - Declaration { id: DeclarationId(1579), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(728), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13313, 13335) }, - Declaration { id: DeclarationId(1580), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(723) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13427, 13443) }, - Declaration { id: DeclarationId(1581), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(724) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13448, 13472) }, - Declaration { id: DeclarationId(1582), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(726) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13477, 13495) }, - Declaration { id: DeclarationId(1583), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(727) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13500, 13514) }, - Declaration { id: DeclarationId(1584), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(729) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13519, 13533) }, - Declaration { id: DeclarationId(1585), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(704) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13562, 13579) }, - Declaration { id: DeclarationId(1586), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(730) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13589, 13603) }, - Declaration { id: DeclarationId(1587), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(689) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13613, 13626) }, - Declaration { id: DeclarationId(1588), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(721) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13639, 13652) }, - Declaration { id: DeclarationId(1589), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(945), arguments: vec![TemplateArgument { parameter: DeclarationId(946), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 9849, 9869) }, - Declaration { id: DeclarationId(1590), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(945), arguments: vec![TemplateArgument { parameter: DeclarationId(946), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 9933, 9953) }, - Declaration { id: DeclarationId(1591), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(636), arguments: vec![TemplateArgument { parameter: DeclarationId(637), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 10021, 10051) }, - Declaration { id: DeclarationId(1592), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 10518, 10536) }, - Declaration { id: DeclarationId(1593), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(636), arguments: vec![TemplateArgument { parameter: DeclarationId(637), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 10542, 10572) }, - Declaration { id: DeclarationId(1594), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 13069, 13087) }, - Declaration { id: DeclarationId(1595), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(636), arguments: vec![TemplateArgument { parameter: DeclarationId(637), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17290, 17320) }, - Declaration { id: DeclarationId(1596), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17325, 17343) }, - Declaration { id: DeclarationId(1597), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17594, 17612) }, - Declaration { id: DeclarationId(1598), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17617, 17635) }, - Declaration { id: DeclarationId(1599), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 18901, 18919) }, - Declaration { id: DeclarationId(1600), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 19172, 19190) }, - Declaration { id: DeclarationId(1601), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 19638, 19656) }, - Declaration { id: DeclarationId(1602), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21673, 21691) }, - Declaration { id: DeclarationId(1603), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21721, 21739) }, - Declaration { id: DeclarationId(1604), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 22026, 22044) }, - Declaration { id: DeclarationId(1605), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 22072, 22090) }, - Declaration { id: DeclarationId(1606), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 22450, 22468) }, - Declaration { id: DeclarationId(1607), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 22473, 22491) }, - Declaration { id: DeclarationId(1608), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 4805, 4817) }, - Declaration { id: DeclarationId(1609), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 4822, 4838) }, - Declaration { id: DeclarationId(1610), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 4843, 4857) }, - Declaration { id: DeclarationId(1611), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 5707, 5720) }, - Declaration { id: DeclarationId(1612), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 5725, 5740) }, - Declaration { id: DeclarationId(1613), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 5745, 5761) }, - Declaration { id: DeclarationId(1614), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 5766, 5779) }, - Declaration { id: DeclarationId(1615), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(742), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 6632, 6653) }, - Declaration { id: DeclarationId(1616), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(743), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 6668, 6678) }, - Declaration { id: DeclarationId(1617), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 6708, 6712) }, - Declaration { id: DeclarationId(1618), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8181, 8190) }, - Declaration { id: DeclarationId(1619), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "previous".to_string(), ty: DeclarationId(746) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8195, 8241) }, - Declaration { id: DeclarationId(1620), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8413, 8430) }, - Declaration { id: DeclarationId(1621), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(745) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8435, 8459) }, - Declaration { id: DeclarationId(1622), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "var".to_string(), ty: DeclarationId(745) }, Field { label: "degree".to_string(), ty: DeclarationId(746) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8464, 8526) }, - Declaration { id: DeclarationId(1623), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(636), arguments: vec![TemplateArgument { parameter: DeclarationId(637), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8543, 8573) }, - Declaration { id: DeclarationId(1624), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(1623) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8531, 8574) }, - Declaration { id: DeclarationId(1625), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(636), arguments: vec![TemplateArgument { parameter: DeclarationId(637), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8587, 8617) }, - Declaration { id: DeclarationId(1626), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(1625) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8579, 8618) }, - Declaration { id: DeclarationId(1627), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(745) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8623, 8644) }, - Declaration { id: DeclarationId(1628), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8649, 8668) }, - Declaration { id: DeclarationId(1629), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(600), arguments: vec![TemplateArgument { parameter: DeclarationId(601), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 10402, 10414) }, - Declaration { id: DeclarationId(1630), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(637)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5879, 5892) }, - Declaration { id: DeclarationId(1631), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(613), arguments: vec![TemplateArgument { parameter: DeclarationId(614), value: DeclarationId(747) }, TemplateArgument { parameter: DeclarationId(1394), value: DeclarationId(754) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 10395, 10442) }, - Declaration { id: DeclarationId(1632), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(600), arguments: vec![TemplateArgument { parameter: DeclarationId(601), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 10702, 10717) }, - Declaration { id: DeclarationId(1633), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(747), DeclarationId(747)], output: DeclarationId(747), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4183, 4196) }, - Declaration { id: DeclarationId(1634), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(602), arguments: vec![TemplateArgument { parameter: DeclarationId(604), value: DeclarationId(747) }, TemplateArgument { parameter: DeclarationId(603), value: DeclarationId(747) }, TemplateArgument { parameter: DeclarationId(1384), value: DeclarationId(758) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 13109, 13152) }, - Declaration { id: DeclarationId(1635), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(748), DeclarationId(603)], output: DeclarationId(748), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4183, 4196) }, - Declaration { id: DeclarationId(1636), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(602), arguments: vec![TemplateArgument { parameter: DeclarationId(604), value: DeclarationId(748) }, TemplateArgument { parameter: DeclarationId(1384), value: DeclarationId(775) }, TemplateArgument { parameter: DeclarationId(603), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 15818, 15928) }, - Declaration { id: DeclarationId(1637), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(748), DeclarationId(603)], output: DeclarationId(748), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4183, 4196) }, - Declaration { id: DeclarationId(1638), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(602), arguments: vec![TemplateArgument { parameter: DeclarationId(604), value: DeclarationId(748) }, TemplateArgument { parameter: DeclarationId(1384), value: DeclarationId(775) }, TemplateArgument { parameter: DeclarationId(603), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 15983, 16093) }, - Declaration { id: DeclarationId(1639), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(598), arguments: vec![TemplateArgument { parameter: DeclarationId(599), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17366, 17396) }, - Declaration { id: DeclarationId(1640), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(598), arguments: vec![TemplateArgument { parameter: DeclarationId(599), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17348, 17397) }, - Declaration { id: DeclarationId(1641), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(596), arguments: vec![TemplateArgument { parameter: DeclarationId(597), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17667, 17674) }, - Declaration { id: DeclarationId(1642), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(598), arguments: vec![TemplateArgument { parameter: DeclarationId(599), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17792, 17835) }, - Declaration { id: DeclarationId(1643), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(598), arguments: vec![TemplateArgument { parameter: DeclarationId(599), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 19105, 19137) }, - Declaration { id: DeclarationId(1644), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(596), arguments: vec![TemplateArgument { parameter: DeclarationId(597), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21776, 21783) }, - Declaration { id: DeclarationId(1645), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(598), arguments: vec![TemplateArgument { parameter: DeclarationId(599), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21924, 21989) }, - Declaration { id: DeclarationId(1646), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(748), DeclarationId(747)], output: DeclarationId(748), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4183, 4196) }, - Declaration { id: DeclarationId(1647), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(602), arguments: vec![TemplateArgument { parameter: DeclarationId(604), value: DeclarationId(748) }, TemplateArgument { parameter: DeclarationId(603), value: DeclarationId(747) }, TemplateArgument { parameter: DeclarationId(1384), value: DeclarationId(775) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 22107, 22165) }, - Declaration { id: DeclarationId(1648), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(598), arguments: vec![TemplateArgument { parameter: DeclarationId(599), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 22191, 22237) }, - Declaration { id: DeclarationId(1649), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(596), arguments: vec![TemplateArgument { parameter: DeclarationId(597), value: DeclarationId(747) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 22508, 22515) }, - Declaration { id: DeclarationId(1650), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1607), DeclarationId(747)], output: DeclarationId(1607), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4183, 4196) }, - Declaration { id: DeclarationId(1651), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(602), arguments: vec![TemplateArgument { parameter: DeclarationId(604), value: DeclarationId(1607) }, TemplateArgument { parameter: DeclarationId(603), value: DeclarationId(747) }, TemplateArgument { parameter: DeclarationId(1384), value: DeclarationId(778) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 22496, 22537) }, - Declaration { id: DeclarationId(1652), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 2224, 2238) }, - Declaration { id: DeclarationId(1653), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 2243, 2268) }, - Declaration { id: DeclarationId(1654), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 2273, 2283) }, - Declaration { id: DeclarationId(1655), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 2548, 2565) }, - Declaration { id: DeclarationId(1656), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 2570, 2594) }, - Declaration { id: DeclarationId(1657), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 2599, 2631) }, - Declaration { id: DeclarationId(1658), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 2636, 2663) }, - Declaration { id: DeclarationId(1659), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3369, 3393) }, - Declaration { id: DeclarationId(1660), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3398, 3430) }, - Declaration { id: DeclarationId(1661), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3564, 3588) }, - Declaration { id: DeclarationId(1662), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3593, 3614) }, - Declaration { id: DeclarationId(1663), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3619, 3637) }, - Declaration { id: DeclarationId(1664), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3781, 3796) }, - Declaration { id: DeclarationId(1665), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3801, 3831) }, - Declaration { id: DeclarationId(1666), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3836, 3857) }, - Declaration { id: DeclarationId(1667), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 4024, 4044) }, - Declaration { id: DeclarationId(1668), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 4049, 4076) }, - Declaration { id: DeclarationId(1669), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 4081, 4095) }, - Declaration { id: DeclarationId(1670), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 4354, 4362) }, - Declaration { id: DeclarationId(1671), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 4367, 4393) }, - Declaration { id: DeclarationId(1672), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 4398, 4423) }, - Declaration { id: DeclarationId(1673), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 5320, 5332) }, - Declaration { id: DeclarationId(1674), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 5693, 5713) }, - Declaration { id: DeclarationId(1675), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 5718, 5736) }, - Declaration { id: DeclarationId(1676), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 5741, 5759) }, - Declaration { id: DeclarationId(1677), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 5764, 5791) }, - Declaration { id: DeclarationId(1678), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 5361, 5368) }, - Declaration { id: DeclarationId(1679), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 6292, 6296) }, - Declaration { id: DeclarationId(1680), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(804), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 7350, 7369) }, - Declaration { id: DeclarationId(1681), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(804), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 7915, 7934) }, - Declaration { id: DeclarationId(1682), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1356, 1388) }, - Declaration { id: DeclarationId(1683), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "witness".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1393, 1429) }, - Declaration { id: DeclarationId(1684), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "element".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1434, 1471) }, - Declaration { id: DeclarationId(1685), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1476, 1502) }, - Declaration { id: DeclarationId(1686), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1507, 1540) }, - Declaration { id: DeclarationId(1687), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1545, 1562) }, - Declaration { id: DeclarationId(1688), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "steps".to_string(), ty: DeclarationId(961) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1567, 1621) }, - Declaration { id: DeclarationId(1689), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1626, 1633) }, - Declaration { id: DeclarationId(1690), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "accessor".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2165, 2203) }, - Declaration { id: DeclarationId(1691), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "amount".to_string(), ty: DeclarationId(961) }, Field { label: "collection".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2208, 2282) }, - Declaration { id: DeclarationId(1692), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "steps".to_string(), ty: DeclarationId(961) }, Field { label: "ring_param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2287, 2362) }, - Declaration { id: DeclarationId(1693), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "divisor".to_string(), ty: DeclarationId(962) }, Field { label: "ring_param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2367, 2440) }, - Declaration { id: DeclarationId(1694), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "witness".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2445, 2482) }, - Declaration { id: DeclarationId(1695), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "element".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2487, 2524) }, - Declaration { id: DeclarationId(1696), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "outer_collection".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2529, 2570) }, - Declaration { id: DeclarationId(1697), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2575, 2591) }, - Declaration { id: DeclarationId(1698), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2803, 2813) }, - Declaration { id: DeclarationId(1699), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "steps".to_string(), ty: DeclarationId(961) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2818, 2865) }, - Declaration { id: DeclarationId(1700), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "divisor".to_string(), ty: DeclarationId(962) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2870, 2921) }, - Declaration { id: DeclarationId(1701), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 3111, 3115) }, - Declaration { id: DeclarationId(1702), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 3120, 3127) }, - Declaration { id: DeclarationId(1703), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 3132, 3138) }, - Declaration { id: DeclarationId(1704), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(796), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 3441, 3454) }, - Declaration { id: DeclarationId(1705), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 7082, 7093) }, - Declaration { id: DeclarationId(1706), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 7142, 7156) }, - Declaration { id: DeclarationId(1707), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 7221, 7237) }, - Declaration { id: DeclarationId(1708), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 360, 369) }, - Declaration { id: DeclarationId(1709), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 374, 381) }, - Declaration { id: DeclarationId(1710), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 614, 618) }, - Declaration { id: DeclarationId(1711), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 623, 632) }, - Declaration { id: DeclarationId(1712), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 910, 921) }, - Declaration { id: DeclarationId(1713), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 926, 935) }, - Declaration { id: DeclarationId(1714), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 1166, 1173) }, - Declaration { id: DeclarationId(1715), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 1178, 1187) }, - Declaration { id: DeclarationId(1716), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2035, 2044) }, - Declaration { id: DeclarationId(1717), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2049, 2065) }, - Declaration { id: DeclarationId(1718), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2070, 2080) }, - Declaration { id: DeclarationId(1719), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2085, 2099) }, - Declaration { id: DeclarationId(1720), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2385, 2399) }, - Declaration { id: DeclarationId(1721), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2404, 2418) }, - Declaration { id: DeclarationId(1722), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2818, 2830) }, - Declaration { id: DeclarationId(1723), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 3210, 3222) }, - Declaration { id: DeclarationId(1724), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 3694, 3708) }, - Declaration { id: DeclarationId(1725), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 3713, 3729) }, - Declaration { id: DeclarationId(1726), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 1022, 1036) }, - Declaration { id: DeclarationId(1727), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 1041, 1051) }, - Declaration { id: DeclarationId(1728), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 1056, 1068) }, - Declaration { id: DeclarationId(1729), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 1073, 1085) }, - Declaration { id: DeclarationId(1730), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 1090, 1103) }, - Declaration { id: DeclarationId(1731), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 1108, 1120) }, - Declaration { id: DeclarationId(1732), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 1125, 1148) }, - Declaration { id: DeclarationId(1733), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(820) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 5348, 5384) }, - Declaration { id: DeclarationId(1734), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(823) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 5389, 5430) }, - Declaration { id: DeclarationId(1735), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(821) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 5889, 5905) }, - Declaration { id: DeclarationId(1736), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(31), arguments: vec![TemplateArgument { parameter: DeclarationId(32), value: DeclarationId(845) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4196, 4216) }, - Declaration { id: DeclarationId(1737), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(833), arguments: vec![TemplateArgument { parameter: DeclarationId(834), value: DeclarationId(844) }, TemplateArgument { parameter: DeclarationId(835), value: DeclarationId(845) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4226, 4250) }, - Declaration { id: DeclarationId(1738), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(833), arguments: vec![TemplateArgument { parameter: DeclarationId(834), value: DeclarationId(844) }, TemplateArgument { parameter: DeclarationId(835), value: DeclarationId(845) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4261, 4285) }, - Declaration { id: DeclarationId(1739), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(833), arguments: vec![TemplateArgument { parameter: DeclarationId(834), value: DeclarationId(844) }, TemplateArgument { parameter: DeclarationId(835), value: DeclarationId(845) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4291, 4315) }, - Declaration { id: DeclarationId(1740), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(31), arguments: vec![TemplateArgument { parameter: DeclarationId(32), value: DeclarationId(848) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4392, 4412) }, - Declaration { id: DeclarationId(1741), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(833), arguments: vec![TemplateArgument { parameter: DeclarationId(834), value: DeclarationId(847) }, TemplateArgument { parameter: DeclarationId(835), value: DeclarationId(848) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4422, 4446) }, - Declaration { id: DeclarationId(1742), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(833), arguments: vec![TemplateArgument { parameter: DeclarationId(834), value: DeclarationId(847) }, TemplateArgument { parameter: DeclarationId(835), value: DeclarationId(848) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4457, 4481) }, - Declaration { id: DeclarationId(1743), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(833), arguments: vec![TemplateArgument { parameter: DeclarationId(834), value: DeclarationId(847) }, TemplateArgument { parameter: DeclarationId(835), value: DeclarationId(848) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4487, 4511) }, - Declaration { id: DeclarationId(1744), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(31), arguments: vec![TemplateArgument { parameter: DeclarationId(32), value: DeclarationId(851) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4595, 4615) }, - Declaration { id: DeclarationId(1745), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(833), arguments: vec![TemplateArgument { parameter: DeclarationId(834), value: DeclarationId(850) }, TemplateArgument { parameter: DeclarationId(835), value: DeclarationId(851) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4626, 4650) }, - Declaration { id: DeclarationId(1746), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(833), arguments: vec![TemplateArgument { parameter: DeclarationId(834), value: DeclarationId(850) }, TemplateArgument { parameter: DeclarationId(835), value: DeclarationId(851) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4675, 4699) }, - Declaration { id: DeclarationId(1747), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(31), arguments: vec![TemplateArgument { parameter: DeclarationId(32), value: DeclarationId(854) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4790, 4810) }, - Declaration { id: DeclarationId(1748), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(833), arguments: vec![TemplateArgument { parameter: DeclarationId(834), value: DeclarationId(853) }, TemplateArgument { parameter: DeclarationId(835), value: DeclarationId(854) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4821, 4845) }, - Declaration { id: DeclarationId(1749), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(833), arguments: vec![TemplateArgument { parameter: DeclarationId(834), value: DeclarationId(853) }, TemplateArgument { parameter: DeclarationId(835), value: DeclarationId(854) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4870, 4894) }, - Declaration { id: DeclarationId(1750), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(827) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 1626, 1643) }, - Declaration { id: DeclarationId(1751), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "reason".to_string(), ty: DeclarationId(186) }, Field { label: "at".to_string(), ty: DeclarationId(730) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 1648, 1689) }, - Declaration { id: DeclarationId(1752), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 1871, 1883) }, - Declaration { id: DeclarationId(1753), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "value".to_string(), ty: DeclarationId(825) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 1888, 1924) }, - Declaration { id: DeclarationId(1754), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(826), arguments: vec![TemplateArgument { parameter: DeclarationId(827), value: DeclarationId(830) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 2406, 2422) }, - Declaration { id: DeclarationId(1755), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(1754) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 2401, 2423) }, - Declaration { id: DeclarationId(1756), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "dimension_name".to_string(), ty: DeclarationId(186) }, Field { label: "composed".to_string(), ty: DeclarationId(830) }, Field { label: "witnesses".to_string(), ty: DeclarationId(1755) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 2317, 2429) }, - Declaration { id: DeclarationId(1757), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(825) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 2497, 2513) }, - Declaration { id: DeclarationId(1758), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(826), arguments: vec![TemplateArgument { parameter: DeclarationId(827), value: DeclarationId(830) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 2536, 2552) }, - Declaration { id: DeclarationId(1759), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(1758) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 2531, 2553) }, - Declaration { id: DeclarationId(1760), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "dimension_name".to_string(), ty: DeclarationId(186) }, Field { label: "violations".to_string(), ty: DeclarationId(1757) }, Field { label: "witnesses".to_string(), ty: DeclarationId(1759) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 2434, 2559) }, - Declaration { id: DeclarationId(1761), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(826), arguments: vec![TemplateArgument { parameter: DeclarationId(827), value: DeclarationId(832) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 3216, 3232) }, - Declaration { id: DeclarationId(1762), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(731), DeclarationId(730)], output: DeclarationId(1761), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 3195, 3232) }, - Declaration { id: DeclarationId(1763), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(832), DeclarationId(832)], output: DeclarationId(832), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 3244, 3275) }, - Declaration { id: DeclarationId(1764), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(730), DeclarationId(832)], output: DeclarationId(828), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 3316, 3359) }, - Declaration { id: DeclarationId(1765), name: Some("DimensionUnitAbelianGroup".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(25), arguments: vec![TemplateArgument { parameter: DeclarationId(26), value: DeclarationId(834) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4002, 4052) }, - Declaration { id: DeclarationId(1766), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(856) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 815, 833) }, - Declaration { id: DeclarationId(1767), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 1337, 1356) }, - Declaration { id: DeclarationId(1768), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 1361, 1383) }, - Declaration { id: DeclarationId(1769), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(861) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 1752, 1775) }, - Declaration { id: DeclarationId(1770), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 2772, 2780) }, - Declaration { id: DeclarationId(1771), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 2785, 2793) }, - Declaration { id: DeclarationId(1772), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3345, 3354) }, - Declaration { id: DeclarationId(1773), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3359, 3372) }, - Declaration { id: DeclarationId(1774), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3377, 3385) }, - Declaration { id: DeclarationId(1775), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3390, 3400) }, - Declaration { id: DeclarationId(1776), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3405, 3415) }, - Declaration { id: DeclarationId(1777), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3420, 3431) }, - Declaration { id: DeclarationId(1778), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3436, 3444) }, - Declaration { id: DeclarationId(1779), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3449, 3456) }, - Declaration { id: DeclarationId(1780), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3461, 3471) }, - Declaration { id: DeclarationId(1781), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3476, 3488) }, - Declaration { id: DeclarationId(1782), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6181, 6207) }, - Declaration { id: DeclarationId(1783), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6212, 6222) }, - Declaration { id: DeclarationId(1784), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 9950, 9956) }, - Declaration { id: DeclarationId(1785), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 9961, 9972) }, - Declaration { id: DeclarationId(1786), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 10292, 10303) }, - Declaration { id: DeclarationId(1787), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 10308, 10319) }, - Declaration { id: DeclarationId(1788), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 12252, 12263) }, - Declaration { id: DeclarationId(1789), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 12268, 12276) }, - Declaration { id: DeclarationId(1790), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(885) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/go_method_template_contracts.dag", 2440, 2468) }, - Declaration { id: DeclarationId(1791), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(795), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 20442, 20454) }, - Declaration { id: DeclarationId(1792), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(798), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 21827, 21842) }, - Declaration { id: DeclarationId(1793), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(907) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 27734, 27749) }, - Declaration { id: DeclarationId(1794), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 31887, 31891) }, - Declaration { id: DeclarationId(1795), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 32183, 32187) }, - Declaration { id: DeclarationId(1796), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 33432, 33436) }, - Declaration { id: DeclarationId(1797), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 33907, 33911) }, - Declaration { id: DeclarationId(1798), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 35170, 35174) }, - Declaration { id: DeclarationId(1799), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 35442, 35446) }, - Declaration { id: DeclarationId(1800), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 5562, 5577) }, - Declaration { id: DeclarationId(1801), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 5617, 5630) }, - Declaration { id: DeclarationId(1802), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 5678, 5695) }, - Declaration { id: DeclarationId(1803), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 5734, 5746) }, - Declaration { id: DeclarationId(1804), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 5794, 5811) }, - Declaration { id: DeclarationId(1805), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "field".to_string(), ty: DeclarationId(891) }, Field { label: "factor".to_string(), ty: DeclarationId(796) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 9904, 9966) }, - Declaration { id: DeclarationId(1806), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "field".to_string(), ty: DeclarationId(891) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 9971, 10013) }, - Declaration { id: DeclarationId(1807), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }, Field { label: "factor".to_string(), ty: DeclarationId(796) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 10018, 10075) }, - Declaration { id: DeclarationId(1808), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 10080, 10094) }, - Declaration { id: DeclarationId(1809), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 10099, 10114) }, - Declaration { id: DeclarationId(1810), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 24019, 24033) }, - Declaration { id: DeclarationId(1811), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "degree".to_string(), ty: DeclarationId(961) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 24038, 24085) }, - Declaration { id: DeclarationId(1812), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "numerator".to_string(), ty: DeclarationId(961) }, Field { label: "root".to_string(), ty: DeclarationId(961) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 24090, 24167) }, - Declaration { id: DeclarationId(1813), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "base".to_string(), ty: DeclarationId(962) }, Field { label: "argument".to_string(), ty: DeclarationId(961) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 24172, 24246) }, - Declaration { id: DeclarationId(1814), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }, Field { label: "exponent".to_string(), ty: DeclarationId(904) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 24866, 24922) }, - Declaration { id: DeclarationId(1815), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 24938, 24963) }, - Declaration { id: DeclarationId(1816), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 26612, 26625) }, - Declaration { id: DeclarationId(1817), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "cost".to_string(), ty: DeclarationId(906) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 26669, 26701) }, - Declaration { id: DeclarationId(1818), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(906) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 26764, 26780) }, - Declaration { id: DeclarationId(1819), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "factors".to_string(), ty: DeclarationId(1818) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 26740, 26782) }, - Declaration { id: DeclarationId(1820), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(906) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 26844, 26860) }, - Declaration { id: DeclarationId(1821), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(1820) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 26839, 26861) }, - Declaration { id: DeclarationId(1822), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "terms".to_string(), ty: DeclarationId(1821) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 26811, 26863) }, - Declaration { id: DeclarationId(1823), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(907) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 27161, 27176) }, - Declaration { id: DeclarationId(1824), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "terms".to_string(), ty: DeclarationId(1823) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 27143, 27178) }, - Declaration { id: DeclarationId(1825), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 27261, 27273) }, - Declaration { id: DeclarationId(1826), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 27343, 27353) }, - Declaration { id: DeclarationId(1827), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(826), arguments: vec![TemplateArgument { parameter: DeclarationId(827), value: DeclarationId(944) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lens.dag", 4180, 4190) }, - Declaration { id: DeclarationId(1828), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(731), DeclarationId(730)], output: DeclarationId(1827), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lens.dag", 4159, 4190) }, - Declaration { id: DeclarationId(1829), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(19), arguments: vec![TemplateArgument { parameter: DeclarationId(20), value: DeclarationId(944) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lens.dag", 4205, 4214) }, - Declaration { id: DeclarationId(1830), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(944), DeclarationId(944)], output: DeclarationId(944), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lens.dag", 4225, 4238) }, - Declaration { id: DeclarationId(1831), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(944), DeclarationId(722)], output: DeclarationId(944), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lens.dag", 4250, 4271) }, - Declaration { id: DeclarationId(1832), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(731), DeclarationId(944)], output: DeclarationId(828), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lens.dag", 4284, 4316) }, - Declaration { id: DeclarationId(1833), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(945), arguments: vec![TemplateArgument { parameter: DeclarationId(946), value: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lookup.dag", 4577, 4588) }, - Declaration { id: DeclarationId(1834), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(945), arguments: vec![TemplateArgument { parameter: DeclarationId(946), value: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lookup.dag", 4630, 4641) }, - Declaration { id: DeclarationId(1835), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lookup.dag", 4532, 4536) }, - Declaration { id: DeclarationId(1836), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(946) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lookup.dag", 4541, 4551) }, - Declaration { id: DeclarationId(1837), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(885) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/python_method_template_contracts.dag", 2092, 2120) }, - Declaration { id: DeclarationId(1838), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(885) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/rust_method_template_contracts.dag", 4043, 4071) }, - Declaration { id: DeclarationId(1839), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(953), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 2329, 2345) }, - Declaration { id: DeclarationId(1840), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(953), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 2350, 2366) }, - Declaration { id: DeclarationId(1841), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(953), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 2371, 2387) }, - Declaration { id: DeclarationId(1842), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(953) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 2632, 2660) }, - Declaration { id: DeclarationId(1843), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(953) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 2704, 2732) }, - Declaration { id: DeclarationId(1844), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(961), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 5879, 5901) }, - Declaration { id: DeclarationId(1845), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(962), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 6321, 6341) }, - Declaration { id: DeclarationId(1846), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 667, 673) }, - Declaration { id: DeclarationId(1847), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 678, 691) }, - Declaration { id: DeclarationId(1848), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 696, 710) }, - Declaration { id: DeclarationId(1849), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 3232, 3258) }, - Declaration { id: DeclarationId(1850), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 3263, 3291) }, - Declaration { id: DeclarationId(1851), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 3296, 3329) }, - Declaration { id: DeclarationId(1852), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 3334, 3365) }, - Declaration { id: DeclarationId(1853), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 3370, 3402) }, - Declaration { id: DeclarationId(1854), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 4409, 4416) }, - Declaration { id: DeclarationId(1855), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "previous".to_string(), ty: DeclarationId(961) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 4421, 4471) }, - Declaration { id: DeclarationId(1856), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 4966, 4977) }, - Declaration { id: DeclarationId(1857), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "inner".to_string(), ty: DeclarationId(962) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 4982, 5027) }, - Declaration { id: DeclarationId(1858), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "accessor".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7131, 7165) }, - Declaration { id: DeclarationId(1859), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "amount".to_string(), ty: DeclarationId(961) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7170, 7214) }, - Declaration { id: DeclarationId(1860), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "steps".to_string(), ty: DeclarationId(961) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7219, 7277) }, - Declaration { id: DeclarationId(1861), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "divisor".to_string(), ty: DeclarationId(962) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7282, 7338) }, - Declaration { id: DeclarationId(1862), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "witness".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7343, 7376) }, - Declaration { id: DeclarationId(1863), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "element".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7381, 7411) }, - Declaration { id: DeclarationId(1864), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7416, 7429) }, - Declaration { id: DeclarationId(1865), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(960) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7469, 7491) }, - Declaration { id: DeclarationId(1866), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(953) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7701, 7722) }, - Declaration { id: DeclarationId(1867), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 646, 651) }, - Declaration { id: DeclarationId(1868), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 656, 660) }, - Declaration { id: DeclarationId(1869), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 665, 671) }, - Declaration { id: DeclarationId(1870), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 676, 682) }, - Declaration { id: DeclarationId(1871), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 687, 691) }, - Declaration { id: DeclarationId(1872), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 696, 702) }, - Declaration { id: DeclarationId(1873), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 707, 715) }, - Declaration { id: DeclarationId(1874), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 720, 728) }, - Declaration { id: DeclarationId(1875), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 733, 740) }, - Declaration { id: DeclarationId(1876), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 745, 751) }, - Declaration { id: DeclarationId(1877), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 756, 763) }, - Declaration { id: DeclarationId(1878), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 768, 774) }, - Declaration { id: DeclarationId(1879), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 779, 786) }, - Declaration { id: DeclarationId(1880), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 791, 804) }, - Declaration { id: DeclarationId(1881), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 809, 820) }, - Declaration { id: DeclarationId(1882), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 825, 842) }, - Declaration { id: DeclarationId(1883), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 847, 849) }, - Declaration { id: DeclarationId(1884), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 854, 858) }, - Declaration { id: DeclarationId(1885), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 863, 868) }, - Declaration { id: DeclarationId(1886), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 873, 875) }, - Declaration { id: DeclarationId(1887), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 880, 882) }, - Declaration { id: DeclarationId(1888), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 887, 889) }, - Declaration { id: DeclarationId(1889), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 894, 896) }, - Declaration { id: DeclarationId(1890), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 901, 905) }, - Declaration { id: DeclarationId(1891), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 910, 915) }, - Declaration { id: DeclarationId(1892), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 920, 924) }, - Declaration { id: DeclarationId(1893), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 929, 934) }, - Declaration { id: DeclarationId(1894), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 939, 945) }, - Declaration { id: DeclarationId(1895), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 950, 958) }, - Declaration { id: DeclarationId(1896), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 963, 968) }, - Declaration { id: DeclarationId(1897), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 973, 978) }, - Declaration { id: DeclarationId(1898), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 983, 991) }, - Declaration { id: DeclarationId(1899), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 996, 1005) }, - Declaration { id: DeclarationId(1900), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1010, 1013) }, - Declaration { id: DeclarationId(1901), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1018, 1024) }, - Declaration { id: DeclarationId(1902), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1029, 1035) }, - Declaration { id: DeclarationId(1903), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1040, 1046) }, - Declaration { id: DeclarationId(1904), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1051, 1057) }, - Declaration { id: DeclarationId(1905), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1062, 1070) }, - Declaration { id: DeclarationId(1906), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1075, 1083) }, - Declaration { id: DeclarationId(1907), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1088, 1093) }, - Declaration { id: DeclarationId(1908), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1098, 1107) }, - Declaration { id: DeclarationId(1909), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1112, 1116) }, - Declaration { id: DeclarationId(1910), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1121, 1129) }, - Declaration { id: DeclarationId(1911), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1134, 1137) }, - Declaration { id: DeclarationId(1912), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1708, 1713) }, - Declaration { id: DeclarationId(1913), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1718, 1722) }, - Declaration { id: DeclarationId(1914), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1727, 1733) }, - Declaration { id: DeclarationId(1915), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1738, 1744) }, - Declaration { id: DeclarationId(1916), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1749, 1753) }, - Declaration { id: DeclarationId(1917), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1758, 1764) }, - Declaration { id: DeclarationId(1918), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1769, 1777) }, - Declaration { id: DeclarationId(1919), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1782, 1790) }, - Declaration { id: DeclarationId(1920), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1795, 1802) }, - Declaration { id: DeclarationId(1921), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1807, 1813) }, - Declaration { id: DeclarationId(1922), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1818, 1825) }, - Declaration { id: DeclarationId(1923), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1830, 1836) }, - Declaration { id: DeclarationId(1924), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1841, 1848) }, - Declaration { id: DeclarationId(1925), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2288, 2290) }, - Declaration { id: DeclarationId(1926), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2295, 2299) }, - Declaration { id: DeclarationId(1927), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2304, 2309) }, - Declaration { id: DeclarationId(1928), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2314, 2316) }, - Declaration { id: DeclarationId(1929), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2321, 2323) }, - Declaration { id: DeclarationId(1930), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2328, 2330) }, - Declaration { id: DeclarationId(1931), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2335, 2337) }, - Declaration { id: DeclarationId(1932), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2342, 2346) }, - Declaration { id: DeclarationId(1933), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2351, 2356) }, - Declaration { id: DeclarationId(1934), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2361, 2365) }, - Declaration { id: DeclarationId(1935), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2370, 2375) }, - Declaration { id: DeclarationId(1936), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2380, 2386) }, - Declaration { id: DeclarationId(1937), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2391, 2399) }, - Declaration { id: DeclarationId(1938), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2404, 2409) }, - Declaration { id: DeclarationId(1939), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2414, 2419) }, - Declaration { id: DeclarationId(1940), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2424, 2432) }, - Declaration { id: DeclarationId(1941), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2437, 2446) }, - Declaration { id: DeclarationId(1942), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2451, 2454) }, - Declaration { id: DeclarationId(1943), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2459, 2465) }, - Declaration { id: DeclarationId(1944), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2470, 2476) }, - Declaration { id: DeclarationId(1945), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2481, 2487) }, - Declaration { id: DeclarationId(1946), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2492, 2498) }, - Declaration { id: DeclarationId(1947), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2503, 2511) }, - Declaration { id: DeclarationId(1948), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2516, 2524) }, - Declaration { id: DeclarationId(1949), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2529, 2534) }, - Declaration { id: DeclarationId(1950), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2539, 2548) }, - Declaration { id: DeclarationId(1951), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2553, 2557) }, - Declaration { id: DeclarationId(1952), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2562, 2570) }, - Declaration { id: DeclarationId(1953), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(951) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 13007, 13030) }, - Declaration { id: DeclarationId(1954), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(993) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 13232, 13247) }, - Declaration { id: DeclarationId(1955), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(995) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 13252, 13272) }, - Declaration { id: DeclarationId(1956), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2432, 2446) }, - Declaration { id: DeclarationId(1957), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2451, 2461) }, - Declaration { id: DeclarationId(1958), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2466, 2478) }, - Declaration { id: DeclarationId(1959), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2483, 2495) }, - Declaration { id: DeclarationId(1960), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2500, 2513) }, - Declaration { id: DeclarationId(1961), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2518, 2530) }, - Declaration { id: DeclarationId(1962), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2535, 2558) }, - Declaration { id: DeclarationId(1963), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2964, 2973) }, - Declaration { id: DeclarationId(1964), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2978, 2994) }, - Declaration { id: DeclarationId(1965), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 3653, 3661) }, - Declaration { id: DeclarationId(1966), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 3666, 3676) }, - Declaration { id: DeclarationId(1967), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4491, 4504) }, - Declaration { id: DeclarationId(1968), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4509, 4522) }, - Declaration { id: DeclarationId(1969), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4527, 4535) }, - Declaration { id: DeclarationId(1970), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4560, 4568) }, - Declaration { id: DeclarationId(1971), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(987) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4573, 4613) }, - Declaration { id: DeclarationId(1972), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "expected".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4618, 4651) }, - Declaration { id: DeclarationId(1973), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "bind_name".to_string(), ty: DeclarationId(186) }, Field { label: "state".to_string(), ty: DeclarationId(988) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4656, 4734) }, - Declaration { id: DeclarationId(1974), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "declaration_name".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4900, 4963) }, - Declaration { id: DeclarationId(1975), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "bind_name".to_string(), ty: DeclarationId(186) }, Field { label: "comparator".to_string(), ty: DeclarationId(708) }, Field { label: "bound".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4968, 5059) }, - Declaration { id: DeclarationId(1976), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "subject".to_string(), ty: DeclarationId(1006) }, Field { label: "input_sample".to_string(), ty: DeclarationId(1006) }, Field { label: "expected_output".to_string(), ty: DeclarationId(1006) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 5064, 5196) }, - Declaration { id: DeclarationId(1977), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "subject".to_string(), ty: DeclarationId(1006) }, Field { label: "invariant".to_string(), ty: DeclarationId(1006) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 5411, 5500) }, - Declaration { id: DeclarationId(1978), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 6300, 6312) }, - Declaration { id: DeclarationId(1979), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "command".to_string(), ty: DeclarationId(186) }, Field { label: "args".to_string(), ty: DeclarationId(1978) }, Field { label: "expect_exit_code".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 6249, 6346) }, - Declaration { id: DeclarationId(1980), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 7046, 7058) }, - Declaration { id: DeclarationId(1981), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "command".to_string(), ty: DeclarationId(186) }, Field { label: "args".to_string(), ty: DeclarationId(1980) }, Field { label: "expect_exit_code".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 6996, 7092) }, - Declaration { id: DeclarationId(1982), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "lens_ref".to_string(), ty: DeclarationId(1006) }, Field { label: "input_ref".to_string(), ty: DeclarationId(1006) }, Field { label: "expected_ref".to_string(), ty: DeclarationId(1006) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 7390, 7512) }, - Declaration { id: DeclarationId(1983), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "subject_ref".to_string(), ty: DeclarationId(1006) }, Field { label: "oracle_ref".to_string(), ty: DeclarationId(1006) }, Field { label: "input_ref".to_string(), ty: DeclarationId(1006) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 7774, 7899) }, - Declaration { id: DeclarationId(1984), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "law".to_string(), ty: DeclarationId(989) }, Field { label: "lens_ref".to_string(), ty: DeclarationId(1006) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 8495, 8574) }, - Declaration { id: DeclarationId(1985), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "authority".to_string(), ty: DeclarationId(1006) }, Field { label: "list_constant".to_string(), ty: DeclarationId(978) }, Field { label: "bound".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 8794, 8907) }, - Declaration { id: DeclarationId(1986), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "authority".to_string(), ty: DeclarationId(1006) }, Field { label: "list_constant".to_string(), ty: DeclarationId(978) }, Field { label: "subset_predicate".to_string(), ty: DeclarationId(1006) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 8912, 9048) }, - Declaration { id: DeclarationId(1987), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "compile_target".to_string(), ty: DeclarationId(976) }, Field { label: "expected".to_string(), ty: DeclarationId(977) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 9053, 9135) }, - Declaration { id: DeclarationId(1988), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "authority".to_string(), ty: DeclarationId(1006) }, Field { label: "ratchet_kind".to_string(), ty: DeclarationId(1006) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 9140, 9226) }, - Declaration { id: DeclarationId(1989), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(976) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 9305, 9315) }, - Declaration { id: DeclarationId(1990), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "authority".to_string(), ty: DeclarationId(1006) }, Field { label: "generated_paths".to_string(), ty: DeclarationId(1989) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 9231, 9321) }, - Declaration { id: DeclarationId(1991), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "deferred_gate".to_string(), ty: DeclarationId(1006) }, Field { label: "target_lane".to_string(), ty: DeclarationId(1006) }, Field { label: "authority_doc".to_string(), ty: DeclarationId(1006) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 10263, 10397) }, - Declaration { id: DeclarationId(1992), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "deferred_gate".to_string(), ty: DeclarationId(1006) }, Field { label: "target_lane".to_string(), ty: DeclarationId(1006) }, Field { label: "authority_doc".to_string(), ty: DeclarationId(1006) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 11036, 11180) }, - Declaration { id: DeclarationId(1993), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(951) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12224, 12247) }, - Declaration { id: DeclarationId(1994), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(993) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12293, 12308) }, - Declaration { id: DeclarationId(1995), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(951) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12564, 12587) }, - Declaration { id: DeclarationId(1996), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(730) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/workflows.dag", 992, 1006) }, - Declaration { id: DeclarationId(1997), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 532, 547) }, - Declaration { id: DeclarationId(1998), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 550, 561) }, - Declaration { id: DeclarationId(1999), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 564, 576) }, - Declaration { id: DeclarationId(2000), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(710), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/operators.dag", 142, 155) }, - Declaration { id: DeclarationId(2001), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5254, 5272) }, - Declaration { id: DeclarationId(2002), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5277, 5292) }, - Declaration { id: DeclarationId(2003), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5321, 5342) }, - Declaration { id: DeclarationId(2004), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5347, 5362) }, - Declaration { id: DeclarationId(2005), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6875, 6885) }, - Declaration { id: DeclarationId(2006), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6890, 6901) }, - Declaration { id: DeclarationId(2007), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6906, 6919) }, - Declaration { id: DeclarationId(2008), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6924, 6937) }, - Declaration { id: DeclarationId(2009), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6942, 6955) }, - Declaration { id: DeclarationId(2010), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6960, 6975) }, - Declaration { id: DeclarationId(2011), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 7717, 7734) }, - Declaration { id: DeclarationId(2012), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 7739, 7749) }, - Declaration { id: DeclarationId(2013), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 7754, 7758) }, - Declaration { id: DeclarationId(2014), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "target_name".to_string(), ty: DeclarationId(186) }, Field { label: "algebra".to_string(), ty: DeclarationId(1373) }, Field { label: "carrier".to_string(), ty: DeclarationId(1375) }, Field { label: "range_min_inclusive".to_string(), ty: DeclarationId(186) }, Field { label: "range_max_inclusive".to_string(), ty: DeclarationId(186) }, Field { label: "is_copy".to_string(), ty: DeclarationId(88) }, Field { label: "overflow".to_string(), ty: DeclarationId(1376) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 8536, 9108) }, - Declaration { id: DeclarationId(2015), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "target_name".to_string(), ty: DeclarationId(186) }, Field { label: "algebra".to_string(), ty: DeclarationId(1374) }, Field { label: "carrier".to_string(), ty: DeclarationId(1375) }, Field { label: "is_copy".to_string(), ty: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 9113, 9295) }, - Declaration { id: DeclarationId(2016), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(594), arguments: vec![TemplateArgument { parameter: DeclarationId(595), value: DeclarationId(1377) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 9623, 9642) }, + Declaration { id: DeclarationId(203), name: Some("add_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("add".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 3810, 3862) }, + Declaration { id: DeclarationId(204), name: Some("all_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("all".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 3863, 3915) }, + Declaration { id: DeclarationId(205), name: Some("any_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("any".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 3916, 3968) }, + Declaration { id: DeclarationId(206), name: Some("append_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("append".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 3969, 4027) }, + Declaration { id: DeclarationId(207), name: Some("bottom_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("bottom".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4028, 4086) }, + Declaration { id: DeclarationId(208), name: Some("chars_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("chars".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4087, 4143) }, + Declaration { id: DeclarationId(209), name: Some("clamp_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("clamp".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4144, 4200) }, + Declaration { id: DeclarationId(210), name: Some("compare_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("compare".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4201, 4261) }, + Declaration { id: DeclarationId(211), name: Some("complement_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("complement".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4262, 4328) }, + Declaration { id: DeclarationId(212), name: Some("concat_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("concat".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4329, 4387) }, + Declaration { id: DeclarationId(213), name: Some("contains_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("contains".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4388, 4450) }, + Declaration { id: DeclarationId(214), name: Some("count_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("count".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4451, 4507) }, + Declaration { id: DeclarationId(215), name: Some("diff_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("diff".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4508, 4562) }, + Declaration { id: DeclarationId(216), name: Some("empty_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("empty".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4563, 4619) }, + Declaration { id: DeclarationId(217), name: Some("ends_with_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("ends_with".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4620, 4684) }, + Declaration { id: DeclarationId(218), name: Some("enumerate_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("enumerate".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4685, 4749) }, + Declaration { id: DeclarationId(219), name: Some("filter_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("filter".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4750, 4808) }, + Declaration { id: DeclarationId(220), name: Some("first_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("first".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4809, 4865) }, + Declaration { id: DeclarationId(221), name: Some("flat_map_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("flat_map".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4866, 4928) }, + Declaration { id: DeclarationId(222), name: Some("fold_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("fold".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4929, 4983) }, + Declaration { id: DeclarationId(223), name: Some("get_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("get".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 4984, 5036) }, + Declaration { id: DeclarationId(224), name: Some("has_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("has".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5037, 5089) }, + Declaration { id: DeclarationId(225), name: Some("intersect_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("intersect".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5090, 5154) }, + Declaration { id: DeclarationId(226), name: Some("join_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("join".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5155, 5209) }, + Declaration { id: DeclarationId(227), name: Some("keys_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("keys".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5210, 5264) }, + Declaration { id: DeclarationId(228), name: Some("last_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("last".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5265, 5319) }, + Declaration { id: DeclarationId(229), name: Some("length_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("length".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5320, 5378) }, + Declaration { id: DeclarationId(230), name: Some("list_push_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("list_push".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5379, 5443) }, + Declaration { id: DeclarationId(231), name: Some("lookup_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("lookup".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5444, 5502) }, + Declaration { id: DeclarationId(232), name: Some("map_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("map".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5503, 5555) }, + Declaration { id: DeclarationId(233), name: Some("map_contains_key_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("map_contains_key".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5556, 5634) }, + Declaration { id: DeclarationId(234), name: Some("map_get_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("map_get".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5635, 5695) }, + Declaration { id: DeclarationId(235), name: Some("map_has_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("map_has".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5696, 5756) }, + Declaration { id: DeclarationId(236), name: Some("map_insert_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("map_insert".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5757, 5823) }, + Declaration { id: DeclarationId(237), name: Some("map_keys_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("map_keys".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5824, 5886) }, + Declaration { id: DeclarationId(238), name: Some("map_merge_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("map_merge".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5887, 5951) }, + Declaration { id: DeclarationId(239), name: Some("map_values_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("map_values".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 5952, 6018) }, + Declaration { id: DeclarationId(240), name: Some("meet_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("meet".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6019, 6073) }, + Declaration { id: DeclarationId(241), name: Some("member_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("member".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6074, 6132) }, + Declaration { id: DeclarationId(242), name: Some("mul_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("mul".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6133, 6185) }, + Declaration { id: DeclarationId(243), name: Some("negate_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("negate".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6186, 6244) }, + Declaration { id: DeclarationId(244), name: Some("one_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("one".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6245, 6297) }, + Declaration { id: DeclarationId(245), name: Some("reciprocal_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("reciprocal".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6298, 6364) }, + Declaration { id: DeclarationId(246), name: Some("replace_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("replace".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6365, 6425) }, + Declaration { id: DeclarationId(247), name: Some("reverse_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("reverse".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6426, 6486) }, + Declaration { id: DeclarationId(248), name: Some("skip_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("skip".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6487, 6541) }, + Declaration { id: DeclarationId(249), name: Some("sort_by_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("sort_by".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6542, 6602) }, + Declaration { id: DeclarationId(250), name: Some("split_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("split".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6603, 6659) }, + Declaration { id: DeclarationId(251), name: Some("starts_with_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("starts_with".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6660, 6728) }, + Declaration { id: DeclarationId(252), name: Some("substring_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("substring".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6729, 6793) }, + Declaration { id: DeclarationId(253), name: Some("take_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("take".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6794, 6848) }, + Declaration { id: DeclarationId(254), name: Some("to_int_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("to_int".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6849, 6907) }, + Declaration { id: DeclarationId(255), name: Some("to_lower_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("to_lower".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6908, 6970) }, + Declaration { id: DeclarationId(256), name: Some("to_string_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("to_string".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 6971, 7035) }, + Declaration { id: DeclarationId(257), name: Some("to_upper_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("to_upper".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 7036, 7098) }, + Declaration { id: DeclarationId(258), name: Some("top_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("top".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 7099, 7151) }, + Declaration { id: DeclarationId(259), name: Some("trim_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("trim".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 7152, 7206) }, + Declaration { id: DeclarationId(260), name: Some("union_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("union".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 7207, 7263) }, + Declaration { id: DeclarationId(261), name: Some("values_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("values".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 7264, 7322) }, + Declaration { id: DeclarationId(262), name: Some("with_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("with".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 7323, 7377) }, + Declaration { id: DeclarationId(263), name: Some("zero_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(202)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("zero".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/methods.dag", 7378, 7432) }, + Declaration { id: DeclarationId(264), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/logic.dag", 304, 308) }, + Declaration { id: DeclarationId(265), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/logic.dag", 311, 316) }, + Declaration { id: DeclarationId(266), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(4) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1023, 1032) }, + Declaration { id: DeclarationId(267), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(4) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1136, 1145) }, + Declaration { id: DeclarationId(268), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(6) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1272, 1282) }, + Declaration { id: DeclarationId(269), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(6) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1306, 1316) }, + Declaration { id: DeclarationId(270), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(6) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1340, 1350) }, + Declaration { id: DeclarationId(271), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(6) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/bit.dag", 1375, 1385) }, + Declaration { id: DeclarationId(272), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "value".to_string(), ty: DeclarationId(12) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/error_primitives.dag", 620, 636) }, + Declaration { id: DeclarationId(273), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "value".to_string(), ty: DeclarationId(13) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/error_primitives.dag", 639, 657) }, + Declaration { id: DeclarationId(274), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/error_primitives.dag", 936, 948) }, + Declaration { id: DeclarationId(275), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/error_primitives.dag", 951, 959) }, + Declaration { id: DeclarationId(276), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(52) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 18855, 18881) }, + Declaration { id: DeclarationId(277), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(52) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 20062, 20088) }, + Declaration { id: DeclarationId(278), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(52) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 21219, 21245) }, + Declaration { id: DeclarationId(279), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(52) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 22345, 22371) }, + Declaration { id: DeclarationId(280), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(52) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 25756, 25782) }, + Declaration { id: DeclarationId(281), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(52) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 28893, 28919) }, + Declaration { id: DeclarationId(282), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(52) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 34025, 34051) }, + Declaration { id: DeclarationId(283), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(52) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 36939, 36965) }, + Declaration { id: DeclarationId(284), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 37758, 37770) }, + Declaration { id: DeclarationId(285), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(16), DeclarationId(16)], output: DeclarationId(16), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 4645, 4658) }, + Declaration { id: DeclarationId(286), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(18), DeclarationId(18)], output: DeclarationId(18), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 4764, 4777) }, + Declaration { id: DeclarationId(287), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(20), DeclarationId(20)], output: DeclarationId(20), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 4981, 4994) }, + Declaration { id: DeclarationId(288), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(22), DeclarationId(22)], output: DeclarationId(22), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5103, 5116) }, + Declaration { id: DeclarationId(289), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(24), DeclarationId(24)], output: DeclarationId(24), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5254, 5267) }, + Declaration { id: DeclarationId(290), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(24)], output: DeclarationId(24), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5293, 5303) }, + Declaration { id: DeclarationId(291), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(26), DeclarationId(26)], output: DeclarationId(26), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5372, 5385) }, + Declaration { id: DeclarationId(292), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(26)], output: DeclarationId(26), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5411, 5421) }, + Declaration { id: DeclarationId(293), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(28), DeclarationId(28)], output: DeclarationId(28), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5911, 5924) }, + Declaration { id: DeclarationId(294), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(28), DeclarationId(28)], output: DeclarationId(28), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 5942, 5955) }, + Declaration { id: DeclarationId(295), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(30), DeclarationId(30)], output: DeclarationId(30), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6115, 6128) }, + Declaration { id: DeclarationId(296), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(30)], output: DeclarationId(30), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6149, 6159) }, + Declaration { id: DeclarationId(297), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(30), DeclarationId(30)], output: DeclarationId(30), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6167, 6180) }, + Declaration { id: DeclarationId(298), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(32), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 6981, 6994) }, + Declaration { id: DeclarationId(299), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(32), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7002, 7015) }, + Declaration { id: DeclarationId(300), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32)], output: DeclarationId(32), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7036, 7046) }, + Declaration { id: DeclarationId(301), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(32), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7054, 7067) }, + Declaration { id: DeclarationId(302), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(11), arguments: vec![TemplateArgument { parameter: DeclarationId(12), value: DeclarationId(32) }, TemplateArgument { parameter: DeclarationId(13), value: DeclarationId(14) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7087, 7106) }, + Declaration { id: DeclarationId(303), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(302), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7075, 7106) }, + Declaration { id: DeclarationId(304), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(46), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7127, 7147) }, + Declaration { id: DeclarationId(305), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7154, 7170) }, + Declaration { id: DeclarationId(306), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7177, 7193) }, + Declaration { id: DeclarationId(307), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7200, 7216) }, + Declaration { id: DeclarationId(308), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7223, 7239) }, + Declaration { id: DeclarationId(309), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7246, 7262) }, + Declaration { id: DeclarationId(310), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7269, 7285) }, + Declaration { id: DeclarationId(311), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(34), DeclarationId(34)], output: DeclarationId(34), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7448, 7461) }, + Declaration { id: DeclarationId(312), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(34)], output: DeclarationId(34), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7482, 7492) }, + Declaration { id: DeclarationId(313), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(34), DeclarationId(34)], output: DeclarationId(34), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7500, 7513) }, + Declaration { id: DeclarationId(314), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(34)], output: DeclarationId(34), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7537, 7547) }, + Declaration { id: DeclarationId(315), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(34), DeclarationId(34)], output: DeclarationId(46), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7559, 7579) }, + Declaration { id: DeclarationId(316), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(36), DeclarationId(36)], output: DeclarationId(36), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7927, 7940) }, + Declaration { id: DeclarationId(317), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(36), DeclarationId(36)], output: DeclarationId(36), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 7949, 7962) }, + Declaration { id: DeclarationId(318), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(38), DeclarationId(38)], output: DeclarationId(38), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 8105, 8118) }, + Declaration { id: DeclarationId(319), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(38), DeclarationId(38)], output: DeclarationId(38), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 8127, 8140) }, + Declaration { id: DeclarationId(320), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(40), DeclarationId(40)], output: DeclarationId(40), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 8394, 8407) }, + Declaration { id: DeclarationId(321), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(40), DeclarationId(40)], output: DeclarationId(40), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 8416, 8429) }, + Declaration { id: DeclarationId(322), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(40)], output: DeclarationId(40), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 8444, 8454) }, + Declaration { id: DeclarationId(323), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12406, 12419) }, + Declaration { id: DeclarationId(324), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12421, 12434) }, + Declaration { id: DeclarationId(325), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12439, 12452) }, + Declaration { id: DeclarationId(326), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(323), DeclarationId(324)], output: DeclarationId(325), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12403, 12452) }, + Declaration { id: DeclarationId(327), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12462, 12475) }, + Declaration { id: DeclarationId(328), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12495, 12508) }, + Declaration { id: DeclarationId(329), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42)], output: DeclarationId(328), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12486, 12508) }, + Declaration { id: DeclarationId(330), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12610, 12623) }, + Declaration { id: DeclarationId(331), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71), DeclarationId(71)], output: DeclarationId(330), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12594, 12623) }, + Declaration { id: DeclarationId(332), name: None, connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(71), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12634, 12645) }, + Declaration { id: DeclarationId(333), name: None, connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(71), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12655, 12666) }, + Declaration { id: DeclarationId(334), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(42), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12684, 12686) }, + Declaration { id: DeclarationId(335), name: None, connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(334), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12676, 12686) }, + Declaration { id: DeclarationId(336), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(42), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12703, 12705) }, + Declaration { id: DeclarationId(337), name: None, connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(336), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12695, 12705) }, + Declaration { id: DeclarationId(338), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42)], output: DeclarationId(42), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12803, 12813) }, + Declaration { id: DeclarationId(339), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12818, 12831) }, + Declaration { id: DeclarationId(340), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(338)], output: DeclarationId(339), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12800, 12831) }, + Declaration { id: DeclarationId(341), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12845, 12858) }, + Declaration { id: DeclarationId(342), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12863, 12876) }, + Declaration { id: DeclarationId(343), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(341)], output: DeclarationId(342), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12842, 12876) }, + Declaration { id: DeclarationId(344), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42), DeclarationId(42)], output: DeclarationId(42), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12891, 12904) }, + Declaration { id: DeclarationId(345), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42), DeclarationId(344)], output: DeclarationId(42), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12885, 12910) }, + Declaration { id: DeclarationId(346), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12935, 12948) }, + Declaration { id: DeclarationId(347), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42)], output: DeclarationId(346), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12926, 12948) }, + Declaration { id: DeclarationId(348), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12953, 12966) }, + Declaration { id: DeclarationId(349), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(347)], output: DeclarationId(348), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12923, 12966) }, + Declaration { id: DeclarationId(350), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12977, 12990) }, + Declaration { id: DeclarationId(351), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(350)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 12974, 12999) }, + Declaration { id: DeclarationId(352), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13010, 13023) }, + Declaration { id: DeclarationId(353), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(352)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13007, 13032) }, + Declaration { id: DeclarationId(354), name: None, connective: TypeConnective::Atom(AtomPayload::UnresolvedIdentifier("Tuple".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13097, 13110) }, + Declaration { id: DeclarationId(355), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(354), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13097, 13110) }, + Declaration { id: DeclarationId(356), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(355) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13086, 13111) }, + Declaration { id: DeclarationId(357), name: None, connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(356), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13078, 13111) }, + Declaration { id: DeclarationId(358), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13131, 13144) }, + Declaration { id: DeclarationId(359), name: None, connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(358), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13123, 13144) }, + Declaration { id: DeclarationId(360), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13164, 13177) }, + Declaration { id: DeclarationId(361), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71)], output: DeclarationId(360), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13153, 13177) }, + Declaration { id: DeclarationId(362), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13197, 13210) }, + Declaration { id: DeclarationId(363), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71)], output: DeclarationId(362), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13186, 13210) }, + Declaration { id: DeclarationId(364), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42), DeclarationId(42)], output: DeclarationId(71), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13225, 13240) }, + Declaration { id: DeclarationId(365), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(42) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13245, 13258) }, + Declaration { id: DeclarationId(366), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(364)], output: DeclarationId(365), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13222, 13258) }, + Declaration { id: DeclarationId(367), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13271, 13284) }, + Declaration { id: DeclarationId(368), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(45), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13849, 13851) }, + Declaration { id: DeclarationId(369), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(44)], output: DeclarationId(368), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13840, 13851) }, + Declaration { id: DeclarationId(370), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(43), arguments: vec![TemplateArgument { parameter: DeclarationId(44), value: DeclarationId(44) }, TemplateArgument { parameter: DeclarationId(45), value: DeclarationId(45) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13861, 13882) }, + Declaration { id: DeclarationId(371), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(45), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13899, 13901) }, + Declaration { id: DeclarationId(372), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(44)], output: DeclarationId(371), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13890, 13901) }, + Declaration { id: DeclarationId(373), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(43), arguments: vec![TemplateArgument { parameter: DeclarationId(44), value: DeclarationId(44) }, TemplateArgument { parameter: DeclarationId(45), value: DeclarationId(45) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13924, 13945) }, + Declaration { id: DeclarationId(374), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(44), DeclarationId(45)], output: DeclarationId(373), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13912, 13945) }, + Declaration { id: DeclarationId(375), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(43), arguments: vec![TemplateArgument { parameter: DeclarationId(44), value: DeclarationId(44) }, TemplateArgument { parameter: DeclarationId(45), value: DeclarationId(45) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13958, 13979) }, + Declaration { id: DeclarationId(376), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(43), arguments: vec![TemplateArgument { parameter: DeclarationId(44), value: DeclarationId(44) }, TemplateArgument { parameter: DeclarationId(45), value: DeclarationId(45) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13984, 14005) }, + Declaration { id: DeclarationId(377), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(375)], output: DeclarationId(376), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 13955, 14005) }, + Declaration { id: DeclarationId(378), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(44) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 14022, 14035) }, + Declaration { id: DeclarationId(379), name: None, connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(378), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 14014, 14035) }, + Declaration { id: DeclarationId(380), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), value: DeclarationId(45) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 14054, 14067) }, + Declaration { id: DeclarationId(381), name: None, connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(380), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 14046, 14067) }, + Declaration { id: DeclarationId(382), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(44)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 14075, 14088) }, + Declaration { id: DeclarationId(383), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(44)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 14105, 14118) }, + Declaration { id: DeclarationId(384), name: None, connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(71), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 14127, 14138) }, + Declaration { id: DeclarationId(385), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 14357, 14361) }, + Declaration { id: DeclarationId(386), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 14364, 14369) }, + Declaration { id: DeclarationId(387), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 14372, 14379) }, + Declaration { id: DeclarationId(388), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16305, 16323) }, + Declaration { id: DeclarationId(389), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16328, 16351) }, + Declaration { id: DeclarationId(390), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16356, 16377) }, + Declaration { id: DeclarationId(391), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16382, 16413) }, + Declaration { id: DeclarationId(392), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16418, 16441) }, + Declaration { id: DeclarationId(393), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16446, 16473) }, + Declaration { id: DeclarationId(394), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16478, 16500) }, + Declaration { id: DeclarationId(395), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16527, 16541) }, + Declaration { id: DeclarationId(396), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16546, 16568) }, + Declaration { id: DeclarationId(397), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16599, 16611) }, + Declaration { id: DeclarationId(398), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16616, 16631) }, + Declaration { id: DeclarationId(399), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16636, 16647) }, + Declaration { id: DeclarationId(400), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16652, 16665) }, + Declaration { id: DeclarationId(401), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16670, 16700) }, + Declaration { id: DeclarationId(402), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "source".to_string(), ty: DeclarationId(48) }, Field { label: "element".to_string(), ty: DeclarationId(49) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16705, 16774) }, + Declaration { id: DeclarationId(403), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "inner".to_string(), ty: DeclarationId(49) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16779, 16820) }, + Declaration { id: DeclarationId(404), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "first".to_string(), ty: DeclarationId(49) }, Field { label: "second".to_string(), ty: DeclarationId(49) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16825, 16892) }, + Declaration { id: DeclarationId(405), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(49) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16918, 16943) }, + Declaration { id: DeclarationId(406), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "params".to_string(), ty: DeclarationId(405) }, Field { label: "return_type".to_string(), ty: DeclarationId(49) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16897, 16979) }, + Declaration { id: DeclarationId(407), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "id".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 16984, 17018) }, + Declaration { id: DeclarationId(408), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 17264, 17276) }, + Declaration { id: DeclarationId(409), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 17334, 17350) }, + Declaration { id: DeclarationId(410), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 17397, 17411) }, + Declaration { id: DeclarationId(411), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 17888, 17901) }, + Declaration { id: DeclarationId(412), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 17917, 17932) }, + Declaration { id: DeclarationId(413), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 17978, 17994) }, + Declaration { id: DeclarationId(414), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 18041, 18054) }, + Declaration { id: DeclarationId(415), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(49) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 18137, 18162) }, + Declaration { id: DeclarationId(416), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(50), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 18213, 18234) }, + Declaration { id: DeclarationId(417), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(51), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 18249, 18259) }, + Declaration { id: DeclarationId(418), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 18504, 18508) }, + Declaration { id: DeclarationId(419), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(47) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/algebra.dag", 18541, 18568) }, + Declaration { id: DeclarationId(420), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 3781, 3785) }, + Declaration { id: DeclarationId(421), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 4054, 4066) }, + Declaration { id: DeclarationId(422), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 4264, 4271) }, + Declaration { id: DeclarationId(423), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 6172, 6179) }, + Declaration { id: DeclarationId(424), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 6508, 6520) }, + Declaration { id: DeclarationId(425), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 7558, 7562) }, + Declaration { id: DeclarationId(426), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 7565, 7570) }, + Declaration { id: DeclarationId(427), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(116) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11304, 11321) }, + Declaration { id: DeclarationId(428), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(117) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11355, 11372) }, + Declaration { id: DeclarationId(429), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14380, 14385) }, + Declaration { id: DeclarationId(430), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14388, 14393) }, + Declaration { id: DeclarationId(431), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14396, 14403) }, + Declaration { id: DeclarationId(432), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14555, 14559) }, + Declaration { id: DeclarationId(433), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14562, 14571) }, + Declaration { id: DeclarationId(434), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14574, 14580) }, + Declaration { id: DeclarationId(435), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14583, 14586) }, + Declaration { id: DeclarationId(436), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14611, 14619) }, + Declaration { id: DeclarationId(437), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14622, 14631) }, + Declaration { id: DeclarationId(438), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14634, 14640) }, + Declaration { id: DeclarationId(439), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14660, 14662) }, + Declaration { id: DeclarationId(440), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14665, 14666) }, + Declaration { id: DeclarationId(441), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14669, 14670) }, + Declaration { id: DeclarationId(442), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14673, 14674) }, + Declaration { id: DeclarationId(443), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14677, 14679) }, + Declaration { id: DeclarationId(444), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "secret_name".to_string(), ty: DeclarationId(111) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14951, 14986) }, + Declaration { id: DeclarationId(445), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "env_var".to_string(), ty: DeclarationId(111) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 14991, 15032) }, + Declaration { id: DeclarationId(446), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(138), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15107, 15127) }, + Declaration { id: DeclarationId(447), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15142, 15154) }, + Declaration { id: DeclarationId(448), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "audience".to_string(), ty: DeclarationId(111) }, Field { label: "service_account".to_string(), ty: DeclarationId(446) }, Field { label: "scopes".to_string(), ty: DeclarationId(447) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15037, 15160) }, + Declaration { id: DeclarationId(449), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15191, 15203) }, + Declaration { id: DeclarationId(450), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "scopes".to_string(), ty: DeclarationId(449) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15165, 15205) }, + Declaration { id: DeclarationId(451), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(143) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15227, 15247) }, + Declaration { id: DeclarationId(452), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "steps".to_string(), ty: DeclarationId(451) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15210, 15249) }, + Declaration { id: DeclarationId(453), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15336, 15342) }, + Declaration { id: DeclarationId(454), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15345, 15348) }, + Declaration { id: DeclarationId(455), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15351, 15358) }, + Declaration { id: DeclarationId(456), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15361, 15364) }, + Declaration { id: DeclarationId(457), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15367, 15372) }, + Declaration { id: DeclarationId(458), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15375, 15379) }, + Declaration { id: DeclarationId(459), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15382, 15388) }, + Declaration { id: DeclarationId(460), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15391, 15397) }, + Declaration { id: DeclarationId(461), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15400, 15408) }, + Declaration { id: DeclarationId(462), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15411, 15418) }, + Declaration { id: DeclarationId(463), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15421, 15427) }, + Declaration { id: DeclarationId(464), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15442, 15455) }, + Declaration { id: DeclarationId(465), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15458, 15460) }, + Declaration { id: DeclarationId(466), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15463, 15468) }, + Declaration { id: DeclarationId(467), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15471, 15474) }, + Declaration { id: DeclarationId(468), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15485, 15490) }, + Declaration { id: DeclarationId(469), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15493, 15498) }, + Declaration { id: DeclarationId(470), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15501, 15508) }, + Declaration { id: DeclarationId(471), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15511, 15518) }, + Declaration { id: DeclarationId(472), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15521, 15528) }, + Declaration { id: DeclarationId(473), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15531, 15534) }, + Declaration { id: DeclarationId(474), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15537, 15541) }, + Declaration { id: DeclarationId(475), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15556, 15563) }, + Declaration { id: DeclarationId(476), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15566, 15569) }, + Declaration { id: DeclarationId(477), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15572, 15579) }, + Declaration { id: DeclarationId(478), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15582, 15591) }, + Declaration { id: DeclarationId(479), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15594, 15598) }, + Declaration { id: DeclarationId(480), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15601, 15605) }, + Declaration { id: DeclarationId(481), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15608, 15618) }, + Declaration { id: DeclarationId(482), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15621, 15625) }, + Declaration { id: DeclarationId(483), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15628, 15634) }, + Declaration { id: DeclarationId(484), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15655, 15661) }, + Declaration { id: DeclarationId(485), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15664, 15667) }, + Declaration { id: DeclarationId(486), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15670, 15679) }, + Declaration { id: DeclarationId(487), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15682, 15684) }, + Declaration { id: DeclarationId(488), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15687, 15695) }, + Declaration { id: DeclarationId(489), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(147), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 15763, 15770) }, + Declaration { id: DeclarationId(490), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16167, 16178) }, + Declaration { id: DeclarationId(491), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16183, 16192) }, + Declaration { id: DeclarationId(492), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16197, 16204) }, + Declaration { id: DeclarationId(493), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16209, 16216) }, + Declaration { id: DeclarationId(494), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16221, 16226) }, + Declaration { id: DeclarationId(495), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16379, 16389) }, + Declaration { id: DeclarationId(496), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16394, 16403) }, + Declaration { id: DeclarationId(497), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 16408, 16414) }, + Declaration { id: DeclarationId(498), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 18464, 18467) }, + Declaration { id: DeclarationId(499), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 18470, 18474) }, + Declaration { id: DeclarationId(500), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 18477, 18480) }, + Declaration { id: DeclarationId(501), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 18483, 18488) }, + Declaration { id: DeclarationId(502), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 18491, 18497) }, + Declaration { id: DeclarationId(503), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 18500, 18504) }, + Declaration { id: DeclarationId(504), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 18507, 18514) }, + Declaration { id: DeclarationId(505), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19002, 19008) }, + Declaration { id: DeclarationId(506), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19013, 19036) }, + Declaration { id: DeclarationId(507), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "username".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19041, 19067) }, + Declaration { id: DeclarationId(508), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19072, 19078) }, + Declaration { id: DeclarationId(509), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(122), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19270, 19280) }, + Declaration { id: DeclarationId(510), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19405, 19412) }, + Declaration { id: DeclarationId(511), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19452, 19464) }, + Declaration { id: DeclarationId(512), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19479, 19483) }, + Declaration { id: DeclarationId(513), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(171) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 20834, 20852) }, + Declaration { id: DeclarationId(514), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(172) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 20945, 20966) }, + Declaration { id: DeclarationId(515), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21250, 21257) }, + Declaration { id: DeclarationId(516), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(176) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21290, 21305) }, + Declaration { id: DeclarationId(517), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(179) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21594, 21612) }, + Declaration { id: DeclarationId(518), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(180) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21622, 21640) }, + Declaration { id: DeclarationId(519), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21662, 21674) }, + Declaration { id: DeclarationId(520), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21762, 21769) }, + Declaration { id: DeclarationId(521), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21856, 21863) }, + Declaration { id: DeclarationId(522), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21891, 21903) }, + Declaration { id: DeclarationId(523), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21915, 21927) }, + Declaration { id: DeclarationId(524), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 21939, 21951) }, + Declaration { id: DeclarationId(525), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(183), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22086, 22101) }, + Declaration { id: DeclarationId(526), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(149), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22112, 22125) }, + Declaration { id: DeclarationId(527), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(148), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22141, 22154) }, + Declaration { id: DeclarationId(528), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22180, 22184) }, + Declaration { id: DeclarationId(529), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22187, 22189) }, + Declaration { id: DeclarationId(530), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22192, 22193) }, + Declaration { id: DeclarationId(531), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22196, 22200) }, + Declaration { id: DeclarationId(532), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 22264, 22271) }, + Declaration { id: DeclarationId(533), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 3063, 3080) }, + Declaration { id: DeclarationId(534), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 3533, 3549) }, + Declaration { id: DeclarationId(535), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 4740, 4757) }, + Declaration { id: DeclarationId(536), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 5722, 5741) }, + Declaration { id: DeclarationId(537), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10147, 10207) }, + Declaration { id: DeclarationId(538), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10208, 10268) }, + Declaration { id: DeclarationId(539), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10269, 10320) }, + Declaration { id: DeclarationId(540), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10321, 10376) }, + Declaration { id: DeclarationId(541), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10377, 10442) }, + Declaration { id: DeclarationId(542), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10443, 10498) }, + Declaration { id: DeclarationId(543), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10499, 10544) }, + Declaration { id: DeclarationId(544), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10587, 10629) }, + Declaration { id: DeclarationId(545), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10630, 10684) }, + Declaration { id: DeclarationId(546), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10685, 10748) }, + Declaration { id: DeclarationId(547), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10749, 10794) }, + Declaration { id: DeclarationId(548), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10795, 10840) }, + Declaration { id: DeclarationId(549), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10841, 10886) }, + Declaration { id: DeclarationId(550), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10887, 10933) }, + Declaration { id: DeclarationId(551), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10934, 10980) }, + Declaration { id: DeclarationId(552), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11151, 11210) }, + Declaration { id: DeclarationId(553), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11211, 11270) }, + Declaration { id: DeclarationId(554), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11375, 11418) }, + Declaration { id: DeclarationId(555), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12098, 12196) }, + Declaration { id: DeclarationId(556), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12197, 12241) }, + Declaration { id: DeclarationId(557), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12242, 12286) }, + Declaration { id: DeclarationId(558), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12287, 12354) }, + Declaration { id: DeclarationId(559), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12355, 12417) }, + Declaration { id: DeclarationId(560), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12941, 12996) }, + Declaration { id: DeclarationId(561), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12997, 13051) }, + Declaration { id: DeclarationId(562), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13052, 13105) }, + Declaration { id: DeclarationId(563), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13106, 13163) }, + Declaration { id: DeclarationId(564), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13164, 13221) }, + Declaration { id: DeclarationId(565), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13222, 13277) }, + Declaration { id: DeclarationId(566), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13278, 13334) }, + Declaration { id: DeclarationId(567), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13335, 13391) }, + Declaration { id: DeclarationId(568), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13392, 13450) }, + Declaration { id: DeclarationId(569), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13530, 13572) }, + Declaration { id: DeclarationId(570), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13779, 13864) }, + Declaration { id: DeclarationId(571), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13865, 13974) }, + Declaration { id: DeclarationId(572), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 17397, 17447) }, + Declaration { id: DeclarationId(573), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 17448, 17500) }, + Declaration { id: DeclarationId(574), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 17641, 17702) }, + Declaration { id: DeclarationId(575), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19562, 19626) }, + Declaration { id: DeclarationId(576), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19627, 19684) }, + Declaration { id: DeclarationId(577), name: Some("".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19685, 19741) }, + Declaration { id: DeclarationId(578), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 3679, 3689) }, + Declaration { id: DeclarationId(579), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 3692, 3697) }, + Declaration { id: DeclarationId(580), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 3700, 3710) }, + Declaration { id: DeclarationId(581), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 3713, 3726) }, + Declaration { id: DeclarationId(582), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 4762, 4771) }, + Declaration { id: DeclarationId(583), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 4774, 4780) }, + Declaration { id: DeclarationId(584), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 4783, 4787) }, + Declaration { id: DeclarationId(585), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(191) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 5335, 5353) }, + Declaration { id: DeclarationId(586), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 6155, 6164) }, + Declaration { id: DeclarationId(587), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), arguments: vec![TemplateArgument { parameter: DeclarationId(94), value: DeclarationId(191) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/unicode.dag", 6404, 6422) }, + Declaration { id: DeclarationId(588), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(39), arguments: vec![TemplateArgument { parameter: DeclarationId(40), value: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 7546, 7570) }, + Declaration { id: DeclarationId(589), name: Some("List".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Empty".to_string(), ty: DeclarationId(1404) }, Field { label: "Cons".to_string(), ty: DeclarationId(1406) }] }, type_params: vec![DeclarationId(590)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 2083, 2159) }, + Declaration { id: DeclarationId(590), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("element".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 2083, 2159) }, + Declaration { id: DeclarationId(591), name: Some("empty".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(1374), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 3273, 3284)) }, type_params: vec![DeclarationId(592)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3236, 3284) }, + Declaration { id: DeclarationId(592), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("element".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3236, 3284) }, + Declaration { id: DeclarationId(593), name: Some("cons".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(594), DeclarationId(1375)], output: DeclarationId(1376), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 3453, 3475)) }, type_params: vec![DeclarationId(594)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3383, 3475) }, + Declaration { id: DeclarationId(594), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("element".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3383, 3475) }, + Declaration { id: DeclarationId(595), name: Some("singleton".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(596)], output: DeclarationId(1377), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 3570, 3590)) }, type_params: vec![DeclarationId(596)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3519, 3590) }, + Declaration { id: DeclarationId(596), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("element".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3519, 3590) }, + Declaration { id: DeclarationId(597), name: Some("fold".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1378), DeclarationId(599), DeclarationId(1379)], output: DeclarationId(599), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 4203, 4307)) }, type_params: vec![DeclarationId(598), DeclarationId(599)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4142, 4307) }, + Declaration { id: DeclarationId(598), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4142, 4307) }, + Declaration { id: DeclarationId(599), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("U".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4142, 4307) }, + Declaration { id: DeclarationId(600), name: Some("fold_right".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1380), DeclarationId(602), DeclarationId(1381)], output: DeclarationId(602), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 4658, 4768)) }, type_params: vec![DeclarationId(601), DeclarationId(602)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4591, 4768) }, + Declaration { id: DeclarationId(601), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4591, 4768) }, + Declaration { id: DeclarationId(602), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("U".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4591, 4768) }, + Declaration { id: DeclarationId(603), name: Some("concat".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1382), DeclarationId(1383)], output: DeclarationId(1384), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 5386, 5414)) }, type_params: vec![DeclarationId(604)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5314, 5414) }, + Declaration { id: DeclarationId(604), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("element".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5314, 5414) }, + Declaration { id: DeclarationId(605), name: Some("map".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1385), DeclarationId(1386)], output: DeclarationId(1387), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 5721, 5778)) }, type_params: vec![DeclarationId(606), DeclarationId(607)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5667, 5778) }, + Declaration { id: DeclarationId(606), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("A".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5667, 5778) }, + Declaration { id: DeclarationId(607), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("B".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5667, 5778) }, + Declaration { id: DeclarationId(608), name: Some("filter".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1388), DeclarationId(1389)], output: DeclarationId(1390), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 5905, 5988)) }, type_params: vec![DeclarationId(609)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5848, 5988) }, + Declaration { id: DeclarationId(609), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5848, 5988) }, + Declaration { id: DeclarationId(610), name: Some("flat_map".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1391), DeclarationId(1393)], output: DeclarationId(1394), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 6171, 6230)) }, type_params: vec![DeclarationId(611), DeclarationId(612)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6106, 6230) }, + Declaration { id: DeclarationId(611), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("A".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6106, 6230) }, + Declaration { id: DeclarationId(612), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("B".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6106, 6230) }, + Declaration { id: DeclarationId(613), name: Some("length".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1395)], output: DeclarationId(71), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 6372, 6409)) }, type_params: vec![DeclarationId(614)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6337, 6409) }, + Declaration { id: DeclarationId(614), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6337, 6409) }, + Declaration { id: DeclarationId(615), name: Some("is_empty".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1396)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 6605, 6671)) }, type_params: vec![DeclarationId(616)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6567, 6671) }, + Declaration { id: DeclarationId(616), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6567, 6671) }, + Declaration { id: DeclarationId(617), name: Some("IndexedElement".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "index".to_string(), ty: DeclarationId(71) }, Field { label: "value".to_string(), ty: DeclarationId(618) }] }, type_params: vec![DeclarationId(618)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6993, 7055) }, + Declaration { id: DeclarationId(618), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("element".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6993, 7055) }, + Declaration { id: DeclarationId(619), name: Some("enumerate".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1397)], output: DeclarationId(1399), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 7238, 7269)) }, type_params: vec![DeclarationId(620)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7180, 7269) }, + Declaration { id: DeclarationId(620), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7180, 7269) }, + Declaration { id: DeclarationId(621), name: Some("enumerate_helper".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1400), DeclarationId(71)], output: DeclarationId(1402), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 7463, 7644)) }, type_params: vec![DeclarationId(622)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7386, 7644) }, + Declaration { id: DeclarationId(622), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7386, 7644) }, + Declaration { id: DeclarationId(623), name: Some("contains".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1403), DeclarationId(624)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/list.dag", 8205, 8332)) }, type_params: vec![DeclarationId(624)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 8156, 8332) }, + Declaration { id: DeclarationId(624), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("T".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 8156, 8332) }, + Declaration { id: DeclarationId(625), name: Some("NodeId".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1364, 1375) }, + Declaration { id: DeclarationId(626), name: Some("PortId".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1376, 1387) }, + Declaration { id: DeclarationId(627), name: Some("DeclarationId".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1388, 1406) }, + Declaration { id: DeclarationId(628), name: Some("ClusterId".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1407, 1421) }, + Declaration { id: DeclarationId(629), name: Some("NonEmptyList".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "first".to_string(), ty: DeclarationId(630) }, Field { label: "rest".to_string(), ty: DeclarationId(1407) }] }, type_params: vec![DeclarationId(630)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1423, 1492) }, + Declaration { id: DeclarationId(630), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("element".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1423, 1492) }, + Declaration { id: DeclarationId(631), name: Some("NonSingletonList".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "first".to_string(), ty: DeclarationId(632) }, Field { label: "second".to_string(), ty: DeclarationId(632) }, Field { label: "rest".to_string(), ty: DeclarationId(1408) }] }, type_params: vec![DeclarationId(632)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1494, 1585) }, + Declaration { id: DeclarationId(632), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("element".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1494, 1585) }, + Declaration { id: DeclarationId(633), name: Some("UrlPathToken".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "LiteralToken".to_string(), ty: DeclarationId(1423) }, Field { label: "ParamToken".to_string(), ty: DeclarationId(1424) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 7510, 7595) }, + Declaration { id: DeclarationId(634), name: Some("PathTemplate".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "tokens".to_string(), ty: DeclarationId(1425) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 7597, 7647) }, + Declaration { id: DeclarationId(635), name: Some("PathSegmentTokensResult".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ParsedSegmentTokens".to_string(), ty: DeclarationId(1427) }, Field { label: "MalformedPathSegment".to_string(), ty: DeclarationId(1428) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 8003, 8147) }, + Declaration { id: DeclarationId(636), name: Some("PathTemplateParseResult".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ParsedPathTemplate".to_string(), ty: DeclarationId(1429) }, Field { label: "MalformedPathTemplate".to_string(), ty: DeclarationId(1430) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 8477, 8630) }, + Declaration { id: DeclarationId(637), name: Some("parse_path_template".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(636), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 8695, 10000)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 8632, 10000) }, + Declaration { id: DeclarationId(638), name: Some("parse_segment_tokens".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(635), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 10066, 11705)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 10002, 11705) }, + Declaration { id: DeclarationId(639), name: Some("last_path_param".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(634)], output: DeclarationId(1409), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 11761, 12044)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 11707, 12044) }, + Declaration { id: DeclarationId(640), name: Some("IdempotentShape".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ReadEffect".to_string(), ty: DeclarationId(1431) }, Field { label: "UpsertEffect".to_string(), ty: DeclarationId(1432) }, Field { label: "DeleteEffect".to_string(), ty: DeclarationId(1433) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 14330, 14451) }, + Declaration { id: DeclarationId(641), name: Some("BreakingShape".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "CreateEffect".to_string(), ty: DeclarationId(1434) }, Field { label: "AppendEffect".to_string(), ty: DeclarationId(1435) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 14674, 14749) }, + Declaration { id: DeclarationId(642), name: Some("EffectShape".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "IsIdempotent".to_string(), ty: DeclarationId(1436) }, Field { label: "IsBreaking".to_string(), ty: DeclarationId(1437) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 15150, 15230) }, + Declaration { id: DeclarationId(643), name: Some("CreateCause".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "PostAlways".to_string(), ty: DeclarationId(1438) }, Field { label: "KeylessFallback".to_string(), ty: DeclarationId(1439) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 15722, 15796) }, + Declaration { id: DeclarationId(644), name: Some("KeySource".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "PathParam".to_string(), ty: DeclarationId(1440) }, Field { label: "InputField".to_string(), ty: DeclarationId(1441) }, Field { label: "CompositeKey".to_string(), ty: DeclarationId(1443) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 16482, 16603) }, + Declaration { id: DeclarationId(645), name: Some("IdempotencyEvidence".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "LatticeEffect".to_string(), ty: DeclarationId(1444) }, Field { label: "IdentityEffect".to_string(), ty: DeclarationId(1445) }, Field { label: "NonIdempotent".to_string(), ty: DeclarationId(1446) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 17251, 17349) }, + Declaration { id: DeclarationId(646), name: Some("is_idempotent_effect".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(642)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 17576, 17648)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 17524, 17648) }, + Declaration { id: DeclarationId(647), name: Some("derive_idempotency_evidence".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(642)], output: DeclarationId(645), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 17861, 18381)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 17787, 18381) }, + Declaration { id: DeclarationId(648), name: Some("OperationEffect".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "operation_name".to_string(), ty: DeclarationId(186) }, Field { label: "shape".to_string(), ty: DeclarationId(642) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 19065, 19135) }, + Declaration { id: DeclarationId(649), name: Some("DeriveOpEffectResult".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "DerivedEffect".to_string(), ty: DeclarationId(1447) }, Field { label: "UnknownHttpMethodInput".to_string(), ty: DeclarationId(1448) }, Field { label: "MalformedPathInput".to_string(), ty: DeclarationId(1449) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 19489, 19789) }, + Declaration { id: DeclarationId(650), name: Some("CompositionVerdict".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "IdempotentComposition".to_string(), ty: DeclarationId(1450) }, Field { label: "BrokenBy".to_string(), ty: DeclarationId(1452) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 20510, 20619) }, + Declaration { id: DeclarationId(651), name: Some("operation_is_breaking".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(648)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 20809, 20884)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 20755, 20884) }, + Declaration { id: DeclarationId(652), name: Some("breaker_ref".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71)], output: DeclarationId(1410), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 20944, 20966)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 20886, 20966) }, + Declaration { id: DeclarationId(653), name: Some("indexed_breaker_ref".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1411)], output: DeclarationId(1413), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 21060, 21153)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 20968, 21153) }, + Declaration { id: DeclarationId(654), name: Some("first_breaker_ref".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1414)], output: DeclarationId(1416), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 21240, 21423)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 21155, 21423) }, + Declaration { id: DeclarationId(655), name: Some("compose_effects".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1417)], output: DeclarationId(650), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 22313, 22436)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 22240, 22436) }, + Declaration { id: DeclarationId(656), name: Some("BoolPortRef".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "port".to_string(), ty: DeclarationId(626) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 23637, 23672) }, + Declaration { id: DeclarationId(657), name: Some("BranchArm".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "condition".to_string(), ty: DeclarationId(656) }, Field { label: "body".to_string(), ty: DeclarationId(658) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 23757, 23823) }, + Declaration { id: DeclarationId(658), name: Some("WorkflowEffect".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "LinearEffect".to_string(), ty: DeclarationId(1454) }, Field { label: "BranchEffect".to_string(), ty: DeclarationId(1456) }, Field { label: "LoopEffect".to_string(), ty: DeclarationId(1457) }, Field { label: "ParallelEffect".to_string(), ty: DeclarationId(1459) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 24499, 24727) }, + Declaration { id: DeclarationId(659), name: Some("IdempotencyUnsupportedDetail".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "variant_name".to_string(), ty: DeclarationId(186) }, Field { label: "downstream_stage".to_string(), ty: DeclarationId(186) }, Field { label: "reason".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 25086, 25190) }, + Declaration { id: DeclarationId(660), name: Some("WorkflowIdempotencyReport".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "WorkflowCompositionVerdict".to_string(), ty: DeclarationId(1460) }, Field { label: "IdempotencyUnsupported".to_string(), ty: DeclarationId(1461) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 25329, 25467) }, + Declaration { id: DeclarationId(661), name: Some("report_unsupported_workflow_variant".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(186), DeclarationId(186)], output: DeclarationId(660), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 25609, 25765)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 25469, 25765) }, + Declaration { id: DeclarationId(662), name: Some("ParallelismUnsupportedKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "NoWorkflowProjection".to_string(), ty: DeclarationId(1462) }, Field { label: "NotParallelEffectRoot".to_string(), ty: DeclarationId(1463) }, Field { label: "NonLinearParallelBranch".to_string(), ty: DeclarationId(1464) }, Field { label: "PairwiseNonCommute".to_string(), ty: DeclarationId(1465) }, Field { label: "LensSurfacePending".to_string(), ty: DeclarationId(1466) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 25928, 26084) }, + Declaration { id: DeclarationId(663), name: Some("ParallelismUnsupportedDetail".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "kind".to_string(), ty: DeclarationId(662) }, Field { label: "downstream_stage".to_string(), ty: DeclarationId(186) }, Field { label: "reason".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 26086, 26202) }, + Declaration { id: DeclarationId(664), name: Some("WorkflowParallelismReport".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ParallelCompositionVerdict".to_string(), ty: DeclarationId(1467) }, Field { label: "ParallelismUnsupported".to_string(), ty: DeclarationId(1468) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 26366, 26504) }, + Declaration { id: DeclarationId(665), name: Some("report_parallelism_unsupported".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(662), DeclarationId(186)], output: DeclarationId(664), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 26625, 26780)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 26506, 26780) }, + Declaration { id: DeclarationId(666), name: Some("lane2_workflow_idempotency_report".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(658)], output: DeclarationId(660), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 27018, 27848)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 26932, 27848) }, + Declaration { id: DeclarationId(667), name: Some("parse_http_method".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(1418), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 29707, 30005)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 29658, 30005) }, + Declaration { id: DeclarationId(668), name: Some("keyless_create".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(156)], output: DeclarationId(642), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 30060, 30136)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 30007, 30136) }, + Declaration { id: DeclarationId(669), name: Some("upsert_or_create".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1419), DeclarationId(156)], output: DeclarationId(642), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 30476, 30628)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 30400, 30628) }, + Declaration { id: DeclarationId(670), name: Some("delete_or_create".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1420), DeclarationId(156)], output: DeclarationId(642), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 30706, 30858)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 30630, 30858) }, + Declaration { id: DeclarationId(671), name: Some("derive_effect_shape".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(156), DeclarationId(634)], output: DeclarationId(642), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 30944, 31429)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 30860, 31429) }, + Declaration { id: DeclarationId(672), name: Some("derive_op_effect".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(186), DeclarationId(186)], output: DeclarationId(649), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 31545, 32387)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 31431, 32387) }, + Declaration { id: DeclarationId(673), name: Some("ModifierAgreement".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Agrees".to_string(), ty: DeclarationId(1469) }, Field { label: "Disagrees".to_string(), ty: DeclarationId(1470) }, Field { label: "DerivationUnknown".to_string(), ty: DeclarationId(1471) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 33087, 33204) }, + Declaration { id: DeclarationId(674), name: Some("ModifierAxisCheck".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ModifierNotDeclared".to_string(), ty: DeclarationId(1472) }, Field { label: "ModifierDeclared".to_string(), ty: DeclarationId(1473) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 33651, 33751) }, + Declaration { id: DeclarationId(675), name: Some("ModifierCheck".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "operation_name".to_string(), ty: DeclarationId(186) }, Field { label: "derived_shape".to_string(), ty: DeclarationId(642) }, Field { label: "idempotent_check".to_string(), ty: DeclarationId(674) }, Field { label: "readonly_check".to_string(), ty: DeclarationId(674) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 33753, 33903) }, + Declaration { id: DeclarationId(676), name: Some("classify_idempotent_disagreement".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(641)], output: DeclarationId(673), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 34542, 35084)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 34463, 35084) }, + Declaration { id: DeclarationId(677), name: Some("classify_readonly_agreement".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(642)], output: DeclarationId(673), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 35488, 35930)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 35416, 35930) }, + Declaration { id: DeclarationId(678), name: Some("check_modifier_vs_derivation".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(648), DeclarationId(88), DeclarationId(88)], output: DeclarationId(675), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 36062, 36711)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 35932, 36711) }, + Declaration { id: DeclarationId(679), name: Some("IdempotencyTestObligation".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "operation_name".to_string(), ty: DeclarationId(186) }, Field { label: "effect_shape".to_string(), ty: DeclarationId(642) }, Field { label: "claim".to_string(), ty: DeclarationId(186) }, Field { label: "witness_required".to_string(), ty: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 37063, 37191) }, + Declaration { id: DeclarationId(680), name: Some("generate_idempotency_obligations".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1421)], output: DeclarationId(1422), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/effects.dag", 37296, 37566)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 37193, 37566) }, + Declaration { id: DeclarationId(681), name: Some("WorkflowEffectConcern".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "workflow_name".to_string(), ty: DeclarationId(186) }, Field { label: "create_op".to_string(), ty: DeclarationId(186) }, Field { label: "reason".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 37883, 37974) }, + Declaration { id: DeclarationId(682), name: Some("TypeShape".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "declaration".to_string(), ty: DeclarationId(627) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 247, 294) }, + Declaration { id: DeclarationId(683), name: Some("PortState".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Uninferred".to_string(), ty: DeclarationId(1481) }, Field { label: "Resolved".to_string(), ty: DeclarationId(1482) }, Field { label: "Unresolved".to_string(), ty: DeclarationId(1483) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 437, 505) }, + Declaration { id: DeclarationId(684), name: Some("DagPort".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "id".to_string(), ty: DeclarationId(626) }, Field { label: "state".to_string(), ty: DeclarationId(683) }, Field { label: "produced_by".to_string(), ty: DeclarationId(1484) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 507, 578) }, + Declaration { id: DeclarationId(685), name: Some("LiteralBits".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "LitInt".to_string(), ty: DeclarationId(1485) }, Field { label: "LitBool".to_string(), ty: DeclarationId(1486) }, Field { label: "LitString".to_string(), ty: DeclarationId(1487) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 747, 819) }, + Declaration { id: DeclarationId(686), name: Some("AtomPayload".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Literal".to_string(), ty: DeclarationId(1488) }, Field { label: "UnresolvedIdentifier".to_string(), ty: DeclarationId(1489) }, Field { label: "ResolvedByStructure".to_string(), ty: DeclarationId(1490) }, Field { label: "ResolvedByName".to_string(), ty: DeclarationId(1491) }, Field { label: "TypeParam".to_string(), ty: DeclarationId(1492) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 2829, 2998) }, + Declaration { id: DeclarationId(687), name: Some("PositiveIntervalWidth".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "OneUnit".to_string(), ty: DeclarationId(1493) }, Field { label: "AdditionalUnit".to_string(), ty: DeclarationId(1494) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 3571, 3664) }, + Declaration { id: DeclarationId(688), name: Some("IntervalWidth".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ZeroWidth".to_string(), ty: DeclarationId(1495) }, Field { label: "PositiveWidth".to_string(), ty: DeclarationId(1496) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 3666, 3739) }, + Declaration { id: DeclarationId(689), name: Some("Interval".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "BoundedInterval".to_string(), ty: DeclarationId(1497) }, Field { label: "Unbounded".to_string(), ty: DeclarationId(1498) }] }, type_params: vec![DeclarationId(690)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4030, 4115) }, + Declaration { id: DeclarationId(690), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("D".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4030, 4115) }, + Declaration { id: DeclarationId(691), name: Some("CardinalityBound".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Exact".to_string(), ty: DeclarationId(1499) }, Field { label: "AtMostOne".to_string(), ty: DeclarationId(1500) }, Field { label: "Unbounded".to_string(), ty: DeclarationId(1501) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4340, 4404) }, + Declaration { id: DeclarationId(692), name: Some("ConjField".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "label".to_string(), ty: DeclarationId(186) }, Field { label: "ty".to_string(), ty: DeclarationId(627) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4406, 4460) }, + Declaration { id: DeclarationId(693), name: Some("TemplateArgument".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "parameter".to_string(), ty: DeclarationId(627) }, Field { label: "value".to_string(), ty: DeclarationId(627) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4462, 4537) }, + Declaration { id: DeclarationId(694), name: Some("FieldEntry".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "label".to_string(), ty: DeclarationId(186) }, Field { label: "value".to_string(), ty: DeclarationId(695) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4539, 4594) }, + Declaration { id: DeclarationId(695), name: Some("FieldValue".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Literal".to_string(), ty: DeclarationId(1502) }, Field { label: "Reference".to_string(), ty: DeclarationId(1503) }, Field { label: "Record".to_string(), ty: DeclarationId(1505) }, Field { label: "List".to_string(), ty: DeclarationId(1507) }, Field { label: "Map".to_string(), ty: DeclarationId(1509) }, Field { label: "Variant".to_string(), ty: DeclarationId(1511) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4811, 5047) }, + Declaration { id: DeclarationId(696), name: Some("ValueBody".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ValueBodyUnparsed".to_string(), ty: DeclarationId(1512) }, Field { label: "ValueBodyStructural".to_string(), ty: DeclarationId(1514) }, Field { label: "ValueBodyMap".to_string(), ty: DeclarationId(1516) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5187, 5323) }, + Declaration { id: DeclarationId(697), name: Some("ArrowBody".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "UserDefined".to_string(), ty: DeclarationId(1517) }, Field { label: "ExternalRealization".to_string(), ty: DeclarationId(1518) }, Field { label: "Pending".to_string(), ty: DeclarationId(1519) }, Field { label: "NoBody".to_string(), ty: DeclarationId(1520) }, Field { label: "Unparsed".to_string(), ty: DeclarationId(1521) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5639, 5764) }, + Declaration { id: DeclarationId(698), name: Some("TypeConnective".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Atom".to_string(), ty: DeclarationId(1522) }, Field { label: "Conj".to_string(), ty: DeclarationId(1524) }, Field { label: "Disj".to_string(), ty: DeclarationId(1526) }, Field { label: "Arrow".to_string(), ty: DeclarationId(1528) }, Field { label: "Cardinality".to_string(), ty: DeclarationId(1529) }, Field { label: "Instantiation".to_string(), ty: DeclarationId(1531) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5969, 6369) }, + Declaration { id: DeclarationId(699), name: Some("Declaration".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "id".to_string(), ty: DeclarationId(627) }, Field { label: "name".to_string(), ty: DeclarationId(1532) }, Field { label: "connective".to_string(), ty: DeclarationId(698) }, Field { label: "type_params".to_string(), ty: DeclarationId(1533) }, Field { label: "phantom_params".to_string(), ty: DeclarationId(1534) }, Field { label: "meta_tag".to_string(), ty: DeclarationId(1535) }, Field { label: "inhabits".to_string(), ty: DeclarationId(1536) }, Field { label: "value_body".to_string(), ty: DeclarationId(1537) }, Field { label: "nominal_opacity".to_string(), ty: DeclarationId(1538) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6371, 6665) }, + Declaration { id: DeclarationId(700), name: Some("PhantomParameter".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "parameter".to_string(), ty: DeclarationId(627) }, Field { label: "algebra".to_string(), ty: DeclarationId(627) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 7138, 7215) }, + Declaration { id: DeclarationId(701), name: Some("NominalOpacity".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "permitted_accessors".to_string(), ty: DeclarationId(1539) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 7722, 7788) }, + Declaration { id: DeclarationId(702), name: Some("ArithmeticOp".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Add".to_string(), ty: DeclarationId(1540) }, Field { label: "Sub".to_string(), ty: DeclarationId(1541) }, Field { label: "Mul".to_string(), ty: DeclarationId(1542) }, Field { label: "Div".to_string(), ty: DeclarationId(1543) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8045, 8094) }, + Declaration { id: DeclarationId(703), name: Some("ComparisonOp".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Eq".to_string(), ty: DeclarationId(1544) }, Field { label: "Ne".to_string(), ty: DeclarationId(1545) }, Field { label: "Lt".to_string(), ty: DeclarationId(1546) }, Field { label: "Le".to_string(), ty: DeclarationId(1547) }, Field { label: "Gt".to_string(), ty: DeclarationId(1548) }, Field { label: "Ge".to_string(), ty: DeclarationId(1549) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8196, 8255) }, + Declaration { id: DeclarationId(704), name: Some("LogicalOp".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "And".to_string(), ty: DeclarationId(1550) }, Field { label: "Or".to_string(), ty: DeclarationId(1551) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8489, 8518) }, + Declaration { id: DeclarationId(705), name: Some("OperatorKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Arithmetic".to_string(), ty: DeclarationId(1552) }, Field { label: "Comparison".to_string(), ty: DeclarationId(1553) }, Field { label: "Logical".to_string(), ty: DeclarationId(1554) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8732, 8830) }, + Declaration { id: DeclarationId(706), name: Some("TransformTarget".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Callable".to_string(), ty: DeclarationId(1555) }, Field { label: "FieldProject".to_string(), ty: DeclarationId(1557) }, Field { label: "Operator".to_string(), ty: DeclarationId(1558) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8992, 9152) }, + Declaration { id: DeclarationId(707), name: Some("BranchPattern".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "UnresolvedVariant".to_string(), ty: DeclarationId(1559) }, Field { label: "ResolvedVariant".to_string(), ty: DeclarationId(1560) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9254, 9364) }, + Declaration { id: DeclarationId(708), name: Some("PayloadBinding".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "binding_name".to_string(), ty: DeclarationId(186) }, Field { label: "payload_port".to_string(), ty: DeclarationId(626) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9366, 9435) }, + Declaration { id: DeclarationId(709), name: Some("BranchPath".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "body".to_string(), ty: DeclarationId(625) }, Field { label: "result_port".to_string(), ty: DeclarationId(626) }, Field { label: "pattern".to_string(), ty: DeclarationId(707) }, Field { label: "binding".to_string(), ty: DeclarationId(1561) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9437, 9545) }, + Declaration { id: DeclarationId(710), name: Some("ParamRef".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "member".to_string(), ty: DeclarationId(625) }, Field { label: "slot".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 10144, 10190) }, + Declaration { id: DeclarationId(711), name: Some("TransformRef".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "node".to_string(), ty: DeclarationId(625) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 10702, 10738) }, + Declaration { id: DeclarationId(712), name: Some("ElementRef".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "index".to_string(), ty: DeclarationId(71) }] }, type_params: vec![DeclarationId(713)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 11355, 11396) }, + Declaration { id: DeclarationId(713), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("element".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 11355, 11396) }, + Declaration { id: DeclarationId(714), name: Some("MemberDescent".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(710) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 11398, 11438) }, + Declaration { id: DeclarationId(715), name: Some("IntraClusterCall".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "transform".to_string(), ty: DeclarationId(711) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 11440, 11491) }, + Declaration { id: DeclarationId(716), name: Some("Cluster".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "members".to_string(), ty: DeclarationId(1562) }, Field { label: "intra_cluster_calls".to_string(), ty: DeclarationId(1563) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 11493, 11606) }, + Declaration { id: DeclarationId(717), name: Some("LoopBound".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Cardinality".to_string(), ty: DeclarationId(1564) }, Field { label: "Descent".to_string(), ty: DeclarationId(1565) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12011, 12094) }, + Declaration { id: DeclarationId(718), name: Some("ValueNode".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "id".to_string(), ty: DeclarationId(625) }, Field { label: "payload".to_string(), ty: DeclarationId(685) }, Field { label: "result_port".to_string(), ty: DeclarationId(626) }, Field { label: "span".to_string(), ty: DeclarationId(121) }, Field { label: "lane2_workflow".to_string(), ty: DeclarationId(1566) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12096, 12225) }, + Declaration { id: DeclarationId(719), name: Some("TransformNode".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "id".to_string(), ty: DeclarationId(625) }, Field { label: "target".to_string(), ty: DeclarationId(706) }, Field { label: "inputs".to_string(), ty: DeclarationId(1567) }, Field { label: "result_port".to_string(), ty: DeclarationId(626) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12227, 12352) }, + Declaration { id: DeclarationId(720), name: Some("BranchEmitParticipation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1568), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12517, 12559) }, + Declaration { id: DeclarationId(721), name: Some("BranchNode".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "id".to_string(), ty: DeclarationId(625) }, Field { label: "input".to_string(), ty: DeclarationId(626) }, Field { label: "paths".to_string(), ty: DeclarationId(1569) }, Field { label: "result_port".to_string(), ty: DeclarationId(626) }, Field { label: "span".to_string(), ty: DeclarationId(121) }, Field { label: "emit_participation".to_string(), ty: DeclarationId(1570) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12561, 12723) }, + Declaration { id: DeclarationId(722), name: Some("LoopNode".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "id".to_string(), ty: DeclarationId(625) }, Field { label: "source".to_string(), ty: DeclarationId(626) }, Field { label: "init".to_string(), ty: DeclarationId(626) }, Field { label: "body".to_string(), ty: DeclarationId(625) }, Field { label: "bound".to_string(), ty: DeclarationId(717) }, Field { label: "result_port".to_string(), ty: DeclarationId(626) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12725, 12862) }, + Declaration { id: DeclarationId(723), name: Some("BindEmitParticipation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1571), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13104, 13147) }, + Declaration { id: DeclarationId(724), name: Some("BindNode".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "id".to_string(), ty: DeclarationId(625) }, Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "result_port".to_string(), ty: DeclarationId(626) }, Field { label: "params".to_string(), ty: DeclarationId(1572) }, Field { label: "span".to_string(), ty: DeclarationId(121) }, Field { label: "lane2_workflow".to_string(), ty: DeclarationId(1573) }, Field { label: "emit_participation".to_string(), ty: DeclarationId(1574) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13149, 13337) }, + Declaration { id: DeclarationId(725), name: Some("Behavior".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Value".to_string(), ty: DeclarationId(1575) }, Field { label: "Transform".to_string(), ty: DeclarationId(1576) }, Field { label: "Branch".to_string(), ty: DeclarationId(1577) }, Field { label: "Loop".to_string(), ty: DeclarationId(1578) }, Field { label: "Bind".to_string(), ty: DeclarationId(1579) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13409, 13533) }, + Declaration { id: DeclarationId(726), name: Some("Dag".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "declarations".to_string(), ty: DeclarationId(1580) }, Field { label: "nodes".to_string(), ty: DeclarationId(1581) }, Field { label: "ports".to_string(), ty: DeclarationId(1582) }, Field { label: "clusters".to_string(), ty: DeclarationId(1583) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13535, 13654) }, + Declaration { id: DeclarationId(727), name: Some("SubstrateAccessorRealization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "carrier".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 15006, 15061) }, + Declaration { id: DeclarationId(728), name: Some("SubstrateAccessorBinding".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "accessor".to_string(), ty: DeclarationId(1001) }, Field { label: "realization".to_string(), ty: DeclarationId(1001) }, Field { label: "language".to_string(), ty: DeclarationId(1001) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 15828, 15945) }, + Declaration { id: DeclarationId(729), name: Some("port".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(726), DeclarationId(626)], output: DeclarationId(1474), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/substrate.dag", 15987, 16002)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 15947, 16002) }, + Declaration { id: DeclarationId(730), name: Some("node".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(726), DeclarationId(625)], output: DeclarationId(1475), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/substrate.dag", 16045, 16060)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 16004, 16060) }, + Declaration { id: DeclarationId(731), name: Some("resolve_producer".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(726), DeclarationId(626)], output: DeclarationId(1476), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/substrate.dag", 16120, 16147)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 16062, 16147) }, + Declaration { id: DeclarationId(732), name: Some("declaration_by_id".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(726), DeclarationId(627)], output: DeclarationId(1477), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/substrate.dag", 16509, 16537)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 16445, 16537) }, + Declaration { id: DeclarationId(733), name: Some("lane2_workflow_at".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(726), DeclarationId(625)], output: DeclarationId(1478), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/substrate.dag", 16833, 16868)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 16773, 16868) }, + Declaration { id: DeclarationId(734), name: Some("miss_declaration_id_lookup".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(1479), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/substrate.dag", 17225, 17235)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 17168, 17235) }, + Declaration { id: DeclarationId(735), name: Some("hit_declaration_id_lookup".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(627)], output: DeclarationId(1480), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/substrate.dag", 17310, 17323)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 17237, 17323) }, + Declaration { id: DeclarationId(736), name: Some("MethodRef".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "decl".to_string(), ty: DeclarationId(1001) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/methods.dag", 1474, 1515) }, + Declaration { id: DeclarationId(737), name: Some("CollectionSizeEffect".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ShrinkEffect".to_string(), ty: DeclarationId(1603) }, Field { label: "ProjectionEffect".to_string(), ty: DeclarationId(1604) }, Field { label: "IdentityEffect".to_string(), ty: DeclarationId(1605) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 4775, 4857) }, + Declaration { id: DeclarationId(738), name: Some("CostShape".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ShapeConstant".to_string(), ty: DeclarationId(1606) }, Field { label: "ShapeLinearScan".to_string(), ty: DeclarationId(1607) }, Field { label: "ShapeIterateBody".to_string(), ty: DeclarationId(1608) }, Field { label: "ShapeSortBody".to_string(), ty: DeclarationId(1609) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 5688, 5779) }, + Declaration { id: DeclarationId(739), name: Some("MethodContract".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "algebra_id".to_string(), ty: DeclarationId(627) }, Field { label: "method_id".to_string(), ty: DeclarationId(627) }, Field { label: "size_effect".to_string(), ty: DeclarationId(1610) }, Field { label: "cost_shape".to_string(), ty: DeclarationId(1611) }, Field { label: "callback_element_position".to_string(), ty: DeclarationId(1612) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 6540, 6714) }, + Declaration { id: DeclarationId(740), name: Some("SizeVariable".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "source_port".to_string(), ty: DeclarationId(626) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 7365, 7408) }, + Declaration { id: DeclarationId(741), name: Some("DegreeAtLeastTwo".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "DegreeTwo".to_string(), ty: DeclarationId(1613) }, Field { label: "DegreeSuccessor".to_string(), ty: DeclarationId(1614) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8155, 8241) }, + Declaration { id: DeclarationId(742), name: Some("SymbolicCost".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ConstantCost".to_string(), ty: DeclarationId(1615) }, Field { label: "LinearCost".to_string(), ty: DeclarationId(1616) }, Field { label: "PolynomialCost".to_string(), ty: DeclarationId(1617) }, Field { label: "ProductCost".to_string(), ty: DeclarationId(1619) }, Field { label: "SumCost".to_string(), ty: DeclarationId(1621) }, Field { label: "LogCost".to_string(), ty: DeclarationId(1622) }, Field { label: "UnknownCost".to_string(), ty: DeclarationId(1623) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8391, 8668) }, + Declaration { id: DeclarationId(743), name: Some("DominateScanAcc".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "any".to_string(), ty: DeclarationId(88) }, Field { label: "pivot".to_string(), ty: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 9074, 9132) }, + Declaration { id: DeclarationId(744), name: Some("dominate_scan_init".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(742)], output: DeclarationId(743), body: ArrowBody::UserDefined(NodeId(2)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 9134, 9229) }, + Declaration { id: DeclarationId(745), name: Some("miss_symbolic_cost_lookup".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(1584), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/algebra.dag", 9870, 9880)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 9815, 9880) }, + Declaration { id: DeclarationId(746), name: Some("hit_symbolic_cost_lookup".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(742)], output: DeclarationId(1585), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/algebra.dag", 9954, 9969)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 9882, 9969) }, + Declaration { id: DeclarationId(747), name: Some("two_terms".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(742), DeclarationId(742)], output: DeclarationId(1586), body: ArrowBody::UserDefined(NodeId(6)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 9971, 10446) }, + Declaration { id: DeclarationId(748), name: Some("many_terms".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(742), DeclarationId(742), DeclarationId(1587)], output: DeclarationId(1588), body: ArrowBody::UserDefined(NodeId(8)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 10448, 10633) }, + Declaration { id: DeclarationId(749), name: Some("reject_all_symbolic_costs".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(742)], output: DeclarationId(88), body: ArrowBody::UserDefined(NodeId(13)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 10635, 10763) }, + Declaration { id: DeclarationId(750), name: Some("degree_raw".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(741)], output: DeclarationId(71), body: ArrowBody::UserDefined(NodeId(21)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 10765, 10918) }, + Declaration { id: DeclarationId(751), name: Some("sequential".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(742), DeclarationId(742)], output: DeclarationId(742), body: ArrowBody::UserDefined(NodeId(25)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 11154, 11257) }, + Declaration { id: DeclarationId(752), name: Some("iterate".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(742), DeclarationId(742)], output: DeclarationId(742), body: ArrowBody::UserDefined(NodeId(29)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 11443, 11561) }, + Declaration { id: DeclarationId(753), name: Some("max_path_step".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(742), DeclarationId(742)], output: DeclarationId(742), body: ArrowBody::UserDefined(NodeId(33)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 12421, 12588) }, + Declaration { id: DeclarationId(754), name: Some("keep_or_sum".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(742), DeclarationId(742)], output: DeclarationId(742), body: ArrowBody::UserDefined(NodeId(37)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 12590, 12748) }, + Declaration { id: DeclarationId(755), name: Some("max_path".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1589)], output: DeclarationId(742), body: ArrowBody::UserDefined(NodeId(41)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 13050, 13152) }, + Declaration { id: DeclarationId(756), name: Some("dominates".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(742), DeclarationId(742)], output: DeclarationId(88), body: ArrowBody::UserDefined(NodeId(94)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 14020, 16105) }, + Declaration { id: DeclarationId(757), name: Some("same_size_variable".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(740), DeclarationId(740)], output: DeclarationId(88), body: ArrowBody::UserDefined(NodeId(98)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 16107, 16205) }, + Declaration { id: DeclarationId(758), name: Some("normalize".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(742)], output: DeclarationId(742), body: ArrowBody::UserDefined(NodeId(106)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 16963, 17266) }, + Declaration { id: DeclarationId(759), name: Some("nsl_to_list".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1590)], output: DeclarationId(1591), body: ArrowBody::UserDefined(NodeId(112)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17268, 17397) }, + Declaration { id: DeclarationId(760), name: Some("drop_zero".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1592)], output: DeclarationId(1593), body: ArrowBody::UserDefined(NodeId(125)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17574, 17839) }, + Declaration { id: DeclarationId(761), name: Some("is_zero_constant".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(742)], output: DeclarationId(88), body: ArrowBody::UserDefined(NodeId(135)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17841, 18095) }, + Declaration { id: DeclarationId(762), name: Some("reduce_sum".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1594)], output: DeclarationId(742), body: ArrowBody::UserDefined(NodeId(147)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 18880, 19151) }, + Declaration { id: DeclarationId(763), name: Some("wrap_sum".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1595)], output: DeclarationId(742), body: ArrowBody::UserDefined(NodeId(159)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 19153, 19428) }, + Declaration { id: DeclarationId(764), name: Some("reduce_product".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1596)], output: DeclarationId(742), body: ArrowBody::UserDefined(NodeId(176)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 19613, 20034) }, + Declaration { id: DeclarationId(765), name: Some("combine_binary_product".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(742), DeclarationId(742)], output: DeclarationId(742), body: ArrowBody::UserDefined(NodeId(185)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 20199, 20586) }, + Declaration { id: DeclarationId(766), name: Some("combine_linear_with".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(740), DeclarationId(742), DeclarationId(742)], output: DeclarationId(742), body: ArrowBody::UserDefined(NodeId(194)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 20588, 20997) }, + Declaration { id: DeclarationId(767), name: Some("collapse_linear_square".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(740), DeclarationId(740), DeclarationId(742), DeclarationId(742)], output: DeclarationId(742), body: ArrowBody::UserDefined(NodeId(199)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 20999, 21215) }, + Declaration { id: DeclarationId(768), name: Some("polynomial_square".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(740)], output: DeclarationId(742), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/algebra.dag", 21271, 21321)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21217, 21321) }, + Declaration { id: DeclarationId(769), name: Some("product_pair".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(742), DeclarationId(742)], output: DeclarationId(742), body: ArrowBody::UserDefined(NodeId(202)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21323, 21421) }, + Declaration { id: DeclarationId(770), name: Some("fold_or_dominate_scan".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(743), DeclarationId(742)], output: DeclarationId(743), body: ArrowBody::UserDefined(NodeId(209)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21423, 21572) }, + Declaration { id: DeclarationId(771), name: Some("scan_hit".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(743)], output: DeclarationId(88), body: ArrowBody::UserDefined(NodeId(211)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21574, 21629) }, + Declaration { id: DeclarationId(772), name: Some("filter_not_dominated_by".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1597), DeclarationId(742)], output: DeclarationId(1598), body: ArrowBody::UserDefined(NodeId(224)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21631, 21993) }, + Declaration { id: DeclarationId(773), name: Some("drop_dominated_step".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1599), DeclarationId(742)], output: DeclarationId(1600), body: ArrowBody::UserDefined(NodeId(231)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21995, 22237) }, + Declaration { id: DeclarationId(774), name: Some("drop_dominated".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1601)], output: DeclarationId(1602), body: ArrowBody::UserDefined(NodeId(234)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 22425, 22537) }, + Declaration { id: DeclarationId(775), name: Some("CleanEmissionContract".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "expression_wrapping".to_string(), ty: DeclarationId(777) }, Field { label: "pattern_bindings".to_string(), ty: DeclarationId(778) }, Field { label: "variant_payload_field_access".to_string(), ty: DeclarationId(779) }, Field { label: "imports".to_string(), ty: DeclarationId(780) }, Field { label: "block_return".to_string(), ty: DeclarationId(781) }, Field { label: "variable_bindings".to_string(), ty: DeclarationId(782) }, Field { label: "match_arm_body".to_string(), ty: DeclarationId(783) }, Field { label: "correction_style".to_string(), ty: DeclarationId(784) }, Field { label: "post_emit_verifier".to_string(), ty: DeclarationId(785) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 562, 944) }, + Declaration { id: DeclarationId(776), name: Some("TargetCleanEmissionBinding".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "language".to_string(), ty: DeclarationId(878) }, Field { label: "clean_emission".to_string(), ty: DeclarationId(775) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 1748, 1848) }, + Declaration { id: DeclarationId(777), name: Some("ExpressionWrappingRule".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "WrapEverything".to_string(), ty: DeclarationId(1647) }, Field { label: "WrapOnlyInOperandPosition".to_string(), ty: DeclarationId(1648) }, Field { label: "NoWrapping".to_string(), ty: DeclarationId(1649) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 2192, 2283) }, + Declaration { id: DeclarationId(778), name: Some("PatternBindingRule".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "EmitBindingAlways".to_string(), ty: DeclarationId(1650) }, Field { label: "EmitUnderscoreWhenUnused".to_string(), ty: DeclarationId(1651) }, Field { label: "EmitPrefixedUnderscoreWhenUnused".to_string(), ty: DeclarationId(1652) }, Field { label: "NotApplicablePatternBinding".to_string(), ty: DeclarationId(1653) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 2520, 2663) }, + Declaration { id: DeclarationId(779), name: Some("VariantPayloadFieldAccessRule".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "AccessFromPayloadBinding".to_string(), ty: DeclarationId(1654) }, Field { label: "OverrideNamedFieldsAtBindingSite".to_string(), ty: DeclarationId(1655) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3330, 3430) }, + Declaration { id: DeclarationId(780), name: Some("ImportRule".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ImportEverythingDeclared".to_string(), ty: DeclarationId(1656) }, Field { label: "IncludeOnlyReferenced".to_string(), ty: DeclarationId(1657) }, Field { label: "ImportPerUsageSite".to_string(), ty: DeclarationId(1658) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3544, 3637) }, + Declaration { id: DeclarationId(781), name: Some("BlockReturnRule".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "WrapReturnValue".to_string(), ty: DeclarationId(1659) }, Field { label: "NoWrappingOnTerminalExpression".to_string(), ty: DeclarationId(1660) }, Field { label: "ExplicitReturnKeyword".to_string(), ty: DeclarationId(1661) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3756, 3857) }, + Declaration { id: DeclarationId(782), name: Some("VariableBindingRule".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "EmitLetBindingAlways".to_string(), ty: DeclarationId(1662) }, Field { label: "EmitLetUnderscoreWhenUnused".to_string(), ty: DeclarationId(1663) }, Field { label: "OmitLetBinding".to_string(), ty: DeclarationId(1664) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3995, 4095) }, + Declaration { id: DeclarationId(783), name: Some("MatchArmBodyRule".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "WrapBody".to_string(), ty: DeclarationId(1665) }, Field { label: "NoWrappingOnNonComplexBody".to_string(), ty: DeclarationId(1666) }, Field { label: "NotApplicableMatchArmBody".to_string(), ty: DeclarationId(1667) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 4328, 4423) }, + Declaration { id: DeclarationId(784), name: Some("CorrectionStyle".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "indent_unit".to_string(), ty: DeclarationId(186) }, Field { label: "line_ending".to_string(), ty: DeclarationId(186) }, Field { label: "string_quote".to_string(), ty: DeclarationId(186) }, Field { label: "trailing_semicolon".to_string(), ty: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 4736, 4854) }, + Declaration { id: DeclarationId(785), name: Some("PostEmitVerifier".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "command".to_string(), ty: DeclarationId(186) }, Field { label: "args".to_string(), ty: DeclarationId(1668) }, Field { label: "syntax_only".to_string(), ty: DeclarationId(88) }, Field { label: "expected_exit_code".to_string(), ty: DeclarationId(71) }, Field { label: "output_policy".to_string(), ty: DeclarationId(786) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 5270, 5418) }, + Declaration { id: DeclarationId(786), name: Some("VerifierOutputPolicy".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "IgnoreVerifierOutput".to_string(), ty: DeclarationId(1669) }, Field { label: "RequireEmptyStdout".to_string(), ty: DeclarationId(1670) }, Field { label: "RequireEmptyStderr".to_string(), ty: DeclarationId(1671) }, Field { label: "RequireEmptyStdoutAndStderr".to_string(), ty: DeclarationId(1672) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 5663, 5791) }, + Declaration { id: DeclarationId(787), name: Some("SizeBound".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "CollectionSize".to_string(), ty: DeclarationId(1677) }, Field { label: "ParserStreamSize".to_string(), ty: DeclarationId(1678) }, Field { label: "WorklistDrainSize".to_string(), ty: DeclarationId(1679) }, Field { label: "TreeSize".to_string(), ty: DeclarationId(1680) }, Field { label: "ArithmeticParam".to_string(), ty: DeclarationId(1681) }, Field { label: "ExplicitCountZero".to_string(), ty: DeclarationId(1682) }, Field { label: "ExplicitCountPositive".to_string(), ty: DeclarationId(1683) }, Field { label: "Forever".to_string(), ty: DeclarationId(1684) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1337, 1633) }, + Declaration { id: DeclarationId(788), name: Some("tree_size_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(787), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/computation.dag", 1682, 1713)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1635, 1713) }, + Declaration { id: DeclarationId(789), name: Some("positive_descent_count".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(956)], output: DeclarationId(71), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/computation.dag", 1778, 1893)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1715, 1893) }, + Declaration { id: DeclarationId(790), name: Some("CallPattern".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ChildAccessorCall".to_string(), ty: DeclarationId(1685) }, Field { label: "CollectionShrinkCall".to_string(), ty: DeclarationId(1686) }, Field { label: "ArithmeticSubtractCall".to_string(), ty: DeclarationId(1687) }, Field { label: "ArithmeticDivideCall".to_string(), ty: DeclarationId(1688) }, Field { label: "ParserAdvanceCall".to_string(), ty: DeclarationId(1689) }, Field { label: "WorklistDrainCall".to_string(), ty: DeclarationId(1690) }, Field { label: "FoldBodyCall".to_string(), ty: DeclarationId(1691) }, Field { label: "SameArgumentCall".to_string(), ty: DeclarationId(1692) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2144, 2591) }, + Declaration { id: DeclarationId(791), name: Some("ShrinkFactor".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "UnitShrink".to_string(), ty: DeclarationId(1693) }, Field { label: "ConstantShrink".to_string(), ty: DeclarationId(1694) }, Field { label: "ProportionalShrink".to_string(), ty: DeclarationId(1695) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2781, 2921) }, + Declaration { id: DeclarationId(792), name: Some("IterationPrimitive".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Fold".to_string(), ty: DeclarationId(1696) }, Field { label: "Descend".to_string(), ty: DeclarationId(1697) }, Field { label: "Repeat".to_string(), ty: DeclarationId(1698) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 3083, 3138) }, + Declaration { id: DeclarationId(793), name: Some("LoweringTarget".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "primitive".to_string(), ty: DeclarationId(792) }, Field { label: "bound".to_string(), ty: DeclarationId(787) }, Field { label: "evidence".to_string(), ty: DeclarationId(948) }, Field { label: "factor".to_string(), ty: DeclarationId(1699) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 3330, 3456) }, + Declaration { id: DeclarationId(794), name: Some("lower_call_pattern".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(790)], output: DeclarationId(793), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/computation.dag", 3767, 5318)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 3705, 5318) }, + Declaration { id: DeclarationId(795), name: Some("size_bound_param".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(787)], output: DeclarationId(1673), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/computation.dag", 5369, 5794)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 5320, 5794) }, + Declaration { id: DeclarationId(796), name: Some("is_constant_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(787)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/computation.dag", 5843, 6014)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 5796, 6014) }, + Declaration { id: DeclarationId(797), name: Some("forever_iteration_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(71), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/computation.dag", 6131, 6154)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 6095, 6154) }, + Declaration { id: DeclarationId(798), name: Some("constant_bound_value".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(787)], output: DeclarationId(1674), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/computation.dag", 6297, 6569)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 6247, 6569) }, + Declaration { id: DeclarationId(799), name: Some("IterationDimension".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "TreeDescent".to_string(), ty: DeclarationId(1700) }, Field { label: "CollectionFold".to_string(), ty: DeclarationId(1701) }, Field { label: "ArithmeticRepeat".to_string(), ty: DeclarationId(1702) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 7054, 7237) }, + Declaration { id: DeclarationId(800), name: Some("algebra_profile_to_dimension".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(47)], output: DeclarationId(1675), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/computation.dag", 7370, 7863)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 7290, 7863) }, + Declaration { id: DeclarationId(801), name: Some("type_iteration_dimension".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(1676), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/computation.dag", 7935, 8154)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 7865, 8154) }, + Declaration { id: DeclarationId(802), name: Some("Mutability".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Immutable".to_string(), ty: DeclarationId(1703) }, Field { label: "Mutable".to_string(), ty: DeclarationId(1704) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 340, 381) }, + Declaration { id: DeclarationId(803), name: Some("Purity".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Pure".to_string(), ty: DeclarationId(1705) }, Field { label: "Effectful".to_string(), ty: DeclarationId(1706) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 598, 632) }, + Declaration { id: DeclarationId(804), name: Some("Structure".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ExplicitDAG".to_string(), ty: DeclarationId(1707) }, Field { label: "Arbitrary".to_string(), ty: DeclarationId(1708) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 891, 935) }, + Declaration { id: DeclarationId(805), name: Some("Iteration".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Bounded".to_string(), ty: DeclarationId(1709) }, Field { label: "Unbounded".to_string(), ty: DeclarationId(1710) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 1147, 1187) }, + Declaration { id: DeclarationId(806), name: Some("ComputationModel".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "mutability".to_string(), ty: DeclarationId(802) }, Field { label: "purity".to_string(), ty: DeclarationId(803) }, Field { label: "structure".to_string(), ty: DeclarationId(804) }, Field { label: "iteration".to_string(), ty: DeclarationId(805) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 1387, 1500) }, + Declaration { id: DeclarationId(807), name: Some("dag_model".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(806), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(806)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("mutability".to_string(), FieldValue::Variant { constructor: DeclarationId(1703), payload: vec![] }), ("purity".to_string(), FieldValue::Variant { constructor: DeclarationId(1705), payload: vec![] }), ("structure".to_string(), FieldValue::Variant { constructor: DeclarationId(1707), payload: vec![] }), ("iteration".to_string(), FieldValue::Variant { constructor: DeclarationId(1709), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 1502, 1625) }, + Declaration { id: DeclarationId(808), name: Some("MemoryModel".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ValueOnly".to_string(), ty: DeclarationId(1711) }, Field { label: "GarbageCollected".to_string(), ty: DeclarationId(1712) }, Field { label: "RefCounted".to_string(), ty: DeclarationId(1713) }, Field { label: "OwnershipBased".to_string(), ty: DeclarationId(1714) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2014, 2099) }, + Declaration { id: DeclarationId(809), name: Some("ScopeModel".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "LexicalScoping".to_string(), ty: DeclarationId(1715) }, Field { label: "DynamicScoping".to_string(), ty: DeclarationId(1716) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2365, 2418) }, + Declaration { id: DeclarationId(810), name: Some("TargetExecutionModel".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "memory".to_string(), ty: DeclarationId(808) }, Field { label: "scope".to_string(), ty: DeclarationId(809) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2561, 2632) }, + Declaration { id: DeclarationId(811), name: Some("SourceFiltering".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "excluded_prefixes".to_string(), ty: DeclarationId(1717) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2774, 2832) }, + Declaration { id: DeclarationId(812), name: Some("ShapeATargetSourceFiltering".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "internal".to_string(), ty: DeclarationId(811) }, Field { label: "additional_excluded_prefixes".to_string(), ty: DeclarationId(1718) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 3115, 3224) }, + Declaration { id: DeclarationId(813), name: Some("internal_source_filtering".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(811), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(811)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("excluded_prefixes".to_string(), FieldValue::List(vec![FieldValue::Literal(LiteralBits::String("dsl/std/".to_string())), FieldValue::Literal(LiteralBits::String("dsl/extdeps/".to_string())), FieldValue::Literal(LiteralBits::String("src/v3/std/".to_string())), FieldValue::Literal(LiteralBits::String("src/v3/spec/".to_string()))]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 3226, 3381) }, + Declaration { id: DeclarationId(814), name: Some("ExecutionModelRequirement".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "OwnershipBased".to_string(), ty: DeclarationId(1719) }, Field { label: "GarbageCollected".to_string(), ty: DeclarationId(1720) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 3659, 3729) }, + Declaration { id: DeclarationId(815), name: Some("CompilerDiagnosticKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "TokenizerError".to_string(), ty: DeclarationId(1721) }, Field { label: "ParseError".to_string(), ty: DeclarationId(1722) }, Field { label: "TypeMismatch".to_string(), ty: DeclarationId(1723) }, Field { label: "UnitMismatch".to_string(), ty: DeclarationId(1724) }, Field { label: "ArityMismatch".to_string(), ty: DeclarationId(1725) }, Field { label: "ResolveError".to_string(), ty: DeclarationId(1726) }, Field { label: "NominalOpacityViolation".to_string(), ty: DeclarationId(1727) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 990, 1148) }, + Declaration { id: DeclarationId(816), name: Some("Correction".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "description".to_string(), ty: DeclarationId(186) }, Field { label: "span".to_string(), ty: DeclarationId(121) }, Field { label: "new_source".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 1354, 1607) }, + Declaration { id: DeclarationId(817), name: Some("DiagnosticKindDecl".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "payload".to_string(), ty: DeclarationId(682) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 2387, 2450) }, + Declaration { id: DeclarationId(818), name: Some("LensInstanceKindWitness".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "kind_decl".to_string(), ty: DeclarationId(1001) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 4652, 4712) }, + Declaration { id: DeclarationId(819), name: Some("AnyDiagnosticKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "CompilerKind".to_string(), ty: DeclarationId(1728) }, Field { label: "LensInstanceKind".to_string(), ty: DeclarationId(1729) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 5321, 5430) }, + Declaration { id: DeclarationId(820), name: Some("Diagnostic".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "kind".to_string(), ty: DeclarationId(819) }, Field { label: "span".to_string(), ty: DeclarationId(121) }, Field { label: "message".to_string(), ty: DeclarationId(186) }, Field { label: "fixes".to_string(), ty: DeclarationId(1730) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 5799, 5907) }, + Declaration { id: DeclarationId(821), name: Some("Witness".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Inhabits".to_string(), ty: DeclarationId(1745) }, Field { label: "Violates".to_string(), ty: DeclarationId(1746) }] }, type_params: vec![DeclarationId(822)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 1600, 1689) }, + Declaration { id: DeclarationId(822), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Carrier".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 1600, 1689) }, + Declaration { id: DeclarationId(823), name: Some("OptionalDiagnostic".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "NoDiagnostic".to_string(), ty: DeclarationId(1747) }, Field { label: "SomeDiagnostic".to_string(), ty: DeclarationId(1748) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 1843, 1924) }, + Declaration { id: DeclarationId(824), name: Some("DimensionReport".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "DimensionOk".to_string(), ty: DeclarationId(1751) }, Field { label: "DimensionFail".to_string(), ty: DeclarationId(1755) }] }, type_params: vec![DeclarationId(825)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 2283, 2559) }, + Declaration { id: DeclarationId(825), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Carrier".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 2283, 2559) }, + Declaration { id: DeclarationId(826), name: Some("AnalysisDimension".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "witness_of".to_string(), ty: DeclarationId(1757) }, Field { label: "compose".to_string(), ty: DeclarationId(1758) }, Field { label: "identity".to_string(), ty: DeclarationId(827) }, Field { label: "break_diagnostic".to_string(), ty: DeclarationId(1759) }] }, type_params: vec![DeclarationId(827)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 3132, 3361) }, + Declaration { id: DeclarationId(827), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Carrier".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 3132, 3361) }, + Declaration { id: DeclarationId(828), name: Some("Dimension".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "value".to_string(), ty: DeclarationId(830) }] }, type_params: vec![DeclarationId(829), DeclarationId(830)], phantom_params: vec![PhantomParameter { parameter: DeclarationId(829), algebra: DeclarationId(1760) }], meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4002, 4052) }, + Declaration { id: DeclarationId(829), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Unit".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4002, 4052) }, + Declaration { id: DeclarationId(830), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Carrier".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4002, 4052) }, + Declaration { id: DeclarationId(831), name: Some("Meters".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4054, 4065) }, + Declaration { id: DeclarationId(832), name: Some("Seconds".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4066, 4078) }, + Declaration { id: DeclarationId(833), name: Some("Kilograms".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4079, 4093) }, + Declaration { id: DeclarationId(834), name: Some("Amperes".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4094, 4106) }, + Declaration { id: DeclarationId(835), name: Some("Kelvin".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4107, 4118) }, + Declaration { id: DeclarationId(836), name: Some("Moles".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4119, 4129) }, + Declaration { id: DeclarationId(837), name: Some("Candela".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4130, 4142) }, + Declaration { id: DeclarationId(838), name: Some("add_dimension".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1731), DeclarationId(1732), DeclarationId(1733)], output: DeclarationId(1734), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/dimensions.dag", 4316, 4338)) }, type_params: vec![DeclarationId(839), DeclarationId(840)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4144, 4338) }, + Declaration { id: DeclarationId(839), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Unit".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4144, 4338) }, + Declaration { id: DeclarationId(840), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Carrier".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4144, 4338) }, + Declaration { id: DeclarationId(841), name: Some("sub_dimension".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1735), DeclarationId(1736), DeclarationId(1737)], output: DeclarationId(1738), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/dimensions.dag", 4512, 4534)) }, type_params: vec![DeclarationId(842), DeclarationId(843)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4340, 4534) }, + Declaration { id: DeclarationId(842), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Unit".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4340, 4534) }, + Declaration { id: DeclarationId(843), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Carrier".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4340, 4534) }, + Declaration { id: DeclarationId(844), name: Some("mul_dimension_scalar".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1739), DeclarationId(1740), DeclarationId(846)], output: DeclarationId(1741), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/dimensions.dag", 4700, 4729)) }, type_params: vec![DeclarationId(845), DeclarationId(846)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4536, 4729) }, + Declaration { id: DeclarationId(845), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Unit".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4536, 4729) }, + Declaration { id: DeclarationId(846), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Carrier".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4536, 4729) }, + Declaration { id: DeclarationId(847), name: Some("div_dimension_scalar".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1742), DeclarationId(1743), DeclarationId(849)], output: DeclarationId(1744), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/dimensions.dag", 4895, 4924)) }, type_params: vec![DeclarationId(848), DeclarationId(849)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4731, 4924) }, + Declaration { id: DeclarationId(848), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Unit".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4731, 4924) }, + Declaration { id: DeclarationId(849), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("Carrier".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4731, 4924) }, + Declaration { id: DeclarationId(850), name: Some("TypeRealization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "language".to_string(), ty: DeclarationId(1001) }, Field { label: "target".to_string(), ty: DeclarationId(1001) }, Field { label: "carrier".to_string(), ty: DeclarationId(186) }, Field { label: "is_copy".to_string(), ty: DeclarationId(88) }, Field { label: "fields".to_string(), ty: DeclarationId(1761) }, Field { label: "cost".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 696, 847) }, + Declaration { id: DeclarationId(851), name: Some("FieldBinding".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "dag_name".to_string(), ty: DeclarationId(186) }, Field { label: "access".to_string(), ty: DeclarationId(852) }, Field { label: "borrowed_read".to_string(), ty: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 849, 933) }, + Declaration { id: DeclarationId(852), name: Some("FieldAccess".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "DirectField".to_string(), ty: DeclarationId(1762) }, Field { label: "AccessorMethod".to_string(), ty: DeclarationId(1763) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 1316, 1383) }, + Declaration { id: DeclarationId(853), name: Some("OperatorRealization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "language".to_string(), ty: DeclarationId(1001) }, Field { label: "target".to_string(), ty: DeclarationId(1001) }, Field { label: "op".to_string(), ty: DeclarationId(1001) }, Field { label: "carrier".to_string(), ty: DeclarationId(186) }, Field { label: "cost".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 1385, 1516) }, + Declaration { id: DeclarationId(854), name: Some("BehaviorRealization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "language".to_string(), ty: DeclarationId(1001) }, Field { label: "target".to_string(), ty: DeclarationId(1001) }, Field { label: "carrier".to_string(), ty: DeclarationId(186) }, Field { label: "cost".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 1518, 1628) }, + Declaration { id: DeclarationId(855), name: Some("CallableRealization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "language".to_string(), ty: DeclarationId(1001) }, Field { label: "target".to_string(), ty: DeclarationId(1001) }, Field { label: "strategy".to_string(), ty: DeclarationId(859) }, Field { label: "parameters".to_string(), ty: DeclarationId(1764) }, Field { label: "cost".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 1630, 1789) }, + Declaration { id: DeclarationId(856), name: Some("CallableParameter".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "slot".to_string(), ty: DeclarationId(71) }, Field { label: "disposition".to_string(), ty: DeclarationId(857) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 2211, 2285) }, + Declaration { id: DeclarationId(857), name: Some("ParameterDisposition".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Borrowed".to_string(), ty: DeclarationId(1765) }, Field { label: "Consumed".to_string(), ty: DeclarationId(1766) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 2742, 2793) }, + Declaration { id: DeclarationId(858), name: Some("TypeInstantiationRealization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "language".to_string(), ty: DeclarationId(1001) }, Field { label: "target".to_string(), ty: DeclarationId(1001) }, Field { label: "carrier".to_string(), ty: DeclarationId(186) }, Field { label: "cost".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 2795, 2914) }, + Declaration { id: DeclarationId(859), name: Some("CallableStrategy".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ListEmpty".to_string(), ty: DeclarationId(1767) }, Field { label: "ListSingleton".to_string(), ty: DeclarationId(1768) }, Field { label: "ListCons".to_string(), ty: DeclarationId(1769) }, Field { label: "ListConcat".to_string(), ty: DeclarationId(1770) }, Field { label: "ListLength".to_string(), ty: DeclarationId(1771) }, Field { label: "ListIsEmpty".to_string(), ty: DeclarationId(1772) }, Field { label: "ListFold".to_string(), ty: DeclarationId(1773) }, Field { label: "ListMap".to_string(), ty: DeclarationId(1774) }, Field { label: "ListFilter".to_string(), ty: DeclarationId(1775) }, Field { label: "ListContains".to_string(), ty: DeclarationId(1776) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3319, 3488) }, + Declaration { id: DeclarationId(860), name: Some("PatternRealization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "language".to_string(), ty: DeclarationId(1001) }, Field { label: "target".to_string(), ty: DeclarationId(1001) }, Field { label: "strategy".to_string(), ty: DeclarationId(861) }, Field { label: "empty_variant".to_string(), ty: DeclarationId(1001) }, Field { label: "cons_variant".to_string(), ty: DeclarationId(1001) }, Field { label: "scrutinee".to_string(), ty: DeclarationId(186) }, Field { label: "empty_pattern".to_string(), ty: DeclarationId(186) }, Field { label: "cons_pattern".to_string(), ty: DeclarationId(186) }, Field { label: "head_expr".to_string(), ty: DeclarationId(186) }, Field { label: "tail_expr".to_string(), ty: DeclarationId(186) }, Field { label: "cost".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 5427, 5716) }, + Declaration { id: DeclarationId(861), name: Some("PatternStrategy".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "PlaceholderPatternStrategy".to_string(), ty: DeclarationId(1777) }, Field { label: "VectorList".to_string(), ty: DeclarationId(1778) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6156, 6222) }, + Declaration { id: DeclarationId(862), name: Some("StatementSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "let_binding".to_string(), ty: DeclarationId(186) }, Field { label: "let_binding_inferred".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6224, 6301) }, + Declaration { id: DeclarationId(863), name: Some("ExpressionSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "field_access".to_string(), ty: DeclarationId(186) }, Field { label: "function_call".to_string(), ty: DeclarationId(186) }, Field { label: "closure".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6303, 6393) }, + Declaration { id: DeclarationId(864), name: Some("ForEachSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "prefix".to_string(), ty: DeclarationId(186) }, Field { label: "separator".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6395, 6454) }, + Declaration { id: DeclarationId(865), name: Some("ControlFlowSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "if_else".to_string(), ty: DeclarationId(186) }, Field { label: "match_arm".to_string(), ty: DeclarationId(186) }, Field { label: "for_each_syntax".to_string(), ty: DeclarationId(864) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6456, 6553) }, + Declaration { id: DeclarationId(866), name: Some("LiteralSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "true_keyword".to_string(), ty: DeclarationId(186) }, Field { label: "false_keyword".to_string(), ty: DeclarationId(186) }, Field { label: "string_delimiter".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6555, 6651) }, + Declaration { id: DeclarationId(867), name: Some("ModuleSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "path_separator".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6653, 6699) }, + Declaration { id: DeclarationId(868), name: Some("FunctionSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "definition".to_string(), ty: DeclarationId(186) }, Field { label: "definition_exported".to_string(), ty: DeclarationId(186) }, Field { label: "definition_void".to_string(), ty: DeclarationId(186) }, Field { label: "param_with_type".to_string(), ty: DeclarationId(186) }, Field { label: "param_separator".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6701, 6853) }, + Declaration { id: DeclarationId(869), name: Some("TypeApplicationSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "optional".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6855, 6904) }, + Declaration { id: DeclarationId(870), name: Some("TypeDefinitionSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "struct_def".to_string(), ty: DeclarationId(186) }, Field { label: "struct_field".to_string(), ty: DeclarationId(186) }, Field { label: "enum_def".to_string(), ty: DeclarationId(186) }, Field { label: "enum_unit_variant".to_string(), ty: DeclarationId(186) }, Field { label: "enum_data_variant".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 7118, 7266) }, + Declaration { id: DeclarationId(871), name: Some("RecordDeriveTemplateBundle".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "struct_def_no_debug".to_string(), ty: DeclarationId(186) }, Field { label: "enum_def_no_debug".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 7927, 8020) }, + Declaration { id: DeclarationId(872), name: Some("PatternMatchSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "match_expr".to_string(), ty: DeclarationId(186) }, Field { label: "match_arm".to_string(), ty: DeclarationId(186) }, Field { label: "variant_pattern".to_string(), ty: DeclarationId(186) }, Field { label: "variant_pattern_positional".to_string(), ty: DeclarationId(186) }, Field { label: "variant_pattern_empty".to_string(), ty: DeclarationId(186) }, Field { label: "field_binding".to_string(), ty: DeclarationId(186) }, Field { label: "field_binding_separator".to_string(), ty: DeclarationId(186) }, Field { label: "wildcard".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 8724, 8964) }, + Declaration { id: DeclarationId(873), name: Some("CollectionOps".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "concat".to_string(), ty: DeclarationId(186) }, Field { label: "length".to_string(), ty: DeclarationId(186) }, Field { label: "is_empty".to_string(), ty: DeclarationId(186) }, Field { label: "fold".to_string(), ty: DeclarationId(186) }, Field { label: "map".to_string(), ty: DeclarationId(186) }, Field { label: "filter".to_string(), ty: DeclarationId(186) }, Field { label: "contains".to_string(), ty: DeclarationId(186) }, Field { label: "empty_list".to_string(), ty: DeclarationId(186) }, Field { label: "list_literal".to_string(), ty: DeclarationId(186) }, Field { label: "cons".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 8966, 9165) }, + Declaration { id: DeclarationId(874), name: Some("ValueConstructionSyntax".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "struct_literal".to_string(), ty: DeclarationId(186) }, Field { label: "struct_field_init".to_string(), ty: DeclarationId(186) }, Field { label: "struct_field_separator".to_string(), ty: DeclarationId(186) }, Field { label: "variant_construction".to_string(), ty: DeclarationId(186) }, Field { label: "variant_named_construction".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 9167, 9353) }, + Declaration { id: DeclarationId(875), name: Some("RenderingModel".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "read".to_string(), ty: DeclarationId(876) }, Field { label: "construct".to_string(), ty: DeclarationId(877) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 9355, 9430) }, + Declaration { id: DeclarationId(876), name: Some("ReadStrategy".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Borrow".to_string(), ty: DeclarationId(1779) }, Field { label: "PassByValue".to_string(), ty: DeclarationId(1780) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 9928, 9972) }, + Declaration { id: DeclarationId(877), name: Some("ConstructStrategy".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "CopyOrClone".to_string(), ty: DeclarationId(1781) }, Field { label: "PassByValue".to_string(), ty: DeclarationId(1782) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 10265, 10319) }, + Declaration { id: DeclarationId(878), name: Some("LanguageSpec".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "statements".to_string(), ty: DeclarationId(1001) }, Field { label: "expressions".to_string(), ty: DeclarationId(1001) }, Field { label: "control_flow".to_string(), ty: DeclarationId(1001) }, Field { label: "literals".to_string(), ty: DeclarationId(1001) }, Field { label: "modules".to_string(), ty: DeclarationId(1001) }, Field { label: "functions".to_string(), ty: DeclarationId(1001) }, Field { label: "type_applications".to_string(), ty: DeclarationId(1001) }, Field { label: "type_definitions".to_string(), ty: DeclarationId(1001) }, Field { label: "record_derive_templates".to_string(), ty: DeclarationId(1001) }, Field { label: "patterns".to_string(), ty: DeclarationId(1001) }, Field { label: "collection_ops".to_string(), ty: DeclarationId(1001) }, Field { label: "values".to_string(), ty: DeclarationId(1001) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 10321, 10847) }, + Declaration { id: DeclarationId(879), name: Some("PlaceholderConvention".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "IndexedArgs".to_string(), ty: DeclarationId(1783) }, Field { label: "NamedArg".to_string(), ty: DeclarationId(1784) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 12221, 12276) }, + Declaration { id: DeclarationId(880), name: Some("MethodTemplateContract".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "dag_method".to_string(), ty: DeclarationId(736) }, Field { label: "runtime_template".to_string(), ty: DeclarationId(186) }, Field { label: "emit_template".to_string(), ty: DeclarationId(186) }, Field { label: "wraps_result".to_string(), ty: DeclarationId(88) }, Field { label: "placeholder_convention".to_string(), ty: DeclarationId(879) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 14069, 14244) }, + Declaration { id: DeclarationId(881), name: Some("BootstrapFixture".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "virtual_path".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/extdeps_bootstrap_fixtures.dag", 1395, 1443) }, + Declaration { id: DeclarationId(882), name: Some("BootstrapFixtureSet".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "rust_pilot_primitives".to_string(), ty: DeclarationId(881) }, Field { label: "rust_method_template_contracts".to_string(), ty: DeclarationId(881) }, Field { label: "python_method_template_contracts".to_string(), ty: DeclarationId(881) }, Field { label: "go_method_template_contracts".to_string(), ty: DeclarationId(881) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/extdeps_bootstrap_fixtures.dag", 1600, 1823) }, + Declaration { id: DeclarationId(883), name: Some("bootstrap_fixture_authority".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(882), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(882)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("rust_pilot_primitives".to_string(), FieldValue::Record(vec![("virtual_path".to_string(), FieldValue::Literal(LiteralBits::String("dsl/extdeps/languages/rust/primitives.dag".to_string())))])), ("rust_method_template_contracts".to_string(), FieldValue::Record(vec![("virtual_path".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/std/rust_method_template_contracts.dag".to_string())))])), ("python_method_template_contracts".to_string(), FieldValue::Record(vec![("virtual_path".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/std/python_method_template_contracts.dag".to_string())))])), ("go_method_template_contracts".to_string(), FieldValue::Record(vec![("virtual_path".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/std/go_method_template_contracts.dag".to_string())))]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/extdeps_bootstrap_fixtures.dag", 1825, 2298) }, + Declaration { id: DeclarationId(884), name: Some("go_method_template_contracts".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(880) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1785)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(214)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("len({recv})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("len({recv})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(226)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("strings.Join({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("strings.Join({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(250)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("strings.Split({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("strings.Split({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(212)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("append({recv}, {arg}...)".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("append({recv}, {arg}...)".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(232)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.Map({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.Map({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(219)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.Filter({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.Filter({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(205)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.Any({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.Any({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(204)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.All({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.All({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(221)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.FlatMap({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.FlatMap({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(248)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[{arg}:]".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[{arg}:]".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(253)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[:{arg}]".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[:{arg}]".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(222)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.Fold({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.Fold({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(249)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.SortBy({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("v2rt.SortBy({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(206)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("append({recv}, {arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("append({recv}, {arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })])])), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/go_method_template_contracts.dag", 2405, 5333) }, + Declaration { id: DeclarationId(885), name: Some("RecursionShape".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "DirectRecursion".to_string(), ty: DeclarationId(1795) }, Field { label: "ListRecursion".to_string(), ty: DeclarationId(1796) }, Field { label: "OptionalRecursion".to_string(), ty: DeclarationId(1797) }, Field { label: "SetRecursion".to_string(), ty: DeclarationId(1798) }, Field { label: "MapValueRecursion".to_string(), ty: DeclarationId(1799) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 5538, 5811) }, + Declaration { id: DeclarationId(886), name: Some("InductiveField".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "type_name".to_string(), ty: DeclarationId(186) }, Field { label: "variant_name".to_string(), ty: DeclarationId(186) }, Field { label: "field_name".to_string(), ty: DeclarationId(186) }, Field { label: "shape".to_string(), ty: DeclarationId(885) }, Field { label: "element_type".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 7103, 7525) }, + Declaration { id: DeclarationId(887), name: Some("recursion_shape_eq".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(885), DeclarationId(885)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 7595, 7967)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 7527, 7967) }, + Declaration { id: DeclarationId(888), name: Some("inductive_field_eq".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(886), DeclarationId(886)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 8037, 8235)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 7969, 8235) }, + Declaration { id: DeclarationId(889), name: Some("inductive_field_to_dimension".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(886), DeclarationId(186)], output: DeclarationId(955), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 8701, 8732)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 8611, 8732) }, + Declaration { id: DeclarationId(890), name: Some("SubValueRelation".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "StrictSubValue".to_string(), ty: DeclarationId(1800) }, Field { label: "IteratedSubValue".to_string(), ty: DeclarationId(1801) }, Field { label: "ArithmeticDescent".to_string(), ty: DeclarationId(1802) }, Field { label: "PreservedValue".to_string(), ty: DeclarationId(1803) }, Field { label: "SubValueUnknown".to_string(), ty: DeclarationId(1804) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 9878, 10114) }, + Declaration { id: DeclarationId(891), name: Some("sub_value_to_evidence".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(890)], output: DeclarationId(948), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 11067, 11670)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 10995, 11670) }, + Declaration { id: DeclarationId(892), name: Some("shrink_factor_eq".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(791), DeclarationId(791)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 12177, 12677)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 12115, 12677) }, + Declaration { id: DeclarationId(893), name: Some("meet_sub_value".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(890), DeclarationId(890)], output: DeclarationId(890), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 13200, 14612)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 13120, 14612) }, + Declaration { id: DeclarationId(894), name: Some("join_sub_value".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(890), DeclarationId(890)], output: DeclarationId(890), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 14944, 16247)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 14864, 16247) }, + Declaration { id: DeclarationId(895), name: Some("compose_sub_value".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(890), DeclarationId(886)], output: DeclarationId(890), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 17356, 17478)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 17268, 17478) }, + Declaration { id: DeclarationId(896), name: Some("compose_sub_value_relations".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(890), DeclarationId(890)], output: DeclarationId(890), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 18334, 19680)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 18226, 19680) }, + Declaration { id: DeclarationId(897), name: Some("sub_value_to_call_pattern".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(890)], output: DeclarationId(1786), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 20455, 21251)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 20382, 21251) }, + Declaration { id: DeclarationId(898), name: Some("sub_value_to_lowering_target".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(890)], output: DeclarationId(1787), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 21843, 22748)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 21764, 22748) }, + Declaration { id: DeclarationId(899), name: Some("PolynomialExponent".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "IntegerExpZero".to_string(), ty: DeclarationId(1805) }, Field { label: "IntegerExpPos".to_string(), ty: DeclarationId(1806) }, Field { label: "FractionExp".to_string(), ty: DeclarationId(1807) }, Field { label: "LogBasedExp".to_string(), ty: DeclarationId(1808) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 23991, 24246) }, + Declaration { id: DeclarationId(900), name: Some("poly_exp_degree_one".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(899), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 24295, 24334)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 24248, 24334) }, + Declaration { id: DeclarationId(901), name: Some("AtomicCost".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "PolyCost".to_string(), ty: DeclarationId(1809) }, Field { label: "LogCost".to_string(), ty: DeclarationId(1810) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 24846, 24963) }, + Declaration { id: DeclarationId(902), name: Some("CostBound".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ConstantBound".to_string(), ty: DeclarationId(1811) }, Field { label: "AtomicBound".to_string(), ty: DeclarationId(1812) }, Field { label: "ProductBound".to_string(), ty: DeclarationId(1814) }, Field { label: "SumOfProductsBound".to_string(), ty: DeclarationId(1817) }, Field { label: "SumBound".to_string(), ty: DeclarationId(1819) }, Field { label: "ForeverBound".to_string(), ty: DeclarationId(1820) }, Field { label: "ErrorBound".to_string(), ty: DeclarationId(1821) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 26593, 27353) }, + Declaration { id: DeclarationId(903), name: Some("sum_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1788)], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 27764, 27870)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 27714, 27870) }, + Declaration { id: DeclarationId(904), name: Some("cost_bound_is_sum_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(902)], output: DeclarationId(88), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 28194, 28447)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 28145, 28447) }, + Declaration { id: DeclarationId(905), name: Some("cost_constant".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 28481, 28498)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 28449, 28498) }, + Declaration { id: DeclarationId(906), name: Some("cost_linear".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 28542, 28626)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 28499, 28626) }, + Declaration { id: DeclarationId(907), name: Some("cost_poly".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(71)], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 28681, 29080)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 28627, 29080) }, + Declaration { id: DeclarationId(908), name: Some("cost_root".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(71)], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 29130, 29404)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 29081, 29404) }, + Declaration { id: DeclarationId(909), name: Some("cost_sqrt".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 29446, 29479)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 29405, 29479) }, + Declaration { id: DeclarationId(910), name: Some("cost_cbrt".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 29521, 29554)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 29480, 29554) }, + Declaration { id: DeclarationId(911), name: Some("cost_log".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 29595, 29645)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 29555, 29645) }, + Declaration { id: DeclarationId(912), name: Some("cost_nlogn".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 29689, 29807)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 29647, 29807) }, + Declaration { id: DeclarationId(913), name: Some("cost_graph_linear".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(186)], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 29877, 30053)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 29809, 30053) }, + Declaration { id: DeclarationId(914), name: Some("RecurrenceForm".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }, Field { label: "branches".to_string(), ty: DeclarationId(71) }, Field { label: "divisor".to_string(), ty: DeclarationId(71) }, Field { label: "work_exponent".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 31210, 31301) }, + Declaration { id: DeclarationId(915), name: Some("int_add_checked".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71), DeclarationId(71)], output: DeclarationId(1789), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 31892, 32143)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 31849, 32143) }, + Declaration { id: DeclarationId(916), name: Some("int_mul_checked".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71), DeclarationId(71)], output: DeclarationId(1790), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 32188, 32977)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 32145, 32977) }, + Declaration { id: DeclarationId(917), name: Some("bounded_int_pow_exponent".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71)], output: DeclarationId(1791), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 33437, 33560)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 33393, 33560) }, + Declaration { id: DeclarationId(918), name: Some("int_pow_bounded".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71), DeclarationId(71)], output: DeclarationId(1792), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 33912, 34957)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 33864, 34957) }, + Declaration { id: DeclarationId(919), name: Some("ceil_log".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71), DeclarationId(71)], output: DeclarationId(1793), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 35175, 35290)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 35129, 35290) }, + Declaration { id: DeclarationId(920), name: Some("ceil_log_iter".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71), DeclarationId(71), DeclarationId(71), DeclarationId(71)], output: DeclarationId(1794), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 35447, 35809)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 35376, 35809) }, + Declaration { id: DeclarationId(921), name: Some("master_theorem".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(914)], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 35864, 37901)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 35811, 37901) }, + Declaration { id: DeclarationId(922), name: Some("catamorphism_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(71)], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 38254, 38412)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 38184, 38412) }, + Declaration { id: DeclarationId(923), name: Some("derive_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(71), DeclarationId(791), DeclarationId(71)], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 38911, 39935)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 38810, 39935) }, + Declaration { id: DeclarationId(924), name: Some("tree_traversal_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 40268, 40325)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 40229, 40325) }, + Declaration { id: DeclarationId(925), name: Some("nested_iteration_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 40368, 40426)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 40327, 40426) }, + Declaration { id: DeclarationId(926), name: Some("linear_scan_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 40526, 40581)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 40490, 40581) }, + Declaration { id: DeclarationId(927), name: Some("binary_search_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 40778, 40893)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 40740, 40893) }, + Declaration { id: DeclarationId(928), name: Some("mergesort_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 40973, 41088)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 40939, 41088) }, + Declaration { id: DeclarationId(929), name: Some("karatsuba_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 41255, 41374)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 41221, 41374) }, + Declaration { id: DeclarationId(930), name: Some("strassen_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 41539, 41653)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 41506, 41653) }, + Declaration { id: DeclarationId(931), name: Some("trial_division_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 41770, 41795)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 41731, 41795) }, + Declaration { id: DeclarationId(932), name: Some("cube_root_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 41830, 41855)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 41796, 41855) }, + Declaration { id: DeclarationId(933), name: Some("kth_root_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71)], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 41937, 41968)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 41898, 41968) }, + Declaration { id: DeclarationId(934), name: Some("bfs_dfs_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 42204, 42255)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 42172, 42255) }, + Declaration { id: DeclarationId(935), name: Some("dijkstra_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 42346, 42628)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 42313, 42628) }, + Declaration { id: DeclarationId(936), name: Some("bellman_ford_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 42731, 42891)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 42694, 42891) }, + Declaration { id: DeclarationId(937), name: Some("floyd_warshall_bound".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(902), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/induction.dag", 42998, 43036)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 42959, 43036) }, + Declaration { id: DeclarationId(938), name: Some("Lens".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "read".to_string(), ty: DeclarationId(1823) }, Field { label: "sequential".to_string(), ty: DeclarationId(1824) }, Field { label: "branch".to_string(), ty: DeclarationId(1825) }, Field { label: "iterate".to_string(), ty: DeclarationId(1826) }, Field { label: "validate".to_string(), ty: DeclarationId(1827) }] }, type_params: vec![DeclarationId(939)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lens.dag", 4121, 4318) }, + Declaration { id: DeclarationId(939), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("C".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lens.dag", 4121, 4318) }, + Declaration { id: DeclarationId(940), name: Some("Lookup".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Miss".to_string(), ty: DeclarationId(1830) }, Field { label: "Hit".to_string(), ty: DeclarationId(1831) }] }, type_params: vec![DeclarationId(941)], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lookup.dag", 4509, 4551) }, + Declaration { id: DeclarationId(941), name: None, connective: TypeConnective::Atom(AtomPayload::TypeParam("value".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lookup.dag", 4509, 4551) }, + Declaration { id: DeclarationId(942), name: Some("miss_int_lookup".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(1828), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/lookup.dag", 4589, 4599)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lookup.dag", 4553, 4599) }, + Declaration { id: DeclarationId(943), name: Some("hit_int_lookup".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71)], output: DeclarationId(1829), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/lookup.dag", 4642, 4654)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lookup.dag", 4601, 4654) }, + Declaration { id: DeclarationId(944), name: Some("python_method_template_contracts".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(880) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1832)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(214)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("len({recv})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("len({recv})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(226)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{arg}.join({recv})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{arg}.join({recv})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(250)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.split({arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.split({arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(228)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[-1] if {recv} else None".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[-1] if {recv} else None".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(220)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[0] if {recv} else None".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[0] if {recv} else None".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(218)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("list(enumerate({recv}))".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("list(enumerate({recv}))".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(208)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("[ord(c) for c in {recv}]".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("[ord(c) for c in {recv}]".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(212)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv} + {arg}".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv} + {arg}".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(232)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("[{arg}(x) for x in {recv}]".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("[{arg}(x) for x in {recv}]".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(219)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("[x for x in {recv} if {arg}(x)]".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("[x for x in {recv} if {arg}(x)]".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(205)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("any({arg}(x) for x in {recv})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("any({arg}(x) for x in {recv})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(204)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("all({arg}(x) for x in {recv})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("all({arg}(x) for x in {recv})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(221)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("[y for x in {recv} for y in {arg}(x)]".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("[y for x in {recv} for y in {arg}(x)]".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(248)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[{arg}:]".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[{arg}:]".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(253)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[:{arg}]".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}[:{arg}]".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(222)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("functools.reduce({arg}, {recv})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("functools.reduce({arg}, {recv})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(249)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("sorted({recv}, key={arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("sorted({recv}, key={arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(206)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv} + [{arg}]".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv} + [{arg}]".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })])])), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/python_method_template_contracts.dag", 2053, 5846) }, + Declaration { id: DeclarationId(945), name: Some("ResourceHandle".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "type".to_string(), ty: DeclarationId(186) }, Field { label: "resource_id".to_string(), ty: DeclarationId(186) }, Field { label: "key".to_string(), ty: DeclarationId(186) }, Field { label: "cap".to_string(), ty: DeclarationId(107) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/resources.dag", 739, 827) }, + Declaration { id: DeclarationId(946), name: Some("ResourceReference".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "target".to_string(), ty: DeclarationId(1001) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/resources.dag", 829, 880) }, + Declaration { id: DeclarationId(947), name: Some("rust_method_template_contracts".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(880) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1833)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(214)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.len()".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("({recv}.len() as i64)".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(226)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.join(&{arg})".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.join(&{arg})".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(250)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.split(&{arg}).map(|s| s.to_string()).collect::>()".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.split(&{arg}).map(|s| s.to_string()).collect::>()".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(228)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.last().cloned()".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.last().cloned()".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(220)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.first().cloned()".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.first().cloned()".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(218)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.iter().enumerate().map(|(i, v)| (i, v.clone())).collect::>()".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(208)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.chars().map(|c| c as i64).collect::>()".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.chars().map(|c| c as i64).collect::>()".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(248)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.iter().cloned().skip({arg} as usize).collect::>()".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.iter().cloned().skip({arg} as usize).collect::>()".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })]), FieldValue::Record(vec![("dag_method".to_string(), FieldValue::Record(vec![("decl".to_string(), FieldValue::Reference(DeclarationId(253)))])), ("runtime_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.iter().cloned().take({arg} as usize).collect::>()".to_string()))), ("emit_template".to_string(), FieldValue::Literal(LiteralBits::String("{recv}.iter().cloned().take({arg} as usize).collect::>()".to_string()))), ("wraps_result".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("placeholder_convention".to_string(), FieldValue::Variant { constructor: DeclarationId(1784), payload: vec![] })])])), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/rust_method_template_contracts.dag", 4006, 6310) }, + Declaration { id: DeclarationId(948), name: Some("DescentEvidence".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Strict".to_string(), ty: DeclarationId(1841) }, Field { label: "NonIncreasing".to_string(), ty: DeclarationId(1842) }, Field { label: "DescentUnknown".to_string(), ty: DeclarationId(1843) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 642, 710) }, + Declaration { id: DeclarationId(949), name: Some("evidence_rank".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(948)], output: DeclarationId(71), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 756, 838)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 712, 838) }, + Declaration { id: DeclarationId(950), name: Some("merge_evidence".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(948), DeclarationId(948)], output: DeclarationId(948), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 982, 1310)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 905, 1310) }, + Declaration { id: DeclarationId(951), name: Some("join_evidence".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(948), DeclarationId(948)], output: DeclarationId(948), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 1456, 1655)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 1380, 1655) }, + Declaration { id: DeclarationId(952), name: Some("promote_to_strict".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(948)], output: DeclarationId(948), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 2117, 2236)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 2050, 2236) }, + Declaration { id: DeclarationId(953), name: Some("optional_evidence_meet".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1834), DeclarationId(1835)], output: DeclarationId(1836), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 2388, 2564)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 2300, 2564) }, + Declaration { id: DeclarationId(954), name: Some("map_evidence_merge_at".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1837), DeclarationId(186), DeclarationId(948)], output: DeclarationId(1838), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 2733, 2907)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 2601, 2907) }, + Declaration { id: DeclarationId(955), name: Some("RankingDimension".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "TreeSize".to_string(), ty: DeclarationId(1844) }, Field { label: "ListLength".to_string(), ty: DeclarationId(1845) }, Field { label: "ArithmeticValue".to_string(), ty: DeclarationId(1846) }, Field { label: "TokenPosition".to_string(), ty: DeclarationId(1847) }, Field { label: "SetCardinality".to_string(), ty: DeclarationId(1848) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 3206, 3402) }, + Declaration { id: DeclarationId(956), name: Some("PositiveDescentAmount".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "OneStep".to_string(), ty: DeclarationId(1849) }, Field { label: "AdditionalStep".to_string(), ty: DeclarationId(1850) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 4378, 4471) }, + Declaration { id: DeclarationId(957), name: Some("ProportionalDivisor".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "DivideByTwo".to_string(), ty: DeclarationId(1851) }, Field { label: "StrictlyLarger".to_string(), ty: DeclarationId(1852) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 4937, 5027) }, + Declaration { id: DeclarationId(958), name: Some("proportional_divisor_to_int".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(957)], output: DeclarationId(71), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 5091, 5204)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 5029, 5204) }, + Declaration { id: DeclarationId(959), name: Some("peano_literal_materialization_cap".to_string()), connective: TypeConnective::Arrow { inputs: vec![], output: DeclarationId(71), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 5434, 5441)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 5388, 5441) }, + Declaration { id: DeclarationId(960), name: Some("positive_descent_amount_from_positive_int".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71)], output: DeclarationId(1839), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 5902, 6262)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 5823, 6262) }, + Declaration { id: DeclarationId(961), name: Some("proportional_divisor_from_int_at_least_two".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71)], output: DeclarationId(1840), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/termination.dag", 6342, 6703)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 6264, 6703) }, + Declaration { id: DeclarationId(962), name: Some("DescentSource".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "ChildAccessor".to_string(), ty: DeclarationId(1853) }, Field { label: "ListShrink".to_string(), ty: DeclarationId(1854) }, Field { label: "ArithmeticSubtractDescent".to_string(), ty: DeclarationId(1855) }, Field { label: "ArithmeticDivideDescent".to_string(), ty: DeclarationId(1856) }, Field { label: "ParserAdvance".to_string(), ty: DeclarationId(1857) }, Field { label: "SetRemoval".to_string(), ty: DeclarationId(1858) }, Field { label: "FoldIteration".to_string(), ty: DeclarationId(1859) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7108, 7429) }, + Declaration { id: DeclarationId(963), name: Some("TerminationProof".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "dimensions".to_string(), ty: DeclarationId(1860) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7431, 7493) }, + Declaration { id: DeclarationId(964), name: Some("ProofEdge".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "caller".to_string(), ty: DeclarationId(186) }, Field { label: "callee".to_string(), ty: DeclarationId(186) }, Field { label: "evidence".to_string(), ty: DeclarationId(1861) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7638, 7724) }, + Declaration { id: DeclarationId(965), name: Some("TokenKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "KwLet".to_string(), ty: DeclarationId(1862) }, Field { label: "KwIf".to_string(), ty: DeclarationId(1863) }, Field { label: "KwThen".to_string(), ty: DeclarationId(1864) }, Field { label: "KwElse".to_string(), ty: DeclarationId(1865) }, Field { label: "KwFn".to_string(), ty: DeclarationId(1866) }, Field { label: "KwType".to_string(), ty: DeclarationId(1867) }, Field { label: "KwModule".to_string(), ty: DeclarationId(1868) }, Field { label: "KwImport".to_string(), ty: DeclarationId(1869) }, Field { label: "KwMatch".to_string(), ty: DeclarationId(1870) }, Field { label: "KwData".to_string(), ty: DeclarationId(1871) }, Field { label: "KwWhere".to_string(), ty: DeclarationId(1872) }, Field { label: "KwTrue".to_string(), ty: DeclarationId(1873) }, Field { label: "KwFalse".to_string(), ty: DeclarationId(1874) }, Field { label: "Ident".to_string(), ty: DeclarationId(1875) }, Field { label: "IntLit".to_string(), ty: DeclarationId(1876) }, Field { label: "StringLit".to_string(), ty: DeclarationId(1877) }, Field { label: "Eq".to_string(), ty: DeclarationId(1878) }, Field { label: "EqEq".to_string(), ty: DeclarationId(1879) }, Field { label: "NotEq".to_string(), ty: DeclarationId(1880) }, Field { label: "Lt".to_string(), ty: DeclarationId(1881) }, Field { label: "Le".to_string(), ty: DeclarationId(1882) }, Field { label: "Gt".to_string(), ty: DeclarationId(1883) }, Field { label: "Ge".to_string(), ty: DeclarationId(1884) }, Field { label: "Plus".to_string(), ty: DeclarationId(1885) }, Field { label: "Minus".to_string(), ty: DeclarationId(1886) }, Field { label: "Star".to_string(), ty: DeclarationId(1887) }, Field { label: "Slash".to_string(), ty: DeclarationId(1888) }, Field { label: "AmpAmp".to_string(), ty: DeclarationId(1889) }, Field { label: "PipePipe".to_string(), ty: DeclarationId(1890) }, Field { label: "Colon".to_string(), ty: DeclarationId(1891) }, Field { label: "Arrow".to_string(), ty: DeclarationId(1892) }, Field { label: "FatArrow".to_string(), ty: DeclarationId(1893) }, Field { label: "PipeArrow".to_string(), ty: DeclarationId(1894) }, Field { label: "Dot".to_string(), ty: DeclarationId(1895) }, Field { label: "LParen".to_string(), ty: DeclarationId(1896) }, Field { label: "RParen".to_string(), ty: DeclarationId(1897) }, Field { label: "LBrace".to_string(), ty: DeclarationId(1898) }, Field { label: "RBrace".to_string(), ty: DeclarationId(1899) }, Field { label: "LBracket".to_string(), ty: DeclarationId(1900) }, Field { label: "RBracket".to_string(), ty: DeclarationId(1901) }, Field { label: "Comma".to_string(), ty: DeclarationId(1902) }, Field { label: "Semicolon".to_string(), ty: DeclarationId(1903) }, Field { label: "Pipe".to_string(), ty: DeclarationId(1904) }, Field { label: "Question".to_string(), ty: DeclarationId(1905) }, Field { label: "Eof".to_string(), ty: DeclarationId(1906) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 627, 1137) }, + Declaration { id: DeclarationId(966), name: Some("Token".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "kind".to_string(), ty: DeclarationId(965) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1272, 1323) }, + Declaration { id: DeclarationId(967), name: Some("KeywordTokenKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "KwLet".to_string(), ty: DeclarationId(1907) }, Field { label: "KwIf".to_string(), ty: DeclarationId(1908) }, Field { label: "KwThen".to_string(), ty: DeclarationId(1909) }, Field { label: "KwElse".to_string(), ty: DeclarationId(1910) }, Field { label: "KwFn".to_string(), ty: DeclarationId(1911) }, Field { label: "KwType".to_string(), ty: DeclarationId(1912) }, Field { label: "KwModule".to_string(), ty: DeclarationId(1913) }, Field { label: "KwImport".to_string(), ty: DeclarationId(1914) }, Field { label: "KwMatch".to_string(), ty: DeclarationId(1915) }, Field { label: "KwData".to_string(), ty: DeclarationId(1916) }, Field { label: "KwWhere".to_string(), ty: DeclarationId(1917) }, Field { label: "KwTrue".to_string(), ty: DeclarationId(1918) }, Field { label: "KwFalse".to_string(), ty: DeclarationId(1919) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1682, 1848) }, + Declaration { id: DeclarationId(968), name: Some("PunctTokenKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Eq".to_string(), ty: DeclarationId(1920) }, Field { label: "EqEq".to_string(), ty: DeclarationId(1921) }, Field { label: "NotEq".to_string(), ty: DeclarationId(1922) }, Field { label: "Lt".to_string(), ty: DeclarationId(1923) }, Field { label: "Le".to_string(), ty: DeclarationId(1924) }, Field { label: "Gt".to_string(), ty: DeclarationId(1925) }, Field { label: "Ge".to_string(), ty: DeclarationId(1926) }, Field { label: "Plus".to_string(), ty: DeclarationId(1927) }, Field { label: "Minus".to_string(), ty: DeclarationId(1928) }, Field { label: "Star".to_string(), ty: DeclarationId(1929) }, Field { label: "Slash".to_string(), ty: DeclarationId(1930) }, Field { label: "AmpAmp".to_string(), ty: DeclarationId(1931) }, Field { label: "PipePipe".to_string(), ty: DeclarationId(1932) }, Field { label: "Colon".to_string(), ty: DeclarationId(1933) }, Field { label: "Arrow".to_string(), ty: DeclarationId(1934) }, Field { label: "FatArrow".to_string(), ty: DeclarationId(1935) }, Field { label: "PipeArrow".to_string(), ty: DeclarationId(1936) }, Field { label: "Dot".to_string(), ty: DeclarationId(1937) }, Field { label: "LParen".to_string(), ty: DeclarationId(1938) }, Field { label: "RParen".to_string(), ty: DeclarationId(1939) }, Field { label: "LBrace".to_string(), ty: DeclarationId(1940) }, Field { label: "RBrace".to_string(), ty: DeclarationId(1941) }, Field { label: "LBracket".to_string(), ty: DeclarationId(1942) }, Field { label: "RBracket".to_string(), ty: DeclarationId(1943) }, Field { label: "Comma".to_string(), ty: DeclarationId(1944) }, Field { label: "Semicolon".to_string(), ty: DeclarationId(1945) }, Field { label: "Pipe".to_string(), ty: DeclarationId(1946) }, Field { label: "Question".to_string(), ty: DeclarationId(1947) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2264, 2570) }, + Declaration { id: DeclarationId(969), name: Some("LocalPunctSpec".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "pattern".to_string(), ty: DeclarationId(186) }, Field { label: "kind".to_string(), ty: DeclarationId(968) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2780, 2844) }, + Declaration { id: DeclarationId(970), name: Some("StringEscapeSpec".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "suffix".to_string(), ty: DeclarationId(186) }, Field { label: "output_codepoint".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 3231, 3297) }, + Declaration { id: DeclarationId(971), name: Some("Path".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(120), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 1292, 1312) }, + Declaration { id: DeclarationId(972), name: Some("SnapshotRef".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(111), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 1313, 1343) }, + Declaration { id: DeclarationId(973), name: Some("CensusListConstant".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 1480, 1506) }, + Declaration { id: DeclarationId(974), name: Some("expected_hand_authored_non_test".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(973), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(973)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 1508, 1569) }, + Declaration { id: DeclarationId(975), name: Some("expected_hand_authored_test".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(973), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(973)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 1570, 1627) }, + Declaration { id: DeclarationId(976), name: Some("LensProducerFilesSubsetPredicate".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 1759, 1799) }, + Declaration { id: DeclarationId(977), name: Some("lens_producer_files_subset_predicate".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(976), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(976)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 1801, 1881) }, + Declaration { id: DeclarationId(978), name: Some("CompilerStdPositiveSetRatchet".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 1960, 1997) }, + Declaration { id: DeclarationId(979), name: Some("compiler_std_positive_set_ratchet".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(978), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(978)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 1999, 2073) }, + Declaration { id: DeclarationId(980), name: Some("DiagnosticKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "TokenizerError".to_string(), ty: DeclarationId(1951) }, Field { label: "ParseError".to_string(), ty: DeclarationId(1952) }, Field { label: "TypeMismatch".to_string(), ty: DeclarationId(1953) }, Field { label: "UnitMismatch".to_string(), ty: DeclarationId(1954) }, Field { label: "ArityMismatch".to_string(), ty: DeclarationId(1955) }, Field { label: "ResolveError".to_string(), ty: DeclarationId(1956) }, Field { label: "NominalOpacityViolation".to_string(), ty: DeclarationId(1957) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2408, 2558) }, + Declaration { id: DeclarationId(981), name: Some("DiagnosticDetailExpectation".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "AnyDetail".to_string(), ty: DeclarationId(1958) }, Field { label: "Contains".to_string(), ty: DeclarationId(1959) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2927, 2994) }, + Declaration { id: DeclarationId(982), name: Some("DiagnosticReference".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "kind".to_string(), ty: DeclarationId(980) }, Field { label: "detail_contains".to_string(), ty: DeclarationId(981) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 3138, 3236) }, + Declaration { id: DeclarationId(983), name: Some("PortStateExpectation".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Resolved".to_string(), ty: DeclarationId(1960) }, Field { label: "Unresolved".to_string(), ty: DeclarationId(1961) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 3623, 3676) }, + Declaration { id: DeclarationId(984), name: Some("AlgebraicLawKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Associativity".to_string(), ty: DeclarationId(1962) }, Field { label: "Commutativity".to_string(), ty: DeclarationId(1963) }, Field { label: "Identity".to_string(), ty: DeclarationId(1964) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4465, 4535) }, + Declaration { id: DeclarationId(985), name: Some("TestPredicate".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Compiles".to_string(), ty: DeclarationId(1965) }, Field { label: "FailsWithDiagnostic".to_string(), ty: DeclarationId(1966) }, Field { label: "OutputEquals".to_string(), ty: DeclarationId(1967) }, Field { label: "PortHasState".to_string(), ty: DeclarationId(1968) }, Field { label: "DeclarationHasRefinement".to_string(), ty: DeclarationId(1969) }, Field { label: "CostBounded".to_string(), ty: DeclarationId(1970) }, Field { label: "BehavioralObservation".to_string(), ty: DeclarationId(1971) }, Field { label: "MockBackedInvariant".to_string(), ty: DeclarationId(1972) }, Field { label: "ExecuteCommand".to_string(), ty: DeclarationId(1974) }, Field { label: "ForAllTargets".to_string(), ty: DeclarationId(1976) }, Field { label: "LensOutputEquals".to_string(), ty: DeclarationId(1977) }, Field { label: "DifferentialEquals".to_string(), ty: DeclarationId(1978) }, Field { label: "AlgebraicLaw".to_string(), ty: DeclarationId(1979) }, Field { label: "CensusBoundCheck".to_string(), ty: DeclarationId(1980) }, Field { label: "CensusSubsetCount".to_string(), ty: DeclarationId(1981) }, Field { label: "FixedPointConverges".to_string(), ty: DeclarationId(1982) }, Field { label: "RatchetZero".to_string(), ty: DeclarationId(1983) }, Field { label: "GeneratedFromDag".to_string(), ty: DeclarationId(1985) }, Field { label: "ReleaseDeferredClaim".to_string(), ty: DeclarationId(1986) }, Field { label: "SubstrateResearchDeferredClaim".to_string(), ty: DeclarationId(1987) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4537, 11180) }, + Declaration { id: DeclarationId(986), name: Some("ProgramInput".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 11288, 11308) }, + Declaration { id: DeclarationId(987), name: Some("ProgramOutputBind".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "output_ref".to_string(), ty: DeclarationId(1001) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 11451, 11506) }, + Declaration { id: DeclarationId(988), name: Some("TestClaim".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "source".to_string(), ty: DeclarationId(186) }, Field { label: "file_name".to_string(), ty: DeclarationId(186) }, Field { label: "predicate".to_string(), ty: DeclarationId(985) }, Field { label: "requires".to_string(), ty: DeclarationId(1988) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12116, 12249) }, + Declaration { id: DeclarationId(989), name: Some("TestSuite".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "claims".to_string(), ty: DeclarationId(1989) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12251, 12310) }, + Declaration { id: DeclarationId(990), name: Some("TestObligation".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "claim_name".to_string(), ty: DeclarationId(186) }, Field { label: "resources".to_string(), ty: DeclarationId(1990) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12508, 12589) }, + Declaration { id: DeclarationId(991), name: Some("claim_obligation_resources".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(988)], output: DeclarationId(1948), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/verification.dag", 13031, 13047)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12960, 13047) }, + Declaration { id: DeclarationId(992), name: Some("obligation_for_claim".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(988)], output: DeclarationId(990), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/verification.dag", 13105, 13190)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 13049, 13190) }, + Declaration { id: DeclarationId(993), name: Some("materialize_test_obligations".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1949)], output: DeclarationId(1950), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/verification.dag", 13273, 13312)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 13192, 13312) }, + Declaration { id: DeclarationId(994), name: Some("behavior_spine".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(726)], output: DeclarationId(1991), body: ArrowBody::UserDefined(NodeId(236)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/workflows.dag", 963, 1018) }, + Declaration { id: DeclarationId(995), name: Some("Value".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/v3_l1.dag", 2788, 2801) }, + Declaration { id: DeclarationId(996), name: Some("Transform".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/v3_l1.dag", 2802, 2819) }, + Declaration { id: DeclarationId(997), name: Some("Branch".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/v3_l1.dag", 2820, 2834) }, + Declaration { id: DeclarationId(998), name: Some("Loop".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/v3_l1.dag", 2835, 2847) }, + Declaration { id: DeclarationId(999), name: Some("Bind".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/v3_l1.dag", 2848, 2860) }, + Declaration { id: DeclarationId(1000), name: Some("Main".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/v3_l1.dag", 2861, 2873) }, + Declaration { id: DeclarationId(1001), name: Some("DeclarationRef".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/v3_l1.dag", 3283, 3305) }, + Declaration { id: DeclarationId(1002), name: Some("go_execution_model".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(810), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(810)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("memory".to_string(), FieldValue::Variant { constructor: DeclarationId(1712), payload: vec![] }), ("scope".to_string(), FieldValue::Variant { constructor: DeclarationId(1715), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 1538, 1640) }, + Declaration { id: DeclarationId(1003), name: Some("go_source_filtering".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(812), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(812)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("internal".to_string(), FieldValue::Reference(DeclarationId(813))), ("additional_excluded_prefixes".to_string(), FieldValue::List(vec![FieldValue::Literal(LiteralBits::String("src/v3/compiler/".to_string()))]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 1642, 1792) }, + Declaration { id: DeclarationId(1004), name: Some("go_execution_requirement".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(814), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(814)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/go.dag", 1853, 1869))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 1794, 1869) }, + Declaration { id: DeclarationId(1005), name: Some("go_int".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("int64".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 1871, 2001) }, + Declaration { id: DeclarationId(1006), name: Some("go_bool".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(88))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("bool".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 2003, 2134) }, + Declaration { id: DeclarationId(1007), name: Some("go_string".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(186))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("string".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 2136, 2273) }, + Declaration { id: DeclarationId(1008), name: Some("go_node_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(625))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NodeId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 2275, 2413) }, + Declaration { id: DeclarationId(1009), name: Some("go_port_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(626))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PortId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 2415, 2553) }, + Declaration { id: DeclarationId(1010), name: Some("go_declaration_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(627))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("DeclarationId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 2555, 2714) }, + Declaration { id: DeclarationId(1011), name: Some("go_cluster_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(628))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ClusterId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 2716, 2863) }, + Declaration { id: DeclarationId(1012), name: Some("go_type_shape".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(682))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TypeShape".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("declaration".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("declaration".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 2865, 3106) }, + Declaration { id: DeclarationId(1013), name: Some("go_port_state".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(683))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PortState".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 3108, 3256) }, + Declaration { id: DeclarationId(1014), name: Some("go_port".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(684))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("DagPort".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("state".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("state".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("produced_by".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("produced_by".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 3258, 3641) }, + Declaration { id: DeclarationId(1015), name: Some("go_source_span".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(121))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SourceSpan".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("file".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("file".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("start".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("byte_start".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("end".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("byte_end".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 3643, 4037) }, + Declaration { id: DeclarationId(1016), name: Some("go_literal_bits".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(685))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("LiteralBits".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 4039, 4193) }, + Declaration { id: DeclarationId(1017), name: Some("go_atom_payload".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(686))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("AtomPayload".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 4195, 4349) }, + Declaration { id: DeclarationId(1018), name: Some("go_cardinality_bound".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(691))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("CardinalityBound".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 4351, 4520) }, + Declaration { id: DeclarationId(1019), name: Some("go_interval".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(689))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Interval".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 4522, 4666) }, + Declaration { id: DeclarationId(1020), name: Some("go_positive_interval_width".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(687))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PositiveIntervalWidth".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 4668, 4853) }, + Declaration { id: DeclarationId(1021), name: Some("go_interval_width".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(688))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("IntervalWidth".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 4855, 5015) }, + Declaration { id: DeclarationId(1022), name: Some("go_conj_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(692))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ConjField".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("label".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("label".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("ty".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("ty".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 5017, 5319) }, + Declaration { id: DeclarationId(1023), name: Some("go_template_argument".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(693))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TemplateArgument".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("parameter".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("parameter".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("value".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("value".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 5321, 5658) }, + Declaration { id: DeclarationId(1024), name: Some("go_phantom_parameter".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(700))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PhantomParameter".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("parameter".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("parameter".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("algebra".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("algebra".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 5660, 6001) }, + Declaration { id: DeclarationId(1025), name: Some("go_nominal_opacity".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(701))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NominalOpacity".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("permitted_accessors".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("permitted_accessors".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 6003, 6275) }, + Declaration { id: DeclarationId(1026), name: Some("go_field_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(694))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("FieldEntry".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("label".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("label".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("value".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("value".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 6277, 6588) }, + Declaration { id: DeclarationId(1027), name: Some("go_non_empty_list".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(629))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NonEmptyList".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("first".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("first".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("rest".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("rest".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 6590, 6906) }, + Declaration { id: DeclarationId(1028), name: Some("go_non_singleton_list".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(631))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NonSingletonList".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("first".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("first".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("second".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("second".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("rest".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("rest".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 6908, 7317) }, + Declaration { id: DeclarationId(1029), name: Some("go_param_ref".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(710))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ParamRef".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("member".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1763), payload: vec![FieldValue::Literal(LiteralBits::String("member_of".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("slot".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1763), payload: vec![FieldValue::Literal(LiteralBits::String("slot_of".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 7319, 7635) }, + Declaration { id: DeclarationId(1030), name: Some("go_transform_ref".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(711))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TransformRef".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("node".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1763), payload: vec![FieldValue::Literal(LiteralBits::String("node_id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 7637, 7878) }, + Declaration { id: DeclarationId(1031), name: Some("go_member_descent".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(714))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("MemberDescent".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("param".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("param".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 7880, 8121) }, + Declaration { id: DeclarationId(1032), name: Some("go_intra_cluster_call".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(715))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("IntraClusterCall".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("transform".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("transform".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 8123, 8382) }, + Declaration { id: DeclarationId(1033), name: Some("go_cluster".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(716))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Cluster".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("members".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("members".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("intra_cluster_calls".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("intra_cluster_calls".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 8384, 8717) }, + Declaration { id: DeclarationId(1034), name: Some("go_field_value".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(695))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("FieldValue".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 8719, 8870) }, + Declaration { id: DeclarationId(1035), name: Some("go_value_body".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(696))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ValueBody".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 8872, 9020) }, + Declaration { id: DeclarationId(1036), name: Some("go_arrow_body".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(697))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ArrowBody".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 9022, 9170) }, + Declaration { id: DeclarationId(1037), name: Some("go_type_connective".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(698))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TypeConnective".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 9172, 9335) }, + Declaration { id: DeclarationId(1038), name: Some("go_declaration".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(699))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Declaration".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("connective".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("connective".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("type_params".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("type_params".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("phantom_params".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("phantom_params".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("meta_tag".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("meta_tag".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("inhabits".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("inhabits".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("value_body".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("value_body".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("nominal_opacity".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("nominal_opacity".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 9337, 10354) }, + Declaration { id: DeclarationId(1039), name: Some("go_arithmetic_op".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(702))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ArithmeticOp".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 10356, 10513) }, + Declaration { id: DeclarationId(1040), name: Some("go_comparison_op".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(703))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ComparisonOp".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 10515, 10672) }, + Declaration { id: DeclarationId(1041), name: Some("go_logical_op".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(704))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("LogicalOp".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 10674, 10822) }, + Declaration { id: DeclarationId(1042), name: Some("go_operator_kind".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(705))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("OperatorKind".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 10824, 10981) }, + Declaration { id: DeclarationId(1043), name: Some("go_transform_target".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(706))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TransformTarget".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 10983, 11149) }, + Declaration { id: DeclarationId(1044), name: Some("go_branch_pattern".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(707))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BranchPattern".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 11151, 11311) }, + Declaration { id: DeclarationId(1045), name: Some("go_payload_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(708))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PayloadBinding".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("binding_name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("binding_name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("payload_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("payload_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 11313, 11664) }, + Declaration { id: DeclarationId(1046), name: Some("go_branch_path".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(709))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BranchPath".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("body".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("body".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("pattern".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("pattern".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("binding".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("binding".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 11666, 12153) }, + Declaration { id: DeclarationId(1047), name: Some("go_loop_bound".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(717))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("LoopBound".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 12155, 12303) }, + Declaration { id: DeclarationId(1048), name: Some("go_value_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(718))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ValueNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("payload".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("payload".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 12777, 13251) }, + Declaration { id: DeclarationId(1049), name: Some("go_transform_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(719))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TransformNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("target".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("target".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("inputs".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("inputs".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 13253, 13818) }, + Declaration { id: DeclarationId(1050), name: Some("go_branch_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(721))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BranchNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("input".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("input".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("paths".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("paths".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("emit_participation".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("emit_participation".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 13820, 14477) }, + Declaration { id: DeclarationId(1051), name: Some("go_loop_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(722))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("LoopNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("source".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("source".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("init".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("init".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("body".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("body".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("bound".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("bound".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 14479, 15181) }, + Declaration { id: DeclarationId(1052), name: Some("go_bind_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(724))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BindNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("params".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("params".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("emit_participation".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("emit_participation".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 15183, 15834) }, + Declaration { id: DeclarationId(1053), name: Some("go_behavior".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(725))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Behavior".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 15836, 15980) }, + Declaration { id: DeclarationId(1054), name: Some("go_dag".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(726))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Dag".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("declarations".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("declarations".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("nodes".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("nodes".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("ports".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("ports".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("clusters".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("clusters".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 15982, 16449) }, + Declaration { id: DeclarationId(1055), name: Some("go_surface_module".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/go.dag", 16794, 16993))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 16752, 16993) }, + Declaration { id: DeclarationId(1056), name: Some("go_surface_item".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/go.dag", 17035, 17149))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 16995, 17149) }, + Declaration { id: DeclarationId(1057), name: Some("go_surface_param".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/go.dag", 17192, 17549))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 17151, 17549) }, + Declaration { id: DeclarationId(1058), name: Some("go_surface_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/go.dag", 17592, 17860))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 17551, 17860) }, + Declaration { id: DeclarationId(1059), name: Some("go_surface_variant".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/go.dag", 17905, 18264))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 17862, 18264) }, + Declaration { id: DeclarationId(1060), name: Some("go_variant_payload".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/go.dag", 18309, 18429))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 18266, 18429) }, + Declaration { id: DeclarationId(1061), name: Some("go_surface_type".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/go.dag", 18471, 18585))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 18431, 18585) }, + Declaration { id: DeclarationId(1062), name: Some("go_surface_record_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/go.dag", 18635, 18998))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 18587, 18998) }, + Declaration { id: DeclarationId(1063), name: Some("go_surface_map_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/go.dag", 19045, 19485))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 19000, 19485) }, + Declaration { id: DeclarationId(1064), name: Some("go_surface_match_arm".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/go.dag", 19532, 19893))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 19487, 19893) }, + Declaration { id: DeclarationId(1065), name: Some("go_surface_pattern_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/go.dag", 19944, 20313))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 19895, 20313) }, + Declaration { id: DeclarationId(1066), name: Some("go_surface_pattern".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/go.dag", 20358, 20478))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 20315, 20478) }, + Declaration { id: DeclarationId(1067), name: Some("go_surface_literal".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/go.dag", 20523, 20643))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 20480, 20643) }, + Declaration { id: DeclarationId(1068), name: Some("go_surface_expr".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/go.dag", 20685, 20799))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 20645, 20799) }, + Declaration { id: DeclarationId(1069), name: Some("go_int_add".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(298))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} + {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 20801, 20942) }, + Declaration { id: DeclarationId(1070), name: Some("go_int_sub".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(299))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} - {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 20944, 21085) }, + Declaration { id: DeclarationId(1071), name: Some("go_int_mul".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(301))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} * {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 21087, 21228) }, + Declaration { id: DeclarationId(1072), name: Some("go_int_div".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(303))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("v3intdiv({lhs}, {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 21230, 21378) }, + Declaration { id: DeclarationId(1073), name: Some("go_int_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(305))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 21380, 21520) }, + Declaration { id: DeclarationId(1074), name: Some("go_node_id_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(625))), ("op".to_string(), FieldValue::Reference(DeclarationId(305))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 21522, 21669) }, + Declaration { id: DeclarationId(1075), name: Some("go_port_id_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(626))), ("op".to_string(), FieldValue::Reference(DeclarationId(305))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 21671, 21818) }, + Declaration { id: DeclarationId(1076), name: Some("go_declaration_id_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(627))), ("op".to_string(), FieldValue::Reference(DeclarationId(305))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 21820, 21981) }, + Declaration { id: DeclarationId(1077), name: Some("go_int_ne".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(306))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} != {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 21983, 22123) }, + Declaration { id: DeclarationId(1078), name: Some("go_node_id_ne".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(625))), ("op".to_string(), FieldValue::Reference(DeclarationId(306))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} != {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 22125, 22272) }, + Declaration { id: DeclarationId(1079), name: Some("go_port_id_ne".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(626))), ("op".to_string(), FieldValue::Reference(DeclarationId(306))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} != {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 22274, 22421) }, + Declaration { id: DeclarationId(1080), name: Some("go_declaration_id_ne".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(627))), ("op".to_string(), FieldValue::Reference(DeclarationId(306))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} != {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 22423, 22584) }, + Declaration { id: DeclarationId(1081), name: Some("go_int_lt".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(307))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} < {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 22586, 22725) }, + Declaration { id: DeclarationId(1082), name: Some("go_int_le".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(308))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} <= {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 22727, 22867) }, + Declaration { id: DeclarationId(1083), name: Some("go_int_gt".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(309))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} > {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 22869, 23008) }, + Declaration { id: DeclarationId(1084), name: Some("go_int_ge".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(310))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} >= {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 23010, 23150) }, + Declaration { id: DeclarationId(1085), name: Some("go_bool_meet".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(88))), ("op".to_string(), FieldValue::Reference(DeclarationId(320))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} && {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 23152, 23301) }, + Declaration { id: DeclarationId(1086), name: Some("go_bool_join".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(88))), ("op".to_string(), FieldValue::Reference(DeclarationId(321))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} || {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 23303, 23452) }, + Declaration { id: DeclarationId(1087), name: Some("go_let_stmt".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(854), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(854)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(999))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("var {name} {type} = {value}".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(0)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 23454, 23587) }, + Declaration { id: DeclarationId(1088), name: Some("go_if_expr".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(854), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(854)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(997))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("if {cond} { {then} } else { {else} }".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(0)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 23589, 23732) }, + Declaration { id: DeclarationId(1089), name: Some("go_main_wrap".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(854), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(854)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(1000))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("func main() {\n{body}\nfmt.Println({final})\n}".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(0)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 23734, 23887) }, + Declaration { id: DeclarationId(1090), name: Some("go_empty_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(591))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 23889, 24027) }, + Declaration { id: DeclarationId(1091), name: Some("go_singleton_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(595))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1768), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1766), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 24029, 24221) }, + Declaration { id: DeclarationId(1092), name: Some("go_cons_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(593))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1769), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1766), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1766), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 24223, 24440) }, + Declaration { id: DeclarationId(1093), name: Some("go_concat_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(603))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1770), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1766), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1766), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 24442, 24665) }, + Declaration { id: DeclarationId(1094), name: Some("go_length_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(613))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1771), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1765), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 24667, 24850) }, + Declaration { id: DeclarationId(1095), name: Some("go_list_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(589))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("[]{element}".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 24852, 24988) }, + Declaration { id: DeclarationId(1096), name: Some("go_result_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(11))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("v3Result[{key}, {value}]".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 25674, 25827) }, + Declaration { id: DeclarationId(1097), name: Some("go_map_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(97))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("map[{key}]{value}".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 25829, 25969) }, + Declaration { id: DeclarationId(1098), name: Some("go_is_empty_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(615))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1772), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1765), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 25971, 26159) }, + Declaration { id: DeclarationId(1099), name: Some("go_fold_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(597))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1773), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1765), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1766), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(2))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1765), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 26161, 26418) }, + Declaration { id: DeclarationId(1100), name: Some("go_map_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(605))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1774), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1765), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1765), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 26420, 26634) }, + Declaration { id: DeclarationId(1101), name: Some("go_filter_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(608))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1775), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1765), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1765), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 26636, 26859) }, + Declaration { id: DeclarationId(1102), name: Some("go_contains_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(623))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1776), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1765), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1765), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 26861, 27090) }, + Declaration { id: DeclarationId(1103), name: Some("go_list_pattern".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("target".to_string(), FieldValue::Reference(DeclarationId(589))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1778), payload: vec![] }), ("empty_variant".to_string(), FieldValue::Reference(DeclarationId(1404))), ("cons_variant".to_string(), FieldValue::Reference(DeclarationId(1406))), ("scrutinee".to_string(), FieldValue::Literal(LiteralBits::String("{expr}".to_string()))), ("empty_pattern".to_string(), FieldValue::Literal(LiteralBits::String("len({expr}) == 0".to_string()))), ("cons_pattern".to_string(), FieldValue::Literal(LiteralBits::String("{expr}".to_string()))), ("head_expr".to_string(), FieldValue::Literal(LiteralBits::String("{list}[0]".to_string()))), ("tail_expr".to_string(), FieldValue::Literal(LiteralBits::String("{list}[1:]".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 27177, 27483) }, + Declaration { id: DeclarationId(1104), name: Some("go_statements".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(862), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(862)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("let_binding".to_string(), FieldValue::Literal(LiteralBits::String("var {name} {type} = {value}".to_string()))), ("let_binding_inferred".to_string(), FieldValue::Literal(LiteralBits::String("{name} := {value}".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 27485, 27615) }, + Declaration { id: DeclarationId(1105), name: Some("go_expressions".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(863), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(863)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("field_access".to_string(), FieldValue::Literal(LiteralBits::String("({object}).{field}".to_string()))), ("function_call".to_string(), FieldValue::Literal(LiteralBits::String("{func}({args})".to_string()))), ("closure".to_string(), FieldValue::Literal(LiteralBits::String("func({params}) { return {body} }".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 27617, 27777) }, + Declaration { id: DeclarationId(1106), name: Some("go_control_flow".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(865), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(865)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("if_else".to_string(), FieldValue::Literal(LiteralBits::String("if {cond} { {then} } else { {else} }".to_string()))), ("match_arm".to_string(), FieldValue::Literal(LiteralBits::String("{pattern}: return {body}".to_string()))), ("for_each_syntax".to_string(), FieldValue::Record(vec![("prefix".to_string(), FieldValue::Literal(LiteralBits::String("for _, ".to_string()))), ("separator".to_string(), FieldValue::Literal(LiteralBits::String(" := range ".to_string())))]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 27779, 27980) }, + Declaration { id: DeclarationId(1107), name: Some("go_literals".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(866), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(866)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("true_keyword".to_string(), FieldValue::Literal(LiteralBits::String("true".to_string()))), ("false_keyword".to_string(), FieldValue::Literal(LiteralBits::String("false".to_string()))), ("string_delimiter".to_string(), FieldValue::Literal(LiteralBits::String("%Q".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 27982, 28092) }, + Declaration { id: DeclarationId(1108), name: Some("go_modules".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(867), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(867)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("path_separator".to_string(), FieldValue::Literal(LiteralBits::String(".".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 28094, 28151) }, + Declaration { id: DeclarationId(1109), name: Some("go_functions".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(868), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(868)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("definition".to_string(), FieldValue::Literal(LiteralBits::String("func {name}({params}) {ret} { return {body} }".to_string()))), ("definition_exported".to_string(), FieldValue::Literal(LiteralBits::String("func {name}({params}) {ret} { return {body} }".to_string()))), ("definition_void".to_string(), FieldValue::Literal(LiteralBits::String("func {name}({params}) { {body} }".to_string()))), ("param_with_type".to_string(), FieldValue::Literal(LiteralBits::String("{name} {type}".to_string()))), ("param_separator".to_string(), FieldValue::Literal(LiteralBits::String(", ".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 28153, 28438) }, + Declaration { id: DeclarationId(1110), name: Some("go_type_applications".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(869), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(869)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("optional".to_string(), FieldValue::Literal(LiteralBits::String("*{element}".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 28440, 28519) }, + Declaration { id: DeclarationId(1111), name: Some("go_type_defs".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(870), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(870)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("struct_def".to_string(), FieldValue::Literal(LiteralBits::String("type {name} struct { {fields} }".to_string()))), ("struct_field".to_string(), FieldValue::Literal(LiteralBits::String("{name} {type}".to_string()))), ("enum_def".to_string(), FieldValue::Literal(LiteralBits::String("type {name} interface{}".to_string()))), ("enum_unit_variant".to_string(), FieldValue::Literal(LiteralBits::String("{name}".to_string()))), ("enum_data_variant".to_string(), FieldValue::Literal(LiteralBits::String("{name}".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 28521, 28744) }, + Declaration { id: DeclarationId(1112), name: Some("go_patterns".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(872), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(872)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("match_expr".to_string(), FieldValue::Literal(LiteralBits::String("{expr}".to_string()))), ("match_arm".to_string(), FieldValue::Literal(LiteralBits::String("{pattern}: return {body}".to_string()))), ("variant_pattern".to_string(), FieldValue::Literal(LiteralBits::String("{name}".to_string()))), ("variant_pattern_positional".to_string(), FieldValue::Literal(LiteralBits::String("{name}".to_string()))), ("variant_pattern_empty".to_string(), FieldValue::Literal(LiteralBits::String("{name}".to_string()))), ("field_binding".to_string(), FieldValue::Literal(LiteralBits::String("{field}: {binding}".to_string()))), ("field_binding_separator".to_string(), FieldValue::Literal(LiteralBits::String(", ".to_string()))), ("wildcard".to_string(), FieldValue::Literal(LiteralBits::String("_".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 28746, 29038) }, + Declaration { id: DeclarationId(1113), name: Some("go_collection_ops".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(873), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(873)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("concat".to_string(), FieldValue::Literal(LiteralBits::String("append({left}, {right}...)".to_string()))), ("length".to_string(), FieldValue::Literal(LiteralBits::String("int64(len({recv}))".to_string()))), ("is_empty".to_string(), FieldValue::Literal(LiteralBits::String("len({recv}) == 0".to_string()))), ("fold".to_string(), FieldValue::Literal(LiteralBits::String("/* fold({recv}, {init}, {body}) */".to_string()))), ("map".to_string(), FieldValue::Literal(LiteralBits::String("/* map({recv}, {body}) */".to_string()))), ("filter".to_string(), FieldValue::Literal(LiteralBits::String("/* filter({recv}, {body}) */".to_string()))), ("contains".to_string(), FieldValue::Literal(LiteralBits::String("/* contains({recv}, {item}) */".to_string()))), ("empty_list".to_string(), FieldValue::Literal(LiteralBits::String("nil".to_string()))), ("list_literal".to_string(), FieldValue::Literal(LiteralBits::String("[]{element_type}{{{elements}}}".to_string()))), ("cons".to_string(), FieldValue::Literal(LiteralBits::String("append([]{element_type}{{{head}}}, {tail}...)".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 29040, 29475) }, + Declaration { id: DeclarationId(1114), name: Some("go_value_construction".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(874), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(874)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("struct_literal".to_string(), FieldValue::Literal(LiteralBits::String("{type}{{ {fields} }}".to_string()))), ("struct_field_init".to_string(), FieldValue::Literal(LiteralBits::String("{name}: {value}".to_string()))), ("struct_field_separator".to_string(), FieldValue::Literal(LiteralBits::String(", ".to_string()))), ("variant_construction".to_string(), FieldValue::Literal(LiteralBits::String("{variant}({args})".to_string()))), ("variant_named_construction".to_string(), FieldValue::Literal(LiteralBits::String("{variant}{{ {fields} }}".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 29477, 29745) }, + Declaration { id: DeclarationId(1115), name: Some("go_record_derive_templates".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(871), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(871)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("struct_def_no_debug".to_string(), FieldValue::Literal(LiteralBits::String("".to_string()))), ("enum_def_no_debug".to_string(), FieldValue::Literal(LiteralBits::String("".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 30502, 30617) }, + Declaration { id: DeclarationId(1116), name: Some("go_language".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(878), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(878)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("statements".to_string(), FieldValue::Reference(DeclarationId(1104))), ("expressions".to_string(), FieldValue::Reference(DeclarationId(1105))), ("control_flow".to_string(), FieldValue::Reference(DeclarationId(1106))), ("literals".to_string(), FieldValue::Reference(DeclarationId(1107))), ("modules".to_string(), FieldValue::Reference(DeclarationId(1108))), ("functions".to_string(), FieldValue::Reference(DeclarationId(1109))), ("type_applications".to_string(), FieldValue::Reference(DeclarationId(1110))), ("type_definitions".to_string(), FieldValue::Reference(DeclarationId(1111))), ("record_derive_templates".to_string(), FieldValue::Reference(DeclarationId(1115))), ("patterns".to_string(), FieldValue::Reference(DeclarationId(1112))), ("collection_ops".to_string(), FieldValue::Reference(DeclarationId(1113))), ("values".to_string(), FieldValue::Reference(DeclarationId(1114)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 30619, 31038) }, + Declaration { id: DeclarationId(1117), name: Some("go_correction_style".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(784), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(784)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("indent_unit".to_string(), FieldValue::Literal(LiteralBits::String("\t".to_string()))), ("line_ending".to_string(), FieldValue::Literal(LiteralBits::String("\n".to_string()))), ("string_quote".to_string(), FieldValue::Literal(LiteralBits::String("%Q".to_string()))), ("trailing_semicolon".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 32705, 32841) }, + Declaration { id: DeclarationId(1118), name: Some("go_clean_emission".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(775), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(775)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("expression_wrapping".to_string(), FieldValue::Variant { constructor: DeclarationId(1648), payload: vec![] }), ("pattern_bindings".to_string(), FieldValue::Variant { constructor: DeclarationId(1651), payload: vec![] }), ("variant_payload_field_access".to_string(), FieldValue::Variant { constructor: DeclarationId(1654), payload: vec![] }), ("imports".to_string(), FieldValue::Variant { constructor: DeclarationId(1657), payload: vec![] }), ("block_return".to_string(), FieldValue::Variant { constructor: DeclarationId(1661), payload: vec![] }), ("variable_bindings".to_string(), FieldValue::Variant { constructor: DeclarationId(1663), payload: vec![] }), ("match_arm_body".to_string(), FieldValue::Variant { constructor: DeclarationId(1667), payload: vec![] }), ("correction_style".to_string(), FieldValue::Reference(DeclarationId(1117))), ("post_emit_verifier".to_string(), FieldValue::Record(vec![("command".to_string(), FieldValue::Literal(LiteralBits::String("gofmt".to_string()))), ("args".to_string(), FieldValue::List(vec![FieldValue::Literal(LiteralBits::String("-l".to_string()))])), ("syntax_only".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("expected_exit_code".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("output_policy".to_string(), FieldValue::Variant { constructor: DeclarationId(1670), payload: vec![] })]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 32843, 33401) }, + Declaration { id: DeclarationId(1119), name: Some("go_clean_emission_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(776), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(776)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1116))), ("clean_emission".to_string(), FieldValue::Reference(DeclarationId(1118)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/go.dag", 33403, 33527) }, + Declaration { id: DeclarationId(1120), name: Some("python_statements".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(862), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(862)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("let_binding".to_string(), FieldValue::Literal(LiteralBits::String("{name} = {value}".to_string()))), ("let_binding_inferred".to_string(), FieldValue::Literal(LiteralBits::String("{name} = {value}".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 1797, 1919) }, + Declaration { id: DeclarationId(1121), name: Some("python_expressions".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(863), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(863)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("field_access".to_string(), FieldValue::Literal(LiteralBits::String("{object}.{field}".to_string()))), ("function_call".to_string(), FieldValue::Literal(LiteralBits::String("{func}({args})".to_string()))), ("closure".to_string(), FieldValue::Literal(LiteralBits::String("lambda {params}: {body}".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 1921, 2074) }, + Declaration { id: DeclarationId(1122), name: Some("python_control_flow".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(865), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(865)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("if_else".to_string(), FieldValue::Literal(LiteralBits::String("({then} if {cond} else {else})".to_string()))), ("match_arm".to_string(), FieldValue::Literal(LiteralBits::String("{pattern}: {body}".to_string()))), ("for_each_syntax".to_string(), FieldValue::Record(vec![("prefix".to_string(), FieldValue::Literal(LiteralBits::String("for {item} in {iter}:\n{body}".to_string()))), ("separator".to_string(), FieldValue::Literal(LiteralBits::String("\n".to_string())))]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 2076, 2291) }, + Declaration { id: DeclarationId(1123), name: Some("python_literals".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(866), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(866)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("true_keyword".to_string(), FieldValue::Literal(LiteralBits::String("True".to_string()))), ("false_keyword".to_string(), FieldValue::Literal(LiteralBits::String("False".to_string()))), ("string_delimiter".to_string(), FieldValue::Literal(LiteralBits::String("%Q".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 2293, 2407) }, + Declaration { id: DeclarationId(1124), name: Some("python_modules".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(867), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(867)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("path_separator".to_string(), FieldValue::Literal(LiteralBits::String(".".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 2409, 2470) }, + Declaration { id: DeclarationId(1125), name: Some("python_functions".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(868), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(868)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("definition".to_string(), FieldValue::Literal(LiteralBits::String("def {name}({params}) -> {ret}:\n return {body}".to_string()))), ("definition_exported".to_string(), FieldValue::Literal(LiteralBits::String("def {name}({params}) -> {ret}:\n return {body}".to_string()))), ("definition_void".to_string(), FieldValue::Literal(LiteralBits::String("def {name}({params}) -> None:\n {body}".to_string()))), ("param_with_type".to_string(), FieldValue::Literal(LiteralBits::String("{name}: {type}".to_string()))), ("param_separator".to_string(), FieldValue::Literal(LiteralBits::String(", ".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 2472, 2779) }, + Declaration { id: DeclarationId(1126), name: Some("python_type_applications".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(869), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(869)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("optional".to_string(), FieldValue::Literal(LiteralBits::String("typing.Optional[{element}]".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 2781, 2880) }, + Declaration { id: DeclarationId(1127), name: Some("python_type_definitions".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(870), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(870)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("struct_def".to_string(), FieldValue::Literal(LiteralBits::String("@dataclass\nclass {name}:\n{fields}".to_string()))), ("struct_field".to_string(), FieldValue::Literal(LiteralBits::String("{name}: {type}".to_string()))), ("enum_def".to_string(), FieldValue::Literal(LiteralBits::String("class {name}:\n pass\n\n{variants}".to_string()))), ("enum_unit_variant".to_string(), FieldValue::Literal(LiteralBits::String("@dataclass\nclass {name}({parent}):\n pass".to_string()))), ("enum_data_variant".to_string(), FieldValue::Literal(LiteralBits::String("@dataclass\nclass {name}({parent}):\n{fields}".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 2882, 3213) }, + Declaration { id: DeclarationId(1128), name: Some("python_patterns".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(872), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(872)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("match_expr".to_string(), FieldValue::Literal(LiteralBits::String("match {expr} { {arms} }".to_string()))), ("match_arm".to_string(), FieldValue::Literal(LiteralBits::String("{pattern}: {body}".to_string()))), ("variant_pattern".to_string(), FieldValue::Literal(LiteralBits::String("{name}({bindings})".to_string()))), ("variant_pattern_positional".to_string(), FieldValue::Literal(LiteralBits::String("{name}({binding})".to_string()))), ("variant_pattern_empty".to_string(), FieldValue::Literal(LiteralBits::String("{name}()".to_string()))), ("field_binding".to_string(), FieldValue::Literal(LiteralBits::String("{field}={binding}".to_string()))), ("field_binding_separator".to_string(), FieldValue::Literal(LiteralBits::String(", ".to_string()))), ("wildcard".to_string(), FieldValue::Literal(LiteralBits::String("_".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 3215, 3545) }, + Declaration { id: DeclarationId(1129), name: Some("python_collections".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(873), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(873)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("concat".to_string(), FieldValue::Literal(LiteralBits::String("[*{left}, *{right}]".to_string()))), ("length".to_string(), FieldValue::Literal(LiteralBits::String("len({recv})".to_string()))), ("is_empty".to_string(), FieldValue::Literal(LiteralBits::String("(len({recv}) == 0)".to_string()))), ("fold".to_string(), FieldValue::Literal(LiteralBits::String("__v3_fold({recv}, {init}, {body})".to_string()))), ("map".to_string(), FieldValue::Literal(LiteralBits::String("[{body} for {item} in {recv}]".to_string()))), ("filter".to_string(), FieldValue::Literal(LiteralBits::String("[{item_push} for {item} in {recv} if {predicate}]".to_string()))), ("contains".to_string(), FieldValue::Literal(LiteralBits::String("({item} in {recv})".to_string()))), ("empty_list".to_string(), FieldValue::Literal(LiteralBits::String("[]".to_string()))), ("list_literal".to_string(), FieldValue::Literal(LiteralBits::String("[{elements}]".to_string()))), ("cons".to_string(), FieldValue::Literal(LiteralBits::String("[{head}, *{tail}]".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 3547, 3936) }, + Declaration { id: DeclarationId(1130), name: Some("python_value_construction".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(874), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(874)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("struct_literal".to_string(), FieldValue::Literal(LiteralBits::String("{name}({fields})".to_string()))), ("struct_field_init".to_string(), FieldValue::Literal(LiteralBits::String("{field}={value}".to_string()))), ("struct_field_separator".to_string(), FieldValue::Literal(LiteralBits::String(", ".to_string()))), ("variant_construction".to_string(), FieldValue::Literal(LiteralBits::String("{name}()".to_string()))), ("variant_named_construction".to_string(), FieldValue::Literal(LiteralBits::String("{name}({fields})".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 3938, 4190) }, + Declaration { id: DeclarationId(1131), name: Some("python_record_derive_templates".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(871), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(871)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("struct_def_no_debug".to_string(), FieldValue::Literal(LiteralBits::String("".to_string()))), ("enum_def_no_debug".to_string(), FieldValue::Literal(LiteralBits::String("".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 4393, 4512) }, + Declaration { id: DeclarationId(1132), name: Some("python_language".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(878), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(878)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("statements".to_string(), FieldValue::Reference(DeclarationId(1120))), ("expressions".to_string(), FieldValue::Reference(DeclarationId(1121))), ("control_flow".to_string(), FieldValue::Reference(DeclarationId(1122))), ("literals".to_string(), FieldValue::Reference(DeclarationId(1123))), ("modules".to_string(), FieldValue::Reference(DeclarationId(1124))), ("functions".to_string(), FieldValue::Reference(DeclarationId(1125))), ("type_applications".to_string(), FieldValue::Reference(DeclarationId(1126))), ("type_definitions".to_string(), FieldValue::Reference(DeclarationId(1127))), ("record_derive_templates".to_string(), FieldValue::Reference(DeclarationId(1131))), ("patterns".to_string(), FieldValue::Reference(DeclarationId(1128))), ("collection_ops".to_string(), FieldValue::Reference(DeclarationId(1129))), ("values".to_string(), FieldValue::Reference(DeclarationId(1130)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 4514, 4989) }, + Declaration { id: DeclarationId(1133), name: Some("python_target".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(810), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(810)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("memory".to_string(), FieldValue::Variant { constructor: DeclarationId(1712), payload: vec![] }), ("scope".to_string(), FieldValue::Variant { constructor: DeclarationId(1715), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 4991, 5088) }, + Declaration { id: DeclarationId(1134), name: Some("python_source_filtering".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(812), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(812)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("internal".to_string(), FieldValue::Reference(DeclarationId(813))), ("additional_excluded_prefixes".to_string(), FieldValue::List(vec![]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 5090, 5226) }, + Declaration { id: DeclarationId(1135), name: Some("python_execution_requirement".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(814), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(814)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/python.dag", 5291, 5307))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 5228, 5307) }, + Declaration { id: DeclarationId(1136), name: Some("python_int".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("int".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 5309, 5445) }, + Declaration { id: DeclarationId(1137), name: Some("python_bool".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(88))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("bool".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 5447, 5586) }, + Declaration { id: DeclarationId(1138), name: Some("python_string".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(186))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("str".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 5588, 5730) }, + Declaration { id: DeclarationId(1139), name: Some("python_node_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(625))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NodeId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 5732, 5878) }, + Declaration { id: DeclarationId(1140), name: Some("python_port_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(626))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PortId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 5880, 6026) }, + Declaration { id: DeclarationId(1141), name: Some("python_declaration_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(627))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("DeclarationId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 6028, 6195) }, + Declaration { id: DeclarationId(1142), name: Some("python_declaration_ref".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(1001))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("DeclarationId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 6197, 6366) }, + Declaration { id: DeclarationId(1143), name: Some("python_source_span".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(121))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SourceSpan".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 6368, 6527) }, + Declaration { id: DeclarationId(1144), name: Some("python_dag_port".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(684))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("DagPort".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 6529, 6679) }, + Declaration { id: DeclarationId(1145), name: Some("python_branch_path".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(709))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BranchPath".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 6681, 6840) }, + Declaration { id: DeclarationId(1146), name: Some("python_value_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(718))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ValueNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 6842, 6998) }, + Declaration { id: DeclarationId(1147), name: Some("python_transform_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(719))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TransformNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 7000, 7168) }, + Declaration { id: DeclarationId(1148), name: Some("python_branch_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(721))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BranchNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 7170, 7329) }, + Declaration { id: DeclarationId(1149), name: Some("python_loop_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(722))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("LoopNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 7331, 7484) }, + Declaration { id: DeclarationId(1150), name: Some("python_bind_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(724))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BindNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 7486, 7639) }, + Declaration { id: DeclarationId(1151), name: Some("python_behavior".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(725))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Behavior".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 7641, 7793) }, + Declaration { id: DeclarationId(1152), name: Some("python_dag".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(726))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Dag".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 7795, 7932) }, + Declaration { id: DeclarationId(1153), name: Some("python_surface_module".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/python.dag", 8052, 8255))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 8006, 8255) }, + Declaration { id: DeclarationId(1154), name: Some("python_surface_item".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/python.dag", 8301, 8419))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 8257, 8419) }, + Declaration { id: DeclarationId(1155), name: Some("python_surface_param".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/python.dag", 8466, 8827))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 8421, 8827) }, + Declaration { id: DeclarationId(1156), name: Some("python_surface_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/python.dag", 8874, 9146))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 8829, 9146) }, + Declaration { id: DeclarationId(1157), name: Some("python_surface_variant".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/python.dag", 9195, 9558))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 9148, 9558) }, + Declaration { id: DeclarationId(1158), name: Some("python_variant_payload".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/python.dag", 9607, 9731))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 9560, 9731) }, + Declaration { id: DeclarationId(1159), name: Some("python_surface_type".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/python.dag", 9777, 9895))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 9733, 9895) }, + Declaration { id: DeclarationId(1160), name: Some("python_surface_record_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/python.dag", 9949, 10316))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 9897, 10316) }, + Declaration { id: DeclarationId(1161), name: Some("python_surface_map_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/python.dag", 10367, 10811))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 10318, 10811) }, + Declaration { id: DeclarationId(1162), name: Some("python_surface_match_arm".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/python.dag", 10862, 11227))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 10813, 11227) }, + Declaration { id: DeclarationId(1163), name: Some("python_surface_pattern_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/python.dag", 11282, 11655))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 11229, 11655) }, + Declaration { id: DeclarationId(1164), name: Some("python_surface_pattern".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/python.dag", 11704, 11828))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 11657, 11828) }, + Declaration { id: DeclarationId(1165), name: Some("python_surface_literal".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/python.dag", 11877, 12001))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 11830, 12001) }, + Declaration { id: DeclarationId(1166), name: Some("python_surface_expr".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/python.dag", 12047, 12165))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 12003, 12165) }, + Declaration { id: DeclarationId(1167), name: Some("python_int_add".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(298))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} + {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 12167, 12316) }, + Declaration { id: DeclarationId(1168), name: Some("python_int_sub".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(299))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} - {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 12318, 12467) }, + Declaration { id: DeclarationId(1169), name: Some("python_int_mul".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(301))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} * {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 12469, 12618) }, + Declaration { id: DeclarationId(1170), name: Some("python_int_div".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(303))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("(__v3_idiv({lhs}, {rhs}))".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 12620, 12779) }, + Declaration { id: DeclarationId(1171), name: Some("python_int_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(305))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 12781, 12929) }, + Declaration { id: DeclarationId(1172), name: Some("python_node_id_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(625))), ("op".to_string(), FieldValue::Reference(DeclarationId(305))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 12931, 13086) }, + Declaration { id: DeclarationId(1173), name: Some("python_port_id_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(626))), ("op".to_string(), FieldValue::Reference(DeclarationId(305))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 13088, 13243) }, + Declaration { id: DeclarationId(1174), name: Some("python_declaration_id_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(627))), ("op".to_string(), FieldValue::Reference(DeclarationId(305))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 13245, 13414) }, + Declaration { id: DeclarationId(1175), name: Some("python_int_ne".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(306))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} != {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 13416, 13564) }, + Declaration { id: DeclarationId(1176), name: Some("python_int_lt".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(307))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} < {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 13566, 13713) }, + Declaration { id: DeclarationId(1177), name: Some("python_int_le".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(308))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} <= {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 13715, 13863) }, + Declaration { id: DeclarationId(1178), name: Some("python_int_gt".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(309))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} > {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 13865, 14012) }, + Declaration { id: DeclarationId(1179), name: Some("python_int_ge".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(310))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} >= {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 14014, 14162) }, + Declaration { id: DeclarationId(1180), name: Some("python_bool_meet".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(88))), ("op".to_string(), FieldValue::Reference(DeclarationId(320))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} and {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 14164, 14322) }, + Declaration { id: DeclarationId(1181), name: Some("python_bool_join".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(88))), ("op".to_string(), FieldValue::Reference(DeclarationId(321))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} or {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 14324, 14481) }, + Declaration { id: DeclarationId(1182), name: Some("python_empty_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(591))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 14483, 14629) }, + Declaration { id: DeclarationId(1183), name: Some("python_singleton_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(595))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1768), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1766), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 14631, 14831) }, + Declaration { id: DeclarationId(1184), name: Some("python_cons_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(593))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1769), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1766), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1766), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 14833, 15058) }, + Declaration { id: DeclarationId(1185), name: Some("python_concat_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(603))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1770), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1766), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1766), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 15060, 15291) }, + Declaration { id: DeclarationId(1186), name: Some("python_length_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(613))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1771), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1765), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 15293, 15484) }, + Declaration { id: DeclarationId(1187), name: Some("python_is_empty_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(615))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1772), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1765), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 15486, 15682) }, + Declaration { id: DeclarationId(1188), name: Some("python_fold_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(597))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1773), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1765), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1766), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(2))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1765), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 15684, 15949) }, + Declaration { id: DeclarationId(1189), name: Some("python_map_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(605))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1774), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1765), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1765), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 15951, 16173) }, + Declaration { id: DeclarationId(1190), name: Some("python_filter_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(608))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1775), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1765), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1765), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 16175, 16406) }, + Declaration { id: DeclarationId(1191), name: Some("python_contains_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(623))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1776), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1765), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1765), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 16408, 16645) }, + Declaration { id: DeclarationId(1192), name: Some("python_list_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(589))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("list[{element}]".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 16647, 16795) }, + Declaration { id: DeclarationId(1193), name: Some("python_result_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(11))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("typing.Union[typing.Tuple[typing.Literal['Ok'], {key}], typing.Tuple[typing.Literal['Err'], {value}]]".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 16911, 17149) }, + Declaration { id: DeclarationId(1194), name: Some("python_non_empty_list_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(629))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NonEmptyList[{element}]".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 17240, 17414) }, + Declaration { id: DeclarationId(1195), name: Some("python_non_singleton_list_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(631))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NonSingletonList[{element}]".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 17416, 17602) }, + Declaration { id: DeclarationId(1196), name: Some("python_list_pattern".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("target".to_string(), FieldValue::Reference(DeclarationId(589))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1778), payload: vec![] }), ("empty_variant".to_string(), FieldValue::Reference(DeclarationId(1404))), ("cons_variant".to_string(), FieldValue::Reference(DeclarationId(1406))), ("scrutinee".to_string(), FieldValue::Literal(LiteralBits::String("{expr}".to_string()))), ("empty_pattern".to_string(), FieldValue::Literal(LiteralBits::String("len({expr}) == 0".to_string()))), ("cons_pattern".to_string(), FieldValue::Literal(LiteralBits::String("{expr}".to_string()))), ("head_expr".to_string(), FieldValue::Literal(LiteralBits::String("{list}[0]".to_string()))), ("tail_expr".to_string(), FieldValue::Literal(LiteralBits::String("{list}[1:]".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 17603, 17917) }, + Declaration { id: DeclarationId(1197), name: Some("python_correction_style".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(784), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(784)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("indent_unit".to_string(), FieldValue::Literal(LiteralBits::String(" ".to_string()))), ("line_ending".to_string(), FieldValue::Literal(LiteralBits::String("\n".to_string()))), ("string_quote".to_string(), FieldValue::Literal(LiteralBits::String("%Q".to_string()))), ("trailing_semicolon".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 19982, 20124) }, + Declaration { id: DeclarationId(1198), name: Some("python_clean_emission".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(775), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(775)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("expression_wrapping".to_string(), FieldValue::Variant { constructor: DeclarationId(1648), payload: vec![] }), ("pattern_bindings".to_string(), FieldValue::Variant { constructor: DeclarationId(1653), payload: vec![] }), ("variant_payload_field_access".to_string(), FieldValue::Variant { constructor: DeclarationId(1654), payload: vec![] }), ("imports".to_string(), FieldValue::Variant { constructor: DeclarationId(1657), payload: vec![] }), ("block_return".to_string(), FieldValue::Variant { constructor: DeclarationId(1661), payload: vec![] }), ("variable_bindings".to_string(), FieldValue::Variant { constructor: DeclarationId(1662), payload: vec![] }), ("match_arm_body".to_string(), FieldValue::Variant { constructor: DeclarationId(1667), payload: vec![] }), ("correction_style".to_string(), FieldValue::Reference(DeclarationId(1197))), ("post_emit_verifier".to_string(), FieldValue::Record(vec![("command".to_string(), FieldValue::Literal(LiteralBits::String("python3".to_string()))), ("args".to_string(), FieldValue::List(vec![FieldValue::Literal(LiteralBits::String("-m".to_string())), FieldValue::Literal(LiteralBits::String("py_compile".to_string()))])), ("syntax_only".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("expected_exit_code".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("output_policy".to_string(), FieldValue::Variant { constructor: DeclarationId(1669), payload: vec![] })]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 20126, 20706) }, + Declaration { id: DeclarationId(1199), name: Some("python_clean_emission_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(776), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(776)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1132))), ("clean_emission".to_string(), FieldValue::Reference(DeclarationId(1198)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/python.dag", 20708, 20844) }, + Declaration { id: DeclarationId(1200), name: Some("rust_execution_model".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(810), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(810)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("memory".to_string(), FieldValue::Variant { constructor: DeclarationId(1714), payload: vec![] }), ("scope".to_string(), FieldValue::Variant { constructor: DeclarationId(1715), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 4357, 4459) }, + Declaration { id: DeclarationId(1201), name: Some("rust_source_filtering".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(812), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(812)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("internal".to_string(), FieldValue::Reference(DeclarationId(813))), ("additional_excluded_prefixes".to_string(), FieldValue::List(vec![FieldValue::Literal(LiteralBits::String("src/v3/compiler/".to_string()))]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 4461, 4613) }, + Declaration { id: DeclarationId(1202), name: Some("rust_execution_requirement".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(814), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(814)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/rust.dag", 4676, 4690))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 4615, 4690) }, + Declaration { id: DeclarationId(1203), name: Some("rust_int".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("i64".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 5141, 5273) }, + Declaration { id: DeclarationId(1204), name: Some("rust_uint8".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(67))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("u8".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 5275, 5410) }, + Declaration { id: DeclarationId(1205), name: Some("rust_bool".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(88))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("bool".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 5412, 5547) }, + Declaration { id: DeclarationId(1206), name: Some("rust_string".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(186))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("String".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 5549, 5691) }, + Declaration { id: DeclarationId(1207), name: Some("rust_node_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(625))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NodeId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 5693, 5835) }, + Declaration { id: DeclarationId(1208), name: Some("rust_port_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(626))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PortId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 5837, 5979) }, + Declaration { id: DeclarationId(1209), name: Some("rust_declaration_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(627))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("DeclarationId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 5981, 6144) }, + Declaration { id: DeclarationId(1210), name: Some("rust_cluster_id".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(628))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ClusterId".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 6146, 6297) }, + Declaration { id: DeclarationId(1211), name: Some("rust_type_shape".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(682))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TypeShape".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("declaration".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("declaration".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 6299, 6544) }, + Declaration { id: DeclarationId(1212), name: Some("rust_port_state".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(683))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PortState".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 6546, 6698) }, + Declaration { id: DeclarationId(1213), name: Some("rust_port".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(684))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Port".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1763), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("state".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1763), payload: vec![FieldValue::Literal(LiteralBits::String("state_value".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("produced_by".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("produced_by".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 6700, 7096) }, + Declaration { id: DeclarationId(1214), name: Some("rust_source_span".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(121))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("SourceSpan".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("file".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("file".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("start".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("byte_start".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("end".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("byte_end".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 7098, 7496) }, + Declaration { id: DeclarationId(1215), name: Some("rust_literal_bits".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(685))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("LiteralBits".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 7498, 7656) }, + Declaration { id: DeclarationId(1216), name: Some("rust_atom_payload".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(686))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("AtomPayload".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 7658, 7816) }, + Declaration { id: DeclarationId(1217), name: Some("rust_cardinality_bound".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(691))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("CardinalityBound".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 7818, 7991) }, + Declaration { id: DeclarationId(1218), name: Some("rust_interval".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(689))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Interval".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 7993, 8141) }, + Declaration { id: DeclarationId(1219), name: Some("rust_positive_interval_width".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(687))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PositiveIntervalWidth".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 8143, 8332) }, + Declaration { id: DeclarationId(1220), name: Some("rust_interval_width".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(688))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("IntervalWidth".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 8334, 8498) }, + Declaration { id: DeclarationId(1221), name: Some("rust_conj_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(692))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Field".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("label".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("label".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("ty".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("ty".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 8500, 8802) }, + Declaration { id: DeclarationId(1222), name: Some("rust_template_argument".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(693))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TemplateArgument".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("parameter".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("parameter".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("value".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("value".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 8804, 9145) }, + Declaration { id: DeclarationId(1223), name: Some("rust_phantom_parameter".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(700))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PhantomParameter".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("parameter".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("parameter".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("algebra".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("algebra".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 9147, 9492) }, + Declaration { id: DeclarationId(1224), name: Some("rust_nominal_opacity".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(701))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NominalOpacity".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("permitted_accessors".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("permitted_accessors".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 9494, 9770) }, + Declaration { id: DeclarationId(1225), name: Some("rust_field_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(694))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("(String, FieldValue)".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("label".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("0".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("value".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("1".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 9772, 10089) }, + Declaration { id: DeclarationId(1226), name: Some("rust_non_empty_list".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(629))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NonEmptyList".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("first".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("first".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("rest".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("rest".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 10091, 10411) }, + Declaration { id: DeclarationId(1227), name: Some("rust_non_singleton_list".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(631))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("NonSingletonList".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("first".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("first".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("second".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("second".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("rest".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("rest".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 10413, 10826) }, + Declaration { id: DeclarationId(1228), name: Some("rust_element_ref".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(712))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ElementRef".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("index".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1763), payload: vec![FieldValue::Literal(LiteralBits::String("index_of".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 10828, 11069) }, + Declaration { id: DeclarationId(1229), name: Some("rust_param_ref".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(710))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ParamRef".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("member".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1763), payload: vec![FieldValue::Literal(LiteralBits::String("member_of".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("slot".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1763), payload: vec![FieldValue::Literal(LiteralBits::String("slot_of".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 11071, 11391) }, + Declaration { id: DeclarationId(1230), name: Some("rust_transform_ref".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(711))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TransformRef".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(true))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("node".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1763), payload: vec![FieldValue::Literal(LiteralBits::String("node_id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 11393, 11638) }, + Declaration { id: DeclarationId(1231), name: Some("rust_member_descent".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(714))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("MemberDescent".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("param".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("param".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 11640, 11885) }, + Declaration { id: DeclarationId(1232), name: Some("rust_intra_cluster_call".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(715))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("IntraClusterCall".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("transform".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("transform".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 11887, 12150) }, + Declaration { id: DeclarationId(1233), name: Some("rust_cluster".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(716))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Cluster".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("members".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("members".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("intra_cluster_calls".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("intra_cluster_calls".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 12152, 12489) }, + Declaration { id: DeclarationId(1234), name: Some("rust_field_value".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(695))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("FieldValue".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 12491, 12646) }, + Declaration { id: DeclarationId(1235), name: Some("rust_value_body".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(696))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ValueBody".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 12648, 12800) }, + Declaration { id: DeclarationId(1236), name: Some("rust_arrow_body".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(697))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ArrowBody".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 12802, 12954) }, + Declaration { id: DeclarationId(1237), name: Some("rust_type_connective".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(698))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TypeConnective".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 12956, 13123) }, + Declaration { id: DeclarationId(1238), name: Some("rust_declaration".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(699))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Declaration".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("connective".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("connective".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("type_params".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("type_params".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("phantom_params".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("phantom_params".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("meta_tag".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("meta_tag".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("inhabits".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("inhabits".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("value_body".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("value_body".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("nominal_opacity".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("nominal_opacity".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 13125, 14146) }, + Declaration { id: DeclarationId(1239), name: Some("rust_arithmetic_op".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(702))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ArithmeticOp".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 14148, 14309) }, + Declaration { id: DeclarationId(1240), name: Some("rust_comparison_op".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(703))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ComparisonOp".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 14311, 14472) }, + Declaration { id: DeclarationId(1241), name: Some("rust_logical_op".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(704))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("LogicalOp".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 14474, 14626) }, + Declaration { id: DeclarationId(1242), name: Some("rust_operator_kind".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(705))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("OperatorKind".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 14628, 14789) }, + Declaration { id: DeclarationId(1243), name: Some("rust_transform_target".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(706))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TransformTarget".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 14791, 14961) }, + Declaration { id: DeclarationId(1244), name: Some("rust_branch_pattern".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(707))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BranchPattern".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 14963, 15127) }, + Declaration { id: DeclarationId(1245), name: Some("rust_payload_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(708))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("PayloadBinding".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("binding_name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("binding_name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("payload_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("payload_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 15129, 15484) }, + Declaration { id: DeclarationId(1246), name: Some("rust_branch_path".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(709))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Path".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("body".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("body".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1763), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("pattern".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("pattern".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("binding".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("binding".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 15486, 15974) }, + Declaration { id: DeclarationId(1247), name: Some("rust_loop_bound".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(717))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("LoopBound".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 15976, 16128) }, + Declaration { id: DeclarationId(1248), name: Some("rust_value_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(718))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("ValueNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("payload".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("data".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1763), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("lane2_workflow".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1763), payload: vec![FieldValue::Literal(LiteralBits::String("lane2_workflow".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(true)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 16130, 16903) }, + Declaration { id: DeclarationId(1249), name: Some("rust_transform_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(719))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("TransformNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("target".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("target".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("inputs".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("inputs".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1763), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 16905, 17477) }, + Declaration { id: DeclarationId(1250), name: Some("rust_branch_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(721))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BranchNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("input".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("input".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("paths".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("paths".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1763), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("emit_participation".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1763), payload: vec![FieldValue::Literal(LiteralBits::String("emit_participation".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 17479, 18146) }, + Declaration { id: DeclarationId(1251), name: Some("rust_loop_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(722))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("LoopNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("source".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("source".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("init".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("init".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("body".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("body".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("bound".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("bound".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1763), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 18148, 18857) }, + Declaration { id: DeclarationId(1252), name: Some("rust_bind_node".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(724))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("BindNode".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("id".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("id".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("name".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("name".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("result_port".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1763), payload: vec![FieldValue::Literal(LiteralBits::String("result_port".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("params".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("params".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("span".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1762), payload: vec![FieldValue::Literal(LiteralBits::String("span".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("lane2_workflow".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1763), payload: vec![FieldValue::Literal(LiteralBits::String("lane2_workflow".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(true)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("emit_participation".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1763), payload: vec![FieldValue::Literal(LiteralBits::String("emit_participation".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 18859, 19619) }, + Declaration { id: DeclarationId(1253), name: Some("rust_behavior".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(725))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Behavior".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 19621, 19769) }, + Declaration { id: DeclarationId(1254), name: Some("rust_dag".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(726))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Dag".to_string()))), ("is_copy".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("fields".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("declarations".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1763), payload: vec![FieldValue::Literal(LiteralBits::String("declarations".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(true)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("nodes".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1763), payload: vec![FieldValue::Literal(LiteralBits::String("nodes".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(true)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("ports".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1763), payload: vec![FieldValue::Literal(LiteralBits::String("ports".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(false)))]), FieldValue::Record(vec![("dag_name".to_string(), FieldValue::Literal(LiteralBits::String("clusters".to_string()))), ("access".to_string(), FieldValue::Variant { constructor: DeclarationId(1763), payload: vec![FieldValue::Literal(LiteralBits::String("clusters".to_string()))] }), ("borrowed_read".to_string(), FieldValue::Literal(LiteralBits::Bool(true)))])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 19771, 20251) }, + Declaration { id: DeclarationId(1255), name: Some("rust_surface_module".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/rust.dag", 20508, 20724))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 20464, 20724) }, + Declaration { id: DeclarationId(1256), name: Some("rust_surface_item".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/rust.dag", 20768, 20899))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 20726, 20899) }, + Declaration { id: DeclarationId(1257), name: Some("rust_surface_param".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/rust.dag", 20944, 21318))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 20901, 21318) }, + Declaration { id: DeclarationId(1258), name: Some("rust_surface_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/rust.dag", 21363, 21648))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 21320, 21648) }, + Declaration { id: DeclarationId(1259), name: Some("rust_surface_variant".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/rust.dag", 21695, 22071))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 21650, 22071) }, + Declaration { id: DeclarationId(1260), name: Some("rust_variant_payload".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/rust.dag", 22118, 22255))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 22073, 22255) }, + Declaration { id: DeclarationId(1261), name: Some("rust_surface_type".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/rust.dag", 22299, 22430))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 22257, 22430) }, + Declaration { id: DeclarationId(1262), name: Some("rust_surface_record_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/rust.dag", 22482, 22862))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 22432, 22862) }, + Declaration { id: DeclarationId(1263), name: Some("rust_surface_map_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/rust.dag", 22911, 23368))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 22864, 23368) }, + Declaration { id: DeclarationId(1264), name: Some("rust_surface_match_arm".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/rust.dag", 23417, 23795))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 23370, 23795) }, + Declaration { id: DeclarationId(1265), name: Some("rust_surface_pattern_field".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/rust.dag", 23848, 24234))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 23797, 24234) }, + Declaration { id: DeclarationId(1266), name: Some("rust_surface_pattern".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/rust.dag", 24281, 24418))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 24236, 24418) }, + Declaration { id: DeclarationId(1267), name: Some("rust_surface_literal".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/rust.dag", 24465, 24602))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 24420, 24602) }, + Declaration { id: DeclarationId(1268), name: Some("rust_surface_expr".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(850), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(850)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Unparsed(SourceSpan::new("src/v3/spec/rust.dag", 24646, 24777))), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 24604, 24777) }, + Declaration { id: DeclarationId(1269), name: Some("rust_int_add".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(298))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} + {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 25632, 25777) }, + Declaration { id: DeclarationId(1270), name: Some("rust_int_sub".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(299))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} - {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 25779, 25924) }, + Declaration { id: DeclarationId(1271), name: Some("rust_int_mul".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(301))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} * {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 25926, 26071) }, + Declaration { id: DeclarationId(1272), name: Some("rust_int_div".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(303))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("(__v3_int_div({lhs}, {rhs}))".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 26073, 26231) }, + Declaration { id: DeclarationId(1273), name: Some("rust_int_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(305))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 26681, 26825) }, + Declaration { id: DeclarationId(1274), name: Some("rust_node_id_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(625))), ("op".to_string(), FieldValue::Reference(DeclarationId(305))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 26827, 26978) }, + Declaration { id: DeclarationId(1275), name: Some("rust_port_id_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(626))), ("op".to_string(), FieldValue::Reference(DeclarationId(305))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 26980, 27131) }, + Declaration { id: DeclarationId(1276), name: Some("rust_declaration_id_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(627))), ("op".to_string(), FieldValue::Reference(DeclarationId(305))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 27133, 27298) }, + Declaration { id: DeclarationId(1277), name: Some("rust_string_eq".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(186))), ("op".to_string(), FieldValue::Reference(DeclarationId(305))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} == {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 27491, 27641) }, + Declaration { id: DeclarationId(1278), name: Some("rust_int_ne".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(306))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} != {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 27643, 27787) }, + Declaration { id: DeclarationId(1279), name: Some("rust_node_id_ne".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(625))), ("op".to_string(), FieldValue::Reference(DeclarationId(306))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} != {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 27789, 27940) }, + Declaration { id: DeclarationId(1280), name: Some("rust_port_id_ne".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(626))), ("op".to_string(), FieldValue::Reference(DeclarationId(306))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} != {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 27942, 28093) }, + Declaration { id: DeclarationId(1281), name: Some("rust_declaration_id_ne".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(627))), ("op".to_string(), FieldValue::Reference(DeclarationId(306))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} != {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 28095, 28260) }, + Declaration { id: DeclarationId(1282), name: Some("rust_int_lt".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(307))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} < {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 28262, 28405) }, + Declaration { id: DeclarationId(1283), name: Some("rust_int_le".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(308))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} <= {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 28407, 28551) }, + Declaration { id: DeclarationId(1284), name: Some("rust_int_gt".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(309))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} > {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 28553, 28696) }, + Declaration { id: DeclarationId(1285), name: Some("rust_int_ge".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(71))), ("op".to_string(), FieldValue::Reference(DeclarationId(310))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} >= {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 28698, 28842) }, + Declaration { id: DeclarationId(1286), name: Some("rust_bool_meet".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(88))), ("op".to_string(), FieldValue::Reference(DeclarationId(320))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} && {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 28844, 28997) }, + Declaration { id: DeclarationId(1287), name: Some("rust_bool_join".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(853), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(853)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(88))), ("op".to_string(), FieldValue::Reference(DeclarationId(321))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({lhs} || {rhs})".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 28999, 29152) }, + Declaration { id: DeclarationId(1288), name: Some("rust_let_stmt".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(854), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(854)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(999))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("let {name}: {type} = {value};".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(0)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 29902, 30041) }, + Declaration { id: DeclarationId(1289), name: Some("rust_if_expr".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(854), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(854)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(997))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("if {cond} { {then} } else { {else} }".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(0)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 30043, 30190) }, + Declaration { id: DeclarationId(1290), name: Some("rust_main_wrap".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(854), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(854)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(1000))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("fn main() { {body} println!({quote}{{}}{quote}, {final}); }".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(0)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 30192, 30362) }, + Declaration { id: DeclarationId(1291), name: Some("rust_empty_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(591))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1767), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 31739, 31881) }, + Declaration { id: DeclarationId(1292), name: Some("rust_singleton_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(595))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1768), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1766), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 31883, 32079) }, + Declaration { id: DeclarationId(1293), name: Some("rust_cons_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(593))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1769), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1766), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1766), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 32081, 32302) }, + Declaration { id: DeclarationId(1294), name: Some("rust_concat_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(603))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1770), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1766), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1766), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 32304, 32531) }, + Declaration { id: DeclarationId(1295), name: Some("rust_length_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(613))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1771), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1765), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 32533, 32720) }, + Declaration { id: DeclarationId(1296), name: Some("rust_list_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(589))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Vec<{element}>".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 32722, 32865) }, + Declaration { id: DeclarationId(1297), name: Some("rust_result_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(11))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("::core::result::Result<{key}, {value}>".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 33144, 33315) }, + Declaration { id: DeclarationId(1298), name: Some("rust_lookup_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(940))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("Lookup<{element}>".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 33317, 33467) }, + Declaration { id: DeclarationId(1299), name: Some("rust_map_instantiation".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(858), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(858)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(97))), ("carrier".to_string(), FieldValue::Literal(LiteralBits::String("HashMap<{key}, {value}>".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 33469, 33619) }, + Declaration { id: DeclarationId(1300), name: Some("rust_is_empty_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(615))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1772), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1765), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 33621, 33813) }, + Declaration { id: DeclarationId(1301), name: Some("rust_fold_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(597))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1773), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1765), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1766), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(2))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1765), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 33815, 34076) }, + Declaration { id: DeclarationId(1302), name: Some("rust_map_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(605))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1774), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1765), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1765), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 34078, 34296) }, + Declaration { id: DeclarationId(1303), name: Some("rust_filter_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(608))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1775), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1765), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1765), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 34298, 34525) }, + Declaration { id: DeclarationId(1304), name: Some("rust_contains_callable".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(855), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(855)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(623))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1776), payload: vec![] }), ("parameters".to_string(), FieldValue::List(vec![FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1765), payload: vec![] })]), FieldValue::Record(vec![("slot".to_string(), FieldValue::Literal(LiteralBits::Int(1))), ("disposition".to_string(), FieldValue::Variant { constructor: DeclarationId(1765), payload: vec![] })])])), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 34527, 34760) }, + Declaration { id: DeclarationId(1305), name: Some("rust_list_pattern".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(860), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(860)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("target".to_string(), FieldValue::Reference(DeclarationId(589))), ("strategy".to_string(), FieldValue::Variant { constructor: DeclarationId(1778), payload: vec![] }), ("empty_variant".to_string(), FieldValue::Reference(DeclarationId(1404))), ("cons_variant".to_string(), FieldValue::Reference(DeclarationId(1406))), ("scrutinee".to_string(), FieldValue::Literal(LiteralBits::String("{expr}".to_string()))), ("empty_pattern".to_string(), FieldValue::Literal(LiteralBits::String("[]".to_string()))), ("cons_pattern".to_string(), FieldValue::Literal(LiteralBits::String("[{head}, {tail} @ ..]".to_string()))), ("head_expr".to_string(), FieldValue::Literal(LiteralBits::String("{head}".to_string()))), ("tail_expr".to_string(), FieldValue::Literal(LiteralBits::String("{tail}".to_string()))), ("cost".to_string(), FieldValue::Literal(LiteralBits::Int(1)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 34988, 35292) }, + Declaration { id: DeclarationId(1306), name: Some("rust_statements".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(862), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(862)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("let_binding".to_string(), FieldValue::Literal(LiteralBits::String("let {name}: {type} = {value};".to_string()))), ("let_binding_inferred".to_string(), FieldValue::Literal(LiteralBits::String("let {name} = {value};".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 35294, 35432) }, + Declaration { id: DeclarationId(1307), name: Some("rust_expressions".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(863), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(863)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("field_access".to_string(), FieldValue::Literal(LiteralBits::String("({object}).{field}".to_string()))), ("function_call".to_string(), FieldValue::Literal(LiteralBits::String("{func}({args})".to_string()))), ("closure".to_string(), FieldValue::Literal(LiteralBits::String("|{params}| {{ {body} }}".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 35434, 35587) }, + Declaration { id: DeclarationId(1308), name: Some("rust_control_flow".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(865), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(865)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("if_else".to_string(), FieldValue::Literal(LiteralBits::String("if {cond} { {then} } else { {else} }".to_string()))), ("match_arm".to_string(), FieldValue::Literal(LiteralBits::String("{pattern} => {body},".to_string()))), ("for_each_syntax".to_string(), FieldValue::Record(vec![("prefix".to_string(), FieldValue::Literal(LiteralBits::String("for ".to_string()))), ("separator".to_string(), FieldValue::Literal(LiteralBits::String(" in ".to_string())))]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 35589, 35779) }, + Declaration { id: DeclarationId(1309), name: Some("rust_literals".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(866), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(866)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("true_keyword".to_string(), FieldValue::Literal(LiteralBits::String("true".to_string()))), ("false_keyword".to_string(), FieldValue::Literal(LiteralBits::String("false".to_string()))), ("string_delimiter".to_string(), FieldValue::Literal(LiteralBits::String("%Q".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 35781, 35893) }, + Declaration { id: DeclarationId(1310), name: Some("rust_modules".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(867), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(867)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("path_separator".to_string(), FieldValue::Literal(LiteralBits::String("::".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 35895, 35955) }, + Declaration { id: DeclarationId(1311), name: Some("rust_functions".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(868), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(868)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("definition".to_string(), FieldValue::Literal(LiteralBits::String("fn {name}({params}) -> {ret} { {body} }".to_string()))), ("definition_exported".to_string(), FieldValue::Literal(LiteralBits::String("pub fn {name}({params}) -> {ret} { {body} }".to_string()))), ("definition_void".to_string(), FieldValue::Literal(LiteralBits::String("fn {name}({params}) { {body} }".to_string()))), ("param_with_type".to_string(), FieldValue::Literal(LiteralBits::String("{name}: {type}".to_string()))), ("param_separator".to_string(), FieldValue::Literal(LiteralBits::String(", ".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 35957, 36235) }, + Declaration { id: DeclarationId(1312), name: Some("rust_type_applications".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(869), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(869)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("optional".to_string(), FieldValue::Literal(LiteralBits::String("Option<{element}>".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 36237, 36325) }, + Declaration { id: DeclarationId(1313), name: Some("rust_type_defs".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(870), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(870)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("struct_def".to_string(), FieldValue::Literal(LiteralBits::String("#[derive(Clone, Debug)]\npub struct {name} { {fields} }".to_string()))), ("struct_field".to_string(), FieldValue::Literal(LiteralBits::String("pub {name}: {type},".to_string()))), ("enum_def".to_string(), FieldValue::Literal(LiteralBits::String("#[derive(Clone, Debug)]\npub enum {name} { {variants} }".to_string()))), ("enum_unit_variant".to_string(), FieldValue::Literal(LiteralBits::String("{name},".to_string()))), ("enum_data_variant".to_string(), FieldValue::Literal(LiteralBits::String("{name} { {fields} },".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 36327, 36629) }, + Declaration { id: DeclarationId(1314), name: Some("rust_record_derive_templates".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(871), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(871)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("struct_def_no_debug".to_string(), FieldValue::Literal(LiteralBits::String("#[derive(Clone)]\npub struct {name} { {fields} }".to_string()))), ("enum_def_no_debug".to_string(), FieldValue::Literal(LiteralBits::String("#[derive(Clone)]\npub enum {name} { {variants} }".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 36631, 36844) }, + Declaration { id: DeclarationId(1315), name: Some("rust_patterns".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(872), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(872)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("match_expr".to_string(), FieldValue::Literal(LiteralBits::String("match {expr} { {arms} }".to_string()))), ("match_arm".to_string(), FieldValue::Literal(LiteralBits::String("{pattern} => {body},".to_string()))), ("variant_pattern".to_string(), FieldValue::Literal(LiteralBits::String("{name} {{ {bindings} }}".to_string()))), ("variant_pattern_positional".to_string(), FieldValue::Literal(LiteralBits::String("{name}({binding})".to_string()))), ("variant_pattern_empty".to_string(), FieldValue::Literal(LiteralBits::String("{name}".to_string()))), ("field_binding".to_string(), FieldValue::Literal(LiteralBits::String("{field}: {binding}".to_string()))), ("field_binding_separator".to_string(), FieldValue::Literal(LiteralBits::String(", ".to_string()))), ("wildcard".to_string(), FieldValue::Literal(LiteralBits::String("_".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 36846, 37181) }, + Declaration { id: DeclarationId(1316), name: Some("rust_collection_ops".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(873), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(873)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("concat".to_string(), FieldValue::Literal(LiteralBits::String("{ let mut __left = {left}; __left.extend({right}); __left }".to_string()))), ("length".to_string(), FieldValue::Literal(LiteralBits::String("({recv}).len() as i64".to_string()))), ("is_empty".to_string(), FieldValue::Literal(LiteralBits::String("({recv}).is_empty()".to_string()))), ("fold".to_string(), FieldValue::Literal(LiteralBits::String("({recv}).iter().fold({init}, {body})".to_string()))), ("map".to_string(), FieldValue::Literal(LiteralBits::String("({recv}).iter().map({body}).collect::>()".to_string()))), ("filter".to_string(), FieldValue::Literal(LiteralBits::String("{ let mut __out = Vec::new(); for {item} in ({recv}).iter() { if {predicate} { __out.push({item_push}); } } __out }".to_string()))), ("contains".to_string(), FieldValue::Literal(LiteralBits::String("({recv}).contains({item})".to_string()))), ("empty_list".to_string(), FieldValue::Literal(LiteralBits::String("Vec::new()".to_string()))), ("list_literal".to_string(), FieldValue::Literal(LiteralBits::String("vec![{elements}]".to_string()))), ("cons".to_string(), FieldValue::Literal(LiteralBits::String("{ let mut __list = {tail}; __list.insert(0, {head}); __list }".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 37183, 37774) }, + Declaration { id: DeclarationId(1317), name: Some("rust_value_construction".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(874), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(874)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("struct_literal".to_string(), FieldValue::Literal(LiteralBits::String("{type} {{ {fields} }}".to_string()))), ("struct_field_init".to_string(), FieldValue::Literal(LiteralBits::String("{name}: {value}".to_string()))), ("struct_field_separator".to_string(), FieldValue::Literal(LiteralBits::String(", ".to_string()))), ("variant_construction".to_string(), FieldValue::Literal(LiteralBits::String("{variant}({args})".to_string()))), ("variant_named_construction".to_string(), FieldValue::Literal(LiteralBits::String("{variant} {{ {fields} }}".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 37776, 38048) }, + Declaration { id: DeclarationId(1318), name: Some("rust_rendering".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(875), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(875)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("read".to_string(), FieldValue::Variant { constructor: DeclarationId(1779), payload: vec![] }), ("construct".to_string(), FieldValue::Variant { constructor: DeclarationId(1781), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 38050, 38131) }, + Declaration { id: DeclarationId(1319), name: Some("rust_language".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(878), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(878)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("statements".to_string(), FieldValue::Reference(DeclarationId(1306))), ("expressions".to_string(), FieldValue::Reference(DeclarationId(1307))), ("control_flow".to_string(), FieldValue::Reference(DeclarationId(1308))), ("literals".to_string(), FieldValue::Reference(DeclarationId(1309))), ("modules".to_string(), FieldValue::Reference(DeclarationId(1310))), ("functions".to_string(), FieldValue::Reference(DeclarationId(1311))), ("type_applications".to_string(), FieldValue::Reference(DeclarationId(1312))), ("type_definitions".to_string(), FieldValue::Reference(DeclarationId(1313))), ("record_derive_templates".to_string(), FieldValue::Reference(DeclarationId(1314))), ("patterns".to_string(), FieldValue::Reference(DeclarationId(1315))), ("collection_ops".to_string(), FieldValue::Reference(DeclarationId(1316))), ("values".to_string(), FieldValue::Reference(DeclarationId(1317)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 38133, 38578) }, + Declaration { id: DeclarationId(1320), name: Some("rust_correction_style".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(784), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(784)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("indent_unit".to_string(), FieldValue::Literal(LiteralBits::String(" ".to_string()))), ("line_ending".to_string(), FieldValue::Literal(LiteralBits::String("\n".to_string()))), ("string_quote".to_string(), FieldValue::Literal(LiteralBits::String("%Q".to_string()))), ("trailing_semicolon".to_string(), FieldValue::Literal(LiteralBits::Bool(true)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 40002, 40141) }, + Declaration { id: DeclarationId(1321), name: Some("rust_clean_emission".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(775), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(775)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("expression_wrapping".to_string(), FieldValue::Variant { constructor: DeclarationId(1648), payload: vec![] }), ("pattern_bindings".to_string(), FieldValue::Variant { constructor: DeclarationId(1651), payload: vec![] }), ("variant_payload_field_access".to_string(), FieldValue::Variant { constructor: DeclarationId(1655), payload: vec![] }), ("imports".to_string(), FieldValue::Variant { constructor: DeclarationId(1657), payload: vec![] }), ("block_return".to_string(), FieldValue::Variant { constructor: DeclarationId(1660), payload: vec![] }), ("variable_bindings".to_string(), FieldValue::Variant { constructor: DeclarationId(1663), payload: vec![] }), ("match_arm_body".to_string(), FieldValue::Variant { constructor: DeclarationId(1666), payload: vec![] }), ("correction_style".to_string(), FieldValue::Reference(DeclarationId(1320))), ("post_emit_verifier".to_string(), FieldValue::Record(vec![("command".to_string(), FieldValue::Literal(LiteralBits::String("rustc".to_string()))), ("args".to_string(), FieldValue::List(vec![FieldValue::Literal(LiteralBits::String("--edition=2021".to_string())), FieldValue::Literal(LiteralBits::String("-D".to_string())), FieldValue::Literal(LiteralBits::String("warnings".to_string()))])), ("syntax_only".to_string(), FieldValue::Literal(LiteralBits::Bool(false))), ("expected_exit_code".to_string(), FieldValue::Literal(LiteralBits::Int(0))), ("output_policy".to_string(), FieldValue::Variant { constructor: DeclarationId(1669), payload: vec![] })]))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 40143, 40756) }, + Declaration { id: DeclarationId(1322), name: Some("rust_clean_emission_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(776), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(776)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("language".to_string(), FieldValue::Reference(DeclarationId(1319))), ("clean_emission".to_string(), FieldValue::Reference(DeclarationId(1321)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 40758, 40888) }, + Declaration { id: DeclarationId(1323), name: Some("rust_port_accessor".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(727), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(727)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({p0}).port_opt({p1}).cloned()".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 41990, 42093) }, + Declaration { id: DeclarationId(1324), name: Some("rust_node_accessor".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(727), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(727)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({p0}).node_opt({p1}).cloned()".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 42095, 42198) }, + Declaration { id: DeclarationId(1325), name: Some("rust_resolve_producer_accessor".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(727), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(727)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({p0}).resolve_producer_opt({p1}).cloned()".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 42200, 42327) }, + Declaration { id: DeclarationId(1326), name: Some("port_binding_rust".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(728), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(728)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("accessor".to_string(), FieldValue::Reference(DeclarationId(729))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1323))), ("language".to_string(), FieldValue::Reference(DeclarationId(1319)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 42329, 42460) }, + Declaration { id: DeclarationId(1327), name: Some("node_binding_rust".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(728), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(728)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("accessor".to_string(), FieldValue::Reference(DeclarationId(730))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1324))), ("language".to_string(), FieldValue::Reference(DeclarationId(1319)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 42462, 42593) }, + Declaration { id: DeclarationId(1328), name: Some("resolve_producer_binding_rust".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(728), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(728)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("accessor".to_string(), FieldValue::Reference(DeclarationId(731))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1325))), ("language".to_string(), FieldValue::Reference(DeclarationId(1319)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 42595, 42762) }, + Declaration { id: DeclarationId(1329), name: Some("rust_lane2_workflow_accessor".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(727), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(727)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({p0}).lane2_workflow_effect_at({p1}).cloned()".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 43273, 43402) }, + Declaration { id: DeclarationId(1330), name: Some("lane2_workflow_at_binding_rust".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(728), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(728)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("accessor".to_string(), FieldValue::Reference(DeclarationId(733))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1329))), ("language".to_string(), FieldValue::Reference(DeclarationId(1319)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 43404, 43571) }, + Declaration { id: DeclarationId(1331), name: Some("rust_declaration_by_id_accessor".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(727), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(727)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({p0}).declaration_opt({p1}).cloned()".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 43898, 44021) }, + Declaration { id: DeclarationId(1332), name: Some("declaration_by_id_binding_rust".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(728), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(728)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("accessor".to_string(), FieldValue::Reference(DeclarationId(732))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1331))), ("language".to_string(), FieldValue::Reference(DeclarationId(1319)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 44023, 44193) }, + Declaration { id: DeclarationId(1333), name: Some("CompilerHostRealization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 453, 502) }, + Declaration { id: DeclarationId(1334), name: Some("PipelineSnapshotKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "SnapshotSurface".to_string(), ty: DeclarationId(1992) }, Field { label: "SnapshotDag".to_string(), ty: DeclarationId(1993) }, Field { label: "SnapshotText".to_string(), ty: DeclarationId(1994) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 504, 576) }, + Declaration { id: DeclarationId(1335), name: Some("PipelineStageBinding".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "stage".to_string(), ty: DeclarationId(1001) }, Field { label: "realization".to_string(), ty: DeclarationId(1001) }, Field { label: "snapshot".to_string(), ty: DeclarationId(1334) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 578, 694) }, + Declaration { id: DeclarationId(1336), name: Some("parse_realization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1333)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("symbol".to_string(), FieldValue::Literal(LiteralBits::String("v3_compiler::parse".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 696, 780) }, + Declaration { id: DeclarationId(1337), name: Some("lower_realization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1333)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("symbol".to_string(), FieldValue::Literal(LiteralBits::String("v3_compiler::lower".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 782, 866) }, + Declaration { id: DeclarationId(1338), name: Some("infer_realization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1333)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("symbol".to_string(), FieldValue::Literal(LiteralBits::String("v3_compiler::infer".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 868, 952) }, + Declaration { id: DeclarationId(1339), name: Some("compute_ownership_realization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1333)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("symbol".to_string(), FieldValue::Literal(LiteralBits::String("v3_compiler::compute_ownership".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 954, 1062) }, + Declaration { id: DeclarationId(1340), name: Some("emit_realization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1333)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("symbol".to_string(), FieldValue::Literal(LiteralBits::String("v3_compiler::emit".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1064, 1146) }, + Declaration { id: DeclarationId(1341), name: Some("lens_complexity_realization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1333)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("symbol".to_string(), FieldValue::Literal(LiteralBits::String("v3_compiler::lens_complexity".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1148, 1252) }, + Declaration { id: DeclarationId(1342), name: Some("parse_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1335), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1335)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1348))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1336))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(1992), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1254, 1382) }, + Declaration { id: DeclarationId(1343), name: Some("lower_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1335), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1335)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1349))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1337))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(1993), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1384, 1508) }, + Declaration { id: DeclarationId(1344), name: Some("infer_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1335), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1335)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1350))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1338))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(1993), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1510, 1634) }, + Declaration { id: DeclarationId(1345), name: Some("compute_ownership_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1335), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1335)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1351))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1339))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(1993), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1636, 1796) }, + Declaration { id: DeclarationId(1346), name: Some("lens_complexity_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1335), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1335)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1352))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1341))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(1993), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1798, 1952) }, + Declaration { id: DeclarationId(1347), name: Some("emit_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1335), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1335)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1353))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1340))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(1994), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1954, 2076) }, + Declaration { id: DeclarationId(1348), name: Some("parse".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(186)], output: DeclarationId(726), body: ArrowBody::ExternalRealization(DeclarationId(1336)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2078, 2140) }, + Declaration { id: DeclarationId(1349), name: Some("lower".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(726)], output: DeclarationId(726), body: ArrowBody::ExternalRealization(DeclarationId(1337)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2142, 2184) }, + Declaration { id: DeclarationId(1350), name: Some("infer".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(726)], output: DeclarationId(726), body: ArrowBody::ExternalRealization(DeclarationId(1338)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2186, 2228) }, + Declaration { id: DeclarationId(1351), name: Some("compute_ownership".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(726)], output: DeclarationId(726), body: ArrowBody::ExternalRealization(DeclarationId(1339)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2230, 2288) }, + Declaration { id: DeclarationId(1352), name: Some("lens_complexity".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(726)], output: DeclarationId(726), body: ArrowBody::ExternalRealization(DeclarationId(1341)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2290, 2347) }, + Declaration { id: DeclarationId(1353), name: Some("emit".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(726), DeclarationId(726), DeclarationId(726), DeclarationId(878)], output: DeclarationId(186), body: ArrowBody::ExternalRealization(DeclarationId(1340)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2349, 2460) }, + Declaration { id: DeclarationId(1354), name: Some("compile".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(186), DeclarationId(878)], output: DeclarationId(186), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/compiler/pipeline.dag", 2533, 2605)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2462, 2605) }, + Declaration { id: DeclarationId(1355), name: Some("from_symbol".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(1995), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/compiler/operators.dag", 156, 771)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/operators.dag", 108, 771) }, + Declaration { id: DeclarationId(1356), name: Some("symbol".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(705)], output: DeclarationId(186), body: ArrowBody::UserDefined(NodeId(253)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/operators.dag", 773, 1214) }, + Declaration { id: DeclarationId(1357), name: Some("algebra_field_name".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(705)], output: DeclarationId(186), body: ArrowBody::UserDefined(NodeId(270)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/operators.dag", 1216, 2017) }, + Declaration { id: DeclarationId(1358), name: Some("LensRegistryEntry".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(111) }, Field { label: "lens_file".to_string(), ty: DeclarationId(120) }, Field { label: "generated_file".to_string(), ty: DeclarationId(120) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 1950, 2045) }, + Declaration { id: DeclarationId(1359), name: Some("lens_cost_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1358), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1358)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("cost".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/complexity.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/lens_cost_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 2047, 2214) }, + Declaration { id: DeclarationId(1360), name: Some("lens_cost_symbolic_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1358), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1358)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("cost_symbolic".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/cost.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/lens_cost_symbolic_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 2216, 2404) }, + Declaration { id: DeclarationId(1361), name: Some("lens_effect_enumeration_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1358), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1358)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("effect_enumeration".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/effect_enumeration.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/lens_effect_enumeration_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 2406, 2623) }, + Declaration { id: DeclarationId(1362), name: Some("lens_provenance_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1358), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1358)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("provenance".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/provenance.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/lens_provenance_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 2625, 2810) }, + Declaration { id: DeclarationId(1363), name: Some("lens_structural_resolution_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1358), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1358)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("structural_resolution".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/structural_resolution.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/lens_structural_resolution_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 2812, 3041) }, + Declaration { id: DeclarationId(1364), name: Some("lens_unused_parameters_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1358), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1358)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("unused_parameters".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/unused_parameters.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/lens_unused_parameters_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 3043, 3256) }, + Declaration { id: DeclarationId(1365), name: Some("lens_infer_helpers_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1358), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1358)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("infer_helpers".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/infer_helpers.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/infer_helpers_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 3883, 4075) }, + Declaration { id: DeclarationId(1366), name: Some("lens_variant_payload_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1358), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1358)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("variant_payload".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/variant_payload.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/variant_payload_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 4077, 4277) }, + Declaration { id: DeclarationId(1367), name: Some("lens_lower_helpers_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1358), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1358)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("lower_helpers".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/lower_helpers.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/lower_helpers_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 4527, 4719) }, + Declaration { id: DeclarationId(1368), name: Some("IntegerAlgebra".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "OrderedRingAlgebra".to_string(), ty: DeclarationId(1996) }, Field { label: "SemiringAlgebra".to_string(), ty: DeclarationId(1997) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5230, 5292) }, + Declaration { id: DeclarationId(1369), name: Some("NonIntegerAlgebra".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "BooleanAlgebraAlgebra".to_string(), ty: DeclarationId(1998) }, Field { label: "TerminalAlgebra".to_string(), ty: DeclarationId(1999) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5294, 5362) }, + Declaration { id: DeclarationId(1370), name: Some("TargetCarrier".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "BitCarrier".to_string(), ty: DeclarationId(2000) }, Field { label: "ByteCarrier".to_string(), ty: DeclarationId(2001) }, Field { label: "Word16Carrier".to_string(), ty: DeclarationId(2002) }, Field { label: "Word32Carrier".to_string(), ty: DeclarationId(2003) }, Field { label: "Word64Carrier".to_string(), ty: DeclarationId(2004) }, Field { label: "TerminalCarrier".to_string(), ty: DeclarationId(2005) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6852, 6975) }, + Declaration { id: DeclarationId(1371), name: Some("IntegerOverflow".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "TwoComplementWrap".to_string(), ty: DeclarationId(2006) }, Field { label: "Saturating".to_string(), ty: DeclarationId(2007) }, Field { label: "Trap".to_string(), ty: DeclarationId(2008) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 7692, 7758) }, + Declaration { id: DeclarationId(1372), name: Some("RustPrimitive".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "IntegerPrimitive".to_string(), ty: DeclarationId(2009) }, Field { label: "NonIntegerPrimitive".to_string(), ty: DeclarationId(2010) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 8513, 9295) }, + Declaration { id: DeclarationId(1373), name: Some("rust_pilot_primitives".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(1372) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(2011)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![FieldValue::Variant { constructor: DeclarationId(2009), payload: vec![FieldValue::Literal(LiteralBits::String("i8".to_string())), FieldValue::Variant { constructor: DeclarationId(1996), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2001), payload: vec![] }, FieldValue::Literal(LiteralBits::String("-128".to_string())), FieldValue::Literal(LiteralBits::String("127".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2006), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2009), payload: vec![FieldValue::Literal(LiteralBits::String("i16".to_string())), FieldValue::Variant { constructor: DeclarationId(1996), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2002), payload: vec![] }, FieldValue::Literal(LiteralBits::String("-32768".to_string())), FieldValue::Literal(LiteralBits::String("32767".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2006), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2009), payload: vec![FieldValue::Literal(LiteralBits::String("i32".to_string())), FieldValue::Variant { constructor: DeclarationId(1996), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2003), payload: vec![] }, FieldValue::Literal(LiteralBits::String("-2147483648".to_string())), FieldValue::Literal(LiteralBits::String("2147483647".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2006), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2009), payload: vec![FieldValue::Literal(LiteralBits::String("i64".to_string())), FieldValue::Variant { constructor: DeclarationId(1996), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2004), payload: vec![] }, FieldValue::Literal(LiteralBits::String("-9223372036854775808".to_string())), FieldValue::Literal(LiteralBits::String("9223372036854775807".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2006), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2009), payload: vec![FieldValue::Literal(LiteralBits::String("u8".to_string())), FieldValue::Variant { constructor: DeclarationId(1997), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2001), payload: vec![] }, FieldValue::Literal(LiteralBits::String("0".to_string())), FieldValue::Literal(LiteralBits::String("255".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2006), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2009), payload: vec![FieldValue::Literal(LiteralBits::String("u16".to_string())), FieldValue::Variant { constructor: DeclarationId(1997), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2002), payload: vec![] }, FieldValue::Literal(LiteralBits::String("0".to_string())), FieldValue::Literal(LiteralBits::String("65535".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2006), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2009), payload: vec![FieldValue::Literal(LiteralBits::String("u32".to_string())), FieldValue::Variant { constructor: DeclarationId(1997), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2003), payload: vec![] }, FieldValue::Literal(LiteralBits::String("0".to_string())), FieldValue::Literal(LiteralBits::String("4294967295".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2006), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2009), payload: vec![FieldValue::Literal(LiteralBits::String("u64".to_string())), FieldValue::Variant { constructor: DeclarationId(1997), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2004), payload: vec![] }, FieldValue::Literal(LiteralBits::String("0".to_string())), FieldValue::Literal(LiteralBits::String("18446744073709551615".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2006), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2010), payload: vec![FieldValue::Literal(LiteralBits::String("bool".to_string())), FieldValue::Variant { constructor: DeclarationId(1998), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2000), payload: vec![] }, FieldValue::Literal(LiteralBits::Bool(true))] }, FieldValue::Variant { constructor: DeclarationId(2010), payload: vec![FieldValue::Literal(LiteralBits::String("()".to_string())), FieldValue::Variant { constructor: DeclarationId(1999), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2005), payload: vec![] }, FieldValue::Literal(LiteralBits::Bool(true))] }])), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 9595, 12449) }, + Declaration { id: DeclarationId(1374), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(592) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3259, 3272) }, + Declaration { id: DeclarationId(1375), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(594) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3421, 3434) }, + Declaration { id: DeclarationId(1376), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(594) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3439, 3452) }, + Declaration { id: DeclarationId(1377), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(596) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3556, 3569) }, + Declaration { id: DeclarationId(1378), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(598) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4162, 4169) }, + Declaration { id: DeclarationId(1379), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(599), DeclarationId(598)], output: DeclarationId(599), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4183, 4196) }, + Declaration { id: DeclarationId(1380), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(601) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4617, 4624) }, + Declaration { id: DeclarationId(1381), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(601), DeclarationId(602)], output: DeclarationId(602), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4638, 4651) }, + Declaration { id: DeclarationId(1382), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(604) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5336, 5349) }, + Declaration { id: DeclarationId(1383), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(604) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5354, 5367) }, + Declaration { id: DeclarationId(1384), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(604) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5372, 5385) }, + Declaration { id: DeclarationId(1385), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(606) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5686, 5693) }, + Declaration { id: DeclarationId(1386), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(606)], output: DeclarationId(607), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5698, 5708) }, + Declaration { id: DeclarationId(1387), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(607) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5713, 5720) }, + Declaration { id: DeclarationId(1388), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(609) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5867, 5874) }, + Declaration { id: DeclarationId(1389), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(609)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5879, 5892) }, + Declaration { id: DeclarationId(1390), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(609) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5897, 5904) }, + Declaration { id: DeclarationId(1391), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(611) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6130, 6137) }, + Declaration { id: DeclarationId(1392), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(612) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6151, 6158) }, + Declaration { id: DeclarationId(1393), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(611)], output: DeclarationId(1392), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6142, 6158) }, + Declaration { id: DeclarationId(1394), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(612) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6163, 6170) }, + Declaration { id: DeclarationId(1395), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(614) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6356, 6363) }, + Declaration { id: DeclarationId(1396), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(616) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 6588, 6595) }, + Declaration { id: DeclarationId(1397), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(620) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7202, 7209) }, + Declaration { id: DeclarationId(1398), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(617), arguments: vec![TemplateArgument { parameter: DeclarationId(618), value: DeclarationId(620) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7219, 7236) }, + Declaration { id: DeclarationId(1399), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(1398) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7214, 7237) }, + Declaration { id: DeclarationId(1400), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(622) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7415, 7422) }, + Declaration { id: DeclarationId(1401), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(617), arguments: vec![TemplateArgument { parameter: DeclarationId(618), value: DeclarationId(622) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7444, 7461) }, + Declaration { id: DeclarationId(1402), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(1401) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 7439, 7462) }, + Declaration { id: DeclarationId(1403), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(624) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 8177, 8184) }, + Declaration { id: DeclarationId(1404), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 2106, 2111) }, + Declaration { id: DeclarationId(1405), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(590) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 2144, 2157) }, + Declaration { id: DeclarationId(1406), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "head".to_string(), ty: DeclarationId(590) }, Field { label: "tail".to_string(), ty: DeclarationId(1405) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 2116, 2159) }, + Declaration { id: DeclarationId(1407), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(630) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1477, 1490) }, + Declaration { id: DeclarationId(1408), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(632) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate_minimal.dag", 1570, 1583) }, + Declaration { id: DeclarationId(1409), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 11753, 11760) }, + Declaration { id: DeclarationId(1410), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(712), arguments: vec![TemplateArgument { parameter: DeclarationId(713), value: DeclarationId(648) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 20916, 20943) }, + Declaration { id: DeclarationId(1411), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(617), arguments: vec![TemplateArgument { parameter: DeclarationId(618), value: DeclarationId(648) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 20995, 21026) }, + Declaration { id: DeclarationId(1412), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(712), arguments: vec![TemplateArgument { parameter: DeclarationId(713), value: DeclarationId(648) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 21031, 21058) }, + Declaration { id: DeclarationId(1413), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(1412), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 21031, 21059) }, + Declaration { id: DeclarationId(1414), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(648) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 21185, 21206) }, + Declaration { id: DeclarationId(1415), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(712), arguments: vec![TemplateArgument { parameter: DeclarationId(713), value: DeclarationId(648) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 21211, 21238) }, + Declaration { id: DeclarationId(1416), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(1415), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 21211, 21239) }, + Declaration { id: DeclarationId(1417), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(648) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 22268, 22289) }, + Declaration { id: DeclarationId(1418), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(156), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 29695, 29706) }, + Declaration { id: DeclarationId(1419), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 30432, 30439) }, + Declaration { id: DeclarationId(1420), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 30662, 30669) }, + Declaration { id: DeclarationId(1421), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(648) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 37237, 37258) }, + Declaration { id: DeclarationId(1422), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(679) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 37264, 37295) }, + Declaration { id: DeclarationId(1423), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "text".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 7532, 7561) }, + Declaration { id: DeclarationId(1424), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 7566, 7595) }, + Declaration { id: DeclarationId(1425), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(633) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 7627, 7645) }, + Declaration { id: DeclarationId(1426), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(633) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 8066, 8084) }, + Declaration { id: DeclarationId(1427), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "tokens".to_string(), ty: DeclarationId(1426) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 8036, 8086) }, + Declaration { id: DeclarationId(1428), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "segment".to_string(), ty: DeclarationId(186) }, Field { label: "reason".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 8091, 8147) }, + Declaration { id: DeclarationId(1429), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "template".to_string(), ty: DeclarationId(634) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 8510, 8555) }, + Declaration { id: DeclarationId(1430), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "raw".to_string(), ty: DeclarationId(186) }, Field { label: "segment".to_string(), ty: DeclarationId(186) }, Field { label: "reason".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 8560, 8630) }, + Declaration { id: DeclarationId(1431), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 14355, 14365) }, + Declaration { id: DeclarationId(1432), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "key_source".to_string(), ty: DeclarationId(644) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 14370, 14408) }, + Declaration { id: DeclarationId(1433), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "key_source".to_string(), ty: DeclarationId(644) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 14413, 14451) }, + Declaration { id: DeclarationId(1434), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "cause".to_string(), ty: DeclarationId(643) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 14697, 14732) }, + Declaration { id: DeclarationId(1435), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 14737, 14749) }, + Declaration { id: DeclarationId(1436), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(640) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 15171, 15200) }, + Declaration { id: DeclarationId(1437), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(641) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 15205, 15230) }, + Declaration { id: DeclarationId(1438), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 15743, 15753) }, + Declaration { id: DeclarationId(1439), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "method".to_string(), ty: DeclarationId(156) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 15758, 15796) }, + Declaration { id: DeclarationId(1440), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 16501, 16528) }, + Declaration { id: DeclarationId(1441), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "field".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 16533, 16561) }, + Declaration { id: DeclarationId(1442), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 16589, 16601) }, + Declaration { id: DeclarationId(1443), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "fields".to_string(), ty: DeclarationId(1442) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 16566, 16603) }, + Declaration { id: DeclarationId(1444), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 17280, 17293) }, + Declaration { id: DeclarationId(1445), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 17298, 17312) }, + Declaration { id: DeclarationId(1446), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "reason".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 17317, 17349) }, + Declaration { id: DeclarationId(1447), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "effect".to_string(), ty: DeclarationId(648) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 19519, 19560) }, + Declaration { id: DeclarationId(1448), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "operation_name".to_string(), ty: DeclarationId(186) }, Field { label: "method_str".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 19565, 19634) }, + Declaration { id: DeclarationId(1449), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "operation_name".to_string(), ty: DeclarationId(186) }, Field { label: "method".to_string(), ty: DeclarationId(156) }, Field { label: "raw_path".to_string(), ty: DeclarationId(186) }, Field { label: "segment".to_string(), ty: DeclarationId(186) }, Field { label: "reason".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 19639, 19789) }, + Declaration { id: DeclarationId(1450), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 20538, 20559) }, + Declaration { id: DeclarationId(1451), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(712), arguments: vec![TemplateArgument { parameter: DeclarationId(713), value: DeclarationId(648) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 20590, 20617) }, + Declaration { id: DeclarationId(1452), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "first_breaker".to_string(), ty: DeclarationId(1451) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 20564, 20619) }, + Declaration { id: DeclarationId(1453), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(648) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 24543, 24564) }, + Declaration { id: DeclarationId(1454), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "ops".to_string(), ty: DeclarationId(1453) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 24523, 24566) }, + Declaration { id: DeclarationId(1455), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(631), arguments: vec![TemplateArgument { parameter: DeclarationId(632), value: DeclarationId(657) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 24592, 24619) }, + Declaration { id: DeclarationId(1456), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "arms".to_string(), ty: DeclarationId(1455) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 24571, 24621) }, + Declaration { id: DeclarationId(1457), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "body".to_string(), ty: DeclarationId(658) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 24626, 24661) }, + Declaration { id: DeclarationId(1458), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(631), arguments: vec![TemplateArgument { parameter: DeclarationId(632), value: DeclarationId(658) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 24693, 24725) }, + Declaration { id: DeclarationId(1459), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "branches".to_string(), ty: DeclarationId(1458) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 24666, 24727) }, + Declaration { id: DeclarationId(1460), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(650) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 25364, 25410) }, + Declaration { id: DeclarationId(1461), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(659) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 25415, 25467) }, + Declaration { id: DeclarationId(1462), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 25964, 25984) }, + Declaration { id: DeclarationId(1463), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 25989, 26010) }, + Declaration { id: DeclarationId(1464), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 26015, 26038) }, + Declaration { id: DeclarationId(1465), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 26043, 26061) }, + Declaration { id: DeclarationId(1466), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 26066, 26084) }, + Declaration { id: DeclarationId(1467), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(650) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 26401, 26447) }, + Declaration { id: DeclarationId(1468), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(663) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 26452, 26504) }, + Declaration { id: DeclarationId(1469), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 33114, 33120) }, + Declaration { id: DeclarationId(1470), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "reason".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 33125, 33162) }, + Declaration { id: DeclarationId(1471), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "reason".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 33167, 33204) }, + Declaration { id: DeclarationId(1472), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 33678, 33697) }, + Declaration { id: DeclarationId(1473), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "agreement".to_string(), ty: DeclarationId(673) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/effects.dag", 33702, 33751) }, + Declaration { id: DeclarationId(1474), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(684), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 15978, 15986) }, + Declaration { id: DeclarationId(1475), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(725), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 16035, 16044) }, + Declaration { id: DeclarationId(1476), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(725), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 16110, 16119) }, + Declaration { id: DeclarationId(1477), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(699), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 16496, 16508) }, + Declaration { id: DeclarationId(1478), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(658), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 16817, 16832) }, + Declaration { id: DeclarationId(1479), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(940), arguments: vec![TemplateArgument { parameter: DeclarationId(941), value: DeclarationId(627) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 17203, 17224) }, + Declaration { id: DeclarationId(1480), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(940), arguments: vec![TemplateArgument { parameter: DeclarationId(941), value: DeclarationId(627) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 17288, 17309) }, + Declaration { id: DeclarationId(1481), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 456, 466) }, + Declaration { id: DeclarationId(1482), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(682) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 471, 490) }, + Declaration { id: DeclarationId(1483), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 495, 505) }, + Declaration { id: DeclarationId(1484), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(625), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 569, 576) }, + Declaration { id: DeclarationId(1485), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 768, 779) }, + Declaration { id: DeclarationId(1486), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 784, 797) }, + Declaration { id: DeclarationId(1487), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 802, 819) }, + Declaration { id: DeclarationId(1488), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(685) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 2850, 2870) }, + Declaration { id: DeclarationId(1489), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 2875, 2903) }, + Declaration { id: DeclarationId(1490), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(627) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 2908, 2942) }, + Declaration { id: DeclarationId(1491), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(627) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 2947, 2976) }, + Declaration { id: DeclarationId(1492), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 2981, 2998) }, + Declaration { id: DeclarationId(1493), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 3602, 3609) }, + Declaration { id: DeclarationId(1494), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "previous".to_string(), ty: DeclarationId(687) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 3614, 3664) }, + Declaration { id: DeclarationId(1495), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 3689, 3698) }, + Declaration { id: DeclarationId(1496), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(687) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 3703, 3739) }, + Declaration { id: DeclarationId(1497), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "lower".to_string(), ty: DeclarationId(690) }, Field { label: "width".to_string(), ty: DeclarationId(688) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4051, 4101) }, + Declaration { id: DeclarationId(1498), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4106, 4115) }, + Declaration { id: DeclarationId(1499), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4366, 4376) }, + Declaration { id: DeclarationId(1500), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4381, 4390) }, + Declaration { id: DeclarationId(1501), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4395, 4404) }, + Declaration { id: DeclarationId(1502), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(685) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4831, 4851) }, + Declaration { id: DeclarationId(1503), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(627) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4856, 4880) }, + Declaration { id: DeclarationId(1504), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(694) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4892, 4908) }, + Declaration { id: DeclarationId(1505), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(1504) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4885, 4909) }, + Declaration { id: DeclarationId(1506), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(695) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4919, 4935) }, + Declaration { id: DeclarationId(1507), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(1506) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4914, 4936) }, + Declaration { id: DeclarationId(1508), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(694) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4945, 4961) }, + Declaration { id: DeclarationId(1509), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(1508) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4941, 4962) }, + Declaration { id: DeclarationId(1510), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(695) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5025, 5041) }, + Declaration { id: DeclarationId(1511), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "constructor".to_string(), ty: DeclarationId(627) }, Field { label: "payload".to_string(), ty: DeclarationId(1510) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 4967, 5047) }, + Declaration { id: DeclarationId(1512), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5206, 5235) }, + Declaration { id: DeclarationId(1513), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(694) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5270, 5286) }, + Declaration { id: DeclarationId(1514), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "fields".to_string(), ty: DeclarationId(1513) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5240, 5288) }, + Declaration { id: DeclarationId(1515), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(694) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5306, 5322) }, + Declaration { id: DeclarationId(1516), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(1515) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5293, 5323) }, + Declaration { id: DeclarationId(1517), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(625) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5658, 5677) }, + Declaration { id: DeclarationId(1518), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(627) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5682, 5716) }, + Declaration { id: DeclarationId(1519), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5721, 5728) }, + Declaration { id: DeclarationId(1520), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5733, 5739) }, + Declaration { id: DeclarationId(1521), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5744, 5764) }, + Declaration { id: DeclarationId(1522), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(686) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 5993, 6010) }, + Declaration { id: DeclarationId(1523), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(692) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6032, 6047) }, + Declaration { id: DeclarationId(1524), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "children".to_string(), ty: DeclarationId(1523) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6015, 6049) }, + Declaration { id: DeclarationId(1525), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(692) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6071, 6086) }, + Declaration { id: DeclarationId(1526), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "variants".to_string(), ty: DeclarationId(1525) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6054, 6088) }, + Declaration { id: DeclarationId(1527), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(627) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6115, 6134) }, + Declaration { id: DeclarationId(1528), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "inputs".to_string(), ty: DeclarationId(1527) }, Field { label: "output".to_string(), ty: DeclarationId(627) }, Field { label: "body".to_string(), ty: DeclarationId(697) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6093, 6190) }, + Declaration { id: DeclarationId(1529), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "element".to_string(), ty: DeclarationId(627) }, Field { label: "bound".to_string(), ty: DeclarationId(691) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6195, 6273) }, + Declaration { id: DeclarationId(1530), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(693) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6341, 6363) }, + Declaration { id: DeclarationId(1531), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "template".to_string(), ty: DeclarationId(627) }, Field { label: "arguments".to_string(), ty: DeclarationId(1530) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6278, 6369) }, + Declaration { id: DeclarationId(1532), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6418, 6425) }, + Declaration { id: DeclarationId(1533), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(627) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6470, 6489) }, + Declaration { id: DeclarationId(1534), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(700) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6508, 6530) }, + Declaration { id: DeclarationId(1535), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(627), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6543, 6557) }, + Declaration { id: DeclarationId(1536), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(627), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6570, 6584) }, + Declaration { id: DeclarationId(1537), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(696), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6599, 6609) }, + Declaration { id: DeclarationId(1538), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(701), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 6629, 6644) }, + Declaration { id: DeclarationId(1539), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(627) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 7767, 7786) }, + Declaration { id: DeclarationId(1540), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8067, 8070) }, + Declaration { id: DeclarationId(1541), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8075, 8078) }, + Declaration { id: DeclarationId(1542), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8083, 8086) }, + Declaration { id: DeclarationId(1543), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8091, 8094) }, + Declaration { id: DeclarationId(1544), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8218, 8220) }, + Declaration { id: DeclarationId(1545), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8225, 8227) }, + Declaration { id: DeclarationId(1546), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8232, 8234) }, + Declaration { id: DeclarationId(1547), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8239, 8241) }, + Declaration { id: DeclarationId(1548), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8246, 8248) }, + Declaration { id: DeclarationId(1549), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8253, 8255) }, + Declaration { id: DeclarationId(1550), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8508, 8511) }, + Declaration { id: DeclarationId(1551), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8516, 8518) }, + Declaration { id: DeclarationId(1552), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(702) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8754, 8778) }, + Declaration { id: DeclarationId(1553), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(703) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8783, 8807) }, + Declaration { id: DeclarationId(1554), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(704) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 8812, 8830) }, + Declaration { id: DeclarationId(1555), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(627) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9017, 9040) }, + Declaration { id: DeclarationId(1556), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(627), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9105, 9119) }, + Declaration { id: DeclarationId(1557), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "field_label".to_string(), ty: DeclarationId(186) }, Field { label: "field_child".to_string(), ty: DeclarationId(1556) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9045, 9125) }, + Declaration { id: DeclarationId(1558), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(705) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9130, 9152) }, + Declaration { id: DeclarationId(1559), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "span".to_string(), ty: DeclarationId(121) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9277, 9329) }, + Declaration { id: DeclarationId(1560), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(627) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9334, 9364) }, + Declaration { id: DeclarationId(1561), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(708), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 9528, 9543) }, + Declaration { id: DeclarationId(1562), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(631), arguments: vec![TemplateArgument { parameter: DeclarationId(632), value: DeclarationId(714) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 11519, 11550) }, + Declaration { id: DeclarationId(1563), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(629), arguments: vec![TemplateArgument { parameter: DeclarationId(630), value: DeclarationId(715) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 11574, 11604) }, + Declaration { id: DeclarationId(1564), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "count".to_string(), ty: DeclarationId(626) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12030, 12059) }, + Declaration { id: DeclarationId(1565), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "cluster".to_string(), ty: DeclarationId(628) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12064, 12094) }, + Declaration { id: DeclarationId(1566), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(658), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12208, 12223) }, + Declaration { id: DeclarationId(1567), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(626) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12297, 12309) }, + Declaration { id: DeclarationId(1568), name: None, connective: TypeConnective::Atom(AtomPayload::UnresolvedIdentifier("UserMatch".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12550, 12559) }, + Declaration { id: DeclarationId(1569), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(709) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12617, 12633) }, + Declaration { id: DeclarationId(1570), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(720), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 12697, 12721) }, + Declaration { id: DeclarationId(1571), name: None, connective: TypeConnective::Atom(AtomPayload::UnresolvedIdentifier("UserCallable".to_string())), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13135, 13147) }, + Declaration { id: DeclarationId(1572), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(626) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13225, 13237) }, + Declaration { id: DeclarationId(1573), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(658), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13275, 13290) }, + Declaration { id: DeclarationId(1574), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(723), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13313, 13335) }, + Declaration { id: DeclarationId(1575), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(718) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13427, 13443) }, + Declaration { id: DeclarationId(1576), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(719) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13448, 13472) }, + Declaration { id: DeclarationId(1577), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(721) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13477, 13495) }, + Declaration { id: DeclarationId(1578), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(722) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13500, 13514) }, + Declaration { id: DeclarationId(1579), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(724) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13519, 13533) }, + Declaration { id: DeclarationId(1580), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(699) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13562, 13579) }, + Declaration { id: DeclarationId(1581), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(725) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13589, 13603) }, + Declaration { id: DeclarationId(1582), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(684) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13613, 13626) }, + Declaration { id: DeclarationId(1583), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(716) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/substrate.dag", 13639, 13652) }, + Declaration { id: DeclarationId(1584), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(940), arguments: vec![TemplateArgument { parameter: DeclarationId(941), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 9849, 9869) }, + Declaration { id: DeclarationId(1585), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(940), arguments: vec![TemplateArgument { parameter: DeclarationId(941), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 9933, 9953) }, + Declaration { id: DeclarationId(1586), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(631), arguments: vec![TemplateArgument { parameter: DeclarationId(632), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 10021, 10051) }, + Declaration { id: DeclarationId(1587), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 10518, 10536) }, + Declaration { id: DeclarationId(1588), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(631), arguments: vec![TemplateArgument { parameter: DeclarationId(632), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 10542, 10572) }, + Declaration { id: DeclarationId(1589), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 13069, 13087) }, + Declaration { id: DeclarationId(1590), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(631), arguments: vec![TemplateArgument { parameter: DeclarationId(632), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17290, 17320) }, + Declaration { id: DeclarationId(1591), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17325, 17343) }, + Declaration { id: DeclarationId(1592), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17594, 17612) }, + Declaration { id: DeclarationId(1593), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17617, 17635) }, + Declaration { id: DeclarationId(1594), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 18901, 18919) }, + Declaration { id: DeclarationId(1595), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 19172, 19190) }, + Declaration { id: DeclarationId(1596), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 19638, 19656) }, + Declaration { id: DeclarationId(1597), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21673, 21691) }, + Declaration { id: DeclarationId(1598), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21721, 21739) }, + Declaration { id: DeclarationId(1599), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 22026, 22044) }, + Declaration { id: DeclarationId(1600), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 22072, 22090) }, + Declaration { id: DeclarationId(1601), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 22450, 22468) }, + Declaration { id: DeclarationId(1602), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 22473, 22491) }, + Declaration { id: DeclarationId(1603), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 4805, 4817) }, + Declaration { id: DeclarationId(1604), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 4822, 4838) }, + Declaration { id: DeclarationId(1605), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 4843, 4857) }, + Declaration { id: DeclarationId(1606), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 5707, 5720) }, + Declaration { id: DeclarationId(1607), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 5725, 5740) }, + Declaration { id: DeclarationId(1608), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 5745, 5761) }, + Declaration { id: DeclarationId(1609), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 5766, 5779) }, + Declaration { id: DeclarationId(1610), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(737), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 6632, 6653) }, + Declaration { id: DeclarationId(1611), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(738), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 6668, 6678) }, + Declaration { id: DeclarationId(1612), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 6708, 6712) }, + Declaration { id: DeclarationId(1613), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8181, 8190) }, + Declaration { id: DeclarationId(1614), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "previous".to_string(), ty: DeclarationId(741) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8195, 8241) }, + Declaration { id: DeclarationId(1615), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8413, 8430) }, + Declaration { id: DeclarationId(1616), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(740) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8435, 8459) }, + Declaration { id: DeclarationId(1617), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "var".to_string(), ty: DeclarationId(740) }, Field { label: "degree".to_string(), ty: DeclarationId(741) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8464, 8526) }, + Declaration { id: DeclarationId(1618), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(631), arguments: vec![TemplateArgument { parameter: DeclarationId(632), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8543, 8573) }, + Declaration { id: DeclarationId(1619), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(1618) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8531, 8574) }, + Declaration { id: DeclarationId(1620), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(631), arguments: vec![TemplateArgument { parameter: DeclarationId(632), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8587, 8617) }, + Declaration { id: DeclarationId(1621), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(1620) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8579, 8618) }, + Declaration { id: DeclarationId(1622), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(740) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8623, 8644) }, + Declaration { id: DeclarationId(1623), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 8649, 8668) }, + Declaration { id: DeclarationId(1624), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(595), arguments: vec![TemplateArgument { parameter: DeclarationId(596), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 10402, 10414) }, + Declaration { id: DeclarationId(1625), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(632)], output: DeclarationId(88), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 5879, 5892) }, + Declaration { id: DeclarationId(1626), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(608), arguments: vec![TemplateArgument { parameter: DeclarationId(609), value: DeclarationId(742) }, TemplateArgument { parameter: DeclarationId(1389), value: DeclarationId(749) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 10395, 10442) }, + Declaration { id: DeclarationId(1627), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(595), arguments: vec![TemplateArgument { parameter: DeclarationId(596), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 10702, 10717) }, + Declaration { id: DeclarationId(1628), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(742), DeclarationId(742)], output: DeclarationId(742), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4183, 4196) }, + Declaration { id: DeclarationId(1629), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(597), arguments: vec![TemplateArgument { parameter: DeclarationId(599), value: DeclarationId(742) }, TemplateArgument { parameter: DeclarationId(598), value: DeclarationId(742) }, TemplateArgument { parameter: DeclarationId(1379), value: DeclarationId(753) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 13109, 13152) }, + Declaration { id: DeclarationId(1630), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(743), DeclarationId(598)], output: DeclarationId(743), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4183, 4196) }, + Declaration { id: DeclarationId(1631), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(597), arguments: vec![TemplateArgument { parameter: DeclarationId(599), value: DeclarationId(743) }, TemplateArgument { parameter: DeclarationId(1379), value: DeclarationId(770) }, TemplateArgument { parameter: DeclarationId(598), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 15818, 15928) }, + Declaration { id: DeclarationId(1632), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(743), DeclarationId(598)], output: DeclarationId(743), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4183, 4196) }, + Declaration { id: DeclarationId(1633), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(597), arguments: vec![TemplateArgument { parameter: DeclarationId(599), value: DeclarationId(743) }, TemplateArgument { parameter: DeclarationId(1379), value: DeclarationId(770) }, TemplateArgument { parameter: DeclarationId(598), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 15983, 16093) }, + Declaration { id: DeclarationId(1634), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(593), arguments: vec![TemplateArgument { parameter: DeclarationId(594), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17366, 17396) }, + Declaration { id: DeclarationId(1635), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(593), arguments: vec![TemplateArgument { parameter: DeclarationId(594), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17348, 17397) }, + Declaration { id: DeclarationId(1636), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(591), arguments: vec![TemplateArgument { parameter: DeclarationId(592), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17667, 17674) }, + Declaration { id: DeclarationId(1637), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(593), arguments: vec![TemplateArgument { parameter: DeclarationId(594), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 17792, 17835) }, + Declaration { id: DeclarationId(1638), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(593), arguments: vec![TemplateArgument { parameter: DeclarationId(594), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 19105, 19137) }, + Declaration { id: DeclarationId(1639), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(591), arguments: vec![TemplateArgument { parameter: DeclarationId(592), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21776, 21783) }, + Declaration { id: DeclarationId(1640), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(593), arguments: vec![TemplateArgument { parameter: DeclarationId(594), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 21924, 21989) }, + Declaration { id: DeclarationId(1641), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(743), DeclarationId(742)], output: DeclarationId(743), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4183, 4196) }, + Declaration { id: DeclarationId(1642), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(597), arguments: vec![TemplateArgument { parameter: DeclarationId(599), value: DeclarationId(743) }, TemplateArgument { parameter: DeclarationId(598), value: DeclarationId(742) }, TemplateArgument { parameter: DeclarationId(1379), value: DeclarationId(770) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 22107, 22165) }, + Declaration { id: DeclarationId(1643), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(593), arguments: vec![TemplateArgument { parameter: DeclarationId(594), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 22191, 22237) }, + Declaration { id: DeclarationId(1644), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(591), arguments: vec![TemplateArgument { parameter: DeclarationId(592), value: DeclarationId(742) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 22508, 22515) }, + Declaration { id: DeclarationId(1645), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1602), DeclarationId(742)], output: DeclarationId(1602), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 4183, 4196) }, + Declaration { id: DeclarationId(1646), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(597), arguments: vec![TemplateArgument { parameter: DeclarationId(599), value: DeclarationId(1602) }, TemplateArgument { parameter: DeclarationId(598), value: DeclarationId(742) }, TemplateArgument { parameter: DeclarationId(1379), value: DeclarationId(773) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/algebra.dag", 22496, 22537) }, + Declaration { id: DeclarationId(1647), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 2224, 2238) }, + Declaration { id: DeclarationId(1648), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 2243, 2268) }, + Declaration { id: DeclarationId(1649), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 2273, 2283) }, + Declaration { id: DeclarationId(1650), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 2548, 2565) }, + Declaration { id: DeclarationId(1651), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 2570, 2594) }, + Declaration { id: DeclarationId(1652), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 2599, 2631) }, + Declaration { id: DeclarationId(1653), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 2636, 2663) }, + Declaration { id: DeclarationId(1654), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3369, 3393) }, + Declaration { id: DeclarationId(1655), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3398, 3430) }, + Declaration { id: DeclarationId(1656), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3564, 3588) }, + Declaration { id: DeclarationId(1657), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3593, 3614) }, + Declaration { id: DeclarationId(1658), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3619, 3637) }, + Declaration { id: DeclarationId(1659), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3781, 3796) }, + Declaration { id: DeclarationId(1660), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3801, 3831) }, + Declaration { id: DeclarationId(1661), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 3836, 3857) }, + Declaration { id: DeclarationId(1662), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 4024, 4044) }, + Declaration { id: DeclarationId(1663), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 4049, 4076) }, + Declaration { id: DeclarationId(1664), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 4081, 4095) }, + Declaration { id: DeclarationId(1665), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 4354, 4362) }, + Declaration { id: DeclarationId(1666), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 4367, 4393) }, + Declaration { id: DeclarationId(1667), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 4398, 4423) }, + Declaration { id: DeclarationId(1668), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 5320, 5332) }, + Declaration { id: DeclarationId(1669), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 5693, 5713) }, + Declaration { id: DeclarationId(1670), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 5718, 5736) }, + Declaration { id: DeclarationId(1671), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 5741, 5759) }, + Declaration { id: DeclarationId(1672), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/clean_emission.dag", 5764, 5791) }, + Declaration { id: DeclarationId(1673), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(186), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 5361, 5368) }, + Declaration { id: DeclarationId(1674), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 6292, 6296) }, + Declaration { id: DeclarationId(1675), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(799), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 7350, 7369) }, + Declaration { id: DeclarationId(1676), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(799), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 7915, 7934) }, + Declaration { id: DeclarationId(1677), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1356, 1388) }, + Declaration { id: DeclarationId(1678), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "witness".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1393, 1429) }, + Declaration { id: DeclarationId(1679), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "element".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1434, 1471) }, + Declaration { id: DeclarationId(1680), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1476, 1502) }, + Declaration { id: DeclarationId(1681), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1507, 1540) }, + Declaration { id: DeclarationId(1682), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1545, 1562) }, + Declaration { id: DeclarationId(1683), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "steps".to_string(), ty: DeclarationId(956) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1567, 1621) }, + Declaration { id: DeclarationId(1684), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 1626, 1633) }, + Declaration { id: DeclarationId(1685), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "accessor".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2165, 2203) }, + Declaration { id: DeclarationId(1686), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "amount".to_string(), ty: DeclarationId(956) }, Field { label: "collection".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2208, 2282) }, + Declaration { id: DeclarationId(1687), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "steps".to_string(), ty: DeclarationId(956) }, Field { label: "ring_param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2287, 2362) }, + Declaration { id: DeclarationId(1688), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "divisor".to_string(), ty: DeclarationId(957) }, Field { label: "ring_param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2367, 2440) }, + Declaration { id: DeclarationId(1689), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "witness".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2445, 2482) }, + Declaration { id: DeclarationId(1690), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "element".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2487, 2524) }, + Declaration { id: DeclarationId(1691), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "outer_collection".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2529, 2570) }, + Declaration { id: DeclarationId(1692), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2575, 2591) }, + Declaration { id: DeclarationId(1693), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2803, 2813) }, + Declaration { id: DeclarationId(1694), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "steps".to_string(), ty: DeclarationId(956) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2818, 2865) }, + Declaration { id: DeclarationId(1695), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "divisor".to_string(), ty: DeclarationId(957) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 2870, 2921) }, + Declaration { id: DeclarationId(1696), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 3111, 3115) }, + Declaration { id: DeclarationId(1697), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 3120, 3127) }, + Declaration { id: DeclarationId(1698), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 3132, 3138) }, + Declaration { id: DeclarationId(1699), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(791), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 3441, 3454) }, + Declaration { id: DeclarationId(1700), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 7082, 7093) }, + Declaration { id: DeclarationId(1701), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 7142, 7156) }, + Declaration { id: DeclarationId(1702), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation.dag", 7221, 7237) }, + Declaration { id: DeclarationId(1703), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 360, 369) }, + Declaration { id: DeclarationId(1704), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 374, 381) }, + Declaration { id: DeclarationId(1705), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 614, 618) }, + Declaration { id: DeclarationId(1706), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 623, 632) }, + Declaration { id: DeclarationId(1707), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 910, 921) }, + Declaration { id: DeclarationId(1708), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 926, 935) }, + Declaration { id: DeclarationId(1709), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 1166, 1173) }, + Declaration { id: DeclarationId(1710), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 1178, 1187) }, + Declaration { id: DeclarationId(1711), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2035, 2044) }, + Declaration { id: DeclarationId(1712), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2049, 2065) }, + Declaration { id: DeclarationId(1713), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2070, 2080) }, + Declaration { id: DeclarationId(1714), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2085, 2099) }, + Declaration { id: DeclarationId(1715), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2385, 2399) }, + Declaration { id: DeclarationId(1716), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2404, 2418) }, + Declaration { id: DeclarationId(1717), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 2818, 2830) }, + Declaration { id: DeclarationId(1718), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 3210, 3222) }, + Declaration { id: DeclarationId(1719), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 3694, 3708) }, + Declaration { id: DeclarationId(1720), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/computation_model.dag", 3713, 3729) }, + Declaration { id: DeclarationId(1721), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 1022, 1036) }, + Declaration { id: DeclarationId(1722), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 1041, 1051) }, + Declaration { id: DeclarationId(1723), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 1056, 1068) }, + Declaration { id: DeclarationId(1724), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 1073, 1085) }, + Declaration { id: DeclarationId(1725), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 1090, 1103) }, + Declaration { id: DeclarationId(1726), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 1108, 1120) }, + Declaration { id: DeclarationId(1727), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 1125, 1148) }, + Declaration { id: DeclarationId(1728), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(815) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 5348, 5384) }, + Declaration { id: DeclarationId(1729), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(818) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 5389, 5430) }, + Declaration { id: DeclarationId(1730), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(816) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/diagnostics.dag", 5889, 5905) }, + Declaration { id: DeclarationId(1731), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(31), arguments: vec![TemplateArgument { parameter: DeclarationId(32), value: DeclarationId(840) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4196, 4216) }, + Declaration { id: DeclarationId(1732), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(828), arguments: vec![TemplateArgument { parameter: DeclarationId(829), value: DeclarationId(839) }, TemplateArgument { parameter: DeclarationId(830), value: DeclarationId(840) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4226, 4250) }, + Declaration { id: DeclarationId(1733), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(828), arguments: vec![TemplateArgument { parameter: DeclarationId(829), value: DeclarationId(839) }, TemplateArgument { parameter: DeclarationId(830), value: DeclarationId(840) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4261, 4285) }, + Declaration { id: DeclarationId(1734), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(828), arguments: vec![TemplateArgument { parameter: DeclarationId(829), value: DeclarationId(839) }, TemplateArgument { parameter: DeclarationId(830), value: DeclarationId(840) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4291, 4315) }, + Declaration { id: DeclarationId(1735), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(31), arguments: vec![TemplateArgument { parameter: DeclarationId(32), value: DeclarationId(843) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4392, 4412) }, + Declaration { id: DeclarationId(1736), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(828), arguments: vec![TemplateArgument { parameter: DeclarationId(829), value: DeclarationId(842) }, TemplateArgument { parameter: DeclarationId(830), value: DeclarationId(843) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4422, 4446) }, + Declaration { id: DeclarationId(1737), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(828), arguments: vec![TemplateArgument { parameter: DeclarationId(829), value: DeclarationId(842) }, TemplateArgument { parameter: DeclarationId(830), value: DeclarationId(843) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4457, 4481) }, + Declaration { id: DeclarationId(1738), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(828), arguments: vec![TemplateArgument { parameter: DeclarationId(829), value: DeclarationId(842) }, TemplateArgument { parameter: DeclarationId(830), value: DeclarationId(843) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4487, 4511) }, + Declaration { id: DeclarationId(1739), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(31), arguments: vec![TemplateArgument { parameter: DeclarationId(32), value: DeclarationId(846) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4595, 4615) }, + Declaration { id: DeclarationId(1740), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(828), arguments: vec![TemplateArgument { parameter: DeclarationId(829), value: DeclarationId(845) }, TemplateArgument { parameter: DeclarationId(830), value: DeclarationId(846) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4626, 4650) }, + Declaration { id: DeclarationId(1741), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(828), arguments: vec![TemplateArgument { parameter: DeclarationId(829), value: DeclarationId(845) }, TemplateArgument { parameter: DeclarationId(830), value: DeclarationId(846) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4675, 4699) }, + Declaration { id: DeclarationId(1742), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(31), arguments: vec![TemplateArgument { parameter: DeclarationId(32), value: DeclarationId(849) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4790, 4810) }, + Declaration { id: DeclarationId(1743), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(828), arguments: vec![TemplateArgument { parameter: DeclarationId(829), value: DeclarationId(848) }, TemplateArgument { parameter: DeclarationId(830), value: DeclarationId(849) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4821, 4845) }, + Declaration { id: DeclarationId(1744), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(828), arguments: vec![TemplateArgument { parameter: DeclarationId(829), value: DeclarationId(848) }, TemplateArgument { parameter: DeclarationId(830), value: DeclarationId(849) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4870, 4894) }, + Declaration { id: DeclarationId(1745), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(822) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 1626, 1643) }, + Declaration { id: DeclarationId(1746), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "reason".to_string(), ty: DeclarationId(186) }, Field { label: "at".to_string(), ty: DeclarationId(725) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 1648, 1689) }, + Declaration { id: DeclarationId(1747), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 1871, 1883) }, + Declaration { id: DeclarationId(1748), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "value".to_string(), ty: DeclarationId(820) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 1888, 1924) }, + Declaration { id: DeclarationId(1749), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(821), arguments: vec![TemplateArgument { parameter: DeclarationId(822), value: DeclarationId(825) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 2406, 2422) }, + Declaration { id: DeclarationId(1750), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(1749) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 2401, 2423) }, + Declaration { id: DeclarationId(1751), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "dimension_name".to_string(), ty: DeclarationId(186) }, Field { label: "composed".to_string(), ty: DeclarationId(825) }, Field { label: "witnesses".to_string(), ty: DeclarationId(1750) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 2317, 2429) }, + Declaration { id: DeclarationId(1752), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(820) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 2497, 2513) }, + Declaration { id: DeclarationId(1753), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(821), arguments: vec![TemplateArgument { parameter: DeclarationId(822), value: DeclarationId(825) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 2536, 2552) }, + Declaration { id: DeclarationId(1754), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(1753) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 2531, 2553) }, + Declaration { id: DeclarationId(1755), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "dimension_name".to_string(), ty: DeclarationId(186) }, Field { label: "violations".to_string(), ty: DeclarationId(1752) }, Field { label: "witnesses".to_string(), ty: DeclarationId(1754) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 2434, 2559) }, + Declaration { id: DeclarationId(1756), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(821), arguments: vec![TemplateArgument { parameter: DeclarationId(822), value: DeclarationId(827) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 3216, 3232) }, + Declaration { id: DeclarationId(1757), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(726), DeclarationId(725)], output: DeclarationId(1756), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 3195, 3232) }, + Declaration { id: DeclarationId(1758), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(827), DeclarationId(827)], output: DeclarationId(827), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 3244, 3275) }, + Declaration { id: DeclarationId(1759), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(725), DeclarationId(827)], output: DeclarationId(823), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 3316, 3359) }, + Declaration { id: DeclarationId(1760), name: Some("DimensionUnitAbelianGroup".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(25), arguments: vec![TemplateArgument { parameter: DeclarationId(26), value: DeclarationId(829) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/dimensions.dag", 4002, 4052) }, + Declaration { id: DeclarationId(1761), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(851) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 815, 833) }, + Declaration { id: DeclarationId(1762), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 1337, 1356) }, + Declaration { id: DeclarationId(1763), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 1361, 1383) }, + Declaration { id: DeclarationId(1764), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(856) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 1752, 1775) }, + Declaration { id: DeclarationId(1765), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 2772, 2780) }, + Declaration { id: DeclarationId(1766), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 2785, 2793) }, + Declaration { id: DeclarationId(1767), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3345, 3354) }, + Declaration { id: DeclarationId(1768), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3359, 3372) }, + Declaration { id: DeclarationId(1769), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3377, 3385) }, + Declaration { id: DeclarationId(1770), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3390, 3400) }, + Declaration { id: DeclarationId(1771), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3405, 3415) }, + Declaration { id: DeclarationId(1772), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3420, 3431) }, + Declaration { id: DeclarationId(1773), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3436, 3444) }, + Declaration { id: DeclarationId(1774), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3449, 3456) }, + Declaration { id: DeclarationId(1775), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3461, 3471) }, + Declaration { id: DeclarationId(1776), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 3476, 3488) }, + Declaration { id: DeclarationId(1777), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6181, 6207) }, + Declaration { id: DeclarationId(1778), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 6212, 6222) }, + Declaration { id: DeclarationId(1779), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 9950, 9956) }, + Declaration { id: DeclarationId(1780), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 9961, 9972) }, + Declaration { id: DeclarationId(1781), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 10292, 10303) }, + Declaration { id: DeclarationId(1782), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 10308, 10319) }, + Declaration { id: DeclarationId(1783), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 12252, 12263) }, + Declaration { id: DeclarationId(1784), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/emit_model.dag", 12268, 12276) }, + Declaration { id: DeclarationId(1785), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(880) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/go_method_template_contracts.dag", 2440, 2468) }, + Declaration { id: DeclarationId(1786), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(790), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 20442, 20454) }, + Declaration { id: DeclarationId(1787), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(793), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 21827, 21842) }, + Declaration { id: DeclarationId(1788), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(902) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 27734, 27749) }, + Declaration { id: DeclarationId(1789), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 31887, 31891) }, + Declaration { id: DeclarationId(1790), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 32183, 32187) }, + Declaration { id: DeclarationId(1791), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 33432, 33436) }, + Declaration { id: DeclarationId(1792), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 33907, 33911) }, + Declaration { id: DeclarationId(1793), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 35170, 35174) }, + Declaration { id: DeclarationId(1794), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(71), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 35442, 35446) }, + Declaration { id: DeclarationId(1795), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 5562, 5577) }, + Declaration { id: DeclarationId(1796), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 5617, 5630) }, + Declaration { id: DeclarationId(1797), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 5678, 5695) }, + Declaration { id: DeclarationId(1798), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 5734, 5746) }, + Declaration { id: DeclarationId(1799), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 5794, 5811) }, + Declaration { id: DeclarationId(1800), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "field".to_string(), ty: DeclarationId(886) }, Field { label: "factor".to_string(), ty: DeclarationId(791) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 9904, 9966) }, + Declaration { id: DeclarationId(1801), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "field".to_string(), ty: DeclarationId(886) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 9971, 10013) }, + Declaration { id: DeclarationId(1802), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }, Field { label: "factor".to_string(), ty: DeclarationId(791) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 10018, 10075) }, + Declaration { id: DeclarationId(1803), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 10080, 10094) }, + Declaration { id: DeclarationId(1804), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 10099, 10114) }, + Declaration { id: DeclarationId(1805), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 24019, 24033) }, + Declaration { id: DeclarationId(1806), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "degree".to_string(), ty: DeclarationId(956) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 24038, 24085) }, + Declaration { id: DeclarationId(1807), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "numerator".to_string(), ty: DeclarationId(956) }, Field { label: "root".to_string(), ty: DeclarationId(956) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 24090, 24167) }, + Declaration { id: DeclarationId(1808), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "base".to_string(), ty: DeclarationId(957) }, Field { label: "argument".to_string(), ty: DeclarationId(956) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 24172, 24246) }, + Declaration { id: DeclarationId(1809), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }, Field { label: "exponent".to_string(), ty: DeclarationId(899) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 24866, 24922) }, + Declaration { id: DeclarationId(1810), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 24938, 24963) }, + Declaration { id: DeclarationId(1811), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 26612, 26625) }, + Declaration { id: DeclarationId(1812), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "cost".to_string(), ty: DeclarationId(901) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 26669, 26701) }, + Declaration { id: DeclarationId(1813), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(901) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 26764, 26780) }, + Declaration { id: DeclarationId(1814), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "factors".to_string(), ty: DeclarationId(1813) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 26740, 26782) }, + Declaration { id: DeclarationId(1815), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(901) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 26844, 26860) }, + Declaration { id: DeclarationId(1816), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(1815) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 26839, 26861) }, + Declaration { id: DeclarationId(1817), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "terms".to_string(), ty: DeclarationId(1816) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 26811, 26863) }, + Declaration { id: DeclarationId(1818), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(902) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 27161, 27176) }, + Declaration { id: DeclarationId(1819), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "terms".to_string(), ty: DeclarationId(1818) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 27143, 27178) }, + Declaration { id: DeclarationId(1820), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 27261, 27273) }, + Declaration { id: DeclarationId(1821), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/induction.dag", 27343, 27353) }, + Declaration { id: DeclarationId(1822), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(821), arguments: vec![TemplateArgument { parameter: DeclarationId(822), value: DeclarationId(939) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lens.dag", 4180, 4190) }, + Declaration { id: DeclarationId(1823), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(726), DeclarationId(725)], output: DeclarationId(1822), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lens.dag", 4159, 4190) }, + Declaration { id: DeclarationId(1824), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(19), arguments: vec![TemplateArgument { parameter: DeclarationId(20), value: DeclarationId(939) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lens.dag", 4205, 4214) }, + Declaration { id: DeclarationId(1825), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(939), DeclarationId(939)], output: DeclarationId(939), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lens.dag", 4225, 4238) }, + Declaration { id: DeclarationId(1826), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(939), DeclarationId(717)], output: DeclarationId(939), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lens.dag", 4250, 4271) }, + Declaration { id: DeclarationId(1827), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(726), DeclarationId(939)], output: DeclarationId(823), body: ArrowBody::NoBody }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lens.dag", 4284, 4316) }, + Declaration { id: DeclarationId(1828), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(940), arguments: vec![TemplateArgument { parameter: DeclarationId(941), value: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lookup.dag", 4577, 4588) }, + Declaration { id: DeclarationId(1829), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(940), arguments: vec![TemplateArgument { parameter: DeclarationId(941), value: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lookup.dag", 4630, 4641) }, + Declaration { id: DeclarationId(1830), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lookup.dag", 4532, 4536) }, + Declaration { id: DeclarationId(1831), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(941) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/lookup.dag", 4541, 4551) }, + Declaration { id: DeclarationId(1832), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(880) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/python_method_template_contracts.dag", 2092, 2120) }, + Declaration { id: DeclarationId(1833), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(880) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/rust_method_template_contracts.dag", 4043, 4071) }, + Declaration { id: DeclarationId(1834), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(948), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 2329, 2345) }, + Declaration { id: DeclarationId(1835), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(948), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 2350, 2366) }, + Declaration { id: DeclarationId(1836), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(948), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 2371, 2387) }, + Declaration { id: DeclarationId(1837), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(948) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 2632, 2660) }, + Declaration { id: DeclarationId(1838), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(97), arguments: vec![TemplateArgument { parameter: DeclarationId(98), value: DeclarationId(186) }, TemplateArgument { parameter: DeclarationId(99), value: DeclarationId(948) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 2704, 2732) }, + Declaration { id: DeclarationId(1839), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(956), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 5879, 5901) }, + Declaration { id: DeclarationId(1840), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(957), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 6321, 6341) }, + Declaration { id: DeclarationId(1841), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 667, 673) }, + Declaration { id: DeclarationId(1842), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 678, 691) }, + Declaration { id: DeclarationId(1843), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 696, 710) }, + Declaration { id: DeclarationId(1844), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 3232, 3258) }, + Declaration { id: DeclarationId(1845), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 3263, 3291) }, + Declaration { id: DeclarationId(1846), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 3296, 3329) }, + Declaration { id: DeclarationId(1847), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 3334, 3365) }, + Declaration { id: DeclarationId(1848), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "param".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 3370, 3402) }, + Declaration { id: DeclarationId(1849), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 4409, 4416) }, + Declaration { id: DeclarationId(1850), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "previous".to_string(), ty: DeclarationId(956) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 4421, 4471) }, + Declaration { id: DeclarationId(1851), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 4966, 4977) }, + Declaration { id: DeclarationId(1852), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "inner".to_string(), ty: DeclarationId(957) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 4982, 5027) }, + Declaration { id: DeclarationId(1853), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "accessor".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7131, 7165) }, + Declaration { id: DeclarationId(1854), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "amount".to_string(), ty: DeclarationId(956) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7170, 7214) }, + Declaration { id: DeclarationId(1855), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "steps".to_string(), ty: DeclarationId(956) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7219, 7277) }, + Declaration { id: DeclarationId(1856), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "divisor".to_string(), ty: DeclarationId(957) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7282, 7338) }, + Declaration { id: DeclarationId(1857), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "witness".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7343, 7376) }, + Declaration { id: DeclarationId(1858), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "element".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7381, 7411) }, + Declaration { id: DeclarationId(1859), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7416, 7429) }, + Declaration { id: DeclarationId(1860), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(955) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7469, 7491) }, + Declaration { id: DeclarationId(1861), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(948) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/termination.dag", 7701, 7722) }, + Declaration { id: DeclarationId(1862), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 646, 651) }, + Declaration { id: DeclarationId(1863), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 656, 660) }, + Declaration { id: DeclarationId(1864), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 665, 671) }, + Declaration { id: DeclarationId(1865), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 676, 682) }, + Declaration { id: DeclarationId(1866), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 687, 691) }, + Declaration { id: DeclarationId(1867), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 696, 702) }, + Declaration { id: DeclarationId(1868), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 707, 715) }, + Declaration { id: DeclarationId(1869), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 720, 728) }, + Declaration { id: DeclarationId(1870), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 733, 740) }, + Declaration { id: DeclarationId(1871), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 745, 751) }, + Declaration { id: DeclarationId(1872), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 756, 763) }, + Declaration { id: DeclarationId(1873), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 768, 774) }, + Declaration { id: DeclarationId(1874), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 779, 786) }, + Declaration { id: DeclarationId(1875), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 791, 804) }, + Declaration { id: DeclarationId(1876), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 809, 820) }, + Declaration { id: DeclarationId(1877), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 825, 842) }, + Declaration { id: DeclarationId(1878), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 847, 849) }, + Declaration { id: DeclarationId(1879), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 854, 858) }, + Declaration { id: DeclarationId(1880), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 863, 868) }, + Declaration { id: DeclarationId(1881), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 873, 875) }, + Declaration { id: DeclarationId(1882), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 880, 882) }, + Declaration { id: DeclarationId(1883), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 887, 889) }, + Declaration { id: DeclarationId(1884), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 894, 896) }, + Declaration { id: DeclarationId(1885), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 901, 905) }, + Declaration { id: DeclarationId(1886), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 910, 915) }, + Declaration { id: DeclarationId(1887), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 920, 924) }, + Declaration { id: DeclarationId(1888), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 929, 934) }, + Declaration { id: DeclarationId(1889), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 939, 945) }, + Declaration { id: DeclarationId(1890), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 950, 958) }, + Declaration { id: DeclarationId(1891), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 963, 968) }, + Declaration { id: DeclarationId(1892), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 973, 978) }, + Declaration { id: DeclarationId(1893), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 983, 991) }, + Declaration { id: DeclarationId(1894), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 996, 1005) }, + Declaration { id: DeclarationId(1895), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1010, 1013) }, + Declaration { id: DeclarationId(1896), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1018, 1024) }, + Declaration { id: DeclarationId(1897), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1029, 1035) }, + Declaration { id: DeclarationId(1898), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1040, 1046) }, + Declaration { id: DeclarationId(1899), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1051, 1057) }, + Declaration { id: DeclarationId(1900), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1062, 1070) }, + Declaration { id: DeclarationId(1901), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1075, 1083) }, + Declaration { id: DeclarationId(1902), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1088, 1093) }, + Declaration { id: DeclarationId(1903), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1098, 1107) }, + Declaration { id: DeclarationId(1904), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1112, 1116) }, + Declaration { id: DeclarationId(1905), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1121, 1129) }, + Declaration { id: DeclarationId(1906), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1134, 1137) }, + Declaration { id: DeclarationId(1907), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1708, 1713) }, + Declaration { id: DeclarationId(1908), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1718, 1722) }, + Declaration { id: DeclarationId(1909), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1727, 1733) }, + Declaration { id: DeclarationId(1910), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1738, 1744) }, + Declaration { id: DeclarationId(1911), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1749, 1753) }, + Declaration { id: DeclarationId(1912), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1758, 1764) }, + Declaration { id: DeclarationId(1913), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1769, 1777) }, + Declaration { id: DeclarationId(1914), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1782, 1790) }, + Declaration { id: DeclarationId(1915), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1795, 1802) }, + Declaration { id: DeclarationId(1916), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1807, 1813) }, + Declaration { id: DeclarationId(1917), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1818, 1825) }, + Declaration { id: DeclarationId(1918), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1830, 1836) }, + Declaration { id: DeclarationId(1919), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 1841, 1848) }, + Declaration { id: DeclarationId(1920), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2288, 2290) }, + Declaration { id: DeclarationId(1921), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2295, 2299) }, + Declaration { id: DeclarationId(1922), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2304, 2309) }, + Declaration { id: DeclarationId(1923), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2314, 2316) }, + Declaration { id: DeclarationId(1924), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2321, 2323) }, + Declaration { id: DeclarationId(1925), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2328, 2330) }, + Declaration { id: DeclarationId(1926), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2335, 2337) }, + Declaration { id: DeclarationId(1927), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2342, 2346) }, + Declaration { id: DeclarationId(1928), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2351, 2356) }, + Declaration { id: DeclarationId(1929), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2361, 2365) }, + Declaration { id: DeclarationId(1930), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2370, 2375) }, + Declaration { id: DeclarationId(1931), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2380, 2386) }, + Declaration { id: DeclarationId(1932), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2391, 2399) }, + Declaration { id: DeclarationId(1933), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2404, 2409) }, + Declaration { id: DeclarationId(1934), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2414, 2419) }, + Declaration { id: DeclarationId(1935), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2424, 2432) }, + Declaration { id: DeclarationId(1936), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2437, 2446) }, + Declaration { id: DeclarationId(1937), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2451, 2454) }, + Declaration { id: DeclarationId(1938), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2459, 2465) }, + Declaration { id: DeclarationId(1939), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2470, 2476) }, + Declaration { id: DeclarationId(1940), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2481, 2487) }, + Declaration { id: DeclarationId(1941), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2492, 2498) }, + Declaration { id: DeclarationId(1942), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2503, 2511) }, + Declaration { id: DeclarationId(1943), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2516, 2524) }, + Declaration { id: DeclarationId(1944), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2529, 2534) }, + Declaration { id: DeclarationId(1945), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2539, 2548) }, + Declaration { id: DeclarationId(1946), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2553, 2557) }, + Declaration { id: DeclarationId(1947), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2562, 2570) }, + Declaration { id: DeclarationId(1948), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(946) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 13007, 13030) }, + Declaration { id: DeclarationId(1949), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(988) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 13232, 13247) }, + Declaration { id: DeclarationId(1950), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(990) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 13252, 13272) }, + Declaration { id: DeclarationId(1951), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2432, 2446) }, + Declaration { id: DeclarationId(1952), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2451, 2461) }, + Declaration { id: DeclarationId(1953), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2466, 2478) }, + Declaration { id: DeclarationId(1954), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2483, 2495) }, + Declaration { id: DeclarationId(1955), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2500, 2513) }, + Declaration { id: DeclarationId(1956), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2518, 2530) }, + Declaration { id: DeclarationId(1957), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2535, 2558) }, + Declaration { id: DeclarationId(1958), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2964, 2973) }, + Declaration { id: DeclarationId(1959), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2978, 2994) }, + Declaration { id: DeclarationId(1960), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 3653, 3661) }, + Declaration { id: DeclarationId(1961), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 3666, 3676) }, + Declaration { id: DeclarationId(1962), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4491, 4504) }, + Declaration { id: DeclarationId(1963), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4509, 4522) }, + Declaration { id: DeclarationId(1964), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4527, 4535) }, + Declaration { id: DeclarationId(1965), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4560, 4568) }, + Declaration { id: DeclarationId(1966), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "_0".to_string(), ty: DeclarationId(982) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4573, 4613) }, + Declaration { id: DeclarationId(1967), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "expected".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4618, 4651) }, + Declaration { id: DeclarationId(1968), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "bind_name".to_string(), ty: DeclarationId(186) }, Field { label: "state".to_string(), ty: DeclarationId(983) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4656, 4734) }, + Declaration { id: DeclarationId(1969), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "declaration_name".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4900, 4963) }, + Declaration { id: DeclarationId(1970), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "bind_name".to_string(), ty: DeclarationId(186) }, Field { label: "comparator".to_string(), ty: DeclarationId(703) }, Field { label: "bound".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4968, 5059) }, + Declaration { id: DeclarationId(1971), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "subject".to_string(), ty: DeclarationId(1001) }, Field { label: "input_sample".to_string(), ty: DeclarationId(1001) }, Field { label: "expected_output".to_string(), ty: DeclarationId(1001) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 5064, 5196) }, + Declaration { id: DeclarationId(1972), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "subject".to_string(), ty: DeclarationId(1001) }, Field { label: "invariant".to_string(), ty: DeclarationId(1001) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 5411, 5500) }, + Declaration { id: DeclarationId(1973), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 6300, 6312) }, + Declaration { id: DeclarationId(1974), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "command".to_string(), ty: DeclarationId(186) }, Field { label: "args".to_string(), ty: DeclarationId(1973) }, Field { label: "expect_exit_code".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 6249, 6346) }, + Declaration { id: DeclarationId(1975), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 7046, 7058) }, + Declaration { id: DeclarationId(1976), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "command".to_string(), ty: DeclarationId(186) }, Field { label: "args".to_string(), ty: DeclarationId(1975) }, Field { label: "expect_exit_code".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 6996, 7092) }, + Declaration { id: DeclarationId(1977), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "lens_ref".to_string(), ty: DeclarationId(1001) }, Field { label: "input_ref".to_string(), ty: DeclarationId(1001) }, Field { label: "expected_ref".to_string(), ty: DeclarationId(1001) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 7390, 7512) }, + Declaration { id: DeclarationId(1978), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "subject_ref".to_string(), ty: DeclarationId(1001) }, Field { label: "oracle_ref".to_string(), ty: DeclarationId(1001) }, Field { label: "input_ref".to_string(), ty: DeclarationId(1001) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 7774, 7899) }, + Declaration { id: DeclarationId(1979), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "law".to_string(), ty: DeclarationId(984) }, Field { label: "lens_ref".to_string(), ty: DeclarationId(1001) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 8495, 8574) }, + Declaration { id: DeclarationId(1980), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "authority".to_string(), ty: DeclarationId(1001) }, Field { label: "list_constant".to_string(), ty: DeclarationId(973) }, Field { label: "bound".to_string(), ty: DeclarationId(71) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 8794, 8907) }, + Declaration { id: DeclarationId(1981), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "authority".to_string(), ty: DeclarationId(1001) }, Field { label: "list_constant".to_string(), ty: DeclarationId(973) }, Field { label: "subset_predicate".to_string(), ty: DeclarationId(1001) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 8912, 9048) }, + Declaration { id: DeclarationId(1982), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "compile_target".to_string(), ty: DeclarationId(971) }, Field { label: "expected".to_string(), ty: DeclarationId(972) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 9053, 9135) }, + Declaration { id: DeclarationId(1983), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "authority".to_string(), ty: DeclarationId(1001) }, Field { label: "ratchet_kind".to_string(), ty: DeclarationId(1001) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 9140, 9226) }, + Declaration { id: DeclarationId(1984), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(971) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 9305, 9315) }, + Declaration { id: DeclarationId(1985), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "authority".to_string(), ty: DeclarationId(1001) }, Field { label: "generated_paths".to_string(), ty: DeclarationId(1984) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 9231, 9321) }, + Declaration { id: DeclarationId(1986), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "deferred_gate".to_string(), ty: DeclarationId(1001) }, Field { label: "target_lane".to_string(), ty: DeclarationId(1001) }, Field { label: "authority_doc".to_string(), ty: DeclarationId(1001) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 10263, 10397) }, + Declaration { id: DeclarationId(1987), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "deferred_gate".to_string(), ty: DeclarationId(1001) }, Field { label: "target_lane".to_string(), ty: DeclarationId(1001) }, Field { label: "authority_doc".to_string(), ty: DeclarationId(1001) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 11036, 11180) }, + Declaration { id: DeclarationId(1988), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(946) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12224, 12247) }, + Declaration { id: DeclarationId(1989), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(988) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12293, 12308) }, + Declaration { id: DeclarationId(1990), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(946) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12564, 12587) }, + Declaration { id: DeclarationId(1991), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(725) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/workflows.dag", 992, 1006) }, + Declaration { id: DeclarationId(1992), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 532, 547) }, + Declaration { id: DeclarationId(1993), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 550, 561) }, + Declaration { id: DeclarationId(1994), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 564, 576) }, + Declaration { id: DeclarationId(1995), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(705), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/operators.dag", 142, 155) }, + Declaration { id: DeclarationId(1996), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5254, 5272) }, + Declaration { id: DeclarationId(1997), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5277, 5292) }, + Declaration { id: DeclarationId(1998), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5321, 5342) }, + Declaration { id: DeclarationId(1999), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5347, 5362) }, + Declaration { id: DeclarationId(2000), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6875, 6885) }, + Declaration { id: DeclarationId(2001), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6890, 6901) }, + Declaration { id: DeclarationId(2002), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6906, 6919) }, + Declaration { id: DeclarationId(2003), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6924, 6937) }, + Declaration { id: DeclarationId(2004), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6942, 6955) }, + Declaration { id: DeclarationId(2005), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6960, 6975) }, + Declaration { id: DeclarationId(2006), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 7717, 7734) }, + Declaration { id: DeclarationId(2007), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 7739, 7749) }, + Declaration { id: DeclarationId(2008), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 7754, 7758) }, + Declaration { id: DeclarationId(2009), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "target_name".to_string(), ty: DeclarationId(186) }, Field { label: "algebra".to_string(), ty: DeclarationId(1368) }, Field { label: "carrier".to_string(), ty: DeclarationId(1370) }, Field { label: "range_min_inclusive".to_string(), ty: DeclarationId(186) }, Field { label: "range_max_inclusive".to_string(), ty: DeclarationId(186) }, Field { label: "is_copy".to_string(), ty: DeclarationId(88) }, Field { label: "overflow".to_string(), ty: DeclarationId(1371) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 8536, 9108) }, + Declaration { id: DeclarationId(2010), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "target_name".to_string(), ty: DeclarationId(186) }, Field { label: "algebra".to_string(), ty: DeclarationId(1369) }, Field { label: "carrier".to_string(), ty: DeclarationId(1370) }, Field { label: "is_copy".to_string(), ty: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 9113, 9295) }, + Declaration { id: DeclarationId(2011), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(589), arguments: vec![TemplateArgument { parameter: DeclarationId(590), value: DeclarationId(1372) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 9623, 9642) }, ], ports: { let mut ports = HashMap::new(); - ports.insert(PortId(0), Port { id: PortId(0), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); + ports.insert(PortId(0), Port { id: PortId(0), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); ports.insert(PortId(1), Port { id: PortId(1), state: PortState::Uninferred, produced_by: Some(NodeId(0)) }); - ports.insert(PortId(2), Port { id: PortId(2), state: PortState::Resolved(TypeShape::new(DeclarationId(748))), produced_by: Some(NodeId(1)) }); - ports.insert(PortId(3), Port { id: PortId(3), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); - ports.insert(PortId(4), Port { id: PortId(4), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); + ports.insert(PortId(2), Port { id: PortId(2), state: PortState::Resolved(TypeShape::new(DeclarationId(743))), produced_by: Some(NodeId(1)) }); + ports.insert(PortId(3), Port { id: PortId(3), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); + ports.insert(PortId(4), Port { id: PortId(4), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); ports.insert(PortId(5), Port { id: PortId(5), state: PortState::Uninferred, produced_by: Some(NodeId(3)) }); ports.insert(PortId(6), Port { id: PortId(6), state: PortState::Uninferred, produced_by: Some(NodeId(4)) }); - ports.insert(PortId(7), Port { id: PortId(7), state: PortState::Resolved(TypeShape::new(DeclarationId(1591))), produced_by: Some(NodeId(5)) }); - ports.insert(PortId(8), Port { id: PortId(8), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); - ports.insert(PortId(9), Port { id: PortId(9), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); - ports.insert(PortId(10), Port { id: PortId(10), state: PortState::Resolved(TypeShape::new(DeclarationId(1592))), produced_by: None }); - ports.insert(PortId(11), Port { id: PortId(11), state: PortState::Resolved(TypeShape::new(DeclarationId(1593))), produced_by: Some(NodeId(7)) }); - ports.insert(PortId(12), Port { id: PortId(12), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); + ports.insert(PortId(7), Port { id: PortId(7), state: PortState::Resolved(TypeShape::new(DeclarationId(1586))), produced_by: Some(NodeId(5)) }); + ports.insert(PortId(8), Port { id: PortId(8), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); + ports.insert(PortId(9), Port { id: PortId(9), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); + ports.insert(PortId(10), Port { id: PortId(10), state: PortState::Resolved(TypeShape::new(DeclarationId(1587))), produced_by: None }); + ports.insert(PortId(11), Port { id: PortId(11), state: PortState::Resolved(TypeShape::new(DeclarationId(1588))), produced_by: Some(NodeId(7)) }); + ports.insert(PortId(12), Port { id: PortId(12), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); ports.insert(PortId(13), Port { id: PortId(13), state: PortState::Uninferred, produced_by: Some(NodeId(9)) }); ports.insert(PortId(14), Port { id: PortId(14), state: PortState::Uninferred, produced_by: Some(NodeId(10)) }); ports.insert(PortId(15), Port { id: PortId(15), state: PortState::Uninferred, produced_by: None }); ports.insert(PortId(16), Port { id: PortId(16), state: PortState::Uninferred, produced_by: Some(NodeId(11)) }); ports.insert(PortId(17), Port { id: PortId(17), state: PortState::Resolved(TypeShape::new(DeclarationId(88))), produced_by: Some(NodeId(12)) }); - ports.insert(PortId(18), Port { id: PortId(18), state: PortState::Resolved(TypeShape::new(DeclarationId(746))), produced_by: None }); + ports.insert(PortId(18), Port { id: PortId(18), state: PortState::Resolved(TypeShape::new(DeclarationId(741))), produced_by: None }); ports.insert(PortId(19), Port { id: PortId(19), state: PortState::Uninferred, produced_by: Some(NodeId(14)) }); ports.insert(PortId(20), Port { id: PortId(20), state: PortState::Uninferred, produced_by: None }); ports.insert(PortId(21), Port { id: PortId(21), state: PortState::Uninferred, produced_by: Some(NodeId(15)) }); @@ -2051,32 +2046,32 @@ pub(crate) fn bootstrapped_fixture_without_parse_surface_dag() -> Dag { ports.insert(PortId(24), Port { id: PortId(24), state: PortState::Uninferred, produced_by: Some(NodeId(18)) }); ports.insert(PortId(25), Port { id: PortId(25), state: PortState::Uninferred, produced_by: Some(NodeId(19)) }); ports.insert(PortId(26), Port { id: PortId(26), state: PortState::Resolved(TypeShape::new(DeclarationId(71))), produced_by: Some(NodeId(20)) }); - ports.insert(PortId(27), Port { id: PortId(27), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); - ports.insert(PortId(28), Port { id: PortId(28), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); + ports.insert(PortId(27), Port { id: PortId(27), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); + ports.insert(PortId(28), Port { id: PortId(28), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); ports.insert(PortId(29), Port { id: PortId(29), state: PortState::Uninferred, produced_by: Some(NodeId(22)) }); ports.insert(PortId(30), Port { id: PortId(30), state: PortState::Uninferred, produced_by: Some(NodeId(23)) }); - ports.insert(PortId(31), Port { id: PortId(31), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: Some(NodeId(24)) }); - ports.insert(PortId(32), Port { id: PortId(32), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); - ports.insert(PortId(33), Port { id: PortId(33), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); + ports.insert(PortId(31), Port { id: PortId(31), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: Some(NodeId(24)) }); + ports.insert(PortId(32), Port { id: PortId(32), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); + ports.insert(PortId(33), Port { id: PortId(33), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); ports.insert(PortId(34), Port { id: PortId(34), state: PortState::Uninferred, produced_by: Some(NodeId(26)) }); ports.insert(PortId(35), Port { id: PortId(35), state: PortState::Uninferred, produced_by: Some(NodeId(27)) }); - ports.insert(PortId(36), Port { id: PortId(36), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: Some(NodeId(28)) }); - ports.insert(PortId(37), Port { id: PortId(37), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); - ports.insert(PortId(38), Port { id: PortId(38), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); + ports.insert(PortId(36), Port { id: PortId(36), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: Some(NodeId(28)) }); + ports.insert(PortId(37), Port { id: PortId(37), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); + ports.insert(PortId(38), Port { id: PortId(38), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); ports.insert(PortId(39), Port { id: PortId(39), state: PortState::Uninferred, produced_by: Some(NodeId(30)) }); ports.insert(PortId(40), Port { id: PortId(40), state: PortState::Uninferred, produced_by: Some(NodeId(31)) }); - ports.insert(PortId(41), Port { id: PortId(41), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: Some(NodeId(32)) }); - ports.insert(PortId(42), Port { id: PortId(42), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); - ports.insert(PortId(43), Port { id: PortId(43), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); + ports.insert(PortId(41), Port { id: PortId(41), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: Some(NodeId(32)) }); + ports.insert(PortId(42), Port { id: PortId(42), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); + ports.insert(PortId(43), Port { id: PortId(43), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); ports.insert(PortId(44), Port { id: PortId(44), state: PortState::Uninferred, produced_by: Some(NodeId(34)) }); ports.insert(PortId(45), Port { id: PortId(45), state: PortState::Uninferred, produced_by: Some(NodeId(35)) }); - ports.insert(PortId(46), Port { id: PortId(46), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: Some(NodeId(36)) }); - ports.insert(PortId(47), Port { id: PortId(47), state: PortState::Resolved(TypeShape::new(DeclarationId(1594))), produced_by: None }); + ports.insert(PortId(46), Port { id: PortId(46), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: Some(NodeId(36)) }); + ports.insert(PortId(47), Port { id: PortId(47), state: PortState::Resolved(TypeShape::new(DeclarationId(1589))), produced_by: None }); ports.insert(PortId(48), Port { id: PortId(48), state: PortState::Uninferred, produced_by: Some(NodeId(38)) }); ports.insert(PortId(49), Port { id: PortId(49), state: PortState::Uninferred, produced_by: Some(NodeId(39)) }); - ports.insert(PortId(50), Port { id: PortId(50), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: Some(NodeId(40)) }); - ports.insert(PortId(51), Port { id: PortId(51), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); - ports.insert(PortId(52), Port { id: PortId(52), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); + ports.insert(PortId(50), Port { id: PortId(50), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: Some(NodeId(40)) }); + ports.insert(PortId(51), Port { id: PortId(51), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); + ports.insert(PortId(52), Port { id: PortId(52), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); ports.insert(PortId(53), Port { id: PortId(53), state: PortState::Uninferred, produced_by: None }); ports.insert(PortId(54), Port { id: PortId(54), state: PortState::Uninferred, produced_by: Some(NodeId(42)) }); ports.insert(PortId(55), Port { id: PortId(55), state: PortState::Uninferred, produced_by: None }); @@ -2164,12 +2159,12 @@ pub(crate) fn bootstrapped_fixture_without_parse_surface_dag() -> Dag { ports.insert(PortId(137), Port { id: PortId(137), state: PortState::Uninferred, produced_by: Some(NodeId(91)) }); ports.insert(PortId(138), Port { id: PortId(138), state: PortState::Uninferred, produced_by: Some(NodeId(92)) }); ports.insert(PortId(139), Port { id: PortId(139), state: PortState::Resolved(TypeShape::new(DeclarationId(88))), produced_by: Some(NodeId(93)) }); - ports.insert(PortId(140), Port { id: PortId(140), state: PortState::Resolved(TypeShape::new(DeclarationId(745))), produced_by: None }); - ports.insert(PortId(141), Port { id: PortId(141), state: PortState::Resolved(TypeShape::new(DeclarationId(745))), produced_by: None }); - ports.insert(PortId(142), Port { id: PortId(142), state: PortState::Resolved(TypeShape::new(DeclarationId(631))), produced_by: Some(NodeId(95)) }); - ports.insert(PortId(143), Port { id: PortId(143), state: PortState::Resolved(TypeShape::new(DeclarationId(631))), produced_by: Some(NodeId(96)) }); + ports.insert(PortId(140), Port { id: PortId(140), state: PortState::Resolved(TypeShape::new(DeclarationId(740))), produced_by: None }); + ports.insert(PortId(141), Port { id: PortId(141), state: PortState::Resolved(TypeShape::new(DeclarationId(740))), produced_by: None }); + ports.insert(PortId(142), Port { id: PortId(142), state: PortState::Resolved(TypeShape::new(DeclarationId(626))), produced_by: Some(NodeId(95)) }); + ports.insert(PortId(143), Port { id: PortId(143), state: PortState::Resolved(TypeShape::new(DeclarationId(626))), produced_by: Some(NodeId(96)) }); ports.insert(PortId(144), Port { id: PortId(144), state: PortState::Resolved(TypeShape::new(DeclarationId(88))), produced_by: Some(NodeId(97)) }); - ports.insert(PortId(145), Port { id: PortId(145), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); + ports.insert(PortId(145), Port { id: PortId(145), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); ports.insert(PortId(146), Port { id: PortId(146), state: PortState::Uninferred, produced_by: None }); ports.insert(PortId(147), Port { id: PortId(147), state: PortState::Uninferred, produced_by: Some(NodeId(99)) }); ports.insert(PortId(148), Port { id: PortId(148), state: PortState::Uninferred, produced_by: Some(NodeId(100)) }); @@ -2178,14 +2173,14 @@ pub(crate) fn bootstrapped_fixture_without_parse_surface_dag() -> Dag { ports.insert(PortId(151), Port { id: PortId(151), state: PortState::Uninferred, produced_by: Some(NodeId(102)) }); ports.insert(PortId(152), Port { id: PortId(152), state: PortState::Uninferred, produced_by: Some(NodeId(103)) }); ports.insert(PortId(153), Port { id: PortId(153), state: PortState::Uninferred, produced_by: Some(NodeId(104)) }); - ports.insert(PortId(154), Port { id: PortId(154), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: Some(NodeId(105)) }); - ports.insert(PortId(155), Port { id: PortId(155), state: PortState::Resolved(TypeShape::new(DeclarationId(1595))), produced_by: None }); - ports.insert(PortId(156), Port { id: PortId(156), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: Some(NodeId(107)) }); - ports.insert(PortId(157), Port { id: PortId(157), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: Some(NodeId(108)) }); - ports.insert(PortId(158), Port { id: PortId(158), state: PortState::Resolved(TypeShape::new(DeclarationId(1592))), produced_by: Some(NodeId(109)) }); + ports.insert(PortId(154), Port { id: PortId(154), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: Some(NodeId(105)) }); + ports.insert(PortId(155), Port { id: PortId(155), state: PortState::Resolved(TypeShape::new(DeclarationId(1590))), produced_by: None }); + ports.insert(PortId(156), Port { id: PortId(156), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: Some(NodeId(107)) }); + ports.insert(PortId(157), Port { id: PortId(157), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: Some(NodeId(108)) }); + ports.insert(PortId(158), Port { id: PortId(158), state: PortState::Resolved(TypeShape::new(DeclarationId(1587))), produced_by: Some(NodeId(109)) }); ports.insert(PortId(159), Port { id: PortId(159), state: PortState::Uninferred, produced_by: Some(NodeId(110)) }); - ports.insert(PortId(160), Port { id: PortId(160), state: PortState::Resolved(TypeShape::new(DeclarationId(1596))), produced_by: Some(NodeId(111)) }); - ports.insert(PortId(161), Port { id: PortId(161), state: PortState::Resolved(TypeShape::new(DeclarationId(1597))), produced_by: None }); + ports.insert(PortId(160), Port { id: PortId(160), state: PortState::Resolved(TypeShape::new(DeclarationId(1591))), produced_by: Some(NodeId(111)) }); + ports.insert(PortId(161), Port { id: PortId(161), state: PortState::Resolved(TypeShape::new(DeclarationId(1592))), produced_by: None }); ports.insert(PortId(162), Port { id: PortId(162), state: PortState::Uninferred, produced_by: Some(NodeId(113)) }); ports.insert(PortId(163), Port { id: PortId(163), state: PortState::Uninferred, produced_by: None }); ports.insert(PortId(164), Port { id: PortId(164), state: PortState::Uninferred, produced_by: Some(NodeId(114)) }); @@ -2198,8 +2193,8 @@ pub(crate) fn bootstrapped_fixture_without_parse_surface_dag() -> Dag { ports.insert(PortId(171), Port { id: PortId(171), state: PortState::Uninferred, produced_by: Some(NodeId(121)) }); ports.insert(PortId(172), Port { id: PortId(172), state: PortState::Uninferred, produced_by: Some(NodeId(122)) }); ports.insert(PortId(173), Port { id: PortId(173), state: PortState::Uninferred, produced_by: Some(NodeId(123)) }); - ports.insert(PortId(174), Port { id: PortId(174), state: PortState::Resolved(TypeShape::new(DeclarationId(1598))), produced_by: Some(NodeId(124)) }); - ports.insert(PortId(175), Port { id: PortId(175), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); + ports.insert(PortId(174), Port { id: PortId(174), state: PortState::Resolved(TypeShape::new(DeclarationId(1593))), produced_by: Some(NodeId(124)) }); + ports.insert(PortId(175), Port { id: PortId(175), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); ports.insert(PortId(176), Port { id: PortId(176), state: PortState::Uninferred, produced_by: None }); ports.insert(PortId(177), Port { id: PortId(177), state: PortState::Uninferred, produced_by: Some(NodeId(126)) }); ports.insert(PortId(178), Port { id: PortId(178), state: PortState::Uninferred, produced_by: Some(NodeId(127)) }); @@ -2216,7 +2211,7 @@ pub(crate) fn bootstrapped_fixture_without_parse_surface_dag() -> Dag { ports.insert(PortId(189), Port { id: PortId(189), state: PortState::Uninferred, produced_by: None }); ports.insert(PortId(190), Port { id: PortId(190), state: PortState::Uninferred, produced_by: Some(NodeId(133)) }); ports.insert(PortId(191), Port { id: PortId(191), state: PortState::Resolved(TypeShape::new(DeclarationId(88))), produced_by: Some(NodeId(134)) }); - ports.insert(PortId(192), Port { id: PortId(192), state: PortState::Resolved(TypeShape::new(DeclarationId(1599))), produced_by: None }); + ports.insert(PortId(192), Port { id: PortId(192), state: PortState::Resolved(TypeShape::new(DeclarationId(1594))), produced_by: None }); ports.insert(PortId(193), Port { id: PortId(193), state: PortState::Uninferred, produced_by: Some(NodeId(136)) }); ports.insert(PortId(194), Port { id: PortId(194), state: PortState::Uninferred, produced_by: Some(NodeId(137)) }); ports.insert(PortId(195), Port { id: PortId(195), state: PortState::Uninferred, produced_by: None }); @@ -2229,8 +2224,8 @@ pub(crate) fn bootstrapped_fixture_without_parse_surface_dag() -> Dag { ports.insert(PortId(202), Port { id: PortId(202), state: PortState::Uninferred, produced_by: Some(NodeId(143)) }); ports.insert(PortId(203), Port { id: PortId(203), state: PortState::Uninferred, produced_by: Some(NodeId(144)) }); ports.insert(PortId(204), Port { id: PortId(204), state: PortState::Uninferred, produced_by: Some(NodeId(145)) }); - ports.insert(PortId(205), Port { id: PortId(205), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: Some(NodeId(146)) }); - ports.insert(PortId(206), Port { id: PortId(206), state: PortState::Resolved(TypeShape::new(DeclarationId(1600))), produced_by: None }); + ports.insert(PortId(205), Port { id: PortId(205), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: Some(NodeId(146)) }); + ports.insert(PortId(206), Port { id: PortId(206), state: PortState::Resolved(TypeShape::new(DeclarationId(1595))), produced_by: None }); ports.insert(PortId(207), Port { id: PortId(207), state: PortState::Uninferred, produced_by: Some(NodeId(148)) }); ports.insert(PortId(208), Port { id: PortId(208), state: PortState::Uninferred, produced_by: Some(NodeId(149)) }); ports.insert(PortId(209), Port { id: PortId(209), state: PortState::Uninferred, produced_by: None }); @@ -2243,8 +2238,8 @@ pub(crate) fn bootstrapped_fixture_without_parse_surface_dag() -> Dag { ports.insert(PortId(216), Port { id: PortId(216), state: PortState::Uninferred, produced_by: Some(NodeId(155)) }); ports.insert(PortId(217), Port { id: PortId(217), state: PortState::Uninferred, produced_by: Some(NodeId(156)) }); ports.insert(PortId(218), Port { id: PortId(218), state: PortState::Uninferred, produced_by: Some(NodeId(157)) }); - ports.insert(PortId(219), Port { id: PortId(219), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: Some(NodeId(158)) }); - ports.insert(PortId(220), Port { id: PortId(220), state: PortState::Resolved(TypeShape::new(DeclarationId(1601))), produced_by: None }); + ports.insert(PortId(219), Port { id: PortId(219), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: Some(NodeId(158)) }); + ports.insert(PortId(220), Port { id: PortId(220), state: PortState::Resolved(TypeShape::new(DeclarationId(1596))), produced_by: None }); ports.insert(PortId(221), Port { id: PortId(221), state: PortState::Uninferred, produced_by: Some(NodeId(160)) }); ports.insert(PortId(222), Port { id: PortId(222), state: PortState::Uninferred, produced_by: Some(NodeId(161)) }); ports.insert(PortId(223), Port { id: PortId(223), state: PortState::Uninferred, produced_by: None }); @@ -2263,9 +2258,9 @@ pub(crate) fn bootstrapped_fixture_without_parse_surface_dag() -> Dag { ports.insert(PortId(236), Port { id: PortId(236), state: PortState::Uninferred, produced_by: Some(NodeId(172)) }); ports.insert(PortId(237), Port { id: PortId(237), state: PortState::Uninferred, produced_by: Some(NodeId(173)) }); ports.insert(PortId(238), Port { id: PortId(238), state: PortState::Uninferred, produced_by: Some(NodeId(174)) }); - ports.insert(PortId(239), Port { id: PortId(239), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: Some(NodeId(175)) }); - ports.insert(PortId(240), Port { id: PortId(240), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); - ports.insert(PortId(241), Port { id: PortId(241), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); + ports.insert(PortId(239), Port { id: PortId(239), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: Some(NodeId(175)) }); + ports.insert(PortId(240), Port { id: PortId(240), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); + ports.insert(PortId(241), Port { id: PortId(241), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); ports.insert(PortId(242), Port { id: PortId(242), state: PortState::Uninferred, produced_by: None }); ports.insert(PortId(243), Port { id: PortId(243), state: PortState::Uninferred, produced_by: Some(NodeId(177)) }); ports.insert(PortId(244), Port { id: PortId(244), state: PortState::Uninferred, produced_by: None }); @@ -2280,10 +2275,10 @@ pub(crate) fn bootstrapped_fixture_without_parse_surface_dag() -> Dag { ports.insert(PortId(253), Port { id: PortId(253), state: PortState::Uninferred, produced_by: Some(NodeId(182)) }); ports.insert(PortId(254), Port { id: PortId(254), state: PortState::Uninferred, produced_by: None }); ports.insert(PortId(255), Port { id: PortId(255), state: PortState::Uninferred, produced_by: Some(NodeId(183)) }); - ports.insert(PortId(256), Port { id: PortId(256), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: Some(NodeId(184)) }); - ports.insert(PortId(257), Port { id: PortId(257), state: PortState::Resolved(TypeShape::new(DeclarationId(745))), produced_by: None }); - ports.insert(PortId(258), Port { id: PortId(258), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); - ports.insert(PortId(259), Port { id: PortId(259), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); + ports.insert(PortId(256), Port { id: PortId(256), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: Some(NodeId(184)) }); + ports.insert(PortId(257), Port { id: PortId(257), state: PortState::Resolved(TypeShape::new(DeclarationId(740))), produced_by: None }); + ports.insert(PortId(258), Port { id: PortId(258), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); + ports.insert(PortId(259), Port { id: PortId(259), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); ports.insert(PortId(260), Port { id: PortId(260), state: PortState::Uninferred, produced_by: None }); ports.insert(PortId(261), Port { id: PortId(261), state: PortState::Uninferred, produced_by: Some(NodeId(186)) }); ports.insert(PortId(262), Port { id: PortId(262), state: PortState::Uninferred, produced_by: None }); @@ -2298,31 +2293,31 @@ pub(crate) fn bootstrapped_fixture_without_parse_surface_dag() -> Dag { ports.insert(PortId(271), Port { id: PortId(271), state: PortState::Uninferred, produced_by: Some(NodeId(191)) }); ports.insert(PortId(272), Port { id: PortId(272), state: PortState::Uninferred, produced_by: None }); ports.insert(PortId(273), Port { id: PortId(273), state: PortState::Uninferred, produced_by: Some(NodeId(192)) }); - ports.insert(PortId(274), Port { id: PortId(274), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: Some(NodeId(193)) }); - ports.insert(PortId(275), Port { id: PortId(275), state: PortState::Resolved(TypeShape::new(DeclarationId(745))), produced_by: None }); - ports.insert(PortId(276), Port { id: PortId(276), state: PortState::Resolved(TypeShape::new(DeclarationId(745))), produced_by: None }); - ports.insert(PortId(277), Port { id: PortId(277), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); - ports.insert(PortId(278), Port { id: PortId(278), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); + ports.insert(PortId(274), Port { id: PortId(274), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: Some(NodeId(193)) }); + ports.insert(PortId(275), Port { id: PortId(275), state: PortState::Resolved(TypeShape::new(DeclarationId(740))), produced_by: None }); + ports.insert(PortId(276), Port { id: PortId(276), state: PortState::Resolved(TypeShape::new(DeclarationId(740))), produced_by: None }); + ports.insert(PortId(277), Port { id: PortId(277), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); + ports.insert(PortId(278), Port { id: PortId(278), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); ports.insert(PortId(279), Port { id: PortId(279), state: PortState::Uninferred, produced_by: Some(NodeId(195)) }); ports.insert(PortId(280), Port { id: PortId(280), state: PortState::Uninferred, produced_by: Some(NodeId(196)) }); ports.insert(PortId(281), Port { id: PortId(281), state: PortState::Uninferred, produced_by: Some(NodeId(197)) }); - ports.insert(PortId(282), Port { id: PortId(282), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: Some(NodeId(198)) }); - ports.insert(PortId(283), Port { id: PortId(283), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); - ports.insert(PortId(284), Port { id: PortId(284), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); + ports.insert(PortId(282), Port { id: PortId(282), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: Some(NodeId(198)) }); + ports.insert(PortId(283), Port { id: PortId(283), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); + ports.insert(PortId(284), Port { id: PortId(284), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); ports.insert(PortId(285), Port { id: PortId(285), state: PortState::Uninferred, produced_by: Some(NodeId(200)) }); - ports.insert(PortId(286), Port { id: PortId(286), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: Some(NodeId(201)) }); - ports.insert(PortId(287), Port { id: PortId(287), state: PortState::Resolved(TypeShape::new(DeclarationId(748))), produced_by: None }); - ports.insert(PortId(288), Port { id: PortId(288), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); + ports.insert(PortId(286), Port { id: PortId(286), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: Some(NodeId(201)) }); + ports.insert(PortId(287), Port { id: PortId(287), state: PortState::Resolved(TypeShape::new(DeclarationId(743))), produced_by: None }); + ports.insert(PortId(288), Port { id: PortId(288), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); ports.insert(PortId(289), Port { id: PortId(289), state: PortState::Resolved(TypeShape::new(DeclarationId(88))), produced_by: Some(NodeId(203)) }); - ports.insert(PortId(290), Port { id: PortId(290), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: Some(NodeId(204)) }); + ports.insert(PortId(290), Port { id: PortId(290), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: Some(NodeId(204)) }); ports.insert(PortId(291), Port { id: PortId(291), state: PortState::Uninferred, produced_by: Some(NodeId(205)) }); ports.insert(PortId(292), Port { id: PortId(292), state: PortState::Uninferred, produced_by: Some(NodeId(206)) }); - ports.insert(PortId(293), Port { id: PortId(293), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: Some(NodeId(207)) }); - ports.insert(PortId(294), Port { id: PortId(294), state: PortState::Resolved(TypeShape::new(DeclarationId(748))), produced_by: Some(NodeId(208)) }); - ports.insert(PortId(295), Port { id: PortId(295), state: PortState::Resolved(TypeShape::new(DeclarationId(748))), produced_by: None }); + ports.insert(PortId(293), Port { id: PortId(293), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: Some(NodeId(207)) }); + ports.insert(PortId(294), Port { id: PortId(294), state: PortState::Resolved(TypeShape::new(DeclarationId(743))), produced_by: Some(NodeId(208)) }); + ports.insert(PortId(295), Port { id: PortId(295), state: PortState::Resolved(TypeShape::new(DeclarationId(743))), produced_by: None }); ports.insert(PortId(296), Port { id: PortId(296), state: PortState::Resolved(TypeShape::new(DeclarationId(88))), produced_by: Some(NodeId(210)) }); - ports.insert(PortId(297), Port { id: PortId(297), state: PortState::Resolved(TypeShape::new(DeclarationId(1602))), produced_by: None }); - ports.insert(PortId(298), Port { id: PortId(298), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); + ports.insert(PortId(297), Port { id: PortId(297), state: PortState::Resolved(TypeShape::new(DeclarationId(1597))), produced_by: None }); + ports.insert(PortId(298), Port { id: PortId(298), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); ports.insert(PortId(299), Port { id: PortId(299), state: PortState::Uninferred, produced_by: Some(NodeId(212)) }); ports.insert(PortId(300), Port { id: PortId(300), state: PortState::Uninferred, produced_by: None }); ports.insert(PortId(301), Port { id: PortId(301), state: PortState::Uninferred, produced_by: Some(NodeId(213)) }); @@ -2335,21 +2330,21 @@ pub(crate) fn bootstrapped_fixture_without_parse_surface_dag() -> Dag { ports.insert(PortId(308), Port { id: PortId(308), state: PortState::Uninferred, produced_by: Some(NodeId(220)) }); ports.insert(PortId(309), Port { id: PortId(309), state: PortState::Uninferred, produced_by: Some(NodeId(221)) }); ports.insert(PortId(310), Port { id: PortId(310), state: PortState::Uninferred, produced_by: Some(NodeId(222)) }); - ports.insert(PortId(311), Port { id: PortId(311), state: PortState::Resolved(TypeShape::new(DeclarationId(1603))), produced_by: Some(NodeId(223)) }); - ports.insert(PortId(312), Port { id: PortId(312), state: PortState::Resolved(TypeShape::new(DeclarationId(1604))), produced_by: None }); - ports.insert(PortId(313), Port { id: PortId(313), state: PortState::Resolved(TypeShape::new(DeclarationId(747))), produced_by: None }); + ports.insert(PortId(311), Port { id: PortId(311), state: PortState::Resolved(TypeShape::new(DeclarationId(1598))), produced_by: Some(NodeId(223)) }); + ports.insert(PortId(312), Port { id: PortId(312), state: PortState::Resolved(TypeShape::new(DeclarationId(1599))), produced_by: None }); + ports.insert(PortId(313), Port { id: PortId(313), state: PortState::Resolved(TypeShape::new(DeclarationId(742))), produced_by: None }); ports.insert(PortId(314), Port { id: PortId(314), state: PortState::Uninferred, produced_by: Some(NodeId(225)) }); ports.insert(PortId(315), Port { id: PortId(315), state: PortState::Uninferred, produced_by: Some(NodeId(226)) }); ports.insert(PortId(316), Port { id: PortId(316), state: PortState::Uninferred, produced_by: Some(NodeId(227)) }); ports.insert(PortId(317), Port { id: PortId(317), state: PortState::Uninferred, produced_by: Some(NodeId(228)) }); ports.insert(PortId(318), Port { id: PortId(318), state: PortState::Uninferred, produced_by: Some(NodeId(229)) }); - ports.insert(PortId(319), Port { id: PortId(319), state: PortState::Resolved(TypeShape::new(DeclarationId(1605))), produced_by: Some(NodeId(230)) }); - ports.insert(PortId(320), Port { id: PortId(320), state: PortState::Resolved(TypeShape::new(DeclarationId(1606))), produced_by: None }); + ports.insert(PortId(319), Port { id: PortId(319), state: PortState::Resolved(TypeShape::new(DeclarationId(1600))), produced_by: Some(NodeId(230)) }); + ports.insert(PortId(320), Port { id: PortId(320), state: PortState::Resolved(TypeShape::new(DeclarationId(1601))), produced_by: None }); ports.insert(PortId(321), Port { id: PortId(321), state: PortState::Uninferred, produced_by: Some(NodeId(232)) }); - ports.insert(PortId(322), Port { id: PortId(322), state: PortState::Resolved(TypeShape::new(DeclarationId(1607))), produced_by: Some(NodeId(233)) }); - ports.insert(PortId(323), Port { id: PortId(323), state: PortState::Resolved(TypeShape::new(DeclarationId(731))), produced_by: None }); - ports.insert(PortId(324), Port { id: PortId(324), state: PortState::Resolved(TypeShape::new(DeclarationId(1996))), produced_by: Some(NodeId(235)) }); - ports.insert(PortId(325), Port { id: PortId(325), state: PortState::Resolved(TypeShape::new(DeclarationId(710))), produced_by: None }); + ports.insert(PortId(322), Port { id: PortId(322), state: PortState::Resolved(TypeShape::new(DeclarationId(1602))), produced_by: Some(NodeId(233)) }); + ports.insert(PortId(323), Port { id: PortId(323), state: PortState::Resolved(TypeShape::new(DeclarationId(726))), produced_by: None }); + ports.insert(PortId(324), Port { id: PortId(324), state: PortState::Resolved(TypeShape::new(DeclarationId(1991))), produced_by: Some(NodeId(235)) }); + ports.insert(PortId(325), Port { id: PortId(325), state: PortState::Resolved(TypeShape::new(DeclarationId(705))), produced_by: None }); ports.insert(PortId(326), Port { id: PortId(326), state: PortState::Uninferred, produced_by: None }); ports.insert(PortId(327), Port { id: PortId(327), state: PortState::Uninferred, produced_by: Some(NodeId(237)) }); ports.insert(PortId(328), Port { id: PortId(328), state: PortState::Uninferred, produced_by: Some(NodeId(238)) }); @@ -2369,7 +2364,7 @@ pub(crate) fn bootstrapped_fixture_without_parse_surface_dag() -> Dag { ports.insert(PortId(342), Port { id: PortId(342), state: PortState::Uninferred, produced_by: Some(NodeId(250)) }); ports.insert(PortId(343), Port { id: PortId(343), state: PortState::Uninferred, produced_by: Some(NodeId(251)) }); ports.insert(PortId(344), Port { id: PortId(344), state: PortState::Resolved(TypeShape::new(DeclarationId(186))), produced_by: Some(NodeId(252)) }); - ports.insert(PortId(345), Port { id: PortId(345), state: PortState::Resolved(TypeShape::new(DeclarationId(710))), produced_by: None }); + ports.insert(PortId(345), Port { id: PortId(345), state: PortState::Resolved(TypeShape::new(DeclarationId(705))), produced_by: None }); ports.insert(PortId(346), Port { id: PortId(346), state: PortState::Uninferred, produced_by: None }); ports.insert(PortId(347), Port { id: PortId(347), state: PortState::Uninferred, produced_by: Some(NodeId(254)) }); ports.insert(PortId(348), Port { id: PortId(348), state: PortState::Uninferred, produced_by: Some(NodeId(255)) }); @@ -2393,7 +2388,7 @@ pub(crate) fn bootstrapped_fixture_without_parse_surface_dag() -> Dag { , diagnostics: DiagnosticTable::new(), next_node_id: 271, - next_declaration_id: 2017, + next_declaration_id: 2012, next_port_id: 365, primitives: PrimitiveCache::default(), substrate_markers: SubstrateMarkers::default(), @@ -2407,6 +2402,6 @@ pub(crate) fn bootstrapped_fixture_without_parse_surface_dag() -> Dag { callable_strategy_variants: CallableStrategyVariants::default(), clusters: vec![], optional_match_disjs: HashMap::new(), - declaration_append_begin_after_bootstrap: 2017, + declaration_append_begin_after_bootstrap: 2012, } } diff --git a/src/v3/compiler/src/bootstrap_std_generated.rs b/src/v3/compiler/src/bootstrap_std_generated.rs index 41f19e2536d..65bb73e2c6d 100644 --- a/src/v3/compiler/src/bootstrap_std_generated.rs +++ b/src/v3/compiler/src/bootstrap_std_generated.rs @@ -12,11 +12,11 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { variants: vec![ Field { label: "True".to_string(), - ty: DeclarationId(266), + ty: DeclarationId(264), }, Field { label: "False".to_string(), - ty: DeclarationId(267), + ty: DeclarationId(265), }, ], }, @@ -107,7 +107,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { connective: TypeConnective::Conj { children: vec![Field { label: "bits".to_string(), - ty: DeclarationId(268), + ty: DeclarationId(266), }], }, type_params: vec![], @@ -126,7 +126,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { connective: TypeConnective::Conj { children: vec![Field { label: "bits".to_string(), - ty: DeclarationId(269), + ty: DeclarationId(267), }], }, type_params: vec![], @@ -145,7 +145,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { connective: TypeConnective::Conj { children: vec![Field { label: "bytes".to_string(), - ty: DeclarationId(270), + ty: DeclarationId(268), }], }, type_params: vec![], @@ -164,7 +164,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { connective: TypeConnective::Conj { children: vec![Field { label: "bytes".to_string(), - ty: DeclarationId(271), + ty: DeclarationId(269), }], }, type_params: vec![], @@ -183,7 +183,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { connective: TypeConnective::Conj { children: vec![Field { label: "bytes".to_string(), - ty: DeclarationId(272), + ty: DeclarationId(270), }], }, type_params: vec![], @@ -202,7 +202,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { connective: TypeConnective::Conj { children: vec![Field { label: "bytes".to_string(), - ty: DeclarationId(273), + ty: DeclarationId(271), }], }, type_params: vec![], @@ -222,11 +222,11 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { variants: vec![ Field { label: "Ok".to_string(), - ty: DeclarationId(274), + ty: DeclarationId(272), }, Field { label: "Err".to_string(), - ty: DeclarationId(275), + ty: DeclarationId(273), }, ], }, @@ -275,11 +275,11 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { variants: vec![ Field { label: "DivideByZero".to_string(), - ty: DeclarationId(276), + ty: DeclarationId(274), }, Field { label: "Overflow".to_string(), - ty: DeclarationId(277), + ty: DeclarationId(275), }, ], }, @@ -299,7 +299,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { connective: TypeConnective::Conj { children: vec![Field { label: "op".to_string(), - ty: DeclarationId(287), + ty: DeclarationId(285), }], }, type_params: vec![DeclarationId(16)], @@ -310,7 +310,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 4563, 4600), + span: SourceSpan::new("dsl/std/algebra.dag", 4623, 4660), }, Declaration { id: DeclarationId(16), @@ -324,7 +324,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 4563, 4600), + span: SourceSpan::new("dsl/std/algebra.dag", 4623, 4660), }, Declaration { id: DeclarationId(17), @@ -332,7 +332,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { connective: TypeConnective::Conj { children: vec![Field { label: "op".to_string(), - ty: DeclarationId(288), + ty: DeclarationId(286), }], }, type_params: vec![DeclarationId(18)], @@ -343,7 +343,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 4678, 4800), + span: SourceSpan::new("dsl/std/algebra.dag", 4738, 4860), }, Declaration { id: DeclarationId(18), @@ -357,7 +357,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 4678, 4800), + span: SourceSpan::new("dsl/std/algebra.dag", 4738, 4860), }, Declaration { id: DeclarationId(19), @@ -366,7 +366,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { children: vec![ Field { label: "op".to_string(), - ty: DeclarationId(289), + ty: DeclarationId(287), }, Field { label: "identity".to_string(), @@ -382,7 +382,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 4898, 4950), + span: SourceSpan::new("dsl/std/algebra.dag", 4958, 5010), }, Declaration { id: DeclarationId(20), @@ -396,7 +396,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 4898, 4950), + span: SourceSpan::new("dsl/std/algebra.dag", 4958, 5010), }, Declaration { id: DeclarationId(21), @@ -405,7 +405,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { children: vec![ Field { label: "op".to_string(), - ty: DeclarationId(290), + ty: DeclarationId(288), }, Field { label: "identity".to_string(), @@ -421,7 +421,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 5009, 5100), + span: SourceSpan::new("dsl/std/algebra.dag", 5069, 5160), }, Declaration { id: DeclarationId(22), @@ -435,7 +435,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 5009, 5100), + span: SourceSpan::new("dsl/std/algebra.dag", 5069, 5160), }, Declaration { id: DeclarationId(23), @@ -444,7 +444,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { children: vec![ Field { label: "op".to_string(), - ty: DeclarationId(291), + ty: DeclarationId(289), }, Field { label: "identity".to_string(), @@ -452,7 +452,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }, Field { label: "inverse".to_string(), - ty: DeclarationId(292), + ty: DeclarationId(290), }, ], }, @@ -464,7 +464,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 5172, 5245), + span: SourceSpan::new("dsl/std/algebra.dag", 5232, 5305), }, Declaration { id: DeclarationId(24), @@ -478,7 +478,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 5172, 5245), + span: SourceSpan::new("dsl/std/algebra.dag", 5232, 5305), }, Declaration { id: DeclarationId(25), @@ -487,7 +487,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { children: vec![ Field { label: "op".to_string(), - ty: DeclarationId(293), + ty: DeclarationId(291), }, Field { label: "identity".to_string(), @@ -495,7 +495,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }, Field { label: "inverse".to_string(), - ty: DeclarationId(294), + ty: DeclarationId(292), }, ], }, @@ -507,7 +507,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 5283, 5391), + span: SourceSpan::new("dsl/std/algebra.dag", 5343, 5451), }, Declaration { id: DeclarationId(26), @@ -521,7 +521,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 5283, 5391), + span: SourceSpan::new("dsl/std/algebra.dag", 5343, 5451), }, Declaration { id: DeclarationId(27), @@ -530,7 +530,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { children: vec![ Field { label: "add".to_string(), - ty: DeclarationId(295), + ty: DeclarationId(293), }, Field { label: "zero".to_string(), @@ -538,7 +538,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }, Field { label: "mul".to_string(), - ty: DeclarationId(296), + ty: DeclarationId(294), }, Field { label: "one".to_string(), @@ -554,7 +554,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 5825, 5906), + span: SourceSpan::new("dsl/std/algebra.dag", 5885, 5966), }, Declaration { id: DeclarationId(28), @@ -568,7 +568,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 5825, 5906), + span: SourceSpan::new("dsl/std/algebra.dag", 5885, 5966), }, Declaration { id: DeclarationId(29), @@ -577,7 +577,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { children: vec![ Field { label: "add".to_string(), - ty: DeclarationId(297), + ty: DeclarationId(295), }, Field { label: "zero".to_string(), @@ -585,11 +585,11 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }, Field { label: "negate".to_string(), - ty: DeclarationId(298), + ty: DeclarationId(296), }, Field { label: "mul".to_string(), - ty: DeclarationId(299), + ty: DeclarationId(297), }, Field { label: "one".to_string(), @@ -605,7 +605,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 6033, 6131), + span: SourceSpan::new("dsl/std/algebra.dag", 6093, 6191), }, Declaration { id: DeclarationId(30), @@ -619,7 +619,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 6033, 6131), + span: SourceSpan::new("dsl/std/algebra.dag", 6093, 6191), }, Declaration { id: DeclarationId(31), @@ -628,11 +628,11 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { children: vec![ Field { label: "add".to_string(), - ty: DeclarationId(300), + ty: DeclarationId(298), }, Field { label: "sub".to_string(), - ty: DeclarationId(301), + ty: DeclarationId(299), }, Field { label: "zero".to_string(), @@ -640,15 +640,15 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }, Field { label: "negate".to_string(), - ty: DeclarationId(302), + ty: DeclarationId(300), }, Field { label: "mul".to_string(), - ty: DeclarationId(303), + ty: DeclarationId(301), }, Field { label: "div".to_string(), - ty: DeclarationId(305), + ty: DeclarationId(303), }, Field { label: "one".to_string(), @@ -656,39 +656,31 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }, Field { label: "compare".to_string(), - ty: DeclarationId(306), - }, - Field { - label: "quotient".to_string(), - ty: DeclarationId(307), - }, - Field { - label: "remainder".to_string(), - ty: DeclarationId(308), + ty: DeclarationId(304), }, Field { label: "eq".to_string(), - ty: DeclarationId(309), + ty: DeclarationId(305), }, Field { label: "ne".to_string(), - ty: DeclarationId(310), + ty: DeclarationId(306), }, Field { label: "lt".to_string(), - ty: DeclarationId(311), + ty: DeclarationId(307), }, Field { label: "le".to_string(), - ty: DeclarationId(312), + ty: DeclarationId(308), }, Field { label: "gt".to_string(), - ty: DeclarationId(313), + ty: DeclarationId(309), }, Field { label: "ge".to_string(), - ty: DeclarationId(314), + ty: DeclarationId(310), }, ], }, @@ -700,7 +692,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 6854, 7242), + span: SourceSpan::new("dsl/std/algebra.dag", 6952, 7287), }, Declaration { id: DeclarationId(32), @@ -714,7 +706,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 6854, 7242), + span: SourceSpan::new("dsl/std/algebra.dag", 6952, 7287), }, Declaration { id: DeclarationId(33), @@ -723,7 +715,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { children: vec![ Field { label: "add".to_string(), - ty: DeclarationId(315), + ty: DeclarationId(311), }, Field { label: "zero".to_string(), @@ -731,11 +723,11 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }, Field { label: "negate".to_string(), - ty: DeclarationId(316), + ty: DeclarationId(312), }, Field { label: "mul".to_string(), - ty: DeclarationId(317), + ty: DeclarationId(313), }, Field { label: "one".to_string(), @@ -743,11 +735,11 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }, Field { label: "reciprocal".to_string(), - ty: DeclarationId(318), + ty: DeclarationId(314), }, Field { label: "compare".to_string(), - ty: DeclarationId(319), + ty: DeclarationId(315), }, ], }, @@ -759,7 +751,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 7380, 7536), + span: SourceSpan::new("dsl/std/algebra.dag", 7425, 7581), }, Declaration { id: DeclarationId(34), @@ -773,7 +765,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 7380, 7536), + span: SourceSpan::new("dsl/std/algebra.dag", 7425, 7581), }, Declaration { id: DeclarationId(35), @@ -782,11 +774,11 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { children: vec![ Field { label: "meet".to_string(), - ty: DeclarationId(320), + ty: DeclarationId(316), }, Field { label: "join".to_string(), - ty: DeclarationId(321), + ty: DeclarationId(317), }, ], }, @@ -798,7 +790,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 7856, 7919), + span: SourceSpan::new("dsl/std/algebra.dag", 7901, 7964), }, Declaration { id: DeclarationId(36), @@ -812,7 +804,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 7856, 7919), + span: SourceSpan::new("dsl/std/algebra.dag", 7901, 7964), }, Declaration { id: DeclarationId(37), @@ -821,11 +813,11 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { children: vec![ Field { label: "meet".to_string(), - ty: DeclarationId(322), + ty: DeclarationId(318), }, Field { label: "join".to_string(), - ty: DeclarationId(323), + ty: DeclarationId(319), }, Field { label: "top".to_string(), @@ -845,7 +837,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 8027, 8118), + span: SourceSpan::new("dsl/std/algebra.dag", 8072, 8163), }, Declaration { id: DeclarationId(38), @@ -859,7 +851,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 8027, 8118), + span: SourceSpan::new("dsl/std/algebra.dag", 8072, 8163), }, Declaration { id: DeclarationId(39), @@ -868,15 +860,15 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { children: vec![ Field { label: "meet".to_string(), - ty: DeclarationId(324), + ty: DeclarationId(320), }, Field { label: "join".to_string(), - ty: DeclarationId(325), + ty: DeclarationId(321), }, Field { label: "complement".to_string(), - ty: DeclarationId(326), + ty: DeclarationId(322), }, Field { label: "top".to_string(), @@ -896,7 +888,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 8316, 8432), + span: SourceSpan::new("dsl/std/algebra.dag", 8361, 8477), }, Declaration { id: DeclarationId(40), @@ -910,7 +902,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 8316, 8432), + span: SourceSpan::new("dsl/std/algebra.dag", 8361, 8477), }, Declaration { id: DeclarationId(41), @@ -919,87 +911,83 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { children: vec![ Field { label: "concat".to_string(), - ty: DeclarationId(330), + ty: DeclarationId(326), }, Field { label: "empty".to_string(), - ty: DeclarationId(331), + ty: DeclarationId(327), }, Field { label: "append".to_string(), - ty: DeclarationId(333), - }, - Field { - label: "index".to_string(), - ty: DeclarationId(334), + ty: DeclarationId(329), }, Field { label: "slice".to_string(), - ty: DeclarationId(336), + ty: DeclarationId(331), }, Field { label: "length".to_string(), - ty: DeclarationId(337), + ty: DeclarationId(332), }, Field { label: "count".to_string(), - ty: DeclarationId(338), + ty: DeclarationId(333), }, Field { label: "first".to_string(), - ty: DeclarationId(340), + ty: DeclarationId(335), }, Field { label: "last".to_string(), - ty: DeclarationId(342), + ty: DeclarationId(337), }, Field { label: "map".to_string(), - ty: DeclarationId(345), + ty: DeclarationId(340), }, Field { label: "filter".to_string(), - ty: DeclarationId(348), + ty: DeclarationId(343), }, Field { label: "fold".to_string(), - ty: DeclarationId(350), + ty: DeclarationId(345), }, Field { label: "flat_map".to_string(), - ty: DeclarationId(354), + ty: DeclarationId(349), }, Field { label: "any".to_string(), - ty: DeclarationId(356), + ty: DeclarationId(351), }, Field { label: "all".to_string(), - ty: DeclarationId(358), + ty: DeclarationId(353), }, Field { label: "enumerate".to_string(), - ty: DeclarationId(362), + ty: DeclarationId(357), }, Field { label: "reverse".to_string(), - ty: DeclarationId(364), + ty: DeclarationId(359), }, Field { label: "skip".to_string(), - ty: DeclarationId(366), + ty: DeclarationId(361), }, Field { label: "take".to_string(), - ty: DeclarationId(368), + ty: DeclarationId(363), }, Field { label: "sort_by".to_string(), - ty: DeclarationId(371), + ty: DeclarationId(366), }, Field { label: "contains".to_string(), - ty: DeclarationId(372), + ty: DeclarationId(367), }, ], }, @@ -1011,7 +999,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12204, 13158), + span: SourceSpan::new("dsl/std/algebra.dag", 12349, 13286), }, Declaration { id: DeclarationId(42), @@ -1025,7 +1013,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12204, 13158), + span: SourceSpan::new("dsl/std/algebra.dag", 12349, 13286), }, Declaration { id: DeclarationId(43), @@ -1034,43 +1022,43 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { children: vec![ Field { label: "lookup".to_string(), - ty: DeclarationId(374), + ty: DeclarationId(369), }, Field { label: "empty".to_string(), - ty: DeclarationId(375), + ty: DeclarationId(370), }, Field { label: "get".to_string(), - ty: DeclarationId(377), + ty: DeclarationId(372), }, Field { label: "insert".to_string(), - ty: DeclarationId(379), + ty: DeclarationId(374), }, Field { label: "merge".to_string(), - ty: DeclarationId(382), + ty: DeclarationId(377), }, Field { label: "keys".to_string(), - ty: DeclarationId(384), + ty: DeclarationId(379), }, Field { label: "values".to_string(), - ty: DeclarationId(386), + ty: DeclarationId(381), }, Field { label: "has".to_string(), - ty: DeclarationId(387), + ty: DeclarationId(382), }, Field { label: "contains_key".to_string(), - ty: DeclarationId(388), + ty: DeclarationId(383), }, Field { label: "size".to_string(), - ty: DeclarationId(389), + ty: DeclarationId(384), }, ], }, @@ -1082,7 +1070,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 13673, 14012), + span: SourceSpan::new("dsl/std/algebra.dag", 13801, 14140), }, Declaration { id: DeclarationId(44), @@ -1096,7 +1084,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 13673, 14012), + span: SourceSpan::new("dsl/std/algebra.dag", 13801, 14140), }, Declaration { id: DeclarationId(45), @@ -1110,7 +1098,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 13673, 14012), + span: SourceSpan::new("dsl/std/algebra.dag", 13801, 14140), }, Declaration { id: DeclarationId(46), @@ -1119,15 +1107,15 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { variants: vec![ Field { label: "Less".to_string(), - ty: DeclarationId(390), + ty: DeclarationId(385), }, Field { label: "Equal".to_string(), - ty: DeclarationId(391), + ty: DeclarationId(386), }, Field { label: "Greater".to_string(), - ty: DeclarationId(392), + ty: DeclarationId(387), }, ], }, @@ -1139,7 +1127,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 14213, 14251), + span: SourceSpan::new("dsl/std/algebra.dag", 14341, 14379), }, Declaration { id: DeclarationId(47), @@ -1148,31 +1136,31 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { variants: vec![ Field { label: "OrderedRingProfile".to_string(), - ty: DeclarationId(393), + ty: DeclarationId(388), }, Field { label: "ApproximateFieldProfile".to_string(), - ty: DeclarationId(394), + ty: DeclarationId(389), }, Field { label: "BooleanAlgebraProfile".to_string(), - ty: DeclarationId(395), + ty: DeclarationId(390), }, Field { label: "BooleanAlgebraCollectionProfile".to_string(), - ty: DeclarationId(396), + ty: DeclarationId(391), }, Field { label: "FreeMonoidScalarProfile".to_string(), - ty: DeclarationId(397), + ty: DeclarationId(392), }, Field { label: "FreeMonoidCollectionProfile".to_string(), - ty: DeclarationId(398), + ty: DeclarationId(393), }, Field { label: "PartialFunctionProfile".to_string(), - ty: DeclarationId(399), + ty: DeclarationId(394), }, ], }, @@ -1184,7 +1172,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 16153, 16372), + span: SourceSpan::new("dsl/std/algebra.dag", 16281, 16500), }, Declaration { id: DeclarationId(48), @@ -1193,11 +1181,11 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { variants: vec![ Field { label: "SameAsReceiver".to_string(), - ty: DeclarationId(400), + ty: DeclarationId(395), }, Field { label: "Named".to_string(), - ty: DeclarationId(401), + ty: DeclarationId(396), }, ], }, @@ -1209,7 +1197,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 16374, 16440), + span: SourceSpan::new("dsl/std/algebra.dag", 16502, 16568), }, Declaration { id: DeclarationId(49), @@ -1218,43 +1206,43 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { variants: vec![ Field { label: "ReceiverSelf".to_string(), - ty: DeclarationId(402), + ty: DeclarationId(397), }, Field { label: "ReceiverElement".to_string(), - ty: DeclarationId(403), + ty: DeclarationId(398), }, Field { label: "ReceiverKey".to_string(), - ty: DeclarationId(404), + ty: DeclarationId(399), }, Field { label: "ReceiverValue".to_string(), - ty: DeclarationId(405), + ty: DeclarationId(400), }, Field { label: "NamedTemplate".to_string(), - ty: DeclarationId(406), + ty: DeclarationId(401), }, Field { label: "ContainerOf".to_string(), - ty: DeclarationId(407), + ty: DeclarationId(402), }, Field { label: "OptionalOf".to_string(), - ty: DeclarationId(408), + ty: DeclarationId(403), }, Field { label: "TupleOf".to_string(), - ty: DeclarationId(409), + ty: DeclarationId(404), }, Field { label: "CallableOf".to_string(), - ty: DeclarationId(411), + ty: DeclarationId(406), }, Field { label: "AlgebraTypeVariable".to_string(), - ty: DeclarationId(412), + ty: DeclarationId(407), }, ], }, @@ -1266,7 +1254,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 16442, 16890), + span: SourceSpan::new("dsl/std/algebra.dag", 16570, 17018), }, Declaration { id: DeclarationId(50), @@ -1275,15 +1263,15 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { variants: vec![ Field { label: "ShrinkEffect".to_string(), - ty: DeclarationId(413), + ty: DeclarationId(408), }, Field { label: "ProjectionEffect".to_string(), - ty: DeclarationId(414), + ty: DeclarationId(409), }, Field { label: "IdentityEffect".to_string(), - ty: DeclarationId(415), + ty: DeclarationId(410), }, ], }, @@ -1295,7 +1283,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 17106, 17283), + span: SourceSpan::new("dsl/std/algebra.dag", 17234, 17411), }, Declaration { id: DeclarationId(51), @@ -1304,19 +1292,19 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { variants: vec![ Field { label: "ShapeConstant".to_string(), - ty: DeclarationId(416), + ty: DeclarationId(411), }, Field { label: "ShapeLinearScan".to_string(), - ty: DeclarationId(417), + ty: DeclarationId(412), }, Field { label: "ShapeIterateBody".to_string(), - ty: DeclarationId(418), + ty: DeclarationId(413), }, Field { label: "ShapeSortBody".to_string(), - ty: DeclarationId(419), + ty: DeclarationId(414), }, ], }, @@ -1328,7 +1316,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 17741, 17926), + span: SourceSpan::new("dsl/std/algebra.dag", 17869, 18054), }, Declaration { id: DeclarationId(52), @@ -1341,7 +1329,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }, Field { label: "param_types".to_string(), - ty: DeclarationId(420), + ty: DeclarationId(415), }, Field { label: "return_type".to_string(), @@ -1349,15 +1337,15 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }, Field { label: "size_effect".to_string(), - ty: DeclarationId(421), + ty: DeclarationId(416), }, Field { label: "cost_shape".to_string(), - ty: DeclarationId(422), + ty: DeclarationId(417), }, Field { label: "callback_element_position".to_string(), - ty: DeclarationId(423), + ty: DeclarationId(418), }, ], }, @@ -1369,7 +1357,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 17951, 18382), + span: SourceSpan::new("dsl/std/algebra.dag", 18079, 18510), }, Declaration { id: DeclarationId(53), @@ -1389,7 +1377,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }, type_params: vec![], phantom_params: Vec::new(), - meta_tag: Some(DeclarationId(424)), + meta_tag: Some(DeclarationId(419)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Map( @@ -1397,49 +1385,49 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { ( "Int".to_string(), FieldValue::Variant { - constructor: DeclarationId(393), + constructor: DeclarationId(388), payload: vec![], }, ), ( "Float".to_string(), FieldValue::Variant { - constructor: DeclarationId(394), + constructor: DeclarationId(389), payload: vec![], }, ), ( "Bool".to_string(), FieldValue::Variant { - constructor: DeclarationId(395), + constructor: DeclarationId(390), payload: vec![], }, ), ( "String".to_string(), FieldValue::Variant { - constructor: DeclarationId(397), + constructor: DeclarationId(392), payload: vec![], }, ), ( "List".to_string(), FieldValue::Variant { - constructor: DeclarationId(398), + constructor: DeclarationId(393), payload: vec![], }, ), ( "Set".to_string(), FieldValue::Variant { - constructor: DeclarationId(396), + constructor: DeclarationId(391), payload: vec![], }, ), ( "Map".to_string(), FieldValue::Variant { - constructor: DeclarationId(399), + constructor: DeclarationId(394), payload: vec![], }, ), @@ -1448,15 +1436,15 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { )), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 18384, 18694), + span: SourceSpan::new("dsl/std/algebra.dag", 18512, 18822), }, Declaration { id: DeclarationId(54), name: Some("ordered_ring_templates".to_string()), connective: TypeConnective::Arrow { inputs: vec![], - output: DeclarationId(278), - body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 18754, 20229)), + output: DeclarationId(276), + body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 18882, 20024)), }, type_params: vec![], phantom_params: Vec::new(), @@ -1466,15 +1454,15 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 18696, 20229), + span: SourceSpan::new("dsl/std/algebra.dag", 18824, 20024), }, Declaration { id: DeclarationId(55), name: Some("approximate_field_templates".to_string()), connective: TypeConnective::Arrow { inputs: vec![], - output: DeclarationId(279), - body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 20294, 21388)), + output: DeclarationId(277), + body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 20089, 21183)), }, type_params: vec![], phantom_params: Vec::new(), @@ -1484,15 +1472,15 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 20231, 21388), + span: SourceSpan::new("dsl/std/algebra.dag", 20026, 21183), }, Declaration { id: DeclarationId(56), name: Some("boolean_algebra_templates".to_string()), connective: TypeConnective::Arrow { inputs: vec![], - output: DeclarationId(280), - body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 21451, 22212)), + output: DeclarationId(278), + body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 21246, 22007)), }, type_params: vec![], phantom_params: Vec::new(), @@ -1502,15 +1490,15 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 21390, 22212), + span: SourceSpan::new("dsl/std/algebra.dag", 21185, 22007), }, Declaration { id: DeclarationId(57), name: Some("boolean_algebra_collection_templates".to_string()), connective: TypeConnective::Arrow { inputs: vec![], - output: DeclarationId(281), - body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 22577, 25922)), + output: DeclarationId(279), + body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 22372, 25717)), }, type_params: vec![], phantom_params: Vec::new(), @@ -1520,15 +1508,15 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 22505, 25922), + span: SourceSpan::new("dsl/std/algebra.dag", 22300, 25717), }, Declaration { id: DeclarationId(58), name: Some("free_monoid_scalar_templates".to_string()), connective: TypeConnective::Arrow { inputs: vec![], - output: DeclarationId(282), - body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 25988, 29055)), + output: DeclarationId(280), + body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 25783, 28850)), }, type_params: vec![], phantom_params: Vec::new(), @@ -1538,15 +1526,15 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 25924, 29055), + span: SourceSpan::new("dsl/std/algebra.dag", 25719, 28850), }, Declaration { id: DeclarationId(59), name: Some("free_monoid_collection_templates".to_string()), connective: TypeConnective::Arrow { inputs: vec![], - output: DeclarationId(283), - body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 29125, 34193)), + output: DeclarationId(281), + body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 28920, 33988)), }, type_params: vec![], phantom_params: Vec::new(), @@ -1556,15 +1544,15 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 29057, 34193), + span: SourceSpan::new("dsl/std/algebra.dag", 28852, 33988), }, Declaration { id: DeclarationId(60), name: Some("partial_function_templates".to_string()), connective: TypeConnective::Arrow { inputs: vec![], - output: DeclarationId(284), - body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 34257, 37081)), + output: DeclarationId(282), + body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 34052, 36876)), }, type_params: vec![], phantom_params: Vec::new(), @@ -1574,15 +1562,15 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 34195, 37081), + span: SourceSpan::new("dsl/std/algebra.dag", 33990, 36876), }, Declaration { id: DeclarationId(61), name: Some("algebra_templates_for_profile".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(47)], - output: DeclarationId(285), - body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 37171, 37634)), + output: DeclarationId(283), + body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 36966, 37429)), }, type_params: vec![], phantom_params: Vec::new(), @@ -1592,15 +1580,15 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 37083, 37634), + span: SourceSpan::new("dsl/std/algebra.dag", 36878, 37429), }, Declaration { id: DeclarationId(62), name: Some("algebra_type_param_names".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(47)], - output: DeclarationId(286), - body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 37976, 38257)), + output: DeclarationId(284), + body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/algebra.dag", 37771, 38052)), }, type_params: vec![], phantom_params: Vec::new(), @@ -1610,7 +1598,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 37907, 38257), + span: SourceSpan::new("dsl/std/algebra.dag", 37702, 38052), }, Declaration { id: DeclarationId(63), @@ -1881,7 +1869,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }, type_params: vec![], phantom_params: Vec::new(), - meta_tag: Some(DeclarationId(538)), + meta_tag: Some(DeclarationId(533)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Map( @@ -1961,7 +1949,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }, type_params: vec![], phantom_params: Vec::new(), - meta_tag: Some(DeclarationId(539)), + meta_tag: Some(DeclarationId(534)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Map( @@ -1999,7 +1987,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { name: Some("container_expected_arity".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], - output: DeclarationId(425), + output: DeclarationId(420), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/types.dag", 3786, 3827)), }, type_params: vec![], @@ -2017,7 +2005,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { name: Some("container_param_names_for".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], - output: DeclarationId(426), + output: DeclarationId(421), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/types.dag", 4067, 4204)), }, type_params: vec![], @@ -2035,7 +2023,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { name: Some("container_param_name".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(71)], - output: DeclarationId(427), + output: DeclarationId(422), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/types.dag", 4272, 4512)), }, type_params: vec![], @@ -2066,7 +2054,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }, type_params: vec![], phantom_params: Vec::new(), - meta_tag: Some(DeclarationId(540)), + meta_tag: Some(DeclarationId(535)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Map( @@ -2116,7 +2104,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }, type_params: vec![], phantom_params: Vec::new(), - meta_tag: Some(DeclarationId(541)), + meta_tag: Some(DeclarationId(536)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Map( @@ -2181,7 +2169,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { name: Some("container_template_algebra".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], - output: DeclarationId(428), + output: DeclarationId(423), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/types.dag", 6180, 6232)), }, type_params: vec![], @@ -2199,7 +2187,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { name: Some("canonical_container_names".to_string()), connective: TypeConnective::Arrow { inputs: vec![], - output: DeclarationId(429), + output: DeclarationId(424), body: ArrowBody::Unparsed(SourceSpan::new("dsl/std/types.dag", 6521, 6600)), }, type_params: vec![], @@ -2219,11 +2207,11 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { variants: vec![ Field { label: "True".to_string(), - ty: DeclarationId(430), + ty: DeclarationId(425), }, Field { label: "False".to_string(), - ty: DeclarationId(431), + ty: DeclarationId(426), }, ], }, @@ -2231,7 +2219,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, - inhabits: Some(DeclarationId(593)), + inhabits: Some(DeclarationId(588)), value_body: None, refinement: None, nominal_opacity: None, @@ -2430,7 +2418,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(542)), + refinement: Some(DeclarationId(537)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10147, 10207), }, @@ -2446,7 +2434,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(543)), + refinement: Some(DeclarationId(538)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10208, 10268), }, @@ -2462,7 +2450,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(544)), + refinement: Some(DeclarationId(539)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10269, 10320), }, @@ -2478,7 +2466,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(545)), + refinement: Some(DeclarationId(540)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10321, 10376), }, @@ -2494,7 +2482,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(546)), + refinement: Some(DeclarationId(541)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10377, 10442), }, @@ -2510,7 +2498,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(547)), + refinement: Some(DeclarationId(542)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10443, 10498), }, @@ -2526,7 +2514,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(548)), + refinement: Some(DeclarationId(543)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10499, 10544), }, @@ -2561,7 +2549,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(549)), + refinement: Some(DeclarationId(544)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10587, 10629), }, @@ -2577,7 +2565,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(550)), + refinement: Some(DeclarationId(545)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10630, 10684), }, @@ -2593,7 +2581,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(551)), + refinement: Some(DeclarationId(546)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10685, 10748), }, @@ -2609,7 +2597,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(552)), + refinement: Some(DeclarationId(547)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10749, 10794), }, @@ -2625,7 +2613,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(553)), + refinement: Some(DeclarationId(548)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10795, 10840), }, @@ -2641,7 +2629,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(554)), + refinement: Some(DeclarationId(549)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10841, 10886), }, @@ -2657,7 +2645,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(555)), + refinement: Some(DeclarationId(550)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10887, 10933), }, @@ -2673,7 +2661,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(556)), + refinement: Some(DeclarationId(551)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 10934, 10980), }, @@ -2689,7 +2677,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(557)), + refinement: Some(DeclarationId(552)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11151, 11210), }, @@ -2705,7 +2693,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(558)), + refinement: Some(DeclarationId(553)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11211, 11270), }, @@ -2715,7 +2703,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { connective: TypeConnective::Conj { children: vec![Field { label: "segments".to_string(), - ty: DeclarationId(432), + ty: DeclarationId(427), }], }, type_params: vec![], @@ -2734,7 +2722,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { connective: TypeConnective::Conj { children: vec![Field { label: "segments".to_string(), - ty: DeclarationId(433), + ty: DeclarationId(428), }], }, type_params: vec![], @@ -2759,7 +2747,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(559)), + refinement: Some(DeclarationId(554)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 11375, 11418), }, @@ -2804,7 +2792,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(560)), + refinement: Some(DeclarationId(555)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12098, 12196), }, @@ -2820,7 +2808,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(561)), + refinement: Some(DeclarationId(556)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12197, 12241), }, @@ -2836,7 +2824,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(562)), + refinement: Some(DeclarationId(557)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12242, 12286), }, @@ -2852,7 +2840,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(563)), + refinement: Some(DeclarationId(558)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12287, 12354), }, @@ -2868,7 +2856,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(564)), + refinement: Some(DeclarationId(559)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12355, 12417), }, @@ -2884,7 +2872,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(565)), + refinement: Some(DeclarationId(560)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12941, 12996), }, @@ -2900,7 +2888,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(566)), + refinement: Some(DeclarationId(561)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 12997, 13051), }, @@ -2916,7 +2904,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(567)), + refinement: Some(DeclarationId(562)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13052, 13105), }, @@ -2932,7 +2920,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(568)), + refinement: Some(DeclarationId(563)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13106, 13163), }, @@ -2948,7 +2936,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(569)), + refinement: Some(DeclarationId(564)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13164, 13221), }, @@ -2964,7 +2952,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(570)), + refinement: Some(DeclarationId(565)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13222, 13277), }, @@ -2980,7 +2968,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(571)), + refinement: Some(DeclarationId(566)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13278, 13334), }, @@ -2996,7 +2984,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(572)), + refinement: Some(DeclarationId(567)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13335, 13391), }, @@ -3012,7 +3000,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(573)), + refinement: Some(DeclarationId(568)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13392, 13450), }, @@ -3028,7 +3016,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(574)), + refinement: Some(DeclarationId(569)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13530, 13572), }, @@ -3044,7 +3032,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(575)), + refinement: Some(DeclarationId(570)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13779, 13864), }, @@ -3060,7 +3048,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(576)), + refinement: Some(DeclarationId(571)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 13865, 13974), }, @@ -3071,15 +3059,15 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { variants: vec![ Field { label: "Linux".to_string(), - ty: DeclarationId(434), + ty: DeclarationId(429), }, Field { label: "Macos".to_string(), - ty: DeclarationId(435), + ty: DeclarationId(430), }, Field { label: "Windows".to_string(), - ty: DeclarationId(436), + ty: DeclarationId(431), }, ], }, @@ -3100,19 +3088,19 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { variants: vec![ Field { label: "Pure".to_string(), - ty: DeclarationId(437), + ty: DeclarationId(432), }, Field { label: "Transport".to_string(), - ty: DeclarationId(438), + ty: DeclarationId(433), }, Field { label: "SubDag".to_string(), - ty: DeclarationId(439), + ty: DeclarationId(434), }, Field { label: "Env".to_string(), - ty: DeclarationId(440), + ty: DeclarationId(435), }, ], }, @@ -3133,15 +3121,15 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { variants: vec![ Field { label: "Template".to_string(), - ty: DeclarationId(441), + ty: DeclarationId(436), }, Field { label: "Generated".to_string(), - ty: DeclarationId(442), + ty: DeclarationId(437), }, Field { label: "Static".to_string(), - ty: DeclarationId(443), + ty: DeclarationId(438), }, ], }, @@ -3162,23 +3150,23 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { variants: vec![ Field { label: "Xs".to_string(), - ty: DeclarationId(444), + ty: DeclarationId(439), }, Field { label: "S".to_string(), - ty: DeclarationId(445), + ty: DeclarationId(440), }, Field { label: "M".to_string(), - ty: DeclarationId(446), + ty: DeclarationId(441), }, Field { label: "L".to_string(), - ty: DeclarationId(447), + ty: DeclarationId(442), }, Field { label: "Xl".to_string(), - ty: DeclarationId(448), + ty: DeclarationId(443), }, ], }, @@ -3199,23 +3187,23 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { variants: vec![ Field { label: "Stored".to_string(), - ty: DeclarationId(449), + ty: DeclarationId(444), }, Field { label: "PlatformInjected".to_string(), - ty: DeclarationId(450), + ty: DeclarationId(445), }, Field { label: "WorkloadIdentity".to_string(), - ty: DeclarationId(453), + ty: DeclarationId(448), }, Field { label: "InteractiveAuth".to_string(), - ty: DeclarationId(455), + ty: DeclarationId(450), }, Field { label: "Chained".to_string(), - ty: DeclarationId(457), + ty: DeclarationId(452), }, ], }, @@ -3236,47 +3224,47 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { variants: vec![ Field { label: "X86_64".to_string(), - ty: DeclarationId(458), + ty: DeclarationId(453), }, Field { label: "X86".to_string(), - ty: DeclarationId(459), + ty: DeclarationId(454), }, Field { label: "Aarch64".to_string(), - ty: DeclarationId(460), + ty: DeclarationId(455), }, Field { label: "Arm".to_string(), - ty: DeclarationId(461), + ty: DeclarationId(456), }, Field { label: "Armv7".to_string(), - ty: DeclarationId(462), + ty: DeclarationId(457), }, Field { label: "Mips".to_string(), - ty: DeclarationId(463), + ty: DeclarationId(458), }, Field { label: "Mipsel".to_string(), - ty: DeclarationId(464), + ty: DeclarationId(459), }, Field { label: "Mips64".to_string(), - ty: DeclarationId(465), + ty: DeclarationId(460), }, Field { label: "Mips64el".to_string(), - ty: DeclarationId(466), + ty: DeclarationId(461), }, Field { label: "Riscv64".to_string(), - ty: DeclarationId(467), + ty: DeclarationId(462), }, Field { label: "Wasm32".to_string(), - ty: DeclarationId(468), + ty: DeclarationId(463), }, ], }, @@ -3297,19 +3285,19 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { variants: vec![ Field { label: "UnknownVendor".to_string(), - ty: DeclarationId(469), + ty: DeclarationId(464), }, Field { label: "Pc".to_string(), - ty: DeclarationId(470), + ty: DeclarationId(465), }, Field { label: "Apple".to_string(), - ty: DeclarationId(471), + ty: DeclarationId(466), }, Field { label: "W64".to_string(), - ty: DeclarationId(472), + ty: DeclarationId(467), }, ], }, @@ -3330,31 +3318,31 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { variants: vec![ Field { label: "Linux".to_string(), - ty: DeclarationId(473), + ty: DeclarationId(468), }, Field { label: "Macos".to_string(), - ty: DeclarationId(474), + ty: DeclarationId(469), }, Field { label: "Windows".to_string(), - ty: DeclarationId(475), + ty: DeclarationId(470), }, Field { label: "Freebsd".to_string(), - ty: DeclarationId(476), + ty: DeclarationId(471), }, Field { label: "Android".to_string(), - ty: DeclarationId(477), + ty: DeclarationId(472), }, Field { label: "Ios".to_string(), - ty: DeclarationId(478), + ty: DeclarationId(473), }, Field { label: "Wasi".to_string(), - ty: DeclarationId(479), + ty: DeclarationId(474), }, ], }, @@ -3375,39 +3363,39 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { variants: vec![ Field { label: "NoneAbi".to_string(), - ty: DeclarationId(480), + ty: DeclarationId(475), }, Field { label: "Gnu".to_string(), - ty: DeclarationId(481), + ty: DeclarationId(476), }, Field { label: "GnuEabi".to_string(), - ty: DeclarationId(482), + ty: DeclarationId(477), }, Field { label: "GnuEabihf".to_string(), - ty: DeclarationId(483), + ty: DeclarationId(478), }, Field { label: "Musl".to_string(), - ty: DeclarationId(484), + ty: DeclarationId(479), }, Field { label: "Msvc".to_string(), - ty: DeclarationId(485), + ty: DeclarationId(480), }, Field { label: "AndroidAbi".to_string(), - ty: DeclarationId(486), + ty: DeclarationId(481), }, Field { label: "Eabi".to_string(), - ty: DeclarationId(487), + ty: DeclarationId(482), }, Field { label: "Eabihf".to_string(), - ty: DeclarationId(488), + ty: DeclarationId(483), }, ], }, @@ -3428,23 +3416,23 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { variants: vec![ Field { label: "Native".to_string(), - ty: DeclarationId(489), + ty: DeclarationId(484), }, Field { label: "Wsl".to_string(), - ty: DeclarationId(490), + ty: DeclarationId(485), }, Field { label: "Container".to_string(), - ty: DeclarationId(491), + ty: DeclarationId(486), }, Field { label: "Ci".to_string(), - ty: DeclarationId(492), + ty: DeclarationId(487), }, Field { label: "Emulator".to_string(), - ty: DeclarationId(493), + ty: DeclarationId(488), }, ], }, @@ -3477,7 +3465,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }, Field { label: "env".to_string(), - ty: DeclarationId(494), + ty: DeclarationId(489), }, ], }, @@ -3523,23 +3511,23 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { variants: vec![ Field { label: "RegularFile".to_string(), - ty: DeclarationId(495), + ty: DeclarationId(490), }, Field { label: "Directory".to_string(), - ty: DeclarationId(496), + ty: DeclarationId(491), }, Field { label: "Symlink".to_string(), - ty: DeclarationId(497), + ty: DeclarationId(492), }, Field { label: "Missing".to_string(), - ty: DeclarationId(498), + ty: DeclarationId(493), }, Field { label: "Other".to_string(), - ty: DeclarationId(499), + ty: DeclarationId(494), }, ], }, @@ -3560,15 +3548,15 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { variants: vec![ Field { label: "TargetFile".to_string(), - ty: DeclarationId(500), + ty: DeclarationId(495), }, Field { label: "TargetDir".to_string(), - ty: DeclarationId(501), + ty: DeclarationId(496), }, Field { label: "Broken".to_string(), - ty: DeclarationId(502), + ty: DeclarationId(497), }, ], }, @@ -3594,7 +3582,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(577)), + refinement: Some(DeclarationId(572)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 17397, 17447), }, @@ -3610,7 +3598,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(578)), + refinement: Some(DeclarationId(573)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 17448, 17500), }, @@ -3626,7 +3614,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(579)), + refinement: Some(DeclarationId(574)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 17641, 17702), }, @@ -3637,31 +3625,31 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { variants: vec![ Field { label: "GET".to_string(), - ty: DeclarationId(503), + ty: DeclarationId(498), }, Field { label: "POST".to_string(), - ty: DeclarationId(504), + ty: DeclarationId(499), }, Field { label: "PUT".to_string(), - ty: DeclarationId(505), + ty: DeclarationId(500), }, Field { label: "PATCH".to_string(), - ty: DeclarationId(506), + ty: DeclarationId(501), }, Field { label: "DELETE".to_string(), - ty: DeclarationId(507), + ty: DeclarationId(502), }, Field { label: "HEAD".to_string(), - ty: DeclarationId(508), + ty: DeclarationId(503), }, Field { label: "OPTIONS".to_string(), - ty: DeclarationId(509), + ty: DeclarationId(504), }, ], }, @@ -3682,19 +3670,19 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { variants: vec![ Field { label: "Bearer".to_string(), - ty: DeclarationId(510), + ty: DeclarationId(505), }, Field { label: "Header".to_string(), - ty: DeclarationId(511), + ty: DeclarationId(506), }, Field { label: "Basic".to_string(), - ty: DeclarationId(512), + ty: DeclarationId(507), }, Field { label: "ApiKey".to_string(), - ty: DeclarationId(513), + ty: DeclarationId(508), }, ], }, @@ -3723,7 +3711,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }, Field { label: "expires_at".to_string(), - ty: DeclarationId(514), + ty: DeclarationId(509), }, ], }, @@ -3752,7 +3740,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }, Field { label: "header_name".to_string(), - ty: DeclarationId(515), + ty: DeclarationId(510), }, Field { label: "source_id".to_string(), @@ -3760,11 +3748,11 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }, Field { label: "required_scopes".to_string(), - ty: DeclarationId(516), + ty: DeclarationId(511), }, Field { label: "expires_in".to_string(), - ty: DeclarationId(517), + ty: DeclarationId(512), }, ], }, @@ -3790,7 +3778,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(580)), + refinement: Some(DeclarationId(575)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19562, 19626), }, @@ -3806,7 +3794,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(581)), + refinement: Some(DeclarationId(576)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19627, 19684), }, @@ -3822,7 +3810,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { specialization_parent: None, inhabits: None, value_body: None, - refinement: Some(DeclarationId(582)), + refinement: Some(DeclarationId(577)), nominal_opacity: None, span: SourceSpan::new("dsl/std/types.dag", 19685, 19741), }, @@ -4122,7 +4110,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }, Field { label: "lines".to_string(), - ty: DeclarationId(518), + ty: DeclarationId(513), }, ], }, @@ -4155,7 +4143,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }, Field { label: "sections".to_string(), - ty: DeclarationId(519), + ty: DeclarationId(514), }, Field { label: "trailing_newline".to_string(), @@ -4238,7 +4226,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }, Field { label: "description".to_string(), - ty: DeclarationId(520), + ty: DeclarationId(515), }, ], }, @@ -4258,7 +4246,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { connective: TypeConnective::Conj { children: vec![Field { label: "tools".to_string(), - ty: DeclarationId(521), + ty: DeclarationId(516), }], }, type_params: vec![], @@ -4278,15 +4266,15 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { children: vec![ Field { label: "nodes".to_string(), - ty: DeclarationId(522), + ty: DeclarationId(517), }, Field { label: "edges".to_string(), - ty: DeclarationId(523), + ty: DeclarationId(518), }, Field { label: "subdag_boundaries".to_string(), - ty: DeclarationId(524), + ty: DeclarationId(519), }, ], }, @@ -4319,7 +4307,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }, Field { label: "parent".to_string(), - ty: DeclarationId(525), + ty: DeclarationId(520), }, ], }, @@ -4348,7 +4336,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }, Field { label: "port".to_string(), - ty: DeclarationId(526), + ty: DeclarationId(521), }, ], }, @@ -4369,15 +4357,15 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { children: vec![ Field { label: "added".to_string(), - ty: DeclarationId(527), + ty: DeclarationId(522), }, Field { label: "removed".to_string(), - ty: DeclarationId(528), + ty: DeclarationId(523), }, Field { label: "changed".to_string(), - ty: DeclarationId(529), + ty: DeclarationId(524), }, ], }, @@ -4406,15 +4394,15 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }, Field { label: "backend".to_string(), - ty: DeclarationId(530), + ty: DeclarationId(525), }, Field { label: "target".to_string(), - ty: DeclarationId(531), + ty: DeclarationId(526), }, Field { label: "runtime_env".to_string(), - ty: DeclarationId(532), + ty: DeclarationId(527), }, ], }, @@ -4435,19 +4423,19 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { variants: vec![ Field { label: "Rust".to_string(), - ty: DeclarationId(533), + ty: DeclarationId(528), }, Field { label: "Go".to_string(), - ty: DeclarationId(534), + ty: DeclarationId(529), }, Field { label: "C".to_string(), - ty: DeclarationId(535), + ty: DeclarationId(530), }, Field { label: "Mips".to_string(), - ty: DeclarationId(536), + ty: DeclarationId(531), }, ], }, @@ -4476,7 +4464,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }, Field { label: "scope".to_string(), - ty: DeclarationId(537), + ty: DeclarationId(532), }, ], }, @@ -4542,19 +4530,19 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { variants: vec![ Field { label: "Whitespace".to_string(), - ty: DeclarationId(583), + ty: DeclarationId(578), }, Field { label: "Digit".to_string(), - ty: DeclarationId(584), + ty: DeclarationId(579), }, Field { label: "IdentStart".to_string(), - ty: DeclarationId(585), + ty: DeclarationId(580), }, Field { label: "IdentContinue".to_string(), - ty: DeclarationId(586), + ty: DeclarationId(581), }, ], }, @@ -4593,15 +4581,15 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { variants: vec![ Field { label: "ZeroWidth".to_string(), - ty: DeclarationId(587), + ty: DeclarationId(582), }, Field { label: "Narrow".to_string(), - ty: DeclarationId(588), + ty: DeclarationId(583), }, Field { label: "Wide".to_string(), - ty: DeclarationId(589), + ty: DeclarationId(584), }, ], }, @@ -4678,7 +4666,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }, type_params: vec![], phantom_params: Vec::new(), - meta_tag: Some(DeclarationId(590)), + meta_tag: Some(DeclarationId(585)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![ @@ -4700,7 +4688,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { ( "default_width".to_string(), FieldValue::Variant { - constructor: DeclarationId(587), + constructor: DeclarationId(582), payload: vec![], }, ), @@ -4723,7 +4711,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { ( "default_width".to_string(), FieldValue::Variant { - constructor: DeclarationId(587), + constructor: DeclarationId(582), payload: vec![], }, ), @@ -4746,7 +4734,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { ( "default_width".to_string(), FieldValue::Variant { - constructor: DeclarationId(587), + constructor: DeclarationId(582), payload: vec![], }, ), @@ -4769,7 +4757,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { ( "default_width".to_string(), FieldValue::Variant { - constructor: DeclarationId(587), + constructor: DeclarationId(582), payload: vec![], }, ), @@ -4792,7 +4780,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { ( "default_width".to_string(), FieldValue::Variant { - constructor: DeclarationId(587), + constructor: DeclarationId(582), payload: vec![], }, ), @@ -4815,7 +4803,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { ( "default_width".to_string(), FieldValue::Variant { - constructor: DeclarationId(587), + constructor: DeclarationId(582), payload: vec![], }, ), @@ -4837,7 +4825,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }, type_params: vec![], phantom_params: Vec::new(), - meta_tag: Some(DeclarationId(591)), + meta_tag: Some(DeclarationId(586)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![ @@ -4862,7 +4850,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }, type_params: vec![], phantom_params: Vec::new(), - meta_tag: Some(DeclarationId(592)), + meta_tag: Some(DeclarationId(587)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![ @@ -4882,7 +4870,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { ( "default_width".to_string(), FieldValue::Variant { - constructor: DeclarationId(589), + constructor: DeclarationId(584), payload: vec![], }, ), @@ -4905,7 +4893,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { ( "default_width".to_string(), FieldValue::Variant { - constructor: DeclarationId(589), + constructor: DeclarationId(584), payload: vec![], }, ), @@ -4928,7 +4916,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { ( "default_width".to_string(), FieldValue::Variant { - constructor: DeclarationId(589), + constructor: DeclarationId(584), payload: vec![], }, ), @@ -4949,7 +4937,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { ( "default_width".to_string(), FieldValue::Variant { - constructor: DeclarationId(589), + constructor: DeclarationId(584), payload: vec![], }, ), @@ -4972,7 +4960,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { ( "default_width".to_string(), FieldValue::Variant { - constructor: DeclarationId(589), + constructor: DeclarationId(584), payload: vec![], }, ), @@ -4995,7 +4983,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { ( "default_width".to_string(), FieldValue::Variant { - constructor: DeclarationId(589), + constructor: DeclarationId(584), payload: vec![], }, ), @@ -5018,7 +5006,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { ( "default_width".to_string(), FieldValue::Variant { - constructor: DeclarationId(589), + constructor: DeclarationId(584), payload: vec![], }, ), @@ -5041,7 +5029,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { ( "default_width".to_string(), FieldValue::Variant { - constructor: DeclarationId(589), + constructor: DeclarationId(584), payload: vec![], }, ), @@ -5064,7 +5052,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { ( "default_width".to_string(), FieldValue::Variant { - constructor: DeclarationId(589), + constructor: DeclarationId(584), payload: vec![], }, ), @@ -5085,7 +5073,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { ( "default_width".to_string(), FieldValue::Variant { - constructor: DeclarationId(589), + constructor: DeclarationId(584), payload: vec![], }, ), @@ -5106,7 +5094,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { ( "default_width".to_string(), FieldValue::Variant { - constructor: DeclarationId(589), + constructor: DeclarationId(584), payload: vec![], }, ), @@ -5129,7 +5117,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { ( "default_width".to_string(), FieldValue::Variant { - constructor: DeclarationId(589), + constructor: DeclarationId(584), payload: vec![], }, ), @@ -5152,7 +5140,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { ( "default_width".to_string(), FieldValue::Variant { - constructor: DeclarationId(589), + constructor: DeclarationId(584), payload: vec![], }, ), @@ -5175,7 +5163,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { ( "default_width".to_string(), FieldValue::Variant { - constructor: DeclarationId(589), + constructor: DeclarationId(584), payload: vec![], }, ), @@ -5198,7 +5186,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { ( "default_width".to_string(), FieldValue::Variant { - constructor: DeclarationId(589), + constructor: DeclarationId(584), payload: vec![], }, ), @@ -5221,7 +5209,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { ( "default_width".to_string(), FieldValue::Variant { - constructor: DeclarationId(589), + constructor: DeclarationId(584), payload: vec![], }, ), @@ -5404,7 +5392,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 3822, 3874), + span: SourceSpan::new("dsl/std/methods.dag", 3810, 3862), }, Declaration { id: DeclarationId(204), @@ -5426,7 +5414,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 3875, 3927), + span: SourceSpan::new("dsl/std/methods.dag", 3863, 3915), }, Declaration { id: DeclarationId(205), @@ -5448,7 +5436,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 3928, 3980), + span: SourceSpan::new("dsl/std/methods.dag", 3916, 3968), }, Declaration { id: DeclarationId(206), @@ -5470,7 +5458,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 3981, 4039), + span: SourceSpan::new("dsl/std/methods.dag", 3969, 4027), }, Declaration { id: DeclarationId(207), @@ -5492,7 +5480,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 4040, 4098), + span: SourceSpan::new("dsl/std/methods.dag", 4028, 4086), }, Declaration { id: DeclarationId(208), @@ -5514,7 +5502,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 4099, 4155), + span: SourceSpan::new("dsl/std/methods.dag", 4087, 4143), }, Declaration { id: DeclarationId(209), @@ -5536,7 +5524,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 4156, 4212), + span: SourceSpan::new("dsl/std/methods.dag", 4144, 4200), }, Declaration { id: DeclarationId(210), @@ -5558,7 +5546,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 4213, 4273), + span: SourceSpan::new("dsl/std/methods.dag", 4201, 4261), }, Declaration { id: DeclarationId(211), @@ -5580,7 +5568,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 4274, 4340), + span: SourceSpan::new("dsl/std/methods.dag", 4262, 4328), }, Declaration { id: DeclarationId(212), @@ -5602,7 +5590,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 4341, 4399), + span: SourceSpan::new("dsl/std/methods.dag", 4329, 4387), }, Declaration { id: DeclarationId(213), @@ -5624,7 +5612,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 4400, 4462), + span: SourceSpan::new("dsl/std/methods.dag", 4388, 4450), }, Declaration { id: DeclarationId(214), @@ -5646,7 +5634,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 4463, 4519), + span: SourceSpan::new("dsl/std/methods.dag", 4451, 4507), }, Declaration { id: DeclarationId(215), @@ -5668,7 +5656,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 4520, 4574), + span: SourceSpan::new("dsl/std/methods.dag", 4508, 4562), }, Declaration { id: DeclarationId(216), @@ -5690,7 +5678,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 4575, 4631), + span: SourceSpan::new("dsl/std/methods.dag", 4563, 4619), }, Declaration { id: DeclarationId(217), @@ -5712,7 +5700,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 4632, 4696), + span: SourceSpan::new("dsl/std/methods.dag", 4620, 4684), }, Declaration { id: DeclarationId(218), @@ -5734,7 +5722,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 4697, 4761), + span: SourceSpan::new("dsl/std/methods.dag", 4685, 4749), }, Declaration { id: DeclarationId(219), @@ -5756,7 +5744,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 4762, 4820), + span: SourceSpan::new("dsl/std/methods.dag", 4750, 4808), }, Declaration { id: DeclarationId(220), @@ -5778,7 +5766,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 4821, 4877), + span: SourceSpan::new("dsl/std/methods.dag", 4809, 4865), }, Declaration { id: DeclarationId(221), @@ -5800,7 +5788,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 4878, 4940), + span: SourceSpan::new("dsl/std/methods.dag", 4866, 4928), }, Declaration { id: DeclarationId(222), @@ -5822,7 +5810,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 4941, 4995), + span: SourceSpan::new("dsl/std/methods.dag", 4929, 4983), }, Declaration { id: DeclarationId(223), @@ -5844,7 +5832,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 4996, 5048), + span: SourceSpan::new("dsl/std/methods.dag", 4984, 5036), }, Declaration { id: DeclarationId(224), @@ -5866,7 +5854,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 5049, 5101), + span: SourceSpan::new("dsl/std/methods.dag", 5037, 5089), }, Declaration { id: DeclarationId(225), @@ -5888,7 +5876,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 5102, 5166), + span: SourceSpan::new("dsl/std/methods.dag", 5090, 5154), }, Declaration { id: DeclarationId(226), @@ -5910,7 +5898,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 5167, 5221), + span: SourceSpan::new("dsl/std/methods.dag", 5155, 5209), }, Declaration { id: DeclarationId(227), @@ -5932,7 +5920,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 5222, 5276), + span: SourceSpan::new("dsl/std/methods.dag", 5210, 5264), }, Declaration { id: DeclarationId(228), @@ -5954,7 +5942,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 5277, 5331), + span: SourceSpan::new("dsl/std/methods.dag", 5265, 5319), }, Declaration { id: DeclarationId(229), @@ -5976,7 +5964,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 5332, 5390), + span: SourceSpan::new("dsl/std/methods.dag", 5320, 5378), }, Declaration { id: DeclarationId(230), @@ -5998,7 +5986,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 5391, 5455), + span: SourceSpan::new("dsl/std/methods.dag", 5379, 5443), }, Declaration { id: DeclarationId(231), @@ -6020,7 +6008,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 5456, 5514), + span: SourceSpan::new("dsl/std/methods.dag", 5444, 5502), }, Declaration { id: DeclarationId(232), @@ -6042,7 +6030,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 5515, 5567), + span: SourceSpan::new("dsl/std/methods.dag", 5503, 5555), }, Declaration { id: DeclarationId(233), @@ -6064,7 +6052,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 5568, 5646), + span: SourceSpan::new("dsl/std/methods.dag", 5556, 5634), }, Declaration { id: DeclarationId(234), @@ -6086,7 +6074,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 5647, 5707), + span: SourceSpan::new("dsl/std/methods.dag", 5635, 5695), }, Declaration { id: DeclarationId(235), @@ -6108,7 +6096,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 5708, 5768), + span: SourceSpan::new("dsl/std/methods.dag", 5696, 5756), }, Declaration { id: DeclarationId(236), @@ -6130,7 +6118,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 5769, 5835), + span: SourceSpan::new("dsl/std/methods.dag", 5757, 5823), }, Declaration { id: DeclarationId(237), @@ -6152,7 +6140,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 5836, 5898), + span: SourceSpan::new("dsl/std/methods.dag", 5824, 5886), }, Declaration { id: DeclarationId(238), @@ -6174,7 +6162,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 5899, 5963), + span: SourceSpan::new("dsl/std/methods.dag", 5887, 5951), }, Declaration { id: DeclarationId(239), @@ -6196,7 +6184,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 5964, 6030), + span: SourceSpan::new("dsl/std/methods.dag", 5952, 6018), }, Declaration { id: DeclarationId(240), @@ -6218,7 +6206,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 6031, 6085), + span: SourceSpan::new("dsl/std/methods.dag", 6019, 6073), }, Declaration { id: DeclarationId(241), @@ -6240,7 +6228,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 6086, 6144), + span: SourceSpan::new("dsl/std/methods.dag", 6074, 6132), }, Declaration { id: DeclarationId(242), @@ -6262,7 +6250,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 6145, 6197), + span: SourceSpan::new("dsl/std/methods.dag", 6133, 6185), }, Declaration { id: DeclarationId(243), @@ -6284,7 +6272,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 6198, 6256), + span: SourceSpan::new("dsl/std/methods.dag", 6186, 6244), }, Declaration { id: DeclarationId(244), @@ -6306,11 +6294,11 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 6257, 6309), + span: SourceSpan::new("dsl/std/methods.dag", 6245, 6297), }, Declaration { id: DeclarationId(245), - name: Some("quotient_method".to_string()), + name: Some("reciprocal_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![], @@ -6323,16 +6311,16 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: Some(ValueBody::Structural { fields: vec![( "name".to_string(), - FieldValue::Literal(LiteralBits::String("quotient".to_string())), + FieldValue::Literal(LiteralBits::String("reciprocal".to_string())), )], }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 6310, 6372), + span: SourceSpan::new("dsl/std/methods.dag", 6298, 6364), }, Declaration { id: DeclarationId(246), - name: Some("reciprocal_method".to_string()), + name: Some("replace_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![], @@ -6345,16 +6333,16 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: Some(ValueBody::Structural { fields: vec![( "name".to_string(), - FieldValue::Literal(LiteralBits::String("reciprocal".to_string())), + FieldValue::Literal(LiteralBits::String("replace".to_string())), )], }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 6373, 6439), + span: SourceSpan::new("dsl/std/methods.dag", 6365, 6425), }, Declaration { id: DeclarationId(247), - name: Some("remainder_method".to_string()), + name: Some("reverse_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![], @@ -6367,16 +6355,16 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: Some(ValueBody::Structural { fields: vec![( "name".to_string(), - FieldValue::Literal(LiteralBits::String("remainder".to_string())), + FieldValue::Literal(LiteralBits::String("reverse".to_string())), )], }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 6440, 6504), + span: SourceSpan::new("dsl/std/methods.dag", 6426, 6486), }, Declaration { id: DeclarationId(248), - name: Some("replace_method".to_string()), + name: Some("skip_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![], @@ -6389,16 +6377,16 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: Some(ValueBody::Structural { fields: vec![( "name".to_string(), - FieldValue::Literal(LiteralBits::String("replace".to_string())), + FieldValue::Literal(LiteralBits::String("skip".to_string())), )], }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 6505, 6565), + span: SourceSpan::new("dsl/std/methods.dag", 6487, 6541), }, Declaration { id: DeclarationId(249), - name: Some("reverse_method".to_string()), + name: Some("sort_by_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![], @@ -6411,16 +6399,16 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: Some(ValueBody::Structural { fields: vec![( "name".to_string(), - FieldValue::Literal(LiteralBits::String("reverse".to_string())), + FieldValue::Literal(LiteralBits::String("sort_by".to_string())), )], }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 6566, 6626), + span: SourceSpan::new("dsl/std/methods.dag", 6542, 6602), }, Declaration { id: DeclarationId(250), - name: Some("skip_method".to_string()), + name: Some("split_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![], @@ -6433,16 +6421,16 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: Some(ValueBody::Structural { fields: vec![( "name".to_string(), - FieldValue::Literal(LiteralBits::String("skip".to_string())), + FieldValue::Literal(LiteralBits::String("split".to_string())), )], }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 6627, 6681), + span: SourceSpan::new("dsl/std/methods.dag", 6603, 6659), }, Declaration { id: DeclarationId(251), - name: Some("sort_by_method".to_string()), + name: Some("starts_with_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![], @@ -6455,16 +6443,16 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: Some(ValueBody::Structural { fields: vec![( "name".to_string(), - FieldValue::Literal(LiteralBits::String("sort_by".to_string())), + FieldValue::Literal(LiteralBits::String("starts_with".to_string())), )], }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 6682, 6742), + span: SourceSpan::new("dsl/std/methods.dag", 6660, 6728), }, Declaration { id: DeclarationId(252), - name: Some("split_method".to_string()), + name: Some("substring_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![], @@ -6477,16 +6465,16 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: Some(ValueBody::Structural { fields: vec![( "name".to_string(), - FieldValue::Literal(LiteralBits::String("split".to_string())), + FieldValue::Literal(LiteralBits::String("substring".to_string())), )], }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 6743, 6799), + span: SourceSpan::new("dsl/std/methods.dag", 6729, 6793), }, Declaration { id: DeclarationId(253), - name: Some("starts_with_method".to_string()), + name: Some("take_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![], @@ -6499,16 +6487,16 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: Some(ValueBody::Structural { fields: vec![( "name".to_string(), - FieldValue::Literal(LiteralBits::String("starts_with".to_string())), + FieldValue::Literal(LiteralBits::String("take".to_string())), )], }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 6800, 6868), + span: SourceSpan::new("dsl/std/methods.dag", 6794, 6848), }, Declaration { id: DeclarationId(254), - name: Some("substring_method".to_string()), + name: Some("to_int_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![], @@ -6521,16 +6509,16 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: Some(ValueBody::Structural { fields: vec![( "name".to_string(), - FieldValue::Literal(LiteralBits::String("substring".to_string())), + FieldValue::Literal(LiteralBits::String("to_int".to_string())), )], }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 6869, 6933), + span: SourceSpan::new("dsl/std/methods.dag", 6849, 6907), }, Declaration { id: DeclarationId(255), - name: Some("take_method".to_string()), + name: Some("to_lower_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![], @@ -6543,16 +6531,16 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: Some(ValueBody::Structural { fields: vec![( "name".to_string(), - FieldValue::Literal(LiteralBits::String("take".to_string())), + FieldValue::Literal(LiteralBits::String("to_lower".to_string())), )], }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 6934, 6988), + span: SourceSpan::new("dsl/std/methods.dag", 6908, 6970), }, Declaration { id: DeclarationId(256), - name: Some("to_int_method".to_string()), + name: Some("to_string_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![], @@ -6565,16 +6553,16 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: Some(ValueBody::Structural { fields: vec![( "name".to_string(), - FieldValue::Literal(LiteralBits::String("to_int".to_string())), + FieldValue::Literal(LiteralBits::String("to_string".to_string())), )], }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 6989, 7047), + span: SourceSpan::new("dsl/std/methods.dag", 6971, 7035), }, Declaration { id: DeclarationId(257), - name: Some("to_lower_method".to_string()), + name: Some("to_upper_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![], @@ -6587,16 +6575,16 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: Some(ValueBody::Structural { fields: vec![( "name".to_string(), - FieldValue::Literal(LiteralBits::String("to_lower".to_string())), + FieldValue::Literal(LiteralBits::String("to_upper".to_string())), )], }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 7048, 7110), + span: SourceSpan::new("dsl/std/methods.dag", 7036, 7098), }, Declaration { id: DeclarationId(258), - name: Some("to_string_method".to_string()), + name: Some("top_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![], @@ -6609,16 +6597,16 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: Some(ValueBody::Structural { fields: vec![( "name".to_string(), - FieldValue::Literal(LiteralBits::String("to_string".to_string())), + FieldValue::Literal(LiteralBits::String("top".to_string())), )], }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 7111, 7175), + span: SourceSpan::new("dsl/std/methods.dag", 7099, 7151), }, Declaration { id: DeclarationId(259), - name: Some("to_upper_method".to_string()), + name: Some("trim_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![], @@ -6631,60 +6619,16 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: Some(ValueBody::Structural { fields: vec![( "name".to_string(), - FieldValue::Literal(LiteralBits::String("to_upper".to_string())), + FieldValue::Literal(LiteralBits::String("trim".to_string())), )], }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 7176, 7238), + span: SourceSpan::new("dsl/std/methods.dag", 7152, 7206), }, Declaration { id: DeclarationId(260), - name: Some("top_method".to_string()), - connective: TypeConnective::Instantiation { - template: DeclarationId(202), - arguments: vec![], - }, - type_params: vec![], - phantom_params: Vec::new(), - meta_tag: Some(DeclarationId(202)), - specialization_parent: None, - inhabits: None, - value_body: Some(ValueBody::Structural { - fields: vec![( - "name".to_string(), - FieldValue::Literal(LiteralBits::String("top".to_string())), - )], - }), - refinement: None, - nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 7239, 7291), - }, - Declaration { - id: DeclarationId(261), - name: Some("trim_method".to_string()), - connective: TypeConnective::Instantiation { - template: DeclarationId(202), - arguments: vec![], - }, - type_params: vec![], - phantom_params: Vec::new(), - meta_tag: Some(DeclarationId(202)), - specialization_parent: None, - inhabits: None, - value_body: Some(ValueBody::Structural { - fields: vec![( - "name".to_string(), - FieldValue::Literal(LiteralBits::String("trim".to_string())), - )], - }), - refinement: None, - nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 7292, 7346), - }, - Declaration { - id: DeclarationId(262), - name: Some("union_method".to_string()), + name: Some("union_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), arguments: vec![], @@ -6702,10 +6646,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 7347, 7403), + span: SourceSpan::new("dsl/std/methods.dag", 7207, 7263), }, Declaration { - id: DeclarationId(263), + id: DeclarationId(261), name: Some("values_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), @@ -6724,10 +6668,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 7404, 7462), + span: SourceSpan::new("dsl/std/methods.dag", 7264, 7322), }, Declaration { - id: DeclarationId(264), + id: DeclarationId(262), name: Some("with_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), @@ -6746,10 +6690,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 7463, 7517), + span: SourceSpan::new("dsl/std/methods.dag", 7323, 7377), }, Declaration { - id: DeclarationId(265), + id: DeclarationId(263), name: Some("zero_method".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(202), @@ -6768,10 +6712,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }), refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/methods.dag", 7518, 7572), + span: SourceSpan::new("dsl/std/methods.dag", 7378, 7432), }, Declaration { - id: DeclarationId(266), + id: DeclarationId(264), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -6785,7 +6729,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/logic.dag", 304, 308), }, Declaration { - id: DeclarationId(267), + id: DeclarationId(265), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -6799,7 +6743,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/logic.dag", 311, 316), }, Declaration { - id: DeclarationId(268), + id: DeclarationId(266), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -6819,7 +6763,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/bit.dag", 1023, 1032), }, Declaration { - id: DeclarationId(269), + id: DeclarationId(267), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -6839,7 +6783,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/bit.dag", 1136, 1145), }, Declaration { - id: DeclarationId(270), + id: DeclarationId(268), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -6859,7 +6803,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/bit.dag", 1272, 1282), }, Declaration { - id: DeclarationId(271), + id: DeclarationId(269), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -6879,7 +6823,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/bit.dag", 1306, 1316), }, Declaration { - id: DeclarationId(272), + id: DeclarationId(270), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -6899,7 +6843,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/bit.dag", 1340, 1350), }, Declaration { - id: DeclarationId(273), + id: DeclarationId(271), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -6919,7 +6863,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/bit.dag", 1375, 1385), }, Declaration { - id: DeclarationId(274), + id: DeclarationId(272), name: None, connective: TypeConnective::Conj { children: vec![Field { @@ -6938,7 +6882,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/error_primitives.dag", 620, 636), }, Declaration { - id: DeclarationId(275), + id: DeclarationId(273), name: None, connective: TypeConnective::Conj { children: vec![Field { @@ -6957,7 +6901,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/error_primitives.dag", 639, 657), }, Declaration { - id: DeclarationId(276), + id: DeclarationId(274), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -6971,7 +6915,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/error_primitives.dag", 936, 948), }, Declaration { - id: DeclarationId(277), + id: DeclarationId(275), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -6985,7 +6929,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/error_primitives.dag", 951, 959), }, Declaration { - id: DeclarationId(278), + id: DeclarationId(276), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -7002,10 +6946,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 18727, 18753), + span: SourceSpan::new("dsl/std/algebra.dag", 18855, 18881), }, Declaration { - id: DeclarationId(279), + id: DeclarationId(277), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -7022,10 +6966,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 20267, 20293), + span: SourceSpan::new("dsl/std/algebra.dag", 20062, 20088), }, Declaration { - id: DeclarationId(280), + id: DeclarationId(278), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -7042,10 +6986,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 21424, 21450), + span: SourceSpan::new("dsl/std/algebra.dag", 21219, 21245), }, Declaration { - id: DeclarationId(281), + id: DeclarationId(279), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -7062,10 +7006,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 22550, 22576), + span: SourceSpan::new("dsl/std/algebra.dag", 22345, 22371), }, Declaration { - id: DeclarationId(282), + id: DeclarationId(280), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -7082,10 +7026,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 25961, 25987), + span: SourceSpan::new("dsl/std/algebra.dag", 25756, 25782), }, Declaration { - id: DeclarationId(283), + id: DeclarationId(281), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -7102,10 +7046,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 29098, 29124), + span: SourceSpan::new("dsl/std/algebra.dag", 28893, 28919), }, Declaration { - id: DeclarationId(284), + id: DeclarationId(282), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -7122,10 +7066,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 34230, 34256), + span: SourceSpan::new("dsl/std/algebra.dag", 34025, 34051), }, Declaration { - id: DeclarationId(285), + id: DeclarationId(283), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -7142,10 +7086,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 37144, 37170), + span: SourceSpan::new("dsl/std/algebra.dag", 36939, 36965), }, Declaration { - id: DeclarationId(286), + id: DeclarationId(284), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -7162,10 +7106,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 37963, 37975), + span: SourceSpan::new("dsl/std/algebra.dag", 37758, 37770), }, Declaration { - id: DeclarationId(287), + id: DeclarationId(285), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(16), DeclarationId(16)], @@ -7180,10 +7124,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 4585, 4598), + span: SourceSpan::new("dsl/std/algebra.dag", 4645, 4658), }, Declaration { - id: DeclarationId(288), + id: DeclarationId(286), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(18), DeclarationId(18)], @@ -7198,10 +7142,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 4704, 4717), + span: SourceSpan::new("dsl/std/algebra.dag", 4764, 4777), }, Declaration { - id: DeclarationId(289), + id: DeclarationId(287), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(20), DeclarationId(20)], @@ -7216,10 +7160,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 4921, 4934), + span: SourceSpan::new("dsl/std/algebra.dag", 4981, 4994), }, Declaration { - id: DeclarationId(290), + id: DeclarationId(288), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(22), DeclarationId(22)], @@ -7234,10 +7178,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 5043, 5056), + span: SourceSpan::new("dsl/std/algebra.dag", 5103, 5116), }, Declaration { - id: DeclarationId(291), + id: DeclarationId(289), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(24), DeclarationId(24)], @@ -7252,10 +7196,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 5194, 5207), + span: SourceSpan::new("dsl/std/algebra.dag", 5254, 5267), }, Declaration { - id: DeclarationId(292), + id: DeclarationId(290), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(24)], @@ -7270,10 +7214,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 5233, 5243), + span: SourceSpan::new("dsl/std/algebra.dag", 5293, 5303), }, Declaration { - id: DeclarationId(293), + id: DeclarationId(291), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(26), DeclarationId(26)], @@ -7288,10 +7232,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 5312, 5325), + span: SourceSpan::new("dsl/std/algebra.dag", 5372, 5385), }, Declaration { - id: DeclarationId(294), + id: DeclarationId(292), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(26)], @@ -7306,10 +7250,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 5351, 5361), + span: SourceSpan::new("dsl/std/algebra.dag", 5411, 5421), }, Declaration { - id: DeclarationId(295), + id: DeclarationId(293), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(28), DeclarationId(28)], @@ -7324,10 +7268,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 5851, 5864), + span: SourceSpan::new("dsl/std/algebra.dag", 5911, 5924), }, Declaration { - id: DeclarationId(296), + id: DeclarationId(294), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(28), DeclarationId(28)], @@ -7342,10 +7286,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 5882, 5895), + span: SourceSpan::new("dsl/std/algebra.dag", 5942, 5955), }, Declaration { - id: DeclarationId(297), + id: DeclarationId(295), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(30), DeclarationId(30)], @@ -7360,10 +7304,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 6055, 6068), + span: SourceSpan::new("dsl/std/algebra.dag", 6115, 6128), }, Declaration { - id: DeclarationId(298), + id: DeclarationId(296), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(30)], @@ -7378,10 +7322,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 6089, 6099), + span: SourceSpan::new("dsl/std/algebra.dag", 6149, 6159), }, Declaration { - id: DeclarationId(299), + id: DeclarationId(297), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(30), DeclarationId(30)], @@ -7396,10 +7340,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 6107, 6120), + span: SourceSpan::new("dsl/std/algebra.dag", 6167, 6180), }, Declaration { - id: DeclarationId(300), + id: DeclarationId(298), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], @@ -7414,10 +7358,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 6883, 6896), + span: SourceSpan::new("dsl/std/algebra.dag", 6981, 6994), }, Declaration { - id: DeclarationId(301), + id: DeclarationId(299), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], @@ -7432,10 +7376,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 6904, 6917), + span: SourceSpan::new("dsl/std/algebra.dag", 7002, 7015), }, Declaration { - id: DeclarationId(302), + id: DeclarationId(300), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32)], @@ -7450,10 +7394,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 6938, 6948), + span: SourceSpan::new("dsl/std/algebra.dag", 7036, 7046), }, Declaration { - id: DeclarationId(303), + id: DeclarationId(301), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], @@ -7468,10 +7412,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 6956, 6969), + span: SourceSpan::new("dsl/std/algebra.dag", 7054, 7067), }, Declaration { - id: DeclarationId(304), + id: DeclarationId(302), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(11), @@ -7494,14 +7438,14 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 6989, 7008), + span: SourceSpan::new("dsl/std/algebra.dag", 7087, 7106), }, Declaration { - id: DeclarationId(305), + id: DeclarationId(303), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], - output: DeclarationId(304), + output: DeclarationId(302), body: ArrowBody::NoBody, }, type_params: vec![], @@ -7512,10 +7456,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 6977, 7008), + span: SourceSpan::new("dsl/std/algebra.dag", 7075, 7106), }, Declaration { - id: DeclarationId(306), + id: DeclarationId(304), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], @@ -7530,46 +7474,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 7029, 7049), - }, - Declaration { - id: DeclarationId(307), - name: None, - connective: TypeConnective::Arrow { - inputs: vec![DeclarationId(32), DeclarationId(32)], - output: DeclarationId(32), - body: ArrowBody::NoBody, - }, - type_params: vec![], - phantom_params: Vec::new(), - meta_tag: None, - specialization_parent: None, - inhabits: None, - value_body: None, - refinement: None, - nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 7062, 7075), + span: SourceSpan::new("dsl/std/algebra.dag", 7127, 7147), }, Declaration { - id: DeclarationId(308), - name: None, - connective: TypeConnective::Arrow { - inputs: vec![DeclarationId(32), DeclarationId(32)], - output: DeclarationId(32), - body: ArrowBody::NoBody, - }, - type_params: vec![], - phantom_params: Vec::new(), - meta_tag: None, - specialization_parent: None, - inhabits: None, - value_body: None, - refinement: None, - nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 7089, 7102), - }, - Declaration { - id: DeclarationId(309), + id: DeclarationId(305), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], @@ -7584,10 +7492,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 7109, 7125), + span: SourceSpan::new("dsl/std/algebra.dag", 7154, 7170), }, Declaration { - id: DeclarationId(310), + id: DeclarationId(306), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], @@ -7602,10 +7510,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 7132, 7148), + span: SourceSpan::new("dsl/std/algebra.dag", 7177, 7193), }, Declaration { - id: DeclarationId(311), + id: DeclarationId(307), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], @@ -7620,10 +7528,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 7155, 7171), + span: SourceSpan::new("dsl/std/algebra.dag", 7200, 7216), }, Declaration { - id: DeclarationId(312), + id: DeclarationId(308), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], @@ -7638,10 +7546,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 7178, 7194), + span: SourceSpan::new("dsl/std/algebra.dag", 7223, 7239), }, Declaration { - id: DeclarationId(313), + id: DeclarationId(309), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], @@ -7656,10 +7564,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 7201, 7217), + span: SourceSpan::new("dsl/std/algebra.dag", 7246, 7262), }, Declaration { - id: DeclarationId(314), + id: DeclarationId(310), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(32), DeclarationId(32)], @@ -7674,10 +7582,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 7224, 7240), + span: SourceSpan::new("dsl/std/algebra.dag", 7269, 7285), }, Declaration { - id: DeclarationId(315), + id: DeclarationId(311), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(34), DeclarationId(34)], @@ -7692,10 +7600,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 7403, 7416), + span: SourceSpan::new("dsl/std/algebra.dag", 7448, 7461), }, Declaration { - id: DeclarationId(316), + id: DeclarationId(312), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(34)], @@ -7710,10 +7618,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 7437, 7447), + span: SourceSpan::new("dsl/std/algebra.dag", 7482, 7492), }, Declaration { - id: DeclarationId(317), + id: DeclarationId(313), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(34), DeclarationId(34)], @@ -7728,10 +7636,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 7455, 7468), + span: SourceSpan::new("dsl/std/algebra.dag", 7500, 7513), }, Declaration { - id: DeclarationId(318), + id: DeclarationId(314), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(34)], @@ -7746,10 +7654,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 7492, 7502), + span: SourceSpan::new("dsl/std/algebra.dag", 7537, 7547), }, Declaration { - id: DeclarationId(319), + id: DeclarationId(315), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(34), DeclarationId(34)], @@ -7764,10 +7672,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 7514, 7534), + span: SourceSpan::new("dsl/std/algebra.dag", 7559, 7579), }, Declaration { - id: DeclarationId(320), + id: DeclarationId(316), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(36), DeclarationId(36)], @@ -7782,10 +7690,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 7882, 7895), + span: SourceSpan::new("dsl/std/algebra.dag", 7927, 7940), }, Declaration { - id: DeclarationId(321), + id: DeclarationId(317), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(36), DeclarationId(36)], @@ -7800,10 +7708,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 7904, 7917), + span: SourceSpan::new("dsl/std/algebra.dag", 7949, 7962), }, Declaration { - id: DeclarationId(322), + id: DeclarationId(318), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(38), DeclarationId(38)], @@ -7818,10 +7726,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 8060, 8073), + span: SourceSpan::new("dsl/std/algebra.dag", 8105, 8118), }, Declaration { - id: DeclarationId(323), + id: DeclarationId(319), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(38), DeclarationId(38)], @@ -7836,10 +7744,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 8082, 8095), + span: SourceSpan::new("dsl/std/algebra.dag", 8127, 8140), }, Declaration { - id: DeclarationId(324), + id: DeclarationId(320), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(40), DeclarationId(40)], @@ -7854,10 +7762,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 8349, 8362), + span: SourceSpan::new("dsl/std/algebra.dag", 8394, 8407), }, Declaration { - id: DeclarationId(325), + id: DeclarationId(321), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(40), DeclarationId(40)], @@ -7872,10 +7780,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 8371, 8384), + span: SourceSpan::new("dsl/std/algebra.dag", 8416, 8429), }, Declaration { - id: DeclarationId(326), + id: DeclarationId(322), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(40)], @@ -7890,10 +7798,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 8399, 8409), + span: SourceSpan::new("dsl/std/algebra.dag", 8444, 8454), }, Declaration { - id: DeclarationId(327), + id: DeclarationId(323), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), @@ -7910,10 +7818,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12261, 12274), + span: SourceSpan::new("dsl/std/algebra.dag", 12406, 12419), }, Declaration { - id: DeclarationId(328), + id: DeclarationId(324), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), @@ -7930,10 +7838,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12276, 12289), + span: SourceSpan::new("dsl/std/algebra.dag", 12421, 12434), }, Declaration { - id: DeclarationId(329), + id: DeclarationId(325), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), @@ -7950,14 +7858,14 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12294, 12307), + span: SourceSpan::new("dsl/std/algebra.dag", 12439, 12452), }, Declaration { - id: DeclarationId(330), + id: DeclarationId(326), name: None, connective: TypeConnective::Arrow { - inputs: vec![DeclarationId(327), DeclarationId(328)], - output: DeclarationId(329), + inputs: vec![DeclarationId(323), DeclarationId(324)], + output: DeclarationId(325), body: ArrowBody::NoBody, }, type_params: vec![], @@ -7968,10 +7876,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12258, 12307), + span: SourceSpan::new("dsl/std/algebra.dag", 12403, 12452), }, Declaration { - id: DeclarationId(331), + id: DeclarationId(327), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), @@ -7988,10 +7896,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12317, 12330), + span: SourceSpan::new("dsl/std/algebra.dag", 12462, 12475), }, Declaration { - id: DeclarationId(332), + id: DeclarationId(328), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), @@ -8008,14 +7916,14 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12350, 12363), + span: SourceSpan::new("dsl/std/algebra.dag", 12495, 12508), }, Declaration { - id: DeclarationId(333), + id: DeclarationId(329), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42)], - output: DeclarationId(332), + output: DeclarationId(328), body: ArrowBody::NoBody, }, type_params: vec![], @@ -8026,28 +7934,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12341, 12363), + span: SourceSpan::new("dsl/std/algebra.dag", 12486, 12508), }, Declaration { - id: DeclarationId(334), - name: None, - connective: TypeConnective::Arrow { - inputs: vec![DeclarationId(71)], - output: DeclarationId(42), - body: ArrowBody::NoBody, - }, - type_params: vec![], - phantom_params: Vec::new(), - meta_tag: None, - specialization_parent: None, - inhabits: None, - value_body: None, - refinement: None, - nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12444, 12456), - }, - Declaration { - id: DeclarationId(335), + id: DeclarationId(330), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), @@ -8064,14 +7954,14 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12482, 12495), + span: SourceSpan::new("dsl/std/algebra.dag", 12610, 12623), }, Declaration { - id: DeclarationId(336), + id: DeclarationId(331), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71), DeclarationId(71)], - output: DeclarationId(335), + output: DeclarationId(330), body: ArrowBody::NoBody, }, type_params: vec![], @@ -8082,10 +7972,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12466, 12495), + span: SourceSpan::new("dsl/std/algebra.dag", 12594, 12623), }, Declaration { - id: DeclarationId(337), + id: DeclarationId(332), name: None, connective: TypeConnective::Arrow { inputs: vec![], @@ -8100,10 +7990,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12506, 12517), + span: SourceSpan::new("dsl/std/algebra.dag", 12634, 12645), }, Declaration { - id: DeclarationId(338), + id: DeclarationId(333), name: None, connective: TypeConnective::Arrow { inputs: vec![], @@ -8118,10 +8008,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12527, 12538), + span: SourceSpan::new("dsl/std/algebra.dag", 12655, 12666), }, Declaration { - id: DeclarationId(339), + id: DeclarationId(334), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked( DeclarationId(42), @@ -8135,14 +8025,14 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12556, 12558), + span: SourceSpan::new("dsl/std/algebra.dag", 12684, 12686), }, Declaration { - id: DeclarationId(340), + id: DeclarationId(335), name: None, connective: TypeConnective::Arrow { inputs: vec![], - output: DeclarationId(339), + output: DeclarationId(334), body: ArrowBody::NoBody, }, type_params: vec![], @@ -8153,10 +8043,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12548, 12558), + span: SourceSpan::new("dsl/std/algebra.dag", 12676, 12686), }, Declaration { - id: DeclarationId(341), + id: DeclarationId(336), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked( DeclarationId(42), @@ -8170,14 +8060,14 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12575, 12577), + span: SourceSpan::new("dsl/std/algebra.dag", 12703, 12705), }, Declaration { - id: DeclarationId(342), + id: DeclarationId(337), name: None, connective: TypeConnective::Arrow { inputs: vec![], - output: DeclarationId(341), + output: DeclarationId(336), body: ArrowBody::NoBody, }, type_params: vec![], @@ -8188,10 +8078,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12567, 12577), + span: SourceSpan::new("dsl/std/algebra.dag", 12695, 12705), }, Declaration { - id: DeclarationId(343), + id: DeclarationId(338), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42)], @@ -8206,10 +8096,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12675, 12685), + span: SourceSpan::new("dsl/std/algebra.dag", 12803, 12813), }, Declaration { - id: DeclarationId(344), + id: DeclarationId(339), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), @@ -8226,14 +8116,14 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12690, 12703), + span: SourceSpan::new("dsl/std/algebra.dag", 12818, 12831), }, Declaration { - id: DeclarationId(345), + id: DeclarationId(340), name: None, connective: TypeConnective::Arrow { - inputs: vec![DeclarationId(343)], - output: DeclarationId(344), + inputs: vec![DeclarationId(338)], + output: DeclarationId(339), body: ArrowBody::NoBody, }, type_params: vec![], @@ -8244,10 +8134,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12672, 12703), + span: SourceSpan::new("dsl/std/algebra.dag", 12800, 12831), }, Declaration { - id: DeclarationId(346), + id: DeclarationId(341), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42)], @@ -8262,10 +8152,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12717, 12730), + span: SourceSpan::new("dsl/std/algebra.dag", 12845, 12858), }, Declaration { - id: DeclarationId(347), + id: DeclarationId(342), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), @@ -8282,14 +8172,14 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12735, 12748), + span: SourceSpan::new("dsl/std/algebra.dag", 12863, 12876), }, Declaration { - id: DeclarationId(348), + id: DeclarationId(343), name: None, connective: TypeConnective::Arrow { - inputs: vec![DeclarationId(346)], - output: DeclarationId(347), + inputs: vec![DeclarationId(341)], + output: DeclarationId(342), body: ArrowBody::NoBody, }, type_params: vec![], @@ -8300,10 +8190,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12714, 12748), + span: SourceSpan::new("dsl/std/algebra.dag", 12842, 12876), }, Declaration { - id: DeclarationId(349), + id: DeclarationId(344), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42), DeclarationId(42)], @@ -8318,13 +8208,13 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12763, 12776), + span: SourceSpan::new("dsl/std/algebra.dag", 12891, 12904), }, Declaration { - id: DeclarationId(350), + id: DeclarationId(345), name: None, connective: TypeConnective::Arrow { - inputs: vec![DeclarationId(42), DeclarationId(349)], + inputs: vec![DeclarationId(42), DeclarationId(344)], output: DeclarationId(42), body: ArrowBody::NoBody, }, @@ -8336,10 +8226,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12757, 12782), + span: SourceSpan::new("dsl/std/algebra.dag", 12885, 12910), }, Declaration { - id: DeclarationId(351), + id: DeclarationId(346), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), @@ -8356,14 +8246,14 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12807, 12820), + span: SourceSpan::new("dsl/std/algebra.dag", 12935, 12948), }, Declaration { - id: DeclarationId(352), + id: DeclarationId(347), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42)], - output: DeclarationId(351), + output: DeclarationId(346), body: ArrowBody::NoBody, }, type_params: vec![], @@ -8374,10 +8264,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12798, 12820), + span: SourceSpan::new("dsl/std/algebra.dag", 12926, 12948), }, Declaration { - id: DeclarationId(353), + id: DeclarationId(348), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), @@ -8394,14 +8284,14 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12825, 12838), + span: SourceSpan::new("dsl/std/algebra.dag", 12953, 12966), }, Declaration { - id: DeclarationId(354), + id: DeclarationId(349), name: None, connective: TypeConnective::Arrow { - inputs: vec![DeclarationId(352)], - output: DeclarationId(353), + inputs: vec![DeclarationId(347)], + output: DeclarationId(348), body: ArrowBody::NoBody, }, type_params: vec![], @@ -8412,10 +8302,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12795, 12838), + span: SourceSpan::new("dsl/std/algebra.dag", 12923, 12966), }, Declaration { - id: DeclarationId(355), + id: DeclarationId(350), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42)], @@ -8430,13 +8320,13 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12849, 12862), + span: SourceSpan::new("dsl/std/algebra.dag", 12977, 12990), }, Declaration { - id: DeclarationId(356), + id: DeclarationId(351), name: None, connective: TypeConnective::Arrow { - inputs: vec![DeclarationId(355)], + inputs: vec![DeclarationId(350)], output: DeclarationId(88), body: ArrowBody::NoBody, }, @@ -8448,10 +8338,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12846, 12871), + span: SourceSpan::new("dsl/std/algebra.dag", 12974, 12999), }, Declaration { - id: DeclarationId(357), + id: DeclarationId(352), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42)], @@ -8466,13 +8356,13 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12882, 12895), + span: SourceSpan::new("dsl/std/algebra.dag", 13010, 13023), }, Declaration { - id: DeclarationId(358), + id: DeclarationId(353), name: None, connective: TypeConnective::Arrow { - inputs: vec![DeclarationId(357)], + inputs: vec![DeclarationId(352)], output: DeclarationId(88), body: ArrowBody::NoBody, }, @@ -8484,10 +8374,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12879, 12904), + span: SourceSpan::new("dsl/std/algebra.dag", 13007, 13032), }, Declaration { - id: DeclarationId(359), + id: DeclarationId(354), name: None, connective: TypeConnective::Atom(AtomPayload::UnresolvedIdentifier( "Tuple".to_string(), @@ -8500,13 +8390,13 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12969, 12982), + span: SourceSpan::new("dsl/std/algebra.dag", 13097, 13110), }, Declaration { - id: DeclarationId(360), + id: DeclarationId(355), name: None, connective: TypeConnective::Instantiation { - template: DeclarationId(359), + template: DeclarationId(354), arguments: vec![], }, type_params: vec![], @@ -8517,16 +8407,16 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12969, 12982), + span: SourceSpan::new("dsl/std/algebra.dag", 13097, 13110), }, Declaration { - id: DeclarationId(361), + id: DeclarationId(356), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), arguments: vec![TemplateArgument { parameter: DeclarationId(42), - value: DeclarationId(360), + value: DeclarationId(355), }], }, type_params: vec![], @@ -8537,14 +8427,14 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12958, 12983), + span: SourceSpan::new("dsl/std/algebra.dag", 13086, 13111), }, Declaration { - id: DeclarationId(362), + id: DeclarationId(357), name: None, connective: TypeConnective::Arrow { inputs: vec![], - output: DeclarationId(361), + output: DeclarationId(356), body: ArrowBody::NoBody, }, type_params: vec![], @@ -8555,10 +8445,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12950, 12983), + span: SourceSpan::new("dsl/std/algebra.dag", 13078, 13111), }, Declaration { - id: DeclarationId(363), + id: DeclarationId(358), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), @@ -8575,14 +8465,14 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 13003, 13016), + span: SourceSpan::new("dsl/std/algebra.dag", 13131, 13144), }, Declaration { - id: DeclarationId(364), + id: DeclarationId(359), name: None, connective: TypeConnective::Arrow { inputs: vec![], - output: DeclarationId(363), + output: DeclarationId(358), body: ArrowBody::NoBody, }, type_params: vec![], @@ -8593,10 +8483,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 12995, 13016), + span: SourceSpan::new("dsl/std/algebra.dag", 13123, 13144), }, Declaration { - id: DeclarationId(365), + id: DeclarationId(360), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), @@ -8613,14 +8503,14 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 13036, 13049), + span: SourceSpan::new("dsl/std/algebra.dag", 13164, 13177), }, Declaration { - id: DeclarationId(366), + id: DeclarationId(361), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71)], - output: DeclarationId(365), + output: DeclarationId(360), body: ArrowBody::NoBody, }, type_params: vec![], @@ -8631,10 +8521,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 13025, 13049), + span: SourceSpan::new("dsl/std/algebra.dag", 13153, 13177), }, Declaration { - id: DeclarationId(367), + id: DeclarationId(362), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), @@ -8651,14 +8541,14 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 13069, 13082), + span: SourceSpan::new("dsl/std/algebra.dag", 13197, 13210), }, Declaration { - id: DeclarationId(368), + id: DeclarationId(363), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(71)], - output: DeclarationId(367), + output: DeclarationId(362), body: ArrowBody::NoBody, }, type_params: vec![], @@ -8669,10 +8559,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 13058, 13082), + span: SourceSpan::new("dsl/std/algebra.dag", 13186, 13210), }, Declaration { - id: DeclarationId(369), + id: DeclarationId(364), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42), DeclarationId(42)], @@ -8687,10 +8577,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 13097, 13112), + span: SourceSpan::new("dsl/std/algebra.dag", 13225, 13240), }, Declaration { - id: DeclarationId(370), + id: DeclarationId(365), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), @@ -8707,14 +8597,14 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 13117, 13130), + span: SourceSpan::new("dsl/std/algebra.dag", 13245, 13258), }, Declaration { - id: DeclarationId(371), + id: DeclarationId(366), name: None, connective: TypeConnective::Arrow { - inputs: vec![DeclarationId(369)], - output: DeclarationId(370), + inputs: vec![DeclarationId(364)], + output: DeclarationId(365), body: ArrowBody::NoBody, }, type_params: vec![], @@ -8725,10 +8615,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 13094, 13130), + span: SourceSpan::new("dsl/std/algebra.dag", 13222, 13258), }, Declaration { - id: DeclarationId(372), + id: DeclarationId(367), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(42)], @@ -8743,10 +8633,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 13143, 13156), + span: SourceSpan::new("dsl/std/algebra.dag", 13271, 13284), }, Declaration { - id: DeclarationId(373), + id: DeclarationId(368), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked( DeclarationId(45), @@ -8760,14 +8650,14 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 13721, 13723), + span: SourceSpan::new("dsl/std/algebra.dag", 13849, 13851), }, Declaration { - id: DeclarationId(374), + id: DeclarationId(369), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(44)], - output: DeclarationId(373), + output: DeclarationId(368), body: ArrowBody::NoBody, }, type_params: vec![], @@ -8778,10 +8668,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 13712, 13723), + span: SourceSpan::new("dsl/std/algebra.dag", 13840, 13851), }, Declaration { - id: DeclarationId(375), + id: DeclarationId(370), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(43), @@ -8804,10 +8694,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 13733, 13754), + span: SourceSpan::new("dsl/std/algebra.dag", 13861, 13882), }, Declaration { - id: DeclarationId(376), + id: DeclarationId(371), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked( DeclarationId(45), @@ -8821,14 +8711,14 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 13771, 13773), + span: SourceSpan::new("dsl/std/algebra.dag", 13899, 13901), }, Declaration { - id: DeclarationId(377), + id: DeclarationId(372), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(44)], - output: DeclarationId(376), + output: DeclarationId(371), body: ArrowBody::NoBody, }, type_params: vec![], @@ -8839,10 +8729,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 13762, 13773), + span: SourceSpan::new("dsl/std/algebra.dag", 13890, 13901), }, Declaration { - id: DeclarationId(378), + id: DeclarationId(373), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(43), @@ -8865,14 +8755,14 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 13796, 13817), + span: SourceSpan::new("dsl/std/algebra.dag", 13924, 13945), }, Declaration { - id: DeclarationId(379), + id: DeclarationId(374), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(44), DeclarationId(45)], - output: DeclarationId(378), + output: DeclarationId(373), body: ArrowBody::NoBody, }, type_params: vec![], @@ -8883,10 +8773,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 13784, 13817), + span: SourceSpan::new("dsl/std/algebra.dag", 13912, 13945), }, Declaration { - id: DeclarationId(380), + id: DeclarationId(375), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(43), @@ -8909,10 +8799,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 13830, 13851), + span: SourceSpan::new("dsl/std/algebra.dag", 13958, 13979), }, Declaration { - id: DeclarationId(381), + id: DeclarationId(376), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(43), @@ -8935,14 +8825,14 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 13856, 13877), + span: SourceSpan::new("dsl/std/algebra.dag", 13984, 14005), }, Declaration { - id: DeclarationId(382), + id: DeclarationId(377), name: None, connective: TypeConnective::Arrow { - inputs: vec![DeclarationId(380)], - output: DeclarationId(381), + inputs: vec![DeclarationId(375)], + output: DeclarationId(376), body: ArrowBody::NoBody, }, type_params: vec![], @@ -8953,10 +8843,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 13827, 13877), + span: SourceSpan::new("dsl/std/algebra.dag", 13955, 14005), }, Declaration { - id: DeclarationId(383), + id: DeclarationId(378), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), @@ -8973,14 +8863,14 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 13894, 13907), + span: SourceSpan::new("dsl/std/algebra.dag", 14022, 14035), }, Declaration { - id: DeclarationId(384), + id: DeclarationId(379), name: None, connective: TypeConnective::Arrow { inputs: vec![], - output: DeclarationId(383), + output: DeclarationId(378), body: ArrowBody::NoBody, }, type_params: vec![], @@ -8991,10 +8881,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 13886, 13907), + span: SourceSpan::new("dsl/std/algebra.dag", 14014, 14035), }, Declaration { - id: DeclarationId(385), + id: DeclarationId(380), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(41), @@ -9011,14 +8901,14 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 13926, 13939), + span: SourceSpan::new("dsl/std/algebra.dag", 14054, 14067), }, Declaration { - id: DeclarationId(386), + id: DeclarationId(381), name: None, connective: TypeConnective::Arrow { inputs: vec![], - output: DeclarationId(385), + output: DeclarationId(380), body: ArrowBody::NoBody, }, type_params: vec![], @@ -9029,10 +8919,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 13918, 13939), + span: SourceSpan::new("dsl/std/algebra.dag", 14046, 14067), }, Declaration { - id: DeclarationId(387), + id: DeclarationId(382), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(44)], @@ -9047,10 +8937,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 13947, 13960), + span: SourceSpan::new("dsl/std/algebra.dag", 14075, 14088), }, Declaration { - id: DeclarationId(388), + id: DeclarationId(383), name: None, connective: TypeConnective::Arrow { inputs: vec![DeclarationId(44)], @@ -9065,10 +8955,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 13977, 13990), + span: SourceSpan::new("dsl/std/algebra.dag", 14105, 14118), }, Declaration { - id: DeclarationId(389), + id: DeclarationId(384), name: None, connective: TypeConnective::Arrow { inputs: vec![], @@ -9083,10 +8973,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 13999, 14010), + span: SourceSpan::new("dsl/std/algebra.dag", 14127, 14138), }, Declaration { - id: DeclarationId(390), + id: DeclarationId(385), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -9097,10 +8987,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 14229, 14233), + span: SourceSpan::new("dsl/std/algebra.dag", 14357, 14361), }, Declaration { - id: DeclarationId(391), + id: DeclarationId(386), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -9111,10 +9001,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 14236, 14241), + span: SourceSpan::new("dsl/std/algebra.dag", 14364, 14369), }, Declaration { - id: DeclarationId(392), + id: DeclarationId(387), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -9125,10 +9015,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 14244, 14251), + span: SourceSpan::new("dsl/std/algebra.dag", 14372, 14379), }, Declaration { - id: DeclarationId(393), + id: DeclarationId(388), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -9139,10 +9029,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 16177, 16195), + span: SourceSpan::new("dsl/std/algebra.dag", 16305, 16323), }, Declaration { - id: DeclarationId(394), + id: DeclarationId(389), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -9153,10 +9043,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 16200, 16223), + span: SourceSpan::new("dsl/std/algebra.dag", 16328, 16351), }, Declaration { - id: DeclarationId(395), + id: DeclarationId(390), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -9167,10 +9057,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 16228, 16249), + span: SourceSpan::new("dsl/std/algebra.dag", 16356, 16377), }, Declaration { - id: DeclarationId(396), + id: DeclarationId(391), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -9181,10 +9071,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 16254, 16285), + span: SourceSpan::new("dsl/std/algebra.dag", 16382, 16413), }, Declaration { - id: DeclarationId(397), + id: DeclarationId(392), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -9195,10 +9085,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 16290, 16313), + span: SourceSpan::new("dsl/std/algebra.dag", 16418, 16441), }, Declaration { - id: DeclarationId(398), + id: DeclarationId(393), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -9209,10 +9099,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 16318, 16345), + span: SourceSpan::new("dsl/std/algebra.dag", 16446, 16473), }, Declaration { - id: DeclarationId(399), + id: DeclarationId(394), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -9223,10 +9113,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 16350, 16372), + span: SourceSpan::new("dsl/std/algebra.dag", 16478, 16500), }, Declaration { - id: DeclarationId(400), + id: DeclarationId(395), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -9237,10 +9127,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 16399, 16413), + span: SourceSpan::new("dsl/std/algebra.dag", 16527, 16541), }, Declaration { - id: DeclarationId(401), + id: DeclarationId(396), name: None, connective: TypeConnective::Conj { children: vec![Field { @@ -9256,10 +9146,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 16418, 16440), + span: SourceSpan::new("dsl/std/algebra.dag", 16546, 16568), }, Declaration { - id: DeclarationId(402), + id: DeclarationId(397), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -9270,10 +9160,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 16471, 16483), + span: SourceSpan::new("dsl/std/algebra.dag", 16599, 16611), }, Declaration { - id: DeclarationId(403), + id: DeclarationId(398), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -9284,10 +9174,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 16488, 16503), + span: SourceSpan::new("dsl/std/algebra.dag", 16616, 16631), }, Declaration { - id: DeclarationId(404), + id: DeclarationId(399), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -9298,10 +9188,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 16508, 16519), + span: SourceSpan::new("dsl/std/algebra.dag", 16636, 16647), }, Declaration { - id: DeclarationId(405), + id: DeclarationId(400), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -9312,10 +9202,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 16524, 16537), + span: SourceSpan::new("dsl/std/algebra.dag", 16652, 16665), }, Declaration { - id: DeclarationId(406), + id: DeclarationId(401), name: None, connective: TypeConnective::Conj { children: vec![Field { @@ -9331,10 +9221,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 16542, 16572), + span: SourceSpan::new("dsl/std/algebra.dag", 16670, 16700), }, Declaration { - id: DeclarationId(407), + id: DeclarationId(402), name: None, connective: TypeConnective::Conj { children: vec![ @@ -9356,10 +9246,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 16577, 16646), + span: SourceSpan::new("dsl/std/algebra.dag", 16705, 16774), }, Declaration { - id: DeclarationId(408), + id: DeclarationId(403), name: None, connective: TypeConnective::Conj { children: vec![Field { @@ -9375,10 +9265,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 16651, 16692), + span: SourceSpan::new("dsl/std/algebra.dag", 16779, 16820), }, Declaration { - id: DeclarationId(409), + id: DeclarationId(404), name: None, connective: TypeConnective::Conj { children: vec![ @@ -9400,10 +9290,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 16697, 16764), + span: SourceSpan::new("dsl/std/algebra.dag", 16825, 16892), }, Declaration { - id: DeclarationId(410), + id: DeclarationId(405), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -9420,16 +9310,16 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 16790, 16815), + span: SourceSpan::new("dsl/std/algebra.dag", 16918, 16943), }, Declaration { - id: DeclarationId(411), + id: DeclarationId(406), name: None, connective: TypeConnective::Conj { children: vec![ Field { label: "params".to_string(), - ty: DeclarationId(410), + ty: DeclarationId(405), }, Field { label: "return_type".to_string(), @@ -9445,10 +9335,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 16769, 16851), + span: SourceSpan::new("dsl/std/algebra.dag", 16897, 16979), }, Declaration { - id: DeclarationId(412), + id: DeclarationId(407), name: None, connective: TypeConnective::Conj { children: vec![Field { @@ -9464,10 +9354,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 16856, 16890), + span: SourceSpan::new("dsl/std/algebra.dag", 16984, 17018), }, Declaration { - id: DeclarationId(413), + id: DeclarationId(408), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -9478,10 +9368,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 17136, 17148), + span: SourceSpan::new("dsl/std/algebra.dag", 17264, 17276), }, Declaration { - id: DeclarationId(414), + id: DeclarationId(409), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -9492,10 +9382,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 17206, 17222), + span: SourceSpan::new("dsl/std/algebra.dag", 17334, 17350), }, Declaration { - id: DeclarationId(415), + id: DeclarationId(410), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -9506,10 +9396,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 17269, 17283), + span: SourceSpan::new("dsl/std/algebra.dag", 17397, 17411), }, Declaration { - id: DeclarationId(416), + id: DeclarationId(411), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -9520,10 +9410,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 17760, 17773), + span: SourceSpan::new("dsl/std/algebra.dag", 17888, 17901), }, Declaration { - id: DeclarationId(417), + id: DeclarationId(412), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -9534,10 +9424,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 17789, 17804), + span: SourceSpan::new("dsl/std/algebra.dag", 17917, 17932), }, Declaration { - id: DeclarationId(418), + id: DeclarationId(413), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -9548,10 +9438,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 17850, 17866), + span: SourceSpan::new("dsl/std/algebra.dag", 17978, 17994), }, Declaration { - id: DeclarationId(419), + id: DeclarationId(414), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -9562,10 +9452,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 17913, 17926), + span: SourceSpan::new("dsl/std/algebra.dag", 18041, 18054), }, Declaration { - id: DeclarationId(420), + id: DeclarationId(415), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -9582,10 +9472,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 18009, 18034), + span: SourceSpan::new("dsl/std/algebra.dag", 18137, 18162), }, Declaration { - id: DeclarationId(421), + id: DeclarationId(416), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked( DeclarationId(50), @@ -9599,10 +9489,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 18085, 18106), + span: SourceSpan::new("dsl/std/algebra.dag", 18213, 18234), }, Declaration { - id: DeclarationId(422), + id: DeclarationId(417), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked( DeclarationId(51), @@ -9616,10 +9506,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 18121, 18131), + span: SourceSpan::new("dsl/std/algebra.dag", 18249, 18259), }, Declaration { - id: DeclarationId(423), + id: DeclarationId(418), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked( DeclarationId(71), @@ -9633,10 +9523,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 18376, 18380), + span: SourceSpan::new("dsl/std/algebra.dag", 18504, 18508), }, Declaration { - id: DeclarationId(424), + id: DeclarationId(419), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(97), @@ -9659,10 +9549,10 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("dsl/std/algebra.dag", 18413, 18440), + span: SourceSpan::new("dsl/std/algebra.dag", 18541, 18568), }, Declaration { - id: DeclarationId(425), + id: DeclarationId(420), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked( DeclarationId(71), @@ -9679,7 +9569,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 3781, 3785), }, Declaration { - id: DeclarationId(426), + id: DeclarationId(421), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -9699,7 +9589,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 4054, 4066), }, Declaration { - id: DeclarationId(427), + id: DeclarationId(422), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked( DeclarationId(186), @@ -9716,7 +9606,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 4264, 4271), }, Declaration { - id: DeclarationId(428), + id: DeclarationId(423), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked( DeclarationId(186), @@ -9733,7 +9623,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 6172, 6179), }, Declaration { - id: DeclarationId(429), + id: DeclarationId(424), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -9753,7 +9643,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 6508, 6520), }, Declaration { - id: DeclarationId(430), + id: DeclarationId(425), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -9767,7 +9657,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 7558, 7562), }, Declaration { - id: DeclarationId(431), + id: DeclarationId(426), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -9781,7 +9671,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 7565, 7570), }, Declaration { - id: DeclarationId(432), + id: DeclarationId(427), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -9801,7 +9691,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 11304, 11321), }, Declaration { - id: DeclarationId(433), + id: DeclarationId(428), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -9821,7 +9711,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 11355, 11372), }, Declaration { - id: DeclarationId(434), + id: DeclarationId(429), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -9835,7 +9725,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 14380, 14385), }, Declaration { - id: DeclarationId(435), + id: DeclarationId(430), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -9849,7 +9739,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 14388, 14393), }, Declaration { - id: DeclarationId(436), + id: DeclarationId(431), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -9863,7 +9753,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 14396, 14403), }, Declaration { - id: DeclarationId(437), + id: DeclarationId(432), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -9877,7 +9767,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 14555, 14559), }, Declaration { - id: DeclarationId(438), + id: DeclarationId(433), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -9891,7 +9781,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 14562, 14571), }, Declaration { - id: DeclarationId(439), + id: DeclarationId(434), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -9905,7 +9795,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 14574, 14580), }, Declaration { - id: DeclarationId(440), + id: DeclarationId(435), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -9919,7 +9809,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 14583, 14586), }, Declaration { - id: DeclarationId(441), + id: DeclarationId(436), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -9933,7 +9823,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 14611, 14619), }, Declaration { - id: DeclarationId(442), + id: DeclarationId(437), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -9947,7 +9837,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 14622, 14631), }, Declaration { - id: DeclarationId(443), + id: DeclarationId(438), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -9961,7 +9851,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 14634, 14640), }, Declaration { - id: DeclarationId(444), + id: DeclarationId(439), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -9975,7 +9865,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 14660, 14662), }, Declaration { - id: DeclarationId(445), + id: DeclarationId(440), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -9989,7 +9879,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 14665, 14666), }, Declaration { - id: DeclarationId(446), + id: DeclarationId(441), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10003,7 +9893,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 14669, 14670), }, Declaration { - id: DeclarationId(447), + id: DeclarationId(442), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10017,7 +9907,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 14673, 14674), }, Declaration { - id: DeclarationId(448), + id: DeclarationId(443), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10031,7 +9921,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 14677, 14679), }, Declaration { - id: DeclarationId(449), + id: DeclarationId(444), name: None, connective: TypeConnective::Conj { children: vec![Field { @@ -10050,7 +9940,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 14951, 14986), }, Declaration { - id: DeclarationId(450), + id: DeclarationId(445), name: None, connective: TypeConnective::Conj { children: vec![Field { @@ -10069,7 +9959,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 14991, 15032), }, Declaration { - id: DeclarationId(451), + id: DeclarationId(446), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked( DeclarationId(138), @@ -10086,7 +9976,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15107, 15127), }, Declaration { - id: DeclarationId(452), + id: DeclarationId(447), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -10106,7 +9996,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15142, 15154), }, Declaration { - id: DeclarationId(453), + id: DeclarationId(448), name: None, connective: TypeConnective::Conj { children: vec![ @@ -10116,11 +10006,11 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { }, Field { label: "service_account".to_string(), - ty: DeclarationId(451), + ty: DeclarationId(446), }, Field { label: "scopes".to_string(), - ty: DeclarationId(452), + ty: DeclarationId(447), }, ], }, @@ -10135,7 +10025,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15037, 15160), }, Declaration { - id: DeclarationId(454), + id: DeclarationId(449), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -10155,12 +10045,12 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15191, 15203), }, Declaration { - id: DeclarationId(455), + id: DeclarationId(450), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "scopes".to_string(), - ty: DeclarationId(454), + ty: DeclarationId(449), }], }, type_params: vec![], @@ -10174,7 +10064,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15165, 15205), }, Declaration { - id: DeclarationId(456), + id: DeclarationId(451), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -10194,12 +10084,12 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15227, 15247), }, Declaration { - id: DeclarationId(457), + id: DeclarationId(452), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "steps".to_string(), - ty: DeclarationId(456), + ty: DeclarationId(451), }], }, type_params: vec![], @@ -10213,7 +10103,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15210, 15249), }, Declaration { - id: DeclarationId(458), + id: DeclarationId(453), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10227,7 +10117,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15336, 15342), }, Declaration { - id: DeclarationId(459), + id: DeclarationId(454), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10241,7 +10131,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15345, 15348), }, Declaration { - id: DeclarationId(460), + id: DeclarationId(455), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10255,7 +10145,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15351, 15358), }, Declaration { - id: DeclarationId(461), + id: DeclarationId(456), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10269,7 +10159,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15361, 15364), }, Declaration { - id: DeclarationId(462), + id: DeclarationId(457), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10283,7 +10173,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15367, 15372), }, Declaration { - id: DeclarationId(463), + id: DeclarationId(458), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10297,7 +10187,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15375, 15379), }, Declaration { - id: DeclarationId(464), + id: DeclarationId(459), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10311,7 +10201,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15382, 15388), }, Declaration { - id: DeclarationId(465), + id: DeclarationId(460), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10325,7 +10215,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15391, 15397), }, Declaration { - id: DeclarationId(466), + id: DeclarationId(461), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10339,7 +10229,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15400, 15408), }, Declaration { - id: DeclarationId(467), + id: DeclarationId(462), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10353,7 +10243,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15411, 15418), }, Declaration { - id: DeclarationId(468), + id: DeclarationId(463), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10367,7 +10257,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15421, 15427), }, Declaration { - id: DeclarationId(469), + id: DeclarationId(464), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10381,7 +10271,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15442, 15455), }, Declaration { - id: DeclarationId(470), + id: DeclarationId(465), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10395,7 +10285,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15458, 15460), }, Declaration { - id: DeclarationId(471), + id: DeclarationId(466), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10409,7 +10299,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15463, 15468), }, Declaration { - id: DeclarationId(472), + id: DeclarationId(467), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10423,7 +10313,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15471, 15474), }, Declaration { - id: DeclarationId(473), + id: DeclarationId(468), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10437,7 +10327,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15485, 15490), }, Declaration { - id: DeclarationId(474), + id: DeclarationId(469), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10451,7 +10341,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15493, 15498), }, Declaration { - id: DeclarationId(475), + id: DeclarationId(470), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10465,7 +10355,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15501, 15508), }, Declaration { - id: DeclarationId(476), + id: DeclarationId(471), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10479,7 +10369,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15511, 15518), }, Declaration { - id: DeclarationId(477), + id: DeclarationId(472), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10493,7 +10383,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15521, 15528), }, Declaration { - id: DeclarationId(478), + id: DeclarationId(473), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10507,7 +10397,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15531, 15534), }, Declaration { - id: DeclarationId(479), + id: DeclarationId(474), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10521,7 +10411,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15537, 15541), }, Declaration { - id: DeclarationId(480), + id: DeclarationId(475), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10535,7 +10425,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15556, 15563), }, Declaration { - id: DeclarationId(481), + id: DeclarationId(476), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10549,7 +10439,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15566, 15569), }, Declaration { - id: DeclarationId(482), + id: DeclarationId(477), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10563,7 +10453,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15572, 15579), }, Declaration { - id: DeclarationId(483), + id: DeclarationId(478), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10577,7 +10467,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15582, 15591), }, Declaration { - id: DeclarationId(484), + id: DeclarationId(479), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10591,7 +10481,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15594, 15598), }, Declaration { - id: DeclarationId(485), + id: DeclarationId(480), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10605,7 +10495,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15601, 15605), }, Declaration { - id: DeclarationId(486), + id: DeclarationId(481), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10619,7 +10509,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15608, 15618), }, Declaration { - id: DeclarationId(487), + id: DeclarationId(482), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10633,7 +10523,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15621, 15625), }, Declaration { - id: DeclarationId(488), + id: DeclarationId(483), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10647,7 +10537,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15628, 15634), }, Declaration { - id: DeclarationId(489), + id: DeclarationId(484), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10661,7 +10551,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15655, 15661), }, Declaration { - id: DeclarationId(490), + id: DeclarationId(485), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10675,7 +10565,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15664, 15667), }, Declaration { - id: DeclarationId(491), + id: DeclarationId(486), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10689,7 +10579,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15670, 15679), }, Declaration { - id: DeclarationId(492), + id: DeclarationId(487), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10703,7 +10593,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15682, 15684), }, Declaration { - id: DeclarationId(493), + id: DeclarationId(488), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10717,7 +10607,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15687, 15695), }, Declaration { - id: DeclarationId(494), + id: DeclarationId(489), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked( DeclarationId(147), @@ -10734,7 +10624,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 15763, 15770), }, Declaration { - id: DeclarationId(495), + id: DeclarationId(490), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10748,7 +10638,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 16167, 16178), }, Declaration { - id: DeclarationId(496), + id: DeclarationId(491), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10762,7 +10652,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 16183, 16192), }, Declaration { - id: DeclarationId(497), + id: DeclarationId(492), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10776,7 +10666,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 16197, 16204), }, Declaration { - id: DeclarationId(498), + id: DeclarationId(493), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10790,7 +10680,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 16209, 16216), }, Declaration { - id: DeclarationId(499), + id: DeclarationId(494), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10804,7 +10694,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 16221, 16226), }, Declaration { - id: DeclarationId(500), + id: DeclarationId(495), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10818,7 +10708,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 16379, 16389), }, Declaration { - id: DeclarationId(501), + id: DeclarationId(496), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10832,7 +10722,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 16394, 16403), }, Declaration { - id: DeclarationId(502), + id: DeclarationId(497), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10846,7 +10736,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 16408, 16414), }, Declaration { - id: DeclarationId(503), + id: DeclarationId(498), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10860,7 +10750,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 18464, 18467), }, Declaration { - id: DeclarationId(504), + id: DeclarationId(499), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10874,7 +10764,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 18470, 18474), }, Declaration { - id: DeclarationId(505), + id: DeclarationId(500), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10888,7 +10778,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 18477, 18480), }, Declaration { - id: DeclarationId(506), + id: DeclarationId(501), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10902,7 +10792,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 18483, 18488), }, Declaration { - id: DeclarationId(507), + id: DeclarationId(502), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10916,7 +10806,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 18491, 18497), }, Declaration { - id: DeclarationId(508), + id: DeclarationId(503), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10930,7 +10820,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 18500, 18504), }, Declaration { - id: DeclarationId(509), + id: DeclarationId(504), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10944,7 +10834,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 18507, 18514), }, Declaration { - id: DeclarationId(510), + id: DeclarationId(505), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -10958,7 +10848,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 19002, 19008), }, Declaration { - id: DeclarationId(511), + id: DeclarationId(506), name: None, connective: TypeConnective::Conj { children: vec![Field { @@ -10977,7 +10867,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 19013, 19036), }, Declaration { - id: DeclarationId(512), + id: DeclarationId(507), name: None, connective: TypeConnective::Conj { children: vec![Field { @@ -10996,7 +10886,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 19041, 19067), }, Declaration { - id: DeclarationId(513), + id: DeclarationId(508), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -11010,7 +10900,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 19072, 19078), }, Declaration { - id: DeclarationId(514), + id: DeclarationId(509), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked( DeclarationId(122), @@ -11027,7 +10917,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 19270, 19280), }, Declaration { - id: DeclarationId(515), + id: DeclarationId(510), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked( DeclarationId(186), @@ -11044,7 +10934,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 19405, 19412), }, Declaration { - id: DeclarationId(516), + id: DeclarationId(511), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -11064,7 +10954,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 19452, 19464), }, Declaration { - id: DeclarationId(517), + id: DeclarationId(512), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked( DeclarationId(71), @@ -11081,7 +10971,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 19479, 19483), }, Declaration { - id: DeclarationId(518), + id: DeclarationId(513), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -11101,7 +10991,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 20834, 20852), }, Declaration { - id: DeclarationId(519), + id: DeclarationId(514), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -11121,7 +11011,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 20945, 20966), }, Declaration { - id: DeclarationId(520), + id: DeclarationId(515), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked( DeclarationId(186), @@ -11138,7 +11028,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 21250, 21257), }, Declaration { - id: DeclarationId(521), + id: DeclarationId(516), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -11158,7 +11048,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 21290, 21305), }, Declaration { - id: DeclarationId(522), + id: DeclarationId(517), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -11178,7 +11068,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 21594, 21612), }, Declaration { - id: DeclarationId(523), + id: DeclarationId(518), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -11198,7 +11088,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 21622, 21640), }, Declaration { - id: DeclarationId(524), + id: DeclarationId(519), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -11218,7 +11108,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 21662, 21674), }, Declaration { - id: DeclarationId(525), + id: DeclarationId(520), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked( DeclarationId(186), @@ -11235,7 +11125,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 21762, 21769), }, Declaration { - id: DeclarationId(526), + id: DeclarationId(521), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked( DeclarationId(186), @@ -11252,7 +11142,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 21856, 21863), }, Declaration { - id: DeclarationId(527), + id: DeclarationId(522), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -11272,7 +11162,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 21891, 21903), }, Declaration { - id: DeclarationId(528), + id: DeclarationId(523), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -11292,7 +11182,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 21915, 21927), }, Declaration { - id: DeclarationId(529), + id: DeclarationId(524), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -11312,7 +11202,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 21939, 21951), }, Declaration { - id: DeclarationId(530), + id: DeclarationId(525), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked( DeclarationId(183), @@ -11329,7 +11219,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 22086, 22101), }, Declaration { - id: DeclarationId(531), + id: DeclarationId(526), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked( DeclarationId(149), @@ -11346,7 +11236,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 22112, 22125), }, Declaration { - id: DeclarationId(532), + id: DeclarationId(527), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked( DeclarationId(148), @@ -11363,7 +11253,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 22141, 22154), }, Declaration { - id: DeclarationId(533), + id: DeclarationId(528), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -11377,7 +11267,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 22180, 22184), }, Declaration { - id: DeclarationId(534), + id: DeclarationId(529), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -11391,7 +11281,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 22187, 22189), }, Declaration { - id: DeclarationId(535), + id: DeclarationId(530), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -11405,7 +11295,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 22192, 22193), }, Declaration { - id: DeclarationId(536), + id: DeclarationId(531), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -11419,7 +11309,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 22196, 22200), }, Declaration { - id: DeclarationId(537), + id: DeclarationId(532), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked( DeclarationId(186), @@ -11436,7 +11326,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 22264, 22271), }, Declaration { - id: DeclarationId(538), + id: DeclarationId(533), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(97), @@ -11462,7 +11352,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 3063, 3080), }, Declaration { - id: DeclarationId(539), + id: DeclarationId(534), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(97), @@ -11488,7 +11378,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 3533, 3549), }, Declaration { - id: DeclarationId(540), + id: DeclarationId(535), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(97), @@ -11514,7 +11404,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 4740, 4757), }, Declaration { - id: DeclarationId(541), + id: DeclarationId(536), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(97), @@ -11540,7 +11430,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 5722, 5741), }, Declaration { - id: DeclarationId(542), + id: DeclarationId(537), name: Some( "".to_string(), ), @@ -11556,7 +11446,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 10147, 10207), }, Declaration { - id: DeclarationId(543), + id: DeclarationId(538), name: Some( "".to_string(), ), @@ -11572,7 +11462,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 10208, 10268), }, Declaration { - id: DeclarationId(544), + id: DeclarationId(539), name: Some( "" .to_string(), @@ -11589,7 +11479,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 10269, 10320), }, Declaration { - id: DeclarationId(545), + id: DeclarationId(540), name: Some( "" .to_string(), @@ -11606,7 +11496,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 10321, 10376), }, Declaration { - id: DeclarationId(546), + id: DeclarationId(541), name: Some( "".to_string(), ), @@ -11622,7 +11512,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 10377, 10442), }, Declaration { - id: DeclarationId(547), + id: DeclarationId(542), name: Some( "".to_string(), ), @@ -11638,7 +11528,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 10443, 10498), }, Declaration { - id: DeclarationId(548), + id: DeclarationId(543), name: Some( "".to_string(), ), @@ -11654,7 +11544,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 10499, 10544), }, Declaration { - id: DeclarationId(549), + id: DeclarationId(544), name: Some( "" .to_string(), @@ -11671,7 +11561,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 10587, 10629), }, Declaration { - id: DeclarationId(550), + id: DeclarationId(545), name: Some( "".to_string(), ), @@ -11687,7 +11577,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 10630, 10684), }, Declaration { - id: DeclarationId(551), + id: DeclarationId(546), name: Some( "".to_string(), ), @@ -11703,7 +11593,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 10685, 10748), }, Declaration { - id: DeclarationId(552), + id: DeclarationId(547), name: Some( "" .to_string(), @@ -11720,7 +11610,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 10749, 10794), }, Declaration { - id: DeclarationId(553), + id: DeclarationId(548), name: Some( "" .to_string(), @@ -11737,7 +11627,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 10795, 10840), }, Declaration { - id: DeclarationId(554), + id: DeclarationId(549), name: Some( "" .to_string(), @@ -11754,7 +11644,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 10841, 10886), }, Declaration { - id: DeclarationId(555), + id: DeclarationId(550), name: Some( "" .to_string(), @@ -11771,7 +11661,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 10887, 10933), }, Declaration { - id: DeclarationId(556), + id: DeclarationId(551), name: Some( "" .to_string(), @@ -11788,7 +11678,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 10934, 10980), }, Declaration { - id: DeclarationId(557), + id: DeclarationId(552), name: Some( "" .to_string(), @@ -11805,7 +11695,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 11151, 11210), }, Declaration { - id: DeclarationId(558), + id: DeclarationId(553), name: Some( "" .to_string(), @@ -11822,7 +11712,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 11211, 11270), }, Declaration { - id: DeclarationId(559), + id: DeclarationId(554), name: Some( "".to_string(), ), @@ -11838,7 +11728,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 11375, 11418), }, Declaration { - id: DeclarationId(560), + id: DeclarationId(555), name: Some( "".to_string(), ), @@ -11854,7 +11744,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 12098, 12196), }, Declaration { - id: DeclarationId(561), + id: DeclarationId(556), name: Some( "".to_string(), ), @@ -11870,7 +11760,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 12197, 12241), }, Declaration { - id: DeclarationId(562), + id: DeclarationId(557), name: Some( "".to_string(), ), @@ -11886,7 +11776,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 12242, 12286), }, Declaration { - id: DeclarationId(563), + id: DeclarationId(558), name: Some( "" .to_string(), @@ -11903,7 +11793,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 12287, 12354), }, Declaration { - id: DeclarationId(564), + id: DeclarationId(559), name: Some( "".to_string(), ), @@ -11919,7 +11809,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 12355, 12417), }, Declaration { - id: DeclarationId(565), + id: DeclarationId(560), name: Some( "".to_string(), ), @@ -11935,7 +11825,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 12941, 12996), }, Declaration { - id: DeclarationId(566), + id: DeclarationId(561), name: Some( "".to_string(), ), @@ -11951,7 +11841,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 12997, 13051), }, Declaration { - id: DeclarationId(567), + id: DeclarationId(562), name: Some( "".to_string(), ), @@ -11967,7 +11857,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 13052, 13105), }, Declaration { - id: DeclarationId(568), + id: DeclarationId(563), name: Some( "" .to_string(), @@ -11984,7 +11874,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 13106, 13163), }, Declaration { - id: DeclarationId(569), + id: DeclarationId(564), name: Some( "" .to_string(), @@ -12001,7 +11891,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 13164, 13221), }, Declaration { - id: DeclarationId(570), + id: DeclarationId(565), name: Some( "".to_string(), ), @@ -12017,7 +11907,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 13222, 13277), }, Declaration { - id: DeclarationId(571), + id: DeclarationId(566), name: Some( "".to_string(), ), @@ -12033,7 +11923,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 13278, 13334), }, Declaration { - id: DeclarationId(572), + id: DeclarationId(567), name: Some( "".to_string(), ), @@ -12049,7 +11939,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 13335, 13391), }, Declaration { - id: DeclarationId(573), + id: DeclarationId(568), name: Some( "" .to_string(), @@ -12066,7 +11956,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 13392, 13450), }, Declaration { - id: DeclarationId(574), + id: DeclarationId(569), name: Some( "".to_string(), ), @@ -12082,7 +11972,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 13530, 13572), }, Declaration { - id: DeclarationId(575), + id: DeclarationId(570), name: Some( "" .to_string(), @@ -12099,7 +11989,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 13779, 13864), }, Declaration { - id: DeclarationId(576), + id: DeclarationId(571), name: Some( "" .to_string(), @@ -12116,7 +12006,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 13865, 13974), }, Declaration { - id: DeclarationId(577), + id: DeclarationId(572), name: Some( "" .to_string(), @@ -12133,7 +12023,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 17397, 17447), }, Declaration { - id: DeclarationId(578), + id: DeclarationId(573), name: Some( "" .to_string(), @@ -12150,7 +12040,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 17448, 17500), }, Declaration { - id: DeclarationId(579), + id: DeclarationId(574), name: Some( "".to_string(), ), @@ -12166,7 +12056,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 17641, 17702), }, Declaration { - id: DeclarationId(580), + id: DeclarationId(575), name: Some( "" .to_string(), @@ -12183,7 +12073,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 19562, 19626), }, Declaration { - id: DeclarationId(581), + id: DeclarationId(576), name: Some( "" .to_string(), @@ -12200,7 +12090,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 19627, 19684), }, Declaration { - id: DeclarationId(582), + id: DeclarationId(577), name: Some( "" .to_string(), @@ -12217,7 +12107,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/types.dag", 19685, 19741), }, Declaration { - id: DeclarationId(583), + id: DeclarationId(578), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -12231,7 +12121,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/unicode.dag", 3679, 3689), }, Declaration { - id: DeclarationId(584), + id: DeclarationId(579), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -12245,7 +12135,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/unicode.dag", 3692, 3697), }, Declaration { - id: DeclarationId(585), + id: DeclarationId(580), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -12259,7 +12149,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/unicode.dag", 3700, 3710), }, Declaration { - id: DeclarationId(586), + id: DeclarationId(581), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -12273,7 +12163,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/unicode.dag", 3713, 3726), }, Declaration { - id: DeclarationId(587), + id: DeclarationId(582), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -12287,7 +12177,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/unicode.dag", 4762, 4771), }, Declaration { - id: DeclarationId(588), + id: DeclarationId(583), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -12301,7 +12191,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/unicode.dag", 4774, 4780), }, Declaration { - id: DeclarationId(589), + id: DeclarationId(584), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], @@ -12315,7 +12205,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/unicode.dag", 4783, 4787), }, Declaration { - id: DeclarationId(590), + id: DeclarationId(585), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -12335,7 +12225,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/unicode.dag", 5335, 5353), }, Declaration { - id: DeclarationId(591), + id: DeclarationId(586), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -12355,7 +12245,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/unicode.dag", 6155, 6164), }, Declaration { - id: DeclarationId(592), + id: DeclarationId(587), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(93), @@ -12375,7 +12265,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { span: SourceSpan::new("dsl/std/unicode.dag", 6404, 6422), }, Declaration { - id: DeclarationId(593), + id: DeclarationId(588), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(39), @@ -12398,7 +12288,7 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { ports: HashMap::new(), diagnostics: DiagnosticTable::new(), next_node_id: 0, - next_declaration_id: 594, + next_declaration_id: 589, next_port_id: 0, primitives: PrimitiveCache::default(), substrate_markers: SubstrateMarkers::default(), @@ -12413,6 +12303,6 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { callable_strategy_variants: CallableStrategyVariants::default(), clusters: vec![], optional_match_disjs: HashMap::new(), - declaration_append_begin_after_bootstrap: 594, + declaration_append_begin_after_bootstrap: 589, } } From 0524d449ad61e7699ce42279b8fbaf5ec54ce28c Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Wed, 29 Apr 2026 23:29:26 +0000 Subject: [PATCH 05/12] fix(v3): remove stale quotient algebra syntax selectors --- dsl/extdeps/languages/python/syntax.dag | 8 ++++---- dsl/std/syntax.dag | 7 ++----- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/dsl/extdeps/languages/python/syntax.dag b/dsl/extdeps/languages/python/syntax.dag index e688494e15f..0741e4f1978 100644 --- a/dsl/extdeps/languages/python/syntax.dag +++ b/dsl/extdeps/languages/python/syntax.dag @@ -14,7 +14,7 @@ import std.syntax { OperatorSpec, BinOp, Add, Sub, Mul, Div, Mod, Eq, Ne, Lt, Gt, Le, Ge, And, Or, NullCoalesce, - AlgebraFieldKind, AlgReciprocal, AlgQuotient + AlgebraFieldKind, AlgReciprocal } // Python emission item forms — target keywords for .dag→Python compilation. @@ -53,10 +53,10 @@ data python_operators: List = [ OperatorSpec { symbol: "+", left_bp: 13, right_bp: 14, binop: Add, algebra_field: none }, OperatorSpec { symbol: "-", left_bp: 13, right_bp: 14, binop: Sub, algebra_field: none }, OperatorSpec { symbol: "*", left_bp: 15, right_bp: 16, binop: Mul, algebra_field: none }, - // Div is algebra-aware: Float (Field) → true division "/", - // Int (OrderedRing) → integer division "//". + // Div is algebra-aware only for total reciprocal-shaped Field division. + // OrderedRing integer division is v3-owned by checked `/` and no longer + // exposes a bare quotient field. // Ref: Python Reference §6.7 "Binary arithmetic operations" OperatorSpec { symbol: "/", left_bp: 15, right_bp: 16, binop: Div, algebra_field: Some { value: AlgReciprocal } }, - OperatorSpec { symbol: "//", left_bp: 15, right_bp: 16, binop: Div, algebra_field: Some { value: AlgQuotient } }, OperatorSpec { symbol: "%", left_bp: 15, right_bp: 16, binop: Mod, algebra_field: none } ] diff --git a/dsl/std/syntax.dag b/dsl/std/syntax.dag index 88f31661cff..e2c69d6de36 100644 --- a/dsl/std/syntax.dag +++ b/dsl/std/syntax.dag @@ -75,11 +75,10 @@ type ItemForm { // -- Algebra field kind ----------------------------------------------- // Which algebra field an operator dispatches through on the operand type. // Variants correspond 1:1 to field names on algebraic structure types -// in std/algebra.dag (Ring.add, Field.reciprocal, OrderedRing.quotient, etc.). +// in std/algebra.dag (Ring.add, Field.reciprocal, etc.). type AlgebraFieldKind - = AlgAdd | AlgMul | AlgReciprocal | AlgQuotient | AlgRemainder - | AlgCompare | AlgMeet | AlgJoin + = AlgAdd | AlgMul | AlgReciprocal | AlgCompare | AlgMeet | AlgJoin // Single authority for kind → field name mapping. Both the compiler's // child lookup (04_types.dag) and serialization (compile.dag) derive @@ -94,8 +93,6 @@ data algebra_field_entries: List = [ { kind: AlgAdd, field_name: "add" }, { kind: AlgMul, field_name: "mul" }, { kind: AlgReciprocal, field_name: "reciprocal" }, - { kind: AlgQuotient, field_name: "quotient" }, - { kind: AlgRemainder, field_name: "remainder" }, { kind: AlgCompare, field_name: "compare" }, { kind: AlgMeet, field_name: "meet" }, { kind: AlgJoin, field_name: "join" } From fe9b2293431b52767bf4c0a350d41a4f717dd3e6 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Wed, 29 Apr 2026 19:53:53 -0400 Subject: [PATCH 06/12] WIP: vivid-wren-534 --- src/v3/compiler/tests/integration/parse_corpus_manifest.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/v3/compiler/tests/integration/parse_corpus_manifest.txt b/src/v3/compiler/tests/integration/parse_corpus_manifest.txt index 6deec3a3e42..5d17aa080e0 100644 --- a/src/v3/compiler/tests/integration/parse_corpus_manifest.txt +++ b/src/v3/compiler/tests/integration/parse_corpus_manifest.txt @@ -1,7 +1,7 @@ # AUTO-GENERATED by `cargo test -p v3-compiler refresh_handwritten_parse_snapshot_manifest -- --ignored` # SG-2 parser staging: snapshots generated-parser surface output over the parse corpus. # path\titems\tdebug_bytes\tfnv1a64 -dsl/std/algebra.dag 34 164107 bbd2750a61a64e16 +dsl/std/algebra.dag 34 159974 ff468ad6dfc608a7 dsl/std/bit.dag 9 7787 09279906a3939377 dsl/std/float.dag 6 3350 3c45f61f17751329 dsl/std/integer.dag 13 9580 c83bd1649b6f724a From e4a2ab5523652804698f7da444637349a3a73b7d Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 30 Apr 2026 00:58:24 +0000 Subject: [PATCH 07/12] fix(v3): keep shared quotient syntax for v2 compatibility --- dsl/extdeps/languages/python/syntax.dag | 10 ++++++---- dsl/std/syntax.dag | 10 +++++++--- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/dsl/extdeps/languages/python/syntax.dag b/dsl/extdeps/languages/python/syntax.dag index 0741e4f1978..467cbbba7ee 100644 --- a/dsl/extdeps/languages/python/syntax.dag +++ b/dsl/extdeps/languages/python/syntax.dag @@ -14,7 +14,7 @@ import std.syntax { OperatorSpec, BinOp, Add, Sub, Mul, Div, Mod, Eq, Ne, Lt, Gt, Le, Ge, And, Or, NullCoalesce, - AlgebraFieldKind, AlgReciprocal + AlgebraFieldKind, AlgReciprocal, AlgQuotient } // Python emission item forms — target keywords for .dag→Python compilation. @@ -39,6 +39,8 @@ data python_item_forms: List = [ // Python operator precedence (emission-relevant subset). // Python uses word operators for boolean (and, or) and // for integer div. +// The // binding is retained for v2 compatibility with AlgQuotient; v3 no +// longer exposes OrderedRing.quotient in std/algebra.dag. // Ref: Python Reference §6.17 "Operator precedence" data python_operators: List = [ @@ -53,10 +55,10 @@ data python_operators: List = [ OperatorSpec { symbol: "+", left_bp: 13, right_bp: 14, binop: Add, algebra_field: none }, OperatorSpec { symbol: "-", left_bp: 13, right_bp: 14, binop: Sub, algebra_field: none }, OperatorSpec { symbol: "*", left_bp: 15, right_bp: 16, binop: Mul, algebra_field: none }, - // Div is algebra-aware only for total reciprocal-shaped Field division. - // OrderedRing integer division is v3-owned by checked `/` and no longer - // exposes a bare quotient field. + // Div is algebra-aware for total reciprocal-shaped Field division and the + // v2 AlgQuotient compatibility selector. // Ref: Python Reference §6.7 "Binary arithmetic operations" OperatorSpec { symbol: "/", left_bp: 15, right_bp: 16, binop: Div, algebra_field: Some { value: AlgReciprocal } }, + OperatorSpec { symbol: "//", left_bp: 15, right_bp: 16, binop: Div, algebra_field: Some { value: AlgQuotient } }, OperatorSpec { symbol: "%", left_bp: 15, right_bp: 16, binop: Mod, algebra_field: none } ] diff --git a/dsl/std/syntax.dag b/dsl/std/syntax.dag index e2c69d6de36..34ddb844727 100644 --- a/dsl/std/syntax.dag +++ b/dsl/std/syntax.dag @@ -74,11 +74,13 @@ type ItemForm { // -- Algebra field kind ----------------------------------------------- // Which algebra field an operator dispatches through on the operand type. -// Variants correspond 1:1 to field names on algebraic structure types -// in std/algebra.dag (Ring.add, Field.reciprocal, etc.). +// Variants correspond to algebraic field names used by downstream +// consumers. AlgQuotient/AlgRemainder remain here as bounded v2 +// compatibility vocabulary; v3 no longer declares the corresponding +// OrderedRing fields in std/algebra.dag. type AlgebraFieldKind - = AlgAdd | AlgMul | AlgReciprocal | AlgCompare | AlgMeet | AlgJoin + = AlgAdd | AlgMul | AlgReciprocal | AlgQuotient | AlgRemainder | AlgCompare | AlgMeet | AlgJoin // Single authority for kind → field name mapping. Both the compiler's // child lookup (04_types.dag) and serialization (compile.dag) derive @@ -93,6 +95,8 @@ data algebra_field_entries: List = [ { kind: AlgAdd, field_name: "add" }, { kind: AlgMul, field_name: "mul" }, { kind: AlgReciprocal, field_name: "reciprocal" }, + { kind: AlgQuotient, field_name: "quotient" }, + { kind: AlgRemainder, field_name: "remainder" }, { kind: AlgCompare, field_name: "compare" }, { kind: AlgMeet, field_name: "meet" }, { kind: AlgJoin, field_name: "join" } From c6df24841180caf98ea622bae231c20c797b1548 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 30 Apr 2026 01:17:07 +0000 Subject: [PATCH 08/12] test(v3): exempt emit gates runner timing edge --- scripts/slow-test-exemptions.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/slow-test-exemptions.txt b/scripts/slow-test-exemptions.txt index 796cfec1beb..8624d8b5b9a 100644 --- a/scripts/slow-test-exemptions.txt +++ b/scripts/slow-test-exemptions.txt @@ -66,6 +66,8 @@ m2_lens_unused_parameters_migration_test::unused_parameters_dag_runs_end_to_end_ m2_lens_unused_parameters_migration_test::unused_parameters_dag_self_analysis_reports_zero_findings # Lane 2 migration harness roundtrip; compile-heavy self-analysis remains explicit until lens migration paydown. pb1_bootstrap_full_snapshot_test::full_bootstrap_extends_std_snapshot # PB-1 shape guard: compares two large generated bootstrap snapshots in-process; cold CI + libtest parallelism can exceed 2s wall while the structural inequality check stays explicit. Paydown trigger: same shared PB-1 compile warming; optional extra win if snapshot compare moves to mmap/streaming (PB-1 lane only). +r1c_e_emit_gates_dag_test::r1c_e_emit_gates_suite_passes_through_runner # R1C-E emit-gates `.dag` wrapper shells through the runner/binary harness and sits on the 2s CI edge (2166ms on PR #1233); paydown owned by R1C-E emit-gates runner/shared-setup work, not this impossible-bugs row-removal slice. + bootstrap::tests::kernel_bool_path_a_attaches_diagnostic_when_boolean_algebra_unresolvable # Lane 1e-2b Path A regression: two `Dag::new()` paths + mutation; can exceed 2s wall on cold ubuntu-latest when compiled alongside heavy integration neighbors — keep explicit bootstrap diagnostic coverage. Paydown trigger: when the Bool/`BooleanAlgebra` kernel bootstrap bridge dissolves into `dsl/std/types.dag` (see `bootstrap.rs` + `dsl/std/types.dag` dissolution notes), collapse fixtures and/or adopt shared `Dag::new` warming; re-measure and remove if under 2s. p0_std_render_repeat_string_test::std_render_repeat_string_and_indent_text_match_interpreter # ROADMAP P0 (`dsl/std/render.dag` `repeat_string` / `indent_text`): observed 29.7s on PR #595's merge commit. Structural blocker: v2 `compile_to_resolved` + interpreter oracle cold-compile the full resolver for every test; no shared bootstrap cache exists between v2-oracle tests and the v3 integration binary. Named paydown trigger: when a shared v2-oracle bootstrap cache lands (TM-0 shared-bootstrap lane or an earlier TESTING.md §shared-setup pass introducing a `OnceLock`), re-measure and remove this exemption. From a389394e945f7e182b13a30bf7e9cc49059b69d2 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 30 Apr 2026 01:27:12 +0000 Subject: [PATCH 09/12] test(v3): keep slow-test exemption count flat --- scripts/slow-test-exemptions.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/slow-test-exemptions.txt b/scripts/slow-test-exemptions.txt index 8624d8b5b9a..8bf6d06e206 100644 --- a/scripts/slow-test-exemptions.txt +++ b/scripts/slow-test-exemptions.txt @@ -73,7 +73,6 @@ bootstrap::tests::kernel_bool_path_a_attaches_diagnostic_when_boolean_algebra_un p0_std_render_repeat_string_test::std_render_repeat_string_and_indent_text_match_interpreter # ROADMAP P0 (`dsl/std/render.dag` `repeat_string` / `indent_text`): observed 29.7s on PR #595's merge commit. Structural blocker: v2 `compile_to_resolved` + interpreter oracle cold-compile the full resolver for every test; no shared bootstrap cache exists between v2-oracle tests and the v3 integration binary. Named paydown trigger: when a shared v2-oracle bootstrap cache lands (TM-0 shared-bootstrap lane or an earlier TESTING.md §shared-setup pass introducing a `OnceLock`), re-measure and remove this exemption. sg1_tokenize_authority_test::tokenize_generated_module_matches_checked_in_snapshot # SG-1 authority snapshot still regenerates/parses full tokenize projection; tokenize authority lane owns future speedup. -sg2_parse_authority_test::parse_generated_module_matches_checked_in_snapshot # SG-2 parser-staging snapshot: in-process authority compile + rustfmt stdout (same paydown class as SG-1 tokenize snapshot gate). sg2_parse_authority_test::parse_surface_dag_compiles_cleanly_for_regen_parse # SG-2 parser-staging: `compile_parse_surface_std_authority_dag` + cold bootstrap work can exceed 2s wall under default libtest parallelism; ROADMAP SG-2 / TESTING.md paydown (same lane as `parse_generated_module_matches_checked_in_snapshot`). sg2c1_parse_tables_authority_test::parse_tables_generated_module_matches_checked_in_snapshot # SG-2c-1 grammar-tables prototype snapshot: in-process authority compile (parse_tables.dag + tokenize.dag) + rustfmt stdout; same paydown class as SG-1 tokenize / SG-2 parse snapshot gates. sg6_hand_authored_census_test::sg6_regen_lens_cli_smoke_regenerates_named_entry_without_drift # SG-6 regen CLI smoke intentionally shells out to regen path; CLI smoke cost is tracked in SG-6, not TM-0. From b4be4f3e7fa5b5e70670a60389a6a0ad29dc8274 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Wed, 29 Apr 2026 21:37:10 -0400 Subject: [PATCH 10/12] WIP: vivid-wren-534 --- dsl/extdeps/languages/python/syntax.dag | 8 +++++--- dsl/std/syntax.dag | 9 ++++++--- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/dsl/extdeps/languages/python/syntax.dag b/dsl/extdeps/languages/python/syntax.dag index 467cbbba7ee..345e9b80829 100644 --- a/dsl/extdeps/languages/python/syntax.dag +++ b/dsl/extdeps/languages/python/syntax.dag @@ -39,8 +39,10 @@ data python_item_forms: List = [ // Python operator precedence (emission-relevant subset). // Python uses word operators for boolean (and, or) and // for integer div. -// The // binding is retained for v2 compatibility with AlgQuotient; v3 no -// longer exposes OrderedRing.quotient in std/algebra.dag. +// The // binding is retained only for the v2 AlgQuotient compatibility bridge +// consumed by src/v2 language emission tests. It is not v3 algebra authority; +// delete it with AlgQuotient when v2 Div dispatch is retired or moved behind a +// v2-local syntax authority. // Ref: Python Reference §6.17 "Operator precedence" data python_operators: List = [ @@ -56,7 +58,7 @@ data python_operators: List = [ OperatorSpec { symbol: "-", left_bp: 13, right_bp: 14, binop: Sub, algebra_field: none }, OperatorSpec { symbol: "*", left_bp: 15, right_bp: 16, binop: Mul, algebra_field: none }, // Div is algebra-aware for total reciprocal-shaped Field division and the - // v2 AlgQuotient compatibility selector. + // v2-only AlgQuotient compatibility selector. // Ref: Python Reference §6.7 "Binary arithmetic operations" OperatorSpec { symbol: "/", left_bp: 15, right_bp: 16, binop: Div, algebra_field: Some { value: AlgReciprocal } }, OperatorSpec { symbol: "//", left_bp: 15, right_bp: 16, binop: Div, algebra_field: Some { value: AlgQuotient } }, diff --git a/dsl/std/syntax.dag b/dsl/std/syntax.dag index 34ddb844727..ac62ee0c401 100644 --- a/dsl/std/syntax.dag +++ b/dsl/std/syntax.dag @@ -75,9 +75,12 @@ type ItemForm { // -- Algebra field kind ----------------------------------------------- // Which algebra field an operator dispatches through on the operand type. // Variants correspond to algebraic field names used by downstream -// consumers. AlgQuotient/AlgRemainder remain here as bounded v2 -// compatibility vocabulary; v3 no longer declares the corresponding -// OrderedRing fields in std/algebra.dag. +// consumers. AlgQuotient/AlgRemainder are a v2-only compatibility bridge for +// src/v2/00_core.dag + src/v2/04_types.dag Div/Mod dispatch; they are not v3 +// algebra authority because v3 OrderedRing no longer declares quotient or +// remainder fields in std/algebra.dag. Dissolution trigger: delete these two +// variants and rows when the v2 Div/Mod algebra-field dispatch is retired or +// split behind a v2-local syntax authority. type AlgebraFieldKind = AlgAdd | AlgMul | AlgReciprocal | AlgQuotient | AlgRemainder | AlgCompare | AlgMeet | AlgJoin From b33d78febe75ba6ef9489dc5bfddce1f6ceeabdb Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Wed, 29 Apr 2026 21:44:08 -0400 Subject: [PATCH 11/12] WIP: vivid-wren-534 --- src/v2/stage0/src/compiler_tests.rs | 598 +- .../stage0/src/extdeps_languages_dag_emit.rs | 6 +- .../src/extdeps_languages_dag_syntax.rs | 420 +- .../stage0/src/extdeps_languages_dag_types.rs | 8 +- .../stage0/src/extdeps_languages_go_emit.rs | 6 +- .../stage0/src/extdeps_languages_go_syntax.rs | 280 +- .../stage0/src/extdeps_languages_go_types.rs | 12 +- .../src/extdeps_languages_python_emit.rs | 6 +- .../src/extdeps_languages_python_syntax.rs | 296 +- .../src/extdeps_languages_python_types.rs | 10 +- .../stage0/src/extdeps_languages_rust_emit.rs | 98 +- .../src/extdeps_languages_rust_syntax.rs | 406 +- .../src/extdeps_languages_rust_types.rs | 20 +- src/v2/stage0/src/lib.rs | 80 +- src/v2/stage0/src/main.rs | 86 +- src/v2/stage0/src/std_algebra.rs | 1948 +- src/v2/stage0/src/std_coercion.rs | 32 +- src/v2/stage0/src/std_computation.rs | 279 +- src/v2/stage0/src/std_effects.rs | 295 +- src/v2/stage0/src/std_error_primitives.rs | 18 +- src/v2/stage0/src/std_graph.rs | 293 +- src/v2/stage0/src/std_http_path.rs | 335 +- src/v2/stage0/src/std_induction.rs | 1127 +- src/v2/stage0/src/std_iteration.rs | 8 +- src/v2/stage0/src/std_node.rs | 182 +- src/v2/stage0/src/std_syntax.rs | 86 +- src/v2/stage0/src/std_termination.rs | 191 +- src/v2/stage0/src/std_types.rs | 119 +- src/v2/stage0/src/v2_compiler_artifact.rs | 55 +- src/v2/stage0/src/v2_compiler_coercion.rs | 440 +- src/v2/stage0/src/v2_compiler_compile.rs | 2537 +- .../src/v2_compiler_compiler_tests_rust.rs | 231 +- src/v2/stage0/src/v2_compiler_complexity.rs | 12325 +++------- .../src/v2_compiler_effect_derivation.rs | 53 +- src/v2/stage0/src/v2_compiler_emit.rs | 6856 ++---- src/v2/stage0/src/v2_compiler_emit_go.rs | 1829 +- src/v2/stage0/src/v2_compiler_emit_python.rs | 1581 +- src/v2/stage0/src/v2_compiler_emit_rust.rs | 17040 ++++--------- src/v2/stage0/src/v2_compiler_infer.rs | 15908 +++++------- src/v2/stage0/src/v2_compiler_infer_access.rs | 266 +- src/v2/stage0/src/v2_compiler_infer_cycle.rs | 368 +- .../stage0/src/v2_compiler_infer_emit_info.rs | 699 +- src/v2/stage0/src/v2_compiler_infer_env.rs | 279 +- src/v2/stage0/src/v2_compiler_infer_items.rs | 180 +- src/v2/stage0/src/v2_compiler_infer_lookup.rs | 735 +- src/v2/stage0/src/v2_compiler_infer_method.rs | 185 +- .../stage0/src/v2_compiler_infer_patterns.rs | 484 +- .../stage0/src/v2_compiler_infer_resolve.rs | 3834 ++- .../stage0/src/v2_compiler_infer_service.rs | 472 +- src/v2/stage0/src/v2_compiler_infer_sigs.rs | 572 +- src/v2/stage0/src/v2_compiler_infer_types.rs | 3175 +-- src/v2/stage0/src/v2_compiler_languages.rs | 1750 +- src/v2/stage0/src/v2_compiler_normalize.rs | 249 +- src/v2/stage0/src/v2_compiler_ownership.rs | 1490 +- src/v2/stage0/src/v2_compiler_parse.rs | 20067 +++++++--------- src/v2/stage0/src/v2_compiler_resolve.rs | 920 +- src/v2/stage0/src/v2_compiler_runtime_rust.rs | 86 +- src/v2/stage0/src/v2_compiler_tokenize.rs | 1000 +- src/v2/stage0/src/v2_compiler_trace.rs | 225 +- src/v2/stage0/src/v2_rt.rs | 187 +- src/v2/stage0/src/v2_std_core.rs | 3419 +-- 61 files changed, 35532 insertions(+), 71210 deletions(-) diff --git a/src/v2/stage0/src/compiler_tests.rs b/src/v2/stage0/src/compiler_tests.rs index 090fdc8a468..5b1482a6d38 100644 --- a/src/v2/stage0/src/compiler_tests.rs +++ b/src/v2/stage0/src/compiler_tests.rs @@ -1,7 +1,7 @@ #[cfg(test)] mod compiler_tests { - use crate::v2_compiler_tokenize::tokenize; use std::collections::HashMap; + use crate::v2_compiler_tokenize::tokenize; /// Find workspace root by walking up from the current directory looking for Cargo.toml + dsl/ fn workspace_root() -> std::path::PathBuf { @@ -92,11 +92,9 @@ mod compiler_tests { crate::v2_std_core::diagnostic_to_message(err.diagnostic.clone()) ); } - parsed - .result - .module - .clone() - .unwrap_or_else(|| panic!("{} produced no module while building source closure", path)) + parsed.result.module.clone().unwrap_or_else(|| { + panic!("{} produced no module while building source closure", path) + }) } fn module_path_from_source(path: &str, content: &str) -> String { @@ -111,7 +109,9 @@ mod compiler_tests { .collect() } - fn build_source_index(roots: &[&str]) -> HashMap { + fn build_source_index( + roots: &[&str], + ) -> HashMap { let mut index = HashMap::new(); for root in roots { for (path, content) in discover_dag_files(root) { @@ -119,7 +119,9 @@ mod compiler_tests { if let Some((existing, _)) = index.get(&module_path) { panic!( "duplicate module path '{}': declared in both {} and {}", - module_path, existing, path + module_path, + existing, + path ); } index.insert(module_path, (path, content)); @@ -133,8 +135,7 @@ mod compiler_tests { roots: &[&str], ) -> Vec> { let index = build_source_index(roots); - let mut seen = - HashMap::>::new(); + let mut seen = HashMap::>::new(); let mut queue = Vec::new(); for (path, content) in entry_pairs { @@ -214,10 +215,7 @@ mod compiler_tests { #[test] fn tokenize_produces_tokens() { - let tokens = tokenize( - &"fn foo() -> Int { 42 }".to_string(), - "test.dag".to_string(), - ); + let tokens = tokenize(&"fn foo() -> Int { 42 }".to_string(), "test.dag".to_string()); assert!( !tokens.is_empty(), "tokenize should produce at least one token" @@ -269,10 +267,7 @@ mod compiler_tests { &"module test\ntype Foo { x: Int }\n".to_string(), "test.dag".to_string(), ); - let result = crate::v2_compiler_parse::parse( - tokens, - std::rc::Rc::new(std::collections::HashMap::new()), - ); + let result = crate::v2_compiler_parse::parse(tokens, std::rc::Rc::new(std::collections::HashMap::new())); assert!( result.module.is_some(), "valid module should parse successfully" @@ -299,10 +294,7 @@ mod compiler_tests { last.shape ); - let result = crate::v2_compiler_parse::parse( - tokens, - std::rc::Rc::new(std::collections::HashMap::new()), - ); + let result = crate::v2_compiler_parse::parse(tokens, std::rc::Rc::new(std::collections::HashMap::new())); assert!( result.module.is_some(), @@ -379,10 +371,7 @@ mod compiler_tests { "{} should end with Eof", file ); - let result = crate::v2_compiler_parse::parse( - tokens, - std::rc::Rc::new(std::collections::HashMap::new()), - ); + let result = crate::v2_compiler_parse::parse(tokens, std::rc::Rc::new(std::collections::HashMap::new())); assert!( result.module.is_some(), "{} should parse successfully, error: {:?}", @@ -653,201 +642,81 @@ mod compiler_tests { #[test] fn coercion_rust_checkpoint_resolves_primitives() { use crate::v2_compiler_coercion::*; - assert_eq!( - coerce_primitive_type(RenderTarget::Rust, "Int".into()), - "i64" - ); - assert_eq!( - coerce_primitive_type(RenderTarget::Rust, "Float".into()), - "f64" - ); - assert_eq!( - coerce_primitive_type(RenderTarget::Rust, "Bool".into()), - "bool" - ); - assert_eq!( - coerce_primitive_type(RenderTarget::Rust, "Unit".into()), - "()" - ); - assert_eq!( - coerce_primitive_type(RenderTarget::Rust, "String".into()), - "String" - ); - assert_eq!( - coerce_primitive_type(RenderTarget::Rust, "Bytes".into()), - "Vec" - ); - assert_eq!( - coerce_primitive_type(RenderTarget::Rust, "Secret".into()), - "String" - ); - assert_eq!( - coerce_primitive_type(RenderTarget::Rust, "Json".into()), - "serde_json::Value" - ); + assert_eq!(coerce_primitive_type(RenderTarget::Rust, "Int".into()), "i64"); + assert_eq!(coerce_primitive_type(RenderTarget::Rust, "Float".into()), "f64"); + assert_eq!(coerce_primitive_type(RenderTarget::Rust, "Bool".into()), "bool"); + assert_eq!(coerce_primitive_type(RenderTarget::Rust, "Unit".into()), "()"); + assert_eq!(coerce_primitive_type(RenderTarget::Rust, "String".into()), "String"); + assert_eq!(coerce_primitive_type(RenderTarget::Rust, "Bytes".into()), "Vec"); + assert_eq!(coerce_primitive_type(RenderTarget::Rust, "Secret".into()), "String"); + assert_eq!(coerce_primitive_type(RenderTarget::Rust, "Json".into()), "serde_json::Value"); } + #[test] fn coercion_python_checkpoint_resolves_primitives() { use crate::v2_compiler_coercion::*; - assert_eq!( - coerce_primitive_type(RenderTarget::Python, "Int".into()), - "int" - ); - assert_eq!( - coerce_primitive_type(RenderTarget::Python, "Float".into()), - "float" - ); - assert_eq!( - coerce_primitive_type(RenderTarget::Python, "Bool".into()), - "bool" - ); - assert_eq!( - coerce_primitive_type(RenderTarget::Python, "Unit".into()), - "None" - ); - assert_eq!( - coerce_primitive_type(RenderTarget::Python, "String".into()), - "str" - ); - assert_eq!( - coerce_primitive_type(RenderTarget::Python, "Bytes".into()), - "bytes" - ); - assert_eq!( - coerce_primitive_type(RenderTarget::Python, "Secret".into()), - "str" - ); - assert_eq!( - coerce_primitive_type(RenderTarget::Python, "Json".into()), - "dict" - ); + assert_eq!(coerce_primitive_type(RenderTarget::Python, "Int".into()), "int"); + assert_eq!(coerce_primitive_type(RenderTarget::Python, "Float".into()), "float"); + assert_eq!(coerce_primitive_type(RenderTarget::Python, "Bool".into()), "bool"); + assert_eq!(coerce_primitive_type(RenderTarget::Python, "Unit".into()), "None"); + assert_eq!(coerce_primitive_type(RenderTarget::Python, "String".into()), "str"); + assert_eq!(coerce_primitive_type(RenderTarget::Python, "Bytes".into()), "bytes"); + assert_eq!(coerce_primitive_type(RenderTarget::Python, "Secret".into()), "str"); + assert_eq!(coerce_primitive_type(RenderTarget::Python, "Json".into()), "dict"); } + #[test] fn coercion_go_checkpoint_resolves_primitives() { use crate::v2_compiler_coercion::*; - assert_eq!( - coerce_primitive_type(RenderTarget::Go, "Int".into()), - "int64" - ); - assert_eq!( - coerce_primitive_type(RenderTarget::Go, "Float".into()), - "float64" - ); - assert_eq!( - coerce_primitive_type(RenderTarget::Go, "Bool".into()), - "bool" - ); - assert_eq!( - coerce_primitive_type(RenderTarget::Go, "Unit".into()), - "struct{}" - ); - assert_eq!( - coerce_primitive_type(RenderTarget::Go, "String".into()), - "string" - ); - assert_eq!( - coerce_primitive_type(RenderTarget::Go, "Bytes".into()), - "[]byte" - ); - assert_eq!( - coerce_primitive_type(RenderTarget::Go, "Secret".into()), - "string" - ); - assert_eq!( - coerce_primitive_type(RenderTarget::Go, "Json".into()), - "interface{}" - ); + assert_eq!(coerce_primitive_type(RenderTarget::Go, "Int".into()), "int64"); + assert_eq!(coerce_primitive_type(RenderTarget::Go, "Float".into()), "float64"); + assert_eq!(coerce_primitive_type(RenderTarget::Go, "Bool".into()), "bool"); + assert_eq!(coerce_primitive_type(RenderTarget::Go, "Unit".into()), "struct{}"); + assert_eq!(coerce_primitive_type(RenderTarget::Go, "String".into()), "string"); + assert_eq!(coerce_primitive_type(RenderTarget::Go, "Bytes".into()), "[]byte"); + assert_eq!(coerce_primitive_type(RenderTarget::Go, "Secret".into()), "string"); + assert_eq!(coerce_primitive_type(RenderTarget::Go, "Json".into()), "interface{}"); } + #[test] fn coercion_rust_inhabitant_resolves_containers() { use crate::v2_compiler_coercion::*; - assert_eq!( - coerce_container_template(RenderTarget::Rust, "BooleanAlgebra".into()), - Some("std::collections::BTreeSet<{0}>".to_string()) - ); - assert_eq!( - coerce_container_template(RenderTarget::Rust, "FreeMonoid".into()), - Some("Vec<{0}>".to_string()) - ); - assert_eq!( - coerce_container_template(RenderTarget::Rust, "List".into()), - Some("Vec<{0}>".to_string()) - ); - assert_eq!( - coerce_container_template(RenderTarget::Rust, "Map".into()), - Some("HashMap<{0}, {1}>".to_string()) - ); - assert_eq!( - coerce_container_template(RenderTarget::Rust, "PartialFunction".into()), - Some("HashMap<{0}, {1}>".to_string()) - ); - assert_eq!( - coerce_container_template(RenderTarget::Rust, "Set".into()), - Some("std::collections::BTreeSet<{0}>".to_string()) - ); + assert_eq!(coerce_container_template(RenderTarget::Rust, "BooleanAlgebra".into()), Some("std::collections::BTreeSet<{0}>".to_string())); + assert_eq!(coerce_container_template(RenderTarget::Rust, "FreeMonoid".into()), Some("Vec<{0}>".to_string())); + assert_eq!(coerce_container_template(RenderTarget::Rust, "List".into()), Some("Vec<{0}>".to_string())); + assert_eq!(coerce_container_template(RenderTarget::Rust, "Map".into()), Some("HashMap<{0}, {1}>".to_string())); + assert_eq!(coerce_container_template(RenderTarget::Rust, "PartialFunction".into()), Some("HashMap<{0}, {1}>".to_string())); + assert_eq!(coerce_container_template(RenderTarget::Rust, "Set".into()), Some("std::collections::BTreeSet<{0}>".to_string())); } + #[test] fn coercion_python_inhabitant_resolves_containers() { use crate::v2_compiler_coercion::*; - assert_eq!( - coerce_container_template(RenderTarget::Python, "BooleanAlgebra".into()), - Some("set[{0}]".to_string()) - ); - assert_eq!( - coerce_container_template(RenderTarget::Python, "FreeMonoid".into()), - Some("list[{0}]".to_string()) - ); - assert_eq!( - coerce_container_template(RenderTarget::Python, "List".into()), - Some("list[{0}]".to_string()) - ); - assert_eq!( - coerce_container_template(RenderTarget::Python, "Map".into()), - Some("dict[{0}, {1}]".to_string()) - ); - assert_eq!( - coerce_container_template(RenderTarget::Python, "PartialFunction".into()), - Some("dict[{0}, {1}]".to_string()) - ); - assert_eq!( - coerce_container_template(RenderTarget::Python, "Set".into()), - Some("set[{0}]".to_string()) - ); + assert_eq!(coerce_container_template(RenderTarget::Python, "BooleanAlgebra".into()), Some("set[{0}]".to_string())); + assert_eq!(coerce_container_template(RenderTarget::Python, "FreeMonoid".into()), Some("list[{0}]".to_string())); + assert_eq!(coerce_container_template(RenderTarget::Python, "List".into()), Some("list[{0}]".to_string())); + assert_eq!(coerce_container_template(RenderTarget::Python, "Map".into()), Some("dict[{0}, {1}]".to_string())); + assert_eq!(coerce_container_template(RenderTarget::Python, "PartialFunction".into()), Some("dict[{0}, {1}]".to_string())); + assert_eq!(coerce_container_template(RenderTarget::Python, "Set".into()), Some("set[{0}]".to_string())); } + #[test] fn coercion_go_inhabitant_resolves_containers() { use crate::v2_compiler_coercion::*; - assert_eq!( - coerce_container_template(RenderTarget::Go, "BooleanAlgebra".into()), - Some("map[{0}]struct{}".to_string()) - ); - assert_eq!( - coerce_container_template(RenderTarget::Go, "FreeMonoid".into()), - Some("[]{0}".to_string()) - ); - assert_eq!( - coerce_container_template(RenderTarget::Go, "List".into()), - Some("[]{0}".to_string()) - ); - assert_eq!( - coerce_container_template(RenderTarget::Go, "Map".into()), - Some("map[{0}]{1}".to_string()) - ); - assert_eq!( - coerce_container_template(RenderTarget::Go, "PartialFunction".into()), - Some("map[{0}]{1}".to_string()) - ); - assert_eq!( - coerce_container_template(RenderTarget::Go, "Set".into()), - Some("map[{0}]struct{}".to_string()) - ); + assert_eq!(coerce_container_template(RenderTarget::Go, "BooleanAlgebra".into()), Some("map[{0}]struct{}".to_string())); + assert_eq!(coerce_container_template(RenderTarget::Go, "FreeMonoid".into()), Some("[]{0}".to_string())); + assert_eq!(coerce_container_template(RenderTarget::Go, "List".into()), Some("[]{0}".to_string())); + assert_eq!(coerce_container_template(RenderTarget::Go, "Map".into()), Some("map[{0}]{1}".to_string())); + assert_eq!(coerce_container_template(RenderTarget::Go, "PartialFunction".into()), Some("map[{0}]{1}".to_string())); + assert_eq!(coerce_container_template(RenderTarget::Go, "Set".into()), Some("map[{0}]struct{}".to_string())); } + #[test] fn coercion_is_copy_from_checkpoint() { use crate::v2_compiler_coercion::*; @@ -861,45 +730,19 @@ mod compiler_tests { assert_eq!(is_copy(RenderTarget::Rust, "Json".into()), Some(false)); } + #[test] fn coercion_template_application() { use crate::v2_compiler_coercion::*; - assert_eq!( - apply_inhabitant_template1("Vec<{0}>".into(), "i64".into()), - "Vec" - ); - assert_eq!( - apply_inhabitant_template1("std::collections::BTreeSet<{0}>".into(), "i64".into()), - "std::collections::BTreeSet" - ); - assert_eq!( - apply_inhabitant_template2("HashMap<{0}, {1}>".into(), "String".into(), "i64".into()), - "HashMap" - ); - assert_eq!( - apply_inhabitant_template1("list[{0}]".into(), "int".into()), - "list[int]" - ); - assert_eq!( - apply_inhabitant_template1("set[{0}]".into(), "int".into()), - "set[int]" - ); - assert_eq!( - apply_inhabitant_template2("dict[{0}, {1}]".into(), "str".into(), "int".into()), - "dict[str, int]" - ); - assert_eq!( - apply_inhabitant_template1("[]{0}".into(), "int64".into()), - "[]int64" - ); - assert_eq!( - apply_inhabitant_template1("map[{0}]struct{}".into(), "int64".into()), - "map[int64]struct{}" - ); - assert_eq!( - apply_inhabitant_template2("map[{0}]{1}".into(), "string".into(), "int64".into()), - "map[string]int64" - ); + assert_eq!(apply_inhabitant_template1("Vec<{0}>".into(), "i64".into()), "Vec"); + assert_eq!(apply_inhabitant_template1("std::collections::BTreeSet<{0}>".into(), "i64".into()), "std::collections::BTreeSet"); + assert_eq!(apply_inhabitant_template2("HashMap<{0}, {1}>".into(), "String".into(), "i64".into()), "HashMap"); + assert_eq!(apply_inhabitant_template1("list[{0}]".into(), "int".into()), "list[int]"); + assert_eq!(apply_inhabitant_template1("set[{0}]".into(), "int".into()), "set[int]"); + assert_eq!(apply_inhabitant_template2("dict[{0}, {1}]".into(), "str".into(), "int".into()), "dict[str, int]"); + assert_eq!(apply_inhabitant_template1("[]{0}".into(), "int64".into()), "[]int64"); + assert_eq!(apply_inhabitant_template1("map[{0}]struct{}".into(), "int64".into()), "map[int64]struct{}"); + assert_eq!(apply_inhabitant_template2("map[{0}]{1}".into(), "string".into(), "int64".into()), "map[string]int64"); } /// Return current process RSS in bytes (macOS via mach_task_basic_info). @@ -1012,10 +855,7 @@ mod compiler_tests { let parsed = crate::v2_compiler_parse::parse_with_table( tokens, crate::v2_rt::rc_map_insert( - crate::v2_rt::rc_empty_map::< - String, - std::rc::Rc, - >(), + crate::v2_rt::rc_empty_map::>(), si.file.clone(), si.clone(), ), @@ -1029,9 +869,7 @@ mod compiler_tests { " parse {:>40}: {:>8.2?} (ok={})", sources[i].path, elapsed, ok ); - let m = result - .module - .clone() + let m = result.module.clone() .unwrap_or_else(|| panic!("parse failed for source {}", sources[i].path)); modules.push(m); } @@ -1040,25 +878,10 @@ mod compiler_tests { let t_stage = Instant::now(); let resolve_si = sources.iter().fold( - crate::v2_rt::rc_empty_map::< - String, - std::rc::Rc, - >(), - |acc, s| { - crate::v2_rt::rc_map_insert( - acc, - s.path.clone(), - crate::v2_std_core::build_newline_index( - s.path.clone(), - &s.content.clone(), - ), - ) - }, - ); - let graph = crate::v2_compiler_resolve::resolve_modules( - &std::rc::Rc::new(modules), - &resolve_si, + crate::v2_rt::rc_empty_map::>(), + |acc, s| crate::v2_rt::rc_map_insert(acc, s.path.clone(), crate::v2_std_core::build_newline_index(s.path.clone(), &s.content.clone())), ); + let graph = crate::v2_compiler_resolve::resolve_modules(&std::rc::Rc::new(modules), &resolve_si); let resolve_total = t_stage.elapsed(); let errors: Vec<_> = graph .diagnostics @@ -1145,10 +968,7 @@ mod compiler_tests { let parsed = crate::v2_compiler_parse::parse_with_table( tokens, crate::v2_rt::rc_map_insert( - crate::v2_rt::rc_empty_map::< - String, - std::rc::Rc, - >(), + crate::v2_rt::rc_empty_map::>(), si.file.clone(), si.clone(), ), @@ -1165,9 +985,7 @@ mod compiler_tests { " parse {:>40}: {:>8.2?} (ok={})", sources[i].path, elapsed, ok ); - let m = result - .module - .clone() + let m = result.module.clone() .unwrap_or_else(|| panic!("parse failed for source {}", sources[i].path)); modules.push(m); } @@ -1182,25 +1000,10 @@ mod compiler_tests { let t_stage = Instant::now(); let resolve_si = sources.iter().fold( - crate::v2_rt::rc_empty_map::< - String, - std::rc::Rc, - >(), - |acc, s| { - crate::v2_rt::rc_map_insert( - acc, - s.path.clone(), - crate::v2_std_core::build_newline_index( - s.path.clone(), - &s.content.clone(), - ), - ) - }, - ); - let graph = crate::v2_compiler_resolve::resolve_modules( - &std::rc::Rc::new(modules), - &resolve_si, + crate::v2_rt::rc_empty_map::>(), + |acc, s| crate::v2_rt::rc_map_insert(acc, s.path.clone(), crate::v2_std_core::build_newline_index(s.path.clone(), &s.content.clone())), ); + let graph = crate::v2_compiler_resolve::resolve_modules(&std::rc::Rc::new(modules), &resolve_si); let resolve_total = t_stage.elapsed(); let phase3_diags: usize = graph .diagnostics @@ -1229,11 +1032,7 @@ mod compiler_tests { acc }, ); - let typed = crate::v2_compiler_infer::reconcile( - graph, - std::rc::Rc::new(source_indices), - intern_table_p.clone(), - ); + let typed = crate::v2_compiler_infer::reconcile(graph, std::rc::Rc::new(source_indices), intern_table_p.clone()); let reconcile_total = t_stage.elapsed(); let phase4_diags: usize = typed .diagnostics @@ -1309,18 +1108,14 @@ mod compiler_tests { let source_count = sources.len(); let total_chars: usize = sources.iter().map(|s| s.content.len()).sum(); - eprintln!( - "\n=== FULL PIPELINE PROFILE ({} sources, {} chars) ===\n", - source_count, total_chars - ); + eprintln!("\n=== FULL PIPELINE PROFILE ({} sources, {} chars) ===\n", source_count, total_chars); // 1a. Tokenize + parse let t = Instant::now(); let mut token_lists = Vec::new(); for source in &sources { let tokens = crate::v2_compiler_tokenize::tokenize( - &source.content.clone(), - source.path.clone(), + &source.content.clone(), source.path.clone(), ); token_lists.push(tokens); } @@ -1337,10 +1132,7 @@ mod compiler_tests { let parsed = crate::v2_compiler_parse::parse_with_table( tokens, crate::v2_rt::rc_map_insert( - crate::v2_rt::rc_empty_map::< - String, - std::rc::Rc, - >(), + crate::v2_rt::rc_empty_map::>(), si.file.clone(), si.clone(), ), @@ -1348,9 +1140,7 @@ mod compiler_tests { ); let result = parsed.result.clone(); intern_table_fp = parsed.intern_table.clone(); - let m = result - .module - .clone() + let m = result.module.clone() .unwrap_or_else(|| panic!("parse failed for source {}", sources[i].path)); modules.push(m); } @@ -1358,200 +1148,91 @@ mod compiler_tests { // 1b. Resolve let t = Instant::now(); let resolve_si = sources.iter().fold( - crate::v2_rt::rc_empty_map::< - String, - std::rc::Rc, - >(), - |acc, s| { - crate::v2_rt::rc_map_insert( - acc, - s.path.clone(), - crate::v2_std_core::build_newline_index( - s.path.clone(), - &s.content.clone(), - ), - ) - }, - ); - let graph = crate::v2_compiler_resolve::resolve_modules( - &std::rc::Rc::new(modules), - &resolve_si, + crate::v2_rt::rc_empty_map::>(), + |acc, s| crate::v2_rt::rc_map_insert(acc, s.path.clone(), crate::v2_std_core::build_newline_index(s.path.clone(), &s.content.clone())), ); + let graph = crate::v2_compiler_resolve::resolve_modules(&std::rc::Rc::new(modules), &resolve_si); let resolve_elapsed = t.elapsed(); - let resolve_errors: usize = graph - .diagnostics - .iter() + let resolve_errors: usize = graph.diagnostics.iter() .filter(|d| crate::v2_std_core::is_error_diagnostic(d.diagnostic.clone())) .count(); // 1c. Newline indices let t = Instant::now(); - let newline_indices: Vec<_> = sources - .iter() - .map(|s| { - crate::v2_std_core::build_newline_index(s.path.clone(), &s.content.clone()) - }) - .collect(); + let newline_indices: Vec<_> = sources.iter().map(|s| { + crate::v2_std_core::build_newline_index(s.path.clone(), &s.content.clone()) + }).collect(); let newline_elapsed = t.elapsed(); - let frontend_elapsed = - tokenize_elapsed + parse_elapsed + resolve_elapsed + newline_elapsed; + let frontend_elapsed = tokenize_elapsed + parse_elapsed + resolve_elapsed + newline_elapsed; eprintln!(" Tokenize: {:>8.2?}", tokenize_elapsed); eprintln!(" Parse: {:>8.2?}", parse_elapsed); - eprintln!( - " Resolve: {:>8.2?} ({} resolve errors)", - resolve_elapsed, resolve_errors - ); + eprintln!(" Resolve: {:>8.2?} ({} resolve errors)", resolve_elapsed, resolve_errors); eprintln!(" Newline indices: {:>8.2?}", newline_elapsed); eprintln!(" Frontend total: {:>8.2?}", frontend_elapsed); // 2. Normalize let t = Instant::now(); let source_indices = newline_indices.iter().cloned().fold( - crate::v2_rt::rc_empty_map::< - String, - std::rc::Rc, - >(), - |acc, index| { - crate::v2_rt::rc_map_insert(acc, index.file.clone(), index.clone()) - }, + crate::v2_rt::rc_empty_map::>(), + |acc, index| crate::v2_rt::rc_map_insert(acc, index.file.clone(), index.clone()), ); - let norm = - crate::v2_compiler_normalize::normalize_graph(&graph, source_indices.clone()); + let norm = crate::v2_compiler_normalize::normalize_graph(&graph, source_indices.clone()); let normalize_elapsed = t.elapsed(); - eprintln!( - " Normalize: {:>8.2?}", - normalize_elapsed - ); + eprintln!(" Normalize: {:>8.2?}", normalize_elapsed); // 3. Reconcile let t = Instant::now(); - let typed = crate::v2_compiler_infer::reconcile( - norm.graph.clone(), - source_indices.clone(), - intern_table_fp.clone(), - ); + let typed = crate::v2_compiler_infer::reconcile(norm.graph.clone(), source_indices.clone(), intern_table_fp.clone()); let reconcile_elapsed = t.elapsed(); - let type_errors: usize = typed - .diagnostics - .iter() + let type_errors: usize = typed.diagnostics.iter() .filter(|d| crate::v2_std_core::is_error_diagnostic(d.diagnostic.clone())) .count(); - eprintln!( - " Reconcile: {:>8.2?} ({} type errors)", - reconcile_elapsed, type_errors - ); + eprintln!(" Reconcile: {:>8.2?} ({} type errors)", reconcile_elapsed, type_errors); // 4. Complexity let t = Instant::now(); let func_entries = crate::v2_compiler_compile::extract_func_entries(typed.clone()); let func_count = func_entries.len(); - let recursion_ctx = - crate::v2_compiler_compile::build_recursion_context(typed.clone()); + let recursion_ctx = crate::v2_compiler_compile::build_recursion_context(typed.clone()); let complexity = crate::v2_compiler_complexity::build_complexity_report( - &func_entries, - recursion_ctx, - source_indices.clone(), + &func_entries, recursion_ctx, source_indices.clone(), ); let complexity_elapsed = t.elapsed(); - let cx_diags = - crate::v2_compiler_compile::complexity_diagnostics(complexity.clone()); - eprintln!( - " Complexity: {:>8.2?} ({} funcs, {} diagnostics)", - complexity_elapsed, - func_count, - cx_diags.len() - ); + let cx_diags = crate::v2_compiler_compile::complexity_diagnostics(complexity.clone()); + eprintln!(" Complexity: {:>8.2?} ({} funcs, {} diagnostics)", complexity_elapsed, func_count, cx_diags.len()); // 5. Ownership let t = Instant::now(); let ownership = crate::v2_compiler_compile::extract_ownership_proofs(typed.clone()); let ownership_elapsed = t.elapsed(); - let own_diags = - crate::v2_compiler_compile::ownership_diagnostics(ownership.clone()); - eprintln!( - " Ownership: {:>8.2?} ({} proofs, {} diagnostics)", - ownership_elapsed, - ownership.len(), - own_diags.len() - ); + let own_diags = crate::v2_compiler_compile::ownership_diagnostics(ownership.clone()); + eprintln!(" Ownership: {:>8.2?} ({} proofs, {} diagnostics)", ownership_elapsed, ownership.len(), own_diags.len()); // 6. Emit let artifact_plan = crate::v2_compiler_compile::default_artifact_plan( - std::rc::Rc::new( - typed - .modules - .iter() - .map(|m| m.module.clone().name.clone()) - .collect(), - ), + std::rc::Rc::new(typed.modules.iter().map(|m| m.module.clone().name.clone()).collect()), crate::v2_compiler_artifact::RenderTarget::Rust, ); let t = Instant::now(); - let emit_result = crate::v2_compiler_compile::emit_from_artifact_plan( - typed.clone(), - &artifact_plan, - ); + let emit_result = crate::v2_compiler_compile::emit_from_artifact_plan(typed.clone(), &artifact_plan); let emit_elapsed = t.elapsed(); let emitted_files = emit_result.files.len(); let emitted_bytes: usize = emit_result.files.iter().map(|f| f.content.len()).sum(); - eprintln!( - " Emit: {:>8.2?} ({} files, {} bytes)", - emit_elapsed, emitted_files, emitted_bytes - ); + eprintln!(" Emit: {:>8.2?} ({} files, {} bytes)", emit_elapsed, emitted_files, emitted_bytes); - let total = frontend_elapsed - + normalize_elapsed - + reconcile_elapsed - + complexity_elapsed - + ownership_elapsed - + emit_elapsed; + let total = frontend_elapsed + normalize_elapsed + reconcile_elapsed + + complexity_elapsed + ownership_elapsed + emit_elapsed; eprintln!("\n=== SUMMARY ==="); - eprintln!( - " Tokenize: {:>8.2?} ({:.0}%)", - tokenize_elapsed, - tokenize_elapsed.as_secs_f64() / total.as_secs_f64() * 100.0 - ); - eprintln!( - " Parse: {:>8.2?} ({:.0}%)", - parse_elapsed, - parse_elapsed.as_secs_f64() / total.as_secs_f64() * 100.0 - ); - eprintln!( - " Resolve: {:>8.2?} ({:.0}%)", - resolve_elapsed, - resolve_elapsed.as_secs_f64() / total.as_secs_f64() * 100.0 - ); - eprintln!( - " Newline: {:>8.2?} ({:.0}%)", - newline_elapsed, - newline_elapsed.as_secs_f64() / total.as_secs_f64() * 100.0 - ); - eprintln!( - " Normalize: {:>8.2?} ({:.0}%)", - normalize_elapsed, - normalize_elapsed.as_secs_f64() / total.as_secs_f64() * 100.0 - ); - eprintln!( - " Reconcile: {:>8.2?} ({:.0}%)", - reconcile_elapsed, - reconcile_elapsed.as_secs_f64() / total.as_secs_f64() * 100.0 - ); - eprintln!( - " Complexity: {:>8.2?} ({:.0}%)", - complexity_elapsed, - complexity_elapsed.as_secs_f64() / total.as_secs_f64() * 100.0 - ); - eprintln!( - " Ownership: {:>8.2?} ({:.0}%)", - ownership_elapsed, - ownership_elapsed.as_secs_f64() / total.as_secs_f64() * 100.0 - ); - eprintln!( - " Emit: {:>8.2?} ({:.0}%)", - emit_elapsed, - emit_elapsed.as_secs_f64() / total.as_secs_f64() * 100.0 - ); + eprintln!(" Tokenize: {:>8.2?} ({:.0}%)", tokenize_elapsed, tokenize_elapsed.as_secs_f64() / total.as_secs_f64() * 100.0); + eprintln!(" Parse: {:>8.2?} ({:.0}%)", parse_elapsed, parse_elapsed.as_secs_f64() / total.as_secs_f64() * 100.0); + eprintln!(" Resolve: {:>8.2?} ({:.0}%)", resolve_elapsed, resolve_elapsed.as_secs_f64() / total.as_secs_f64() * 100.0); + eprintln!(" Newline: {:>8.2?} ({:.0}%)", newline_elapsed, newline_elapsed.as_secs_f64() / total.as_secs_f64() * 100.0); + eprintln!(" Normalize: {:>8.2?} ({:.0}%)", normalize_elapsed, normalize_elapsed.as_secs_f64() / total.as_secs_f64() * 100.0); + eprintln!(" Reconcile: {:>8.2?} ({:.0}%)", reconcile_elapsed, reconcile_elapsed.as_secs_f64() / total.as_secs_f64() * 100.0); + eprintln!(" Complexity: {:>8.2?} ({:.0}%)", complexity_elapsed, complexity_elapsed.as_secs_f64() / total.as_secs_f64() * 100.0); + eprintln!(" Ownership: {:>8.2?} ({:.0}%)", ownership_elapsed, ownership_elapsed.as_secs_f64() / total.as_secs_f64() * 100.0); + eprintln!(" Emit: {:>8.2?} ({:.0}%)", emit_elapsed, emit_elapsed.as_secs_f64() / total.as_secs_f64() * 100.0); eprintln!(" TOTAL: {:>8.2?}", total); }) .expect("failed to spawn thread") @@ -1590,10 +1271,7 @@ mod compiler_tests { let parsed = crate::v2_compiler_parse::parse_with_table( &tokens, crate::v2_rt::rc_map_insert( - crate::v2_rt::rc_empty_map::< - String, - std::rc::Rc, - >(), + crate::v2_rt::rc_empty_map::>(), si.file.clone(), si.clone(), ), @@ -1601,32 +1279,15 @@ mod compiler_tests { ); let result = parsed.result.clone(); intern_table = parsed.intern_table.clone(); - let m = result - .module - .clone() + let m = result.module.clone() .unwrap_or_else(|| panic!("parse failed for source {}", source.path)); modules.push(m); } let resolve_si = sources.iter().fold( - crate::v2_rt::rc_empty_map::< - String, - std::rc::Rc, - >(), - |acc, s| { - crate::v2_rt::rc_map_insert( - acc, - s.path.clone(), - crate::v2_std_core::build_newline_index( - s.path.clone(), - &s.content.clone(), - ), - ) - }, - ); - let graph = crate::v2_compiler_resolve::resolve_modules( - &std::rc::Rc::new(modules), - &resolve_si, + crate::v2_rt::rc_empty_map::>(), + |acc, s| crate::v2_rt::rc_map_insert(acc, s.path.clone(), crate::v2_std_core::build_newline_index(s.path.clone(), &s.content.clone())), ); + let graph = crate::v2_compiler_resolve::resolve_modules(&std::rc::Rc::new(modules), &resolve_si); let setup_time = t0.elapsed(); let rss_baseline = get_rss_bytes(); eprintln!( @@ -1777,4 +1438,5 @@ mod compiler_tests { .join(); result.expect("profile_reconcile_per_module panicked"); } + } diff --git a/src/v2/stage0/src/extdeps_languages_dag_emit.rs b/src/v2/stage0/src/extdeps_languages_dag_emit.rs index 557109d0c3b..1e1559de24c 100644 --- a/src/v2/stage0/src/extdeps_languages_dag_emit.rs +++ b/src/v2/stage0/src/extdeps_languages_dag_emit.rs @@ -1,11 +1,11 @@ // Generated by v2 compiler -- do not edit. // Source module: extdeps.languages.dag.emit -use crate::v2_rt; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; pub fn dag_keywords() -> Rc> { thread_local! { diff --git a/src/v2/stage0/src/extdeps_languages_dag_syntax.rs b/src/v2/stage0/src/extdeps_languages_dag_syntax.rs index 54fbe29d936..9bdadf5e36a 100644 --- a/src/v2/stage0/src/extdeps_languages_dag_syntax.rs +++ b/src/v2/stage0/src/extdeps_languages_dag_syntax.rs @@ -1,121 +1,113 @@ // Generated by v2 compiler -- do not edit. // Source module: extdeps.languages.dag.syntax -use crate::std_syntax::BinOp::{ - Add, And, Div, Eq, Ge, Gt, Le, Lt, Mod, Mul, Ne, NullCoalesce, Or, Sub, -}; -use crate::std_syntax::BodyKind::{ - BlockBody, ExprBody, NoBody, ResourceBody, ServiceBody, TypeBody, ValueBody, -}; -use crate::std_syntax::ItemFormKind::{ - EnumForm, FuncForm, ModuleForm, OtherForm, StructForm, TypeAliasForm, -}; -use crate::std_syntax::LiteralValue::{LitBool, LitNull}; -pub use crate::std_syntax::{ - BinOp, BodyKind, ItemForm, ItemFormKind, LiteralValue, OperatorSpec, SyntaxSpec, -}; -use crate::v2_rt; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::std_syntax::{ItemForm, ItemFormKind, BodyKind, OperatorSpec, SyntaxSpec, BinOp, LiteralValue}; +use crate::std_syntax::ItemFormKind::{FuncForm, StructForm, EnumForm, TypeAliasForm, ModuleForm, OtherForm}; +use crate::std_syntax::BodyKind::{ExprBody, BlockBody, TypeBody, ValueBody, NoBody, ServiceBody, ResourceBody}; +use crate::std_syntax::BinOp::{Add, Sub, Mul, Div, Mod, Eq, Ne, Lt, Gt, Le, Ge, And, Or, NullCoalesce}; +use crate::std_syntax::LiteralValue::{LitBool, LitNull}; pub fn dag_item_forms() -> Rc>> { thread_local! { - static CACHED: Rc>> = { - Rc::new(vec![Rc::new(ItemForm { - kind: ItemFormKind::TypeAliasForm, - keyword: "type".to_string(), - has_type_params: true, - has_params: false, - has_return_type: false, - return_required: false, - has_uses: false, - body_kind: BodyKind::TypeBody, - }), Rc::new(ItemForm { - kind: ItemFormKind::FuncForm, - keyword: "fn".to_string(), - has_type_params: true, - has_params: true, - has_return_type: true, - return_required: true, - has_uses: false, - body_kind: BodyKind::ExprBody, - }), Rc::new(ItemForm { - kind: ItemFormKind::FuncForm, - keyword: "func".to_string(), - has_type_params: false, - has_params: true, - has_return_type: true, - return_required: false, - has_uses: true, - body_kind: BodyKind::BlockBody, - }), Rc::new(ItemForm { - kind: ItemFormKind::OtherForm, - keyword: "service".to_string(), - has_type_params: false, - has_params: false, - has_return_type: false, - return_required: false, - has_uses: false, - body_kind: BodyKind::ServiceBody, - }), Rc::new(ItemForm { - kind: ItemFormKind::OtherForm, - keyword: "resource".to_string(), - has_type_params: false, - has_params: false, - has_return_type: false, - return_required: false, - has_uses: false, - body_kind: BodyKind::ResourceBody, - }), Rc::new(ItemForm { - kind: ItemFormKind::OtherForm, - keyword: "data".to_string(), - has_type_params: false, - has_params: false, - has_return_type: false, - return_required: false, - has_uses: false, - body_kind: BodyKind::ValueBody, - }), Rc::new(ItemForm { - kind: ItemFormKind::OtherForm, - keyword: "pattern".to_string(), - has_type_params: false, - has_params: true, - has_return_type: true, - return_required: false, - has_uses: true, - body_kind: BodyKind::BlockBody, - }), Rc::new(ItemForm { - kind: ItemFormKind::OtherForm, - keyword: "interface".to_string(), - has_type_params: false, - has_params: true, - has_return_type: true, - return_required: false, - has_uses: false, - body_kind: BodyKind::BlockBody, - })]) - }; - } + static CACHED: Rc>> = { + Rc::new(vec![Rc::new(ItemForm { + kind: ItemFormKind::TypeAliasForm, + keyword: "type".to_string(), + has_type_params: true, + has_params: false, + has_return_type: false, + return_required: false, + has_uses: false, + body_kind: BodyKind::TypeBody, +}), Rc::new(ItemForm { + kind: ItemFormKind::FuncForm, + keyword: "fn".to_string(), + has_type_params: true, + has_params: true, + has_return_type: true, + return_required: true, + has_uses: false, + body_kind: BodyKind::ExprBody, +}), Rc::new(ItemForm { + kind: ItemFormKind::FuncForm, + keyword: "func".to_string(), + has_type_params: false, + has_params: true, + has_return_type: true, + return_required: false, + has_uses: true, + body_kind: BodyKind::BlockBody, +}), Rc::new(ItemForm { + kind: ItemFormKind::OtherForm, + keyword: "service".to_string(), + has_type_params: false, + has_params: false, + has_return_type: false, + return_required: false, + has_uses: false, + body_kind: BodyKind::ServiceBody, +}), Rc::new(ItemForm { + kind: ItemFormKind::OtherForm, + keyword: "resource".to_string(), + has_type_params: false, + has_params: false, + has_return_type: false, + return_required: false, + has_uses: false, + body_kind: BodyKind::ResourceBody, +}), Rc::new(ItemForm { + kind: ItemFormKind::OtherForm, + keyword: "data".to_string(), + has_type_params: false, + has_params: false, + has_return_type: false, + return_required: false, + has_uses: false, + body_kind: BodyKind::ValueBody, +}), Rc::new(ItemForm { + kind: ItemFormKind::OtherForm, + keyword: "pattern".to_string(), + has_type_params: false, + has_params: true, + has_return_type: true, + return_required: false, + has_uses: true, + body_kind: BodyKind::BlockBody, +}), Rc::new(ItemForm { + kind: ItemFormKind::OtherForm, + keyword: "interface".to_string(), + has_type_params: false, + has_params: true, + has_return_type: true, + return_required: false, + has_uses: false, + body_kind: BodyKind::BlockBody, +})]) + }; + } CACHED.with(|c| c.clone()) } pub fn dag_keyword_literals() -> Rc>> { thread_local! { - static CACHED: Rc>> = { - let mut __m = HashMap::new(); - __m.insert("true".to_string(), Rc::new(LiteralValue::LitBool { - value: true, - })); - __m.insert("false".to_string(), Rc::new(LiteralValue::LitBool { - value: false, - })); - __m.insert("none".to_string(), Rc::new(LiteralValue::LitNull)); - __m.insert("null".to_string(), Rc::new(LiteralValue::LitNull)); - Rc::new(__m) - }; - } + static CACHED: Rc>> = { + let mut __m = HashMap::new(); + __m.insert("true".to_string(), Rc::new(LiteralValue::LitBool { + value: true, +})); + __m.insert("false".to_string(), Rc::new(LiteralValue::LitBool { + value: false, +})); + __m.insert("none".to_string(), Rc::new(LiteralValue::LitNull)); + __m.insert("null".to_string(), Rc::new(LiteralValue::LitNull)); + Rc::new(__m) + }; + } CACHED.with(|c| c.clone()) } @@ -182,119 +174,119 @@ pub fn dag_non_name_keywords() -> Rc> { pub fn dag_operators() -> Rc>> { thread_local! { - static CACHED: Rc>> = { - Rc::new(vec![Rc::new(OperatorSpec { - symbol: "??".to_string(), - left_bp: 3, - right_bp: 4, - binop: Some(BinOp::NullCoalesce), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "||".to_string(), - left_bp: 5, - right_bp: 6, - binop: Some(BinOp::Or), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "&&".to_string(), - left_bp: 7, - right_bp: 8, - binop: Some(BinOp::And), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "==".to_string(), - left_bp: 9, - right_bp: 10, - binop: Some(BinOp::Eq), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "!=".to_string(), - left_bp: 9, - right_bp: 10, - binop: Some(BinOp::Ne), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "<".to_string(), - left_bp: 11, - right_bp: 12, - binop: Some(BinOp::Lt), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: ">".to_string(), - left_bp: 11, - right_bp: 12, - binop: Some(BinOp::Gt), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "<=".to_string(), - left_bp: 11, - right_bp: 12, - binop: Some(BinOp::Le), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: ">=".to_string(), - left_bp: 11, - right_bp: 12, - binop: Some(BinOp::Ge), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "+".to_string(), - left_bp: 13, - right_bp: 14, - binop: Some(BinOp::Add), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "-".to_string(), - left_bp: 13, - right_bp: 14, - binop: Some(BinOp::Sub), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "*".to_string(), - left_bp: 15, - right_bp: 16, - binop: Some(BinOp::Mul), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "/".to_string(), - left_bp: 15, - right_bp: 16, - binop: Some(BinOp::Div), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "%".to_string(), - left_bp: 15, - right_bp: 16, - binop: Some(BinOp::Mod), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "|>".to_string(), - left_bp: 17, - right_bp: 18, - binop: None, - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: ".".to_string(), - left_bp: 19, - right_bp: 20, - binop: None, - algebra_field: None, - })]) - }; - } + static CACHED: Rc>> = { + Rc::new(vec![Rc::new(OperatorSpec { + symbol: "??".to_string(), + left_bp: 3, + right_bp: 4, + binop: Some(BinOp::NullCoalesce), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "||".to_string(), + left_bp: 5, + right_bp: 6, + binop: Some(BinOp::Or), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "&&".to_string(), + left_bp: 7, + right_bp: 8, + binop: Some(BinOp::And), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "==".to_string(), + left_bp: 9, + right_bp: 10, + binop: Some(BinOp::Eq), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "!=".to_string(), + left_bp: 9, + right_bp: 10, + binop: Some(BinOp::Ne), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "<".to_string(), + left_bp: 11, + right_bp: 12, + binop: Some(BinOp::Lt), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: ">".to_string(), + left_bp: 11, + right_bp: 12, + binop: Some(BinOp::Gt), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "<=".to_string(), + left_bp: 11, + right_bp: 12, + binop: Some(BinOp::Le), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: ">=".to_string(), + left_bp: 11, + right_bp: 12, + binop: Some(BinOp::Ge), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "+".to_string(), + left_bp: 13, + right_bp: 14, + binop: Some(BinOp::Add), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "-".to_string(), + left_bp: 13, + right_bp: 14, + binop: Some(BinOp::Sub), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "*".to_string(), + left_bp: 15, + right_bp: 16, + binop: Some(BinOp::Mul), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "/".to_string(), + left_bp: 15, + right_bp: 16, + binop: Some(BinOp::Div), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "%".to_string(), + left_bp: 15, + right_bp: 16, + binop: Some(BinOp::Mod), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "|>".to_string(), + left_bp: 17, + right_bp: 18, + binop: None, + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: ".".to_string(), + left_bp: 19, + right_bp: 20, + binop: None, + algebra_field: None, +})]) + }; + } CACHED.with(|c| c.clone()) } pub fn dag_syntax_spec() -> Rc { thread_local! { - static CACHED: Rc = { - Rc::new(SyntaxSpec { - item_forms: dag_item_forms(), - operators: dag_operators(), - keyword_literals: dag_keyword_literals(), - keyword_set: dag_keyword_set(), - }) - }; - } + static CACHED: Rc = { + Rc::new(SyntaxSpec { + item_forms: dag_item_forms(), + operators: dag_operators(), + keyword_literals: dag_keyword_literals(), + keyword_set: dag_keyword_set(), +}) + }; + } CACHED.with(|c| c.clone()) } diff --git a/src/v2/stage0/src/extdeps_languages_dag_types.rs b/src/v2/stage0/src/extdeps_languages_dag_types.rs index 747e7726ac8..c95c45171d0 100644 --- a/src/v2/stage0/src/extdeps_languages_dag_types.rs +++ b/src/v2/stage0/src/extdeps_languages_dag_types.rs @@ -1,12 +1,12 @@ // Generated by v2 compiler -- do not edit. // Source module: extdeps.languages.dag.types -pub use crate::std_coercion::TypeCheckpoint; -use crate::v2_rt; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::std_coercion::{TypeCheckpoint}; pub fn dag_type_checkpoints() -> Rc>> { thread_local! { diff --git a/src/v2/stage0/src/extdeps_languages_go_emit.rs b/src/v2/stage0/src/extdeps_languages_go_emit.rs index c6ad3e3c756..a6ddd844b04 100644 --- a/src/v2/stage0/src/extdeps_languages_go_emit.rs +++ b/src/v2/stage0/src/extdeps_languages_go_emit.rs @@ -1,11 +1,11 @@ // Generated by v2 compiler -- do not edit. // Source module: extdeps.languages.go.emit -use crate::v2_rt; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; pub fn go_keywords() -> Rc> { thread_local! { diff --git a/src/v2/stage0/src/extdeps_languages_go_syntax.rs b/src/v2/stage0/src/extdeps_languages_go_syntax.rs index a488a4b3987..ea0c113871a 100644 --- a/src/v2/stage0/src/extdeps_languages_go_syntax.rs +++ b/src/v2/stage0/src/extdeps_languages_go_syntax.rs @@ -1,157 +1,153 @@ // Generated by v2 compiler -- do not edit. // Source module: extdeps.languages.go.syntax -use crate::std_syntax::BinOp::{ - Add, And, Div, Eq, Ge, Gt, Le, Lt, Mod, Mul, Ne, NullCoalesce, Or, Sub, -}; -use crate::std_syntax::BodyKind::{BlockBody, NoBody, TypeBody}; -use crate::std_syntax::ItemFormKind::{ - EnumForm, FuncForm, ModuleForm, OtherForm, StructForm, TypeAliasForm, -}; -pub use crate::std_syntax::{BinOp, BodyKind, ItemForm, ItemFormKind, OperatorSpec}; -use crate::v2_rt; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::std_syntax::{ItemForm, ItemFormKind, BodyKind, OperatorSpec, BinOp}; +use crate::std_syntax::ItemFormKind::{FuncForm, StructForm, EnumForm, TypeAliasForm, ModuleForm, OtherForm}; +use crate::std_syntax::BodyKind::{BlockBody, TypeBody, NoBody}; +use crate::std_syntax::BinOp::{Add, Sub, Mul, Div, Mod, Eq, Ne, Lt, Gt, Le, Ge, And, Or, NullCoalesce}; pub fn go_item_forms() -> Rc>> { thread_local! { - static CACHED: Rc>> = { - Rc::new(vec![Rc::new(ItemForm { - kind: ItemFormKind::FuncForm, - keyword: "func".to_string(), - has_type_params: false, - has_params: true, - has_return_type: true, - return_required: false, - has_uses: false, - body_kind: BodyKind::BlockBody, - }), Rc::new(ItemForm { - kind: ItemFormKind::StructForm, - keyword: "struct".to_string(), - has_type_params: false, - has_params: false, - has_return_type: false, - return_required: false, - has_uses: false, - body_kind: BodyKind::TypeBody, - }), Rc::new(ItemForm { - kind: ItemFormKind::EnumForm, - keyword: "type".to_string(), - has_type_params: false, - has_params: false, - has_return_type: false, - return_required: false, - has_uses: false, - body_kind: BodyKind::NoBody, - }), Rc::new(ItemForm { - kind: ItemFormKind::TypeAliasForm, - keyword: "type".to_string(), - has_type_params: false, - has_params: false, - has_return_type: false, - return_required: false, - has_uses: false, - body_kind: BodyKind::NoBody, - }), Rc::new(ItemForm { - kind: ItemFormKind::ModuleForm, - keyword: "package".to_string(), - has_type_params: false, - has_params: false, - has_return_type: false, - return_required: false, - has_uses: false, - body_kind: BodyKind::NoBody, - })]) - }; - } + static CACHED: Rc>> = { + Rc::new(vec![Rc::new(ItemForm { + kind: ItemFormKind::FuncForm, + keyword: "func".to_string(), + has_type_params: false, + has_params: true, + has_return_type: true, + return_required: false, + has_uses: false, + body_kind: BodyKind::BlockBody, +}), Rc::new(ItemForm { + kind: ItemFormKind::StructForm, + keyword: "struct".to_string(), + has_type_params: false, + has_params: false, + has_return_type: false, + return_required: false, + has_uses: false, + body_kind: BodyKind::TypeBody, +}), Rc::new(ItemForm { + kind: ItemFormKind::EnumForm, + keyword: "type".to_string(), + has_type_params: false, + has_params: false, + has_return_type: false, + return_required: false, + has_uses: false, + body_kind: BodyKind::NoBody, +}), Rc::new(ItemForm { + kind: ItemFormKind::TypeAliasForm, + keyword: "type".to_string(), + has_type_params: false, + has_params: false, + has_return_type: false, + return_required: false, + has_uses: false, + body_kind: BodyKind::NoBody, +}), Rc::new(ItemForm { + kind: ItemFormKind::ModuleForm, + keyword: "package".to_string(), + has_type_params: false, + has_params: false, + has_return_type: false, + return_required: false, + has_uses: false, + body_kind: BodyKind::NoBody, +})]) + }; + } CACHED.with(|c| c.clone()) } pub fn go_operators() -> Rc>> { thread_local! { - static CACHED: Rc>> = { - Rc::new(vec![Rc::new(OperatorSpec { - symbol: "||".to_string(), - left_bp: 5, - right_bp: 6, - binop: Some(BinOp::Or), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "&&".to_string(), - left_bp: 7, - right_bp: 8, - binop: Some(BinOp::And), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "==".to_string(), - left_bp: 9, - right_bp: 10, - binop: Some(BinOp::Eq), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "!=".to_string(), - left_bp: 9, - right_bp: 10, - binop: Some(BinOp::Ne), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "<".to_string(), - left_bp: 11, - right_bp: 12, - binop: Some(BinOp::Lt), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: ">".to_string(), - left_bp: 11, - right_bp: 12, - binop: Some(BinOp::Gt), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "<=".to_string(), - left_bp: 11, - right_bp: 12, - binop: Some(BinOp::Le), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: ">=".to_string(), - left_bp: 11, - right_bp: 12, - binop: Some(BinOp::Ge), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "+".to_string(), - left_bp: 13, - right_bp: 14, - binop: Some(BinOp::Add), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "-".to_string(), - left_bp: 13, - right_bp: 14, - binop: Some(BinOp::Sub), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "*".to_string(), - left_bp: 15, - right_bp: 16, - binop: Some(BinOp::Mul), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "/".to_string(), - left_bp: 15, - right_bp: 16, - binop: Some(BinOp::Div), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "%".to_string(), - left_bp: 15, - right_bp: 16, - binop: Some(BinOp::Mod), - algebra_field: None, - })]) - }; - } + static CACHED: Rc>> = { + Rc::new(vec![Rc::new(OperatorSpec { + symbol: "||".to_string(), + left_bp: 5, + right_bp: 6, + binop: Some(BinOp::Or), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "&&".to_string(), + left_bp: 7, + right_bp: 8, + binop: Some(BinOp::And), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "==".to_string(), + left_bp: 9, + right_bp: 10, + binop: Some(BinOp::Eq), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "!=".to_string(), + left_bp: 9, + right_bp: 10, + binop: Some(BinOp::Ne), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "<".to_string(), + left_bp: 11, + right_bp: 12, + binop: Some(BinOp::Lt), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: ">".to_string(), + left_bp: 11, + right_bp: 12, + binop: Some(BinOp::Gt), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "<=".to_string(), + left_bp: 11, + right_bp: 12, + binop: Some(BinOp::Le), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: ">=".to_string(), + left_bp: 11, + right_bp: 12, + binop: Some(BinOp::Ge), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "+".to_string(), + left_bp: 13, + right_bp: 14, + binop: Some(BinOp::Add), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "-".to_string(), + left_bp: 13, + right_bp: 14, + binop: Some(BinOp::Sub), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "*".to_string(), + left_bp: 15, + right_bp: 16, + binop: Some(BinOp::Mul), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "/".to_string(), + left_bp: 15, + right_bp: 16, + binop: Some(BinOp::Div), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "%".to_string(), + left_bp: 15, + right_bp: 16, + binop: Some(BinOp::Mod), + algebra_field: None, +})]) + }; + } CACHED.with(|c| c.clone()) } diff --git a/src/v2/stage0/src/extdeps_languages_go_types.rs b/src/v2/stage0/src/extdeps_languages_go_types.rs index f76a6e48558..71c584f3f82 100644 --- a/src/v2/stage0/src/extdeps_languages_go_types.rs +++ b/src/v2/stage0/src/extdeps_languages_go_types.rs @@ -1,12 +1,12 @@ // Generated by v2 compiler -- do not edit. // Source module: extdeps.languages.go.types -pub use crate::std_coercion::{CallableRepr, CastSyntax, InhabitantDecl, TypeCheckpoint}; -use crate::v2_rt; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::std_coercion::{TypeCheckpoint, InhabitantDecl, CallableRepr, CastSyntax}; pub fn go_type_checkpoints() -> Rc>> { thread_local! { @@ -74,9 +74,7 @@ pub fn nil_literal() -> String { CACHED.with(|c| c.clone()) } -pub fn visibility_by_case() -> bool { - true -} +pub fn visibility_by_case() -> bool { true } pub fn embedded_field_syntax() -> String { thread_local! { diff --git a/src/v2/stage0/src/extdeps_languages_python_emit.rs b/src/v2/stage0/src/extdeps_languages_python_emit.rs index 67bdcccec21..be02c40f3e0 100644 --- a/src/v2/stage0/src/extdeps_languages_python_emit.rs +++ b/src/v2/stage0/src/extdeps_languages_python_emit.rs @@ -1,11 +1,11 @@ // Generated by v2 compiler -- do not edit. // Source module: extdeps.languages.python.emit -use crate::v2_rt; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; pub fn python_keywords() -> Rc> { thread_local! { diff --git a/src/v2/stage0/src/extdeps_languages_python_syntax.rs b/src/v2/stage0/src/extdeps_languages_python_syntax.rs index 6fdeb0197c0..f70c8c577e9 100644 --- a/src/v2/stage0/src/extdeps_languages_python_syntax.rs +++ b/src/v2/stage0/src/extdeps_languages_python_syntax.rs @@ -1,166 +1,160 @@ // Generated by v2 compiler -- do not edit. // Source module: extdeps.languages.python.syntax -use crate::std_syntax::AlgebraFieldKind::{AlgQuotient, AlgReciprocal}; -use crate::std_syntax::BinOp::{ - Add, And, Div, Eq, Ge, Gt, Le, Lt, Mod, Mul, Ne, NullCoalesce, Or, Sub, -}; -use crate::std_syntax::BodyKind::{BlockBody, NoBody, TypeBody}; -use crate::std_syntax::ItemFormKind::{ - EnumForm, FuncForm, ModuleForm, OtherForm, StructForm, TypeAliasForm, -}; -pub use crate::std_syntax::{ - AlgebraFieldKind, BinOp, BodyKind, ItemForm, ItemFormKind, OperatorSpec, -}; -use crate::v2_rt; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::std_syntax::{ItemForm, ItemFormKind, BodyKind, OperatorSpec, BinOp, AlgebraFieldKind}; +use crate::std_syntax::ItemFormKind::{FuncForm, StructForm, EnumForm, TypeAliasForm, ModuleForm, OtherForm}; +use crate::std_syntax::BodyKind::{BlockBody, TypeBody, NoBody}; +use crate::std_syntax::BinOp::{Add, Sub, Mul, Div, Mod, Eq, Ne, Lt, Gt, Le, Ge, And, Or, NullCoalesce}; +use crate::std_syntax::AlgebraFieldKind::{AlgReciprocal, AlgQuotient}; pub fn python_item_forms() -> Rc>> { thread_local! { - static CACHED: Rc>> = { - Rc::new(vec![Rc::new(ItemForm { - kind: ItemFormKind::FuncForm, - keyword: "def".to_string(), - has_type_params: false, - has_params: true, - has_return_type: true, - return_required: false, - has_uses: false, - body_kind: BodyKind::BlockBody, - }), Rc::new(ItemForm { - kind: ItemFormKind::StructForm, - keyword: "class".to_string(), - has_type_params: false, - has_params: false, - has_return_type: false, - return_required: false, - has_uses: false, - body_kind: BodyKind::BlockBody, - }), Rc::new(ItemForm { - kind: ItemFormKind::EnumForm, - keyword: "class".to_string(), - has_type_params: false, - has_params: false, - has_return_type: false, - return_required: false, - has_uses: false, - body_kind: BodyKind::BlockBody, - }), Rc::new(ItemForm { - kind: ItemFormKind::TypeAliasForm, - keyword: "".to_string(), - has_type_params: false, - has_params: false, - has_return_type: false, - return_required: false, - has_uses: false, - body_kind: BodyKind::NoBody, - }), Rc::new(ItemForm { - kind: ItemFormKind::ModuleForm, - keyword: "".to_string(), - has_type_params: false, - has_params: false, - has_return_type: false, - return_required: false, - has_uses: false, - body_kind: BodyKind::NoBody, - })]) - }; - } + static CACHED: Rc>> = { + Rc::new(vec![Rc::new(ItemForm { + kind: ItemFormKind::FuncForm, + keyword: "def".to_string(), + has_type_params: false, + has_params: true, + has_return_type: true, + return_required: false, + has_uses: false, + body_kind: BodyKind::BlockBody, +}), Rc::new(ItemForm { + kind: ItemFormKind::StructForm, + keyword: "class".to_string(), + has_type_params: false, + has_params: false, + has_return_type: false, + return_required: false, + has_uses: false, + body_kind: BodyKind::BlockBody, +}), Rc::new(ItemForm { + kind: ItemFormKind::EnumForm, + keyword: "class".to_string(), + has_type_params: false, + has_params: false, + has_return_type: false, + return_required: false, + has_uses: false, + body_kind: BodyKind::BlockBody, +}), Rc::new(ItemForm { + kind: ItemFormKind::TypeAliasForm, + keyword: "".to_string(), + has_type_params: false, + has_params: false, + has_return_type: false, + return_required: false, + has_uses: false, + body_kind: BodyKind::NoBody, +}), Rc::new(ItemForm { + kind: ItemFormKind::ModuleForm, + keyword: "".to_string(), + has_type_params: false, + has_params: false, + has_return_type: false, + return_required: false, + has_uses: false, + body_kind: BodyKind::NoBody, +})]) + }; + } CACHED.with(|c| c.clone()) } pub fn python_operators() -> Rc>> { thread_local! { - static CACHED: Rc>> = { - Rc::new(vec![Rc::new(OperatorSpec { - symbol: "or".to_string(), - left_bp: 5, - right_bp: 6, - binop: Some(BinOp::Or), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "and".to_string(), - left_bp: 7, - right_bp: 8, - binop: Some(BinOp::And), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "==".to_string(), - left_bp: 9, - right_bp: 10, - binop: Some(BinOp::Eq), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "!=".to_string(), - left_bp: 9, - right_bp: 10, - binop: Some(BinOp::Ne), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "<".to_string(), - left_bp: 11, - right_bp: 12, - binop: Some(BinOp::Lt), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: ">".to_string(), - left_bp: 11, - right_bp: 12, - binop: Some(BinOp::Gt), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "<=".to_string(), - left_bp: 11, - right_bp: 12, - binop: Some(BinOp::Le), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: ">=".to_string(), - left_bp: 11, - right_bp: 12, - binop: Some(BinOp::Ge), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "+".to_string(), - left_bp: 13, - right_bp: 14, - binop: Some(BinOp::Add), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "-".to_string(), - left_bp: 13, - right_bp: 14, - binop: Some(BinOp::Sub), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "*".to_string(), - left_bp: 15, - right_bp: 16, - binop: Some(BinOp::Mul), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "/".to_string(), - left_bp: 15, - right_bp: 16, - binop: Some(BinOp::Div), - algebra_field: Some(AlgebraFieldKind::AlgReciprocal), - }), Rc::new(OperatorSpec { - symbol: "//".to_string(), - left_bp: 15, - right_bp: 16, - binop: Some(BinOp::Div), - algebra_field: Some(AlgebraFieldKind::AlgQuotient), - }), Rc::new(OperatorSpec { - symbol: "%".to_string(), - left_bp: 15, - right_bp: 16, - binop: Some(BinOp::Mod), - algebra_field: None, - })]) - }; - } + static CACHED: Rc>> = { + Rc::new(vec![Rc::new(OperatorSpec { + symbol: "or".to_string(), + left_bp: 5, + right_bp: 6, + binop: Some(BinOp::Or), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "and".to_string(), + left_bp: 7, + right_bp: 8, + binop: Some(BinOp::And), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "==".to_string(), + left_bp: 9, + right_bp: 10, + binop: Some(BinOp::Eq), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "!=".to_string(), + left_bp: 9, + right_bp: 10, + binop: Some(BinOp::Ne), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "<".to_string(), + left_bp: 11, + right_bp: 12, + binop: Some(BinOp::Lt), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: ">".to_string(), + left_bp: 11, + right_bp: 12, + binop: Some(BinOp::Gt), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "<=".to_string(), + left_bp: 11, + right_bp: 12, + binop: Some(BinOp::Le), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: ">=".to_string(), + left_bp: 11, + right_bp: 12, + binop: Some(BinOp::Ge), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "+".to_string(), + left_bp: 13, + right_bp: 14, + binop: Some(BinOp::Add), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "-".to_string(), + left_bp: 13, + right_bp: 14, + binop: Some(BinOp::Sub), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "*".to_string(), + left_bp: 15, + right_bp: 16, + binop: Some(BinOp::Mul), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "/".to_string(), + left_bp: 15, + right_bp: 16, + binop: Some(BinOp::Div), + algebra_field: Some(AlgebraFieldKind::AlgReciprocal), +}), Rc::new(OperatorSpec { + symbol: "//".to_string(), + left_bp: 15, + right_bp: 16, + binop: Some(BinOp::Div), + algebra_field: Some(AlgebraFieldKind::AlgQuotient), +}), Rc::new(OperatorSpec { + symbol: "%".to_string(), + left_bp: 15, + right_bp: 16, + binop: Some(BinOp::Mod), + algebra_field: None, +})]) + }; + } CACHED.with(|c| c.clone()) } diff --git a/src/v2/stage0/src/extdeps_languages_python_types.rs b/src/v2/stage0/src/extdeps_languages_python_types.rs index c770af67413..3d5b6ca151f 100644 --- a/src/v2/stage0/src/extdeps_languages_python_types.rs +++ b/src/v2/stage0/src/extdeps_languages_python_types.rs @@ -1,13 +1,13 @@ // Generated by v2 compiler -- do not edit. // Source module: extdeps.languages.python.types -use self::PythonTypeKind::*; -pub use crate::std_coercion::{CallableRepr, CastSyntax, InhabitantDecl, TypeCheckpoint}; -use crate::v2_rt; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::std_coercion::{TypeCheckpoint, InhabitantDecl, CallableRepr, CastSyntax}; +use self::PythonTypeKind::*; pub fn python_type_checkpoints() -> Rc>> { thread_local! { diff --git a/src/v2/stage0/src/extdeps_languages_rust_emit.rs b/src/v2/stage0/src/extdeps_languages_rust_emit.rs index 5e4c2f0bd8a..6e28fab40d4 100644 --- a/src/v2/stage0/src/extdeps_languages_rust_emit.rs +++ b/src/v2/stage0/src/extdeps_languages_rust_emit.rs @@ -1,11 +1,11 @@ // Generated by v2 compiler -- do not edit. // Source module: extdeps.languages.rust.emit -use crate::v2_rt; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; pub fn rust_keywords() -> Rc> { thread_local! { @@ -59,32 +59,11 @@ pub fn rust_simple_method_specs() -> Rc>> { } pub fn rust_method_templates() -> Rc> { - rust_simple_method_specs().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, spec: Rc| { - v2_rt::rc_map_insert(acc, spec.method_name.clone(), spec.template.clone()) - }, - ) + rust_simple_method_specs().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, spec: Rc| v2_rt::rc_map_insert(acc, spec.method_name.clone(), spec.template.clone())) } pub fn rust_method_wraps_result() -> Rc> { - Rc::new({ - let mut __result = Vec::new(); - for s in rust_simple_method_specs().iter().cloned() { - if s.wraps_result.clone() { - __result.push(s); - } - } - __result - }) - .iter() - .cloned() - .fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, spec: Rc| { - v2_rt::rc_map_insert(acc, spec.method_name.clone(), true) - }, - ) + Rc::new({ let mut __result = Vec::new(); for s in rust_simple_method_specs().iter().cloned() { if s.wraps_result.clone() { __result.push(s); } } __result }).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, spec: Rc| v2_rt::rc_map_insert(acc, spec.method_name.clone(), true)) } pub fn rust_reserved() -> Rc> { @@ -430,72 +409,19 @@ pub fn rt_function_registry() -> Rc>> { } pub fn rt_functions() -> Rc> { - rt_function_registry().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, entry: Rc| { - v2_rt::rc_map_insert(acc, entry.name.clone(), true) - }, - ) + rt_function_registry().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, entry: Rc| v2_rt::rc_map_insert(acc, entry.name.clone(), true)) } pub fn rt_ref_map_functions() -> Rc> { - Rc::new({ - let mut __result = Vec::new(); - for f in rt_function_registry().iter().cloned() { - if f.passes_by_ref.clone() { - __result.push(f); - } - } - __result - }) - .iter() - .cloned() - .fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, entry: Rc| { - v2_rt::rc_map_insert(acc, entry.name.clone(), true) - }, - ) + Rc::new({ let mut __result = Vec::new(); for f in rt_function_registry().iter().cloned() { if f.passes_by_ref.clone() { __result.push(f); } } __result }).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, entry: Rc| v2_rt::rc_map_insert(acc, entry.name.clone(), true)) } pub fn rt_wraps_result() -> Rc> { - Rc::new({ - let mut __result = Vec::new(); - for f in rt_function_registry().iter().cloned() { - if f.wraps_result.clone() { - __result.push(f); - } - } - __result - }) - .iter() - .cloned() - .fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, entry: Rc| { - v2_rt::rc_map_insert(acc, entry.name.clone(), true) - }, - ) + Rc::new({ let mut __result = Vec::new(); for f in rt_function_registry().iter().cloned() { if f.wraps_result.clone() { __result.push(f); } } __result }).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, entry: Rc| v2_rt::rc_map_insert(acc, entry.name.clone(), true)) } pub fn rt_bridge_function_names() -> Rc> { - Rc::new({ - let mut __result = Vec::new(); - for f in rt_function_registry().iter().cloned() { - if (f.name.clone().as_str() != f.bridge_name.clone().as_str()) { - __result.push(f); - } - } - __result - }) - .iter() - .cloned() - .fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, entry: Rc| { - v2_rt::rc_map_insert(acc, entry.name.clone(), entry.bridge_name.clone()) - }, - ) + Rc::new({ let mut __result = Vec::new(); for f in rt_function_registry().iter().cloned() { if (f.name.clone().as_str() != f.bridge_name.clone().as_str()) { __result.push(f); } } __result }).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, entry: Rc| v2_rt::rc_map_insert(acc, entry.name.clone(), entry.bridge_name.clone())) } pub fn is_rt_function(name: String) -> bool { @@ -504,9 +430,9 @@ pub fn is_rt_function(name: String) -> bool { pub fn rt_bridge_name(name: String) -> String { match v2_rt::map_get(&rt_bridge_function_names(), name.clone()) { - Some(bridge) => bridge.clone(), - None => name.clone(), - } + Some(bridge) => bridge.clone(), + None => name.clone(), +} } pub fn rt_passes_by_ref(name: String) -> bool { diff --git a/src/v2/stage0/src/extdeps_languages_rust_syntax.rs b/src/v2/stage0/src/extdeps_languages_rust_syntax.rs index 41e62fe19b4..7ee94af98c8 100644 --- a/src/v2/stage0/src/extdeps_languages_rust_syntax.rs +++ b/src/v2/stage0/src/extdeps_languages_rust_syntax.rs @@ -1,124 +1,120 @@ // Generated by v2 compiler -- do not edit. // Source module: extdeps.languages.rust.syntax -use crate::std_syntax::BinOp::{Add, And, Div, Eq, Ge, Gt, Le, Lt, Mod, Mul, Ne, Or, Sub}; -use crate::std_syntax::BodyKind::{BlockBody, ExprBody, NoBody, TypeBody}; -use crate::std_syntax::ItemFormKind::{ - EnumForm, FuncForm, ModuleForm, OtherForm, StructForm, TypeAliasForm, -}; -use crate::std_syntax::LiteralValue::LitBool; -pub use crate::std_syntax::{ - BinOp, BodyKind, ItemForm, ItemFormKind, LiteralValue, OperatorSpec, SyntaxSpec, -}; -use crate::v2_rt; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::std_syntax::{ItemForm, ItemFormKind, BodyKind, OperatorSpec, SyntaxSpec, BinOp, LiteralValue}; +use crate::std_syntax::ItemFormKind::{FuncForm, StructForm, EnumForm, TypeAliasForm, ModuleForm, OtherForm}; +use crate::std_syntax::BodyKind::{ExprBody, BlockBody, TypeBody, NoBody}; +use crate::std_syntax::BinOp::{Add, Sub, Mul, Div, Mod, Eq, Ne, Lt, Gt, Le, Ge, And, Or}; +use crate::std_syntax::LiteralValue::{LitBool}; pub fn rust_item_forms() -> Rc>> { thread_local! { - static CACHED: Rc>> = { - Rc::new(vec![Rc::new(ItemForm { - kind: ItemFormKind::FuncForm, - keyword: "fn".to_string(), - has_type_params: true, - has_params: true, - has_return_type: true, - return_required: false, - has_uses: false, - body_kind: BodyKind::BlockBody, - }), Rc::new(ItemForm { - kind: ItemFormKind::StructForm, - keyword: "struct".to_string(), - has_type_params: true, - has_params: false, - has_return_type: false, - return_required: false, - has_uses: false, - body_kind: BodyKind::TypeBody, - }), Rc::new(ItemForm { - kind: ItemFormKind::EnumForm, - keyword: "enum".to_string(), - has_type_params: true, - has_params: false, - has_return_type: false, - return_required: false, - has_uses: false, - body_kind: BodyKind::TypeBody, - }), Rc::new(ItemForm { - kind: ItemFormKind::TypeAliasForm, - keyword: "type".to_string(), - has_type_params: true, - has_params: false, - has_return_type: false, - return_required: false, - has_uses: false, - body_kind: BodyKind::NoBody, - }), Rc::new(ItemForm { - kind: ItemFormKind::OtherForm, - keyword: "trait".to_string(), - has_type_params: true, - has_params: false, - has_return_type: false, - return_required: false, - has_uses: false, - body_kind: BodyKind::BlockBody, - }), Rc::new(ItemForm { - kind: ItemFormKind::OtherForm, - keyword: "impl".to_string(), - has_type_params: true, - has_params: false, - has_return_type: false, - return_required: false, - has_uses: false, - body_kind: BodyKind::BlockBody, - }), Rc::new(ItemForm { - kind: ItemFormKind::OtherForm, - keyword: "const".to_string(), - has_type_params: false, - has_params: false, - has_return_type: true, - return_required: true, - has_uses: false, - body_kind: BodyKind::ExprBody, - }), Rc::new(ItemForm { - kind: ItemFormKind::OtherForm, - keyword: "static".to_string(), - has_type_params: false, - has_params: false, - has_return_type: true, - return_required: true, - has_uses: false, - body_kind: BodyKind::ExprBody, - }), Rc::new(ItemForm { - kind: ItemFormKind::ModuleForm, - keyword: "mod".to_string(), - has_type_params: false, - has_params: false, - has_return_type: false, - return_required: false, - has_uses: false, - body_kind: BodyKind::BlockBody, - })]) - }; - } + static CACHED: Rc>> = { + Rc::new(vec![Rc::new(ItemForm { + kind: ItemFormKind::FuncForm, + keyword: "fn".to_string(), + has_type_params: true, + has_params: true, + has_return_type: true, + return_required: false, + has_uses: false, + body_kind: BodyKind::BlockBody, +}), Rc::new(ItemForm { + kind: ItemFormKind::StructForm, + keyword: "struct".to_string(), + has_type_params: true, + has_params: false, + has_return_type: false, + return_required: false, + has_uses: false, + body_kind: BodyKind::TypeBody, +}), Rc::new(ItemForm { + kind: ItemFormKind::EnumForm, + keyword: "enum".to_string(), + has_type_params: true, + has_params: false, + has_return_type: false, + return_required: false, + has_uses: false, + body_kind: BodyKind::TypeBody, +}), Rc::new(ItemForm { + kind: ItemFormKind::TypeAliasForm, + keyword: "type".to_string(), + has_type_params: true, + has_params: false, + has_return_type: false, + return_required: false, + has_uses: false, + body_kind: BodyKind::NoBody, +}), Rc::new(ItemForm { + kind: ItemFormKind::OtherForm, + keyword: "trait".to_string(), + has_type_params: true, + has_params: false, + has_return_type: false, + return_required: false, + has_uses: false, + body_kind: BodyKind::BlockBody, +}), Rc::new(ItemForm { + kind: ItemFormKind::OtherForm, + keyword: "impl".to_string(), + has_type_params: true, + has_params: false, + has_return_type: false, + return_required: false, + has_uses: false, + body_kind: BodyKind::BlockBody, +}), Rc::new(ItemForm { + kind: ItemFormKind::OtherForm, + keyword: "const".to_string(), + has_type_params: false, + has_params: false, + has_return_type: true, + return_required: true, + has_uses: false, + body_kind: BodyKind::ExprBody, +}), Rc::new(ItemForm { + kind: ItemFormKind::OtherForm, + keyword: "static".to_string(), + has_type_params: false, + has_params: false, + has_return_type: true, + return_required: true, + has_uses: false, + body_kind: BodyKind::ExprBody, +}), Rc::new(ItemForm { + kind: ItemFormKind::ModuleForm, + keyword: "mod".to_string(), + has_type_params: false, + has_params: false, + has_return_type: false, + return_required: false, + has_uses: false, + body_kind: BodyKind::BlockBody, +})]) + }; + } CACHED.with(|c| c.clone()) } pub fn rust_keyword_literals() -> Rc>> { thread_local! { - static CACHED: Rc>> = { - let mut __m = HashMap::new(); - __m.insert("true".to_string(), Rc::new(LiteralValue::LitBool { - value: true, - })); - __m.insert("false".to_string(), Rc::new(LiteralValue::LitBool { - value: false, - })); - Rc::new(__m) - }; - } + static CACHED: Rc>> = { + let mut __m = HashMap::new(); + __m.insert("true".to_string(), Rc::new(LiteralValue::LitBool { + value: true, +})); + __m.insert("false".to_string(), Rc::new(LiteralValue::LitBool { + value: false, +})); + Rc::new(__m) + }; + } CACHED.with(|c| c.clone()) } @@ -171,107 +167,107 @@ pub fn rust_keyword_set() -> Rc> { pub fn rust_operators() -> Rc>> { thread_local! { - static CACHED: Rc>> = { - Rc::new(vec![Rc::new(OperatorSpec { - symbol: "||".to_string(), - left_bp: 5, - right_bp: 6, - binop: Some(BinOp::Or), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "&&".to_string(), - left_bp: 7, - right_bp: 8, - binop: Some(BinOp::And), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "==".to_string(), - left_bp: 9, - right_bp: 10, - binop: Some(BinOp::Eq), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "!=".to_string(), - left_bp: 9, - right_bp: 10, - binop: Some(BinOp::Ne), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "<".to_string(), - left_bp: 11, - right_bp: 12, - binop: Some(BinOp::Lt), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: ">".to_string(), - left_bp: 11, - right_bp: 12, - binop: Some(BinOp::Gt), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "<=".to_string(), - left_bp: 11, - right_bp: 12, - binop: Some(BinOp::Le), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: ">=".to_string(), - left_bp: 11, - right_bp: 12, - binop: Some(BinOp::Ge), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "+".to_string(), - left_bp: 13, - right_bp: 14, - binop: Some(BinOp::Add), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "-".to_string(), - left_bp: 13, - right_bp: 14, - binop: Some(BinOp::Sub), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "*".to_string(), - left_bp: 15, - right_bp: 16, - binop: Some(BinOp::Mul), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "/".to_string(), - left_bp: 15, - right_bp: 16, - binop: Some(BinOp::Div), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: "%".to_string(), - left_bp: 15, - right_bp: 16, - binop: Some(BinOp::Mod), - algebra_field: None, - }), Rc::new(OperatorSpec { - symbol: ".".to_string(), - left_bp: 19, - right_bp: 20, - binop: None, - algebra_field: None, - })]) - }; - } + static CACHED: Rc>> = { + Rc::new(vec![Rc::new(OperatorSpec { + symbol: "||".to_string(), + left_bp: 5, + right_bp: 6, + binop: Some(BinOp::Or), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "&&".to_string(), + left_bp: 7, + right_bp: 8, + binop: Some(BinOp::And), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "==".to_string(), + left_bp: 9, + right_bp: 10, + binop: Some(BinOp::Eq), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "!=".to_string(), + left_bp: 9, + right_bp: 10, + binop: Some(BinOp::Ne), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "<".to_string(), + left_bp: 11, + right_bp: 12, + binop: Some(BinOp::Lt), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: ">".to_string(), + left_bp: 11, + right_bp: 12, + binop: Some(BinOp::Gt), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "<=".to_string(), + left_bp: 11, + right_bp: 12, + binop: Some(BinOp::Le), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: ">=".to_string(), + left_bp: 11, + right_bp: 12, + binop: Some(BinOp::Ge), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "+".to_string(), + left_bp: 13, + right_bp: 14, + binop: Some(BinOp::Add), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "-".to_string(), + left_bp: 13, + right_bp: 14, + binop: Some(BinOp::Sub), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "*".to_string(), + left_bp: 15, + right_bp: 16, + binop: Some(BinOp::Mul), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "/".to_string(), + left_bp: 15, + right_bp: 16, + binop: Some(BinOp::Div), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: "%".to_string(), + left_bp: 15, + right_bp: 16, + binop: Some(BinOp::Mod), + algebra_field: None, +}), Rc::new(OperatorSpec { + symbol: ".".to_string(), + left_bp: 19, + right_bp: 20, + binop: None, + algebra_field: None, +})]) + }; + } CACHED.with(|c| c.clone()) } pub fn rust_syntax_spec() -> Rc { thread_local! { - static CACHED: Rc = { - Rc::new(SyntaxSpec { - item_forms: rust_item_forms(), - operators: rust_operators(), - keyword_literals: rust_keyword_literals(), - keyword_set: rust_keyword_set(), - }) - }; - } + static CACHED: Rc = { + Rc::new(SyntaxSpec { + item_forms: rust_item_forms(), + operators: rust_operators(), + keyword_literals: rust_keyword_literals(), + keyword_set: rust_keyword_set(), +}) + }; + } CACHED.with(|c| c.clone()) } diff --git a/src/v2/stage0/src/extdeps_languages_rust_types.rs b/src/v2/stage0/src/extdeps_languages_rust_types.rs index dfc86341d78..ff74f611836 100644 --- a/src/v2/stage0/src/extdeps_languages_rust_types.rs +++ b/src/v2/stage0/src/extdeps_languages_rust_types.rs @@ -1,14 +1,14 @@ // Generated by v2 compiler -- do not edit. // Source module: extdeps.languages.rust.types -use self::OwnershipKind::*; -use self::SmartPointerKind::*; -pub use crate::std_coercion::{CallableRepr, CastRule, CastSyntax, InhabitantDecl, TypeCheckpoint}; -use crate::v2_rt; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::std_coercion::{TypeCheckpoint, InhabitantDecl, CallableRepr, CastSyntax, CastRule}; +use self::OwnershipKind::*; +use self::SmartPointerKind::*; pub fn rust_type_checkpoints() -> Rc>> { thread_local! { @@ -76,13 +76,9 @@ pub enum OwnershipKind { RawPtr, } -pub fn pass_copy_by_value() -> bool { - true -} +pub fn pass_copy_by_value() -> bool { true } -pub fn pass_non_copy_by_ref() -> bool { - true -} +pub fn pass_non_copy_by_ref() -> bool { true } pub fn ref_prefix() -> String { thread_local! { diff --git a/src/v2/stage0/src/lib.rs b/src/v2/stage0/src/lib.rs index 3c028a3e16b..972a2b1a8b9 100644 --- a/src/v2/stage0/src/lib.rs +++ b/src/v2/stage0/src/lib.rs @@ -1,78 +1,68 @@ // Generated by v2 compiler -- do not edit. -#![allow( - unused_imports, - unused_variables, - unused_mut, - unused_parens, - dead_code, - unreachable_patterns, - non_shorthand_field_patterns, - suspicious_double_ref_op, - clippy::all -)] +#![allow(unused_imports, unused_variables, unused_mut, unused_parens, dead_code, unreachable_patterns, non_shorthand_field_patterns, suspicious_double_ref_op, clippy::all)] -pub mod cli_run; +pub mod std_error_primitives; +pub mod std_algebra; +pub mod std_types; pub mod extdeps_languages_dag_emit; +pub mod extdeps_languages_go_emit; +pub mod extdeps_languages_python_emit; +pub mod extdeps_languages_rust_emit; +pub mod std_coercion; +pub mod std_http_path; +pub mod std_iteration; +pub mod std_syntax; +pub mod std_termination; +pub mod v2_compiler_runtime_rust; pub mod extdeps_languages_dag_syntax; pub mod extdeps_languages_dag_types; -pub mod extdeps_languages_go_emit; pub mod extdeps_languages_go_syntax; pub mod extdeps_languages_go_types; -pub mod extdeps_languages_python_emit; pub mod extdeps_languages_python_syntax; pub mod extdeps_languages_python_types; -pub mod extdeps_languages_rust_emit; pub mod extdeps_languages_rust_syntax; pub mod extdeps_languages_rust_types; -pub mod rest_transport_facts; -pub mod std_algebra; -pub mod std_coercion; pub mod std_computation; pub mod std_effects; -pub mod std_error_primitives; pub mod std_graph; -pub mod std_http_path; pub mod std_induction; -pub mod std_iteration; +pub mod v2_compiler_effect_derivation; pub mod std_node; -pub mod std_syntax; -pub mod std_termination; -pub mod std_types; +pub mod v2_std_core; pub mod v2_compiler_artifact; +pub mod v2_compiler_infer_env; +pub mod v2_compiler_infer_types; +pub mod v2_compiler_resolve; +pub mod v2_compiler_tokenize; +pub mod v2_compiler_trace; pub mod v2_compiler_coercion; -pub mod v2_compiler_compile; -pub mod v2_compiler_compiler_tests_rust; -pub mod v2_compiler_complexity; -pub mod v2_compiler_effect_derivation; -pub mod v2_compiler_emit; -pub mod v2_compiler_emit_go; -pub mod v2_compiler_emit_python; -pub mod v2_compiler_emit_rust; -pub mod v2_compiler_infer; pub mod v2_compiler_infer_access; pub mod v2_compiler_infer_cycle; pub mod v2_compiler_infer_emit_info; -pub mod v2_compiler_infer_env; -pub mod v2_compiler_infer_items; -pub mod v2_compiler_infer_lookup; pub mod v2_compiler_infer_method; pub mod v2_compiler_infer_patterns; pub mod v2_compiler_infer_resolve; -pub mod v2_compiler_infer_service; pub mod v2_compiler_infer_sigs; -pub mod v2_compiler_infer_types; pub mod v2_compiler_languages; pub mod v2_compiler_normalize; -pub mod v2_compiler_ownership; +pub mod v2_compiler_compiler_tests_rust; +pub mod v2_compiler_infer_items; pub mod v2_compiler_parse; -pub mod v2_compiler_resolve; -pub mod v2_compiler_runtime_rust; -pub mod v2_compiler_tokenize; -pub mod v2_compiler_trace; -pub mod v2_interpreter; +pub mod v2_compiler_infer_service; +pub mod v2_compiler_infer_lookup; +pub mod v2_compiler_infer; +pub mod v2_compiler_emit; +pub mod v2_compiler_complexity; +pub mod v2_compiler_emit_go; +pub mod v2_compiler_emit_python; +pub mod v2_compiler_ownership; +pub mod v2_compiler_emit_rust; +pub mod v2_compiler_compile; pub mod v2_rt; -pub mod v2_std_core; +pub mod v2_interpreter; +pub mod cli_run; +pub mod rest_transport_facts; #[derive(Debug, Clone, PartialEq)] pub struct NonEmptyVec(Vec); diff --git a/src/v2/stage0/src/main.rs b/src/v2/stage0/src/main.rs index 229429e5f0d..ec899eedd43 100644 --- a/src/v2/stage0/src/main.rs +++ b/src/v2/stage0/src/main.rs @@ -6,14 +6,15 @@ use clap::{Parser, Subcommand}; use std::collections::HashMap; use std::rc::Rc; -use v2_compiler::cli_run; -use v2_compiler::v2_compiler_artifact; use v2_compiler::v2_compiler_compile; use v2_compiler::v2_compiler_compile::PipelineResult; +use v2_compiler::v2_compiler_artifact; use v2_compiler::v2_std_core::{ - byte_to_line_col, diagnostic_to_message, diagnostic_to_span, source_line_at, - CompilerDiagnostic, NewlineIndex, + diagnostic_to_message, diagnostic_to_span, + byte_to_line_col, source_line_at, NewlineIndex, + CompilerDiagnostic, }; +use v2_compiler::cli_run; #[derive(Parser)] #[command(name = "v2-compiled", about = "Generated CLI from DAG compiler")] @@ -42,7 +43,7 @@ enum Commands { #[arg(long, default_value = "rust")] target: String, }, - /// Execute a .dag program directly (interpreter) +/// Execute a .dag program directly (interpreter) Run { /// Source root directories (searched recursively for .dag files) #[arg(long = "source-root")] @@ -117,10 +118,8 @@ fn build_module_index(source_roots: &[String]) -> HashMap { +let _result = match cli.command { + Commands::Compile { source_roots, source_dir, output_dir, target } => { let render_target = match target.as_str() { "rust" => v2_compiler_artifact::RenderTarget::Rust, "python" => v2_compiler_artifact::RenderTarget::Python, "go" => v2_compiler_artifact::RenderTarget::Go, "dag" => v2_compiler_artifact::RenderTarget::Dag, other => { - eprintln!( - "unknown target: {}. supported: rust, python, go, dag", - other - ); + eprintln!("unknown target: {}. supported: rust, python, go, dag", other); std::process::exit(1); } }; @@ -195,11 +183,7 @@ fn main() { let sources = if !source_roots.is_empty() { // FF-9: Import-driven resolution from source roots let index = build_module_index(&source_roots); - eprintln!( - "indexed {} modules from {} source roots", - index.len(), - source_roots.len() - ); + eprintln!("indexed {} modules from {} source roots", index.len(), source_roots.len()); // Entry modules: all .dag files in the FIRST source root. // Additional roots are dependency pools resolved via imports. @@ -237,11 +221,9 @@ fn main() { resolved.push(Rc::new(v2_compiler_compile::SourceFile { path, content })); } } - eprintln!( - "resolved {} sources (transitive import closure)", - resolved.len() - ); + eprintln!("resolved {} sources (transitive import closure)", resolved.len()); resolved + } else if let Some(dir) = source_dir { // Legacy: flat directory scan (backward compatibility) let mut dag_paths = Vec::new(); @@ -256,13 +238,9 @@ fn main() { content, })); } - eprintln!( - "compiling {} .dag files from {} (target: {})", - sources.len(), - dir, - target - ); + eprintln!("compiling {} .dag files from {} (target: {})", sources.len(), dir, target); sources + } else { eprintln!("error: provide --source-root or --source-dir"); std::process::exit(1); @@ -280,18 +258,12 @@ fn main() { std::fs::write(&out_path, &*file.content) .unwrap_or_else(|e| panic!("failed to write {}: {}", file.path, e)); } - eprintln!( - "compiled: {} files emitted, {} diagnostics", - result.files.len(), - result.diagnostics.len() - ); + eprintln!("compiled: {} files emitted, {} diagnostics", + result.files.len(), result.diagnostics.len()); render_diagnostics(&result); // Complexity violations are non-blocking (analyzer limitations). let hard_errors = result.diagnostics.iter().any(|d| { - !matches!( - *d.diagnostic.clone(), - CompilerDiagnostic::ComplexityUnknown { .. } - ) + !matches!(*d.diagnostic.clone(), CompilerDiagnostic::ComplexityUnknown { .. }) }); if hard_errors { std::process::exit(1); @@ -300,14 +272,11 @@ fn main() { eprintln!("error: no files emitted"); std::process::exit(1); } - } + }, - Commands::Run { - source_roots, - function, - } => { + Commands::Run { source_roots, function } => { cli_run::handle_run(source_roots, function); - } + }, }; } @@ -373,10 +342,7 @@ fn render_one_diagnostic( indent, " ".repeat(gutter_width), " ".repeat(col_offset), - "^".repeat(std::cmp::min( - span_len, - line_text.len().saturating_sub(col_offset) - )) + "^".repeat(std::cmp::min(span_len, line_text.len().saturating_sub(col_offset))) ); } } diff --git a/src/v2/stage0/src/std_algebra.rs b/src/v2/stage0/src/std_algebra.rs index 79a76b38881..b22a860893a 100644 --- a/src/v2/stage0/src/std_algebra.rs +++ b/src/v2/stage0/src/std_algebra.rs @@ -1,20 +1,20 @@ // Generated by v2 compiler -- do not edit. // Source module: std.algebra +use std::collections::HashMap; +use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::std_error_primitives::{DivError, Result}; +use crate::std_error_primitives::DivError::*; +use crate::std_error_primitives::Result::*; +use self::Ordering::*; use self::AlgebraProfile::*; +use self::ContainerSource::*; use self::AlgebraTypeTemplate::*; use self::CollectionSizeEffect::*; -use self::ContainerSource::*; use self::CostShape::*; -use self::Ordering::*; -use crate::std_error_primitives::DivError::*; -use crate::std_error_primitives::Result::*; -pub use crate::std_error_primitives::{DivError, Result}; -use crate::v2_rt; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; -use std::collections::HashMap; -use std::rc::Rc; #[derive(Clone)] pub struct Magma { @@ -79,8 +79,6 @@ pub struct OrderedRing { pub div: Rc Rc>>, pub one: Box, pub compare: Rc Ordering>, - pub quotient: Rc T>, - pub remainder: Rc T>, pub eq: Rc bool>, pub ne: Rc bool>, pub lt: Rc bool>, @@ -128,7 +126,6 @@ pub struct FreeMonoid { pub concat: Rc>, Rc>) -> Rc>>, pub empty: Rc>, pub append: Rc Rc>>, - pub index: Rc T>, pub slice: Rc Rc>>, pub length: Rc i64>, pub count: Rc i64>, @@ -186,7 +183,9 @@ pub enum AlgebraProfile { #[serde(tag = "_variant")] pub enum ContainerSource { SameAsReceiver, - Named { name: String }, + Named { + name: String, + }, } impl ContainerSource { pub fn name(&self) -> String { @@ -272,1129 +271,852 @@ pub fn kernel_algebra_profile() -> Rc> { } pub fn ordered_ring_templates() -> Rc>> { - Rc::new(vec![ - Rc::new(AlgebraFieldTemplate { - name: "add".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - ]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "zero".to_string(), - param_types: Rc::new(vec![]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "negate".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "mul".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - ]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "one".to_string(), - param_types: Rc::new(vec![]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "compare".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - ]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Ordering".to_string(), - }), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "quotient".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - ]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "remainder".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - ]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "clamp".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - ]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: Some(CostShape::ShapeConstant), - callback_element_position: None, - }), - ]) + Rc::new(vec![Rc::new(AlgebraFieldTemplate { + name: "add".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "zero".to_string(), + param_types: Rc::new(vec![]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "negate".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "mul".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "one".to_string(), + param_types: Rc::new(vec![]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "compare".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Ordering".to_string(), +}), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "clamp".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: Some(CostShape::ShapeConstant), + callback_element_position: None, +})]) } pub fn approximate_field_templates() -> Rc>> { - Rc::new(vec![ - Rc::new(AlgebraFieldTemplate { - name: "add".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - ]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "zero".to_string(), - param_types: Rc::new(vec![]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "negate".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "mul".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - ]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "one".to_string(), - param_types: Rc::new(vec![]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "reciprocal".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "compare".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - ]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Ordering".to_string(), - }), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - ]) + Rc::new(vec![Rc::new(AlgebraFieldTemplate { + name: "add".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "zero".to_string(), + param_types: Rc::new(vec![]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "negate".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "mul".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "one".to_string(), + param_types: Rc::new(vec![]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "reciprocal".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "compare".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Ordering".to_string(), +}), + size_effect: None, + cost_shape: None, + callback_element_position: None, +})]) } pub fn boolean_algebra_templates() -> Rc>> { - Rc::new(vec![ - Rc::new(AlgebraFieldTemplate { - name: "meet".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - ]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "join".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - ]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "complement".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "top".to_string(), - param_types: Rc::new(vec![]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "bottom".to_string(), - param_types: Rc::new(vec![]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - ]) + Rc::new(vec![Rc::new(AlgebraFieldTemplate { + name: "meet".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "join".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "complement".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "top".to_string(), + param_types: Rc::new(vec![]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "bottom".to_string(), + param_types: Rc::new(vec![]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, +})]) } pub fn boolean_algebra_collection_templates() -> Rc>> { - Rc::new(vec![ - Rc::new(AlgebraFieldTemplate { - name: "union".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - ]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "intersect".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - ]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "diff".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - ]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "member".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverElement), - ]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), - }), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "contains".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverElement), - ]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), - }), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "filter".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::CallableOf { - params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), - }), - }), - ]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: Some(CollectionSizeEffect::IdentityEffect), - cost_shape: Some(CostShape::ShapeIterateBody), - callback_element_position: Some(0), - }), - Rc::new(AlgebraFieldTemplate { - name: "map".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::CallableOf { - params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), - return_type: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { - id: "MappedElement".to_string(), - }), - }), - ]), - return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { - source: Rc::new(ContainerSource::SameAsReceiver), - element: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { - id: "MappedElement".to_string(), - }), - }), - size_effect: None, - cost_shape: Some(CostShape::ShapeIterateBody), - callback_element_position: Some(0), - }), - Rc::new(AlgebraFieldTemplate { - name: "flat_map".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::CallableOf { - params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), - return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { - source: Rc::new(ContainerSource::SameAsReceiver), - element: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { - id: "MappedElement".to_string(), - }), - }), - }), - ]), - return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { - source: Rc::new(ContainerSource::SameAsReceiver), - element: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { - id: "MappedElement".to_string(), - }), - }), - size_effect: None, - cost_shape: Some(CostShape::ShapeIterateBody), - callback_element_position: Some(0), - }), - Rc::new(AlgebraFieldTemplate { - name: "fold".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { - id: "FoldAccumulator".to_string(), - }), - Rc::new(AlgebraTypeTemplate::CallableOf { - params: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { - id: "FoldAccumulator".to_string(), - }), - Rc::new(AlgebraTypeTemplate::ReceiverElement), - ]), - return_type: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { - id: "FoldAccumulator".to_string(), - }), - }), - ]), - return_type: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { - id: "FoldAccumulator".to_string(), - }), - size_effect: None, - cost_shape: Some(CostShape::ShapeIterateBody), - callback_element_position: Some(1), - }), - Rc::new(AlgebraFieldTemplate { - name: "any".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::CallableOf { - params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), - }), - }), - ]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), - }), - size_effect: None, - cost_shape: Some(CostShape::ShapeIterateBody), - callback_element_position: Some(0), - }), - Rc::new(AlgebraFieldTemplate { - name: "all".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::CallableOf { - params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), - }), - }), - ]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), - }), - size_effect: None, - cost_shape: Some(CostShape::ShapeIterateBody), - callback_element_position: Some(0), - }), - Rc::new(AlgebraFieldTemplate { - name: "count".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Int".to_string(), - }), - size_effect: None, - cost_shape: Some(CostShape::ShapeLinearScan), - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "length".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Int".to_string(), - }), - size_effect: None, - cost_shape: Some(CostShape::ShapeLinearScan), - callback_element_position: None, - }), - ]) + Rc::new(vec![Rc::new(AlgebraFieldTemplate { + name: "union".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "intersect".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "diff".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "member".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverElement)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), +}), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "contains".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverElement)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), +}), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "filter".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::CallableOf { + params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), +}), +})]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: Some(CollectionSizeEffect::IdentityEffect), + cost_shape: Some(CostShape::ShapeIterateBody), + callback_element_position: Some(0), +}), Rc::new(AlgebraFieldTemplate { + name: "map".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::CallableOf { + params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), + return_type: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { + id: "MappedElement".to_string(), +}), +})]), + return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { + source: Rc::new(ContainerSource::SameAsReceiver), + element: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { + id: "MappedElement".to_string(), +}), +}), + size_effect: None, + cost_shape: Some(CostShape::ShapeIterateBody), + callback_element_position: Some(0), +}), Rc::new(AlgebraFieldTemplate { + name: "flat_map".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::CallableOf { + params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), + return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { + source: Rc::new(ContainerSource::SameAsReceiver), + element: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { + id: "MappedElement".to_string(), +}), +}), +})]), + return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { + source: Rc::new(ContainerSource::SameAsReceiver), + element: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { + id: "MappedElement".to_string(), +}), +}), + size_effect: None, + cost_shape: Some(CostShape::ShapeIterateBody), + callback_element_position: Some(0), +}), Rc::new(AlgebraFieldTemplate { + name: "fold".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { + id: "FoldAccumulator".to_string(), +}), Rc::new(AlgebraTypeTemplate::CallableOf { + params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { + id: "FoldAccumulator".to_string(), +}), Rc::new(AlgebraTypeTemplate::ReceiverElement)]), + return_type: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { + id: "FoldAccumulator".to_string(), +}), +})]), + return_type: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { + id: "FoldAccumulator".to_string(), +}), + size_effect: None, + cost_shape: Some(CostShape::ShapeIterateBody), + callback_element_position: Some(1), +}), Rc::new(AlgebraFieldTemplate { + name: "any".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::CallableOf { + params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), +}), +})]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), +}), + size_effect: None, + cost_shape: Some(CostShape::ShapeIterateBody), + callback_element_position: Some(0), +}), Rc::new(AlgebraFieldTemplate { + name: "all".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::CallableOf { + params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), +}), +})]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), +}), + size_effect: None, + cost_shape: Some(CostShape::ShapeIterateBody), + callback_element_position: Some(0), +}), Rc::new(AlgebraFieldTemplate { + name: "count".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Int".to_string(), +}), + size_effect: None, + cost_shape: Some(CostShape::ShapeLinearScan), + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "length".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Int".to_string(), +}), + size_effect: None, + cost_shape: Some(CostShape::ShapeLinearScan), + callback_element_position: None, +})]) } pub fn free_monoid_scalar_templates() -> Rc>> { - Rc::new(vec![ - Rc::new(AlgebraFieldTemplate { - name: "concat".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - ]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "empty".to_string(), - param_types: Rc::new(vec![]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "length".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Int".to_string(), - }), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "chars".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { - source: Rc::new(ContainerSource::Named { - name: "List".to_string(), - }), - element: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Int".to_string(), - }), - }), - size_effect: None, - cost_shape: Some(CostShape::ShapeLinearScan), - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "split".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - ]), - return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { - source: Rc::new(ContainerSource::Named { - name: "List".to_string(), - }), - element: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - }), - size_effect: None, - cost_shape: Some(CostShape::ShapeLinearScan), - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "join".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ContainerOf { - source: Rc::new(ContainerSource::Named { - name: "List".to_string(), - }), - element: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - }), - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - ]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "contains".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - ]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), - }), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "starts_with".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - ]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), - }), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "ends_with".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - ]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), - }), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "trim".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "to_lower".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "to_upper".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "replace".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - ]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "substring".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Int".to_string(), - }), - Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Int".to_string(), - }), - ]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "to_int".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Int".to_string(), - }), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "to_string".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "reverse".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - ]) + Rc::new(vec![Rc::new(AlgebraFieldTemplate { + name: "concat".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "empty".to_string(), + param_types: Rc::new(vec![]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "length".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Int".to_string(), +}), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "chars".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { + source: Rc::new(ContainerSource::Named { + name: "List".to_string(), +}), + element: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Int".to_string(), +}), +}), + size_effect: None, + cost_shape: Some(CostShape::ShapeLinearScan), + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "split".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { + source: Rc::new(ContainerSource::Named { + name: "List".to_string(), +}), + element: Rc::new(AlgebraTypeTemplate::ReceiverSelf), +}), + size_effect: None, + cost_shape: Some(CostShape::ShapeLinearScan), + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "join".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ContainerOf { + source: Rc::new(ContainerSource::Named { + name: "List".to_string(), +}), + element: Rc::new(AlgebraTypeTemplate::ReceiverSelf), +}), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "contains".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), +}), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "starts_with".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), +}), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "ends_with".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), +}), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "trim".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "to_lower".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "to_upper".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "replace".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "substring".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Int".to_string(), +}), Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Int".to_string(), +})]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "to_int".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Int".to_string(), +}), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "to_string".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "reverse".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, +})]) } pub fn free_monoid_collection_templates() -> Rc>> { - Rc::new(vec![ - Rc::new(AlgebraFieldTemplate { - name: "map".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::CallableOf { - params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), - return_type: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { - id: "MappedElement".to_string(), - }), - }), - ]), - return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { - source: Rc::new(ContainerSource::SameAsReceiver), - element: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { - id: "MappedElement".to_string(), - }), - }), - size_effect: None, - cost_shape: Some(CostShape::ShapeIterateBody), - callback_element_position: Some(0), - }), - Rc::new(AlgebraFieldTemplate { - name: "filter".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::CallableOf { - params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), - }), - }), - ]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: Some(CollectionSizeEffect::IdentityEffect), - cost_shape: Some(CostShape::ShapeIterateBody), - callback_element_position: Some(0), - }), - Rc::new(AlgebraFieldTemplate { - name: "flat_map".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::CallableOf { - params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), - return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { - source: Rc::new(ContainerSource::SameAsReceiver), - element: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { - id: "MappedElement".to_string(), - }), - }), - }), - ]), - return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { - source: Rc::new(ContainerSource::SameAsReceiver), - element: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { - id: "MappedElement".to_string(), - }), - }), - size_effect: None, - cost_shape: Some(CostShape::ShapeIterateBody), - callback_element_position: Some(0), - }), - Rc::new(AlgebraFieldTemplate { - name: "fold".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { - id: "FoldAccumulator".to_string(), - }), - Rc::new(AlgebraTypeTemplate::CallableOf { - params: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { - id: "FoldAccumulator".to_string(), - }), - Rc::new(AlgebraTypeTemplate::ReceiverElement), - ]), - return_type: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { - id: "FoldAccumulator".to_string(), - }), - }), - ]), - return_type: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { - id: "FoldAccumulator".to_string(), - }), - size_effect: None, - cost_shape: Some(CostShape::ShapeIterateBody), - callback_element_position: Some(1), - }), - Rc::new(AlgebraFieldTemplate { - name: "any".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::CallableOf { - params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), - }), - }), - ]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), - }), - size_effect: None, - cost_shape: Some(CostShape::ShapeIterateBody), - callback_element_position: Some(0), - }), - Rc::new(AlgebraFieldTemplate { - name: "all".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::CallableOf { - params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), - }), - }), - ]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), - }), - size_effect: None, - cost_shape: Some(CostShape::ShapeIterateBody), - callback_element_position: Some(0), - }), - Rc::new(AlgebraFieldTemplate { - name: "count".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Int".to_string(), - }), - size_effect: None, - cost_shape: Some(CostShape::ShapeLinearScan), - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "first".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::OptionalOf { - inner: Rc::new(AlgebraTypeTemplate::ReceiverElement), - }), - size_effect: Some(CollectionSizeEffect::ProjectionEffect), - cost_shape: Some(CostShape::ShapeLinearScan), - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "last".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::OptionalOf { - inner: Rc::new(AlgebraTypeTemplate::ReceiverElement), - }), - size_effect: Some(CollectionSizeEffect::ProjectionEffect), - cost_shape: Some(CostShape::ShapeLinearScan), - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "skip".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Int".to_string(), - }), - ]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: Some(CollectionSizeEffect::ShrinkEffect), - cost_shape: Some(CostShape::ShapeIterateBody), - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "take".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Int".to_string(), - }), - ]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: Some(CostShape::ShapeIterateBody), - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "sort_by".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: Some(CollectionSizeEffect::IdentityEffect), - cost_shape: Some(CostShape::ShapeSortBody), - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "append".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverElement), - ]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: Some(CostShape::ShapeConstant), - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "contains".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverElement), - ]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), - }), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "enumerate".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { - source: Rc::new(ContainerSource::SameAsReceiver), - element: Rc::new(AlgebraTypeTemplate::TupleOf { - first: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Int".to_string(), - }), - second: Rc::new(AlgebraTypeTemplate::ReceiverElement), - }), - }), - size_effect: Some(CollectionSizeEffect::IdentityEffect), - cost_shape: Some(CostShape::ShapeIterateBody), - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "reverse".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: Some(CollectionSizeEffect::IdentityEffect), - cost_shape: Some(CostShape::ShapeLinearScan), - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "join".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "String".to_string(), - }), - ]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "String".to_string(), - }), - size_effect: None, - cost_shape: Some(CostShape::ShapeLinearScan), - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "concat".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - ]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: Some(CostShape::ShapeLinearScan), - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "list_push".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverElement), - ]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "length".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Int".to_string(), - }), - size_effect: None, - cost_shape: Some(CostShape::ShapeLinearScan), - callback_element_position: None, - }), - ]) + Rc::new(vec![Rc::new(AlgebraFieldTemplate { + name: "map".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::CallableOf { + params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), + return_type: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { + id: "MappedElement".to_string(), +}), +})]), + return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { + source: Rc::new(ContainerSource::SameAsReceiver), + element: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { + id: "MappedElement".to_string(), +}), +}), + size_effect: None, + cost_shape: Some(CostShape::ShapeIterateBody), + callback_element_position: Some(0), +}), Rc::new(AlgebraFieldTemplate { + name: "filter".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::CallableOf { + params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), +}), +})]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: Some(CollectionSizeEffect::IdentityEffect), + cost_shape: Some(CostShape::ShapeIterateBody), + callback_element_position: Some(0), +}), Rc::new(AlgebraFieldTemplate { + name: "flat_map".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::CallableOf { + params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), + return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { + source: Rc::new(ContainerSource::SameAsReceiver), + element: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { + id: "MappedElement".to_string(), +}), +}), +})]), + return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { + source: Rc::new(ContainerSource::SameAsReceiver), + element: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { + id: "MappedElement".to_string(), +}), +}), + size_effect: None, + cost_shape: Some(CostShape::ShapeIterateBody), + callback_element_position: Some(0), +}), Rc::new(AlgebraFieldTemplate { + name: "fold".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { + id: "FoldAccumulator".to_string(), +}), Rc::new(AlgebraTypeTemplate::CallableOf { + params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { + id: "FoldAccumulator".to_string(), +}), Rc::new(AlgebraTypeTemplate::ReceiverElement)]), + return_type: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { + id: "FoldAccumulator".to_string(), +}), +})]), + return_type: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { + id: "FoldAccumulator".to_string(), +}), + size_effect: None, + cost_shape: Some(CostShape::ShapeIterateBody), + callback_element_position: Some(1), +}), Rc::new(AlgebraFieldTemplate { + name: "any".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::CallableOf { + params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), +}), +})]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), +}), + size_effect: None, + cost_shape: Some(CostShape::ShapeIterateBody), + callback_element_position: Some(0), +}), Rc::new(AlgebraFieldTemplate { + name: "all".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::CallableOf { + params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), +}), +})]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), +}), + size_effect: None, + cost_shape: Some(CostShape::ShapeIterateBody), + callback_element_position: Some(0), +}), Rc::new(AlgebraFieldTemplate { + name: "count".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Int".to_string(), +}), + size_effect: None, + cost_shape: Some(CostShape::ShapeLinearScan), + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "first".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::OptionalOf { + inner: Rc::new(AlgebraTypeTemplate::ReceiverElement), +}), + size_effect: Some(CollectionSizeEffect::ProjectionEffect), + cost_shape: Some(CostShape::ShapeLinearScan), + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "last".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::OptionalOf { + inner: Rc::new(AlgebraTypeTemplate::ReceiverElement), +}), + size_effect: Some(CollectionSizeEffect::ProjectionEffect), + cost_shape: Some(CostShape::ShapeLinearScan), + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "skip".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Int".to_string(), +})]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: Some(CollectionSizeEffect::ShrinkEffect), + cost_shape: Some(CostShape::ShapeIterateBody), + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "take".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Int".to_string(), +})]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: Some(CostShape::ShapeIterateBody), + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "sort_by".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: Some(CollectionSizeEffect::IdentityEffect), + cost_shape: Some(CostShape::ShapeSortBody), + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "append".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverElement)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: Some(CostShape::ShapeConstant), + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "contains".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverElement)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), +}), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "enumerate".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { + source: Rc::new(ContainerSource::SameAsReceiver), + element: Rc::new(AlgebraTypeTemplate::TupleOf { + first: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Int".to_string(), +}), + second: Rc::new(AlgebraTypeTemplate::ReceiverElement), +}), +}), + size_effect: Some(CollectionSizeEffect::IdentityEffect), + cost_shape: Some(CostShape::ShapeIterateBody), + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "reverse".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: Some(CollectionSizeEffect::IdentityEffect), + cost_shape: Some(CostShape::ShapeLinearScan), + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "join".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "String".to_string(), +})]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "String".to_string(), +}), + size_effect: None, + cost_shape: Some(CostShape::ShapeLinearScan), + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "concat".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: Some(CostShape::ShapeLinearScan), + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "list_push".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverElement)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "length".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Int".to_string(), +}), + size_effect: None, + cost_shape: Some(CostShape::ShapeLinearScan), + callback_element_position: None, +})]) } pub fn partial_function_templates() -> Rc>> { - Rc::new(vec![ - Rc::new(AlgebraFieldTemplate { - name: "get".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverKey), - ]), - return_type: Rc::new(AlgebraTypeTemplate::OptionalOf { - inner: Rc::new(AlgebraTypeTemplate::ReceiverValue), - }), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "map_get".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverKey), - ]), - return_type: Rc::new(AlgebraTypeTemplate::OptionalOf { - inner: Rc::new(AlgebraTypeTemplate::ReceiverValue), - }), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "lookup".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverKey), - ]), - return_type: Rc::new(AlgebraTypeTemplate::OptionalOf { - inner: Rc::new(AlgebraTypeTemplate::ReceiverValue), - }), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "map_insert".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverKey), - Rc::new(AlgebraTypeTemplate::ReceiverValue), - ]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "map_merge".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - ]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "has".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverKey), - ]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), - }), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "map_has".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverKey), - ]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), - }), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "map_contains_key".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverKey), - ]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), - }), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "keys".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { - source: Rc::new(ContainerSource::Named { - name: "List".to_string(), - }), - element: Rc::new(AlgebraTypeTemplate::ReceiverKey), - }), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "map_keys".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { - source: Rc::new(ContainerSource::Named { - name: "List".to_string(), - }), - element: Rc::new(AlgebraTypeTemplate::ReceiverKey), - }), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "values".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { - source: Rc::new(ContainerSource::Named { - name: "List".to_string(), - }), - element: Rc::new(AlgebraTypeTemplate::ReceiverValue), - }), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "map_values".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { - source: Rc::new(ContainerSource::Named { - name: "List".to_string(), - }), - element: Rc::new(AlgebraTypeTemplate::ReceiverValue), - }), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "with".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverKey), - Rc::new(AlgebraTypeTemplate::ReceiverValue), - ]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "contains".to_string(), - param_types: Rc::new(vec![ - Rc::new(AlgebraTypeTemplate::ReceiverSelf), - Rc::new(AlgebraTypeTemplate::ReceiverKey), - ]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), - }), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - Rc::new(AlgebraFieldTemplate { - name: "length".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Int".to_string(), - }), - size_effect: None, - cost_shape: None, - callback_element_position: None, - }), - ]) + Rc::new(vec![Rc::new(AlgebraFieldTemplate { + name: "get".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverKey)]), + return_type: Rc::new(AlgebraTypeTemplate::OptionalOf { + inner: Rc::new(AlgebraTypeTemplate::ReceiverValue), +}), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "map_get".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverKey)]), + return_type: Rc::new(AlgebraTypeTemplate::OptionalOf { + inner: Rc::new(AlgebraTypeTemplate::ReceiverValue), +}), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "lookup".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverKey)]), + return_type: Rc::new(AlgebraTypeTemplate::OptionalOf { + inner: Rc::new(AlgebraTypeTemplate::ReceiverValue), +}), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "map_insert".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverKey), Rc::new(AlgebraTypeTemplate::ReceiverValue)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "map_merge".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "has".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverKey)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), +}), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "map_has".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverKey)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), +}), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "map_contains_key".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverKey)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), +}), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "keys".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { + source: Rc::new(ContainerSource::Named { + name: "List".to_string(), +}), + element: Rc::new(AlgebraTypeTemplate::ReceiverKey), +}), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "map_keys".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { + source: Rc::new(ContainerSource::Named { + name: "List".to_string(), +}), + element: Rc::new(AlgebraTypeTemplate::ReceiverKey), +}), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "values".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { + source: Rc::new(ContainerSource::Named { + name: "List".to_string(), +}), + element: Rc::new(AlgebraTypeTemplate::ReceiverValue), +}), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "map_values".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { + source: Rc::new(ContainerSource::Named { + name: "List".to_string(), +}), + element: Rc::new(AlgebraTypeTemplate::ReceiverValue), +}), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "with".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverKey), Rc::new(AlgebraTypeTemplate::ReceiverValue)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "contains".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverKey)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), +}), + size_effect: None, + cost_shape: None, + callback_element_position: None, +}), Rc::new(AlgebraFieldTemplate { + name: "length".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Int".to_string(), +}), + size_effect: None, + cost_shape: None, + callback_element_position: None, +})]) } pub fn algebra_templates_for_profile(profile: AlgebraProfile) -> Rc>> { match profile { - AlgebraProfile::OrderedRingProfile => ordered_ring_templates(), - AlgebraProfile::ApproximateFieldProfile => approximate_field_templates(), - AlgebraProfile::BooleanAlgebraProfile => boolean_algebra_templates(), - AlgebraProfile::BooleanAlgebraCollectionProfile => boolean_algebra_collection_templates(), - AlgebraProfile::FreeMonoidScalarProfile => free_monoid_scalar_templates(), - AlgebraProfile::FreeMonoidCollectionProfile => free_monoid_collection_templates(), - AlgebraProfile::PartialFunctionProfile => partial_function_templates(), - } + AlgebraProfile::OrderedRingProfile => ordered_ring_templates(), + AlgebraProfile::ApproximateFieldProfile => approximate_field_templates(), + AlgebraProfile::BooleanAlgebraProfile => boolean_algebra_templates(), + AlgebraProfile::BooleanAlgebraCollectionProfile => boolean_algebra_collection_templates(), + AlgebraProfile::FreeMonoidScalarProfile => free_monoid_scalar_templates(), + AlgebraProfile::FreeMonoidCollectionProfile => free_monoid_collection_templates(), + AlgebraProfile::PartialFunctionProfile => partial_function_templates(), +} } pub fn algebra_type_param_names(profile: AlgebraProfile) -> Rc> { match profile { - AlgebraProfile::OrderedRingProfile => Rc::new(vec![]), - AlgebraProfile::ApproximateFieldProfile => Rc::new(vec![]), - AlgebraProfile::BooleanAlgebraProfile => Rc::new(vec![]), - AlgebraProfile::BooleanAlgebraCollectionProfile => Rc::new(vec!["T".to_string()]), - AlgebraProfile::FreeMonoidScalarProfile => Rc::new(vec![]), - AlgebraProfile::FreeMonoidCollectionProfile => Rc::new(vec!["T".to_string()]), - AlgebraProfile::PartialFunctionProfile => Rc::new(vec!["K".to_string(), "V".to_string()]), - } + AlgebraProfile::OrderedRingProfile => Rc::new(vec![]), + AlgebraProfile::ApproximateFieldProfile => Rc::new(vec![]), + AlgebraProfile::BooleanAlgebraProfile => Rc::new(vec![]), + AlgebraProfile::BooleanAlgebraCollectionProfile => Rc::new(vec!["T".to_string()]), + AlgebraProfile::FreeMonoidScalarProfile => Rc::new(vec![]), + AlgebraProfile::FreeMonoidCollectionProfile => Rc::new(vec!["T".to_string()]), + AlgebraProfile::PartialFunctionProfile => Rc::new(vec!["K".to_string(), "V".to_string()]), +} } diff --git a/src/v2/stage0/src/std_coercion.rs b/src/v2/stage0/src/std_coercion.rs index 84ed2736a2a..37e8e60fe56 100644 --- a/src/v2/stage0/src/std_coercion.rs +++ b/src/v2/stage0/src/std_coercion.rs @@ -1,11 +1,11 @@ // Generated by v2 compiler -- do not edit. // Source module: std.coercion -use crate::v2_rt; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] pub struct TypeCheckpoint { @@ -57,31 +57,9 @@ pub fn dag_cast_rules() -> Rc>> { } pub fn dag_can_cast(source_type: String, target_type: String) -> bool { - { - let mut __found = false; - for r in dag_cast_rules().iter().cloned() { - if ((r.from_type.clone().as_str() == source_type.clone().as_str()) - && (r.to_type.clone().as_str() == target_type.clone().as_str())) - { - __found = true; - break; - } - } - __found - } + { let mut __found = false; for r in dag_cast_rules().iter().cloned() { if ((r.from_type.clone().as_str() == source_type.clone().as_str()) && (r.to_type.clone().as_str() == target_type.clone().as_str())) { __found = true; break; } } __found } } pub fn is_dag_cast_domain_type(name: String) -> bool { - { - let mut __found = false; - for r in dag_cast_rules().iter().cloned() { - if ((r.from_type.clone().as_str() == name.clone().as_str()) - || (r.to_type.clone().as_str() == name.clone().as_str())) - { - __found = true; - break; - } - } - __found - } + { let mut __found = false; for r in dag_cast_rules().iter().cloned() { if ((r.from_type.clone().as_str() == name.clone().as_str()) || (r.to_type.clone().as_str() == name.clone().as_str())) { __found = true; break; } } __found } } diff --git a/src/v2/stage0/src/std_computation.rs b/src/v2/stage0/src/std_computation.rs index 8d80b44bedd..2d0cc8bfc46 100644 --- a/src/v2/stage0/src/std_computation.rs +++ b/src/v2/stage0/src/std_computation.rs @@ -1,53 +1,61 @@ // Generated by v2 compiler -- do not edit. // Source module: std.computation -use self::CallPattern::*; -use self::IterationDimension::*; -use self::IterationPrimitive::*; -use self::ShrinkFactor::*; -use self::SizeBound::*; -use crate::std_algebra::AlgebraProfile::{ - ApproximateFieldProfile, BooleanAlgebraCollectionProfile, BooleanAlgebraProfile, - FreeMonoidCollectionProfile, FreeMonoidScalarProfile, OrderedRingProfile, - PartialFunctionProfile, -}; -pub use crate::std_algebra::{kernel_algebra_profile, AlgebraProfile}; -use crate::std_termination::DescentEvidence::DescentUnknown; -use crate::std_termination::PositiveDescentAmount::{AdditionalStep, OneStep}; -use crate::std_termination::ProportionalDivisor::{DivideByTwo, StrictlyLarger}; -use crate::std_termination::RankingDimension::*; -pub use crate::std_termination::{ - DescentEvidence, PositiveDescentAmount, ProportionalDivisor, RankingDimension, -}; -use crate::v2_rt; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::std_termination::{DescentEvidence, RankingDimension, PositiveDescentAmount, ProportionalDivisor}; +use crate::std_termination::DescentEvidence::{DescentUnknown}; +use crate::std_termination::PositiveDescentAmount::{OneStep, AdditionalStep}; +use crate::std_termination::ProportionalDivisor::{DivideByTwo, StrictlyLarger}; +use crate::std_termination::RankingDimension::*; +pub use crate::std_algebra::{AlgebraProfile, kernel_algebra_profile}; +use crate::std_algebra::AlgebraProfile::{OrderedRingProfile, ApproximateFieldProfile, BooleanAlgebraProfile, BooleanAlgebraCollectionProfile, FreeMonoidScalarProfile, FreeMonoidCollectionProfile, PartialFunctionProfile}; +use self::SizeBound::*; +use self::CallPattern::*; +use self::ShrinkFactor::*; +use self::IterationPrimitive::*; +use self::IterationDimension::*; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum SizeBound { - CollectionSize { param: String }, - ParserStreamSize { witness: String }, - WorklistDrainSize { element: String }, - TreeSize { param: String }, - ArithmeticParam { param: String }, + CollectionSize { + param: String, + }, + ParserStreamSize { + witness: String, + }, + WorklistDrainSize { + element: String, + }, + TreeSize { + param: String, + }, + ArithmeticParam { + param: String, + }, ExplicitCountZero, - ExplicitCountPositive { steps: Rc }, + ExplicitCountPositive { + steps: Rc, + }, Forever, } pub fn tree_size_bound(param: String) -> Rc { - Rc::new(SizeBound::TreeSize { param: param }) + Rc::new(SizeBound::TreeSize { + param: param, +}) } pub fn positive_descent_count(steps: Rc) -> i64 { - stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || match (*steps).clone() { - PositiveDescentAmount::OneStep => 1, - PositiveDescentAmount::AdditionalStep { previous: p, .. } => { - (1 + positive_descent_count(p.clone())) - } + stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { + match (*steps).clone() { + PositiveDescentAmount::OneStep => 1, + PositiveDescentAmount::AdditionalStep { previous: p, .. } => (1 + positive_descent_count(p.clone())), +} }) } @@ -85,8 +93,12 @@ pub enum CallPattern { #[serde(tag = "_variant")] pub enum ShrinkFactor { UnitShrink, - ConstantShrink { steps: Rc }, - ProportionalShrink { divisor: Rc }, + ConstantShrink { + steps: Rc, + }, + ProportionalShrink { + divisor: Rc, + }, } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -107,94 +119,97 @@ pub enum IterationPrimitive { pub fn lower_call_pattern(pattern: Rc) -> Rc { match (*pattern).clone() { - CallPattern::ChildAccessorCall { accessor: a, .. } => Rc::new(LoweringTarget { - primitive: IterationPrimitive::Descend, - bound: Rc::new(SizeBound::TreeSize { param: a.clone() }), - evidence: DescentEvidence::Strict, - factor: None, - }), - CallPattern::CollectionShrinkCall { - amount: p, - collection: c, - .. - } => Rc::new(LoweringTarget { - primitive: IterationPrimitive::Fold, - bound: Rc::new(SizeBound::CollectionSize { param: c.clone() }), - evidence: DescentEvidence::Strict, - factor: Some(Rc::new(ShrinkFactor::ConstantShrink { steps: p.clone() })), - }), - CallPattern::ArithmeticSubtractCall { - steps: p, - ring_param: r, - .. - } => Rc::new(LoweringTarget { - primitive: IterationPrimitive::Repeat, - bound: Rc::new(SizeBound::ArithmeticParam { param: r.clone() }), - evidence: DescentEvidence::Strict, - factor: Some(Rc::new(ShrinkFactor::ConstantShrink { steps: p.clone() })), - }), - CallPattern::ArithmeticDivideCall { - divisor: d, - ring_param: r, - .. - } => Rc::new(LoweringTarget { - primitive: IterationPrimitive::Repeat, - bound: Rc::new(SizeBound::ArithmeticParam { param: r.clone() }), - evidence: DescentEvidence::Strict, - factor: Some(Rc::new(ShrinkFactor::ProportionalShrink { - divisor: d.clone(), - })), - }), - CallPattern::ParserAdvanceCall { witness: w, .. } => Rc::new(LoweringTarget { - primitive: IterationPrimitive::Fold, - bound: Rc::new(SizeBound::ParserStreamSize { witness: w.clone() }), - evidence: DescentEvidence::Strict, - factor: None, - }), - CallPattern::WorklistDrainCall { element: e, .. } => Rc::new(LoweringTarget { - primitive: IterationPrimitive::Fold, - bound: Rc::new(SizeBound::WorklistDrainSize { element: e.clone() }), - evidence: DescentEvidence::Strict, - factor: None, - }), - CallPattern::FoldBodyCall { - outer_collection: oc, - .. - } => Rc::new(LoweringTarget { - primitive: IterationPrimitive::Fold, - bound: Rc::new(SizeBound::CollectionSize { param: oc.clone() }), - evidence: DescentEvidence::NonIncreasing, - factor: None, - }), - CallPattern::SameArgumentCall => Rc::new(LoweringTarget { - primitive: IterationPrimitive::Repeat, - bound: Rc::new(SizeBound::Forever), - evidence: DescentEvidence::NonIncreasing, - factor: None, - }), - } + CallPattern::ChildAccessorCall { accessor: a, .. } => Rc::new(LoweringTarget { + primitive: IterationPrimitive::Descend, + bound: Rc::new(SizeBound::TreeSize { + param: a.clone(), +}), + evidence: DescentEvidence::Strict, + factor: None, +}), + CallPattern::CollectionShrinkCall { amount: p, collection: c, .. } => Rc::new(LoweringTarget { + primitive: IterationPrimitive::Fold, + bound: Rc::new(SizeBound::CollectionSize { + param: c.clone(), +}), + evidence: DescentEvidence::Strict, + factor: Some(Rc::new(ShrinkFactor::ConstantShrink { + steps: p.clone(), +})), +}), + CallPattern::ArithmeticSubtractCall { steps: p, ring_param: r, .. } => Rc::new(LoweringTarget { + primitive: IterationPrimitive::Repeat, + bound: Rc::new(SizeBound::ArithmeticParam { + param: r.clone(), +}), + evidence: DescentEvidence::Strict, + factor: Some(Rc::new(ShrinkFactor::ConstantShrink { + steps: p.clone(), +})), +}), + CallPattern::ArithmeticDivideCall { divisor: d, ring_param: r, .. } => Rc::new(LoweringTarget { + primitive: IterationPrimitive::Repeat, + bound: Rc::new(SizeBound::ArithmeticParam { + param: r.clone(), +}), + evidence: DescentEvidence::Strict, + factor: Some(Rc::new(ShrinkFactor::ProportionalShrink { + divisor: d.clone(), +})), +}), + CallPattern::ParserAdvanceCall { witness: w, .. } => Rc::new(LoweringTarget { + primitive: IterationPrimitive::Fold, + bound: Rc::new(SizeBound::ParserStreamSize { + witness: w.clone(), +}), + evidence: DescentEvidence::Strict, + factor: None, +}), + CallPattern::WorklistDrainCall { element: e, .. } => Rc::new(LoweringTarget { + primitive: IterationPrimitive::Fold, + bound: Rc::new(SizeBound::WorklistDrainSize { + element: e.clone(), +}), + evidence: DescentEvidence::Strict, + factor: None, +}), + CallPattern::FoldBodyCall { outer_collection: oc, .. } => Rc::new(LoweringTarget { + primitive: IterationPrimitive::Fold, + bound: Rc::new(SizeBound::CollectionSize { + param: oc.clone(), +}), + evidence: DescentEvidence::NonIncreasing, + factor: None, +}), + CallPattern::SameArgumentCall => Rc::new(LoweringTarget { + primitive: IterationPrimitive::Repeat, + bound: Rc::new(SizeBound::Forever), + evidence: DescentEvidence::NonIncreasing, + factor: None, +}), +} } pub fn size_bound_param(bound: Rc) -> Option { match (*bound).clone() { - SizeBound::TreeSize { param: p, .. } => Some(p.clone()), - SizeBound::CollectionSize { param: p, .. } => Some(p.clone()), - SizeBound::ParserStreamSize { witness: w, .. } => Some(w.clone()), - SizeBound::WorklistDrainSize { element: e, .. } => Some(e.clone()), - SizeBound::ArithmeticParam { param: p, .. } => Some(p.clone()), - SizeBound::ExplicitCountZero => None, - SizeBound::ExplicitCountPositive { .. } => None, - SizeBound::Forever => None, - } + SizeBound::TreeSize { param: p, .. } => Some(p.clone()), + SizeBound::CollectionSize { param: p, .. } => Some(p.clone()), + SizeBound::ParserStreamSize { witness: w, .. } => Some(w.clone()), + SizeBound::WorklistDrainSize { element: e, .. } => Some(e.clone()), + SizeBound::ArithmeticParam { param: p, .. } => Some(p.clone()), + SizeBound::ExplicitCountZero => None, + SizeBound::ExplicitCountPositive { .. } => None, + SizeBound::Forever => None, +} } pub fn is_constant_bound(bound: Rc) -> bool { match (*bound).clone() { - SizeBound::ExplicitCountZero => true, - SizeBound::ExplicitCountPositive { .. } => true, - SizeBound::Forever => true, - _ => false, - } + SizeBound::ExplicitCountZero => true, + SizeBound::ExplicitCountPositive { .. } => true, + SizeBound::Forever => true, + _ => false, +} } pub fn forever_iteration_bound() -> i64 { @@ -203,13 +218,11 @@ pub fn forever_iteration_bound() -> i64 { pub fn constant_bound_value(bound: Rc) -> Option { match (*bound).clone() { - SizeBound::ExplicitCountZero => Some(0), - SizeBound::ExplicitCountPositive { steps: s, .. } => { - Some(positive_descent_count(s.clone())) - } - SizeBound::Forever => Some(forever_iteration_bound()), - _ => None, - } + SizeBound::ExplicitCountZero => Some(0), + SizeBound::ExplicitCountPositive { steps: s, .. } => Some(positive_descent_count(s.clone())), + SizeBound::Forever => Some(forever_iteration_bound()), + _ => None, +} } #[derive(Debug, Clone, Copy, PartialEq, serde::Serialize, serde::Deserialize)] @@ -222,14 +235,14 @@ pub enum IterationDimension { pub fn algebra_profile_to_dimension(profile: AlgebraProfile) -> Option { match profile { - AlgebraProfile::FreeMonoidCollectionProfile => Some(IterationDimension::CollectionFold), - AlgebraProfile::FreeMonoidScalarProfile => Some(IterationDimension::CollectionFold), - AlgebraProfile::BooleanAlgebraCollectionProfile => Some(IterationDimension::CollectionFold), - AlgebraProfile::PartialFunctionProfile => Some(IterationDimension::CollectionFold), - AlgebraProfile::OrderedRingProfile => Some(IterationDimension::ArithmeticRepeat), - AlgebraProfile::ApproximateFieldProfile => Some(IterationDimension::ArithmeticRepeat), - AlgebraProfile::BooleanAlgebraProfile => None, - } + AlgebraProfile::FreeMonoidCollectionProfile => Some(IterationDimension::CollectionFold), + AlgebraProfile::FreeMonoidScalarProfile => Some(IterationDimension::CollectionFold), + AlgebraProfile::BooleanAlgebraCollectionProfile => Some(IterationDimension::CollectionFold), + AlgebraProfile::PartialFunctionProfile => Some(IterationDimension::CollectionFold), + AlgebraProfile::OrderedRingProfile => Some(IterationDimension::ArithmeticRepeat), + AlgebraProfile::ApproximateFieldProfile => Some(IterationDimension::ArithmeticRepeat), + AlgebraProfile::BooleanAlgebraProfile => None, +} } pub fn type_iteration_dimension(type_name: &String) -> Option { @@ -237,8 +250,8 @@ pub fn type_iteration_dimension(type_name: &String) -> Option algebra_profile_to_dimension(p.clone()), - None => None, - } + Some(p) => algebra_profile_to_dimension(p.clone()), + None => None, +} } } diff --git a/src/v2/stage0/src/std_effects.rs b/src/v2/stage0/src/std_effects.rs index e31b9a4a939..bac6fa5a39c 100644 --- a/src/v2/stage0/src/std_effects.rs +++ b/src/v2/stage0/src/std_effects.rs @@ -1,29 +1,31 @@ // Generated by v2 compiler -- do not edit. // Source module: std.effects -use self::DeriveOpEffectResult::*; +use std::collections::HashMap; +use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::std_types::{HttpMethod}; +use crate::std_types::HttpMethod::{GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS}; +pub use crate::std_http_path::{PathTemplate, PathTemplateParseResult, parse_path_template, has_path_params, last_path_param}; +use crate::std_http_path::PathTemplateParseResult::{ParsedPathTemplate, MalformedPathTemplate}; use self::EffectShape::*; -use self::IdempotencyEvidence::*; use self::KeySource::*; +use self::IdempotencyEvidence::*; +use self::DeriveOpEffectResult::*; use self::ModifierAgreement::*; -use crate::std_http_path::PathTemplateParseResult::{MalformedPathTemplate, ParsedPathTemplate}; -pub use crate::std_http_path::{ - has_path_params, last_path_param, parse_path_template, PathTemplate, PathTemplateParseResult, -}; -pub use crate::std_types::HttpMethod; -use crate::std_types::HttpMethod::{DELETE, GET, HEAD, OPTIONS, PATCH, POST, PUT}; -use crate::v2_rt; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; -use std::collections::HashMap; -use std::rc::Rc; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum EffectShape { ReadEffect, - UpsertEffect { key_source: Rc }, - DeleteEffect { key_source: Rc }, + UpsertEffect { + key_source: Rc, + }, + DeleteEffect { + key_source: Rc, + }, CreateEffect, AppendEffect, } @@ -31,12 +33,8 @@ impl EffectShape { pub fn key_source(&self) -> Rc { match self { EffectShape::ReadEffect => panic!("no key_source on unit variant"), - EffectShape::UpsertEffect { - key_source: __val, .. - } => __val.clone(), - EffectShape::DeleteEffect { - key_source: __val, .. - } => __val.clone(), + EffectShape::UpsertEffect { key_source: __val, .. } => __val.clone(), + EffectShape::DeleteEffect { key_source: __val, .. } => __val.clone(), EffectShape::CreateEffect => panic!("no key_source on unit variant"), EffectShape::AppendEffect => panic!("no key_source on unit variant"), } @@ -46,9 +44,15 @@ impl EffectShape { #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum KeySource { - PathParam { param: String }, - InputField { field: String }, - CompositeKey { fields: Rc> }, + PathParam { + param: String, + }, + InputField { + field: String, + }, + CompositeKey { + fields: Rc>, + }, } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -75,12 +79,12 @@ impl IdempotencyEvidence { pub fn is_idempotent_effect(shape: Rc) -> bool { match (*shape).clone() { - EffectShape::ReadEffect => true, - EffectShape::UpsertEffect { .. } => true, - EffectShape::DeleteEffect { .. } => true, - EffectShape::CreateEffect => false, - EffectShape::AppendEffect => false, - } + EffectShape::ReadEffect => true, + EffectShape::UpsertEffect { .. } => true, + EffectShape::DeleteEffect { .. } => true, + EffectShape::CreateEffect => false, + EffectShape::AppendEffect => false, +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -99,29 +103,21 @@ pub struct OperationEffect { pub fn compose_effects(effects: &Rc>>) -> Rc { { - let non_idempotent = Rc::new({ - let mut __result = Vec::new(); - for e in effects.clone().iter().cloned() { - if match (*e.evidence.clone()).clone() { - IdempotencyEvidence::NonIdempotent { .. } => true, - _ => false, - } { - __result.push(e); - } - } - __result - }); - let breaker = non_idempotent.clone().first().cloned(); - let breaker_name = match breaker { - Some(op) => Some(op.operation_name.clone()), - None => None, - }; - Rc::new(ComposedEffect { - operations: effects.clone(), - idempotent: ((non_idempotent.clone().len() as i64) == 0), - breaking_operation: breaker_name, - }) - } + let non_idempotent = Rc::new({ let mut __result = Vec::new(); for e in effects.clone().iter().cloned() { if match (*e.evidence.clone()).clone() { + IdempotencyEvidence::NonIdempotent { .. } => true, + _ => false, +} { __result.push(e); } } __result }); +let breaker = non_idempotent.clone().first().cloned(); +let breaker_name = match breaker { + Some(op) => Some(op.operation_name.clone()), + None => None, +}; +Rc::new(ComposedEffect { + operations: effects.clone(), + idempotent: ((non_idempotent.clone().len() as i64) == 0), + breaking_operation: breaker_name, +}) +} } pub fn parse_http_method(raw: &String) -> Option { @@ -185,75 +181,76 @@ pub enum DeriveOpEffectResult { pub fn derive_effect_shape(method: HttpMethod, path: Rc) -> Rc { match method { - HttpMethod::GET => Rc::new(EffectShape::ReadEffect), - HttpMethod::HEAD => Rc::new(EffectShape::ReadEffect), - HttpMethod::OPTIONS => Rc::new(EffectShape::ReadEffect), - HttpMethod::POST => Rc::new(EffectShape::CreateEffect), - HttpMethod::DELETE => match last_path_param(path) { - Some(p) => Rc::new(EffectShape::DeleteEffect { - key_source: Rc::new(KeySource::PathParam { param: p.clone() }), - }), - None => Rc::new(EffectShape::CreateEffect), - }, - HttpMethod::PUT => match last_path_param(path) { - Some(p) => Rc::new(EffectShape::UpsertEffect { - key_source: Rc::new(KeySource::PathParam { param: p.clone() }), - }), - None => Rc::new(EffectShape::CreateEffect), - }, - HttpMethod::PATCH => match last_path_param(path) { - Some(p) => Rc::new(EffectShape::UpsertEffect { - key_source: Rc::new(KeySource::PathParam { param: p.clone() }), - }), - None => Rc::new(EffectShape::CreateEffect), - }, - } + HttpMethod::GET => Rc::new(EffectShape::ReadEffect), + HttpMethod::HEAD => Rc::new(EffectShape::ReadEffect), + HttpMethod::OPTIONS => Rc::new(EffectShape::ReadEffect), + HttpMethod::POST => Rc::new(EffectShape::CreateEffect), + HttpMethod::DELETE => match last_path_param(path) { + Some(p) => Rc::new(EffectShape::DeleteEffect { + key_source: Rc::new(KeySource::PathParam { + param: p.clone(), +}), +}), + None => Rc::new(EffectShape::CreateEffect), +}, + HttpMethod::PUT => match last_path_param(path) { + Some(p) => Rc::new(EffectShape::UpsertEffect { + key_source: Rc::new(KeySource::PathParam { + param: p.clone(), +}), +}), + None => Rc::new(EffectShape::CreateEffect), +}, + HttpMethod::PATCH => match last_path_param(path) { + Some(p) => Rc::new(EffectShape::UpsertEffect { + key_source: Rc::new(KeySource::PathParam { + param: p.clone(), +}), +}), + None => Rc::new(EffectShape::CreateEffect), +}, +} } -pub fn derive_op_effect( - operation_name: String, - method_str: &String, - path_str: String, -) -> Rc { +pub fn derive_op_effect(operation_name: String, method_str: &String, path_str: String) -> Rc { match parse_http_method(&method_str) { - None => Rc::new(DeriveOpEffectResult::UnknownHttpMethodInput { - operation_name: operation_name, - method_str: method_str.clone(), - }), - Some(method) => match (*parse_path_template(&path_str)).clone() { - PathTemplateParseResult::ParsedPathTemplate { template: path, .. } => { - let shape = derive_effect_shape(method.clone(), path.clone()); - Rc::new(DeriveOpEffectResult::DerivedEffect { - effect: Rc::new(DerivedOpEffect { - operation_name: operation_name, - method: method.clone(), - path_template: path.clone(), - shape: shape, - }), - }) - } - PathTemplateParseResult::MalformedPathTemplate { - raw: raw_path, - segment, - reason, - .. - } => Rc::new(DeriveOpEffectResult::MalformedPathInput { - operation_name: operation_name, - method: method.clone(), - raw_path: raw_path.clone(), - segment: segment.clone(), - reason: reason.clone(), - }), - }, - } + None => Rc::new(DeriveOpEffectResult::UnknownHttpMethodInput { + operation_name: operation_name, + method_str: method_str.clone(), +}), + Some(method) => match (*parse_path_template(&path_str)).clone() { + PathTemplateParseResult::ParsedPathTemplate { template: path, .. } => { + let shape = derive_effect_shape(method.clone(), path.clone()); +Rc::new(DeriveOpEffectResult::DerivedEffect { + effect: Rc::new(DerivedOpEffect { + operation_name: operation_name, + method: method.clone(), + path_template: path.clone(), + shape: shape, +}), +}) +}, + PathTemplateParseResult::MalformedPathTemplate { raw: raw_path, segment, reason, .. } => Rc::new(DeriveOpEffectResult::MalformedPathInput { + operation_name: operation_name, + method: method.clone(), + raw_path: raw_path.clone(), + segment: segment.clone(), + reason: reason.clone(), +}), +}, +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum ModifierAgreement { Agrees, - Disagrees { reason: String }, - DerivationUnknown { reason: String }, + Disagrees { + reason: String, + }, + DerivationUnknown { + reason: String, + }, } impl ModifierAgreement { pub fn reason(&self) -> String { @@ -274,14 +271,10 @@ pub struct ModifierCheck { pub agreement: Rc, } -pub fn check_modifier_vs_derivation( - op: &Rc, - declared_idempotent: &bool, - declared_readonly: &bool, -) -> Rc { +pub fn check_modifier_vs_derivation(op: &Rc, declared_idempotent: &bool, declared_readonly: &bool) -> Rc { { let derived_idempotent = is_idempotent_effect(op.shape.clone()); - let agreement = if (declared_idempotent.clone() && derived_idempotent.clone()) { +let agreement = if (declared_idempotent.clone() && derived_idempotent.clone()) { Rc::new(ModifierAgreement::Agrees) } else { if (declared_idempotent.clone() && !derived_idempotent.clone()) { @@ -296,27 +289,26 @@ pub fn check_modifier_vs_derivation( } else { if (!declared_idempotent.clone() && declared_readonly.clone()) { match op.method.clone() { - HttpMethod::GET => Rc::new(ModifierAgreement::Agrees), - HttpMethod::HEAD => Rc::new(ModifierAgreement::Agrees), - HttpMethod::OPTIONS => Rc::new(ModifierAgreement::Agrees), - _ => Rc::new(ModifierAgreement::Disagrees { - reason: "readonly declared but method is not GET/HEAD/OPTIONS" - .to_string(), - }), - } + HttpMethod::GET => Rc::new(ModifierAgreement::Agrees), + HttpMethod::HEAD => Rc::new(ModifierAgreement::Agrees), + HttpMethod::OPTIONS => Rc::new(ModifierAgreement::Agrees), + _ => Rc::new(ModifierAgreement::Disagrees { + reason: "readonly declared but method is not GET/HEAD/OPTIONS".to_string(), +}), +} } else { Rc::new(ModifierAgreement::Agrees) } } }; - Rc::new(ModifierCheck { - operation_name: op.operation_name.clone(), - declared_idempotent: declared_idempotent.clone(), - declared_readonly: declared_readonly.clone(), - derived_shape: op.shape.clone(), - agreement: agreement, - }) - } +Rc::new(ModifierCheck { + operation_name: op.operation_name.clone(), + declared_idempotent: declared_idempotent.clone(), + declared_readonly: declared_readonly.clone(), + derived_shape: op.shape.clone(), + agreement: agreement, +}) +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -327,32 +319,13 @@ pub struct IdempotencyTestObligation { pub witness_required: bool, } -pub fn generate_idempotency_obligations( - ops: Rc>>, -) -> Rc>> { - Rc::new({ - let mut __result = Vec::new(); - for o in Rc::new({ - let mut __result = Vec::new(); - for o in ops.iter().cloned() { - if is_idempotent_effect(o.shape.clone()) { - __result.push(o); - } - } - __result - }) - .iter() - .cloned() - { - __result.push(Rc::new(IdempotencyTestObligation { - operation_name: o.operation_name.clone(), - effect_shape: o.shape.clone(), - claim: "f(f(x)) == f(x)".to_string(), - witness_required: true, - })); - } - __result - }) +pub fn generate_idempotency_obligations(ops: Rc>>) -> Rc>> { + Rc::new({ let mut __result = Vec::new(); for o in Rc::new({ let mut __result = Vec::new(); for o in ops.iter().cloned() { if is_idempotent_effect(o.shape.clone()) { __result.push(o); } } __result }).iter().cloned() { __result.push(Rc::new(IdempotencyTestObligation { + operation_name: o.operation_name.clone(), + effect_shape: o.shape.clone(), + claim: "f(f(x)) == f(x)".to_string(), + witness_required: true, +})); } __result }) } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] diff --git a/src/v2/stage0/src/std_error_primitives.rs b/src/v2/stage0/src/std_error_primitives.rs index a3fc3d2d54b..52d156a47f2 100644 --- a/src/v2/stage0/src/std_error_primitives.rs +++ b/src/v2/stage0/src/std_error_primitives.rs @@ -3,19 +3,23 @@ #![allow(non_camel_case_types)] -use self::DivError::*; -use self::Result::*; -use crate::v2_rt; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +use self::Result::*; +use self::DivError::*; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum Result { - Ok { value: Box }, - Err { value: Box }, + Ok { + value: Box, + }, + Err { + value: Box, + }, } #[derive(Debug, Clone, Copy, PartialEq, serde::Serialize, serde::Deserialize)] diff --git a/src/v2/stage0/src/std_graph.rs b/src/v2/stage0/src/std_graph.rs index 44199c2545f..cfcaeb9aab9 100644 --- a/src/v2/stage0/src/std_graph.rs +++ b/src/v2/stage0/src/std_graph.rs @@ -1,13 +1,13 @@ // Generated by v2 compiler -- do not edit. // Source module: std.graph -use crate::std_termination::DescentEvidence::{DescentUnknown, NonIncreasing, Strict}; -pub use crate::std_termination::{DescentEvidence, ProofEdge, TerminationProof}; -use crate::v2_rt; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::std_termination::{ProofEdge, DescentEvidence, TerminationProof}; +use crate::std_termination::DescentEvidence::{Strict, NonIncreasing, DescentUnknown}; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] pub struct CallGraph { @@ -38,240 +38,135 @@ pub fn set_has(m: Rc>, key: String) -> bool { } pub fn seed_adjacency_map(names: Rc>) -> Rc>>> { - names.iter().cloned().fold( - v2_rt::rc_empty_map::>>(), - |acc: Rc>>>, name: String| { - v2_rt::rc_map_insert(acc, name.clone(), Rc::new(vec![])) - }, - ) + names.iter().cloned().fold(v2_rt::rc_empty_map::>>(), |acc: Rc>>>, name: String| v2_rt::rc_map_insert(acc, name.clone(), Rc::new(vec![]))) } -pub fn build_call_graph_from_proof_edges( - names: &Rc>, - edges: Rc>>, -) -> Rc { +pub fn build_call_graph_from_proof_edges(names: &Rc>, edges: Rc>>) -> Rc { { let initial_forward = seed_adjacency_map(names.clone()); - let initial_reverse = seed_adjacency_map(names.clone()); - Rc::new({ - let mut __result = Vec::new(); - for e in edges.iter().cloned() { - if (e.caller.clone().as_str() != e.callee.clone().as_str()) { - __result.push(e); - } - } - __result - }) - .iter() - .cloned() - .fold( - Rc::new(CallGraph { - forward: initial_forward, - reverse: initial_reverse, - }), - |acc: Rc, edge: Rc| { - let forward_neighbors = - match v2_rt::map_get(&acc.forward.clone(), edge.caller.clone()) { - Some(ns) => v2_rt::concat(ns.clone(), Rc::new(vec![edge.callee.clone()])), - None => Rc::new(vec![edge.callee.clone()]), - }; - let reverse_neighbors = - match v2_rt::map_get(&acc.reverse.clone(), edge.callee.clone()) { - Some(ns) => v2_rt::concat(ns.clone(), Rc::new(vec![edge.caller.clone()])), - None => Rc::new(vec![edge.caller.clone()]), - }; - Rc::new(CallGraph { - forward: v2_rt::rc_map_insert( - acc.forward.clone(), - edge.caller.clone(), - forward_neighbors.clone(), - ), - reverse: v2_rt::rc_map_insert( - acc.reverse.clone(), - edge.callee.clone(), - reverse_neighbors.clone(), - ), - }) - }, - ) - } +let initial_reverse = seed_adjacency_map(names.clone()); +Rc::new({ let mut __result = Vec::new(); for e in edges.iter().cloned() { if (e.caller.clone().as_str() != e.callee.clone().as_str()) { __result.push(e); } } __result }).iter().cloned().fold(Rc::new(CallGraph { + forward: initial_forward, + reverse: initial_reverse, +}), |acc: Rc, edge: Rc| { + let forward_neighbors = match v2_rt::map_get(&acc.forward.clone(), edge.caller.clone()) { + Some(ns) => v2_rt::concat(ns.clone(), Rc::new(vec![edge.callee.clone()])), + None => Rc::new(vec![edge.callee.clone()]), +}; +let reverse_neighbors = match v2_rt::map_get(&acc.reverse.clone(), edge.callee.clone()) { + Some(ns) => v2_rt::concat(ns.clone(), Rc::new(vec![edge.caller.clone()])), + None => Rc::new(vec![edge.caller.clone()]), +}; +Rc::new(CallGraph { + forward: v2_rt::rc_map_insert(acc.forward.clone(), edge.caller.clone(), forward_neighbors.clone()), + reverse: v2_rt::rc_map_insert(acc.reverse.clone(), edge.callee.clone(), reverse_neighbors.clone()), +}) +}) +} } -pub fn dfs_finish_order( - node: &String, - adjacency: &Rc>>>, - acc: &Rc, -) -> Rc { +pub fn dfs_finish_order(node: &String, adjacency: &Rc>>>, acc: &Rc) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { if set_has(acc.visited.clone(), node.clone()) { acc.clone() } else { { let next_visited = v2_rt::rc_map_insert(acc.visited.clone(), node.clone(), true); - let neighbors = match v2_rt::map_get(&adjacency, node.clone()) { - Some(ns) => ns.clone(), - None => Rc::new(vec![]), - }; - let explored = neighbors.iter().cloned().fold( - Rc::new(DfsFinishAcc { - visited: next_visited, - order: acc.order.clone(), - }), - |inner: Rc, neighbor: String| { - dfs_finish_order(&neighbor, &adjacency, &inner) - }, - ); - Rc::new(DfsFinishAcc { - visited: explored.visited.clone(), - order: v2_rt::rc_list_push(explored.order.clone(), node.clone()), - }) - } +let neighbors = match v2_rt::map_get(&adjacency, node.clone()) { + Some(ns) => ns.clone(), + None => Rc::new(vec![]), +}; +let explored = neighbors.iter().cloned().fold(Rc::new(DfsFinishAcc { + visited: next_visited, + order: acc.order.clone(), +}), |inner: Rc, neighbor: String| dfs_finish_order(&neighbor, &adjacency, &inner)); +Rc::new(DfsFinishAcc { + visited: explored.visited.clone(), + order: v2_rt::rc_list_push(explored.order.clone(), node.clone()), +}) +} } }) } -pub fn dfs_collect_component( - node: &String, - adjacency: &Rc>>>, - acc: &Rc, -) -> Rc { +pub fn dfs_collect_component(node: &String, adjacency: &Rc>>>, acc: &Rc) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { if set_has(acc.visited.clone(), node.clone()) { acc.clone() } else { { let next_visited = v2_rt::rc_map_insert(acc.visited.clone(), node.clone(), true); - let next_members = v2_rt::rc_list_push(acc.members.clone(), node.clone()); - let neighbors = match v2_rt::map_get(&adjacency, node.clone()) { - Some(ns) => ns.clone(), - None => Rc::new(vec![]), - }; - neighbors.iter().cloned().fold( - Rc::new(SccComponentAcc { - visited: next_visited, - members: next_members, - }), - |inner: Rc, neighbor: String| { - dfs_collect_component(&neighbor, &adjacency, &inner) - }, - ) - } +let next_members = v2_rt::rc_list_push(acc.members.clone(), node.clone()); +let neighbors = match v2_rt::map_get(&adjacency, node.clone()) { + Some(ns) => ns.clone(), + None => Rc::new(vec![]), +}; +neighbors.iter().cloned().fold(Rc::new(SccComponentAcc { + visited: next_visited, + members: next_members, +}), |inner: Rc, neighbor: String| dfs_collect_component(&neighbor, &adjacency, &inner)) +} } }) } pub fn graph_has_multi_node_scc(names: Rc>, graph: Rc) -> bool { { - let finish = names.iter().cloned().fold( - Rc::new(DfsFinishAcc { - visited: v2_rt::rc_empty_map::(), - order: Rc::new(vec![]), - }), - |acc: Rc, name: String| { - dfs_finish_order(&name, &graph.forward.clone(), &acc) - }, - ); - let result = v2_rt::reverse(finish.order.clone()).iter().cloned().fold( - Rc::new(SccCycleAcc { - visited: v2_rt::rc_empty_map::(), - has_cycle: false, - }), - |acc: Rc, name: String| { - if (acc.has_cycle.clone() || set_has(acc.visited.clone(), name.clone())) { - acc.clone() - } else { - { - let component = dfs_collect_component( - &name, - &graph.reverse.clone(), - &Rc::new(SccComponentAcc { - visited: acc.visited.clone(), - members: Rc::new(vec![]), - }), - ); - Rc::new(SccCycleAcc { - visited: component.visited.clone(), - has_cycle: ((component.members.clone().len() as i64) > 1), - }) - } - } - }, - ); - result.has_cycle.clone() - } + let finish = names.iter().cloned().fold(Rc::new(DfsFinishAcc { + visited: v2_rt::rc_empty_map::(), + order: Rc::new(vec![]), +}), |acc: Rc, name: String| dfs_finish_order(&name, &graph.forward.clone(), &acc)); +let result = v2_rt::reverse(finish.order.clone()).iter().cloned().fold(Rc::new(SccCycleAcc { + visited: v2_rt::rc_empty_map::(), + has_cycle: false, +}), |acc: Rc, name: String| if (acc.has_cycle.clone() || set_has(acc.visited.clone(), name.clone())) { + acc.clone() + } else { + { + let component = dfs_collect_component(&name, &graph.reverse.clone(), &Rc::new(SccComponentAcc { + visited: acc.visited.clone(), + members: Rc::new(vec![]), +})); +Rc::new(SccCycleAcc { + visited: component.visited.clone(), + has_cycle: ((component.members.clone().len() as i64) > 1), +}) +} + }); +result.has_cycle.clone() +} } pub fn is_lexicographic_descent(mut evidence: Rc>) -> bool { loop { match evidence.clone().first().cloned() { - None => { - break false; - } - Some(e) => match e.clone() { - DescentEvidence::Strict => { - break true; - } - DescentEvidence::NonIncreasing => { - let __tco_0 = Rc::new( - evidence - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ); - evidence = __tco_0; - continue; - } - DescentEvidence::DescentUnknown => { - break false; - } - }, - } - } + None => { break false; }, + Some(e) => { match e.clone() { + DescentEvidence::Strict => { break true; }, + DescentEvidence::NonIncreasing => { { + let __tco_0 = Rc::new(evidence.iter().cloned().skip(1 as usize).collect::>()); +evidence = __tco_0; +continue; +} }, + DescentEvidence::DescentUnknown => { break false; }, +} }, +} +} } pub fn is_valid_proof(proof: Rc, edges: &Rc>>) -> bool { { let expected_dims = (proof.dimensions.clone().len() as i64); - let non_descending = Rc::new({ - let mut __result = Vec::new(); - for e in edges.clone().iter().cloned() { - if (((e.evidence.clone().len() as i64) != expected_dims.clone()) - || (is_lexicographic_descent(e.evidence.clone()) == false)) - { - __result.push(e); - } - } - __result - }); - let has_self_cycle = { - let mut __found = false; - for e in non_descending.clone().iter().cloned() { - if (e.caller.clone().as_str() == e.callee.clone().as_str()) { - __found = true; - break; - } - } - __found - }; - if has_self_cycle { +let non_descending = Rc::new({ let mut __result = Vec::new(); for e in edges.clone().iter().cloned() { if (((e.evidence.clone().len() as i64) != expected_dims.clone()) || (is_lexicographic_descent(e.evidence.clone()) == false)) { __result.push(e); } } __result }); +let has_self_cycle = { let mut __found = false; for e in non_descending.clone().iter().cloned() { if (e.caller.clone().as_str() == e.callee.clone().as_str()) { __found = true; break; } } __found }; +if has_self_cycle { false } else { { - let members = Rc::new({ - let mut __result = Vec::new(); - for e in edges.clone().iter().cloned() { - __result.extend( - (*Rc::new(vec![e.caller.clone(), e.callee.clone()])) - .iter() - .cloned(), - ); - } - __result - }); - let nd_graph = build_call_graph_from_proof_edges(&members, non_descending.clone()); - (graph_has_multi_node_scc(members.clone(), nd_graph) == false) - } + let members = Rc::new({ let mut __result = Vec::new(); for e in edges.clone().iter().cloned() { __result.extend((*Rc::new(vec![e.caller.clone(), e.callee.clone()])).iter().cloned()); } __result }); +let nd_graph = build_call_graph_from_proof_edges(&members, non_descending.clone()); +(graph_has_multi_node_scc(members.clone(), nd_graph) == false) +} } - } +} } diff --git a/src/v2/stage0/src/std_http_path.rs b/src/v2/stage0/src/std_http_path.rs index c67a8d74b5f..273e30ca225 100644 --- a/src/v2/stage0/src/std_http_path.rs +++ b/src/v2/stage0/src/std_http_path.rs @@ -1,20 +1,24 @@ // Generated by v2 compiler -- do not edit. // Source module: std.http_path -use self::PathSegmentTokensResult::*; -use self::PathTemplateParseResult::*; -use self::UrlPathToken::*; -use crate::v2_rt; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +use self::UrlPathToken::*; +use self::PathSegmentTokensResult::*; +use self::PathTemplateParseResult::*; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum UrlPathToken { - LiteralToken { text: String }, - ParamToken { name: String }, + LiteralToken { + text: String, + }, + ParamToken { + name: String, + }, } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -25,8 +29,13 @@ pub struct PathTemplate { #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum PathSegmentTokensResult { - ParsedSegmentTokens { tokens: Rc>> }, - MalformedPathSegment { segment: String, reason: String }, + ParsedSegmentTokens { + tokens: Rc>>, + }, + MalformedPathSegment { + segment: String, + reason: String, + }, } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -44,242 +53,150 @@ pub enum PathTemplateParseResult { pub fn parse_path_template(raw: &String) -> Rc { { - let path_only = match Rc::new( - raw.clone() - .split(&"?".to_string()) - .map(|s| s.to_string()) - .collect::>(), - ) - .first() - .cloned() - { - Some(p) => p.clone(), - None => raw.clone(), - }; - let segments = Rc::new({ - let mut __result = Vec::new(); - for s in Rc::new( - path_only - .split(&"/".to_string()) - .map(|s| s.to_string()) - .collect::>(), - ) - .iter() - .cloned() - { - if (s.clone().as_str() != "".to_string().as_str()) { - __result.push(s); - } - } - __result - }); - match segments.clone().first().cloned() { - None => Rc::new(PathTemplateParseResult::ParsedPathTemplate { - template: Rc::new(PathTemplate { - tokens: Rc::new(vec![]), - }), - }), - Some(first_seg) => match (*parse_segment_tokens(&first_seg)).clone() { - PathSegmentTokensResult::MalformedPathSegment { - segment: s, - reason: r, - .. - } => Rc::new(PathTemplateParseResult::MalformedPathTemplate { - raw: raw.clone(), - segment: s.clone(), - reason: r.clone(), - }), - PathSegmentTokensResult::ParsedSegmentTokens { - tokens: first_tokens, - .. - } => { - let parsed = Rc::new( - segments - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ) - .iter() - .cloned() - .fold( - Rc::new(PathTemplateParseResult::ParsedPathTemplate { - template: Rc::new(PathTemplate { - tokens: first_tokens.clone(), - }), - }), - |acc: Rc, seg: String| match (*acc.clone()).clone() - { - PathTemplateParseResult::MalformedPathTemplate { .. } => acc.clone(), - PathTemplateParseResult::ParsedPathTemplate { - template: path, .. - } => match (*parse_segment_tokens(&seg)).clone() { - PathSegmentTokensResult::MalformedPathSegment { - segment: s, - reason: r, - .. - } => Rc::new(PathTemplateParseResult::MalformedPathTemplate { - raw: raw.clone(), - segment: s.clone(), - reason: r.clone(), - }), - PathSegmentTokensResult::ParsedSegmentTokens { - tokens: seg_tokens, - .. - } => Rc::new(PathTemplateParseResult::ParsedPathTemplate { - template: Rc::new(PathTemplate { - tokens: v2_rt::concat( - path.tokens.clone(), - seg_tokens.clone(), - ), - }), - }), - }, - }, - ); - parsed - } - }, - } - } + let path_only = match Rc::new(raw.clone().split(&"?".to_string()).map(|s| s.to_string()).collect::>()).first().cloned() { + Some(p) => p.clone(), + None => raw.clone(), +}; +let segments = Rc::new({ let mut __result = Vec::new(); for s in Rc::new(path_only.split(&"/".to_string()).map(|s| s.to_string()).collect::>()).iter().cloned() { if (s.clone().as_str() != "".to_string().as_str()) { __result.push(s); } } __result }); +match segments.clone().first().cloned() { + None => Rc::new(PathTemplateParseResult::ParsedPathTemplate { + template: Rc::new(PathTemplate { + tokens: Rc::new(vec![]), +}), +}), + Some(first_seg) => match (*parse_segment_tokens(&first_seg)).clone() { + PathSegmentTokensResult::MalformedPathSegment { segment: s, reason: r, .. } => Rc::new(PathTemplateParseResult::MalformedPathTemplate { + raw: raw.clone(), + segment: s.clone(), + reason: r.clone(), +}), + PathSegmentTokensResult::ParsedSegmentTokens { tokens: first_tokens, .. } => { + let parsed = Rc::new(segments.clone().iter().cloned().skip(1 as usize).collect::>()).iter().cloned().fold(Rc::new(PathTemplateParseResult::ParsedPathTemplate { + template: Rc::new(PathTemplate { + tokens: first_tokens.clone(), +}), +}), |acc: Rc, seg: String| match (*acc.clone()).clone() { + PathTemplateParseResult::MalformedPathTemplate { .. } => acc.clone(), + PathTemplateParseResult::ParsedPathTemplate { template: path, .. } => match (*parse_segment_tokens(&seg)).clone() { + PathSegmentTokensResult::MalformedPathSegment { segment: s, reason: r, .. } => Rc::new(PathTemplateParseResult::MalformedPathTemplate { + raw: raw.clone(), + segment: s.clone(), + reason: r.clone(), +}), + PathSegmentTokensResult::ParsedSegmentTokens { tokens: seg_tokens, .. } => Rc::new(PathTemplateParseResult::ParsedPathTemplate { + template: Rc::new(PathTemplate { + tokens: v2_rt::concat(path.tokens.clone(), seg_tokens.clone()), +}), +}), +}, +}); +parsed +}, +}, +} +} } pub fn parse_segment_tokens(seg: &String) -> Rc { if !v2_rt::contains(seg.clone(), "{".to_string()) { if v2_rt::contains(seg.clone(), "}".to_string()) { Rc::new(PathSegmentTokensResult::MalformedPathSegment { - segment: seg.clone(), - reason: "stray closing brace".to_string(), - }) + segment: seg.clone(), + reason: "stray closing brace".to_string(), +}) } else { Rc::new(PathSegmentTokensResult::ParsedSegmentTokens { - tokens: Rc::new(vec![Rc::new(UrlPathToken::LiteralToken { - text: seg.clone(), - })]), - }) + tokens: Rc::new(vec![Rc::new(UrlPathToken::LiteralToken { + text: seg.clone(), +})]), +}) } } else { { - let before_and_rest = Rc::new( - seg.clone() - .split(&"{".to_string()) - .map(|s| s.to_string()) - .collect::>(), - ); - if ((before_and_rest.clone().len() as i64) != 2) { + let before_and_rest = Rc::new(seg.clone().split(&"{".to_string()).map(|s| s.to_string()).collect::>()); +if ((before_and_rest.clone().len() as i64) != 2) { return Rc::new(PathSegmentTokensResult::MalformedPathSegment { - segment: seg.clone(), - reason: "multiple opening braces in one segment".to_string(), - }); + segment: seg.clone(), + reason: "multiple opening braces in one segment".to_string(), +}) } - let prefix = match before_and_rest.clone().first().cloned() { - Some(p) => p.clone(), - None => "".to_string(), - }; - let after_open = match before_and_rest.clone().get(1 as usize).cloned() { - Some(r) => r.clone(), - None => "".to_string(), - }; - let name_and_suffix = Rc::new( - after_open - .split(&"}".to_string()) - .map(|s| s.to_string()) - .collect::>(), - ); - if (v2_rt::contains(prefix.clone(), "}".to_string()) - || ((name_and_suffix.clone().len() as i64) != 2)) - { +let prefix = match before_and_rest.clone().first().cloned() { + Some(p) => p.clone(), + None => "".to_string(), +}; +let after_open = match before_and_rest.clone().get(1 as usize).cloned() { + Some(r) => r.clone(), + None => "".to_string(), +}; +let name_and_suffix = Rc::new(after_open.split(&"}".to_string()).map(|s| s.to_string()).collect::>()); +if (v2_rt::contains(prefix.clone(), "}".to_string()) || ((name_and_suffix.clone().len() as i64) != 2)) { return Rc::new(PathSegmentTokensResult::MalformedPathSegment { - segment: seg.clone(), - reason: "missing closing brace or extra closing brace".to_string(), - }); + segment: seg.clone(), + reason: "missing closing brace or extra closing brace".to_string(), +}) } - let param_name = match name_and_suffix.clone().first().cloned() { - Some(p) => p.clone(), - None => "".to_string(), - }; - let suffix = match name_and_suffix.clone().get(1 as usize).cloned() { - Some(s) => s.clone(), - None => "".to_string(), - }; - let prefix_tokens = if (prefix.clone().as_str() != "".to_string().as_str()) { +let param_name = match name_and_suffix.clone().first().cloned() { + Some(p) => p.clone(), + None => "".to_string(), +}; +let suffix = match name_and_suffix.clone().get(1 as usize).cloned() { + Some(s) => s.clone(), + None => "".to_string(), +}; +let prefix_tokens = if (prefix.clone().as_str() != "".to_string().as_str()) { Rc::new(vec![Rc::new(UrlPathToken::LiteralToken { - text: prefix.clone(), - })]) + text: prefix.clone(), +})]) } else { Rc::new(vec![]) }; - let param_tokens = if (param_name.clone().as_str() != "".to_string().as_str()) { +let param_tokens = if (param_name.clone().as_str() != "".to_string().as_str()) { Rc::new(vec![Rc::new(UrlPathToken::ParamToken { - name: param_name.clone(), - })]) + name: param_name.clone(), +})]) } else { Rc::new(vec![]) }; - let suffix_tokens = if (suffix.clone().as_str() != "".to_string().as_str()) { +let suffix_tokens = if (suffix.clone().as_str() != "".to_string().as_str()) { Rc::new(vec![Rc::new(UrlPathToken::LiteralToken { - text: suffix.clone(), - })]) + text: suffix.clone(), +})]) } else { Rc::new(vec![]) }; - if (((param_name.clone().as_str() == "".to_string().as_str()) - || v2_rt::contains(suffix.clone(), "{".to_string())) - || v2_rt::contains(suffix.clone(), "}".to_string())) - { +if (((param_name.clone().as_str() == "".to_string().as_str()) || v2_rt::contains(suffix.clone(), "{".to_string())) || v2_rt::contains(suffix.clone(), "}".to_string())) { Rc::new(PathSegmentTokensResult::MalformedPathSegment { - segment: seg.clone(), - reason: "invalid parameter segment structure".to_string(), - }) + segment: seg.clone(), + reason: "invalid parameter segment structure".to_string(), +}) } else { Rc::new(PathSegmentTokensResult::ParsedSegmentTokens { - tokens: v2_rt::concat( - v2_rt::concat(prefix_tokens, param_tokens), - suffix_tokens, - ), - }) + tokens: v2_rt::concat(v2_rt::concat(prefix_tokens, param_tokens), suffix_tokens), +}) } - } +} } } pub fn has_path_params(template: Rc) -> bool { - { - let mut __found = false; - for t in template.tokens.clone().iter().cloned() { - if match (*t.clone()).clone() { - UrlPathToken::ParamToken { .. } => true, - UrlPathToken::LiteralToken { .. } => false, - } { - __found = true; - break; - } - } - __found - } + { let mut __found = false; for t in template.tokens.clone().iter().cloned() { if match (*t.clone()).clone() { + UrlPathToken::ParamToken { .. } => true, + UrlPathToken::LiteralToken { .. } => false, +} { __found = true; break; } } __found } } pub fn last_path_param(template: Rc) -> Option { { - let params = Rc::new({ - let mut __result = Vec::new(); - for t in template.tokens.clone().iter().cloned() { - if match (*t.clone()).clone() { - UrlPathToken::ParamToken { .. } => true, - UrlPathToken::LiteralToken { .. } => false, - } { - __result.push(t); - } - } - __result - }); - match params.last().cloned() { - Some(tok) => match (*tok.clone()).clone() { - UrlPathToken::ParamToken { name: n, .. } => Some(n.clone()), - UrlPathToken::LiteralToken { .. } => None, - }, - None => None, - } - } + let params = Rc::new({ let mut __result = Vec::new(); for t in template.tokens.clone().iter().cloned() { if match (*t.clone()).clone() { + UrlPathToken::ParamToken { .. } => true, + UrlPathToken::LiteralToken { .. } => false, +} { __result.push(t); } } __result }); +match params.last().cloned() { + Some(tok) => match (*tok.clone()).clone() { + UrlPathToken::ParamToken { name: n, .. } => Some(n.clone()), + UrlPathToken::LiteralToken { .. } => None, +}, + None => None, +} +} } diff --git a/src/v2/stage0/src/std_induction.rs b/src/v2/stage0/src/std_induction.rs index b5fab6085e5..6e274f3f855 100644 --- a/src/v2/stage0/src/std_induction.rs +++ b/src/v2/stage0/src/std_induction.rs @@ -1,35 +1,26 @@ // Generated by v2 compiler -- do not edit. // Source module: std.induction -use self::AtomicCost::*; -use self::CostBound::*; -use self::PolynomialExponent::*; -use self::RecursionShape::*; -use self::SubValueRelation::*; -use crate::std_computation::CallPattern::{ - ArithmeticDivideCall, ArithmeticSubtractCall, ChildAccessorCall, FoldBodyCall, SameArgumentCall, -}; -use crate::std_computation::IterationPrimitive::{Descend, Fold, Repeat}; -use crate::std_computation::ShrinkFactor::{ConstantShrink, ProportionalShrink, UnitShrink}; -use crate::std_computation::SizeBound::{ArithmeticParam, CollectionSize, Forever}; -pub use crate::std_computation::{ - positive_descent_count, tree_size_bound, CallPattern, IterationPrimitive, LoweringTarget, - ShrinkFactor, SizeBound, -}; -use crate::std_termination::DescentEvidence::{DescentUnknown, NonIncreasing, Strict}; -use crate::std_termination::PositiveDescentAmount::{AdditionalStep, OneStep}; -use crate::std_termination::ProportionalDivisor::{DivideByTwo, StrictlyLarger}; -use crate::std_termination::RankingDimension::TreeSize; -pub use crate::std_termination::{ - peano_literal_materialization_cap, positive_descent_amount_from_positive_int, - proportional_divisor_from_int_at_least_two, proportional_divisor_to_int, DescentEvidence, - PositiveDescentAmount, ProportionalDivisor, RankingDimension, -}; -use crate::v2_rt; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::std_termination::{DescentEvidence, RankingDimension, PositiveDescentAmount, ProportionalDivisor, proportional_divisor_to_int, positive_descent_amount_from_positive_int, proportional_divisor_from_int_at_least_two, peano_literal_materialization_cap}; +use crate::std_termination::DescentEvidence::{Strict, NonIncreasing, DescentUnknown}; +use crate::std_termination::RankingDimension::{TreeSize}; +use crate::std_termination::PositiveDescentAmount::{OneStep, AdditionalStep}; +use crate::std_termination::ProportionalDivisor::{DivideByTwo, StrictlyLarger}; +pub use crate::std_computation::{CallPattern, LoweringTarget, IterationPrimitive, ShrinkFactor, tree_size_bound, positive_descent_count, SizeBound}; +use crate::std_computation::CallPattern::{ChildAccessorCall, FoldBodyCall, SameArgumentCall, ArithmeticSubtractCall, ArithmeticDivideCall}; +use crate::std_computation::IterationPrimitive::{Descend, Fold, Repeat}; +use crate::std_computation::ShrinkFactor::{UnitShrink, ConstantShrink, ProportionalShrink}; +use crate::std_computation::SizeBound::{CollectionSize, ArithmeticParam, Forever}; +use self::RecursionShape::*; +use self::SubValueRelation::*; +use self::PolynomialExponent::*; +use self::AtomicCost::*; +use self::CostBound::*; #[derive(Debug, Clone, Copy, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] @@ -52,42 +43,37 @@ pub struct InductiveField { pub fn recursion_shape_eq(a: RecursionShape, b: RecursionShape) -> bool { match a { - RecursionShape::DirectRecursion => match b { - RecursionShape::DirectRecursion => true, - _ => false, - }, - RecursionShape::ListRecursion => match b { - RecursionShape::ListRecursion => true, - _ => false, - }, - RecursionShape::OptionalRecursion => match b { - RecursionShape::OptionalRecursion => true, - _ => false, - }, - RecursionShape::SetRecursion => match b { - RecursionShape::SetRecursion => true, - _ => false, - }, - RecursionShape::MapValueRecursion => match b { - RecursionShape::MapValueRecursion => true, - _ => false, - }, - } + RecursionShape::DirectRecursion => match b { + RecursionShape::DirectRecursion => true, + _ => false, +}, + RecursionShape::ListRecursion => match b { + RecursionShape::ListRecursion => true, + _ => false, +}, + RecursionShape::OptionalRecursion => match b { + RecursionShape::OptionalRecursion => true, + _ => false, +}, + RecursionShape::SetRecursion => match b { + RecursionShape::SetRecursion => true, + _ => false, +}, + RecursionShape::MapValueRecursion => match b { + RecursionShape::MapValueRecursion => true, + _ => false, +}, +} } pub fn inductive_field_eq(a: &Rc, b: &Rc) -> bool { - (((((a.type_name.clone().as_str() == b.type_name.clone().as_str()) - && (a.variant_name.clone().as_str() == b.variant_name.clone().as_str())) - && (a.field_name.clone().as_str() == b.field_name.clone().as_str())) - && recursion_shape_eq(a.shape.clone(), b.shape.clone())) - && (a.element_type.clone().as_str() == b.element_type.clone().as_str())) + (((((a.type_name.clone().as_str() == b.type_name.clone().as_str()) && (a.variant_name.clone().as_str() == b.variant_name.clone().as_str())) && (a.field_name.clone().as_str() == b.field_name.clone().as_str())) && recursion_shape_eq(a.shape.clone(), b.shape.clone())) && (a.element_type.clone().as_str() == b.element_type.clone().as_str())) } -pub fn inductive_field_to_dimension( - field: Rc, - param: String, -) -> Rc { - Rc::new(RankingDimension::TreeSize { param: param }) +pub fn inductive_field_to_dimension(field: Rc, param: String) -> Rc { + Rc::new(RankingDimension::TreeSize { + param: param, +}) } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -110,344 +96,256 @@ pub enum SubValueRelation { pub fn sub_value_to_evidence(relation: Rc) -> DescentEvidence { match (*relation).clone() { - SubValueRelation::StrictSubValue { factor: f, .. } => match (*f.clone()).clone() { - ShrinkFactor::UnitShrink => DescentEvidence::Strict, - ShrinkFactor::ConstantShrink { .. } => DescentEvidence::Strict, - ShrinkFactor::ProportionalShrink { .. } => DescentEvidence::Strict, - }, - SubValueRelation::IteratedSubValue { .. } => DescentEvidence::Strict, - SubValueRelation::ArithmeticDescent { factor: f, .. } => match (*f.clone()).clone() { - ShrinkFactor::UnitShrink => DescentEvidence::Strict, - ShrinkFactor::ConstantShrink { .. } => DescentEvidence::Strict, - ShrinkFactor::ProportionalShrink { .. } => DescentEvidence::Strict, - }, - SubValueRelation::PreservedValue => DescentEvidence::NonIncreasing, - SubValueRelation::SubValueUnknown => DescentEvidence::DescentUnknown, - } + SubValueRelation::StrictSubValue { factor: f, .. } => match (*f.clone()).clone() { + ShrinkFactor::UnitShrink => DescentEvidence::Strict, + ShrinkFactor::ConstantShrink { .. } => DescentEvidence::Strict, + ShrinkFactor::ProportionalShrink { .. } => DescentEvidence::Strict, +}, + SubValueRelation::IteratedSubValue { .. } => DescentEvidence::Strict, + SubValueRelation::ArithmeticDescent { factor: f, .. } => match (*f.clone()).clone() { + ShrinkFactor::UnitShrink => DescentEvidence::Strict, + ShrinkFactor::ConstantShrink { .. } => DescentEvidence::Strict, + ShrinkFactor::ProportionalShrink { .. } => DescentEvidence::Strict, +}, + SubValueRelation::PreservedValue => DescentEvidence::NonIncreasing, + SubValueRelation::SubValueUnknown => DescentEvidence::DescentUnknown, +} } pub fn shrink_factor_eq(a: Rc, b: Rc) -> bool { match (*a).clone() { - ShrinkFactor::UnitShrink => match (*b).clone() { - ShrinkFactor::UnitShrink => true, - _ => false, - }, - ShrinkFactor::ConstantShrink { steps: sa, .. } => match (*b).clone() { - ShrinkFactor::ConstantShrink { steps: sb, .. } => { - (positive_descent_count(sa.clone()) == positive_descent_count(sb.clone())) - } - _ => false, - }, - ShrinkFactor::ProportionalShrink { divisor: da, .. } => match (*b).clone() { - ShrinkFactor::ProportionalShrink { divisor: db, .. } => { - (proportional_divisor_to_int(da.clone()) == proportional_divisor_to_int(db.clone())) - } - _ => false, - }, - } + ShrinkFactor::UnitShrink => match (*b).clone() { + ShrinkFactor::UnitShrink => true, + _ => false, +}, + ShrinkFactor::ConstantShrink { steps: sa, .. } => match (*b).clone() { + ShrinkFactor::ConstantShrink { steps: sb, .. } => (positive_descent_count(sa.clone()) == positive_descent_count(sb.clone())), + _ => false, +}, + ShrinkFactor::ProportionalShrink { divisor: da, .. } => match (*b).clone() { + ShrinkFactor::ProportionalShrink { divisor: db, .. } => (proportional_divisor_to_int(da.clone()) == proportional_divisor_to_int(db.clone())), + _ => false, +}, +} } pub fn meet_sub_value(a: Rc, b: Rc) -> Rc { match (*a.clone()).clone() { - SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), - SubValueRelation::PreservedValue => match (*b).clone() { - SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), - _ => Rc::new(SubValueRelation::PreservedValue), - }, - SubValueRelation::StrictSubValue { - field: fa, - factor: fac_a, - .. - } => match (*b).clone() { - SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), - SubValueRelation::PreservedValue => Rc::new(SubValueRelation::PreservedValue), - SubValueRelation::StrictSubValue { - field: fb, - factor: fac_b, - .. - } => { - if inductive_field_eq(&fa, &fb) { - if shrink_factor_eq(fac_a.clone(), fac_b.clone()) { - Rc::new(SubValueRelation::StrictSubValue { - field: fa.clone(), - factor: fac_a.clone(), - }) - } else { - Rc::new(SubValueRelation::SubValueUnknown) - } - } else { - Rc::new(SubValueRelation::SubValueUnknown) - } - } - _ => Rc::new(SubValueRelation::SubValueUnknown), - }, - SubValueRelation::IteratedSubValue { field: fa, .. } => match (*b).clone() { - SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), - SubValueRelation::PreservedValue => Rc::new(SubValueRelation::PreservedValue), - SubValueRelation::IteratedSubValue { field: fb, .. } => { - if inductive_field_eq(&fa, &fb) { - a.clone() - } else { - Rc::new(SubValueRelation::SubValueUnknown) - } - } - _ => Rc::new(SubValueRelation::SubValueUnknown), - }, - SubValueRelation::ArithmeticDescent { - param: pa, - factor: fac_a, - .. - } => match (*b).clone() { - SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), - SubValueRelation::PreservedValue => Rc::new(SubValueRelation::PreservedValue), - SubValueRelation::ArithmeticDescent { - param: pb, - factor: fac_b, - .. - } => { - if (pa.clone().as_str() == pb.clone().as_str()) { - if shrink_factor_eq(fac_a.clone(), fac_b.clone()) { - Rc::new(SubValueRelation::ArithmeticDescent { - param: pa.clone(), - factor: fac_a.clone(), - }) - } else { - Rc::new(SubValueRelation::SubValueUnknown) - } - } else { - Rc::new(SubValueRelation::SubValueUnknown) - } - } - _ => Rc::new(SubValueRelation::SubValueUnknown), - }, - } + SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), + SubValueRelation::PreservedValue => match (*b).clone() { + SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), + _ => Rc::new(SubValueRelation::PreservedValue), +}, + SubValueRelation::StrictSubValue { field: fa, factor: fac_a, .. } => match (*b).clone() { + SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), + SubValueRelation::PreservedValue => Rc::new(SubValueRelation::PreservedValue), + SubValueRelation::StrictSubValue { field: fb, factor: fac_b, .. } => if inductive_field_eq(&fa, &fb) { + if shrink_factor_eq(fac_a.clone(), fac_b.clone()) { + Rc::new(SubValueRelation::StrictSubValue { + field: fa.clone(), + factor: fac_a.clone(), +}) + } else { + Rc::new(SubValueRelation::SubValueUnknown) + } + } else { + Rc::new(SubValueRelation::SubValueUnknown) + }, + _ => Rc::new(SubValueRelation::SubValueUnknown), +}, + SubValueRelation::IteratedSubValue { field: fa, .. } => match (*b).clone() { + SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), + SubValueRelation::PreservedValue => Rc::new(SubValueRelation::PreservedValue), + SubValueRelation::IteratedSubValue { field: fb, .. } => if inductive_field_eq(&fa, &fb) { + a.clone() + } else { + Rc::new(SubValueRelation::SubValueUnknown) + }, + _ => Rc::new(SubValueRelation::SubValueUnknown), +}, + SubValueRelation::ArithmeticDescent { param: pa, factor: fac_a, .. } => match (*b).clone() { + SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), + SubValueRelation::PreservedValue => Rc::new(SubValueRelation::PreservedValue), + SubValueRelation::ArithmeticDescent { param: pb, factor: fac_b, .. } => if (pa.clone().as_str() == pb.clone().as_str()) { + if shrink_factor_eq(fac_a.clone(), fac_b.clone()) { + Rc::new(SubValueRelation::ArithmeticDescent { + param: pa.clone(), + factor: fac_a.clone(), +}) + } else { + Rc::new(SubValueRelation::SubValueUnknown) + } + } else { + Rc::new(SubValueRelation::SubValueUnknown) + }, + _ => Rc::new(SubValueRelation::SubValueUnknown), +}, +} } pub fn join_sub_value(a: Rc, b: Rc) -> Rc { match (*a.clone()).clone() { - SubValueRelation::SubValueUnknown => b.clone(), - SubValueRelation::PreservedValue => match (*b.clone()).clone() { - SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::PreservedValue), - _ => b.clone(), - }, - SubValueRelation::StrictSubValue { - field: fa, - factor: fac_a, - .. - } => match (*b.clone()).clone() { - SubValueRelation::SubValueUnknown => a.clone(), - SubValueRelation::PreservedValue => a.clone(), - SubValueRelation::StrictSubValue { - field: fb, - factor: fac_b, - .. - } => { - if inductive_field_eq(&fa, &fb) { - if shrink_factor_eq(fac_a.clone(), fac_b.clone()) { - Rc::new(SubValueRelation::StrictSubValue { - field: fa.clone(), - factor: fac_a.clone(), - }) - } else { - Rc::new(SubValueRelation::SubValueUnknown) - } - } else { - Rc::new(SubValueRelation::SubValueUnknown) - } - } - _ => Rc::new(SubValueRelation::SubValueUnknown), - }, - SubValueRelation::IteratedSubValue { field: fa, .. } => match (*b.clone()).clone() { - SubValueRelation::SubValueUnknown => a.clone(), - SubValueRelation::PreservedValue => a.clone(), - SubValueRelation::IteratedSubValue { field: fb, .. } => { - if inductive_field_eq(&fa, &fb) { - a.clone() - } else { - Rc::new(SubValueRelation::SubValueUnknown) - } - } - _ => Rc::new(SubValueRelation::SubValueUnknown), - }, - SubValueRelation::ArithmeticDescent { - param: pa, - factor: fac_a, - .. - } => match (*b.clone()).clone() { - SubValueRelation::SubValueUnknown => a.clone(), - SubValueRelation::PreservedValue => a.clone(), - SubValueRelation::ArithmeticDescent { - param: pb, - factor: fac_b, - .. - } => { - if (pa.clone().as_str() == pb.clone().as_str()) { - if shrink_factor_eq(fac_a.clone(), fac_b.clone()) { - Rc::new(SubValueRelation::ArithmeticDescent { - param: pa.clone(), - factor: fac_a.clone(), - }) - } else { - Rc::new(SubValueRelation::SubValueUnknown) - } - } else { - Rc::new(SubValueRelation::SubValueUnknown) - } - } - _ => Rc::new(SubValueRelation::SubValueUnknown), - }, - } + SubValueRelation::SubValueUnknown => b.clone(), + SubValueRelation::PreservedValue => match (*b.clone()).clone() { + SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::PreservedValue), + _ => b.clone(), +}, + SubValueRelation::StrictSubValue { field: fa, factor: fac_a, .. } => match (*b.clone()).clone() { + SubValueRelation::SubValueUnknown => a.clone(), + SubValueRelation::PreservedValue => a.clone(), + SubValueRelation::StrictSubValue { field: fb, factor: fac_b, .. } => if inductive_field_eq(&fa, &fb) { + if shrink_factor_eq(fac_a.clone(), fac_b.clone()) { + Rc::new(SubValueRelation::StrictSubValue { + field: fa.clone(), + factor: fac_a.clone(), +}) + } else { + Rc::new(SubValueRelation::SubValueUnknown) + } + } else { + Rc::new(SubValueRelation::SubValueUnknown) + }, + _ => Rc::new(SubValueRelation::SubValueUnknown), +}, + SubValueRelation::IteratedSubValue { field: fa, .. } => match (*b.clone()).clone() { + SubValueRelation::SubValueUnknown => a.clone(), + SubValueRelation::PreservedValue => a.clone(), + SubValueRelation::IteratedSubValue { field: fb, .. } => if inductive_field_eq(&fa, &fb) { + a.clone() + } else { + Rc::new(SubValueRelation::SubValueUnknown) + }, + _ => Rc::new(SubValueRelation::SubValueUnknown), +}, + SubValueRelation::ArithmeticDescent { param: pa, factor: fac_a, .. } => match (*b.clone()).clone() { + SubValueRelation::SubValueUnknown => a.clone(), + SubValueRelation::PreservedValue => a.clone(), + SubValueRelation::ArithmeticDescent { param: pb, factor: fac_b, .. } => if (pa.clone().as_str() == pb.clone().as_str()) { + if shrink_factor_eq(fac_a.clone(), fac_b.clone()) { + Rc::new(SubValueRelation::ArithmeticDescent { + param: pa.clone(), + factor: fac_a.clone(), +}) + } else { + Rc::new(SubValueRelation::SubValueUnknown) + } + } else { + Rc::new(SubValueRelation::SubValueUnknown) + }, + _ => Rc::new(SubValueRelation::SubValueUnknown), +}, +} } -pub fn compose_sub_value( - base: Rc, - field: Rc, -) -> Rc { +pub fn compose_sub_value(base: Rc, field: Rc) -> Rc { match (*base).clone() { - SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), - _ => Rc::new(SubValueRelation::StrictSubValue { - field: field, - factor: Rc::new(ShrinkFactor::UnitShrink), - }), - } + SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), + _ => Rc::new(SubValueRelation::StrictSubValue { + field: field, + factor: Rc::new(ShrinkFactor::UnitShrink), +}), +} } -pub fn compose_sub_value_relations( - arg_rel: Rc, - callee_rel: Rc, -) -> Rc { +pub fn compose_sub_value_relations(arg_rel: Rc, callee_rel: Rc) -> Rc { match (*callee_rel.clone()).clone() { - SubValueRelation::PreservedValue => arg_rel, - SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), - SubValueRelation::StrictSubValue { .. } => match (*arg_rel).clone() { - SubValueRelation::PreservedValue => callee_rel.clone(), - SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), - SubValueRelation::StrictSubValue { field: f, .. } => { - Rc::new(SubValueRelation::StrictSubValue { - field: f.clone(), - factor: Rc::new(ShrinkFactor::UnitShrink), - }) - } - SubValueRelation::IteratedSubValue { field: f, .. } => { - Rc::new(SubValueRelation::StrictSubValue { - field: f.clone(), - factor: Rc::new(ShrinkFactor::UnitShrink), - }) - } - SubValueRelation::ArithmeticDescent { .. } => { - Rc::new(SubValueRelation::SubValueUnknown) - } - }, - SubValueRelation::IteratedSubValue { .. } => match (*arg_rel).clone() { - SubValueRelation::PreservedValue => callee_rel.clone(), - SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), - SubValueRelation::StrictSubValue { field: f, .. } => { - Rc::new(SubValueRelation::StrictSubValue { - field: f.clone(), - factor: Rc::new(ShrinkFactor::UnitShrink), - }) - } - SubValueRelation::IteratedSubValue { field: f, .. } => { - Rc::new(SubValueRelation::StrictSubValue { - field: f.clone(), - factor: Rc::new(ShrinkFactor::UnitShrink), - }) - } - SubValueRelation::ArithmeticDescent { .. } => { - Rc::new(SubValueRelation::SubValueUnknown) - } - }, - SubValueRelation::ArithmeticDescent { - param: p, - factor: f, - .. - } => match (*arg_rel).clone() { - SubValueRelation::PreservedValue => Rc::new(SubValueRelation::ArithmeticDescent { - param: p.clone(), - factor: f.clone(), - }), - _ => Rc::new(SubValueRelation::SubValueUnknown), - }, - } + SubValueRelation::PreservedValue => arg_rel, + SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), + SubValueRelation::StrictSubValue { .. } => match (*arg_rel).clone() { + SubValueRelation::PreservedValue => callee_rel.clone(), + SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), + SubValueRelation::StrictSubValue { field: f, .. } => Rc::new(SubValueRelation::StrictSubValue { + field: f.clone(), + factor: Rc::new(ShrinkFactor::UnitShrink), +}), + SubValueRelation::IteratedSubValue { field: f, .. } => Rc::new(SubValueRelation::StrictSubValue { + field: f.clone(), + factor: Rc::new(ShrinkFactor::UnitShrink), +}), + SubValueRelation::ArithmeticDescent { .. } => Rc::new(SubValueRelation::SubValueUnknown), +}, + SubValueRelation::IteratedSubValue { .. } => match (*arg_rel).clone() { + SubValueRelation::PreservedValue => callee_rel.clone(), + SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), + SubValueRelation::StrictSubValue { field: f, .. } => Rc::new(SubValueRelation::StrictSubValue { + field: f.clone(), + factor: Rc::new(ShrinkFactor::UnitShrink), +}), + SubValueRelation::IteratedSubValue { field: f, .. } => Rc::new(SubValueRelation::StrictSubValue { + field: f.clone(), + factor: Rc::new(ShrinkFactor::UnitShrink), +}), + SubValueRelation::ArithmeticDescent { .. } => Rc::new(SubValueRelation::SubValueUnknown), +}, + SubValueRelation::ArithmeticDescent { param: p, factor: f, .. } => match (*arg_rel).clone() { + SubValueRelation::PreservedValue => Rc::new(SubValueRelation::ArithmeticDescent { + param: p.clone(), + factor: f.clone(), +}), + _ => Rc::new(SubValueRelation::SubValueUnknown), +}, +} } pub fn sub_value_to_call_pattern(relation: Rc) -> Option> { match (*relation).clone() { - SubValueRelation::StrictSubValue { field: f, .. } => { - Some(Rc::new(CallPattern::ChildAccessorCall { - accessor: f.field_name.clone(), - })) - } - SubValueRelation::IteratedSubValue { field: f, .. } => { - Some(Rc::new(CallPattern::ChildAccessorCall { - accessor: f.field_name.clone(), - })) - } - SubValueRelation::ArithmeticDescent { - param: p, - factor: f, - .. - } => match (*f.clone()).clone() { - ShrinkFactor::ConstantShrink { steps, .. } => { - Some(Rc::new(CallPattern::ArithmeticSubtractCall { - steps: steps.clone(), - ring_param: p.clone(), - })) - } - ShrinkFactor::ProportionalShrink { divisor: d, .. } => { - Some(Rc::new(CallPattern::ArithmeticDivideCall { - divisor: d.clone(), - ring_param: p.clone(), - })) - } - ShrinkFactor::UnitShrink => Some(Rc::new(CallPattern::ArithmeticSubtractCall { - steps: Rc::new(PositiveDescentAmount::OneStep), - ring_param: p.clone(), - })), - }, - SubValueRelation::PreservedValue => Some(Rc::new(CallPattern::SameArgumentCall)), - SubValueRelation::SubValueUnknown => None, - } + SubValueRelation::StrictSubValue { field: f, .. } => Some(Rc::new(CallPattern::ChildAccessorCall { + accessor: f.field_name.clone(), +})), + SubValueRelation::IteratedSubValue { field: f, .. } => Some(Rc::new(CallPattern::ChildAccessorCall { + accessor: f.field_name.clone(), +})), + SubValueRelation::ArithmeticDescent { param: p, factor: f, .. } => match (*f.clone()).clone() { + ShrinkFactor::ConstantShrink { steps, .. } => Some(Rc::new(CallPattern::ArithmeticSubtractCall { + steps: steps.clone(), + ring_param: p.clone(), +})), + ShrinkFactor::ProportionalShrink { divisor: d, .. } => Some(Rc::new(CallPattern::ArithmeticDivideCall { + divisor: d.clone(), + ring_param: p.clone(), +})), + ShrinkFactor::UnitShrink => Some(Rc::new(CallPattern::ArithmeticSubtractCall { + steps: Rc::new(PositiveDescentAmount::OneStep), + ring_param: p.clone(), +})), +}, + SubValueRelation::PreservedValue => Some(Rc::new(CallPattern::SameArgumentCall)), + SubValueRelation::SubValueUnknown => None, +} } pub fn sub_value_to_lowering_target(relation: Rc) -> Option> { match (*relation).clone() { - SubValueRelation::StrictSubValue { - field: f, - factor: fac, - .. - } => Some(Rc::new(LoweringTarget { - primitive: IterationPrimitive::Descend, - bound: tree_size_bound(f.field_name.clone()), - evidence: DescentEvidence::Strict, - factor: Some(fac.clone()), - })), - SubValueRelation::IteratedSubValue { field: f, .. } => Some(Rc::new(LoweringTarget { - primitive: IterationPrimitive::Fold, - bound: Rc::new(SizeBound::CollectionSize { - param: f.field_name.clone(), - }), - evidence: DescentEvidence::Strict, - factor: None, - })), - SubValueRelation::ArithmeticDescent { - param: p, - factor: fac, - .. - } => Some(Rc::new(LoweringTarget { - primitive: IterationPrimitive::Repeat, - bound: Rc::new(SizeBound::ArithmeticParam { param: p.clone() }), - evidence: DescentEvidence::Strict, - factor: Some(fac.clone()), - })), - SubValueRelation::PreservedValue => Some(Rc::new(LoweringTarget { - primitive: IterationPrimitive::Repeat, - bound: Rc::new(SizeBound::Forever), - evidence: DescentEvidence::NonIncreasing, - factor: None, - })), - SubValueRelation::SubValueUnknown => None, - } + SubValueRelation::StrictSubValue { field: f, factor: fac, .. } => Some(Rc::new(LoweringTarget { + primitive: IterationPrimitive::Descend, + bound: tree_size_bound(f.field_name.clone()), + evidence: DescentEvidence::Strict, + factor: Some(fac.clone()), +})), + SubValueRelation::IteratedSubValue { field: f, .. } => Some(Rc::new(LoweringTarget { + primitive: IterationPrimitive::Fold, + bound: Rc::new(SizeBound::CollectionSize { + param: f.field_name.clone(), +}), + evidence: DescentEvidence::Strict, + factor: None, +})), + SubValueRelation::ArithmeticDescent { param: p, factor: fac, .. } => Some(Rc::new(LoweringTarget { + primitive: IterationPrimitive::Repeat, + bound: Rc::new(SizeBound::ArithmeticParam { + param: p.clone(), +}), + evidence: DescentEvidence::Strict, + factor: Some(fac.clone()), +})), + SubValueRelation::PreservedValue => Some(Rc::new(LoweringTarget { + primitive: IterationPrimitive::Repeat, + bound: Rc::new(SizeBound::Forever), + evidence: DescentEvidence::NonIncreasing, + factor: None, +})), + SubValueRelation::SubValueUnknown => None, +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -469,8 +367,8 @@ pub enum PolynomialExponent { pub fn poly_exp_degree_one() -> Rc { Rc::new(PolynomialExponent::IntegerExpPos { - degree: Rc::new(PositiveDescentAmount::OneStep), - }) + degree: Rc::new(PositiveDescentAmount::OneStep), +}) } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -515,23 +413,23 @@ pub enum CostBound { pub fn sum_bound(terms: &Rc>>) -> Rc { match terms.clone().first().cloned() { - None => Rc::new(CostBound::ErrorBound), - Some(_) => Rc::new(CostBound::SumBound { - terms: terms.clone(), - }), - } + None => Rc::new(CostBound::ErrorBound), + Some(_) => Rc::new(CostBound::SumBound { + terms: terms.clone(), +}), +} } pub fn cost_bound_is_sum_bound(b: Rc) -> bool { match (*b).clone() { - CostBound::SumBound { .. } => true, - CostBound::ConstantBound => false, - CostBound::AtomicBound { .. } => false, - CostBound::ProductBound { .. } => false, - CostBound::SumOfProductsBound { .. } => false, - CostBound::ForeverBound => false, - CostBound::ErrorBound => false, - } + CostBound::SumBound { .. } => true, + CostBound::ConstantBound => false, + CostBound::AtomicBound { .. } => false, + CostBound::ProductBound { .. } => false, + CostBound::SumOfProductsBound { .. } => false, + CostBound::ForeverBound => false, + CostBound::ErrorBound => false, +} } pub fn cost_constant() -> Rc { @@ -540,11 +438,11 @@ pub fn cost_constant() -> Rc { pub fn cost_linear(param: String) -> Rc { Rc::new(CostBound::AtomicBound { - cost: Rc::new(AtomicCost::PolyCost { - param: param, - exponent: poly_exp_degree_one(), - }), - }) + cost: Rc::new(AtomicCost::PolyCost { + param: param, + exponent: poly_exp_degree_one(), +}), +}) } pub fn cost_poly(param: String, degree: i64) -> Rc { @@ -553,23 +451,23 @@ pub fn cost_poly(param: String, degree: i64) -> Rc { } else { if (degree.clone() == 0) { Rc::new(CostBound::AtomicBound { - cost: Rc::new(AtomicCost::PolyCost { - param: param, - exponent: Rc::new(PolynomialExponent::IntegerExpZero), - }), - }) + cost: Rc::new(AtomicCost::PolyCost { + param: param, + exponent: Rc::new(PolynomialExponent::IntegerExpZero), +}), +}) } else { match positive_descent_amount_from_positive_int(degree.clone()) { - Some(deg) => Rc::new(CostBound::AtomicBound { - cost: Rc::new(AtomicCost::PolyCost { - param: param, - exponent: Rc::new(PolynomialExponent::IntegerExpPos { - degree: deg.clone(), - }), - }), - }), - None => Rc::new(CostBound::ErrorBound), - } + Some(deg) => Rc::new(CostBound::AtomicBound { + cost: Rc::new(AtomicCost::PolyCost { + param: param, + exponent: Rc::new(PolynomialExponent::IntegerExpPos { + degree: deg.clone(), +}), +}), +}), + None => Rc::new(CostBound::ErrorBound), +} } } } @@ -579,17 +477,17 @@ pub fn cost_root(param: String, k: i64) -> Rc { Rc::new(CostBound::ErrorBound) } else { match positive_descent_amount_from_positive_int(k.clone()) { - Some(rw) => Rc::new(CostBound::AtomicBound { - cost: Rc::new(AtomicCost::PolyCost { - param: param, - exponent: Rc::new(PolynomialExponent::FractionExp { - numerator: Rc::new(PositiveDescentAmount::OneStep), - root: rw.clone(), - }), - }), - }), - None => Rc::new(CostBound::ErrorBound), - } + Some(rw) => Rc::new(CostBound::AtomicBound { + cost: Rc::new(AtomicCost::PolyCost { + param: param, + exponent: Rc::new(PolynomialExponent::FractionExp { + numerator: Rc::new(PositiveDescentAmount::OneStep), + root: rw.clone(), +}), +}), +}), + None => Rc::new(CostBound::ErrorBound), +} } } @@ -603,37 +501,33 @@ pub fn cost_cbrt(param: String) -> Rc { pub fn cost_log(param: String) -> Rc { Rc::new(CostBound::AtomicBound { - cost: Rc::new(AtomicCost::LogCost { param: param }), - }) + cost: Rc::new(AtomicCost::LogCost { + param: param, +}), +}) } pub fn cost_nlogn(param: &String) -> Rc { Rc::new(CostBound::ProductBound { - factors: Rc::new(vec![ - Rc::new(AtomicCost::PolyCost { - param: param.clone(), - exponent: poly_exp_degree_one(), - }), - Rc::new(AtomicCost::LogCost { - param: param.clone(), - }), - ]), - }) + factors: Rc::new(vec![Rc::new(AtomicCost::PolyCost { + param: param.clone(), + exponent: poly_exp_degree_one(), +}), Rc::new(AtomicCost::LogCost { + param: param.clone(), +})]), +}) } pub fn cost_graph_linear(v_param: String, e_param: String) -> Rc { Rc::new(CostBound::SumOfProductsBound { - terms: Rc::new(vec![ - Rc::new(vec![Rc::new(AtomicCost::PolyCost { - param: v_param, - exponent: poly_exp_degree_one(), - })]), - Rc::new(vec![Rc::new(AtomicCost::PolyCost { - param: e_param, - exponent: poly_exp_degree_one(), - })]), - ]), - }) + terms: Rc::new(vec![Rc::new(vec![Rc::new(AtomicCost::PolyCost { + param: v_param, + exponent: poly_exp_degree_one(), +})]), Rc::new(vec![Rc::new(AtomicCost::PolyCost { + param: e_param, + exponent: poly_exp_degree_one(), +})])]), +}) } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -725,46 +619,41 @@ pub fn bounded_int_pow_exponent(k: i64) -> Option { } pub fn int_pow_bounded(base: i64, exp: i64) -> Option { - stacker::maybe_grow( - 512 * 1024, - 2 * 1024 * 1024, - || match bounded_int_pow_exponent(exp.clone()) { - None => None, - Some(e) => { - if (e.clone() == 0) { + stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { + match bounded_int_pow_exponent(exp.clone()) { + None => None, + Some(e) => if (e.clone() == 0) { + Some(1) + } else { + if (base.clone() == 0) { + Some(0) + } else { + if (base.clone() == 1) { Some(1) } else { - if (base.clone() == 0) { - Some(0) - } else { - if (base.clone() == 1) { - Some(1) - } else { - if (base.clone() == (0 - 1)) { - { - let half = (e.clone() / 2); - if ((half.clone() + half.clone()) == e.clone()) { - Some(1) - } else { - Some((0 - 1)) - } - } + if (base.clone() == (0 - 1)) { + { + let half = (e.clone() / 2); +if ((half.clone() + half.clone()) == e.clone()) { + Some(1) } else { - match int_pow_bounded(base.clone(), (exp.clone() - 1)) { - Some(prev) => match int_mul_checked(base.clone(), prev.clone()) - { - Some(prod) => Some(prod.clone()), - None => None, - }, - None => None, - } + Some((0 - 1)) } - } +} + } else { + match int_pow_bounded(base.clone(), (exp.clone() - 1)) { + Some(prev) => match int_mul_checked(base.clone(), prev.clone()) { + Some(prod) => Some(prod.clone()), + None => None, +}, + None => None, +} } } } }, - ) +} + }) } pub fn ceil_log(base: i64, argument: i64) -> Option { @@ -779,97 +668,82 @@ pub fn ceil_log_iter(mut base: i64, mut argument: i64, mut k: i64, mut power: i6 loop { if (power.clone() >= argument.clone()) { break Some(k); - } else { +} else { match int_mul_checked(power.clone(), base.clone()) { - None => { - break None; - } - Some(next_power) => match int_add_checked(k, 1) { - None => { - break None; - } - Some(k1) => { - let __tco_0 = k1.clone(); - let __tco_1 = next_power.clone(); - k = __tco_0; - power = __tco_1; - continue; - } - }, - } - } - } + None => { break None; }, + Some(next_power) => { match int_add_checked(k, 1) { + None => { break None; }, + Some(k1) => { { + let __tco_0 = k1.clone(); +let __tco_1 = next_power.clone(); +k = __tco_0; +power = __tco_1; +continue; +} }, +} }, +} +} +} } pub fn master_theorem(form: &Rc) -> Rc { { let a = form.branches.clone(); - let b = form.divisor.clone(); - let d = form.work_exponent.clone(); - let n = form.param.clone(); - if ((a.clone() < 1) || (b.clone() < 2)) { +let b = form.divisor.clone(); +let d = form.work_exponent.clone(); +let n = form.param.clone(); +if ((a.clone() < 1) || (b.clone() < 2)) { Rc::new(CostBound::ErrorBound) } else { match bounded_int_pow_exponent(d) { - None => Rc::new(CostBound::ErrorBound), - Some(d_ok) => match int_pow_bounded(b.clone(), d_ok.clone()) { - None => Rc::new(CostBound::ErrorBound), - Some(b_to_d) => { - if (a.clone() < b_to_d.clone()) { - match d_ok.clone() { - 0 => Rc::new(CostBound::ConstantBound), - _ => cost_poly(n.clone(), d_ok.clone()), - } - } else { - if (a.clone() == b_to_d.clone()) { - match d_ok.clone() { - 0 => cost_log(n.clone()), - _ => match positive_descent_amount_from_positive_int( - d_ok.clone(), - ) { - Some(deg) => Rc::new(CostBound::ProductBound { - factors: Rc::new(vec![ - Rc::new(AtomicCost::PolyCost { - param: n.clone(), - exponent: Rc::new( - PolynomialExponent::IntegerExpPos { - degree: deg.clone(), - }, - ), - }), - Rc::new(AtomicCost::LogCost { param: n.clone() }), - ]), - }), - None => Rc::new(CostBound::ErrorBound), - }, - } - } else { - match proportional_divisor_from_int_at_least_two(b.clone()) { - Some(base_w) => { - match positive_descent_amount_from_positive_int(a.clone()) { - Some(arg_w) => Rc::new(CostBound::AtomicBound { - cost: Rc::new(AtomicCost::PolyCost { - param: n.clone(), - exponent: Rc::new( - PolynomialExponent::LogBasedExp { - base: base_w.clone(), - argument: arg_w.clone(), - }, - ), - }), - }), - None => Rc::new(CostBound::ErrorBound), - } - } - None => Rc::new(CostBound::ErrorBound), - } - } - } - } - }, - } + None => Rc::new(CostBound::ErrorBound), + Some(d_ok) => match int_pow_bounded(b.clone(), d_ok.clone()) { + None => Rc::new(CostBound::ErrorBound), + Some(b_to_d) => if (a.clone() < b_to_d.clone()) { + match d_ok.clone() { + 0 => Rc::new(CostBound::ConstantBound), + _ => cost_poly(n.clone(), d_ok.clone()), +} + } else { + if (a.clone() == b_to_d.clone()) { + match d_ok.clone() { + 0 => cost_log(n.clone()), + _ => match positive_descent_amount_from_positive_int(d_ok.clone()) { + Some(deg) => Rc::new(CostBound::ProductBound { + factors: Rc::new(vec![Rc::new(AtomicCost::PolyCost { + param: n.clone(), + exponent: Rc::new(PolynomialExponent::IntegerExpPos { + degree: deg.clone(), +}), +}), Rc::new(AtomicCost::LogCost { + param: n.clone(), +})]), +}), + None => Rc::new(CostBound::ErrorBound), +}, +} + } else { + match proportional_divisor_from_int_at_least_two(b.clone()) { + Some(base_w) => match positive_descent_amount_from_positive_int(a.clone()) { + Some(arg_w) => Rc::new(CostBound::AtomicBound { + cost: Rc::new(AtomicCost::PolyCost { + param: n.clone(), + exponent: Rc::new(PolynomialExponent::LogBasedExp { + base: base_w.clone(), + argument: arg_w.clone(), +}), +}), +}), + None => Rc::new(CostBound::ErrorBound), +}, + None => Rc::new(CostBound::ErrorBound), +} + } + }, +}, +} } - } +} } pub fn catamorphism_bound(param: String, nesting_depth: i64) -> Rc { @@ -884,42 +758,31 @@ pub fn catamorphism_bound(param: String, nesting_depth: i64) -> Rc { } } -pub fn derive_bound( - param: String, - branches: i64, - factor: Rc, - work_exponent: i64, -) -> Rc { +pub fn derive_bound(param: String, branches: i64, factor: Rc, work_exponent: i64) -> Rc { if (branches.clone() < 1) { Rc::new(CostBound::ErrorBound) } else { match bounded_int_pow_exponent(work_exponent.clone()) { - None => Rc::new(CostBound::ErrorBound), - Some(_) => match (*factor).clone() { - ShrinkFactor::UnitShrink => { - if (branches.clone() <= 1) { - cost_linear(param) - } else { - Rc::new(CostBound::ForeverBound) - } - } - ShrinkFactor::ConstantShrink { .. } => { - if (branches.clone() <= 1) { - cost_linear(param) - } else { - Rc::new(CostBound::ForeverBound) - } - } - ShrinkFactor::ProportionalShrink { divisor: d, .. } => { - master_theorem(&Rc::new(RecurrenceForm { - param: param, - branches: branches.clone(), - divisor: proportional_divisor_to_int(d.clone()), - work_exponent: work_exponent.clone(), - })) - } - }, - } + None => Rc::new(CostBound::ErrorBound), + Some(_) => match (*factor).clone() { + ShrinkFactor::UnitShrink => if (branches.clone() <= 1) { + cost_linear(param) + } else { + Rc::new(CostBound::ForeverBound) + }, + ShrinkFactor::ConstantShrink { .. } => if (branches.clone() <= 1) { + cost_linear(param) + } else { + Rc::new(CostBound::ForeverBound) + }, + ShrinkFactor::ProportionalShrink { divisor: d, .. } => master_theorem(&Rc::new(RecurrenceForm { + param: param, + branches: branches.clone(), + divisor: proportional_divisor_to_int(d.clone()), + work_exponent: work_exponent.clone(), +})), +}, +} } } @@ -936,47 +799,27 @@ pub fn linear_scan_bound() -> Rc { } pub fn binary_search_bound() -> Rc { - derive_bound( - "xs".to_string(), - 1, - Rc::new(ShrinkFactor::ProportionalShrink { - divisor: Rc::new(ProportionalDivisor::DivideByTwo), - }), - 0, - ) + derive_bound("xs".to_string(), 1, Rc::new(ShrinkFactor::ProportionalShrink { + divisor: Rc::new(ProportionalDivisor::DivideByTwo), +}), 0) } pub fn mergesort_bound() -> Rc { - derive_bound( - "xs".to_string(), - 2, - Rc::new(ShrinkFactor::ProportionalShrink { - divisor: Rc::new(ProportionalDivisor::DivideByTwo), - }), - 1, - ) + derive_bound("xs".to_string(), 2, Rc::new(ShrinkFactor::ProportionalShrink { + divisor: Rc::new(ProportionalDivisor::DivideByTwo), +}), 1) } pub fn karatsuba_bound() -> Rc { - derive_bound( - "digits".to_string(), - 3, - Rc::new(ShrinkFactor::ProportionalShrink { - divisor: Rc::new(ProportionalDivisor::DivideByTwo), - }), - 1, - ) + derive_bound("digits".to_string(), 3, Rc::new(ShrinkFactor::ProportionalShrink { + divisor: Rc::new(ProportionalDivisor::DivideByTwo), +}), 1) } pub fn strassen_bound() -> Rc { - derive_bound( - "n".to_string(), - 7, - Rc::new(ShrinkFactor::ProportionalShrink { - divisor: Rc::new(ProportionalDivisor::DivideByTwo), - }), - 2, - ) + derive_bound("n".to_string(), 7, Rc::new(ShrinkFactor::ProportionalShrink { + divisor: Rc::new(ProportionalDivisor::DivideByTwo), +}), 2) } pub fn trial_division_bound() -> Rc { @@ -997,42 +840,30 @@ pub fn bfs_dfs_bound() -> Rc { pub fn dijkstra_bound() -> Rc { Rc::new(CostBound::SumOfProductsBound { - terms: Rc::new(vec![ - Rc::new(vec![ - Rc::new(AtomicCost::PolyCost { - param: "V".to_string(), - exponent: poly_exp_degree_one(), - }), - Rc::new(AtomicCost::LogCost { - param: "V".to_string(), - }), - ]), - Rc::new(vec![ - Rc::new(AtomicCost::PolyCost { - param: "E".to_string(), - exponent: poly_exp_degree_one(), - }), - Rc::new(AtomicCost::LogCost { - param: "V".to_string(), - }), - ]), - ]), - }) + terms: Rc::new(vec![Rc::new(vec![Rc::new(AtomicCost::PolyCost { + param: "V".to_string(), + exponent: poly_exp_degree_one(), +}), Rc::new(AtomicCost::LogCost { + param: "V".to_string(), +})]), Rc::new(vec![Rc::new(AtomicCost::PolyCost { + param: "E".to_string(), + exponent: poly_exp_degree_one(), +}), Rc::new(AtomicCost::LogCost { + param: "V".to_string(), +})])]), +}) } pub fn bellman_ford_bound() -> Rc { Rc::new(CostBound::ProductBound { - factors: Rc::new(vec![ - Rc::new(AtomicCost::PolyCost { - param: "V".to_string(), - exponent: poly_exp_degree_one(), - }), - Rc::new(AtomicCost::PolyCost { - param: "E".to_string(), - exponent: poly_exp_degree_one(), - }), - ]), - }) + factors: Rc::new(vec![Rc::new(AtomicCost::PolyCost { + param: "V".to_string(), + exponent: poly_exp_degree_one(), +}), Rc::new(AtomicCost::PolyCost { + param: "E".to_string(), + exponent: poly_exp_degree_one(), +})]), +}) } pub fn floyd_warshall_bound() -> Rc { diff --git a/src/v2/stage0/src/std_iteration.rs b/src/v2/stage0/src/std_iteration.rs index 306aae0c49b..044b21e8651 100644 --- a/src/v2/stage0/src/std_iteration.rs +++ b/src/v2/stage0/src/std_iteration.rs @@ -1,8 +1,10 @@ // Generated by v2 compiler -- do not edit. // Source module: std.iteration -use crate::v2_rt; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; + + diff --git a/src/v2/stage0/src/std_node.rs b/src/v2/stage0/src/std_node.rs index 7837270511c..b388294735d 100644 --- a/src/v2/stage0/src/std_node.rs +++ b/src/v2/stage0/src/std_node.rs @@ -1,100 +1,98 @@ // Generated by v2 compiler -- do not edit. // Source module: std.node -use crate::std_induction::RecursionShape::{ - DirectRecursion, ListRecursion, MapValueRecursion, OptionalRecursion, SetRecursion, -}; -pub use crate::std_induction::{InductiveField, RecursionShape}; -use crate::v2_rt; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::std_induction::{InductiveField, RecursionShape}; +use crate::std_induction::RecursionShape::{DirectRecursion, ListRecursion, OptionalRecursion, SetRecursion, MapValueRecursion}; pub fn compiler_inductive_fields() -> Rc>> { thread_local! { - static CACHED: Rc>> = { - Rc::new(vec![Rc::new(InductiveField { - type_name: "Node".to_string(), - variant_name: "".to_string(), - field_name: "children".to_string(), - shape: RecursionShape::ListRecursion, - element_type: "Node".to_string(), - }), Rc::new(InductiveField { - type_name: "Node".to_string(), - variant_name: "".to_string(), - field_name: "params".to_string(), - shape: RecursionShape::ListRecursion, - element_type: "Node".to_string(), - }), Rc::new(InductiveField { - type_name: "Node".to_string(), - variant_name: "".to_string(), - field_name: "uses".to_string(), - shape: RecursionShape::ListRecursion, - element_type: "Node".to_string(), - }), Rc::new(InductiveField { - type_name: "Node".to_string(), - variant_name: "".to_string(), - field_name: "properties".to_string(), - shape: RecursionShape::ListRecursion, - element_type: "Node".to_string(), - }), Rc::new(InductiveField { - type_name: "Node".to_string(), - variant_name: "".to_string(), - field_name: "body".to_string(), - shape: RecursionShape::OptionalRecursion, - element_type: "Node".to_string(), - }), Rc::new(InductiveField { - type_name: "Node".to_string(), - variant_name: "".to_string(), - field_name: "transport".to_string(), - shape: RecursionShape::OptionalRecursion, - element_type: "Node".to_string(), - }), Rc::new(InductiveField { - type_name: "Node".to_string(), - variant_name: "".to_string(), - field_name: "type_annotation".to_string(), - shape: RecursionShape::OptionalRecursion, - element_type: "Node".to_string(), - }), Rc::new(InductiveField { - type_name: "Node".to_string(), - variant_name: "".to_string(), - field_name: "inferred".to_string(), - shape: RecursionShape::OptionalRecursion, - element_type: "InferredNode".to_string(), - }), Rc::new(InductiveField { - type_name: "InferredNode".to_string(), - variant_name: "Resolved".to_string(), - field_name: "node".to_string(), - shape: RecursionShape::DirectRecursion, - element_type: "Node".to_string(), - }), Rc::new(InductiveField { - type_name: "MatchPattern".to_string(), - variant_name: "VariantPattern".to_string(), - field_name: "field_bindings".to_string(), - shape: RecursionShape::ListRecursion, - element_type: "Node".to_string(), - }), Rc::new(InductiveField { - type_name: "MethodSemantics".to_string(), - variant_name: "AlgebraMethodSemantics".to_string(), - field_name: "method_def".to_string(), - shape: RecursionShape::DirectRecursion, - element_type: "Node".to_string(), - }), Rc::new(InductiveField { - type_name: "MethodSemantics".to_string(), - variant_name: "AlgebraMethodSemantics".to_string(), - field_name: "fold_accumulator_type".to_string(), - shape: RecursionShape::OptionalRecursion, - element_type: "Node".to_string(), - }), Rc::new(InductiveField { - type_name: "MethodSemantics".to_string(), - variant_name: "ServiceMethodSemantics".to_string(), - field_name: "op_params".to_string(), - shape: RecursionShape::ListRecursion, - element_type: "Node".to_string(), - })]) - }; - } + static CACHED: Rc>> = { + Rc::new(vec![Rc::new(InductiveField { + type_name: "Node".to_string(), + variant_name: "".to_string(), + field_name: "children".to_string(), + shape: RecursionShape::ListRecursion, + element_type: "Node".to_string(), +}), Rc::new(InductiveField { + type_name: "Node".to_string(), + variant_name: "".to_string(), + field_name: "params".to_string(), + shape: RecursionShape::ListRecursion, + element_type: "Node".to_string(), +}), Rc::new(InductiveField { + type_name: "Node".to_string(), + variant_name: "".to_string(), + field_name: "uses".to_string(), + shape: RecursionShape::ListRecursion, + element_type: "Node".to_string(), +}), Rc::new(InductiveField { + type_name: "Node".to_string(), + variant_name: "".to_string(), + field_name: "properties".to_string(), + shape: RecursionShape::ListRecursion, + element_type: "Node".to_string(), +}), Rc::new(InductiveField { + type_name: "Node".to_string(), + variant_name: "".to_string(), + field_name: "body".to_string(), + shape: RecursionShape::OptionalRecursion, + element_type: "Node".to_string(), +}), Rc::new(InductiveField { + type_name: "Node".to_string(), + variant_name: "".to_string(), + field_name: "transport".to_string(), + shape: RecursionShape::OptionalRecursion, + element_type: "Node".to_string(), +}), Rc::new(InductiveField { + type_name: "Node".to_string(), + variant_name: "".to_string(), + field_name: "type_annotation".to_string(), + shape: RecursionShape::OptionalRecursion, + element_type: "Node".to_string(), +}), Rc::new(InductiveField { + type_name: "Node".to_string(), + variant_name: "".to_string(), + field_name: "inferred".to_string(), + shape: RecursionShape::OptionalRecursion, + element_type: "InferredNode".to_string(), +}), Rc::new(InductiveField { + type_name: "InferredNode".to_string(), + variant_name: "Resolved".to_string(), + field_name: "node".to_string(), + shape: RecursionShape::DirectRecursion, + element_type: "Node".to_string(), +}), Rc::new(InductiveField { + type_name: "MatchPattern".to_string(), + variant_name: "VariantPattern".to_string(), + field_name: "field_bindings".to_string(), + shape: RecursionShape::ListRecursion, + element_type: "Node".to_string(), +}), Rc::new(InductiveField { + type_name: "MethodSemantics".to_string(), + variant_name: "AlgebraMethodSemantics".to_string(), + field_name: "method_def".to_string(), + shape: RecursionShape::DirectRecursion, + element_type: "Node".to_string(), +}), Rc::new(InductiveField { + type_name: "MethodSemantics".to_string(), + variant_name: "AlgebraMethodSemantics".to_string(), + field_name: "fold_accumulator_type".to_string(), + shape: RecursionShape::OptionalRecursion, + element_type: "Node".to_string(), +}), Rc::new(InductiveField { + type_name: "MethodSemantics".to_string(), + variant_name: "ServiceMethodSemantics".to_string(), + field_name: "op_params".to_string(), + shape: RecursionShape::ListRecursion, + element_type: "Node".to_string(), +})]) + }; + } CACHED.with(|c| c.clone()) } @@ -114,7 +112,7 @@ pub fn compiler_recursive_types() -> Rc> { pub fn is_compiler_recursive_type(name: String) -> bool { match v2_rt::map_get(&compiler_recursive_types(), name) { - Some(_) => true, - None => false, - } + Some(_) => true, + None => false, +} } diff --git a/src/v2/stage0/src/std_syntax.rs b/src/v2/stage0/src/std_syntax.rs index 3f1dc19b430..80c4dd8193d 100644 --- a/src/v2/stage0/src/std_syntax.rs +++ b/src/v2/stage0/src/std_syntax.rs @@ -1,16 +1,16 @@ // Generated by v2 compiler -- do not edit. // Source module: std.syntax -use self::AlgebraFieldKind::*; +use std::collections::HashMap; +use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; use self::BinOp::*; +use self::LiteralValue::*; use self::BodyKind::*; use self::ItemFormKind::*; -use self::LiteralValue::*; -use crate::v2_rt; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; -use std::collections::HashMap; -use std::rc::Rc; +use self::AlgebraFieldKind::*; #[derive(Debug, Clone, Copy, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] @@ -34,10 +34,18 @@ pub enum BinOp { #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum LiteralValue { - LitStr { value: String }, - LitInt { value: i64 }, - LitFloat { value: String }, - LitBool { value: bool }, + LitStr { + value: String, + }, + LitInt { + value: i64, + }, + LitFloat { + value: String, + }, + LitBool { + value: bool, + }, LitNull, } @@ -97,34 +105,34 @@ pub struct AlgebraFieldEntry { pub fn algebra_field_entries() -> Rc>> { thread_local! { - static CACHED: Rc>> = { - Rc::new(vec![Rc::new(AlgebraFieldEntry { - kind: AlgebraFieldKind::AlgAdd, - field_name: "add".to_string(), - }), Rc::new(AlgebraFieldEntry { - kind: AlgebraFieldKind::AlgMul, - field_name: "mul".to_string(), - }), Rc::new(AlgebraFieldEntry { - kind: AlgebraFieldKind::AlgReciprocal, - field_name: "reciprocal".to_string(), - }), Rc::new(AlgebraFieldEntry { - kind: AlgebraFieldKind::AlgQuotient, - field_name: "quotient".to_string(), - }), Rc::new(AlgebraFieldEntry { - kind: AlgebraFieldKind::AlgRemainder, - field_name: "remainder".to_string(), - }), Rc::new(AlgebraFieldEntry { - kind: AlgebraFieldKind::AlgCompare, - field_name: "compare".to_string(), - }), Rc::new(AlgebraFieldEntry { - kind: AlgebraFieldKind::AlgMeet, - field_name: "meet".to_string(), - }), Rc::new(AlgebraFieldEntry { - kind: AlgebraFieldKind::AlgJoin, - field_name: "join".to_string(), - })]) - }; - } + static CACHED: Rc>> = { + Rc::new(vec![Rc::new(AlgebraFieldEntry { + kind: AlgebraFieldKind::AlgAdd, + field_name: "add".to_string(), +}), Rc::new(AlgebraFieldEntry { + kind: AlgebraFieldKind::AlgMul, + field_name: "mul".to_string(), +}), Rc::new(AlgebraFieldEntry { + kind: AlgebraFieldKind::AlgReciprocal, + field_name: "reciprocal".to_string(), +}), Rc::new(AlgebraFieldEntry { + kind: AlgebraFieldKind::AlgQuotient, + field_name: "quotient".to_string(), +}), Rc::new(AlgebraFieldEntry { + kind: AlgebraFieldKind::AlgRemainder, + field_name: "remainder".to_string(), +}), Rc::new(AlgebraFieldEntry { + kind: AlgebraFieldKind::AlgCompare, + field_name: "compare".to_string(), +}), Rc::new(AlgebraFieldEntry { + kind: AlgebraFieldKind::AlgMeet, + field_name: "meet".to_string(), +}), Rc::new(AlgebraFieldEntry { + kind: AlgebraFieldKind::AlgJoin, + field_name: "join".to_string(), +})]) + }; + } CACHED.with(|c| c.clone()) } diff --git a/src/v2/stage0/src/std_termination.rs b/src/v2/stage0/src/std_termination.rs index 79bf0c81769..da94f5f3798 100644 --- a/src/v2/stage0/src/std_termination.rs +++ b/src/v2/stage0/src/std_termination.rs @@ -1,18 +1,18 @@ // Generated by v2 compiler -- do not edit. // Source module: std.termination +use std::collections::HashMap; +use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::std_algebra::{Ordering}; +use crate::std_algebra::Ordering::*; use self::DescentEvidence::*; -use self::DescentSource::*; +use self::RankingDimension::*; use self::PositiveDescentAmount::*; use self::ProportionalDivisor::*; -use self::RankingDimension::*; -pub use crate::std_algebra::Ordering; -use crate::std_algebra::Ordering::*; -use crate::v2_rt; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; -use std::collections::HashMap; -use std::rc::Rc; +use self::DescentSource::*; #[derive(Debug, Clone, Copy, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] @@ -24,83 +24,82 @@ pub enum DescentEvidence { pub fn evidence_rank(e: DescentEvidence) -> i64 { match e { - DescentEvidence::Strict => 2, - DescentEvidence::NonIncreasing => 1, - DescentEvidence::DescentUnknown => 0, - } + DescentEvidence::Strict => 2, + DescentEvidence::NonIncreasing => 1, + DescentEvidence::DescentUnknown => 0, +} } pub fn merge_evidence(a: DescentEvidence, b: DescentEvidence) -> DescentEvidence { match a { - DescentEvidence::Strict => match b { - DescentEvidence::Strict => DescentEvidence::Strict, - DescentEvidence::NonIncreasing => DescentEvidence::NonIncreasing, - _ => DescentEvidence::DescentUnknown, - }, - DescentEvidence::NonIncreasing => match b { - DescentEvidence::Strict => DescentEvidence::NonIncreasing, - DescentEvidence::NonIncreasing => DescentEvidence::NonIncreasing, - _ => DescentEvidence::DescentUnknown, - }, - _ => DescentEvidence::DescentUnknown, - } + DescentEvidence::Strict => match b { + DescentEvidence::Strict => DescentEvidence::Strict, + DescentEvidence::NonIncreasing => DescentEvidence::NonIncreasing, + _ => DescentEvidence::DescentUnknown, +}, + DescentEvidence::NonIncreasing => match b { + DescentEvidence::Strict => DescentEvidence::NonIncreasing, + DescentEvidence::NonIncreasing => DescentEvidence::NonIncreasing, + _ => DescentEvidence::DescentUnknown, +}, + _ => DescentEvidence::DescentUnknown, +} } pub fn join_evidence(a: DescentEvidence, b: DescentEvidence) -> DescentEvidence { match a { - DescentEvidence::DescentUnknown => b, - DescentEvidence::NonIncreasing => match b { - DescentEvidence::Strict => DescentEvidence::Strict, - _ => DescentEvidence::NonIncreasing, - }, - DescentEvidence::Strict => DescentEvidence::Strict, - } + DescentEvidence::DescentUnknown => b, + DescentEvidence::NonIncreasing => match b { + DescentEvidence::Strict => DescentEvidence::Strict, + _ => DescentEvidence::NonIncreasing, +}, + DescentEvidence::Strict => DescentEvidence::Strict, +} } pub fn promote_to_strict(evidence: DescentEvidence) -> DescentEvidence { match evidence { - DescentEvidence::NonIncreasing => DescentEvidence::NonIncreasing, - DescentEvidence::Strict => DescentEvidence::Strict, - _ => DescentEvidence::DescentUnknown, - } + DescentEvidence::NonIncreasing => DescentEvidence::NonIncreasing, + DescentEvidence::Strict => DescentEvidence::Strict, + _ => DescentEvidence::DescentUnknown, +} } -pub fn optional_evidence_meet( - a: Option, - b: Option, -) -> Option { +pub fn optional_evidence_meet(a: Option, b: Option) -> Option { match a.clone() { - None => b, - Some(va) => match b { - None => a.clone(), - Some(vb) => Some(merge_evidence(va.clone(), vb.clone())), - }, - } + None => b, + Some(va) => match b { + None => a.clone(), + Some(vb) => Some(merge_evidence(va.clone(), vb.clone())), +}, +} } -pub fn map_evidence_merge_at( - base: &Rc>, - key: &String, - new_val: DescentEvidence, -) -> Rc> { +pub fn map_evidence_merge_at(base: &Rc>, key: &String, new_val: DescentEvidence) -> Rc> { match v2_rt::map_get(&base, key.clone()) { - Some(existing) => v2_rt::rc_map_insert( - base.clone(), - key.clone(), - merge_evidence(existing.clone(), new_val), - ), - None => v2_rt::rc_map_insert(base.clone(), key.clone(), new_val), - } + Some(existing) => v2_rt::rc_map_insert(base.clone(), key.clone(), merge_evidence(existing.clone(), new_val)), + None => v2_rt::rc_map_insert(base.clone(), key.clone(), new_val), +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum RankingDimension { - TreeSize { param: String }, - ListLength { param: String }, - ArithmeticValue { param: String }, - TokenPosition { param: String }, - SetCardinality { param: String }, + TreeSize { + param: String, + }, + ListLength { + param: String, + }, + ArithmeticValue { + param: String, + }, + TokenPosition { + param: String, + }, + SetCardinality { + param: String, + }, } impl RankingDimension { pub fn param(&self) -> String { @@ -118,15 +117,15 @@ impl RankingDimension { #[serde(tag = "_variant")] pub enum PositiveDescentAmount { OneStep, - AdditionalStep { previous: Rc }, + AdditionalStep { + previous: Rc, + }, } impl PositiveDescentAmount { pub fn previous(&self) -> Rc { match self { PositiveDescentAmount::OneStep => panic!("no previous on unit variant"), - PositiveDescentAmount::AdditionalStep { - previous: __val, .. - } => __val.clone(), + PositiveDescentAmount::AdditionalStep { previous: __val, .. } => __val.clone(), } } } @@ -135,7 +134,9 @@ impl PositiveDescentAmount { #[serde(tag = "_variant")] pub enum ProportionalDivisor { DivideByTwo, - StrictlyLarger { inner: Rc }, + StrictlyLarger { + inner: Rc, + }, } impl ProportionalDivisor { pub fn inner(&self) -> Rc { @@ -147,11 +148,11 @@ impl ProportionalDivisor { } pub fn proportional_divisor_to_int(d: Rc) -> i64 { - stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || match (*d).clone() { - ProportionalDivisor::DivideByTwo => 2, - ProportionalDivisor::StrictlyLarger { inner: p, .. } => { - (1 + proportional_divisor_to_int(p.clone())) - } + stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { + match (*d).clone() { + ProportionalDivisor::DivideByTwo => 2, + ProportionalDivisor::StrictlyLarger { inner: p, .. } => (1 + proportional_divisor_to_int(p.clone())), +} }) } @@ -171,11 +172,11 @@ pub fn positive_descent_amount_from_positive_int(k: i64) -> Option Some(Rc::new(PositiveDescentAmount::AdditionalStep { - previous: prev.clone(), - })), - None => None, - } + Some(prev) => Some(Rc::new(PositiveDescentAmount::AdditionalStep { + previous: prev.clone(), +})), + None => None, +} } } } @@ -194,11 +195,11 @@ pub fn proportional_divisor_from_int_at_least_two(k: i64) -> Option Some(Rc::new(ProportionalDivisor::StrictlyLarger { - inner: prev.clone(), - })), - None => None, - } + Some(prev) => Some(Rc::new(ProportionalDivisor::StrictlyLarger { + inner: prev.clone(), +})), + None => None, +} } } } @@ -208,12 +209,24 @@ pub fn proportional_divisor_from_int_at_least_two(k: i64) -> Option }, - ArithmeticSubtractDescent { steps: Rc }, - ArithmeticDivideDescent { divisor: Rc }, - ParserAdvance { witness: String }, - SetRemoval { element: String }, + ChildAccessor { + accessor: String, + }, + ListShrink { + amount: Rc, + }, + ArithmeticSubtractDescent { + steps: Rc, + }, + ArithmeticDivideDescent { + divisor: Rc, + }, + ParserAdvance { + witness: String, + }, + SetRemoval { + element: String, + }, FoldIteration, } diff --git a/src/v2/stage0/src/std_types.rs b/src/v2/stage0/src/std_types.rs index 6a2e4dea177..a80d4ad6e37 100644 --- a/src/v2/stage0/src/std_types.rs +++ b/src/v2/stage0/src/std_types.rs @@ -1,30 +1,28 @@ // Generated by v2 compiler -- do not edit. // Source module: std.types -use self::AbiEnv::*; -use self::Arch::*; -use self::AuthScheme::*; +use std::collections::HashMap; +use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::std_algebra::{BooleanAlgebra, FreeMonoid, PartialFunction, kernel_algebra_profile, algebra_type_param_names}; use self::Bool::*; -use self::CodegenBackend::*; -use self::CredentialFlow::*; +use self::Platform::*; +use self::TopologyNodeKind::*; use self::DocSourceKind::*; -use self::EntryKind::*; -use self::ExecutionEnv::*; use self::FermiDepth::*; -use self::HttpMethod::*; +use self::CredentialFlow::*; +use self::Arch::*; +use self::Vendor::*; use self::Os::*; -use self::Platform::*; +use self::AbiEnv::*; +use self::ExecutionEnv::*; +use self::EntryKind::*; use self::SymlinkTarget::*; -use self::TopologyNodeKind::*; -use self::Vendor::*; -pub use crate::std_algebra::{ - algebra_type_param_names, kernel_algebra_profile, BooleanAlgebra, FreeMonoid, PartialFunction, -}; -use crate::v2_rt; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; -use std::collections::HashMap; -use std::rc::Rc; +use self::HttpMethod::*; +use self::AuthScheme::*; +use self::CodegenBackend::*; pub fn kernel_type_set() -> Rc> { thread_local! { @@ -46,9 +44,9 @@ pub fn kernel_type_set() -> Rc> { pub fn is_kernel_type(name: String) -> bool { match v2_rt::map_get(&kernel_type_set(), name) { - Some(_) => true, - None => false, - } + Some(_) => true, + None => false, +} } pub fn container_type_arity() -> Rc> { @@ -66,9 +64,9 @@ pub fn container_type_arity() -> Rc> { pub fn is_container_type(name: String) -> bool { match container_expected_arity(name) { - Some(_) => true, - None => false, - } + Some(_) => true, + None => false, +} } pub fn container_expected_arity(name: String) -> Option { @@ -77,49 +75,19 @@ pub fn container_expected_arity(name: String) -> Option { pub fn container_param_names_for(kind_name: String) -> Rc> { match v2_rt::map_get(&kernel_algebra_profile(), kind_name) { - Some(p) => algebra_type_param_names(p.clone()), - None => Rc::new(vec![]), - } + Some(p) => algebra_type_param_names(p.clone()), + None => Rc::new(vec![]), +} } pub fn container_param_name(kind_name: String, index: i64) -> Option { { let names = container_param_names_for(kind_name); - match Rc::new({ - let mut __result = Vec::new(); - for pair in Rc::new({ - let mut __result = Vec::new(); - for pair in Rc::new( - names - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - { - if (pair.0.clone() == index.clone()) { - __result.push(pair); - } - } - __result - }) - .iter() - .cloned() - { - __result.push(pair.1.clone()); - } - __result - }) - .first() - .cloned() - { - Some(name) => Some(name.clone()), - None => None, - } - } +match Rc::new({ let mut __result = Vec::new(); for pair in Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(names.iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { if (pair.0.clone() == index.clone()) { __result.push(pair); } } __result }).iter().cloned() { __result.push(pair.1.clone()); } __result }).first().cloned() { + Some(name) => Some(name.clone()), + None => None, +} +} } pub fn ordered_element_collections() -> Rc> { @@ -164,14 +132,7 @@ pub fn container_template_algebra(name: String) -> Option { } pub fn canonical_container_names() -> Rc> { - Rc::new(vec![ - "BooleanAlgebra".to_string(), - "FreeMonoid".to_string(), - "List".to_string(), - "Map".to_string(), - "PartialFunction".to_string(), - "Set".to_string(), - ]) + Rc::new(vec!["BooleanAlgebra".to_string(), "FreeMonoid".to_string(), "List".to_string(), "Map".to_string(), "PartialFunction".to_string(), "Set".to_string()]) } #[derive(Debug, Clone, Copy, PartialEq, serde::Serialize, serde::Deserialize)] @@ -181,12 +142,20 @@ pub enum Bool { False, } + + pub type Json = serde_json::Value; pub type Bytes = Vec; pub type Char = i64; + + + + + + pub type CommitSha = String; pub type Sha256 = String; @@ -448,8 +417,12 @@ pub enum HttpMethod { #[serde(tag = "_variant")] pub enum AuthScheme { Bearer, - Header { name: String }, - Basic { username: String }, + Header { + name: String, + }, + Basic { + username: String, + }, ApiKey, } diff --git a/src/v2/stage0/src/v2_compiler_artifact.rs b/src/v2/stage0/src/v2_compiler_artifact.rs index d2e80ac7366..75e6b639642 100644 --- a/src/v2/stage0/src/v2_compiler_artifact.rs +++ b/src/v2/stage0/src/v2_compiler_artifact.rs @@ -1,16 +1,16 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.artifact +use std::collections::HashMap; +use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::v2_std_core::{TextFile}; +use self::RenderTarget::*; use self::ArtifactKind::*; use self::BoundaryKind::*; use self::PartitionRule::*; -use self::RenderTarget::*; -use crate::v2_rt; -pub use crate::v2_std_core::TextFile; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; -use std::collections::HashMap; -use std::rc::Rc; #[derive(Debug, Clone, Copy, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] @@ -66,27 +66,25 @@ pub struct ArtifactPlan { #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum PartitionRule { - Explicit { artifacts: Rc>> }, + Explicit { + artifacts: Rc>>, + }, } impl PartitionRule { pub fn artifacts(&self) -> Rc>> { match self { - PartitionRule::Explicit { - artifacts: __val, .. - } => __val.clone(), + PartitionRule::Explicit { artifacts: __val, .. } => __val.clone(), } } } pub fn plan_artifacts(rule: Rc) -> Rc { match (*rule).clone() { - PartitionRule::Explicit { - artifacts: arts, .. - } => Rc::new(ArtifactPlan { - artifacts: arts.clone(), - boundaries: Rc::new(vec![]), - }), - } + PartitionRule::Explicit { artifacts: arts, .. } => Rc::new(ArtifactPlan { + artifacts: arts.clone(), + boundaries: Rc::new(vec![]), +}), +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -95,17 +93,14 @@ pub struct ArtifactOutput { pub files: Rc>>, } -pub fn default_artifact_plan( - root_modules: Rc>, - target: RenderTarget, -) -> Rc { +pub fn default_artifact_plan(root_modules: Rc>, target: RenderTarget) -> Rc { plan_artifacts(Rc::new(PartitionRule::Explicit { - artifacts: Rc::new(vec![Rc::new(Artifact { - name: "default".to_string(), - kind: ArtifactKind::ServiceBinary, - target: target, - entry_modules: root_modules, - dependencies: Rc::new(vec![]), - })]), - })) + artifacts: Rc::new(vec![Rc::new(Artifact { + name: "default".to_string(), + kind: ArtifactKind::ServiceBinary, + target: target, + entry_modules: root_modules, + dependencies: Rc::new(vec![]), +})]), +})) } diff --git a/src/v2/stage0/src/v2_compiler_coercion.rs b/src/v2/stage0/src/v2_compiler_coercion.rs index c803d00b647..e145655eaf9 100644 --- a/src/v2/stage0/src/v2_compiler_coercion.rs +++ b/src/v2/stage0/src/v2_compiler_coercion.rs @@ -1,174 +1,131 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.coercion -use self::CoercionAssertion::*; -pub use crate::extdeps_languages_dag_types::dag_type_checkpoints; -pub use crate::extdeps_languages_go_types::{ - go_algebra_inhabitants, go_callable, go_cast_syntax, go_optional_template, go_type_checkpoints, -}; -pub use crate::extdeps_languages_python_types::{ - python_algebra_inhabitants, python_callable, python_cast_syntax, python_optional_template, - python_type_checkpoints, -}; -pub use crate::extdeps_languages_rust_types::{ - rust_algebra_inhabitants, rust_callable, rust_cast_syntax, rust_optional_template, - rust_type_checkpoints, -}; -pub use crate::std_coercion::{CallableRepr, CastSyntax, InhabitantDecl, TypeCheckpoint}; -pub use crate::std_types::{canonical_container_names, container_template_algebra}; -pub use crate::v2_compiler_artifact::RenderTarget; -use crate::v2_compiler_artifact::RenderTarget::{Dag, Go, Python, Rust}; -use crate::v2_rt; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::v2_compiler_artifact::{RenderTarget}; +use crate::v2_compiler_artifact::RenderTarget::{Rust, Python, Go, Dag}; +pub use crate::std_coercion::{TypeCheckpoint, InhabitantDecl, CallableRepr, CastSyntax}; +pub use crate::std_types::{container_template_algebra, canonical_container_names}; +pub use crate::extdeps_languages_rust_types::{rust_type_checkpoints, rust_algebra_inhabitants, rust_callable, rust_optional_template, rust_cast_syntax}; +pub use crate::extdeps_languages_python_types::{python_type_checkpoints, python_algebra_inhabitants, python_callable, python_optional_template, python_cast_syntax}; +pub use crate::extdeps_languages_go_types::{go_type_checkpoints, go_algebra_inhabitants, go_callable, go_optional_template, go_cast_syntax}; +pub use crate::extdeps_languages_dag_types::{dag_type_checkpoints}; +use self::CoercionAssertion::*; pub fn target_checkpoints(target: RenderTarget) -> Rc>> { match target { - RenderTarget::Rust => rust_type_checkpoints(), - RenderTarget::Python => python_type_checkpoints(), - RenderTarget::Go => go_type_checkpoints(), - RenderTarget::Dag => dag_type_checkpoints(), - } + RenderTarget::Rust => rust_type_checkpoints(), + RenderTarget::Python => python_type_checkpoints(), + RenderTarget::Go => go_type_checkpoints(), + RenderTarget::Dag => dag_type_checkpoints(), +} } pub fn target_inhabitants(target: RenderTarget) -> Rc>> { match target { - RenderTarget::Rust => rust_algebra_inhabitants(), - RenderTarget::Python => python_algebra_inhabitants(), - RenderTarget::Go => go_algebra_inhabitants(), - RenderTarget::Dag => Rc::new(vec![]), - } + RenderTarget::Rust => rust_algebra_inhabitants(), + RenderTarget::Python => python_algebra_inhabitants(), + RenderTarget::Go => go_algebra_inhabitants(), + RenderTarget::Dag => Rc::new(vec![]), +} } pub fn target_callable(target: RenderTarget) -> Rc { match target { - RenderTarget::Rust => rust_callable(), - RenderTarget::Python => python_callable(), - RenderTarget::Go => go_callable(), - RenderTarget::Dag => Rc::new(CallableRepr { - template: "fn({params}) -> {return}".to_string(), - param_separator: ", ".to_string(), - return_separator: " -> ".to_string(), - import_path: None, - }), - } + RenderTarget::Rust => rust_callable(), + RenderTarget::Python => python_callable(), + RenderTarget::Go => go_callable(), + RenderTarget::Dag => Rc::new(CallableRepr { + template: "fn({params}) -> {return}".to_string(), + param_separator: ", ".to_string(), + return_separator: " -> ".to_string(), + import_path: None, +}), +} } pub fn target_optional_template(target: RenderTarget) -> String { match target { - RenderTarget::Rust => rust_optional_template(), - RenderTarget::Python => python_optional_template(), - RenderTarget::Go => go_optional_template(), - RenderTarget::Dag => "{0}?".to_string(), - } + RenderTarget::Rust => rust_optional_template(), + RenderTarget::Python => python_optional_template(), + RenderTarget::Go => go_optional_template(), + RenderTarget::Dag => "{0}?".to_string(), +} } pub fn target_cast_syntax(target: RenderTarget) -> Option> { match target { - RenderTarget::Rust => Some(rust_cast_syntax()), - RenderTarget::Python => Some(python_cast_syntax()), - RenderTarget::Go => Some(go_cast_syntax()), - RenderTarget::Dag => None, - } + RenderTarget::Rust => Some(rust_cast_syntax()), + RenderTarget::Python => Some(python_cast_syntax()), + RenderTarget::Go => Some(go_cast_syntax()), + RenderTarget::Dag => None, +} } pub fn can_cast(target: RenderTarget, source_type: String, target_type: String) -> bool { match target_cast_syntax(target) { - Some(syntax) => { - let mut __found = false; - for r in syntax.cast_rules.clone().iter().cloned() { - if ((r.from_type.clone().as_str() == source_type.clone().as_str()) - && (r.to_type.clone().as_str() == target_type.clone().as_str())) - { - __found = true; - break; - } - } - __found - } - None => false, - } + Some(syntax) => { let mut __found = false; for r in syntax.cast_rules.clone().iter().cloned() { if ((r.from_type.clone().as_str() == source_type.clone().as_str()) && (r.to_type.clone().as_str() == target_type.clone().as_str())) { __found = true; break; } } __found }, + None => false, +} } pub fn render_cast(expr_str: String, type_str: String, target: RenderTarget) -> String { { let syntax = match target_cast_syntax(target) { - Some(s) => s.clone(), - None => Rc::new(CastSyntax { - template: "{expr}".to_string(), - cast_rules: Rc::new(vec![]), - }), - }; - v2_rt::replace( - v2_rt::replace(syntax.template.clone(), "{expr}".to_string(), expr_str), - "{type}".to_string(), - type_str, - ) - } + Some(s) => s.clone(), + None => Rc::new(CastSyntax { + template: "{expr}".to_string(), + cast_rules: Rc::new(vec![]), +}), +}; +v2_rt::replace(v2_rt::replace(syntax.template.clone(), "{expr}".to_string(), expr_str), "{type}".to_string(), type_str) +} } pub fn lookup_checkpoint(target: RenderTarget, dag_name: String) -> Option> { - Rc::new({ - let mut __result = Vec::new(); - for cp in target_checkpoints(target).iter().cloned() { - if (cp.dag_name.clone().as_str() == dag_name.clone().as_str()) { - __result.push(cp); - } - } - __result - }) - .first() - .cloned() + Rc::new({ let mut __result = Vec::new(); for cp in target_checkpoints(target).iter().cloned() { if (cp.dag_name.clone().as_str() == dag_name.clone().as_str()) { __result.push(cp); } } __result }).first().cloned() } pub fn coerce_primitive_type(target: RenderTarget, dag_name: String) -> String { match lookup_checkpoint(target, dag_name.clone()) { - Some(cp) => cp.target_type.clone(), - None => dag_name.clone(), - } + Some(cp) => cp.target_type.clone(), + None => dag_name.clone(), +} } pub fn is_copy(target: RenderTarget, dag_name: String) -> Option { match lookup_checkpoint(target, dag_name) { - Some(cp) => cp.is_copy.clone(), - None => None, - } + Some(cp) => cp.is_copy.clone(), + None => None, +} } pub fn literal_suffix(target: RenderTarget, dag_name: String) -> Option { match lookup_checkpoint(target, dag_name) { - Some(cp) => match cp.literal_suffix.clone() { - Some(s) => Some(s.clone()), - None => Some("".to_string()), - }, - None => None, - } + Some(cp) => match cp.literal_suffix.clone() { + Some(s) => Some(s.clone()), + None => Some("".to_string()), +}, + None => None, +} } pub fn lookup_inhabitant(target: RenderTarget, algebra: String) -> Option> { - Rc::new({ - let mut __result = Vec::new(); - for inh in target_inhabitants(target).iter().cloned() { - if (inh.algebra.clone().as_str() == algebra.clone().as_str()) { - __result.push(inh); - } - } - __result - }) - .first() - .cloned() + Rc::new({ let mut __result = Vec::new(); for inh in target_inhabitants(target).iter().cloned() { if (inh.algebra.clone().as_str() == algebra.clone().as_str()) { __result.push(inh); } } __result }).first().cloned() } pub fn coerce_container_template(target: RenderTarget, container_name: String) -> Option { match container_template_algebra(container_name) { - Some(algebra) => match lookup_inhabitant(target, algebra.clone()) { - Some(inh) => Some(inh.template.clone()), - None => None, - }, - None => None, - } + Some(algebra) => match lookup_inhabitant(target, algebra.clone()) { + Some(inh) => Some(inh.template.clone()), + None => None, +}, + None => None, +} } pub fn apply_inhabitant_template1(template: String, inner: String) -> String { @@ -176,11 +133,7 @@ pub fn apply_inhabitant_template1(template: String, inner: String) -> String { } pub fn apply_inhabitant_template2(template: String, first: String, second: String) -> String { - v2_rt::replace( - v2_rt::replace(template, "{0}".to_string(), first), - "{1}".to_string(), - second, - ) + v2_rt::replace(v2_rt::replace(template, "{0}".to_string(), first), "{1}".to_string(), second) } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -216,39 +169,30 @@ pub struct CoercionTestEntry { pub fn target_label(target: RenderTarget) -> String { match target { - RenderTarget::Rust => "rust".to_string(), - RenderTarget::Python => "python".to_string(), - RenderTarget::Go => "go".to_string(), - RenderTarget::Dag => "dag".to_string(), - } + RenderTarget::Rust => "rust".to_string(), + RenderTarget::Python => "python".to_string(), + RenderTarget::Go => "go".to_string(), + RenderTarget::Dag => "dag".to_string(), +} } pub fn checkpoint_tests(target: &RenderTarget) -> Rc>> { { let label = target_label(target.clone()); - let cps = target_checkpoints(target.clone()); - if ((cps.clone().len() as i64) == 0) { +let cps = target_checkpoints(target.clone()); +if ((cps.clone().len() as i64) == 0) { Rc::new(vec![]) } else { Rc::new(vec![Rc::new(CoercionTestEntry { - test_name: v2_rt::concat( - v2_rt::concat("coercion_".to_string(), label), - "_checkpoint_resolves_primitives".to_string(), - ), - assertions: Rc::new({ - let mut __result = Vec::new(); - for cp in cps.clone().iter().cloned() { - __result.push(Rc::new(CoercionAssertion::CheckpointAssertion { - target: target.clone(), - dag_name: cp.dag_name.clone(), - expected_type: cp.target_type.clone(), - })); - } - __result - }), - })]) + test_name: v2_rt::concat(v2_rt::concat("coercion_".to_string(), label), "_checkpoint_resolves_primitives".to_string()), + assertions: Rc::new({ let mut __result = Vec::new(); for cp in cps.clone().iter().cloned() { __result.push(Rc::new(CoercionAssertion::CheckpointAssertion { + target: target.clone(), + dag_name: cp.dag_name.clone(), + expected_type: cp.target_type.clone(), +})); } __result }), +})]) } - } +} } pub fn inhabitant_test_names() -> Rc> { @@ -258,173 +202,89 @@ pub fn inhabitant_test_names() -> Rc> { pub fn inhabitant_tests(target: &RenderTarget) -> Rc>> { { let label = target_label(target.clone()); - let assertions = Rc::new({ - let mut __result = Vec::new(); - for name in inhabitant_test_names().iter().cloned() { - __result.extend( - (*match coerce_container_template(target.clone(), name.clone()) { - Some(tmpl) => { - Rc::new(vec![Rc::new(CoercionAssertion::ContainerAssertion { - target: target.clone(), - container_name: name.clone(), - expected_template: tmpl.clone(), - })]) - } - None => Rc::new(vec![]), - }) - .iter() - .cloned(), - ); - } - __result - }); - if ((assertions.clone().len() as i64) == 0) { +let assertions = Rc::new({ let mut __result = Vec::new(); for name in inhabitant_test_names().iter().cloned() { __result.extend((*match coerce_container_template(target.clone(), name.clone()) { + Some(tmpl) => Rc::new(vec![Rc::new(CoercionAssertion::ContainerAssertion { + target: target.clone(), + container_name: name.clone(), + expected_template: tmpl.clone(), +})]), + None => Rc::new(vec![]), +}).iter().cloned()); } __result }); +if ((assertions.clone().len() as i64) == 0) { Rc::new(vec![]) } else { Rc::new(vec![Rc::new(CoercionTestEntry { - test_name: v2_rt::concat( - v2_rt::concat("coercion_".to_string(), label), - "_inhabitant_resolves_containers".to_string(), - ), - assertions: assertions.clone(), - })]) + test_name: v2_rt::concat(v2_rt::concat("coercion_".to_string(), label), "_inhabitant_resolves_containers".to_string()), + assertions: assertions.clone(), +})]) } - } +} } pub fn copy_tests() -> Rc>> { { let cps = target_checkpoints(RenderTarget::Rust); - let copy_assertions = Rc::new({ - let mut __result = Vec::new(); - for cp in cps.iter().cloned() { - __result.extend( - (*match cp.is_copy.clone() { - Some(v) => Rc::new(vec![Rc::new(CoercionAssertion::CopyAssertion { - target: RenderTarget::Rust, - dag_name: cp.dag_name.clone(), - expected_copy: v.clone(), - })]), - None => Rc::new(vec![]), - }) - .iter() - .cloned(), - ); - } - __result - }); - if ((copy_assertions.clone().len() as i64) == 0) { +let copy_assertions = Rc::new({ let mut __result = Vec::new(); for cp in cps.iter().cloned() { __result.extend((*match cp.is_copy.clone() { + Some(v) => Rc::new(vec![Rc::new(CoercionAssertion::CopyAssertion { + target: RenderTarget::Rust, + dag_name: cp.dag_name.clone(), + expected_copy: v.clone(), +})]), + None => Rc::new(vec![]), +}).iter().cloned()); } __result }); +if ((copy_assertions.clone().len() as i64) == 0) { Rc::new(vec![]) } else { Rc::new(vec![Rc::new(CoercionTestEntry { - test_name: "coercion_is_copy_from_checkpoint".to_string(), - assertions: copy_assertions.clone(), - })]) + test_name: "coercion_is_copy_from_checkpoint".to_string(), + assertions: copy_assertions.clone(), +})]) } - } +} } pub fn template_application_tests() -> Rc>> { { - let targets = Rc::new(vec![ - RenderTarget::Rust, - RenderTarget::Python, - RenderTarget::Go, - ]); - let assertions = Rc::new({ - let mut __result = Vec::new(); - for t in targets.iter().cloned() { - __result.extend( - (*{ - let inhs = target_inhabitants(t.clone()); - let int_target = coerce_primitive_type(t.clone(), "Int".to_string()); - let str_target = coerce_primitive_type(t.clone(), "String".to_string()); - Rc::new({ - let mut __result = Vec::new(); - for inh in inhs.clone().iter().cloned() { - __result.extend( - (*if (inh.arity.clone() == 1) { - { - let expected = apply_inhabitant_template1( - inh.template.clone(), - int_target.clone(), - ); - Rc::new(vec![Rc::new( - CoercionAssertion::TemplateAssertion { - template: inh.template.clone(), - args: Rc::new(vec![int_target.clone()]), - expected: expected.clone(), - }, - )]) - } - } else { - if (inh.arity.clone() == 2) { - { - let expected = apply_inhabitant_template2( - inh.template.clone(), - str_target.clone(), - int_target.clone(), - ); - Rc::new(vec![Rc::new( - CoercionAssertion::TemplateAssertion { - template: inh.template.clone(), - args: Rc::new(vec![ - str_target.clone(), - int_target.clone(), - ]), - expected: expected.clone(), - }, - )]) - } - } else { - Rc::new(vec![]) - } - }) - .iter() - .cloned(), - ); - } - __result - }) - }) - .iter() - .cloned(), - ); - } - __result - }); - if ((assertions.clone().len() as i64) == 0) { + let targets = Rc::new(vec![RenderTarget::Rust, RenderTarget::Python, RenderTarget::Go]); +let assertions = Rc::new({ let mut __result = Vec::new(); for t in targets.iter().cloned() { __result.extend((*{ + let inhs = target_inhabitants(t.clone()); +let int_target = coerce_primitive_type(t.clone(), "Int".to_string()); +let str_target = coerce_primitive_type(t.clone(), "String".to_string()); +Rc::new({ let mut __result = Vec::new(); for inh in inhs.clone().iter().cloned() { __result.extend((*if (inh.arity.clone() == 1) { + { + let expected = apply_inhabitant_template1(inh.template.clone(), int_target.clone()); +Rc::new(vec![Rc::new(CoercionAssertion::TemplateAssertion { + template: inh.template.clone(), + args: Rc::new(vec![int_target.clone()]), + expected: expected.clone(), +})]) +} + } else { + if (inh.arity.clone() == 2) { + { + let expected = apply_inhabitant_template2(inh.template.clone(), str_target.clone(), int_target.clone()); +Rc::new(vec![Rc::new(CoercionAssertion::TemplateAssertion { + template: inh.template.clone(), + args: Rc::new(vec![str_target.clone(), int_target.clone()]), + expected: expected.clone(), +})]) +} + } else { + Rc::new(vec![]) + } + }).iter().cloned()); } __result }) +}).iter().cloned()); } __result }); +if ((assertions.clone().len() as i64) == 0) { Rc::new(vec![]) } else { Rc::new(vec![Rc::new(CoercionTestEntry { - test_name: "coercion_template_application".to_string(), - assertions: assertions.clone(), - })]) + test_name: "coercion_template_application".to_string(), + assertions: assertions.clone(), +})]) } - } +} } pub fn extract_coercion_tests() -> Rc>> { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - checkpoint_tests(&RenderTarget::Rust), - checkpoint_tests(&RenderTarget::Python), - ), - checkpoint_tests(&RenderTarget::Go), - ), - inhabitant_tests(&RenderTarget::Rust), - ), - inhabitant_tests(&RenderTarget::Python), - ), - inhabitant_tests(&RenderTarget::Go), - ), - copy_tests(), - ), - template_application_tests(), - ) + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(checkpoint_tests(&RenderTarget::Rust), checkpoint_tests(&RenderTarget::Python)), checkpoint_tests(&RenderTarget::Go)), inhabitant_tests(&RenderTarget::Rust)), inhabitant_tests(&RenderTarget::Python)), inhabitant_tests(&RenderTarget::Go)), copy_tests()), template_application_tests()) } diff --git a/src/v2/stage0/src/v2_compiler_compile.rs b/src/v2/stage0/src/v2_compiler_compile.rs index 667fde627bc..d563415770e 100644 --- a/src/v2/stage0/src/v2_compiler_compile.rs +++ b/src/v2/stage0/src/v2_compiler_compile.rs @@ -1,76 +1,51 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.compile -use crate::std_induction::RecursionShape::{ - DirectRecursion, ListRecursion, MapValueRecursion, OptionalRecursion, SetRecursion, -}; -use crate::std_induction::ShrinkFactor::{ConstantShrink, ProportionalShrink, UnitShrink}; -use crate::std_induction::SubValueRelation::{ - IteratedSubValue, PreservedValue, StrictSubValue, SubValueUnknown, -}; -pub use crate::std_induction::{InductiveField, RecursionShape, ShrinkFactor, SubValueRelation}; -use crate::std_termination::PositiveDescentAmount::{AdditionalStep, OneStep}; -use crate::std_termination::ProportionalDivisor::{DivideByTwo, StrictlyLarger}; -pub use crate::std_termination::{PositiveDescentAmount, ProportionalDivisor}; -use crate::v2_compiler_artifact::RenderTarget::Dag; -pub use crate::v2_compiler_artifact::{ - default_artifact_plan, Artifact, ArtifactPlan, RenderTarget, -}; -pub use crate::v2_compiler_complexity::{ - build_complexity_report, empty_complexity_report, ComplexityReport, ComplexityViolation, - FuncEntry, RecursionContext, -}; -pub use crate::v2_compiler_emit::{escape_json_string, EmitResult}; -pub use crate::v2_compiler_emit_go::emit_go; -pub use crate::v2_compiler_emit_python::emit_python; -pub use crate::v2_compiler_emit_rust::emit_rust; -pub use crate::v2_compiler_infer::reconcile; -pub use crate::v2_compiler_infer_items::{ResolvedGraph, TypedModule}; -pub use crate::v2_compiler_infer_types::algebra_field_kind_name; -pub use crate::v2_compiler_normalize::{normalize_graph, NormalizeResult}; -use crate::v2_compiler_ownership::OwnershipDecision::SharedError; -pub use crate::v2_compiler_ownership::{analyze_ownership, OwnershipDecision, OwnershipProof}; -pub use crate::v2_compiler_parse::{parse_with_table, ParseResult}; -pub use crate::v2_compiler_resolve::{resolve_modules, ModuleGraph}; -pub use crate::v2_compiler_tokenize::tokenize; +use std::collections::HashMap; +use std::rc::Rc; use crate::v2_rt; -use crate::v2_std_core::BinOp::*; -use crate::v2_std_core::CallSemantics::*; -use crate::v2_std_core::Cardinality::*; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::v2_std_core::{CompileResult, TextFile, SourceSpan, authored_name_at, ErrorNode, CompilerDiagnostic, is_error_diagnostic, diagnostic_to_message, diagnostic_to_span, make_error_node, no_span, Connective, Cardinality, resource_use_name_at, resource_use_resource, param_node_name_at, param_node_type_expr, param_node_default_value, param_node_span, field_node_name_at, field_node_type_expr, field_node_cardinality, field_node_default_value, field_node_from_key, field_node_span, module_imports, module_items, import_is_all, import_specific_names_at, FieldAccessStyle, FieldValueShape, FieldSummary, InferredNode, VarBindingKind, CallSemantics, MethodSemantics, ExprErrorKind, ExprData, MatchPattern, field_binding_name_at, field_binding_pattern, arg_name_at, arg_value, arm_pattern, arm_guard, arm_body, field_init_node_name_at, field_init_node_value, LiteralValue, BinOp, UnaryOpKind, StringPart, Node, Token, NewlineIndex, build_newline_index, field_access_field_at, expr_call_func_at, lambda_param_names_at, record_lit_type_name_at, foreach_variable_at, expr_method_name_at, InternTable, InternResult, empty_intern_table, intern}; use crate::v2_std_core::CompilerDiagnostic::{InternalError, OwnershipViolation}; -use crate::v2_std_core::Connective::{Arrow, NoConnective}; -use crate::v2_std_core::ExprData::*; -use crate::v2_std_core::ExprErrorKind::*; +use crate::v2_std_core::Connective::{NoConnective, Arrow}; +use crate::v2_std_core::InferredNode::{Resolved, CompilerError, TypeVariable}; +use crate::v2_std_core::MethodSemantics::{PlainMethodSemantics, AlgebraMethodSemantics, ServiceMethodSemantics}; +use crate::v2_std_core::Cardinality::*; use crate::v2_std_core::FieldAccessStyle::*; use crate::v2_std_core::FieldValueShape::*; -use crate::v2_std_core::InferredNode::{CompilerError, Resolved, TypeVariable}; -use crate::v2_std_core::LiteralValue::*; +use crate::v2_std_core::VarBindingKind::*; +use crate::v2_std_core::CallSemantics::*; +use crate::v2_std_core::ExprErrorKind::*; +use crate::v2_std_core::ExprData::*; use crate::v2_std_core::MatchPattern::*; -use crate::v2_std_core::MethodSemantics::{ - AlgebraMethodSemantics, PlainMethodSemantics, ServiceMethodSemantics, -}; -use crate::v2_std_core::StringPart::*; +use crate::v2_std_core::LiteralValue::*; +use crate::v2_std_core::BinOp::*; use crate::v2_std_core::UnaryOpKind::*; -use crate::v2_std_core::VarBindingKind::*; -pub use crate::v2_std_core::{ - arg_name_at, arg_value, arm_body, arm_guard, arm_pattern, authored_name_at, - build_newline_index, diagnostic_to_message, diagnostic_to_span, empty_intern_table, - expr_call_func_at, expr_method_name_at, field_access_field_at, field_binding_name_at, - field_binding_pattern, field_init_node_name_at, field_init_node_value, field_node_cardinality, - field_node_default_value, field_node_from_key, field_node_name_at, field_node_span, - field_node_type_expr, foreach_variable_at, import_is_all, import_specific_names_at, intern, - is_error_diagnostic, lambda_param_names_at, make_error_node, module_imports, module_items, - no_span, param_node_default_value, param_node_name_at, param_node_span, param_node_type_expr, - record_lit_type_name_at, resource_use_name_at, resource_use_resource, BinOp, CallSemantics, - Cardinality, CompileResult, CompilerDiagnostic, Connective, ErrorNode, ExprData, ExprErrorKind, - FieldAccessStyle, FieldSummary, FieldValueShape, InferredNode, InternResult, InternTable, - LiteralValue, MatchPattern, MethodSemantics, NewlineIndex, Node, SourceSpan, StringPart, - TextFile, Token, UnaryOpKind, VarBindingKind, -}; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; -use std::collections::HashMap; -use std::rc::Rc; +use crate::v2_std_core::StringPart::*; +pub use crate::v2_compiler_tokenize::{tokenize}; +pub use crate::v2_compiler_parse::{parse_with_table, ParseResult}; +pub use crate::v2_compiler_resolve::{resolve_modules, ModuleGraph}; +pub use crate::v2_compiler_normalize::{normalize_graph, NormalizeResult}; +pub use crate::v2_compiler_infer_items::{ResolvedGraph, TypedModule}; +pub use crate::v2_compiler_infer::{reconcile}; +pub use crate::v2_compiler_infer_types::{algebra_field_kind_name}; +pub use crate::v2_compiler_emit::{EmitResult, escape_json_string}; +pub use crate::v2_compiler_emit_rust::{emit_rust}; +pub use crate::v2_compiler_emit_python::{emit_python}; +pub use crate::v2_compiler_emit_go::{emit_go}; +pub use crate::v2_compiler_complexity::{ComplexityReport, ComplexityViolation, FuncEntry, RecursionContext, build_complexity_report, empty_complexity_report}; +pub use crate::std_induction::{SubValueRelation, InductiveField, ShrinkFactor, RecursionShape}; +use crate::std_induction::SubValueRelation::{StrictSubValue, IteratedSubValue, PreservedValue, SubValueUnknown}; +use crate::std_induction::ShrinkFactor::{UnitShrink, ConstantShrink, ProportionalShrink}; +use crate::std_induction::RecursionShape::{DirectRecursion, ListRecursion, OptionalRecursion, SetRecursion, MapValueRecursion}; +pub use crate::std_termination::{PositiveDescentAmount, ProportionalDivisor}; +use crate::std_termination::PositiveDescentAmount::{OneStep, AdditionalStep}; +use crate::std_termination::ProportionalDivisor::{DivideByTwo, StrictlyLarger}; +pub use crate::v2_compiler_ownership::{OwnershipProof, OwnershipDecision, analyze_ownership}; +use crate::v2_compiler_ownership::OwnershipDecision::{SharedError}; +pub use crate::v2_compiler_artifact::{ArtifactPlan, Artifact, RenderTarget, default_artifact_plan}; +use crate::v2_compiler_artifact::RenderTarget::{Dag}; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] pub struct SourceFile { @@ -104,64 +79,13 @@ pub struct FrontendAccum { } pub fn extract_func_entries(typed: Rc) -> Rc>> { - Rc::new({ - let mut __result = Vec::new(); - for m in Rc::new({ - let mut __result = Vec::new(); - for m in typed.modules.clone().iter().cloned() { - if { - let mut __found = false; - for item in m.items.clone().iter().cloned() { - if (item.body.clone() != None) { - __found = true; - break; - } - } - __found - } { - __result.push(m); - } - } - __result - }) - .iter() - .cloned() - { - __result.extend( - (*Rc::new({ - let mut __result = Vec::new(); - for item in Rc::new({ - let mut __result = Vec::new(); - for item in m.items.clone().iter().cloned() { - if (item.body.clone() != None) { - __result.push(item); - } - } - __result - }) - .iter() - .cloned() - { - __result.push(Rc::new(FuncEntry { - name: authored_name_at( - m.type_env.clone().source_indices.clone(), - &item, - ), - body: item.body.clone().clone().unwrap(), - params: item.params.clone(), - span: item.span.clone(), - is_tail_recursive: (item.is_self_recursive.clone() - && (item.has_non_tail_self_call.clone() == false)), - })); - } - __result - })) - .iter() - .cloned(), - ); - } - __result - }) + Rc::new({ let mut __result = Vec::new(); for m in Rc::new({ let mut __result = Vec::new(); for m in typed.modules.clone().iter().cloned() { if { let mut __found = false; for item in m.items.clone().iter().cloned() { if (item.body.clone() != None) { __found = true; break; } } __found } { __result.push(m); } } __result }).iter().cloned() { __result.extend((*Rc::new({ let mut __result = Vec::new(); for item in Rc::new({ let mut __result = Vec::new(); for item in m.items.clone().iter().cloned() { if (item.body.clone() != None) { __result.push(item); } } __result }).iter().cloned() { __result.push(Rc::new(FuncEntry { + name: authored_name_at(m.type_env.clone().source_indices.clone(), &item), + body: item.body.clone().clone().unwrap(), + params: item.params.clone(), + span: item.span.clone(), + is_tail_recursive: (item.is_self_recursive.clone() && (item.has_non_tail_self_call.clone() == false)), +})); } __result })).iter().cloned()); } __result }) } pub fn build_recursion_context(typed: Rc) -> RecursionContext { @@ -169,190 +93,86 @@ pub fn build_recursion_context(typed: Rc) -> RecursionContext { } pub fn extract_ownership_proofs(typed: Rc) -> Rc>> { - Rc::new({ - let mut __result = Vec::new(); - for m in Rc::new({ - let mut __result = Vec::new(); - for m in typed.modules.clone().iter().cloned() { - if { - let mut __found = false; - for item in m.items.clone().iter().cloned() { - if (item.body.clone() != None) { - __found = true; - break; - } - } - __found - } { - __result.push(m); - } - } - __result - }) - .iter() - .cloned() - { - __result.extend( - (*Rc::new({ - let mut __result = Vec::new(); - for item in Rc::new({ - let mut __result = Vec::new(); - for item in m.items.clone().iter().cloned() { - if (item.body.clone() != None) { - __result.push(item); - } - } - __result - }) - .iter() - .cloned() - { - __result.push(analyze_ownership( - authored_name_at(m.type_env.clone().source_indices.clone(), &item), - item.params.clone(), - item.body.clone().clone().unwrap(), - &m.type_env.clone().source_indices.clone(), - )); - } - __result - })) - .iter() - .cloned(), - ); - } - __result - }) + Rc::new({ let mut __result = Vec::new(); for m in Rc::new({ let mut __result = Vec::new(); for m in typed.modules.clone().iter().cloned() { if { let mut __found = false; for item in m.items.clone().iter().cloned() { if (item.body.clone() != None) { __found = true; break; } } __found } { __result.push(m); } } __result }).iter().cloned() { __result.extend((*Rc::new({ let mut __result = Vec::new(); for item in Rc::new({ let mut __result = Vec::new(); for item in m.items.clone().iter().cloned() { if (item.body.clone() != None) { __result.push(item); } } __result }).iter().cloned() { __result.push(analyze_ownership(authored_name_at(m.type_env.clone().source_indices.clone(), &item), item.params.clone(), item.body.clone().clone().unwrap(), &m.type_env.clone().source_indices.clone())); } __result })).iter().cloned()); } __result }) } pub fn ownership_diagnostics(proofs: Rc>>) -> Rc>> { - Rc::new({ - let mut __result = Vec::new(); - for proof in proofs.iter().cloned() { - __result.extend( - (*Rc::new({ - let mut __result = Vec::new(); - for decision in proof.decisions.clone().iter().cloned() { - __result.extend( - (*match (*decision.clone()).clone() { - OwnershipDecision::SharedError { - binding, - consumer_count: count, - sites, - .. - } => Rc::new(vec![make_error_node( - Rc::new(CompilerDiagnostic::OwnershipViolation { - binding: binding.clone(), - fn_name: proof.func_name.clone(), - consumers: count.clone(), - span: no_span(), - }), - proof.func_name.clone(), - )]), - _ => Rc::new(vec![]), - }) - .iter() - .cloned(), - ); - } - __result - })) - .iter() - .cloned(), - ); - } - __result - }) + Rc::new({ let mut __result = Vec::new(); for proof in proofs.iter().cloned() { __result.extend((*Rc::new({ let mut __result = Vec::new(); for decision in proof.decisions.clone().iter().cloned() { __result.extend((*match (*decision.clone()).clone() { + OwnershipDecision::SharedError { binding, consumer_count: count, sites, .. } => Rc::new(vec![make_error_node(Rc::new(CompilerDiagnostic::OwnershipViolation { + binding: binding.clone(), + fn_name: proof.func_name.clone(), + consumers: count.clone(), + span: no_span(), +}), proof.func_name.clone())]), + _ => Rc::new(vec![]), +}).iter().cloned()); } __result })).iter().cloned()); } __result }) } pub fn complexity_diagnostics(complexity: Rc) -> Rc>> { - Rc::new({ - let mut __result = Vec::new(); - for v in complexity.violations.clone().iter().cloned() { - __result.push(make_error_node( - Rc::new(CompilerDiagnostic::ComplexityUnknown { - func_name: v.func_name.clone(), - reason: v.reason.clone(), - span: v.span.clone(), - }), - v.func_name.clone(), - )); - } - __result - }) + Rc::new({ let mut __result = Vec::new(); for v in complexity.violations.clone().iter().cloned() { __result.push(make_error_node(Rc::new(CompilerDiagnostic::ComplexityUnknown { + func_name: v.func_name.clone(), + reason: v.reason.clone(), + span: v.span.clone(), +}), v.func_name.clone())); } __result }) } pub fn empty_artifact_plan() -> Rc { Rc::new(ArtifactPlan { - artifacts: Rc::new(vec![]), - boundaries: Rc::new(vec![]), - }) + artifacts: Rc::new(vec![]), + boundaries: Rc::new(vec![]), +}) } pub fn compile_bundle_error(message: String) -> Rc { - make_error_node( - Rc::new(CompilerDiagnostic::InternalError { - message: message, - span: no_span(), - }), - "".to_string(), - ) + make_error_node(Rc::new(CompilerDiagnostic::InternalError { + message: message, + span: no_span(), +}), "".to_string()) } pub fn emit_artifact(typed: Rc, artifact: Rc) -> Rc { match artifact.target.clone() { - RenderTarget::Rust => emit_rust(&typed), - RenderTarget::Python => emit_python(&typed), - RenderTarget::Go => emit_go(&typed), - RenderTarget::Dag => emit_dag_artifact(&typed), - } + RenderTarget::Rust => emit_rust(&typed), + RenderTarget::Python => emit_python(&typed), + RenderTarget::Go => emit_go(&typed), + RenderTarget::Dag => emit_dag_artifact(&typed), +} } pub fn json_quote(s: String) -> String { - v2_rt::concat( - v2_rt::concat("\"".to_string(), escape_json_string(s)), - "\"".to_string(), - ) + v2_rt::concat(v2_rt::concat("\"".to_string(), escape_json_string(s)), "\"".to_string()) } pub fn json_list(items: Rc>) -> String { - v2_rt::concat( - v2_rt::concat("[".to_string(), items.join(&", ".to_string())), - "]".to_string(), - ) + v2_rt::concat(v2_rt::concat("[".to_string(), items.join(&", ".to_string())), "]".to_string()) } pub fn json_optional_string(value: Option) -> String { match value { - Some(inner) => json_quote(inner.clone()), - None => "null".to_string(), - } + Some(inner) => json_quote(inner.clone()), + None => "null".to_string(), +} } -pub fn json_optional_node( - value: Option>, - source_indices: Rc>>, -) -> String { +pub fn json_optional_node(value: Option>, source_indices: Rc>>) -> String { match value { - Some(inner) => serialize_node(&inner, &source_indices), - None => "null".to_string(), - } + Some(inner) => serialize_node(&inner, &source_indices), + None => "null".to_string(), +} } -pub fn json_optional_inferred_node( - value: Option>, - source_indices: Rc>>, -) -> String { +pub fn json_optional_inferred_node(value: Option>, source_indices: Rc>>) -> String { match value { - Some(inner) => serialize_inferred_node(inner.clone(), source_indices), - None => "null".to_string(), - } + Some(inner) => serialize_inferred_node(inner.clone(), source_indices), + None => "null".to_string(), +} } pub fn json_optional_span(value: Option>) -> String { match value { - Some(inner) => serialize_span(&inner), - None => "null".to_string(), - } + Some(inner) => serialize_span(&inner), + None => "null".to_string(), +} } pub fn json_bool(value: bool) -> String { @@ -365,1197 +185,306 @@ pub fn json_bool(value: bool) -> String { pub fn connective_name(value: Connective) -> String { match value { - Connective::Conj => "Conj".to_string(), - Connective::Disj => "Disj".to_string(), - Connective::NoConnective => "NoConnective".to_string(), - Connective::Arrow => "Arrow".to_string(), - } + Connective::Conj => "Conj".to_string(), + Connective::Disj => "Disj".to_string(), + Connective::NoConnective => "NoConnective".to_string(), + Connective::Arrow => "Arrow".to_string(), +} } pub fn cardinality_name(value: Cardinality) -> String { match value { - Cardinality::Required => "Required".to_string(), - Cardinality::CardOptional => "CardOptional".to_string(), - } + Cardinality::Required => "Required".to_string(), + Cardinality::CardOptional => "CardOptional".to_string(), +} } pub fn field_access_style_name(value: FieldAccessStyle) -> String { match value { - FieldAccessStyle::StoredField => "StoredField".to_string(), - FieldAccessStyle::EnumAccessor => "EnumAccessor".to_string(), - FieldAccessStyle::OptionalUnwrap => "OptionalUnwrap".to_string(), - FieldAccessStyle::TupleFirst => "TupleFirst".to_string(), - FieldAccessStyle::TupleSecond => "TupleSecond".to_string(), - } + FieldAccessStyle::StoredField => "StoredField".to_string(), + FieldAccessStyle::EnumAccessor => "EnumAccessor".to_string(), + FieldAccessStyle::OptionalUnwrap => "OptionalUnwrap".to_string(), + FieldAccessStyle::TupleFirst => "TupleFirst".to_string(), + FieldAccessStyle::TupleSecond => "TupleSecond".to_string(), +} } pub fn field_value_shape_name(value: FieldValueShape) -> String { match value { - FieldValueShape::PlainValue => "PlainValue".to_string(), - FieldValueShape::OptionalValue => "OptionalValue".to_string(), - } + FieldValueShape::PlainValue => "PlainValue".to_string(), + FieldValueShape::OptionalValue => "OptionalValue".to_string(), +} } pub fn var_binding_kind_name(value: Rc) -> String { match (*value).clone() { - VarBindingKind::LocalValueBinding => "LocalValueBinding".to_string(), - VarBindingKind::FunctionValueBinding => "FunctionValueBinding".to_string(), - VarBindingKind::VariantValueBinding { .. } => "VariantValueBinding".to_string(), - VarBindingKind::MatchBoundBinding => "MatchBoundBinding".to_string(), - } + VarBindingKind::LocalValueBinding => "LocalValueBinding".to_string(), + VarBindingKind::FunctionValueBinding => "FunctionValueBinding".to_string(), + VarBindingKind::VariantValueBinding { .. } => "VariantValueBinding".to_string(), + VarBindingKind::MatchBoundBinding => "MatchBoundBinding".to_string(), +} } pub fn call_semantics_name(value: CallSemantics) -> String { match value { - CallSemantics::PlainCallSemantics => "PlainCallSemantics".to_string(), - CallSemantics::LookupCallSemantics => "LookupCallSemantics".to_string(), - } + CallSemantics::PlainCallSemantics => "PlainCallSemantics".to_string(), + CallSemantics::LookupCallSemantics => "LookupCallSemantics".to_string(), +} } pub fn expr_error_kind_name(value: ExprErrorKind) -> String { match value { - ExprErrorKind::ParseRecoveryError => "ParseRecoveryError".to_string(), - ExprErrorKind::SemanticExprError => "SemanticExprError".to_string(), - ExprErrorKind::InternalExprError => "InternalExprError".to_string(), - } + ExprErrorKind::ParseRecoveryError => "ParseRecoveryError".to_string(), + ExprErrorKind::SemanticExprError => "SemanticExprError".to_string(), + ExprErrorKind::InternalExprError => "InternalExprError".to_string(), +} } pub fn bin_op_name(value: BinOp) -> String { match value { - BinOp::Add => "Add".to_string(), - BinOp::Sub => "Sub".to_string(), - BinOp::Mul => "Mul".to_string(), - BinOp::Div => "Div".to_string(), - BinOp::Mod => "Mod".to_string(), - BinOp::Eq => "Eq".to_string(), - BinOp::Ne => "Ne".to_string(), - BinOp::Lt => "Lt".to_string(), - BinOp::Gt => "Gt".to_string(), - BinOp::Le => "Le".to_string(), - BinOp::Ge => "Ge".to_string(), - BinOp::And => "And".to_string(), - BinOp::Or => "Or".to_string(), - BinOp::NullCoalesce => "NullCoalesce".to_string(), - } + BinOp::Add => "Add".to_string(), + BinOp::Sub => "Sub".to_string(), + BinOp::Mul => "Mul".to_string(), + BinOp::Div => "Div".to_string(), + BinOp::Mod => "Mod".to_string(), + BinOp::Eq => "Eq".to_string(), + BinOp::Ne => "Ne".to_string(), + BinOp::Lt => "Lt".to_string(), + BinOp::Gt => "Gt".to_string(), + BinOp::Le => "Le".to_string(), + BinOp::Ge => "Ge".to_string(), + BinOp::And => "And".to_string(), + BinOp::Or => "Or".to_string(), + BinOp::NullCoalesce => "NullCoalesce".to_string(), +} } pub fn unary_op_name(value: UnaryOpKind) -> String { match value { - UnaryOpKind::Not => "Not".to_string(), - UnaryOpKind::Neg => "Neg".to_string(), - } + UnaryOpKind::Not => "Not".to_string(), + UnaryOpKind::Neg => "Neg".to_string(), +} } pub fn serialize_span(span: &Rc) -> String { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("{\"start\": ".to_string(), (span.start.clone()).to_string()), - ", \"end\": ".to_string(), - ), - (span.end.clone()).to_string(), - ), - "}".to_string(), - ) -} - -pub fn serialize_import_node( - imp: &Rc, - source_indices: &Rc>>, -) -> String { + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"start\": ".to_string(), (span.start.clone()).to_string()), ", \"end\": ".to_string()), (span.end.clone()).to_string()), "}".to_string()) +} + +pub fn serialize_import_node(imp: &Rc, source_indices: &Rc>>) -> String { { let names_json = if import_is_all(imp.clone()) { "{\"kind\": \"ImportAll\"}".to_string() } else { - v2_rt::concat( - v2_rt::concat( - "{\"kind\": \"ImportSpecific\", \"names\": ".to_string(), - json_list(Rc::new({ - let mut __result = Vec::new(); - for v in import_specific_names_at(imp.clone(), source_indices.clone()) - .iter() - .cloned() - { - __result.push(json_quote(v.clone())); - } - __result - })), - ), - "}".to_string(), - ) + v2_rt::concat(v2_rt::concat("{\"kind\": \"ImportSpecific\", \"names\": ".to_string(), json_list(Rc::new({ let mut __result = Vec::new(); for v in import_specific_names_at(imp.clone(), source_indices.clone()).iter().cloned() { __result.push(json_quote(v.clone())); } __result }))), "}".to_string()) }; - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"module_path\": ".to_string(), - json_quote(authored_name_at(source_indices.clone(), &imp)), - ), - ", \"names\": ".to_string(), - ), - names_json, - ), - ", \"span\": ".to_string(), - ), - serialize_span(&imp.span.clone()), - ), - "}".to_string(), - ) - } +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"module_path\": ".to_string(), json_quote(authored_name_at(source_indices.clone(), &imp))), ", \"names\": ".to_string()), names_json), ", \"span\": ".to_string()), serialize_span(&imp.span.clone())), "}".to_string()) +} } pub fn serialize_field_summary(summary: &Rc) -> String { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"access_style\": ".to_string(), - json_quote(field_access_style_name(summary.access_style.clone())), - ), - ", \"value_shape\": ".to_string(), - ), - json_quote(field_value_shape_name(summary.value_shape.clone())), - ), - "}".to_string(), - ) + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"access_style\": ".to_string(), json_quote(field_access_style_name(summary.access_style.clone()))), ", \"value_shape\": ".to_string()), json_quote(field_value_shape_name(summary.value_shape.clone()))), "}".to_string()) } pub fn serialize_literal(value: Rc) -> String { match (*value).clone() { - LiteralValue::LitStr { value: inner, .. } => v2_rt::concat( - v2_rt::concat( - "{\"kind\": \"LitStr\", \"value\": ".to_string(), - json_quote(inner.clone()), - ), - "}".to_string(), - ), - LiteralValue::LitInt { value: inner, .. } => v2_rt::concat( - v2_rt::concat( - "{\"kind\": \"LitInt\", \"value\": ".to_string(), - (inner.clone()).to_string(), - ), - "}".to_string(), - ), - LiteralValue::LitFloat { value: inner, .. } => v2_rt::concat( - v2_rt::concat( - "{\"kind\": \"LitFloat\", \"value\": ".to_string(), - json_quote(inner.clone()), - ), - "}".to_string(), - ), - LiteralValue::LitBool { value: inner, .. } => v2_rt::concat( - v2_rt::concat( - "{\"kind\": \"LitBool\", \"value\": ".to_string(), - json_bool(inner.clone()), - ), - "}".to_string(), - ), - LiteralValue::LitNull => "{\"kind\": \"LitNull\"}".to_string(), - } + LiteralValue::LitStr { value: inner, .. } => v2_rt::concat(v2_rt::concat("{\"kind\": \"LitStr\", \"value\": ".to_string(), json_quote(inner.clone())), "}".to_string()), + LiteralValue::LitInt { value: inner, .. } => v2_rt::concat(v2_rt::concat("{\"kind\": \"LitInt\", \"value\": ".to_string(), (inner.clone()).to_string()), "}".to_string()), + LiteralValue::LitFloat { value: inner, .. } => v2_rt::concat(v2_rt::concat("{\"kind\": \"LitFloat\", \"value\": ".to_string(), json_quote(inner.clone())), "}".to_string()), + LiteralValue::LitBool { value: inner, .. } => v2_rt::concat(v2_rt::concat("{\"kind\": \"LitBool\", \"value\": ".to_string(), json_bool(inner.clone())), "}".to_string()), + LiteralValue::LitNull => "{\"kind\": \"LitNull\"}".to_string(), +} } -pub fn serialize_field_binding( - binding: &Rc, - source_indices: &Rc>>, -) -> String { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"field_name\": ".to_string(), - json_quote(field_binding_name_at( - binding.clone(), - source_indices.clone(), - )), - ), - ", \"binding\": ".to_string(), - ), - serialize_match_pattern( - field_binding_pattern(binding.clone()), - source_indices.clone(), - ), - ), - "}".to_string(), - ) -} - -pub fn serialize_match_pattern( - pattern: Rc, - source_indices: Rc>>, -) -> String { +pub fn serialize_field_binding(binding: &Rc, source_indices: &Rc>>) -> String { + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"field_name\": ".to_string(), json_quote(field_binding_name_at(binding.clone(), source_indices.clone()))), ", \"binding\": ".to_string()), serialize_match_pattern(field_binding_pattern(binding.clone()), source_indices.clone())), "}".to_string()) +} + +pub fn serialize_match_pattern(pattern: Rc, source_indices: Rc>>) -> String { match (*pattern).clone() { - MatchPattern::Bind { name: inner, .. } => v2_rt::concat( - v2_rt::concat( - "{\"kind\": \"Bind\", \"name\": ".to_string(), - json_quote(inner.clone()), - ), - "}".to_string(), - ), - MatchPattern::LitPattern { value: inner, .. } => v2_rt::concat( - v2_rt::concat( - "{\"kind\": \"LitPattern\", \"value\": ".to_string(), - serialize_literal(inner.clone()), - ), - "}".to_string(), - ), - MatchPattern::VariantPattern { - name: inner, - parent_enum, - field_bindings, - .. - } => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"kind\": \"VariantPattern\", \"name\": ".to_string(), - json_quote(inner.clone()), - ), - ", \"parent_enum\": ".to_string(), - ), - json_optional_string(parent_enum.clone()), - ), - ", \"field_bindings\": ".to_string(), - ), - json_list(Rc::new({ - let mut __result = Vec::new(); - for fb in field_bindings.clone().iter().cloned() { - __result.push(serialize_field_binding(&fb, &source_indices)); - } - __result - })), - ), - "}".to_string(), - ), - MatchPattern::Wildcard => "{\"kind\": \"Wildcard\"}".to_string(), - } + MatchPattern::Bind { name: inner, .. } => v2_rt::concat(v2_rt::concat("{\"kind\": \"Bind\", \"name\": ".to_string(), json_quote(inner.clone())), "}".to_string()), + MatchPattern::LitPattern { value: inner, .. } => v2_rt::concat(v2_rt::concat("{\"kind\": \"LitPattern\", \"value\": ".to_string(), serialize_literal(inner.clone())), "}".to_string()), + MatchPattern::VariantPattern { name: inner, parent_enum, field_bindings, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"VariantPattern\", \"name\": ".to_string(), json_quote(inner.clone())), ", \"parent_enum\": ".to_string()), json_optional_string(parent_enum.clone())), ", \"field_bindings\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for fb in field_bindings.clone().iter().cloned() { __result.push(serialize_field_binding(&fb, &source_indices)); } __result }))), "}".to_string()), + MatchPattern::Wildcard => "{\"kind\": \"Wildcard\"}".to_string(), +} } -pub fn serialize_named_arg( - arg: &Rc, - source_indices: &Rc>>, -) -> String { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"name\": ".to_string(), - json_optional_string(arg_name_at(arg.clone(), source_indices.clone())), - ), - ", \"value\": ".to_string(), - ), - serialize_node(&arg_value(&arg), &source_indices), - ), - "}".to_string(), - ) -} - -pub fn serialize_match_arm( - arm: &Rc, - source_indices: &Rc>>, -) -> String { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"pattern\": ".to_string(), - serialize_match_pattern( - arm_pattern(arm.clone()), - source_indices.clone(), - ), - ), - ", \"guard\": ".to_string(), - ), - json_optional_node(arm_guard(&arm), source_indices.clone()), - ), - ", \"body\": ".to_string(), - ), - serialize_node(&arm_body(&arm), &source_indices), - ), - "}".to_string(), - ) -} - -pub fn serialize_field_init( - field_init: &Rc, - source_indices: &Rc>>, -) -> String { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"name\": ".to_string(), - json_quote(field_init_node_name_at( - field_init.clone(), - source_indices.clone(), - )), - ), - ", \"value\": ".to_string(), - ), - serialize_node(&field_init_node_value(&field_init), &source_indices), - ), - "}".to_string(), - ) -} - -pub fn serialize_string_part( - part: Rc, - source_indices: Rc>>, -) -> String { +pub fn serialize_named_arg(arg: &Rc, source_indices: &Rc>>) -> String { + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"name\": ".to_string(), json_optional_string(arg_name_at(arg.clone(), source_indices.clone()))), ", \"value\": ".to_string()), serialize_node(&arg_value(&arg), &source_indices)), "}".to_string()) +} + +pub fn serialize_match_arm(arm: &Rc, source_indices: &Rc>>) -> String { + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"pattern\": ".to_string(), serialize_match_pattern(arm_pattern(arm.clone()), source_indices.clone())), ", \"guard\": ".to_string()), json_optional_node(arm_guard(&arm), source_indices.clone())), ", \"body\": ".to_string()), serialize_node(&arm_body(&arm), &source_indices)), "}".to_string()) +} + +pub fn serialize_field_init(field_init: &Rc, source_indices: &Rc>>) -> String { + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"name\": ".to_string(), json_quote(field_init_node_name_at(field_init.clone(), source_indices.clone()))), ", \"value\": ".to_string()), serialize_node(&field_init_node_value(&field_init), &source_indices)), "}".to_string()) +} + +pub fn serialize_string_part(part: Rc, source_indices: Rc>>) -> String { match (*part).clone() { - StringPart::Text { value: inner, .. } => v2_rt::concat( - v2_rt::concat( - "{\"kind\": \"Text\", \"value\": ".to_string(), - json_quote(inner.clone()), - ), - "}".to_string(), - ), - StringPart::Interpolation { expr: inner, .. } => v2_rt::concat( - v2_rt::concat( - "{\"kind\": \"Interpolation\", \"expr\": ".to_string(), - serialize_node(&inner, &source_indices), - ), - "}".to_string(), - ), - } + StringPart::Text { value: inner, .. } => v2_rt::concat(v2_rt::concat("{\"kind\": \"Text\", \"value\": ".to_string(), json_quote(inner.clone())), "}".to_string()), + StringPart::Interpolation { expr: inner, .. } => v2_rt::concat(v2_rt::concat("{\"kind\": \"Interpolation\", \"expr\": ".to_string(), serialize_node(&inner, &source_indices)), "}".to_string()), +} } pub fn serialize_call_semantics(value: Option) -> String { match value { - Some(inner) => v2_rt::concat( - v2_rt::concat( - "{\"kind\": ".to_string(), - json_quote(call_semantics_name(inner.clone())), - ), - "}".to_string(), - ), - None => "null".to_string(), - } + Some(inner) => v2_rt::concat(v2_rt::concat("{\"kind\": ".to_string(), json_quote(call_semantics_name(inner.clone()))), "}".to_string()), + None => "null".to_string(), +} } -pub fn serialize_method_semantics( - value: Option>, - source_indices: &Rc>>, -) -> String { +pub fn serialize_method_semantics(value: Option>, source_indices: &Rc>>) -> String { match value.as_deref().cloned() { - Some(MethodSemantics::PlainMethodSemantics) => { - "{\"kind\": \"PlainMethodSemantics\"}".to_string() - } - Some(MethodSemantics::AlgebraMethodSemantics { - method_def, - fold_accumulator_type, - .. - }) => { - let mn = authored_name_at(source_indices.clone(), &method_def); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"kind\": \"AlgebraMethodSemantics\", \"method_name\": ".to_string(), - json_quote(mn), - ), - ", \"fold_accumulator_type\": ".to_string(), - ), - json_optional_node(fold_accumulator_type.clone(), source_indices.clone()), - ), - "}".to_string(), - ) - } - Some(MethodSemantics::ServiceMethodSemantics { - service_name, - op_params, - .. - }) => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"kind\": \"ServiceMethodSemantics\", \"service_name\": ".to_string(), - json_quote(service_name.clone()), - ), - ", \"op_params\": ".to_string(), - ), - json_list(Rc::new({ - let mut __result = Vec::new(); - for p in op_params.clone().iter().cloned() { - __result.push(serialize_param(&p, &source_indices)); - } - __result - })), - ), - "}".to_string(), - ), - None => "null".to_string(), - } + Some(MethodSemantics::PlainMethodSemantics) => "{\"kind\": \"PlainMethodSemantics\"}".to_string(), + Some(MethodSemantics::AlgebraMethodSemantics { method_def, fold_accumulator_type, .. }) => { + let mn = authored_name_at(source_indices.clone(), &method_def); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"AlgebraMethodSemantics\", \"method_name\": ".to_string(), json_quote(mn)), ", \"fold_accumulator_type\": ".to_string()), json_optional_node(fold_accumulator_type.clone(), source_indices.clone())), "}".to_string()) +}, + Some(MethodSemantics::ServiceMethodSemantics { service_name, op_params, .. }) => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ServiceMethodSemantics\", \"service_name\": ".to_string(), json_quote(service_name.clone())), ", \"op_params\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for p in op_params.clone().iter().cloned() { __result.push(serialize_param(&p, &source_indices)); } __result }))), "}".to_string()), + None => "null".to_string(), +} } pub fn serialize_recursion_shape(shape: RecursionShape) -> String { match shape { - RecursionShape::DirectRecursion => "{\"_variant\": \"DirectRecursion\"}".to_string(), - RecursionShape::ListRecursion => "{\"_variant\": \"ListRecursion\"}".to_string(), - RecursionShape::OptionalRecursion => "{\"_variant\": \"OptionalRecursion\"}".to_string(), - RecursionShape::SetRecursion => "{\"_variant\": \"SetRecursion\"}".to_string(), - RecursionShape::MapValueRecursion => "{\"_variant\": \"MapValueRecursion\"}".to_string(), - } + RecursionShape::DirectRecursion => "{\"_variant\": \"DirectRecursion\"}".to_string(), + RecursionShape::ListRecursion => "{\"_variant\": \"ListRecursion\"}".to_string(), + RecursionShape::OptionalRecursion => "{\"_variant\": \"OptionalRecursion\"}".to_string(), + RecursionShape::SetRecursion => "{\"_variant\": \"SetRecursion\"}".to_string(), + RecursionShape::MapValueRecursion => "{\"_variant\": \"MapValueRecursion\"}".to_string(), +} } pub fn serialize_inductive_field(field: &Rc) -> String { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"type_name\": ".to_string(), - json_quote(field.type_name.clone()), - ), - ", \"variant_name\": ".to_string(), - ), - json_quote(field.variant_name.clone()), - ), - ", \"field_name\": ".to_string(), - ), - json_quote(field.field_name.clone()), - ), - ", \"shape\": ".to_string(), - ), - serialize_recursion_shape(field.shape.clone()), - ), - "}".to_string(), - ) + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"type_name\": ".to_string(), json_quote(field.type_name.clone())), ", \"variant_name\": ".to_string()), json_quote(field.variant_name.clone())), ", \"field_name\": ".to_string()), json_quote(field.field_name.clone())), ", \"shape\": ".to_string()), serialize_recursion_shape(field.shape.clone())), "}".to_string()) } pub fn serialize_positive_descent_amount(steps: Rc) -> String { - stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || match (*steps).clone() { - PositiveDescentAmount::OneStep => "{\"_variant\": \"OneStep\"}".to_string(), - PositiveDescentAmount::AdditionalStep { previous: p, .. } => v2_rt::concat( - v2_rt::concat( - "{\"_variant\": \"AdditionalStep\", \"previous\": ".to_string(), - serialize_positive_descent_amount(p.clone()), - ), - "}".to_string(), - ), + stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { + match (*steps).clone() { + PositiveDescentAmount::OneStep => "{\"_variant\": \"OneStep\"}".to_string(), + PositiveDescentAmount::AdditionalStep { previous: p, .. } => v2_rt::concat(v2_rt::concat("{\"_variant\": \"AdditionalStep\", \"previous\": ".to_string(), serialize_positive_descent_amount(p.clone())), "}".to_string()), +} }) } pub fn serialize_proportional_divisor(d: Rc) -> String { - stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || match (*d).clone() { - ProportionalDivisor::DivideByTwo => "{\"_variant\": \"DivideByTwo\"}".to_string(), - ProportionalDivisor::StrictlyLarger { inner: i, .. } => v2_rt::concat( - v2_rt::concat( - "{\"_variant\": \"StrictlyLarger\", \"inner\": ".to_string(), - serialize_proportional_divisor(i.clone()), - ), - "}".to_string(), - ), + stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { + match (*d).clone() { + ProportionalDivisor::DivideByTwo => "{\"_variant\": \"DivideByTwo\"}".to_string(), + ProportionalDivisor::StrictlyLarger { inner: i, .. } => v2_rt::concat(v2_rt::concat("{\"_variant\": \"StrictlyLarger\", \"inner\": ".to_string(), serialize_proportional_divisor(i.clone())), "}".to_string()), +} }) } pub fn serialize_shrink_factor(factor: Rc) -> String { match (*factor).clone() { - ShrinkFactor::UnitShrink => "{\"_variant\": \"UnitShrink\"}".to_string(), - ShrinkFactor::ConstantShrink { steps: s, .. } => v2_rt::concat( - v2_rt::concat( - "{\"_variant\": \"ConstantShrink\", \"steps\": ".to_string(), - serialize_positive_descent_amount(s.clone()), - ), - "}".to_string(), - ), - ShrinkFactor::ProportionalShrink { divisor: d, .. } => v2_rt::concat( - v2_rt::concat( - "{\"_variant\": \"ProportionalShrink\", \"divisor\": ".to_string(), - serialize_proportional_divisor(d.clone()), - ), - "}".to_string(), - ), - } + ShrinkFactor::UnitShrink => "{\"_variant\": \"UnitShrink\"}".to_string(), + ShrinkFactor::ConstantShrink { steps: s, .. } => v2_rt::concat(v2_rt::concat("{\"_variant\": \"ConstantShrink\", \"steps\": ".to_string(), serialize_positive_descent_amount(s.clone())), "}".to_string()), + ShrinkFactor::ProportionalShrink { divisor: d, .. } => v2_rt::concat(v2_rt::concat("{\"_variant\": \"ProportionalShrink\", \"divisor\": ".to_string(), serialize_proportional_divisor(d.clone())), "}".to_string()), +} } pub fn serialize_sub_value_relation(rel: Rc) -> String { match (*rel).clone() { - SubValueRelation::StrictSubValue { - field: f, - factor: fac, - .. - } => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"_variant\": \"StrictSubValue\", \"field\": ".to_string(), - serialize_inductive_field(&f), - ), - ", \"factor\": ".to_string(), - ), - serialize_shrink_factor(fac.clone()), - ), - "}".to_string(), - ), - SubValueRelation::IteratedSubValue { field: f, .. } => v2_rt::concat( - v2_rt::concat( - "{\"_variant\": \"IteratedSubValue\", \"field\": ".to_string(), - serialize_inductive_field(&f), - ), - "}".to_string(), - ), - SubValueRelation::ArithmeticDescent { - param: p, - factor: fac, - .. - } => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"_variant\": \"ArithmeticDescent\", \"param\": ".to_string(), - json_quote(p.clone()), - ), - ", \"factor\": ".to_string(), - ), - serialize_shrink_factor(fac.clone()), - ), - "}".to_string(), - ), - SubValueRelation::PreservedValue => "{\"_variant\": \"PreservedValue\"}".to_string(), - SubValueRelation::SubValueUnknown => "{\"_variant\": \"SubValueUnknown\"}".to_string(), - } + SubValueRelation::StrictSubValue { field: f, factor: fac, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"_variant\": \"StrictSubValue\", \"field\": ".to_string(), serialize_inductive_field(&f)), ", \"factor\": ".to_string()), serialize_shrink_factor(fac.clone())), "}".to_string()), + SubValueRelation::IteratedSubValue { field: f, .. } => v2_rt::concat(v2_rt::concat("{\"_variant\": \"IteratedSubValue\", \"field\": ".to_string(), serialize_inductive_field(&f)), "}".to_string()), + SubValueRelation::ArithmeticDescent { param: p, factor: fac, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"_variant\": \"ArithmeticDescent\", \"param\": ".to_string(), json_quote(p.clone())), ", \"factor\": ".to_string()), serialize_shrink_factor(fac.clone())), "}".to_string()), + SubValueRelation::PreservedValue => "{\"_variant\": \"PreservedValue\"}".to_string(), + SubValueRelation::SubValueUnknown => "{\"_variant\": \"SubValueUnknown\"}".to_string(), +} } pub fn serialize_descent_evidence(de: Option>>>) -> String { match de { - Some(evidence) => json_list(Rc::new({ - let mut __result = Vec::new(); - for rel in evidence.clone().iter().cloned() { - __result.push(serialize_sub_value_relation(rel.clone())); - } - __result - })), - None => "null".to_string(), - } + Some(evidence) => json_list(Rc::new({ let mut __result = Vec::new(); for rel in evidence.clone().iter().cloned() { __result.push(serialize_sub_value_relation(rel.clone())); } __result })), + None => "null".to_string(), +} } -pub fn serialize_expr_data( - expr_node: &Rc, - source_indices: &Rc>>, -) -> String { +pub fn serialize_expr_data(expr_node: &Rc, source_indices: &Rc>>) -> String { { let ch = expr_node.children.clone(); - let name = authored_name_at(source_indices.clone(), &expr_node); - match (*expr_node.expr_data.clone()).clone() { - ExprData::NoExprData => "{\"kind\": \"NoExprData\"}".to_string(), - ExprData::ExprLiteral { value, .. } => v2_rt::concat( - v2_rt::concat( - "{\"kind\": \"ExprLiteral\", \"value\": ".to_string(), - serialize_literal(value.clone()), - ), - "}".to_string(), - ), - ExprData::ExprError { kind, message, .. } => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"kind\": \"ExprError\", \"error_kind\": ".to_string(), - json_quote(expr_error_kind_name(kind.clone())), - ), - ", \"message\": ".to_string(), - ), - json_quote(message.clone()), - ), - "}".to_string(), - ), - ExprData::ExprVar { binding_kind, .. } => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"kind\": \"ExprVar\", \"name\": ".to_string(), - json_quote(name), - ), - ", \"binding_kind\": ".to_string(), - ), - match binding_kind.clone() { - Some(inner) => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"kind\": ".to_string(), - json_quote(var_binding_kind_name(inner.clone())), - ), - match (*inner.clone()).clone() { - VarBindingKind::VariantValueBinding { parent_enum, .. } => { - v2_rt::concat( - ", \"parent_enum\": ".to_string(), - json_quote(parent_enum.clone()), - ) - } - _ => "".to_string(), - }, - ), - "}".to_string(), - ), - None => "null".to_string(), - }, - ), - "}".to_string(), - ), - ExprData::ExprFieldAccess { summary, .. } => { - let field = field_access_field_at(expr_node.clone(), source_indices.clone()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"kind\": \"ExprFieldAccess\", \"field\": ".to_string(), - json_quote(field), - ), - ", \"summary\": ".to_string(), - ), - match summary.clone() { - Some(inner) => serialize_field_summary(&inner), - None => "null".to_string(), - }, - ), - ", \"children\": ".to_string(), - ), - json_list(Rc::new({ - let mut __result = Vec::new(); - for c in ch.iter().cloned() { - __result.push(serialize_node(&c, &source_indices)); - } - __result - })), - ), - "}".to_string(), - ) - } - ExprData::ExprCall { - call_semantics, - descent_evidence: de, - .. - } => { - let func = expr_call_func_at(expr_node.clone(), source_indices.clone()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"kind\": \"ExprCall\", \"func\": ".to_string(), - json_quote(func), - ), - ", \"call_semantics\": ".to_string(), - ), - serialize_call_semantics(call_semantics.clone()), - ), - ", \"descent_evidence\": ".to_string(), - ), - serialize_descent_evidence(de.clone()), - ), - ", \"children\": ".to_string(), - ), - json_list(Rc::new({ - let mut __result = Vec::new(); - for c in ch.iter().cloned() { - __result.push(serialize_node(&c, &source_indices)); - } - __result - })), - ), - "}".to_string(), - ) - } - ExprData::ExprMethodCall { - method_semantics, .. - } => { - let method = expr_method_name_at(expr_node.clone(), source_indices.clone()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"kind\": \"ExprMethodCall\", \"method\": ".to_string(), - json_quote(method), - ), - ", \"method_semantics\": ".to_string(), - ), - serialize_method_semantics( - method_semantics.clone(), - &source_indices, - ), - ), - ", \"children\": ".to_string(), - ), - json_list(Rc::new({ - let mut __result = Vec::new(); - for c in ch.iter().cloned() { - __result.push(serialize_node(&c, &source_indices)); - } - __result - })), - ), - "}".to_string(), - ) - } - ExprData::ExprBinOp { - op, - algebra_field: af, - .. - } => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"kind\": \"ExprBinOp\", \"op\": ".to_string(), - json_quote(bin_op_name(op.clone())), - ), - ", \"algebra_field\": ".to_string(), - ), - match af.clone() { - Some(f) => json_quote(algebra_field_kind_name(f.clone())), - None => "null".to_string(), - }, - ), - ", \"children\": ".to_string(), - ), - json_list(Rc::new({ - let mut __result = Vec::new(); - for c in ch.iter().cloned() { - __result.push(serialize_node(&c, &source_indices)); - } - __result - })), - ), - "}".to_string(), - ), - ExprData::ExprUnaryOp { op, .. } => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"kind\": \"ExprUnaryOp\", \"op\": ".to_string(), - json_quote(unary_op_name(op.clone())), - ), - ", \"children\": ".to_string(), - ), - json_list(Rc::new({ - let mut __result = Vec::new(); - for c in ch.iter().cloned() { - __result.push(serialize_node(&c, &source_indices)); - } - __result - })), - ), - "}".to_string(), - ), - ExprData::ExprLambda => { - let params = lambda_param_names_at(expr_node.clone(), source_indices.clone()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"kind\": \"ExprLambda\", \"params\": ".to_string(), - json_list(Rc::new({ - let mut __result = Vec::new(); - for p in params.iter().cloned() { - __result.push(json_quote(p.clone())); - } - __result - })), - ), - ", \"children\": ".to_string(), - ), - json_list(Rc::new({ - let mut __result = Vec::new(); - for c in ch.iter().cloned() { - __result.push(serialize_node(&c, &source_indices)); - } - __result - })), - ), - "}".to_string(), - ) - } - ExprData::ExprLet => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"kind\": \"ExprLet\", \"name\": ".to_string(), - json_quote(name), - ), - ", \"children\": ".to_string(), - ), - json_list(Rc::new({ - let mut __result = Vec::new(); - for c in ch.iter().cloned() { - __result.push(serialize_node(&c, &source_indices)); - } - __result - })), - ), - "}".to_string(), - ), - ExprData::ExprRecordLit { parent_enum, .. } => { - let type_name = record_lit_type_name_at(expr_node.clone(), source_indices.clone()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"kind\": \"ExprRecordLit\", \"type_name\": ".to_string(), - json_optional_string(type_name), - ), - ", \"parent_enum\": ".to_string(), - ), - json_optional_string(parent_enum.clone()), - ), - ", \"children\": ".to_string(), - ), - json_list(Rc::new({ - let mut __result = Vec::new(); - for c in ch.iter().cloned() { - __result.push(serialize_node(&c, &source_indices)); - } - __result - })), - ), - "}".to_string(), - ) - } - ExprData::ExprForEach => { - let variable = foreach_variable_at(expr_node.clone(), source_indices.clone()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"kind\": \"ExprForEach\", \"variable\": ".to_string(), - json_quote(variable), - ), - ", \"children\": ".to_string(), - ), - json_list(Rc::new({ - let mut __result = Vec::new(); - for c in ch.iter().cloned() { - __result.push(serialize_node(&c, &source_indices)); - } - __result - })), - ), - "}".to_string(), - ) - } - ExprData::ExprMatch => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"kind\": \"ExprMatch\"".to_string(), - ", \"children\": ".to_string(), - ), - json_list(Rc::new({ - let mut __result = Vec::new(); - for c in ch.iter().cloned() { - __result.push(serialize_node(&c, &source_indices)); - } - __result - })), - ), - "}".to_string(), - ), - ExprData::ExprIf => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"kind\": \"ExprIf\"".to_string(), - ", \"children\": ".to_string(), - ), - json_list(Rc::new({ - let mut __result = Vec::new(); - for c in ch.iter().cloned() { - __result.push(serialize_node(&c, &source_indices)); - } - __result - })), - ), - "}".to_string(), - ), - ExprData::ExprListLit => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"kind\": \"ExprListLit\"".to_string(), - ", \"children\": ".to_string(), - ), - json_list(Rc::new({ - let mut __result = Vec::new(); - for c in ch.iter().cloned() { - __result.push(serialize_node(&c, &source_indices)); - } - __result - })), - ), - "}".to_string(), - ), - ExprData::ExprStringInterp => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"kind\": \"ExprStringInterp\"".to_string(), - ", \"children\": ".to_string(), - ), - json_list(Rc::new({ - let mut __result = Vec::new(); - for c in ch.iter().cloned() { - __result.push(serialize_node(&c, &source_indices)); - } - __result - })), - ), - "}".to_string(), - ), - ExprData::ExprBlock => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"kind\": \"ExprBlock\"".to_string(), - ", \"children\": ".to_string(), - ), - json_list(Rc::new({ - let mut __result = Vec::new(); - for c in ch.iter().cloned() { - __result.push(serialize_node(&c, &source_indices)); - } - __result - })), - ), - "}".to_string(), - ), - ExprData::ExprCast => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"kind\": \"ExprCast\"".to_string(), - ", \"children\": ".to_string(), - ), - json_list(Rc::new({ - let mut __result = Vec::new(); - for c in ch.iter().cloned() { - __result.push(serialize_node(&c, &source_indices)); - } - __result - })), - ), - "}".to_string(), - ), - ExprData::ExprIndex => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"kind\": \"ExprIndex\"".to_string(), - ", \"children\": ".to_string(), - ), - json_list(Rc::new({ - let mut __result = Vec::new(); - for c in ch.iter().cloned() { - __result.push(serialize_node(&c, &source_indices)); - } - __result - })), - ), - "}".to_string(), - ), - ExprData::ExprSlice => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"kind\": \"ExprSlice\"".to_string(), - ", \"children\": ".to_string(), - ), - json_list(Rc::new({ - let mut __result = Vec::new(); - for c in ch.iter().cloned() { - __result.push(serialize_node(&c, &source_indices)); - } - __result - })), - ), - "}".to_string(), - ), - ExprData::ExprReturn => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"kind\": \"ExprReturn\"".to_string(), - ", \"children\": ".to_string(), - ), - json_list(Rc::new({ - let mut __result = Vec::new(); - for c in ch.iter().cloned() { - __result.push(serialize_node(&c, &source_indices)); - } - __result - })), - ), - "}".to_string(), - ), - } - } +let name = authored_name_at(source_indices.clone(), &expr_node); +match (*expr_node.expr_data.clone()).clone() { + ExprData::NoExprData => "{\"kind\": \"NoExprData\"}".to_string(), + ExprData::ExprLiteral { value, .. } => v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprLiteral\", \"value\": ".to_string(), serialize_literal(value.clone())), "}".to_string()), + ExprData::ExprError { kind, message, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprError\", \"error_kind\": ".to_string(), json_quote(expr_error_kind_name(kind.clone()))), ", \"message\": ".to_string()), json_quote(message.clone())), "}".to_string()), + ExprData::ExprVar { binding_kind, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprVar\", \"name\": ".to_string(), json_quote(name)), ", \"binding_kind\": ".to_string()), match binding_kind.clone() { + Some(inner) => v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": ".to_string(), json_quote(var_binding_kind_name(inner.clone()))), match (*inner.clone()).clone() { + VarBindingKind::VariantValueBinding { parent_enum, .. } => v2_rt::concat(", \"parent_enum\": ".to_string(), json_quote(parent_enum.clone())), + _ => "".to_string(), +}), "}".to_string()), + None => "null".to_string(), +}), "}".to_string()), + ExprData::ExprFieldAccess { summary, .. } => { + let field = field_access_field_at(expr_node.clone(), source_indices.clone()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprFieldAccess\", \"field\": ".to_string(), json_quote(field)), ", \"summary\": ".to_string()), match summary.clone() { + Some(inner) => serialize_field_summary(&inner), + None => "null".to_string(), +}), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for c in ch.iter().cloned() { __result.push(serialize_node(&c, &source_indices)); } __result }))), "}".to_string()) +}, + ExprData::ExprCall { call_semantics, descent_evidence: de, .. } => { + let func = expr_call_func_at(expr_node.clone(), source_indices.clone()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprCall\", \"func\": ".to_string(), json_quote(func)), ", \"call_semantics\": ".to_string()), serialize_call_semantics(call_semantics.clone())), ", \"descent_evidence\": ".to_string()), serialize_descent_evidence(de.clone())), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for c in ch.iter().cloned() { __result.push(serialize_node(&c, &source_indices)); } __result }))), "}".to_string()) +}, + ExprData::ExprMethodCall { method_semantics, .. } => { + let method = expr_method_name_at(expr_node.clone(), source_indices.clone()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprMethodCall\", \"method\": ".to_string(), json_quote(method)), ", \"method_semantics\": ".to_string()), serialize_method_semantics(method_semantics.clone(), &source_indices)), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for c in ch.iter().cloned() { __result.push(serialize_node(&c, &source_indices)); } __result }))), "}".to_string()) +}, + ExprData::ExprBinOp { op, algebra_field: af, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprBinOp\", \"op\": ".to_string(), json_quote(bin_op_name(op.clone()))), ", \"algebra_field\": ".to_string()), match af.clone() { + Some(f) => json_quote(algebra_field_kind_name(f.clone())), + None => "null".to_string(), +}), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for c in ch.iter().cloned() { __result.push(serialize_node(&c, &source_indices)); } __result }))), "}".to_string()), + ExprData::ExprUnaryOp { op, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprUnaryOp\", \"op\": ".to_string(), json_quote(unary_op_name(op.clone()))), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for c in ch.iter().cloned() { __result.push(serialize_node(&c, &source_indices)); } __result }))), "}".to_string()), + ExprData::ExprLambda => { + let params = lambda_param_names_at(expr_node.clone(), source_indices.clone()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprLambda\", \"params\": ".to_string(), json_list(Rc::new({ let mut __result = Vec::new(); for p in params.iter().cloned() { __result.push(json_quote(p.clone())); } __result }))), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for c in ch.iter().cloned() { __result.push(serialize_node(&c, &source_indices)); } __result }))), "}".to_string()) +}, + ExprData::ExprLet => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprLet\", \"name\": ".to_string(), json_quote(name)), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for c in ch.iter().cloned() { __result.push(serialize_node(&c, &source_indices)); } __result }))), "}".to_string()), + ExprData::ExprRecordLit { parent_enum, .. } => { + let type_name = record_lit_type_name_at(expr_node.clone(), source_indices.clone()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprRecordLit\", \"type_name\": ".to_string(), json_optional_string(type_name)), ", \"parent_enum\": ".to_string()), json_optional_string(parent_enum.clone())), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for c in ch.iter().cloned() { __result.push(serialize_node(&c, &source_indices)); } __result }))), "}".to_string()) +}, + ExprData::ExprForEach => { + let variable = foreach_variable_at(expr_node.clone(), source_indices.clone()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprForEach\", \"variable\": ".to_string(), json_quote(variable)), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for c in ch.iter().cloned() { __result.push(serialize_node(&c, &source_indices)); } __result }))), "}".to_string()) +}, + ExprData::ExprMatch => v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprMatch\"".to_string(), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for c in ch.iter().cloned() { __result.push(serialize_node(&c, &source_indices)); } __result }))), "}".to_string()), + ExprData::ExprIf => v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprIf\"".to_string(), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for c in ch.iter().cloned() { __result.push(serialize_node(&c, &source_indices)); } __result }))), "}".to_string()), + ExprData::ExprListLit => v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprListLit\"".to_string(), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for c in ch.iter().cloned() { __result.push(serialize_node(&c, &source_indices)); } __result }))), "}".to_string()), + ExprData::ExprStringInterp => v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprStringInterp\"".to_string(), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for c in ch.iter().cloned() { __result.push(serialize_node(&c, &source_indices)); } __result }))), "}".to_string()), + ExprData::ExprBlock => v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprBlock\"".to_string(), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for c in ch.iter().cloned() { __result.push(serialize_node(&c, &source_indices)); } __result }))), "}".to_string()), + ExprData::ExprCast => v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprCast\"".to_string(), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for c in ch.iter().cloned() { __result.push(serialize_node(&c, &source_indices)); } __result }))), "}".to_string()), + ExprData::ExprIndex => v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprIndex\"".to_string(), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for c in ch.iter().cloned() { __result.push(serialize_node(&c, &source_indices)); } __result }))), "}".to_string()), + ExprData::ExprSlice => v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprSlice\"".to_string(), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for c in ch.iter().cloned() { __result.push(serialize_node(&c, &source_indices)); } __result }))), "}".to_string()), + ExprData::ExprReturn => v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprReturn\"".to_string(), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for c in ch.iter().cloned() { __result.push(serialize_node(&c, &source_indices)); } __result }))), "}".to_string()), +} +} +} + +pub fn serialize_inferred_node(inferred: Rc, source_indices: Rc>>) -> String { + match (*inferred).clone() { + InferredNode::Resolved { node, .. } => v2_rt::concat(v2_rt::concat("{\"kind\": \"Resolved\", \"node\": ".to_string(), serialize_node(&node, &source_indices)), "}".to_string()), + InferredNode::CompilerError { message, span, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"CompilerError\", \"message\": ".to_string(), json_quote(message.clone())), ", \"span\": ".to_string()), serialize_span(&span)), "}".to_string()), + InferredNode::TypeVariable { id, .. } => v2_rt::concat(v2_rt::concat("{\"kind\": \"TypeVariable\", \"id\": ".to_string(), json_quote(id.clone())), "}".to_string()), +} } -pub fn serialize_inferred_node( - inferred: Rc, - source_indices: Rc>>, -) -> String { - match (*inferred).clone() { - InferredNode::Resolved { node, .. } => v2_rt::concat( - v2_rt::concat( - "{\"kind\": \"Resolved\", \"node\": ".to_string(), - serialize_node(&node, &source_indices), - ), - "}".to_string(), - ), - InferredNode::CompilerError { message, span, .. } => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"kind\": \"CompilerError\", \"message\": ".to_string(), - json_quote(message.clone()), - ), - ", \"span\": ".to_string(), - ), - serialize_span(&span), - ), - "}".to_string(), - ), - InferredNode::TypeVariable { id, .. } => v2_rt::concat( - v2_rt::concat( - "{\"kind\": \"TypeVariable\", \"id\": ".to_string(), - json_quote(id.clone()), - ), - "}".to_string(), - ), - } +pub fn serialize_resource_use(resource_use: &Rc, source_indices: &Rc>>) -> String { + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"name\": ".to_string(), json_quote(resource_use_name_at(resource_use.clone(), source_indices.clone()))), ", \"resource\": ".to_string()), serialize_node(&resource_use_resource(&resource_use), &source_indices)), ", \"span\": ".to_string()), serialize_span(&resource_use.span.clone())), "}".to_string()) } -pub fn serialize_resource_use( - resource_use: &Rc, - source_indices: &Rc>>, -) -> String { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"name\": ".to_string(), - json_quote(resource_use_name_at( - resource_use.clone(), - source_indices.clone(), - )), - ), - ", \"resource\": ".to_string(), - ), - serialize_node(&resource_use_resource(&resource_use), &source_indices), - ), - ", \"span\": ".to_string(), - ), - serialize_span(&resource_use.span.clone()), - ), - "}".to_string(), - ) -} - -pub fn serialize_field( - field: &Rc, - source_indices: &Rc>>, -) -> String { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"name\": ".to_string(), - json_quote(field_node_name_at( - field.clone(), - source_indices.clone(), - )), - ), - ", \"type_expr\": ".to_string(), - ), - serialize_node( - &field_node_type_expr(&field), - &source_indices, - ), - ), - ", \"cardinality\": ".to_string(), - ), - json_quote(cardinality_name(field_node_cardinality( - field.clone(), - ))), - ), - ", \"default_value\": ".to_string(), - ), - json_optional_node( - field_node_default_value(&field), - source_indices.clone(), - ), - ), - ", \"from_key\": ".to_string(), - ), - json_optional_string(field_node_from_key( - field.clone(), - source_indices.clone(), - )), - ), - ", \"span\": ".to_string(), - ), - serialize_span(&field_node_span(field.clone())), - ), - "}".to_string(), - ) -} - -pub fn serialize_param( - param: &Rc, - source_indices: &Rc>>, -) -> String { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"name\": ".to_string(), - json_quote(param_node_name_at( - param.clone(), - source_indices.clone(), - )), - ), - ", \"type_expr\": ".to_string(), - ), - serialize_node(¶m_node_type_expr(¶m), &source_indices), - ), - ", \"default_value\": ".to_string(), - ), - json_optional_node(param_node_default_value(¶m), source_indices.clone()), - ), - ", \"span\": ".to_string(), - ), - serialize_span(¶m_node_span(param.clone())), - ), - "}".to_string(), - ) -} - -pub fn serialize_node( - node: &Rc, - source_indices: &Rc>>, -) -> String { +pub fn serialize_field(field: &Rc, source_indices: &Rc>>) -> String { + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"name\": ".to_string(), json_quote(field_node_name_at(field.clone(), source_indices.clone()))), ", \"type_expr\": ".to_string()), serialize_node(&field_node_type_expr(&field), &source_indices)), ", \"cardinality\": ".to_string()), json_quote(cardinality_name(field_node_cardinality(field.clone())))), ", \"default_value\": ".to_string()), json_optional_node(field_node_default_value(&field), source_indices.clone())), ", \"from_key\": ".to_string()), json_optional_string(field_node_from_key(field.clone(), source_indices.clone()))), ", \"span\": ".to_string()), serialize_span(&field_node_span(field.clone()))), "}".to_string()) +} + +pub fn serialize_param(param: &Rc, source_indices: &Rc>>) -> String { + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"name\": ".to_string(), json_quote(param_node_name_at(param.clone(), source_indices.clone()))), ", \"type_expr\": ".to_string()), serialize_node(¶m_node_type_expr(¶m), &source_indices)), ", \"default_value\": ".to_string()), json_optional_node(param_node_default_value(¶m), source_indices.clone())), ", \"span\": ".to_string()), serialize_span(¶m_node_span(param.clone()))), "}".to_string()) +} + +pub fn serialize_node(node: &Rc, source_indices: &Rc>>) -> String { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"name\": ".to_string(), json_quote(authored_name_at(source_indices.clone(), &node))), ", \"span\": ".to_string()), serialize_span(&node.span.clone())), ", \"ident_span\": ".to_string()), json_optional_span(node.ident_span.clone())), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for child in node.children.clone().iter().cloned() { __result.push(serialize_node(&child, &source_indices)); } __result }))), ", \"connective\": ".to_string()), match node.connective.clone() { Connective::Conj => json_quote(connective_name(Connective::Conj)), @@ -1566,546 +495,234 @@ pub fn serialize_node( }) } -pub fn serialize_module( - module: &Rc, - source_indices: &Rc>>, -) -> String { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"name\": ".to_string(), - json_quote(authored_name_at(source_indices.clone(), &module)), - ), - ", \"imports\": ".to_string(), - ), - json_list(Rc::new({ - let mut __result = Vec::new(); - for imp in module_imports(module.clone()).iter().cloned() { - __result.push(serialize_import_node(&imp, &source_indices)); - } - __result - })), - ), - ", \"span\": ".to_string(), - ), - serialize_span(&module.span.clone()), - ), - "}".to_string(), - ) +pub fn serialize_module(module: &Rc, source_indices: &Rc>>) -> String { + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"name\": ".to_string(), json_quote(authored_name_at(source_indices.clone(), &module))), ", \"imports\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for imp in module_imports(module.clone()).iter().cloned() { __result.push(serialize_import_node(&imp, &source_indices)); } __result }))), ", \"span\": ".to_string()), serialize_span(&module.span.clone())), "}".to_string()) } pub fn serialize_typed_module(module: &Rc) -> String { { let si = module.type_env.clone().source_indices.clone(); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"module\": ".to_string(), - serialize_module(&module.module.clone(), &si), - ), - ", \"items\": ".to_string(), - ), - json_list(Rc::new({ - let mut __result = Vec::new(); - for item in module.items.clone().iter().cloned() { - __result.push(serialize_node(&item, &si)); - } - __result - })), - ), - ", \"item_registry_keys\": ".to_string(), - ), - json_list(Rc::new({ - let mut __result = Vec::new(); - for k in Rc::new(v2_rt::map_keys(&module.item_registry.clone())) - .iter() - .cloned() - { - __result.push(json_quote(k.clone())); - } - __result - })), - ), - "}".to_string(), - ) - } +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"module\": ".to_string(), serialize_module(&module.module.clone(), &si)), ", \"items\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for item in module.items.clone().iter().cloned() { __result.push(serialize_node(&item, &si)); } __result }))), ", \"item_registry_keys\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for k in Rc::new(v2_rt::map_keys(&module.item_registry.clone())).iter().cloned() { __result.push(json_quote(k.clone())); } __result }))), "}".to_string()) +} } pub fn serialize_diagnostic(diagnostic: &Rc) -> String { { let severity = "error".to_string(); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\"severity\": ".to_string(), - json_quote(severity), - ), - ", \"message\": ".to_string(), - ), - json_quote(diagnostic_to_message( - diagnostic.diagnostic.clone(), - )), - ), - ", \"span\": ".to_string(), - ), - serialize_span(&diagnostic_to_span(diagnostic.diagnostic.clone())), - ), - ", \"module_name\": ".to_string(), - ), - json_optional_string(Some(diagnostic.module_name.clone())), - ), - ", \"category\": ".to_string(), - ), - "null".to_string(), - ), - "}".to_string(), - ) - } +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"severity\": ".to_string(), json_quote(severity)), ", \"message\": ".to_string()), json_quote(diagnostic_to_message(diagnostic.diagnostic.clone()))), ", \"span\": ".to_string()), serialize_span(&diagnostic_to_span(diagnostic.diagnostic.clone()))), ", \"module_name\": ".to_string()), json_optional_string(Some(diagnostic.module_name.clone()))), ", \"category\": ".to_string()), "null".to_string()), "}".to_string()) +} } pub fn emit_dag_artifact(typed: &Rc) -> Rc { { - let modules_json = Rc::new({ - let mut __result = Vec::new(); - for m in typed.modules.clone().iter().cloned() { - __result.push(serialize_typed_module(&m)); - } - __result - }) - .join(&", ".to_string()); - let diagnostics_json = Rc::new({ - let mut __result = Vec::new(); - for d in typed.diagnostics.clone().iter().cloned() { - __result.push(serialize_diagnostic(&d)); - } - __result - }) - .join(&", ".to_string()); - let item_registry_json = Rc::new({ - let mut __result = Vec::new(); - for k in Rc::new(v2_rt::map_keys(&typed.item_registry.clone())) - .iter() - .cloned() - { - __result.push(json_quote(k.clone())); - } - __result - }) - .join(&", ".to_string()); - let json = v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "{\n \"version\": \"0.1.0\",\n \"modules\": [".to_string(), - modules_json, - ), - "],\n \"item_registry_keys\": [".to_string(), - ), - item_registry_json, - ), - "],\n \"diagnostics\": [".to_string(), - ), - diagnostics_json, - ), - "],\n \"files\": []\n}".to_string(), - ); - Rc::new(EmitResult { - files: Rc::new(vec![Rc::new(TextFile { - path: "dag-artifact.json".to_string(), - content: json, - })]), - diagnostics: Rc::new(vec![]), - }) - } + let modules_json = Rc::new({ let mut __result = Vec::new(); for m in typed.modules.clone().iter().cloned() { __result.push(serialize_typed_module(&m)); } __result }).join(&", ".to_string()); +let diagnostics_json = Rc::new({ let mut __result = Vec::new(); for d in typed.diagnostics.clone().iter().cloned() { __result.push(serialize_diagnostic(&d)); } __result }).join(&", ".to_string()); +let item_registry_json = Rc::new({ let mut __result = Vec::new(); for k in Rc::new(v2_rt::map_keys(&typed.item_registry.clone())).iter().cloned() { __result.push(json_quote(k.clone())); } __result }).join(&", ".to_string()); +let json = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\n \"version\": \"0.1.0\",\n \"modules\": [".to_string(), modules_json), "],\n \"item_registry_keys\": [".to_string()), item_registry_json), "],\n \"diagnostics\": [".to_string()), diagnostics_json), "],\n \"files\": []\n}".to_string()); +Rc::new(EmitResult { + files: Rc::new(vec![Rc::new(TextFile { + path: "dag-artifact.json".to_string(), + content: json, +})]), + diagnostics: Rc::new(vec![]), +}) +} } pub fn boundary_ref_error(names: Rc>, ref_name: &String) -> Rc>> { - if { - let mut __found = false; - for n in names.iter().cloned() { - if (n.clone().as_str() == ref_name.clone().as_str()) { - __found = true; - break; - } - } - __found - } { + if { let mut __found = false; for n in names.iter().cloned() { if (n.clone().as_str() == ref_name.clone().as_str()) { __found = true; break; } } __found } { Rc::new(vec![]) } else { - Rc::new(vec![compile_bundle_error(v2_rt::concat( - v2_rt::concat( - "boundary references unknown artifact '".to_string(), - ref_name.clone(), - ), - "'".to_string(), - ))]) + Rc::new(vec![compile_bundle_error(v2_rt::concat(v2_rt::concat("boundary references unknown artifact '".to_string(), ref_name.clone()), "'".to_string()))]) } } pub fn validate_boundaries(plan: &Rc) -> Rc>> { { - let names = Rc::new({ - let mut __result = Vec::new(); - for a in plan.artifacts.clone().iter().cloned() { - __result.push(a.name.clone()); - } - __result - }); - Rc::new({ - let mut __result = Vec::new(); - for b in plan.boundaries.clone().iter().cloned() { - __result.extend( - (*v2_rt::concat( - boundary_ref_error(names.clone(), &b.from_artifact.clone()), - boundary_ref_error(names.clone(), &b.to_artifact.clone()), - )) - .iter() - .cloned(), - ); - } - __result - }) - } + let names = Rc::new({ let mut __result = Vec::new(); for a in plan.artifacts.clone().iter().cloned() { __result.push(a.name.clone()); } __result }); +Rc::new({ let mut __result = Vec::new(); for b in plan.boundaries.clone().iter().cloned() { __result.extend((*v2_rt::concat(boundary_ref_error(names.clone(), &b.from_artifact.clone()), boundary_ref_error(names.clone(), &b.to_artifact.clone()))).iter().cloned()); } __result }) +} } -pub fn emit_from_artifact_plan( - typed: Rc, - artifact_plan: &Rc, -) -> Rc { +pub fn emit_from_artifact_plan(typed: Rc, artifact_plan: &Rc) -> Rc { { if ((artifact_plan.artifacts.clone().len() as i64) == 0) { return Rc::new(EmitResult { - files: Rc::new(vec![]), - diagnostics: Rc::new(vec![compile_bundle_error( - "compile_sources planned no artifacts".to_string(), - )]), - }); + files: Rc::new(vec![]), + diagnostics: Rc::new(vec![compile_bundle_error("compile_sources planned no artifacts".to_string())]), +}) } - let boundary_diags = validate_boundaries(&artifact_plan); - if ((boundary_diags.clone().len() as i64) > 0) { +let boundary_diags = validate_boundaries(&artifact_plan); +if ((boundary_diags.clone().len() as i64) > 0) { return Rc::new(EmitResult { - files: Rc::new(vec![]), - diagnostics: boundary_diags.clone(), - }); + files: Rc::new(vec![]), + diagnostics: boundary_diags.clone(), +}) } - let results = Rc::new({ - let mut __result = Vec::new(); - for artifact in artifact_plan.artifacts.clone().iter().cloned() { - __result.push(emit_artifact(typed.clone(), artifact.clone())); - } - __result - }); - let all_files = Rc::new({ - let mut __result = Vec::new(); - for r in results.clone().iter().cloned() { - __result.extend((*r.files.clone()).iter().cloned()); - } - __result - }); - let all_diags = Rc::new({ - let mut __result = Vec::new(); - for r in results.clone().iter().cloned() { - __result.extend((*r.diagnostics.clone()).iter().cloned()); - } - __result - }); - Rc::new(EmitResult { - files: all_files, - diagnostics: all_diags, - }) - } +let results = Rc::new({ let mut __result = Vec::new(); for artifact in artifact_plan.artifacts.clone().iter().cloned() { __result.push(emit_artifact(typed.clone(), artifact.clone())); } __result }); +let all_files = Rc::new({ let mut __result = Vec::new(); for r in results.clone().iter().cloned() { __result.extend((*r.files.clone()).iter().cloned()); } __result }); +let all_diags = Rc::new({ let mut __result = Vec::new(); for r in results.clone().iter().cloned() { __result.extend((*r.diagnostics.clone()).iter().cloned()); } __result }); +Rc::new(EmitResult { + files: all_files, + diagnostics: all_diags, +}) +} } pub fn collect_diagnostics(parse_results: Rc>>) -> Rc>> { - parse_results.iter().cloned().fold( - Rc::new(vec![]), - |acc: Rc>>, pr: Rc| match pr.error.clone() { - Some(diag) => v2_rt::rc_list_push(acc.clone(), diag.clone()), - None => acc.clone(), - }, - ) + parse_results.iter().cloned().fold(Rc::new(vec![]), |acc: Rc>>, pr: Rc| match pr.error.clone() { + Some(diag) => v2_rt::rc_list_push(acc.clone(), diag.clone()), + None => acc.clone(), +}) } pub fn front_end_sources(sources: Rc>>) -> Rc { { - let acc = sources.iter().cloned().fold( - Rc::new(FrontendAccum { - parse_results: Rc::new(vec![]), - newline_indices: Rc::new(vec![]), - intern_table: empty_intern_table(), - }), - |acc: Rc, s: Rc| { - let acc = Rc::try_unwrap(acc).unwrap_or_else(|rc| (*rc).clone()); - { - let tokens = tokenize(&s.content.clone(), s.path.clone()); - let si = build_newline_index(s.path.clone(), &s.content.clone()); - let parsed = parse_with_table( - &tokens, - v2_rt::rc_map_insert( - v2_rt::rc_empty_map::>(), - si.file.clone(), - si.clone(), - ), - acc.intern_table, - ); - let pr = parsed.result.clone(); - Rc::new(FrontendAccum { - parse_results: v2_rt::rc_list_push(acc.parse_results, pr.clone()), - newline_indices: v2_rt::rc_list_push(acc.newline_indices, si.clone()), - intern_table: parsed.intern_table.clone(), - }) - } - }, - ); - let parse_results = acc.parse_results.clone(); - let newline_indices = acc.newline_indices.clone(); - let intern_table = acc.intern_table.clone(); - let parse_diagnostics = collect_diagnostics(parse_results.clone()); - let has_parse_errors = { - let mut __found = false; - for p in parse_results.clone().iter().cloned() { - if (p.error.clone() != None) { - __found = true; - break; - } - } - __found - }; - if has_parse_errors { + let acc = sources.iter().cloned().fold(Rc::new(FrontendAccum { + parse_results: Rc::new(vec![]), + newline_indices: Rc::new(vec![]), + intern_table: empty_intern_table(), +}), |acc: Rc, s: Rc| { let acc = Rc::try_unwrap(acc).unwrap_or_else(|rc| (*rc).clone()); { + let tokens = tokenize(&s.content.clone(), s.path.clone()); +let si = build_newline_index(s.path.clone(), &s.content.clone()); +let parsed = parse_with_table(&tokens, v2_rt::rc_map_insert(v2_rt::rc_empty_map::>(), si.file.clone(), si.clone()), acc.intern_table); +let pr = parsed.result.clone(); +Rc::new(FrontendAccum { + parse_results: v2_rt::rc_list_push(acc.parse_results, pr.clone()), + newline_indices: v2_rt::rc_list_push(acc.newline_indices, si.clone()), + intern_table: parsed.intern_table.clone(), +}) +} }); +let parse_results = acc.parse_results.clone(); +let newline_indices = acc.newline_indices.clone(); +let intern_table = acc.intern_table.clone(); +let parse_diagnostics = collect_diagnostics(parse_results.clone()); +let has_parse_errors = { let mut __found = false; for p in parse_results.clone().iter().cloned() { if (p.error.clone() != None) { __found = true; break; } } __found }; +if has_parse_errors { Rc::new(FrontendResult { - graph: None, - diagnostics: parse_diagnostics, - newline_indices: newline_indices.clone(), - intern_table: intern_table, - }) + graph: None, + diagnostics: parse_diagnostics, + newline_indices: newline_indices.clone(), + intern_table: intern_table, +}) } else { { - let modules = Rc::new({ - let mut __result = Vec::new(); - for p in parse_results.clone().iter().cloned() { - __result.push(p.module.clone().clone().unwrap()); - } - __result - }); - let source_indices = newline_indices.clone().iter().cloned().fold( - v2_rt::rc_empty_map::>(), - |acc: Rc>>, si: Rc| { - v2_rt::rc_map_insert(acc, si.file.clone(), si.clone()) - }, - ); - let graph = resolve_modules(&modules, &source_indices); - Rc::new(FrontendResult { - graph: Some(graph.clone()), - diagnostics: v2_rt::concat(parse_diagnostics, graph.diagnostics.clone()), - newline_indices: newline_indices.clone(), - intern_table: intern_table, - }) - } + let modules = Rc::new({ let mut __result = Vec::new(); for p in parse_results.clone().iter().cloned() { __result.push(p.module.clone().clone().unwrap()); } __result }); +let source_indices = newline_indices.clone().iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, si: Rc| v2_rt::rc_map_insert(acc, si.file.clone(), si.clone())); +let graph = resolve_modules(&modules, &source_indices); +Rc::new(FrontendResult { + graph: Some(graph.clone()), + diagnostics: v2_rt::concat(parse_diagnostics, graph.diagnostics.clone()), + newline_indices: newline_indices.clone(), + intern_table: intern_table, +}) +} } - } +} } pub fn resolve_sources(sources: Rc>>) -> Rc { { let frontend = front_end_sources(sources); - Rc::new(CompileResult { - files: Rc::new(vec![]), - diagnostics: frontend.diagnostics.clone(), - }) - } +Rc::new(CompileResult { + files: Rc::new(vec![]), + diagnostics: frontend.diagnostics.clone(), +}) +} } -pub fn compile_sources( - sources: Rc>>, - target: RenderTarget, -) -> Rc { +pub fn compile_sources(sources: Rc>>, target: RenderTarget) -> Rc { { let frontend = front_end_sources(sources); - let newline_indices = frontend.newline_indices.clone(); - match frontend.graph.clone() { - None => Rc::new(PipelineResult { - files: Rc::new(vec![]), - diagnostics: frontend.diagnostics.clone(), - complexity: empty_complexity_report(), - ownership: Rc::new(vec![]), - artifact_plan: empty_artifact_plan(), - newline_indices: newline_indices.clone(), - }), - Some(graph) => { - let graph_diags = graph.diagnostics.clone(); - let resolve_errors = Rc::new({ - let mut __result = Vec::new(); - for d in graph_diags.iter().cloned() { - if is_error_diagnostic(d.diagnostic.clone()) { - __result.push(d); - } - } - __result - }); - if ((resolve_errors.len() as i64) > 0) { - return Rc::new(PipelineResult { - files: Rc::new(vec![]), - diagnostics: frontend.diagnostics.clone(), - complexity: empty_complexity_report(), - ownership: Rc::new(vec![]), - artifact_plan: empty_artifact_plan(), - newline_indices: newline_indices.clone(), - }); - } - let source_indices = newline_indices.clone().iter().cloned().fold( - v2_rt::rc_empty_map::>(), - |acc: Rc>>, index: Rc| { - v2_rt::rc_map_insert(acc, index.file.clone(), index.clone()) - }, - ); - let norm = normalize_graph(&graph, source_indices.clone()); - let norm_diags = norm.diagnostics.clone(); - let norm_errors = Rc::new({ - let mut __result = Vec::new(); - for d in norm_diags.clone().iter().cloned() { - if is_error_diagnostic(d.diagnostic.clone()) { - __result.push(d); - } - } - __result - }); - if ((norm_errors.len() as i64) > 0) { - return Rc::new(PipelineResult { - files: Rc::new(vec![]), - diagnostics: v2_rt::concat( - frontend.diagnostics.clone(), - norm_diags.clone(), - ), - complexity: empty_complexity_report(), - ownership: Rc::new(vec![]), - artifact_plan: empty_artifact_plan(), - newline_indices: newline_indices.clone(), - }); - } - let typed = reconcile( - norm.graph.clone(), - source_indices.clone(), - frontend.intern_table.clone(), - ); - let typed_diags = typed.diagnostics.clone(); - let func_entries = extract_func_entries(typed.clone()); - let recursion_ctx = build_recursion_context(typed.clone()); - let complexity = - build_complexity_report(&func_entries, recursion_ctx, source_indices.clone()); - let complexity_diags = complexity_diagnostics(complexity.clone()); - let all_diags = v2_rt::concat(typed_diags.clone(), complexity_diags); - let type_errors = Rc::new({ - let mut __result = Vec::new(); - for d in typed_diags.clone().iter().cloned() { - if is_error_diagnostic(d.diagnostic.clone()) { - __result.push(d); - } - } - __result - }); - if ((type_errors.len() as i64) > 0) { - return Rc::new(PipelineResult { - files: Rc::new(vec![]), - diagnostics: v2_rt::concat( - v2_rt::concat(frontend.diagnostics.clone(), norm_diags.clone()), - all_diags.clone(), - ), - complexity: complexity.clone(), - ownership: Rc::new(vec![]), - artifact_plan: empty_artifact_plan(), - newline_indices: newline_indices.clone(), - }); - } - let ownership = extract_ownership_proofs(typed.clone()); - let ownership_diags = ownership_diagnostics(ownership.clone()); - let ownership_errors = Rc::new({ - let mut __result = Vec::new(); - for d in ownership_diags.clone().iter().cloned() { - if is_error_diagnostic(d.diagnostic.clone()) { - __result.push(d); - } - } - __result - }); - if ((ownership_errors.len() as i64) > 0) { - return Rc::new(PipelineResult { - files: Rc::new(vec![]), - diagnostics: v2_rt::concat( - v2_rt::concat( - v2_rt::concat(frontend.diagnostics.clone(), norm_diags.clone()), - all_diags.clone(), - ), - ownership_diags.clone(), - ), - complexity: complexity.clone(), - ownership: ownership.clone(), - artifact_plan: empty_artifact_plan(), - newline_indices: newline_indices.clone(), - }); - } - let artifact_plan = default_artifact_plan( - Rc::new({ - let mut __result = Vec::new(); - for m in typed.modules.clone().iter().cloned() { - __result - .push(authored_name_at(source_indices.clone(), &m.module.clone())); - } - __result - }), - target, - ); - let emit_result = emit_from_artifact_plan(typed.clone(), &artifact_plan); - let emit_files = emit_result.files.clone(); - let emit_diags = emit_result.diagnostics.clone(); - let emit_errors = Rc::new({ - let mut __result = Vec::new(); - for d in emit_diags.clone().iter().cloned() { - if is_error_diagnostic(d.diagnostic.clone()) { - __result.push(d); - } - } - __result - }); - let final_files = if ((emit_errors.len() as i64) > 0) { - Rc::new(vec![]) - } else { - emit_files - }; - Rc::new(PipelineResult { - files: final_files, - diagnostics: v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(frontend.diagnostics.clone(), norm_diags.clone()), - all_diags.clone(), - ), - ownership_diags.clone(), - ), - emit_diags.clone(), - ), - complexity: complexity.clone(), - ownership: ownership.clone(), - artifact_plan: artifact_plan.clone(), - newline_indices: newline_indices.clone(), - }) +let newline_indices = frontend.newline_indices.clone(); +match frontend.graph.clone() { + None => Rc::new(PipelineResult { + files: Rc::new(vec![]), + diagnostics: frontend.diagnostics.clone(), + complexity: empty_complexity_report(), + ownership: Rc::new(vec![]), + artifact_plan: empty_artifact_plan(), + newline_indices: newline_indices.clone(), +}), + Some(graph) => { + let graph_diags = graph.diagnostics.clone(); +let resolve_errors = Rc::new({ let mut __result = Vec::new(); for d in graph_diags.iter().cloned() { if is_error_diagnostic(d.diagnostic.clone()) { __result.push(d); } } __result }); +if ((resolve_errors.len() as i64) > 0) { + return Rc::new(PipelineResult { + files: Rc::new(vec![]), + diagnostics: frontend.diagnostics.clone(), + complexity: empty_complexity_report(), + ownership: Rc::new(vec![]), + artifact_plan: empty_artifact_plan(), + newline_indices: newline_indices.clone(), +}) } - } - } +let source_indices = newline_indices.clone().iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, index: Rc| v2_rt::rc_map_insert(acc, index.file.clone(), index.clone())); +let norm = normalize_graph(&graph, source_indices.clone()); +let norm_diags = norm.diagnostics.clone(); +let norm_errors = Rc::new({ let mut __result = Vec::new(); for d in norm_diags.clone().iter().cloned() { if is_error_diagnostic(d.diagnostic.clone()) { __result.push(d); } } __result }); +if ((norm_errors.len() as i64) > 0) { + return Rc::new(PipelineResult { + files: Rc::new(vec![]), + diagnostics: v2_rt::concat(frontend.diagnostics.clone(), norm_diags.clone()), + complexity: empty_complexity_report(), + ownership: Rc::new(vec![]), + artifact_plan: empty_artifact_plan(), + newline_indices: newline_indices.clone(), +}) + } +let typed = reconcile(norm.graph.clone(), source_indices.clone(), frontend.intern_table.clone()); +let typed_diags = typed.diagnostics.clone(); +let func_entries = extract_func_entries(typed.clone()); +let recursion_ctx = build_recursion_context(typed.clone()); +let complexity = build_complexity_report(&func_entries, recursion_ctx, source_indices.clone()); +let complexity_diags = complexity_diagnostics(complexity.clone()); +let all_diags = v2_rt::concat(typed_diags.clone(), complexity_diags); +let type_errors = Rc::new({ let mut __result = Vec::new(); for d in typed_diags.clone().iter().cloned() { if is_error_diagnostic(d.diagnostic.clone()) { __result.push(d); } } __result }); +if ((type_errors.len() as i64) > 0) { + return Rc::new(PipelineResult { + files: Rc::new(vec![]), + diagnostics: v2_rt::concat(v2_rt::concat(frontend.diagnostics.clone(), norm_diags.clone()), all_diags.clone()), + complexity: complexity.clone(), + ownership: Rc::new(vec![]), + artifact_plan: empty_artifact_plan(), + newline_indices: newline_indices.clone(), +}) + } +let ownership = extract_ownership_proofs(typed.clone()); +let ownership_diags = ownership_diagnostics(ownership.clone()); +let ownership_errors = Rc::new({ let mut __result = Vec::new(); for d in ownership_diags.clone().iter().cloned() { if is_error_diagnostic(d.diagnostic.clone()) { __result.push(d); } } __result }); +if ((ownership_errors.len() as i64) > 0) { + return Rc::new(PipelineResult { + files: Rc::new(vec![]), + diagnostics: v2_rt::concat(v2_rt::concat(v2_rt::concat(frontend.diagnostics.clone(), norm_diags.clone()), all_diags.clone()), ownership_diags.clone()), + complexity: complexity.clone(), + ownership: ownership.clone(), + artifact_plan: empty_artifact_plan(), + newline_indices: newline_indices.clone(), +}) + } +let artifact_plan = default_artifact_plan(Rc::new({ let mut __result = Vec::new(); for m in typed.modules.clone().iter().cloned() { __result.push(authored_name_at(source_indices.clone(), &m.module.clone())); } __result }), target); +let emit_result = emit_from_artifact_plan(typed.clone(), &artifact_plan); +let emit_files = emit_result.files.clone(); +let emit_diags = emit_result.diagnostics.clone(); +let emit_errors = Rc::new({ let mut __result = Vec::new(); for d in emit_diags.clone().iter().cloned() { if is_error_diagnostic(d.diagnostic.clone()) { __result.push(d); } } __result }); +let final_files = if ((emit_errors.len() as i64) > 0) { + Rc::new(vec![]) + } else { + emit_files + }; +Rc::new(PipelineResult { + files: final_files, + diagnostics: v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(frontend.diagnostics.clone(), norm_diags.clone()), all_diags.clone()), ownership_diags.clone()), emit_diags.clone()), + complexity: complexity.clone(), + ownership: ownership.clone(), + artifact_plan: artifact_plan.clone(), + newline_indices: newline_indices.clone(), +}) +}, +} +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -2121,143 +738,83 @@ pub struct ResolvedPipelineResult { pub fn compile_to_resolved(sources: Rc>>) -> Rc { { let frontend = front_end_sources(sources); - let newline_indices = frontend.newline_indices.clone(); - match frontend.graph.clone() { - None => Rc::new(ResolvedPipelineResult { - graph: None, - diagnostics: frontend.diagnostics.clone(), - source_indices: v2_rt::rc_empty_map::>(), - complexity: empty_complexity_report(), - ownership: Rc::new(vec![]), - newline_indices: newline_indices.clone(), - }), - Some(graph) => { - let graph_diags = graph.diagnostics.clone(); - let resolve_errors = Rc::new({ - let mut __result = Vec::new(); - for d in graph_diags.iter().cloned() { - if is_error_diagnostic(d.diagnostic.clone()) { - __result.push(d); - } - } - __result - }); - if ((resolve_errors.len() as i64) > 0) { - return Rc::new(ResolvedPipelineResult { - graph: None, - diagnostics: frontend.diagnostics.clone(), - source_indices: v2_rt::rc_empty_map::>(), - complexity: empty_complexity_report(), - ownership: Rc::new(vec![]), - newline_indices: newline_indices.clone(), - }); - } - let source_indices = newline_indices.clone().iter().cloned().fold( - v2_rt::rc_empty_map::>(), - |acc: Rc>>, index: Rc| { - v2_rt::rc_map_insert(acc, index.file.clone(), index.clone()) - }, - ); - let norm = normalize_graph(&graph, source_indices.clone()); - let norm_diags = norm.diagnostics.clone(); - let norm_errors = Rc::new({ - let mut __result = Vec::new(); - for d in norm_diags.clone().iter().cloned() { - if is_error_diagnostic(d.diagnostic.clone()) { - __result.push(d); - } - } - __result - }); - if ((norm_errors.len() as i64) > 0) { - return Rc::new(ResolvedPipelineResult { - graph: None, - diagnostics: v2_rt::concat( - frontend.diagnostics.clone(), - norm_diags.clone(), - ), - source_indices: source_indices.clone(), - complexity: empty_complexity_report(), - ownership: Rc::new(vec![]), - newline_indices: newline_indices.clone(), - }); - } - let typed = reconcile( - norm.graph.clone(), - source_indices.clone(), - frontend.intern_table.clone(), - ); - let typed_diags = typed.diagnostics.clone(); - let func_entries = extract_func_entries(typed.clone()); - let recursion_ctx = build_recursion_context(typed.clone()); - let complexity = - build_complexity_report(&func_entries, recursion_ctx, source_indices.clone()); - let complexity_diags = complexity_diagnostics(complexity.clone()); - let all_diags = v2_rt::concat(typed_diags.clone(), complexity_diags); - let type_errors = Rc::new({ - let mut __result = Vec::new(); - for d in typed_diags.clone().iter().cloned() { - if is_error_diagnostic(d.diagnostic.clone()) { - __result.push(d); - } - } - __result - }); - if ((type_errors.len() as i64) > 0) { - return Rc::new(ResolvedPipelineResult { - graph: None, - diagnostics: v2_rt::concat( - v2_rt::concat(frontend.diagnostics.clone(), norm_diags.clone()), - all_diags.clone(), - ), - source_indices: source_indices.clone(), - complexity: complexity.clone(), - ownership: Rc::new(vec![]), - newline_indices: newline_indices.clone(), - }); - } - let ownership = extract_ownership_proofs(typed.clone()); - let ownership_diags = ownership_diagnostics(ownership.clone()); - let ownership_errors = Rc::new({ - let mut __result = Vec::new(); - for d in ownership_diags.clone().iter().cloned() { - if is_error_diagnostic(d.diagnostic.clone()) { - __result.push(d); - } - } - __result - }); - if ((ownership_errors.len() as i64) > 0) { - return Rc::new(ResolvedPipelineResult { - graph: None, - diagnostics: v2_rt::concat( - v2_rt::concat( - v2_rt::concat(frontend.diagnostics.clone(), norm_diags.clone()), - all_diags.clone(), - ), - ownership_diags.clone(), - ), - source_indices: source_indices.clone(), - complexity: complexity.clone(), - ownership: ownership.clone(), - newline_indices: newline_indices.clone(), - }); - } - Rc::new(ResolvedPipelineResult { - graph: Some(typed.clone()), - diagnostics: v2_rt::concat( - v2_rt::concat( - v2_rt::concat(frontend.diagnostics.clone(), norm_diags.clone()), - all_diags.clone(), - ), - ownership_diags.clone(), - ), - source_indices: source_indices.clone(), - complexity: complexity.clone(), - ownership: ownership.clone(), - newline_indices: newline_indices.clone(), - }) +let newline_indices = frontend.newline_indices.clone(); +match frontend.graph.clone() { + None => Rc::new(ResolvedPipelineResult { + graph: None, + diagnostics: frontend.diagnostics.clone(), + source_indices: v2_rt::rc_empty_map::>(), + complexity: empty_complexity_report(), + ownership: Rc::new(vec![]), + newline_indices: newline_indices.clone(), +}), + Some(graph) => { + let graph_diags = graph.diagnostics.clone(); +let resolve_errors = Rc::new({ let mut __result = Vec::new(); for d in graph_diags.iter().cloned() { if is_error_diagnostic(d.diagnostic.clone()) { __result.push(d); } } __result }); +if ((resolve_errors.len() as i64) > 0) { + return Rc::new(ResolvedPipelineResult { + graph: None, + diagnostics: frontend.diagnostics.clone(), + source_indices: v2_rt::rc_empty_map::>(), + complexity: empty_complexity_report(), + ownership: Rc::new(vec![]), + newline_indices: newline_indices.clone(), +}) } - } - } +let source_indices = newline_indices.clone().iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, index: Rc| v2_rt::rc_map_insert(acc, index.file.clone(), index.clone())); +let norm = normalize_graph(&graph, source_indices.clone()); +let norm_diags = norm.diagnostics.clone(); +let norm_errors = Rc::new({ let mut __result = Vec::new(); for d in norm_diags.clone().iter().cloned() { if is_error_diagnostic(d.diagnostic.clone()) { __result.push(d); } } __result }); +if ((norm_errors.len() as i64) > 0) { + return Rc::new(ResolvedPipelineResult { + graph: None, + diagnostics: v2_rt::concat(frontend.diagnostics.clone(), norm_diags.clone()), + source_indices: source_indices.clone(), + complexity: empty_complexity_report(), + ownership: Rc::new(vec![]), + newline_indices: newline_indices.clone(), +}) + } +let typed = reconcile(norm.graph.clone(), source_indices.clone(), frontend.intern_table.clone()); +let typed_diags = typed.diagnostics.clone(); +let func_entries = extract_func_entries(typed.clone()); +let recursion_ctx = build_recursion_context(typed.clone()); +let complexity = build_complexity_report(&func_entries, recursion_ctx, source_indices.clone()); +let complexity_diags = complexity_diagnostics(complexity.clone()); +let all_diags = v2_rt::concat(typed_diags.clone(), complexity_diags); +let type_errors = Rc::new({ let mut __result = Vec::new(); for d in typed_diags.clone().iter().cloned() { if is_error_diagnostic(d.diagnostic.clone()) { __result.push(d); } } __result }); +if ((type_errors.len() as i64) > 0) { + return Rc::new(ResolvedPipelineResult { + graph: None, + diagnostics: v2_rt::concat(v2_rt::concat(frontend.diagnostics.clone(), norm_diags.clone()), all_diags.clone()), + source_indices: source_indices.clone(), + complexity: complexity.clone(), + ownership: Rc::new(vec![]), + newline_indices: newline_indices.clone(), +}) + } +let ownership = extract_ownership_proofs(typed.clone()); +let ownership_diags = ownership_diagnostics(ownership.clone()); +let ownership_errors = Rc::new({ let mut __result = Vec::new(); for d in ownership_diags.clone().iter().cloned() { if is_error_diagnostic(d.diagnostic.clone()) { __result.push(d); } } __result }); +if ((ownership_errors.len() as i64) > 0) { + return Rc::new(ResolvedPipelineResult { + graph: None, + diagnostics: v2_rt::concat(v2_rt::concat(v2_rt::concat(frontend.diagnostics.clone(), norm_diags.clone()), all_diags.clone()), ownership_diags.clone()), + source_indices: source_indices.clone(), + complexity: complexity.clone(), + ownership: ownership.clone(), + newline_indices: newline_indices.clone(), +}) + } +Rc::new(ResolvedPipelineResult { + graph: Some(typed.clone()), + diagnostics: v2_rt::concat(v2_rt::concat(v2_rt::concat(frontend.diagnostics.clone(), norm_diags.clone()), all_diags.clone()), ownership_diags.clone()), + source_indices: source_indices.clone(), + complexity: complexity.clone(), + ownership: ownership.clone(), + newline_indices: newline_indices.clone(), +}) +}, +} +} } diff --git a/src/v2/stage0/src/v2_compiler_compiler_tests_rust.rs b/src/v2/stage0/src/v2_compiler_compiler_tests_rust.rs index 1f2d41a19e1..664d4b467fa 100644 --- a/src/v2/stage0/src/v2_compiler_compiler_tests_rust.rs +++ b/src/v2/stage0/src/v2_compiler_compiler_tests_rust.rs @@ -1,31 +1,18 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.compiler_tests_rust -pub use crate::v2_compiler_artifact::RenderTarget; -use crate::v2_compiler_artifact::RenderTarget::{Go, Python, Rust}; -use crate::v2_compiler_coercion::CoercionAssertion::{ - CheckpointAssertion, ContainerAssertion, CopyAssertion, TemplateAssertion, -}; -pub use crate::v2_compiler_coercion::{ - extract_coercion_tests, CoercionAssertion, CoercionTestEntry, -}; -use crate::v2_rt; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::v2_compiler_artifact::{RenderTarget}; +use crate::v2_compiler_artifact::RenderTarget::{Rust, Python, Go}; +pub use crate::v2_compiler_coercion::{extract_coercion_tests, CoercionTestEntry, CoercionAssertion}; +use crate::v2_compiler_coercion::CoercionAssertion::{CheckpointAssertion, ContainerAssertion, CopyAssertion, TemplateAssertion}; pub fn ct_module_header() -> String { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "#[cfg(test)]\n".to_string(), - "mod compiler_tests {\n".to_string(), - ), - " use std::collections::HashMap;\n".to_string(), - ), - " use crate::v2_compiler_tokenize::tokenize;\n\n".to_string(), - ) + v2_rt::concat(v2_rt::concat(v2_rt::concat("#[cfg(test)]\n".to_string(), "mod compiler_tests {\n".to_string()), " use std::collections::HashMap;\n".to_string()), " use crate::v2_compiler_tokenize::tokenize;\n\n".to_string()) } pub fn ct_workspace_helpers() -> String { @@ -87,189 +74,67 @@ pub fn ct_type_size_test() -> String { pub fn ct_coercion_tests() -> String { { let entries = extract_coercion_tests(); - let test_fns = Rc::new({ - let mut __result = Vec::new(); - for e in entries.iter().cloned() { - __result.push(render_coercion_test_rust(&e)); - } - __result - }); - v2_rt::concat(v2_rt::concat(v2_rt::concat(" // =========================================================================\n".to_string(), " // Coercion registry tests (auto-generated from data declarations)\n".to_string()), " // =========================================================================\n\n".to_string()), test_fns.join(&"\n".to_string())) - } +let test_fns = Rc::new({ let mut __result = Vec::new(); for e in entries.iter().cloned() { __result.push(render_coercion_test_rust(&e)); } __result }); +v2_rt::concat(v2_rt::concat(v2_rt::concat(" // =========================================================================\n".to_string(), " // Coercion registry tests (auto-generated from data declarations)\n".to_string()), " // =========================================================================\n\n".to_string()), test_fns.join(&"\n".to_string())) +} } pub fn render_target_rust_enum(target: RenderTarget) -> String { match target { - RenderTarget::Rust => "RenderTarget::Rust".to_string(), - RenderTarget::Python => "RenderTarget::Python".to_string(), - RenderTarget::Go => "RenderTarget::Go".to_string(), - RenderTarget::Dag => "RenderTarget::Dag".to_string(), - } + RenderTarget::Rust => "RenderTarget::Rust".to_string(), + RenderTarget::Python => "RenderTarget::Python".to_string(), + RenderTarget::Go => "RenderTarget::Go".to_string(), + RenderTarget::Dag => "RenderTarget::Dag".to_string(), +} } pub fn render_coercion_test_rust(entry: &Rc) -> String { { - let assertions = Rc::new({ - let mut __result = Vec::new(); - for a in entry.assertions.clone().iter().cloned() { - __result.push(render_coercion_assertion_rust(a.clone())); - } - __result - }); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(" #[test]\n".to_string(), " fn ".to_string()), - entry.test_name.clone(), - ), - "() {\n".to_string(), - ), - " use crate::v2_compiler_coercion::*;\n".to_string(), - ), - assertions.join(&"".to_string()), - ), - " }\n\n".to_string(), - ) - } + let assertions = Rc::new({ let mut __result = Vec::new(); for a in entry.assertions.clone().iter().cloned() { __result.push(render_coercion_assertion_rust(a.clone())); } __result }); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" #[test]\n".to_string(), " fn ".to_string()), entry.test_name.clone()), "() {\n".to_string()), " use crate::v2_compiler_coercion::*;\n".to_string()), assertions.join(&"".to_string())), " }\n\n".to_string()) +} } pub fn first_or_empty(items: Rc>) -> String { match items.first().cloned() { - Some(v) => v.clone(), - None => "".to_string(), - } + Some(v) => v.clone(), + None => "".to_string(), +} } pub fn second_or_empty(items: Rc>) -> String { match items.get(1 as usize).cloned() { - Some(v) => v.clone(), - None => "".to_string(), - } + Some(v) => v.clone(), + None => "".to_string(), +} } pub fn render_coercion_assertion_rust(a: Rc) -> String { match (*a).clone() { - CoercionAssertion::CheckpointAssertion { - target: t, - dag_name: name, - expected_type: expected, - .. - } => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - " assert_eq!(coerce_primitive_type(".to_string(), - render_target_rust_enum(t.clone()), - ), - ", \"".to_string(), - ), - name.clone(), - ), - "\".into()), \"".to_string(), - ), - expected.clone(), - ), - "\");\n".to_string(), - ), - CoercionAssertion::ContainerAssertion { - target: t, - container_name: name, - expected_template: expected, - .. - } => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - " assert_eq!(coerce_container_template(".to_string(), - render_target_rust_enum(t.clone()), - ), - ", \"".to_string(), - ), - name.clone(), - ), - "\".into()), Some(\"".to_string(), - ), - expected.clone(), - ), - "\".to_string()));\n".to_string(), - ), - CoercionAssertion::CopyAssertion { - target: t, - dag_name: name, - expected_copy: expected, - .. - } => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - " assert_eq!(is_copy(".to_string(), - render_target_rust_enum(t.clone()), - ), - ", \"".to_string(), - ), - name.clone(), - ), - "\".into()), Some(".to_string(), - ), - if expected.clone() { - "true".to_string() - } else { - "false".to_string() - }, - ), - "));\n".to_string(), - ), - CoercionAssertion::TemplateAssertion { - template: tmpl, - args: arg_list, - expected, - .. - } => { - if ((arg_list.clone().len() as i64) == 1) { - { - let arg0 = first_or_empty(arg_list.clone()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - " assert_eq!(apply_inhabitant_template1(\"" - .to_string(), - tmpl.clone(), - ), - "\".into(), \"".to_string(), - ), - arg0, - ), - "\".into()), \"".to_string(), - ), - expected.clone(), - ), - "\");\n".to_string(), - ) - } - } else { - if ((arg_list.clone().len() as i64) == 2) { - { - let arg0 = first_or_empty(arg_list.clone()); - let arg1 = second_or_empty(arg_list.clone()); - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" assert_eq!(apply_inhabitant_template2(\"".to_string(), tmpl.clone()), "\".into(), \"".to_string()), arg0), "\".into(), \"".to_string()), arg1), "\".into()), \"".to_string()), expected.clone()), "\");\n".to_string()) - } - } else { - "".to_string() - } - } + CoercionAssertion::CheckpointAssertion { target: t, dag_name: name, expected_type: expected, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" assert_eq!(coerce_primitive_type(".to_string(), render_target_rust_enum(t.clone())), ", \"".to_string()), name.clone()), "\".into()), \"".to_string()), expected.clone()), "\");\n".to_string()), + CoercionAssertion::ContainerAssertion { target: t, container_name: name, expected_template: expected, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" assert_eq!(coerce_container_template(".to_string(), render_target_rust_enum(t.clone())), ", \"".to_string()), name.clone()), "\".into()), Some(\"".to_string()), expected.clone()), "\".to_string()));\n".to_string()), + CoercionAssertion::CopyAssertion { target: t, dag_name: name, expected_copy: expected, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" assert_eq!(is_copy(".to_string(), render_target_rust_enum(t.clone())), ", \"".to_string()), name.clone()), "\".into()), Some(".to_string()), if expected.clone() { + "true".to_string() + } else { + "false".to_string() + }), "));\n".to_string()), + CoercionAssertion::TemplateAssertion { template: tmpl, args: arg_list, expected, .. } => if ((arg_list.clone().len() as i64) == 1) { + { + let arg0 = first_or_empty(arg_list.clone()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" assert_eq!(apply_inhabitant_template1(\"".to_string(), tmpl.clone()), "\".into(), \"".to_string()), arg0), "\".into()), \"".to_string()), expected.clone()), "\");\n".to_string()) +} + } else { + if ((arg_list.clone().len() as i64) == 2) { + { + let arg0 = first_or_empty(arg_list.clone()); +let arg1 = second_or_empty(arg_list.clone()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" assert_eq!(apply_inhabitant_template2(\"".to_string(), tmpl.clone()), "\".into(), \"".to_string()), arg0), "\".into(), \"".to_string()), arg1), "\".into()), \"".to_string()), expected.clone()), "\");\n".to_string()) +} + } else { + "".to_string() } - } + }, +} } pub fn ct_profile_helpers() -> String { diff --git a/src/v2/stage0/src/v2_compiler_complexity.rs b/src/v2/stage0/src/v2_compiler_complexity.rs index c1e41046c5d..725f0c52d46 100644 --- a/src/v2/stage0/src/v2_compiler_complexity.rs +++ b/src/v2/stage0/src/v2_compiler_complexity.rs @@ -1,93 +1,45 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.complexity -use self::Certainty::*; -use self::CostExpr::*; -use self::ParserResultSource::*; -use self::SizeExpr::*; -use crate::std_algebra::CollectionSizeEffect::{IdentityEffect, ProjectionEffect, ShrinkEffect}; -use crate::std_algebra::CostShape::{ - ShapeConstant, ShapeIterateBody, ShapeLinearScan, ShapeSortBody, -}; -pub use crate::std_algebra::{CollectionSizeEffect, CostShape}; -use crate::std_computation::CallPattern::{ - ArithmeticSubtractCall, ChildAccessorCall, CollectionShrinkCall, FoldBodyCall, - ParserAdvanceCall, SameArgumentCall, WorklistDrainCall, -}; -use crate::std_computation::IterationDimension::{ArithmeticRepeat, CollectionFold, TreeDescent}; -pub use crate::std_computation::{ - lower_call_pattern, size_bound_param, type_iteration_dimension, CallPattern, - IterationDimension, LoweringTarget, -}; -pub use crate::std_graph::{ - build_call_graph_from_proof_edges, dfs_collect_component, dfs_finish_order, - graph_has_multi_node_scc, is_lexicographic_descent, is_valid_proof, seed_adjacency_map, - CallGraph, DfsFinishAcc, SccComponentAcc, SccCycleAcc, -}; -use crate::std_induction::AtomicCost::PolyCost; -use crate::std_induction::CostBound::{AtomicBound, ConstantBound, ErrorBound, ForeverBound}; -use crate::std_induction::PolynomialExponent::*; -use crate::std_induction::ShrinkFactor::{ConstantShrink, ProportionalShrink, UnitShrink}; -use crate::std_induction::SubValueRelation::{ - ArithmeticDescent, IteratedSubValue, PreservedValue, StrictSubValue, SubValueUnknown, -}; -pub use crate::std_induction::{ - catamorphism_bound, derive_bound, sub_value_to_call_pattern, sub_value_to_evidence, - sub_value_to_lowering_target, AtomicCost, CostBound, PolynomialExponent, ShrinkFactor, - SubValueRelation, -}; -use crate::std_termination::DescentEvidence::{DescentUnknown, NonIncreasing, Strict}; -use crate::std_termination::DescentSource::{ - ArithmeticDivideDescent, ArithmeticSubtractDescent, ChildAccessor, FoldIteration, ListShrink, - ParserAdvance, SetRemoval, -}; -use crate::std_termination::PositiveDescentAmount::OneStep; -use crate::std_termination::RankingDimension::{ - ArithmeticValue, ListLength, SetCardinality, TokenPosition, TreeSize, -}; -pub use crate::std_termination::{ - evidence_rank, join_evidence, map_evidence_merge_at, merge_evidence, optional_evidence_meet, - DescentEvidence, DescentSource, PositiveDescentAmount, ProofEdge, RankingDimension, - TerminationProof, -}; -pub use crate::std_types::SourceSpan; -pub use crate::v2_compiler_emit::to_string; -pub use crate::v2_compiler_infer_types::{node_is_collection, resolved_type}; -use crate::v2_compiler_parse::ParserCallIdentity::{ParserCallFunction, ParserCallHelper}; -use crate::v2_compiler_parse::ParserResultWitness::{ - ParserWitnessAdvance, ParserWitnessCall, ParserWitnessEat, ParserWitnessExpect, - ParserWitnessOpaque, -}; -pub use crate::v2_compiler_parse::{ - parser_passthrough_state_expr, parser_progress_flag_var, parser_result_witness, - ParserCallIdentity, ParserResultWitness, -}; -use crate::v2_rt; -use crate::v2_std_core::BinOp::{Div, Sub}; -use crate::v2_std_core::ExprData::{ - ExprBinOp, ExprBlock, ExprCall, ExprError, ExprFieldAccess, ExprForEach, ExprIf, ExprLambda, - ExprLet, ExprLiteral, ExprMatch, ExprMethodCall, ExprRecordLit, ExprReturn, ExprUnaryOp, - ExprVar, -}; -use crate::v2_std_core::LiteralValue::{LitInt, LitNull}; -use crate::v2_std_core::MatchPattern::{Bind, VariantPattern}; -use crate::v2_std_core::MethodSemantics::{ - AlgebraMethodSemantics, PlainMethodSemantics, ServiceMethodSemantics, -}; -pub use crate::v2_std_core::{ - arg_name_at, arg_value, arm_body, arm_guard, arm_pattern, authored_name_at, binop_left, - binop_right, expr_call_func_at, expr_var_name_at, field_access_base, field_access_field_at, - field_binding_pattern, field_init_node_name_at, field_init_node_value, foreach_body, - foreach_collection, if_condition, if_else_branch, if_then_branch, is_child_accessor_in_model, - is_children_list_field, is_sub_value_field, is_tree_size_preserving, is_tree_size_reducing, - lambda_body, lambda_param_names_at, let_binding_name_at, let_body, let_value, match_arm_nodes, - match_scrutinee, method_arg_nodes, method_receiver, param_node_name_at, param_node_type_expr, - return_value, BinOp, ExprData, LiteralValue, MatchPattern, MethodSemantics, NewlineIndex, Node, -}; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::std_types::{SourceSpan}; +pub use crate::v2_compiler_emit::{to_string}; +pub use crate::v2_compiler_parse::{ParserResultWitness, parser_progress_flag_var, parser_passthrough_state_expr, parser_result_witness, ParserCallIdentity}; +use crate::v2_compiler_parse::ParserResultWitness::{ParserWitnessAdvance, ParserWitnessExpect, ParserWitnessEat, ParserWitnessCall, ParserWitnessOpaque}; +use crate::v2_compiler_parse::ParserCallIdentity::{ParserCallHelper, ParserCallFunction}; +pub use crate::std_termination::{DescentEvidence, RankingDimension, DescentSource, TerminationProof, ProofEdge, merge_evidence, join_evidence, evidence_rank, optional_evidence_meet, map_evidence_merge_at, PositiveDescentAmount}; +use crate::std_termination::DescentEvidence::{Strict, NonIncreasing, DescentUnknown}; +use crate::std_termination::RankingDimension::{TreeSize, ListLength, ArithmeticValue, TokenPosition, SetCardinality}; +use crate::std_termination::DescentSource::{ChildAccessor, ListShrink, ArithmeticSubtractDescent, ArithmeticDivideDescent, ParserAdvance, SetRemoval, FoldIteration}; +use crate::std_termination::PositiveDescentAmount::{OneStep}; +pub use crate::std_computation::{CallPattern, LoweringTarget, lower_call_pattern, size_bound_param, IterationDimension, type_iteration_dimension}; +use crate::std_computation::CallPattern::{ChildAccessorCall, CollectionShrinkCall, ArithmeticSubtractCall, ParserAdvanceCall, WorklistDrainCall, FoldBodyCall, SameArgumentCall}; +use crate::std_computation::IterationDimension::{TreeDescent, CollectionFold, ArithmeticRepeat}; +pub use crate::std_induction::{SubValueRelation, ShrinkFactor, CostBound, AtomicCost, PolynomialExponent, sub_value_to_evidence, sub_value_to_call_pattern, sub_value_to_lowering_target, catamorphism_bound, derive_bound}; +use crate::std_induction::SubValueRelation::{StrictSubValue, IteratedSubValue, ArithmeticDescent, PreservedValue, SubValueUnknown}; +use crate::std_induction::ShrinkFactor::{UnitShrink, ConstantShrink, ProportionalShrink}; +use crate::std_induction::CostBound::{ConstantBound, AtomicBound, ForeverBound, ErrorBound}; +use crate::std_induction::AtomicCost::{PolyCost}; +use crate::std_induction::PolynomialExponent::*; +pub use crate::v2_std_core::{Node, NewlineIndex, ExprData, BinOp, MatchPattern, field_init_node_name_at, field_init_node_value, arg_name_at, arg_value, arm_body, arm_guard, arm_pattern, MethodSemantics, binop_left, binop_right, field_binding_pattern, foreach_collection, foreach_body, if_condition, if_then_branch, if_else_branch, let_value, let_body, let_binding_name_at, match_scrutinee, match_arm_nodes, method_receiver, method_arg_nodes, param_node_name_at, param_node_type_expr, return_value, expr_call_func_at, expr_var_name_at, field_access_base, field_access_field_at, LiteralValue, is_child_accessor_in_model, lambda_param_names_at, lambda_body, is_children_list_field, is_sub_value_field, is_tree_size_preserving, is_tree_size_reducing, authored_name_at}; +use crate::v2_std_core::ExprData::{ExprLiteral, ExprError, ExprVar, ExprFieldAccess, ExprCall, ExprMethodCall, ExprBinOp, ExprUnaryOp, ExprMatch, ExprIf, ExprLet, ExprRecordLit, ExprBlock, ExprForEach, ExprReturn, ExprLambda}; +use crate::v2_std_core::BinOp::{Sub, Div}; +use crate::v2_std_core::MatchPattern::{Bind, VariantPattern}; +use crate::v2_std_core::MethodSemantics::{AlgebraMethodSemantics, PlainMethodSemantics, ServiceMethodSemantics}; +use crate::v2_std_core::LiteralValue::{LitNull, LitInt}; +pub use crate::v2_compiler_infer_types::{resolved_type, node_is_collection}; +pub use crate::std_algebra::{CollectionSizeEffect, CostShape}; +use crate::std_algebra::CollectionSizeEffect::{ShrinkEffect, ProjectionEffect, IdentityEffect}; +use crate::std_algebra::CostShape::{ShapeConstant, ShapeLinearScan, ShapeIterateBody, ShapeSortBody}; +pub use crate::std_graph::{CallGraph, DfsFinishAcc, SccComponentAcc, SccCycleAcc, seed_adjacency_map, build_call_graph_from_proof_edges, dfs_finish_order, dfs_collect_component, graph_has_multi_node_scc, is_lexicographic_descent, is_valid_proof}; +use self::SizeExpr::*; +use self::CostExpr::*; +use self::Certainty::*; +use self::ParserResultSource::*; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] @@ -168,38 +120,31 @@ pub struct CostInternTable { pub fn empty_intern_table() -> Rc { Rc::new(CostInternTable { - summaries: v2_rt::rc_empty_map::>(), - }) + summaries: v2_rt::rc_empty_map::>(), +}) } -pub fn cache_summary( - table: Rc, - func_name: String, - summary: Rc, -) -> Rc { +pub fn cache_summary(table: Rc, func_name: String, summary: Rc) -> Rc { Rc::new(CostInternTable { - summaries: v2_rt::rc_map_insert(table.summaries.clone(), func_name, summary), - }) + summaries: v2_rt::rc_map_insert(table.summaries.clone(), func_name, summary), +}) } -pub fn lookup_summary( - table: Rc, - func_name: String, -) -> Option> { +pub fn lookup_summary(table: Rc, func_name: String) -> Option> { v2_rt::map_get(&table.summaries.clone(), func_name) } pub fn evict_summary(table: Rc, func_name: String) -> Rc { - cache_summary( - table, - func_name, - Rc::new(ComplexitySummary { - work: Rc::new(CostExpr::CostConst { value: 0 }), - span: Rc::new(CostExpr::CostConst { value: 0 }), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Proven, - }), - ) + cache_summary(table, func_name, Rc::new(ComplexitySummary { + work: Rc::new(CostExpr::CostConst { + value: 0, +}), + span: Rc::new(CostExpr::CostConst { + value: 0, +}), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Proven, +})) } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -308,56 +253,39 @@ pub struct SccEdgeBlockAcc { pub fn is_algebra_iteration_method(method_semantics: Option>) -> bool { match method_semantics.as_deref().cloned() { - Some(MethodSemantics::AlgebraMethodSemantics { .. }) => true, - _ => false, - } + Some(MethodSemantics::AlgebraMethodSemantics { .. }) => true, + _ => false, +} } -pub fn method_size_effect( - method_semantics: Option>, -) -> Option { +pub fn method_size_effect(method_semantics: Option>) -> Option { match method_semantics.as_deref().cloned() { - Some(MethodSemantics::AlgebraMethodSemantics { - size_effect: se, .. - }) => se.clone(), - _ => None, - } + Some(MethodSemantics::AlgebraMethodSemantics { size_effect: se, .. }) => se.clone(), + _ => None, +} } -pub fn method_callback_element_position( - method_semantics: Option>, -) -> Option { +pub fn method_callback_element_position(method_semantics: Option>) -> Option { match method_semantics.as_deref().cloned() { - Some(MethodSemantics::AlgebraMethodSemantics { - algebra_template: at, - .. - }) => match at.clone() { - Some(template) => template.callback_element_position.clone(), - None => None, - }, - _ => None, - } + Some(MethodSemantics::AlgebraMethodSemantics { algebra_template: at, .. }) => match at.clone() { + Some(template) => template.callback_element_position.clone(), + None => None, +}, + _ => None, +} } -pub fn iteration_element_name( - method_semantics: Option>, - lambda: Rc, - si: Rc>>, -) -> Option { +pub fn iteration_element_name(method_semantics: Option>, lambda: Rc, si: Rc>>) -> Option { { let params = lambda_param_names_at(lambda, si); - match method_callback_element_position(method_semantics) { - Some(pos) => params.get(pos.clone() as usize).cloned(), - None => None, - } - } +match method_callback_element_position(method_semantics) { + Some(pos) => params.get(pos.clone() as usize).cloned(), + None => None, +} +} } -pub fn proof_has_non_descending_cycle( - proof: Rc, - members: Rc>, - edges: Rc>>, -) -> bool { +pub fn proof_has_non_descending_cycle(proof: Rc, members: Rc>, edges: Rc>>) -> bool { (is_valid_proof(proof, &edges) == false) } @@ -367,1163 +295,482 @@ pub fn set_has(m: Rc>, key: String) -> bool { pub fn strict_after_parser_witness(input: DescentEvidence) -> DescentEvidence { match input { - DescentEvidence::DescentUnknown => DescentEvidence::DescentUnknown, - _ => DescentEvidence::Strict, - } + DescentEvidence::DescentUnknown => DescentEvidence::DescentUnknown, + _ => DescentEvidence::Strict, +} } pub fn empty_parser_progress_env() -> Rc { Rc::new(ParserProgressEnv { - state_aliases: v2_rt::rc_empty_map::(), - result_sources: v2_rt::rc_empty_map::>(), - }) + state_aliases: v2_rt::rc_empty_map::(), + result_sources: v2_rt::rc_empty_map::>(), +}) } -pub fn parser_state_param( - params: Rc>>, - si: Rc>>, -) -> Option> { - Rc::new( - params - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - .fold(None, |acc: _, pair: (i64, Rc)| { - if (acc.clone() != None) { - acc.clone() - } else { - { - let idx = pair.0.clone(); - let param = pair.1.clone(); - if (authored_name_at(si.clone(), ¶m_node_type_expr(¶m)).as_str() - == "ParserState".to_string().as_str()) - { - Some(Rc::new(ParserStateParam { - name: param_node_name_at(param.clone(), si.clone()), - index: idx.clone(), - })) - } else { - None - } +pub fn parser_state_param(params: Rc>>, si: Rc>>) -> Option> { + Rc::new(params.iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned().fold(None, |acc: _, pair: (i64, Rc)| if (acc.clone() != None) { + acc.clone() + } else { + { + let idx = pair.0.clone(); +let param = pair.1.clone(); +if (authored_name_at(si.clone(), ¶m_node_type_expr(¶m)).as_str() == "ParserState".to_string().as_str()) { + Some(Rc::new(ParserStateParam { + name: param_node_name_at(param.clone(), si.clone()), + index: idx.clone(), +})) + } else { + None } - } +} }) } -pub fn parser_state_base_var( - expr: &Rc, - si: Rc>>, -) -> Option { +pub fn parser_state_base_var(expr: &Rc, si: Rc>>) -> Option { match (*expr.expr_data.clone()).clone() { - ExprData::ExprFieldAccess { .. } => match expr.children.clone().first().cloned() { - Some(base) => match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => Some(expr_var_name_at(base.clone(), si)), - _ => None, - }, - None => None, - }, - _ => None, - } + ExprData::ExprFieldAccess { .. } => match expr.children.clone().first().cloned() { + Some(base) => match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => Some(expr_var_name_at(base.clone(), si)), + _ => None, +}, + None => None, +}, + _ => None, +} } -pub fn parser_result_state_progress( - source: Rc, - parser_always_advancing: Rc>, - consumed_true_set: Rc>, - result_name: String, -) -> DescentEvidence { +pub fn parser_result_state_progress(source: Rc, parser_always_advancing: Rc>, consumed_true_set: Rc>, result_name: String) -> DescentEvidence { match (*source).clone() { - ParserResultSource::ParserResultAdvance { input, .. } => { - strict_after_parser_witness(input.clone()) - } - ParserResultSource::ParserResultExpect { input, .. } => { - strict_after_parser_witness(input.clone()) - } - ParserResultSource::ParserResultEat { input, .. } => { - if set_has(consumed_true_set, result_name) { - strict_after_parser_witness(input.clone()) + ParserResultSource::ParserResultAdvance { input, .. } => strict_after_parser_witness(input.clone()), + ParserResultSource::ParserResultExpect { input, .. } => strict_after_parser_witness(input.clone()), + ParserResultSource::ParserResultEat { input, .. } => if set_has(consumed_true_set, result_name) { + strict_after_parser_witness(input.clone()) + } else { + input.clone() + }, + ParserResultSource::ParserResultCall { input, callee, .. } => if (set_has(consumed_true_set, result_name) || set_has(parser_always_advancing, callee.clone())) { + strict_after_parser_witness(input.clone()) + } else { + input.clone() + }, + ParserResultSource::ParserResultDirectState { input: p, .. } => p.clone(), + ParserResultSource::ParserResultOpaque => DescentEvidence::DescentUnknown, +} +} + +pub fn parser_state_arg_expr(call_node: Rc, state_param: Rc, si: Rc>>) -> Option> { + Rc::new(call_node.children.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned().fold(None, |acc: _, pair: (i64, Rc)| if (acc.clone() != None) { + acc.clone() + } else { + { + let idx = pair.0.clone(); +let arg_node = pair.1.clone(); +let matches_state = if (arg_name_at(arg_node.clone(), si.clone()).as_deref() != Some("".to_string().as_str())) { + (arg_name_at(arg_node.clone(), si.clone()).as_deref() == Some(state_param.name.clone().as_str())) } else { - input.clone() - } - } - ParserResultSource::ParserResultCall { input, callee, .. } => { - if (set_has(consumed_true_set, result_name) - || set_has(parser_always_advancing, callee.clone())) - { - strict_after_parser_witness(input.clone()) + (idx.clone() == state_param.index.clone()) + }; +if matches_state.clone() { + Some(arg_value(&arg_node)) } else { - input.clone() + None } - } - ParserResultSource::ParserResultDirectState { input: p, .. } => p.clone(), - ParserResultSource::ParserResultOpaque => DescentEvidence::DescentUnknown, - } } - -pub fn parser_state_arg_expr( - call_node: Rc, - state_param: Rc, - si: Rc>>, -) -> Option> { - Rc::new( - call_node - .children - .clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - .fold(None, |acc: _, pair: (i64, Rc)| { - if (acc.clone() != None) { - acc.clone() - } else { - { - let idx = pair.0.clone(); - let arg_node = pair.1.clone(); - let matches_state = if (arg_name_at(arg_node.clone(), si.clone()).as_deref() - != Some("".to_string().as_str())) - { - (arg_name_at(arg_node.clone(), si.clone()).as_deref() - == Some(state_param.name.clone().as_str())) - } else { - (idx.clone() == state_param.index.clone()) - }; - if matches_state.clone() { - Some(arg_value(&arg_node)) - } else { - None - } - } - } }) } -pub fn parser_state_expr_progress( - expr: &Rc, - state_param: &Rc, - env: &Rc, - parser_always_advancing: &Rc>, - consumed_true_set: &Rc>, - si: &Rc>>, -) -> DescentEvidence { +pub fn parser_state_expr_progress(expr: &Rc, state_param: &Rc, env: &Rc, parser_always_advancing: &Rc>, consumed_true_set: &Rc>, si: &Rc>>) -> DescentEvidence { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*expr.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let name = expr_var_name_at(expr.clone(), si.clone()); - if (name.clone().as_str() == state_param.name.clone().as_str()) { - DescentEvidence::NonIncreasing - } else { - match v2_rt::map_get(&env.state_aliases.clone(), name.clone()) { - Some(progress) => progress.clone(), - None => DescentEvidence::DescentUnknown, - } - } - } - ExprData::ExprFieldAccess { .. } => { - if (field_access_field_at(expr.clone(), si.clone()).as_str() - == "state".to_string().as_str()) - { - match parser_state_base_var(&expr, si.clone()) { - Some(result_name) => { - match v2_rt::map_get(&env.result_sources.clone(), result_name.clone()) { - Some(source) => parser_result_state_progress( - source.clone(), - parser_always_advancing.clone(), - consumed_true_set.clone(), - result_name.clone(), - ), - None => DescentEvidence::DescentUnknown, - } - } - None => DescentEvidence::DescentUnknown, - } - } else { - DescentEvidence::DescentUnknown - } - } - ExprData::ExprCall { .. } => match parser_passthrough_state_expr(&expr, &si) { - Some(state_expr) => parser_state_expr_progress( - &state_expr, - &state_param, - &env, - &parser_always_advancing, - &consumed_true_set, - &si, - ), - None => DescentEvidence::DescentUnknown, - }, - ExprData::ExprIf => { - let cond = if_condition(expr.clone()); - let then_consumed = match parser_progress_flag_var(&cond, &si) { - Some(name) => { - v2_rt::rc_map_insert(consumed_true_set.clone(), name.clone(), true) - } - None => consumed_true_set.clone(), - }; - let then_progress = parser_state_expr_progress( - &if_then_branch(expr.clone()), - &state_param, - &env, - &parser_always_advancing, - &then_consumed, - &si, - ); - let else_progress = match if_else_branch(expr.clone()) { - Some(eb) => parser_state_expr_progress( - &eb, - &state_param, - &env, - &parser_always_advancing, - &consumed_true_set, - &si, - ), - None => DescentEvidence::DescentUnknown, - }; - merge_evidence(then_progress, else_progress) - } - ExprData::ExprLet => { - let next_env = parser_env_with_binding( - &let_binding_name_at(expr.clone(), si.clone()), - &let_value(expr.clone()), - &env, - &state_param, - &parser_always_advancing, - &consumed_true_set, - &si, - ); - match let_body(expr.clone()) { - Some(body) => parser_state_expr_progress( - &body, - &state_param, - &next_env, - &parser_always_advancing, - &consumed_true_set, - &si, - ), - None => DescentEvidence::DescentUnknown, - } - } - ExprData::ExprMatch => { - let arm_progresses = Rc::new({ - let mut __result = Vec::new(); - for arm_node in match_arm_nodes(expr.clone()).iter().cloned() { - __result.push(parser_state_expr_progress( - &arm_body(&arm_node), - &state_param, - &env, - &parser_always_advancing, - &consumed_true_set, - &si, - )); - } - __result - }); - match arm_progresses.clone().first().cloned() { - Some(initial) => arm_progresses.clone().iter().cloned().fold( - initial.clone(), - |acc: DescentEvidence, p: DescentEvidence| merge_evidence(acc, p.clone()), - ), - None => DescentEvidence::DescentUnknown, - } + ExprData::ExprVar { .. } => { + let name = expr_var_name_at(expr.clone(), si.clone()); +if (name.clone().as_str() == state_param.name.clone().as_str()) { + DescentEvidence::NonIncreasing + } else { + match v2_rt::map_get(&env.state_aliases.clone(), name.clone()) { + Some(progress) => progress.clone(), + None => DescentEvidence::DescentUnknown, +} } - ExprData::ExprBlock => parser_block_state_progress( - &expr.children.clone(), - &state_param, - env.clone(), - &parser_always_advancing, - &consumed_true_set, - &si, - ), - _ => DescentEvidence::DescentUnknown, - } +}, + ExprData::ExprFieldAccess { .. } => if (field_access_field_at(expr.clone(), si.clone()).as_str() == "state".to_string().as_str()) { + match parser_state_base_var(&expr, si.clone()) { + Some(result_name) => match v2_rt::map_get(&env.result_sources.clone(), result_name.clone()) { + Some(source) => parser_result_state_progress(source.clone(), parser_always_advancing.clone(), consumed_true_set.clone(), result_name.clone()), + None => DescentEvidence::DescentUnknown, +}, + None => DescentEvidence::DescentUnknown, +} + } else { + DescentEvidence::DescentUnknown + }, + ExprData::ExprCall { .. } => match parser_passthrough_state_expr(&expr, &si) { + Some(state_expr) => parser_state_expr_progress(&state_expr, &state_param, &env, &parser_always_advancing, &consumed_true_set, &si), + None => DescentEvidence::DescentUnknown, +}, + ExprData::ExprIf => { + let cond = if_condition(expr.clone()); +let then_consumed = match parser_progress_flag_var(&cond, &si) { + Some(name) => v2_rt::rc_map_insert(consumed_true_set.clone(), name.clone(), true), + None => consumed_true_set.clone(), +}; +let then_progress = parser_state_expr_progress(&if_then_branch(expr.clone()), &state_param, &env, &parser_always_advancing, &then_consumed, &si); +let else_progress = match if_else_branch(expr.clone()) { + Some(eb) => parser_state_expr_progress(&eb, &state_param, &env, &parser_always_advancing, &consumed_true_set, &si), + None => DescentEvidence::DescentUnknown, +}; +merge_evidence(then_progress, else_progress) +}, + ExprData::ExprLet => { + let next_env = parser_env_with_binding(&let_binding_name_at(expr.clone(), si.clone()), &let_value(expr.clone()), &env, &state_param, &parser_always_advancing, &consumed_true_set, &si); +match let_body(expr.clone()) { + Some(body) => parser_state_expr_progress(&body, &state_param, &next_env, &parser_always_advancing, &consumed_true_set, &si), + None => DescentEvidence::DescentUnknown, +} +}, + ExprData::ExprMatch => { + let arm_progresses = Rc::new({ let mut __result = Vec::new(); for arm_node in match_arm_nodes(expr.clone()).iter().cloned() { __result.push(parser_state_expr_progress(&arm_body(&arm_node), &state_param, &env, &parser_always_advancing, &consumed_true_set, &si)); } __result }); +match arm_progresses.clone().first().cloned() { + Some(initial) => arm_progresses.clone().iter().cloned().fold(initial.clone(), |acc: DescentEvidence, p: DescentEvidence| merge_evidence(acc, p.clone())), + None => DescentEvidence::DescentUnknown, +} +}, + ExprData::ExprBlock => parser_block_state_progress(&expr.children.clone(), &state_param, env.clone(), &parser_always_advancing, &consumed_true_set, &si), + _ => DescentEvidence::DescentUnknown, +} }) } -pub fn parser_block_state_progress( - stmts: &Rc>>, - state_param: &Rc, - env: Rc, - parser_always_advancing: &Rc>, - consumed_true_set: &Rc>, - si: &Rc>>, -) -> DescentEvidence { +pub fn parser_block_state_progress(stmts: &Rc>>, state_param: &Rc, env: Rc, parser_always_advancing: &Rc>, consumed_true_set: &Rc>, si: &Rc>>) -> DescentEvidence { match stmts.clone().last().cloned() { - None => DescentEvidence::DescentUnknown, - Some(last_stmt) => { - let leading = Rc::new( - stmts - .clone() - .iter() - .cloned() - .take(((stmts.clone().len() as i64) - 1) as usize) - .collect::>(), - ); - let final_env = leading.iter().cloned().fold( - env.clone(), - |acc_env: Rc, stmt: Rc| match (*stmt.expr_data.clone()) - .clone() - { - ExprData::ExprLet => match let_body(stmt.clone()) { - None => parser_env_with_binding( - &let_binding_name_at(stmt.clone(), si.clone()), - &let_value(stmt.clone()), - &acc_env, - &state_param, - &parser_always_advancing, - &consumed_true_set, - &si, - ), - Some(_) => acc_env.clone(), - }, - _ => acc_env.clone(), - }, - ); - parser_state_expr_progress( - &last_stmt, - &state_param, - &final_env, - &parser_always_advancing, - &consumed_true_set, - &si, - ) - } - } + None => DescentEvidence::DescentUnknown, + Some(last_stmt) => { + let leading = Rc::new(stmts.clone().iter().cloned().take(((stmts.clone().len() as i64) - 1) as usize).collect::>()); +let final_env = leading.iter().cloned().fold(env.clone(), |acc_env: Rc, stmt: Rc| match (*stmt.expr_data.clone()).clone() { + ExprData::ExprLet => match let_body(stmt.clone()) { + None => parser_env_with_binding(&let_binding_name_at(stmt.clone(), si.clone()), &let_value(stmt.clone()), &acc_env, &state_param, &parser_always_advancing, &consumed_true_set, &si), + Some(_) => acc_env.clone(), +}, + _ => acc_env.clone(), +}); +parser_state_expr_progress(&last_stmt, &state_param, &final_env, &parser_always_advancing, &consumed_true_set, &si) +}, +} } -pub fn parser_result_source_for_expr( - expr: &Rc, - state_param: &Rc, - env: Rc, - parser_always_advancing: Rc>, - consumed_true_set: Rc>, - si: &Rc>>, -) -> Rc { +pub fn parser_result_source_for_expr(expr: &Rc, state_param: &Rc, env: Rc, parser_always_advancing: Rc>, consumed_true_set: Rc>, si: &Rc>>) -> Rc { match (*expr.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { - let input_progress = - match parser_state_arg_expr(expr.clone(), state_param.clone(), si.clone()) { - Some(state_expr) => parser_state_expr_progress( - &state_expr, - &state_param, - &env, - &parser_always_advancing, - &consumed_true_set, - &si, - ), - None => DescentEvidence::DescentUnknown, - }; - match (*parser_result_witness(&expr, si.clone())).clone() { - ParserResultWitness::ParserWitnessAdvance => { - Rc::new(ParserResultSource::ParserResultAdvance { - input: input_progress.clone(), - }) - } - ParserResultWitness::ParserWitnessExpect => { - Rc::new(ParserResultSource::ParserResultExpect { - input: input_progress.clone(), - }) - } - ParserResultWitness::ParserWitnessEat => { - Rc::new(ParserResultSource::ParserResultEat { - input: input_progress.clone(), - }) - } - ParserResultWitness::ParserWitnessCall { callee, .. } => { - match (*callee.clone()).clone() { - ParserCallIdentity::ParserCallHelper { .. } => { - Rc::new(ParserResultSource::ParserResultOpaque) - } - ParserCallIdentity::ParserCallFunction { name, .. } => { - match input_progress.clone() { - DescentEvidence::DescentUnknown => { - Rc::new(ParserResultSource::ParserResultOpaque) - } - _ => Rc::new(ParserResultSource::ParserResultCall { - input: input_progress.clone(), - callee: name.clone(), - }), - } - } - } - } - ParserResultWitness::ParserWitnessOpaque => { - Rc::new(ParserResultSource::ParserResultOpaque) - } - } - } - _ => { - let progress = parser_success_progress( - &expr, - &state_param, - &env, - &parser_always_advancing, - &consumed_true_set, - &si, - ); - match progress.clone() { - DescentEvidence::DescentUnknown => Rc::new(ParserResultSource::ParserResultOpaque), - _ => Rc::new(ParserResultSource::ParserResultDirectState { - input: progress.clone(), - }), - } - } - } + ExprData::ExprCall { .. } => { + let input_progress = match parser_state_arg_expr(expr.clone(), state_param.clone(), si.clone()) { + Some(state_expr) => parser_state_expr_progress(&state_expr, &state_param, &env, &parser_always_advancing, &consumed_true_set, &si), + None => DescentEvidence::DescentUnknown, +}; +match (*parser_result_witness(&expr, si.clone())).clone() { + ParserResultWitness::ParserWitnessAdvance => Rc::new(ParserResultSource::ParserResultAdvance { + input: input_progress.clone(), +}), + ParserResultWitness::ParserWitnessExpect => Rc::new(ParserResultSource::ParserResultExpect { + input: input_progress.clone(), +}), + ParserResultWitness::ParserWitnessEat => Rc::new(ParserResultSource::ParserResultEat { + input: input_progress.clone(), +}), + ParserResultWitness::ParserWitnessCall { callee, .. } => match (*callee.clone()).clone() { + ParserCallIdentity::ParserCallHelper { .. } => Rc::new(ParserResultSource::ParserResultOpaque), + ParserCallIdentity::ParserCallFunction { name, .. } => match input_progress.clone() { + DescentEvidence::DescentUnknown => Rc::new(ParserResultSource::ParserResultOpaque), + _ => Rc::new(ParserResultSource::ParserResultCall { + input: input_progress.clone(), + callee: name.clone(), +}), +}, +}, + ParserResultWitness::ParserWitnessOpaque => Rc::new(ParserResultSource::ParserResultOpaque), +} +}, + _ => { + let progress = parser_success_progress(&expr, &state_param, &env, &parser_always_advancing, &consumed_true_set, &si); +match progress.clone() { + DescentEvidence::DescentUnknown => Rc::new(ParserResultSource::ParserResultOpaque), + _ => Rc::new(ParserResultSource::ParserResultDirectState { + input: progress.clone(), +}), +} +}, +} } -pub fn parser_env_with_binding( - name: &String, - value_expr: &Rc, - env: &Rc, - state_param: &Rc, - parser_always_advancing: &Rc>, - consumed_true_set: &Rc>, - si: &Rc>>, -) -> Rc { +pub fn parser_env_with_binding(name: &String, value_expr: &Rc, env: &Rc, state_param: &Rc, parser_always_advancing: &Rc>, consumed_true_set: &Rc>, si: &Rc>>) -> Rc { { - let state_progress = parser_state_expr_progress( - &value_expr, - &state_param, - &env, - &parser_always_advancing, - &consumed_true_set, - &si, - ); - let result_source = parser_result_source_for_expr( - &value_expr, - &state_param, - env.clone(), - parser_always_advancing.clone(), - consumed_true_set.clone(), - &si, - ); - Rc::new(ParserProgressEnv { - state_aliases: v2_rt::rc_map_insert( - env.state_aliases.clone(), - name.clone(), - state_progress, - ), - result_sources: v2_rt::rc_map_insert( - env.result_sources.clone(), - name.clone(), - result_source, - ), - }) - } + let state_progress = parser_state_expr_progress(&value_expr, &state_param, &env, &parser_always_advancing, &consumed_true_set, &si); +let result_source = parser_result_source_for_expr(&value_expr, &state_param, env.clone(), parser_always_advancing.clone(), consumed_true_set.clone(), &si); +Rc::new(ParserProgressEnv { + state_aliases: v2_rt::rc_map_insert(env.state_aliases.clone(), name.clone(), state_progress), + result_sources: v2_rt::rc_map_insert(env.result_sources.clone(), name.clone(), result_source), +}) +} } -pub fn parser_call_edge_progress( - call_node: &Rc, - state_param: &Rc, - env: Rc, - parser_always_advancing: &Rc>, - consumed_true_set: Rc>, - si: &Rc>>, -) -> DescentEvidence { +pub fn parser_call_edge_progress(call_node: &Rc, state_param: &Rc, env: Rc, parser_always_advancing: &Rc>, consumed_true_set: Rc>, si: &Rc>>) -> DescentEvidence { match parser_state_arg_expr(call_node.clone(), state_param.clone(), si.clone()) { - Some(state_expr) => { - let input_progress = parser_state_expr_progress( - &state_expr, - &state_param, - &env, - &parser_always_advancing, - &consumed_true_set, - &si, - ); - if set_has( - parser_always_advancing.clone(), - expr_call_func_at(call_node.clone(), si.clone()), - ) { - strict_after_parser_witness(input_progress) - } else { - input_progress - } + Some(state_expr) => { + let input_progress = parser_state_expr_progress(&state_expr, &state_param, &env, &parser_always_advancing, &consumed_true_set, &si); +if set_has(parser_always_advancing.clone(), expr_call_func_at(call_node.clone(), si.clone())) { + strict_after_parser_witness(input_progress) + } else { + input_progress } - None => DescentEvidence::DescentUnknown, - } +}, + None => DescentEvidence::DescentUnknown, +} } -pub fn collect_parser_progress_block_edges( - caller: String, - stmts: Rc>>, - state_param: Rc, - scc_name_set: Rc>, - env: Rc, - parser_always_advancing: Rc>, - consumed_true_set: Rc>, - si: Rc>>, -) -> Rc>> { +pub fn collect_parser_progress_block_edges(caller: String, stmts: Rc>>, state_param: Rc, scc_name_set: Rc>, env: Rc, parser_always_advancing: Rc>, consumed_true_set: Rc>, si: Rc>>) -> Rc>> { { - let acc = stmts.iter().cloned().fold( - Rc::new(ParserProgressAcc { - edges: Rc::new(vec![]), - env: env, - }), - |acc: Rc, stmt: Rc| match (*stmt.expr_data.clone()).clone() { - ExprData::ExprLet => match let_body(stmt.clone()) { - None => { - let value_expr = let_value(stmt.clone()); - let value_edges = collect_parser_progress_edges( - &caller, - &value_expr, - &state_param, - &scc_name_set, - &acc.env.clone(), - &parser_always_advancing, - &consumed_true_set, - &si, - ); - let next_env = parser_env_with_binding( - &let_binding_name_at(stmt.clone(), si.clone()), - &value_expr, - &acc.env.clone(), - &state_param, - &parser_always_advancing, - &consumed_true_set, - &si, - ); - Rc::new(ParserProgressAcc { - edges: v2_rt::concat(acc.edges.clone(), value_edges.clone()), - env: next_env.clone(), - }) - } - Some(_) => { - let stmt_edges = collect_parser_progress_edges( - &caller, - &stmt, - &state_param, - &scc_name_set, - &acc.env.clone(), - &parser_always_advancing, - &consumed_true_set, - &si, - ); - Rc::new(ParserProgressAcc { - edges: v2_rt::concat(acc.edges.clone(), stmt_edges.clone()), - env: acc.env.clone(), - }) - } - }, - _ => { - let stmt_edges = collect_parser_progress_edges( - &caller, - &stmt, - &state_param, - &scc_name_set, - &acc.env.clone(), - &parser_always_advancing, - &consumed_true_set, - &si, - ); - Rc::new(ParserProgressAcc { - edges: v2_rt::concat(acc.edges.clone(), stmt_edges.clone()), - env: acc.env.clone(), - }) - } - }, - ); - acc.edges.clone() - } + let acc = stmts.iter().cloned().fold(Rc::new(ParserProgressAcc { + edges: Rc::new(vec![]), + env: env, +}), |acc: Rc, stmt: Rc| match (*stmt.expr_data.clone()).clone() { + ExprData::ExprLet => match let_body(stmt.clone()) { + None => { + let value_expr = let_value(stmt.clone()); +let value_edges = collect_parser_progress_edges(&caller, &value_expr, &state_param, &scc_name_set, &acc.env.clone(), &parser_always_advancing, &consumed_true_set, &si); +let next_env = parser_env_with_binding(&let_binding_name_at(stmt.clone(), si.clone()), &value_expr, &acc.env.clone(), &state_param, &parser_always_advancing, &consumed_true_set, &si); +Rc::new(ParserProgressAcc { + edges: v2_rt::concat(acc.edges.clone(), value_edges.clone()), + env: next_env.clone(), +}) +}, + Some(_) => { + let stmt_edges = collect_parser_progress_edges(&caller, &stmt, &state_param, &scc_name_set, &acc.env.clone(), &parser_always_advancing, &consumed_true_set, &si); +Rc::new(ParserProgressAcc { + edges: v2_rt::concat(acc.edges.clone(), stmt_edges.clone()), + env: acc.env.clone(), +}) +}, +}, + _ => { + let stmt_edges = collect_parser_progress_edges(&caller, &stmt, &state_param, &scc_name_set, &acc.env.clone(), &parser_always_advancing, &consumed_true_set, &si); +Rc::new(ParserProgressAcc { + edges: v2_rt::concat(acc.edges.clone(), stmt_edges.clone()), + env: acc.env.clone(), +}) +}, +}); +acc.edges.clone() +} } -pub fn collect_parser_progress_edges( - caller: &String, - body: &Rc, - state_param: &Rc, - scc_name_set: &Rc>, - env: &Rc, - parser_always_advancing: &Rc>, - consumed_true_set: &Rc>, - si: &Rc>>, -) -> Rc>> { +pub fn collect_parser_progress_edges(caller: &String, body: &Rc, state_param: &Rc, scc_name_set: &Rc>, env: &Rc, parser_always_advancing: &Rc>, consumed_true_set: &Rc>, si: &Rc>>) -> Rc>> { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*body.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { - let own_edges = if set_has( - scc_name_set.clone(), - expr_call_func_at(body.clone(), si.clone()), - ) { - Rc::new(vec![Rc::new(ParserProgressEdge { - caller: caller.clone(), - callee: expr_call_func_at(body.clone(), si.clone()), - progress: parser_call_edge_progress( - &body, - &state_param, - env.clone(), - &parser_always_advancing, - consumed_true_set.clone(), - &si, - ), - })]) - } else { - Rc::new(vec![]) - }; - let child_edges = Rc::new({ - let mut __result = Vec::new(); - for child in body.children.clone().iter().cloned() { - __result.extend( - (*collect_parser_progress_edges( - &caller, - &child, - &state_param, - &scc_name_set, - &env, - &parser_always_advancing, - &consumed_true_set, - &si, - )) - .iter() - .cloned(), - ); - } - __result - }); - v2_rt::concat(own_edges, child_edges) - } - ExprData::ExprIf => { - let cond = if_condition(body.clone()); - let cond_edges = collect_parser_progress_edges( - &caller, - &cond, - &state_param, - &scc_name_set, - &env, - &parser_always_advancing, - &consumed_true_set, - &si, - ); - let then_consumed = match parser_progress_flag_var(&cond, &si) { - Some(name) => { - v2_rt::rc_map_insert(consumed_true_set.clone(), name.clone(), true) - } - None => consumed_true_set.clone(), - }; - let then_edges = collect_parser_progress_edges( - &caller, - &if_then_branch(body.clone()), - &state_param, - &scc_name_set, - &env, - &parser_always_advancing, - &then_consumed, - &si, - ); - let else_edges = match if_else_branch(body.clone()) { - Some(eb) => collect_parser_progress_edges( - &caller, - &eb, - &state_param, - &scc_name_set, - &env, - &parser_always_advancing, - &consumed_true_set, - &si, - ), - None => Rc::new(vec![]), - }; - v2_rt::concat(v2_rt::concat(cond_edges, then_edges), else_edges) - } - ExprData::ExprLet => { - let value_expr = let_value(body.clone()); - let value_edges = collect_parser_progress_edges( - &caller, - &value_expr, - &state_param, - &scc_name_set, - &env, - &parser_always_advancing, - &consumed_true_set, - &si, - ); - let next_env = parser_env_with_binding( - &let_binding_name_at(body.clone(), si.clone()), - &value_expr, - &env, - &state_param, - &parser_always_advancing, - &consumed_true_set, - &si, - ); - let body_edges = match let_body(body.clone()) { - Some(b) => collect_parser_progress_edges( - &caller, - &b, - &state_param, - &scc_name_set, - &next_env, - &parser_always_advancing, - &consumed_true_set, - &si, - ), - None => Rc::new(vec![]), - }; - v2_rt::concat(value_edges, body_edges) - } - ExprData::ExprBlock => collect_parser_progress_block_edges( - caller.clone(), - body.children.clone(), - state_param.clone(), - scc_name_set.clone(), - env.clone(), - parser_always_advancing.clone(), - consumed_true_set.clone(), - si.clone(), - ), - ExprData::ExprMatch => { - let scrut_edges = collect_parser_progress_edges( - &caller, - &match_scrutinee(body.clone()), - &state_param, - &scc_name_set, - &env, - &parser_always_advancing, - &consumed_true_set, - &si, - ); - let arm_edges = Rc::new({ - let mut __result = Vec::new(); - for arm_node in match_arm_nodes(body.clone()).iter().cloned() { - __result.extend( - (*collect_parser_progress_edges( - &caller, - &arm_body(&arm_node), - &state_param, - &scc_name_set, - &env, - &parser_always_advancing, - &consumed_true_set, - &si, - )) - .iter() - .cloned(), - ); - } - __result - }); - v2_rt::concat(scrut_edges, arm_edges) - } - _ => Rc::new({ - let mut __result = Vec::new(); - for child in body.children.clone().iter().cloned() { - __result.extend( - (*collect_parser_progress_edges( - &caller, - &child, - &state_param, - &scc_name_set, - &env, - &parser_always_advancing, - &consumed_true_set, - &si, - )) - .iter() - .cloned(), - ); - } - __result - }), - } + ExprData::ExprCall { .. } => { + let own_edges = if set_has(scc_name_set.clone(), expr_call_func_at(body.clone(), si.clone())) { + Rc::new(vec![Rc::new(ParserProgressEdge { + caller: caller.clone(), + callee: expr_call_func_at(body.clone(), si.clone()), + progress: parser_call_edge_progress(&body, &state_param, env.clone(), &parser_always_advancing, consumed_true_set.clone(), &si), +})]) + } else { + Rc::new(vec![]) + }; +let child_edges = Rc::new({ let mut __result = Vec::new(); for child in body.children.clone().iter().cloned() { __result.extend((*collect_parser_progress_edges(&caller, &child, &state_param, &scc_name_set, &env, &parser_always_advancing, &consumed_true_set, &si)).iter().cloned()); } __result }); +v2_rt::concat(own_edges, child_edges) +}, + ExprData::ExprIf => { + let cond = if_condition(body.clone()); +let cond_edges = collect_parser_progress_edges(&caller, &cond, &state_param, &scc_name_set, &env, &parser_always_advancing, &consumed_true_set, &si); +let then_consumed = match parser_progress_flag_var(&cond, &si) { + Some(name) => v2_rt::rc_map_insert(consumed_true_set.clone(), name.clone(), true), + None => consumed_true_set.clone(), +}; +let then_edges = collect_parser_progress_edges(&caller, &if_then_branch(body.clone()), &state_param, &scc_name_set, &env, &parser_always_advancing, &then_consumed, &si); +let else_edges = match if_else_branch(body.clone()) { + Some(eb) => collect_parser_progress_edges(&caller, &eb, &state_param, &scc_name_set, &env, &parser_always_advancing, &consumed_true_set, &si), + None => Rc::new(vec![]), +}; +v2_rt::concat(v2_rt::concat(cond_edges, then_edges), else_edges) +}, + ExprData::ExprLet => { + let value_expr = let_value(body.clone()); +let value_edges = collect_parser_progress_edges(&caller, &value_expr, &state_param, &scc_name_set, &env, &parser_always_advancing, &consumed_true_set, &si); +let next_env = parser_env_with_binding(&let_binding_name_at(body.clone(), si.clone()), &value_expr, &env, &state_param, &parser_always_advancing, &consumed_true_set, &si); +let body_edges = match let_body(body.clone()) { + Some(b) => collect_parser_progress_edges(&caller, &b, &state_param, &scc_name_set, &next_env, &parser_always_advancing, &consumed_true_set, &si), + None => Rc::new(vec![]), +}; +v2_rt::concat(value_edges, body_edges) +}, + ExprData::ExprBlock => collect_parser_progress_block_edges(caller.clone(), body.children.clone(), state_param.clone(), scc_name_set.clone(), env.clone(), parser_always_advancing.clone(), consumed_true_set.clone(), si.clone()), + ExprData::ExprMatch => { + let scrut_edges = collect_parser_progress_edges(&caller, &match_scrutinee(body.clone()), &state_param, &scc_name_set, &env, &parser_always_advancing, &consumed_true_set, &si); +let arm_edges = Rc::new({ let mut __result = Vec::new(); for arm_node in match_arm_nodes(body.clone()).iter().cloned() { __result.extend((*collect_parser_progress_edges(&caller, &arm_body(&arm_node), &state_param, &scc_name_set, &env, &parser_always_advancing, &consumed_true_set, &si)).iter().cloned()); } __result }); +v2_rt::concat(scrut_edges, arm_edges) +}, + _ => Rc::new({ let mut __result = Vec::new(); for child in body.children.clone().iter().cloned() { __result.extend((*collect_parser_progress_edges(&caller, &child, &state_param, &scc_name_set, &env, &parser_always_advancing, &consumed_true_set, &si)).iter().cloned()); } __result }), +} }) } -pub fn parser_record_field_value( - expr: Rc, - field_name: String, - si: Rc>>, -) -> Option> { - Rc::new({ - let mut __result = Vec::new(); - for child in Rc::new({ - let mut __result = Vec::new(); - for child in expr.children.clone().iter().cloned() { - if (field_init_node_name_at(child.clone(), si.clone()).as_str() - == field_name.clone().as_str()) - { - __result.push(child); - } - } - __result - }) - .iter() - .cloned() - { - __result.push(field_init_node_value(&child)); - } - __result - }) - .first() - .cloned() +pub fn parser_record_field_value(expr: Rc, field_name: String, si: Rc>>) -> Option> { + Rc::new({ let mut __result = Vec::new(); for child in Rc::new({ let mut __result = Vec::new(); for child in expr.children.clone().iter().cloned() { if (field_init_node_name_at(child.clone(), si.clone()).as_str() == field_name.clone().as_str()) { __result.push(child); } } __result }).iter().cloned() { __result.push(field_init_node_value(&child)); } __result }).first().cloned() } pub fn parser_expr_is_none(expr: Rc) -> bool { match (*expr.expr_data.clone()).clone() { - ExprData::ExprLiteral { value: v, .. } => match (*v.clone()).clone() { - LiteralValue::LitNull => true, - _ => false, - }, - _ => false, - } + ExprData::ExprLiteral { value: v, .. } => match (*v.clone()).clone() { + LiteralValue::LitNull => true, + _ => false, +}, + _ => false, +} } -pub fn parser_success_progress( - expr: &Rc, - state_param: &Rc, - env: &Rc, - parser_always_advancing: &Rc>, - consumed_true_set: &Rc>, - si: &Rc>>, -) -> DescentEvidence { +pub fn parser_success_progress(expr: &Rc, state_param: &Rc, env: &Rc, parser_always_advancing: &Rc>, consumed_true_set: &Rc>, si: &Rc>>) -> DescentEvidence { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*expr.expr_data.clone()).clone() { - ExprData::ExprReturn => parser_success_progress( - &return_value(expr.clone()), - &state_param, - &env, - &parser_always_advancing, - &consumed_true_set, - &si, - ), - ExprData::ExprVar { .. } => match v2_rt::map_get( - &env.result_sources.clone(), - expr_var_name_at(expr.clone(), si.clone()), - ) { - Some(source) => parser_result_state_progress( - source.clone(), - parser_always_advancing.clone(), - consumed_true_set.clone(), - expr_var_name_at(expr.clone(), si.clone()), - ), - None => DescentEvidence::DescentUnknown, - }, - ExprData::ExprCall { .. } => parser_result_state_progress( - parser_result_source_for_expr( - &expr, - &state_param, - env.clone(), - parser_always_advancing.clone(), - consumed_true_set.clone(), - &si, - ), - parser_always_advancing.clone(), - consumed_true_set.clone(), - "".to_string(), - ), - ExprData::ExprRecordLit { .. } => { - match parser_record_field_value(expr.clone(), "err".to_string(), si.clone()) { - Some(err_expr) => { - if parser_expr_is_none(err_expr.clone()) { - match parser_record_field_value( - expr.clone(), - "state".to_string(), - si.clone(), - ) { - Some(state_expr) => parser_state_expr_progress( - &state_expr, - &state_param, - &env, - &parser_always_advancing, - &consumed_true_set, - &si, - ), - None => DescentEvidence::DescentUnknown, - } - } else { - DescentEvidence::DescentUnknown - } - } - None => DescentEvidence::DescentUnknown, - } - } - ExprData::ExprIf => { - let cond = if_condition(expr.clone()); - let then_consumed = match parser_progress_flag_var(&cond, &si) { - Some(name) => { - v2_rt::rc_map_insert(consumed_true_set.clone(), name.clone(), true) - } - None => consumed_true_set.clone(), - }; - let then_progress = parser_success_progress( - &if_then_branch(expr.clone()), - &state_param, - &env, - &parser_always_advancing, - &then_consumed, - &si, - ); - let else_progress = match if_else_branch(expr.clone()) { - Some(eb) => parser_success_progress( - &eb, - &state_param, - &env, - &parser_always_advancing, - &consumed_true_set, - &si, - ), - None => DescentEvidence::DescentUnknown, - }; - merge_evidence(then_progress, else_progress) - } - ExprData::ExprLet => { - let next_env = parser_env_with_binding( - &let_binding_name_at(expr.clone(), si.clone()), - &let_value(expr.clone()), - &env, - &state_param, - &parser_always_advancing, - &consumed_true_set, - &si, - ); - match let_body(expr.clone()) { - Some(body) => parser_success_progress( - &body, - &state_param, - &next_env, - &parser_always_advancing, - &consumed_true_set, - &si, - ), - None => DescentEvidence::DescentUnknown, - } - } - ExprData::ExprBlock => { - let prefix = v2_rt::reverse(Rc::new( - v2_rt::reverse(expr.children.clone()) - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - )); - let acc = prefix.iter().cloned().fold( - Rc::new(ParserProgressAcc { - edges: Rc::new(vec![]), - env: env.clone(), - }), - |acc: Rc, stmt: Rc| match (*stmt.expr_data.clone()) - .clone() - { - ExprData::ExprLet => match let_body(stmt.clone()) { - None => { - let next_env = parser_env_with_binding( - &let_binding_name_at(stmt.clone(), si.clone()), - &let_value(stmt.clone()), - &acc.env.clone(), - &state_param, - &parser_always_advancing, - &consumed_true_set, - &si, - ); - Rc::new(ParserProgressAcc { - edges: acc.edges.clone(), - env: next_env.clone(), - }) - } - Some(_) => acc.clone(), - }, - _ => acc.clone(), - }, - ); - match expr.children.clone().last().cloned() { - Some(last_stmt) => parser_success_progress( - &last_stmt, - &state_param, - &acc.env.clone(), - &parser_always_advancing, - &consumed_true_set, - &si, - ), - None => DescentEvidence::DescentUnknown, - } - } - _ => DescentEvidence::DescentUnknown, - } + ExprData::ExprReturn => parser_success_progress(&return_value(expr.clone()), &state_param, &env, &parser_always_advancing, &consumed_true_set, &si), + ExprData::ExprVar { .. } => match v2_rt::map_get(&env.result_sources.clone(), expr_var_name_at(expr.clone(), si.clone())) { + Some(source) => parser_result_state_progress(source.clone(), parser_always_advancing.clone(), consumed_true_set.clone(), expr_var_name_at(expr.clone(), si.clone())), + None => DescentEvidence::DescentUnknown, +}, + ExprData::ExprCall { .. } => parser_result_state_progress(parser_result_source_for_expr(&expr, &state_param, env.clone(), parser_always_advancing.clone(), consumed_true_set.clone(), &si), parser_always_advancing.clone(), consumed_true_set.clone(), "".to_string()), + ExprData::ExprRecordLit { .. } => match parser_record_field_value(expr.clone(), "err".to_string(), si.clone()) { + Some(err_expr) => if parser_expr_is_none(err_expr.clone()) { + match parser_record_field_value(expr.clone(), "state".to_string(), si.clone()) { + Some(state_expr) => parser_state_expr_progress(&state_expr, &state_param, &env, &parser_always_advancing, &consumed_true_set, &si), + None => DescentEvidence::DescentUnknown, +} + } else { + DescentEvidence::DescentUnknown + }, + None => DescentEvidence::DescentUnknown, +}, + ExprData::ExprIf => { + let cond = if_condition(expr.clone()); +let then_consumed = match parser_progress_flag_var(&cond, &si) { + Some(name) => v2_rt::rc_map_insert(consumed_true_set.clone(), name.clone(), true), + None => consumed_true_set.clone(), +}; +let then_progress = parser_success_progress(&if_then_branch(expr.clone()), &state_param, &env, &parser_always_advancing, &then_consumed, &si); +let else_progress = match if_else_branch(expr.clone()) { + Some(eb) => parser_success_progress(&eb, &state_param, &env, &parser_always_advancing, &consumed_true_set, &si), + None => DescentEvidence::DescentUnknown, +}; +merge_evidence(then_progress, else_progress) +}, + ExprData::ExprLet => { + let next_env = parser_env_with_binding(&let_binding_name_at(expr.clone(), si.clone()), &let_value(expr.clone()), &env, &state_param, &parser_always_advancing, &consumed_true_set, &si); +match let_body(expr.clone()) { + Some(body) => parser_success_progress(&body, &state_param, &next_env, &parser_always_advancing, &consumed_true_set, &si), + None => DescentEvidence::DescentUnknown, +} +}, + ExprData::ExprBlock => { + let prefix = v2_rt::reverse(Rc::new(v2_rt::reverse(expr.children.clone()).iter().cloned().skip(1 as usize).collect::>())); +let acc = prefix.iter().cloned().fold(Rc::new(ParserProgressAcc { + edges: Rc::new(vec![]), + env: env.clone(), +}), |acc: Rc, stmt: Rc| match (*stmt.expr_data.clone()).clone() { + ExprData::ExprLet => match let_body(stmt.clone()) { + None => { + let next_env = parser_env_with_binding(&let_binding_name_at(stmt.clone(), si.clone()), &let_value(stmt.clone()), &acc.env.clone(), &state_param, &parser_always_advancing, &consumed_true_set, &si); +Rc::new(ParserProgressAcc { + edges: acc.edges.clone(), + env: next_env.clone(), +}) +}, + Some(_) => acc.clone(), +}, + _ => acc.clone(), +}); +match expr.children.clone().last().cloned() { + Some(last_stmt) => parser_success_progress(&last_stmt, &state_param, &acc.env.clone(), &parser_always_advancing, &consumed_true_set, &si), + None => DescentEvidence::DescentUnknown, +} +}, + _ => DescentEvidence::DescentUnknown, +} }) } -pub fn parser_member_is_always_advancing( - entry: &Rc, - parser_name_set: Rc>, - proven: &Rc>, - si: &Rc>>, -) -> bool { +pub fn parser_member_is_always_advancing(entry: &Rc, parser_name_set: Rc>, proven: &Rc>, si: &Rc>>) -> bool { match parser_state_param(entry.params.clone(), si.clone()) { - Some(state_param) => { - let edges = collect_parser_progress_edges( - &entry.name.clone(), - &entry.body.clone(), - &state_param, - &parser_name_set, - &empty_parser_progress_env(), - &proven, - &v2_rt::rc_empty_map::(), - &si, - ); - ({ - let mut __all = true; - for edge in edges.iter().cloned() { - if !((edge.progress.clone() == DescentEvidence::Strict) - || ((edge.progress.clone() == DescentEvidence::NonIncreasing) - && set_has(proven.clone(), edge.callee.clone()))) - { - __all = false; - break; - } - } - __all - } && (parser_success_progress( - &entry.body.clone(), - &state_param, - &empty_parser_progress_env(), - &proven, - &v2_rt::rc_empty_map::(), - &si, - ) == DescentEvidence::Strict)) - } - None => false, - } + Some(state_param) => { + let edges = collect_parser_progress_edges(&entry.name.clone(), &entry.body.clone(), &state_param, &parser_name_set, &empty_parser_progress_env(), &proven, &v2_rt::rc_empty_map::(), &si); +({ let mut __all = true; for edge in edges.iter().cloned() { if !(((edge.progress.clone() == DescentEvidence::Strict) || ((edge.progress.clone() == DescentEvidence::NonIncreasing) && set_has(proven.clone(), edge.callee.clone())))) { __all = false; break; } } __all } && (parser_success_progress(&entry.body.clone(), &state_param, &empty_parser_progress_env(), &proven, &v2_rt::rc_empty_map::(), &si) == DescentEvidence::Strict)) +}, + None => false, +} } -pub fn infer_parser_always_advancing_members_worklist( - mut queue: Rc>, - mut func_index: Rc>>, - mut parser_name_set: Rc>, - mut reverse_graph: Rc>>>, - mut proven: Rc>, - mut si: Rc>>, -) -> Rc> { +pub fn infer_parser_always_advancing_members_worklist(mut queue: Rc>, mut func_index: Rc>>, mut parser_name_set: Rc>, mut reverse_graph: Rc>>>, mut proven: Rc>, mut si: Rc>>) -> Rc> { loop { match queue.clone().first().cloned() { - Some(name) => { - let rest = Rc::new( - queue - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ); - if set_has(proven.clone(), name.clone()) { - { - let __tco_0 = rest; - queue = __tco_0; - continue; - } - } else { - match v2_rt::map_get(&func_index, name.clone()) { - Some(entry) => { - if parser_member_is_always_advancing( - &entry, - parser_name_set.clone(), - &proven, - &si, - ) { - let callers = match v2_rt::map_get(&reverse_graph, name.clone()) { - Some(members) => members.clone(), - None => Rc::new(vec![]), - }; - { - let __tco_0 = deduplicate(v2_rt::concat(rest, callers)); - let __tco_1 = v2_rt::rc_map_insert(proven, name.clone(), true); - queue = __tco_0; - proven = __tco_1; - continue; - } - } else { - { - let __tco_0 = rest; - queue = __tco_0; - continue; - } - } - } - None => { - let __tco_0 = rest; - queue = __tco_0; - continue; - } - } - } - } - None => { - break proven.clone(); - } - } - } + Some(name) => { let rest = Rc::new(queue.clone().iter().cloned().skip(1 as usize).collect::>()); +if set_has(proven.clone(), name.clone()) { + { + let __tco_0 = rest; +queue = __tco_0; +continue; +} +} else { + match v2_rt::map_get(&func_index, name.clone()) { + Some(entry) => { if parser_member_is_always_advancing(&entry, parser_name_set.clone(), &proven, &si) { + let callers = match v2_rt::map_get(&reverse_graph, name.clone()) { + Some(members) => members.clone(), + None => Rc::new(vec![]), +}; +{ + let __tco_0 = deduplicate(v2_rt::concat(rest, callers)); +let __tco_1 = v2_rt::rc_map_insert(proven, name.clone(), true); +queue = __tco_0; +proven = __tco_1; +continue; +} +} else { + { + let __tco_0 = rest; +queue = __tco_0; +continue; +} +} }, + None => { { + let __tco_0 = rest; +queue = __tco_0; +continue; +} }, +} +} }, + None => { break proven.clone(); }, +} +} } -pub fn infer_parser_always_advancing_members( - members: &Rc>, - func_index: &Rc>>, - si: &Rc>>, -) -> Rc> { +pub fn infer_parser_always_advancing_members(members: &Rc>, func_index: &Rc>>, si: &Rc>>) -> Rc> { { - let parser_name_set = members.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, name: String| { - v2_rt::rc_map_insert(acc, name.clone(), true) - }, - ); - let parser_entries = Rc::new({ - let mut __result = Vec::new(); - for name in members.clone().iter().cloned() { - __result.extend( - (*match v2_rt::map_get(&func_index, name.clone()) { - Some(entry) => Rc::new(vec![entry.clone()]), - None => Rc::new(vec![]), - }) - .iter() - .cloned(), - ); - } - __result - }); - let reverse_graph = build_call_graph(&parser_entries, si.clone()) - .reverse - .clone(); - infer_parser_always_advancing_members_worklist( - members.clone(), - func_index.clone(), - parser_name_set, - reverse_graph, - v2_rt::rc_empty_map::(), - si.clone(), - ) - } + let parser_name_set = members.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, name: String| v2_rt::rc_map_insert(acc, name.clone(), true)); +let parser_entries = Rc::new({ let mut __result = Vec::new(); for name in members.clone().iter().cloned() { __result.extend((*match v2_rt::map_get(&func_index, name.clone()) { + Some(entry) => Rc::new(vec![entry.clone()]), + None => Rc::new(vec![]), +}).iter().cloned()); } __result }); +let reverse_graph = build_call_graph(&parser_entries, si.clone()).reverse.clone(); +infer_parser_always_advancing_members_worklist(members.clone(), func_index.clone(), parser_name_set, reverse_graph, v2_rt::rc_empty_map::(), si.clone()) +} } -pub fn parser_function_names( - func_index: &Rc>>, - si: Rc>>, -) -> Rc> { - Rc::new({ - let mut __result = Vec::new(); - for name in Rc::new(v2_rt::map_keys(&func_index)).iter().cloned() { - if match v2_rt::map_get(&func_index, name.clone()) { - Some(entry) => (parser_state_param(entry.params.clone(), si.clone()) != None), - None => false, - } { - __result.push(name); - } - } - __result - }) +pub fn parser_function_names(func_index: &Rc>>, si: Rc>>) -> Rc> { + Rc::new({ let mut __result = Vec::new(); for name in Rc::new(v2_rt::map_keys(&func_index)).iter().cloned() { if match v2_rt::map_get(&func_index, name.clone()) { + Some(entry) => (parser_state_param(entry.params.clone(), si.clone()) != None), + None => false, +} { __result.push(name); } } __result }) } -pub fn infer_all_parser_always_advancing( - func_index: &Rc>>, - si: &Rc>>, -) -> Rc> { +pub fn infer_all_parser_always_advancing(func_index: &Rc>>, si: &Rc>>) -> Rc> { { let members = parser_function_names(&func_index, si.clone()); - infer_parser_always_advancing_members(&members, &func_index, &si) - } +infer_parser_always_advancing_members(&members, &func_index, &si) +} } pub fn seed_string_map(key: String, value: String) -> Rc> { @@ -1538,1256 +785,598 @@ pub fn seed_cost_map(key: String, value: Rc) -> Rc>(), key, value) } -pub fn seed_func_entry_map( - key: String, - value: Rc, -) -> Rc>> { +pub fn seed_func_entry_map(key: String, value: Rc) -> Rc>> { v2_rt::rc_map_insert(v2_rt::rc_empty_map::>(), key, value) } -pub fn build_call_graph_from_parser_edges( - names: &Rc>, - edges: Rc>>, -) -> Rc { +pub fn build_call_graph_from_parser_edges(names: &Rc>, edges: Rc>>) -> Rc { { let initial_forward = seed_adjacency_map(names.clone()); - let initial_reverse = seed_adjacency_map(names.clone()); - edges.iter().cloned().fold( - Rc::new(CallGraph { - forward: initial_forward, - reverse: initial_reverse, - }), - |acc: Rc, edge: Rc| { - let forward_neighbors = - match v2_rt::map_get(&acc.forward.clone(), edge.caller.clone()) { - Some(ns) => ns.clone(), - None => Rc::new(vec![]), - }; - let reverse_neighbors = - match v2_rt::map_get(&acc.reverse.clone(), edge.callee.clone()) { - Some(ns) => ns.clone(), - None => Rc::new(vec![]), - }; - Rc::new(CallGraph { - forward: v2_rt::rc_map_insert( - acc.forward.clone(), - edge.caller.clone(), - v2_rt::rc_list_push(forward_neighbors.clone(), edge.callee.clone()), - ), - reverse: v2_rt::rc_map_insert( - acc.reverse.clone(), - edge.callee.clone(), - v2_rt::rc_list_push(reverse_neighbors.clone(), edge.caller.clone()), - ), - }) - }, - ) - } +let initial_reverse = seed_adjacency_map(names.clone()); +edges.iter().cloned().fold(Rc::new(CallGraph { + forward: initial_forward, + reverse: initial_reverse, +}), |acc: Rc, edge: Rc| { + let forward_neighbors = match v2_rt::map_get(&acc.forward.clone(), edge.caller.clone()) { + Some(ns) => ns.clone(), + None => Rc::new(vec![]), +}; +let reverse_neighbors = match v2_rt::map_get(&acc.reverse.clone(), edge.callee.clone()) { + Some(ns) => ns.clone(), + None => Rc::new(vec![]), +}; +Rc::new(CallGraph { + forward: v2_rt::rc_map_insert(acc.forward.clone(), edge.caller.clone(), v2_rt::rc_list_push(forward_neighbors.clone(), edge.callee.clone())), + reverse: v2_rt::rc_map_insert(acc.reverse.clone(), edge.callee.clone(), v2_rt::rc_list_push(reverse_neighbors.clone(), edge.caller.clone())), +}) +}) +} } -pub fn same_progress_subgraph_has_cycle( - members: &Rc>, - edges: Rc>>, -) -> bool { +pub fn same_progress_subgraph_has_cycle(members: &Rc>, edges: Rc>>) -> bool { { - let same_edges = Rc::new({ - let mut __result = Vec::new(); - for edge in edges.iter().cloned() { - if (edge.progress.clone() == DescentEvidence::NonIncreasing) { - __result.push(edge); - } - } - __result - }); - let has_self_cycle = { - let mut __found = false; - for edge in same_edges.clone().iter().cloned() { - if (edge.caller.clone().as_str() == edge.callee.clone().as_str()) { - __found = true; - break; - } - } - __found - }; - if has_self_cycle { + let same_edges = Rc::new({ let mut __result = Vec::new(); for edge in edges.iter().cloned() { if (edge.progress.clone() == DescentEvidence::NonIncreasing) { __result.push(edge); } } __result }); +let has_self_cycle = { let mut __found = false; for edge in same_edges.clone().iter().cloned() { if (edge.caller.clone().as_str() == edge.callee.clone().as_str()) { __found = true; break; } } __found }; +if has_self_cycle { true } else { { - let same_cross_edges = Rc::new({ - let mut __result = Vec::new(); - for edge in same_edges.clone().iter().cloned() { - if (edge.caller.clone().as_str() != edge.callee.clone().as_str()) { - __result.push(edge); - } - } - __result - }); - let graph = build_call_graph_from_parser_edges(&members, same_cross_edges); - graph_has_multi_node_scc(members.clone(), graph) - } + let same_cross_edges = Rc::new({ let mut __result = Vec::new(); for edge in same_edges.clone().iter().cloned() { if (edge.caller.clone().as_str() != edge.callee.clone().as_str()) { __result.push(edge); } } __result }); +let graph = build_call_graph_from_parser_edges(&members, same_cross_edges); +graph_has_multi_node_scc(members.clone(), graph) +} } - } +} } -pub fn collect_parser_edges_for_scc( - members: &Rc>, - func_index: &Rc>>, - scc_name_set: Rc>, - si: &Rc>>, -) -> Rc>> { +pub fn collect_parser_edges_for_scc(members: &Rc>, func_index: &Rc>>, scc_name_set: Rc>, si: &Rc>>) -> Rc>> { { - let all_have_state = { - let mut __all = true; - for name in members.clone().iter().cloned() { - if !(match v2_rt::map_get(&func_index, name.clone()) { - Some(entry) => (parser_state_param(entry.params.clone(), si.clone()) != None), - None => false, - }) { - __all = false; - break; - } - } - __all - }; - if (all_have_state == false) { + let all_have_state = { let mut __all = true; for name in members.clone().iter().cloned() { if !(match v2_rt::map_get(&func_index, name.clone()) { + Some(entry) => (parser_state_param(entry.params.clone(), si.clone()) != None), + None => false, +}) { __all = false; break; } } __all }; +if (all_have_state == false) { Rc::new(vec![]) } else { { - let proven = infer_parser_always_advancing_members( - &parser_function_names(&func_index, si.clone()), - &func_index, - &si, - ); - let parser_always_advancing = proven; - Rc::new({ - let mut __result = Vec::new(); - for name in members.clone().iter().cloned() { - __result.extend( - (*match v2_rt::map_get(&func_index, name.clone()) { - Some(entry) => { - match parser_state_param(entry.params.clone(), si.clone()) { - Some(state_param) => collect_parser_progress_edges( - &name, - &entry.body.clone(), - &state_param, - &scc_name_set, - &empty_parser_progress_env(), - &parser_always_advancing, - &v2_rt::rc_empty_map::(), - &si, - ), - None => Rc::new(vec![]), - } - } - None => Rc::new(vec![]), - }) - .iter() - .cloned(), - ); - } - __result - }) - } + let proven = infer_parser_always_advancing_members(&parser_function_names(&func_index, si.clone()), &func_index, &si); +let parser_always_advancing = proven; +Rc::new({ let mut __result = Vec::new(); for name in members.clone().iter().cloned() { __result.extend((*match v2_rt::map_get(&func_index, name.clone()) { + Some(entry) => match parser_state_param(entry.params.clone(), si.clone()) { + Some(state_param) => collect_parser_progress_edges(&name, &entry.body.clone(), &state_param, &scc_name_set, &empty_parser_progress_env(), &parser_always_advancing, &v2_rt::rc_empty_map::(), &si), + None => Rc::new(vec![]), +}, + None => Rc::new(vec![]), +}).iter().cloned()); } __result }) +} } - } +} } -pub fn classify_parser_scc_recursion_pattern( - members: &Rc>, - func_index: Rc>>, - si: Rc>>, -) -> Option> { +pub fn classify_parser_scc_recursion_pattern(members: &Rc>, func_index: Rc>>, si: Rc>>) -> Option> { { - let scc_name_set = members.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, name: String| { - v2_rt::rc_map_insert(acc, name.clone(), true) - }, - ); - let edges = collect_parser_edges_for_scc(&members, &func_index, scc_name_set, &si); - if ((edges.clone().len() as i64) == 0) { + let scc_name_set = members.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, name: String| v2_rt::rc_map_insert(acc, name.clone(), true)); +let edges = collect_parser_edges_for_scc(&members, &func_index, scc_name_set, &si); +if ((edges.clone().len() as i64) == 0) { None } else { { - let all_known = { - let mut __all = true; - for edge in edges.clone().iter().cloned() { - if !(edge.progress.clone() != DescentEvidence::DescentUnknown) { - __all = false; - break; - } - } - __all - }; - if (all_known - && (same_progress_subgraph_has_cycle(&members, edges.clone()) == false)) - { - Some(lower_call_pattern(Rc::new( - CallPattern::ParserAdvanceCall { - witness: "parser_state".to_string(), - }, - ))) + let all_known = { let mut __all = true; for edge in edges.clone().iter().cloned() { if !((edge.progress.clone() != DescentEvidence::DescentUnknown)) { __all = false; break; } } __all }; +if (all_known && (same_progress_subgraph_has_cycle(&members, edges.clone()) == false)) { + Some(lower_call_pattern(Rc::new(CallPattern::ParserAdvanceCall { + witness: "parser_state".to_string(), +}))) } else { None } - } +} } - } +} } -pub fn count_self_calls( - body: &Rc, - func_name: &String, - si: &Rc>>, -) -> i64 { +pub fn count_self_calls(body: &Rc, func_name: &String, si: &Rc>>) -> i64 { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - let own = match (*body.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { + { + let own = match (*body.expr_data.clone()).clone() { + ExprData::ExprCall { .. } => { let f = expr_call_func_at(body.clone(), si.clone()); - if (f.as_str() == func_name.clone().as_str()) { +if (f.as_str() == func_name.clone().as_str()) { 1 } else { 0 } - } - _ => 0, - }; - let from_children = body - .children - .clone() - .iter() - .cloned() - .fold(0, |acc: i64, child: Rc| { - (acc + count_self_calls(&child, &func_name, &si)) - }); - (own + from_children) +}, + _ => 0, +}; +let from_children = body.children.clone().iter().cloned().fold(0, |acc: i64, child: Rc| (acc + count_self_calls(&child, &func_name, &si))); +(own + from_children) +} }) } -pub fn max_path_self_calls( - body: Rc, - func_name: String, - si: Rc>>, -) -> i64 { +pub fn max_path_self_calls(body: Rc, func_name: String, si: Rc>>) -> i64 { max_path_self_calls_with_cont(&body, &func_name, 0, &si) } -pub fn max_path_self_calls_with_cont( - body: &Rc, - func_name: &String, - continue_calls: i64, - si: &Rc>>, -) -> i64 { +pub fn max_path_self_calls_with_cont(body: &Rc, func_name: &String, continue_calls: i64, si: &Rc>>) -> i64 { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*body.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { - let f = expr_call_func_at(body.clone(), si.clone()); - let own = if (f.as_str() == func_name.clone().as_str()) { - 1 - } else { - 0 - }; - let arg_calls = - body.children - .clone() - .iter() - .cloned() - .fold(0, |acc: i64, child: Rc| { - let val = arg_value(&child); - match (*val.expr_data.clone()).clone() { - ExprData::ExprLambda => { - (acc.clone() - + max_path_self_calls_with_cont( - &lambda_body(val.clone()), - &func_name, - 0, - &si, - )) - } - _ => { - (acc.clone() - + max_path_self_calls_with_cont(&val, &func_name, 0, &si)) - } - } - }); - ((own + arg_calls) + continue_calls.clone()) - } - ExprData::ExprMatch => { - let scrut_calls = max_path_self_calls_with_cont( - &match_scrutinee(body.clone()), - &func_name, - 0, - &si, - ); - let max_arm = match_arm_nodes(body.clone()).iter().cloned().fold( - continue_calls.clone(), - |acc: i64, arm_node: Rc| { - let arm_calls = max_path_self_calls_with_cont( - &arm_body(&arm_node), - &func_name, - continue_calls.clone(), - &si, - ); - if (arm_calls.clone() > acc.clone()) { - arm_calls.clone() - } else { - acc.clone() - } - }, - ); - (scrut_calls + max_arm) - } - ExprData::ExprIf => { - let cond_calls = - max_path_self_calls_with_cont(&if_condition(body.clone()), &func_name, 0, &si); - let then_calls = max_path_self_calls_with_cont( - &if_then_branch(body.clone()), - &func_name, - continue_calls.clone(), - &si, - ); - let else_calls = match if_else_branch(body.clone()) { - Some(eb) => { - max_path_self_calls_with_cont(&eb, &func_name, continue_calls.clone(), &si) - } - None => continue_calls.clone(), - }; - let branch_max = if (then_calls.clone() > else_calls.clone()) { - then_calls.clone() + ExprData::ExprCall { .. } => { + let f = expr_call_func_at(body.clone(), si.clone()); +let own = if (f.as_str() == func_name.clone().as_str()) { + 1 + } else { + 0 + }; +let arg_calls = body.children.clone().iter().cloned().fold(0, |acc: i64, child: Rc| { + let val = arg_value(&child); +match (*val.expr_data.clone()).clone() { + ExprData::ExprLambda => (acc.clone() + max_path_self_calls_with_cont(&lambda_body(val.clone()), &func_name, 0, &si)), + _ => (acc.clone() + max_path_self_calls_with_cont(&val, &func_name, 0, &si)), +} +}); +((own + arg_calls) + continue_calls.clone()) +}, + ExprData::ExprMatch => { + let scrut_calls = max_path_self_calls_with_cont(&match_scrutinee(body.clone()), &func_name, 0, &si); +let max_arm = match_arm_nodes(body.clone()).iter().cloned().fold(continue_calls.clone(), |acc: i64, arm_node: Rc| { + let arm_calls = max_path_self_calls_with_cont(&arm_body(&arm_node), &func_name, continue_calls.clone(), &si); +if (arm_calls.clone() > acc.clone()) { + arm_calls.clone() } else { - else_calls.clone() - }; - (cond_calls + branch_max) - } - ExprData::ExprForEach => { - (max_path_self_calls_with_cont( - &foreach_collection(body.clone()), - &func_name, - 0, - &si, - ) + continue_calls.clone()) - } - ExprData::ExprLet => { - let val_calls = - max_path_self_calls_with_cont(&let_value(body.clone()), &func_name, 0, &si); - let body_calls = match let_body(body.clone()) { - Some(b) => { - max_path_self_calls_with_cont(&b, &func_name, continue_calls.clone(), &si) - } - None => continue_calls.clone(), - }; - (val_calls + body_calls) - } - ExprData::ExprBlock => v2_rt::reverse(body.children.clone()).iter().cloned().fold( - continue_calls.clone(), - |acc: i64, stmt: Rc| { - max_path_self_calls_with_cont(&stmt, &func_name, acc, &si) - }, - ), - ExprData::ExprMethodCall { .. } => { - let recv_calls = max_path_self_calls_with_cont( - &method_receiver(body.clone()), - &func_name, - 0, - &si, - ); - let arg_calls = method_arg_nodes(body.clone()).iter().cloned().fold( - 0, - |acc: i64, arg_node: Rc| { - let val = arg_value(&arg_node); - match (*val.expr_data.clone()).clone() { - ExprData::ExprLambda => { - (acc.clone() - + max_path_self_calls_with_cont( - &lambda_body(val.clone()), - &func_name, - 0, - &si, - )) - } - _ => { - (acc.clone() - + max_path_self_calls_with_cont(&val, &func_name, 0, &si)) - } - } - }, - ); - ((recv_calls + arg_calls) + continue_calls.clone()) - } - ExprData::ExprReturn => { - max_path_self_calls_with_cont(&return_value(body.clone()), &func_name, 0, &si) - } - _ => { - (body - .children - .clone() - .iter() - .cloned() - .fold(0, |acc: i64, child: Rc| { - (acc + max_path_self_calls_with_cont(&child, &func_name, 0, &si)) - }) - + continue_calls.clone()) - } - } + acc.clone() + } +}); +(scrut_calls + max_arm) +}, + ExprData::ExprIf => { + let cond_calls = max_path_self_calls_with_cont(&if_condition(body.clone()), &func_name, 0, &si); +let then_calls = max_path_self_calls_with_cont(&if_then_branch(body.clone()), &func_name, continue_calls.clone(), &si); +let else_calls = match if_else_branch(body.clone()) { + Some(eb) => max_path_self_calls_with_cont(&eb, &func_name, continue_calls.clone(), &si), + None => continue_calls.clone(), +}; +let branch_max = if (then_calls.clone() > else_calls.clone()) { + then_calls.clone() + } else { + else_calls.clone() + }; +(cond_calls + branch_max) +}, + ExprData::ExprForEach => (max_path_self_calls_with_cont(&foreach_collection(body.clone()), &func_name, 0, &si) + continue_calls.clone()), + ExprData::ExprLet => { + let val_calls = max_path_self_calls_with_cont(&let_value(body.clone()), &func_name, 0, &si); +let body_calls = match let_body(body.clone()) { + Some(b) => max_path_self_calls_with_cont(&b, &func_name, continue_calls.clone(), &si), + None => continue_calls.clone(), +}; +(val_calls + body_calls) +}, + ExprData::ExprBlock => v2_rt::reverse(body.children.clone()).iter().cloned().fold(continue_calls.clone(), |acc: i64, stmt: Rc| max_path_self_calls_with_cont(&stmt, &func_name, acc, &si)), + ExprData::ExprMethodCall { .. } => { + let recv_calls = max_path_self_calls_with_cont(&method_receiver(body.clone()), &func_name, 0, &si); +let arg_calls = method_arg_nodes(body.clone()).iter().cloned().fold(0, |acc: i64, arg_node: Rc| { + let val = arg_value(&arg_node); +match (*val.expr_data.clone()).clone() { + ExprData::ExprLambda => (acc.clone() + max_path_self_calls_with_cont(&lambda_body(val.clone()), &func_name, 0, &si)), + _ => (acc.clone() + max_path_self_calls_with_cont(&val, &func_name, 0, &si)), +} +}); +((recv_calls + arg_calls) + continue_calls.clone()) +}, + ExprData::ExprReturn => max_path_self_calls_with_cont(&return_value(body.clone()), &func_name, 0, &si), + _ => (body.children.clone().iter().cloned().fold(0, |acc: i64, child: Rc| (acc + max_path_self_calls_with_cont(&child, &func_name, 0, &si))) + continue_calls.clone()), +} }) } -pub fn max_path_self_calls_block( - stmts: Rc>>, - func_name: String, - continue_calls: i64, - si: Rc>>, -) -> i64 { - v2_rt::reverse(stmts) - .iter() - .cloned() - .fold(continue_calls.clone(), |acc: i64, stmt: Rc| { - max_path_self_calls_with_cont(&stmt, &func_name, acc, &si) - }) -} - -pub fn count_target_calls( - body: &Rc, - target_set: &Rc>, - si: &Rc>>, -) -> i64 { +pub fn max_path_self_calls_block(stmts: Rc>>, func_name: String, continue_calls: i64, si: Rc>>) -> i64 { + v2_rt::reverse(stmts).iter().cloned().fold(continue_calls.clone(), |acc: i64, stmt: Rc| max_path_self_calls_with_cont(&stmt, &func_name, acc, &si)) +} + +pub fn count_target_calls(body: &Rc, target_set: &Rc>, si: &Rc>>) -> i64 { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - let own = match (*body.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { + { + let own = match (*body.expr_data.clone()).clone() { + ExprData::ExprCall { .. } => { let f = expr_call_func_at(body.clone(), si.clone()); - if set_has(target_set.clone(), f) { +if set_has(target_set.clone(), f) { 1 } else { 0 } - } - _ => 0, - }; - let from_children = body - .children - .clone() - .iter() - .cloned() - .fold(0, |acc: i64, child: Rc| { - (acc + count_target_calls(&child, &target_set, &si)) - }); - (own + from_children) +}, + _ => 0, +}; +let from_children = body.children.clone().iter().cloned().fold(0, |acc: i64, child: Rc| (acc + count_target_calls(&child, &target_set, &si))); +(own + from_children) +} }) } -pub fn max_path_target_calls( - body: Rc, - target_set: Rc>, - si: Rc>>, -) -> i64 { +pub fn max_path_target_calls(body: Rc, target_set: Rc>, si: Rc>>) -> i64 { max_path_target_calls_with_cont(&body, &target_set, 0, &si) } -pub fn max_path_target_calls_with_cont( - body: &Rc, - target_set: &Rc>, - continue_calls: i64, - si: &Rc>>, -) -> i64 { +pub fn max_path_target_calls_with_cont(body: &Rc, target_set: &Rc>, continue_calls: i64, si: &Rc>>) -> i64 { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*body.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { - let f = expr_call_func_at(body.clone(), si.clone()); - let own = if set_has(target_set.clone(), f) { 1 } else { 0 }; - let arg_calls = - body.children - .clone() - .iter() - .cloned() - .fold(0, |acc: i64, child: Rc| { - (acc + max_path_target_calls_with_cont( - &arg_value(&child), - &target_set, - 0, - &si, - )) - }); - ((own + arg_calls) + continue_calls.clone()) - } - ExprData::ExprMatch => { - let scrut_calls = max_path_target_calls_with_cont( - &match_scrutinee(body.clone()), - &target_set, - 0, - &si, - ); - let max_arm = match_arm_nodes(body.clone()).iter().cloned().fold( - continue_calls.clone(), - |acc: i64, arm_node: Rc| { - let arm_calls = max_path_target_calls_with_cont( - &arm_body(&arm_node), - &target_set, - continue_calls.clone(), - &si, - ); - if (arm_calls.clone() > acc.clone()) { - arm_calls.clone() - } else { - acc.clone() - } - }, - ); - (scrut_calls + max_arm) - } - ExprData::ExprIf => { - let cond_calls = max_path_target_calls_with_cont( - &if_condition(body.clone()), - &target_set, - 0, - &si, - ); - let then_calls = max_path_target_calls_with_cont( - &if_then_branch(body.clone()), - &target_set, - continue_calls.clone(), - &si, - ); - let else_calls = match if_else_branch(body.clone()) { - Some(eb) => max_path_target_calls_with_cont( - &eb, - &target_set, - continue_calls.clone(), - &si, - ), - None => continue_calls.clone(), - }; - let branch_max = if (then_calls.clone() > else_calls.clone()) { - then_calls.clone() + ExprData::ExprCall { .. } => { + let f = expr_call_func_at(body.clone(), si.clone()); +let own = if set_has(target_set.clone(), f) { + 1 + } else { + 0 + }; +let arg_calls = body.children.clone().iter().cloned().fold(0, |acc: i64, child: Rc| (acc + max_path_target_calls_with_cont(&arg_value(&child), &target_set, 0, &si))); +((own + arg_calls) + continue_calls.clone()) +}, + ExprData::ExprMatch => { + let scrut_calls = max_path_target_calls_with_cont(&match_scrutinee(body.clone()), &target_set, 0, &si); +let max_arm = match_arm_nodes(body.clone()).iter().cloned().fold(continue_calls.clone(), |acc: i64, arm_node: Rc| { + let arm_calls = max_path_target_calls_with_cont(&arm_body(&arm_node), &target_set, continue_calls.clone(), &si); +if (arm_calls.clone() > acc.clone()) { + arm_calls.clone() } else { - else_calls.clone() - }; - (cond_calls + branch_max) - } - ExprData::ExprForEach => { - (max_path_target_calls_with_cont( - &foreach_collection(body.clone()), - &target_set, - 0, - &si, - ) + continue_calls.clone()) - } - ExprData::ExprLet => { - let val_calls = - max_path_target_calls_with_cont(&let_value(body.clone()), &target_set, 0, &si); - let body_calls = match let_body(body.clone()) { - Some(b) => max_path_target_calls_with_cont( - &b, - &target_set, - continue_calls.clone(), - &si, - ), - None => continue_calls.clone(), - }; - (val_calls + body_calls) - } - ExprData::ExprBlock => v2_rt::reverse(body.children.clone()).iter().cloned().fold( - continue_calls.clone(), - |acc: i64, stmt: Rc| { - max_path_target_calls_with_cont(&stmt, &target_set, acc, &si) - }, - ), - ExprData::ExprMethodCall { .. } => { - let recv_calls = max_path_target_calls_with_cont( - &method_receiver(body.clone()), - &target_set, - 0, - &si, - ); - let arg_calls = method_arg_nodes(body.clone()).iter().cloned().fold( - 0, - |acc: i64, arg_node: Rc| { - let val = arg_value(&arg_node); - match (*val.expr_data.clone()).clone() { - ExprData::ExprLambda => { - (acc.clone() - + max_path_target_calls_with_cont( - &lambda_body(val.clone()), - &target_set, - 0, - &si, - )) - } - _ => { - (acc.clone() - + max_path_target_calls_with_cont(&val, &target_set, 0, &si)) - } - } - }, - ); - ((recv_calls + arg_calls) + continue_calls.clone()) - } - ExprData::ExprReturn => { - max_path_target_calls_with_cont(&return_value(body.clone()), &target_set, 0, &si) - } - _ => body.children.clone().iter().cloned().fold( - continue_calls.clone(), - |acc: i64, child: Rc| { - (acc + max_path_target_calls_with_cont(&child, &target_set, 0, &si)) - }, - ), - } + acc.clone() + } +}); +(scrut_calls + max_arm) +}, + ExprData::ExprIf => { + let cond_calls = max_path_target_calls_with_cont(&if_condition(body.clone()), &target_set, 0, &si); +let then_calls = max_path_target_calls_with_cont(&if_then_branch(body.clone()), &target_set, continue_calls.clone(), &si); +let else_calls = match if_else_branch(body.clone()) { + Some(eb) => max_path_target_calls_with_cont(&eb, &target_set, continue_calls.clone(), &si), + None => continue_calls.clone(), +}; +let branch_max = if (then_calls.clone() > else_calls.clone()) { + then_calls.clone() + } else { + else_calls.clone() + }; +(cond_calls + branch_max) +}, + ExprData::ExprForEach => (max_path_target_calls_with_cont(&foreach_collection(body.clone()), &target_set, 0, &si) + continue_calls.clone()), + ExprData::ExprLet => { + let val_calls = max_path_target_calls_with_cont(&let_value(body.clone()), &target_set, 0, &si); +let body_calls = match let_body(body.clone()) { + Some(b) => max_path_target_calls_with_cont(&b, &target_set, continue_calls.clone(), &si), + None => continue_calls.clone(), +}; +(val_calls + body_calls) +}, + ExprData::ExprBlock => v2_rt::reverse(body.children.clone()).iter().cloned().fold(continue_calls.clone(), |acc: i64, stmt: Rc| max_path_target_calls_with_cont(&stmt, &target_set, acc, &si)), + ExprData::ExprMethodCall { .. } => { + let recv_calls = max_path_target_calls_with_cont(&method_receiver(body.clone()), &target_set, 0, &si); +let arg_calls = method_arg_nodes(body.clone()).iter().cloned().fold(0, |acc: i64, arg_node: Rc| { + let val = arg_value(&arg_node); +match (*val.expr_data.clone()).clone() { + ExprData::ExprLambda => (acc.clone() + max_path_target_calls_with_cont(&lambda_body(val.clone()), &target_set, 0, &si)), + _ => (acc.clone() + max_path_target_calls_with_cont(&val, &target_set, 0, &si)), +} +}); +((recv_calls + arg_calls) + continue_calls.clone()) +}, + ExprData::ExprReturn => max_path_target_calls_with_cont(&return_value(body.clone()), &target_set, 0, &si), + _ => body.children.clone().iter().cloned().fold(continue_calls.clone(), |acc: i64, child: Rc| (acc + max_path_target_calls_with_cont(&child, &target_set, 0, &si))), +} }) } -pub fn build_scc_measure_params( - members: Rc>, - func_index: Rc>>, - si: Rc>>, -) -> Rc>>> { - members.iter().cloned().fold( - v2_rt::rc_empty_map::>>(), - |acc: Rc>>>, name: String| match v2_rt::map_get( - &func_index, - name.clone(), - ) { - Some(entry) => v2_rt::rc_map_insert( - acc.clone(), - name.clone(), - recursive_measure_param_names(&entry.body.clone(), &entry.params.clone(), &si), - ), - None => acc.clone(), - }, - ) +pub fn build_scc_measure_params(members: Rc>, func_index: Rc>>, si: Rc>>) -> Rc>>> { + members.iter().cloned().fold(v2_rt::rc_empty_map::>>(), |acc: Rc>>>, name: String| match v2_rt::map_get(&func_index, name.clone()) { + Some(entry) => v2_rt::rc_map_insert(acc.clone(), name.clone(), recursive_measure_param_names(&entry.body.clone(), &entry.params.clone(), &si)), + None => acc.clone(), +}) } -pub fn target_call_has_arithmetic_descent( - call_node: &Rc, - target_set: &Rc>, - func_index: Rc>>, - scc_measure_params: Rc>>>, - si: &Rc>>, -) -> bool { +pub fn target_call_has_arithmetic_descent(call_node: &Rc, target_set: &Rc>, func_index: Rc>>, scc_measure_params: Rc>>>, si: &Rc>>) -> bool { { let callee = expr_call_func_at(call_node.clone(), si.clone()); - if (set_has(target_set.clone(), callee.clone()) == false) { +if (set_has(target_set.clone(), callee.clone()) == false) { true } else { match v2_rt::map_get(&func_index, callee.clone()) { - Some(callee_entry) => { - let callee_measure_params = - match v2_rt::map_get(&scc_measure_params, callee.clone()) { - Some(params) => params.clone(), - None => v2_rt::rc_empty_map::(), - }; - { - let mut __found = false; - for pair in Rc::new( - call_node - .children - .clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - { - if { - let arg_expr = arg_value(&pair.1.clone()); - (((max_path_target_calls( - arg_expr.clone(), - target_set.clone(), - si.clone(), - ) == 0) - && is_descending_expr(&arg_expr)) - && match recursive_param_name_for_arg( - pair.0.clone(), - pair.1.clone(), - callee_entry.params.clone(), - &si, - ) { - Some(param_name) => { - (v2_rt::map_get( - &callee_measure_params, - param_name.clone(), - ) != None) - } - None => false, - }) - } { - __found = true; - break; - } - } - __found - } - } - None => false, - } + Some(callee_entry) => { + let callee_measure_params = match v2_rt::map_get(&scc_measure_params, callee.clone()) { + Some(params) => params.clone(), + None => v2_rt::rc_empty_map::(), +}; +{ let mut __found = false; for pair in Rc::new(call_node.children.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { if { + let arg_expr = arg_value(&pair.1.clone()); +(((max_path_target_calls(arg_expr.clone(), target_set.clone(), si.clone()) == 0) && is_descending_expr(&arg_expr)) && match recursive_param_name_for_arg(pair.0.clone(), pair.1.clone(), callee_entry.params.clone(), &si) { + Some(param_name) => (v2_rt::map_get(&callee_measure_params, param_name.clone()) != None), + None => false, +}) +} { __found = true; break; } } __found } +}, + None => false, +} } - } +} } -pub fn scc_calls_have_arithmetic_descent( - body: &Rc, - target_set: &Rc>, - func_index: &Rc>>, - scc_measure_params: &Rc>>>, - si: &Rc>>, -) -> bool { +pub fn scc_calls_have_arithmetic_descent(body: &Rc, target_set: &Rc>, func_index: &Rc>>, scc_measure_params: &Rc>>>, si: &Rc>>) -> bool { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*body.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { - (target_call_has_arithmetic_descent( - &body, - &target_set, - func_index.clone(), - scc_measure_params.clone(), - &si, - ) && { - let mut __all = true; - for child in body.children.clone().iter().cloned() { - if !(scc_calls_have_arithmetic_descent( - &child, - &target_set, - &func_index, - &scc_measure_params, - &si, - )) { - __all = false; - break; - } - } - __all - }) - } - _ => { - let mut __all = true; - for child in body.children.clone().iter().cloned() { - if !(scc_calls_have_arithmetic_descent( - &child, - &target_set, - &func_index, - &scc_measure_params, - &si, - )) { - __all = false; - break; - } - } - __all - } - } + ExprData::ExprCall { .. } => (target_call_has_arithmetic_descent(&body, &target_set, func_index.clone(), scc_measure_params.clone(), &si) && { let mut __all = true; for child in body.children.clone().iter().cloned() { if !(scc_calls_have_arithmetic_descent(&child, &target_set, &func_index, &scc_measure_params, &si)) { __all = false; break; } } __all }), + _ => { let mut __all = true; for child in body.children.clone().iter().cloned() { if !(scc_calls_have_arithmetic_descent(&child, &target_set, &func_index, &scc_measure_params, &si)) { __all = false; break; } } __all }, +} }) } -pub fn descending_name_set_without_key( - names: &Rc>, - key: String, -) -> Rc> { - Rc::new(v2_rt::map_keys(&names)).iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, name: String| { - if (name.clone().as_str() == key.clone().as_str()) { - acc.clone() - } else { - match v2_rt::map_get(&names, name.clone()) { - Some(source) => v2_rt::rc_map_insert(acc.clone(), name.clone(), source.clone()), - None => acc.clone(), - } - } - }, - ) +pub fn descending_name_set_without_key(names: &Rc>, key: String) -> Rc> { + Rc::new(v2_rt::map_keys(&names)).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, name: String| if (name.clone().as_str() == key.clone().as_str()) { + acc.clone() + } else { + match v2_rt::map_get(&names, name.clone()) { + Some(source) => v2_rt::rc_map_insert(acc.clone(), name.clone(), source.clone()), + None => acc.clone(), +} + }) } -pub fn expr_descending_witness_source( - mut expr: Rc, - mut descending_witness_names: Rc>, - mut si: Rc>>, -) -> Option { +pub fn expr_descending_witness_source(mut expr: Rc, mut descending_witness_names: Rc>, mut si: Rc>>) -> Option { loop { match (*expr.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - break v2_rt::map_get( - &descending_witness_names, - expr_var_name_at(expr.clone(), si), - ); - } - ExprData::ExprBinOp { op, .. } => match op.clone() { - BinOp::Sub => { - let __tco_0 = binop_left(expr); - expr = __tco_0; - continue; - } - BinOp::Div => { - let __tco_0 = binop_left(expr); - expr = __tco_0; - continue; - } - _ => { - break None; - } - }, - _ => { - break None; - } - } - } -} - -pub fn condition_param_names( - expr: &Rc, - param_set: Rc>, - si: Rc>>, -) -> Rc> { + ExprData::ExprVar { .. } => { break v2_rt::map_get(&descending_witness_names, expr_var_name_at(expr.clone(), si)); }, + ExprData::ExprBinOp { op, .. } => { match op.clone() { + BinOp::Sub => { { + let __tco_0 = binop_left(expr); +expr = __tco_0; +continue; +} }, + BinOp::Div => { { + let __tco_0 = binop_left(expr); +expr = __tco_0; +continue; +} }, + _ => { break None; }, +} }, + _ => { break None; }, +} +} +} + +pub fn condition_param_names(expr: &Rc, param_set: Rc>, si: Rc>>) -> Rc> { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*expr.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let name = expr_var_name_at(expr.clone(), si.clone()); - match v2_rt::map_get(¶m_set, name.clone()) { - Some(_) => seed_string_map(name.clone(), name.clone()), - None => v2_rt::rc_empty_map::(), - } - } - _ => expr.children.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, child: Rc| { - v2_rt::rc_map_merge( - acc, - condition_param_names(&child, param_set.clone(), si.clone()), - ) - }, - ), - } + ExprData::ExprVar { .. } => { + let name = expr_var_name_at(expr.clone(), si.clone()); +match v2_rt::map_get(¶m_set, name.clone()) { + Some(_) => seed_string_map(name.clone(), name.clone()), + None => v2_rt::rc_empty_map::(), +} +}, + _ => expr.children.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, child: Rc| v2_rt::rc_map_merge(acc, condition_param_names(&child, param_set.clone(), si.clone()))), +} }) } -pub fn recursive_measure_param_names( - body: &Rc, - params: &Rc>>, - si: &Rc>>, -) -> Rc> { +pub fn recursive_measure_param_names(body: &Rc, params: &Rc>>, si: &Rc>>) -> Rc> { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - let param_set = params.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, param: Rc| { - v2_rt::rc_map_insert( - acc, - param_node_name_at(param.clone(), si.clone()), - param_node_name_at(param.clone(), si.clone()), - ) - }, - ); - match (*body.expr_data.clone()).clone() { - ExprData::ExprIf => { - let then_names = - recursive_measure_param_names(&if_then_branch(body.clone()), ¶ms, &si); - let else_names = match if_else_branch(body.clone()) { - Some(eb) => recursive_measure_param_names(&eb, ¶ms, &si), - None => v2_rt::rc_empty_map::(), - }; - v2_rt::rc_map_merge( - v2_rt::rc_map_merge( - condition_param_names(&if_condition(body.clone()), param_set, si.clone()), - then_names, - ), - else_names, - ) - } - ExprData::ExprMatch => { - let scrut_names = - condition_param_names(&match_scrutinee(body.clone()), param_set, si.clone()); - let arm_names = match_arm_nodes(body.clone()).iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, arm_node: Rc| { - v2_rt::rc_map_merge( - acc, - recursive_measure_param_names(&arm_body(&arm_node), ¶ms, &si), - ) - }, - ); - v2_rt::rc_map_merge(scrut_names, arm_names) - } - ExprData::ExprLet => match let_body(body.clone()) { - Some(b) => recursive_measure_param_names(&b, ¶ms, &si), - None => v2_rt::rc_empty_map::(), - }, - ExprData::ExprBlock => body.children.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, stmt: Rc| { - v2_rt::rc_map_merge(acc, recursive_measure_param_names(&stmt, ¶ms, &si)) - }, - ), - _ => body.children.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, child: Rc| { - v2_rt::rc_map_merge(acc, recursive_measure_param_names(&child, ¶ms, &si)) - }, - ), - } + { + let param_set = params.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, param: Rc| v2_rt::rc_map_insert(acc, param_node_name_at(param.clone(), si.clone()), param_node_name_at(param.clone(), si.clone()))); +match (*body.expr_data.clone()).clone() { + ExprData::ExprIf => { + let then_names = recursive_measure_param_names(&if_then_branch(body.clone()), ¶ms, &si); +let else_names = match if_else_branch(body.clone()) { + Some(eb) => recursive_measure_param_names(&eb, ¶ms, &si), + None => v2_rt::rc_empty_map::(), +}; +v2_rt::rc_map_merge(v2_rt::rc_map_merge(condition_param_names(&if_condition(body.clone()), param_set, si.clone()), then_names), else_names) +}, + ExprData::ExprMatch => { + let scrut_names = condition_param_names(&match_scrutinee(body.clone()), param_set, si.clone()); +let arm_names = match_arm_nodes(body.clone()).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, arm_node: Rc| v2_rt::rc_map_merge(acc, recursive_measure_param_names(&arm_body(&arm_node), ¶ms, &si))); +v2_rt::rc_map_merge(scrut_names, arm_names) +}, + ExprData::ExprLet => match let_body(body.clone()) { + Some(b) => recursive_measure_param_names(&b, ¶ms, &si), + None => v2_rt::rc_empty_map::(), +}, + ExprData::ExprBlock => body.children.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, stmt: Rc| v2_rt::rc_map_merge(acc, recursive_measure_param_names(&stmt, ¶ms, &si))), + _ => body.children.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, child: Rc| v2_rt::rc_map_merge(acc, recursive_measure_param_names(&child, ¶ms, &si))), +} +} }) } -pub fn recursive_param_name_for_arg( - idx: i64, - arg_node: Rc, - params: Rc>>, - si: &Rc>>, -) -> Option { +pub fn recursive_param_name_for_arg(idx: i64, arg_node: Rc, params: Rc>>, si: &Rc>>) -> Option { match arg_name_at(arg_node, si.clone()) { - Some(name) => Some(name.clone()), - None => Rc::new({ - let mut __result = Vec::new(); - for pair in Rc::new({ - let mut __result = Vec::new(); - for pair in Rc::new( - params - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - { - if (pair.0.clone() == idx.clone()) { - __result.push(pair); - } - } - __result - }) - .iter() - .cloned() - { - __result.push(param_node_name_at(pair.1.clone(), si.clone())); - } - __result - }) - .first() - .cloned(), - } + Some(name) => Some(name.clone()), + None => Rc::new({ let mut __result = Vec::new(); for pair in Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(params.iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { if (pair.0.clone() == idx.clone()) { __result.push(pair); } } __result }).iter().cloned() { __result.push(param_node_name_at(pair.1.clone(), si.clone())); } __result }).first().cloned(), +} } pub fn is_descending_expr(expr: &Rc) -> bool { match (*expr.expr_data.clone()).clone() { - ExprData::ExprBinOp { op, .. } => match op.clone() { - BinOp::Sub => match (*binop_left(expr.clone()).expr_data.clone()).clone() { - ExprData::ExprVar { .. } => true, - _ => false, - }, - BinOp::Div => match (*binop_left(expr.clone()).expr_data.clone()).clone() { - ExprData::ExprVar { .. } => true, - _ => false, - }, - _ => false, - }, - _ => false, - } + ExprData::ExprBinOp { op, .. } => match op.clone() { + BinOp::Sub => match (*binop_left(expr.clone()).expr_data.clone()).clone() { + ExprData::ExprVar { .. } => true, + _ => false, +}, + BinOp::Div => match (*binop_left(expr.clone()).expr_data.clone()).clone() { + ExprData::ExprVar { .. } => true, + _ => false, +}, + _ => false, +}, + _ => false, +} } -pub fn has_arithmetic_descent( - body: &Rc, - func_name: &String, - si: &Rc>>, -) -> bool { +pub fn has_arithmetic_descent(body: &Rc, func_name: &String, si: &Rc>>) -> bool { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*body.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { - let own_ok = if (expr_call_func_at(body.clone(), si.clone()).as_str() - == func_name.clone().as_str()) - { - { - let mut __found = false; - for arg_node in body.children.clone().iter().cloned() { - if is_descending_expr(&arg_value(&arg_node)) { - __found = true; - break; - } - } - __found - } - } else { - false - }; - if own_ok { - true - } else { - { - let mut __found = false; - for c in body.children.clone().iter().cloned() { - if has_arithmetic_descent(&c, &func_name, &si) { - __found = true; - break; - } - } - __found - } - } - } - _ => { - let mut __found = false; - for c in body.children.clone().iter().cloned() { - if has_arithmetic_descent(&c, &func_name, &si) { - __found = true; - break; - } - } - __found + ExprData::ExprCall { .. } => { + let own_ok = if (expr_call_func_at(body.clone(), si.clone()).as_str() == func_name.clone().as_str()) { + { let mut __found = false; for arg_node in body.children.clone().iter().cloned() { if is_descending_expr(&arg_value(&arg_node)) { __found = true; break; } } __found } + } else { + false + }; +if own_ok { + true + } else { + { let mut __found = false; for c in body.children.clone().iter().cloned() { if has_arithmetic_descent(&c, &func_name, &si) { __found = true; break; } } __found } } - } +}, + _ => { let mut __found = false; for c in body.children.clone().iter().cloned() { if has_arithmetic_descent(&c, &func_name, &si) { __found = true; break; } } __found }, +} }) } -pub fn is_accessor_of_param( - expr: &Rc, - param_name: String, - vars: Rc>, - si: &Rc>>, -) -> bool { +pub fn is_accessor_of_param(expr: &Rc, param_name: String, vars: Rc>, si: &Rc>>) -> bool { match (*expr.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { - let callee = expr_call_func_at(expr.clone(), si.clone()); - (is_child_accessor_in_model(callee) && { - let mut __found = false; - for arg_node in expr.children.clone().iter().cloned() { - if match (*arg_value(&arg_node).expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let vname = expr_var_name_at(arg_value(&arg_node), si.clone()); - ((vname.clone().as_str() == param_name.clone().as_str()) - || set_has(vars.clone(), vname.clone())) - } - _ => false, - } { - __found = true; - break; - } - } - __found - }) - } - _ => false, - } + ExprData::ExprCall { .. } => { + let callee = expr_call_func_at(expr.clone(), si.clone()); +(is_child_accessor_in_model(callee) && { let mut __found = false; for arg_node in expr.children.clone().iter().cloned() { if match (*arg_value(&arg_node).expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let vname = expr_var_name_at(arg_value(&arg_node), si.clone()); +((vname.clone().as_str() == param_name.clone().as_str()) || set_has(vars.clone(), vname.clone())) +}, + _ => false, +} { __found = true; break; } } __found }) +}, + _ => false, +} } -pub fn is_children_of_param( - mut expr: Rc, - mut param_name: String, - mut vars: Rc>, - mut si: Rc>>, -) -> bool { +pub fn is_children_of_param(mut expr: Rc, mut param_name: String, mut vars: Rc>, mut si: Rc>>) -> bool { loop { match (*expr.expr_data.clone()).clone() { - ExprData::ExprFieldAccess { .. } => { - let base = field_access_base(expr.clone()); - let field = field_access_field_at(expr.clone(), si.clone()); - break (is_children_list_field(field) - && match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - (expr_var_name_at(base.clone(), si.clone()).as_str() - == param_name.as_str()) - } - _ => false, - }); - } - ExprData::ExprVar { .. } => { - break set_has(vars, expr_var_name_at(expr.clone(), si.clone())); - } - ExprData::ExprMethodCall { - method_semantics: ms, - .. - } => match method_size_effect(ms.clone()) { - Some(CollectionSizeEffect::ShrinkEffect) => { - let __tco_0 = method_receiver(expr); - expr = __tco_0; - continue; - } - _ => { - break false; - } - }, - _ => { - break false; - } - } - } + ExprData::ExprFieldAccess { .. } => { let base = field_access_base(expr.clone()); +let field = field_access_field_at(expr.clone(), si.clone()); +break (is_children_list_field(field) && match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => (expr_var_name_at(base.clone(), si.clone()).as_str() == param_name.as_str()), + _ => false, +}); }, + ExprData::ExprVar { .. } => { break set_has(vars, expr_var_name_at(expr.clone(), si.clone())); }, + ExprData::ExprMethodCall { method_semantics: ms, .. } => { match method_size_effect(ms.clone()) { + Some(CollectionSizeEffect::ShrinkEffect) => { { + let __tco_0 = method_receiver(expr); +expr = __tco_0; +continue; +} }, + _ => { break false; }, +} }, + _ => { break false; }, +} +} } -pub fn is_structural_children( - expr: &Rc, - param_name: &String, - vars: &Rc>, - si: &Rc>>, -) -> bool { +pub fn is_structural_children(expr: &Rc, param_name: &String, vars: &Rc>, si: &Rc>>) -> bool { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - (is_children_of_param(expr.clone(), param_name.clone(), vars.clone(), si.clone()) - || match (*expr.expr_data.clone()).clone() { - ExprData::ExprFieldAccess { .. } => { - let base = field_access_base(expr.clone()); - let field = field_access_field_at(expr.clone(), si.clone()); - (is_children_list_field(field) - && match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - set_has(vars.clone(), expr_var_name_at(base.clone(), si.clone())) - } - _ => false, - }) - } - ExprData::ExprMethodCall { - method_semantics: ms, - .. - } => match method_size_effect(ms.clone()) { - Some(CollectionSizeEffect::ShrinkEffect) => is_structural_children( - &method_receiver(expr.clone()), - ¶m_name, - &vars, - &si, - ), - Some(CollectionSizeEffect::IdentityEffect) => is_structural_children( - &method_receiver(expr.clone()), - ¶m_name, - &vars, - &si, - ), - _ => false, - }, - _ => false, - }) + (is_children_of_param(expr.clone(), param_name.clone(), vars.clone(), si.clone()) || match (*expr.expr_data.clone()).clone() { + ExprData::ExprFieldAccess { .. } => { + let base = field_access_base(expr.clone()); +let field = field_access_field_at(expr.clone(), si.clone()); +(is_children_list_field(field) && match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => set_has(vars.clone(), expr_var_name_at(base.clone(), si.clone())), + _ => false, +}) +}, + ExprData::ExprMethodCall { method_semantics: ms, .. } => match method_size_effect(ms.clone()) { + Some(CollectionSizeEffect::ShrinkEffect) => is_structural_children(&method_receiver(expr.clone()), ¶m_name, &vars, &si), + Some(CollectionSizeEffect::IdentityEffect) => is_structural_children(&method_receiver(expr.clone()), ¶m_name, &vars, &si), + _ => false, +}, + _ => false, +}) }) } -pub fn is_child_descent_expr( - expr: &Rc, - param_name: &String, - vars: &Rc>, - si: &Rc>>, -) -> bool { +pub fn is_child_descent_expr(expr: &Rc, param_name: &String, vars: &Rc>, si: &Rc>>) -> bool { if is_accessor_of_param(&expr, param_name.clone(), vars.clone(), &si) { true } else { match (*expr.expr_data.clone()).clone() { - ExprData::ExprMethodCall { - method_semantics: ms, - .. - } => match method_size_effect(ms.clone()) { - Some(CollectionSizeEffect::ProjectionEffect) => is_children_of_param( - method_receiver(expr.clone()), - param_name.clone(), - vars.clone(), - si.clone(), - ), - _ => false, - }, - _ => false, - } + ExprData::ExprMethodCall { method_semantics: ms, .. } => match method_size_effect(ms.clone()) { + Some(CollectionSizeEffect::ProjectionEffect) => is_children_of_param(method_receiver(expr.clone()), param_name.clone(), vars.clone(), si.clone()), + _ => false, +}, + _ => false, +} } } -pub fn is_tree_size_preserving_wrapper( - expr: &Rc, - si: Rc>>, -) -> bool { +pub fn is_tree_size_preserving_wrapper(expr: &Rc, si: Rc>>) -> bool { match (*expr.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { - let callee = expr_call_func_at(expr.clone(), si); - is_tree_size_preserving(callee) - } - _ => false, - } + ExprData::ExprCall { .. } => { + let callee = expr_call_func_at(expr.clone(), si); +is_tree_size_preserving(callee) +}, + _ => false, +} } pub fn wrapper_inner_arg(expr: Rc) -> Rc { match expr.children.clone().first().cloned() { - Some(arg_node) => arg_value(&arg_node), - None => expr.clone(), - } + Some(arg_node) => arg_value(&arg_node), + None => expr.clone(), +} } pub fn is_sub_value_extractor(expr: &Rc, si: Rc>>) -> bool { match (*expr.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { - let callee = expr_call_func_at(expr.clone(), si); - is_tree_size_reducing(callee) - } - _ => false, - } + ExprData::ExprCall { .. } => { + let callee = expr_call_func_at(expr.clone(), si); +is_tree_size_reducing(callee) +}, + _ => false, +} } pub fn extractor_inner_arg(expr: Rc) -> Rc { match expr.children.clone().first().cloned() { - Some(arg_node) => arg_value(&arg_node), - None => expr.clone(), - } + Some(arg_node) => arg_value(&arg_node), + None => expr.clone(), +} } -pub fn is_list_shrink_expr( - expr: &Rc, - param_name: String, - si: Rc>>, -) -> bool { +pub fn is_list_shrink_expr(expr: &Rc, param_name: String, si: Rc>>) -> bool { match (*expr.expr_data.clone()).clone() { - ExprData::ExprMethodCall { - method_semantics: ms, - .. - } => { - let is_shrink = match method_size_effect(ms.clone()) { - Some(CollectionSizeEffect::ShrinkEffect) => true, - _ => false, - }; - ((is_shrink - && match (*method_receiver(expr.clone()).expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - (expr_var_name_at(method_receiver(expr.clone()), si).as_str() - == param_name.as_str()) - } - _ => false, - }) - && match method_arg_nodes(expr.clone()).first().cloned() { - Some(arg_node) => match (*arg_value(&arg_node).expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { - let LiteralValue::LitInt { value: n, .. } = value.as_ref() else { - unreachable!() - }; - (n.clone() > 0) - } - _ => false, - }, - None => false, - }) - } - _ => false, - } + ExprData::ExprMethodCall { method_semantics: ms, .. } => { + let is_shrink = match method_size_effect(ms.clone()) { + Some(CollectionSizeEffect::ShrinkEffect) => true, + _ => false, +}; +((is_shrink && match (*method_receiver(expr.clone()).expr_data.clone()).clone() { + ExprData::ExprVar { .. } => (expr_var_name_at(method_receiver(expr.clone()), si).as_str() == param_name.as_str()), + _ => false, +}) && match method_arg_nodes(expr.clone()).first().cloned() { + Some(arg_node) => match (*arg_value(&arg_node).expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitInt { value: n, .. } = value.as_ref() else { unreachable!() }; (n.clone() > 0) }, + _ => false, +}, + None => false, +}) +}, + _ => false, +} } pub fn is_generalized_shrink(expr: &Rc, si: Rc>>) -> bool { match (*expr.expr_data.clone()).clone() { - ExprData::ExprMethodCall { - method_semantics: ms, - .. - } => { - let is_shrink = match method_size_effect(ms.clone()) { - Some(CollectionSizeEffect::ShrinkEffect) => true, - _ => false, - }; - (is_shrink - && match method_arg_nodes(expr.clone()).first().cloned() { - Some(arg_node) => match (*arg_value(&arg_node).expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { - let LiteralValue::LitInt { value: n, .. } = value.as_ref() else { - unreachable!() - }; - (n.clone() > 0) - } - _ => false, - }, - None => false, - }) - } - _ => false, - } + ExprData::ExprMethodCall { method_semantics: ms, .. } => { + let is_shrink = match method_size_effect(ms.clone()) { + Some(CollectionSizeEffect::ShrinkEffect) => true, + _ => false, +}; +(is_shrink && match method_arg_nodes(expr.clone()).first().cloned() { + Some(arg_node) => match (*arg_value(&arg_node).expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitInt { value: n, .. } = value.as_ref() else { unreachable!() }; (n.clone() > 0) }, + _ => false, +}, + None => false, +}) +}, + _ => false, +} } -pub fn list_passthrough_inner( - expr: Rc, - si: Rc>>, -) -> Option> { +pub fn list_passthrough_inner(expr: Rc, si: Rc>>) -> Option> { parser_passthrough_state_expr(&expr, &si) } @@ -2795,2789 +1384,1370 @@ pub fn is_list_passthrough_call(expr: Rc, si: Rc, - si: Rc>>, -) -> Option> { +pub fn list_passthrough_inner_arg(expr: Rc, si: Rc>>) -> Option> { list_passthrough_inner(expr, si) } -pub fn is_tokens_consuming_call( - expr: &Rc, - param_name: String, - vars: Rc>, - si: &Rc>>, -) -> bool { +pub fn is_tokens_consuming_call(expr: &Rc, param_name: String, vars: Rc>, si: &Rc>>) -> bool { match (*expr.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => match consuming_tokens_arg(expr.clone(), si.clone()) { - Some(tokens_arg) => { - is_tokens_input_expr(tokens_arg.clone(), param_name, vars, si.clone()) - } - None => false, - }, - _ => false, - } + ExprData::ExprCall { .. } => match consuming_tokens_arg(expr.clone(), si.clone()) { + Some(tokens_arg) => is_tokens_input_expr(tokens_arg.clone(), param_name, vars, si.clone()), + None => false, +}, + _ => false, +} } -pub fn consuming_tokens_arg( - expr: Rc, - si: Rc>>, -) -> Option> { - expr.children - .clone() - .iter() - .cloned() - .fold(None, |acc: _, child: Rc| match acc.clone() { - Some(_) => acc.clone(), - None => match arg_name_at(child.clone(), si.clone()) { - Some(name) => { - if (name.clone().as_str() == "tokens".to_string().as_str()) { - Some(arg_value(&child)) - } else { - None - } - } - None => None, - }, - }) +pub fn consuming_tokens_arg(expr: Rc, si: Rc>>) -> Option> { + expr.children.clone().iter().cloned().fold(None, |acc: _, child: Rc| match acc.clone() { + Some(_) => acc.clone(), + None => match arg_name_at(child.clone(), si.clone()) { + Some(name) => if (name.clone().as_str() == "tokens".to_string().as_str()) { + Some(arg_value(&child)) + } else { + None + }, + None => None, +}, +}) } -pub fn is_tokens_input_expr( - mut expr: Rc, - mut param_name: String, - mut vars: Rc>, - mut si: Rc>>, -) -> bool { +pub fn is_tokens_input_expr(mut expr: Rc, mut param_name: String, mut vars: Rc>, mut si: Rc>>) -> bool { loop { match (*expr.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let vname = expr_var_name_at(expr.clone(), si.clone()); - break ((vname.clone().as_str() == param_name.clone().as_str()) - || set_has(vars, vname.clone())); - } - ExprData::ExprFieldAccess { .. } => { - let field = field_access_field_at(expr.clone(), si.clone()); - if (field.as_str() == param_name.clone().as_str()) { - break true; - } else { - let base = field_access_base(expr.clone()); - match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let bname = expr_var_name_at(base.clone(), si.clone()); - break ((bname.clone().as_str() == param_name.clone().as_str()) - || set_has(vars, bname.clone())); - } - _ => { - break false; - } - } - } - } - ExprData::ExprMethodCall { - method_semantics: ms, - .. - } => match method_size_effect(ms.clone()) { - Some(CollectionSizeEffect::ShrinkEffect) => { - let __tco_0 = method_receiver(expr); - expr = __tco_0; - continue; - } - _ => { - break false; - } - }, - ExprData::ExprCall { .. } => { - if is_list_passthrough_call(expr.clone(), si.clone()) { - match list_passthrough_inner_arg(expr.clone(), si.clone()) { - Some(inner) => { - let __tco_0 = inner.clone(); - expr = __tco_0; - continue; - } - None => { - break false; - } - } - } else { - match consuming_tokens_arg(expr.clone(), si.clone()) { - Some(tokens_arg) => { - let __tco_0 = tokens_arg.clone(); - expr = __tco_0; - continue; - } - None => { - break false; - } - } - } - } - _ => { - break false; - } - } - } -} - -pub fn is_descent_arg( - expr: &Rc, - param_name: &String, - descent_vars: Rc>, - check_child: bool, - check_list: bool, - si: &Rc>>, -) -> bool { + ExprData::ExprVar { .. } => { let vname = expr_var_name_at(expr.clone(), si.clone()); +break ((vname.clone().as_str() == param_name.clone().as_str()) || set_has(vars, vname.clone())); }, + ExprData::ExprFieldAccess { .. } => { let field = field_access_field_at(expr.clone(), si.clone()); +if (field.as_str() == param_name.clone().as_str()) { + break true; +} else { + let base = field_access_base(expr.clone()); +match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { let bname = expr_var_name_at(base.clone(), si.clone()); +break ((bname.clone().as_str() == param_name.clone().as_str()) || set_has(vars, bname.clone())); }, + _ => { break false; }, +} +} }, + ExprData::ExprMethodCall { method_semantics: ms, .. } => { match method_size_effect(ms.clone()) { + Some(CollectionSizeEffect::ShrinkEffect) => { { + let __tco_0 = method_receiver(expr); +expr = __tco_0; +continue; +} }, + _ => { break false; }, +} }, + ExprData::ExprCall { .. } => { if is_list_passthrough_call(expr.clone(), si.clone()) { + match list_passthrough_inner_arg(expr.clone(), si.clone()) { + Some(inner) => { { + let __tco_0 = inner.clone(); +expr = __tco_0; +continue; +} }, + None => { break false; }, +} +} else { + match consuming_tokens_arg(expr.clone(), si.clone()) { + Some(tokens_arg) => { { + let __tco_0 = tokens_arg.clone(); +expr = __tco_0; +continue; +} }, + None => { break false; }, +} +} }, + _ => { break false; }, +} +} +} + +pub fn is_descent_arg(expr: &Rc, param_name: &String, descent_vars: Rc>, check_child: bool, check_list: bool, si: &Rc>>) -> bool { match (*expr.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let vname = expr_var_name_at(expr.clone(), si.clone()); - set_has(descent_vars, vname) - } - _ => { - ((check_child && is_child_descent_expr(&expr, ¶m_name, &descent_vars, &si)) - || (check_list && is_list_shrink_expr(&expr, param_name.clone(), si.clone()))) - } - } + ExprData::ExprVar { .. } => { + let vname = expr_var_name_at(expr.clone(), si.clone()); +set_has(descent_vars, vname) +}, + _ => ((check_child && is_child_descent_expr(&expr, ¶m_name, &descent_vars, &si)) || (check_list && is_list_shrink_expr(&expr, param_name.clone(), si.clone()))), +} } -pub fn expr_contains_descent( - expr: &Rc, - param_name: &String, - vars: &Rc>, - check_child: bool, - check_list: bool, - si: &Rc>>, -) -> bool { +pub fn expr_contains_descent(expr: &Rc, param_name: &String, vars: &Rc>, check_child: bool, check_list: bool, si: &Rc>>) -> bool { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - if ((check_child.clone() && is_child_descent_expr(&expr, ¶m_name, &vars, &si)) - || (check_list.clone() && is_list_shrink_expr(&expr, param_name.clone(), si.clone()))) - { + if ((check_child.clone() && is_child_descent_expr(&expr, ¶m_name, &vars, &si)) || (check_list.clone() && is_list_shrink_expr(&expr, param_name.clone(), si.clone()))) { true } else { match (*expr.expr_data.clone()).clone() { - ExprData::ExprIf => { - (expr_contains_descent( - &if_then_branch(expr.clone()), - ¶m_name, - &vars, - check_child.clone(), - check_list.clone(), - &si, - ) && match if_else_branch(expr.clone()) { - Some(eb) => expr_contains_descent( - &eb, - ¶m_name, - &vars, - check_child.clone(), - check_list.clone(), - &si, - ), - None => false, - }) - } - ExprData::ExprBlock => match expr.children.clone().last().cloned() { - Some(last_stmt) => expr_contains_descent( - &last_stmt, - ¶m_name, - &vars, - check_child.clone(), - check_list.clone(), - &si, - ), - None => false, - }, - ExprData::ExprVar { .. } => { - set_has(vars.clone(), expr_var_name_at(expr.clone(), si.clone())) - } - ExprData::ExprFieldAccess { .. } => { - let field = field_access_field_at(expr.clone(), si.clone()); - let base = field_access_base(expr.clone()); - (is_sub_value_field(field) - && match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let bname = expr_var_name_at(base.clone(), si.clone()); - ((bname.clone().as_str() == param_name.clone().as_str()) - || set_has(vars.clone(), bname.clone())) - } - _ => false, - }) - } - ExprData::ExprMethodCall { - method_semantics: ms, - .. - } => { - let receiver = method_receiver(expr.clone()); - match method_size_effect(ms.clone()) { - Some(CollectionSizeEffect::ShrinkEffect) => expr_contains_descent( - &receiver, - ¶m_name, - &vars, - check_child.clone(), - check_list.clone(), - &si, - ), - Some(CollectionSizeEffect::ProjectionEffect) => expr_contains_descent( - &receiver, - ¶m_name, - &vars, - check_child.clone(), - check_list.clone(), - &si, - ), - Some(CollectionSizeEffect::IdentityEffect) => expr_contains_descent( - &receiver, - ¶m_name, - &vars, - check_child.clone(), - check_list.clone(), - &si, - ), - None => false, - } - } - _ => false, - } + ExprData::ExprIf => (expr_contains_descent(&if_then_branch(expr.clone()), ¶m_name, &vars, check_child.clone(), check_list.clone(), &si) && match if_else_branch(expr.clone()) { + Some(eb) => expr_contains_descent(&eb, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si), + None => false, +}), + ExprData::ExprBlock => match expr.children.clone().last().cloned() { + Some(last_stmt) => expr_contains_descent(&last_stmt, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si), + None => false, +}, + ExprData::ExprVar { .. } => set_has(vars.clone(), expr_var_name_at(expr.clone(), si.clone())), + ExprData::ExprFieldAccess { .. } => { + let field = field_access_field_at(expr.clone(), si.clone()); +let base = field_access_base(expr.clone()); +(is_sub_value_field(field) && match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let bname = expr_var_name_at(base.clone(), si.clone()); +((bname.clone().as_str() == param_name.clone().as_str()) || set_has(vars.clone(), bname.clone())) +}, + _ => false, +}) +}, + ExprData::ExprMethodCall { method_semantics: ms, .. } => { + let receiver = method_receiver(expr.clone()); +match method_size_effect(ms.clone()) { + Some(CollectionSizeEffect::ShrinkEffect) => expr_contains_descent(&receiver, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si), + Some(CollectionSizeEffect::ProjectionEffect) => expr_contains_descent(&receiver, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si), + Some(CollectionSizeEffect::IdentityEffect) => expr_contains_descent(&receiver, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si), + None => false, +} +}, + _ => false, +} } }) } -pub fn collect_field_binding_names( - fb: Rc, - vars: Rc>, -) -> Rc> { - stacker::maybe_grow( - 512 * 1024, - 2 * 1024 * 1024, - || match (*field_binding_pattern(fb)).clone() { - MatchPattern::Bind { - name: binding_name, .. - } => v2_rt::rc_map_insert(vars, binding_name.clone(), true), - MatchPattern::VariantPattern { - field_bindings: nested, - .. - } => nested.clone().iter().cloned().fold( - vars, - |inner: Rc>, nested_fb: Rc| { - collect_field_binding_names(nested_fb.clone(), inner) - }, - ), - _ => vars, - }, - ) +pub fn collect_field_binding_names(fb: Rc, vars: Rc>) -> Rc> { + stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { + match (*field_binding_pattern(fb)).clone() { + MatchPattern::Bind { name: binding_name, .. } => v2_rt::rc_map_insert(vars, binding_name.clone(), true), + MatchPattern::VariantPattern { field_bindings: nested, .. } => nested.clone().iter().cloned().fold(vars, |inner: Rc>, nested_fb: Rc| collect_field_binding_names(nested_fb.clone(), inner)), + _ => vars, +} + }) } -pub fn is_if_option_descent( - val: &Rc, - param_name: String, - vars: Rc>, - check_child: bool, - check_list: bool, - si: &Rc>>, -) -> bool { +pub fn is_if_option_descent(val: &Rc, param_name: String, vars: Rc>, check_child: bool, check_list: bool, si: &Rc>>) -> bool { match (*val.expr_data.clone()).clone() { - ExprData::ExprIf => { - let then_branch = if_then_branch(val.clone()); - let then_has_descent = expr_contains_descent( - &then_branch, - ¶m_name, - &vars, - check_child, - check_list, - &si, - ); - let else_is_none = match if_else_branch(val.clone()) { - Some(eb) => match (*eb.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - (expr_var_name_at(eb.clone(), si.clone()).as_str() - == "none".to_string().as_str()) - } - ExprData::ExprLiteral { value: v, .. } => match (*v.clone()).clone() { - LiteralValue::LitNull => true, - _ => false, - }, - _ => false, - }, - None => true, - }; - (then_has_descent && else_is_none) - } - _ => false, - } + ExprData::ExprIf => { + let then_branch = if_then_branch(val.clone()); +let then_has_descent = expr_contains_descent(&then_branch, ¶m_name, &vars, check_child, check_list, &si); +let else_is_none = match if_else_branch(val.clone()) { + Some(eb) => match (*eb.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => (expr_var_name_at(eb.clone(), si.clone()).as_str() == "none".to_string().as_str()), + ExprData::ExprLiteral { value: v, .. } => match (*v.clone()).clone() { + LiteralValue::LitNull => true, + _ => false, +}, + _ => false, +}, + None => true, +}; +(then_has_descent && else_is_none) +}, + _ => false, +} } -pub fn is_match_option_descent( - val: &Rc, - param_name: &String, - vars: Rc>, - check_child: bool, - check_list: bool, - si: &Rc>>, -) -> bool { +pub fn is_match_option_descent(val: &Rc, param_name: &String, vars: Rc>, check_child: bool, check_list: bool, si: &Rc>>) -> bool { match (*val.expr_data.clone()).clone() { - ExprData::ExprMatch => { - let scrut = match_scrutinee(val.clone()); - let scrut_has_descent = - expr_contains_descent(&scrut, ¶m_name, &vars, check_child, check_list, &si); - if scrut_has_descent { - { - let has_extraction = { - let mut __found = false; - for arm_node in match_arm_nodes(val.clone()).iter().cloned() { - if match (*arm_pattern(arm_node.clone())).clone() { - MatchPattern::VariantPattern { - field_bindings: bindings, - .. - } => { - let binding_names = bindings.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, fb: Rc| { - collect_field_binding_names(fb.clone(), acc) - }, - ); - let arm_b = arm_body(&arm_node); - match (*arm_b.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => set_has( - binding_names.clone(), - expr_var_name_at(arm_b.clone(), si.clone()), - ), - _ => false, - } - } - _ => false, - } { - __found = true; - break; - } - } - __found - }; - let all_safe = { - let mut __all = true; - for arm_node in match_arm_nodes(val.clone()).iter().cloned() { - if !({ - let arm_b = arm_body(&arm_node); - match (*arm_b.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - (expr_var_name_at(arm_b.clone(), si.clone()).as_str() - != param_name.clone().as_str()) - } - _ => true, - } - }) { - __all = false; - break; - } - } - __all - }; - (has_extraction && all_safe) - } - } else { - false - } + ExprData::ExprMatch => { + let scrut = match_scrutinee(val.clone()); +let scrut_has_descent = expr_contains_descent(&scrut, ¶m_name, &vars, check_child, check_list, &si); +if scrut_has_descent { + { + let has_extraction = { let mut __found = false; for arm_node in match_arm_nodes(val.clone()).iter().cloned() { if match (*arm_pattern(arm_node.clone())).clone() { + MatchPattern::VariantPattern { field_bindings: bindings, .. } => { + let binding_names = bindings.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, fb: Rc| collect_field_binding_names(fb.clone(), acc)); +let arm_b = arm_body(&arm_node); +match (*arm_b.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => set_has(binding_names.clone(), expr_var_name_at(arm_b.clone(), si.clone())), + _ => false, +} +}, + _ => false, +} { __found = true; break; } } __found }; +let all_safe = { let mut __all = true; for arm_node in match_arm_nodes(val.clone()).iter().cloned() { if !({ + let arm_b = arm_body(&arm_node); +match (*arm_b.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => (expr_var_name_at(arm_b.clone(), si.clone()).as_str() != param_name.clone().as_str()), + _ => true, +} +}) { __all = false; break; } } __all }; +(has_extraction && all_safe) +} + } else { + false } - _ => false, - } +}, + _ => false, +} } -pub fn collect_descent_vars( - body: &Rc, - param_name: &String, - vars: &Rc>, - check_child: bool, - check_list: bool, - si: &Rc>>, -) -> Rc> { +pub fn collect_descent_vars(body: &Rc, param_name: &String, vars: &Rc>, check_child: bool, check_list: bool, si: &Rc>>) -> Rc> { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*body.expr_data.clone()).clone() { - ExprData::ExprLet => { - let val = let_value(body.clone()); - let is_direct_descent = ((check_child.clone() - && is_child_descent_expr(&val, ¶m_name, &vars, &si)) - || (check_list.clone() - && is_list_shrink_expr(&val, param_name.clone(), si.clone()))); - let is_descent_var = match (*val.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - set_has(vars.clone(), expr_var_name_at(val.clone(), si.clone())) - } - _ => false, - }; - let is_option_descent = is_if_option_descent( - &val, - param_name.clone(), - vars.clone(), - check_child.clone(), - check_list.clone(), - &si, - ); - let is_match_descent = is_match_option_descent( - &val, - ¶m_name, - vars.clone(), - check_child.clone(), - check_list.clone(), - &si, - ); - let is_wrapped_descent = if is_tree_size_preserving_wrapper(&val, si.clone()) { - { - let inner = wrapper_inner_arg(val.clone()); - let inner_is_descent = ((check_child.clone() - && is_child_descent_expr(&inner, ¶m_name, &vars, &si)) - || (check_list.clone() - && is_list_shrink_expr(&inner, param_name.clone(), si.clone()))); - let inner_is_var = match (*inner.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - set_has(vars.clone(), expr_var_name_at(inner.clone(), si.clone())) - } - _ => false, - }; - (inner_is_descent.clone() || inner_is_var.clone()) - } - } else { - false - }; - let is_extraction_descent = if is_sub_value_extractor(&val, si.clone()) { - { - let inner = extractor_inner_arg(val.clone()); - let inner_is_descent = ((check_child.clone() - && is_child_descent_expr(&inner, ¶m_name, &vars, &si)) - || (check_list.clone() - && is_list_shrink_expr(&inner, param_name.clone(), si.clone()))); - let inner_is_var = match (*inner.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - set_has(vars.clone(), expr_var_name_at(inner.clone(), si.clone())) - } - _ => false, - }; - let inner_is_param = match (*inner.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - (expr_var_name_at(inner.clone(), si.clone()).as_str() - == param_name.clone().as_str()) - } - _ => false, - }; - ((inner_is_descent.clone() || inner_is_var.clone()) || inner_is_param) - } - } else { - false - }; - let is_children_list = match (*val.expr_data.clone()).clone() { - ExprData::ExprFieldAccess { .. } => { - let base = field_access_base(val.clone()); - let field = field_access_field_at(val.clone(), si.clone()); - (is_children_list_field(field) - && match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let bname = expr_var_name_at(base.clone(), si.clone()); - ((bname.clone().as_str() == param_name.clone().as_str()) - || set_has(vars.clone(), bname.clone())) - } - _ => false, - }) - } - _ => false, - }; - let is_passthrough_descent = if is_list_passthrough_call(val.clone(), si.clone()) { - match list_passthrough_inner_arg(val.clone(), si.clone()) { - Some(inner) => { - (((check_child.clone() - && is_child_descent_expr(&inner, ¶m_name, &vars, &si)) - || (check_list.clone() - && is_list_shrink_expr( - &inner, - param_name.clone(), - si.clone(), - ))) - || match (*inner.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => set_has( - vars.clone(), - expr_var_name_at(inner.clone(), si.clone()), - ), - _ => false, - }) - } - None => false, - } - } else { - false - }; - let is_consuming_helper = (check_list.clone() - && is_tokens_consuming_call(&val, param_name.clone(), vars.clone(), &si)); - let val_is_descent = ((((((((is_direct_descent || is_descent_var) - || is_option_descent) - || is_match_descent) - || is_wrapped_descent) - || is_extraction_descent) - || is_children_list) - || is_passthrough_descent) - || is_consuming_helper); - let next_vars = if val_is_descent { - v2_rt::rc_map_insert( - vars.clone(), - let_binding_name_at(body.clone(), si.clone()), - true, - ) - } else { - vars.clone() - }; - match let_body(body.clone()) { - Some(b) => collect_descent_vars( - &b, - ¶m_name, - &next_vars, - check_child.clone(), - check_list.clone(), - &si, - ), - None => next_vars, - } - } - ExprData::ExprMatch => { - let scrut = match_scrutinee(body.clone()); - let scrut_is_descent = expr_contains_descent( - &scrut, - ¶m_name, - &vars, - check_child.clone(), - check_list.clone(), - &si, - ); - let scrut_is_param = match (*scrut.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let sname = expr_var_name_at(scrut.clone(), si.clone()); - ((sname.clone().as_str() == param_name.clone().as_str()) - || set_has(vars.clone(), sname.clone())) - } - _ => false, - }; - let with_patterns = if (scrut_is_descent.clone() || scrut_is_param) { - match_arm_nodes(body.clone()).iter().cloned().fold( - vars.clone(), - |acc: Rc>, arm_node: Rc| match (*arm_pattern( - arm_node.clone(), - )) - .clone() - { - MatchPattern::VariantPattern { - field_bindings: bindings, - .. - } => bindings.clone().iter().cloned().fold( - acc.clone(), - |inner: Rc>, fb: Rc| { - collect_field_binding_names(fb.clone(), inner) - }, - ), - MatchPattern::Bind { - name: binding_name, .. - } => { - if scrut_is_descent.clone() { - v2_rt::rc_map_insert(acc.clone(), binding_name.clone(), true) - } else { - acc.clone() - } - } - _ => acc.clone(), - }, - ) + ExprData::ExprLet => { + let val = let_value(body.clone()); +let is_direct_descent = ((check_child.clone() && is_child_descent_expr(&val, ¶m_name, &vars, &si)) || (check_list.clone() && is_list_shrink_expr(&val, param_name.clone(), si.clone()))); +let is_descent_var = match (*val.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => set_has(vars.clone(), expr_var_name_at(val.clone(), si.clone())), + _ => false, +}; +let is_option_descent = is_if_option_descent(&val, param_name.clone(), vars.clone(), check_child.clone(), check_list.clone(), &si); +let is_match_descent = is_match_option_descent(&val, ¶m_name, vars.clone(), check_child.clone(), check_list.clone(), &si); +let is_wrapped_descent = if is_tree_size_preserving_wrapper(&val, si.clone()) { + { + let inner = wrapper_inner_arg(val.clone()); +let inner_is_descent = ((check_child.clone() && is_child_descent_expr(&inner, ¶m_name, &vars, &si)) || (check_list.clone() && is_list_shrink_expr(&inner, param_name.clone(), si.clone()))); +let inner_is_var = match (*inner.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => set_has(vars.clone(), expr_var_name_at(inner.clone(), si.clone())), + _ => false, +}; +(inner_is_descent.clone() || inner_is_var.clone()) +} + } else { + false + }; +let is_extraction_descent = if is_sub_value_extractor(&val, si.clone()) { + { + let inner = extractor_inner_arg(val.clone()); +let inner_is_descent = ((check_child.clone() && is_child_descent_expr(&inner, ¶m_name, &vars, &si)) || (check_list.clone() && is_list_shrink_expr(&inner, param_name.clone(), si.clone()))); +let inner_is_var = match (*inner.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => set_has(vars.clone(), expr_var_name_at(inner.clone(), si.clone())), + _ => false, +}; +let inner_is_param = match (*inner.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => (expr_var_name_at(inner.clone(), si.clone()).as_str() == param_name.clone().as_str()), + _ => false, +}; +((inner_is_descent.clone() || inner_is_var.clone()) || inner_is_param) +} + } else { + false + }; +let is_children_list = match (*val.expr_data.clone()).clone() { + ExprData::ExprFieldAccess { .. } => { + let base = field_access_base(val.clone()); +let field = field_access_field_at(val.clone(), si.clone()); +(is_children_list_field(field) && match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let bname = expr_var_name_at(base.clone(), si.clone()); +((bname.clone().as_str() == param_name.clone().as_str()) || set_has(vars.clone(), bname.clone())) +}, + _ => false, +}) +}, + _ => false, +}; +let is_passthrough_descent = if is_list_passthrough_call(val.clone(), si.clone()) { + match list_passthrough_inner_arg(val.clone(), si.clone()) { + Some(inner) => (((check_child.clone() && is_child_descent_expr(&inner, ¶m_name, &vars, &si)) || (check_list.clone() && is_list_shrink_expr(&inner, param_name.clone(), si.clone()))) || match (*inner.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => set_has(vars.clone(), expr_var_name_at(inner.clone(), si.clone())), + _ => false, +}), + None => false, +} + } else { + false + }; +let is_consuming_helper = (check_list.clone() && is_tokens_consuming_call(&val, param_name.clone(), vars.clone(), &si)); +let val_is_descent = ((((((((is_direct_descent || is_descent_var) || is_option_descent) || is_match_descent) || is_wrapped_descent) || is_extraction_descent) || is_children_list) || is_passthrough_descent) || is_consuming_helper); +let next_vars = if val_is_descent { + v2_rt::rc_map_insert(vars.clone(), let_binding_name_at(body.clone(), si.clone()), true) + } else { + vars.clone() + }; +match let_body(body.clone()) { + Some(b) => collect_descent_vars(&b, ¶m_name, &next_vars, check_child.clone(), check_list.clone(), &si), + None => next_vars, +} +}, + ExprData::ExprMatch => { + let scrut = match_scrutinee(body.clone()); +let scrut_is_descent = expr_contains_descent(&scrut, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si); +let scrut_is_param = match (*scrut.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let sname = expr_var_name_at(scrut.clone(), si.clone()); +((sname.clone().as_str() == param_name.clone().as_str()) || set_has(vars.clone(), sname.clone())) +}, + _ => false, +}; +let with_patterns = if (scrut_is_descent.clone() || scrut_is_param) { + match_arm_nodes(body.clone()).iter().cloned().fold(vars.clone(), |acc: Rc>, arm_node: Rc| match (*arm_pattern(arm_node.clone())).clone() { + MatchPattern::VariantPattern { field_bindings: bindings, .. } => bindings.clone().iter().cloned().fold(acc.clone(), |inner: Rc>, fb: Rc| collect_field_binding_names(fb.clone(), inner)), + MatchPattern::Bind { name: binding_name, .. } => if scrut_is_descent.clone() { + v2_rt::rc_map_insert(acc.clone(), binding_name.clone(), true) } else { - vars.clone() - }; - match_arm_nodes(body.clone()).iter().cloned().fold( - with_patterns.clone(), - |acc: Rc>, arm_node: Rc| { - let arm_result = collect_descent_vars( - &arm_body(&arm_node), - ¶m_name, - &with_patterns, - check_child.clone(), - check_list.clone(), - &si, - ); - v2_rt::rc_map_merge(acc, arm_result.clone()) - }, - ) - } - ExprData::ExprIf => { - let then_vars = collect_descent_vars( - &if_then_branch(body.clone()), - ¶m_name, - &vars, - check_child.clone(), - check_list.clone(), - &si, - ); - let else_vars = match if_else_branch(body.clone()) { - Some(eb) => collect_descent_vars( - &eb, - ¶m_name, - &vars, - check_child.clone(), - check_list.clone(), - &si, - ), - None => vars.clone(), - }; - v2_rt::rc_map_merge(then_vars, else_vars) - } - ExprData::ExprBlock => body.children.clone().iter().cloned().fold( - vars.clone(), - |acc: Rc>, stmt: Rc| { - collect_descent_vars( - &stmt, - ¶m_name, - &acc, - check_child.clone(), - check_list.clone(), - &si, - ) + acc.clone() }, - ), - ExprData::ExprReturn => match body.children.clone().first().cloned() { - Some(inner) => collect_descent_vars( - &inner, - ¶m_name, - &vars, - check_child.clone(), - check_list.clone(), - &si, - ), - None => vars.clone(), - }, - _ => vars.clone(), - } + _ => acc.clone(), +}) + } else { + vars.clone() + }; +match_arm_nodes(body.clone()).iter().cloned().fold(with_patterns.clone(), |acc: Rc>, arm_node: Rc| { + let arm_result = collect_descent_vars(&arm_body(&arm_node), ¶m_name, &with_patterns, check_child.clone(), check_list.clone(), &si); +v2_rt::rc_map_merge(acc, arm_result.clone()) +}) +}, + ExprData::ExprIf => { + let then_vars = collect_descent_vars(&if_then_branch(body.clone()), ¶m_name, &vars, check_child.clone(), check_list.clone(), &si); +let else_vars = match if_else_branch(body.clone()) { + Some(eb) => collect_descent_vars(&eb, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si), + None => vars.clone(), +}; +v2_rt::rc_map_merge(then_vars, else_vars) +}, + ExprData::ExprBlock => body.children.clone().iter().cloned().fold(vars.clone(), |acc: Rc>, stmt: Rc| collect_descent_vars(&stmt, ¶m_name, &acc, check_child.clone(), check_list.clone(), &si)), + ExprData::ExprReturn => match body.children.clone().first().cloned() { + Some(inner) => collect_descent_vars(&inner, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si), + None => vars.clone(), +}, + _ => vars.clone(), +} }) } -pub fn all_self_calls_descend( - body: Rc, - func_name: String, - param_name: String, - check_child: bool, - check_list: bool, - si: Rc>>, -) -> bool { - all_self_calls_descend_inc( - &body, - &func_name, - ¶m_name, - &v2_rt::rc_empty_map::(), - check_child, - check_list, - &si, - ) -} - -pub fn all_self_calls_descend_inc( - body: &Rc, - func_name: &String, - param_name: &String, - vars: &Rc>, - check_child: bool, - check_list: bool, - si: &Rc>>, -) -> bool { +pub fn all_self_calls_descend(body: Rc, func_name: String, param_name: String, check_child: bool, check_list: bool, si: Rc>>) -> bool { + all_self_calls_descend_inc(&body, &func_name, ¶m_name, &v2_rt::rc_empty_map::(), check_child, check_list, &si) +} + +pub fn all_self_calls_descend_inc(body: &Rc, func_name: &String, param_name: &String, vars: &Rc>, check_child: bool, check_list: bool, si: &Rc>>) -> bool { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*body.expr_data.clone()).clone() { - ExprData::ExprLambda => true, - ExprData::ExprLet => { - let val = let_value(body.clone()); - let val_ok = all_self_calls_descend_inc( - &val, - &func_name, - ¶m_name, - &vars, - check_child.clone(), - check_list.clone(), - &si, - ); - let is_direct = ((check_child.clone() - && is_child_descent_expr(&val, ¶m_name, &vars, &si)) - || (check_list.clone() - && is_list_shrink_expr(&val, param_name.clone(), si.clone()))); - let is_var = match (*val.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - set_has(vars.clone(), expr_var_name_at(val.clone(), si.clone())) - } - _ => false, - }; - let is_option = is_if_option_descent( - &val, - param_name.clone(), - vars.clone(), - check_child.clone(), - check_list.clone(), - &si, - ); - let is_children_list = match (*val.expr_data.clone()).clone() { - ExprData::ExprFieldAccess { .. } => { - let base = field_access_base(val.clone()); - let field = field_access_field_at(val.clone(), si.clone()); - (is_children_list_field(field) - && match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let bname = expr_var_name_at(base.clone(), si.clone()); - ((bname.clone().as_str() == param_name.clone().as_str()) - || set_has(vars.clone(), bname.clone())) - } - _ => false, - }) - } - _ => false, - }; - let next_vars = if (((is_direct || is_var) || is_option) || is_children_list) { - v2_rt::rc_map_insert( - vars.clone(), - let_binding_name_at(body.clone(), si.clone()), - true, - ) - } else { - vars.clone() - }; - let body_ok = match let_body(body.clone()) { - Some(b) => all_self_calls_descend_inc( - &b, - &func_name, - ¶m_name, - &next_vars, - check_child.clone(), - check_list.clone(), - &si, - ), - None => true, - }; - (val_ok && body_ok) - } - ExprData::ExprMatch => { - let scrut = match_scrutinee(body.clone()); - let scrut_ok = all_self_calls_descend_inc( - &scrut, - &func_name, - ¶m_name, - &vars, - check_child.clone(), - check_list.clone(), - &si, - ); - let scrut_is_descent = expr_contains_descent( - &scrut, - ¶m_name, - &vars, - check_child.clone(), - check_list.clone(), - &si, - ); - let scrut_is_param = match (*scrut.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let sname = expr_var_name_at(scrut.clone(), si.clone()); - ((sname.clone().as_str() == param_name.clone().as_str()) - || set_has(vars.clone(), sname.clone())) - } - _ => false, - }; - let arms_ok = { - let mut __all = true; - for arm_node in match_arm_nodes(body.clone()).iter().cloned() { - if !({ - let arm_vars = if (scrut_is_descent.clone() || scrut_is_param.clone()) { - match (*arm_pattern(arm_node.clone())).clone() { - MatchPattern::VariantPattern { - field_bindings: bindings, - .. - } => bindings.clone().iter().cloned().fold( - vars.clone(), - |inner: Rc>, fb: Rc| { - collect_field_binding_names(fb.clone(), inner) - }, - ), - MatchPattern::Bind { - name: binding_name, .. - } => { - if scrut_is_descent.clone() { - v2_rt::rc_map_insert( - vars.clone(), - binding_name.clone(), - true, - ) - } else { - vars.clone() - } - } - _ => vars.clone(), - } - } else { - vars.clone() - }; - all_self_calls_descend_inc( - &arm_body(&arm_node), - &func_name, - ¶m_name, - &arm_vars, - check_child.clone(), - check_list.clone(), - &si, - ) - }) { - __all = false; - break; - } - } - __all - }; - (scrut_ok && arms_ok) - } - ExprData::ExprIf => { - let cond_ok = all_self_calls_descend_inc( - &if_condition(body.clone()), - &func_name, - ¶m_name, - &vars, - check_child.clone(), - check_list.clone(), - &si, - ); - let then_ok = all_self_calls_descend_inc( - &if_then_branch(body.clone()), - &func_name, - ¶m_name, - &vars, - check_child.clone(), - check_list.clone(), - &si, - ); - let else_ok = match if_else_branch(body.clone()) { - Some(eb) => all_self_calls_descend_inc( - &eb, - &func_name, - ¶m_name, - &vars, - check_child.clone(), - check_list.clone(), - &si, - ), - None => true, - }; - ((cond_ok && then_ok) && else_ok) - } - ExprData::ExprBlock => { - let result = body.children.clone().iter().cloned().fold( - Rc::new(DescentCheckAcc { - ok: true, - vars: vars.clone(), - }), - |acc: Rc, stmt: Rc| { - if (acc.ok.clone() == false) { - acc.clone() - } else { - { - let stmt_ok = all_self_calls_descend_inc( - &stmt, - &func_name, - ¶m_name, - &acc.vars.clone(), - check_child.clone(), - check_list.clone(), - &si, - ); - let next_vars = collect_descent_vars( - &stmt, - ¶m_name, - &acc.vars.clone(), - check_child.clone(), - check_list.clone(), - &si, - ); - Rc::new(DescentCheckAcc { - ok: stmt_ok.clone(), - vars: next_vars.clone(), - }) - } - } + ExprData::ExprLambda => true, + ExprData::ExprLet => { + let val = let_value(body.clone()); +let val_ok = all_self_calls_descend_inc(&val, &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si); +let is_direct = ((check_child.clone() && is_child_descent_expr(&val, ¶m_name, &vars, &si)) || (check_list.clone() && is_list_shrink_expr(&val, param_name.clone(), si.clone()))); +let is_var = match (*val.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => set_has(vars.clone(), expr_var_name_at(val.clone(), si.clone())), + _ => false, +}; +let is_option = is_if_option_descent(&val, param_name.clone(), vars.clone(), check_child.clone(), check_list.clone(), &si); +let is_children_list = match (*val.expr_data.clone()).clone() { + ExprData::ExprFieldAccess { .. } => { + let base = field_access_base(val.clone()); +let field = field_access_field_at(val.clone(), si.clone()); +(is_children_list_field(field) && match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let bname = expr_var_name_at(base.clone(), si.clone()); +((bname.clone().as_str() == param_name.clone().as_str()) || set_has(vars.clone(), bname.clone())) +}, + _ => false, +}) +}, + _ => false, +}; +let next_vars = if (((is_direct || is_var) || is_option) || is_children_list) { + v2_rt::rc_map_insert(vars.clone(), let_binding_name_at(body.clone(), si.clone()), true) + } else { + vars.clone() + }; +let body_ok = match let_body(body.clone()) { + Some(b) => all_self_calls_descend_inc(&b, &func_name, ¶m_name, &next_vars, check_child.clone(), check_list.clone(), &si), + None => true, +}; +(val_ok && body_ok) +}, + ExprData::ExprMatch => { + let scrut = match_scrutinee(body.clone()); +let scrut_ok = all_self_calls_descend_inc(&scrut, &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si); +let scrut_is_descent = expr_contains_descent(&scrut, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si); +let scrut_is_param = match (*scrut.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let sname = expr_var_name_at(scrut.clone(), si.clone()); +((sname.clone().as_str() == param_name.clone().as_str()) || set_has(vars.clone(), sname.clone())) +}, + _ => false, +}; +let arms_ok = { let mut __all = true; for arm_node in match_arm_nodes(body.clone()).iter().cloned() { if !({ + let arm_vars = if (scrut_is_descent.clone() || scrut_is_param.clone()) { + match (*arm_pattern(arm_node.clone())).clone() { + MatchPattern::VariantPattern { field_bindings: bindings, .. } => bindings.clone().iter().cloned().fold(vars.clone(), |inner: Rc>, fb: Rc| collect_field_binding_names(fb.clone(), inner)), + MatchPattern::Bind { name: binding_name, .. } => if scrut_is_descent.clone() { + v2_rt::rc_map_insert(vars.clone(), binding_name.clone(), true) + } else { + vars.clone() }, - ); - result.ok.clone() - } - ExprData::ExprCall { .. } => { - let callee = expr_call_func_at(body.clone(), si.clone()); - let own_ok = if (callee.as_str() == func_name.clone().as_str()) { - { - let mut __found = false; - for arg_node in body.children.clone().iter().cloned() { - if { - let targets_param = (arg_name_at(arg_node.clone(), si.clone()) - .as_deref() - == Some(param_name.clone()).as_deref()); - if (targets_param.clone() == false) { - false - } else { - is_descent_arg( - &arg_value(&arg_node), - ¶m_name, - vars.clone(), - check_child.clone(), - check_list.clone(), - &si, - ) - } - } { - __found = true; - break; - } - } - __found - } + _ => vars.clone(), +} } else { - true + vars.clone() }; - (own_ok && { - let mut __all = true; - for child in body.children.clone().iter().cloned() { - if !(all_self_calls_descend_inc( - &child, - &func_name, - ¶m_name, - &vars, - check_child.clone(), - check_list.clone(), - &si, - )) { - __all = false; - break; - } - } - __all - }) - } - ExprData::ExprMethodCall { - method_semantics: ms, - .. - } => { - let receiver = method_receiver(body.clone()); - let is_iter = is_algebra_iteration_method(ms.clone()); - let is_struct = is_structural_children(&receiver, ¶m_name, &vars, &si); - if (is_iter && is_struct) { - { - let recv_ok = all_self_calls_descend_inc( - &receiver, - &func_name, - ¶m_name, - &vars, - check_child.clone(), - check_list.clone(), - &si, - ); - let args_ok = { - let mut __all = true; - for arg_node in method_arg_nodes(body.clone()).iter().cloned() { - if !({ - let arg_val = arg_value(&arg_node); - match (*arg_val.expr_data.clone()).clone() { - ExprData::ExprLambda => match iteration_element_name( - ms.clone(), - arg_val.clone(), - si.clone(), - ) { - Some(iter_name) => { - let ext_vars = v2_rt::rc_map_insert( - vars.clone(), - iter_name.clone(), - true, - ); - all_self_calls_descend_inc( - &lambda_body(arg_val.clone()), - &func_name, - ¶m_name, - &ext_vars, - check_child.clone(), - check_list.clone(), - &si, - ) - } - None => true, - }, - _ => all_self_calls_descend_inc( - &arg_val, - &func_name, - ¶m_name, - &vars, - check_child.clone(), - check_list.clone(), - &si, - ), - } - }) { - __all = false; - break; - } - } - __all - }; - (recv_ok && args_ok) - } - } else { - { - let mut __all = true; - for child in body.children.clone().iter().cloned() { - if !(all_self_calls_descend_inc( - &child, - &func_name, - ¶m_name, - &vars, - check_child.clone(), - check_list.clone(), - &si, - )) { - __all = false; - break; - } - } - __all - } - } - } - _ => { - let mut __all = true; - for child in body.children.clone().iter().cloned() { - if !(all_self_calls_descend_inc( - &child, - &func_name, - ¶m_name, - &vars, - check_child.clone(), - check_list.clone(), - &si, - )) { - __all = false; - break; +all_self_calls_descend_inc(&arm_body(&arm_node), &func_name, ¶m_name, &arm_vars, check_child.clone(), check_list.clone(), &si) +}) { __all = false; break; } } __all }; +(scrut_ok && arms_ok) +}, + ExprData::ExprIf => { + let cond_ok = all_self_calls_descend_inc(&if_condition(body.clone()), &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si); +let then_ok = all_self_calls_descend_inc(&if_then_branch(body.clone()), &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si); +let else_ok = match if_else_branch(body.clone()) { + Some(eb) => all_self_calls_descend_inc(&eb, &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si), + None => true, +}; +((cond_ok && then_ok) && else_ok) +}, + ExprData::ExprBlock => { + let result = body.children.clone().iter().cloned().fold(Rc::new(DescentCheckAcc { + ok: true, + vars: vars.clone(), +}), |acc: Rc, stmt: Rc| if (acc.ok.clone() == false) { + acc.clone() + } else { + { + let stmt_ok = all_self_calls_descend_inc(&stmt, &func_name, ¶m_name, &acc.vars.clone(), check_child.clone(), check_list.clone(), &si); +let next_vars = collect_descent_vars(&stmt, ¶m_name, &acc.vars.clone(), check_child.clone(), check_list.clone(), &si); +Rc::new(DescentCheckAcc { + ok: stmt_ok.clone(), + vars: next_vars.clone(), +}) +} + }); +result.ok.clone() +}, + ExprData::ExprCall { .. } => { + let callee = expr_call_func_at(body.clone(), si.clone()); +let own_ok = if (callee.as_str() == func_name.clone().as_str()) { + { let mut __found = false; for arg_node in body.children.clone().iter().cloned() { if { + let targets_param = (arg_name_at(arg_node.clone(), si.clone()).as_deref() == Some(param_name.clone()).as_deref()); +if (targets_param.clone() == false) { + false + } else { + is_descent_arg(&arg_value(&arg_node), ¶m_name, vars.clone(), check_child.clone(), check_list.clone(), &si) } - } - __all +} { __found = true; break; } } __found } + } else { + true + }; +(own_ok && { let mut __all = true; for child in body.children.clone().iter().cloned() { if !(all_self_calls_descend_inc(&child, &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si)) { __all = false; break; } } __all }) +}, + ExprData::ExprMethodCall { method_semantics: ms, .. } => { + let receiver = method_receiver(body.clone()); +let is_iter = is_algebra_iteration_method(ms.clone()); +let is_struct = is_structural_children(&receiver, ¶m_name, &vars, &si); +if (is_iter && is_struct) { + { + let recv_ok = all_self_calls_descend_inc(&receiver, &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si); +let args_ok = { let mut __all = true; for arg_node in method_arg_nodes(body.clone()).iter().cloned() { if !({ + let arg_val = arg_value(&arg_node); +match (*arg_val.expr_data.clone()).clone() { + ExprData::ExprLambda => match iteration_element_name(ms.clone(), arg_val.clone(), si.clone()) { + Some(iter_name) => { + let ext_vars = v2_rt::rc_map_insert(vars.clone(), iter_name.clone(), true); +all_self_calls_descend_inc(&lambda_body(arg_val.clone()), &func_name, ¶m_name, &ext_vars, check_child.clone(), check_list.clone(), &si) +}, + None => true, +}, + _ => all_self_calls_descend_inc(&arg_val, &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si), +} +}) { __all = false; break; } } __all }; +(recv_ok && args_ok) +} + } else { + { let mut __all = true; for child in body.children.clone().iter().cloned() { if !(all_self_calls_descend_inc(&child, &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si)) { __all = false; break; } } __all } } - } +}, + _ => { let mut __all = true; for child in body.children.clone().iter().cloned() { if !(all_self_calls_descend_inc(&child, &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si)) { __all = false; break; } } __all }, +} }) } pub fn unwrap_to_match(mut body: Rc) -> Option> { loop { match (*body.expr_data.clone()).clone() { - ExprData::ExprMatch => { - break Some(body.clone()); - } - ExprData::ExprLet => match let_body(body.clone()) { - Some(b) => { - let __tco_0 = b.clone(); - body = __tco_0; - continue; - } - None => { - break None; - } - }, - ExprData::ExprBlock => match body.children.clone().last().cloned() { - Some(last_stmt) => { - let __tco_0 = last_stmt.clone(); - body = __tco_0; - continue; - } - None => { - break None; - } - }, - _ => { - break None; - } - } - } -} - -pub fn matches_on_sub_value_field( - body: Rc, - param_name: String, - si: &Rc>>, -) -> bool { + ExprData::ExprMatch => { break Some(body.clone()); }, + ExprData::ExprLet => { match let_body(body.clone()) { + Some(b) => { { + let __tco_0 = b.clone(); +body = __tco_0; +continue; +} }, + None => { break None; }, +} }, + ExprData::ExprBlock => { match body.children.clone().last().cloned() { + Some(last_stmt) => { { + let __tco_0 = last_stmt.clone(); +body = __tco_0; +continue; +} }, + None => { break None; }, +} }, + _ => { break None; }, +} +} +} + +pub fn matches_on_sub_value_field(body: Rc, param_name: String, si: &Rc>>) -> bool { match unwrap_to_match(body) { - Some(m) => { - let scrut = match_scrutinee(m.clone()); - match (*scrut.expr_data.clone()).clone() { - ExprData::ExprFieldAccess { .. } => { - let base = field_access_base(scrut.clone()); - let field = field_access_field_at(scrut.clone(), si.clone()); - (is_sub_value_field(field) - && match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - (expr_var_name_at(base.clone(), si.clone()).as_str() - == param_name.as_str()) - } - _ => false, - }) - } - _ => false, - } - } - None => false, - } + Some(m) => { + let scrut = match_scrutinee(m.clone()); +match (*scrut.expr_data.clone()).clone() { + ExprData::ExprFieldAccess { .. } => { + let base = field_access_base(scrut.clone()); +let field = field_access_field_at(scrut.clone(), si.clone()); +(is_sub_value_field(field) && match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => (expr_var_name_at(base.clone(), si.clone()).as_str() == param_name.as_str()), + _ => false, +}) +}, + _ => false, +} +}, + None => false, +} } -pub fn is_container_child_descent( - body: Rc, - func_name: String, - params: Rc>>, - si: Rc>>, -) -> bool { - { - let mut __found = false; - for p in params.iter().cloned() { - if { - let pname = param_node_name_at(p.clone(), si.clone()); - (matches_on_sub_value_field(body.clone(), pname.clone(), &si) - && all_self_calls_descend( - body.clone(), - func_name.clone(), - pname.clone(), - true, - false, - si.clone(), - )) - } { - __found = true; - break; - } - } - __found - } +pub fn is_container_child_descent(body: Rc, func_name: String, params: Rc>>, si: Rc>>) -> bool { + { let mut __found = false; for p in params.iter().cloned() { if { + let pname = param_node_name_at(p.clone(), si.clone()); +(matches_on_sub_value_field(body.clone(), pname.clone(), &si) && all_self_calls_descend(body.clone(), func_name.clone(), pname.clone(), true, false, si.clone())) +} { __found = true; break; } } __found } } -pub fn is_list_shrinkage_descent( - body: Rc, - func_name: String, - params: Rc>>, - si: Rc>>, -) -> bool { - { - let mut __found = false; - for p in params.iter().cloned() { - if { - let pname = param_node_name_at(p.clone(), si.clone()); - all_self_calls_descend( - body.clone(), - func_name.clone(), - pname.clone(), - false, - true, - si.clone(), - ) - } { - __found = true; - break; - } - } - __found - } +pub fn is_list_shrinkage_descent(body: Rc, func_name: String, params: Rc>>, si: Rc>>) -> bool { + { let mut __found = false; for p in params.iter().cloned() { if { + let pname = param_node_name_at(p.clone(), si.clone()); +all_self_calls_descend(body.clone(), func_name.clone(), pname.clone(), false, true, si.clone()) +} { __found = true; break; } } __found } } -pub fn is_arithmetic_descent_expr( - expr: &Rc, - param_name: String, - si: Rc>>, -) -> bool { +pub fn is_arithmetic_descent_expr(expr: &Rc, param_name: String, si: Rc>>) -> bool { match (*expr.expr_data.clone()).clone() { - ExprData::ExprBinOp { op: BinOp::Sub, .. } => { - let left = binop_left(expr.clone()); - let right = binop_right(expr.clone()); - match (*left.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - ((expr_var_name_at(left.clone(), si).as_str() == param_name.as_str()) - && match (*right.expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { - let LiteralValue::LitInt { value: n, .. } = value.as_ref() else { - unreachable!() - }; - (n.clone() > 0) - } - _ => false, - }) - } - _ => false, - } - } - _ => false, - } + ExprData::ExprBinOp { op: BinOp::Sub, .. } => { + let left = binop_left(expr.clone()); +let right = binop_right(expr.clone()); +match (*left.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => ((expr_var_name_at(left.clone(), si).as_str() == param_name.as_str()) && match (*right.expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitInt { value: n, .. } = value.as_ref() else { unreachable!() }; (n.clone() > 0) }, + _ => false, +}), + _ => false, +} +}, + _ => false, +} } -pub fn classify_self_call_evidence( - arg_expr: &Rc, - param_name: &String, - descent_vars: &Rc>, - check_child: bool, - check_list: bool, - si: &Rc>>, -) -> DescentEvidence { +pub fn classify_self_call_evidence(arg_expr: &Rc, param_name: &String, descent_vars: &Rc>, check_child: bool, check_list: bool, si: &Rc>>) -> DescentEvidence { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - if (check_child.clone() - && is_child_descent_expr(&arg_expr, ¶m_name, &descent_vars, &si)) - { + if (check_child.clone() && is_child_descent_expr(&arg_expr, ¶m_name, &descent_vars, &si)) { DescentEvidence::Strict } else { - if (check_list.clone() - && is_list_shrink_expr(&arg_expr, param_name.clone(), si.clone())) - { + if (check_list.clone() && is_list_shrink_expr(&arg_expr, param_name.clone(), si.clone())) { DescentEvidence::Strict } else { - if (((check_child.clone() == false) && (check_list.clone() == false)) - && is_arithmetic_descent_expr(&arg_expr, param_name.clone(), si.clone())) - { + if (((check_child.clone() == false) && (check_list.clone() == false)) && is_arithmetic_descent_expr(&arg_expr, param_name.clone(), si.clone())) { DescentEvidence::Strict } else { match (*arg_expr.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let vname = expr_var_name_at(arg_expr.clone(), si.clone()); - if set_has(descent_vars.clone(), vname.clone()) { - DescentEvidence::Strict + ExprData::ExprVar { .. } => { + let vname = expr_var_name_at(arg_expr.clone(), si.clone()); +if set_has(descent_vars.clone(), vname.clone()) { + DescentEvidence::Strict + } else { + if (vname.clone().as_str() == param_name.clone().as_str()) { + DescentEvidence::NonIncreasing } else { - if (vname.clone().as_str() == param_name.clone().as_str()) { - DescentEvidence::NonIncreasing - } else { - DescentEvidence::DescentUnknown - } + DescentEvidence::DescentUnknown } } - ExprData::ExprCall { .. } => { - if is_tree_size_preserving_wrapper(&arg_expr, si.clone()) { - classify_self_call_evidence( - &wrapper_inner_arg(arg_expr.clone()), - ¶m_name, - &descent_vars, - check_child.clone(), - check_list.clone(), - &si, - ) +}, + ExprData::ExprCall { .. } => if is_tree_size_preserving_wrapper(&arg_expr, si.clone()) { + classify_self_call_evidence(&wrapper_inner_arg(arg_expr.clone()), ¶m_name, &descent_vars, check_child.clone(), check_list.clone(), &si) + } else { + if is_sub_value_extractor(&arg_expr, si.clone()) { + { + let inner_ev = classify_self_call_evidence(&extractor_inner_arg(arg_expr.clone()), ¶m_name, &descent_vars, check_child.clone(), check_list.clone(), &si); +match inner_ev.clone() { + DescentEvidence::NonIncreasing => DescentEvidence::Strict, + _ => inner_ev.clone(), +} +} + } else { + if is_list_passthrough_call(arg_expr.clone(), si.clone()) { + match list_passthrough_inner_arg(arg_expr.clone(), si.clone()) { + Some(inner) => classify_self_call_evidence(&inner, ¶m_name, &descent_vars, check_child.clone(), check_list.clone(), &si), + None => DescentEvidence::DescentUnknown, +} } else { - if is_sub_value_extractor(&arg_expr, si.clone()) { - { - let inner_ev = classify_self_call_evidence( - &extractor_inner_arg(arg_expr.clone()), - ¶m_name, - &descent_vars, - check_child.clone(), - check_list.clone(), - &si, - ); - match inner_ev.clone() { - DescentEvidence::NonIncreasing => { - DescentEvidence::Strict - } - _ => inner_ev.clone(), - } - } - } else { - if is_list_passthrough_call(arg_expr.clone(), si.clone()) { - match list_passthrough_inner_arg( - arg_expr.clone(), - si.clone(), - ) { - Some(inner) => classify_self_call_evidence( - &inner, - ¶m_name, - &descent_vars, - check_child.clone(), - check_list.clone(), - &si, - ), - None => DescentEvidence::DescentUnknown, - } - } else { - DescentEvidence::DescentUnknown - } - } - } - } - ExprData::ExprFieldAccess { .. } => { - let base = field_access_base(arg_expr.clone()); - match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let bname = expr_var_name_at(base.clone(), si.clone()); - if (set_has(descent_vars.clone(), bname.clone()) - || (bname.clone().as_str() == param_name.clone().as_str())) - { - DescentEvidence::Strict - } else { - { - let field = - field_access_field_at(arg_expr.clone(), si.clone()); - if (field.as_str() == param_name.clone().as_str()) { - DescentEvidence::NonIncreasing - } else { - DescentEvidence::DescentUnknown - } - } - } - } - _ => DescentEvidence::DescentUnknown, + DescentEvidence::DescentUnknown } } - ExprData::ExprMethodCall { - method_semantics: ms, - .. - } => { - if is_generalized_shrink(&arg_expr, si.clone()) { + }, + ExprData::ExprFieldAccess { .. } => { + let base = field_access_base(arg_expr.clone()); +match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let bname = expr_var_name_at(base.clone(), si.clone()); +if (set_has(descent_vars.clone(), bname.clone()) || (bname.clone().as_str() == param_name.clone().as_str())) { + DescentEvidence::Strict + } else { { - let recv = method_receiver(arg_expr.clone()); - let recv_ev = classify_self_call_evidence( - &recv, - ¶m_name, - &descent_vars, - check_child.clone(), - check_list.clone(), - &si, - ); - match recv_ev { - DescentEvidence::Strict => DescentEvidence::Strict, - DescentEvidence::NonIncreasing => DescentEvidence::Strict, - DescentEvidence::DescentUnknown => { - DescentEvidence::DescentUnknown - } + let field = field_access_field_at(arg_expr.clone(), si.clone()); +if (field.as_str() == param_name.clone().as_str()) { + DescentEvidence::NonIncreasing + } else { + DescentEvidence::DescentUnknown } - } - } else { - DescentEvidence::DescentUnknown +} } - } - _ => DescentEvidence::DescentUnknown, - } +}, + _ => DescentEvidence::DescentUnknown, +} +}, + ExprData::ExprMethodCall { method_semantics: ms, .. } => if is_generalized_shrink(&arg_expr, si.clone()) { + { + let recv = method_receiver(arg_expr.clone()); +let recv_ev = classify_self_call_evidence(&recv, ¶m_name, &descent_vars, check_child.clone(), check_list.clone(), &si); +match recv_ev { + DescentEvidence::Strict => DescentEvidence::Strict, + DescentEvidence::NonIncreasing => DescentEvidence::Strict, + DescentEvidence::DescentUnknown => DescentEvidence::DescentUnknown, +} +} + } else { + DescentEvidence::DescentUnknown + }, + _ => DescentEvidence::DescentUnknown, +} } } } }) } -pub fn try_dimension_for_param( - body: Rc, - func_name: String, - param_name: String, - check_child: bool, - check_list: bool, - si: Rc>>, -) -> Option { - collect_evidence_incremental( - &body, - &func_name, - ¶m_name, - &v2_rt::rc_empty_map::(), - check_child, - check_list, - false, - &si, - ) -} - -pub fn try_branching_dimension_for_param( - body: Rc, - func_name: String, - param_name: String, - check_child: bool, - check_list: bool, - si: Rc>>, -) -> Option { - collect_evidence_incremental( - &body, - &func_name, - ¶m_name, - &v2_rt::rc_empty_map::(), - check_child, - check_list, - true, - &si, - ) -} - -pub fn merge_optional_evidence( - a: Option, - b: Option, -) -> Option { +pub fn try_dimension_for_param(body: Rc, func_name: String, param_name: String, check_child: bool, check_list: bool, si: Rc>>) -> Option { + collect_evidence_incremental(&body, &func_name, ¶m_name, &v2_rt::rc_empty_map::(), check_child, check_list, false, &si) +} + +pub fn try_branching_dimension_for_param(body: Rc, func_name: String, param_name: String, check_child: bool, check_list: bool, si: Rc>>) -> Option { + collect_evidence_incremental(&body, &func_name, ¶m_name, &v2_rt::rc_empty_map::(), check_child, check_list, true, &si) +} + +pub fn merge_optional_evidence(a: Option, b: Option) -> Option { optional_evidence_meet(a, b) } -pub fn collect_evidence_incremental( - body: &Rc, - func_name: &String, - param_name: &String, - vars: &Rc>, - check_child: bool, - check_list: bool, - branching_only: bool, - si: &Rc>>, -) -> Option { +pub fn collect_evidence_incremental(body: &Rc, func_name: &String, param_name: &String, vars: &Rc>, check_child: bool, check_list: bool, branching_only: bool, si: &Rc>>) -> Option { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*body.expr_data.clone()).clone() { - ExprData::ExprLambda => None, - ExprData::ExprLet => { - let val = let_value(body.clone()); - let val_ev = collect_evidence_incremental( - &val, - &func_name, - ¶m_name, - &vars, - check_child.clone(), - check_list.clone(), - branching_only.clone(), - &si, - ); - let is_direct = ((check_child.clone() - && is_child_descent_expr(&val, ¶m_name, &vars, &si)) - || (check_list.clone() - && is_list_shrink_expr(&val, param_name.clone(), si.clone()))); - let is_var = match (*val.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - set_has(vars.clone(), expr_var_name_at(val.clone(), si.clone())) - } - _ => false, - }; - let is_option = is_if_option_descent( - &val, - param_name.clone(), - vars.clone(), - check_child.clone(), - check_list.clone(), - &si, - ); - let is_match_descent = is_match_option_descent( - &val, - ¶m_name, - vars.clone(), - check_child.clone(), - check_list.clone(), - &si, - ); - let is_wrapped = if is_tree_size_preserving_wrapper(&val, si.clone()) { - { - let inner = wrapper_inner_arg(val.clone()); - let inner_d = ((check_child.clone() - && is_child_descent_expr(&inner, ¶m_name, &vars, &si)) - || (check_list.clone() - && is_list_shrink_expr(&inner, param_name.clone(), si.clone()))); - let inner_v = match (*inner.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - set_has(vars.clone(), expr_var_name_at(inner.clone(), si.clone())) - } - _ => false, - }; - (inner_d.clone() || inner_v.clone()) - } - } else { - false - }; - let is_extraction = if is_sub_value_extractor(&val, si.clone()) { - { - let inner = extractor_inner_arg(val.clone()); - let inner_d = ((check_child.clone() - && is_child_descent_expr(&inner, ¶m_name, &vars, &si)) - || (check_list.clone() - && is_list_shrink_expr(&inner, param_name.clone(), si.clone()))); - let inner_v = match (*inner.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - set_has(vars.clone(), expr_var_name_at(inner.clone(), si.clone())) - } - _ => false, - }; - let inner_p = match (*inner.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - (expr_var_name_at(inner.clone(), si.clone()).as_str() - == param_name.clone().as_str()) - } - _ => false, - }; - ((inner_d.clone() || inner_v.clone()) || inner_p) - } - } else { - false - }; - let is_children_list = match (*val.expr_data.clone()).clone() { - ExprData::ExprFieldAccess { .. } => { - let base = field_access_base(val.clone()); - let field = field_access_field_at(val.clone(), si.clone()); - (is_children_list_field(field) - && match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let bname = expr_var_name_at(base.clone(), si.clone()); - ((bname.clone().as_str() == param_name.clone().as_str()) - || set_has(vars.clone(), bname.clone())) - } - _ => false, - }) - } - _ => false, - }; - let is_passthrough = if is_list_passthrough_call(val.clone(), si.clone()) { - match list_passthrough_inner_arg(val.clone(), si.clone()) { - Some(inner) => { - (((check_child.clone() - && is_child_descent_expr(&inner, ¶m_name, &vars, &si)) - || (check_list.clone() - && is_list_shrink_expr( - &inner, - param_name.clone(), - si.clone(), - ))) - || match (*inner.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => set_has( - vars.clone(), - expr_var_name_at(inner.clone(), si.clone()), - ), - _ => false, - }) - } - None => false, - } + ExprData::ExprLambda => None, + ExprData::ExprLet => { + let val = let_value(body.clone()); +let val_ev = collect_evidence_incremental(&val, &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), branching_only.clone(), &si); +let is_direct = ((check_child.clone() && is_child_descent_expr(&val, ¶m_name, &vars, &si)) || (check_list.clone() && is_list_shrink_expr(&val, param_name.clone(), si.clone()))); +let is_var = match (*val.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => set_has(vars.clone(), expr_var_name_at(val.clone(), si.clone())), + _ => false, +}; +let is_option = is_if_option_descent(&val, param_name.clone(), vars.clone(), check_child.clone(), check_list.clone(), &si); +let is_match_descent = is_match_option_descent(&val, ¶m_name, vars.clone(), check_child.clone(), check_list.clone(), &si); +let is_wrapped = if is_tree_size_preserving_wrapper(&val, si.clone()) { + { + let inner = wrapper_inner_arg(val.clone()); +let inner_d = ((check_child.clone() && is_child_descent_expr(&inner, ¶m_name, &vars, &si)) || (check_list.clone() && is_list_shrink_expr(&inner, param_name.clone(), si.clone()))); +let inner_v = match (*inner.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => set_has(vars.clone(), expr_var_name_at(inner.clone(), si.clone())), + _ => false, +}; +(inner_d.clone() || inner_v.clone()) +} + } else { + false + }; +let is_extraction = if is_sub_value_extractor(&val, si.clone()) { + { + let inner = extractor_inner_arg(val.clone()); +let inner_d = ((check_child.clone() && is_child_descent_expr(&inner, ¶m_name, &vars, &si)) || (check_list.clone() && is_list_shrink_expr(&inner, param_name.clone(), si.clone()))); +let inner_v = match (*inner.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => set_has(vars.clone(), expr_var_name_at(inner.clone(), si.clone())), + _ => false, +}; +let inner_p = match (*inner.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => (expr_var_name_at(inner.clone(), si.clone()).as_str() == param_name.clone().as_str()), + _ => false, +}; +((inner_d.clone() || inner_v.clone()) || inner_p) +} + } else { + false + }; +let is_children_list = match (*val.expr_data.clone()).clone() { + ExprData::ExprFieldAccess { .. } => { + let base = field_access_base(val.clone()); +let field = field_access_field_at(val.clone(), si.clone()); +(is_children_list_field(field) && match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let bname = expr_var_name_at(base.clone(), si.clone()); +((bname.clone().as_str() == param_name.clone().as_str()) || set_has(vars.clone(), bname.clone())) +}, + _ => false, +}) +}, + _ => false, +}; +let is_passthrough = if is_list_passthrough_call(val.clone(), si.clone()) { + match list_passthrough_inner_arg(val.clone(), si.clone()) { + Some(inner) => (((check_child.clone() && is_child_descent_expr(&inner, ¶m_name, &vars, &si)) || (check_list.clone() && is_list_shrink_expr(&inner, param_name.clone(), si.clone()))) || match (*inner.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => set_has(vars.clone(), expr_var_name_at(inner.clone(), si.clone())), + _ => false, +}), + None => false, +} + } else { + false + }; +let is_consuming_helper = (check_list.clone() && is_tokens_consuming_call(&val, param_name.clone(), vars.clone(), &si)); +let next_vars = if ((((((((is_direct || is_var) || is_option) || is_match_descent) || is_wrapped) || is_extraction) || is_children_list) || is_passthrough) || is_consuming_helper) { + v2_rt::rc_map_insert(vars.clone(), let_binding_name_at(body.clone(), si.clone()), true) + } else { + vars.clone() + }; +let body_ev = match let_body(body.clone()) { + Some(b) => collect_evidence_incremental(&b, &func_name, ¶m_name, &next_vars, check_child.clone(), check_list.clone(), branching_only.clone(), &si), + None => None, +}; +merge_optional_evidence(val_ev, body_ev) +}, + ExprData::ExprMatch => { + let scrut = match_scrutinee(body.clone()); +let scrut_ev = collect_evidence_incremental(&scrut, &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), branching_only.clone(), &si); +let scrut_is_descent = expr_contains_descent(&scrut, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si); +let scrut_is_param = match (*scrut.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let sname = expr_var_name_at(scrut.clone(), si.clone()); +((sname.clone().as_str() == param_name.clone().as_str()) || set_has(vars.clone(), sname.clone())) +}, + _ => false, +}; +let arms_ev = match_arm_nodes(body.clone()).iter().cloned().fold(None, |acc: _, arm_node: Rc| { + let is_base_case = if branching_only.clone() { + (max_path_self_calls(arm_body(&arm_node), func_name.clone(), si.clone()) == 0) } else { false }; - let is_consuming_helper = (check_list.clone() - && is_tokens_consuming_call(&val, param_name.clone(), vars.clone(), &si)); - let next_vars = if ((((((((is_direct || is_var) || is_option) - || is_match_descent) - || is_wrapped) - || is_extraction) - || is_children_list) - || is_passthrough) - || is_consuming_helper) - { - v2_rt::rc_map_insert( - vars.clone(), - let_binding_name_at(body.clone(), si.clone()), - true, - ) +if is_base_case.clone() { + acc.clone() } else { - vars.clone() - }; - let body_ev = match let_body(body.clone()) { - Some(b) => collect_evidence_incremental( - &b, - &func_name, - ¶m_name, - &next_vars, - check_child.clone(), - check_list.clone(), - branching_only.clone(), - &si, - ), - None => None, - }; - merge_optional_evidence(val_ev, body_ev) - } - ExprData::ExprMatch => { - let scrut = match_scrutinee(body.clone()); - let scrut_ev = collect_evidence_incremental( - &scrut, - &func_name, - ¶m_name, - &vars, - check_child.clone(), - check_list.clone(), - branching_only.clone(), - &si, - ); - let scrut_is_descent = expr_contains_descent( - &scrut, - ¶m_name, - &vars, - check_child.clone(), - check_list.clone(), - &si, - ); - let scrut_is_param = match (*scrut.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let sname = expr_var_name_at(scrut.clone(), si.clone()); - ((sname.clone().as_str() == param_name.clone().as_str()) - || set_has(vars.clone(), sname.clone())) - } - _ => false, - }; - let arms_ev = match_arm_nodes(body.clone()).iter().cloned().fold( - None, - |acc: _, arm_node: Rc| { - let is_base_case = if branching_only.clone() { - (max_path_self_calls( - arm_body(&arm_node), - func_name.clone(), - si.clone(), - ) == 0) + { + let arm_vars = if (scrut_is_descent.clone() || scrut_is_param.clone()) { + match (*arm_pattern(arm_node.clone())).clone() { + MatchPattern::VariantPattern { field_bindings: bindings, .. } => bindings.clone().iter().cloned().fold(vars.clone(), |inner: Rc>, fb: Rc| collect_field_binding_names(fb.clone(), inner)), + MatchPattern::Bind { name: binding_name, .. } => if scrut_is_descent.clone() { + v2_rt::rc_map_insert(vars.clone(), binding_name.clone(), true) + } else { + vars.clone() + }, + _ => vars.clone(), +} } else { - false + vars.clone() }; - if is_base_case.clone() { - acc.clone() +let arm_ev = collect_evidence_incremental(&arm_body(&arm_node), &func_name, ¶m_name, &arm_vars, check_child.clone(), check_list.clone(), branching_only.clone(), &si); +merge_optional_evidence(acc.clone(), arm_ev.clone()) +} + } +}); +merge_optional_evidence(scrut_ev, arms_ev) +}, + ExprData::ExprIf => { + let cond_ev = collect_evidence_incremental(&if_condition(body.clone()), &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), branching_only.clone(), &si); +let then_branch = if_then_branch(body.clone()); +let else_opt = if_else_branch(body.clone()); +let then_path = if branching_only.clone() { + max_path_self_calls(then_branch.clone(), func_name.clone(), si.clone()) + } else { + 0 + }; +let else_path = if branching_only.clone() { + match else_opt.clone() { + Some(eb) => max_path_self_calls(eb.clone(), func_name.clone(), si.clone()), + None => 0, +} + } else { + 0 + }; +let then_ev = if (branching_only.clone() && (then_path == 0)) { + None + } else { + collect_evidence_incremental(&then_branch, &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), branching_only.clone(), &si) + }; +let else_ev = if (branching_only.clone() && (else_path == 0)) { + None + } else { + match else_opt.clone() { + Some(eb) => collect_evidence_incremental(&eb, &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), branching_only.clone(), &si), + None => None, +} + }; +merge_optional_evidence(cond_ev, merge_optional_evidence(then_ev, else_ev)) +}, + ExprData::ExprCall { .. } => { + let callee = expr_call_func_at(body.clone(), si.clone()); +let own_evidence = if (callee.as_str() == func_name.clone().as_str()) { + { + let arg_evidence = body.children.clone().iter().cloned().fold(DescentEvidence::DescentUnknown, |acc: DescentEvidence, arg_node: Rc| { + let aname = arg_name_at(arg_node.clone(), si.clone()); +if (aname.clone().as_deref() == Some(param_name.clone()).as_deref()) { + classify_self_call_evidence(&arg_value(&arg_node), ¶m_name, &vars, check_child.clone(), check_list.clone(), &si) } else { - { - let arm_vars = - if (scrut_is_descent.clone() || scrut_is_param.clone()) { - match (*arm_pattern(arm_node.clone())).clone() { - MatchPattern::VariantPattern { - field_bindings: bindings, - .. - } => bindings.clone().iter().cloned().fold( - vars.clone(), - |inner: Rc>, fb: Rc| { - collect_field_binding_names(fb.clone(), inner) - }, - ), - MatchPattern::Bind { - name: binding_name, .. - } => { - if scrut_is_descent.clone() { - v2_rt::rc_map_insert( - vars.clone(), - binding_name.clone(), - true, - ) - } else { - vars.clone() - } - } - _ => vars.clone(), - } - } else { - vars.clone() - }; - let arm_ev = collect_evidence_incremental( - &arm_body(&arm_node), - &func_name, - ¶m_name, - &arm_vars, - check_child.clone(), - check_list.clone(), - branching_only.clone(), - &si, - ); - merge_optional_evidence(acc.clone(), arm_ev.clone()) - } + acc } - }, - ); - merge_optional_evidence(scrut_ev, arms_ev) - } - ExprData::ExprIf => { - let cond_ev = collect_evidence_incremental( - &if_condition(body.clone()), - &func_name, - ¶m_name, - &vars, - check_child.clone(), - check_list.clone(), - branching_only.clone(), - &si, - ); - let then_branch = if_then_branch(body.clone()); - let else_opt = if_else_branch(body.clone()); - let then_path = if branching_only.clone() { - max_path_self_calls(then_branch.clone(), func_name.clone(), si.clone()) - } else { - 0 - }; - let else_path = if branching_only.clone() { - match else_opt.clone() { - Some(eb) => max_path_self_calls(eb.clone(), func_name.clone(), si.clone()), - None => 0, - } - } else { - 0 - }; - let then_ev = if (branching_only.clone() && (then_path == 0)) { - None - } else { - collect_evidence_incremental( - &then_branch, - &func_name, - ¶m_name, - &vars, - check_child.clone(), - check_list.clone(), - branching_only.clone(), - &si, - ) - }; - let else_ev = if (branching_only.clone() && (else_path == 0)) { - None - } else { - match else_opt.clone() { - Some(eb) => collect_evidence_incremental( - &eb, - &func_name, - ¶m_name, - &vars, - check_child.clone(), - check_list.clone(), - branching_only.clone(), - &si, - ), - None => None, - } - }; - merge_optional_evidence(cond_ev, merge_optional_evidence(then_ev, else_ev)) - } - ExprData::ExprCall { .. } => { - let callee = expr_call_func_at(body.clone(), si.clone()); - let own_evidence = if (callee.as_str() == func_name.clone().as_str()) { - { - let arg_evidence = body.children.clone().iter().cloned().fold( - DescentEvidence::DescentUnknown, - |acc: DescentEvidence, arg_node: Rc| { - let aname = arg_name_at(arg_node.clone(), si.clone()); - if (aname.clone().as_deref() == Some(param_name.clone()).as_deref()) - { - classify_self_call_evidence( - &arg_value(&arg_node), - ¶m_name, - &vars, - check_child.clone(), - check_list.clone(), - &si, - ) - } else { - acc - } - }, - ); - Some(arg_evidence) - } - } else { - None - }; - let child_evidence = - body.children - .clone() - .iter() - .cloned() - .fold(None, |acc: _, child: Rc| { - let ce = collect_evidence_incremental( - &child, - &func_name, - ¶m_name, - &vars, - check_child.clone(), - check_list.clone(), - branching_only.clone(), - &si, - ); - merge_optional_evidence(acc.clone(), ce.clone()) - }); - merge_optional_evidence(own_evidence, child_evidence) - } - ExprData::ExprBlock => { - let result = body.children.clone().iter().cloned().fold( - Rc::new(EvidenceBlockAcc { - evidence: None, - vars: vars.clone(), - }), - |acc: Rc, stmt: Rc| { - let stmt_ev = collect_evidence_incremental( - &stmt, - &func_name, - ¶m_name, - &acc.vars.clone(), - check_child.clone(), - check_list.clone(), - branching_only.clone(), - &si, - ); - let next_vars = collect_descent_vars( - &stmt, - ¶m_name, - &acc.vars.clone(), - check_child.clone(), - check_list.clone(), - &si, - ); - Rc::new(EvidenceBlockAcc { - evidence: merge_optional_evidence( - acc.evidence.clone(), - stmt_ev.clone(), - ), - vars: next_vars.clone(), - }) - }, - ); - result.evidence.clone() - } - ExprData::ExprMethodCall { - method_semantics: ms, - .. - } => { - let receiver = method_receiver(body.clone()); - let is_iter = is_algebra_iteration_method(ms.clone()); - let is_struct = is_structural_children(&receiver, ¶m_name, &vars, &si); - if (is_iter && is_struct) { - { - let recv_ev = collect_evidence_incremental( - &receiver, - &func_name, - ¶m_name, - &vars, - check_child.clone(), - check_list.clone(), - branching_only.clone(), - &si, - ); - let args_ev = method_arg_nodes(body.clone()).iter().cloned().fold( - None, - |acc: _, arg_node: Rc| { - let arg_val = arg_value(&arg_node); - let ev = match (*arg_val.expr_data.clone()).clone() { - ExprData::ExprLambda => match iteration_element_name( - ms.clone(), - arg_val.clone(), - si.clone(), - ) { - Some(iter_name) => { - let ext_vars = v2_rt::rc_map_insert( - vars.clone(), - iter_name.clone(), - true, - ); - collect_evidence_incremental( - &lambda_body(arg_val.clone()), - &func_name, - ¶m_name, - &ext_vars, - check_child.clone(), - check_list.clone(), - branching_only.clone(), - &si, - ) - } - None => None, - }, - _ => collect_evidence_incremental( - &arg_val, - &func_name, - ¶m_name, - &vars, - check_child.clone(), - check_list.clone(), - branching_only.clone(), - &si, - ), - }; - merge_optional_evidence(acc.clone(), ev.clone()) - }, - ); - merge_optional_evidence(recv_ev, args_ev) - } - } else { - body.children - .clone() - .iter() - .cloned() - .fold(None, |acc: _, child: Rc| { - let ce = collect_evidence_incremental( - &child, - &func_name, - ¶m_name, - &vars, - check_child.clone(), - check_list.clone(), - branching_only.clone(), - &si, - ); - merge_optional_evidence(acc.clone(), ce.clone()) - }) - } +}); +Some(arg_evidence) +} + } else { + None + }; +let child_evidence = body.children.clone().iter().cloned().fold(None, |acc: _, child: Rc| { + let ce = collect_evidence_incremental(&child, &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), branching_only.clone(), &si); +merge_optional_evidence(acc.clone(), ce.clone()) +}); +merge_optional_evidence(own_evidence, child_evidence) +}, + ExprData::ExprBlock => { + let result = body.children.clone().iter().cloned().fold(Rc::new(EvidenceBlockAcc { + evidence: None, + vars: vars.clone(), +}), |acc: Rc, stmt: Rc| { + let stmt_ev = collect_evidence_incremental(&stmt, &func_name, ¶m_name, &acc.vars.clone(), check_child.clone(), check_list.clone(), branching_only.clone(), &si); +let next_vars = collect_descent_vars(&stmt, ¶m_name, &acc.vars.clone(), check_child.clone(), check_list.clone(), &si); +Rc::new(EvidenceBlockAcc { + evidence: merge_optional_evidence(acc.evidence.clone(), stmt_ev.clone()), + vars: next_vars.clone(), +}) +}); +result.evidence.clone() +}, + ExprData::ExprMethodCall { method_semantics: ms, .. } => { + let receiver = method_receiver(body.clone()); +let is_iter = is_algebra_iteration_method(ms.clone()); +let is_struct = is_structural_children(&receiver, ¶m_name, &vars, &si); +if (is_iter && is_struct) { + { + let recv_ev = collect_evidence_incremental(&receiver, &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), branching_only.clone(), &si); +let args_ev = method_arg_nodes(body.clone()).iter().cloned().fold(None, |acc: _, arg_node: Rc| { + let arg_val = arg_value(&arg_node); +let ev = match (*arg_val.expr_data.clone()).clone() { + ExprData::ExprLambda => match iteration_element_name(ms.clone(), arg_val.clone(), si.clone()) { + Some(iter_name) => { + let ext_vars = v2_rt::rc_map_insert(vars.clone(), iter_name.clone(), true); +collect_evidence_incremental(&lambda_body(arg_val.clone()), &func_name, ¶m_name, &ext_vars, check_child.clone(), check_list.clone(), branching_only.clone(), &si) +}, + None => None, +}, + _ => collect_evidence_incremental(&arg_val, &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), branching_only.clone(), &si), +}; +merge_optional_evidence(acc.clone(), ev.clone()) +}); +merge_optional_evidence(recv_ev, args_ev) +} + } else { + body.children.clone().iter().cloned().fold(None, |acc: _, child: Rc| { + let ce = collect_evidence_incremental(&child, &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), branching_only.clone(), &si); +merge_optional_evidence(acc.clone(), ce.clone()) +}) } - _ => body - .children - .clone() - .iter() - .cloned() - .fold(None, |acc: _, child: Rc| { - let ce = collect_evidence_incremental( - &child, - &func_name, - ¶m_name, - &vars, - check_child.clone(), - check_list.clone(), - branching_only.clone(), - &si, - ); - merge_optional_evidence(acc.clone(), ce.clone()) - }), - } +}, + _ => body.children.clone().iter().cloned().fold(None, |acc: _, child: Rc| { + let ce = collect_evidence_incremental(&child, &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), branching_only.clone(), &si); +merge_optional_evidence(acc.clone(), ce.clone()) +}), +} }) } -pub fn try_type_directed_dimension( - body: Rc, - func_name: String, - param_name: &String, - dim: IterationDimension, - si: Rc>>, -) -> Option> { +pub fn try_type_directed_dimension(body: Rc, func_name: String, param_name: &String, dim: IterationDimension, si: Rc>>) -> Option> { match dim { - IterationDimension::TreeDescent => { - match try_dimension_for_param(body, func_name, param_name.clone(), true, false, si) { - Some(DescentEvidence::Strict) => Some(Rc::new(TerminationProof { - dimensions: Rc::new(vec![Rc::new(RankingDimension::TreeSize { - param: param_name.clone(), - })]), - })), - _ => None, - } - } - IterationDimension::CollectionFold => { - match try_dimension_for_param(body, func_name, param_name.clone(), false, true, si) { - Some(DescentEvidence::Strict) => Some(Rc::new(TerminationProof { - dimensions: Rc::new(vec![Rc::new(RankingDimension::ListLength { - param: param_name.clone(), - })]), - })), - _ => None, - } - } - IterationDimension::ArithmeticRepeat => { - match try_dimension_for_param(body, func_name, param_name.clone(), false, false, si) { - Some(DescentEvidence::Strict) => Some(Rc::new(TerminationProof { - dimensions: Rc::new(vec![Rc::new(RankingDimension::ArithmeticValue { - param: param_name.clone(), - })]), - })), - _ => None, - } - } - } + IterationDimension::TreeDescent => match try_dimension_for_param(body, func_name, param_name.clone(), true, false, si) { + Some(DescentEvidence::Strict) => Some(Rc::new(TerminationProof { + dimensions: Rc::new(vec![Rc::new(RankingDimension::TreeSize { + param: param_name.clone(), +})]), +})), + _ => None, +}, + IterationDimension::CollectionFold => match try_dimension_for_param(body, func_name, param_name.clone(), false, true, si) { + Some(DescentEvidence::Strict) => Some(Rc::new(TerminationProof { + dimensions: Rc::new(vec![Rc::new(RankingDimension::ListLength { + param: param_name.clone(), +})]), +})), + _ => None, +}, + IterationDimension::ArithmeticRepeat => match try_dimension_for_param(body, func_name, param_name.clone(), false, false, si) { + Some(DescentEvidence::Strict) => Some(Rc::new(TerminationProof { + dimensions: Rc::new(vec![Rc::new(RankingDimension::ArithmeticValue { + param: param_name.clone(), +})]), +})), + _ => None, +}, +} } -pub fn construct_termination_proof( - func_name: &String, - body: &Rc, - params: &Rc>>, - parser_always_advancing: Rc>, - si: &Rc>>, -) -> Option> { +pub fn construct_termination_proof(func_name: &String, body: &Rc, params: &Rc>>, parser_always_advancing: Rc>, si: &Rc>>) -> Option> { { - let structural_proof = params - .clone() - .iter() - .cloned() - .fold(None, |best: _, p: Rc| match best.clone() { - Some(_) => best.clone(), - None => { - let pname = param_node_name_at(p.clone(), si.clone()); - let type_name = authored_name_at(si.clone(), ¶m_node_type_expr(&p)); - match type_iteration_dimension(&type_name) { - Some(dim) => try_type_directed_dimension( - body.clone(), - func_name.clone(), - &pname, - dim.clone(), - si.clone(), - ), - None => { - let tree_evidence = try_dimension_for_param( - body.clone(), - func_name.clone(), - pname.clone(), - true, - false, - si.clone(), - ); - match tree_evidence.clone() { - Some(DescentEvidence::Strict) => Some(Rc::new(TerminationProof { - dimensions: Rc::new(vec![Rc::new( - RankingDimension::TreeSize { - param: pname.clone(), - }, - )]), - })), - _ => { - let list_evidence = try_dimension_for_param( - body.clone(), - func_name.clone(), - pname.clone(), - false, - true, - si.clone(), - ); - match list_evidence.clone() { - Some(DescentEvidence::Strict) => { - Some(Rc::new(TerminationProof { - dimensions: Rc::new(vec![Rc::new( - RankingDimension::ListLength { - param: pname.clone(), - }, - )]), - })) - } - _ => { - let arith_evidence = try_dimension_for_param( - body.clone(), - func_name.clone(), - pname.clone(), - false, - false, - si.clone(), - ); - match arith_evidence.clone() { - Some(DescentEvidence::Strict) => { - Some(Rc::new(TerminationProof { - dimensions: Rc::new(vec![Rc::new( - RankingDimension::ArithmeticValue { - param: pname.clone(), - }, - )]), - })) - } - _ => None, - } - } - } - } - } - } - } - } - }); - let single_dim_proof = match structural_proof.clone() { - Some(_) => structural_proof.clone(), - None => match parser_state_param(params.clone(), si.clone()) { - Some(state_param) => { - let self_set = seed_bool_map(func_name.clone()); - let edges = collect_parser_progress_edges( - &func_name, - &body, - &state_param, - &self_set, - &empty_parser_progress_env(), - &parser_always_advancing, - &v2_rt::rc_empty_map::(), - &si, - ); - if (((edges.clone().len() as i64) > 0) && { - let mut __all = true; - for edge in edges.clone().iter().cloned() { - if !(edge.progress.clone() == DescentEvidence::Strict) { - __all = false; - break; - } - } - __all - }) { - Some(Rc::new(TerminationProof { - dimensions: Rc::new(vec![Rc::new(RankingDimension::TokenPosition { - param: state_param.name.clone(), - })]), - })) - } else { - None - } - } - None => None, - }, - }; - match single_dim_proof.clone() { - Some(_) => single_dim_proof.clone(), - None => { - let self_set = seed_bool_map(func_name.clone()); - let func_entry = Rc::new(FuncEntry { - name: func_name.clone(), - body: body.clone(), - params: params.clone(), - span: body.span.clone(), - is_tail_recursive: false, - }); - let func_index = seed_func_entry_map(func_name.clone(), func_entry); - construct_scc_termination_proof( - &Rc::new(vec![func_name.clone()]), - &func_index, - &self_set, - &si, - ) + let structural_proof = params.clone().iter().cloned().fold(None, |best: _, p: Rc| match best.clone() { + Some(_) => best.clone(), + None => { + let pname = param_node_name_at(p.clone(), si.clone()); +let type_name = authored_name_at(si.clone(), ¶m_node_type_expr(&p)); +match type_iteration_dimension(&type_name) { + Some(dim) => try_type_directed_dimension(body.clone(), func_name.clone(), &pname, dim.clone(), si.clone()), + None => { + let tree_evidence = try_dimension_for_param(body.clone(), func_name.clone(), pname.clone(), true, false, si.clone()); +match tree_evidence.clone() { + Some(DescentEvidence::Strict) => Some(Rc::new(TerminationProof { + dimensions: Rc::new(vec![Rc::new(RankingDimension::TreeSize { + param: pname.clone(), +})]), +})), + _ => { + let list_evidence = try_dimension_for_param(body.clone(), func_name.clone(), pname.clone(), false, true, si.clone()); +match list_evidence.clone() { + Some(DescentEvidence::Strict) => Some(Rc::new(TerminationProof { + dimensions: Rc::new(vec![Rc::new(RankingDimension::ListLength { + param: pname.clone(), +})]), +})), + _ => { + let arith_evidence = try_dimension_for_param(body.clone(), func_name.clone(), pname.clone(), false, false, si.clone()); +match arith_evidence.clone() { + Some(DescentEvidence::Strict) => Some(Rc::new(TerminationProof { + dimensions: Rc::new(vec![Rc::new(RankingDimension::ArithmeticValue { + param: pname.clone(), +})]), +})), + _ => None, +} +}, +} +}, +} +}, +} +}, +}); +let single_dim_proof = match structural_proof.clone() { + Some(_) => structural_proof.clone(), + None => match parser_state_param(params.clone(), si.clone()) { + Some(state_param) => { + let self_set = seed_bool_map(func_name.clone()); +let edges = collect_parser_progress_edges(&func_name, &body, &state_param, &self_set, &empty_parser_progress_env(), &parser_always_advancing, &v2_rt::rc_empty_map::(), &si); +if (((edges.clone().len() as i64) > 0) && { let mut __all = true; for edge in edges.clone().iter().cloned() { if !((edge.progress.clone() == DescentEvidence::Strict)) { __all = false; break; } } __all }) { + Some(Rc::new(TerminationProof { + dimensions: Rc::new(vec![Rc::new(RankingDimension::TokenPosition { + param: state_param.name.clone(), +})]), +})) + } else { + None } - } - } +}, + None => None, +}, +}; +match single_dim_proof.clone() { + Some(_) => single_dim_proof.clone(), + None => { + let self_set = seed_bool_map(func_name.clone()); +let func_entry = Rc::new(FuncEntry { + name: func_name.clone(), + body: body.clone(), + params: params.clone(), + span: body.span.clone(), + is_tail_recursive: false, +}); +let func_index = seed_func_entry_map(func_name.clone(), func_entry); +construct_scc_termination_proof(&Rc::new(vec![func_name.clone()]), &func_index, &self_set, &si) +}, +} +} } -pub fn construct_branching_termination_proof( - func_name: String, - body: Rc, - params: Rc>>, - si: Rc>>, -) -> Option> { - params - .iter() - .cloned() - .fold(None, |best: _, p: Rc| match best.clone() { - Some(_) => best.clone(), - None => { - let pname = param_node_name_at(p.clone(), si.clone()); - let type_name = authored_name_at(si.clone(), ¶m_node_type_expr(&p)); - match type_iteration_dimension(&type_name) { - Some(IterationDimension::TreeDescent) => { - match try_branching_dimension_for_param( - body.clone(), - func_name.clone(), - pname.clone(), - true, - false, - si.clone(), - ) { - Some(DescentEvidence::Strict) => Some(Rc::new(TerminationProof { - dimensions: Rc::new(vec![Rc::new(RankingDimension::TreeSize { - param: pname.clone(), - })]), - })), - _ => None, - } - } - Some(IterationDimension::CollectionFold) => { - match try_branching_dimension_for_param( - body.clone(), - func_name.clone(), - pname.clone(), - false, - true, - si.clone(), - ) { - Some(DescentEvidence::Strict) => Some(Rc::new(TerminationProof { - dimensions: Rc::new(vec![Rc::new(RankingDimension::ListLength { - param: pname.clone(), - })]), - })), - _ => None, - } - } - Some(IterationDimension::ArithmeticRepeat) => None, - None => { - let tree_ev = try_branching_dimension_for_param( - body.clone(), - func_name.clone(), - pname.clone(), - true, - false, - si.clone(), - ); - match tree_ev.clone() { - Some(DescentEvidence::Strict) => Some(Rc::new(TerminationProof { - dimensions: Rc::new(vec![Rc::new(RankingDimension::TreeSize { - param: pname.clone(), - })]), - })), - _ => { - let list_ev = try_branching_dimension_for_param( - body.clone(), - func_name.clone(), - pname.clone(), - false, - true, - si.clone(), - ); - match list_ev.clone() { - Some(DescentEvidence::Strict) => { - Some(Rc::new(TerminationProof { - dimensions: Rc::new(vec![Rc::new( - RankingDimension::ListLength { - param: pname.clone(), - }, - )]), - })) - } - _ => None, - } - } - } - } - } - } - }) +pub fn construct_branching_termination_proof(func_name: String, body: Rc, params: Rc>>, si: Rc>>) -> Option> { + params.iter().cloned().fold(None, |best: _, p: Rc| match best.clone() { + Some(_) => best.clone(), + None => { + let pname = param_node_name_at(p.clone(), si.clone()); +let type_name = authored_name_at(si.clone(), ¶m_node_type_expr(&p)); +match type_iteration_dimension(&type_name) { + Some(IterationDimension::TreeDescent) => match try_branching_dimension_for_param(body.clone(), func_name.clone(), pname.clone(), true, false, si.clone()) { + Some(DescentEvidence::Strict) => Some(Rc::new(TerminationProof { + dimensions: Rc::new(vec![Rc::new(RankingDimension::TreeSize { + param: pname.clone(), +})]), +})), + _ => None, +}, + Some(IterationDimension::CollectionFold) => match try_branching_dimension_for_param(body.clone(), func_name.clone(), pname.clone(), false, true, si.clone()) { + Some(DescentEvidence::Strict) => Some(Rc::new(TerminationProof { + dimensions: Rc::new(vec![Rc::new(RankingDimension::ListLength { + param: pname.clone(), +})]), +})), + _ => None, +}, + Some(IterationDimension::ArithmeticRepeat) => None, + None => { + let tree_ev = try_branching_dimension_for_param(body.clone(), func_name.clone(), pname.clone(), true, false, si.clone()); +match tree_ev.clone() { + Some(DescentEvidence::Strict) => Some(Rc::new(TerminationProof { + dimensions: Rc::new(vec![Rc::new(RankingDimension::TreeSize { + param: pname.clone(), +})]), +})), + _ => { + let list_ev = try_branching_dimension_for_param(body.clone(), func_name.clone(), pname.clone(), false, true, si.clone()); +match list_ev.clone() { + Some(DescentEvidence::Strict) => Some(Rc::new(TerminationProof { + dimensions: Rc::new(vec![Rc::new(RankingDimension::ListLength { + param: pname.clone(), +})]), +})), + _ => None, +} +}, +} +}, +} +}, +}) } pub fn proof_to_call_pattern(proof: Rc) -> Rc { match proof.dimensions.clone().first().cloned() { - Some(dim) => match (*dim.clone()).clone() { - RankingDimension::TreeSize { param: p, .. } => { - Rc::new(CallPattern::ChildAccessorCall { - accessor: p.clone(), - }) - } - RankingDimension::ListLength { param: p, .. } => { - Rc::new(CallPattern::CollectionShrinkCall { - amount: Rc::new(PositiveDescentAmount::OneStep), - collection: p.clone(), - }) - } - RankingDimension::ArithmeticValue { param: p, .. } => { - Rc::new(CallPattern::ArithmeticSubtractCall { - steps: Rc::new(PositiveDescentAmount::OneStep), - ring_param: p.clone(), - }) - } - RankingDimension::TokenPosition { param: p, .. } => { - Rc::new(CallPattern::ParserAdvanceCall { witness: p.clone() }) - } - RankingDimension::SetCardinality { param: p, .. } => { - Rc::new(CallPattern::WorklistDrainCall { element: p.clone() }) - } - }, - None => Rc::new(CallPattern::SameArgumentCall), - } + Some(dim) => match (*dim.clone()).clone() { + RankingDimension::TreeSize { param: p, .. } => Rc::new(CallPattern::ChildAccessorCall { + accessor: p.clone(), +}), + RankingDimension::ListLength { param: p, .. } => Rc::new(CallPattern::CollectionShrinkCall { + amount: Rc::new(PositiveDescentAmount::OneStep), + collection: p.clone(), +}), + RankingDimension::ArithmeticValue { param: p, .. } => Rc::new(CallPattern::ArithmeticSubtractCall { + steps: Rc::new(PositiveDescentAmount::OneStep), + ring_param: p.clone(), +}), + RankingDimension::TokenPosition { param: p, .. } => Rc::new(CallPattern::ParserAdvanceCall { + witness: p.clone(), +}), + RankingDimension::SetCardinality { param: p, .. } => Rc::new(CallPattern::WorklistDrainCall { + element: p.clone(), +}), +}, + None => Rc::new(CallPattern::SameArgumentCall), +} } -pub fn classify_recursion_pattern( - func_name: &String, - body: &Rc, - params: &Rc>>, - parser_always_advancing: Rc>, - si: &Rc>>, -) -> Rc { +pub fn classify_recursion_pattern(func_name: &String, body: &Rc, params: &Rc>>, parser_always_advancing: Rc>, si: &Rc>>) -> Rc { { let path_calls = max_path_self_calls(body.clone(), func_name.clone(), si.clone()); - if (path_calls.clone() == 0) { +if (path_calls.clone() == 0) { { let outer = match params.clone().first().cloned() { - Some(p0) => param_node_name_at(p0.clone(), si.clone()), - None => "_fold_body".to_string(), - }; - lower_call_pattern(Rc::new(CallPattern::FoldBodyCall { - outer_collection: outer, - })) - } + Some(p0) => param_node_name_at(p0.clone(), si.clone()), + None => "_fold_body".to_string(), +}; +lower_call_pattern(Rc::new(CallPattern::FoldBodyCall { + outer_collection: outer, +})) +} } else { { - let all_evidence = - collect_self_call_evidence(body.clone(), func_name.clone(), si.clone()); - let has_evidence = ((all_evidence.clone().len() as i64) > 0); - let all_structural = (has_evidence && { - let mut __all = true; - for call_ev in all_evidence.clone().iter().cloned() { - if !({ - let mut __found = false; - for rel in call_ev.clone().iter().cloned() { - if match (*rel.clone()).clone() { - SubValueRelation::StrictSubValue { .. } => true, - SubValueRelation::IteratedSubValue { .. } => true, - SubValueRelation::ArithmeticDescent { .. } => true, - _ => false, - } { - __found = true; - break; - } - } - __found - }) { - __all = false; - break; - } - } - __all - }); - if all_structural { + let all_evidence = collect_self_call_evidence(body.clone(), func_name.clone(), si.clone()); +let has_evidence = ((all_evidence.clone().len() as i64) > 0); +let all_structural = (has_evidence && { let mut __all = true; for call_ev in all_evidence.clone().iter().cloned() { if !({ let mut __found = false; for rel in call_ev.clone().iter().cloned() { if match (*rel.clone()).clone() { + SubValueRelation::StrictSubValue { .. } => true, + SubValueRelation::IteratedSubValue { .. } => true, + SubValueRelation::ArithmeticDescent { .. } => true, + _ => false, +} { __found = true; break; } } __found }) { __all = false; break; } } __all }); +if all_structural { { - let all_calls_arithmetic_only = { - let mut __all = true; - for call_ev in all_evidence.clone().iter().cloned() { - if !({ - let has_tree = { - let mut __found = false; - for rel in call_ev.clone().iter().cloned() { - if match (*rel.clone()).clone() { - SubValueRelation::StrictSubValue { .. } => true, - SubValueRelation::IteratedSubValue { .. } => true, - _ => false, - } { - __found = true; - break; - } - } - __found - }; - let has_arith = { - let mut __found = false; - for rel in call_ev.clone().iter().cloned() { - if match (*rel.clone()).clone() { - SubValueRelation::ArithmeticDescent { .. } => true, - _ => false, - } { - __found = true; - break; - } - } - __found - }; - (has_arith.clone() && !has_tree.clone()) - }) { - __all = false; - break; - } - } - __all - }; - let first_call = if all_calls_arithmetic_only { - Rc::new({ - let mut __result = Vec::new(); - for call_ev in all_evidence.clone().iter().cloned() { - __result.extend( - (*Rc::new({ - let mut __result = Vec::new(); - for rel in call_ev.clone().iter().cloned() { - if match (*rel.clone()).clone() { - SubValueRelation::ArithmeticDescent { - .. - } => true, - _ => false, - } { - __result.push(rel); - } - } - __result - })) - .iter() - .cloned(), - ); - } - __result - }) - .first() - .cloned() + let all_calls_arithmetic_only = { let mut __all = true; for call_ev in all_evidence.clone().iter().cloned() { if !({ + let has_tree = { let mut __found = false; for rel in call_ev.clone().iter().cloned() { if match (*rel.clone()).clone() { + SubValueRelation::StrictSubValue { .. } => true, + SubValueRelation::IteratedSubValue { .. } => true, + _ => false, +} { __found = true; break; } } __found }; +let has_arith = { let mut __found = false; for rel in call_ev.clone().iter().cloned() { if match (*rel.clone()).clone() { + SubValueRelation::ArithmeticDescent { .. } => true, + _ => false, +} { __found = true; break; } } __found }; +(has_arith.clone() && !has_tree.clone()) +}) { __all = false; break; } } __all }; +let first_call = if all_calls_arithmetic_only { + Rc::new({ let mut __result = Vec::new(); for call_ev in all_evidence.clone().iter().cloned() { __result.extend((*Rc::new({ let mut __result = Vec::new(); for rel in call_ev.clone().iter().cloned() { if match (*rel.clone()).clone() { + SubValueRelation::ArithmeticDescent { .. } => true, + _ => false, +} { __result.push(rel); } } __result })).iter().cloned()); } __result }).first().cloned() } else { { - let tree_rels = - Rc::new({ - let mut __result = Vec::new(); - for call_ev in all_evidence.clone().iter().cloned() { - __result.extend( - (*Rc::new({ - let mut __result = Vec::new(); - for rel in call_ev.clone().iter().cloned() { - if match (*rel.clone()).clone() { + let tree_rels = Rc::new({ let mut __result = Vec::new(); for call_ev in all_evidence.clone().iter().cloned() { __result.extend((*Rc::new({ let mut __result = Vec::new(); for rel in call_ev.clone().iter().cloned() { if match (*rel.clone()).clone() { SubValueRelation::StrictSubValue { .. } => true, SubValueRelation::IteratedSubValue { .. } => true, _ => false, -} { __result.push(rel); } - } - __result - })) - .iter() - .cloned(), - ); - } - __result - }); - match tree_rels.clone().first().cloned() { - Some(_) => tree_rels.clone().first().cloned(), - None => Rc::new({ - let mut __result = Vec::new(); - for call_ev in all_evidence.clone().iter().cloned() { - __result.extend( - (*Rc::new({ - let mut __result = Vec::new(); - for rel in call_ev.clone().iter().cloned() { - if match (*rel.clone()).clone() { +} { __result.push(rel); } } __result })).iter().cloned()); } __result }); +match tree_rels.clone().first().cloned() { + Some(_) => tree_rels.clone().first().cloned(), + None => Rc::new({ let mut __result = Vec::new(); for call_ev in all_evidence.clone().iter().cloned() { __result.extend((*Rc::new({ let mut __result = Vec::new(); for rel in call_ev.clone().iter().cloned() { if match (*rel.clone()).clone() { SubValueRelation::ArithmeticDescent { .. } => true, _ => false, -} { __result.push(rel); } - } - __result - })) - .iter() - .cloned(), - ); - } - __result - }) - .first() - .cloned(), - } - } - }; - let is_arithmetic_branching = match first_call.clone() { - Some(rel) => match (*rel.clone()).clone() { - SubValueRelation::ArithmeticDescent { .. } => { - (path_calls.clone() > 1) - } - _ => false, - }, - None => false, +} { __result.push(rel); } } __result })).iter().cloned()); } __result }).first().cloned(), +} +} }; - if is_arithmetic_branching { +let is_arithmetic_branching = match first_call.clone() { + Some(rel) => match (*rel.clone()).clone() { + SubValueRelation::ArithmeticDescent { .. } => (path_calls.clone() > 1), + _ => false, +}, + None => false, +}; +if is_arithmetic_branching { lower_call_pattern(Rc::new(CallPattern::SameArgumentCall)) } else { match first_call.clone() { - Some(rel) => match sub_value_to_lowering_target(rel.clone()) { - Some(target) => target.clone(), - None => { - lower_call_pattern(Rc::new(CallPattern::SameArgumentCall)) - } - }, - None => lower_call_pattern(Rc::new(CallPattern::SameArgumentCall)), - } + Some(rel) => match sub_value_to_lowering_target(rel.clone()) { + Some(target) => target.clone(), + None => lower_call_pattern(Rc::new(CallPattern::SameArgumentCall)), +}, + None => lower_call_pattern(Rc::new(CallPattern::SameArgumentCall)), +} } - } +} } else { { - let proof = construct_termination_proof( - &func_name, - &body, - ¶ms, - parser_always_advancing, - &si, - ); - let proof_safe_for_branching = match proof.clone() { - Some(p) => { - if ((p.dimensions.clone().len() as i64) == 0) { - false - } else { - { - let mut __all = true; - for dim in p.dimensions.clone().iter().cloned() { - if !(match (*dim.clone()).clone() { - RankingDimension::TreeSize { .. } => true, - RankingDimension::ListLength { .. } => true, - _ => false, - }) { - __all = false; - break; - } - } - __all - } - } - } - None => false, - }; - let branching_proof = - if ((path_calls.clone() > 1) && !proof_safe_for_branching.clone()) { - construct_branching_termination_proof( - func_name.clone(), - body.clone(), - params.clone(), - si.clone(), - ) - } else { - None - }; - let branching_proof_safe = match branching_proof.clone() { - Some(bp) => { - if ((bp.dimensions.clone().len() as i64) == 0) { - false - } else { - { - let mut __all = true; - for dim in bp.dimensions.clone().iter().cloned() { - if !(match (*dim.clone()).clone() { - RankingDimension::TreeSize { .. } => true, - RankingDimension::ListLength { .. } => true, - _ => false, - }) { - __all = false; - break; - } - } - __all - } - } - } - None => false, + let proof = construct_termination_proof(&func_name, &body, ¶ms, parser_always_advancing, &si); +let proof_safe_for_branching = match proof.clone() { + Some(p) => if ((p.dimensions.clone().len() as i64) == 0) { + false + } else { + { let mut __all = true; for dim in p.dimensions.clone().iter().cloned() { if !(match (*dim.clone()).clone() { + RankingDimension::TreeSize { .. } => true, + RankingDimension::ListLength { .. } => true, + _ => false, +}) { __all = false; break; } } __all } + }, + None => false, +}; +let branching_proof = if ((path_calls.clone() > 1) && !proof_safe_for_branching.clone()) { + construct_branching_termination_proof(func_name.clone(), body.clone(), params.clone(), si.clone()) + } else { + None }; - match proof.clone() { - Some(p) => { - if ((path_calls.clone() == 1) || proof_safe_for_branching.clone()) { - lower_call_pattern(proof_to_call_pattern(p.clone())) - } else { - if branching_proof_safe { - match branching_proof.clone() { - Some(bp) => lower_call_pattern(proof_to_call_pattern( - bp.clone(), - )), - None => lower_call_pattern(Rc::new( - CallPattern::SameArgumentCall, - )), - } - } else { - lower_call_pattern(Rc::new(CallPattern::SameArgumentCall)) - } - } - } - None => { - if (path_calls.clone() > 1) { - match branching_proof.clone() { - Some(bp) => { - if branching_proof_safe { - lower_call_pattern(proof_to_call_pattern( - bp.clone(), - )) - } else { - lower_call_pattern(Rc::new( - CallPattern::SameArgumentCall, - )) - } - } - None => lower_call_pattern(Rc::new( - CallPattern::SameArgumentCall, - )), - } - } else { - lower_call_pattern(Rc::new(CallPattern::SameArgumentCall)) - } +let branching_proof_safe = match branching_proof.clone() { + Some(bp) => if ((bp.dimensions.clone().len() as i64) == 0) { + false + } else { + { let mut __all = true; for dim in bp.dimensions.clone().iter().cloned() { if !(match (*dim.clone()).clone() { + RankingDimension::TreeSize { .. } => true, + RankingDimension::ListLength { .. } => true, + _ => false, +}) { __all = false; break; } } __all } + }, + None => false, +}; +match proof.clone() { + Some(p) => if ((path_calls.clone() == 1) || proof_safe_for_branching.clone()) { + lower_call_pattern(proof_to_call_pattern(p.clone())) + } else { + if branching_proof_safe { + match branching_proof.clone() { + Some(bp) => lower_call_pattern(proof_to_call_pattern(bp.clone())), + None => lower_call_pattern(Rc::new(CallPattern::SameArgumentCall)), +} + } else { + lower_call_pattern(Rc::new(CallPattern::SameArgumentCall)) } - } - } + }, + None => if (path_calls.clone() > 1) { + match branching_proof.clone() { + Some(bp) => if branching_proof_safe { + lower_call_pattern(proof_to_call_pattern(bp.clone())) + } else { + lower_call_pattern(Rc::new(CallPattern::SameArgumentCall)) + }, + None => lower_call_pattern(Rc::new(CallPattern::SameArgumentCall)), +} + } else { + lower_call_pattern(Rc::new(CallPattern::SameArgumentCall)) + }, +} +} } - } +} } - } +} } -pub fn bounded_recursive_cost( - target: Rc, - per_iter: Rc, - func_name: String, -) -> Rc { +pub fn bounded_recursive_cost(target: Rc, per_iter: Rc, func_name: String) -> Rc { { let p = size_bound_param(target.bound.clone()); - match p { - Some(v) => { - let var = v2_rt::concat("n_".to_string(), v.clone()); - Rc::new(CostExpr::CostSum { - binder: var.clone(), - upper: Rc::new(SizeExpr::SizeVar { name: var.clone() }), - body: simplify_cost(per_iter), - }) - } - None => Rc::new(CostExpr::CostUnknown { - reason: v2_rt::concat("same-argument recursion in ".to_string(), func_name), - }), - } - } +match p { + Some(v) => { + let var = v2_rt::concat("n_".to_string(), v.clone()); +Rc::new(CostExpr::CostSum { + binder: var.clone(), + upper: Rc::new(SizeExpr::SizeVar { + name: var.clone(), +}), + body: simplify_cost(per_iter), +}) +}, + None => Rc::new(CostExpr::CostUnknown { + reason: v2_rt::concat("same-argument recursion in ".to_string(), func_name), +}), +} +} } -pub fn bounded_scc_cost( - target: Rc, - per_iter: Rc, - members: Rc>, -) -> Rc { +pub fn bounded_scc_cost(target: Rc, per_iter: Rc, members: Rc>) -> Rc { { let p = size_bound_param(target.bound.clone()); - match p { - Some(v) => { - let var = v2_rt::concat("n_".to_string(), v.clone()); - Rc::new(CostExpr::CostSum { - binder: var.clone(), - upper: Rc::new(SizeExpr::SizeVar { name: var.clone() }), - body: simplify_cost(per_iter), - }) - } - None => Rc::new(CostExpr::CostUnknown { - reason: v2_rt::concat( - "same-argument mutual recursion in ".to_string(), - match members.first().cloned() { - Some(n) => n.clone(), - None => "scc".to_string(), - }, - ), - }), - } - } +match p { + Some(v) => { + let var = v2_rt::concat("n_".to_string(), v.clone()); +Rc::new(CostExpr::CostSum { + binder: var.clone(), + upper: Rc::new(SizeExpr::SizeVar { + name: var.clone(), +}), + body: simplify_cost(per_iter), +}) +}, + None => Rc::new(CostExpr::CostUnknown { + reason: v2_rt::concat("same-argument mutual recursion in ".to_string(), match members.first().cloned() { + Some(n) => n.clone(), + None => "scc".to_string(), +}), +}), +} +} } pub fn is_unknown_cost(expr: Rc) -> bool { - stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || match (*expr).clone() { - CostExpr::CostUnknown { .. } => true, - CostExpr::CostAdd { - left: l, right: r, .. - } => (is_unknown_cost(l.clone()) || is_unknown_cost(r.clone())), - CostExpr::CostMul { - left: l, right: r, .. - } => (is_unknown_cost(l.clone()) || is_unknown_cost(r.clone())), - CostExpr::CostMax { - left: l, right: r, .. - } => (is_unknown_cost(l.clone()) || is_unknown_cost(r.clone())), - CostExpr::CostSum { body: bd, .. } => is_unknown_cost(bd.clone()), - _ => false, + stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { + match (*expr).clone() { + CostExpr::CostUnknown { .. } => true, + CostExpr::CostAdd { left: l, right: r, .. } => (is_unknown_cost(l.clone()) || is_unknown_cost(r.clone())), + CostExpr::CostMul { left: l, right: r, .. } => (is_unknown_cost(l.clone()) || is_unknown_cost(r.clone())), + CostExpr::CostMax { left: l, right: r, .. } => (is_unknown_cost(l.clone()) || is_unknown_cost(r.clone())), + CostExpr::CostSum { body: bd, .. } => is_unknown_cost(bd.clone()), + _ => false, +} }) } pub fn extract_unknown_reason(mut expr: Rc) -> String { loop { match (*expr).clone() { - CostExpr::CostUnknown { reason: r, .. } => { - break r.clone(); - } - CostExpr::CostAdd { - left: l, right: r, .. - } => { - if is_unknown_cost(l.clone()) { - { - let __tco_0 = l.clone(); - expr = __tco_0; - continue; - } - } else { - { - let __tco_0 = r.clone(); - expr = __tco_0; - continue; - } - } - } - CostExpr::CostMul { - left: l, right: r, .. - } => { - if is_unknown_cost(l.clone()) { - { - let __tco_0 = l.clone(); - expr = __tco_0; - continue; - } - } else { - { - let __tco_0 = r.clone(); - expr = __tco_0; - continue; - } - } - } - CostExpr::CostMax { - left: l, right: r, .. - } => { - if is_unknown_cost(l.clone()) { - { - let __tco_0 = l.clone(); - expr = __tco_0; - continue; - } - } else { - { - let __tco_0 = r.clone(); - expr = __tco_0; - continue; - } - } - } - CostExpr::CostSum { body: bd, .. } => { - let __tco_0 = bd.clone(); - expr = __tco_0; - continue; - } - _ => { - break "unknown".to_string(); - } - } - } + CostExpr::CostUnknown { reason: r, .. } => { break r.clone(); }, + CostExpr::CostAdd { left: l, right: r, .. } => { if is_unknown_cost(l.clone()) { + { + let __tco_0 = l.clone(); +expr = __tco_0; +continue; +} +} else { + { + let __tco_0 = r.clone(); +expr = __tco_0; +continue; +} +} }, + CostExpr::CostMul { left: l, right: r, .. } => { if is_unknown_cost(l.clone()) { + { + let __tco_0 = l.clone(); +expr = __tco_0; +continue; +} +} else { + { + let __tco_0 = r.clone(); +expr = __tco_0; +continue; +} +} }, + CostExpr::CostMax { left: l, right: r, .. } => { if is_unknown_cost(l.clone()) { + { + let __tco_0 = l.clone(); +expr = __tco_0; +continue; +} +} else { + { + let __tco_0 = r.clone(); +expr = __tco_0; +continue; +} +} }, + CostExpr::CostSum { body: bd, .. } => { { + let __tco_0 = bd.clone(); +expr = __tco_0; +continue; +} }, + _ => { break "unknown".to_string(); }, +} +} } -pub fn collect_local_call_edges_in_expr( - caller: &String, - body: &Rc, - local_func_set: &Rc>, - si: &Rc>>, -) -> Rc>> { +pub fn collect_local_call_edges_in_expr(caller: &String, body: &Rc, local_func_set: &Rc>, si: &Rc>>) -> Rc>> { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - let this_edges = match (*body.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { + { + let this_edges = match (*body.expr_data.clone()).clone() { + ExprData::ExprCall { .. } => { let callee = expr_call_func_at(body.clone(), si.clone()); - if set_has(local_func_set.clone(), callee.clone()) { +if set_has(local_func_set.clone(), callee.clone()) { Rc::new(vec![Rc::new(CallEdge { - caller: caller.clone(), - callee: callee.clone(), - })]) + caller: caller.clone(), + callee: callee.clone(), +})]) } else { Rc::new(vec![]) } - } - _ => Rc::new(vec![]), - }; - let child_edges = Rc::new({ - let mut __result = Vec::new(); - for child in body.children.clone().iter().cloned() { - __result.extend( - (*collect_local_call_edges_in_expr(&caller, &child, &local_func_set, &si)) - .iter() - .cloned(), - ); - } - __result - }); - v2_rt::concat(this_edges, child_edges) +}, + _ => Rc::new(vec![]), +}; +let child_edges = Rc::new({ let mut __result = Vec::new(); for child in body.children.clone().iter().cloned() { __result.extend((*collect_local_call_edges_in_expr(&caller, &child, &local_func_set, &si)).iter().cloned()); } __result }); +v2_rt::concat(this_edges, child_edges) +} }) } -pub fn build_call_graph( - func_entries: &Rc>>, - si: Rc>>, -) -> Rc { +pub fn build_call_graph(func_entries: &Rc>>, si: Rc>>) -> Rc { { - let names = Rc::new({ - let mut __result = Vec::new(); - for entry in func_entries.clone().iter().cloned() { - __result.push(entry.name.clone()); - } - __result - }); - let local_func_set = names.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, name: String| { - v2_rt::rc_map_insert(acc, name.clone(), true) - }, - ); - let edges = Rc::new({ - let mut __result = Vec::new(); - for entry in func_entries.clone().iter().cloned() { - __result.extend( - (*collect_local_call_edges_in_expr( - &entry.name.clone(), - &entry.body.clone(), - &local_func_set, - &si, - )) - .iter() - .cloned(), - ); - } - __result - }); - let initial_forward = seed_adjacency_map(names.clone()); - let initial_reverse = seed_adjacency_map(names.clone()); - edges.iter().cloned().fold( - Rc::new(CallGraph { - forward: initial_forward, - reverse: initial_reverse, - }), - |acc: Rc, edge: Rc| { - let forward_neighbors = - match v2_rt::map_get(&acc.forward.clone(), edge.caller.clone()) { - Some(ns) => ns.clone(), - None => Rc::new(vec![]), - }; - let reverse_neighbors = - match v2_rt::map_get(&acc.reverse.clone(), edge.callee.clone()) { - Some(ns) => ns.clone(), - None => Rc::new(vec![]), - }; - Rc::new(CallGraph { - forward: v2_rt::rc_map_insert( - acc.forward.clone(), - edge.caller.clone(), - v2_rt::rc_list_push(forward_neighbors.clone(), edge.callee.clone()), - ), - reverse: v2_rt::rc_map_insert( - acc.reverse.clone(), - edge.callee.clone(), - v2_rt::rc_list_push(reverse_neighbors.clone(), edge.caller.clone()), - ), - }) - }, - ) - } + let names = Rc::new({ let mut __result = Vec::new(); for entry in func_entries.clone().iter().cloned() { __result.push(entry.name.clone()); } __result }); +let local_func_set = names.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, name: String| v2_rt::rc_map_insert(acc, name.clone(), true)); +let edges = Rc::new({ let mut __result = Vec::new(); for entry in func_entries.clone().iter().cloned() { __result.extend((*collect_local_call_edges_in_expr(&entry.name.clone(), &entry.body.clone(), &local_func_set, &si)).iter().cloned()); } __result }); +let initial_forward = seed_adjacency_map(names.clone()); +let initial_reverse = seed_adjacency_map(names.clone()); +edges.iter().cloned().fold(Rc::new(CallGraph { + forward: initial_forward, + reverse: initial_reverse, +}), |acc: Rc, edge: Rc| { + let forward_neighbors = match v2_rt::map_get(&acc.forward.clone(), edge.caller.clone()) { + Some(ns) => ns.clone(), + None => Rc::new(vec![]), +}; +let reverse_neighbors = match v2_rt::map_get(&acc.reverse.clone(), edge.callee.clone()) { + Some(ns) => ns.clone(), + None => Rc::new(vec![]), +}; +Rc::new(CallGraph { + forward: v2_rt::rc_map_insert(acc.forward.clone(), edge.caller.clone(), v2_rt::rc_list_push(forward_neighbors.clone(), edge.callee.clone())), + reverse: v2_rt::rc_map_insert(acc.reverse.clone(), edge.callee.clone(), v2_rt::rc_list_push(reverse_neighbors.clone(), edge.caller.clone())), +}) +}) +} } pub fn scc_label(members: Rc>) -> String { match members.first().cloned() { - Some(name) => name.clone(), - None => "scc".to_string(), - } + Some(name) => name.clone(), + None => "scc".to_string(), +} } -pub fn classify_scc_call_progress( - arg_expr: &Rc, - param_name: &String, - descent_vars: &Rc>, - si: &Rc>>, -) -> DescentEvidence { +pub fn classify_scc_call_progress(arg_expr: &Rc, param_name: &String, descent_vars: &Rc>, si: &Rc>>) -> DescentEvidence { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { if is_child_descent_expr(&arg_expr, ¶m_name, &descent_vars, &si) { DescentEvidence::Strict @@ -5586,715 +2756,314 @@ pub fn classify_scc_call_progress( DescentEvidence::Strict } else { match (*arg_expr.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let vname = expr_var_name_at(arg_expr.clone(), si.clone()); - if set_has(descent_vars.clone(), vname.clone()) { - DescentEvidence::Strict + ExprData::ExprVar { .. } => { + let vname = expr_var_name_at(arg_expr.clone(), si.clone()); +if set_has(descent_vars.clone(), vname.clone()) { + DescentEvidence::Strict + } else { + if (vname.clone().as_str() == param_name.clone().as_str()) { + DescentEvidence::NonIncreasing } else { - if (vname.clone().as_str() == param_name.clone().as_str()) { - DescentEvidence::NonIncreasing - } else { - DescentEvidence::DescentUnknown - } + DescentEvidence::DescentUnknown } } - ExprData::ExprCall { .. } => { - if is_tree_size_preserving_wrapper(&arg_expr, si.clone()) { - classify_scc_call_progress( - &wrapper_inner_arg(arg_expr.clone()), - ¶m_name, - &descent_vars, - &si, - ) +}, + ExprData::ExprCall { .. } => if is_tree_size_preserving_wrapper(&arg_expr, si.clone()) { + classify_scc_call_progress(&wrapper_inner_arg(arg_expr.clone()), ¶m_name, &descent_vars, &si) + } else { + if is_sub_value_extractor(&arg_expr, si.clone()) { + { + let inner_progress = classify_scc_call_progress(&extractor_inner_arg(arg_expr.clone()), ¶m_name, &descent_vars, &si); +match inner_progress.clone() { + DescentEvidence::NonIncreasing => DescentEvidence::Strict, + _ => inner_progress.clone(), +} +} + } else { + if is_list_passthrough_call(arg_expr.clone(), si.clone()) { + match list_passthrough_inner_arg(arg_expr.clone(), si.clone()) { + Some(inner) => classify_scc_call_progress(&inner, ¶m_name, &descent_vars, &si), + None => DescentEvidence::DescentUnknown, +} } else { - if is_sub_value_extractor(&arg_expr, si.clone()) { - { - let inner_progress = classify_scc_call_progress( - &extractor_inner_arg(arg_expr.clone()), - ¶m_name, - &descent_vars, - &si, - ); - match inner_progress.clone() { - DescentEvidence::NonIncreasing => DescentEvidence::Strict, - _ => inner_progress.clone(), - } - } - } else { - if is_list_passthrough_call(arg_expr.clone(), si.clone()) { - match list_passthrough_inner_arg(arg_expr.clone(), si.clone()) { - Some(inner) => classify_scc_call_progress( - &inner, - ¶m_name, - &descent_vars, - &si, - ), - None => DescentEvidence::DescentUnknown, - } - } else { - DescentEvidence::DescentUnknown - } - } - } - } - ExprData::ExprFieldAccess { .. } => { - let base = field_access_base(arg_expr.clone()); - match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let bname = expr_var_name_at(base.clone(), si.clone()); - if (set_has(descent_vars.clone(), bname.clone()) - || (bname.clone().as_str() == param_name.clone().as_str())) - { - DescentEvidence::Strict - } else { - { - let field = - field_access_field_at(arg_expr.clone(), si.clone()); - if (field.as_str() == param_name.clone().as_str()) { - DescentEvidence::NonIncreasing - } else { - DescentEvidence::DescentUnknown - } - } - } - } - _ => DescentEvidence::DescentUnknown, + DescentEvidence::DescentUnknown } } - ExprData::ExprMethodCall { - method_semantics: ms, - .. - } => { - if is_generalized_shrink(&arg_expr, si.clone()) { + }, + ExprData::ExprFieldAccess { .. } => { + let base = field_access_base(arg_expr.clone()); +match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let bname = expr_var_name_at(base.clone(), si.clone()); +if (set_has(descent_vars.clone(), bname.clone()) || (bname.clone().as_str() == param_name.clone().as_str())) { + DescentEvidence::Strict + } else { { - let recv = method_receiver(arg_expr.clone()); - let recv_progress = classify_scc_call_progress( - &recv, - ¶m_name, - &descent_vars, - &si, - ); - match recv_progress { - DescentEvidence::Strict => DescentEvidence::Strict, - DescentEvidence::NonIncreasing => DescentEvidence::Strict, - DescentEvidence::DescentUnknown => { - DescentEvidence::DescentUnknown - } + let field = field_access_field_at(arg_expr.clone(), si.clone()); +if (field.as_str() == param_name.clone().as_str()) { + DescentEvidence::NonIncreasing + } else { + DescentEvidence::DescentUnknown } - } - } else { - DescentEvidence::DescentUnknown +} } - } - _ => DescentEvidence::DescentUnknown, - } +}, + _ => DescentEvidence::DescentUnknown, +} +}, + ExprData::ExprMethodCall { method_semantics: ms, .. } => if is_generalized_shrink(&arg_expr, si.clone()) { + { + let recv = method_receiver(arg_expr.clone()); +let recv_progress = classify_scc_call_progress(&recv, ¶m_name, &descent_vars, &si); +match recv_progress { + DescentEvidence::Strict => DescentEvidence::Strict, + DescentEvidence::NonIncreasing => DescentEvidence::Strict, + DescentEvidence::DescentUnknown => DescentEvidence::DescentUnknown, +} +} + } else { + DescentEvidence::DescentUnknown + }, + _ => DescentEvidence::DescentUnknown, +} } } }) } -pub fn collect_scc_child_edges( - body: &Rc, - caller: &String, - param_name: &String, - descent_vars: &Rc>, - target_set: &Rc>, - check_child: bool, - check_list: bool, - scc_measure_params: &Rc>>>, - si: &Rc>>, -) -> Rc>> { +pub fn collect_scc_child_edges(body: &Rc, caller: &String, param_name: &String, descent_vars: &Rc>, target_set: &Rc>, check_child: bool, check_list: bool, scc_measure_params: &Rc>>>, si: &Rc>>) -> Rc>> { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*body.expr_data.clone()).clone() { - ExprData::ExprLambda => Rc::new(vec![]), - ExprData::ExprCall { .. } => { - let callee = expr_call_func_at(body.clone(), si.clone()); - let own_edges = if set_has(target_set.clone(), callee.clone()) { - { - let callee_params = - match v2_rt::map_get(&scc_measure_params, callee.clone()) { - Some(p) => p.clone(), - None => v2_rt::rc_empty_map::(), - }; - let progress = body.children.clone().iter().cloned().fold( - DescentEvidence::DescentUnknown, - |acc: DescentEvidence, arg_node: Rc| { - let targets_measure = - match arg_name_at(arg_node.clone(), si.clone()) { - Some(aname) => { - (v2_rt::map_get(&callee_params, aname.clone()) != None) - } - None => false, - }; - if targets_measure.clone() { - { - let arg_progress = classify_scc_call_progress( - &arg_value(&arg_node), - ¶m_name, - &descent_vars, - &si, - ); - match arg_progress.clone() { - DescentEvidence::Strict => DescentEvidence::Strict, - DescentEvidence::NonIncreasing => match acc.clone() { - DescentEvidence::Strict => acc.clone(), - _ => DescentEvidence::NonIncreasing, - }, - DescentEvidence::DescentUnknown => acc.clone(), - } - } - } else { - acc.clone() - } - }, - ); - Rc::new(vec![Rc::new(ParserProgressEdge { - caller: caller.clone(), - callee: callee.clone(), - progress: progress, - })]) - } - } else { - Rc::new(vec![]) - }; - let child_edges = Rc::new({ - let mut __result = Vec::new(); - for child in body.children.clone().iter().cloned() { - __result.extend( - (*collect_scc_child_edges( - &child, - &caller, - ¶m_name, - &descent_vars, - &target_set, - check_child.clone(), - check_list.clone(), - &scc_measure_params, - &si, - )) - .iter() - .cloned(), - ); - } - __result - }); - v2_rt::concat(own_edges, child_edges) - } - ExprData::ExprMethodCall { - method_semantics: ms, - .. - } => { - let receiver = method_receiver(body.clone()); - let is_iter = is_algebra_iteration_method(ms.clone()); - let is_struct = is_structural_children(&receiver, ¶m_name, &descent_vars, &si); - if (is_iter && is_struct) { - { - let recv_edges = collect_scc_child_edges( - &receiver, - &caller, - ¶m_name, - &descent_vars, - &target_set, - check_child.clone(), - check_list.clone(), - &scc_measure_params, - &si, - ); - let args_edges = Rc::new({ - let mut __result = Vec::new(); - for arg_node in method_arg_nodes(body.clone()).iter().cloned() { - __result.extend( - (*{ - let arg_val = arg_value(&arg_node); - match (*arg_val.expr_data.clone()).clone() { - ExprData::ExprLambda => match iteration_element_name( - ms.clone(), - arg_val.clone(), - si.clone(), - ) { - Some(iter_name) => { - let ext_vars = v2_rt::rc_map_insert( - descent_vars.clone(), - iter_name.clone(), - true, - ); - collect_scc_child_edges( - &lambda_body(arg_val.clone()), - &caller, - ¶m_name, - &ext_vars, - &target_set, - check_child.clone(), - check_list.clone(), - &scc_measure_params, - &si, - ) - } - None => Rc::new(vec![]), - }, - _ => collect_scc_child_edges( - &arg_val, - &caller, - ¶m_name, - &descent_vars, - &target_set, - check_child.clone(), - check_list.clone(), - &scc_measure_params, - &si, - ), - } - }) - .iter() - .cloned(), - ); - } - __result - }); - v2_rt::concat(recv_edges, args_edges) - } - } else { - Rc::new({ - let mut __result = Vec::new(); - for child in body.children.clone().iter().cloned() { - __result.extend( - (*collect_scc_child_edges( - &child, - &caller, - ¶m_name, - &descent_vars, - &target_set, - check_child.clone(), - check_list.clone(), - &scc_measure_params, - &si, - )) - .iter() - .cloned(), - ); - } - __result - }) - } - } - ExprData::ExprLet => { - let val = let_value(body.clone()); - let val_edges = collect_scc_child_edges( - &val, - &caller, - ¶m_name, - &descent_vars, - &target_set, - check_child.clone(), - check_list.clone(), - &scc_measure_params, - &si, - ); - let is_direct = ((check_child.clone() - && is_child_descent_expr(&val, ¶m_name, &descent_vars, &si)) - || (check_list.clone() - && is_list_shrink_expr(&val, param_name.clone(), si.clone()))); - let is_var = match (*val.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => set_has( - descent_vars.clone(), - expr_var_name_at(val.clone(), si.clone()), - ), - _ => false, - }; - let is_option = is_if_option_descent( - &val, - param_name.clone(), - descent_vars.clone(), - check_child.clone(), - check_list.clone(), - &si, - ); - let is_match_descent = is_match_option_descent( - &val, - ¶m_name, - descent_vars.clone(), - check_child.clone(), - check_list.clone(), - &si, - ); - let is_wrapped = if is_tree_size_preserving_wrapper(&val, si.clone()) { - { - let inner = wrapper_inner_arg(val.clone()); - let inner_d = ((check_child.clone() - && is_child_descent_expr(&inner, ¶m_name, &descent_vars, &si)) - || (check_list.clone() - && is_list_shrink_expr(&inner, param_name.clone(), si.clone()))); - let inner_v = match (*inner.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => set_has( - descent_vars.clone(), - expr_var_name_at(inner.clone(), si.clone()), - ), - _ => false, - }; - (inner_d.clone() || inner_v.clone()) - } - } else { - false - }; - let is_extraction = if is_sub_value_extractor(&val, si.clone()) { - { - let inner = extractor_inner_arg(val.clone()); - let inner_d = ((check_child.clone() - && is_child_descent_expr(&inner, ¶m_name, &descent_vars, &si)) - || (check_list.clone() - && is_list_shrink_expr(&inner, param_name.clone(), si.clone()))); - let inner_v = match (*inner.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => set_has( - descent_vars.clone(), - expr_var_name_at(inner.clone(), si.clone()), - ), - _ => false, - }; - let inner_p = match (*inner.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - (expr_var_name_at(inner.clone(), si.clone()).as_str() - == param_name.clone().as_str()) - } - _ => false, - }; - ((inner_d.clone() || inner_v.clone()) || inner_p) - } - } else { - false - }; - let is_children_list = match (*val.expr_data.clone()).clone() { - ExprData::ExprFieldAccess { .. } => { - let base = field_access_base(val.clone()); - let field = field_access_field_at(val.clone(), si.clone()); - (is_children_list_field(field) - && match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let bname = expr_var_name_at(base.clone(), si.clone()); - ((bname.clone().as_str() == param_name.clone().as_str()) - || set_has(descent_vars.clone(), bname.clone())) - } - _ => false, - }) - } - _ => false, - }; - let is_passthrough = if is_list_passthrough_call(val.clone(), si.clone()) { - match list_passthrough_inner_arg(val.clone(), si.clone()) { - Some(inner) => { - (((check_child.clone() - && is_child_descent_expr(&inner, ¶m_name, &descent_vars, &si)) - || (check_list.clone() - && is_list_shrink_expr( - &inner, - param_name.clone(), - si.clone(), - ))) - || match (*inner.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => set_has( - descent_vars.clone(), - expr_var_name_at(inner.clone(), si.clone()), - ), - _ => false, - }) - } - None => false, - } - } else { - false - }; - let is_consuming_helper = (check_list.clone() - && is_tokens_consuming_call( - &val, - param_name.clone(), - descent_vars.clone(), - &si, - )); - let next_vars = if ((((((((is_direct || is_var) || is_option) - || is_match_descent) - || is_wrapped) - || is_extraction) - || is_children_list) - || is_passthrough) - || is_consuming_helper) + ExprData::ExprLambda => Rc::new(vec![]), + ExprData::ExprCall { .. } => { + let callee = expr_call_func_at(body.clone(), si.clone()); +let own_edges = if set_has(target_set.clone(), callee.clone()) { { - v2_rt::rc_map_insert( - descent_vars.clone(), - let_binding_name_at(body.clone(), si.clone()), - true, - ) - } else { - descent_vars.clone() - }; - let body_edges = match let_body(body.clone()) { - Some(b) => collect_scc_child_edges( - &b, - &caller, - ¶m_name, - &next_vars, - &target_set, - check_child.clone(), - check_list.clone(), - &scc_measure_params, - &si, - ), - None => Rc::new(vec![]), - }; - v2_rt::concat(val_edges, body_edges) - } - ExprData::ExprMatch => { - let scrut = match_scrutinee(body.clone()); - let scrut_edges = collect_scc_child_edges( - &scrut, - &caller, - ¶m_name, - &descent_vars, - &target_set, - check_child.clone(), - check_list.clone(), - &scc_measure_params, - &si, - ); - let arms_edges = Rc::new({ - let mut __result = Vec::new(); - for arm_node in match_arm_nodes(body.clone()).iter().cloned() { - __result.extend( - (*collect_scc_child_edges( - &arm_body(&arm_node), - &caller, - ¶m_name, - &descent_vars, - &target_set, - check_child.clone(), - check_list.clone(), - &scc_measure_params, - &si, - )) - .iter() - .cloned(), - ); - } - __result - }); - v2_rt::concat(scrut_edges, arms_edges) - } - ExprData::ExprBlock => { - let result = body.children.clone().iter().cloned().fold( - Rc::new(SccEdgeBlockAcc { - edges: Rc::new(vec![]), - vars: descent_vars.clone(), - }), - |acc: Rc, stmt: Rc| { - let stmt_edges = collect_scc_child_edges( - &stmt, - &caller, - ¶m_name, - &acc.vars.clone(), - &target_set, - check_child.clone(), - check_list.clone(), - &scc_measure_params, - &si, - ); - let next_vars = collect_descent_vars( - &stmt, - ¶m_name, - &acc.vars.clone(), - check_child.clone(), - check_list.clone(), - &si, - ); - Rc::new(SccEdgeBlockAcc { - edges: v2_rt::concat(acc.edges.clone(), stmt_edges.clone()), - vars: next_vars.clone(), - }) - }, - ); - result.edges.clone() - } - ExprData::ExprIf => { - let cond_edges = collect_scc_child_edges( - &if_condition(body.clone()), - &caller, - ¶m_name, - &descent_vars, - &target_set, - check_child.clone(), - check_list.clone(), - &scc_measure_params, - &si, - ); - let then_branch = if_then_branch(body.clone()); - let else_opt = if_else_branch(body.clone()); - let then_edges = collect_scc_child_edges( - &then_branch, - &caller, - ¶m_name, - &descent_vars, - &target_set, - check_child.clone(), - check_list.clone(), - &scc_measure_params, - &si, - ); - let else_edges = match else_opt { - Some(eb) => collect_scc_child_edges( - &eb, - &caller, - ¶m_name, - &descent_vars, - &target_set, - check_child.clone(), - check_list.clone(), - &scc_measure_params, - &si, - ), - None => Rc::new(vec![]), - }; - v2_rt::concat(cond_edges, v2_rt::concat(then_edges, else_edges)) + let callee_params = match v2_rt::map_get(&scc_measure_params, callee.clone()) { + Some(p) => p.clone(), + None => v2_rt::rc_empty_map::(), +}; +let progress = body.children.clone().iter().cloned().fold(DescentEvidence::DescentUnknown, |acc: DescentEvidence, arg_node: Rc| { + let targets_measure = match arg_name_at(arg_node.clone(), si.clone()) { + Some(aname) => (v2_rt::map_get(&callee_params, aname.clone()) != None), + None => false, +}; +if targets_measure.clone() { + { + let arg_progress = classify_scc_call_progress(&arg_value(&arg_node), ¶m_name, &descent_vars, &si); +match arg_progress.clone() { + DescentEvidence::Strict => DescentEvidence::Strict, + DescentEvidence::NonIncreasing => match acc.clone() { + DescentEvidence::Strict => acc.clone(), + _ => DescentEvidence::NonIncreasing, +}, + DescentEvidence::DescentUnknown => acc.clone(), +} +} + } else { + acc.clone() + } +}); +Rc::new(vec![Rc::new(ParserProgressEdge { + caller: caller.clone(), + callee: callee.clone(), + progress: progress, +})]) +} + } else { + Rc::new(vec![]) + }; +let child_edges = Rc::new({ let mut __result = Vec::new(); for child in body.children.clone().iter().cloned() { __result.extend((*collect_scc_child_edges(&child, &caller, ¶m_name, &descent_vars, &target_set, check_child.clone(), check_list.clone(), &scc_measure_params, &si)).iter().cloned()); } __result }); +v2_rt::concat(own_edges, child_edges) +}, + ExprData::ExprMethodCall { method_semantics: ms, .. } => { + let receiver = method_receiver(body.clone()); +let is_iter = is_algebra_iteration_method(ms.clone()); +let is_struct = is_structural_children(&receiver, ¶m_name, &descent_vars, &si); +if (is_iter && is_struct) { + { + let recv_edges = collect_scc_child_edges(&receiver, &caller, ¶m_name, &descent_vars, &target_set, check_child.clone(), check_list.clone(), &scc_measure_params, &si); +let args_edges = Rc::new({ let mut __result = Vec::new(); for arg_node in method_arg_nodes(body.clone()).iter().cloned() { __result.extend((*{ + let arg_val = arg_value(&arg_node); +match (*arg_val.expr_data.clone()).clone() { + ExprData::ExprLambda => match iteration_element_name(ms.clone(), arg_val.clone(), si.clone()) { + Some(iter_name) => { + let ext_vars = v2_rt::rc_map_insert(descent_vars.clone(), iter_name.clone(), true); +collect_scc_child_edges(&lambda_body(arg_val.clone()), &caller, ¶m_name, &ext_vars, &target_set, check_child.clone(), check_list.clone(), &scc_measure_params, &si) +}, + None => Rc::new(vec![]), +}, + _ => collect_scc_child_edges(&arg_val, &caller, ¶m_name, &descent_vars, &target_set, check_child.clone(), check_list.clone(), &scc_measure_params, &si), +} +}).iter().cloned()); } __result }); +v2_rt::concat(recv_edges, args_edges) +} + } else { + Rc::new({ let mut __result = Vec::new(); for child in body.children.clone().iter().cloned() { __result.extend((*collect_scc_child_edges(&child, &caller, ¶m_name, &descent_vars, &target_set, check_child.clone(), check_list.clone(), &scc_measure_params, &si)).iter().cloned()); } __result }) } - _ => Rc::new({ - let mut __result = Vec::new(); - for child in body.children.clone().iter().cloned() { - __result.extend( - (*collect_scc_child_edges( - &child, - &caller, - ¶m_name, - &descent_vars, - &target_set, - check_child.clone(), - check_list.clone(), - &scc_measure_params, - &si, - )) - .iter() - .cloned(), - ); - } - __result - }), - } +}, + ExprData::ExprLet => { + let val = let_value(body.clone()); +let val_edges = collect_scc_child_edges(&val, &caller, ¶m_name, &descent_vars, &target_set, check_child.clone(), check_list.clone(), &scc_measure_params, &si); +let is_direct = ((check_child.clone() && is_child_descent_expr(&val, ¶m_name, &descent_vars, &si)) || (check_list.clone() && is_list_shrink_expr(&val, param_name.clone(), si.clone()))); +let is_var = match (*val.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => set_has(descent_vars.clone(), expr_var_name_at(val.clone(), si.clone())), + _ => false, +}; +let is_option = is_if_option_descent(&val, param_name.clone(), descent_vars.clone(), check_child.clone(), check_list.clone(), &si); +let is_match_descent = is_match_option_descent(&val, ¶m_name, descent_vars.clone(), check_child.clone(), check_list.clone(), &si); +let is_wrapped = if is_tree_size_preserving_wrapper(&val, si.clone()) { + { + let inner = wrapper_inner_arg(val.clone()); +let inner_d = ((check_child.clone() && is_child_descent_expr(&inner, ¶m_name, &descent_vars, &si)) || (check_list.clone() && is_list_shrink_expr(&inner, param_name.clone(), si.clone()))); +let inner_v = match (*inner.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => set_has(descent_vars.clone(), expr_var_name_at(inner.clone(), si.clone())), + _ => false, +}; +(inner_d.clone() || inner_v.clone()) +} + } else { + false + }; +let is_extraction = if is_sub_value_extractor(&val, si.clone()) { + { + let inner = extractor_inner_arg(val.clone()); +let inner_d = ((check_child.clone() && is_child_descent_expr(&inner, ¶m_name, &descent_vars, &si)) || (check_list.clone() && is_list_shrink_expr(&inner, param_name.clone(), si.clone()))); +let inner_v = match (*inner.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => set_has(descent_vars.clone(), expr_var_name_at(inner.clone(), si.clone())), + _ => false, +}; +let inner_p = match (*inner.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => (expr_var_name_at(inner.clone(), si.clone()).as_str() == param_name.clone().as_str()), + _ => false, +}; +((inner_d.clone() || inner_v.clone()) || inner_p) +} + } else { + false + }; +let is_children_list = match (*val.expr_data.clone()).clone() { + ExprData::ExprFieldAccess { .. } => { + let base = field_access_base(val.clone()); +let field = field_access_field_at(val.clone(), si.clone()); +(is_children_list_field(field) && match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let bname = expr_var_name_at(base.clone(), si.clone()); +((bname.clone().as_str() == param_name.clone().as_str()) || set_has(descent_vars.clone(), bname.clone())) +}, + _ => false, +}) +}, + _ => false, +}; +let is_passthrough = if is_list_passthrough_call(val.clone(), si.clone()) { + match list_passthrough_inner_arg(val.clone(), si.clone()) { + Some(inner) => (((check_child.clone() && is_child_descent_expr(&inner, ¶m_name, &descent_vars, &si)) || (check_list.clone() && is_list_shrink_expr(&inner, param_name.clone(), si.clone()))) || match (*inner.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => set_has(descent_vars.clone(), expr_var_name_at(inner.clone(), si.clone())), + _ => false, +}), + None => false, +} + } else { + false + }; +let is_consuming_helper = (check_list.clone() && is_tokens_consuming_call(&val, param_name.clone(), descent_vars.clone(), &si)); +let next_vars = if ((((((((is_direct || is_var) || is_option) || is_match_descent) || is_wrapped) || is_extraction) || is_children_list) || is_passthrough) || is_consuming_helper) { + v2_rt::rc_map_insert(descent_vars.clone(), let_binding_name_at(body.clone(), si.clone()), true) + } else { + descent_vars.clone() + }; +let body_edges = match let_body(body.clone()) { + Some(b) => collect_scc_child_edges(&b, &caller, ¶m_name, &next_vars, &target_set, check_child.clone(), check_list.clone(), &scc_measure_params, &si), + None => Rc::new(vec![]), +}; +v2_rt::concat(val_edges, body_edges) +}, + ExprData::ExprMatch => { + let scrut = match_scrutinee(body.clone()); +let scrut_edges = collect_scc_child_edges(&scrut, &caller, ¶m_name, &descent_vars, &target_set, check_child.clone(), check_list.clone(), &scc_measure_params, &si); +let arms_edges = Rc::new({ let mut __result = Vec::new(); for arm_node in match_arm_nodes(body.clone()).iter().cloned() { __result.extend((*collect_scc_child_edges(&arm_body(&arm_node), &caller, ¶m_name, &descent_vars, &target_set, check_child.clone(), check_list.clone(), &scc_measure_params, &si)).iter().cloned()); } __result }); +v2_rt::concat(scrut_edges, arms_edges) +}, + ExprData::ExprBlock => { + let result = body.children.clone().iter().cloned().fold(Rc::new(SccEdgeBlockAcc { + edges: Rc::new(vec![]), + vars: descent_vars.clone(), +}), |acc: Rc, stmt: Rc| { + let stmt_edges = collect_scc_child_edges(&stmt, &caller, ¶m_name, &acc.vars.clone(), &target_set, check_child.clone(), check_list.clone(), &scc_measure_params, &si); +let next_vars = collect_descent_vars(&stmt, ¶m_name, &acc.vars.clone(), check_child.clone(), check_list.clone(), &si); +Rc::new(SccEdgeBlockAcc { + edges: v2_rt::concat(acc.edges.clone(), stmt_edges.clone()), + vars: next_vars.clone(), +}) +}); +result.edges.clone() +}, + ExprData::ExprIf => { + let cond_edges = collect_scc_child_edges(&if_condition(body.clone()), &caller, ¶m_name, &descent_vars, &target_set, check_child.clone(), check_list.clone(), &scc_measure_params, &si); +let then_branch = if_then_branch(body.clone()); +let else_opt = if_else_branch(body.clone()); +let then_edges = collect_scc_child_edges(&then_branch, &caller, ¶m_name, &descent_vars, &target_set, check_child.clone(), check_list.clone(), &scc_measure_params, &si); +let else_edges = match else_opt { + Some(eb) => collect_scc_child_edges(&eb, &caller, ¶m_name, &descent_vars, &target_set, check_child.clone(), check_list.clone(), &scc_measure_params, &si), + None => Rc::new(vec![]), +}; +v2_rt::concat(cond_edges, v2_rt::concat(then_edges, else_edges)) +}, + _ => Rc::new({ let mut __result = Vec::new(); for child in body.children.clone().iter().cloned() { __result.extend((*collect_scc_child_edges(&child, &caller, ¶m_name, &descent_vars, &target_set, check_child.clone(), check_list.clone(), &scc_measure_params, &si)).iter().cloned()); } __result }), +} }) } -pub fn is_scc_container_child_descent( - members: &Rc>, - func_index: &Rc>>, - scc_name_set: Rc>, - si: &Rc>>, -) -> bool { +pub fn is_scc_container_child_descent(members: &Rc>, func_index: &Rc>>, scc_name_set: Rc>, si: &Rc>>) -> bool { { - let measure_params = - build_scc_measure_params(members.clone(), func_index.clone(), si.clone()); - let edges = Rc::new({ - let mut __result = Vec::new(); - for name in members.clone().iter().cloned() { - __result.extend( - (*match v2_rt::map_get(&func_index, name.clone()) { - Some(entry) => { - let best_edges = entry.params.clone().iter().cloned().fold( - Rc::new(vec![]), - |best: _, p: Rc| { - let pname = param_node_name_at(p.clone(), si.clone()); - let descent_vars = collect_descent_vars( - &entry.body.clone(), - &pname, - &v2_rt::rc_empty_map::(), - true, - true, - &si, - ); - let param_edges = collect_scc_child_edges( - &entry.body.clone(), - &name, - &pname, - &descent_vars, - &scc_name_set, - true, - true, - &measure_params, - &si, - ); - let unknown_count = - count_unknown_progress_edges(param_edges.clone()); - let best_unknown = count_unknown_progress_edges(best.clone()); - if (((best.clone().len() as i64) == 0) - || (unknown_count.clone() < best_unknown.clone())) - { - param_edges.clone() - } else { - best.clone() - } - }, - ); - best_edges.clone() - } - None => Rc::new(vec![]), - }) - .iter() - .cloned(), - ); - } - __result - }); - let unknown_edge_count = count_unknown_progress_edges(edges.clone()); - (((unknown_edge_count == 0) && ((edges.clone().len() as i64) > 0)) - && (same_progress_subgraph_has_cycle(&members, edges.clone()) == false)) - } + let measure_params = build_scc_measure_params(members.clone(), func_index.clone(), si.clone()); +let edges = Rc::new({ let mut __result = Vec::new(); for name in members.clone().iter().cloned() { __result.extend((*match v2_rt::map_get(&func_index, name.clone()) { + Some(entry) => { + let best_edges = entry.params.clone().iter().cloned().fold(Rc::new(vec![]), |best: _, p: Rc| { + let pname = param_node_name_at(p.clone(), si.clone()); +let descent_vars = collect_descent_vars(&entry.body.clone(), &pname, &v2_rt::rc_empty_map::(), true, true, &si); +let param_edges = collect_scc_child_edges(&entry.body.clone(), &name, &pname, &descent_vars, &scc_name_set, true, true, &measure_params, &si); +let unknown_count = count_unknown_progress_edges(param_edges.clone()); +let best_unknown = count_unknown_progress_edges(best.clone()); +if (((best.clone().len() as i64) == 0) || (unknown_count.clone() < best_unknown.clone())) { + param_edges.clone() + } else { + best.clone() + } +}); +best_edges.clone() +}, + None => Rc::new(vec![]), +}).iter().cloned()); } __result }); +let unknown_edge_count = count_unknown_progress_edges(edges.clone()); +(((unknown_edge_count == 0) && ((edges.clone().len() as i64) > 0)) && (same_progress_subgraph_has_cycle(&members, edges.clone()) == false)) +} } pub fn progress_edge_to_proof_edge(pe: &Rc) -> Rc { Rc::new(ProofEdge { - caller: pe.caller.clone(), - callee: pe.callee.clone(), - evidence: Rc::new(vec![pe.progress.clone()]), - }) + caller: pe.caller.clone(), + callee: pe.callee.clone(), + evidence: Rc::new(vec![pe.progress.clone()]), +}) } pub fn count_unknown_progress_edges(edges: Rc>>) -> i64 { - (Rc::new({ - let mut __result = Vec::new(); - for e in edges.iter().cloned() { - if (e.progress.clone() == DescentEvidence::DescentUnknown) { - __result.push(e); - } - } - __result - }) - .len() as i64) + (Rc::new({ let mut __result = Vec::new(); for e in edges.iter().cloned() { if (e.progress.clone() == DescentEvidence::DescentUnknown) { __result.push(e); } } __result }).len() as i64) } pub fn count_unknown_proof_edges(edges: Rc>>) -> i64 { - (Rc::new({ - let mut __result = Vec::new(); - for e in edges.iter().cloned() { - if match e.evidence.clone().first().cloned() { - Some(DescentEvidence::DescentUnknown) => true, - _ => false, - } { - __result.push(e); - } - } - __result - }) - .len() as i64) + (Rc::new({ let mut __result = Vec::new(); for e in edges.iter().cloned() { if match e.evidence.clone().first().cloned() { + Some(DescentEvidence::DescentUnknown) => true, + _ => false, +} { __result.push(e); } } __result }).len() as i64) } -pub fn collect_scc_proof_edges_for_dim( - members: &Rc>, - func_index: &Rc>>, - scc_name_set: Rc>, - check_child: bool, - check_list: bool, - si: &Rc>>, -) -> Rc>> { +pub fn collect_scc_proof_edges_for_dim(members: &Rc>, func_index: &Rc>>, scc_name_set: Rc>, check_child: bool, check_list: bool, si: &Rc>>) -> Rc>> { { - let measure_params = - build_scc_measure_params(members.clone(), func_index.clone(), si.clone()); - Rc::new({ - let mut __result = Vec::new(); - for name in members.clone().iter().cloned() { - __result.extend((*match v2_rt::map_get(&func_index, name.clone()) { + let measure_params = build_scc_measure_params(members.clone(), func_index.clone(), si.clone()); +Rc::new({ let mut __result = Vec::new(); for name in members.clone().iter().cloned() { __result.extend((*match v2_rt::map_get(&func_index, name.clone()) { Some(entry) => { let best_map = entry.params.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |best: Rc>, p: Rc| { let pname = param_node_name_at(p.clone(), si.clone()); @@ -6316,40 +3085,22 @@ Rc::new(ProofEdge { }); } __result }) }, None => Rc::new(vec![]), -}).iter().cloned()); - } - __result - }) - } +}).iter().cloned()); } __result }) +} } -pub fn merge_edge_evidence( - acc_map: Rc>, - pe: &Rc, -) -> Rc> { +pub fn merge_edge_evidence(acc_map: Rc>, pe: &Rc) -> Rc> { map_evidence_merge_at(&acc_map, &pe.callee.clone(), pe.progress.clone()) } pub fn count_known_in_edge_map(m: &Rc>) -> i64 { - (Rc::new({ - let mut __result = Vec::new(); - for k in Rc::new(v2_rt::map_keys(&m)).iter().cloned() { - if match v2_rt::map_get(&m, k.clone()) { - Some(DescentEvidence::DescentUnknown) => false, - _ => true, - } { - __result.push(k); - } - } - __result - }) - .len() as i64) + (Rc::new({ let mut __result = Vec::new(); for k in Rc::new(v2_rt::map_keys(&m)).iter().cloned() { if match v2_rt::map_get(&m, k.clone()) { + Some(DescentEvidence::DescentUnknown) => false, + _ => true, +} { __result.push(k); } } __result }).len() as i64) } -pub fn pick_best_param_edges( - current: Rc>, - candidate: Rc>, -) -> Rc> { +pub fn pick_best_param_edges(current: Rc>, candidate: Rc>) -> Rc> { if (count_known_in_edge_map(&candidate) > count_known_in_edge_map(¤t)) { candidate.clone() } else { @@ -6357,19 +3108,10 @@ pub fn pick_best_param_edges( } } -pub fn collect_scc_independent_dim_edges( - members: &Rc>, - func_index: &Rc>>, - scc_name_set: Rc>, - si: &Rc>>, -) -> Rc>> { +pub fn collect_scc_independent_dim_edges(members: &Rc>, func_index: &Rc>>, scc_name_set: Rc>, si: &Rc>>) -> Rc>> { { - let measure_params = - build_scc_measure_params(members.clone(), func_index.clone(), si.clone()); - Rc::new({ - let mut __result = Vec::new(); - for name in members.clone().iter().cloned() { - __result.extend((*match v2_rt::map_get(&func_index, name.clone()) { + let measure_params = build_scc_measure_params(members.clone(), func_index.clone(), si.clone()); +Rc::new({ let mut __result = Vec::new(); for name in members.clone().iter().cloned() { __result.extend((*match v2_rt::map_get(&func_index, name.clone()) { Some(entry) => { let tree_edge_map = entry.params.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |best_map: Rc>, p: Rc| { let pname = param_node_name_at(p.clone(), si.clone()); @@ -6404,50 +3146,26 @@ Rc::new(ProofEdge { }); } __result }) }, None => Rc::new(vec![]), -}).iter().cloned()); - } - __result - }) - } +}).iter().cloned()); } __result }) +} } -pub fn collect_scc_parser_proof_edges( - members: Rc>, - func_index: Rc>>, - scc_name_set: Rc>, - si: Rc>>, -) -> Rc>> { +pub fn collect_scc_parser_proof_edges(members: Rc>, func_index: Rc>>, scc_name_set: Rc>, si: Rc>>) -> Rc>> { { let edges = collect_parser_edges_for_scc(&members, &func_index, scc_name_set, &si); - Rc::new({ - let mut __result = Vec::new(); - for pe in edges.iter().cloned() { - __result.push(progress_edge_to_proof_edge(&pe)); - } - __result - }) - } +Rc::new({ let mut __result = Vec::new(); for pe in edges.iter().cloned() { __result.push(progress_edge_to_proof_edge(&pe)); } __result }) +} } -pub fn collect_scc_tree_parser_dim_edges( - members: &Rc>, - func_index: &Rc>>, - scc_name_set: &Rc>, - si: &Rc>>, -) -> Rc>> { +pub fn collect_scc_tree_parser_dim_edges(members: &Rc>, func_index: &Rc>>, scc_name_set: &Rc>, si: &Rc>>) -> Rc>> { { - let all_parser_edges = - collect_parser_edges_for_scc(&members, &func_index, scc_name_set.clone(), &si); - if ((all_parser_edges.clone().len() as i64) == 0) { + let all_parser_edges = collect_parser_edges_for_scc(&members, &func_index, scc_name_set.clone(), &si); +if ((all_parser_edges.clone().len() as i64) == 0) { Rc::new(vec![]) } else { { - let measure_params = - build_scc_measure_params(members.clone(), func_index.clone(), si.clone()); - Rc::new({ - let mut __result = Vec::new(); - for name in members.clone().iter().cloned() { - __result.extend((*match v2_rt::map_get(&func_index, name.clone()) { + let measure_params = build_scc_measure_params(members.clone(), func_index.clone(), si.clone()); +Rc::new({ let mut __result = Vec::new(); for name in members.clone().iter().cloned() { __result.extend((*match v2_rt::map_get(&func_index, name.clone()) { Some(entry) => { let tree_edge_map = entry.params.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |best_map: Rc>, p: Rc| { let pname = param_node_name_at(p.clone(), si.clone()); @@ -6477,28 +3195,16 @@ Rc::new(ProofEdge { }); } __result }) }, None => Rc::new(vec![]), -}).iter().cloned()); - } - __result - }) - } +}).iter().cloned()); } __result }) +} } - } +} } -pub fn collect_scc_cx_l2_tree_edges( - members: &Rc>, - func_index: &Rc>>, - scc_name_set: Rc>, - si: &Rc>>, -) -> Rc>> { +pub fn collect_scc_cx_l2_tree_edges(members: &Rc>, func_index: &Rc>>, scc_name_set: Rc>, si: &Rc>>) -> Rc>> { { - let measure_params = - build_scc_measure_params(members.clone(), func_index.clone(), si.clone()); - Rc::new({ - let mut __result = Vec::new(); - for name in members.clone().iter().cloned() { - __result.extend((*match v2_rt::map_get(&func_index, name.clone()) { + let measure_params = build_scc_measure_params(members.clone(), func_index.clone(), si.clone()); +Rc::new({ let mut __result = Vec::new(); for name in members.clone().iter().cloned() { __result.extend((*match v2_rt::map_get(&func_index, name.clone()) { Some(entry) => { let self_evidence = collect_self_call_evidence(entry.body.clone(), name.clone(), si.clone()); let self_has_calls = ((self_evidence.clone().len() as i64) > 0); @@ -6572,562 +3278,301 @@ Rc::new(vec![Rc::new(ProofEdge { v2_rt::concat(self_edge.clone(), cross_edges.clone()) }, None => Rc::new(vec![]), -}).iter().cloned()); - } - __result - }) - } +}).iter().cloned()); } __result }) +} } -pub fn scc_descending_param( - members: Rc>, - func_index: Rc>>, - si: Rc>>, -) -> String { - members - .iter() - .cloned() - .fold("".to_string(), |found: String, name: String| { - if (found.clone().as_str() != "".to_string().as_str()) { - found.clone() +pub fn scc_descending_param(members: Rc>, func_index: Rc>>, si: Rc>>) -> String { + members.iter().cloned().fold("".to_string(), |found: String, name: String| if (found.clone().as_str() != "".to_string().as_str()) { + found.clone() + } else { + match v2_rt::map_get(&func_index, name.clone()) { + Some(entry) => { + let evidence = collect_self_call_evidence(entry.body.clone(), name.clone(), si.clone()); +match evidence.clone().first().cloned() { + Some(call_ev) => call_ev.clone().iter().cloned().fold("".to_string(), |p: String, rel: Rc| if (p.clone().as_str() != "".to_string().as_str()) { + p.clone() } else { - match v2_rt::map_get(&func_index, name.clone()) { - Some(entry) => { - let evidence = collect_self_call_evidence( - entry.body.clone(), - name.clone(), - si.clone(), - ); - match evidence.clone().first().cloned() { - Some(call_ev) => call_ev.clone().iter().cloned().fold( - "".to_string(), - |p: String, rel: Rc| { - if (p.clone().as_str() != "".to_string().as_str()) { - p.clone() - } else { - match (*rel.clone()).clone() { - SubValueRelation::StrictSubValue { - field: f, .. - } => f.element_type.clone(), - SubValueRelation::IteratedSubValue { - field: f, .. - } => f.element_type.clone(), - SubValueRelation::ArithmeticDescent { - param: ap, - .. - } => ap.clone(), - _ => "".to_string(), - } - } - }, - ), - None => "".to_string(), - } - } - None => "".to_string(), - } - } - }) + match (*rel.clone()).clone() { + SubValueRelation::StrictSubValue { field: f, .. } => f.element_type.clone(), + SubValueRelation::IteratedSubValue { field: f, .. } => f.element_type.clone(), + SubValueRelation::ArithmeticDescent { param: ap, .. } => ap.clone(), + _ => "".to_string(), +} + }), + None => "".to_string(), +} +}, + None => "".to_string(), +} + }) } -pub fn construct_scc_termination_proof( - members: &Rc>, - func_index: &Rc>>, - scc_name_set: &Rc>, - si: &Rc>>, -) -> Option> { +pub fn construct_scc_termination_proof(members: &Rc>, func_index: &Rc>>, scc_name_set: &Rc>, si: &Rc>>) -> Option> { { - let cx_l2_edges = - collect_scc_cx_l2_tree_edges(&members, &func_index, scc_name_set.clone(), &si); - let cx_l2_all_known = { - let mut __all = true; - for e in cx_l2_edges.clone().iter().cloned() { - if !(match e.evidence.clone().first().cloned() { - Some(DescentEvidence::DescentUnknown) => false, - _ => true, - }) { - __all = false; - break; - } - } - __all - }; - let cx_l2_param = scc_descending_param(members.clone(), func_index.clone(), si.clone()); - let cx_l2_proof = Rc::new(TerminationProof { - dimensions: Rc::new(vec![Rc::new(RankingDimension::TreeSize { - param: if (cx_l2_param.clone().as_str() != "".to_string().as_str()) { - cx_l2_param.clone() - } else { - "scc".to_string() - }, - })]), - }); - if ((cx_l2_all_known && ((cx_l2_edges.clone().len() as i64) > 0)) - && (proof_has_non_descending_cycle( - cx_l2_proof.clone(), - members.clone(), - cx_l2_edges.clone(), - ) == false)) - { + let cx_l2_edges = collect_scc_cx_l2_tree_edges(&members, &func_index, scc_name_set.clone(), &si); +let cx_l2_all_known = { let mut __all = true; for e in cx_l2_edges.clone().iter().cloned() { if !(match e.evidence.clone().first().cloned() { + Some(DescentEvidence::DescentUnknown) => false, + _ => true, +}) { __all = false; break; } } __all }; +let cx_l2_param = scc_descending_param(members.clone(), func_index.clone(), si.clone()); +let cx_l2_proof = Rc::new(TerminationProof { + dimensions: Rc::new(vec![Rc::new(RankingDimension::TreeSize { + param: if (cx_l2_param.clone().as_str() != "".to_string().as_str()) { + cx_l2_param.clone() + } else { + "scc".to_string() + }, +})]), +}); +if ((cx_l2_all_known && ((cx_l2_edges.clone().len() as i64) > 0)) && (proof_has_non_descending_cycle(cx_l2_proof.clone(), members.clone(), cx_l2_edges.clone()) == false)) { Some(cx_l2_proof.clone()) } else { { - let tree_edges = collect_scc_proof_edges_for_dim( - &members, - &func_index, - scc_name_set.clone(), - true, - false, - &si, - ); - let tree_all_known = { - let mut __all = true; - for e in tree_edges.clone().iter().cloned() { - if !(match e.evidence.clone().first().cloned() { - Some(DescentEvidence::DescentUnknown) => false, - _ => true, - }) { - __all = false; - break; - } - } - __all - }; - let tree_proof = Rc::new(TerminationProof { - dimensions: Rc::new(vec![Rc::new(RankingDimension::TreeSize { - param: "scc".to_string(), - })]), - }); - if ((tree_all_known && ((tree_edges.clone().len() as i64) > 0)) - && (proof_has_non_descending_cycle( - tree_proof.clone(), - members.clone(), - tree_edges.clone(), - ) == false)) - { + let tree_edges = collect_scc_proof_edges_for_dim(&members, &func_index, scc_name_set.clone(), true, false, &si); +let tree_all_known = { let mut __all = true; for e in tree_edges.clone().iter().cloned() { if !(match e.evidence.clone().first().cloned() { + Some(DescentEvidence::DescentUnknown) => false, + _ => true, +}) { __all = false; break; } } __all }; +let tree_proof = Rc::new(TerminationProof { + dimensions: Rc::new(vec![Rc::new(RankingDimension::TreeSize { + param: "scc".to_string(), +})]), +}); +if ((tree_all_known && ((tree_edges.clone().len() as i64) > 0)) && (proof_has_non_descending_cycle(tree_proof.clone(), members.clone(), tree_edges.clone()) == false)) { Some(tree_proof.clone()) } else { { - let list_edges = collect_scc_proof_edges_for_dim( - &members, - &func_index, - scc_name_set.clone(), - false, - true, - &si, - ); - let list_all_known = { - let mut __all = true; - for e in list_edges.clone().iter().cloned() { - if !(match e.evidence.clone().first().cloned() { - Some(DescentEvidence::DescentUnknown) => false, - _ => true, - }) { - __all = false; - break; - } - } - __all - }; - let list_proof = Rc::new(TerminationProof { - dimensions: Rc::new(vec![Rc::new(RankingDimension::ListLength { - param: "scc".to_string(), - })]), - }); - if ((list_all_known && ((list_edges.clone().len() as i64) > 0)) - && (proof_has_non_descending_cycle( - list_proof.clone(), - members.clone(), - list_edges.clone(), - ) == false)) - { + let list_edges = collect_scc_proof_edges_for_dim(&members, &func_index, scc_name_set.clone(), false, true, &si); +let list_all_known = { let mut __all = true; for e in list_edges.clone().iter().cloned() { if !(match e.evidence.clone().first().cloned() { + Some(DescentEvidence::DescentUnknown) => false, + _ => true, +}) { __all = false; break; } } __all }; +let list_proof = Rc::new(TerminationProof { + dimensions: Rc::new(vec![Rc::new(RankingDimension::ListLength { + param: "scc".to_string(), +})]), +}); +if ((list_all_known && ((list_edges.clone().len() as i64) > 0)) && (proof_has_non_descending_cycle(list_proof.clone(), members.clone(), list_edges.clone()) == false)) { Some(list_proof.clone()) } else { { - let parser_edges = collect_scc_parser_proof_edges( - members.clone(), - func_index.clone(), - scc_name_set.clone(), - si.clone(), - ); - let parser_all_known = { - let mut __all = true; - for e in parser_edges.clone().iter().cloned() { - if !(match e.evidence.clone().first().cloned() { - Some(DescentEvidence::DescentUnknown) => false, - _ => true, - }) { - __all = false; - break; - } - } - __all - }; - let parser_proof = Rc::new(TerminationProof { - dimensions: Rc::new(vec![Rc::new( - RankingDimension::TokenPosition { - param: "scc".to_string(), - }, - )]), - }); - if ((parser_all_known && ((parser_edges.clone().len() as i64) > 0)) - && (proof_has_non_descending_cycle( - parser_proof.clone(), - members.clone(), - parser_edges.clone(), - ) == false)) - { + let parser_edges = collect_scc_parser_proof_edges(members.clone(), func_index.clone(), scc_name_set.clone(), si.clone()); +let parser_all_known = { let mut __all = true; for e in parser_edges.clone().iter().cloned() { if !(match e.evidence.clone().first().cloned() { + Some(DescentEvidence::DescentUnknown) => false, + _ => true, +}) { __all = false; break; } } __all }; +let parser_proof = Rc::new(TerminationProof { + dimensions: Rc::new(vec![Rc::new(RankingDimension::TokenPosition { + param: "scc".to_string(), +})]), +}); +if ((parser_all_known && ((parser_edges.clone().len() as i64) > 0)) && (proof_has_non_descending_cycle(parser_proof.clone(), members.clone(), parser_edges.clone()) == false)) { Some(parser_proof.clone()) } else { { - let lex_edges = collect_scc_independent_dim_edges( - &members, - &func_index, - scc_name_set.clone(), - &si, - ); - let lex_all_known = { - let mut __all = true; - for e in lex_edges.clone().iter().cloned() { - if !(match e.evidence.clone().first().cloned() { - Some(ev) => match ev.clone() { - DescentEvidence::DescentUnknown => false, - _ => true, - }, - None => false, - }) { - __all = false; - break; - } - } - __all - }; - let lex_proof = Rc::new(TerminationProof { - dimensions: Rc::new(vec![ - Rc::new(RankingDimension::TreeSize { - param: "scc".to_string(), - }), - Rc::new(RankingDimension::ListLength { - param: "scc".to_string(), - }), - ]), - }); - if ((lex_all_known - && ((lex_edges.clone().len() as i64) > 0)) - && (proof_has_non_descending_cycle( - lex_proof.clone(), - members.clone(), - lex_edges.clone(), - ) == false)) - { + let lex_edges = collect_scc_independent_dim_edges(&members, &func_index, scc_name_set.clone(), &si); +let lex_all_known = { let mut __all = true; for e in lex_edges.clone().iter().cloned() { if !(match e.evidence.clone().first().cloned() { + Some(ev) => match ev.clone() { + DescentEvidence::DescentUnknown => false, + _ => true, +}, + None => false, +}) { __all = false; break; } } __all }; +let lex_proof = Rc::new(TerminationProof { + dimensions: Rc::new(vec![Rc::new(RankingDimension::TreeSize { + param: "scc".to_string(), +}), Rc::new(RankingDimension::ListLength { + param: "scc".to_string(), +})]), +}); +if ((lex_all_known && ((lex_edges.clone().len() as i64) > 0)) && (proof_has_non_descending_cycle(lex_proof.clone(), members.clone(), lex_edges.clone()) == false)) { Some(lex_proof.clone()) } else { { - let tree_parser_edges = - collect_scc_tree_parser_dim_edges( - &members, - &func_index, - &scc_name_set, - &si, - ); - let tp_all_known = { - let mut __all = true; - for e in - tree_parser_edges.clone().iter().cloned() - { - if !(match e - .evidence - .clone() - .first() - .cloned() - { - Some(ev) => match ev.clone() { - DescentEvidence::DescentUnknown => { - false - } - _ => true, - }, - None => false, - }) { - __all = false; - break; - } - } - __all - }; - let tp_proof = Rc::new(TerminationProof { - dimensions: Rc::new(vec![ - Rc::new(RankingDimension::TreeSize { - param: "scc".to_string(), - }), - Rc::new(RankingDimension::TokenPosition { - param: "scc".to_string(), - }), - ]), - }); - if ((tp_all_known - && ((tree_parser_edges.clone().len() as i64) - > 0)) - && (proof_has_non_descending_cycle( - tp_proof.clone(), - members.clone(), - tree_parser_edges.clone(), - ) == false)) - { + let tree_parser_edges = collect_scc_tree_parser_dim_edges(&members, &func_index, &scc_name_set, &si); +let tp_all_known = { let mut __all = true; for e in tree_parser_edges.clone().iter().cloned() { if !(match e.evidence.clone().first().cloned() { + Some(ev) => match ev.clone() { + DescentEvidence::DescentUnknown => false, + _ => true, +}, + None => false, +}) { __all = false; break; } } __all }; +let tp_proof = Rc::new(TerminationProof { + dimensions: Rc::new(vec![Rc::new(RankingDimension::TreeSize { + param: "scc".to_string(), +}), Rc::new(RankingDimension::TokenPosition { + param: "scc".to_string(), +})]), +}); +if ((tp_all_known && ((tree_parser_edges.clone().len() as i64) > 0)) && (proof_has_non_descending_cycle(tp_proof.clone(), members.clone(), tree_parser_edges.clone()) == false)) { Some(tp_proof.clone()) } else { None } - } +} } - } +} } - } +} } - } +} } - } +} } - } +} } -pub fn classify_scc_recursion_pattern( - members: &Rc>, - func_index: &Rc>>, - si: &Rc>>, -) -> Rc { +pub fn classify_scc_recursion_pattern(members: &Rc>, func_index: &Rc>>, si: &Rc>>) -> Rc { { - let scc_name_set = members.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, name: String| { - v2_rt::rc_map_insert(acc, name.clone(), true) - }, - ); - let proof = construct_scc_termination_proof(&members, &func_index, &scc_name_set, &si); - match proof { - Some(p) => lower_call_pattern(proof_to_call_pattern(p.clone())), - None => { - let scc_measure_params = - build_scc_measure_params(members.clone(), func_index.clone(), si.clone()); - match classify_parser_scc_recursion_pattern( - &members, - func_index.clone(), - si.clone(), - ) { - Some(parser_target) => parser_target.clone(), - None => { - let all_arithmetic = { - let mut __all = true; - for name in members.clone().iter().cloned() { - if !(match v2_rt::map_get(&func_index, name.clone()) { - Some(entry) => { - ((max_path_target_calls( - entry.body.clone(), - scc_name_set.clone(), - si.clone(), - ) <= 1) - && scc_calls_have_arithmetic_descent( - &entry.body.clone(), - &scc_name_set, - &func_index, - &scc_measure_params, - &si, - )) - } - None => false, - }) { - __all = false; - break; - } - } - __all - }; - if all_arithmetic { - { - let ring_param = match members.clone().first().cloned() { - Some(m0) => { - match v2_rt::map_get(&scc_measure_params, m0.clone()) { - Some(pmap) => match Rc::new(v2_rt::map_keys(&pmap)) - .first() - .cloned() - { - Some(k) => k.clone(), - None => "_scc_arithmetic".to_string(), - }, - None => "_scc_arithmetic".to_string(), - } - } - None => "_scc_arithmetic".to_string(), - }; - lower_call_pattern(Rc::new(CallPattern::ArithmeticSubtractCall { - steps: Rc::new(PositiveDescentAmount::OneStep), - ring_param: ring_param, - })) - } - } else { - lower_call_pattern(Rc::new(CallPattern::SameArgumentCall)) - } - } + let scc_name_set = members.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, name: String| v2_rt::rc_map_insert(acc, name.clone(), true)); +let proof = construct_scc_termination_proof(&members, &func_index, &scc_name_set, &si); +match proof { + Some(p) => lower_call_pattern(proof_to_call_pattern(p.clone())), + None => { + let scc_measure_params = build_scc_measure_params(members.clone(), func_index.clone(), si.clone()); +match classify_parser_scc_recursion_pattern(&members, func_index.clone(), si.clone()) { + Some(parser_target) => parser_target.clone(), + None => { + let all_arithmetic = { let mut __all = true; for name in members.clone().iter().cloned() { if !(match v2_rt::map_get(&func_index, name.clone()) { + Some(entry) => ((max_path_target_calls(entry.body.clone(), scc_name_set.clone(), si.clone()) <= 1) && scc_calls_have_arithmetic_descent(&entry.body.clone(), &scc_name_set, &func_index, &scc_measure_params, &si)), + None => false, +}) { __all = false; break; } } __all }; +if all_arithmetic { + { + let ring_param = match members.clone().first().cloned() { + Some(m0) => match v2_rt::map_get(&scc_measure_params, m0.clone()) { + Some(pmap) => match Rc::new(v2_rt::map_keys(&pmap)).first().cloned() { + Some(k) => k.clone(), + None => "_scc_arithmetic".to_string(), +}, + None => "_scc_arithmetic".to_string(), +}, + None => "_scc_arithmetic".to_string(), +}; +lower_call_pattern(Rc::new(CallPattern::ArithmeticSubtractCall { + steps: Rc::new(PositiveDescentAmount::OneStep), + ring_param: ring_param, +})) +} + } else { + lower_call_pattern(Rc::new(CallPattern::SameArgumentCall)) } - } - } - } +}, +} +}, +} +} } -pub fn build_scc_index( - func_entries: &Rc>>, - func_index: Rc>>, - si: &Rc>>, -) -> Rc { +pub fn build_scc_index(func_entries: &Rc>>, func_index: Rc>>, si: &Rc>>) -> Rc { { - let names = Rc::new({ - let mut __result = Vec::new(); - for entry in func_entries.clone().iter().cloned() { - __result.push(entry.name.clone()); - } - __result - }); - let graph = build_call_graph(&func_entries, si.clone()); - let finish = names.clone().iter().cloned().fold( - Rc::new(DfsFinishAcc { - visited: v2_rt::rc_empty_map::(), - order: Rc::new(vec![]), - }), - |acc: Rc, name: String| { - dfs_finish_order(&name, &graph.forward.clone(), &acc) - }, - ); - let topo_order = v2_rt::reverse(finish.order.clone()); - let result = topo_order.clone().iter().cloned().fold( - Rc::new(SccBuildAcc { - assigned: v2_rt::rc_empty_map::(), - index: v2_rt::rc_empty_map::>(), - }), - |acc: Rc, name: String| { - if set_has(acc.assigned.clone(), name.clone()) { - acc.clone() - } else { + let names = Rc::new({ let mut __result = Vec::new(); for entry in func_entries.clone().iter().cloned() { __result.push(entry.name.clone()); } __result }); +let graph = build_call_graph(&func_entries, si.clone()); +let finish = names.clone().iter().cloned().fold(Rc::new(DfsFinishAcc { + visited: v2_rt::rc_empty_map::(), + order: Rc::new(vec![]), +}), |acc: Rc, name: String| dfs_finish_order(&name, &graph.forward.clone(), &acc)); +let topo_order = v2_rt::reverse(finish.order.clone()); +let result = topo_order.clone().iter().cloned().fold(Rc::new(SccBuildAcc { + assigned: v2_rt::rc_empty_map::(), + index: v2_rt::rc_empty_map::>(), +}), |acc: Rc, name: String| if set_has(acc.assigned.clone(), name.clone()) { + acc.clone() + } else { + { + let component = dfs_collect_component(&name, &graph.reverse.clone(), &Rc::new(SccComponentAcc { + visited: acc.assigned.clone(), + members: Rc::new(vec![]), +})); +let member_set = component.members.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |inner: Rc>, member: String| v2_rt::rc_map_insert(inner, member.clone(), true)); +let members = Rc::new({ let mut __result = Vec::new(); for member in names.clone().iter().cloned() { if set_has(member_set.clone(), member.clone()) { __result.push(member); } } __result }); +let next_assigned = component.visited.clone(); +if ((members.clone().len() as i64) > 1) { { - let component = dfs_collect_component( - &name, - &graph.reverse.clone(), - &Rc::new(SccComponentAcc { - visited: acc.assigned.clone(), - members: Rc::new(vec![]), - }), - ); - let member_set = component.members.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |inner: Rc>, member: String| { - v2_rt::rc_map_insert(inner, member.clone(), true) - }, - ); - let members = Rc::new({ - let mut __result = Vec::new(); - for member in names.clone().iter().cloned() { - if set_has(member_set.clone(), member.clone()) { - __result.push(member); - } - } - __result - }); - let next_assigned = component.visited.clone(); - if ((members.clone().len() as i64) > 1) { - { - let info = Rc::new(SccInfo { - members: members.clone(), - member_set: member_set.clone(), - pattern: classify_scc_recursion_pattern( - &members, - &func_index, - &si, - ), - }); - let next_index = members.clone().iter().cloned().fold( - acc.index.clone(), - |inner: Rc>>, member: String| { - v2_rt::rc_map_insert(inner, member.clone(), info.clone()) - }, - ); - Rc::new(SccBuildAcc { - assigned: next_assigned.clone(), - index: next_index.clone(), - }) - } - } else { - Rc::new(SccBuildAcc { - assigned: next_assigned.clone(), - index: acc.index.clone(), - }) - } - } + let info = Rc::new(SccInfo { + members: members.clone(), + member_set: member_set.clone(), + pattern: classify_scc_recursion_pattern(&members, &func_index, &si), +}); +let next_index = members.clone().iter().cloned().fold(acc.index.clone(), |inner: Rc>>, member: String| v2_rt::rc_map_insert(inner, member.clone(), info.clone())); +Rc::new(SccBuildAcc { + assigned: next_assigned.clone(), + index: next_index.clone(), +}) +} + } else { + Rc::new(SccBuildAcc { + assigned: next_assigned.clone(), + index: acc.index.clone(), +}) } - }, - ); - Rc::new(SccResult { - index: result.index.clone(), - topo_order: topo_order.clone(), - processing_order: finish.order.clone(), - call_graph: graph.clone(), - }) - } +} + }); +Rc::new(SccResult { + index: result.index.clone(), + topo_order: topo_order.clone(), + processing_order: finish.order.clone(), + call_graph: graph.clone(), +}) +} } pub fn cost_seq(a: Rc, b: &Rc) -> Rc { match (*a.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => b.clone(), - _ => match (*b.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => a.clone(), - _ => Rc::new(CostExpr::CostAdd { - left: a.clone(), - right: b.clone(), - }), - }, - } + CostExpr::CostConst { value: 0, .. } => b.clone(), + _ => match (*b.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => a.clone(), + _ => Rc::new(CostExpr::CostAdd { + left: a.clone(), + right: b.clone(), +}), +}, +} } pub fn cost_par(a: Rc, b: &Rc) -> Rc { match (*a.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => b.clone(), - _ => match (*b.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => a.clone(), - _ => Rc::new(CostExpr::CostMax { - left: a.clone(), - right: b.clone(), - }), - }, - } + CostExpr::CostConst { value: 0, .. } => b.clone(), + _ => match (*b.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => a.clone(), + _ => Rc::new(CostExpr::CostMax { + left: a.clone(), + right: b.clone(), +}), +}, +} } pub fn cost_loop(binder: String, iterations: Rc, body: &Rc) -> Rc { match (*body.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => Rc::new(CostExpr::CostConst { value: 0 }), - _ => Rc::new(CostExpr::CostSum { - binder: binder, - upper: iterations, - body: body.clone(), - }), - } + CostExpr::CostConst { value: 0, .. } => Rc::new(CostExpr::CostConst { + value: 0, +}), + _ => Rc::new(CostExpr::CostSum { + binder: binder, + upper: iterations, + body: body.clone(), +}), +} } pub fn cost_conditional(condition: Rc, branches: Rc>>) -> Rc { { - let max_branch = branches.iter().cloned().fold( - Rc::new(CostExpr::CostConst { value: 0 }), - |acc: Rc, b: Rc| cost_par(acc, &b), - ); - cost_seq(condition, &max_branch) - } + let max_branch = branches.iter().cloned().fold(Rc::new(CostExpr::CostConst { + value: 0, +}), |acc: Rc, b: Rc| cost_par(acc, &b)); +cost_seq(condition, &max_branch) +} } pub fn collection_output(binder: String, size: Rc) -> Rc>> { { - let result = seed_cost_map( - "result".to_string(), - cost_loop(binder, size, &Rc::new(CostExpr::CostConst { value: 1 })), - ); - result - } + let result = seed_cost_map("result".to_string(), cost_loop(binder, size, &Rc::new(CostExpr::CostConst { + value: 1, +}))); +result +} } pub fn scalar_output() -> Rc>> { @@ -7139,305 +3584,194 @@ pub fn method_preserves_collection_size(method_semantics: &Option match se.clone() { - Some(CollectionSizeEffect::ShrinkEffect) => true, - Some(CollectionSizeEffect::IdentityEffect) => true, - _ => false, - }, - _ => false, - } + MethodSemantics::AlgebraMethodSemantics { size_effect: se, .. } => match se.clone() { + Some(CollectionSizeEffect::ShrinkEffect) => true, + Some(CollectionSizeEffect::IdentityEffect) => true, + _ => false, +}, + _ => false, +} } } -pub fn receiver_size_var( - mut recv: Rc, - mut si: Rc>>, -) -> Rc { +pub fn receiver_size_var(mut recv: Rc, mut si: Rc>>) -> Rc { loop { - match (*recv.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - break Rc::new(SizeExpr::SizeLen { - collection: expr_var_name_at(recv.clone(), si), - }); - } - ExprData::ExprFieldAccess { .. } => { - break Rc::new(SizeExpr::SizeLen { - collection: field_access_field_at(recv.clone(), si), - }); - } - ExprData::ExprMethodCall { - method_semantics, .. - } => { - let inner_recv = match recv.children.clone().first().cloned() { - Some(r) => r.clone(), - None => recv.clone(), - }; - if method_preserves_collection_size(&method_semantics) { - { - let __tco_0 = inner_recv; - recv = __tco_0; - continue; - } - } else { - break Rc::new(SizeExpr::SizeLen { - collection: "__expr".to_string(), - }); - } - } - _ => { - break Rc::new(SizeExpr::SizeLen { - collection: "__expr".to_string(), - }); - } - } - } + match (*recv.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { break Rc::new(SizeExpr::SizeLen { + collection: expr_var_name_at(recv.clone(), si), +}); }, + ExprData::ExprFieldAccess { .. } => { break Rc::new(SizeExpr::SizeLen { + collection: field_access_field_at(recv.clone(), si), +}); }, + ExprData::ExprMethodCall { method_semantics, .. } => { let inner_recv = match recv.children.clone().first().cloned() { + Some(r) => r.clone(), + None => recv.clone(), +}; +if method_preserves_collection_size(&method_semantics) { + { + let __tco_0 = inner_recv; +recv = __tco_0; +continue; +} +} else { + break Rc::new(SizeExpr::SizeLen { + collection: "__expr".to_string(), +}); +} }, + _ => { break Rc::new(SizeExpr::SizeLen { + collection: "__expr".to_string(), +}); }, +} +} } pub fn size_binder_name(size: Rc) -> String { match (*size).clone() { - SizeExpr::SizeLen { collection: c, .. } => v2_rt::concat("_".to_string(), c.clone()), - SizeExpr::SizeVar { name: n, .. } => n.clone(), - _ => "_i".to_string(), - } + SizeExpr::SizeLen { collection: c, .. } => v2_rt::concat("_".to_string(), c.clone()), + SizeExpr::SizeVar { name: n, .. } => n.clone(), + _ => "_i".to_string(), +} } -pub fn resolve_lambda_arg( - mc_arg_nodes: &Rc>>, - si: Rc>>, -) -> Option> { +pub fn resolve_lambda_arg(mc_arg_nodes: &Rc>>, si: Rc>>) -> Option> { { - let f_arg = Rc::new({ - let mut __result = Vec::new(); - for a in mc_arg_nodes.clone().iter().cloned() { - if (authored_name_at(si.clone(), &a).as_str() == "f".to_string().as_str()) { - __result.push(a); - } - } - __result - }) - .first() - .cloned(); - match f_arg { - Some(fa) => Some(arg_value(&fa)), - None => Rc::new({ - let mut __result = Vec::new(); - for a in mc_arg_nodes.clone().iter().cloned() { - __result.push(arg_value(&a)); - } - __result - }) - .first() - .cloned(), - } - } + let f_arg = Rc::new({ let mut __result = Vec::new(); for a in mc_arg_nodes.clone().iter().cloned() { if (authored_name_at(si.clone(), &a).as_str() == "f".to_string().as_str()) { __result.push(a); } } __result }).first().cloned(); +match f_arg { + Some(fa) => Some(arg_value(&fa)), + None => Rc::new({ let mut __result = Vec::new(); for a in mc_arg_nodes.clone().iter().cloned() { __result.push(arg_value(&a)); } __result }).first().cloned(), +} +} } -pub fn resolve_callback_cost( - lambda_arg: Option>, - recv_r: Rc, - func_index: &Rc>>, - scc_index: Rc>>, - parser_always_advancing: Rc>, - recursion_ctx: RecursionContext, - si: &Rc>>, -) -> Rc { +pub fn resolve_callback_cost(lambda_arg: Option>, recv_r: Rc, func_index: &Rc>>, scc_index: Rc>>, parser_always_advancing: Rc>, recursion_ctx: RecursionContext, si: &Rc>>) -> Rc { match lambda_arg { - Some(la) => match (*la.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let fn_ref = expr_var_name_at(la.clone(), si.clone()); - match v2_rt::map_get(&func_index, fn_ref.clone()) { - Some(_) => get_or_compute_summary( - &fn_ref, - &func_index, - &scc_index, - &recv_r.table.clone(), - parser_always_advancing, - recursion_ctx, - si.clone(), - ), - None => cost_of_expr( - &la, - &func_index, - &scc_index, - recv_r.table.clone(), - &parser_always_advancing, - &recursion_ctx, - &si, - ), - } - } - _ => cost_of_expr( - &la, - &func_index, - &scc_index, - recv_r.table.clone(), - &parser_always_advancing, - &recursion_ctx, - &si, - ), - }, - None => Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: Rc::new(CostExpr::CostConst { value: 1 }), - span: Rc::new(CostExpr::CostConst { value: 1 }), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Conservative, - }), - table: recv_r.table.clone(), - }), - } + Some(la) => match (*la.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let fn_ref = expr_var_name_at(la.clone(), si.clone()); +match v2_rt::map_get(&func_index, fn_ref.clone()) { + Some(_) => get_or_compute_summary(&fn_ref, &func_index, &scc_index, &recv_r.table.clone(), parser_always_advancing, recursion_ctx, si.clone()), + None => cost_of_expr(&la, &func_index, &scc_index, recv_r.table.clone(), &parser_always_advancing, &recursion_ctx, &si), } - -pub fn cost_of_method_by_shape( - shape: CostShape, - produces_collection: bool, - recv_r: &Rc, - mc_args: Rc>>, - size: &Rc, - binder: &String, - func_index: Rc>>, - scc_index: Rc>>, - parser_always_advancing: Rc>, - recursion_ctx: RecursionContext, - si: &Rc>>, -) -> Rc { +}, + _ => cost_of_expr(&la, &func_index, &scc_index, recv_r.table.clone(), &parser_always_advancing, &recursion_ctx, &si), +}, + None => Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: Rc::new(CostExpr::CostConst { + value: 1, +}), + span: Rc::new(CostExpr::CostConst { + value: 1, +}), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Conservative, +}), + table: recv_r.table.clone(), +}), +} +} + +pub fn cost_of_method_by_shape(shape: CostShape, produces_collection: bool, recv_r: &Rc, mc_args: Rc>>, size: &Rc, binder: &String, func_index: Rc>>, scc_index: Rc>>, parser_always_advancing: Rc>, recursion_ctx: RecursionContext, si: &Rc>>) -> Rc { match shape { - CostShape::ShapeIterateBody => { - let lambda_arg = resolve_lambda_arg(&mc_args, si.clone()); - let body_result = resolve_callback_cost( - lambda_arg, - recv_r.clone(), - &func_index, - scc_index, - parser_always_advancing, - recursion_ctx, - &si, - ); - let loop_work = cost_loop( - binder.clone(), - size.clone(), - &body_result.summary.clone().work.clone(), - ); - let os = if (produces_collection == false) { - body_result.summary.clone().output_size.clone() - } else { - { - let r = seed_cost_map( - "result".to_string(), - cost_loop( - binder.clone(), - size.clone(), - &Rc::new(CostExpr::CostConst { value: 1 }), - ), - ); - r - } - }; - Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: cost_seq(recv_r.summary.clone().work.clone(), &loop_work), - span: cost_seq(recv_r.summary.clone().span.clone(), &loop_work), - output_size: os, - certainty: body_result.summary.clone().certainty.clone(), - }), - table: body_result.table.clone(), - }) - } - CostShape::ShapeSortBody => { - let lambda_arg = resolve_lambda_arg(&mc_args, si.clone()); - let key_result = match lambda_arg { - Some(la) => cost_of_expr( - &la, - &func_index, - &scc_index, - recv_r.table.clone(), - &parser_always_advancing, - &recursion_ctx, - &si, - ), - None => Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: Rc::new(CostExpr::CostConst { value: 1 }), - span: Rc::new(CostExpr::CostConst { value: 1 }), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Proven, - }), - table: recv_r.table.clone(), - }), - }; - let log_factor = Rc::new(CostExpr::CostLog { - base: 2, - argument: size.clone(), - }); - let per_comparison = key_result.summary.clone().work.clone(); - let sort_work = Rc::new(CostExpr::CostMul { - left: cost_loop(binder.clone(), size.clone(), &per_comparison), - right: log_factor, - }); - let sort_os = seed_cost_map( - "result".to_string(), - cost_loop( - binder.clone(), - size.clone(), - &Rc::new(CostExpr::CostConst { value: 1 }), - ), - ); - Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: cost_seq(recv_r.summary.clone().work.clone(), &sort_work), - span: cost_seq(recv_r.summary.clone().span.clone(), &sort_work), - output_size: sort_os, - certainty: key_result.summary.clone().certainty.clone(), - }), - table: key_result.table.clone(), - }) - } - CostShape::ShapeLinearScan => { - let loop_work = cost_loop( - binder.clone(), - size.clone(), - &Rc::new(CostExpr::CostConst { value: 1 }), - ); - let scan_os = if produces_collection { - seed_cost_map( - "result".to_string(), - cost_loop( - binder.clone(), - size.clone(), - &Rc::new(CostExpr::CostConst { value: 1 }), - ), - ) - } else { - v2_rt::rc_empty_map::>() - }; - Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: cost_seq(recv_r.summary.clone().work.clone(), &loop_work), - span: cost_seq(recv_r.summary.clone().span.clone(), &loop_work), - output_size: scan_os, - certainty: recv_r.summary.clone().certainty.clone(), - }), - table: recv_r.table.clone(), - }) - } - CostShape::ShapeConstant => Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: cost_seq( - recv_r.summary.clone().work.clone(), - &Rc::new(CostExpr::CostConst { value: 1 }), - ), - span: cost_seq( - recv_r.summary.clone().span.clone(), - &Rc::new(CostExpr::CostConst { value: 1 }), - ), - output_size: v2_rt::rc_empty_map::>(), - certainty: recv_r.summary.clone().certainty.clone(), - }), - table: recv_r.table.clone(), - }), - } + CostShape::ShapeIterateBody => { + let lambda_arg = resolve_lambda_arg(&mc_args, si.clone()); +let body_result = resolve_callback_cost(lambda_arg, recv_r.clone(), &func_index, scc_index, parser_always_advancing, recursion_ctx, &si); +let loop_work = cost_loop(binder.clone(), size.clone(), &body_result.summary.clone().work.clone()); +let os = if (produces_collection == false) { + body_result.summary.clone().output_size.clone() + } else { + { + let r = seed_cost_map("result".to_string(), cost_loop(binder.clone(), size.clone(), &Rc::new(CostExpr::CostConst { + value: 1, +}))); +r +} + }; +Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: cost_seq(recv_r.summary.clone().work.clone(), &loop_work), + span: cost_seq(recv_r.summary.clone().span.clone(), &loop_work), + output_size: os, + certainty: body_result.summary.clone().certainty.clone(), +}), + table: body_result.table.clone(), +}) +}, + CostShape::ShapeSortBody => { + let lambda_arg = resolve_lambda_arg(&mc_args, si.clone()); +let key_result = match lambda_arg { + Some(la) => cost_of_expr(&la, &func_index, &scc_index, recv_r.table.clone(), &parser_always_advancing, &recursion_ctx, &si), + None => Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: Rc::new(CostExpr::CostConst { + value: 1, +}), + span: Rc::new(CostExpr::CostConst { + value: 1, +}), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Proven, +}), + table: recv_r.table.clone(), +}), +}; +let log_factor = Rc::new(CostExpr::CostLog { + base: 2, + argument: size.clone(), +}); +let per_comparison = key_result.summary.clone().work.clone(); +let sort_work = Rc::new(CostExpr::CostMul { + left: cost_loop(binder.clone(), size.clone(), &per_comparison), + right: log_factor, +}); +let sort_os = seed_cost_map("result".to_string(), cost_loop(binder.clone(), size.clone(), &Rc::new(CostExpr::CostConst { + value: 1, +}))); +Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: cost_seq(recv_r.summary.clone().work.clone(), &sort_work), + span: cost_seq(recv_r.summary.clone().span.clone(), &sort_work), + output_size: sort_os, + certainty: key_result.summary.clone().certainty.clone(), +}), + table: key_result.table.clone(), +}) +}, + CostShape::ShapeLinearScan => { + let loop_work = cost_loop(binder.clone(), size.clone(), &Rc::new(CostExpr::CostConst { + value: 1, +})); +let scan_os = if produces_collection { + seed_cost_map("result".to_string(), cost_loop(binder.clone(), size.clone(), &Rc::new(CostExpr::CostConst { + value: 1, +}))) + } else { + v2_rt::rc_empty_map::>() + }; +Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: cost_seq(recv_r.summary.clone().work.clone(), &loop_work), + span: cost_seq(recv_r.summary.clone().span.clone(), &loop_work), + output_size: scan_os, + certainty: recv_r.summary.clone().certainty.clone(), +}), + table: recv_r.table.clone(), +}) +}, + CostShape::ShapeConstant => Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: cost_seq(recv_r.summary.clone().work.clone(), &Rc::new(CostExpr::CostConst { + value: 1, +})), + span: cost_seq(recv_r.summary.clone().span.clone(), &Rc::new(CostExpr::CostConst { + value: 1, +})), + output_size: v2_rt::rc_empty_map::>(), + certainty: recv_r.summary.clone().certainty.clone(), +}), + table: recv_r.table.clone(), +}), +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -7465,413 +3799,283 @@ pub struct ComplexityReport { pub fn empty_complexity_report() -> Rc { Rc::new(ComplexityReport { - function_classes: v2_rt::rc_empty_map::(), - violations: Rc::new(vec![]), - structural_bounds: Rc::new(vec![]), - }) + function_classes: v2_rt::rc_empty_map::(), + violations: Rc::new(vec![]), + structural_bounds: Rc::new(vec![]), +}) } pub fn simplify_cost(expr: Rc) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*expr.clone()).clone() { - CostExpr::CostConst { .. } => expr.clone(), - CostExpr::CostAdd { - left: l, right: r, .. - } => { - let sl = simplify_cost(l.clone()); - let sr = simplify_cost(r.clone()); - let simplified = match (*sl.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => sr.clone(), - CostExpr::CostConst { value: a, .. } => match (*sr.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => sl.clone(), - CostExpr::CostConst { value: b, .. } => Rc::new(CostExpr::CostConst { - value: (a.clone() + b.clone()), - }), - _ => Rc::new(CostExpr::CostAdd { - left: sl.clone(), - right: sr.clone(), - }), - }, - _ => match (*sr.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => sl.clone(), - _ => Rc::new(CostExpr::CostAdd { - left: sl.clone(), - right: sr.clone(), - }), - }, - }; - simplified - } - CostExpr::CostMul { - left: l, right: r, .. - } => { - let sl = simplify_cost(l.clone()); - let sr = simplify_cost(r.clone()); - let simplified = match (*sl.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => { - Rc::new(CostExpr::CostConst { value: 0 }) - } - CostExpr::CostConst { value: 1, .. } => sr.clone(), - _ => match (*sr.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => { - Rc::new(CostExpr::CostConst { value: 0 }) - } - CostExpr::CostConst { value: 1, .. } => sl.clone(), - _ => Rc::new(CostExpr::CostMul { - left: sl.clone(), - right: sr.clone(), - }), - }, - }; - simplified - } - CostExpr::CostMax { - left: l, right: r, .. - } => { - let sl = simplify_cost(l.clone()); - let sr = simplify_cost(r.clone()); - let simplified = match (*sl.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => sr.clone(), - CostExpr::CostConst { value: a, .. } => match (*sr.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => sl.clone(), - CostExpr::CostConst { value: b, .. } => { - if (a.clone() > b.clone()) { - sl.clone() - } else { - sr.clone() - } - } - _ => Rc::new(CostExpr::CostMax { - left: sl.clone(), - right: sr.clone(), - }), - }, - _ => match (*sr.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => sl.clone(), - _ => Rc::new(CostExpr::CostMax { - left: sl.clone(), - right: sr.clone(), - }), - }, - }; - simplified - } - CostExpr::CostSum { - binder: b, - upper: u, - body: bd, - .. - } => { - let sbd = simplify_cost(bd.clone()); - match (*sbd.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => { - Rc::new(CostExpr::CostConst { value: 0 }) - } - _ => Rc::new(CostExpr::CostSum { - binder: b.clone(), - upper: u.clone(), - body: sbd.clone(), - }), - } - } - CostExpr::CostLog { - base: b, - argument: a, - .. - } => Rc::new(CostExpr::CostLog { - base: b.clone(), - argument: a.clone(), - }), - CostExpr::CostExtern { .. } => expr.clone(), - CostExpr::CostUnknown { .. } => expr.clone(), - } + CostExpr::CostConst { .. } => expr.clone(), + CostExpr::CostAdd { left: l, right: r, .. } => { + let sl = simplify_cost(l.clone()); +let sr = simplify_cost(r.clone()); +let simplified = match (*sl.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => sr.clone(), + CostExpr::CostConst { value: a, .. } => match (*sr.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => sl.clone(), + CostExpr::CostConst { value: b, .. } => Rc::new(CostExpr::CostConst { + value: (a.clone() + b.clone()), +}), + _ => Rc::new(CostExpr::CostAdd { + left: sl.clone(), + right: sr.clone(), +}), +}, + _ => match (*sr.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => sl.clone(), + _ => Rc::new(CostExpr::CostAdd { + left: sl.clone(), + right: sr.clone(), +}), +}, +}; +simplified +}, + CostExpr::CostMul { left: l, right: r, .. } => { + let sl = simplify_cost(l.clone()); +let sr = simplify_cost(r.clone()); +let simplified = match (*sl.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => Rc::new(CostExpr::CostConst { + value: 0, +}), + CostExpr::CostConst { value: 1, .. } => sr.clone(), + _ => match (*sr.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => Rc::new(CostExpr::CostConst { + value: 0, +}), + CostExpr::CostConst { value: 1, .. } => sl.clone(), + _ => Rc::new(CostExpr::CostMul { + left: sl.clone(), + right: sr.clone(), +}), +}, +}; +simplified +}, + CostExpr::CostMax { left: l, right: r, .. } => { + let sl = simplify_cost(l.clone()); +let sr = simplify_cost(r.clone()); +let simplified = match (*sl.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => sr.clone(), + CostExpr::CostConst { value: a, .. } => match (*sr.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => sl.clone(), + CostExpr::CostConst { value: b, .. } => if (a.clone() > b.clone()) { + sl.clone() + } else { + sr.clone() + }, + _ => Rc::new(CostExpr::CostMax { + left: sl.clone(), + right: sr.clone(), +}), +}, + _ => match (*sr.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => sl.clone(), + _ => Rc::new(CostExpr::CostMax { + left: sl.clone(), + right: sr.clone(), +}), +}, +}; +simplified +}, + CostExpr::CostSum { binder: b, upper: u, body: bd, .. } => { + let sbd = simplify_cost(bd.clone()); +match (*sbd.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => Rc::new(CostExpr::CostConst { + value: 0, +}), + _ => Rc::new(CostExpr::CostSum { + binder: b.clone(), + upper: u.clone(), + body: sbd.clone(), +}), +} +}, + CostExpr::CostLog { base: b, argument: a, .. } => Rc::new(CostExpr::CostLog { + base: b.clone(), + argument: a.clone(), +}), + CostExpr::CostExtern { .. } => expr.clone(), + CostExpr::CostUnknown { .. } => expr.clone(), +} }) } pub fn format_size(size: Rc) -> String { - stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || match (*size).clone() { - SizeExpr::SizeLen { collection: c, .. } => { - v2_rt::concat(v2_rt::concat("|".to_string(), c.clone()), "|".to_string()) - } - SizeExpr::SizeVar { name: n, .. } => n.clone(), - SizeExpr::SizeConst { value: v, .. } => (v.clone()).to_string(), - SizeExpr::SizeAdd { - left: l, right: r, .. - } => v2_rt::concat( - v2_rt::concat(format_size(l.clone()), " + ".to_string()), - format_size(r.clone()), - ), - SizeExpr::SizeMax { - left: l, right: r, .. - } => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("max(".to_string(), format_size(l.clone())), - ", ".to_string(), - ), - format_size(r.clone()), - ), - ")".to_string(), - ), + stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { + match (*size).clone() { + SizeExpr::SizeLen { collection: c, .. } => v2_rt::concat(v2_rt::concat("|".to_string(), c.clone()), "|".to_string()), + SizeExpr::SizeVar { name: n, .. } => n.clone(), + SizeExpr::SizeConst { value: v, .. } => (v.clone()).to_string(), + SizeExpr::SizeAdd { left: l, right: r, .. } => v2_rt::concat(v2_rt::concat(format_size(l.clone()), " + ".to_string()), format_size(r.clone())), + SizeExpr::SizeMax { left: l, right: r, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("max(".to_string(), format_size(l.clone())), ", ".to_string()), format_size(r.clone())), ")".to_string()), +} }) } pub fn normalize_asymptotic(expr: Rc) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*expr.clone()).clone() { - CostExpr::CostConst { value: v, .. } => { - if (v.clone() <= 0) { - Rc::new(CostExpr::CostConst { value: 0 }) - } else { - Rc::new(CostExpr::CostConst { value: 1 }) - } - } - CostExpr::CostAdd { - left: l, right: r, .. - } => { - let nl = normalize_asymptotic(l.clone()); - let nr = normalize_asymptotic(r.clone()); - if (nl.clone() == nr.clone()) { - nl.clone() - } else { - match (*nl.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => nr.clone(), - CostExpr::CostConst { .. } => match (*nr.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => nl.clone(), - CostExpr::CostConst { .. } => Rc::new(CostExpr::CostConst { value: 1 }), - _ => nr.clone(), - }, - _ => match (*nr.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => nl.clone(), - CostExpr::CostConst { .. } => nl.clone(), - _ => Rc::new(CostExpr::CostAdd { - left: nl.clone(), - right: nr.clone(), - }), - }, - } - } - } - CostExpr::CostMax { - left: l, right: r, .. - } => { - let nl = normalize_asymptotic(l.clone()); - let nr = normalize_asymptotic(r.clone()); - if (nl.clone() == nr.clone()) { - nl.clone() - } else { - match (*nl.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => nr.clone(), - CostExpr::CostConst { .. } => match (*nr.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => nl.clone(), - CostExpr::CostConst { .. } => Rc::new(CostExpr::CostConst { value: 1 }), - _ => nr.clone(), - }, - _ => match (*nr.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => nl.clone(), - CostExpr::CostConst { .. } => nl.clone(), - _ => Rc::new(CostExpr::CostMax { - left: nl.clone(), - right: nr.clone(), - }), - }, - } - } - } - CostExpr::CostMul { - left: l, right: r, .. - } => { - let nl = normalize_asymptotic(l.clone()); - let nr = normalize_asymptotic(r.clone()); + CostExpr::CostConst { value: v, .. } => if (v.clone() <= 0) { + Rc::new(CostExpr::CostConst { + value: 0, +}) + } else { + Rc::new(CostExpr::CostConst { + value: 1, +}) + }, + CostExpr::CostAdd { left: l, right: r, .. } => { + let nl = normalize_asymptotic(l.clone()); +let nr = normalize_asymptotic(r.clone()); +if (nl.clone() == nr.clone()) { + nl.clone() + } else { match (*nl.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => { - Rc::new(CostExpr::CostConst { value: 0 }) - } - CostExpr::CostConst { .. } => nr.clone(), - _ => match (*nr.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => { - Rc::new(CostExpr::CostConst { value: 0 }) - } - CostExpr::CostConst { .. } => nl.clone(), - _ => Rc::new(CostExpr::CostMul { - left: nl.clone(), - right: nr.clone(), - }), - }, - } + CostExpr::CostConst { value: 0, .. } => nr.clone(), + CostExpr::CostConst { .. } => match (*nr.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => nl.clone(), + CostExpr::CostConst { .. } => Rc::new(CostExpr::CostConst { + value: 1, +}), + _ => nr.clone(), +}, + _ => match (*nr.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => nl.clone(), + CostExpr::CostConst { .. } => nl.clone(), + _ => Rc::new(CostExpr::CostAdd { + left: nl.clone(), + right: nr.clone(), +}), +}, +} } - CostExpr::CostSum { - binder: b, - upper: u, - body: bd, - .. - } => { - let nbd = normalize_asymptotic(bd.clone()); - match (*nbd.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => { - Rc::new(CostExpr::CostConst { value: 0 }) - } - _ => match (*u.clone()).clone() { - SizeExpr::SizeConst { .. } => nbd.clone(), - _ => Rc::new(CostExpr::CostSum { - binder: b.clone(), - upper: u.clone(), - body: nbd.clone(), - }), - }, - } +}, + CostExpr::CostMax { left: l, right: r, .. } => { + let nl = normalize_asymptotic(l.clone()); +let nr = normalize_asymptotic(r.clone()); +if (nl.clone() == nr.clone()) { + nl.clone() + } else { + match (*nl.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => nr.clone(), + CostExpr::CostConst { .. } => match (*nr.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => nl.clone(), + CostExpr::CostConst { .. } => Rc::new(CostExpr::CostConst { + value: 1, +}), + _ => nr.clone(), +}, + _ => match (*nr.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => nl.clone(), + CostExpr::CostConst { .. } => nl.clone(), + _ => Rc::new(CostExpr::CostMax { + left: nl.clone(), + right: nr.clone(), +}), +}, +} } - CostExpr::CostLog { - base: b, - argument: a, - .. - } => Rc::new(CostExpr::CostLog { - base: b.clone(), - argument: a.clone(), - }), - CostExpr::CostExtern { .. } => expr.clone(), - CostExpr::CostUnknown { .. } => expr.clone(), - } +}, + CostExpr::CostMul { left: l, right: r, .. } => { + let nl = normalize_asymptotic(l.clone()); +let nr = normalize_asymptotic(r.clone()); +match (*nl.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => Rc::new(CostExpr::CostConst { + value: 0, +}), + CostExpr::CostConst { .. } => nr.clone(), + _ => match (*nr.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => Rc::new(CostExpr::CostConst { + value: 0, +}), + CostExpr::CostConst { .. } => nl.clone(), + _ => Rc::new(CostExpr::CostMul { + left: nl.clone(), + right: nr.clone(), +}), +}, +} +}, + CostExpr::CostSum { binder: b, upper: u, body: bd, .. } => { + let nbd = normalize_asymptotic(bd.clone()); +match (*nbd.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => Rc::new(CostExpr::CostConst { + value: 0, +}), + _ => match (*u.clone()).clone() { + SizeExpr::SizeConst { .. } => nbd.clone(), + _ => Rc::new(CostExpr::CostSum { + binder: b.clone(), + upper: u.clone(), + body: nbd.clone(), +}), +}, +} +}, + CostExpr::CostLog { base: b, argument: a, .. } => Rc::new(CostExpr::CostLog { + base: b.clone(), + argument: a.clone(), +}), + CostExpr::CostExtern { .. } => expr.clone(), + CostExpr::CostUnknown { .. } => expr.clone(), +} }) } pub fn format_cost_class(expr: Rc) -> String { match (*expr).clone() { - CostExpr::CostConst { .. } => "O(1)".to_string(), - CostExpr::CostExtern { name: n, .. } => v2_rt::concat( - v2_rt::concat("O(extern(".to_string(), n.clone()), - "))".to_string(), - ), - CostExpr::CostUnknown { .. } => "O(?)".to_string(), - CostExpr::CostSum { - upper: u, body: bd, .. - } => match (*bd.clone()).clone() { - CostExpr::CostConst { .. } => v2_rt::concat( - v2_rt::concat("O(".to_string(), format_size(u.clone())), - ")".to_string(), - ), - _ => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("O(".to_string(), format_size(u.clone())), - " * ".to_string(), - ), - format_cost_inner(bd.clone()), - ), - ")".to_string(), - ), - }, - CostExpr::CostAdd { - left: l, right: r, .. - } => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("O(".to_string(), format_cost_inner(l.clone())), - " + ".to_string(), - ), - format_cost_inner(r.clone()), - ), - ")".to_string(), - ), - CostExpr::CostMul { - left: l, right: r, .. - } => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("O(".to_string(), parenthesize_additive_cost(&l)), - " * ".to_string(), - ), - parenthesize_additive_cost(&r), - ), - ")".to_string(), - ), - CostExpr::CostMax { - left: l, right: r, .. - } => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("O(max(".to_string(), format_cost_inner(l.clone())), - ", ".to_string(), - ), - format_cost_inner(r.clone()), - ), - "))".to_string(), - ), - CostExpr::CostLog { argument: a, .. } => v2_rt::concat( - v2_rt::concat("O(log ".to_string(), format_size(a.clone())), - ")".to_string(), - ), - } + CostExpr::CostConst { .. } => "O(1)".to_string(), + CostExpr::CostExtern { name: n, .. } => v2_rt::concat(v2_rt::concat("O(extern(".to_string(), n.clone()), "))".to_string()), + CostExpr::CostUnknown { .. } => "O(?)".to_string(), + CostExpr::CostSum { upper: u, body: bd, .. } => match (*bd.clone()).clone() { + CostExpr::CostConst { .. } => v2_rt::concat(v2_rt::concat("O(".to_string(), format_size(u.clone())), ")".to_string()), + _ => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("O(".to_string(), format_size(u.clone())), " * ".to_string()), format_cost_inner(bd.clone())), ")".to_string()), +}, + CostExpr::CostAdd { left: l, right: r, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("O(".to_string(), format_cost_inner(l.clone())), " + ".to_string()), format_cost_inner(r.clone())), ")".to_string()), + CostExpr::CostMul { left: l, right: r, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("O(".to_string(), parenthesize_additive_cost(&l)), " * ".to_string()), parenthesize_additive_cost(&r)), ")".to_string()), + CostExpr::CostMax { left: l, right: r, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("O(max(".to_string(), format_cost_inner(l.clone())), ", ".to_string()), format_cost_inner(r.clone())), "))".to_string()), + CostExpr::CostLog { argument: a, .. } => v2_rt::concat(v2_rt::concat("O(log ".to_string(), format_size(a.clone())), ")".to_string()), +} } pub fn format_cost_inner(expr: Rc) -> String { - stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || match (*expr).clone() { - CostExpr::CostConst { .. } => "1".to_string(), - CostExpr::CostSum { - upper: u, body: bd, .. - } => match (*bd.clone()).clone() { - CostExpr::CostConst { .. } => format_size(u.clone()), - _ => v2_rt::concat( - v2_rt::concat(format_size(u.clone()), " * ".to_string()), - format_cost_inner(bd.clone()), - ), - }, - CostExpr::CostAdd { - left: l, right: r, .. - } => v2_rt::concat( - v2_rt::concat(format_cost_inner(l.clone()), " + ".to_string()), - format_cost_inner(r.clone()), - ), - CostExpr::CostMul { - left: l, right: r, .. - } => { + stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { + match (*expr).clone() { + CostExpr::CostConst { .. } => "1".to_string(), + CostExpr::CostSum { upper: u, body: bd, .. } => match (*bd.clone()).clone() { + CostExpr::CostConst { .. } => format_size(u.clone()), + _ => v2_rt::concat(v2_rt::concat(format_size(u.clone()), " * ".to_string()), format_cost_inner(bd.clone())), +}, + CostExpr::CostAdd { left: l, right: r, .. } => v2_rt::concat(v2_rt::concat(format_cost_inner(l.clone()), " + ".to_string()), format_cost_inner(r.clone())), + CostExpr::CostMul { left: l, right: r, .. } => { let left_str = match (*l.clone()).clone() { - CostExpr::CostAdd { .. } => v2_rt::concat( - v2_rt::concat("(".to_string(), format_cost_inner(l.clone())), - ")".to_string(), - ), - _ => format_cost_inner(l.clone()), - }; - let right_str = match (*r.clone()).clone() { - CostExpr::CostAdd { .. } => v2_rt::concat( - v2_rt::concat("(".to_string(), format_cost_inner(r.clone())), - ")".to_string(), - ), - _ => format_cost_inner(r.clone()), - }; - v2_rt::concat(v2_rt::concat(left_str, " * ".to_string()), right_str) - } - CostExpr::CostMax { - left: l, right: r, .. - } => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("max(".to_string(), format_cost_inner(l.clone())), - ", ".to_string(), - ), - format_cost_inner(r.clone()), - ), - ")".to_string(), - ), - CostExpr::CostLog { argument: a, .. } => { - v2_rt::concat("log ".to_string(), format_size(a.clone())) - } - CostExpr::CostExtern { name: n, .. } => v2_rt::concat( - v2_rt::concat("extern(".to_string(), n.clone()), - ")".to_string(), - ), - CostExpr::CostUnknown { .. } => "?".to_string(), + CostExpr::CostAdd { .. } => v2_rt::concat(v2_rt::concat("(".to_string(), format_cost_inner(l.clone())), ")".to_string()), + _ => format_cost_inner(l.clone()), +}; +let right_str = match (*r.clone()).clone() { + CostExpr::CostAdd { .. } => v2_rt::concat(v2_rt::concat("(".to_string(), format_cost_inner(r.clone())), ")".to_string()), + _ => format_cost_inner(r.clone()), +}; +v2_rt::concat(v2_rt::concat(left_str, " * ".to_string()), right_str) +}, + CostExpr::CostMax { left: l, right: r, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("max(".to_string(), format_cost_inner(l.clone())), ", ".to_string()), format_cost_inner(r.clone())), ")".to_string()), + CostExpr::CostLog { argument: a, .. } => v2_rt::concat("log ".to_string(), format_size(a.clone())), + CostExpr::CostExtern { name: n, .. } => v2_rt::concat(v2_rt::concat("extern(".to_string(), n.clone()), ")".to_string()), + CostExpr::CostUnknown { .. } => "?".to_string(), +} }) } pub fn parenthesize_additive_cost(expr: &Rc) -> String { match (*expr.clone()).clone() { - CostExpr::CostAdd { .. } => v2_rt::concat( - v2_rt::concat("(".to_string(), format_cost_inner(expr.clone())), - ")".to_string(), - ), - _ => format_cost_inner(expr.clone()), - } + CostExpr::CostAdd { .. } => v2_rt::concat(v2_rt::concat("(".to_string(), format_cost_inner(expr.clone())), ")".to_string()), + _ => format_cost_inner(expr.clone()), +} } pub fn short_var_name(index: i64) -> String { @@ -7905,10 +4109,7 @@ pub fn short_var_name(index: i64) -> String { if (index.clone() == 9) { "w".to_string() } else { - v2_rt::concat( - "x".to_string(), - (index.clone()).to_string(), - ) + v2_rt::concat("x".to_string(), (index.clone()).to_string()) } } } @@ -7930,214 +4131,146 @@ pub struct Legend { pub fn build_legend(size_names: Rc>) -> Rc { { let unique = deduplicate(size_names); - if ((unique.clone().len() as i64) == 0) { +if ((unique.clone().len() as i64) == 0) { Rc::new(Legend { - substitution: v2_rt::rc_empty_map::(), - suffix: "".to_string(), - }) + substitution: v2_rt::rc_empty_map::(), + suffix: "".to_string(), +}) } else { if ((unique.clone().len() as i64) == 1) { match unique.clone().first().cloned() { - Some(name) => Rc::new(Legend { - substitution: v2_rt::rc_map_insert( - v2_rt::rc_empty_map::(), - name.clone(), - "n".to_string(), - ), - suffix: "".to_string(), - }), - None => Rc::new(Legend { - substitution: v2_rt::rc_empty_map::(), - suffix: "".to_string(), - }), - } + Some(name) => Rc::new(Legend { + substitution: v2_rt::rc_map_insert(v2_rt::rc_empty_map::(), name.clone(), "n".to_string()), + suffix: "".to_string(), +}), + None => Rc::new(Legend { + substitution: v2_rt::rc_empty_map::(), + suffix: "".to_string(), +}), +} } else { { - let indexed = unique.clone().iter().cloned().fold( - Rc::new(Legend { - substitution: v2_rt::rc_empty_map::(), - suffix: "".to_string(), - }), - |acc: Rc, name: String| { - let idx = - (Rc::new(v2_rt::map_keys(&acc.substitution.clone())).len() as i64); - let short = short_var_name(idx.clone()); - Rc::new(Legend { - substitution: v2_rt::rc_map_insert( - acc.substitution.clone(), - name.clone(), - short.clone(), - ), - suffix: if (acc.suffix.clone().as_str() == "".to_string().as_str()) - { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(" where ".to_string(), short.clone()), - " = ".to_string(), - ), - name.clone(), - ) - } else { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(acc.suffix.clone(), ", ".to_string()), - short.clone(), - ), - " = ".to_string(), - ), - name.clone(), - ) - }, - }) + let indexed = unique.clone().iter().cloned().fold(Rc::new(Legend { + substitution: v2_rt::rc_empty_map::(), + suffix: "".to_string(), +}), |acc: Rc, name: String| { + let idx = (Rc::new(v2_rt::map_keys(&acc.substitution.clone())).len() as i64); +let short = short_var_name(idx.clone()); +Rc::new(Legend { + substitution: v2_rt::rc_map_insert(acc.substitution.clone(), name.clone(), short.clone()), + suffix: if (acc.suffix.clone().as_str() == "".to_string().as_str()) { + v2_rt::concat(v2_rt::concat(v2_rt::concat(" where ".to_string(), short.clone()), " = ".to_string()), name.clone()) + } else { + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(acc.suffix.clone(), ", ".to_string()), short.clone()), " = ".to_string()), name.clone()) }, - ); - indexed - } +}) +}); +indexed +} } } - } +} } pub fn substitute_size(size: Rc, legend: &Rc>) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*size.clone()).clone() { - SizeExpr::SizeLen { collection: c, .. } => match v2_rt::map_get(&legend, c.clone()) { - Some(short) => Rc::new(SizeExpr::SizeVar { - name: short.clone(), - }), - None => size.clone(), - }, - SizeExpr::SizeVar { name: n, .. } => match v2_rt::map_get(&legend, n.clone()) { - Some(short) => Rc::new(SizeExpr::SizeVar { - name: short.clone(), - }), - None => size.clone(), - }, - SizeExpr::SizeAdd { - left: l, right: r, .. - } => Rc::new(SizeExpr::SizeAdd { - left: substitute_size(l.clone(), &legend), - right: substitute_size(r.clone(), &legend), - }), - SizeExpr::SizeMax { - left: l, right: r, .. - } => Rc::new(SizeExpr::SizeMax { - left: substitute_size(l.clone(), &legend), - right: substitute_size(r.clone(), &legend), - }), - SizeExpr::SizeConst { .. } => size.clone(), - } + SizeExpr::SizeLen { collection: c, .. } => match v2_rt::map_get(&legend, c.clone()) { + Some(short) => Rc::new(SizeExpr::SizeVar { + name: short.clone(), +}), + None => size.clone(), +}, + SizeExpr::SizeVar { name: n, .. } => match v2_rt::map_get(&legend, n.clone()) { + Some(short) => Rc::new(SizeExpr::SizeVar { + name: short.clone(), +}), + None => size.clone(), +}, + SizeExpr::SizeAdd { left: l, right: r, .. } => Rc::new(SizeExpr::SizeAdd { + left: substitute_size(l.clone(), &legend), + right: substitute_size(r.clone(), &legend), +}), + SizeExpr::SizeMax { left: l, right: r, .. } => Rc::new(SizeExpr::SizeMax { + left: substitute_size(l.clone(), &legend), + right: substitute_size(r.clone(), &legend), +}), + SizeExpr::SizeConst { .. } => size.clone(), +} }) } pub fn substitute_cost(expr: Rc, legend: &Rc>) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*expr.clone()).clone() { - CostExpr::CostConst { .. } => expr.clone(), - CostExpr::CostAdd { - left: l, right: r, .. - } => Rc::new(CostExpr::CostAdd { - left: substitute_cost(l.clone(), &legend), - right: substitute_cost(r.clone(), &legend), - }), - CostExpr::CostMul { - left: l, right: r, .. - } => Rc::new(CostExpr::CostMul { - left: substitute_cost(l.clone(), &legend), - right: substitute_cost(r.clone(), &legend), - }), - CostExpr::CostMax { - left: l, right: r, .. - } => Rc::new(CostExpr::CostMax { - left: substitute_cost(l.clone(), &legend), - right: substitute_cost(r.clone(), &legend), - }), - CostExpr::CostSum { - binder: b, - upper: u, - body: bd, - .. - } => Rc::new(CostExpr::CostSum { - binder: b.clone(), - upper: substitute_size(u.clone(), &legend), - body: substitute_cost(bd.clone(), &legend), - }), - CostExpr::CostLog { - base: b, - argument: a, - .. - } => Rc::new(CostExpr::CostLog { - base: b.clone(), - argument: substitute_size(a.clone(), &legend), - }), - CostExpr::CostExtern { .. } => expr.clone(), - CostExpr::CostUnknown { .. } => expr.clone(), - } + CostExpr::CostConst { .. } => expr.clone(), + CostExpr::CostAdd { left: l, right: r, .. } => Rc::new(CostExpr::CostAdd { + left: substitute_cost(l.clone(), &legend), + right: substitute_cost(r.clone(), &legend), +}), + CostExpr::CostMul { left: l, right: r, .. } => Rc::new(CostExpr::CostMul { + left: substitute_cost(l.clone(), &legend), + right: substitute_cost(r.clone(), &legend), +}), + CostExpr::CostMax { left: l, right: r, .. } => Rc::new(CostExpr::CostMax { + left: substitute_cost(l.clone(), &legend), + right: substitute_cost(r.clone(), &legend), +}), + CostExpr::CostSum { binder: b, upper: u, body: bd, .. } => Rc::new(CostExpr::CostSum { + binder: b.clone(), + upper: substitute_size(u.clone(), &legend), + body: substitute_cost(bd.clone(), &legend), +}), + CostExpr::CostLog { base: b, argument: a, .. } => Rc::new(CostExpr::CostLog { + base: b.clone(), + argument: substitute_size(a.clone(), &legend), +}), + CostExpr::CostExtern { .. } => expr.clone(), + CostExpr::CostUnknown { .. } => expr.clone(), +} }) } pub fn classify_complexity(expr: Rc) -> String { { let normalized = normalize_asymptotic(simplify_cost(expr)); - let size_names = collect_size_vars(normalized.clone()); - let legend = build_legend(size_names); - let substituted = substitute_cost(normalized.clone(), &legend.substitution.clone()); - v2_rt::concat(format_cost_class(substituted), legend.suffix.clone()) - } +let size_names = collect_size_vars(normalized.clone()); +let legend = build_legend(size_names); +let substituted = substitute_cost(normalized.clone(), &legend.substitution.clone()); +v2_rt::concat(format_cost_class(substituted), legend.suffix.clone()) +} } pub fn collect_size_vars_from_size(size: Rc) -> Rc> { - stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || match (*size).clone() { - SizeExpr::SizeLen { collection: c, .. } => { - if (c.clone().as_str() == "__expr".to_string().as_str()) { - Rc::new(vec![]) - } else { - Rc::new(vec![c.clone()]) - } - } - SizeExpr::SizeVar { name: n, .. } => { - if (n.clone().as_str() == "__k".to_string().as_str()) { - Rc::new(vec![]) - } else { - Rc::new(vec![n.clone()]) - } - } - SizeExpr::SizeAdd { - left: l, right: r, .. - } => v2_rt::concat( - collect_size_vars_from_size(l.clone()), - collect_size_vars_from_size(r.clone()), - ), - SizeExpr::SizeMax { - left: l, right: r, .. - } => v2_rt::concat( - collect_size_vars_from_size(l.clone()), - collect_size_vars_from_size(r.clone()), - ), - _ => Rc::new(vec![]), + stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { + match (*size).clone() { + SizeExpr::SizeLen { collection: c, .. } => if (c.clone().as_str() == "__expr".to_string().as_str()) { + Rc::new(vec![]) + } else { + Rc::new(vec![c.clone()]) + }, + SizeExpr::SizeVar { name: n, .. } => if (n.clone().as_str() == "__k".to_string().as_str()) { + Rc::new(vec![]) + } else { + Rc::new(vec![n.clone()]) + }, + SizeExpr::SizeAdd { left: l, right: r, .. } => v2_rt::concat(collect_size_vars_from_size(l.clone()), collect_size_vars_from_size(r.clone())), + SizeExpr::SizeMax { left: l, right: r, .. } => v2_rt::concat(collect_size_vars_from_size(l.clone()), collect_size_vars_from_size(r.clone())), + _ => Rc::new(vec![]), +} }) } pub fn collect_size_vars(expr: Rc) -> Rc> { - stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || match (*expr).clone() { - CostExpr::CostSum { - upper: u, body: bd, .. - } => v2_rt::concat( - collect_size_vars_from_size(u.clone()), - collect_size_vars(bd.clone()), - ), - CostExpr::CostAdd { - left: l, right: r, .. - } => v2_rt::concat(collect_size_vars(l.clone()), collect_size_vars(r.clone())), - CostExpr::CostMul { - left: l, right: r, .. - } => v2_rt::concat(collect_size_vars(l.clone()), collect_size_vars(r.clone())), - CostExpr::CostMax { - left: l, right: r, .. - } => v2_rt::concat(collect_size_vars(l.clone()), collect_size_vars(r.clone())), - CostExpr::CostLog { argument: a, .. } => collect_size_vars_from_size(a.clone()), - _ => Rc::new(vec![]), + stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { + match (*expr).clone() { + CostExpr::CostSum { upper: u, body: bd, .. } => v2_rt::concat(collect_size_vars_from_size(u.clone()), collect_size_vars(bd.clone())), + CostExpr::CostAdd { left: l, right: r, .. } => v2_rt::concat(collect_size_vars(l.clone()), collect_size_vars(r.clone())), + CostExpr::CostMul { left: l, right: r, .. } => v2_rt::concat(collect_size_vars(l.clone()), collect_size_vars(r.clone())), + CostExpr::CostMax { left: l, right: r, .. } => v2_rt::concat(collect_size_vars(l.clone()), collect_size_vars(r.clone())), + CostExpr::CostLog { argument: a, .. } => collect_size_vars_from_size(a.clone()), + _ => Rc::new(vec![]), +} }) } @@ -8149,24 +4282,18 @@ pub struct DeduplicateAcc { pub fn deduplicate(items: Rc>) -> Rc> { { - let result = items.iter().cloned().fold( - Rc::new(DeduplicateAcc { - seen: v2_rt::rc_empty_map::(), - out: Rc::new(vec![]), - }), - |acc: Rc, item: String| match v2_rt::map_get( - &acc.seen.clone(), - item.clone(), - ) { - Some(_) => acc.clone(), - None => Rc::new(DeduplicateAcc { - seen: v2_rt::rc_map_insert(acc.seen.clone(), item.clone(), true), - out: v2_rt::rc_list_push(acc.out.clone(), item.clone()), - }), - }, - ); - result.out.clone() - } + let result = items.iter().cloned().fold(Rc::new(DeduplicateAcc { + seen: v2_rt::rc_empty_map::(), + out: Rc::new(vec![]), +}), |acc: Rc, item: String| match v2_rt::map_get(&acc.seen.clone(), item.clone()) { + Some(_) => acc.clone(), + None => Rc::new(DeduplicateAcc { + seen: v2_rt::rc_map_insert(acc.seen.clone(), item.clone(), true), + out: v2_rt::rc_list_push(acc.out.clone(), item.clone()), +}), +}); +result.out.clone() +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -8202,623 +4329,385 @@ pub struct MatchCostAccum { pub branch_costs: Rc>>, } -pub fn cost_of_expr( - texpr: &Rc, - func_index: &Rc>>, - scc_index: &Rc>>, - table: Rc, - parser_always_advancing: &Rc>, - recursion_ctx: &RecursionContext, - si: &Rc>>, -) -> Rc { +pub fn cost_of_expr(texpr: &Rc, func_index: &Rc>>, scc_index: &Rc>>, table: Rc, parser_always_advancing: &Rc>, recursion_ctx: &RecursionContext, si: &Rc>>) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*texpr.expr_data.clone()).clone() { - ExprData::ExprLiteral { .. } => Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: Rc::new(CostExpr::CostConst { value: 1 }), - span: Rc::new(CostExpr::CostConst { value: 1 }), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Proven, - }), - table: table, - }), - ExprData::ExprError { .. } => Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: Rc::new(CostExpr::CostConst { value: 0 }), - span: Rc::new(CostExpr::CostConst { value: 0 }), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Proven, - }), - table: table, - }), - ExprData::ExprVar { .. } => Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: Rc::new(CostExpr::CostConst { value: 1 }), - span: Rc::new(CostExpr::CostConst { value: 1 }), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Proven, - }), - table: table, - }), - ExprData::ExprBinOp { .. } => { - let l = binop_left(texpr.clone()); - let r = binop_right(texpr.clone()); - let lr = cost_of_expr( - &l, - &func_index, - &scc_index, - table, - &parser_always_advancing, - &recursion_ctx, - &si, - ); - let rr = cost_of_expr( - &r, - &func_index, - &scc_index, - lr.table.clone(), - &parser_always_advancing, - &recursion_ctx, - &si, - ); - Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: cost_seq( - lr.summary.clone().work.clone(), - &cost_seq( - Rc::new(CostExpr::CostConst { value: 1 }), - &rr.summary.clone().work.clone(), - ), - ), - span: cost_seq( - lr.summary.clone().span.clone(), - &cost_seq( - Rc::new(CostExpr::CostConst { value: 1 }), - &rr.summary.clone().span.clone(), - ), - ), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Proven, - }), - table: rr.table.clone(), - }) - } - ExprData::ExprCall { .. } => { - let fname = expr_call_func_at(texpr.clone(), si.clone()); - let callee_result = match v2_rt::map_get(&func_index, fname.clone()) { - Some(entry) => get_or_compute_summary( - &fname, - &func_index, - &scc_index, - &table, - parser_always_advancing.clone(), - recursion_ctx.clone(), - si.clone(), - ), - None => Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: Rc::new(CostExpr::CostConst { value: 1 }), - span: Rc::new(CostExpr::CostConst { value: 1 }), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Proven, - }), - table: table, - }), - }; - let args_result = texpr.children.clone().iter().cloned().fold( - Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: Rc::new(CostExpr::CostConst { value: 0 }), - span: Rc::new(CostExpr::CostConst { value: 0 }), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Proven, - }), - table: callee_result.table.clone(), - }), - |acc: Rc, a: Rc| { - let ar = cost_of_expr( - &arg_value(&a), - &func_index, - &scc_index, - acc.table.clone(), - &parser_always_advancing, - &recursion_ctx, - &si, - ); - Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: cost_seq( - acc.summary.clone().work.clone(), - &ar.summary.clone().work.clone(), - ), - span: cost_seq( - acc.summary.clone().span.clone(), - &ar.summary.clone().span.clone(), - ), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Proven, - }), - table: ar.table.clone(), - }) - }, - ); - Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: cost_seq( - args_result.summary.clone().work.clone(), - &callee_result.summary.clone().work.clone(), - ), - span: cost_seq( - args_result.summary.clone().span.clone(), - &callee_result.summary.clone().span.clone(), - ), - output_size: callee_result.summary.clone().output_size.clone(), - certainty: callee_result.summary.clone().certainty.clone(), - }), - table: args_result.table.clone(), - }) - } - ExprData::ExprMethodCall { - method_semantics: ms, - .. - } => { - let recv = method_receiver(texpr.clone()); - let mc_args = method_arg_nodes(texpr.clone()); - let recv_r = cost_of_expr( - &recv, - &func_index, - &scc_index, - table, - &parser_always_advancing, - &recursion_ctx, - &si, - ); - let size = receiver_size_var(recv.clone(), si.clone()); - let binder = size_binder_name(size.clone()); - let method_cost_result = if (ms.clone() == None) { - None - } else { - match (*ms.clone().unwrap()).clone() { - MethodSemantics::AlgebraMethodSemantics { - method_def: md, - cost_shape: cs, - .. - } => { - let pc = node_is_collection(&resolved_type(texpr.clone()), si.clone()); - match cs.clone() { - Some(shape) => Some(cost_of_method_by_shape( - shape.clone(), - pc, - &recv_r, - mc_args.clone(), - &size, - &binder, - func_index.clone(), - scc_index.clone(), - parser_always_advancing.clone(), - recursion_ctx.clone(), - &si, - )), - None => Some(Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: cost_seq( - recv_r.summary.clone().work.clone(), - &Rc::new(CostExpr::CostConst { value: 1 }), - ), - span: cost_seq( - recv_r.summary.clone().span.clone(), - &Rc::new(CostExpr::CostConst { value: 1 }), - ), - output_size: v2_rt::rc_empty_map::>(), - certainty: recv_r.summary.clone().certainty.clone(), - }), - table: recv_r.table.clone(), - })), - } - } - _ => None, - } - }; - match method_cost_result { - Some(result) => result.clone(), - _ => { - let args_result = mc_args.clone().iter().cloned().fold( - Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: Rc::new(CostExpr::CostConst { value: 0 }), - span: Rc::new(CostExpr::CostConst { value: 0 }), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Proven, - }), - table: recv_r.table.clone(), - }), - |acc: Rc, a: Rc| { - let ar = cost_of_expr( - &arg_value(&a), - &func_index, - &scc_index, - acc.table.clone(), - &parser_always_advancing, - &recursion_ctx, - &si, - ); - Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: cost_seq( - acc.summary.clone().work.clone(), - &ar.summary.clone().work.clone(), - ), - span: cost_seq( - acc.summary.clone().span.clone(), - &ar.summary.clone().span.clone(), - ), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Proven, - }), - table: ar.table.clone(), - }) - }, - ); - Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: cost_seq( - recv_r.summary.clone().work.clone(), - &cost_seq( - Rc::new(CostExpr::CostConst { value: 1 }), - &args_result.summary.clone().work.clone(), - ), - ), - span: cost_seq( - recv_r.summary.clone().span.clone(), - &cost_seq( - Rc::new(CostExpr::CostConst { value: 1 }), - &args_result.summary.clone().span.clone(), - ), - ), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Proven, - }), - table: args_result.table.clone(), - }) - } - } - } - ExprData::ExprMatch => { - let scrut = match_scrutinee(texpr.clone()); - let arm_nodes = match_arm_nodes(texpr.clone()); - let s_r = cost_of_expr( - &scrut, - &func_index, - &scc_index, - table, - &parser_always_advancing, - &recursion_ctx, - &si, - ); - let arms_accum = arm_nodes.iter().cloned().fold( - Rc::new(MatchCostAccum { - result: Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: Rc::new(CostExpr::CostConst { value: 0 }), - span: Rc::new(CostExpr::CostConst { value: 0 }), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Proven, - }), - table: s_r.table.clone(), - }), - branch_costs: Rc::new(vec![]), - }), - |acc: Rc, arm_node: Rc| { - let ar = cost_of_expr( - &arm_body(&arm_node), - &func_index, - &scc_index, - acc.result.clone().table.clone(), - &parser_always_advancing, - &recursion_ctx, - &si, - ); - Rc::new(MatchCostAccum { - result: Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: cost_par( - acc.result.clone().summary.clone().work.clone(), - &ar.summary.clone().work.clone(), - ), - span: cost_par( - acc.result.clone().summary.clone().span.clone(), - &ar.summary.clone().span.clone(), - ), - output_size: ar.summary.clone().output_size.clone(), - certainty: ar.summary.clone().certainty.clone(), - }), - table: ar.table.clone(), - }), - branch_costs: v2_rt::concat( - acc.branch_costs.clone(), - Rc::new(vec![ar.summary.clone().work.clone()]), - ), - }) - }, - ); - Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: cost_conditional( - s_r.summary.clone().work.clone(), - arms_accum.branch_costs.clone(), - ), - span: cost_conditional( - s_r.summary.clone().span.clone(), - Rc::new(vec![arms_accum.result.clone().summary.clone().span.clone()]), - ), - output_size: arms_accum - .result - .clone() - .summary - .clone() - .output_size - .clone(), - certainty: arms_accum.result.clone().summary.clone().certainty.clone(), - }), - table: arms_accum.result.clone().table.clone(), - }) - } - ExprData::ExprIf => { - let c = if_condition(texpr.clone()); - let t = if_then_branch(texpr.clone()); - let c_r = cost_of_expr( - &c, - &func_index, - &scc_index, - table, - &parser_always_advancing, - &recursion_ctx, - &si, - ); - let t_r = cost_of_expr( - &t, - &func_index, - &scc_index, - c_r.table.clone(), - &parser_always_advancing, - &recursion_ctx, - &si, - ); - let e_result = match if_else_branch(texpr.clone()) { - Some(eb) => { - let er = cost_of_expr( - &eb, - &func_index, - &scc_index, - t_r.table.clone(), - &parser_always_advancing, - &recursion_ctx, - &si, - ); - Rc::new(SummaryResult { - summary: er.summary.clone(), - table: er.table.clone(), - }) - } - None => Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: Rc::new(CostExpr::CostConst { value: 0 }), - span: Rc::new(CostExpr::CostConst { value: 0 }), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Proven, - }), - table: t_r.table.clone(), - }), - }; - Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: cost_conditional( - c_r.summary.clone().work.clone(), - Rc::new(vec![ - t_r.summary.clone().work.clone(), - e_result.summary.clone().work.clone(), - ]), - ), - span: cost_conditional( - c_r.summary.clone().span.clone(), - Rc::new(vec![ - t_r.summary.clone().span.clone(), - e_result.summary.clone().span.clone(), - ]), - ), - output_size: t_r.summary.clone().output_size.clone(), - certainty: Certainty::Proven, - }), - table: e_result.table.clone(), - }) - } - ExprData::ExprLet => { - let v = let_value(texpr.clone()); - let v_r = cost_of_expr( - &v, - &func_index, - &scc_index, - table, - &parser_always_advancing, - &recursion_ctx, - &si, - ); - match let_body(texpr.clone()) { - Some(b) => { - let b_r = cost_of_expr( - &b, - &func_index, - &scc_index, - v_r.table.clone(), - &parser_always_advancing, - &recursion_ctx, - &si, - ); - Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: cost_seq( - v_r.summary.clone().work.clone(), - &b_r.summary.clone().work.clone(), - ), - span: cost_seq( - v_r.summary.clone().span.clone(), - &b_r.summary.clone().span.clone(), - ), - output_size: b_r.summary.clone().output_size.clone(), - certainty: b_r.summary.clone().certainty.clone(), - }), - table: b_r.table.clone(), - }) - } - None => v_r.clone(), - } - } - ExprData::ExprBlock => texpr.children.clone().iter().cloned().fold( - Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: Rc::new(CostExpr::CostConst { value: 0 }), - span: Rc::new(CostExpr::CostConst { value: 0 }), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Proven, - }), - table: table, - }), - |acc: Rc, s: Rc| { - let sr = cost_of_expr( - &s, - &func_index, - &scc_index, - acc.table.clone(), - &parser_always_advancing, - &recursion_ctx, - &si, - ); - Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: cost_seq( - acc.summary.clone().work.clone(), - &sr.summary.clone().work.clone(), - ), - span: cost_seq( - acc.summary.clone().span.clone(), - &sr.summary.clone().span.clone(), - ), - output_size: sr.summary.clone().output_size.clone(), - certainty: sr.summary.clone().certainty.clone(), - }), - table: sr.table.clone(), - }) - }, - ), - ExprData::ExprForEach => { - let c = foreach_collection(texpr.clone()); - let bd = foreach_body(texpr.clone()); - let c_r = cost_of_expr( - &c, - &func_index, - &scc_index, - table, - &parser_always_advancing, - &recursion_ctx, - &si, - ); - let bd_r = cost_of_expr( - &bd, - &func_index, - &scc_index, - c_r.table.clone(), - &parser_always_advancing, - &recursion_ctx, - &si, - ); - let size = receiver_size_var(c.clone(), si.clone()); - let binder = size_binder_name(size.clone()); - let loop_work = cost_loop(binder, size.clone(), &bd_r.summary.clone().work.clone()); - Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: cost_seq(c_r.summary.clone().work.clone(), &loop_work), - span: cost_seq(c_r.summary.clone().span.clone(), &loop_work), - output_size: v2_rt::rc_empty_map::>(), - certainty: bd_r.summary.clone().certainty.clone(), - }), - table: bd_r.table.clone(), - }) - } - ExprData::NoExprData => texpr.children.clone().iter().cloned().fold( - Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: Rc::new(CostExpr::CostConst { value: 0 }), - span: Rc::new(CostExpr::CostConst { value: 0 }), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Proven, - }), - table: table, - }), - |acc: Rc, child: Rc| { - let cr = cost_of_expr( - &child, - &func_index, - &scc_index, - acc.table.clone(), - &parser_always_advancing, - &recursion_ctx, - &si, - ); - Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: cost_seq( - acc.summary.clone().work.clone(), - &cr.summary.clone().work.clone(), - ), - span: cost_seq( - acc.summary.clone().span.clone(), - &cr.summary.clone().span.clone(), - ), - output_size: cr.summary.clone().output_size.clone(), - certainty: cr.summary.clone().certainty.clone(), - }), - table: cr.table.clone(), - }) - }, - ), - _ => texpr.children.clone().iter().cloned().fold( - Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: Rc::new(CostExpr::CostConst { value: 1 }), - span: Rc::new(CostExpr::CostConst { value: 1 }), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Proven, - }), - table: table, - }), - |acc: Rc, child: Rc| { - let cr = cost_of_expr( - &child, - &func_index, - &scc_index, - acc.table.clone(), - &parser_always_advancing, - &recursion_ctx, - &si, - ); - Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: cost_seq( - acc.summary.clone().work.clone(), - &cr.summary.clone().work.clone(), - ), - span: cost_seq( - acc.summary.clone().span.clone(), - &cr.summary.clone().span.clone(), - ), - output_size: cr.summary.clone().output_size.clone(), - certainty: cr.summary.clone().certainty.clone(), - }), - table: cr.table.clone(), - }) - }, - ), - } + ExprData::ExprLiteral { .. } => Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: Rc::new(CostExpr::CostConst { + value: 1, +}), + span: Rc::new(CostExpr::CostConst { + value: 1, +}), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Proven, +}), + table: table, +}), + ExprData::ExprError { .. } => Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: Rc::new(CostExpr::CostConst { + value: 0, +}), + span: Rc::new(CostExpr::CostConst { + value: 0, +}), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Proven, +}), + table: table, +}), + ExprData::ExprVar { .. } => Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: Rc::new(CostExpr::CostConst { + value: 1, +}), + span: Rc::new(CostExpr::CostConst { + value: 1, +}), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Proven, +}), + table: table, +}), + ExprData::ExprBinOp { .. } => { + let l = binop_left(texpr.clone()); +let r = binop_right(texpr.clone()); +let lr = cost_of_expr(&l, &func_index, &scc_index, table, &parser_always_advancing, &recursion_ctx, &si); +let rr = cost_of_expr(&r, &func_index, &scc_index, lr.table.clone(), &parser_always_advancing, &recursion_ctx, &si); +Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: cost_seq(lr.summary.clone().work.clone(), &cost_seq(Rc::new(CostExpr::CostConst { + value: 1, +}), &rr.summary.clone().work.clone())), + span: cost_seq(lr.summary.clone().span.clone(), &cost_seq(Rc::new(CostExpr::CostConst { + value: 1, +}), &rr.summary.clone().span.clone())), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Proven, +}), + table: rr.table.clone(), +}) +}, + ExprData::ExprCall { .. } => { + let fname = expr_call_func_at(texpr.clone(), si.clone()); +let callee_result = match v2_rt::map_get(&func_index, fname.clone()) { + Some(entry) => get_or_compute_summary(&fname, &func_index, &scc_index, &table, parser_always_advancing.clone(), recursion_ctx.clone(), si.clone()), + None => Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: Rc::new(CostExpr::CostConst { + value: 1, +}), + span: Rc::new(CostExpr::CostConst { + value: 1, +}), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Proven, +}), + table: table, +}), +}; +let args_result = texpr.children.clone().iter().cloned().fold(Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: Rc::new(CostExpr::CostConst { + value: 0, +}), + span: Rc::new(CostExpr::CostConst { + value: 0, +}), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Proven, +}), + table: callee_result.table.clone(), +}), |acc: Rc, a: Rc| { + let ar = cost_of_expr(&arg_value(&a), &func_index, &scc_index, acc.table.clone(), &parser_always_advancing, &recursion_ctx, &si); +Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: cost_seq(acc.summary.clone().work.clone(), &ar.summary.clone().work.clone()), + span: cost_seq(acc.summary.clone().span.clone(), &ar.summary.clone().span.clone()), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Proven, +}), + table: ar.table.clone(), +}) +}); +Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: cost_seq(args_result.summary.clone().work.clone(), &callee_result.summary.clone().work.clone()), + span: cost_seq(args_result.summary.clone().span.clone(), &callee_result.summary.clone().span.clone()), + output_size: callee_result.summary.clone().output_size.clone(), + certainty: callee_result.summary.clone().certainty.clone(), +}), + table: args_result.table.clone(), +}) +}, + ExprData::ExprMethodCall { method_semantics: ms, .. } => { + let recv = method_receiver(texpr.clone()); +let mc_args = method_arg_nodes(texpr.clone()); +let recv_r = cost_of_expr(&recv, &func_index, &scc_index, table, &parser_always_advancing, &recursion_ctx, &si); +let size = receiver_size_var(recv.clone(), si.clone()); +let binder = size_binder_name(size.clone()); +let method_cost_result = if (ms.clone() == None) { + None + } else { + match (*ms.clone().unwrap()).clone() { + MethodSemantics::AlgebraMethodSemantics { method_def: md, cost_shape: cs, .. } => { + let pc = node_is_collection(&resolved_type(texpr.clone()), si.clone()); +match cs.clone() { + Some(shape) => Some(cost_of_method_by_shape(shape.clone(), pc, &recv_r, mc_args.clone(), &size, &binder, func_index.clone(), scc_index.clone(), parser_always_advancing.clone(), recursion_ctx.clone(), &si)), + None => Some(Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: cost_seq(recv_r.summary.clone().work.clone(), &Rc::new(CostExpr::CostConst { + value: 1, +})), + span: cost_seq(recv_r.summary.clone().span.clone(), &Rc::new(CostExpr::CostConst { + value: 1, +})), + output_size: v2_rt::rc_empty_map::>(), + certainty: recv_r.summary.clone().certainty.clone(), +}), + table: recv_r.table.clone(), +})), +} +}, + _ => None, +} + }; +match method_cost_result { + Some(result) => result.clone(), + _ => { + let args_result = mc_args.clone().iter().cloned().fold(Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: Rc::new(CostExpr::CostConst { + value: 0, +}), + span: Rc::new(CostExpr::CostConst { + value: 0, +}), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Proven, +}), + table: recv_r.table.clone(), +}), |acc: Rc, a: Rc| { + let ar = cost_of_expr(&arg_value(&a), &func_index, &scc_index, acc.table.clone(), &parser_always_advancing, &recursion_ctx, &si); +Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: cost_seq(acc.summary.clone().work.clone(), &ar.summary.clone().work.clone()), + span: cost_seq(acc.summary.clone().span.clone(), &ar.summary.clone().span.clone()), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Proven, +}), + table: ar.table.clone(), +}) +}); +Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: cost_seq(recv_r.summary.clone().work.clone(), &cost_seq(Rc::new(CostExpr::CostConst { + value: 1, +}), &args_result.summary.clone().work.clone())), + span: cost_seq(recv_r.summary.clone().span.clone(), &cost_seq(Rc::new(CostExpr::CostConst { + value: 1, +}), &args_result.summary.clone().span.clone())), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Proven, +}), + table: args_result.table.clone(), +}) +}, +} +}, + ExprData::ExprMatch => { + let scrut = match_scrutinee(texpr.clone()); +let arm_nodes = match_arm_nodes(texpr.clone()); +let s_r = cost_of_expr(&scrut, &func_index, &scc_index, table, &parser_always_advancing, &recursion_ctx, &si); +let arms_accum = arm_nodes.iter().cloned().fold(Rc::new(MatchCostAccum { + result: Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: Rc::new(CostExpr::CostConst { + value: 0, +}), + span: Rc::new(CostExpr::CostConst { + value: 0, +}), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Proven, +}), + table: s_r.table.clone(), +}), + branch_costs: Rc::new(vec![]), +}), |acc: Rc, arm_node: Rc| { + let ar = cost_of_expr(&arm_body(&arm_node), &func_index, &scc_index, acc.result.clone().table.clone(), &parser_always_advancing, &recursion_ctx, &si); +Rc::new(MatchCostAccum { + result: Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: cost_par(acc.result.clone().summary.clone().work.clone(), &ar.summary.clone().work.clone()), + span: cost_par(acc.result.clone().summary.clone().span.clone(), &ar.summary.clone().span.clone()), + output_size: ar.summary.clone().output_size.clone(), + certainty: ar.summary.clone().certainty.clone(), +}), + table: ar.table.clone(), +}), + branch_costs: v2_rt::concat(acc.branch_costs.clone(), Rc::new(vec![ar.summary.clone().work.clone()])), +}) +}); +Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: cost_conditional(s_r.summary.clone().work.clone(), arms_accum.branch_costs.clone()), + span: cost_conditional(s_r.summary.clone().span.clone(), Rc::new(vec![arms_accum.result.clone().summary.clone().span.clone()])), + output_size: arms_accum.result.clone().summary.clone().output_size.clone(), + certainty: arms_accum.result.clone().summary.clone().certainty.clone(), +}), + table: arms_accum.result.clone().table.clone(), +}) +}, + ExprData::ExprIf => { + let c = if_condition(texpr.clone()); +let t = if_then_branch(texpr.clone()); +let c_r = cost_of_expr(&c, &func_index, &scc_index, table, &parser_always_advancing, &recursion_ctx, &si); +let t_r = cost_of_expr(&t, &func_index, &scc_index, c_r.table.clone(), &parser_always_advancing, &recursion_ctx, &si); +let e_result = match if_else_branch(texpr.clone()) { + Some(eb) => { + let er = cost_of_expr(&eb, &func_index, &scc_index, t_r.table.clone(), &parser_always_advancing, &recursion_ctx, &si); +Rc::new(SummaryResult { + summary: er.summary.clone(), + table: er.table.clone(), +}) +}, + None => Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: Rc::new(CostExpr::CostConst { + value: 0, +}), + span: Rc::new(CostExpr::CostConst { + value: 0, +}), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Proven, +}), + table: t_r.table.clone(), +}), +}; +Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: cost_conditional(c_r.summary.clone().work.clone(), Rc::new(vec![t_r.summary.clone().work.clone(), e_result.summary.clone().work.clone()])), + span: cost_conditional(c_r.summary.clone().span.clone(), Rc::new(vec![t_r.summary.clone().span.clone(), e_result.summary.clone().span.clone()])), + output_size: t_r.summary.clone().output_size.clone(), + certainty: Certainty::Proven, +}), + table: e_result.table.clone(), +}) +}, + ExprData::ExprLet => { + let v = let_value(texpr.clone()); +let v_r = cost_of_expr(&v, &func_index, &scc_index, table, &parser_always_advancing, &recursion_ctx, &si); +match let_body(texpr.clone()) { + Some(b) => { + let b_r = cost_of_expr(&b, &func_index, &scc_index, v_r.table.clone(), &parser_always_advancing, &recursion_ctx, &si); +Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: cost_seq(v_r.summary.clone().work.clone(), &b_r.summary.clone().work.clone()), + span: cost_seq(v_r.summary.clone().span.clone(), &b_r.summary.clone().span.clone()), + output_size: b_r.summary.clone().output_size.clone(), + certainty: b_r.summary.clone().certainty.clone(), +}), + table: b_r.table.clone(), +}) +}, + None => v_r.clone(), +} +}, + ExprData::ExprBlock => texpr.children.clone().iter().cloned().fold(Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: Rc::new(CostExpr::CostConst { + value: 0, +}), + span: Rc::new(CostExpr::CostConst { + value: 0, +}), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Proven, +}), + table: table, +}), |acc: Rc, s: Rc| { + let sr = cost_of_expr(&s, &func_index, &scc_index, acc.table.clone(), &parser_always_advancing, &recursion_ctx, &si); +Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: cost_seq(acc.summary.clone().work.clone(), &sr.summary.clone().work.clone()), + span: cost_seq(acc.summary.clone().span.clone(), &sr.summary.clone().span.clone()), + output_size: sr.summary.clone().output_size.clone(), + certainty: sr.summary.clone().certainty.clone(), +}), + table: sr.table.clone(), +}) +}), + ExprData::ExprForEach => { + let c = foreach_collection(texpr.clone()); +let bd = foreach_body(texpr.clone()); +let c_r = cost_of_expr(&c, &func_index, &scc_index, table, &parser_always_advancing, &recursion_ctx, &si); +let bd_r = cost_of_expr(&bd, &func_index, &scc_index, c_r.table.clone(), &parser_always_advancing, &recursion_ctx, &si); +let size = receiver_size_var(c.clone(), si.clone()); +let binder = size_binder_name(size.clone()); +let loop_work = cost_loop(binder, size.clone(), &bd_r.summary.clone().work.clone()); +Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: cost_seq(c_r.summary.clone().work.clone(), &loop_work), + span: cost_seq(c_r.summary.clone().span.clone(), &loop_work), + output_size: v2_rt::rc_empty_map::>(), + certainty: bd_r.summary.clone().certainty.clone(), +}), + table: bd_r.table.clone(), +}) +}, + ExprData::NoExprData => texpr.children.clone().iter().cloned().fold(Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: Rc::new(CostExpr::CostConst { + value: 0, +}), + span: Rc::new(CostExpr::CostConst { + value: 0, +}), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Proven, +}), + table: table, +}), |acc: Rc, child: Rc| { + let cr = cost_of_expr(&child, &func_index, &scc_index, acc.table.clone(), &parser_always_advancing, &recursion_ctx, &si); +Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: cost_seq(acc.summary.clone().work.clone(), &cr.summary.clone().work.clone()), + span: cost_seq(acc.summary.clone().span.clone(), &cr.summary.clone().span.clone()), + output_size: cr.summary.clone().output_size.clone(), + certainty: cr.summary.clone().certainty.clone(), +}), + table: cr.table.clone(), +}) +}), + _ => texpr.children.clone().iter().cloned().fold(Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: Rc::new(CostExpr::CostConst { + value: 1, +}), + span: Rc::new(CostExpr::CostConst { + value: 1, +}), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Proven, +}), + table: table, +}), |acc: Rc, child: Rc| { + let cr = cost_of_expr(&child, &func_index, &scc_index, acc.table.clone(), &parser_always_advancing, &recursion_ctx, &si); +Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: cost_seq(acc.summary.clone().work.clone(), &cr.summary.clone().work.clone()), + span: cost_seq(acc.summary.clone().span.clone(), &cr.summary.clone().span.clone()), + output_size: cr.summary.clone().output_size.clone(), + certainty: cr.summary.clone().certainty.clone(), +}), + table: cr.table.clone(), +}) +}), +} }) } @@ -8827,736 +4716,436 @@ pub fn estimate_expr_size(texpr: Rc, budget: i64) -> i64 { if (budget.clone() <= 0) { 0 } else { - texpr - .children - .clone() - .iter() - .cloned() - .fold((budget.clone() - 1), |acc: i64, child: Rc| { - estimate_expr_size(child.clone(), acc) - }) + texpr.children.clone().iter().cloned().fold((budget.clone() - 1), |acc: i64, child: Rc| estimate_expr_size(child.clone(), acc)) } }) } -pub fn get_or_compute_summary( - func_name: &String, - func_index: &Rc>>, - scc_index: &Rc>>, - table: &Rc, - parser_always_advancing: Rc>, - recursion_ctx: RecursionContext, - si: Rc>>, -) -> Rc { +pub fn get_or_compute_summary(func_name: &String, func_index: &Rc>>, scc_index: &Rc>>, table: &Rc, parser_always_advancing: Rc>, recursion_ctx: RecursionContext, si: Rc>>) -> Rc { match lookup_summary(table.clone(), func_name.clone()) { - Some(cached) => Rc::new(SummaryResult { - summary: cached.clone(), - table: table.clone(), - }), - None => match v2_rt::map_get(&func_index, func_name.clone()) { - Some(entry) => { - let target = match v2_rt::map_get(&scc_index, func_name.clone()) { - Some(info) => Some(info.pattern.clone()), - None => None, - }; - let is_recursive = (target.clone() != None); - let zero_placeholder = Rc::new(ComplexitySummary { - work: Rc::new(CostExpr::CostConst { value: 0 }), - span: Rc::new(CostExpr::CostConst { value: 0 }), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Conservative, - }); - let table_prepped = if is_recursive { - cache_summary(table.clone(), func_name.clone(), zero_placeholder) - } else { - table.clone() - }; - let result = cost_of_expr( - &entry.body.clone(), - &func_index, - &scc_index, - table_prepped, - &parser_always_advancing, - &recursion_ctx, - &si, - ); - let scc_members = match v2_rt::map_get(&scc_index, func_name.clone()) { - Some(info) => info.members.clone(), - None => Rc::new(vec![]), - }; - let is_scc = ((scc_members.clone().len() as i64) > 1); - let bounded = match target.clone() { - Some(t) => { - if is_scc { - Rc::new(ComplexitySummary { - work: bounded_scc_cost( - t.clone(), - result.summary.clone().work.clone(), - scc_members.clone(), - ), - span: bounded_scc_cost( - t.clone(), - result.summary.clone().span.clone(), - scc_members.clone(), - ), - output_size: result.summary.clone().output_size.clone(), - certainty: Certainty::Conservative, - }) - } else { - Rc::new(ComplexitySummary { - work: bounded_recursive_cost( - t.clone(), - result.summary.clone().work.clone(), - func_name.clone(), - ), - span: bounded_recursive_cost( - t.clone(), - result.summary.clone().span.clone(), - func_name.clone(), - ), - output_size: result.summary.clone().output_size.clone(), - certainty: Certainty::Conservative, - }) - } - } - None => result.summary.clone(), - }; - let simplified = Rc::new(ComplexitySummary { - work: simplify_cost(bounded.work.clone()), - span: simplify_cost(bounded.span.clone()), - output_size: bounded.output_size.clone(), - certainty: bounded.certainty.clone(), - }); - let final_table = - cache_summary(result.table.clone(), func_name.clone(), simplified.clone()); - Rc::new(SummaryResult { - summary: simplified.clone(), - table: final_table, - }) - } - None => { - let is_unexpected_miss = (v2_rt::map_get(&scc_index, func_name.clone()) != None); - if is_unexpected_miss { - { - let miss_summary = Rc::new(ComplexitySummary { - work: Rc::new(CostExpr::CostUnknown { - reason: v2_rt::concat( - "internal function missing from index: ".to_string(), - func_name.clone(), - ), - }), - span: Rc::new(CostExpr::CostUnknown { - reason: v2_rt::concat( - "internal function missing from index: ".to_string(), - func_name.clone(), - ), - }), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Conservative, - }); - Rc::new(SummaryResult { - summary: miss_summary, - table: table.clone(), - }) - } - } else { - { - let external_summary = Rc::new(ComplexitySummary { - work: Rc::new(CostExpr::CostExtern { - name: func_name.clone(), - }), - span: Rc::new(CostExpr::CostExtern { - name: func_name.clone(), - }), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Conservative, - }); - Rc::new(SummaryResult { - summary: external_summary, - table: table.clone(), - }) - } - } - } + Some(cached) => Rc::new(SummaryResult { + summary: cached.clone(), + table: table.clone(), +}), + None => match v2_rt::map_get(&func_index, func_name.clone()) { + Some(entry) => { + let target = match v2_rt::map_get(&scc_index, func_name.clone()) { + Some(info) => Some(info.pattern.clone()), + None => None, +}; +let is_recursive = (target.clone() != None); +let zero_placeholder = Rc::new(ComplexitySummary { + work: Rc::new(CostExpr::CostConst { + value: 0, +}), + span: Rc::new(CostExpr::CostConst { + value: 0, +}), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Conservative, +}); +let table_prepped = if is_recursive { + cache_summary(table.clone(), func_name.clone(), zero_placeholder) + } else { + table.clone() + }; +let result = cost_of_expr(&entry.body.clone(), &func_index, &scc_index, table_prepped, &parser_always_advancing, &recursion_ctx, &si); +let scc_members = match v2_rt::map_get(&scc_index, func_name.clone()) { + Some(info) => info.members.clone(), + None => Rc::new(vec![]), +}; +let is_scc = ((scc_members.clone().len() as i64) > 1); +let bounded = match target.clone() { + Some(t) => if is_scc { + Rc::new(ComplexitySummary { + work: bounded_scc_cost(t.clone(), result.summary.clone().work.clone(), scc_members.clone()), + span: bounded_scc_cost(t.clone(), result.summary.clone().span.clone(), scc_members.clone()), + output_size: result.summary.clone().output_size.clone(), + certainty: Certainty::Conservative, +}) + } else { + Rc::new(ComplexitySummary { + work: bounded_recursive_cost(t.clone(), result.summary.clone().work.clone(), func_name.clone()), + span: bounded_recursive_cost(t.clone(), result.summary.clone().span.clone(), func_name.clone()), + output_size: result.summary.clone().output_size.clone(), + certainty: Certainty::Conservative, +}) }, - } + None => result.summary.clone(), +}; +let simplified = Rc::new(ComplexitySummary { + work: simplify_cost(bounded.work.clone()), + span: simplify_cost(bounded.span.clone()), + output_size: bounded.output_size.clone(), + certainty: bounded.certainty.clone(), +}); +let final_table = cache_summary(result.table.clone(), func_name.clone(), simplified.clone()); +Rc::new(SummaryResult { + summary: simplified.clone(), + table: final_table, +}) +}, + None => { + let is_unexpected_miss = (v2_rt::map_get(&scc_index, func_name.clone()) != None); +if is_unexpected_miss { + { + let miss_summary = Rc::new(ComplexitySummary { + work: Rc::new(CostExpr::CostUnknown { + reason: v2_rt::concat("internal function missing from index: ".to_string(), func_name.clone()), +}), + span: Rc::new(CostExpr::CostUnknown { + reason: v2_rt::concat("internal function missing from index: ".to_string(), func_name.clone()), +}), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Conservative, +}); +Rc::new(SummaryResult { + summary: miss_summary, + table: table.clone(), +}) +} + } else { + { + let external_summary = Rc::new(ComplexitySummary { + work: Rc::new(CostExpr::CostExtern { + name: func_name.clone(), +}), + span: Rc::new(CostExpr::CostExtern { + name: func_name.clone(), +}), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Conservative, +}); +Rc::new(SummaryResult { + summary: external_summary, + table: table.clone(), +}) +} + } +}, +}, +} } -pub fn collect_call_evidence( - body: &Rc, - target_set: &Rc>, - si: &Rc>>, -) -> Rc>>>> { +pub fn collect_call_evidence(body: &Rc, target_set: &Rc>, si: &Rc>>) -> Rc>>>> { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*body.expr_data.clone()).clone() { - ExprData::ExprCall { - descent_evidence: de, - .. - } => { - let callee = expr_call_func_at(body.clone(), si.clone()); - let own = if (v2_rt::map_get(&target_set, callee) != None) { - match de.clone() { - Some(evidence) => Rc::new(vec![evidence.clone()]), - None => Rc::new(vec![]), - } - } else { - Rc::new(vec![]) - }; - let from_children = body.children.clone().iter().cloned().fold( - Rc::new(vec![]), - |acc: _, child: Rc| { - v2_rt::concat(acc, collect_call_evidence(&child, &target_set, &si)) - }, - ); - v2_rt::concat(own, from_children) - } - _ => body.children.clone().iter().cloned().fold( - Rc::new(vec![]), - |acc: Rc>>>>, child: Rc| { - v2_rt::concat(acc, collect_call_evidence(&child, &target_set, &si)) - }, - ), - } + ExprData::ExprCall { descent_evidence: de, .. } => { + let callee = expr_call_func_at(body.clone(), si.clone()); +let own = if (v2_rt::map_get(&target_set, callee) != None) { + match de.clone() { + Some(evidence) => Rc::new(vec![evidence.clone()]), + None => Rc::new(vec![]), +} + } else { + Rc::new(vec![]) + }; +let from_children = body.children.clone().iter().cloned().fold(Rc::new(vec![]), |acc: _, child: Rc| v2_rt::concat(acc, collect_call_evidence(&child, &target_set, &si))); +v2_rt::concat(own, from_children) +}, + _ => body.children.clone().iter().cloned().fold(Rc::new(vec![]), |acc: Rc>>>>, child: Rc| v2_rt::concat(acc, collect_call_evidence(&child, &target_set, &si))), +} }) } -pub fn collect_self_call_evidence( - body: Rc, - fn_name: String, - si: Rc>>, -) -> Rc>>>> { - collect_call_evidence( - &body, - &v2_rt::rc_map_insert(v2_rt::rc_empty_map::(), fn_name, true), - &si, - ) +pub fn collect_self_call_evidence(body: Rc, fn_name: String, si: Rc>>) -> Rc>>>> { + collect_call_evidence(&body, &v2_rt::rc_map_insert(v2_rt::rc_empty_map::(), fn_name, true), &si) } -pub fn collect_callee_evidence( - body: Rc, - callee_name: String, - si: Rc>>, -) -> Rc>>>> { - collect_call_evidence( - &body, - &v2_rt::rc_map_insert(v2_rt::rc_empty_map::(), callee_name, true), - &si, - ) +pub fn collect_callee_evidence(body: Rc, callee_name: String, si: Rc>>) -> Rc>>>> { + collect_call_evidence(&body, &v2_rt::rc_map_insert(v2_rt::rc_empty_map::(), callee_name, true), &si) } pub fn derive_edge_evidence(all_calls: Rc>>>>) -> DescentEvidence { - all_calls.iter().cloned().fold( - DescentEvidence::Strict, - |worst: DescentEvidence, call_ev: Rc>>| { - let call_best = call_ev.clone().iter().cloned().fold( - DescentEvidence::DescentUnknown, - |best: DescentEvidence, rel: Rc| { - let ev = sub_value_to_evidence(rel.clone()); - match ev.clone() { - DescentEvidence::Strict => DescentEvidence::Strict, - _ => match best { - DescentEvidence::Strict => DescentEvidence::Strict, - DescentEvidence::NonIncreasing => DescentEvidence::NonIncreasing, - _ => ev.clone(), - }, - } - }, - ); - merge_evidence(worst, call_best.clone()) - }, - ) -} - -pub fn merge_param_evidence( - all_calls: Rc>>>>, - param_index: i64, -) -> DescentEvidence { - all_calls.iter().cloned().fold( - DescentEvidence::Strict, - |acc: DescentEvidence, call_evidence: Rc>>| match call_evidence - .clone() - .get(param_index.clone() as usize) - .cloned() - { - Some(rel) => merge_evidence(acc.clone(), sub_value_to_evidence(rel.clone())), - None => acc.clone(), - }, - ) + all_calls.iter().cloned().fold(DescentEvidence::Strict, |worst: DescentEvidence, call_ev: Rc>>| { + let call_best = call_ev.clone().iter().cloned().fold(DescentEvidence::DescentUnknown, |best: DescentEvidence, rel: Rc| { + let ev = sub_value_to_evidence(rel.clone()); +match ev.clone() { + DescentEvidence::Strict => DescentEvidence::Strict, + _ => match best { + DescentEvidence::Strict => DescentEvidence::Strict, + DescentEvidence::NonIncreasing => DescentEvidence::NonIncreasing, + _ => ev.clone(), +}, +} +}); +merge_evidence(worst, call_best.clone()) +}) } -pub fn extract_shrink_factor( - all_calls: Rc>>>>, - param_index: i64, -) -> Option> { - all_calls.iter().cloned().fold( - Some(Rc::new(ShrinkFactor::UnitShrink)), - |acc: Option>, call_evidence: Rc>>| match acc - .clone() - { - None => None, - Some(prev) => match call_evidence - .clone() - .get(param_index.clone() as usize) - .cloned() - { - Some(rel) => match (*rel.clone()).clone() { - SubValueRelation::StrictSubValue { factor: f, .. } => { - match (*prev.clone()).clone() { - ShrinkFactor::UnitShrink => Some(f.clone()), - _ => { - if (prev.clone() == f.clone()) { - acc.clone() - } else { - None - } - } - } - } - SubValueRelation::ArithmeticDescent { factor: f, .. } => { - match (*prev.clone()).clone() { - ShrinkFactor::UnitShrink => Some(f.clone()), - _ => { - if (prev.clone() == f.clone()) { - acc.clone() - } else { - None - } - } - } - } - _ => acc.clone(), - }, - None => acc.clone(), - }, - }, - ) +pub fn merge_param_evidence(all_calls: Rc>>>>, param_index: i64) -> DescentEvidence { + all_calls.iter().cloned().fold(DescentEvidence::Strict, |acc: DescentEvidence, call_evidence: Rc>>| match call_evidence.clone().get(param_index.clone() as usize).cloned() { + Some(rel) => merge_evidence(acc.clone(), sub_value_to_evidence(rel.clone())), + None => acc.clone(), +}) +} + +pub fn extract_shrink_factor(all_calls: Rc>>>>, param_index: i64) -> Option> { + all_calls.iter().cloned().fold(Some(Rc::new(ShrinkFactor::UnitShrink)), |acc: Option>, call_evidence: Rc>>| match acc.clone() { + None => None, + Some(prev) => match call_evidence.clone().get(param_index.clone() as usize).cloned() { + Some(rel) => match (*rel.clone()).clone() { + SubValueRelation::StrictSubValue { factor: f, .. } => match (*prev.clone()).clone() { + ShrinkFactor::UnitShrink => Some(f.clone()), + _ => if (prev.clone() == f.clone()) { + acc.clone() + } else { + None + }, +}, + SubValueRelation::ArithmeticDescent { factor: f, .. } => match (*prev.clone()).clone() { + ShrinkFactor::UnitShrink => Some(f.clone()), + _ => if (prev.clone() == f.clone()) { + acc.clone() + } else { + None + }, +}, + _ => acc.clone(), +}, + None => acc.clone(), +}, +}) } -pub fn max_path_descending( - body: &Rc, - fn_name: &String, - param_index: i64, - si: &Rc>>, -) -> i64 { +pub fn max_path_descending(body: &Rc, fn_name: &String, param_index: i64, si: &Rc>>) -> i64 { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*body.expr_data.clone()).clone() { - ExprData::ExprCall { - descent_evidence: de, - .. - } => { - let callee = expr_call_func_at(body.clone(), si.clone()); - let own = if (callee.as_str() == fn_name.clone().as_str()) { - match de.clone() { - Some(evidence) => { - match evidence.clone().get(param_index.clone() as usize).cloned() { - Some(rel) => match (*rel.clone()).clone() { - SubValueRelation::StrictSubValue { .. } => 1, - SubValueRelation::IteratedSubValue { .. } => 1, - SubValueRelation::ArithmeticDescent { .. } => 1, - _ => 0, - }, - None => 0, - } - } - None => 0, - } - } else { - 0 - }; - let from_children = - body.children - .clone() - .iter() - .cloned() - .fold(0, |acc: i64, child: Rc| { - (acc + max_path_descending(&child, &fn_name, param_index.clone(), &si)) - }); - (own + from_children) - } - ExprData::ExprIf => { - let cond_count = max_path_descending( - &if_condition(body.clone()), - &fn_name, - param_index.clone(), - &si, - ); - let then_count = max_path_descending( - &if_then_branch(body.clone()), - &fn_name, - param_index.clone(), - &si, - ); - let else_branch = if_else_branch(body.clone()); - let else_count = match else_branch { - Some(eb) => max_path_descending(&eb, &fn_name, param_index.clone(), &si), - None => 0, - }; - let branch_max = if (then_count.clone() > else_count.clone()) { - then_count.clone() + ExprData::ExprCall { descent_evidence: de, .. } => { + let callee = expr_call_func_at(body.clone(), si.clone()); +let own = if (callee.as_str() == fn_name.clone().as_str()) { + match de.clone() { + Some(evidence) => match evidence.clone().get(param_index.clone() as usize).cloned() { + Some(rel) => match (*rel.clone()).clone() { + SubValueRelation::StrictSubValue { .. } => 1, + SubValueRelation::IteratedSubValue { .. } => 1, + SubValueRelation::ArithmeticDescent { .. } => 1, + _ => 0, +}, + None => 0, +}, + None => 0, +} + } else { + 0 + }; +let from_children = body.children.clone().iter().cloned().fold(0, |acc: i64, child: Rc| (acc + max_path_descending(&child, &fn_name, param_index.clone(), &si))); +(own + from_children) +}, + ExprData::ExprIf => { + let cond_count = max_path_descending(&if_condition(body.clone()), &fn_name, param_index.clone(), &si); +let then_count = max_path_descending(&if_then_branch(body.clone()), &fn_name, param_index.clone(), &si); +let else_branch = if_else_branch(body.clone()); +let else_count = match else_branch { + Some(eb) => max_path_descending(&eb, &fn_name, param_index.clone(), &si), + None => 0, +}; +let branch_max = if (then_count.clone() > else_count.clone()) { + then_count.clone() + } else { + else_count.clone() + }; +(cond_count + branch_max) +}, + ExprData::ExprMatch => { + let scrut_count = max_path_descending(&match_scrutinee(body.clone()), &fn_name, param_index.clone(), &si); +let arms = match_arm_nodes(body.clone()); +let arm_max = arms.iter().cloned().fold(0, |acc: i64, arm: Rc| { + let arm_count = max_path_descending(&arm_body(&arm), &fn_name, param_index.clone(), &si); +if (arm_count.clone() > acc.clone()) { + arm_count.clone() } else { - else_count.clone() - }; - (cond_count + branch_max) - } - ExprData::ExprMatch => { - let scrut_count = max_path_descending( - &match_scrutinee(body.clone()), - &fn_name, - param_index.clone(), - &si, - ); - let arms = match_arm_nodes(body.clone()); - let arm_max = arms.iter().cloned().fold(0, |acc: i64, arm: Rc| { - let arm_count = - max_path_descending(&arm_body(&arm), &fn_name, param_index.clone(), &si); - if (arm_count.clone() > acc.clone()) { - arm_count.clone() - } else { - acc.clone() - } - }); - (scrut_count + arm_max) - } - _ => body - .children - .clone() - .iter() - .cloned() - .fold(0, |acc: i64, child: Rc| { - (acc + max_path_descending(&child, &fn_name, param_index.clone(), &si)) - }), - } + acc.clone() + } +}); +(scrut_count + arm_max) +}, + _ => body.children.clone().iter().cloned().fold(0, |acc: i64, child: Rc| (acc + max_path_descending(&child, &fn_name, param_index.clone(), &si))), +} }) } -pub fn distinct_descended_fields( - all_calls: Rc>>>>, - param_index: i64, -) -> i64 { +pub fn distinct_descended_fields(all_calls: Rc>>>>, param_index: i64) -> i64 { { - let field_set = all_calls.iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, call_evidence: Rc>>| { - match call_evidence - .clone() - .get(param_index.clone() as usize) - .cloned() - { - Some(rel) => match (*rel.clone()).clone() { - SubValueRelation::StrictSubValue { field: f, .. } => { - v2_rt::rc_map_insert(acc.clone(), f.field_name.clone(), true) - } - SubValueRelation::IteratedSubValue { field: f, .. } => { - v2_rt::rc_map_insert(acc.clone(), f.field_name.clone(), true) - } - _ => acc.clone(), - }, - None => acc.clone(), - } - }, - ); - (Rc::new(v2_rt::map_keys(&field_set)).len() as i64) - } + let field_set = all_calls.iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, call_evidence: Rc>>| match call_evidence.clone().get(param_index.clone() as usize).cloned() { + Some(rel) => match (*rel.clone()).clone() { + SubValueRelation::StrictSubValue { field: f, .. } => v2_rt::rc_map_insert(acc.clone(), f.field_name.clone(), true), + SubValueRelation::IteratedSubValue { field: f, .. } => v2_rt::rc_map_insert(acc.clone(), f.field_name.clone(), true), + _ => acc.clone(), +}, + None => acc.clone(), +}); +(Rc::new(v2_rt::map_keys(&field_set)).len() as i64) +} } -pub fn analyze_structural_bounds( - func_entries: Rc>>, - si: Rc>>, -) -> Rc>> { - func_entries.iter().cloned().fold( - Rc::new(vec![]), - |acc: Rc>>, entry: Rc| { - let all_calls = - collect_self_call_evidence(entry.body.clone(), entry.name.clone(), si.clone()); - if ((all_calls.clone().len() as i64) == 0) { - acc.clone() - } else { - { - let param_results = Rc::new( - entry - .params - .clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - .fold(Rc::new(vec![]), |pacc: _, pair: (i64, Rc)| { - let param_index = pair.0.clone(); - let param_node = pair.1.clone(); - let evidence = merge_param_evidence(all_calls.clone(), param_index.clone()); - match evidence.clone() { - DescentEvidence::Strict => { - let param_name = param_node_name_at(param_node.clone(), si.clone()); - let factor_opt = - extract_shrink_factor(all_calls.clone(), param_index.clone()); - match factor_opt.clone() { - Some(factor) => { - let branches = max_path_descending( - &entry.body.clone(), - &entry.name.clone(), - param_index.clone(), - &si, - ); - let recurrence = match (*factor.clone()).clone() { - ShrinkFactor::UnitShrink => { - let distinct_fields = distinct_descended_fields( - all_calls.clone(), - param_index.clone(), - ); - if (branches.clone() <= distinct_fields.clone()) { - catamorphism_bound(param_name.clone(), 1) - } else { - derive_bound( - param_name.clone(), - branches.clone(), - factor.clone(), - 0, - ) - } - } - ShrinkFactor::ConstantShrink { .. } => { - let distinct_fields = distinct_descended_fields( - all_calls.clone(), - param_index.clone(), - ); - if (branches.clone() <= distinct_fields.clone()) { - catamorphism_bound(param_name.clone(), 1) - } else { - derive_bound( - param_name.clone(), - branches.clone(), - factor.clone(), - 0, - ) - } - } - ShrinkFactor::ProportionalShrink { .. } => { - derive_bound( - param_name.clone(), - branches.clone(), - factor.clone(), - 0, - ) - } - }; - let stack_bound = if entry.is_tail_recursive.clone() { - Rc::new(CostBound::ConstantBound) - } else { - derive_bound(param_name.clone(), 1, factor.clone(), 0) - }; - v2_rt::concat( - pacc.clone(), - Rc::new(vec![Rc::new(StructuralBoundResult { - func_name: entry.name.clone(), - param: param_name.clone(), - recurrence_bound: recurrence.clone(), - stack_bound: stack_bound.clone(), - span: entry.span.clone(), - })]), - ) - } - None => pacc.clone(), +pub fn analyze_structural_bounds(func_entries: Rc>>, si: Rc>>) -> Rc>> { + func_entries.iter().cloned().fold(Rc::new(vec![]), |acc: Rc>>, entry: Rc| { + let all_calls = collect_self_call_evidence(entry.body.clone(), entry.name.clone(), si.clone()); +if ((all_calls.clone().len() as i64) == 0) { + acc.clone() + } else { + { + let param_results = Rc::new(entry.params.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned().fold(Rc::new(vec![]), |pacc: _, pair: (i64, Rc)| { + let param_index = pair.0.clone(); +let param_node = pair.1.clone(); +let evidence = merge_param_evidence(all_calls.clone(), param_index.clone()); +match evidence.clone() { + DescentEvidence::Strict => { + let param_name = param_node_name_at(param_node.clone(), si.clone()); +let factor_opt = extract_shrink_factor(all_calls.clone(), param_index.clone()); +match factor_opt.clone() { + Some(factor) => { + let branches = max_path_descending(&entry.body.clone(), &entry.name.clone(), param_index.clone(), &si); +let recurrence = match (*factor.clone()).clone() { + ShrinkFactor::UnitShrink => { + let distinct_fields = distinct_descended_fields(all_calls.clone(), param_index.clone()); +if (branches.clone() <= distinct_fields.clone()) { + catamorphism_bound(param_name.clone(), 1) + } else { + derive_bound(param_name.clone(), branches.clone(), factor.clone(), 0) } - } - _ => pacc.clone(), - } - }); - v2_rt::concat(acc.clone(), param_results.clone()) - } - } - }, - ) +}, + ShrinkFactor::ConstantShrink { .. } => { + let distinct_fields = distinct_descended_fields(all_calls.clone(), param_index.clone()); +if (branches.clone() <= distinct_fields.clone()) { + catamorphism_bound(param_name.clone(), 1) + } else { + derive_bound(param_name.clone(), branches.clone(), factor.clone(), 0) + } +}, + ShrinkFactor::ProportionalShrink { .. } => derive_bound(param_name.clone(), branches.clone(), factor.clone(), 0), +}; +let stack_bound = if entry.is_tail_recursive.clone() { + Rc::new(CostBound::ConstantBound) + } else { + derive_bound(param_name.clone(), 1, factor.clone(), 0) + }; +v2_rt::concat(pacc.clone(), Rc::new(vec![Rc::new(StructuralBoundResult { + func_name: entry.name.clone(), + param: param_name.clone(), + recurrence_bound: recurrence.clone(), + stack_bound: stack_bound.clone(), + span: entry.span.clone(), +})])) +}, + None => pacc.clone(), +} +}, + _ => pacc.clone(), +} +}); +v2_rt::concat(acc.clone(), param_results.clone()) +} + } +}) } -pub fn build_complexity_report( - func_entries: &Rc>>, - recursion_ctx: RecursionContext, - source_indices: Rc>>, -) -> Rc { +pub fn build_complexity_report(func_entries: &Rc>>, recursion_ctx: RecursionContext, source_indices: Rc>>) -> Rc { { let si = source_indices; - let func_index = func_entries.clone().iter().cloned().fold( - v2_rt::rc_empty_map::>(), - |acc: Rc>>, entry: Rc| { - v2_rt::rc_map_insert(acc, entry.name.clone(), entry.clone()) - }, - ); - let scc_result = build_scc_index(&func_entries, func_index.clone(), &si); - let parser_always_advancing = infer_all_parser_always_advancing(&func_index, &si); - let full_scc_index = func_entries.clone().iter().cloned().fold( - scc_result.index.clone(), - |acc: Rc>>, entry: Rc| match v2_rt::map_get( - &acc, - entry.name.clone(), - ) { - Some(_) => acc.clone(), - None => { - if (max_path_self_calls(entry.body.clone(), entry.name.clone(), si.clone()) > 0) - { - { - let pattern = classify_recursion_pattern( - &entry.name.clone(), - &entry.body.clone(), - &entry.params.clone(), - parser_always_advancing.clone(), - &si, - ); - let info = Rc::new(SccInfo { - members: Rc::new(vec![entry.name.clone()]), - member_set: v2_rt::rc_map_insert( - v2_rt::rc_empty_map::(), - entry.name.clone(), - true, - ), - pattern: pattern.clone(), - }); - v2_rt::rc_map_insert(acc.clone(), entry.name.clone(), info.clone()) - } - } else { - acc.clone() - } - } - }, - ); - let fan_in = func_entries.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, entry: Rc| { - let callees = match v2_rt::map_get( - &scc_result.call_graph.clone().forward.clone(), - entry.name.clone(), - ) { - Some(cs) => cs.clone(), - None => Rc::new(vec![]), - }; - let unique_set = callees.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |s: Rc>, c: String| { - v2_rt::rc_map_insert(s, c.clone(), true) - }, - ); - Rc::new(v2_rt::map_keys(&unique_set)).iter().cloned().fold( - acc, - |inner: Rc>, callee: String| { - let current = match v2_rt::map_get(&inner, callee.clone()) { - Some(v) => v.clone(), - None => 0, - }; - v2_rt::rc_map_insert(inner.clone(), callee.clone(), (current.clone() + 1)) - }, - ) - }, - ); - let result = scc_result.processing_order.clone().iter().cloned().fold( - Rc::new(TopoBuildAcc { - table: empty_intern_table(), - classes: v2_rt::rc_empty_map::(), - violations: Rc::new(vec![]), - fan_in: fan_in, - processed: v2_rt::rc_empty_map::(), - }), - |acc: Rc, func_name: String| match v2_rt::map_get( - &func_index, - func_name.clone(), - ) { - Some(entry) => { - let sr = get_or_compute_summary( - &func_name, - &func_index, - &full_scc_index, - &acc.table.clone(), - parser_always_advancing.clone(), - recursion_ctx.clone(), - si.clone(), - ); - let class_str = classify_complexity(sr.summary.clone().work.clone()); - let new_classes = v2_rt::rc_map_insert( - acc.classes.clone(), - func_name.clone(), - class_str.clone(), - ); - let new_processed = - v2_rt::rc_map_insert(acc.processed.clone(), func_name.clone(), true); - let new_violations = if is_unknown_cost(sr.summary.clone().work.clone()) { - v2_rt::concat( - acc.violations.clone(), - Rc::new(vec![Rc::new(ComplexityViolation { - func_name: func_name.clone(), - reason: extract_unknown_reason(sr.summary.clone().work.clone()), - span: entry.span.clone(), - })]), - ) - } else { - acc.violations.clone() - }; - let callees = match v2_rt::map_get( - &scc_result.call_graph.clone().forward.clone(), - func_name.clone(), - ) { - Some(cs) => cs.clone(), - None => Rc::new(vec![]), - }; - let unique_set = callees.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |s: Rc>, c: String| { - v2_rt::rc_map_insert(s, c.clone(), true) - }, - ); - let unique_callees = Rc::new(v2_rt::map_keys(&unique_set)); - let new_fan_in = unique_callees.clone().iter().cloned().fold( - acc.fan_in.clone(), - |fi: Rc>, callee: String| { - let current = match v2_rt::map_get(&fi, callee.clone()) { - Some(v) => v.clone(), - None => 0, - }; - v2_rt::rc_map_insert(fi.clone(), callee.clone(), (current.clone() - 1)) - }, - ); - let evicted_table = unique_callees.clone().iter().cloned().fold( - sr.table.clone(), - |t: Rc, callee: String| { - let remaining = match v2_rt::map_get(&new_fan_in, callee.clone()) { - Some(v) => v.clone(), - None => 0, - }; - if ((remaining.clone() <= 0) - && set_has(new_processed.clone(), callee.clone())) - { - evict_summary(t.clone(), callee.clone()) - } else { - t.clone() - } - }, - ); - let self_fan_in = match v2_rt::map_get(&new_fan_in, func_name.clone()) { - Some(v) => v.clone(), - None => 0, - }; - let final_table = if (self_fan_in.clone() <= 0) { - evict_summary(evicted_table.clone(), func_name.clone()) - } else { - evicted_table.clone() - }; - Rc::new(TopoBuildAcc { - table: final_table.clone(), - classes: new_classes.clone(), - violations: new_violations.clone(), - fan_in: new_fan_in.clone(), - processed: new_processed.clone(), - }) +let func_index = func_entries.clone().iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, entry: Rc| v2_rt::rc_map_insert(acc, entry.name.clone(), entry.clone())); +let scc_result = build_scc_index(&func_entries, func_index.clone(), &si); +let parser_always_advancing = infer_all_parser_always_advancing(&func_index, &si); +let full_scc_index = func_entries.clone().iter().cloned().fold(scc_result.index.clone(), |acc: Rc>>, entry: Rc| match v2_rt::map_get(&acc, entry.name.clone()) { + Some(_) => acc.clone(), + None => if (max_path_self_calls(entry.body.clone(), entry.name.clone(), si.clone()) > 0) { + { + let pattern = classify_recursion_pattern(&entry.name.clone(), &entry.body.clone(), &entry.params.clone(), parser_always_advancing.clone(), &si); +let info = Rc::new(SccInfo { + members: Rc::new(vec![entry.name.clone()]), + member_set: v2_rt::rc_map_insert(v2_rt::rc_empty_map::(), entry.name.clone(), true), + pattern: pattern.clone(), +}); +v2_rt::rc_map_insert(acc.clone(), entry.name.clone(), info.clone()) +} + } else { + acc.clone() + }, +}); +let fan_in = func_entries.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, entry: Rc| { + let callees = match v2_rt::map_get(&scc_result.call_graph.clone().forward.clone(), entry.name.clone()) { + Some(cs) => cs.clone(), + None => Rc::new(vec![]), +}; +let unique_set = callees.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |s: Rc>, c: String| v2_rt::rc_map_insert(s, c.clone(), true)); +Rc::new(v2_rt::map_keys(&unique_set)).iter().cloned().fold(acc, |inner: Rc>, callee: String| { + let current = match v2_rt::map_get(&inner, callee.clone()) { + Some(v) => v.clone(), + None => 0, +}; +v2_rt::rc_map_insert(inner.clone(), callee.clone(), (current.clone() + 1)) +}) +}); +let result = scc_result.processing_order.clone().iter().cloned().fold(Rc::new(TopoBuildAcc { + table: empty_intern_table(), + classes: v2_rt::rc_empty_map::(), + violations: Rc::new(vec![]), + fan_in: fan_in, + processed: v2_rt::rc_empty_map::(), +}), |acc: Rc, func_name: String| match v2_rt::map_get(&func_index, func_name.clone()) { + Some(entry) => { + let sr = get_or_compute_summary(&func_name, &func_index, &full_scc_index, &acc.table.clone(), parser_always_advancing.clone(), recursion_ctx.clone(), si.clone()); +let class_str = classify_complexity(sr.summary.clone().work.clone()); +let new_classes = v2_rt::rc_map_insert(acc.classes.clone(), func_name.clone(), class_str.clone()); +let new_processed = v2_rt::rc_map_insert(acc.processed.clone(), func_name.clone(), true); +let new_violations = if is_unknown_cost(sr.summary.clone().work.clone()) { + v2_rt::concat(acc.violations.clone(), Rc::new(vec![Rc::new(ComplexityViolation { + func_name: func_name.clone(), + reason: extract_unknown_reason(sr.summary.clone().work.clone()), + span: entry.span.clone(), +})])) + } else { + acc.violations.clone() + }; +let callees = match v2_rt::map_get(&scc_result.call_graph.clone().forward.clone(), func_name.clone()) { + Some(cs) => cs.clone(), + None => Rc::new(vec![]), +}; +let unique_set = callees.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |s: Rc>, c: String| v2_rt::rc_map_insert(s, c.clone(), true)); +let unique_callees = Rc::new(v2_rt::map_keys(&unique_set)); +let new_fan_in = unique_callees.clone().iter().cloned().fold(acc.fan_in.clone(), |fi: Rc>, callee: String| { + let current = match v2_rt::map_get(&fi, callee.clone()) { + Some(v) => v.clone(), + None => 0, +}; +v2_rt::rc_map_insert(fi.clone(), callee.clone(), (current.clone() - 1)) +}); +let evicted_table = unique_callees.clone().iter().cloned().fold(sr.table.clone(), |t: Rc, callee: String| { + let remaining = match v2_rt::map_get(&new_fan_in, callee.clone()) { + Some(v) => v.clone(), + None => 0, +}; +if ((remaining.clone() <= 0) && set_has(new_processed.clone(), callee.clone())) { + evict_summary(t.clone(), callee.clone()) + } else { + t.clone() } - None => acc.clone(), - }, - ); - let structural_bounds = analyze_structural_bounds(func_entries.clone(), si.clone()); - Rc::new(ComplexityReport { - function_classes: result.classes.clone(), - violations: result.violations.clone(), - structural_bounds: structural_bounds, - }) - } +}); +let self_fan_in = match v2_rt::map_get(&new_fan_in, func_name.clone()) { + Some(v) => v.clone(), + None => 0, +}; +let final_table = if (self_fan_in.clone() <= 0) { + evict_summary(evicted_table.clone(), func_name.clone()) + } else { + evicted_table.clone() + }; +Rc::new(TopoBuildAcc { + table: final_table.clone(), + classes: new_classes.clone(), + violations: new_violations.clone(), + fan_in: new_fan_in.clone(), + processed: new_processed.clone(), +}) +}, + None => acc.clone(), +}); +let structural_bounds = analyze_structural_bounds(func_entries.clone(), si.clone()); +Rc::new(ComplexityReport { + function_classes: result.classes.clone(), + violations: result.violations.clone(), + structural_bounds: structural_bounds, +}) +} } diff --git a/src/v2/stage0/src/v2_compiler_effect_derivation.rs b/src/v2/stage0/src/v2_compiler_effect_derivation.rs index f3f15ded398..c3249dc60df 100644 --- a/src/v2/stage0/src/v2_compiler_effect_derivation.rs +++ b/src/v2/stage0/src/v2_compiler_effect_derivation.rs @@ -1,49 +1,28 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.effect_derivation -use crate::std_effects::DeriveOpEffectResult::{ - DerivedEffect, MalformedPathInput, UnknownHttpMethodInput, -}; -use crate::std_effects::EffectShape::{ - AppendEffect, CreateEffect, DeleteEffect, ReadEffect, UpsertEffect, -}; -use crate::std_effects::IdempotencyEvidence::{IdentityEffect, LatticeEffect, NonIdempotent}; -use crate::std_effects::KeySource::{CompositeKey, InputField, PathParam}; -use crate::std_effects::ModifierAgreement::{Agrees, DerivationUnknown, Disagrees}; -pub use crate::std_effects::{ - check_modifier_vs_derivation, compose_effects, derive_effect_shape, derive_op_effect, - generate_idempotency_obligations, is_idempotent_effect, parse_http_method, ComposedEffect, - DeriveOpEffectResult, DerivedOpEffect, EffectShape, IdempotencyEvidence, - IdempotencyTestObligation, KeySource, ModifierAgreement, ModifierCheck, OperationEffect, - WorkflowEffectConcern, -}; -use crate::std_http_path::PathTemplateParseResult::{MalformedPathTemplate, ParsedPathTemplate}; -use crate::std_http_path::UrlPathToken::{LiteralToken, ParamToken}; -pub use crate::std_http_path::{ - has_path_params, last_path_param, parse_path_template, PathTemplate, PathTemplateParseResult, - UrlPathToken, -}; -pub use crate::std_types::HttpMethod; -use crate::std_types::HttpMethod::{DELETE, GET, HEAD, OPTIONS, PATCH, POST, PUT}; -use crate::v2_rt; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::std_types::{HttpMethod}; +use crate::std_types::HttpMethod::{GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS}; +pub use crate::std_effects::{EffectShape, KeySource, DerivedOpEffect, DeriveOpEffectResult, ModifierAgreement, ModifierCheck, IdempotencyTestObligation, WorkflowEffectConcern, parse_http_method, derive_effect_shape, derive_op_effect, check_modifier_vs_derivation, generate_idempotency_obligations, is_idempotent_effect, compose_effects, OperationEffect, ComposedEffect, IdempotencyEvidence}; +use crate::std_effects::EffectShape::{ReadEffect, UpsertEffect, DeleteEffect, CreateEffect, AppendEffect}; +use crate::std_effects::KeySource::{PathParam, InputField, CompositeKey}; +use crate::std_effects::DeriveOpEffectResult::{DerivedEffect, UnknownHttpMethodInput, MalformedPathInput}; +use crate::std_effects::ModifierAgreement::{Agrees, Disagrees, DerivationUnknown}; +use crate::std_effects::IdempotencyEvidence::{LatticeEffect, IdentityEffect, NonIdempotent}; +pub use crate::std_http_path::{UrlPathToken, PathTemplate, PathTemplateParseResult, parse_path_template, has_path_params, last_path_param}; +use crate::std_http_path::UrlPathToken::{LiteralToken, ParamToken}; +use crate::std_http_path::PathTemplateParseResult::{ParsedPathTemplate, MalformedPathTemplate}; -pub fn re_export_derive_op_effect( - operation_name: String, - method_str: String, - path_str: String, -) -> Rc { +pub fn re_export_derive_op_effect(operation_name: String, method_str: String, path_str: String) -> Rc { derive_op_effect(operation_name, &method_str, path_str) } -pub fn re_export_check_modifier( - op: Rc, - declared_idempotent: bool, - declared_readonly: bool, -) -> Rc { +pub fn re_export_check_modifier(op: Rc, declared_idempotent: bool, declared_readonly: bool) -> Rc { check_modifier_vs_derivation(&op, &declared_idempotent, &declared_readonly) } diff --git a/src/v2/stage0/src/v2_compiler_emit.rs b/src/v2/stage0/src/v2_compiler_emit.rs index 0f605521c74..bdc4c8fb8f1 100644 --- a/src/v2/stage0/src/v2_compiler_emit.rs +++ b/src/v2/stage0/src/v2_compiler_emit.rs @@ -1,99 +1,56 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.emit -use self::BackendCapability::*; -use self::ExprCategory::*; -use self::FuncBodyShape::*; -use self::TcoExprShape::*; -use crate::std_induction::SubValueRelation::SubValueUnknown; -pub use crate::std_induction::{InductiveField, SubValueRelation}; -pub use crate::std_types::{container_template_algebra, is_container_type}; -pub use crate::v2_compiler_artifact::RenderTarget; -use crate::v2_compiler_artifact::RenderTarget::{Dag, Go, Python, Rust}; -pub use crate::v2_compiler_coercion::{ - can_cast, coerce_container_template, coerce_primitive_type, literal_suffix, render_cast, - target_callable, target_optional_template, -}; -pub use crate::v2_compiler_infer::{build_params_scope, extend_scope, InferScope}; -pub use crate::v2_compiler_infer_emit_info::{EmitGraphInfo, TypeSummary}; -pub use crate::v2_compiler_infer_env::{authored_name, TypeBinding, TypeEnv}; -pub use crate::v2_compiler_infer_items::{ItemInfo, ResolvedGraph, TypedModule}; -pub use crate::v2_compiler_infer_service::{ - extract_typed_service_name, is_typed_service_call_receiver, OpEntry, UniqueAccum, -}; -pub use crate::v2_compiler_infer_sigs::{ResolvedFuncEnv, ResolvedFuncSig}; -pub use crate::v2_compiler_infer_types::{ - child_type_node, emit_map_has, for_each_element_type_node, is_unit_like, node_is_collection, - node_is_element_collection, node_is_keyed_collection, normalize_access_type_node, - resolved_type, -}; -use crate::v2_compiler_languages::IfValueForm::{ConditionalTernary, IfExpression, IfStatement}; -use crate::v2_compiler_languages::ImportTrigger::{ - AsyncUsageTrigger, ContainerUsageTrigger, DeriveMacroTrigger, TraitImplTrigger, - TypeUsageTrigger, -}; -use crate::v2_compiler_languages::InterpStyle::{FormatArgs, InlineExpr}; -use crate::v2_compiler_languages::NamingCase::{AsAuthored, CamelCase, PascalCase, SnakeCase}; -use crate::v2_compiler_languages::ReservedWordStrategy::{NoEscape, PrefixEscape, SuffixEscape}; -use crate::v2_compiler_languages::TestNameStyle::{PascalCaseTestNames, SnakeCaseTestNames}; -use crate::v2_compiler_languages::VisibilitySpec::{CaseVisibility, KeywordVisibility}; -pub use crate::v2_compiler_languages::{ - binop_symbol, is_string_like, language_spec_for_target, service_method_depth, - service_methods_inside_class, service_receiver_str, service_return_str, service_self_param, - target_keyword, test_conventions_for_target, wrap_shared_type, BlockSyntax, EscapePair, - ExpressionSemantics, IfValueForm, ImportRule, ImportTrigger, InterpStyle, LanguageSpec, - NamingCase, RecordLitSyntax, ReservedWordStrategy, ServiceFieldTemplates, StringInterpSyntax, - TcoSyntax, TestConventions, TestNameStyle, VariantPatternSyntax, VisibilitySpec, -}; +use std::collections::HashMap; +use std::rc::Rc; use crate::v2_rt; -use crate::v2_std_core::AlgebraFieldKind::*; -use crate::v2_std_core::BinOp::NullCoalesce; -use crate::v2_std_core::Cardinality::CardOptional; -use crate::v2_std_core::Connective::{Arrow, Conj, Disj, NoConnective}; -use crate::v2_std_core::ExprData::{ - ExprBinOp, ExprBlock, ExprCall, ExprCast, ExprError, ExprFieldAccess, ExprForEach, ExprIf, - ExprIndex, ExprLambda, ExprLet, ExprListLit, ExprLiteral, ExprMatch, ExprMethodCall, - ExprRecordLit, ExprReturn, ExprSlice, ExprStringInterp, ExprUnaryOp, ExprVar, NoExprData, -}; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::v2_std_core::{Node, ErrorNode, InferredNode, is_compiler_error, module_imports, module_items, param_node_name_at, param_node_type_expr, param_node_default_value, NewlineIndex, authored_name_at, empty_intern_table, expr_var_name_at, expr_call_func_at, let_binding_name_at, field_access_field_at, ExprData, VarBindingKind, StringPart, LiteralValue, TextFile, SourceSpan, BinOp, UnaryOpKind, AlgebraFieldKind, DeclaredFuncSig, MethodSemantics, MatchPattern, field_binding_name_at, field_binding_pattern, FieldSummary, expr_method_name_at, method_arg_nodes, expr_method_call_semantics, expr_field_access_summary, lambda_param_names_at, record_lit_type_name_at, arm_body, arm_pattern, arm_guard, arg_name_at, arg_value, field_init_node_name_at, field_init_node_value, if_condition, if_then_branch, if_else_branch, match_scrutinee, match_arm_nodes, let_value, let_body, field_access_base, method_receiver, lambda_body, cast_expr, cast_target, return_value, binop_left, binop_right, foreach_variable_at, foreach_collection, foreach_body, index_base, index_expr, slice_base, slice_start, slice_end, unaryop_operand, expr_has_self_call, expr_has_non_tail_self_call, local_transport_node, is_rest_transport, is_shell_transport, is_file_transport, is_local_transport, transport_has_auth, field_init_operation_modifier, operation_modifier_name, with_required_cardinality, tuple_type_name, find_child_named, Connective, FieldAccessStyle, Cardinality}; +use crate::v2_std_core::InferredNode::{Resolved, CompilerError, TypeVariable}; +use crate::v2_std_core::ExprData::{NoExprData, ExprLiteral, ExprVar, ExprFieldAccess, ExprCall, ExprMethodCall, ExprMatch, ExprIf, ExprLet, ExprRecordLit, ExprListLit, ExprBinOp, ExprUnaryOp, ExprLambda, ExprStringInterp, ExprBlock, ExprCast, ExprForEach, ExprIndex, ExprSlice, ExprError, ExprReturn}; +use crate::v2_std_core::StringPart::{Text, Interpolation}; +use crate::v2_std_core::BinOp::{NullCoalesce}; +use crate::v2_std_core::MethodSemantics::{PlainMethodSemantics, AlgebraMethodSemantics, ServiceMethodSemantics}; +use crate::v2_std_core::MatchPattern::{Wildcard, Bind, LitPattern, VariantPattern}; use crate::v2_std_core::FieldAccessStyle::{TupleFirst, TupleSecond}; -use crate::v2_std_core::InferredNode::{CompilerError, Resolved, TypeVariable}; +use crate::v2_std_core::Connective::{Conj, Disj, NoConnective, Arrow}; +use crate::v2_std_core::Cardinality::{CardOptional}; +use crate::v2_std_core::VarBindingKind::*; use crate::v2_std_core::LiteralValue::*; -use crate::v2_std_core::MatchPattern::{Bind, LitPattern, VariantPattern, Wildcard}; -use crate::v2_std_core::MethodSemantics::{ - AlgebraMethodSemantics, PlainMethodSemantics, ServiceMethodSemantics, -}; -use crate::v2_std_core::StringPart::{Interpolation, Text}; use crate::v2_std_core::UnaryOpKind::*; -use crate::v2_std_core::VarBindingKind::*; -pub use crate::v2_std_core::{ - arg_name_at, arg_value, arm_body, arm_guard, arm_pattern, authored_name_at, binop_left, - binop_right, cast_expr, cast_target, empty_intern_table, expr_call_func_at, - expr_field_access_summary, expr_has_non_tail_self_call, expr_has_self_call, - expr_method_call_semantics, expr_method_name_at, expr_var_name_at, field_access_base, - field_access_field_at, field_binding_name_at, field_binding_pattern, field_init_node_name_at, - field_init_node_value, field_init_operation_modifier, find_child_named, foreach_body, - foreach_collection, foreach_variable_at, if_condition, if_else_branch, if_then_branch, - index_base, index_expr, is_compiler_error, is_file_transport, is_local_transport, - is_rest_transport, is_shell_transport, lambda_body, lambda_param_names_at, let_binding_name_at, - let_body, let_value, local_transport_node, match_arm_nodes, match_scrutinee, method_arg_nodes, - method_receiver, module_imports, module_items, operation_modifier_name, - param_node_default_value, param_node_name_at, param_node_type_expr, record_lit_type_name_at, - return_value, slice_base, slice_end, slice_start, transport_has_auth, tuple_type_name, - unaryop_operand, with_required_cardinality, AlgebraFieldKind, BinOp, Cardinality, Connective, - DeclaredFuncSig, ErrorNode, ExprData, FieldAccessStyle, FieldSummary, InferredNode, - LiteralValue, MatchPattern, MethodSemantics, NewlineIndex, Node, SourceSpan, StringPart, - TextFile, UnaryOpKind, VarBindingKind, -}; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; -use std::collections::HashMap; -use std::rc::Rc; +use crate::v2_std_core::AlgebraFieldKind::*; +pub use crate::v2_compiler_infer_env::{TypeEnv, TypeBinding, authored_name}; +pub use crate::std_induction::{InductiveField, SubValueRelation}; +use crate::std_induction::SubValueRelation::{SubValueUnknown}; +pub use crate::v2_compiler_infer_types::{resolved_type, child_type_node, emit_map_has, node_is_collection, node_is_keyed_collection, node_is_element_collection, normalize_access_type_node, for_each_element_type_node, is_unit_like}; +pub use crate::std_types::{is_container_type, container_template_algebra}; +pub use crate::v2_compiler_coercion::{coerce_primitive_type, coerce_container_template, target_optional_template, target_callable, can_cast, render_cast, literal_suffix}; +pub use crate::v2_compiler_infer_sigs::{ResolvedFuncSig, ResolvedFuncEnv}; +pub use crate::v2_compiler_infer_items::{TypedModule, ResolvedGraph, ItemInfo}; +pub use crate::v2_compiler_infer_service::{UniqueAccum, OpEntry, is_typed_service_call_receiver, extract_typed_service_name}; +pub use crate::v2_compiler_infer::{InferScope, build_params_scope, extend_scope}; +pub use crate::v2_compiler_infer_emit_info::{TypeSummary, EmitGraphInfo}; +pub use crate::v2_compiler_artifact::{RenderTarget}; +use crate::v2_compiler_artifact::RenderTarget::{Rust, Python, Go, Dag}; +pub use crate::v2_compiler_languages::{LanguageSpec, TestConventions, ServiceFieldTemplates, BlockSyntax, TcoSyntax, ExpressionSemantics, VariantPatternSyntax, IfValueForm, VisibilitySpec, NamingCase, ReservedWordStrategy, StringInterpSyntax, InterpStyle, EscapePair, RecordLitSyntax, ImportRule, language_spec_for_target, is_string_like, test_conventions_for_target, target_keyword, binop_symbol, wrap_shared_type, service_self_param, service_receiver_str, service_method_depth, service_methods_inside_class, service_return_str, TestNameStyle, ImportTrigger}; +use crate::v2_compiler_languages::TestNameStyle::{SnakeCaseTestNames, PascalCaseTestNames}; +use crate::v2_compiler_languages::IfValueForm::{IfExpression, ConditionalTernary, IfStatement}; +use crate::v2_compiler_languages::VisibilitySpec::{KeywordVisibility, CaseVisibility}; +use crate::v2_compiler_languages::NamingCase::{PascalCase, SnakeCase, CamelCase, AsAuthored}; +use crate::v2_compiler_languages::ReservedWordStrategy::{PrefixEscape, SuffixEscape, NoEscape}; +use crate::v2_compiler_languages::InterpStyle::{FormatArgs, InlineExpr}; +use crate::v2_compiler_languages::ImportTrigger::{TypeUsageTrigger, TraitImplTrigger, DeriveMacroTrigger, ContainerUsageTrigger, AsyncUsageTrigger}; +use self::BackendCapability::*; +use self::ExprCategory::*; +use self::FuncBodyShape::*; +use self::TcoExprShape::*; pub fn is_type_variable(inferred: Rc) -> bool { match (*inferred).clone() { - InferredNode::TypeVariable { .. } => true, - _ => false, - } + InferredNode::TypeVariable { .. } => true, + _ => false, +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -158,210 +115,46 @@ pub fn has_mock_prefix(name: &String) -> bool { } pub fn extract_test_projections(typed: Rc) -> Rc>> { - Rc::new({ - let mut __result = Vec::new(); - for tm in typed.modules.clone().iter().cloned() { - __result.extend( - (*Rc::new({ - let mut __result = Vec::new(); - for item in Rc::new({ - let mut __result = Vec::new(); - for item in tm.items.clone().iter().cloned() { - if is_service_item(&item) { - __result.push(item); - } - } - __result - }) - .iter() - .cloned() - { - __result.extend( - (*Rc::new({ - let mut __result = Vec::new(); - for c in Rc::new({ - let mut __result = Vec::new(); - for c in item.children.clone().iter().cloned() { - if { - let mut __found = false; - for p in c.properties.clone().iter().cloned() { - if has_mock_prefix(&field_init_node_name_at( - p.clone(), - tm.type_env.clone().source_indices.clone(), - )) { - __found = true; - break; - } - } - __found - } { - __result.push(c); - } - } - __result - }) - .iter() - .cloned() - { - __result.push(Rc::new(TestProjection { - module_name: authored_name_at( - tm.type_env.clone().source_indices.clone(), - &tm.module.clone(), - ), - service_name: authored_name_at( - tm.type_env.clone().source_indices.clone(), - &item, - ), - operation_name: authored_name_at( - tm.type_env.clone().source_indices.clone(), - &c, - ), - inferred: resolved_type(c.clone()), - params: c.params.clone(), - mock_field_inits: Rc::new({ - let mut __result = Vec::new(); - for p in c.properties.clone().iter().cloned() { - if has_mock_prefix(&field_init_node_name_at( - p.clone(), - tm.type_env.clone().source_indices.clone(), - )) { - __result.push(p); - } - } - __result - }), - source_indices: tm.type_env.clone().source_indices.clone(), - })); - } - __result - })) - .iter() - .cloned(), - ); - } - __result - })) - .iter() - .cloned(), - ); - } - __result - }) + Rc::new({ let mut __result = Vec::new(); for tm in typed.modules.clone().iter().cloned() { __result.extend((*Rc::new({ let mut __result = Vec::new(); for item in Rc::new({ let mut __result = Vec::new(); for item in tm.items.clone().iter().cloned() { if is_service_item(&item) { __result.push(item); } } __result }).iter().cloned() { __result.extend((*Rc::new({ let mut __result = Vec::new(); for c in Rc::new({ let mut __result = Vec::new(); for c in item.children.clone().iter().cloned() { if { let mut __found = false; for p in c.properties.clone().iter().cloned() { if has_mock_prefix(&field_init_node_name_at(p.clone(), tm.type_env.clone().source_indices.clone())) { __found = true; break; } } __found } { __result.push(c); } } __result }).iter().cloned() { __result.push(Rc::new(TestProjection { + module_name: authored_name_at(tm.type_env.clone().source_indices.clone(), &tm.module.clone()), + service_name: authored_name_at(tm.type_env.clone().source_indices.clone(), &item), + operation_name: authored_name_at(tm.type_env.clone().source_indices.clone(), &c), + inferred: resolved_type(c.clone()), + params: c.params.clone(), + mock_field_inits: Rc::new({ let mut __result = Vec::new(); for p in c.properties.clone().iter().cloned() { if has_mock_prefix(&field_init_node_name_at(p.clone(), tm.type_env.clone().source_indices.clone())) { __result.push(p); } } __result }), + source_indices: tm.type_env.clone().source_indices.clone(), +})); } __result })).iter().cloned()); } __result })).iter().cloned()); } __result }) } -pub fn derive_module_imports( - items: &Rc>>, - import_rules: Rc>>, - target: RenderTarget, - source_indices: Rc>>, -) -> Rc> { +pub fn derive_module_imports(items: &Rc>>, import_rules: Rc>>, target: RenderTarget, source_indices: Rc>>) -> Rc> { { - let has_async = { - let mut __found = false; - for item in items.clone().iter().cloned() { - if ((item.uses.clone().len() as i64) > 0) { - __found = true; - break; - } - } - __found - }; - let type_names = collect_type_names_from_items(items.clone(), source_indices); - Rc::new({ - let mut __result = Vec::new(); - for path in Rc::new({ - let mut __result = Vec::new(); - for rule in Rc::new({ - let mut __result = Vec::new(); - for rule in import_rules.iter().cloned() { - if match (*rule.trigger.clone()).clone() { - ImportTrigger::TypeUsageTrigger { type_name: t, .. } => { - let mut __found = false; - for n in type_names.clone().iter().cloned() { - if (n.clone().as_str() == t.clone().as_str()) { - __found = true; - break; - } - } - __found - } - ImportTrigger::TraitImplTrigger { .. } => false, - ImportTrigger::DeriveMacroTrigger { .. } => false, - ImportTrigger::ContainerUsageTrigger { container: c, .. } => { - let mut __found = false; - for n in type_names.clone().iter().cloned() { - if (n.clone().as_str() == c.clone().as_str()) { - __found = true; - break; - } - } - __found - } - ImportTrigger::AsyncUsageTrigger => has_async.clone(), - } { - __result.push(rule); - } - } - __result - }) - .iter() - .cloned() - { - __result.push(rule.import_path.clone()); - } - __result - }) - .iter() - .cloned() - { - if (path.clone().as_str() != "".to_string().as_str()) { - __result.push(path); - } - } - __result - }) - } + let has_async = { let mut __found = false; for item in items.clone().iter().cloned() { if ((item.uses.clone().len() as i64) > 0) { __found = true; break; } } __found }; +let type_names = collect_type_names_from_items(items.clone(), source_indices); +Rc::new({ let mut __result = Vec::new(); for path in Rc::new({ let mut __result = Vec::new(); for rule in Rc::new({ let mut __result = Vec::new(); for rule in import_rules.iter().cloned() { if match (*rule.trigger.clone()).clone() { + ImportTrigger::TypeUsageTrigger { type_name: t, .. } => { let mut __found = false; for n in type_names.clone().iter().cloned() { if (n.clone().as_str() == t.clone().as_str()) { __found = true; break; } } __found }, + ImportTrigger::TraitImplTrigger { .. } => false, + ImportTrigger::DeriveMacroTrigger { .. } => false, + ImportTrigger::ContainerUsageTrigger { container: c, .. } => { let mut __found = false; for n in type_names.clone().iter().cloned() { if (n.clone().as_str() == c.clone().as_str()) { __found = true; break; } } __found }, + ImportTrigger::AsyncUsageTrigger => has_async.clone(), +} { __result.push(rule); } } __result }).iter().cloned() { __result.push(rule.import_path.clone()); } __result }).iter().cloned() { if (path.clone().as_str() != "".to_string().as_str()) { __result.push(path); } } __result }) +} } -pub fn collect_type_names_from_items( - items: Rc>>, - source_indices: Rc>>, -) -> Rc> { - Rc::new({ - let mut __result = Vec::new(); - for item in items.iter().cloned() { - __result.extend( - (*collect_type_names_from_node(&item, &source_indices)) - .iter() - .cloned(), - ); - } - __result - }) +pub fn collect_type_names_from_items(items: Rc>>, source_indices: Rc>>) -> Rc> { + Rc::new({ let mut __result = Vec::new(); for item in items.iter().cloned() { __result.extend((*collect_type_names_from_node(&item, &source_indices)).iter().cloned()); } __result }) } -pub fn collect_type_names_from_node( - n: &Rc, - source_indices: &Rc>>, -) -> Rc> { +pub fn collect_type_names_from_node(n: &Rc, source_indices: &Rc>>) -> Rc> { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - let self_name = if (n.ident_span.clone() != None) { - Rc::new(vec![authored_name_at(source_indices.clone(), &n)]) - } else { - Rc::new(vec![]) - }; - let child_names = Rc::new({ - let mut __result = Vec::new(); - for child in n.children.clone().iter().cloned() { - __result.extend( - (*collect_type_names_from_node(&child, &source_indices)) - .iter() - .cloned(), - ); - } - __result - }); - v2_rt::concat(self_name, child_names) + { + let self_name = if (n.ident_span.clone() != None) { + Rc::new(vec![authored_name_at(source_indices.clone(), &n)]) + } else { + Rc::new(vec![]) + }; +let child_names = Rc::new({ let mut __result = Vec::new(); for child in n.children.clone().iter().cloned() { __result.extend((*collect_type_names_from_node(&child, &source_indices)).iter().cloned()); } __result }); +v2_rt::concat(self_name, child_names) +} }) } @@ -371,650 +164,345 @@ pub struct InterpPart { pub arg_expr: String, } -pub fn emit_simple_expr( - expr: &Rc, - target: &RenderTarget, - source_indices: &Rc>>, -) -> String { +pub fn emit_simple_expr(expr: &Rc, target: &RenderTarget, source_indices: &Rc>>) -> String { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*expr.expr_data.clone()).clone() { - ExprData::ExprLiteral { value: v, .. } => emit_literal(v.clone(), &target), - ExprData::ExprError { message, .. } => emit_error_expr(message.clone(), target.clone()), - ExprData::ExprVar { .. } => emit_ident( - expr_var_name_at(expr.clone(), source_indices.clone()), - target.clone(), - ), - ExprData::ExprFieldAccess { .. } => { - let f = field_access_field_at(expr.clone(), source_indices.clone()); - let b = field_access_base(expr.clone()); - if is_typed_service_call_receiver(&expr, source_indices.clone()) { - match extract_typed_service_name(&expr, &source_indices) { - Some(svc_name) => service_var_name(svc_name.clone()), - None => v2_rt::concat( - v2_rt::concat( - emit_simple_expr(&b, &target, &source_indices), - ".".to_string(), - ), - emit_ident(f.clone(), target.clone()), - ), - } - } else { - { - let base_is_fn = match (*b.expr_data.clone()).clone() { - ExprData::ExprVar { - binding_kind: bk, .. - } => match bk.clone().as_deref().cloned() { - Some(VarBindingKind::MatchBoundBinding) => false, - Some(VarBindingKind::VariantValueBinding { .. }) => false, - _ => true, - }, - _ => false, - }; - let base_str = emit_simple_expr(&b, &target, &source_indices); - let base_call = if base_is_fn.clone() { - v2_rt::concat(base_str, "()".to_string()) - } else { - base_str - }; - let field_str = v2_rt::concat( - v2_rt::concat(base_call, ".".to_string()), - emit_ident(f.clone(), target.clone()), - ); - let needs_clone = (base_is_fn.clone() - && match target.clone() { - RenderTarget::Rust => true, - _ => false, - }); - if needs_clone { - v2_rt::concat(field_str, ".clone()".to_string()) - } else { - field_str - } - } - } - } - ExprData::ExprStringInterp => { - let ps = Rc::new({ - let mut __result = Vec::new(); - for child in expr.children.clone().iter().cloned() { - __result.push(match (*child.expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { - let LiteralValue::LitStr { value: text, .. } = value.as_ref() - else { - unreachable!() - }; - Rc::new(StringPart::Text { - value: text.clone(), - }) - } - _ => Rc::new(StringPart::Interpolation { - expr: arg_value(&child), - }), - }); + ExprData::ExprLiteral { value: v, .. } => emit_literal(v.clone(), &target), + ExprData::ExprError { message, .. } => emit_error_expr(message.clone(), target.clone()), + ExprData::ExprVar { .. } => emit_ident(expr_var_name_at(expr.clone(), source_indices.clone()), target.clone()), + ExprData::ExprFieldAccess { .. } => { + let f = field_access_field_at(expr.clone(), source_indices.clone()); +let b = field_access_base(expr.clone()); +if is_typed_service_call_receiver(&expr, source_indices.clone()) { + match extract_typed_service_name(&expr, &source_indices) { + Some(svc_name) => service_var_name(svc_name.clone()), + None => v2_rt::concat(v2_rt::concat(emit_simple_expr(&b, &target, &source_indices), ".".to_string()), emit_ident(f.clone(), target.clone())), +} + } else { + { + let base_is_fn = match (*b.expr_data.clone()).clone() { + ExprData::ExprVar { binding_kind: bk, .. } => match bk.clone().as_deref().cloned() { + Some(VarBindingKind::MatchBoundBinding) => false, + Some(VarBindingKind::VariantValueBinding { .. }) => false, + _ => true, +}, + _ => false, +}; +let base_str = emit_simple_expr(&b, &target, &source_indices); +let base_call = if base_is_fn.clone() { + v2_rt::concat(base_str, "()".to_string()) + } else { + base_str + }; +let field_str = v2_rt::concat(v2_rt::concat(base_call, ".".to_string()), emit_ident(f.clone(), target.clone())); +let needs_clone = (base_is_fn.clone() && match target.clone() { + RenderTarget::Rust => true, + _ => false, +}); +if needs_clone { + v2_rt::concat(field_str, ".clone()".to_string()) + } else { + field_str } - __result - }); - emit_simple_string_interp(&ps, &target, source_indices.clone()) +} } - ExprData::ExprListLit => match target.clone() { - RenderTarget::Go => emit_error_expr( - "list literal in simple expr not yet supported for Go".to_string(), - target.clone(), - ), - _ => { - let el_strs = Rc::new({ - let mut __result = Vec::new(); - for e in expr.children.clone().iter().cloned() { - __result.push(emit_simple_expr(&e, &target, &source_indices)); - } - __result - }); - v2_rt::concat( - v2_rt::concat("[".to_string(), el_strs.join(&", ".to_string())), - "]".to_string(), - ) - } - }, - ExprData::ExprRecordLit { .. } => match target.clone() { - RenderTarget::Go => emit_error_expr( - "record literal in simple expr not yet supported for Go".to_string(), - target.clone(), - ), - _ => { - let field_strs = Rc::new({ - let mut __result = Vec::new(); - for f in expr.children.clone().iter().cloned() { - __result.push(v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "\"".to_string(), - field_init_node_name_at(f.clone(), source_indices.clone()), - ), - "\": ".to_string(), - ), - emit_simple_expr( - &field_init_node_value(&f), - &target, - &source_indices, - ), - )); - } - __result - }); - v2_rt::concat( - v2_rt::concat("{".to_string(), field_strs.join(&", ".to_string())), - "}".to_string(), - ) - } - }, - _ => emit_error_expr( - "unsupported simple expr in test/mock binding".to_string(), - target.clone(), - ), - } +}, + ExprData::ExprStringInterp => { + let ps = Rc::new({ let mut __result = Vec::new(); for child in expr.children.clone().iter().cloned() { __result.push(match (*child.expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitStr { value: text, .. } = value.as_ref() else { unreachable!() }; Rc::new(StringPart::Text { + value: text.clone(), +}) }, + _ => Rc::new(StringPart::Interpolation { + expr: arg_value(&child), +}), +}); } __result }); +emit_simple_string_interp(&ps, &target, source_indices.clone()) +}, + ExprData::ExprListLit => match target.clone() { + RenderTarget::Go => emit_error_expr("list literal in simple expr not yet supported for Go".to_string(), target.clone()), + _ => { + let el_strs = Rc::new({ let mut __result = Vec::new(); for e in expr.children.clone().iter().cloned() { __result.push(emit_simple_expr(&e, &target, &source_indices)); } __result }); +v2_rt::concat(v2_rt::concat("[".to_string(), el_strs.join(&", ".to_string())), "]".to_string()) +}, +}, + ExprData::ExprRecordLit { .. } => match target.clone() { + RenderTarget::Go => emit_error_expr("record literal in simple expr not yet supported for Go".to_string(), target.clone()), + _ => { + let field_strs = Rc::new({ let mut __result = Vec::new(); for f in expr.children.clone().iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(v2_rt::concat("\"".to_string(), field_init_node_name_at(f.clone(), source_indices.clone())), "\": ".to_string()), emit_simple_expr(&field_init_node_value(&f), &target, &source_indices))); } __result }); +v2_rt::concat(v2_rt::concat("{".to_string(), field_strs.join(&", ".to_string())), "}".to_string()) +}, +}, + _ => emit_error_expr("unsupported simple expr in test/mock binding".to_string(), target.clone()), +} }) } -pub fn emit_simple_string_interp( - parts: &Rc>>, - target: &RenderTarget, - source_indices: Rc>>, -) -> String { +pub fn emit_simple_string_interp(parts: &Rc>>, target: &RenderTarget, source_indices: Rc>>) -> String { { let spec = language_spec(target.clone()); - let interp = spec.string_interp.clone(); - let has_interpolations = { - let mut __found = false; - for p in parts.clone().iter().cloned() { - if match (*p.clone()).clone() { - StringPart::Interpolation { .. } => true, - _ => false, - } { - __found = true; - break; - } +let interp = spec.string_interp.clone(); +let has_interpolations = { let mut __found = false; for p in parts.clone().iter().cloned() { if match (*p.clone()).clone() { + StringPart::Interpolation { .. } => true, + _ => false, +} { __found = true; break; } } __found }; +match (*interp.style.clone()).clone() { + InterpStyle::FormatArgs { placeholder: ph, .. } => { + let fmt_parts = Rc::new({ let mut __result = Vec::new(); for p in parts.clone().iter().cloned() { __result.push(match (*p.clone()).clone() { + StringPart::Text { value: v, .. } => { + let base = escape_string_literal_body(v.clone()); +let escaped = if has_interpolations.clone() { + apply_escape_pairs(base.clone(), interp.escape_pairs.clone()) + } else { + base.clone() + }; +Rc::new(InterpPart { + format_segment: escaped.clone(), + arg_expr: "".to_string(), +}) +}, + StringPart::Interpolation { expr: e, .. } => Rc::new(InterpPart { + format_segment: ph.clone(), + arg_expr: emit_simple_expr(&e, &target, &source_indices), +}), +}); } __result }); +let fmt_str = Rc::new({ let mut __result = Vec::new(); for p in fmt_parts.clone().iter().cloned() { __result.push(p.format_segment.clone()); } __result }).join(&"".to_string()); +let args = Rc::new({ let mut __result = Vec::new(); for a in Rc::new({ let mut __result = Vec::new(); for p in fmt_parts.clone().iter().cloned() { __result.push(p.arg_expr.clone()); } __result }).iter().cloned() { if (a.clone().as_str() != "".to_string().as_str()) { __result.push(a); } } __result }); +if ((args.clone().len() as i64) == 0) { + apply_type_template1(interp.plain_template.clone(), fmt_str) + } else { + { + let args_str = args.clone().join(&", ".to_string()); +apply_type_template2(interp.format_template.clone(), fmt_str, args_str) +} } - __found - }; - match (*interp.style.clone()).clone() { - InterpStyle::FormatArgs { - placeholder: ph, .. - } => { - let fmt_parts = Rc::new({ - let mut __result = Vec::new(); - for p in parts.clone().iter().cloned() { - __result.push(match (*p.clone()).clone() { - StringPart::Text { value: v, .. } => { - let base = escape_string_literal_body(v.clone()); - let escaped = if has_interpolations.clone() { - apply_escape_pairs(base.clone(), interp.escape_pairs.clone()) - } else { - base.clone() - }; - Rc::new(InterpPart { - format_segment: escaped.clone(), - arg_expr: "".to_string(), - }) - } - StringPart::Interpolation { expr: e, .. } => Rc::new(InterpPart { - format_segment: ph.clone(), - arg_expr: emit_simple_expr(&e, &target, &source_indices), - }), - }); - } - __result - }); - let fmt_str = Rc::new({ - let mut __result = Vec::new(); - for p in fmt_parts.clone().iter().cloned() { - __result.push(p.format_segment.clone()); - } - __result - }) - .join(&"".to_string()); - let args = Rc::new({ - let mut __result = Vec::new(); - for a in Rc::new({ - let mut __result = Vec::new(); - for p in fmt_parts.clone().iter().cloned() { - __result.push(p.arg_expr.clone()); - } - __result - }) - .iter() - .cloned() - { - if (a.clone().as_str() != "".to_string().as_str()) { - __result.push(a); - } - } - __result - }); - if ((args.clone().len() as i64) == 0) { - apply_type_template1(interp.plain_template.clone(), fmt_str) +}, + InterpStyle::InlineExpr => { + let segments = Rc::new({ let mut __result = Vec::new(); for p in parts.clone().iter().cloned() { __result.push(match (*p.clone()).clone() { + StringPart::Text { value: v, .. } => { + let base = escape_string_literal_body(v.clone()); +if has_interpolations.clone() { + apply_escape_pairs(base.clone(), interp.escape_pairs.clone()) } else { - { - let args_str = args.clone().join(&", ".to_string()); - apply_type_template2(interp.format_template.clone(), fmt_str, args_str) - } + base.clone() } - } - InterpStyle::InlineExpr => { - let segments = Rc::new({ - let mut __result = Vec::new(); - for p in parts.clone().iter().cloned() { - __result.push(match (*p.clone()).clone() { - StringPart::Text { value: v, .. } => { - let base = escape_string_literal_body(v.clone()); - if has_interpolations.clone() { - apply_escape_pairs(base.clone(), interp.escape_pairs.clone()) - } else { - base.clone() - } - } - StringPart::Interpolation { expr: e, .. } => v2_rt::concat( - v2_rt::concat( - "{".to_string(), - emit_simple_expr(&e, &target, &source_indices), - ), - "}".to_string(), - ), - }); - } - __result - }); - apply_type_template1( - interp.format_template.clone(), - segments.join(&"".to_string()), - ) - } - } - } +}, + StringPart::Interpolation { expr: e, .. } => v2_rt::concat(v2_rt::concat("{".to_string(), emit_simple_expr(&e, &target, &source_indices)), "}".to_string()), +}); } __result }); +apply_type_template1(interp.format_template.clone(), segments.join(&"".to_string())) +}, +} +} } pub fn empty_emit_scope() -> Rc { Rc::new(InferScope { - type_env: Rc::new(TypeEnv { - bindings: v2_rt::rc_empty_map::>(), - recursive_types: Rc::new(vec![]), - recursive_type_set: v2_rt::rc_empty_map::(), - inductive_fields: v2_rt::rc_empty_map::>>>(), - source_indices: v2_rt::rc_empty_map::>(), - intern_table: empty_intern_table(), - }), - func_env: Rc::new(ResolvedFuncEnv { - signatures: v2_rt::rc_empty_map::>(), - }), - locals: v2_rt::rc_empty_map::>(), - match_bound_names: v2_rt::rc_empty_map::(), - module_name: "".to_string(), - service_registry: v2_rt::rc_empty_map::>>>(), - item_registry: v2_rt::rc_empty_map::>(), - lambda_param_provenance: v2_rt::rc_empty_map::>(), - }) + type_env: Rc::new(TypeEnv { + bindings: v2_rt::rc_empty_map::>(), + recursive_types: Rc::new(vec![]), + recursive_type_set: v2_rt::rc_empty_map::(), + inductive_fields: v2_rt::rc_empty_map::>>>(), + source_indices: v2_rt::rc_empty_map::>(), + intern_table: empty_intern_table(), +}), + func_env: Rc::new(ResolvedFuncEnv { + signatures: v2_rt::rc_empty_map::>(), +}), + locals: v2_rt::rc_empty_map::>(), + match_bound_names: v2_rt::rc_empty_map::(), + module_name: "".to_string(), + service_registry: v2_rt::rc_empty_map::>>>(), + item_registry: v2_rt::rc_empty_map::>(), + lambda_param_provenance: v2_rt::rc_empty_map::>(), +}) } pub fn module_emit_scope(typed_module: &Rc) -> Rc { Rc::new(InferScope { - type_env: typed_module.type_env.clone(), - func_env: typed_module.func_env.clone(), - locals: v2_rt::rc_empty_map::>(), - match_bound_names: v2_rt::rc_empty_map::(), - module_name: authored_name_at( - typed_module.type_env.clone().source_indices.clone(), - &typed_module.module.clone(), - ), - service_registry: v2_rt::rc_empty_map::>>>(), - item_registry: typed_module.item_registry.clone(), - lambda_param_provenance: v2_rt::rc_empty_map::>(), - }) + type_env: typed_module.type_env.clone(), + func_env: typed_module.func_env.clone(), + locals: v2_rt::rc_empty_map::>(), + match_bound_names: v2_rt::rc_empty_map::(), + module_name: authored_name_at(typed_module.type_env.clone().source_indices.clone(), &typed_module.module.clone()), + service_registry: v2_rt::rc_empty_map::>>>(), + item_registry: typed_module.item_registry.clone(), + lambda_param_provenance: v2_rt::rc_empty_map::>(), +}) } pub fn scope_after_expr(texpr: &Rc, scope: &Rc) -> Rc { match (*texpr.expr_data.clone()).clone() { - ExprData::ExprLet => { - let ch = texpr.children.clone(); - let has_body = ((ch.len() as i64) > 1); - if (has_body == false) { - { - let value = let_value(texpr.clone()); - extend_scope( - &scope, - &let_binding_name_at( - texpr.clone(), - scope.type_env.clone().source_indices.clone(), - ), - resolved_type(value), - Rc::new(SubValueRelation::SubValueUnknown), - ) - } - } else { - scope.clone() - } + ExprData::ExprLet => { + let ch = texpr.children.clone(); +let has_body = ((ch.len() as i64) > 1); +if (has_body == false) { + { + let value = let_value(texpr.clone()); +extend_scope(&scope, &let_binding_name_at(texpr.clone(), scope.type_env.clone().source_indices.clone()), resolved_type(value), Rc::new(SubValueRelation::SubValueUnknown)) +} + } else { + scope.clone() } - _ => scope.clone(), - } +}, + _ => scope.clone(), +} } -pub fn lookup_item( - registry: Rc>>, - name: String, -) -> Option> { +pub fn lookup_item(registry: Rc>>, name: String) -> Option> { v2_rt::map_get(®istry, name) } -pub fn lookup_func_sig_in_scope( - scope: Rc, - name: String, -) -> Option> { +pub fn lookup_func_sig_in_scope(scope: Rc, name: String) -> Option> { v2_rt::map_get(&scope.func_env.clone().signatures.clone(), name) } -pub fn typed_named_arg_matches( - arg: Rc, - name: String, - source_indices: Rc>>, -) -> bool { +pub fn typed_named_arg_matches(arg: Rc, name: String, source_indices: Rc>>) -> bool { { let n = arg_name_at(arg, source_indices); - if (n.clone() == None) { +if (n.clone() == None) { false } else { (n.clone().unwrap().as_str() == name.as_str()) } - } +} } -pub fn order_typed_call_args( - args: &Rc>>, - func: String, - scope: &Rc, -) -> Rc>> { +pub fn order_typed_call_args(args: &Rc>>, func: String, scope: &Rc) -> Rc>> { { - let has_unnamed = { - let mut __found = false; - for arg in args.clone().iter().cloned() { - if (arg_name_at(arg.clone(), scope.type_env.clone().source_indices.clone()) == None) - { - __found = true; - break; - } - } - __found - }; - if has_unnamed { + let has_unnamed = { let mut __found = false; for arg in args.clone().iter().cloned() { if (arg_name_at(arg.clone(), scope.type_env.clone().source_indices.clone()) == None) { __found = true; break; } } __found }; +if has_unnamed { args.clone() } else { match lookup_func_sig_in_scope(scope.clone(), func) { - None => args.clone(), - Some(sig) => { - let arg_map = args.clone().iter().cloned().fold( - v2_rt::rc_empty_map::>(), - |acc: Rc>>, arg: Rc| { - let n = arg_name_at( - arg.clone(), - scope.type_env.clone().source_indices.clone(), - ); - if (n.clone() != None) { - v2_rt::rc_map_insert(acc.clone(), n.clone().unwrap(), arg.clone()) - } else { - acc.clone() - } - }, - ); - let param_name_set = sig.params.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, param: Rc| { - v2_rt::rc_map_insert( - acc, - param_node_name_at( - param.clone(), - scope.type_env.clone().source_indices.clone(), - ), - true, - ) - }, - ); - let ordered = Rc::new({ - let mut __result = Vec::new(); - for param in sig.params.clone().iter().cloned() { - __result.extend( - (*match v2_rt::map_get( - &arg_map, - param_node_name_at( - param.clone(), - scope.type_env.clone().source_indices.clone(), - ), - ) { - Some(arg) => Rc::new(vec![arg.clone()]), - None => Rc::new(vec![]), - }) - .iter() - .cloned(), - ); - } - __result - }); - let leftovers = Rc::new({ - let mut __result = Vec::new(); - for arg in args.clone().iter().cloned() { - if { - let n = arg_name_at( - arg.clone(), - scope.type_env.clone().source_indices.clone(), - ); - if (n.clone() == None) { - true - } else { - (emit_map_has(param_name_set.clone(), n.clone().unwrap()) - == false) - } - } { - __result.push(arg); - } - } - __result - }); - v2_rt::concat(ordered, leftovers) - } - } + None => args.clone(), + Some(sig) => { + let arg_map = args.clone().iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, arg: Rc| { + let n = arg_name_at(arg.clone(), scope.type_env.clone().source_indices.clone()); +if (n.clone() != None) { + v2_rt::rc_map_insert(acc.clone(), n.clone().unwrap(), arg.clone()) + } else { + acc.clone() + } +}); +let param_name_set = sig.params.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, param: Rc| v2_rt::rc_map_insert(acc, param_node_name_at(param.clone(), scope.type_env.clone().source_indices.clone()), true)); +let ordered = Rc::new({ let mut __result = Vec::new(); for param in sig.params.clone().iter().cloned() { __result.extend((*match v2_rt::map_get(&arg_map, param_node_name_at(param.clone(), scope.type_env.clone().source_indices.clone())) { + Some(arg) => Rc::new(vec![arg.clone()]), + None => Rc::new(vec![]), +}).iter().cloned()); } __result }); +let leftovers = Rc::new({ let mut __result = Vec::new(); for arg in args.clone().iter().cloned() { if { + let n = arg_name_at(arg.clone(), scope.type_env.clone().source_indices.clone()); +if (n.clone() == None) { + true + } else { + (emit_map_has(param_name_set.clone(), n.clone().unwrap()) == false) + } +} { __result.push(arg); } } __result }); +v2_rt::concat(ordered, leftovers) +}, +} } - } +} } pub fn unique_strings(items: Rc>) -> Rc> { { - let result = items.iter().cloned().fold( + let result = items.iter().cloned().fold(Rc::new(UniqueAccum { + seen: v2_rt::rc_empty_map::(), + result: Rc::new(vec![]), +}), |acc: Rc, item: String| if emit_map_has(acc.seen.clone(), item.clone()) { + acc.clone() + } else { Rc::new(UniqueAccum { - seen: v2_rt::rc_empty_map::(), - result: Rc::new(vec![]), - }), - |acc: Rc, item: String| { - if emit_map_has(acc.seen.clone(), item.clone()) { - acc.clone() - } else { - Rc::new(UniqueAccum { - seen: v2_rt::rc_map_insert(acc.seen.clone(), item.clone(), true), - result: v2_rt::rc_list_push(acc.result.clone(), item.clone()), - }) - } - }, - ); - result.result.clone() - } + seen: v2_rt::rc_map_insert(acc.seen.clone(), item.clone(), true), + result: v2_rt::rc_list_push(acc.result.clone(), item.clone()), +}) + }); +result.result.clone() +} } -pub fn has_nested_records_node( - mut n: Rc, - mut source_indices: Rc>>, -) -> bool { +pub fn has_nested_records_node(mut n: Rc, mut source_indices: Rc>>) -> bool { loop { let is_product = (n.connective.clone() == Connective::Conj); - let is_coproduct = (n.connective.clone() == Connective::Disj); - if is_product { +let is_coproduct = (n.connective.clone() == Connective::Disj); +if is_product { break true; - } else { +} else { if is_coproduct { let is_optional = (n.return_cardinality.clone() == Cardinality::CardOptional); - if is_optional { +if is_optional { { let __tco_0 = with_required_cardinality(&n); - n = __tco_0; - continue; - } - } else { +n = __tco_0; +continue; +} +} else { break false; - } - } else { +} +} else { let is_map = node_is_keyed_collection(&n, source_indices.clone()); - if is_map { +if is_map { match n.children.clone().get(1 as usize).cloned() { - Some(val_child) => { - let __tco_0 = child_type_node(&val_child); - n = __tco_0; - continue; - } - None => { - break false; - } - } - } else { + Some(val_child) => { { + let __tco_0 = child_type_node(&val_child); +n = __tco_0; +continue; +} }, + None => { break false; }, +} +} else { if ((n.children.clone().len() as i64) == 1) { match n.children.clone().first().cloned() { - Some(el) => { - let __tco_0 = child_type_node(&el); - n = __tco_0; - continue; - } - None => { - break false; - } - } - } else { + Some(el) => { { + let __tco_0 = child_type_node(&el); +n = __tco_0; +continue; +} }, + None => { break false; }, +} +} else { break false; - } - } - } - } - } +} +} +} +} +} } -pub fn emit_data_value_json( - value: &Rc, - source_indices: Rc>>, -) -> String { +pub fn emit_data_value_json(value: &Rc, source_indices: Rc>>) -> String { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*value.expr_data.clone()).clone() { - ExprData::ExprLiteral { value: v, .. } => match (*v.clone()).clone() { - LiteralValue::LitStr { value: s, .. } => v2_rt::concat( - v2_rt::concat("\"".to_string(), escape_json_string(s.clone())), - "\"".to_string(), - ), - LiteralValue::LitInt { value: i, .. } => (i.clone()).to_string(), - LiteralValue::LitFloat { value: f, .. } => f.clone(), - LiteralValue::LitBool { value: b, .. } => { - if b.clone() { - "true".to_string() - } else { - "false".to_string() - } - } - LiteralValue::LitNull => "null".to_string(), - }, - ExprData::ExprListLit => { - let el_strs = Rc::new({ - let mut __result = Vec::new(); - for e in value.children.clone().iter().cloned() { - __result.push(emit_data_value_json(&e, source_indices.clone())); - } - __result - }); - v2_rt::concat( - v2_rt::concat("[".to_string(), el_strs.join(&", ".to_string())), - "]".to_string(), - ) - } - ExprData::ExprRecordLit { .. } => { - let field_strs = Rc::new({ - let mut __result = Vec::new(); - for f in value.children.clone().iter().cloned() { - __result.push(v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "\"".to_string(), - escape_json_string(field_init_node_name_at( - f.clone(), - source_indices.clone(), - )), - ), - "\": ".to_string(), - ), - emit_data_value_json( - &field_init_node_value(&f), - source_indices.clone(), - ), - )); - } - __result - }); - v2_rt::concat( - v2_rt::concat("{".to_string(), field_strs.join(&", ".to_string())), - "}".to_string(), - ) - } - ExprData::ExprVar { .. } => v2_rt::concat( - v2_rt::concat( - "\"".to_string(), - escape_json_string(expr_var_name_at(value.clone(), source_indices.clone())), - ), - "\"".to_string(), - ), - ExprData::ExprUnaryOp { - op: UnaryOpKind::Neg, - .. - } => v2_rt::concat( - "-".to_string(), - emit_data_value_json(&unaryop_operand(value.clone()), source_indices.clone()), - ), - _ => "\"compile_error!(unsupported mock expression)\"".to_string(), - } + ExprData::ExprLiteral { value: v, .. } => match (*v.clone()).clone() { + LiteralValue::LitStr { value: s, .. } => v2_rt::concat(v2_rt::concat("\"".to_string(), escape_json_string(s.clone())), "\"".to_string()), + LiteralValue::LitInt { value: i, .. } => (i.clone()).to_string(), + LiteralValue::LitFloat { value: f, .. } => f.clone(), + LiteralValue::LitBool { value: b, .. } => if b.clone() { + "true".to_string() + } else { + "false".to_string() + }, + LiteralValue::LitNull => "null".to_string(), +}, + ExprData::ExprListLit => { + let el_strs = Rc::new({ let mut __result = Vec::new(); for e in value.children.clone().iter().cloned() { __result.push(emit_data_value_json(&e, source_indices.clone())); } __result }); +v2_rt::concat(v2_rt::concat("[".to_string(), el_strs.join(&", ".to_string())), "]".to_string()) +}, + ExprData::ExprRecordLit { .. } => { + let field_strs = Rc::new({ let mut __result = Vec::new(); for f in value.children.clone().iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(v2_rt::concat("\"".to_string(), escape_json_string(field_init_node_name_at(f.clone(), source_indices.clone()))), "\": ".to_string()), emit_data_value_json(&field_init_node_value(&f), source_indices.clone()))); } __result }); +v2_rt::concat(v2_rt::concat("{".to_string(), field_strs.join(&", ".to_string())), "}".to_string()) +}, + ExprData::ExprVar { .. } => v2_rt::concat(v2_rt::concat("\"".to_string(), escape_json_string(expr_var_name_at(value.clone(), source_indices.clone()))), "\"".to_string()), + ExprData::ExprUnaryOp { op: UnaryOpKind::Neg, .. } => v2_rt::concat("-".to_string(), emit_data_value_json(&unaryop_operand(value.clone()), source_indices.clone())), + _ => "\"compile_error!(unsupported mock expression)\"".to_string(), +} }) } pub fn escape_json_string(s: String) -> String { - Rc::new( - Rc::new( - Rc::new( - Rc::new( - s.split(&"\\".to_string()) - .map(|s| s.to_string()) - .collect::>(), - ) - .join(&"\\\\".to_string()) - .split(&"\"".to_string()) - .map(|s| s.to_string()) - .collect::>(), - ) - .join(&"\\\"".to_string()) - .split(&"\n".to_string()) - .map(|s| s.to_string()) - .collect::>(), - ) - .join(&"\\n".to_string()) - .split(&"\t".to_string()) - .map(|s| s.to_string()) - .collect::>(), - ) - .join(&"\\t".to_string()) + Rc::new(Rc::new(Rc::new(Rc::new(s.split(&"\\".to_string()).map(|s| s.to_string()).collect::>()).join(&"\\\\".to_string()).split(&"\"".to_string()).map(|s| s.to_string()).collect::>()).join(&"\\\"".to_string()).split(&"\n".to_string()).map(|s| s.to_string()).collect::>()).join(&"\\n".to_string()).split(&"\t".to_string()).map(|s| s.to_string()).collect::>()).join(&"\\t".to_string()) } pub fn module_to_filename(name: String) -> String { - Rc::new( - name.split(&".".to_string()) - .map(|s| s.to_string()) - .collect::>(), - ) - .join(&"_".to_string()) + Rc::new(name.split(&".".to_string()).map(|s| s.to_string()).collect::>()).join(&"_".to_string()) } pub fn make_indent(level: i64) -> String { @@ -1030,26 +518,15 @@ pub fn make_indent(level: i64) -> String { pub fn to_string(value: i64) -> String { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { if (value.clone() < 0) { - v2_rt::concat("-".to_string(), (0 - value.clone()).to_string()) + v2_rt::concat("-".to_string(), ((0 - value.clone())).to_string()) } else { if (value.clone() == 0) { "0".to_string() } else { { - let digit_chars = Rc::new(vec![ - "0".to_string(), - "1".to_string(), - "2".to_string(), - "3".to_string(), - "4".to_string(), - "5".to_string(), - "6".to_string(), - "7".to_string(), - "8".to_string(), - "9".to_string(), - ]); - to_string_helper(value.clone(), Rc::new(vec![])).join(&"".to_string()) - } + let digit_chars = Rc::new(vec!["0".to_string(), "1".to_string(), "2".to_string(), "3".to_string(), "4".to_string(), "5".to_string(), "6".to_string(), "7".to_string(), "8".to_string(), "9".to_string()]); +to_string_helper(value.clone(), Rc::new(vec![])).join(&"".to_string()) +} } } }) @@ -1059,169 +536,68 @@ pub fn to_string_helper(mut value: i64, mut acc: Rc>) -> Rc>(), - ) - .iter() - .cloned() - { - if (p.0.clone() == digit.clone()) { - __result.push(p); - } - } - __result - }) - .first() - .cloned() - { - Some(p) => p.1.clone(), - None => "?".to_string(), - }; - { +let rest = ((value.clone() - digit.clone()) / 10); +let digit_chars = Rc::new(vec!["0".to_string(), "1".to_string(), "2".to_string(), "3".to_string(), "4".to_string(), "5".to_string(), "6".to_string(), "7".to_string(), "8".to_string(), "9".to_string()]); +let ch = match Rc::new({ let mut __result = Vec::new(); for p in Rc::new(digit_chars.iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { if (p.0.clone() == digit.clone()) { __result.push(p); } } __result }).first().cloned() { + Some(p) => p.1.clone(), + None => "?".to_string(), +}; +{ let __tco_0 = rest; - let __tco_1 = v2_rt::concat(Rc::new(vec![ch]), acc); - value = __tco_0; - acc = __tco_1; - continue; - } - } - } +let __tco_1 = v2_rt::concat(Rc::new(vec![ch]), acc); +value = __tco_0; +acc = __tco_1; +continue; +} +} +} } pub fn to_snake(name: String) -> String { { let chars_list = Rc::new(name.chars().map(|c| c as i64).collect::>()); - let result = Rc::new({ - let mut __result = Vec::new(); - for pair in Rc::new( - chars_list - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - { - __result.push({ - let idx = pair.0.clone(); - let ch = pair.1.clone(); - if is_upper(ch.clone()) { - if (idx.clone() == 0) { - to_lower_char(ch.clone()) - } else { - v2_rt::concat("_".to_string(), to_lower_char(ch.clone())) - } - } else { - v2_rt::from_code_point(ch.clone()) - } - }); +let result = Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(chars_list.iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { __result.push({ + let idx = pair.0.clone(); +let ch = pair.1.clone(); +if is_upper(ch.clone()) { + if (idx.clone() == 0) { + to_lower_char(ch.clone()) + } else { + v2_rt::concat("_".to_string(), to_lower_char(ch.clone())) + } + } else { + v2_rt::from_code_point(ch.clone()) } - __result - }); - result.join(&"".to_string()) - } +}); } __result }); +result.join(&"".to_string()) +} } pub fn to_screaming_snake(name: String) -> String { { let snake = to_snake(name); - Rc::new({ - let mut __result = Vec::new(); - for ch in Rc::new(snake.chars().map(|c| c as i64).collect::>()) - .iter() - .cloned() - { - __result.push(to_upper_char(ch.clone())); - } - __result - }) - .join(&"".to_string()) - } +Rc::new({ let mut __result = Vec::new(); for ch in Rc::new(snake.chars().map(|c| c as i64).collect::>()).iter().cloned() { __result.push(to_upper_char(ch.clone())); } __result }).join(&"".to_string()) +} } pub fn to_camel(name: String) -> String { { - let parts = Rc::new( - name.clone() - .split(&"_".to_string()) - .map(|s| s.to_string()) - .collect::>(), - ); - if ((parts.clone().len() as i64) == 0) { + let parts = Rc::new(name.clone().split(&"_".to_string()).map(|s| s.to_string()).collect::>()); +if ((parts.clone().len() as i64) == 0) { name.clone() } else { { let first_part = match parts.clone().first().cloned() { - Some(p) => Rc::new({ - let mut __result = Vec::new(); - for c in Rc::new(p.clone().chars().map(|c| c as i64).collect::>()) - .iter() - .cloned() - { - __result.push(to_lower_char(c.clone())); - } - __result - }) - .join(&"".to_string()), - None => "".to_string(), - }; - let rest_parts = Rc::new({ - let mut __result = Vec::new(); - for pair in Rc::new({ - let mut __result = Vec::new(); - for pair in Rc::new( - parts - .clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - { - if (pair.0.clone() > 0) { - __result.push(pair); - } - } - __result - }) - .iter() - .cloned() - { - __result.push(capitalize_first(pair.1.clone())); - } - __result - }); - v2_rt::concat(first_part, rest_parts.join(&"".to_string())) - } + Some(p) => Rc::new({ let mut __result = Vec::new(); for c in Rc::new(p.clone().chars().map(|c| c as i64).collect::>()).iter().cloned() { __result.push(to_lower_char(c.clone())); } __result }).join(&"".to_string()), + None => "".to_string(), +}; +let rest_parts = Rc::new({ let mut __result = Vec::new(); for pair in Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(parts.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { if (pair.0.clone() > 0) { __result.push(pair); } } __result }).iter().cloned() { __result.push(capitalize_first(pair.1.clone())); } __result }); +v2_rt::concat(first_part, rest_parts.join(&"".to_string())) +} } - } +} } pub fn is_upper(ch: i64) -> bool { @@ -1231,123 +607,74 @@ pub fn is_upper(ch: i64) -> bool { pub fn to_lower_char(ch: i64) -> String { { let cp = ch.clone(); - if ((cp.clone() >= 65) && (cp.clone() <= 90)) { +if ((cp.clone() >= 65) && (cp.clone() <= 90)) { { let lower_cp = (cp.clone() + 32); - v2_rt::from_code_point(lower_cp) - } +v2_rt::from_code_point(lower_cp) +} } else { v2_rt::from_code_point(ch.clone()) } - } +} } pub fn to_upper_char(ch: i64) -> String { { let cp = ch.clone(); - if ((cp.clone() >= 97) && (cp.clone() <= 122)) { +if ((cp.clone() >= 97) && (cp.clone() <= 122)) { { let upper_cp = (cp.clone() - 32); - v2_rt::from_code_point(upper_cp) - } +v2_rt::from_code_point(upper_cp) +} } else { v2_rt::from_code_point(ch.clone()) } - } +} } pub fn sanitize_service_name(name: String) -> String { { - let parts = Rc::new( - name.split(&".".to_string()) - .map(|s| s.to_string()) - .collect::>(), - ); - let pascal_parts = Rc::new({ - let mut __result = Vec::new(); - for p in parts.iter().cloned() { - __result.push(capitalize_first(p.clone())); - } - __result - }); - pascal_parts.join(&"".to_string()) - } + let parts = Rc::new(name.split(&".".to_string()).map(|s| s.to_string()).collect::>()); +let pascal_parts = Rc::new({ let mut __result = Vec::new(); for p in parts.iter().cloned() { __result.push(capitalize_first(p.clone())); } __result }); +pascal_parts.join(&"".to_string()) +} } pub fn capitalize_first(s: String) -> String { { let chars_list = Rc::new(s.chars().map(|c| c as i64).collect::>()); - if ((chars_list.clone().len() as i64) == 0) { +if ((chars_list.clone().len() as i64) == 0) { "".to_string() } else { - Rc::new({ - let mut __result = Vec::new(); - for pair in Rc::new( - chars_list - .clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - { - __result.push(if (pair.0.clone() == 0) { - to_upper_char(pair.1.clone()) - } else { - v2_rt::from_code_point(pair.1.clone()) - }); - } - __result - }) - .join(&"".to_string()) + Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(chars_list.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { __result.push(if (pair.0.clone() == 0) { + to_upper_char(pair.1.clone()) + } else { + v2_rt::from_code_point(pair.1.clone()) + }); } __result }).join(&"".to_string()) } - } +} } pub fn to_pascal(name: String) -> String { { let snake = to_snake(name); - let parts = Rc::new( - snake - .split(&"_".to_string()) - .map(|s| s.to_string()) - .collect::>(), - ); - let pascal_parts = Rc::new({ - let mut __result = Vec::new(); - for p in parts.iter().cloned() { - __result.push(capitalize_first(p.clone())); - } - __result - }); - pascal_parts.join(&"".to_string()) - } +let parts = Rc::new(snake.split(&"_".to_string()).map(|s| s.to_string()).collect::>()); +let pascal_parts = Rc::new({ let mut __result = Vec::new(); for p in parts.iter().cloned() { __result.push(capitalize_first(p.clone())); } __result }); +pascal_parts.join(&"".to_string()) +} } pub fn apply_naming_case(name: String, case_style: NamingCase) -> String { match case_style { - NamingCase::PascalCase => { - let parts = Rc::new( - name.split(&"_".to_string()) - .map(|s| s.to_string()) - .collect::>(), - ); - let pascal_parts = Rc::new({ - let mut __result = Vec::new(); - for p in parts.iter().cloned() { - __result.push(capitalize_first(p.clone())); - } - __result - }); - pascal_parts.join(&"".to_string()) - } - NamingCase::SnakeCase => to_snake(name), - NamingCase::CamelCase => to_camel(name), - NamingCase::AsAuthored => name, - } + NamingCase::PascalCase => { + let parts = Rc::new(name.split(&"_".to_string()).map(|s| s.to_string()).collect::>()); +let pascal_parts = Rc::new({ let mut __result = Vec::new(); for p in parts.iter().cloned() { __result.push(capitalize_first(p.clone())); } __result }); +pascal_parts.join(&"".to_string()) +}, + NamingCase::SnakeCase => to_snake(name), + NamingCase::CamelCase => to_camel(name), + NamingCase::AsAuthored => name, +} } pub fn service_var_name(service_name: String) -> String { @@ -1357,176 +684,71 @@ pub fn service_var_name(service_name: String) -> String { pub fn test_file_path(module_name: String, target: &RenderTarget) -> String { { let conventions = test_conventions_for_target(target.clone()); - let file_dir = match conventions.file_dir.clone() { - Some(dir) => dir.clone(), - None => "".to_string(), - }; - let filename = module_to_filename(module_name); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(file_dir, conventions.file_prefix.clone()), - filename, - ), - conventions.file_suffix.clone(), - ), - language_spec(target.clone()) - .scaffold - .clone() - .source_file_extension - .clone(), - ) - } +let file_dir = match conventions.file_dir.clone() { + Some(dir) => dir.clone(), + None => "".to_string(), +}; +let filename = module_to_filename(module_name); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(file_dir, conventions.file_prefix.clone()), filename), conventions.file_suffix.clone()), language_spec(target.clone()).scaffold.clone().source_file_extension.clone()) +} } pub fn test_function_name(projection: &Rc, target: RenderTarget) -> String { { let conventions = test_conventions_for_target(target); - let formatted = match conventions.name_style.clone() { - TestNameStyle::SnakeCaseTestNames => v2_rt::concat( - v2_rt::concat( - to_snake(sanitize_service_name(projection.service_name.clone())), - "_".to_string(), - ), - to_snake(projection.operation_name.clone()), - ), - TestNameStyle::PascalCaseTestNames => v2_rt::concat( - to_pascal(sanitize_service_name(projection.service_name.clone())), - to_pascal(projection.operation_name.clone()), - ), - }; - v2_rt::concat(conventions.function_prefix.clone(), formatted) - } +let formatted = match conventions.name_style.clone() { + TestNameStyle::SnakeCaseTestNames => v2_rt::concat(v2_rt::concat(to_snake(sanitize_service_name(projection.service_name.clone())), "_".to_string()), to_snake(projection.operation_name.clone())), + TestNameStyle::PascalCaseTestNames => v2_rt::concat(to_pascal(sanitize_service_name(projection.service_name.clone())), to_pascal(projection.operation_name.clone())), +}; +v2_rt::concat(conventions.function_prefix.clone(), formatted) +} } pub fn apply_type_template1(template: String, arg0: String) -> String { - Rc::new( - template - .split(&"{0}".to_string()) - .map(|s| s.to_string()) - .collect::>(), - ) - .join(&arg0) + Rc::new(template.split(&"{0}".to_string()).map(|s| s.to_string()).collect::>()).join(&arg0) } pub fn apply_type_template2(template: String, arg0: String, arg1: String) -> String { { - let parts = Rc::new( - template - .split(&"{0}".to_string()) - .map(|s| s.to_string()) - .collect::>(), - ); - let replaced = Rc::new({ - let mut __result = Vec::new(); - for p in parts.iter().cloned() { - __result.push( - Rc::new( - p.clone() - .split(&"{1}".to_string()) - .map(|s| s.to_string()) - .collect::>(), - ) - .join(&arg1.clone()), - ); - } - __result - }); - replaced.join(&arg0) - } + let parts = Rc::new(template.split(&"{0}".to_string()).map(|s| s.to_string()).collect::>()); +let replaced = Rc::new({ let mut __result = Vec::new(); for p in parts.iter().cloned() { __result.push(Rc::new(p.clone().split(&"{1}".to_string()).map(|s| s.to_string()).collect::>()).join(&arg1.clone())); } __result }); +replaced.join(&arg0) +} } pub fn apply_type_template3(template: String, arg0: String, arg1: String, arg2: String) -> String { { - let parts0 = Rc::new( - template - .split(&"{0}".to_string()) - .map(|s| s.to_string()) - .collect::>(), - ); - let replaced = Rc::new({ - let mut __result = Vec::new(); - for p0 in parts0.iter().cloned() { - __result.push({ - let parts1 = Rc::new( - p0.clone() - .split(&"{1}".to_string()) - .map(|s| s.to_string()) - .collect::>(), - ); - let inner = Rc::new({ - let mut __result = Vec::new(); - for p1 in parts1.clone().iter().cloned() { - __result.push( - Rc::new( - p1.clone() - .split(&"{2}".to_string()) - .map(|s| s.to_string()) - .collect::>(), - ) - .join(&arg2.clone()), - ); - } - __result - }); - inner.clone().join(&arg1.clone()) - }); - } - __result - }); - replaced.join(&arg0) - } + let parts0 = Rc::new(template.split(&"{0}".to_string()).map(|s| s.to_string()).collect::>()); +let replaced = Rc::new({ let mut __result = Vec::new(); for p0 in parts0.iter().cloned() { __result.push({ + let parts1 = Rc::new(p0.clone().split(&"{1}".to_string()).map(|s| s.to_string()).collect::>()); +let inner = Rc::new({ let mut __result = Vec::new(); for p1 in parts1.clone().iter().cloned() { __result.push(Rc::new(p1.clone().split(&"{2}".to_string()).map(|s| s.to_string()).collect::>()).join(&arg2.clone())); } __result }); +inner.clone().join(&arg1.clone()) +}); } __result }); +replaced.join(&arg0) +} } pub fn apply_named_template(template: String, bindings: &Rc>) -> String { apply_named_template_nested(template, &bindings, &Rc::new(v2_rt::map_keys(&bindings))) } -pub fn apply_named_template_nested( - template: String, - bindings: &Rc>, - keys: &Rc>, -) -> String { +pub fn apply_named_template_nested(template: String, bindings: &Rc>, keys: &Rc>) -> String { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match keys.clone().first().cloned() { - None => template, - Some(key) => { - let rest = Rc::new( - keys.clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ); - let placeholder = - v2_rt::concat(v2_rt::concat("{".to_string(), key.clone()), "}".to_string()); - match v2_rt::map_get(&bindings, key.clone()) { - Some(val) => { - let parts = Rc::new( - template - .split(&placeholder) - .map(|s| s.to_string()) - .collect::>(), - ); - let processed = Rc::new({ - let mut __result = Vec::new(); - for part in parts.iter().cloned() { - __result.push(apply_named_template_nested( - part.clone(), - &bindings, - &rest, - )); - } - __result - }); - processed.join(&val.clone()) - } - None => { - v2_rt::concat("TEMPLATE_ERROR_MISSING_BINDING_".to_string(), key.clone()) - } - } - } - } + None => template, + Some(key) => { + let rest = Rc::new(keys.clone().iter().cloned().skip(1 as usize).collect::>()); +let placeholder = v2_rt::concat(v2_rt::concat("{".to_string(), key.clone()), "}".to_string()); +match v2_rt::map_get(&bindings, key.clone()) { + Some(val) => { + let parts = Rc::new(template.split(&placeholder).map(|s| s.to_string()).collect::>()); +let processed = Rc::new({ let mut __result = Vec::new(); for part in parts.iter().cloned() { __result.push(apply_named_template_nested(part.clone(), &bindings, &rest)); } __result }); +processed.join(&val.clone()) +}, + None => v2_rt::concat("TEMPLATE_ERROR_MISSING_BINDING_".to_string(), key.clone()), +} +}, +} }) } @@ -1535,163 +757,74 @@ pub fn language_spec(target: RenderTarget) -> Rc { } pub fn reserved_prefix(target: RenderTarget) -> String { - match (*language_spec(target) - .reserved_words - .clone() - .strategy - .clone()) - .clone() - { - ReservedWordStrategy::PrefixEscape { prefix, .. } => prefix.clone(), - _ => "".to_string(), - } + match (*language_spec(target).reserved_words.clone().strategy.clone()).clone() { + ReservedWordStrategy::PrefixEscape { prefix, .. } => prefix.clone(), + _ => "".to_string(), +} } pub fn reserved_suffix(target: RenderTarget) -> String { - match (*language_spec(target) - .reserved_words - .clone() - .strategy - .clone()) - .clone() - { - ReservedWordStrategy::SuffixEscape { suffix, .. } => suffix.clone(), - _ => "".to_string(), - } + match (*language_spec(target).reserved_words.clone().strategy.clone()).clone() { + ReservedWordStrategy::SuffixEscape { suffix, .. } => suffix.clone(), + _ => "".to_string(), +} } pub fn escape_string_literal_body(s: String) -> String { { - let escaped_backslash = Rc::new( - s.split(&"\\".to_string()) - .map(|s| s.to_string()) - .collect::>(), - ) - .join(&"\\\\".to_string()); - let escaped_quote = Rc::new( - escaped_backslash - .split(&"\"".to_string()) - .map(|s| s.to_string()) - .collect::>(), - ) - .join(&"\\\"".to_string()); - let escaped_newline = Rc::new( - escaped_quote - .split(&"\n".to_string()) - .map(|s| s.to_string()) - .collect::>(), - ) - .join(&"\\n".to_string()); - let escaped_return = Rc::new( - escaped_newline - .split(&"\\r".to_string()) - .map(|s| s.to_string()) - .collect::>(), - ) - .join(&"\\r".to_string()); - Rc::new( - escaped_return - .split(&"\t".to_string()) - .map(|s| s.to_string()) - .collect::>(), - ) - .join(&"\\t".to_string()) - } + let escaped_backslash = Rc::new(s.split(&"\\".to_string()).map(|s| s.to_string()).collect::>()).join(&"\\\\".to_string()); +let escaped_quote = Rc::new(escaped_backslash.split(&"\"".to_string()).map(|s| s.to_string()).collect::>()).join(&"\\\"".to_string()); +let escaped_newline = Rc::new(escaped_quote.split(&"\n".to_string()).map(|s| s.to_string()).collect::>()).join(&"\\n".to_string()); +let escaped_return = Rc::new(escaped_newline.split(&"\\r".to_string()).map(|s| s.to_string()).collect::>()).join(&"\\r".to_string()); +Rc::new(escaped_return.split(&"\t".to_string()).map(|s| s.to_string()).collect::>()).join(&"\\t".to_string()) +} } pub fn escape_rust_interp_text(s: String) -> String { { - let escaped = Rc::new( - escape_string_literal_body(s) - .split(&"{".to_string()) - .map(|s| s.to_string()) - .collect::>(), - ) - .join(&"{{".to_string()); - Rc::new( - escaped - .split(&"}".to_string()) - .map(|s| s.to_string()) - .collect::>(), - ) - .join(&"}}".to_string()) - } + let escaped = Rc::new(escape_string_literal_body(s).split(&"{".to_string()).map(|s| s.to_string()).collect::>()).join(&"{{".to_string()); +Rc::new(escaped.split(&"}".to_string()).map(|s| s.to_string()).collect::>()).join(&"}}".to_string()) +} } pub fn escape_go_interp_text(s: String) -> String { - Rc::new( - escape_string_literal_body(s) - .split(&"%".to_string()) - .map(|s| s.to_string()) - .collect::>(), - ) - .join(&"%%".to_string()) + Rc::new(escape_string_literal_body(s).split(&"%".to_string()).map(|s| s.to_string()).collect::>()).join(&"%%".to_string()) } pub fn escape_python_interp_text(s: String) -> String { { - let escaped = Rc::new( - escape_string_literal_body(s) - .split(&"{".to_string()) - .map(|s| s.to_string()) - .collect::>(), - ) - .join(&"{{".to_string()); - Rc::new( - escaped - .split(&"}".to_string()) - .map(|s| s.to_string()) - .collect::>(), - ) - .join(&"}}".to_string()) - } + let escaped = Rc::new(escape_string_literal_body(s).split(&"{".to_string()).map(|s| s.to_string()).collect::>()).join(&"{{".to_string()); +Rc::new(escaped.split(&"}".to_string()).map(|s| s.to_string()).collect::>()).join(&"}}".to_string()) +} } pub fn apply_escape_pairs(s: String, pairs: Rc>>) -> String { - pairs - .iter() - .cloned() - .fold(s.clone(), |acc: String, pair: Rc| { - Rc::new( - acc.split(&pair.from.clone()) - .map(|s| s.to_string()) - .collect::>(), - ) - .join(&pair.to.clone()) - }) + pairs.iter().cloned().fold(s.clone(), |acc: String, pair: Rc| Rc::new(acc.split(&pair.from.clone()).map(|s| s.to_string()).collect::>()).join(&pair.to.clone())) } pub fn emit_string_literal(s: String, suffix: String) -> String { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("\"".to_string(), escape_string_literal_body(s)), - "\"".to_string(), - ), - suffix, - ) + v2_rt::concat(v2_rt::concat(v2_rt::concat("\"".to_string(), escape_string_literal_body(s)), "\"".to_string()), suffix) } pub fn is_null_coalesce(op: BinOp) -> bool { match op { - BinOp::NullCoalesce => true, - _ => false, - } + BinOp::NullCoalesce => true, + _ => false, +} } pub fn rust_literal_for_pattern(value: Rc) -> String { match (*value).clone() { - LiteralValue::LitStr { value: s, .. } => emit_string_literal(s.clone(), "".to_string()), - LiteralValue::LitInt { value: i, .. } => (i.clone()).to_string(), - LiteralValue::LitFloat { value: f, .. } => f.clone(), - LiteralValue::LitBool { value: b, .. } => { - if b.clone() { - emit_keyword("true".to_string(), RenderTarget::Rust) - } else { - emit_keyword("false".to_string(), RenderTarget::Rust) - } - } - LiteralValue::LitNull => emit_keyword("null".to_string(), RenderTarget::Rust), - } + LiteralValue::LitStr { value: s, .. } => emit_string_literal(s.clone(), "".to_string()), + LiteralValue::LitInt { value: i, .. } => (i.clone()).to_string(), + LiteralValue::LitFloat { value: f, .. } => f.clone(), + LiteralValue::LitBool { value: b, .. } => if b.clone() { + emit_keyword("true".to_string(), RenderTarget::Rust) + } else { + emit_keyword("false".to_string(), RenderTarget::Rust) + }, + LiteralValue::LitNull => emit_keyword("null".to_string(), RenderTarget::Rust), +} } pub fn emit_keyword(key: String, target: RenderTarget) -> String { @@ -1700,41 +833,29 @@ pub fn emit_keyword(key: String, target: RenderTarget) -> String { pub fn emit_literal(value: Rc, target: &RenderTarget) -> String { match (*value).clone() { - LiteralValue::LitStr { value: s, .. } => { - let suffix = match literal_suffix(target.clone(), "String".to_string()) { - Some(sfx) => sfx.clone(), - None => emit_error_expr( - "missing TypeCheckpoint for String literal suffix".to_string(), - target.clone(), - ), - }; - emit_string_literal(s.clone(), suffix) - } - LiteralValue::LitInt { value: i, .. } => (i.clone()).to_string(), - LiteralValue::LitFloat { value: f, .. } => f.clone(), - LiteralValue::LitBool { value: b, .. } => { - if b.clone() { - emit_keyword("true".to_string(), target.clone()) - } else { - emit_keyword("false".to_string(), target.clone()) - } - } - LiteralValue::LitNull => emit_keyword("null".to_string(), target.clone()), - } + LiteralValue::LitStr { value: s, .. } => { + let suffix = match literal_suffix(target.clone(), "String".to_string()) { + Some(sfx) => sfx.clone(), + None => emit_error_expr("missing TypeCheckpoint for String literal suffix".to_string(), target.clone()), +}; +emit_string_literal(s.clone(), suffix) +}, + LiteralValue::LitInt { value: i, .. } => (i.clone()).to_string(), + LiteralValue::LitFloat { value: f, .. } => f.clone(), + LiteralValue::LitBool { value: b, .. } => if b.clone() { + emit_keyword("true".to_string(), target.clone()) + } else { + emit_keyword("false".to_string(), target.clone()) + }, + LiteralValue::LitNull => emit_keyword("null".to_string(), target.clone()), +} } -pub fn emit_bin_op_symbol( - op: BinOp, - target: &RenderTarget, - algebra_field: Option, -) -> String { +pub fn emit_bin_op_symbol(op: BinOp, target: &RenderTarget, algebra_field: Option) -> String { match binop_symbol(target.clone(), op, algebra_field) { - Some(sym) => sym.clone(), - None => emit_error_expr( - "missing OperatorSpec for BinOp in target language".to_string(), - target.clone(), - ), - } + Some(sym) => sym.clone(), + None => emit_error_expr("missing OperatorSpec for BinOp in target language".to_string(), target.clone()), +} } pub fn emit_container(kind: &String, inner: String, target: &RenderTarget) -> String { @@ -1742,467 +863,303 @@ pub fn emit_container(kind: &String, inner: String, target: &RenderTarget) -> St apply_type_template1(target_optional_template(target.clone()), inner) } else { match coerce_container_template(target.clone(), kind.clone()) { - Some(template) => apply_type_template1(template.clone(), inner), - None => { - let spec = language_spec(target.clone()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(kind.clone(), spec.type_arg_open.clone()), - inner, - ), - spec.type_arg_close.clone(), - ) - } - } + Some(template) => apply_type_template1(template.clone(), inner), + None => { + let spec = language_spec(target.clone()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(kind.clone(), spec.type_arg_open.clone()), inner), spec.type_arg_close.clone()) +}, +} } } pub fn emit_map_type(key_type: String, val_type: String, target: RenderTarget) -> String { match coerce_container_template(target, "map".to_string()) { - Some(template) => apply_type_template2(template.clone(), key_type, val_type), - None => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("Map<".to_string(), key_type), - ", ".to_string(), - ), - val_type, - ), - ">".to_string(), - ), - } + Some(template) => apply_type_template2(template.clone(), key_type, val_type), + None => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("Map<".to_string(), key_type), ", ".to_string()), val_type), ">".to_string()), +} +} + +pub fn emit_node_type(n: Rc, target: RenderTarget, source_indices: Rc>>) -> String { + render_node_type(&n, &target, &v2_rt::rc_empty_map::(), &source_indices) } -pub fn emit_node_type( - n: Rc, - target: RenderTarget, - source_indices: Rc>>, -) -> String { - render_node_type( - &n, - &target, - &v2_rt::rc_empty_map::(), - &source_indices, - ) -} - -pub fn render_node_type( - n: &Rc, - target: &RenderTarget, - shared_types: &Rc>, - source_indices: &Rc>>, -) -> String { +pub fn render_node_type(n: &Rc, target: &RenderTarget, shared_types: &Rc>, source_indices: &Rc>>) -> String { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - let tn = authored_name_at(source_indices.clone(), &n); - let n_is_error = if (n.inferred.clone() != None) { - is_compiler_error(n.inferred.clone().clone().unwrap()) - } else { - false - }; - let n_is_type_var = if (n.inferred.clone() != None) { - is_type_variable(n.inferred.clone().clone().unwrap()) - } else { - false - }; - if ((n_is_type_var || n_is_error.clone()) && ((n.children.clone().len() as i64) == 0)) { - { - let label = if n_is_error.clone() { - "CompilerError".to_string() - } else { - "TypeVariable".to_string() - }; - let spec = language_spec(target.clone()); - let err_str = apply_type_template1( - spec.error_type_template.clone(), - v2_rt::concat("UNRESOLVED_".to_string(), label), - ); - return err_str; + { + let tn = authored_name_at(source_indices.clone(), &n); +let n_is_error = if (n.inferred.clone() != None) { + is_compiler_error(n.inferred.clone().clone().unwrap()) + } else { + false + }; +let n_is_type_var = if (n.inferred.clone() != None) { + is_type_variable(n.inferred.clone().clone().unwrap()) + } else { + false + }; +if ((n_is_type_var || n_is_error.clone()) && ((n.children.clone().len() as i64) == 0)) { + { + let label = if n_is_error.clone() { + "CompilerError".to_string() + } else { + "TypeVariable".to_string() + }; +let spec = language_spec(target.clone()); +let err_str = apply_type_template1(spec.error_type_template.clone(), v2_rt::concat("UNRESOLVED_".to_string(), label)); +return err_str +} } - } - let is_arrow = (n.connective.clone() == Connective::Arrow); - if is_arrow { - { - let repr = target_callable(target.clone()); - let param_strs = Rc::new({ - let mut __result = Vec::new(); - for p in n.params.clone().iter().cloned() { - __result.push(render_node_type( - ¶m_node_type_expr(&p), - &target, - &shared_types, - &source_indices, - )); - } - __result - }); - let param_str = param_strs.join(&repr.param_separator.clone()); - let ret_str = match n.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - render_node_type(&rt, &target, &shared_types, &source_indices) - } - _ => language_spec(target.clone()).void_type.clone(), - }; - let spec = language_spec(target.clone()); - let result = match spec.callable_type_template.clone() { - Some(t) => v2_rt::replace( - v2_rt::replace(t.clone(), "{params}".to_string(), param_str), - "{return}".to_string(), - ret_str.clone(), - ), - None => { - if (ret_str.clone().as_str() == "".to_string().as_str()) { - { - let void_template = v2_rt::replace( - repr.template.clone(), - v2_rt::concat( - repr.return_separator.clone(), - "{return}".to_string(), - ), - "".to_string(), - ); - v2_rt::replace(void_template, "{params}".to_string(), param_str) - } - } else { - v2_rt::replace( - v2_rt::replace( - repr.template.clone(), - "{params}".to_string(), - param_str, - ), - "{return}".to_string(), - ret_str.clone(), - ) - } - } - }; - return result; +let is_arrow = (n.connective.clone() == Connective::Arrow); +if is_arrow { + { + let repr = target_callable(target.clone()); +let param_strs = Rc::new({ let mut __result = Vec::new(); for p in n.params.clone().iter().cloned() { __result.push(render_node_type(¶m_node_type_expr(&p), &target, &shared_types, &source_indices)); } __result }); +let param_str = param_strs.join(&repr.param_separator.clone()); +let ret_str = match n.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => render_node_type(&rt, &target, &shared_types, &source_indices), + _ => language_spec(target.clone()).void_type.clone(), +}; +let spec = language_spec(target.clone()); +let result = match spec.callable_type_template.clone() { + Some(t) => v2_rt::replace(v2_rt::replace(t.clone(), "{params}".to_string(), param_str), "{return}".to_string(), ret_str.clone()), + None => if (ret_str.clone().as_str() == "".to_string().as_str()) { + { + let void_template = v2_rt::replace(repr.template.clone(), v2_rt::concat(repr.return_separator.clone(), "{return}".to_string()), "".to_string()); +v2_rt::replace(void_template, "{params}".to_string(), param_str) +} + } else { + v2_rt::replace(v2_rt::replace(repr.template.clone(), "{params}".to_string(), param_str), "{return}".to_string(), ret_str.clone()) + }, +}; +return result +} } - } - let is_optional = (n.return_cardinality.clone() == Cardinality::CardOptional); - if is_optional { - { - let inner_str = render_node_type( - &with_required_cardinality(&n), - &target, - &shared_types, - &source_indices, - ); - let opt_str = emit_container(&"optional".to_string(), inner_str, &target); - return opt_str; +let is_optional = (n.return_cardinality.clone() == Cardinality::CardOptional); +if is_optional { + { + let inner_str = render_node_type(&with_required_cardinality(&n), &target, &shared_types, &source_indices); +let opt_str = emit_container(&"optional".to_string(), inner_str, &target); +return opt_str +} } - } - let is_conj = (n.connective.clone() == Connective::Conj); - let is_disj = (n.connective.clone() == Connective::Disj); - let shared = emit_map_has(shared_types.clone(), tn.clone()); - if is_disj { - { - let base = if (n.ident_span.clone() != None) { - coerce_primitive_type(target.clone(), tn.clone()) - } else { - { - let spec = language_spec(target.clone()); - apply_type_template1( - spec.error_type_template.clone(), - "ANONYMOUS_COPRODUCT".to_string(), - ) - } - }; - let disj_str = if shared.clone() { - wrap_shared_type(target.clone(), base.clone()) - } else { - base.clone() - }; - return disj_str; +let is_conj = (n.connective.clone() == Connective::Conj); +let is_disj = (n.connective.clone() == Connective::Disj); +let shared = emit_map_has(shared_types.clone(), tn.clone()); +if is_disj { + { + let base = if (n.ident_span.clone() != None) { + coerce_primitive_type(target.clone(), tn.clone()) + } else { + { + let spec = language_spec(target.clone()); +apply_type_template1(spec.error_type_template.clone(), "ANONYMOUS_COPRODUCT".to_string()) +} + }; +let disj_str = if shared.clone() { + wrap_shared_type(target.clone(), base.clone()) + } else { + base.clone() + }; +return disj_str +} } - } - if is_conj { - { - if (n.type_annotation.clone() != None) { - { - let refined_str = match n.children.clone().first().cloned() { - Some(base) => { - render_node_type(&base, &target, &shared_types, &source_indices) - } - None => coerce_primitive_type(target.clone(), "Refined".to_string()), - }; - return refined_str; +if is_conj { + { + if (n.type_annotation.clone() != None) { + { + let refined_str = match n.children.clone().first().cloned() { + Some(base) => render_node_type(&base, &target, &shared_types, &source_indices), + None => coerce_primitive_type(target.clone(), "Refined".to_string()), +}; +return refined_str +} } - } - let is_pair = (((n.connective.clone() == Connective::Conj) - && (n.ident_span.clone() == None)) - && ((n.children.clone().len() as i64) == 2)); - if is_pair { - { - let first_child = match n.children.clone().first().cloned() { - Some(c) => { - if (c.inferred.clone() != None) { - render_node_type( - &resolved_type(c.clone()), - &target, - &shared_types, - &source_indices, - ) - } else { - render_node_type(&c, &target, &shared_types, &source_indices) - } - } - None => "_".to_string(), - }; - let second_child = match n.children.clone().get(1 as usize).cloned() { - Some(c) => { - if (c.inferred.clone() != None) { - render_node_type( - &resolved_type(c.clone()), - &target, - &shared_types, - &source_indices, - ) - } else { - render_node_type(&c, &target, &shared_types, &source_indices) - } - } - None => "_".to_string(), - }; - let tuple_str = render_tuple_parts( - &Rc::new(vec![first_child, second_child]), - target.clone(), - ); - return tuple_str; +let is_pair = (((n.connective.clone() == Connective::Conj) && (n.ident_span.clone() == None)) && ((n.children.clone().len() as i64) == 2)); +if is_pair { + { + let first_child = match n.children.clone().first().cloned() { + Some(c) => if (c.inferred.clone() != None) { + render_node_type(&resolved_type(c.clone()), &target, &shared_types, &source_indices) + } else { + render_node_type(&c, &target, &shared_types, &source_indices) + }, + None => "_".to_string(), +}; +let second_child = match n.children.clone().get(1 as usize).cloned() { + Some(c) => if (c.inferred.clone() != None) { + render_node_type(&resolved_type(c.clone()), &target, &shared_types, &source_indices) + } else { + render_node_type(&c, &target, &shared_types, &source_indices) + }, + None => "_".to_string(), +}; +let tuple_str = render_tuple_parts(&Rc::new(vec![first_child, second_child]), target.clone()); +return tuple_str +} } - } - if (n.ident_span.clone() != None) { - { - let snake = to_snake(tn.clone()); - let has_template = match container_template_algebra(snake.clone()) { - Some(_) => true, - None => false, - }; - if has_template { - { - let base = if (snake.clone().as_str() == "map".to_string().as_str()) +if (n.ident_span.clone() != None) { + { + let snake = to_snake(tn.clone()); +let has_template = match container_template_algebra(snake.clone()) { + Some(_) => true, + None => false, +}; +if has_template { { - emit_map_type("_".to_string(), "_".to_string(), target.clone()) - } else { - emit_container(&snake, "_".to_string(), &target) - }; - let conj_container_str = if shared.clone() { - wrap_shared_type(target.clone(), base.clone()) - } else { - base.clone() - }; - return conj_container_str; + let base = if (snake.clone().as_str() == "map".to_string().as_str()) { + emit_map_type("_".to_string(), "_".to_string(), target.clone()) + } else { + emit_container(&snake, "_".to_string(), &target) + }; +let conj_container_str = if shared.clone() { + wrap_shared_type(target.clone(), base.clone()) + } else { + base.clone() + }; +return conj_container_str +} } - } - let base = coerce_primitive_type(target.clone(), tn.clone()); - let conj_named_str = if shared.clone() { - wrap_shared_type(target.clone(), base.clone()) - } else { - base.clone() - }; - return conj_named_str; - } - } - let parts = Rc::new({ - let mut __result = Vec::new(); - for child in n.children.clone().iter().cloned() { - __result.push(render_node_type( - &resolved_type(child.clone()), - &target, - &shared_types, - &source_indices, - )); +let base = coerce_primitive_type(target.clone(), tn.clone()); +let conj_named_str = if shared.clone() { + wrap_shared_type(target.clone(), base.clone()) + } else { + base.clone() + }; +return conj_named_str +} } - __result - }); - let anon_str = render_tuple_parts(&parts, target.clone()); - return anon_str; +let parts = Rc::new({ let mut __result = Vec::new(); for child in n.children.clone().iter().cloned() { __result.push(render_node_type(&resolved_type(child.clone()), &target, &shared_types, &source_indices)); } __result }); +let anon_str = render_tuple_parts(&parts, target.clone()); +return anon_str +} } - } - if ((n.children.clone().len() as i64) == 0) { - { - let bare_is_map = (is_container_type(tn.clone()) - && (to_snake(tn.clone()).as_str() == "map".to_string().as_str())); - let bare_is_collection = (is_container_type(tn.clone()) && !bare_is_map.clone()); - let has_container_template = match container_template_algebra(to_snake(tn.clone())) +if ((n.children.clone().len() as i64) == 0) { { - Some(_) => true, - None => false, - }; - let param_count = (n.params.clone().len() as i64); - let base = if bare_is_map.clone() { - emit_map_type("_".to_string(), "_".to_string(), target.clone()) - } else { - if bare_is_collection { - emit_container(&to_snake(tn.clone()), "_".to_string(), &target) + let bare_is_map = (is_container_type(tn.clone()) && (to_snake(tn.clone()).as_str() == "map".to_string().as_str())); +let bare_is_collection = (is_container_type(tn.clone()) && !bare_is_map.clone()); +let has_container_template = match container_template_algebra(to_snake(tn.clone())) { + Some(_) => true, + None => false, +}; +let param_count = (n.params.clone().len() as i64); +let base = if bare_is_map.clone() { + emit_map_type("_".to_string(), "_".to_string(), target.clone()) } else { - if (has_container_template && (param_count == 1)) { - { - let inner = match n.params.clone().first().cloned() { - Some(p) => render_node_type( - ¶m_node_type_expr(&p), - &target, - &shared_types, - &source_indices, - ), - None => "_".to_string(), - }; - emit_container(&to_snake(tn.clone()), inner, &target) - } + if bare_is_collection { + emit_container(&to_snake(tn.clone()), "_".to_string(), &target) } else { - if (tn.clone().as_str() == tuple_type_name().as_str()) { - render_tuple_parts(&Rc::new(vec![]), target.clone()) + if (has_container_template && (param_count == 1)) { + { + let inner = match n.params.clone().first().cloned() { + Some(p) => render_node_type(¶m_node_type_expr(&p), &target, &shared_types, &source_indices), + None => "_".to_string(), +}; +emit_container(&to_snake(tn.clone()), inner, &target) +} } else { - coerce_primitive_type(target.clone(), tn.clone()) + if (tn.clone().as_str() == tuple_type_name().as_str()) { + render_tuple_parts(&Rc::new(vec![]), target.clone()) + } else { + coerce_primitive_type(target.clone(), tn.clone()) + } } } - } - }; - let bare_str = if shared.clone() { - wrap_shared_type(target.clone(), base.clone()) - } else { - base.clone() - }; - return bare_str; + }; +let bare_str = if shared.clone() { + wrap_shared_type(target.clone(), base.clone()) + } else { + base.clone() + }; +return bare_str +} } - } - let is_map = node_is_keyed_collection(&n, source_indices.clone()); - if is_map { - { - let k = match n.children.clone().first().cloned() { - Some(kn) => render_node_type( - &child_type_node(&kn), - &target, - &shared_types, - &source_indices, - ), - None => "_".to_string(), - }; - let v = match n.children.clone().get(1 as usize).cloned() { - Some(vn) => render_node_type( - &child_type_node(&vn), - &target, - &shared_types, - &source_indices, - ), - None => "_".to_string(), - }; - let base = emit_map_type(k, v, target.clone()); - let map_str = if shared.clone() { - wrap_shared_type(target.clone(), base.clone()) - } else { - base.clone() - }; - return map_str; +let is_map = node_is_keyed_collection(&n, source_indices.clone()); +if is_map { + { + let k = match n.children.clone().first().cloned() { + Some(kn) => render_node_type(&child_type_node(&kn), &target, &shared_types, &source_indices), + None => "_".to_string(), +}; +let v = match n.children.clone().get(1 as usize).cloned() { + Some(vn) => render_node_type(&child_type_node(&vn), &target, &shared_types, &source_indices), + None => "_".to_string(), +}; +let base = emit_map_type(k, v, target.clone()); +let map_str = if shared.clone() { + wrap_shared_type(target.clone(), base.clone()) + } else { + base.clone() + }; +return map_str +} } - } - if ((n.children.clone().len() as i64) == 1) { - { - let child_str = match n.children.clone().first().cloned() { - Some(child) => render_node_type( - &child_type_node(&child), - &target, - &shared_types, - &source_indices, - ), - None => "_".to_string(), - }; - let is_container = node_is_collection(&n, source_indices.clone()); - let base = if is_container { - emit_container(&to_snake(tn.clone()), child_str, &target) - } else { - { - let type_base = coerce_primitive_type(target.clone(), tn.clone()); - let spec = language_spec(target.clone()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(type_base.clone(), spec.type_arg_open.clone()), - child_str, - ), - spec.type_arg_close.clone(), - ) - } - }; - let single_str = if shared.clone() { - wrap_shared_type(target.clone(), base.clone()) - } else { - base.clone() - }; - return single_str; +if ((n.children.clone().len() as i64) == 1) { + { + let child_str = match n.children.clone().first().cloned() { + Some(child) => render_node_type(&child_type_node(&child), &target, &shared_types, &source_indices), + None => "_".to_string(), +}; +let is_container = node_is_collection(&n, source_indices.clone()); +let base = if is_container { + emit_container(&to_snake(tn.clone()), child_str, &target) + } else { + { + let type_base = coerce_primitive_type(target.clone(), tn.clone()); +let spec = language_spec(target.clone()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(type_base.clone(), spec.type_arg_open.clone()), child_str), spec.type_arg_close.clone()) +} + }; +let single_str = if shared.clone() { + wrap_shared_type(target.clone(), base.clone()) + } else { + base.clone() + }; +return single_str +} } - } - let child_strs = Rc::new({ - let mut __result = Vec::new(); - for c in n.children.clone().iter().cloned() { - __result.push(render_node_type( - &child_type_node(&c), - &target, - &shared_types, - &source_indices, - )); +let child_strs = Rc::new({ let mut __result = Vec::new(); for c in n.children.clone().iter().cloned() { __result.push(render_node_type(&child_type_node(&c), &target, &shared_types, &source_indices)); } __result }); +if (tn.clone().as_str() == tuple_type_name().as_str()) { + { + let multi_tuple_str = render_tuple_parts(&child_strs, target.clone()); +return multi_tuple_str +} } - __result - }); - if (tn.clone().as_str() == tuple_type_name().as_str()) { - { - let multi_tuple_str = render_tuple_parts(&child_strs, target.clone()); - return multi_tuple_str; +let type_base = coerce_primitive_type(target.clone(), tn.clone()); +let args_joined = child_strs.clone().join(&", ".to_string()); +let spec = language_spec(target.clone()); +let base = v2_rt::concat(v2_rt::concat(v2_rt::concat(type_base.clone(), spec.type_arg_open.clone()), args_joined), spec.type_arg_close.clone()); +if shared.clone() { + wrap_shared_type(target.clone(), base.clone()) + } else { + base.clone() } - } - let type_base = coerce_primitive_type(target.clone(), tn.clone()); - let args_joined = child_strs.clone().join(&", ".to_string()); - let spec = language_spec(target.clone()); - let base = v2_rt::concat( - v2_rt::concat( - v2_rt::concat(type_base.clone(), spec.type_arg_open.clone()), - args_joined, - ), - spec.type_arg_close.clone(), - ); - if shared.clone() { - wrap_shared_type(target.clone(), base.clone()) - } else { - base.clone() - } +} }) } pub fn render_tuple_parts(parts: &Rc>, target: RenderTarget) -> String { { let spec = language_spec(target); - let ts = spec.tuple_syntax.clone(); - if ((parts.clone().len() as i64) > 0) { +let ts = spec.tuple_syntax.clone(); +if ((parts.clone().len() as i64) > 0) { if ((parts.clone().len() as i64) == 2) { match parts.clone().first().cloned() { - Some(p0) => match parts.clone().get(1 as usize).cloned() { - Some(p1) => { - apply_type_template2(ts.pair_template.clone(), p0.clone(), p1.clone()) - } - None => apply_type_template1( - ts.multi_template.clone(), - parts.clone().join(&ts.separator.clone()), - ), - }, - None => apply_type_template1( - ts.multi_template.clone(), - parts.clone().join(&ts.separator.clone()), - ), - } + Some(p0) => match parts.clone().get(1 as usize).cloned() { + Some(p1) => apply_type_template2(ts.pair_template.clone(), p0.clone(), p1.clone()), + None => apply_type_template1(ts.multi_template.clone(), parts.clone().join(&ts.separator.clone())), +}, + None => apply_type_template1(ts.multi_template.clone(), parts.clone().join(&ts.separator.clone())), +} } else { - apply_type_template1( - ts.multi_template.clone(), - parts.clone().join(&ts.separator.clone()), - ) + apply_type_template1(ts.multi_template.clone(), parts.clone().join(&ts.separator.clone())) } } else { ts.empty.clone() } - } +} } -pub fn is_type_alias_return_node( - n: Rc, - source_indices: Rc>>, -) -> bool { +pub fn is_type_alias_return_node(n: Rc, source_indices: Rc>>) -> bool { (authored_name_at(source_indices, &n).as_str() != "Unit".to_string().as_str()) } @@ -2211,25 +1168,7 @@ pub fn is_service_item(item: &Rc) -> bool { } pub fn has_service_items(typed: Rc) -> bool { - { - let mut __found = false; - for tm in typed.modules.clone().iter().cloned() { - if { - let mut __found = false; - for item in tm.items.clone().iter().cloned() { - if is_service_item(&item) { - __found = true; - break; - } - } - __found - } { - __found = true; - break; - } - } - __found - } + { let mut __found = false; for tm in typed.modules.clone().iter().cloned() { if { let mut __found = false; for item in tm.items.clone().iter().cloned() { if is_service_item(&item) { __found = true; break; } } __found } { __found = true; break; } } __found } } pub fn service_fallback_transport(item: &Rc) -> Rc { @@ -2242,144 +1181,76 @@ pub fn service_fallback_transport(item: &Rc) -> Rc { pub fn effective_operation_transport(op_node: Rc, fallback: Rc) -> Rc { match op_node.transport.clone() { - Some(op_transport) => op_transport.clone(), - None => fallback, - } + Some(op_transport) => op_transport.clone(), + None => fallback, +} } -pub fn service_has_rest( - fallback_transport: Rc, - op_children: Rc>>, - source_indices: &Rc>>, -) -> bool { +pub fn service_has_rest(fallback_transport: Rc, op_children: Rc>>, source_indices: &Rc>>) -> bool { { let from_fallback = is_rest_transport(fallback_transport, source_indices.clone()); - let from_ops = { - let mut __found = false; - for op in op_children.iter().cloned() { - if if (op.transport.clone() != None) { - is_rest_transport( - op.transport.clone().clone().unwrap(), - source_indices.clone(), - ) - } else { - false - } { - __found = true; - break; - } - } - __found - }; - (from_fallback || from_ops) - } +let from_ops = { let mut __found = false; for op in op_children.iter().cloned() { if if (op.transport.clone() != None) { + is_rest_transport(op.transport.clone().clone().unwrap(), source_indices.clone()) + } else { + false + } { __found = true; break; } } __found }; +(from_fallback || from_ops) +} } pub fn service_has_shell(fallback_transport: Rc, op_children: Rc>>) -> bool { { let from_fallback = is_shell_transport(fallback_transport); - let from_ops = { - let mut __found = false; - for op in op_children.iter().cloned() { - if if (op.transport.clone() != None) { - is_shell_transport(op.transport.clone().clone().unwrap()) - } else { - false - } { - __found = true; - break; - } - } - __found - }; - (from_fallback || from_ops) - } +let from_ops = { let mut __found = false; for op in op_children.iter().cloned() { if if (op.transport.clone() != None) { + is_shell_transport(op.transport.clone().clone().unwrap()) + } else { + false + } { __found = true; break; } } __found }; +(from_fallback || from_ops) +} } -pub fn service_has_file( - fallback_transport: Rc, - op_children: Rc>>, - source_indices: &Rc>>, -) -> bool { +pub fn service_has_file(fallback_transport: Rc, op_children: Rc>>, source_indices: &Rc>>) -> bool { { let from_fallback = is_file_transport(fallback_transport, source_indices.clone()); - let from_ops = { - let mut __found = false; - for op in op_children.iter().cloned() { - if if (op.transport.clone() != None) { - is_file_transport( - op.transport.clone().clone().unwrap(), - source_indices.clone(), - ) - } else { - false - } { - __found = true; - break; - } - } - __found - }; - (from_fallback || from_ops) - } +let from_ops = { let mut __found = false; for op in op_children.iter().cloned() { if if (op.transport.clone() != None) { + is_file_transport(op.transport.clone().clone().unwrap(), source_indices.clone()) + } else { + false + } { __found = true; break; } } __found }; +(from_fallback || from_ops) +} } -pub fn service_has_rest_auth( - fallback_transport: &Rc, - op_children: Rc>>, - source_indices: &Rc>>, -) -> bool { +pub fn service_has_rest_auth(fallback_transport: &Rc, op_children: Rc>>, source_indices: &Rc>>) -> bool { { - let fallback_is_rest = - is_rest_transport(fallback_transport.clone(), source_indices.clone()); - let from_fallback = if fallback_is_rest { + let fallback_is_rest = is_rest_transport(fallback_transport.clone(), source_indices.clone()); +let from_fallback = if fallback_is_rest { transport_has_auth(fallback_transport.clone(), source_indices.clone()) } else { false }; - let from_ops = { - let mut __found = false; - for op in op_children.iter().cloned() { - if if (op.transport.clone() != None) { - { - let t = op.transport.clone().clone().unwrap(); - if is_rest_transport(t.clone(), source_indices.clone()) { - transport_has_auth(t.clone(), source_indices.clone()) - } else { - false - } - } +let from_ops = { let mut __found = false; for op in op_children.iter().cloned() { if if (op.transport.clone() != None) { + { + let t = op.transport.clone().clone().unwrap(); +if is_rest_transport(t.clone(), source_indices.clone()) { + transport_has_auth(t.clone(), source_indices.clone()) } else { false - } { - __found = true; - break; } - } - __found - }; - (from_fallback || from_ops) - } +} + } else { + false + } { __found = true; break; } } __found }; +(from_fallback || from_ops) +} } -pub fn extract_modifier_names( - properties: Rc>>, - source_indices: Rc>>, -) -> Rc> { - Rc::new({ - let mut __result = Vec::new(); - for p in properties.iter().cloned() { - __result.extend( - (*match field_init_operation_modifier(p.clone(), source_indices.clone()) { - Some(modifier) => Rc::new(vec![operation_modifier_name(modifier.clone())]), - None => Rc::new(vec![]), - }) - .iter() - .cloned(), - ); - } - __result - }) +pub fn extract_modifier_names(properties: Rc>>, source_indices: Rc>>) -> Rc> { + Rc::new({ let mut __result = Vec::new(); for p in properties.iter().cloned() { __result.extend((*match field_init_operation_modifier(p.clone(), source_indices.clone()) { + Some(modifier) => Rc::new(vec![operation_modifier_name(modifier.clone())]), + None => Rc::new(vec![]), +}).iter().cloned()); } __result }) } #[derive(Debug, Clone, Copy, PartialEq, serde::Serialize, serde::Deserialize)] @@ -2390,93 +1261,70 @@ pub struct ServiceFieldSet { pub has_auth: bool, } -pub fn compute_service_fields( - fallback_transport: &Rc, - op_children: &Rc>>, - source_indices: &Rc>>, -) -> ServiceFieldSet { +pub fn compute_service_fields(fallback_transport: &Rc, op_children: &Rc>>, source_indices: &Rc>>) -> ServiceFieldSet { ServiceFieldSet { - has_rest: service_has_rest( - fallback_transport.clone(), - op_children.clone(), - &source_indices, - ), - has_shell: service_has_shell(fallback_transport.clone(), op_children.clone()), - has_file: service_has_file( - fallback_transport.clone(), - op_children.clone(), - &source_indices, - ), - has_auth: service_has_rest_auth(&fallback_transport, op_children.clone(), &source_indices), - } + has_rest: service_has_rest(fallback_transport.clone(), op_children.clone(), &source_indices), + has_shell: service_has_shell(fallback_transport.clone(), op_children.clone()), + has_file: service_has_file(fallback_transport.clone(), op_children.clone(), &source_indices), + has_auth: service_has_rest_auth(&fallback_transport, op_children.clone(), &source_indices), +} } pub fn service_field_decls(fs: &ServiceFieldSet, t: &Rc) -> Rc> { { let result = Rc::new(vec![]); - let result = if fs.has_rest.clone() { +let result = if fs.has_rest.clone() { v2_rt::concat(result.clone(), Rc::new(vec![t.rest_decl.clone()])) } else { result.clone() }; - let result = if fs.has_auth.clone() { +let result = if fs.has_auth.clone() { v2_rt::concat(result.clone(), Rc::new(vec![t.auth_decl.clone()])) } else { result.clone() }; - let result = if fs.has_shell.clone() { +let result = if fs.has_shell.clone() { v2_rt::concat(result.clone(), Rc::new(vec![t.shell_decl.clone()])) } else { result.clone() }; - let result = if fs.has_file.clone() { +let result = if fs.has_file.clone() { v2_rt::concat(result.clone(), Rc::new(vec![t.file_decl.clone()])) } else { result.clone() }; - result.clone() - } +result.clone() +} } pub fn service_field_ctors(fs: &ServiceFieldSet, t: &Rc) -> Rc> { { let result = Rc::new(vec![]); - let result = if fs.has_rest.clone() { +let result = if fs.has_rest.clone() { v2_rt::concat(result.clone(), Rc::new(vec![t.rest_ctor.clone()])) } else { result.clone() }; - let result = if fs.has_auth.clone() { +let result = if fs.has_auth.clone() { v2_rt::concat(result.clone(), Rc::new(vec![t.auth_ctor.clone()])) } else { result.clone() }; - let result = if fs.has_shell.clone() { +let result = if fs.has_shell.clone() { v2_rt::concat(result.clone(), Rc::new(vec![t.shell_ctor.clone()])) } else { result.clone() }; - let result = if fs.has_file.clone() { +let result = if fs.has_file.clone() { v2_rt::concat(result.clone(), Rc::new(vec![t.file_ctor.clone()])) } else { result.clone() }; - result.clone() - } +result.clone() +} } -pub fn emit_unified_transport_dispatch( - transport: &Rc, - op_name: String, - source_indices: &Rc>>, - depth: i64, - target: RenderTarget, - render_rest: impl Fn(String, Rc, i64, Rc>>) -> String + Clone, - render_shell: impl Fn(String, Rc, i64, Rc>>) -> String - + Clone, - render_file: impl Fn(String, i64) -> String + Clone, - render_local: impl Fn(String, i64) -> String + Clone, -) -> String { +pub fn emit_unified_transport_dispatch(transport: &Rc, op_name: String, source_indices: &Rc>>, depth: i64, target: RenderTarget, render_rest: impl Fn(String, Rc, i64, Rc>>) -> String + Clone, render_shell: impl Fn(String, Rc, i64, Rc>>) -> String + Clone, render_file: impl Fn(String, i64) -> String + Clone, render_local: impl Fn(String, i64) -> String + Clone) -> String { if is_rest_transport(transport.clone(), source_indices.clone()) { render_rest(op_name, transport.clone(), depth, source_indices.clone()) } else { @@ -2496,167 +1344,56 @@ pub fn emit_unified_transport_dispatch( } } -pub fn emit_unified_operation_method( - service_name: String, - fallback_transport: Rc, - op_node: &Rc, - target: &RenderTarget, - registry: Rc>>, - env: &Rc, - render_transport_body: impl Fn(Rc, String, Rc>>, i64) -> String - + Clone, -) -> String { +pub fn emit_unified_operation_method(service_name: String, fallback_transport: Rc, op_node: &Rc, target: &RenderTarget, registry: Rc>>, env: &Rc, render_transport_body: impl Fn(Rc, String, Rc>>, i64) -> String + Clone) -> String { { let spec = language_spec(target.clone()); - let si = env.source_indices.clone(); - let op_text = authored_name(env.clone(), op_node.clone()); - let params_str = emit_params_shared(op_node.params.clone(), &target, si.clone()); - let sp = service_self_param(spec.clone()); - let all_params = if (sp.clone().as_str() == "".to_string().as_str()) { +let si = env.source_indices.clone(); +let op_text = authored_name(env.clone(), op_node.clone()); +let params_str = emit_params_shared(op_node.params.clone(), &target, si.clone()); +let sp = service_self_param(spec.clone()); +let all_params = if (sp.clone().as_str() == "".to_string().as_str()) { params_str.clone() } else { if (params_str.clone().as_str() == "".to_string().as_str()) { sp.clone() } else { - v2_rt::concat( - v2_rt::concat(sp.clone(), ", ".to_string()), - params_str.clone(), - ) + v2_rt::concat(v2_rt::concat(sp.clone(), ", ".to_string()), params_str.clone()) } }; - let receiver_str = service_receiver_str(spec.clone(), service_name); - let method_depth = service_method_depth(spec.clone()); - let ret_type = emit_node_type(resolved_type(op_node.clone()), target.clone(), si.clone()); - let ret_str = service_return_str(&spec, ret_type); - let method_name = match (*spec.visibility.clone()).clone() { - VisibilitySpec::CaseVisibility { .. } => emit_export_ident(op_text.clone(), &target), - _ => emit_ident(op_text.clone(), target.clone()), - }; - let eff_transport = effective_operation_transport(op_node.clone(), fallback_transport); - let body = render_transport_body( - eff_transport, - op_text.clone(), - si.clone(), - (method_depth.clone() + 1), - ); - let sig = v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - spec.items.clone().async_prefix.clone(), - spec.items.clone().func_keyword.clone(), - ), - " ".to_string(), - ), - receiver_str, - ), - method_name, - ), - "(".to_string(), - ), - all_params, - ), - ")".to_string(), - ), - ret_str, - ); - if spec.block_syntax.clone().significant_whitespace.clone() { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(sig, spec.block_syntax.clone().block_open.clone()), - make_indent((method_depth.clone() + 1)), - ), - body, - ) +let receiver_str = service_receiver_str(spec.clone(), service_name); +let method_depth = service_method_depth(spec.clone()); +let ret_type = emit_node_type(resolved_type(op_node.clone()), target.clone(), si.clone()); +let ret_str = service_return_str(&spec, ret_type); +let method_name = match (*spec.visibility.clone()).clone() { + VisibilitySpec::CaseVisibility { .. } => emit_export_ident(op_text.clone(), &target), + _ => emit_ident(op_text.clone(), target.clone()), +}; +let eff_transport = effective_operation_transport(op_node.clone(), fallback_transport); +let body = render_transport_body(eff_transport, op_text.clone(), si.clone(), (method_depth.clone() + 1)); +let sig = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(spec.items.clone().async_prefix.clone(), spec.items.clone().func_keyword.clone()), " ".to_string()), receiver_str), method_name), "(".to_string()), all_params), ")".to_string()), ret_str); +if spec.block_syntax.clone().significant_whitespace.clone() { + v2_rt::concat(v2_rt::concat(v2_rt::concat(sig, spec.block_syntax.clone().block_open.clone()), make_indent((method_depth.clone() + 1))), body) } else { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(sig, spec.block_syntax.clone().block_open.clone()), - body, - ), - "\n".to_string(), - ), - make_indent(method_depth.clone()), - ), - spec.block_syntax.clone().block_close.clone(), - ) + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(sig, spec.block_syntax.clone().block_open.clone()), body), "\n".to_string()), make_indent(method_depth.clone())), spec.block_syntax.clone().block_close.clone()) } - } +} } -pub fn emit_unified_service_def( - item: &Rc, - target: &RenderTarget, - registry: Rc>>, - env: &Rc, - render_service_fields: impl Fn(String, Rc, Rc>>, Rc>>) -> String - + Clone, - render_transport_body: impl Fn(Rc, String, Rc>>, i64) -> String - + Clone, -) -> String { +pub fn emit_unified_service_def(item: &Rc, target: &RenderTarget, registry: Rc>>, env: &Rc, render_service_fields: impl Fn(String, Rc, Rc>>, Rc>>) -> String + Clone, render_transport_body: impl Fn(Rc, String, Rc>>, i64) -> String + Clone) -> String { { let spec = language_spec(target.clone()); - let safe_name = sanitize_service_name(authored_name(env.clone(), item.clone())); - let transport = service_fallback_transport(&item); - let op_children = item.children.clone(); - let fields_str = render_service_fields( - safe_name.clone(), - transport.clone(), - op_children.clone(), - env.source_indices.clone(), - ); - let methods = Rc::new({ - let mut __result = Vec::new(); - for op_node in op_children.clone().iter().cloned() { - __result.push(emit_unified_operation_method( - safe_name.clone(), - transport.clone(), - &op_node, - &target, - registry.clone(), - &env, - render_transport_body.clone(), - )); - } - __result - }); - let methods_str = methods.join(&"\n\n".to_string()); - if service_methods_inside_class(spec.clone()) { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - spec.items.clone().struct_keyword.clone(), - " ".to_string(), - ), - safe_name.clone(), - ), - ":\n".to_string(), - ), - make_indent(1), - ), - fields_str, - ), - "\n\n".to_string(), - ), - make_indent(1), - ), - methods_str, - ) +let safe_name = sanitize_service_name(authored_name(env.clone(), item.clone())); +let transport = service_fallback_transport(&item); +let op_children = item.children.clone(); +let fields_str = render_service_fields(safe_name.clone(), transport.clone(), op_children.clone(), env.source_indices.clone()); +let methods = Rc::new({ let mut __result = Vec::new(); for op_node in op_children.clone().iter().cloned() { __result.push(emit_unified_operation_method(safe_name.clone(), transport.clone(), &op_node, &target, registry.clone(), &env, render_transport_body.clone())); } __result }); +let methods_str = methods.join(&"\n\n".to_string()); +if service_methods_inside_class(spec.clone()) { + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(spec.items.clone().struct_keyword.clone(), " ".to_string()), safe_name.clone()), ":\n".to_string()), make_indent(1)), fields_str), "\n\n".to_string()), make_indent(1)), methods_str) } else { v2_rt::concat(v2_rt::concat(fields_str, "\n\n".to_string()), methods_str) } - } +} } pub fn is_type_def_item(item: &Rc) -> bool { @@ -2664,29 +1401,15 @@ pub fn is_type_def_item(item: &Rc) -> bool { } pub fn is_bare_leaf_item(item: &Rc) -> bool { - (((((item.connective.clone() == Connective::NoConnective) && (item.body.clone() == None)) - && ((item.params.clone().len() as i64) == 0)) - && (item.transport.clone() == None)) - && ((item.children.clone().len() as i64) == 0)) + (((((item.connective.clone() == Connective::NoConnective) && (item.body.clone() == None)) && ((item.params.clone().len() as i64) == 0)) && (item.transport.clone() == None)) && ((item.children.clone().len() as i64) == 0)) } -pub fn is_type_alias_item( - item: &Rc, - source_indices: Rc>>, -) -> bool { - (is_bare_leaf_item(&item) - && is_type_alias_return_node(resolved_type(item.clone()), source_indices)) +pub fn is_type_alias_item(item: &Rc, source_indices: Rc>>) -> bool { + (is_bare_leaf_item(&item) && is_type_alias_return_node(resolved_type(item.clone()), source_indices)) } -pub fn is_type_decl_item( - item: &Rc, - source_indices: Rc>>, -) -> bool { - ((is_bare_leaf_item(&item) - && !is_type_alias_return_node(resolved_type(item.clone()), source_indices)) - || (((((item.params.clone().len() as i64) > 0) && (item.body.clone() == None)) - && (item.transport.clone() == None)) - && ((item.children.clone().len() as i64) == 0))) +pub fn is_type_decl_item(item: &Rc, source_indices: Rc>>) -> bool { + ((is_bare_leaf_item(&item) && !is_type_alias_return_node(resolved_type(item.clone()), source_indices)) || (((((item.params.clone().len() as i64) > 0) && (item.body.clone() == None)) && (item.transport.clone() == None)) && ((item.children.clone().len() as i64) == 0))) } pub fn is_function_item(item: &Rc) -> bool { @@ -2702,10 +1425,7 @@ pub fn is_service_def_item(item: &Rc) -> bool { } pub fn is_resource_def_item(item: &Rc) -> bool { - (((item.transport.clone() == None) && ((item.children.clone().len() as i64) > 0)) - || ((((item.transport.clone() == None) && ((item.children.clone().len() as i64) == 0)) - && ((item.properties.clone().len() as i64) > 0)) - && (item.body.clone() == None))) + (((item.transport.clone() == None) && ((item.children.clone().len() as i64) > 0)) || ((((item.transport.clone() == None) && ((item.children.clone().len() as i64) == 0)) && ((item.properties.clone().len() as i64) > 0)) && (item.body.clone() == None))) } #[derive(Debug, Clone, Copy, PartialEq, serde::Serialize, serde::Deserialize)] @@ -2721,30 +1441,30 @@ pub enum ExprCategory { pub fn classify_expr(texpr: Rc) -> ExprCategory { match (*texpr.expr_data.clone()).clone() { - ExprData::ExprLiteral { .. } => ExprCategory::ExprCatLeaf, - ExprData::ExprError { .. } => ExprCategory::ExprCatLeaf, - ExprData::ExprVar { .. } => ExprCategory::ExprCatLeaf, - ExprData::ExprFieldAccess { .. } => ExprCategory::ExprCatCompound, - ExprData::ExprCall { .. } => ExprCategory::ExprCatCompound, - ExprData::ExprMethodCall { .. } => ExprCategory::ExprCatCompound, - ExprData::ExprRecordLit { .. } => ExprCategory::ExprCatCompound, - ExprData::ExprListLit => ExprCategory::ExprCatCompound, - ExprData::ExprBinOp { .. } => ExprCategory::ExprCatCompound, - ExprData::ExprUnaryOp { .. } => ExprCategory::ExprCatCompound, - ExprData::ExprLambda => ExprCategory::ExprCatCompound, - ExprData::ExprStringInterp => ExprCategory::ExprCatCompound, - ExprData::ExprCast => ExprCategory::ExprCatCompound, - ExprData::ExprIndex => ExprCategory::ExprCatCompound, - ExprData::ExprSlice => ExprCategory::ExprCatCompound, - ExprData::ExprMatch => ExprCategory::ExprCatControlFlow, - ExprData::ExprIf => ExprCategory::ExprCatControlFlow, - ExprData::ExprForEach => ExprCategory::ExprCatControlFlow, - ExprData::ExprBlock => ExprCategory::ExprCatControlFlow, - ExprData::ExprLet => ExprCategory::ExprCatBinding, - ExprData::ExprReturn => ExprCategory::ExprCatControlFlow, - ExprData::NoExprData => ExprCategory::ExprCatNone, - _ => ExprCategory::ExprCatNone, - } + ExprData::ExprLiteral { .. } => ExprCategory::ExprCatLeaf, + ExprData::ExprError { .. } => ExprCategory::ExprCatLeaf, + ExprData::ExprVar { .. } => ExprCategory::ExprCatLeaf, + ExprData::ExprFieldAccess { .. } => ExprCategory::ExprCatCompound, + ExprData::ExprCall { .. } => ExprCategory::ExprCatCompound, + ExprData::ExprMethodCall { .. } => ExprCategory::ExprCatCompound, + ExprData::ExprRecordLit { .. } => ExprCategory::ExprCatCompound, + ExprData::ExprListLit => ExprCategory::ExprCatCompound, + ExprData::ExprBinOp { .. } => ExprCategory::ExprCatCompound, + ExprData::ExprUnaryOp { .. } => ExprCategory::ExprCatCompound, + ExprData::ExprLambda => ExprCategory::ExprCatCompound, + ExprData::ExprStringInterp => ExprCategory::ExprCatCompound, + ExprData::ExprCast => ExprCategory::ExprCatCompound, + ExprData::ExprIndex => ExprCategory::ExprCatCompound, + ExprData::ExprSlice => ExprCategory::ExprCatCompound, + ExprData::ExprMatch => ExprCategory::ExprCatControlFlow, + ExprData::ExprIf => ExprCategory::ExprCatControlFlow, + ExprData::ExprForEach => ExprCategory::ExprCatControlFlow, + ExprData::ExprBlock => ExprCategory::ExprCatControlFlow, + ExprData::ExprLet => ExprCategory::ExprCatBinding, + ExprData::ExprReturn => ExprCategory::ExprCatControlFlow, + ExprData::NoExprData => ExprCategory::ExprCatNone, + _ => ExprCategory::ExprCatNone, +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -2763,26 +1483,25 @@ pub enum FuncBodyShape { }, } -pub fn classify_func_body( - body: &Rc, - source_indices: Rc>>, -) -> Rc { +pub fn classify_func_body(body: &Rc, source_indices: Rc>>) -> Rc { match (*body.expr_data.clone()).clone() { - ExprData::ExprLet => { - let n = let_binding_name_at(body.clone(), source_indices); - let v = let_value(body.clone()); - let rest = let_body(body.clone()); - Rc::new(FuncBodyShape::FuncBodyLet { - name: n, - value: v, - rest: rest, - }) - } - ExprData::ExprBlock => Rc::new(FuncBodyShape::FuncBodyBlock { - stmts: body.children.clone(), - }), - _ => Rc::new(FuncBodyShape::FuncBodyExpr { expr: body.clone() }), - } + ExprData::ExprLet => { + let n = let_binding_name_at(body.clone(), source_indices); +let v = let_value(body.clone()); +let rest = let_body(body.clone()); +Rc::new(FuncBodyShape::FuncBodyLet { + name: n, + value: v, + rest: rest, +}) +}, + ExprData::ExprBlock => Rc::new(FuncBodyShape::FuncBodyBlock { + stmts: body.children.clone(), +}), + _ => Rc::new(FuncBodyShape::FuncBodyExpr { + expr: body.clone(), +}), +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -2814,1258 +1533,446 @@ pub enum TcoExprShape { }, } -pub fn classify_tco_expr( - texpr: &Rc, - source_indices: Rc>>, -) -> Rc { +pub fn classify_tco_expr(texpr: &Rc, source_indices: Rc>>) -> Rc { match (*texpr.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => Rc::new(TcoExprShape::TcoCall { - func: expr_call_func_at(texpr.clone(), source_indices), - args: texpr.children.clone(), - }), - ExprData::ExprIf => { - let c = if_condition(texpr.clone()); - let t = if_then_branch(texpr.clone()); - let e = if_else_branch(texpr.clone()); - Rc::new(TcoExprShape::TcoIf { - condition: c, - then_branch: t, - else_branch: e, - }) - } - ExprData::ExprMatch => { - let scrut = match_scrutinee(texpr.clone()); - let arm_list = match_arm_nodes(texpr.clone()); - Rc::new(TcoExprShape::TcoMatch { - scrutinee: scrut, - arms: arm_list, - }) - } - ExprData::ExprLet => { - let n = let_binding_name_at(texpr.clone(), source_indices); - let v = let_value(texpr.clone()); - let bd = let_body(texpr.clone()); - Rc::new(TcoExprShape::TcoLet { - name: n, - value: v, - body: bd, - }) - } - ExprData::ExprBlock => Rc::new(TcoExprShape::TcoBlock { - stmts: texpr.children.clone(), - }), - _ => Rc::new(TcoExprShape::TcoOther { - expr: texpr.clone(), - }), - } + ExprData::ExprCall { .. } => Rc::new(TcoExprShape::TcoCall { + func: expr_call_func_at(texpr.clone(), source_indices), + args: texpr.children.clone(), +}), + ExprData::ExprIf => { + let c = if_condition(texpr.clone()); +let t = if_then_branch(texpr.clone()); +let e = if_else_branch(texpr.clone()); +Rc::new(TcoExprShape::TcoIf { + condition: c, + then_branch: t, + else_branch: e, +}) +}, + ExprData::ExprMatch => { + let scrut = match_scrutinee(texpr.clone()); +let arm_list = match_arm_nodes(texpr.clone()); +Rc::new(TcoExprShape::TcoMatch { + scrutinee: scrut, + arms: arm_list, +}) +}, + ExprData::ExprLet => { + let n = let_binding_name_at(texpr.clone(), source_indices); +let v = let_value(texpr.clone()); +let bd = let_body(texpr.clone()); +Rc::new(TcoExprShape::TcoLet { + name: n, + value: v, + body: bd, +}) +}, + ExprData::ExprBlock => Rc::new(TcoExprShape::TcoBlock { + stmts: texpr.children.clone(), +}), + _ => Rc::new(TcoExprShape::TcoOther { + expr: texpr.clone(), +}), +} } pub fn block_stmts_init(stmts: &Rc>>) -> Rc>> { if ((stmts.clone().len() as i64) <= 1) { Rc::new(vec![]) } else { - Rc::new( - stmts - .clone() - .iter() - .cloned() - .take(((stmts.clone().len() as i64) - 1) as usize) - .collect::>(), - ) + Rc::new(stmts.clone().iter().cloned().take(((stmts.clone().len() as i64) - 1) as usize).collect::>()) } } -pub fn is_tco_eligible( - name: &String, - body: &Rc, - registry: Rc>>, - source_indices: &Rc>>, -) -> bool { +pub fn is_tco_eligible(name: &String, body: &Rc, registry: Rc>>, source_indices: &Rc>>) -> bool { match lookup_item(registry, name.clone()) { - Some(info) => { - (info.is_self_recursive.clone() && (info.has_non_tail_self_call.clone() == false)) - } - None => { - (expr_has_self_call(&body, &name, &source_indices) - && (expr_has_non_tail_self_call(&body, &name, true, &source_indices) == false)) - } - } + Some(info) => (info.is_self_recursive.clone() && (info.has_non_tail_self_call.clone() == false)), + None => (expr_has_self_call(&body, &name, &source_indices) && (expr_has_non_tail_self_call(&body, &name, true, &source_indices) == false)), +} } -pub fn is_self_recursive( - name: &String, - body: Rc, - registry: Rc>>, - source_indices: Rc>>, -) -> bool { +pub fn is_self_recursive(name: &String, body: Rc, registry: Rc>>, source_indices: Rc>>) -> bool { match lookup_item(registry, name.clone()) { - Some(info) => info.is_self_recursive.clone(), - None => expr_has_self_call(&body, &name, &source_indices), - } + Some(info) => info.is_self_recursive.clone(), + None => expr_has_self_call(&body, &name, &source_indices), +} } -pub fn tco_reassign_core( - ordered_args: Rc>, - param_names: Rc>, - temp_var_prefix: String, - temp_decl_prefix: String, - temp_assign_op: String, - stmt_terminator: String, - continue_str: String, - line_prefix: &String, -) -> Rc> { +pub fn tco_reassign_core(ordered_args: Rc>, param_names: Rc>, temp_var_prefix: String, temp_decl_prefix: String, temp_assign_op: String, stmt_terminator: String, continue_str: String, line_prefix: &String) -> Rc> { { - let temp_lets = Rc::new({ - let mut __result = Vec::new(); - for pair in Rc::new( - ordered_args - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - { - __result.push(v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(line_prefix.clone(), temp_decl_prefix.clone()), - temp_var_prefix.clone(), - ), - (pair.0.clone()).to_string(), - ), - temp_assign_op.clone(), - ), - pair.1.clone(), - ), - stmt_terminator.clone(), - )); - } - __result - }); - let assigns = Rc::new({ - let mut __result = Vec::new(); - for pair in Rc::new( - param_names - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - { - __result.push(v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(line_prefix.clone(), pair.1.clone()), - " = ".to_string(), - ), - temp_var_prefix.clone(), - ), - (pair.0.clone()).to_string(), - ), - stmt_terminator.clone(), - )); - } - __result - }); - v2_rt::concat( - v2_rt::concat(temp_lets, assigns), - Rc::new(vec![v2_rt::concat(line_prefix.clone(), continue_str)]), - ) - } + let temp_lets = Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(ordered_args.iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(line_prefix.clone(), temp_decl_prefix.clone()), temp_var_prefix.clone()), (pair.0.clone()).to_string()), temp_assign_op.clone()), pair.1.clone()), stmt_terminator.clone())); } __result }); +let assigns = Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(param_names.iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(line_prefix.clone(), pair.1.clone()), " = ".to_string()), temp_var_prefix.clone()), (pair.0.clone()).to_string()), stmt_terminator.clone())); } __result }); +v2_rt::concat(v2_rt::concat(temp_lets, assigns), Rc::new(vec![v2_rt::concat(line_prefix.clone(), continue_str)])) +} } -pub fn emit_shared_tco_expr( - mut frame: Rc, - mut fn_name: String, - mut emit_self_call_reassign: impl Fn(Rc) -> String + Clone, - mut emit_non_self_call: impl Fn(Rc) -> String + Clone, - mut emit_if: impl Fn(Rc) -> String + Clone, - mut emit_match: impl Fn(Rc) -> String + Clone, - mut emit_let: impl Fn(Rc) -> String + Clone, - mut emit_block: impl Fn(Rc) -> String + Clone, - mut emit_default_return: impl Fn(Rc) -> String + Clone, -) -> String { +pub fn emit_shared_tco_expr(mut frame: Rc, mut fn_name: String, mut emit_self_call_reassign: impl Fn(Rc) -> String + Clone, mut emit_non_self_call: impl Fn(Rc) -> String + Clone, mut emit_if: impl Fn(Rc) -> String + Clone, mut emit_match: impl Fn(Rc) -> String + Clone, mut emit_let: impl Fn(Rc) -> String + Clone, mut emit_block: impl Fn(Rc) -> String + Clone, mut emit_default_return: impl Fn(Rc) -> String + Clone) -> String { loop { let si = frame.scope.clone().type_env.clone().source_indices.clone(); - match (*frame.expr.clone().expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { - if (expr_call_func_at(frame.expr.clone(), si).as_str() == fn_name.as_str()) { - break emit_self_call_reassign(Rc::new(TcoReassignInput { - args: frame.expr.clone().children.clone(), - scope: frame.scope.clone(), - depth: frame.depth.clone(), - })); - } else { - break emit_non_self_call(frame.clone()); - } - } - ExprData::ExprReturn => { - let inner = return_value(frame.expr.clone()); - { - let __tco_0 = Rc::new(TcoFrame { - expr: inner, - scope: frame.scope.clone(), - depth: frame.depth.clone(), - }); - frame = __tco_0; - continue; - } - } - ExprData::ExprIf => { - break emit_if(frame.clone()); - } - ExprData::ExprMatch => { - break emit_match(frame.clone()); - } - ExprData::ExprLet => { - break emit_let(frame.clone()); - } - ExprData::ExprBlock => { - break emit_block(frame.clone()); - } - _ => { - break emit_default_return(frame.clone()); - } - } - } +match (*frame.expr.clone().expr_data.clone()).clone() { + ExprData::ExprCall { .. } => { if (expr_call_func_at(frame.expr.clone(), si).as_str() == fn_name.as_str()) { + break emit_self_call_reassign(Rc::new(TcoReassignInput { + args: frame.expr.clone().children.clone(), + scope: frame.scope.clone(), + depth: frame.depth.clone(), +})); +} else { + break emit_non_self_call(frame.clone()); +} }, + ExprData::ExprReturn => { let inner = return_value(frame.expr.clone()); +{ + let __tco_0 = Rc::new(TcoFrame { + expr: inner, + scope: frame.scope.clone(), + depth: frame.depth.clone(), +}); +frame = __tco_0; +continue; +} }, + ExprData::ExprIf => { break emit_if(frame.clone()); }, + ExprData::ExprMatch => { break emit_match(frame.clone()); }, + ExprData::ExprLet => { break emit_let(frame.clone()); }, + ExprData::ExprBlock => { break emit_block(frame.clone()); }, + _ => { break emit_default_return(frame.clone()); }, +} +} } pub fn shared_tco_body(inner: String, depth: i64, spec: &Rc) -> String { { let syntax = spec.block_syntax.clone(); - let tco = spec.tco.clone(); - if syntax.significant_whitespace.clone() { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(tco.loop_keyword.clone(), syntax.block_open.clone()), - make_indent((depth + 1)), - ), - inner, - ) +let tco = spec.tco.clone(); +if syntax.significant_whitespace.clone() { + v2_rt::concat(v2_rt::concat(v2_rt::concat(tco.loop_keyword.clone(), syntax.block_open.clone()), make_indent((depth + 1))), inner) } else { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(tco.loop_keyword.clone(), syntax.block_open.clone()), - make_indent((depth + 1)), - ), - inner, - ), - "\n".to_string(), - ), - syntax.block_close.clone(), - ) + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(tco.loop_keyword.clone(), syntax.block_open.clone()), make_indent((depth + 1))), inner), "\n".to_string()), syntax.block_close.clone()) } - } +} } -pub fn shared_tco_default_return( - frame: &Rc, - spec: Rc, - recurse_expr: impl Fn(Rc, Rc, i64) -> String + Clone, -) -> String { +pub fn shared_tco_default_return(frame: &Rc, spec: Rc, recurse_expr: impl Fn(Rc, Rc, i64) -> String + Clone) -> String { { let val_str = recurse_expr(frame.expr.clone(), frame.scope.clone(), frame.depth.clone()); - v2_rt::concat( - v2_rt::concat(spec.tco.clone().break_return.clone(), " ".to_string()), - val_str, - ) - } +v2_rt::concat(v2_rt::concat(spec.tco.clone().break_return.clone(), " ".to_string()), val_str) +} } -pub fn shared_tco_non_self_call( - frame: &Rc, - target: RenderTarget, - spec: Rc, - recurse_call: impl Fn(String, Rc>>, Rc, i64) -> String + Clone, -) -> String { +pub fn shared_tco_non_self_call(frame: &Rc, target: RenderTarget, spec: Rc, recurse_call: impl Fn(String, Rc>>, Rc, i64) -> String + Clone) -> String { match (*frame.expr.clone().expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { - let f = expr_call_func_at( - frame.expr.clone(), - frame.scope.clone().type_env.clone().source_indices.clone(), - ); - let call_str = recurse_call( - f, - frame.expr.clone().children.clone(), - frame.scope.clone(), - frame.depth.clone(), - ); - v2_rt::concat( - v2_rt::concat(spec.tco.clone().break_return.clone(), " ".to_string()), - call_str, - ) - } - _ => emit_error_expr( - "shared_tco_non_self_call expected ExprCall".to_string(), - target, - ), - } + ExprData::ExprCall { .. } => { + let f = expr_call_func_at(frame.expr.clone(), frame.scope.clone().type_env.clone().source_indices.clone()); +let call_str = recurse_call(f, frame.expr.clone().children.clone(), frame.scope.clone(), frame.depth.clone()); +v2_rt::concat(v2_rt::concat(spec.tco.clone().break_return.clone(), " ".to_string()), call_str) +}, + _ => emit_error_expr("shared_tco_non_self_call expected ExprCall".to_string(), target), +} } -pub fn shared_tco_if( - frame: &Rc, - fn_name: String, - params: Rc>>, - target: RenderTarget, - spec: Rc, - recurse_expr: impl Fn(Rc, Rc, i64) -> String + Clone, - recurse_tco: impl Fn(Rc, Rc, i64) -> String + Clone, -) -> String { +pub fn shared_tco_if(frame: &Rc, fn_name: String, params: Rc>>, target: RenderTarget, spec: Rc, recurse_expr: impl Fn(Rc, Rc, i64) -> String + Clone, recurse_tco: impl Fn(Rc, Rc, i64) -> String + Clone) -> String { { let syntax = spec.block_syntax.clone(); - match (*frame.expr.clone().expr_data.clone()).clone() { - ExprData::ExprIf => { - let c = if_condition(frame.expr.clone()); - let t = if_then_branch(frame.expr.clone()); - let e = if_else_branch(frame.expr.clone()); - let cond_str = recurse_expr(c, frame.scope.clone(), frame.depth.clone()); - let then_str = recurse_tco(t, frame.scope.clone(), (frame.depth.clone() + 1)); - let else_prefix = if syntax.significant_whitespace.clone() { - make_indent(frame.depth.clone()) +match (*frame.expr.clone().expr_data.clone()).clone() { + ExprData::ExprIf => { + let c = if_condition(frame.expr.clone()); +let t = if_then_branch(frame.expr.clone()); +let e = if_else_branch(frame.expr.clone()); +let cond_str = recurse_expr(c, frame.scope.clone(), frame.depth.clone()); +let then_str = recurse_tco(t, frame.scope.clone(), (frame.depth.clone() + 1)); +let else_prefix = if syntax.significant_whitespace.clone() { + make_indent(frame.depth.clone()) + } else { + "".to_string() + }; +match e { + Some(eb) => { + let else_str = recurse_tco(eb.clone(), frame.scope.clone(), (frame.depth.clone() + 1)); +if syntax.significant_whitespace.clone() { + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("if ".to_string(), cond_str), syntax.block_open.clone()), make_indent((frame.depth.clone() + 1))), then_str), "\n".to_string()), else_prefix), syntax.else_clause.clone()), make_indent((frame.depth.clone() + 1))), else_str) } else { - "".to_string() - }; - match e { - Some(eb) => { - let else_str = - recurse_tco(eb.clone(), frame.scope.clone(), (frame.depth.clone() + 1)); - if syntax.significant_whitespace.clone() { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "if ".to_string(), - cond_str, - ), - syntax.block_open.clone(), - ), - make_indent((frame.depth.clone() + 1)), - ), - then_str, - ), - "\n".to_string(), - ), - else_prefix, - ), - syntax.else_clause.clone(), - ), - make_indent((frame.depth.clone() + 1)), - ), - else_str, - ) - } else { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "if ".to_string(), - cond_str, - ), - syntax.block_open.clone(), - ), - make_indent((frame.depth.clone() + 1)), - ), - then_str, - ), - "\n".to_string(), - ), - syntax.else_clause.clone(), - ), - make_indent((frame.depth.clone() + 1)), - ), - else_str, - ), - "\n".to_string(), - ), - syntax.block_close.clone(), - ) - } - } - None => { - if syntax.significant_whitespace.clone() { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("if ".to_string(), cond_str), - syntax.block_open.clone(), - ), - make_indent((frame.depth.clone() + 1)), - ), - then_str, - ) - } else { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("if ".to_string(), cond_str), - syntax.block_open.clone(), - ), - make_indent((frame.depth.clone() + 1)), - ), - then_str, - ), - "\n".to_string(), - ), - syntax.block_close.clone(), - ) - } - } + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("if ".to_string(), cond_str), syntax.block_open.clone()), make_indent((frame.depth.clone() + 1))), then_str), "\n".to_string()), syntax.else_clause.clone()), make_indent((frame.depth.clone() + 1))), else_str), "\n".to_string()), syntax.block_close.clone()) } - } - _ => emit_error_expr("shared_tco_if expected ExprIf".to_string(), target), - } - } +}, + None => if syntax.significant_whitespace.clone() { + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("if ".to_string(), cond_str), syntax.block_open.clone()), make_indent((frame.depth.clone() + 1))), then_str) + } else { + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("if ".to_string(), cond_str), syntax.block_open.clone()), make_indent((frame.depth.clone() + 1))), then_str), "\n".to_string()), syntax.block_close.clone()) + }, +} +}, + _ => emit_error_expr("shared_tco_if expected ExprIf".to_string(), target), +} +} } -pub fn shared_tco_let( - frame: &Rc, - fn_name: String, - params: Rc>>, - target: RenderTarget, - recurse_expr: impl Fn(Rc, Rc, i64) -> String + Clone, - recurse_tco: impl Fn(Rc, Rc, i64) -> String + Clone, -) -> String { +pub fn shared_tco_let(frame: &Rc, fn_name: String, params: Rc>>, target: RenderTarget, recurse_expr: impl Fn(Rc, Rc, i64) -> String + Clone, recurse_tco: impl Fn(Rc, Rc, i64) -> String + Clone) -> String { match (*frame.expr.clone().expr_data.clone()).clone() { - ExprData::ExprLet => { - let n = let_binding_name_at( - frame.expr.clone(), - frame.scope.clone().type_env.clone().source_indices.clone(), - ); - let v = let_value(frame.expr.clone()); - let bd = let_body(frame.expr.clone()); - let val_str = recurse_expr(v.clone(), frame.scope.clone(), frame.depth.clone()); - let let_line = emit_let_binding(n.clone(), val_str, &target); - let next_scope = extend_scope( - &frame.scope.clone(), - &n, - resolved_type(v.clone()), - Rc::new(SubValueRelation::SubValueUnknown), - ); - match bd { - Some(b) => v2_rt::concat( - v2_rt::concat(let_line, "\n".to_string()), - recurse_tco(b.clone(), next_scope, frame.depth.clone()), - ), - None => let_line, - } - } - _ => emit_error_expr("shared_tco_let expected ExprLet".to_string(), target), - } + ExprData::ExprLet => { + let n = let_binding_name_at(frame.expr.clone(), frame.scope.clone().type_env.clone().source_indices.clone()); +let v = let_value(frame.expr.clone()); +let bd = let_body(frame.expr.clone()); +let val_str = recurse_expr(v.clone(), frame.scope.clone(), frame.depth.clone()); +let let_line = emit_let_binding(n.clone(), val_str, &target); +let next_scope = extend_scope(&frame.scope.clone(), &n, resolved_type(v.clone()), Rc::new(SubValueRelation::SubValueUnknown)); +match bd { + Some(b) => v2_rt::concat(v2_rt::concat(let_line, "\n".to_string()), recurse_tco(b.clone(), next_scope, frame.depth.clone())), + None => let_line, +} +}, + _ => emit_error_expr("shared_tco_let expected ExprLet".to_string(), target), +} } -pub fn shared_tco_block( - frame: &Rc, - fn_name: String, - params: Rc>>, - target: RenderTarget, - spec: Rc, - emit_init_stmts: impl Fn(Rc>>, Rc, i64) -> Rc + Clone, - recurse_tco: impl Fn(Rc, Rc, i64) -> String + Clone, -) -> String { +pub fn shared_tco_block(frame: &Rc, fn_name: String, params: Rc>>, target: RenderTarget, spec: Rc, emit_init_stmts: impl Fn(Rc>>, Rc, i64) -> Rc + Clone, recurse_tco: impl Fn(Rc, Rc, i64) -> String + Clone) -> String { match (*frame.expr.clone().expr_data.clone()).clone() { - ExprData::ExprBlock => { - let ss = frame.expr.clone().children.clone(); - if ((ss.clone().len() as i64) == 0) { - spec.tco.clone().break_return.clone() - } else { - { - let init_state = - emit_init_stmts(ss.clone(), frame.scope.clone(), frame.depth.clone()); - let last_str = match ss.clone().last().cloned() { - Some(last_expr) => recurse_tco( - last_expr.clone(), - init_state.scope.clone(), - frame.depth.clone(), - ), - None => spec.tco.clone().break_return.clone(), - }; - if ((init_state.text.clone().len() as i64) == 0) { - last_str - } else { - v2_rt::concat( - v2_rt::concat( - init_state.text.clone().join(&"\n".to_string()), - "\n".to_string(), - ), - last_str, - ) - } + ExprData::ExprBlock => { + let ss = frame.expr.clone().children.clone(); +if ((ss.clone().len() as i64) == 0) { + spec.tco.clone().break_return.clone() + } else { + { + let init_state = emit_init_stmts(ss.clone(), frame.scope.clone(), frame.depth.clone()); +let last_str = match ss.clone().last().cloned() { + Some(last_expr) => recurse_tco(last_expr.clone(), init_state.scope.clone(), frame.depth.clone()), + None => spec.tco.clone().break_return.clone(), +}; +if ((init_state.text.clone().len() as i64) == 0) { + last_str + } else { + v2_rt::concat(v2_rt::concat(init_state.text.clone().join(&"\n".to_string()), "\n".to_string()), last_str) } - } +} } - _ => emit_error_expr("shared_tco_block expected ExprBlock".to_string(), target), - } +}, + _ => emit_error_expr("shared_tco_block expected ExprBlock".to_string(), target), +} } -pub fn shared_tco_reassign( - ordered_args: Rc>, - param_names: Rc>, - spec: &Rc, -) -> String { +pub fn shared_tco_reassign(ordered_args: Rc>, param_names: Rc>, spec: &Rc) -> String { { - let all_lines = tco_reassign_core( - ordered_args, - param_names, - spec.tco.clone().temp_var_prefix.clone(), - spec.tco.clone().temp_decl_prefix.clone(), - spec.tco.clone().temp_assign_op.clone(), - spec.block_syntax.clone().stmt_terminator.clone(), - spec.tco.clone().continue_str.clone(), - &"".to_string(), - ); - all_lines.join(&"\n".to_string()) - } + let all_lines = tco_reassign_core(ordered_args, param_names, spec.tco.clone().temp_var_prefix.clone(), spec.tco.clone().temp_decl_prefix.clone(), spec.tco.clone().temp_assign_op.clone(), spec.block_syntax.clone().stmt_terminator.clone(), spec.tco.clone().continue_str.clone(), &"".to_string()); +all_lines.join(&"\n".to_string()) +} +} + +pub fn unified_tco_recurse(expr: Rc, scope: Rc, depth: i64, fn_name: String, params: Rc>>, target: RenderTarget, registry: Rc>>, recurse_expr: impl Fn(Rc, Rc, i64) -> String + Clone, render_match: impl Fn(Rc) -> String + Clone, render_init_stmts: impl Fn(Rc>>, Rc, i64) -> Rc + Clone) -> String { + emit_unified_tco_expr(&Rc::new(TcoFrame { + expr: expr, + scope: scope, + depth: depth, +}), &fn_name, params, &target, registry, recurse_expr, render_match, render_init_stmts) } -pub fn unified_tco_recurse( - expr: Rc, - scope: Rc, - depth: i64, - fn_name: String, - params: Rc>>, - target: RenderTarget, - registry: Rc>>, - recurse_expr: impl Fn(Rc, Rc, i64) -> String + Clone, - render_match: impl Fn(Rc) -> String + Clone, - render_init_stmts: impl Fn(Rc>>, Rc, i64) -> Rc + Clone, -) -> String { - emit_unified_tco_expr( - &Rc::new(TcoFrame { - expr: expr, - scope: scope, - depth: depth, - }), - &fn_name, - params, - &target, - registry, - recurse_expr, - render_match, - render_init_stmts, - ) -} - -pub fn emit_unified_tco_expr( - frame: &Rc, - fn_name: &String, - params: Rc>>, - target: &RenderTarget, - registry: Rc>>, - recurse_expr: impl Fn(Rc, Rc, i64) -> String + Clone, - render_match: impl Fn(Rc) -> String + Clone, - render_init_stmts: impl Fn(Rc>>, Rc, i64) -> Rc + Clone, -) -> String { +pub fn emit_unified_tco_expr(frame: &Rc, fn_name: &String, params: Rc>>, target: &RenderTarget, registry: Rc>>, recurse_expr: impl Fn(Rc, Rc, i64) -> String + Clone, render_match: impl Fn(Rc) -> String + Clone, render_init_stmts: impl Fn(Rc>>, Rc, i64) -> Rc + Clone) -> String { { let spec = language_spec(target.clone()); - emit_shared_tco_expr( - frame.clone(), - fn_name.clone(), - |input| { - emit_typed_tco_reassign_shared( - input.args.clone(), - params.clone(), - &target, - |child| recurse_expr(child.clone(), input.scope.clone(), input.depth.clone()), - input.scope.clone().type_env.clone().source_indices.clone(), - ) - }, - |frame| { - shared_tco_non_self_call( - &frame, - target.clone(), - spec.clone(), - |f, args, scope, depth| { - emit_typed_call_unified( - &f, - args.clone(), - &target, - registry.clone(), - scope.clone(), - |n| recurse_expr(n.clone(), scope.clone(), depth.clone()), - ) - }, - ) - }, - |frame| { - shared_tco_if( - &frame, - fn_name.clone(), - params.clone(), - target.clone(), - spec.clone(), - recurse_expr.clone(), - |expr, scope, depth| { - unified_tco_recurse( - expr.clone(), - scope.clone(), - depth.clone(), - fn_name.clone(), - params.clone(), - target.clone(), - registry.clone(), - recurse_expr.clone(), - render_match.clone(), - render_init_stmts.clone(), - ) - }, - ) - }, - render_match.clone(), - |frame| { - shared_tco_let( - &frame, - fn_name.clone(), - params.clone(), - target.clone(), - recurse_expr.clone(), - |expr, scope, depth| { - unified_tco_recurse( - expr.clone(), - scope.clone(), - depth.clone(), - fn_name.clone(), - params.clone(), - target.clone(), - registry.clone(), - recurse_expr.clone(), - render_match.clone(), - render_init_stmts.clone(), - ) - }, - ) - }, - |frame| { - shared_tco_block( - &frame, - fn_name.clone(), - params.clone(), - target.clone(), - spec.clone(), - render_init_stmts.clone(), - |expr, scope, depth| { - unified_tco_recurse( - expr.clone(), - scope.clone(), - depth.clone(), - fn_name.clone(), - params.clone(), - target.clone(), - registry.clone(), - recurse_expr.clone(), - render_match.clone(), - render_init_stmts.clone(), - ) - }, - ) - }, - |frame| shared_tco_default_return(&frame, spec.clone(), recurse_expr.clone()), - ) - } +emit_shared_tco_expr(frame.clone(), fn_name.clone(), |input| emit_typed_tco_reassign_shared(input.args.clone(), params.clone(), &target, |child| recurse_expr(child.clone(), input.scope.clone(), input.depth.clone()), input.scope.clone().type_env.clone().source_indices.clone()), |frame| shared_tco_non_self_call(&frame, target.clone(), spec.clone(), |f, args, scope, depth| emit_typed_call_unified(&f, args.clone(), &target, registry.clone(), scope.clone(), |n| recurse_expr(n.clone(), scope.clone(), depth.clone()))), |frame| shared_tco_if(&frame, fn_name.clone(), params.clone(), target.clone(), spec.clone(), recurse_expr.clone(), |expr, scope, depth| unified_tco_recurse(expr.clone(), scope.clone(), depth.clone(), fn_name.clone(), params.clone(), target.clone(), registry.clone(), recurse_expr.clone(), render_match.clone(), render_init_stmts.clone())), render_match.clone(), |frame| shared_tco_let(&frame, fn_name.clone(), params.clone(), target.clone(), recurse_expr.clone(), |expr, scope, depth| unified_tco_recurse(expr.clone(), scope.clone(), depth.clone(), fn_name.clone(), params.clone(), target.clone(), registry.clone(), recurse_expr.clone(), render_match.clone(), render_init_stmts.clone())), |frame| shared_tco_block(&frame, fn_name.clone(), params.clone(), target.clone(), spec.clone(), render_init_stmts.clone(), |expr, scope, depth| unified_tco_recurse(expr.clone(), scope.clone(), depth.clone(), fn_name.clone(), params.clone(), target.clone(), registry.clone(), recurse_expr.clone(), render_match.clone(), render_init_stmts.clone())), |frame| shared_tco_default_return(&frame, spec.clone(), recurse_expr.clone())) +} } -pub fn emit_unified_tco_body( - texpr: Rc, - fn_name: String, - params: Rc>>, - target: &RenderTarget, - registry: Rc>>, - scope: Rc, - depth: i64, - recurse_expr: impl Fn(Rc, Rc, i64) -> String + Clone, - render_match: impl Fn(Rc) -> String + Clone, - render_init_stmts: impl Fn(Rc>>, Rc, i64) -> Rc + Clone, -) -> String { +pub fn emit_unified_tco_body(texpr: Rc, fn_name: String, params: Rc>>, target: &RenderTarget, registry: Rc>>, scope: Rc, depth: i64, recurse_expr: impl Fn(Rc, Rc, i64) -> String + Clone, render_match: impl Fn(Rc) -> String + Clone, render_init_stmts: impl Fn(Rc>>, Rc, i64) -> Rc + Clone) -> String { { let spec = language_spec(target.clone()); - let inner = emit_unified_tco_expr( - &Rc::new(TcoFrame { - expr: texpr, - scope: scope, - depth: (depth.clone() + 1), - }), - &fn_name, - params, - &target, - registry, - recurse_expr, - render_match, - render_init_stmts, - ); - shared_tco_body(inner, depth.clone(), &spec) - } +let inner = emit_unified_tco_expr(&Rc::new(TcoFrame { + expr: texpr, + scope: scope, + depth: (depth.clone() + 1), +}), &fn_name, params, &target, registry, recurse_expr, render_match, render_init_stmts); +shared_tco_body(inner, depth.clone(), &spec) +} } -pub fn emit_unified_init_block_stmts( - remaining: Rc>>, - text: Rc>, - scope: Rc, - depth: i64, - target: &RenderTarget, - registry: Rc>>, - render_pattern: impl Fn(Rc) -> String + Clone, -) -> Rc { +pub fn emit_unified_init_block_stmts(remaining: Rc>>, text: Rc>, scope: Rc, depth: i64, target: &RenderTarget, registry: Rc>>, render_pattern: impl Fn(Rc) -> String + Clone) -> Rc { { - let prepend = if language_spec(target.clone()) - .block_syntax - .clone() - .significant_whitespace - .clone() - { + let prepend = if language_spec(target.clone()).block_syntax.clone().significant_whitespace.clone() { false } else { true }; - emit_init_block_stmts_shared(remaining, text, scope, depth, prepend, |stmt, sc, d| { - emit_unified_typed_expr( - stmt.clone(), - &target, - registry.clone(), - &sc, - d.clone(), - 1024, - render_pattern.clone(), - ) - }) - } +emit_init_block_stmts_shared(remaining, text, scope, depth, prepend, |stmt, sc, d| emit_unified_typed_expr(stmt.clone(), &target, registry.clone(), &sc, d.clone(), 1024, render_pattern.clone())) +} } -pub fn emit_unified_tco_match( - frame: &Rc, - fn_name: String, - params: Rc>>, - target: &RenderTarget, - registry: &Rc>>, - render_pattern: impl Fn(Rc) -> String + Clone, - render_init_stmts: impl Fn(Rc>>, Rc, i64) -> Rc + Clone, -) -> String { +pub fn emit_unified_tco_match(frame: &Rc, fn_name: String, params: Rc>>, target: &RenderTarget, registry: &Rc>>, render_pattern: impl Fn(Rc) -> String + Clone, render_init_stmts: impl Fn(Rc>>, Rc, i64) -> Rc + Clone) -> String { match (*frame.expr.clone().expr_data.clone()).clone() { - ExprData::ExprMatch => { - let s = match_scrutinee(frame.expr.clone()); - let arm_list = match_arm_nodes(frame.expr.clone()); - let scrut_str = emit_unified_typed_expr( - s, - &target, - registry.clone(), - &frame.scope.clone(), - frame.depth.clone(), - 1024, - render_pattern.clone(), - ); - let arm_strs = Rc::new({ - let mut __result = Vec::new(); - for arm in arm_list.iter().cloned() { - __result.push(emit_unified_tco_match_arm( - &arm, - &fn_name, - ¶ms, - &target, - ®istry, - &frame.scope.clone(), - frame.depth.clone(), - render_pattern.clone(), - render_init_stmts.clone(), - )); - } - __result - }); - let arms_str = arm_strs.join(&"\n".to_string()); - let bs = language_spec(target.clone()).block_syntax.clone(); - if (bs.block_close.clone().as_str() == "".to_string().as_str()) { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(bs.match_keyword.clone(), scrut_str), - bs.block_open.clone(), - ), - arms_str, - ) - } else { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(bs.match_keyword.clone(), scrut_str), - bs.block_open.clone(), - ), - arms_str, - ), - "\n".to_string(), - ), - bs.block_close.clone(), - ) - } + ExprData::ExprMatch => { + let s = match_scrutinee(frame.expr.clone()); +let arm_list = match_arm_nodes(frame.expr.clone()); +let scrut_str = emit_unified_typed_expr(s, &target, registry.clone(), &frame.scope.clone(), frame.depth.clone(), 1024, render_pattern.clone()); +let arm_strs = Rc::new({ let mut __result = Vec::new(); for arm in arm_list.iter().cloned() { __result.push(emit_unified_tco_match_arm(&arm, &fn_name, ¶ms, &target, ®istry, &frame.scope.clone(), frame.depth.clone(), render_pattern.clone(), render_init_stmts.clone())); } __result }); +let arms_str = arm_strs.join(&"\n".to_string()); +let bs = language_spec(target.clone()).block_syntax.clone(); +if (bs.block_close.clone().as_str() == "".to_string().as_str()) { + v2_rt::concat(v2_rt::concat(v2_rt::concat(bs.match_keyword.clone(), scrut_str), bs.block_open.clone()), arms_str) + } else { + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(bs.match_keyword.clone(), scrut_str), bs.block_open.clone()), arms_str), "\n".to_string()), bs.block_close.clone()) } - _ => emit_error_expr( - "emit_unified_tco_match expected ExprMatch".to_string(), - target.clone(), - ), - } +}, + _ => emit_error_expr("emit_unified_tco_match expected ExprMatch".to_string(), target.clone()), +} } -pub fn emit_unified_tco_match_arm( - arm: &Rc, - fn_name: &String, - params: &Rc>>, - target: &RenderTarget, - registry: &Rc>>, - scope: &Rc, - depth: i64, - render_pattern: impl Fn(Rc) -> String + Clone, - render_init_stmts: impl Fn(Rc>>, Rc, i64) -> Rc + Clone, -) -> String { +pub fn emit_unified_tco_match_arm(arm: &Rc, fn_name: &String, params: &Rc>>, target: &RenderTarget, registry: &Rc>>, scope: &Rc, depth: i64, render_pattern: impl Fn(Rc) -> String + Clone, render_init_stmts: impl Fn(Rc>>, Rc, i64) -> Rc + Clone) -> String { { let bs = language_spec(target.clone()).block_syntax.clone(); - let case_depth = if bs.significant_whitespace.clone() { +let case_depth = if bs.significant_whitespace.clone() { (depth.clone() + 1) } else { depth.clone() }; - let body_depth = (case_depth.clone() + 1); - let guard_str = emit_arm_guard(arm.clone(), &target, |g| { - emit_unified_typed_expr( - g.clone(), - &target, - registry.clone(), - &scope, - depth.clone(), - 1024, - render_pattern.clone(), - ) - }); - let body_str = emit_unified_tco_expr( - &Rc::new(TcoFrame { - expr: arm_body(&arm), - scope: scope.clone(), - depth: body_depth.clone(), - }), - &fn_name, - params.clone(), - &target, - registry.clone(), - |expr, scope, depth| { - emit_unified_typed_expr( - expr.clone(), - &target, - registry.clone(), - &scope, - depth.clone(), - 1024, - render_pattern.clone(), - ) - }, - |frame| { - emit_unified_tco_match( - &frame, - fn_name.clone(), - params.clone(), - &target, - ®istry, - render_pattern.clone(), - render_init_stmts.clone(), - ) - }, - render_init_stmts.clone(), - ); - emit_match_arm_line( - arm.clone(), - target.clone(), - case_depth.clone(), - body_depth.clone(), - body_str, - guard_str, - render_pattern.clone(), - ) - } +let body_depth = (case_depth.clone() + 1); +let guard_str = emit_arm_guard(arm.clone(), &target, |g| emit_unified_typed_expr(g.clone(), &target, registry.clone(), &scope, depth.clone(), 1024, render_pattern.clone())); +let body_str = emit_unified_tco_expr(&Rc::new(TcoFrame { + expr: arm_body(&arm), + scope: scope.clone(), + depth: body_depth.clone(), +}), &fn_name, params.clone(), &target, registry.clone(), |expr, scope, depth| emit_unified_typed_expr(expr.clone(), &target, registry.clone(), &scope, depth.clone(), 1024, render_pattern.clone()), |frame| emit_unified_tco_match(&frame, fn_name.clone(), params.clone(), &target, ®istry, render_pattern.clone(), render_init_stmts.clone()), render_init_stmts.clone()); +emit_match_arm_line(arm.clone(), target.clone(), case_depth.clone(), body_depth.clone(), body_str, guard_str, render_pattern.clone()) +} } -pub fn emit_tco_unified( - texpr: Rc, - fn_name: &String, - params: &Rc>>, - target: &RenderTarget, - registry: &Rc>>, - scope: &Rc, - depth: i64, - render_pattern: impl Fn(Rc) -> String + Clone, -) -> String { - emit_unified_tco_body( - texpr, - fn_name.clone(), - params.clone(), - &target, - registry.clone(), - scope.clone(), - depth.clone(), - |expr, scope, depth| { - emit_unified_typed_expr( - expr.clone(), - &target, - registry.clone(), - &scope, - depth.clone(), - 1024, - render_pattern.clone(), - ) - }, - |frame| { - emit_unified_tco_match( - &frame, - fn_name.clone(), - params.clone(), - &target, - ®istry, - render_pattern.clone(), - |stmts, scope, depth| { - emit_unified_init_block_stmts( - stmts.clone(), - Rc::new(vec![]), - scope.clone(), - depth.clone(), - &target, - registry.clone(), - render_pattern.clone(), - ) - }, - ) - }, - |stmts, scope, depth| { - emit_unified_init_block_stmts( - stmts.clone(), - Rc::new(vec![]), - scope.clone(), - depth.clone(), - &target, - registry.clone(), - render_pattern.clone(), - ) - }, - ) +pub fn emit_tco_unified(texpr: Rc, fn_name: &String, params: &Rc>>, target: &RenderTarget, registry: &Rc>>, scope: &Rc, depth: i64, render_pattern: impl Fn(Rc) -> String + Clone) -> String { + emit_unified_tco_body(texpr, fn_name.clone(), params.clone(), &target, registry.clone(), scope.clone(), depth.clone(), |expr, scope, depth| emit_unified_typed_expr(expr.clone(), &target, registry.clone(), &scope, depth.clone(), 1024, render_pattern.clone()), |frame| emit_unified_tco_match(&frame, fn_name.clone(), params.clone(), &target, ®istry, render_pattern.clone(), |stmts, scope, depth| emit_unified_init_block_stmts(stmts.clone(), Rc::new(vec![]), scope.clone(), depth.clone(), &target, registry.clone(), render_pattern.clone())), |stmts, scope, depth| emit_unified_init_block_stmts(stmts.clone(), Rc::new(vec![]), scope.clone(), depth.clone(), &target, registry.clone(), render_pattern.clone())) } -pub fn emit_unified_typed_func_body( - body: &Rc, - target: &RenderTarget, - registry: &Rc>>, - scope: &Rc, - depth: i64, -) -> String { +pub fn emit_unified_typed_func_body(body: &Rc, target: &RenderTarget, registry: &Rc>>, scope: &Rc, depth: i64) -> String { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - let es = language_spec(target.clone()).expression_semantics.clone(); - let bs = language_spec(target.clone()).block_syntax.clone(); - let si = scope.type_env.clone().source_indices.clone(); - let prefix = if bs.significant_whitespace.clone() { - "".to_string() - } else { - make_indent(depth.clone()) - }; - match (*body.expr_data.clone()).clone() { - ExprData::ExprLet => { + { + let es = language_spec(target.clone()).expression_semantics.clone(); +let bs = language_spec(target.clone()).block_syntax.clone(); +let si = scope.type_env.clone().source_indices.clone(); +let prefix = if bs.significant_whitespace.clone() { + "".to_string() + } else { + make_indent(depth.clone()) + }; +match (*body.expr_data.clone()).clone() { + ExprData::ExprLet => { let n = let_binding_name_at(body.clone(), si.clone()); - let ch = body.children.clone(); - let v = let_value(body.clone()); - let inner = let_body(body.clone()); - let val_str = emit_unified_typed_expr( - v.clone(), - &target, - registry.clone(), - &scope, - depth.clone(), - 1024, - |pat| emit_unified_pattern(pat.clone(), target.clone(), si.clone()), - ); - let let_line = v2_rt::concat(prefix, emit_let_binding(n.clone(), val_str, &target)); - let next_scope = extend_scope( - &scope, - &n, - resolved_type(v.clone()), - Rc::new(SubValueRelation::SubValueUnknown), - ); - match inner { - Some(bd) => v2_rt::concat( - v2_rt::concat(let_line, "\n".to_string()), - emit_unified_typed_func_body( - &bd, - &target, - ®istry, - &next_scope, - depth.clone(), - ), - ), - None => let_line, - } - } - ExprData::ExprBlock => { +let ch = body.children.clone(); +let v = let_value(body.clone()); +let inner = let_body(body.clone()); +let val_str = emit_unified_typed_expr(v.clone(), &target, registry.clone(), &scope, depth.clone(), 1024, |pat| emit_unified_pattern(pat.clone(), target.clone(), si.clone())); +let let_line = v2_rt::concat(prefix, emit_let_binding(n.clone(), val_str, &target)); +let next_scope = extend_scope(&scope, &n, resolved_type(v.clone()), Rc::new(SubValueRelation::SubValueUnknown)); +match inner { + Some(bd) => v2_rt::concat(v2_rt::concat(let_line, "\n".to_string()), emit_unified_typed_func_body(&bd, &target, ®istry, &next_scope, depth.clone())), + None => let_line, +} +}, + ExprData::ExprBlock => { let ss = body.children.clone(); - if ((ss.clone().len() as i64) == 0) { - v2_rt::concat( - v2_rt::concat(prefix, "return ".to_string()), - es.empty_return_value.clone(), - ) +if ((ss.clone().len() as i64) == 0) { + v2_rt::concat(v2_rt::concat(prefix, "return ".to_string()), es.empty_return_value.clone()) } else { { - let init_state = emit_unified_init_block_stmts( - ss.clone(), - Rc::new(vec![]), - scope.clone(), - depth.clone(), - &target, - registry.clone(), - |pat| emit_unified_pattern(pat.clone(), target.clone(), si.clone()), - ); - let last_stmt = ss.clone().last().cloned(); - let last_str = match last_stmt { - Some(s) => v2_rt::concat( - v2_rt::concat( - v2_rt::concat(prefix, "return ".to_string()), - emit_unified_typed_expr( - s.clone(), - &target, - registry.clone(), - &init_state.scope.clone(), - depth.clone(), - 1024, - |pat| { - emit_unified_pattern( - pat.clone(), - target.clone(), - si.clone(), - ) - }, - ), - ), - es.return_suffix.clone(), - ), - None => v2_rt::concat( - v2_rt::concat(prefix, "return ".to_string()), - es.empty_return_value.clone(), - ), - }; - if ((init_state.text.clone().len() as i64) == 0) { + let init_state = emit_unified_init_block_stmts(ss.clone(), Rc::new(vec![]), scope.clone(), depth.clone(), &target, registry.clone(), |pat| emit_unified_pattern(pat.clone(), target.clone(), si.clone())); +let last_stmt = ss.clone().last().cloned(); +let last_str = match last_stmt { + Some(s) => v2_rt::concat(v2_rt::concat(v2_rt::concat(prefix, "return ".to_string()), emit_unified_typed_expr(s.clone(), &target, registry.clone(), &init_state.scope.clone(), depth.clone(), 1024, |pat| emit_unified_pattern(pat.clone(), target.clone(), si.clone()))), es.return_suffix.clone()), + None => v2_rt::concat(v2_rt::concat(prefix, "return ".to_string()), es.empty_return_value.clone()), +}; +if ((init_state.text.clone().len() as i64) == 0) { last_str } else { - v2_rt::concat( - v2_rt::concat( - init_state.text.clone().join(&"\n".to_string()), - "\n".to_string(), - ), - last_str, - ) + v2_rt::concat(v2_rt::concat(init_state.text.clone().join(&"\n".to_string()), "\n".to_string()), last_str) } - } +} } - } - _ => v2_rt::concat( - v2_rt::concat( - v2_rt::concat(prefix, "return ".to_string()), - emit_unified_typed_expr( - body.clone(), - &target, - registry.clone(), - &scope, - depth.clone(), - 1024, - |pat| emit_unified_pattern(pat.clone(), target.clone(), si.clone()), - ), - ), - es.return_suffix.clone(), - ), - } +}, + _ => v2_rt::concat(v2_rt::concat(v2_rt::concat(prefix, "return ".to_string()), emit_unified_typed_expr(body.clone(), &target, registry.clone(), &scope, depth.clone(), 1024, |pat| emit_unified_pattern(pat.clone(), target.clone(), si.clone()))), es.return_suffix.clone()), +} +} }) } -pub fn is_tco_candidate( - texpr: &Rc, - func_name: &String, - source_indices: &Rc>>, -) -> bool { +pub fn is_tco_candidate(texpr: &Rc, func_name: &String, source_indices: &Rc>>) -> bool { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*texpr.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { - (expr_call_func_at(texpr.clone(), source_indices.clone()).as_str() - == func_name.clone().as_str()) - } - ExprData::ExprReturn => { - is_tco_candidate(&return_value(texpr.clone()), &func_name, &source_indices) - } - ExprData::ExprIf => { - let then_cand = - is_tco_candidate(&if_then_branch(texpr.clone()), &func_name, &source_indices); - let else_cand = match if_else_branch(texpr.clone()) { - Some(e) => is_tco_candidate(&e, &func_name, &source_indices), - None => false, - }; - (then_cand || else_cand) - } - ExprData::ExprMatch => { - let mut __found = false; - for arm_node in match_arm_nodes(texpr.clone()).iter().cloned() { - if is_tco_candidate(&arm_body(&arm_node), &func_name, &source_indices) { - __found = true; - break; - } - } - __found - } - ExprData::ExprLet => match let_body(texpr.clone()) { - Some(b) => is_tco_candidate(&b, &func_name, &source_indices), - None => false, - }, - ExprData::ExprBlock => { - let mut __found = false; - for s in texpr.children.clone().iter().cloned() { - if is_tco_candidate(&s, &func_name, &source_indices) { - __found = true; - break; - } - } - __found - } - ExprData::NoExprData => { - let mut __found = false; - for child in texpr.children.clone().iter().cloned() { - if is_tco_candidate(&child, &func_name, &source_indices) { - __found = true; - break; - } - } - __found - } - _ => false, - } + ExprData::ExprCall { .. } => (expr_call_func_at(texpr.clone(), source_indices.clone()).as_str() == func_name.clone().as_str()), + ExprData::ExprReturn => is_tco_candidate(&return_value(texpr.clone()), &func_name, &source_indices), + ExprData::ExprIf => { + let then_cand = is_tco_candidate(&if_then_branch(texpr.clone()), &func_name, &source_indices); +let else_cand = match if_else_branch(texpr.clone()) { + Some(e) => is_tco_candidate(&e, &func_name, &source_indices), + None => false, +}; +(then_cand || else_cand) +}, + ExprData::ExprMatch => { let mut __found = false; for arm_node in match_arm_nodes(texpr.clone()).iter().cloned() { if is_tco_candidate(&arm_body(&arm_node), &func_name, &source_indices) { __found = true; break; } } __found }, + ExprData::ExprLet => match let_body(texpr.clone()) { + Some(b) => is_tco_candidate(&b, &func_name, &source_indices), + None => false, +}, + ExprData::ExprBlock => { let mut __found = false; for s in texpr.children.clone().iter().cloned() { if is_tco_candidate(&s, &func_name, &source_indices) { __found = true; break; } } __found }, + ExprData::NoExprData => { let mut __found = false; for child in texpr.children.clone().iter().cloned() { if is_tco_candidate(&child, &func_name, &source_indices) { __found = true; break; } } __found }, + _ => false, +} }) } pub fn emit_ident(name: String, target: RenderTarget) -> String { { let spec = language_spec(target); - let converted = match spec.naming_case.clone() { - NamingCase::SnakeCase => to_snake(name), - NamingCase::CamelCase => to_camel(name), - NamingCase::PascalCase => capitalize_first(to_camel(name)), - NamingCase::AsAuthored => name, - }; - let is_reserved = { - let mut __found = false; - for r in spec.reserved_words.clone().keywords.clone().iter().cloned() { - if (r.clone().as_str() == converted.clone().as_str()) { - __found = true; - break; - } - } - __found - }; - if is_reserved { +let converted = match spec.naming_case.clone() { + NamingCase::SnakeCase => to_snake(name), + NamingCase::CamelCase => to_camel(name), + NamingCase::PascalCase => capitalize_first(to_camel(name)), + NamingCase::AsAuthored => name, +}; +let is_reserved = { let mut __found = false; for r in spec.reserved_words.clone().keywords.clone().iter().cloned() { if (r.clone().as_str() == converted.clone().as_str()) { __found = true; break; } } __found }; +if is_reserved { match (*spec.reserved_words.clone().strategy.clone()).clone() { - ReservedWordStrategy::PrefixEscape { prefix: p, .. } => { - v2_rt::concat(p.clone(), converted.clone()) - } - ReservedWordStrategy::SuffixEscape { suffix: s, .. } => { - v2_rt::concat(converted.clone(), s.clone()) - } - ReservedWordStrategy::NoEscape => converted.clone(), - } + ReservedWordStrategy::PrefixEscape { prefix: p, .. } => v2_rt::concat(p.clone(), converted.clone()), + ReservedWordStrategy::SuffixEscape { suffix: s, .. } => v2_rt::concat(converted.clone(), s.clone()), + ReservedWordStrategy::NoEscape => converted.clone(), +} } else { converted.clone() } - } +} } pub fn emit_export_ident(name: String, target: &RenderTarget) -> String { { let spec = language_spec(target.clone()); - match (*spec.visibility.clone()).clone() { - VisibilitySpec::CaseVisibility { - export_case: ec, .. - } => { - let result = apply_naming_case(name, ec.clone()); - let is_reserved = { - let mut __found = false; - for r in spec.reserved_words.clone().keywords.clone().iter().cloned() { - if (r.clone().as_str() == result.clone().as_str()) { - __found = true; - break; - } - } - __found - }; - if is_reserved { - match (*spec.reserved_words.clone().strategy.clone()).clone() { - ReservedWordStrategy::SuffixEscape { suffix: s, .. } => { - v2_rt::concat(result.clone(), s.clone()) - } - ReservedWordStrategy::PrefixEscape { prefix: p, .. } => { - v2_rt::concat(p.clone(), result.clone()) - } - ReservedWordStrategy::NoEscape => result.clone(), - } - } else { - result.clone() - } +match (*spec.visibility.clone()).clone() { + VisibilitySpec::CaseVisibility { export_case: ec, .. } => { + let result = apply_naming_case(name, ec.clone()); +let is_reserved = { let mut __found = false; for r in spec.reserved_words.clone().keywords.clone().iter().cloned() { if (r.clone().as_str() == result.clone().as_str()) { __found = true; break; } } __found }; +if is_reserved { + match (*spec.reserved_words.clone().strategy.clone()).clone() { + ReservedWordStrategy::SuffixEscape { suffix: s, .. } => v2_rt::concat(result.clone(), s.clone()), + ReservedWordStrategy::PrefixEscape { prefix: p, .. } => v2_rt::concat(p.clone(), result.clone()), + ReservedWordStrategy::NoEscape => result.clone(), +} + } else { + result.clone() } - VisibilitySpec::KeywordVisibility { .. } => emit_ident(name, target.clone()), - } - } +}, + VisibilitySpec::KeywordVisibility { .. } => emit_ident(name, target.clone()), +} +} } -pub fn apply_bridge_method_overrides( - name: String, - overrides: Rc>, -) -> String { +pub fn apply_bridge_method_overrides(name: String, overrides: Rc>) -> String { match v2_rt::lookup(&overrides, name.clone()) { - Some(replacement) => replacement.clone(), - None => name.clone(), - } + Some(replacement) => replacement.clone(), + None => name.clone(), +} } pub fn emit_let_binding(name: String, value: String, target: &RenderTarget) -> String { { let spec = language_spec(target.clone()); - apply_type_template2( - spec.annotations.clone().let_binding_inferred.clone(), - emit_ident(name, target.clone()), - value, - ) - } +apply_type_template2(spec.annotations.clone().let_binding_inferred.clone(), emit_ident(name, target.clone()), value) +} } -pub fn emit_let_binding_annotated( - name: String, - type_str: String, - value: String, - target: &RenderTarget, -) -> String { +pub fn emit_let_binding_annotated(name: String, type_str: String, value: String, target: &RenderTarget) -> String { { let spec = language_spec(target.clone()); - apply_type_template3( - spec.annotations.clone().let_binding_annotated.clone(), - emit_ident(name, target.clone()), - type_str, - value, - ) - } +apply_type_template3(spec.annotations.clone().let_binding_annotated.clone(), emit_ident(name, target.clone()), type_str, value) +} } pub fn emit_return(value: String, target: RenderTarget) -> String { @@ -4074,2002 +1981,765 @@ pub fn emit_return(value: String, target: RenderTarget) -> String { pub fn emit_unary_op(op: UnaryOpKind, operand_str: String, target: RenderTarget) -> String { match op { - UnaryOpKind::Not => v2_rt::concat(emit_keyword("not".to_string(), target), operand_str), - UnaryOpKind::Neg => v2_rt::concat("-".to_string(), operand_str), - } + UnaryOpKind::Not => v2_rt::concat(emit_keyword("not".to_string(), target), operand_str), + UnaryOpKind::Neg => v2_rt::concat("-".to_string(), operand_str), +} } pub fn emit_lambda(params_str: String, body_str: String, target: RenderTarget) -> String { { let spec = language_spec(target); - apply_type_template2(spec.lambda_template.clone(), params_str, body_str) - } +apply_type_template2(spec.lambda_template.clone(), params_str, body_str) +} } pub fn emit_error_expr(message: String, target: RenderTarget) -> String { { let msg = emit_string_literal(message, "".to_string()); - let spec = language_spec(target); - apply_type_template1(spec.error_expr_template.clone(), msg) - } +let spec = language_spec(target); +apply_type_template1(spec.error_expr_template.clone(), msg) +} } pub fn emit_lambda_params(param_names: Rc>, target: &RenderTarget) -> String { { let spec = language_spec(target.clone()); - let param_strs = Rc::new({ - let mut __result = Vec::new(); - for p in param_names.iter().cloned() { - __result.push(apply_type_template1( - spec.annotations.clone().lambda_param_untyped.clone(), - emit_ident(p.clone(), target.clone()), - )); - } - __result - }); - param_strs.join(&", ".to_string()) - } +let param_strs = Rc::new({ let mut __result = Vec::new(); for p in param_names.iter().cloned() { __result.push(apply_type_template1(spec.annotations.clone().lambda_param_untyped.clone(), emit_ident(p.clone(), target.clone()))); } __result }); +param_strs.join(&", ".to_string()) +} } pub fn emit_list_lit_expr(element_strs: &Rc>, target: RenderTarget) -> String { { let spec = language_spec(target); - if ((element_strs.clone().len() as i64) == 0) { +if ((element_strs.clone().len() as i64) == 0) { spec.list_literal_empty.clone() } else { { let els_str = element_strs.clone().join(&", ".to_string()); - apply_type_template1(spec.list_literal_template.clone(), els_str) - } +apply_type_template1(spec.list_literal_template.clone(), els_str) +} } - } +} } pub fn emit_null_coalesce(l_str: String, r_str: String, target: RenderTarget) -> String { { let spec = language_spec(target); - apply_type_template2(spec.null_coalesce_template.clone(), l_str, r_str) - } +apply_type_template2(spec.null_coalesce_template.clone(), l_str, r_str) +} } -pub fn emit_expr_var_shared( - expr: Rc, - target: RenderTarget, - source_indices: Rc>>, -) -> String { +pub fn emit_expr_var_shared(expr: Rc, target: RenderTarget, source_indices: Rc>>) -> String { { let n = expr_var_name_at(expr, source_indices); - if (n.clone().as_str() == "none".to_string().as_str()) { +if (n.clone().as_str() == "none".to_string().as_str()) { emit_keyword("null".to_string(), target) } else { - if ((n.clone().as_str() == "true".to_string().as_str()) - || (n.clone().as_str() == "false".to_string().as_str())) - { + if ((n.clone().as_str() == "true".to_string().as_str()) || (n.clone().as_str() == "false".to_string().as_str())) { emit_keyword(n.clone(), target) } else { emit_ident(n.clone(), target) } } - } +} } -pub fn emit_expr_field_access_shared( - expr: &Rc, - target: RenderTarget, - emit_field: impl Fn(Rc) -> String + Clone, - source_indices: &Rc>>, -) -> String { +pub fn emit_expr_field_access_shared(expr: &Rc, target: RenderTarget, emit_field: impl Fn(Rc) -> String + Clone, source_indices: &Rc>>) -> String { if is_typed_service_call_receiver(&expr, source_indices.clone()) { match extract_typed_service_name(&expr, &source_indices) { - Some(svc_name) => service_var_name(svc_name.clone()), - None => emit_field(expr.clone()), - } + Some(svc_name) => service_var_name(svc_name.clone()), + None => emit_field(expr.clone()), +} } else { emit_field(expr.clone()) } } pub fn extract_string_interp_parts(expr: Rc) -> Rc>> { - Rc::new({ - let mut __result = Vec::new(); - for child in expr.children.clone().iter().cloned() { - __result.push(match (*child.expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { - let LiteralValue::LitStr { value: text, .. } = value.as_ref() else { - unreachable!() - }; - Rc::new(StringPart::Text { - value: text.clone(), - }) - } - _ => Rc::new(StringPart::Interpolation { - expr: arg_value(&child), - }), - }); - } - __result - }) + Rc::new({ let mut __result = Vec::new(); for child in expr.children.clone().iter().cloned() { __result.push(match (*child.expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitStr { value: text, .. } = value.as_ref() else { unreachable!() }; Rc::new(StringPart::Text { + value: text.clone(), +}) }, + _ => Rc::new(StringPart::Interpolation { + expr: arg_value(&child), +}), +}); } __result }) } -pub fn emit_typed_cast_shared( - expr: &Rc, - cast_target_node: Rc, - target: &RenderTarget, - recurse: impl Fn(Rc) -> String + Clone, - source_indices: &Rc>>, -) -> String { +pub fn emit_typed_cast_shared(expr: &Rc, cast_target_node: Rc, target: &RenderTarget, recurse: impl Fn(Rc) -> String + Clone, source_indices: &Rc>>) -> String { { let expr_str = recurse(expr.clone()); - let ty_str = emit_node_type(cast_target_node, target.clone(), source_indices.clone()); - let src_ty = match expr.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: n, .. }) => { - emit_node_type(n.clone(), target.clone(), source_indices.clone()) - } - _ => "".to_string(), - }; - if ((src_ty.clone().as_str() != "".to_string().as_str()) - && (src_ty.clone().as_str() == ty_str.clone().as_str())) - { +let ty_str = emit_node_type(cast_target_node, target.clone(), source_indices.clone()); +let src_ty = match expr.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: n, .. }) => emit_node_type(n.clone(), target.clone(), source_indices.clone()), + _ => "".to_string(), +}; +if ((src_ty.clone().as_str() != "".to_string().as_str()) && (src_ty.clone().as_str() == ty_str.clone().as_str())) { expr_str } else { if can_cast(target.clone(), src_ty.clone(), ty_str.clone()) { render_cast(expr_str, ty_str.clone(), target.clone()) } else { - emit_error_expr( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("unsupported cast from ".to_string(), src_ty.clone()), - " to ".to_string(), - ), - ty_str.clone(), - ), - target.clone(), - ) + emit_error_expr(v2_rt::concat(v2_rt::concat(v2_rt::concat("unsupported cast from ".to_string(), src_ty.clone()), " to ".to_string()), ty_str.clone()), target.clone()) } } - } +} } -pub fn emit_typed_for_each_shared( - variable: &String, - collection: &Rc, - body: Rc, - target: &RenderTarget, - depth: i64, - source_indices: Rc>>, - recurse: impl Fn(Rc, Rc, i64) -> String + Clone, - scope: &Rc, -) -> String { +pub fn emit_typed_for_each_shared(variable: &String, collection: &Rc, body: Rc, target: &RenderTarget, depth: i64, source_indices: Rc>>, recurse: impl Fn(Rc, Rc, i64) -> String + Clone, scope: &Rc) -> String { { let coll_str = recurse(collection.clone(), scope.clone(), depth.clone()); - let elem_type = - for_each_element_type_node(resolved_type(collection.clone()), source_indices); - let body_scope = extend_scope( - &scope, - &variable, - elem_type, - Rc::new(SubValueRelation::SubValueUnknown), - ); - let body_str = recurse(body, body_scope, (depth.clone() + 1)); - let var_str = emit_ident(variable.clone(), target.clone()); - let spec = language_spec(target.clone()); - let fes = spec.for_each_syntax.clone(); - let bs = spec.block_syntax.clone(); - let body_indent = make_indent((depth.clone() + 1)); - if bs.significant_whitespace.clone() { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(fes.prefix.clone(), var_str), - fes.separator.clone(), - ), - coll_str, - ), - bs.block_open.clone(), - ), - body_indent, - ), - body_str, - ) +let elem_type = for_each_element_type_node(resolved_type(collection.clone()), source_indices); +let body_scope = extend_scope(&scope, &variable, elem_type, Rc::new(SubValueRelation::SubValueUnknown)); +let body_str = recurse(body, body_scope, (depth.clone() + 1)); +let var_str = emit_ident(variable.clone(), target.clone()); +let spec = language_spec(target.clone()); +let fes = spec.for_each_syntax.clone(); +let bs = spec.block_syntax.clone(); +let body_indent = make_indent((depth.clone() + 1)); +if bs.significant_whitespace.clone() { + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(fes.prefix.clone(), var_str), fes.separator.clone()), coll_str), bs.block_open.clone()), body_indent), body_str) } else { { let close_indent = make_indent(depth.clone()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(fes.prefix.clone(), var_str), - fes.separator.clone(), - ), - coll_str, - ), - bs.block_open.clone(), - ), - body_indent, - ), - body_str, - ), - "\n".to_string(), - ), - close_indent, - ), - bs.block_close.clone(), - ) - } +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(fes.prefix.clone(), var_str), fes.separator.clone()), coll_str), bs.block_open.clone()), body_indent), body_str), "\n".to_string()), close_indent), bs.block_close.clone()) +} } - } +} } -pub fn emit_typed_index_shared( - base: &Rc, - index: Rc, - target: &RenderTarget, - recurse: impl Fn(Rc) -> String + Clone, - source_indices: &Rc>>, -) -> String { +pub fn emit_typed_index_shared(base: &Rc, index: Rc, target: &RenderTarget, recurse: impl Fn(Rc) -> String + Clone, source_indices: &Rc>>) -> String { { let spec = language_spec(target.clone()); - let base_str = recurse(base.clone()); - let index_str = recurse(index); - let base_node = normalize_access_type_node(resolved_type(base.clone())); - let is_map = node_is_keyed_collection(&base_node, source_indices.clone()); - if is_string_like( - target.clone(), - authored_name_at(source_indices.clone(), &base_node), - ) { - apply_type_template2( - spec.indexing.clone().string_index.clone(), - base_str, - index_str, - ) +let base_str = recurse(base.clone()); +let index_str = recurse(index); +let base_node = normalize_access_type_node(resolved_type(base.clone())); +let is_map = node_is_keyed_collection(&base_node, source_indices.clone()); +if is_string_like(target.clone(), authored_name_at(source_indices.clone(), &base_node)) { + apply_type_template2(spec.indexing.clone().string_index.clone(), base_str, index_str) } else { if is_map { apply_type_template2(spec.indexing.clone().map_index.clone(), base_str, index_str) } else { - apply_type_template2( - spec.indexing.clone().list_index.clone(), - base_str, - index_str, - ) + apply_type_template2(spec.indexing.clone().list_index.clone(), base_str, index_str) } } - } +} } -pub fn emit_typed_slice_shared( - base: &Rc, - start: Rc, - end: Rc, - target: &RenderTarget, - recurse: impl Fn(Rc) -> String + Clone, - source_indices: Rc>>, -) -> String { +pub fn emit_typed_slice_shared(base: &Rc, start: Rc, end: Rc, target: &RenderTarget, recurse: impl Fn(Rc) -> String + Clone, source_indices: Rc>>) -> String { { let spec = language_spec(target.clone()); - let base_str = recurse(base.clone()); - let start_str = recurse(start); - let end_str = recurse(end); - let base_node = normalize_access_type_node(resolved_type(base.clone())); - if is_string_like(target.clone(), authored_name_at(source_indices, &base_node)) { +let base_str = recurse(base.clone()); +let start_str = recurse(start); +let end_str = recurse(end); +let base_node = normalize_access_type_node(resolved_type(base.clone())); +if is_string_like(target.clone(), authored_name_at(source_indices, &base_node)) { match spec.indexing.clone().string_slice.clone() { - Some(tmpl) => apply_type_template3(tmpl.clone(), base_str, start_str, end_str), - None => emit_error_expr( - "unsupported string slice for target".to_string(), - target.clone(), - ), - } + Some(tmpl) => apply_type_template3(tmpl.clone(), base_str, start_str, end_str), + None => emit_error_expr("unsupported string slice for target".to_string(), target.clone()), +} } else { match spec.indexing.clone().list_slice.clone() { - Some(tmpl) => apply_type_template3(tmpl.clone(), base_str, start_str, end_str), - None => emit_error_expr("unsupported slice for target".to_string(), target.clone()), - } - } - } + Some(tmpl) => apply_type_template3(tmpl.clone(), base_str, start_str, end_str), + None => emit_error_expr("unsupported slice for target".to_string(), target.clone()), } - -pub fn emit_shared_expr( - texpr: &Rc, - target: &RenderTarget, - source_indices: Rc>>, - wrap_result: impl Fn(String) -> String + Clone, - recurse: impl Fn(Rc) -> String + Clone, - emit_var: impl Fn(Rc) -> String + Clone, - emit_field_access: impl Fn(Rc) -> String + Clone, - emit_call: impl Fn(Rc) -> String + Clone, - emit_method_call: impl Fn(Rc) -> String + Clone, - emit_match: impl Fn(Rc) -> String + Clone, - emit_if: impl Fn(Rc) -> String + Clone, - emit_let: impl Fn(Rc) -> String + Clone, - emit_record_lit: impl Fn(Rc) -> String + Clone, - emit_string_interp: impl Fn(Rc) -> String + Clone, - emit_block: impl Fn(Rc) -> String + Clone, - emit_cast: impl Fn(Rc) -> String + Clone, - emit_for_each: impl Fn(Rc) -> String + Clone, - emit_index: impl Fn(Rc) -> String + Clone, - emit_slice: impl Fn(Rc) -> String + Clone, - emit_bin_op: impl Fn(Rc) -> String + Clone, -) -> String { - match (*texpr.expr_data.clone()).clone() { - ExprData::ExprLiteral { value: v, .. } => wrap_result(emit_literal(v.clone(), &target)), - ExprData::ExprError { message, .. } => { - wrap_result(emit_error_expr(message.clone(), target.clone())) - } - ExprData::ExprVar { .. } => emit_var(texpr.clone()), - ExprData::ExprFieldAccess { .. } => emit_field_access(texpr.clone()), - ExprData::ExprCall { .. } => emit_call(texpr.clone()), - ExprData::ExprMethodCall { .. } => emit_method_call(texpr.clone()), - ExprData::ExprMatch => emit_match(texpr.clone()), - ExprData::ExprIf => emit_if(texpr.clone()), - ExprData::ExprLet => emit_let(texpr.clone()), - ExprData::ExprRecordLit { .. } => emit_record_lit(texpr.clone()), - ExprData::ExprBinOp { .. } => emit_bin_op(texpr.clone()), - ExprData::ExprUnaryOp { op, .. } => { - let operand = unaryop_operand(texpr.clone()); - wrap_result(emit_unary_op(op.clone(), recurse(operand), target.clone())) - } - ExprData::ExprLambda => { - let body = lambda_body(texpr.clone()); - wrap_result(emit_lambda( - emit_lambda_params( - lambda_param_names_at(texpr.clone(), source_indices), - &target, - ), - recurse(body), - target.clone(), - )) - } - ExprData::ExprStringInterp => emit_string_interp(texpr.clone()), - ExprData::ExprBlock => emit_block(texpr.clone()), - ExprData::ExprCast => emit_cast(texpr.clone()), - ExprData::ExprForEach => emit_for_each(texpr.clone()), - ExprData::ExprIndex => emit_index(texpr.clone()), - ExprData::ExprSlice => emit_slice(texpr.clone()), - ExprData::ExprListLit => wrap_result(emit_list_lit_expr( - &Rc::new({ - let mut __result = Vec::new(); - for el in texpr.children.clone().iter().cloned() { - __result.push(recurse(el.clone())); - } - __result - }), - target.clone(), - )), - ExprData::ExprReturn => { - let ret_val = return_value(texpr.clone()); - wrap_result(emit_return(recurse(ret_val), target.clone())) } - ExprData::NoExprData => wrap_result("".to_string()), - } +} } -pub fn emit_default_bin_op( - texpr: &Rc, - target: RenderTarget, - source_indices: Rc>>, - recurse: impl Fn(Rc) -> String + Clone, - wrap_result: impl Fn(String) -> String + Clone, -) -> String { +pub fn emit_shared_expr(texpr: &Rc, target: &RenderTarget, source_indices: Rc>>, wrap_result: impl Fn(String) -> String + Clone, recurse: impl Fn(Rc) -> String + Clone, emit_var: impl Fn(Rc) -> String + Clone, emit_field_access: impl Fn(Rc) -> String + Clone, emit_call: impl Fn(Rc) -> String + Clone, emit_method_call: impl Fn(Rc) -> String + Clone, emit_match: impl Fn(Rc) -> String + Clone, emit_if: impl Fn(Rc) -> String + Clone, emit_let: impl Fn(Rc) -> String + Clone, emit_record_lit: impl Fn(Rc) -> String + Clone, emit_string_interp: impl Fn(Rc) -> String + Clone, emit_block: impl Fn(Rc) -> String + Clone, emit_cast: impl Fn(Rc) -> String + Clone, emit_for_each: impl Fn(Rc) -> String + Clone, emit_index: impl Fn(Rc) -> String + Clone, emit_slice: impl Fn(Rc) -> String + Clone, emit_bin_op: impl Fn(Rc) -> String + Clone) -> String { match (*texpr.expr_data.clone()).clone() { - ExprData::ExprBinOp { - op, - algebra_field: algebra, - .. - } => { - let left = binop_left(texpr.clone()); - let right = binop_right(texpr.clone()); - let left_str = recurse(left); - let right_str = recurse(right); - if is_null_coalesce(op.clone()) { - wrap_result(emit_null_coalesce(left_str, right_str, target)) - } else { - { - let op_str = emit_bin_op_symbol(op.clone(), &target, algebra.clone()); - wrap_result(v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("(".to_string(), left_str), - " ".to_string(), - ), - op_str, - ), - " ".to_string(), - ), - right_str, - ), - ")".to_string(), - )) - } - } + ExprData::ExprLiteral { value: v, .. } => wrap_result(emit_literal(v.clone(), &target)), + ExprData::ExprError { message, .. } => wrap_result(emit_error_expr(message.clone(), target.clone())), + ExprData::ExprVar { .. } => emit_var(texpr.clone()), + ExprData::ExprFieldAccess { .. } => emit_field_access(texpr.clone()), + ExprData::ExprCall { .. } => emit_call(texpr.clone()), + ExprData::ExprMethodCall { .. } => emit_method_call(texpr.clone()), + ExprData::ExprMatch => emit_match(texpr.clone()), + ExprData::ExprIf => emit_if(texpr.clone()), + ExprData::ExprLet => emit_let(texpr.clone()), + ExprData::ExprRecordLit { .. } => emit_record_lit(texpr.clone()), + ExprData::ExprBinOp { .. } => emit_bin_op(texpr.clone()), + ExprData::ExprUnaryOp { op, .. } => { + let operand = unaryop_operand(texpr.clone()); +wrap_result(emit_unary_op(op.clone(), recurse(operand), target.clone())) +}, + ExprData::ExprLambda => { + let body = lambda_body(texpr.clone()); +wrap_result(emit_lambda(emit_lambda_params(lambda_param_names_at(texpr.clone(), source_indices), &target), recurse(body), target.clone())) +}, + ExprData::ExprStringInterp => emit_string_interp(texpr.clone()), + ExprData::ExprBlock => emit_block(texpr.clone()), + ExprData::ExprCast => emit_cast(texpr.clone()), + ExprData::ExprForEach => emit_for_each(texpr.clone()), + ExprData::ExprIndex => emit_index(texpr.clone()), + ExprData::ExprSlice => emit_slice(texpr.clone()), + ExprData::ExprListLit => wrap_result(emit_list_lit_expr(&Rc::new({ let mut __result = Vec::new(); for el in texpr.children.clone().iter().cloned() { __result.push(recurse(el.clone())); } __result }), target.clone())), + ExprData::ExprReturn => { + let ret_val = return_value(texpr.clone()); +wrap_result(emit_return(recurse(ret_val), target.clone())) +}, + ExprData::NoExprData => wrap_result("".to_string()), +} +} + +pub fn emit_default_bin_op(texpr: &Rc, target: RenderTarget, source_indices: Rc>>, recurse: impl Fn(Rc) -> String + Clone, wrap_result: impl Fn(String) -> String + Clone) -> String { + match (*texpr.expr_data.clone()).clone() { + ExprData::ExprBinOp { op, algebra_field: algebra, .. } => { + let left = binop_left(texpr.clone()); +let right = binop_right(texpr.clone()); +let left_str = recurse(left); +let right_str = recurse(right); +if is_null_coalesce(op.clone()) { + wrap_result(emit_null_coalesce(left_str, right_str, target)) + } else { + { + let op_str = emit_bin_op_symbol(op.clone(), &target, algebra.clone()); +wrap_result(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("(".to_string(), left_str), " ".to_string()), op_str), " ".to_string()), right_str), ")".to_string())) +} } - _ => wrap_result(emit_error_expr( - "emit_default_bin_op expected ExprBinOp".to_string(), - target, - )), - } +}, + _ => wrap_result(emit_error_expr("emit_default_bin_op expected ExprBinOp".to_string(), target)), +} } -pub fn emit_block_stmts_shared( - mut remaining: Rc>>, - mut text: Rc>, - mut scope: Rc, - mut depth: i64, - mut prepend_indent: bool, - mut emit_expr: impl Fn(Rc, Rc, i64) -> String + Clone, -) -> Rc { +pub fn emit_block_stmts_shared(mut remaining: Rc>>, mut text: Rc>, mut scope: Rc, mut depth: i64, mut prepend_indent: bool, mut emit_expr: impl Fn(Rc, Rc, i64) -> String + Clone) -> Rc { loop { match remaining.clone().first().cloned() { - None => { - break Rc::new(BlockEmitState { - text: text, - scope: scope.clone(), - }); - } - Some(stmt) => { - let raw = emit_expr(stmt.clone(), scope.clone(), depth.clone()); - let line = if prepend_indent.clone() { - v2_rt::concat(make_indent(depth.clone()), raw) - } else { - raw - }; - let next_scope = scope_after_expr(&stmt, &scope); - { - let __tco_0 = Rc::new( - remaining - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ); - let __tco_1 = v2_rt::rc_list_push(text, line); - let __tco_2 = next_scope; - remaining = __tco_0; - text = __tco_1; - scope = __tco_2; - continue; - } - } - } - } + None => { break Rc::new(BlockEmitState { + text: text, + scope: scope.clone(), +}); }, + Some(stmt) => { let raw = emit_expr(stmt.clone(), scope.clone(), depth.clone()); +let line = if prepend_indent.clone() { + v2_rt::concat(make_indent(depth.clone()), raw) + } else { + raw + }; +let next_scope = scope_after_expr(&stmt, &scope); +{ + let __tco_0 = Rc::new(remaining.iter().cloned().skip(1 as usize).collect::>()); +let __tco_1 = v2_rt::rc_list_push(text, line); +let __tco_2 = next_scope; +remaining = __tco_0; +text = __tco_1; +scope = __tco_2; +continue; +} }, +} +} } -pub fn emit_init_block_stmts_shared( - mut remaining: Rc>>, - mut text: Rc>, - mut scope: Rc, - mut depth: i64, - mut prepend_indent: bool, - mut emit_expr: impl Fn(Rc, Rc, i64) -> String + Clone, -) -> Rc { +pub fn emit_init_block_stmts_shared(mut remaining: Rc>>, mut text: Rc>, mut scope: Rc, mut depth: i64, mut prepend_indent: bool, mut emit_expr: impl Fn(Rc, Rc, i64) -> String + Clone) -> Rc { loop { match remaining.clone().first().cloned() { - None => { - break Rc::new(BlockEmitState { - text: text, - scope: scope.clone(), - }); - } - Some(stmt) => { - let rest = Rc::new( - remaining - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ); - match rest.clone().first().cloned() { - None => { - break Rc::new(BlockEmitState { - text: text, - scope: scope.clone(), - }); - } - Some(_) => { - let raw = emit_expr(stmt.clone(), scope.clone(), depth.clone()); - let line = if prepend_indent.clone() { - v2_rt::concat(make_indent(depth.clone()), raw) - } else { - raw - }; - let next_scope = scope_after_expr(&stmt, &scope); - { - let __tco_0 = rest.clone(); - let __tco_1 = v2_rt::rc_list_push(text, line); - let __tco_2 = next_scope; - remaining = __tco_0; - text = __tco_1; - scope = __tco_2; - continue; - } - } - } - } - } - } + None => { break Rc::new(BlockEmitState { + text: text, + scope: scope.clone(), +}); }, + Some(stmt) => { let rest = Rc::new(remaining.clone().iter().cloned().skip(1 as usize).collect::>()); +match rest.clone().first().cloned() { + None => { break Rc::new(BlockEmitState { + text: text, + scope: scope.clone(), +}); }, + Some(_) => { let raw = emit_expr(stmt.clone(), scope.clone(), depth.clone()); +let line = if prepend_indent.clone() { + v2_rt::concat(make_indent(depth.clone()), raw) + } else { + raw + }; +let next_scope = scope_after_expr(&stmt, &scope); +{ + let __tco_0 = rest.clone(); +let __tco_1 = v2_rt::rc_list_push(text, line); +let __tco_2 = next_scope; +remaining = __tco_0; +text = __tco_1; +scope = __tco_2; +continue; +} }, +} }, +} +} } -pub fn emit_typed_let_shared( - name: &String, - value_str: String, - body: Option>, - target: RenderTarget, - recurse: impl Fn(Rc, Rc) -> String + Clone, - scope: Rc, - value_node: Rc, -) -> String { +pub fn emit_typed_let_shared(name: &String, value_str: String, body: Option>, target: RenderTarget, recurse: impl Fn(Rc, Rc) -> String + Clone, scope: Rc, value_node: Rc) -> String { { let let_line = emit_let_binding(name.clone(), value_str, &target); - match body { - Some(bd) => { - let next_scope = extend_scope( - &scope, - &name, - resolved_type(value_node), - Rc::new(SubValueRelation::SubValueUnknown), - ); - v2_rt::concat( - v2_rt::concat(let_line, "\n".to_string()), - recurse(bd.clone(), next_scope), - ) - } - None => let_line, - } - } +match body { + Some(bd) => { + let next_scope = extend_scope(&scope, &name, resolved_type(value_node), Rc::new(SubValueRelation::SubValueUnknown)); +v2_rt::concat(v2_rt::concat(let_line, "\n".to_string()), recurse(bd.clone(), next_scope)) +}, + None => let_line, +} +} } -pub fn emit_typed_if_shared( - cond_str: String, - then_branch: &Rc, - else_branch: Option>, - if_result_type: Option>, - depth: i64, - target: &RenderTarget, - source_indices: Rc>>, - recurse: impl Fn(Rc, i64) -> String + Clone, -) -> String { +pub fn emit_typed_if_shared(cond_str: String, then_branch: &Rc, else_branch: Option>, if_result_type: Option>, depth: i64, target: &RenderTarget, source_indices: Rc>>, recurse: impl Fn(Rc, i64) -> String + Clone) -> String { { let spec = language_spec(target.clone()); - let es = spec.expression_semantics.clone(); - let bs = spec.block_syntax.clone(); - match else_branch { - Some(eb) => match es.if_value_form.clone() { - IfValueForm::IfExpression => { - let then_str = recurse(then_branch.clone(), (depth.clone() + 1)); - let else_str = recurse(eb.clone(), (depth.clone() + 1)); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "if ".to_string(), - cond_str, - ), - bs.block_open.clone(), - ), - make_indent((depth.clone() + 1)), - ), - then_str, - ), - "\n".to_string(), - ), - make_indent(depth.clone()), - ), - bs.else_clause.clone(), - ), - make_indent((depth.clone() + 1)), - ), - else_str, - ), - "\n".to_string(), - ), - make_indent(depth.clone()), - ), - bs.block_close.clone(), - ) - } - IfValueForm::ConditionalTernary => { - let then_str = recurse(then_branch.clone(), depth.clone()); - let else_str = recurse(eb.clone(), depth.clone()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("(".to_string(), then_str), - ") if (".to_string(), - ), - cond_str, - ), - ") else (".to_string(), - ), - else_str, - ), - ")".to_string(), - ) - } - IfValueForm::IfStatement => { - let result_type = match if_result_type { - Some(rt) => emit_node_type(rt.clone(), target.clone(), source_indices), - None => emit_node_type( - resolved_type(then_branch.clone()), - target.clone(), - source_indices, - ), - }; - let then_str = recurse(then_branch.clone(), depth.clone()); - let else_str = recurse(eb.clone(), depth.clone()); - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("func() ".to_string(), result_type), " { if ".to_string()), cond_str), bs.block_open.clone()), make_indent((depth.clone() + 1))), "return ".to_string()), then_str), "\n".to_string()), make_indent(depth.clone())), bs.else_clause.clone()), make_indent((depth.clone() + 1))), "return ".to_string()), else_str), "\n".to_string()), make_indent(depth.clone())), bs.block_close.clone()), " }()".to_string()) - } - }, - None => { - if bs.significant_whitespace.clone() { - { - let then_str = recurse(then_branch.clone(), depth.clone()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("if ".to_string(), cond_str), - bs.block_open.clone(), - ), - make_indent((depth.clone() + 1)), - ), - then_str, - ) - } - } else { - { - let then_str = recurse(then_branch.clone(), (depth.clone() + 1)); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("if ".to_string(), cond_str), - bs.block_open.clone(), - ), - make_indent((depth.clone() + 1)), - ), - then_str, - ), - "\n".to_string(), - ), - make_indent(depth.clone()), - ), - bs.block_close.clone(), - ) - } - } - } - } - } +let es = spec.expression_semantics.clone(); +let bs = spec.block_syntax.clone(); +match else_branch { + Some(eb) => match es.if_value_form.clone() { + IfValueForm::IfExpression => { + let then_str = recurse(then_branch.clone(), (depth.clone() + 1)); +let else_str = recurse(eb.clone(), (depth.clone() + 1)); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("if ".to_string(), cond_str), bs.block_open.clone()), make_indent((depth.clone() + 1))), then_str), "\n".to_string()), make_indent(depth.clone())), bs.else_clause.clone()), make_indent((depth.clone() + 1))), else_str), "\n".to_string()), make_indent(depth.clone())), bs.block_close.clone()) +}, + IfValueForm::ConditionalTernary => { + let then_str = recurse(then_branch.clone(), depth.clone()); +let else_str = recurse(eb.clone(), depth.clone()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("(".to_string(), then_str), ") if (".to_string()), cond_str), ") else (".to_string()), else_str), ")".to_string()) +}, + IfValueForm::IfStatement => { + let result_type = match if_result_type { + Some(rt) => emit_node_type(rt.clone(), target.clone(), source_indices), + None => emit_node_type(resolved_type(then_branch.clone()), target.clone(), source_indices), +}; +let then_str = recurse(then_branch.clone(), depth.clone()); +let else_str = recurse(eb.clone(), depth.clone()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("func() ".to_string(), result_type), " { if ".to_string()), cond_str), bs.block_open.clone()), make_indent((depth.clone() + 1))), "return ".to_string()), then_str), "\n".to_string()), make_indent(depth.clone())), bs.else_clause.clone()), make_indent((depth.clone() + 1))), "return ".to_string()), else_str), "\n".to_string()), make_indent(depth.clone())), bs.block_close.clone()), " }()".to_string()) +}, +}, + None => if bs.significant_whitespace.clone() { + { + let then_str = recurse(then_branch.clone(), depth.clone()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("if ".to_string(), cond_str), bs.block_open.clone()), make_indent((depth.clone() + 1))), then_str) +} + } else { + { + let then_str = recurse(then_branch.clone(), (depth.clone() + 1)); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("if ".to_string(), cond_str), bs.block_open.clone()), make_indent((depth.clone() + 1))), then_str), "\n".to_string()), make_indent(depth.clone())), bs.block_close.clone()) +} + }, +} +} } -pub fn emit_param_shared( - param: &Rc, - target: &RenderTarget, - source_indices: &Rc>>, -) -> String { +pub fn emit_param_shared(param: &Rc, target: &RenderTarget, source_indices: &Rc>>) -> String { { - let ty = emit_node_type( - param_node_type_expr(¶m), - target.clone(), - source_indices.clone(), - ); - v2_rt::concat( - v2_rt::concat( - emit_ident( - param_node_name_at(param.clone(), source_indices.clone()), - target.clone(), - ), - language_spec(target.clone()) - .items - .clone() - .param_type_sep - .clone(), - ), - ty, - ) - } + let ty = emit_node_type(param_node_type_expr(¶m), target.clone(), source_indices.clone()); +v2_rt::concat(v2_rt::concat(emit_ident(param_node_name_at(param.clone(), source_indices.clone()), target.clone()), language_spec(target.clone()).items.clone().param_type_sep.clone()), ty) +} } -pub fn emit_params_shared( - params: Rc>>, - target: &RenderTarget, - source_indices: Rc>>, -) -> String { +pub fn emit_params_shared(params: Rc>>, target: &RenderTarget, source_indices: Rc>>) -> String { { - let strs = Rc::new({ - let mut __result = Vec::new(); - for p in params.iter().cloned() { - __result.push(emit_param_shared(&p, &target, &source_indices)); - } - __result - }); - strs.join( - &language_spec(target.clone()) - .items - .clone() - .param_separator - .clone(), - ) - } + let strs = Rc::new({ let mut __result = Vec::new(); for p in params.iter().cloned() { __result.push(emit_param_shared(&p, &target, &source_indices)); } __result }); +strs.join(&language_spec(target.clone()).items.clone().param_separator.clone()) +} } -pub fn emit_inferred_shared( - inferred: &Rc, - target: &RenderTarget, - source_indices: Rc>>, -) -> String { - if language_spec(target.clone()) - .expression_semantics - .clone() - .suppress_unit_return - .clone() - { +pub fn emit_inferred_shared(inferred: &Rc, target: &RenderTarget, source_indices: Rc>>) -> String { + if language_spec(target.clone()).expression_semantics.clone().suppress_unit_return.clone() { if is_unit_like(&inferred) { "".to_string() } else { - v2_rt::concat( - language_spec(target.clone()) - .items - .clone() - .return_arrow - .clone(), - emit_node_type(inferred.clone(), target.clone(), source_indices), - ) + v2_rt::concat(language_spec(target.clone()).items.clone().return_arrow.clone(), emit_node_type(inferred.clone(), target.clone(), source_indices)) } } else { - v2_rt::concat( - language_spec(target.clone()) - .items - .clone() - .return_arrow - .clone(), - emit_node_type(inferred.clone(), target.clone(), source_indices), - ) + v2_rt::concat(language_spec(target.clone()).items.clone().return_arrow.clone(), emit_node_type(inferred.clone(), target.clone(), source_indices)) } } -pub fn emit_typed_block_join( - stmts: Rc>>, - scope: Rc, - depth: i64, - emit_block_stmts: impl Fn(Rc>>, Rc, i64) -> Rc + Clone, -) -> String { +pub fn emit_typed_block_join(stmts: Rc>>, scope: Rc, depth: i64, emit_block_stmts: impl Fn(Rc>>, Rc, i64) -> Rc + Clone) -> String { { let state = emit_block_stmts(stmts, scope, depth); - state.text.clone().join(&"\n".to_string()) - } +state.text.clone().join(&"\n".to_string()) +} } -pub fn emit_algebra_method_template( - method_name: String, - recv_str: String, - first_arg_str: String, - target: RenderTarget, -) -> Option { +pub fn emit_algebra_method_template(method_name: String, recv_str: String, first_arg_str: String, target: RenderTarget) -> Option { { let spec = language_spec(target); - match spec.method_templates.clone() { - Some(templates) => match v2_rt::map_get(&templates, method_name) { - Some(tmpl) => { - let bindings = v2_rt::rc_map_insert( - seed_bindings("recv".to_string(), recv_str), - "arg".to_string(), - first_arg_str, - ); - Some(apply_named_template(tmpl.clone(), &bindings)) - } - None => None, - }, - None => None, - } - } +match spec.method_templates.clone() { + Some(templates) => match v2_rt::map_get(&templates, method_name) { + Some(tmpl) => { + let bindings = v2_rt::rc_map_insert(seed_bindings("recv".to_string(), recv_str), "arg".to_string(), first_arg_str); +Some(apply_named_template(tmpl.clone(), &bindings)) +}, + None => None, +}, + None => None, +} +} } -pub fn emit_typed_first_arg_shared( - args: Rc>>, - target: RenderTarget, - recurse: impl Fn(Rc) -> String + Clone, -) -> String { +pub fn emit_typed_first_arg_shared(args: Rc>>, target: RenderTarget, recurse: impl Fn(Rc) -> String + Clone) -> String { match args.first().cloned() { - Some(a) => recurse(arg_value(&a)), - None => emit_error_expr("missing method argument".to_string(), target), - } + Some(a) => recurse(arg_value(&a)), + None => emit_error_expr("missing method argument".to_string(), target), +} } -pub fn emit_typed_string_interp_unified( - parts: &Rc>>, - target: RenderTarget, - recurse: impl Fn(Rc) -> String + Clone, -) -> String { +pub fn emit_typed_string_interp_unified(parts: &Rc>>, target: RenderTarget, recurse: impl Fn(Rc) -> String + Clone) -> String { { let spec = language_spec(target); - let interp = spec.string_interp.clone(); - let has_interpolations = { - let mut __found = false; - for p in parts.clone().iter().cloned() { - if match (*p.clone()).clone() { - StringPart::Interpolation { .. } => true, - _ => false, - } { - __found = true; - break; - } +let interp = spec.string_interp.clone(); +let has_interpolations = { let mut __found = false; for p in parts.clone().iter().cloned() { if match (*p.clone()).clone() { + StringPart::Interpolation { .. } => true, + _ => false, +} { __found = true; break; } } __found }; +match (*interp.style.clone()).clone() { + InterpStyle::FormatArgs { placeholder: ph, .. } => { + let fmt_parts = Rc::new({ let mut __result = Vec::new(); for p in parts.clone().iter().cloned() { __result.push(match (*p.clone()).clone() { + StringPart::Text { value: v, .. } => { + let base = escape_string_literal_body(v.clone()); +let escaped = if has_interpolations.clone() { + apply_escape_pairs(base.clone(), interp.escape_pairs.clone()) + } else { + base.clone() + }; +Rc::new(InterpPart { + format_segment: escaped.clone(), + arg_expr: "".to_string(), +}) +}, + StringPart::Interpolation { expr: e, .. } => Rc::new(InterpPart { + format_segment: ph.clone(), + arg_expr: recurse(e.clone()), +}), +}); } __result }); +let fmt_str = Rc::new({ let mut __result = Vec::new(); for p in fmt_parts.clone().iter().cloned() { __result.push(p.format_segment.clone()); } __result }).join(&"".to_string()); +let args = Rc::new({ let mut __result = Vec::new(); for a in Rc::new({ let mut __result = Vec::new(); for p in fmt_parts.clone().iter().cloned() { __result.push(p.arg_expr.clone()); } __result }).iter().cloned() { if (a.clone().as_str() != "".to_string().as_str()) { __result.push(a); } } __result }); +if ((args.clone().len() as i64) == 0) { + apply_type_template1(interp.plain_template.clone(), fmt_str) + } else { + { + let args_str = args.clone().join(&", ".to_string()); +apply_type_template2(interp.format_template.clone(), fmt_str, args_str) +} } - __found - }; - match (*interp.style.clone()).clone() { - InterpStyle::FormatArgs { - placeholder: ph, .. - } => { - let fmt_parts = Rc::new({ - let mut __result = Vec::new(); - for p in parts.clone().iter().cloned() { - __result.push(match (*p.clone()).clone() { - StringPart::Text { value: v, .. } => { - let base = escape_string_literal_body(v.clone()); - let escaped = if has_interpolations.clone() { - apply_escape_pairs(base.clone(), interp.escape_pairs.clone()) - } else { - base.clone() - }; - Rc::new(InterpPart { - format_segment: escaped.clone(), - arg_expr: "".to_string(), - }) - } - StringPart::Interpolation { expr: e, .. } => Rc::new(InterpPart { - format_segment: ph.clone(), - arg_expr: recurse(e.clone()), - }), - }); - } - __result - }); - let fmt_str = Rc::new({ - let mut __result = Vec::new(); - for p in fmt_parts.clone().iter().cloned() { - __result.push(p.format_segment.clone()); - } - __result - }) - .join(&"".to_string()); - let args = Rc::new({ - let mut __result = Vec::new(); - for a in Rc::new({ - let mut __result = Vec::new(); - for p in fmt_parts.clone().iter().cloned() { - __result.push(p.arg_expr.clone()); - } - __result - }) - .iter() - .cloned() - { - if (a.clone().as_str() != "".to_string().as_str()) { - __result.push(a); - } - } - __result - }); - if ((args.clone().len() as i64) == 0) { - apply_type_template1(interp.plain_template.clone(), fmt_str) +}, + InterpStyle::InlineExpr => { + let segments = Rc::new({ let mut __result = Vec::new(); for p in parts.clone().iter().cloned() { __result.push(match (*p.clone()).clone() { + StringPart::Text { value: v, .. } => { + let base = escape_string_literal_body(v.clone()); +if has_interpolations.clone() { + apply_escape_pairs(base.clone(), interp.escape_pairs.clone()) } else { - { - let args_str = args.clone().join(&", ".to_string()); - apply_type_template2(interp.format_template.clone(), fmt_str, args_str) - } + base.clone() } - } - InterpStyle::InlineExpr => { - let segments = Rc::new({ - let mut __result = Vec::new(); - for p in parts.clone().iter().cloned() { - __result.push(match (*p.clone()).clone() { - StringPart::Text { value: v, .. } => { - let base = escape_string_literal_body(v.clone()); - if has_interpolations.clone() { - apply_escape_pairs(base.clone(), interp.escape_pairs.clone()) - } else { - base.clone() - } - } - StringPart::Interpolation { expr: e, .. } => v2_rt::concat( - v2_rt::concat("{".to_string(), recurse(e.clone())), - "}".to_string(), - ), - }); - } - __result - }); - apply_type_template1( - interp.format_template.clone(), - segments.join(&"".to_string()), - ) - } - } - } +}, + StringPart::Interpolation { expr: e, .. } => v2_rt::concat(v2_rt::concat("{".to_string(), recurse(e.clone())), "}".to_string()), +}); } __result }); +apply_type_template1(interp.format_template.clone(), segments.join(&"".to_string())) +}, +} +} } -pub fn emit_typed_record_lit_unified( - type_name: Option, - fields: &Rc>>, - target: &RenderTarget, - source_indices: Rc>>, - recurse: impl Fn(Rc) -> String + Clone, -) -> String { +pub fn emit_typed_record_lit_unified(type_name: Option, fields: &Rc>>, target: &RenderTarget, source_indices: Rc>>, recurse: impl Fn(Rc) -> String + Clone) -> String { { let rls = language_spec(target.clone()).record_lit.clone(); - match type_name { - None => { - if ((fields.clone().len() as i64) == 0) { - rls.anon_empty.clone() - } else { - { - let field_strs = Rc::new({ - let mut __result = Vec::new(); - for f in fields.clone().iter().cloned() { - __result.push(v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - rls.anon_field_indent.clone(), - "\"".to_string(), - ), - field_init_node_name_at( - f.clone(), - source_indices.clone(), - ), - ), - "\": ".to_string(), - ), - recurse(field_init_node_value(&f)), - ), - ",".to_string(), - )); - } - __result - }); - let fields_str = field_strs.join(&"\n".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(rls.anon_prefix.clone(), fields_str), - "\n".to_string(), - ), - rls.anon_suffix.clone(), - ) - } - } - } - Some(tn) => { - if ((fields.clone().len() as i64) == 0) { - v2_rt::concat(tn.clone(), rls.named_empty.clone()) - } else { - { - let field_strs = Rc::new({ - let mut __result = Vec::new(); - for f in fields.clone().iter().cloned() { - __result.push(v2_rt::concat( - v2_rt::concat( - emit_export_ident( - field_init_node_name_at( - f.clone(), - source_indices.clone(), - ), - &target, - ), - rls.named_field_sep.clone(), - ), - recurse(field_init_node_value(&f)), - )); - } - __result - }); - let fields_str = field_strs.join(&rls.named_field_join.clone()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(tn.clone(), rls.named_open.clone()), - fields_str, - ), - rls.named_close.clone(), - ) - } - } - } - } - } +match type_name { + None => if ((fields.clone().len() as i64) == 0) { + rls.anon_empty.clone() + } else { + { + let field_strs = Rc::new({ let mut __result = Vec::new(); for f in fields.clone().iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(rls.anon_field_indent.clone(), "\"".to_string()), field_init_node_name_at(f.clone(), source_indices.clone())), "\": ".to_string()), recurse(field_init_node_value(&f))), ",".to_string())); } __result }); +let fields_str = field_strs.join(&"\n".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(rls.anon_prefix.clone(), fields_str), "\n".to_string()), rls.anon_suffix.clone()) +} + }, + Some(tn) => if ((fields.clone().len() as i64) == 0) { + v2_rt::concat(tn.clone(), rls.named_empty.clone()) + } else { + { + let field_strs = Rc::new({ let mut __result = Vec::new(); for f in fields.clone().iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(emit_export_ident(field_init_node_name_at(f.clone(), source_indices.clone()), &target), rls.named_field_sep.clone()), recurse(field_init_node_value(&f)))); } __result }); +let fields_str = field_strs.join(&rls.named_field_join.clone()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(tn.clone(), rls.named_open.clone()), fields_str), rls.named_close.clone()) +} + }, +} +} } -pub fn emit_typed_call_unified( - func: &String, - args: Rc>>, - target: &RenderTarget, - registry: Rc>>, - scope: Rc, - recurse: impl Fn(Rc) -> String + Clone, -) -> String { +pub fn emit_typed_call_unified(func: &String, args: Rc>>, target: &RenderTarget, registry: Rc>>, scope: Rc, recurse: impl Fn(Rc) -> String + Clone) -> String { { let spec = language_spec(target.clone()); - let ordered_args = order_typed_call_args(&args, func.clone(), &scope); - let arg_strs = Rc::new({ - let mut __result = Vec::new(); - for a in ordered_args.iter().cloned() { - __result.push(recurse(arg_value(&a))); - } - __result - }); - let callee = lookup_item(registry, func.clone()); - let extra_args = match callee.clone() { - Some(info) => { - let has_effects = (((info.service_names.clone().len() as i64) > 0) - || ((info.resource_names.clone().len() as i64) > 0)); - if has_effects.clone() { - { - let resource_args = Rc::new({ - let mut __result = Vec::new(); - for rn in info.resource_names.clone().iter().cloned() { - __result.push(emit_ident(rn.clone(), target.clone())); - } - __result - }); - let service_args = Rc::new({ - let mut __result = Vec::new(); - for sn in info.service_names.clone().iter().cloned() { - __result.push(service_var_name(sn.clone())); - } - __result - }); - v2_rt::concat(resource_args, service_args) - } - } else { - Rc::new(vec![]) - } +let ordered_args = order_typed_call_args(&args, func.clone(), &scope); +let arg_strs = Rc::new({ let mut __result = Vec::new(); for a in ordered_args.iter().cloned() { __result.push(recurse(arg_value(&a))); } __result }); +let callee = lookup_item(registry, func.clone()); +let extra_args = match callee.clone() { + Some(info) => { + let has_effects = (((info.service_names.clone().len() as i64) > 0) || ((info.resource_names.clone().len() as i64) > 0)); +if has_effects.clone() { + { + let resource_args = Rc::new({ let mut __result = Vec::new(); for rn in info.resource_names.clone().iter().cloned() { __result.push(emit_ident(rn.clone(), target.clone())); } __result }); +let service_args = Rc::new({ let mut __result = Vec::new(); for sn in info.service_names.clone().iter().cloned() { __result.push(service_var_name(sn.clone())); } __result }); +v2_rt::concat(resource_args, service_args) +} + } else { + Rc::new(vec![]) } - None => Rc::new(vec![]), - }; - let all_args = v2_rt::concat(arg_strs, extra_args); - let args_str = all_args.join(&", ".to_string()); - let call_str = v2_rt::concat( - v2_rt::concat( - v2_rt::concat(emit_export_ident(func.clone(), &target), "(".to_string()), - args_str, - ), - ")".to_string(), - ); - match callee.clone() { - Some(info) => { - let has_effects = (((info.service_names.clone().len() as i64) > 0) - || ((info.resource_names.clone().len() as i64) > 0)); - if has_effects.clone() { - v2_rt::concat(spec.async_call_prefix.clone(), call_str) - } else { - call_str - } +}, + None => Rc::new(vec![]), +}; +let all_args = v2_rt::concat(arg_strs, extra_args); +let args_str = all_args.join(&", ".to_string()); +let call_str = v2_rt::concat(v2_rt::concat(v2_rt::concat(emit_export_ident(func.clone(), &target), "(".to_string()), args_str), ")".to_string()); +match callee.clone() { + Some(info) => { + let has_effects = (((info.service_names.clone().len() as i64) > 0) || ((info.resource_names.clone().len() as i64) > 0)); +if has_effects.clone() { + v2_rt::concat(spec.async_call_prefix.clone(), call_str) + } else { + call_str } - None => call_str, - } - } +}, + None => call_str, +} +} } pub fn bridge_method_name_unified(method_name: String, target: RenderTarget) -> String { { let spec = language_spec(target); - let overridden = - apply_bridge_method_overrides(method_name, spec.bridge_method_overrides.clone()); - apply_naming_case(overridden, spec.bridge_method_case.clone()) - } +let overridden = apply_bridge_method_overrides(method_name, spec.bridge_method_overrides.clone()); +apply_naming_case(overridden, spec.bridge_method_case.clone()) +} } -pub fn emit_algebra_method_call_unified( - method_name: &String, - receiver: Rc, - args: Rc>>, - target: &RenderTarget, - first_arg_str: String, - recurse: impl Fn(Rc) -> String + Clone, -) -> String { +pub fn emit_algebra_method_call_unified(method_name: &String, receiver: Rc, args: Rc>>, target: &RenderTarget, first_arg_str: String, recurse: impl Fn(Rc) -> String + Clone) -> String { { let spec = language_spec(target.clone()); - let recv_str = recurse(receiver); - match emit_algebra_method_template( - method_name.clone(), - recv_str.clone(), - first_arg_str, - target.clone(), - ) { - Some(result) => result.clone(), - None => { - let function_name = bridge_method_name_unified(method_name.clone(), target.clone()); - let arg_strs = Rc::new({ - let mut __result = Vec::new(); - for a in args.iter().cloned() { - __result.push(recurse(arg_value(&a))); - } - __result - }); - let all_args = v2_rt::concat(Rc::new(vec![recv_str.clone()]), arg_strs); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - spec.bridge_method_prefix.clone(), - emit_export_ident(function_name, &target), - ), - "(".to_string(), - ), - all_args.join(&", ".to_string()), - ), - ")".to_string(), - ) - } - } - } +let recv_str = recurse(receiver); +match emit_algebra_method_template(method_name.clone(), recv_str.clone(), first_arg_str, target.clone()) { + Some(result) => result.clone(), + None => { + let function_name = bridge_method_name_unified(method_name.clone(), target.clone()); +let arg_strs = Rc::new({ let mut __result = Vec::new(); for a in args.iter().cloned() { __result.push(recurse(arg_value(&a))); } __result }); +let all_args = v2_rt::concat(Rc::new(vec![recv_str.clone()]), arg_strs); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(spec.bridge_method_prefix.clone(), emit_export_ident(function_name, &target)), "(".to_string()), all_args.join(&", ".to_string())), ")".to_string()) +}, +} +} } -pub fn emit_plain_method_call_unified( - receiver: Rc, - method: String, - args: Rc>>, - target: RenderTarget, - recurse: impl Fn(Rc) -> String + Clone, -) -> String { +pub fn emit_plain_method_call_unified(receiver: Rc, method: String, args: Rc>>, target: RenderTarget, recurse: impl Fn(Rc) -> String + Clone) -> String { { let recv_str = recurse(receiver); - let arg_strs = Rc::new({ - let mut __result = Vec::new(); - for a in args.iter().cloned() { - __result.push(recurse(arg_value(&a))); - } - __result - }); - let args_str = arg_strs.join(&", ".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(recv_str, ".".to_string()), - emit_export_ident(method, &target), - ), - "(".to_string(), - ), - args_str, - ), - ")".to_string(), - ) - } +let arg_strs = Rc::new({ let mut __result = Vec::new(); for a in args.iter().cloned() { __result.push(recurse(arg_value(&a))); } __result }); +let args_str = arg_strs.join(&", ".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(recv_str, ".".to_string()), emit_export_ident(method, &target)), "(".to_string()), args_str), ")".to_string()) +} } -pub fn emit_typed_method_call_unified( - receiver: &Rc, - method: String, - args: &Rc>>, - method_semantics: &Option>, - target: &RenderTarget, - registry: Rc>>, - scope: Rc, - depth: i64, - recurse: impl Fn(Rc) -> String + Clone, -) -> String { +pub fn emit_typed_method_call_unified(receiver: &Rc, method: String, args: &Rc>>, method_semantics: &Option>, target: &RenderTarget, registry: Rc>>, scope: Rc, depth: i64, recurse: impl Fn(Rc) -> String + Clone) -> String { { let spec = language_spec(target.clone()); - let source_indices = scope.type_env.clone().source_indices.clone(); - if (method_semantics.clone() != None) { +let source_indices = scope.type_env.clone().source_indices.clone(); +if (method_semantics.clone() != None) { match (*method_semantics.clone().unwrap()).clone() { - MethodSemantics::ServiceMethodSemantics { - service_name: svc_name, - .. - } => { - let var_name = service_var_name(svc_name.clone()); - let arg_strs = Rc::new({ - let mut __result = Vec::new(); - for a in args.clone().iter().cloned() { - __result.push(recurse(arg_value(&a))); - } - __result - }); - let args_str = arg_strs.join(&", ".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(spec.async_call_prefix.clone(), var_name), - ".".to_string(), - ), - emit_export_ident(method, &target), - ), - "(".to_string(), - ), - args_str, - ), - ")".to_string(), - ) - } - MethodSemantics::AlgebraMethodSemantics { method_def, .. } => { - let mn = authored_name_at(source_indices.clone(), &method_def); - let first_arg_str = - emit_typed_first_arg_shared(args.clone(), target.clone(), recurse.clone()); - emit_algebra_method_call_unified( - &mn, - receiver.clone(), - args.clone(), - &target, - first_arg_str, - recurse.clone(), - ) - } - MethodSemantics::PlainMethodSemantics => emit_plain_method_call_unified( - receiver.clone(), - method, - args.clone(), - target.clone(), - recurse.clone(), - ), - } + MethodSemantics::ServiceMethodSemantics { service_name: svc_name, .. } => { + let var_name = service_var_name(svc_name.clone()); +let arg_strs = Rc::new({ let mut __result = Vec::new(); for a in args.clone().iter().cloned() { __result.push(recurse(arg_value(&a))); } __result }); +let args_str = arg_strs.join(&", ".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(spec.async_call_prefix.clone(), var_name), ".".to_string()), emit_export_ident(method, &target)), "(".to_string()), args_str), ")".to_string()) +}, + MethodSemantics::AlgebraMethodSemantics { method_def, .. } => { + let mn = authored_name_at(source_indices.clone(), &method_def); +let first_arg_str = emit_typed_first_arg_shared(args.clone(), target.clone(), recurse.clone()); +emit_algebra_method_call_unified(&mn, receiver.clone(), args.clone(), &target, first_arg_str, recurse.clone()) +}, + MethodSemantics::PlainMethodSemantics => emit_plain_method_call_unified(receiver.clone(), method, args.clone(), target.clone(), recurse.clone()), +} } else { if is_typed_service_call_receiver(&receiver, source_indices.clone()) { match extract_typed_service_name(&receiver, &source_indices) { - Some(svc_name) => { - let var_name = service_var_name(svc_name.clone()); - let arg_strs = Rc::new({ - let mut __result = Vec::new(); - for a in args.clone().iter().cloned() { - __result.push(recurse(arg_value(&a))); - } - __result - }); - let args_str = arg_strs.join(&", ".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(spec.async_call_prefix.clone(), var_name), - ".".to_string(), - ), - emit_export_ident(method, &target), - ), - "(".to_string(), - ), - args_str, - ), - ")".to_string(), - ) - } - None => { - emit_error_expr("unsupported service receiver".to_string(), target.clone()) - } - } + Some(svc_name) => { + let var_name = service_var_name(svc_name.clone()); +let arg_strs = Rc::new({ let mut __result = Vec::new(); for a in args.clone().iter().cloned() { __result.push(recurse(arg_value(&a))); } __result }); +let args_str = arg_strs.join(&", ".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(spec.async_call_prefix.clone(), var_name), ".".to_string()), emit_export_ident(method, &target)), "(".to_string()), args_str), ")".to_string()) +}, + None => emit_error_expr("unsupported service receiver".to_string(), target.clone()), +} } else { - emit_plain_method_call_unified( - receiver.clone(), - method, - args.clone(), - target.clone(), - recurse.clone(), - ) + emit_plain_method_call_unified(receiver.clone(), method, args.clone(), target.clone(), recurse.clone()) } } - } +} } -pub fn emit_unified_pattern( - pattern: Rc, - target: RenderTarget, - source_indices: Rc>>, -) -> String { +pub fn emit_unified_pattern(pattern: Rc, target: RenderTarget, source_indices: Rc>>) -> String { match (*pattern).clone() { - MatchPattern::Bind { name: n, .. } => emit_ident(n.clone(), target), - MatchPattern::LitPattern { value: v, .. } => emit_literal(v.clone(), &target), - MatchPattern::VariantPattern { - name: n, - field_bindings: fbs, - .. - } => emit_unified_variant_pattern(n.clone(), &fbs, &target, source_indices), - MatchPattern::Wildcard => "_".to_string(), - } + MatchPattern::Bind { name: n, .. } => emit_ident(n.clone(), target), + MatchPattern::LitPattern { value: v, .. } => emit_literal(v.clone(), &target), + MatchPattern::VariantPattern { name: n, field_bindings: fbs, .. } => emit_unified_variant_pattern(n.clone(), &fbs, &target, source_indices), + MatchPattern::Wildcard => "_".to_string(), +} } -pub fn emit_unified_variant_pattern( - name: String, - field_bindings: &Rc>>, - target: &RenderTarget, - source_indices: Rc>>, -) -> String { +pub fn emit_unified_variant_pattern(name: String, field_bindings: &Rc>>, target: &RenderTarget, source_indices: Rc>>) -> String { { let es = language_spec(target.clone()).expression_semantics.clone(); - match es.variant_pattern.clone() { - Some(vps) => { - if ((field_bindings.clone().len() as i64) == 0) { - v2_rt::concat(name, vps.empty_suffix.clone()) - } else { - { - let binding_strs = Rc::new({ - let mut __result = Vec::new(); - for fb in field_bindings.clone().iter().cloned() { - __result.push({ - let pat_str = emit_unified_pattern( - field_binding_pattern(fb.clone()), - target.clone(), - source_indices.clone(), - ); - v2_rt::concat( - v2_rt::concat( - emit_ident( - field_binding_name_at( - fb.clone(), - source_indices.clone(), - ), - target.clone(), - ), - vps.binding_sep.clone(), - ), - pat_str.clone(), - ) - }); - } - __result - }); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(name, vps.open.clone()), - binding_strs.join(&", ".to_string()), - ), - vps.close.clone(), - ) - } - } - } - None => { - if ((field_bindings.clone().len() as i64) > 0) { - emit_error_expr( - v2_rt::concat( - "variant pattern has bindings but target has no destructuring syntax: " - .to_string(), - name, - ), - target.clone(), - ) - } else { - name - } - } - } - } +match es.variant_pattern.clone() { + Some(vps) => if ((field_bindings.clone().len() as i64) == 0) { + v2_rt::concat(name, vps.empty_suffix.clone()) + } else { + { + let binding_strs = Rc::new({ let mut __result = Vec::new(); for fb in field_bindings.clone().iter().cloned() { __result.push({ + let pat_str = emit_unified_pattern(field_binding_pattern(fb.clone()), target.clone(), source_indices.clone()); +v2_rt::concat(v2_rt::concat(emit_ident(field_binding_name_at(fb.clone(), source_indices.clone()), target.clone()), vps.binding_sep.clone()), pat_str.clone()) +}); } __result }); +v2_rt::concat(v2_rt::concat(v2_rt::concat(name, vps.open.clone()), binding_strs.join(&", ".to_string())), vps.close.clone()) +} + }, + None => if ((field_bindings.clone().len() as i64) > 0) { + emit_error_expr(v2_rt::concat("variant pattern has bindings but target has no destructuring syntax: ".to_string(), name), target.clone()) + } else { + name + }, +} +} } -pub fn emit_match_arm_line( - arm: Rc, - target: RenderTarget, - case_depth: i64, - body_depth: i64, - body_str: String, - guard_str: String, - render_pattern: impl Fn(Rc) -> String + Clone, -) -> String { +pub fn emit_match_arm_line(arm: Rc, target: RenderTarget, case_depth: i64, body_depth: i64, body_str: String, guard_str: String, render_pattern: impl Fn(Rc) -> String + Clone) -> String { { let spec = language_spec(target); - let bs = spec.block_syntax.clone(); - let es = spec.expression_semantics.clone(); - let pat = arm_pattern(arm); - let case_kw = match (*pat.clone()).clone() { - MatchPattern::Wildcard => match es.wildcard_case.clone() { - Some(wc) => wc.clone(), - None => v2_rt::concat(bs.case_keyword.clone(), render_pattern(pat.clone())), - }, - _ => v2_rt::concat(bs.case_keyword.clone(), render_pattern(pat.clone())), - }; - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(v2_rt::concat(make_indent(case_depth), case_kw), guard_str), - ":\n".to_string(), - ), - make_indent(body_depth), - ), - body_str, - ) - } +let bs = spec.block_syntax.clone(); +let es = spec.expression_semantics.clone(); +let pat = arm_pattern(arm); +let case_kw = match (*pat.clone()).clone() { + MatchPattern::Wildcard => match es.wildcard_case.clone() { + Some(wc) => wc.clone(), + None => v2_rt::concat(bs.case_keyword.clone(), render_pattern(pat.clone())), +}, + _ => v2_rt::concat(bs.case_keyword.clone(), render_pattern(pat.clone())), +}; +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(make_indent(case_depth), case_kw), guard_str), ":\n".to_string()), make_indent(body_depth)), body_str) +} } -pub fn emit_arm_guard( - arm: Rc, - target: &RenderTarget, - render_guard_expr: impl Fn(Rc) -> String + Clone, -) -> String { +pub fn emit_arm_guard(arm: Rc, target: &RenderTarget, render_guard_expr: impl Fn(Rc) -> String + Clone) -> String { { let es = language_spec(target.clone()).expression_semantics.clone(); - match arm_guard(&arm) { - Some(g) => match es.guard_prefix.clone() { - Some(prefix) => v2_rt::concat(prefix.clone(), render_guard_expr(g.clone())), - None => emit_error_expr( - "target does not support pattern guards".to_string(), - target.clone(), - ), - }, - None => "".to_string(), - } - } +match arm_guard(&arm) { + Some(g) => match es.guard_prefix.clone() { + Some(prefix) => v2_rt::concat(prefix.clone(), render_guard_expr(g.clone())), + None => emit_error_expr("target does not support pattern guards".to_string(), target.clone()), +}, + None => "".to_string(), +} +} } -pub fn emit_typed_match_unified( - scrutinee_str: String, - arms: Rc>>, - target: &RenderTarget, - depth: i64, - recurse: impl Fn(Rc, i64) -> String + Clone, - render_pattern: impl Fn(Rc) -> String + Clone, - source_indices: Rc>>, -) -> String { +pub fn emit_typed_match_unified(scrutinee_str: String, arms: Rc>>, target: &RenderTarget, depth: i64, recurse: impl Fn(Rc, i64) -> String + Clone, render_pattern: impl Fn(Rc) -> String + Clone, source_indices: Rc>>) -> String { { let bs = language_spec(target.clone()).block_syntax.clone(); - let case_depth = if bs.significant_whitespace.clone() { +let case_depth = if bs.significant_whitespace.clone() { (depth.clone() + 1) } else { depth.clone() }; - let body_depth = (case_depth.clone() + 1); - let arm_strs = Rc::new({ - let mut __result = Vec::new(); - for arm in arms.iter().cloned() { - __result.push({ - let body_str = recurse(arm_body(&arm), body_depth.clone()); - let guard_str = - emit_arm_guard(arm.clone(), &target, |g| recurse(g.clone(), depth.clone())); - emit_match_arm_line( - arm.clone(), - target.clone(), - case_depth.clone(), - body_depth.clone(), - body_str.clone(), - guard_str.clone(), - render_pattern.clone(), - ) - }); - } - __result - }); - let arms_str = arm_strs.join(&"\n".to_string()); - if (bs.block_close.clone().as_str() == "".to_string().as_str()) { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(bs.match_keyword.clone(), scrutinee_str), - bs.block_open.clone(), - ), - arms_str, - ) +let body_depth = (case_depth.clone() + 1); +let arm_strs = Rc::new({ let mut __result = Vec::new(); for arm in arms.iter().cloned() { __result.push({ + let body_str = recurse(arm_body(&arm), body_depth.clone()); +let guard_str = emit_arm_guard(arm.clone(), &target, |g| recurse(g.clone(), depth.clone())); +emit_match_arm_line(arm.clone(), target.clone(), case_depth.clone(), body_depth.clone(), body_str.clone(), guard_str.clone(), render_pattern.clone()) +}); } __result }); +let arms_str = arm_strs.join(&"\n".to_string()); +if (bs.block_close.clone().as_str() == "".to_string().as_str()) { + v2_rt::concat(v2_rt::concat(v2_rt::concat(bs.match_keyword.clone(), scrutinee_str), bs.block_open.clone()), arms_str) } else { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(bs.match_keyword.clone(), scrutinee_str), - bs.block_open.clone(), - ), - arms_str, - ), - "\n".to_string(), - ), - make_indent(depth.clone()), - ), - bs.block_close.clone(), - ) + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(bs.match_keyword.clone(), scrutinee_str), bs.block_open.clone()), arms_str), "\n".to_string()), make_indent(depth.clone())), bs.block_close.clone()) } - } +} } -pub fn emit_field_access_unified( - base_str: String, - field: String, - summary: Option>, - target: &RenderTarget, -) -> String { +pub fn emit_field_access_unified(base_str: String, field: String, summary: Option>, target: &RenderTarget) -> String { { let ts = language_spec(target.clone()).tuple_syntax.clone(); - match summary { - Some(fs) => match fs.access_style.clone() { - FieldAccessStyle::TupleFirst => v2_rt::concat(base_str, ts.first_accessor.clone()), - FieldAccessStyle::TupleSecond => { - v2_rt::concat(base_str, ts.second_accessor.clone()) - } - _ => v2_rt::concat( - v2_rt::concat(base_str, ".".to_string()), - emit_export_ident(field, &target), - ), - }, - None => v2_rt::concat( - v2_rt::concat(base_str, ".".to_string()), - emit_export_ident(field, &target), - ), - } - } +match summary { + Some(fs) => match fs.access_style.clone() { + FieldAccessStyle::TupleFirst => v2_rt::concat(base_str, ts.first_accessor.clone()), + FieldAccessStyle::TupleSecond => v2_rt::concat(base_str, ts.second_accessor.clone()), + _ => v2_rt::concat(v2_rt::concat(base_str, ".".to_string()), emit_export_ident(field, &target)), +}, + None => v2_rt::concat(v2_rt::concat(base_str, ".".to_string()), emit_export_ident(field, &target)), +} +} } -pub fn emit_unified_typed_expr( - texpr: Rc, - target: &RenderTarget, - registry: Rc>>, - scope: &Rc, - depth: i64, - fuel: i64, - render_pattern: impl Fn(Rc) -> String + Clone, -) -> String { +pub fn emit_unified_typed_expr(texpr: Rc, target: &RenderTarget, registry: Rc>>, scope: &Rc, depth: i64, fuel: i64, render_pattern: impl Fn(Rc) -> String + Clone) -> String { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - let si = scope.type_env.clone().source_indices.clone(); - let spec = language_spec(target.clone()); - emit_shared_expr( - &texpr, - &target, - si.clone(), - |result| result.clone(), - |child| { - emit_unified_typed_expr( - child.clone(), - &target, - registry.clone(), - &scope, - depth.clone(), - (fuel.clone() - 1), - render_pattern.clone(), - ) - }, - |expr| emit_expr_var_shared(expr.clone(), target.clone(), si.clone()), - |expr| { + { + let si = scope.type_env.clone().source_indices.clone(); +let spec = language_spec(target.clone()); +emit_shared_expr(&texpr, &target, si.clone(), |result| result.clone(), |child| emit_unified_typed_expr(child.clone(), &target, registry.clone(), &scope, depth.clone(), (fuel.clone() - 1), render_pattern.clone()), |expr| emit_expr_var_shared(expr.clone(), target.clone(), si.clone()), |expr| { let fa_si = scope.type_env.clone().source_indices.clone(); - if is_typed_service_call_receiver(&expr, fa_si.clone()) { +if is_typed_service_call_receiver(&expr, fa_si.clone()) { match extract_typed_service_name(&expr, &fa_si) { - Some(svc_name) => service_var_name(svc_name.clone()), - None => { - let base_str = emit_unified_typed_expr( - field_access_base(expr.clone()), - &target, - registry.clone(), - &scope, - depth.clone(), - 1024, - render_pattern.clone(), - ); - emit_field_access_unified( - base_str.clone(), - field_access_field_at(expr.clone(), fa_si.clone()), - expr_field_access_summary(expr.clone()), - &target, - ) - } - } + Some(svc_name) => service_var_name(svc_name.clone()), + None => { + let base_str = emit_unified_typed_expr(field_access_base(expr.clone()), &target, registry.clone(), &scope, depth.clone(), 1024, render_pattern.clone()); +emit_field_access_unified(base_str.clone(), field_access_field_at(expr.clone(), fa_si.clone()), expr_field_access_summary(expr.clone()), &target) +}, +} } else { { - let base_str = emit_unified_typed_expr( - field_access_base(expr.clone()), - &target, - registry.clone(), - &scope, - depth.clone(), - 1024, - render_pattern.clone(), - ); - emit_field_access_unified( - base_str.clone(), - field_access_field_at(expr.clone(), fa_si.clone()), - expr_field_access_summary(expr.clone()), - &target, - ) - } - } - }, - |expr| { - emit_typed_call_unified( - &expr_call_func_at(expr.clone(), si.clone()), - expr.children.clone(), - &target, - registry.clone(), - scope.clone(), - |n| { - emit_unified_typed_expr( - n.clone(), - &target, - registry.clone(), - &scope, - depth.clone(), - 1024, - render_pattern.clone(), - ) - }, - ) - }, - |expr| { - emit_typed_method_call_unified( - &method_receiver(expr.clone()), - expr_method_name_at(expr.clone(), si.clone()), - &method_arg_nodes(expr.clone()), - &expr_method_call_semantics(expr.clone()), - &target, - registry.clone(), - scope.clone(), - depth.clone(), - |n| { - emit_unified_typed_expr( - n.clone(), - &target, - registry.clone(), - &scope, - depth.clone(), - 1024, - render_pattern.clone(), - ) - }, - ) - }, - |expr| { - let scrut_str = emit_unified_typed_expr( - match_scrutinee(expr.clone()), - &target, - registry.clone(), - &scope, - depth.clone(), - 1024, - render_pattern.clone(), - ); - emit_typed_match_unified( - scrut_str.clone(), - match_arm_nodes(expr.clone()), - &target, - depth.clone(), - |node, d| { - emit_unified_typed_expr( - node.clone(), - &target, - registry.clone(), - &scope, - d.clone(), - 1024, - render_pattern.clone(), - ) - }, - render_pattern.clone(), - si.clone(), - ) - }, - |expr| { - let cond_str = emit_unified_typed_expr( - if_condition(expr.clone()), - &target, - registry.clone(), - &scope, - depth.clone(), - 1024, - render_pattern.clone(), - ); - let if_result_type = match spec.expression_semantics.clone().if_value_form.clone() { - IfValueForm::IfStatement => Some(resolved_type(expr.clone())), - _ => None, + let base_str = emit_unified_typed_expr(field_access_base(expr.clone()), &target, registry.clone(), &scope, depth.clone(), 1024, render_pattern.clone()); +emit_field_access_unified(base_str.clone(), field_access_field_at(expr.clone(), fa_si.clone()), expr_field_access_summary(expr.clone()), &target) +} + } +}, |expr| emit_typed_call_unified(&expr_call_func_at(expr.clone(), si.clone()), expr.children.clone(), &target, registry.clone(), scope.clone(), |n| emit_unified_typed_expr(n.clone(), &target, registry.clone(), &scope, depth.clone(), 1024, render_pattern.clone())), |expr| emit_typed_method_call_unified(&method_receiver(expr.clone()), expr_method_name_at(expr.clone(), si.clone()), &method_arg_nodes(expr.clone()), &expr_method_call_semantics(expr.clone()), &target, registry.clone(), scope.clone(), depth.clone(), |n| emit_unified_typed_expr(n.clone(), &target, registry.clone(), &scope, depth.clone(), 1024, render_pattern.clone())), |expr| { + let scrut_str = emit_unified_typed_expr(match_scrutinee(expr.clone()), &target, registry.clone(), &scope, depth.clone(), 1024, render_pattern.clone()); +emit_typed_match_unified(scrut_str.clone(), match_arm_nodes(expr.clone()), &target, depth.clone(), |node, d| emit_unified_typed_expr(node.clone(), &target, registry.clone(), &scope, d.clone(), 1024, render_pattern.clone()), render_pattern.clone(), si.clone()) +}, |expr| { + let cond_str = emit_unified_typed_expr(if_condition(expr.clone()), &target, registry.clone(), &scope, depth.clone(), 1024, render_pattern.clone()); +let if_result_type = match spec.expression_semantics.clone().if_value_form.clone() { + IfValueForm::IfStatement => Some(resolved_type(expr.clone())), + _ => None, +}; +emit_typed_if_shared(cond_str.clone(), &if_then_branch(expr.clone()), if_else_branch(expr.clone()), if_result_type.clone(), depth.clone(), &target, si.clone(), |node, d| emit_unified_typed_expr(node.clone(), &target, registry.clone(), &scope, d.clone(), 1024, render_pattern.clone())) +}, |expr| { + let val_str = emit_unified_typed_expr(let_value(expr.clone()), &target, registry.clone(), &scope, depth.clone(), 1024, render_pattern.clone()); +emit_typed_let_shared(&let_binding_name_at(expr.clone(), si.clone()), val_str.clone(), let_body(expr.clone()), target.clone(), |bd, sc| emit_unified_typed_expr(bd.clone(), &target, registry.clone(), &sc, depth.clone(), 1024, render_pattern.clone()), scope.clone(), let_value(expr.clone())) +}, |expr| emit_typed_record_lit_unified(record_lit_type_name_at(expr.clone(), si.clone()), &expr.children.clone(), &target, si.clone(), |n| emit_unified_typed_expr(n.clone(), &target, registry.clone(), &scope, depth.clone(), 1024, render_pattern.clone())), |expr| emit_typed_string_interp_unified(&extract_string_interp_parts(expr.clone()), target.clone(), |e| emit_unified_typed_expr(e.clone(), &target, registry.clone(), &scope, depth.clone(), 1024, render_pattern.clone())), |expr| emit_typed_block_join(expr.children.clone(), scope.clone(), depth.clone(), |remaining, sc, d| { + let prepend = if spec.block_syntax.clone().significant_whitespace.clone() { + false + } else { + true }; - emit_typed_if_shared( - cond_str.clone(), - &if_then_branch(expr.clone()), - if_else_branch(expr.clone()), - if_result_type.clone(), - depth.clone(), - &target, - si.clone(), - |node, d| { - emit_unified_typed_expr( - node.clone(), - &target, - registry.clone(), - &scope, - d.clone(), - 1024, - render_pattern.clone(), - ) - }, - ) - }, - |expr| { - let val_str = emit_unified_typed_expr( - let_value(expr.clone()), - &target, - registry.clone(), - &scope, - depth.clone(), - 1024, - render_pattern.clone(), - ); - emit_typed_let_shared( - &let_binding_name_at(expr.clone(), si.clone()), - val_str.clone(), - let_body(expr.clone()), - target.clone(), - |bd, sc| { - emit_unified_typed_expr( - bd.clone(), - &target, - registry.clone(), - &sc, - depth.clone(), - 1024, - render_pattern.clone(), - ) - }, - scope.clone(), - let_value(expr.clone()), - ) - }, - |expr| { - emit_typed_record_lit_unified( - record_lit_type_name_at(expr.clone(), si.clone()), - &expr.children.clone(), - &target, - si.clone(), - |n| { - emit_unified_typed_expr( - n.clone(), - &target, - registry.clone(), - &scope, - depth.clone(), - 1024, - render_pattern.clone(), - ) - }, - ) - }, - |expr| { - emit_typed_string_interp_unified( - &extract_string_interp_parts(expr.clone()), - target.clone(), - |e| { - emit_unified_typed_expr( - e.clone(), - &target, - registry.clone(), - &scope, - depth.clone(), - 1024, - render_pattern.clone(), - ) - }, - ) - }, - |expr| { - emit_typed_block_join( - expr.children.clone(), - scope.clone(), - depth.clone(), - |remaining, sc, d| { - let prepend = if spec.block_syntax.clone().significant_whitespace.clone() { - false - } else { - true - }; - emit_block_stmts_shared( - remaining.clone(), - Rc::new(vec![]), - sc.clone(), - d.clone(), - prepend.clone(), - |stmt, s, dd| { - emit_unified_typed_expr( - stmt.clone(), - &target, - registry.clone(), - &s, - dd.clone(), - 1024, - render_pattern.clone(), - ) - }, - ) - }, - ) - }, - |expr| { - emit_typed_cast_shared( - &cast_expr(expr.clone()), - cast_target(expr.clone()), - &target, - |child| { - emit_unified_typed_expr( - child.clone(), - &target, - registry.clone(), - &scope, - depth.clone(), - 1024, - render_pattern.clone(), - ) - }, - &si, - ) - }, - |expr| { - emit_typed_for_each_shared( - &foreach_variable_at(expr.clone(), si.clone()), - &foreach_collection(expr.clone()), - foreach_body(expr.clone()), - &target, - depth.clone(), - si.clone(), - |child, s, d| { - emit_unified_typed_expr( - child.clone(), - &target, - registry.clone(), - &s, - d.clone(), - 1024, - render_pattern.clone(), - ) - }, - &scope, - ) - }, - |expr| { - emit_typed_index_shared( - &index_base(expr.clone()), - index_expr(expr.clone()), - &target, - |child| { - emit_unified_typed_expr( - child.clone(), - &target, - registry.clone(), - &scope, - depth.clone(), - 1024, - render_pattern.clone(), - ) - }, - &si, - ) - }, - |expr| { - emit_typed_slice_shared( - &slice_base(expr.clone()), - slice_start(expr.clone()), - slice_end(expr.clone()), - &target, - |child| { - emit_unified_typed_expr( - child.clone(), - &target, - registry.clone(), - &scope, - depth.clone(), - 1024, - render_pattern.clone(), - ) - }, - si.clone(), - ) - }, - |expr| { - emit_default_bin_op( - &expr, - target.clone(), - si.clone(), - |child| { - emit_unified_typed_expr( - child.clone(), - &target, - registry.clone(), - &scope, - depth.clone(), - (fuel.clone() - 1), - render_pattern.clone(), - ) - }, - |result| result.clone(), - ) - }, - ) +emit_block_stmts_shared(remaining.clone(), Rc::new(vec![]), sc.clone(), d.clone(), prepend.clone(), |stmt, s, dd| emit_unified_typed_expr(stmt.clone(), &target, registry.clone(), &s, dd.clone(), 1024, render_pattern.clone())) +}), |expr| emit_typed_cast_shared(&cast_expr(expr.clone()), cast_target(expr.clone()), &target, |child| emit_unified_typed_expr(child.clone(), &target, registry.clone(), &scope, depth.clone(), 1024, render_pattern.clone()), &si), |expr| emit_typed_for_each_shared(&foreach_variable_at(expr.clone(), si.clone()), &foreach_collection(expr.clone()), foreach_body(expr.clone()), &target, depth.clone(), si.clone(), |child, s, d| emit_unified_typed_expr(child.clone(), &target, registry.clone(), &s, d.clone(), 1024, render_pattern.clone()), &scope), |expr| emit_typed_index_shared(&index_base(expr.clone()), index_expr(expr.clone()), &target, |child| emit_unified_typed_expr(child.clone(), &target, registry.clone(), &scope, depth.clone(), 1024, render_pattern.clone()), &si), |expr| emit_typed_slice_shared(&slice_base(expr.clone()), slice_start(expr.clone()), slice_end(expr.clone()), &target, |child| emit_unified_typed_expr(child.clone(), &target, registry.clone(), &scope, depth.clone(), 1024, render_pattern.clone()), si.clone()), |expr| emit_default_bin_op(&expr, target.clone(), si.clone(), |child| emit_unified_typed_expr(child.clone(), &target, registry.clone(), &scope, depth.clone(), (fuel.clone() - 1), render_pattern.clone()), |result| result.clone())) +} }) } -pub fn is_tco_identity_passthrough( - arg_val: &Rc, - param_name: String, - si: Rc>>, -) -> bool { +pub fn is_tco_identity_passthrough(arg_val: &Rc, param_name: String, si: Rc>>) -> bool { match (*arg_val.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - (expr_var_name_at(arg_val.clone(), si).as_str() == param_name.as_str()) - } - _ => false, - } + ExprData::ExprVar { .. } => (expr_var_name_at(arg_val.clone(), si).as_str() == param_name.as_str()), + _ => false, +} } -pub fn emit_typed_tco_reassign_shared( - args: Rc>>, - params: Rc>>, - target: &RenderTarget, - recurse: impl Fn(Rc) -> String + Clone, - source_indices: Rc>>, -) -> String { +pub fn emit_typed_tco_reassign_shared(args: Rc>>, params: Rc>>, target: &RenderTarget, recurse: impl Fn(Rc) -> String + Clone, source_indices: Rc>>) -> String { { - let arg_values = Rc::new({ - let mut __result = Vec::new(); - for a in args.iter().cloned() { - __result.push(arg_value(&a)); - } - __result - }); - let pairs = Rc::new({ - let mut __result = Vec::new(); - for pair in Rc::new( - params - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - { - if { - let pname = param_node_name_at(pair.1.clone(), source_indices.clone()); - let av = match arg_values.clone().get(pair.0.clone() as usize).cloned() { - Some(v) => v.clone(), - None => pair.1.clone(), - }; - !is_tco_identity_passthrough(&av, pname.clone(), source_indices.clone()) - } { - __result.push(pair); - } - } - __result - }); - let filtered_arg_values = Rc::new({ - let mut __result = Vec::new(); - for pair in pairs.clone().iter().cloned() { - __result.push( - match arg_values.clone().get(pair.0.clone() as usize).cloned() { - Some(v) => v.clone(), - None => pair.1.clone(), - }, - ); - } - __result - }); - let ordered_args = Rc::new({ - let mut __result = Vec::new(); - for av in filtered_arg_values.iter().cloned() { - __result.push(recurse(av.clone())); - } - __result - }); - let param_names = Rc::new({ - let mut __result = Vec::new(); - for pair in pairs.clone().iter().cloned() { - __result.push(emit_ident( - param_node_name_at(pair.1.clone(), source_indices.clone()), - target.clone(), - )); - } - __result - }); - shared_tco_reassign(ordered_args, param_names, &language_spec(target.clone())) - } + let arg_values = Rc::new({ let mut __result = Vec::new(); for a in args.iter().cloned() { __result.push(arg_value(&a)); } __result }); +let pairs = Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(params.iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { if { + let pname = param_node_name_at(pair.1.clone(), source_indices.clone()); +let av = match arg_values.clone().get(pair.0.clone() as usize).cloned() { + Some(v) => v.clone(), + None => pair.1.clone(), +}; +!is_tco_identity_passthrough(&av, pname.clone(), source_indices.clone()) +} { __result.push(pair); } } __result }); +let filtered_arg_values = Rc::new({ let mut __result = Vec::new(); for pair in pairs.clone().iter().cloned() { __result.push(match arg_values.clone().get(pair.0.clone() as usize).cloned() { + Some(v) => v.clone(), + None => pair.1.clone(), +}); } __result }); +let ordered_args = Rc::new({ let mut __result = Vec::new(); for av in filtered_arg_values.iter().cloned() { __result.push(recurse(av.clone())); } __result }); +let param_names = Rc::new({ let mut __result = Vec::new(); for pair in pairs.clone().iter().cloned() { __result.push(emit_ident(param_node_name_at(pair.1.clone(), source_indices.clone()), target.clone())); } __result }); +shared_tco_reassign(ordered_args, param_names, &language_spec(target.clone())) +} } pub fn seed_bindings(key: String, value: String) -> Rc> { diff --git a/src/v2/stage0/src/v2_compiler_emit_go.rs b/src/v2/stage0/src/v2_compiler_emit_go.rs index c84b2b03217..5dfc39fc302 100644 --- a/src/v2/stage0/src/v2_compiler_emit_go.rs +++ b/src/v2/stage0/src/v2_compiler_emit_go.rs @@ -1,683 +1,220 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.emit_go -pub use crate::extdeps_languages_go_emit::{go_reserved, go_reserved_escape_suffix}; -pub use crate::std_induction::SubValueRelation; -use crate::std_induction::SubValueRelation::SubValueUnknown; -pub use crate::v2_compiler_artifact::RenderTarget; -use crate::v2_compiler_artifact::RenderTarget::Go; -pub use crate::v2_compiler_emit::{ - apply_named_template, apply_naming_case, apply_type_template1, apply_type_template2, - apply_type_template3, capitalize_first, compute_service_fields, effective_operation_transport, - emit_algebra_method_template, emit_bin_op_symbol, emit_container, emit_default_bin_op, - emit_error_expr, emit_expr_field_access_shared, emit_expr_var_shared, emit_ident, - emit_inferred_shared, emit_keyword, emit_lambda, emit_lambda_params, emit_let_binding, - emit_list_lit_expr, emit_literal, emit_map_type, emit_node_type, emit_null_coalesce, - emit_param_shared, emit_params_shared, emit_return, emit_shared_expr, emit_simple_expr, - emit_string_literal, emit_tco_unified, emit_typed_block_join, emit_typed_call_unified, - emit_typed_cast_shared, emit_typed_first_arg_shared, emit_typed_for_each_shared, - emit_typed_if_shared, emit_typed_index_shared, emit_typed_let_shared, emit_typed_match_unified, - emit_typed_method_call_unified, emit_typed_record_lit_unified, emit_typed_slice_shared, - emit_typed_string_interp_unified, emit_unary_op, emit_unified_init_block_stmts, - emit_unified_operation_method, emit_unified_pattern, emit_unified_service_def, - emit_unified_transport_dispatch, emit_unified_typed_expr, emit_unified_typed_func_body, - empty_emit_scope, escape_go_interp_text, escape_json_string, escape_string_literal_body, - extract_string_interp_parts, extract_test_projections, has_nested_records_node, - is_data_def_item, is_function_item, is_null_coalesce, is_resource_def_item, - is_service_def_item, is_service_item, is_tco_eligible, is_type_alias_item, - is_type_alias_return_node, is_type_decl_item, is_type_def_item, is_upper, language_spec, - lookup_item, make_indent, module_emit_scope, module_to_filename, order_typed_call_args, - sanitize_service_name, scope_after_expr, seed_bindings, service_fallback_transport, - service_field_decls, service_var_name, test_file_path, test_function_name, to_lower_char, - to_screaming_snake, to_snake, to_string, to_string_helper, to_upper_char, - typed_named_arg_matches, unique_strings, BlockEmitState, EmitResult, InterpPart, - ServiceFieldSet, TestProjection, -}; -pub use crate::v2_compiler_infer::{build_params_scope, expr_span, extend_scope, InferScope}; -pub use crate::v2_compiler_infer_env::{authored_name, TypeBinding, TypeEnv}; -pub use crate::v2_compiler_infer_items::{ItemInfo, ResolvedGraph, TypedModule}; -pub use crate::v2_compiler_infer_service::{ - extract_typed_service_name, is_typed_service_call_receiver, -}; -pub use crate::v2_compiler_infer_sigs::{ResolvedFuncEnv, ResolvedFuncSig}; -pub use crate::v2_compiler_infer_types::{ - node_is_keyed_collection, normalize_access_type_node, resolved_type, -}; -use crate::v2_compiler_languages::VisibilitySpec::CaseVisibility; -pub use crate::v2_compiler_languages::{ - is_string_like, scaffold_for_target, test_conventions_for_target, ItemKeywords, - TestConventions, VisibilitySpec, -}; +use std::collections::HashMap; +use std::rc::Rc; use crate::v2_rt; -use crate::v2_std_core::BinOp::NullCoalesce; -use crate::v2_std_core::Cardinality::CardOptional; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::v2_std_core::{Node, InferredNode, VarBindingKind, import_is_all, module_imports, module_items, param_node_type_expr, authored_name_at, NewlineIndex, expr_var_name_at, expr_call_func_at, expr_method_name_at, let_binding_name_at, param_node_name_at, resource_use_name_at, MatchPattern, LiteralValue, TextFile, SourceSpan, resource_use_resource, BinOp, UnaryOpKind, StringPart, DeclaredFuncSig, transport_has_auth, transport_auth_header_name, transport_headers, transport_env, ExprData, make_expr_node, MethodSemantics, FieldSummary, FieldAccessStyle, arg_value, arm_body, arm_pattern, arm_guard, field_init_node_name_at, field_init_node_value, if_condition, if_then_branch, if_else_branch, match_scrutinee, match_arm_nodes, let_value, let_body, field_access_base, field_access_field_at, method_receiver, expr_field_access_summary, expr_method_call_semantics, record_lit_type_name_at, lambda_body, cast_expr, cast_target, return_value, foreach_variable_at, foreach_collection, foreach_body, method_arg_nodes, index_base, index_expr, slice_base, slice_start, slice_end, with_required_cardinality, Connective, is_rest_transport, is_shell_transport, is_file_transport, Cardinality}; +use crate::v2_std_core::InferredNode::{Resolved, CompilerError}; +use crate::v2_std_core::VarBindingKind::{FunctionValueBinding}; +use crate::v2_std_core::BinOp::{NullCoalesce}; +use crate::v2_std_core::ExprData::{NoExprData, ExprLiteral, ExprError, ExprVar, ExprFieldAccess, ExprCall, ExprMethodCall, ExprMatch, ExprIf, ExprLet, ExprRecordLit, ExprListLit, ExprBinOp, ExprUnaryOp, ExprLambda, ExprStringInterp, ExprBlock, ExprCast, ExprForEach, ExprIndex, ExprSlice, ExprReturn}; +use crate::v2_std_core::MethodSemantics::{PlainMethodSemantics, AlgebraMethodSemantics, ServiceMethodSemantics}; +use crate::v2_std_core::StringPart::{Text, Interpolation}; +use crate::v2_std_core::FieldAccessStyle::{StoredField, EnumAccessor, OptionalUnwrap, TupleFirst, TupleSecond}; use crate::v2_std_core::Connective::{Conj, Disj}; -use crate::v2_std_core::ExprData::{ - ExprBinOp, ExprBlock, ExprCall, ExprCast, ExprError, ExprFieldAccess, ExprForEach, ExprIf, - ExprIndex, ExprLambda, ExprLet, ExprListLit, ExprLiteral, ExprMatch, ExprMethodCall, - ExprRecordLit, ExprReturn, ExprSlice, ExprStringInterp, ExprUnaryOp, ExprVar, NoExprData, -}; -use crate::v2_std_core::FieldAccessStyle::{ - EnumAccessor, OptionalUnwrap, StoredField, TupleFirst, TupleSecond, -}; -use crate::v2_std_core::InferredNode::{CompilerError, Resolved}; -use crate::v2_std_core::LiteralValue::*; +use crate::v2_std_core::Cardinality::{CardOptional}; use crate::v2_std_core::MatchPattern::*; -use crate::v2_std_core::MethodSemantics::{ - AlgebraMethodSemantics, PlainMethodSemantics, ServiceMethodSemantics, -}; -use crate::v2_std_core::StringPart::{Interpolation, Text}; +use crate::v2_std_core::LiteralValue::*; use crate::v2_std_core::UnaryOpKind::*; -use crate::v2_std_core::VarBindingKind::FunctionValueBinding; -pub use crate::v2_std_core::{ - arg_value, arm_body, arm_guard, arm_pattern, authored_name_at, cast_expr, cast_target, - expr_call_func_at, expr_field_access_summary, expr_method_call_semantics, expr_method_name_at, - expr_var_name_at, field_access_base, field_access_field_at, field_init_node_name_at, - field_init_node_value, foreach_body, foreach_collection, foreach_variable_at, if_condition, - if_else_branch, if_then_branch, import_is_all, index_base, index_expr, is_file_transport, - is_rest_transport, is_shell_transport, lambda_body, let_binding_name_at, let_body, let_value, - make_expr_node, match_arm_nodes, match_scrutinee, method_arg_nodes, method_receiver, - module_imports, module_items, param_node_name_at, param_node_type_expr, - record_lit_type_name_at, resource_use_name_at, resource_use_resource, return_value, slice_base, - slice_end, slice_start, transport_auth_header_name, transport_env, transport_has_auth, - transport_headers, with_required_cardinality, BinOp, Cardinality, Connective, DeclaredFuncSig, - ExprData, FieldAccessStyle, FieldSummary, InferredNode, LiteralValue, MatchPattern, - MethodSemantics, NewlineIndex, Node, SourceSpan, StringPart, TextFile, UnaryOpKind, - VarBindingKind, -}; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; -use std::collections::HashMap; -use std::rc::Rc; +pub use crate::v2_compiler_artifact::{RenderTarget}; +use crate::v2_compiler_artifact::RenderTarget::{Go}; +pub use crate::extdeps_languages_go_emit::{go_reserved, go_reserved_escape_suffix}; +pub use crate::v2_compiler_languages::{scaffold_for_target, TestConventions, ItemKeywords, test_conventions_for_target, is_string_like, VisibilitySpec}; +use crate::v2_compiler_languages::VisibilitySpec::{CaseVisibility}; +pub use crate::v2_compiler_infer_env::{TypeEnv, TypeBinding, authored_name}; +pub use crate::v2_compiler_infer_types::{resolved_type, normalize_access_type_node, node_is_keyed_collection}; +pub use crate::v2_compiler_infer_sigs::{ResolvedFuncSig, ResolvedFuncEnv}; +pub use crate::v2_compiler_infer_items::{ResolvedGraph, TypedModule, ItemInfo}; +pub use crate::v2_compiler_infer_service::{is_typed_service_call_receiver, extract_typed_service_name}; +pub use crate::v2_compiler_infer::{InferScope, build_params_scope, extend_scope, expr_span}; +pub use crate::std_induction::{SubValueRelation}; +use crate::std_induction::SubValueRelation::{SubValueUnknown}; +pub use crate::v2_compiler_emit::{EmitResult, BlockEmitState, InterpPart, TestProjection, emit_literal, emit_bin_op_symbol, emit_keyword, emit_container, emit_map_type, emit_node_type, emit_ident, emit_let_binding, emit_simple_expr, emit_unary_op, emit_lambda, emit_error_expr, emit_return, emit_lambda_params, emit_list_lit_expr, emit_shared_expr, emit_default_bin_op, emit_string_literal, escape_go_interp_text, escape_string_literal_body, empty_emit_scope, module_emit_scope, scope_after_expr, lookup_item, unique_strings, escape_json_string, module_to_filename, make_indent, to_string, to_string_helper, to_snake, to_screaming_snake, is_upper, to_lower_char, to_upper_char, capitalize_first, sanitize_service_name, service_var_name, test_function_name, apply_type_template1, apply_type_template2, apply_type_template3, apply_named_template, language_spec, is_null_coalesce, emit_null_coalesce, is_type_alias_return_node, has_nested_records_node, is_service_item, typed_named_arg_matches, order_typed_call_args, is_type_def_item, is_type_alias_item, is_type_decl_item, is_function_item, is_data_def_item, is_service_def_item, is_resource_def_item, extract_test_projections, is_tco_eligible, service_fallback_transport, effective_operation_transport, ServiceFieldSet, compute_service_fields, service_field_decls, seed_bindings, emit_expr_var_shared, emit_expr_field_access_shared, extract_string_interp_parts, emit_typed_cast_shared, emit_typed_for_each_shared, emit_typed_index_shared, emit_typed_slice_shared, emit_unified_init_block_stmts, emit_typed_if_shared, emit_typed_let_shared, emit_param_shared, emit_params_shared, apply_naming_case, emit_inferred_shared, emit_typed_block_join, emit_typed_first_arg_shared, emit_algebra_method_template, emit_typed_string_interp_unified, emit_typed_record_lit_unified, emit_typed_call_unified, emit_typed_method_call_unified, emit_typed_match_unified, emit_unified_typed_expr, emit_tco_unified, emit_unified_pattern, test_file_path, emit_unified_typed_func_body, emit_unified_service_def, emit_unified_operation_method, emit_unified_transport_dispatch}; pub fn emit_go(typed: &Rc) -> Rc { { let registry = typed.item_registry.clone(); - let test_projections = extract_test_projections(typed.clone()); - let module_files = Rc::new({ - let mut __result = Vec::new(); - for tm in typed.modules.clone().iter().cloned() { - __result.push(emit_go_module(&tm, registry.clone())); - } - __result - }); - let test_files = Rc::new({ - let mut __result = Vec::new(); - for f in Rc::new({ - let mut __result = Vec::new(); - for tm in typed.modules.clone().iter().cloned() { - __result.push(emit_go_test_file( - &authored_name_at( - tm.type_env.clone().source_indices.clone(), - &tm.module.clone(), - ), - &Rc::new({ - let mut __result = Vec::new(); - for p in test_projections.clone().iter().cloned() { - if (p.module_name.clone().as_str() - == authored_name_at( - tm.type_env.clone().source_indices.clone(), - &tm.module.clone(), - ) - .as_str()) - { - __result.push(p); - } - } - __result - }), - )); - } - __result - }) - .iter() - .cloned() - { - if (f.path.clone().as_str() != "".to_string().as_str()) { - __result.push(f); - } - } - __result - }); - let go_mod = emit_go_mod("generated".to_string()); - let files = v2_rt::concat( - v2_rt::concat(Rc::new(vec![go_mod]), module_files), - test_files, - ); - Rc::new(EmitResult { - files: files, - diagnostics: Rc::new(vec![]), - }) - } +let test_projections = extract_test_projections(typed.clone()); +let module_files = Rc::new({ let mut __result = Vec::new(); for tm in typed.modules.clone().iter().cloned() { __result.push(emit_go_module(&tm, registry.clone())); } __result }); +let test_files = Rc::new({ let mut __result = Vec::new(); for f in Rc::new({ let mut __result = Vec::new(); for tm in typed.modules.clone().iter().cloned() { __result.push(emit_go_test_file(&authored_name_at(tm.type_env.clone().source_indices.clone(), &tm.module.clone()), &Rc::new({ let mut __result = Vec::new(); for p in test_projections.clone().iter().cloned() { if (p.module_name.clone().as_str() == authored_name_at(tm.type_env.clone().source_indices.clone(), &tm.module.clone()).as_str()) { __result.push(p); } } __result }))); } __result }).iter().cloned() { if (f.path.clone().as_str() != "".to_string().as_str()) { __result.push(f); } } __result }); +let go_mod = emit_go_mod("generated".to_string()); +let files = v2_rt::concat(v2_rt::concat(Rc::new(vec![go_mod]), module_files), test_files); +Rc::new(EmitResult { + files: files, + diagnostics: Rc::new(vec![]), +}) +} } pub fn emit_go_mod(module_name: String) -> Rc { { let manifest_path = match scaffold_for_target(RenderTarget::Go).manifest_file.clone() { - Some(path) => path.clone(), - None => "go.mod".to_string(), - }; - let content = v2_rt::concat( - v2_rt::concat("module ".to_string(), module_name), - "\n\ngo 1.21\n".to_string(), - ); - Rc::new(TextFile { - path: manifest_path, - content: content, - }) - } + Some(path) => path.clone(), + None => "go.mod".to_string(), +}; +let content = v2_rt::concat(v2_rt::concat("module ".to_string(), module_name), "\n\ngo 1.21\n".to_string()); +Rc::new(TextFile { + path: manifest_path, + content: content, +}) +} } -pub fn go_mock_expr_uses_fmt( - expr: Rc, - source_indices: Rc>>, -) -> bool { +pub fn go_mock_expr_uses_fmt(expr: Rc, source_indices: Rc>>) -> bool { { let rendered = emit_simple_expr(&expr, &RenderTarget::Go, &source_indices); - ((Rc::new( - rendered - .split(&"fmt.Sprintf(".to_string()) - .map(|s| s.to_string()) - .collect::>(), - ) - .len() as i64) - > 1) - } +((Rc::new(rendered.split(&"fmt.Sprintf(".to_string()).map(|s| s.to_string()).collect::>()).len() as i64) > 1) +} } pub fn go_test_import_block(projections: Rc>>) -> String { { - let needs_fmt = { - let mut __found = false; - for p in projections.iter().cloned() { - if { - let mut __found = false; - for mp in p.mock_field_inits.clone().iter().cloned() { - if go_mock_expr_uses_fmt( - field_init_node_value(&mp), - p.source_indices.clone(), - ) { - __found = true; - break; - } - } - __found - } { - __found = true; - break; - } - } - __found - }; - if needs_fmt { + let needs_fmt = { let mut __found = false; for p in projections.iter().cloned() { if { let mut __found = false; for mp in p.mock_field_inits.clone().iter().cloned() { if go_mock_expr_uses_fmt(field_init_node_value(&mp), p.source_indices.clone()) { __found = true; break; } } __found } { __found = true; break; } } __found }; +if needs_fmt { "import (\n\t\"fmt\"\n\t\"testing\"\n)\n\n".to_string() } else { "import \"testing\"\n\n".to_string() } - } +} } pub fn go_test_signature_comment(projection: &Rc) -> String { { - let params_str = Rc::new({ - let mut __result = Vec::new(); - for p in projection.params.clone().iter().cloned() { - __result.push(v2_rt::concat( - v2_rt::concat( - param_node_name_at(p.clone(), projection.source_indices.clone()), - " ".to_string(), - ), - emit_node_type( - param_node_type_expr(&p), - RenderTarget::Go, - projection.source_indices.clone(), - ), - )); - } - __result - }) - .join(&", ".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "// Signature: ".to_string(), - sanitize_service_name(projection.service_name.clone()), - ), - ".".to_string(), - ), - projection.operation_name.clone(), - ), - "(".to_string(), - ), - params_str, - ), - ") ".to_string(), - ), - emit_node_type( - projection.inferred.clone(), - RenderTarget::Go, - projection.source_indices.clone(), - ), - ) - } + let params_str = Rc::new({ let mut __result = Vec::new(); for p in projection.params.clone().iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(param_node_name_at(p.clone(), projection.source_indices.clone()), " ".to_string()), emit_node_type(param_node_type_expr(&p), RenderTarget::Go, projection.source_indices.clone()))); } __result }).join(&", ".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("// Signature: ".to_string(), sanitize_service_name(projection.service_name.clone())), ".".to_string()), projection.operation_name.clone()), "(".to_string()), params_str), ") ".to_string()), emit_node_type(projection.inferred.clone(), RenderTarget::Go, projection.source_indices.clone())) +} } -pub fn emit_go_test_file( - module_name: &String, - projections: &Rc>>, -) -> Rc { +pub fn emit_go_test_file(module_name: &String, projections: &Rc>>) -> Rc { if ((projections.clone().len() as i64) == 0) { Rc::new(TextFile { - path: "".to_string(), - content: "".to_string(), - }) + path: "".to_string(), + content: "".to_string(), +}) } else { { let package_name = go_package_name(module_name.clone()); - let tests_str = Rc::new({ - let mut __result = Vec::new(); - for p in projections.clone().iter().cloned() { - __result.push(emit_go_operation_test(&p, 0)); - } - __result - }) - .join(&"\n\n".to_string()); - let content = v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "// Generated tests -- do not edit.\n" - .to_string(), - "// Source module: ".to_string(), - ), - module_name.clone(), - ), - "\n\n".to_string(), - ), - language_spec(RenderTarget::Go) - .items - .clone() - .module_keyword - .clone(), - ), - " ".to_string(), - ), - package_name, - ), - "\n\n".to_string(), - ), - go_test_import_block(projections.clone()), - ), - tests_str, - ), - "\n".to_string(), - ); - Rc::new(TextFile { - path: test_file_path(module_name.clone(), &RenderTarget::Go), - content: content, - }) - } +let tests_str = Rc::new({ let mut __result = Vec::new(); for p in projections.clone().iter().cloned() { __result.push(emit_go_operation_test(&p, 0)); } __result }).join(&"\n\n".to_string()); +let content = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("// Generated tests -- do not edit.\n".to_string(), "// Source module: ".to_string()), module_name.clone()), "\n\n".to_string()), language_spec(RenderTarget::Go).items.clone().module_keyword.clone()), " ".to_string()), package_name), "\n\n".to_string()), go_test_import_block(projections.clone())), tests_str), "\n".to_string()); +Rc::new(TextFile { + path: test_file_path(module_name.clone(), &RenderTarget::Go), + content: content, +}) +} } } pub fn emit_go_operation_test(projection: &Rc, depth: i64) -> String { { let test_name = test_function_name(&projection, RenderTarget::Go); - let struct_name = sanitize_service_name(projection.service_name.clone()); - let indent = make_indent((depth.clone() + 1)); - let mock_setup = Rc::new({ - let mut __result = Vec::new(); - for mp in projection.mock_field_inits.clone().iter().cloned() { - __result.push(emit_go_mock_prop_setup( - &mp, - (depth.clone() + 1), - &projection.source_indices.clone(), - )); - } - __result - }) - .join(&"\n".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - language_spec( - RenderTarget::Go, - ) - .items - .clone() - .func_keyword - .clone(), - " ".to_string(), - ), - test_name, - ), - "(t *testing.T) {\n".to_string(), - ), - indent.clone(), - ), - go_test_signature_comment(&projection), - ), - "\n".to_string(), - ), - indent.clone(), - ), - "_ = ".to_string(), - ), - struct_name, - ), - "{}\n".to_string(), - ), - indent.clone(), - ), - mock_setup, - ), - "\n".to_string(), - ), - indent.clone(), - ), - "// TODO: add dry-run support to Go service emission for full invocation tests\n" - .to_string(), - ), - "}".to_string(), - ) - } +let struct_name = sanitize_service_name(projection.service_name.clone()); +let indent = make_indent((depth.clone() + 1)); +let mock_setup = Rc::new({ let mut __result = Vec::new(); for mp in projection.mock_field_inits.clone().iter().cloned() { __result.push(emit_go_mock_prop_setup(&mp, (depth.clone() + 1), &projection.source_indices.clone())); } __result }).join(&"\n".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Go).items.clone().func_keyword.clone(), " ".to_string()), test_name), "(t *testing.T) {\n".to_string()), indent.clone()), go_test_signature_comment(&projection)), "\n".to_string()), indent.clone()), "_ = ".to_string()), struct_name), "{}\n".to_string()), indent.clone()), mock_setup), "\n".to_string()), indent.clone()), "// TODO: add dry-run support to Go service emission for full invocation tests\n".to_string()), "}".to_string()) +} } -pub fn emit_go_mock_prop_setup( - mock_prop: &Rc, - depth: i64, - source_indices: &Rc>>, -) -> String { - v2_rt::concat( - v2_rt::concat( - emit_ident( - field_init_node_name_at(mock_prop.clone(), source_indices.clone()), - RenderTarget::Go, - ), - " := ".to_string(), - ), - emit_simple_expr( - &field_init_node_value(&mock_prop), - &RenderTarget::Go, - &source_indices, - ), - ) +pub fn emit_go_mock_prop_setup(mock_prop: &Rc, depth: i64, source_indices: &Rc>>) -> String { + v2_rt::concat(v2_rt::concat(emit_ident(field_init_node_name_at(mock_prop.clone(), source_indices.clone()), RenderTarget::Go), " := ".to_string()), emit_simple_expr(&field_init_node_value(&mock_prop), &RenderTarget::Go, &source_indices)) } -pub fn emit_go_module( - typed_module: &Rc, - registry: Rc>>, -) -> Rc { +pub fn emit_go_module(typed_module: &Rc, registry: Rc>>) -> Rc { { let m = typed_module.module.clone(); - let scope = module_emit_scope(&typed_module); - let si = typed_module.type_env.clone().source_indices.clone(); - let mod_name_str = authored_name_at(si.clone(), &m); - let pkg_name = go_package_name(mod_name_str.clone()); - let pkg_decl = v2_rt::concat( - v2_rt::concat( - language_spec(RenderTarget::Go) - .items - .clone() - .module_keyword - .clone(), - " ".to_string(), - ), - pkg_name, - ); - let imports_str = emit_go_imports( - &typed_module.items.clone(), - module_imports(m.clone()), - si.clone(), - ); - let imports_section = if (imports_str.clone().as_str() == "".to_string().as_str()) { +let scope = module_emit_scope(&typed_module); +let si = typed_module.type_env.clone().source_indices.clone(); +let mod_name_str = authored_name_at(si.clone(), &m); +let pkg_name = go_package_name(mod_name_str.clone()); +let pkg_decl = v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Go).items.clone().module_keyword.clone(), " ".to_string()), pkg_name); +let imports_str = emit_go_imports(&typed_module.items.clone(), module_imports(m.clone()), si.clone()); +let imports_section = if (imports_str.clone().as_str() == "".to_string().as_str()) { "".to_string() } else { v2_rt::concat("\n\n".to_string(), imports_str.clone()) }; - let items_str = Rc::new({ - let mut __result = Vec::new(); - for item in typed_module.items.clone().iter().cloned() { - __result.push(emit_go_typed_item(&item, registry.clone(), &scope)); - } - __result - }) - .join(&"\n\n".to_string()); - let filename = module_to_filename(mod_name_str.clone()); - let content = v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "// Generated by v2 compiler -- do not edit.\n".to_string(), - "// Source module: ".to_string(), - ), - mod_name_str.clone(), - ), - "\n\n".to_string(), - ), - pkg_decl, - ), - imports_section, - ), - "\n\n".to_string(), - ), - items_str, - ), - "\n".to_string(), - ); - Rc::new(TextFile { - path: v2_rt::concat( - filename, - scaffold_for_target(RenderTarget::Go) - .source_file_extension - .clone(), - ), - content: content, - }) - } +let items_str = Rc::new({ let mut __result = Vec::new(); for item in typed_module.items.clone().iter().cloned() { __result.push(emit_go_typed_item(&item, registry.clone(), &scope)); } __result }).join(&"\n\n".to_string()); +let filename = module_to_filename(mod_name_str.clone()); +let content = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("// Generated by v2 compiler -- do not edit.\n".to_string(), "// Source module: ".to_string()), mod_name_str.clone()), "\n\n".to_string()), pkg_decl), imports_section), "\n\n".to_string()), items_str), "\n".to_string()); +Rc::new(TextFile { + path: v2_rt::concat(filename, scaffold_for_target(RenderTarget::Go).source_file_extension.clone()), + content: content, +}) +} } pub fn go_package_name(module_name: String) -> String { { - let parts = Rc::new( - module_name - .split(&".".to_string()) - .map(|s| s.to_string()) - .collect::>(), - ); - match parts.last().cloned() { - Some(last_part) => Rc::new({ - let mut __result = Vec::new(); - for c in Rc::new( - last_part - .clone() - .chars() - .map(|c| c as i64) - .collect::>(), - ) - .iter() - .cloned() - { - __result.push(to_lower_char(c.clone())); - } - __result - }) - .join(&"".to_string()), - None => "main".to_string(), - } - } + let parts = Rc::new(module_name.split(&".".to_string()).map(|s| s.to_string()).collect::>()); +match parts.last().cloned() { + Some(last_part) => Rc::new({ let mut __result = Vec::new(); for c in Rc::new(last_part.clone().chars().map(|c| c as i64).collect::>()).iter().cloned() { __result.push(to_lower_char(c.clone())); } __result }).join(&"".to_string()), + None => "main".to_string(), +} +} } -pub fn emit_go_imports( - items: &Rc>>, - imports: Rc>>, - source_indices: Rc>>, -) -> String { +pub fn emit_go_imports(items: &Rc>>, imports: Rc>>, source_indices: Rc>>) -> String { { - let has_services = { - let mut __found = false; - for item in items.clone().iter().cloned() { - if is_service_item(&item) { - __found = true; - break; - } - } - __found - }; - let has_types = { - let mut __found = false; - for item in items.clone().iter().cloned() { - if is_type_def_item(&item) { - __found = true; - break; - } - } - __found - }; - let has_functions = { - let mut __found = false; - for item in items.clone().iter().cloned() { - if is_function_item(&item) { - __found = true; - break; - } - } - __found - }; - let std_imports = collect_go_std_imports(&has_services, has_types, has_functions); - let pkg_imports = Rc::new({ - let mut __result = Vec::new(); - for imp in imports.iter().cloned() { - __result.push({ - let mod_name = - module_to_filename(authored_name_at(source_indices.clone(), &imp)); - v2_rt::concat( - v2_rt::concat("\t\"generated/".to_string(), mod_name.clone()), - "\"".to_string(), - ) - }); - } - __result - }); - let all_imports = v2_rt::concat(std_imports, pkg_imports); - if ((all_imports.clone().len() as i64) == 0) { + let has_services = { let mut __found = false; for item in items.clone().iter().cloned() { if is_service_item(&item) { __found = true; break; } } __found }; +let has_types = { let mut __found = false; for item in items.clone().iter().cloned() { if is_type_def_item(&item) { __found = true; break; } } __found }; +let has_functions = { let mut __found = false; for item in items.clone().iter().cloned() { if is_function_item(&item) { __found = true; break; } } __found }; +let std_imports = collect_go_std_imports(&has_services, has_types, has_functions); +let pkg_imports = Rc::new({ let mut __result = Vec::new(); for imp in imports.iter().cloned() { __result.push({ + let mod_name = module_to_filename(authored_name_at(source_indices.clone(), &imp)); +v2_rt::concat(v2_rt::concat("\t\"generated/".to_string(), mod_name.clone()), "\"".to_string()) +}); } __result }); +let all_imports = v2_rt::concat(std_imports, pkg_imports); +if ((all_imports.clone().len() as i64) == 0) { "".to_string() } else { { let imports_str = all_imports.clone().join(&"\n".to_string()); - v2_rt::concat( - v2_rt::concat("import (\n".to_string(), imports_str), - "\n)".to_string(), - ) - } +v2_rt::concat(v2_rt::concat("import (\n".to_string(), imports_str), "\n)".to_string()) +} } - } +} } -pub fn collect_go_std_imports( - has_services: &bool, - has_types: bool, - has_functions: bool, -) -> Rc> { +pub fn collect_go_std_imports(has_services: &bool, has_types: bool, has_functions: bool) -> Rc> { { let fmt_import = if ((has_types || has_functions) || has_services.clone()) { Rc::new(vec!["\t\"fmt\"".to_string()]) } else { Rc::new(vec![]) }; - let net_imports = if has_services.clone() { - Rc::new(vec![ - "\t\"net/http\"".to_string(), - "\t\"encoding/json\"".to_string(), - "\t\"bytes\"".to_string(), - "\t\"io\"".to_string(), - ]) +let net_imports = if has_services.clone() { + Rc::new(vec!["\t\"net/http\"".to_string(), "\t\"encoding/json\"".to_string(), "\t\"bytes\"".to_string(), "\t\"io\"".to_string()]) } else { Rc::new(vec![]) }; - v2_rt::concat(fmt_import, net_imports) - } +v2_rt::concat(fmt_import, net_imports) +} } -pub fn emit_go_typed_item( - item: &Rc, - registry: Rc>>, - scope: &Rc, -) -> String { +pub fn emit_go_typed_item(item: &Rc, registry: Rc>>, scope: &Rc) -> String { { let env = scope.type_env.clone(); - let item_text = authored_name(env.clone(), item.clone()); - if is_type_def_item(&item) { +let item_text = authored_name(env.clone(), item.clone()); +if is_type_def_item(&item) { emit_go_type_def_from_connective(&item, &env) } else { if is_type_alias_item(&item, env.source_indices.clone()) { - emit_go_type_alias( - item_text, - resolved_type(item.clone()), - env.source_indices.clone(), - ) + emit_go_type_alias(item_text, resolved_type(item.clone()), env.source_indices.clone()) } else { if is_type_decl_item(&item, env.source_indices.clone()) { "".to_string() } else { if is_function_item(&item) { if ((item.uses.clone().len() as i64) > 0) { - emit_go_func_def( - &item_text, - &item.params.clone(), - resolved_type(item.clone()), - &item.uses.clone(), - item.body.clone().clone().unwrap(), - ®istry, - &scope, - ) + emit_go_func_def(&item_text, &item.params.clone(), resolved_type(item.clone()), &item.uses.clone(), item.body.clone().clone().unwrap(), ®istry, &scope) } else { - emit_go_fn_def( - &item_text, - &item.params.clone(), - resolved_type(item.clone()), - &item.body.clone().clone().unwrap(), - ®istry, - &scope, - ) + emit_go_fn_def(&item_text, &item.params.clone(), resolved_type(item.clone()), &item.body.clone().clone().unwrap(), ®istry, &scope) } } else { if is_data_def_item(&item) { - emit_go_data_def( - item_text, - item.type_annotation.clone().clone().unwrap(), - item.body.clone().clone().unwrap(), - registry, - &scope, - 0, - ) + emit_go_data_def(item_text, item.type_annotation.clone().clone().unwrap(), item.body.clone().clone().unwrap(), registry, &scope, 0) } else { if is_service_def_item(&item) { emit_go_service_def(item.clone(), registry, env.clone()) @@ -685,21 +222,7 @@ pub fn emit_go_typed_item( if is_resource_def_item(&item) { emit_go_resource_def(&item, &env) } else { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - language_spec(RenderTarget::Go) - .items - .clone() - .func_keyword - .clone(), - " init() { panic(\"EMIT BUG: unhandled item: " - .to_string(), - ), - item_text, - ), - "\") }".to_string(), - ) + v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Go).items.clone().func_keyword.clone(), " init() { panic(\"EMIT BUG: unhandled item: ".to_string()), item_text), "\") }".to_string()) } } } @@ -707,1065 +230,255 @@ pub fn emit_go_typed_item( } } } - } +} } pub fn emit_go_type_def_from_connective(item: &Rc, env: &Rc) -> String { { let item_text = authored_name(env.clone(), item.clone()); - let is_product = (item.connective.clone() == Connective::Conj); - if is_product { +let is_product = (item.connective.clone() == Connective::Conj); +if is_product { emit_go_struct_from_children(item_text, &item.children.clone(), env.clone()) } else { emit_go_sum_from_children(&item_text, &item.children.clone(), env.clone()) } - } +} } -pub fn emit_go_struct_from_children( - name: String, - children: &Rc>>, - env: Rc, -) -> String { +pub fn emit_go_struct_from_children(name: String, children: &Rc>>, env: Rc) -> String { if ((children.clone().len() as i64) == 0) { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - language_spec(RenderTarget::Go) - .items - .clone() - .type_alias_keyword - .clone(), - " ".to_string(), - ), - name, - ), - " ".to_string(), - ), - language_spec(RenderTarget::Go) - .items - .clone() - .struct_keyword - .clone(), - ), - "{}".to_string(), - ) + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Go).items.clone().type_alias_keyword.clone(), " ".to_string()), name), " ".to_string()), language_spec(RenderTarget::Go).items.clone().struct_keyword.clone()), "{}".to_string()) } else { { - let field_lines = Rc::new({ - let mut __result = Vec::new(); - for child in children.clone().iter().cloned() { - __result.push(emit_go_struct_field_from_child(&child, &env)); - } - __result - }); - let fields_str = field_lines.join(&"\n".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - language_spec(RenderTarget::Go) - .items - .clone() - .type_alias_keyword - .clone(), - " ".to_string(), - ), - name, - ), - " ".to_string(), - ), - language_spec(RenderTarget::Go) - .items - .clone() - .struct_keyword - .clone(), - ), - " {\n".to_string(), - ), - fields_str, - ), - "\n}".to_string(), - ) - } + let field_lines = Rc::new({ let mut __result = Vec::new(); for child in children.clone().iter().cloned() { __result.push(emit_go_struct_field_from_child(&child, &env)); } __result }); +let fields_str = field_lines.join(&"\n".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Go).items.clone().type_alias_keyword.clone(), " ".to_string()), name), " ".to_string()), language_spec(RenderTarget::Go).items.clone().struct_keyword.clone()), " {\n".to_string()), fields_str), "\n}".to_string()) +} } } pub fn emit_go_struct_field_from_child(child: &Rc, env: &Rc) -> String { { let child_text = authored_name(env.clone(), child.clone()); - let ty = emit_node_type( - resolved_type(child.clone()), - RenderTarget::Go, - env.source_indices.clone(), - ); - let json_tag = v2_rt::concat( - v2_rt::concat(" `json:\"".to_string(), to_snake(child_text.clone())), - "\"`".to_string(), - ); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("\t".to_string(), go_export_ident(child_text.clone())), - " ".to_string(), - ), - ty, - ), - json_tag, - ) - } +let ty = emit_node_type(resolved_type(child.clone()), RenderTarget::Go, env.source_indices.clone()); +let json_tag = v2_rt::concat(v2_rt::concat(" `json:\"".to_string(), to_snake(child_text.clone())), "\"`".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("\t".to_string(), go_export_ident(child_text.clone())), " ".to_string()), ty), json_tag) +} } -pub fn emit_go_sum_from_children( - name: &String, - children: &Rc>>, - env: Rc, -) -> String { +pub fn emit_go_sum_from_children(name: &String, children: &Rc>>, env: Rc) -> String { { - let has_data = { - let mut __found = false; - for child in children.clone().iter().cloned() { - if ((child.children.clone().len() as i64) > 0) { - __found = true; - break; - } - } - __found - }; - if has_data { + let has_data = { let mut __found = false; for child in children.clone().iter().cloned() { if ((child.children.clone().len() as i64) > 0) { __found = true; break; } } __found }; +if has_data { { - let iface = v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - language_spec(RenderTarget::Go) - .items - .clone() - .type_alias_keyword - .clone(), - " ".to_string(), - ), - name.clone(), - ), - " interface {\n\tis".to_string(), - ), - name.clone(), - ), - "()\n}".to_string(), - ); - let variant_structs = Rc::new({ - let mut __result = Vec::new(); - for child in children.clone().iter().cloned() { - __result.push(emit_go_variant_struct(&name, &child, &env)); - } - __result - }); - let structs_str = variant_structs.join(&"\n\n".to_string()); - v2_rt::concat(v2_rt::concat(iface, "\n\n".to_string()), structs_str) - } + let iface = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Go).items.clone().type_alias_keyword.clone(), " ".to_string()), name.clone()), " interface {\n\tis".to_string()), name.clone()), "()\n}".to_string()); +let variant_structs = Rc::new({ let mut __result = Vec::new(); for child in children.clone().iter().cloned() { __result.push(emit_go_variant_struct(&name, &child, &env)); } __result }); +let structs_str = variant_structs.join(&"\n\n".to_string()); +v2_rt::concat(v2_rt::concat(iface, "\n\n".to_string()), structs_str) +} } else { { - let type_decl = v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - language_spec(RenderTarget::Go) - .items - .clone() - .enum_keyword - .clone(), - " ".to_string(), - ), - name.clone(), - ), - " int".to_string(), - ); - let variant_consts = Rc::new({ - let mut __result = Vec::new(); - for pair in Rc::new( - children - .clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - { - __result.push({ - let child = pair.1.clone(); - let child_text = authored_name(env.clone(), child.clone()); - if (pair.0.clone() == 0) { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("\t".to_string(), name.clone()), - child_text.clone(), - ), - " ".to_string(), - ), - name.clone(), - ), - " = iota".to_string(), - ) - } else { - v2_rt::concat( - v2_rt::concat("\t".to_string(), name.clone()), - child_text.clone(), - ) - } - }); + let type_decl = v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Go).items.clone().enum_keyword.clone(), " ".to_string()), name.clone()), " int".to_string()); +let variant_consts = Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(children.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { __result.push({ + let child = pair.1.clone(); +let child_text = authored_name(env.clone(), child.clone()); +if (pair.0.clone() == 0) { + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("\t".to_string(), name.clone()), child_text.clone()), " ".to_string()), name.clone()), " = iota".to_string()) + } else { + v2_rt::concat(v2_rt::concat("\t".to_string(), name.clone()), child_text.clone()) } - __result - }); - let consts_str = variant_consts.join(&"\n".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(type_decl, "\n\nconst (\n".to_string()), - consts_str, - ), - "\n)".to_string(), - ) - } +}); } __result }); +let consts_str = variant_consts.join(&"\n".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(type_decl, "\n\nconst (\n".to_string()), consts_str), "\n)".to_string()) +} } - } +} } pub fn emit_go_variant_struct(parent_name: &String, child: &Rc, env: &Rc) -> String { { - let struct_name = v2_rt::concat( - parent_name.clone(), - authored_name(env.clone(), child.clone()), - ); - let marker_method = v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - language_spec(RenderTarget::Go) - .items - .clone() - .func_keyword - .clone(), - " (".to_string(), - ), - struct_name.clone(), - ), - ") is".to_string(), - ), - parent_name.clone(), - ), - "() {}".to_string(), - ); - if ((child.children.clone().len() as i64) == 0) { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - language_spec(RenderTarget::Go) - .items - .clone() - .type_alias_keyword - .clone(), - " ".to_string(), - ), - struct_name.clone(), - ), - " ".to_string(), - ), - language_spec(RenderTarget::Go) - .items - .clone() - .struct_keyword - .clone(), - ), - "{}\n\n".to_string(), - ), - marker_method, - ) + let struct_name = v2_rt::concat(parent_name.clone(), authored_name(env.clone(), child.clone())); +let marker_method = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Go).items.clone().func_keyword.clone(), " (".to_string()), struct_name.clone()), ") is".to_string()), parent_name.clone()), "() {}".to_string()); +if ((child.children.clone().len() as i64) == 0) { + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Go).items.clone().type_alias_keyword.clone(), " ".to_string()), struct_name.clone()), " ".to_string()), language_spec(RenderTarget::Go).items.clone().struct_keyword.clone()), "{}\n\n".to_string()), marker_method) } else { { - let field_lines = Rc::new({ - let mut __result = Vec::new(); - for f in child.children.clone().iter().cloned() { - __result.push(emit_go_struct_field_from_child(&f, &env)); - } - __result - }); - let fields_str = field_lines.join(&"\n".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - language_spec(RenderTarget::Go) - .items - .clone() - .type_alias_keyword - .clone(), - " ".to_string(), - ), - struct_name.clone(), - ), - " ".to_string(), - ), - language_spec(RenderTarget::Go) - .items - .clone() - .struct_keyword - .clone(), - ), - " {\n".to_string(), - ), - fields_str, - ), - "\n}\n\n".to_string(), - ), - marker_method, - ) - } + let field_lines = Rc::new({ let mut __result = Vec::new(); for f in child.children.clone().iter().cloned() { __result.push(emit_go_struct_field_from_child(&f, &env)); } __result }); +let fields_str = field_lines.join(&"\n".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Go).items.clone().type_alias_keyword.clone(), " ".to_string()), struct_name.clone()), " ".to_string()), language_spec(RenderTarget::Go).items.clone().struct_keyword.clone()), " {\n".to_string()), fields_str), "\n}\n\n".to_string()), marker_method) +} } - } +} } -pub fn emit_go_type_alias( - name: String, - base: Rc, - source_indices: Rc>>, -) -> String { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - language_spec(RenderTarget::Go) - .items - .clone() - .type_alias_keyword - .clone(), - " ".to_string(), - ), - name, - ), - " = ".to_string(), - ), - emit_node_type(base, RenderTarget::Go, source_indices), - ) +pub fn emit_go_type_alias(name: String, base: Rc, source_indices: Rc>>) -> String { + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Go).items.clone().type_alias_keyword.clone(), " ".to_string()), name), " = ".to_string()), emit_node_type(base, RenderTarget::Go, source_indices)) } -pub fn emit_go_fn_def( - name: &String, - params: &Rc>>, - inferred: Rc, - body: &Rc, - registry: &Rc>>, - scope: &Rc, -) -> String { +pub fn emit_go_fn_def(name: &String, params: &Rc>>, inferred: Rc, body: &Rc, registry: &Rc>>, scope: &Rc) -> String { { let si = scope.type_env.clone().source_indices.clone(); - let params_str = emit_params_shared(params.clone(), &RenderTarget::Go, si.clone()); - let ret_str = emit_inferred_shared(&inferred, &RenderTarget::Go, si.clone()); - let body_scope = build_params_scope(&scope, params.clone()); - let use_tco = is_tco_eligible(&name, &body, registry.clone(), &si); - if use_tco { +let params_str = emit_params_shared(params.clone(), &RenderTarget::Go, si.clone()); +let ret_str = emit_inferred_shared(&inferred, &RenderTarget::Go, si.clone()); +let body_scope = build_params_scope(&scope, params.clone()); +let use_tco = is_tco_eligible(&name, &body, registry.clone(), &si); +if use_tco { { - let body_str = emit_tco_unified( - body.clone(), - &name, - ¶ms, - &RenderTarget::Go, - ®istry, - &body_scope, - 1, - |pat| emit_unified_pattern(pat.clone(), RenderTarget::Go, si.clone()), - ); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - language_spec(RenderTarget::Go) - .items - .clone() - .func_keyword - .clone(), - " ".to_string(), - ), - go_export_ident(name.clone()), - ), - "(".to_string(), - ), - params_str, - ), - ")".to_string(), - ), - ret_str, - ), - " {\n".to_string(), - ), - body_str, - ), - "\n}".to_string(), - ) - } + let body_str = emit_tco_unified(body.clone(), &name, ¶ms, &RenderTarget::Go, ®istry, &body_scope, 1, |pat| emit_unified_pattern(pat.clone(), RenderTarget::Go, si.clone())); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Go).items.clone().func_keyword.clone(), " ".to_string()), go_export_ident(name.clone())), "(".to_string()), params_str), ")".to_string()), ret_str), " {\n".to_string()), body_str), "\n}".to_string()) +} } else { { - let body_str = - emit_go_typed_expr(body.clone(), registry.clone(), &body_scope, 1, 1024); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - language_spec(RenderTarget::Go) - .items - .clone() - .func_keyword - .clone(), - " ".to_string(), - ), - go_export_ident(name.clone()), - ), - "(".to_string(), - ), - params_str, - ), - ")".to_string(), - ), - ret_str, - ), - " {\n".to_string(), - ), - make_indent(1), - ), - "return ".to_string(), - ), - body_str, - ), - "\n}".to_string(), - ) - } + let body_str = emit_go_typed_expr(body.clone(), registry.clone(), &body_scope, 1, 1024); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Go).items.clone().func_keyword.clone(), " ".to_string()), go_export_ident(name.clone())), "(".to_string()), params_str), ")".to_string()), ret_str), " {\n".to_string()), make_indent(1)), "return ".to_string()), body_str), "\n}".to_string()) +} } - } +} } -pub fn emit_go_func_def( - name: &String, - params: &Rc>>, - inferred: Rc, - uses: &Rc>>, - body: Rc, - registry: &Rc>>, - scope: &Rc, -) -> String { +pub fn emit_go_func_def(name: &String, params: &Rc>>, inferred: Rc, uses: &Rc>>, body: Rc, registry: &Rc>>, scope: &Rc) -> String { { let service_names = match lookup_item(registry.clone(), name.clone()) { - Some(info) => info.service_names.clone(), - None => Rc::new(vec![]), - }; - let params_str = emit_go_func_params( - params.clone(), - uses.clone(), - service_names, - scope.type_env.clone().source_indices.clone(), - ); - let ret_type = emit_node_type( - inferred, - RenderTarget::Go, - scope.type_env.clone().source_indices.clone(), - ); - let body_scope = build_params_scope(&scope, params.clone()); - let si = scope.type_env.clone().source_indices.clone(); - let body_scope = uses.clone().iter().cloned().fold( - body_scope.clone(), - |s: Rc, u: Rc| { - extend_scope( - &s, - &resource_use_name_at(u.clone(), si.clone()), - resource_use_resource(&u), - Rc::new(SubValueRelation::SubValueUnknown), - ) - }, - ); - let body_str = - emit_unified_typed_func_body(&body, &RenderTarget::Go, ®istry, &body_scope, 1); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - language_spec(RenderTarget::Go) - .items - .clone() - .func_keyword - .clone(), - " ".to_string(), - ), - go_export_ident(name.clone()), - ), - "(".to_string(), - ), - params_str, - ), - ") (".to_string(), - ), - ret_type, - ), - ", error) {\n".to_string(), - ), - body_str, - ), - "\n}".to_string(), - ) - } + Some(info) => info.service_names.clone(), + None => Rc::new(vec![]), +}; +let params_str = emit_go_func_params(params.clone(), uses.clone(), service_names, scope.type_env.clone().source_indices.clone()); +let ret_type = emit_node_type(inferred, RenderTarget::Go, scope.type_env.clone().source_indices.clone()); +let body_scope = build_params_scope(&scope, params.clone()); +let si = scope.type_env.clone().source_indices.clone(); +let body_scope = uses.clone().iter().cloned().fold(body_scope.clone(), |s: Rc, u: Rc| extend_scope(&s, &resource_use_name_at(u.clone(), si.clone()), resource_use_resource(&u), Rc::new(SubValueRelation::SubValueUnknown))); +let body_str = emit_unified_typed_func_body(&body, &RenderTarget::Go, ®istry, &body_scope, 1); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Go).items.clone().func_keyword.clone(), " ".to_string()), go_export_ident(name.clone())), "(".to_string()), params_str), ") (".to_string()), ret_type), ", error) {\n".to_string()), body_str), "\n}".to_string()) +} } -pub fn emit_go_func_params( - params: Rc>>, - uses: Rc>>, - service_names: Rc>, - source_indices: Rc>>, -) -> String { +pub fn emit_go_func_params(params: Rc>>, uses: Rc>>, service_names: Rc>, source_indices: Rc>>) -> String { { - let param_strs = Rc::new({ - let mut __result = Vec::new(); - for p in params.iter().cloned() { - __result.push(emit_param_shared(&p, &RenderTarget::Go, &source_indices)); - } - __result - }); - let resource_strs = Rc::new({ - let mut __result = Vec::new(); - for u in uses.iter().cloned() { - __result.push(v2_rt::concat( - v2_rt::concat( - emit_ident( - resource_use_name_at(u.clone(), source_indices.clone()), - RenderTarget::Go, - ), - " ".to_string(), - ), - emit_node_type( - resource_use_resource(&u), - RenderTarget::Go, - source_indices.clone(), - ), - )); - } - __result - }); - let service_strs = Rc::new({ - let mut __result = Vec::new(); - for sn in service_names.iter().cloned() { - __result.push(v2_rt::concat( - v2_rt::concat(service_var_name(sn.clone()), " *".to_string()), - sanitize_service_name(sn.clone()), - )); - } - __result - }); - let all_params = v2_rt::concat(v2_rt::concat(param_strs, resource_strs), service_strs); - all_params.join(&", ".to_string()) - } + let param_strs = Rc::new({ let mut __result = Vec::new(); for p in params.iter().cloned() { __result.push(emit_param_shared(&p, &RenderTarget::Go, &source_indices)); } __result }); +let resource_strs = Rc::new({ let mut __result = Vec::new(); for u in uses.iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(emit_ident(resource_use_name_at(u.clone(), source_indices.clone()), RenderTarget::Go), " ".to_string()), emit_node_type(resource_use_resource(&u), RenderTarget::Go, source_indices.clone()))); } __result }); +let service_strs = Rc::new({ let mut __result = Vec::new(); for sn in service_names.iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(service_var_name(sn.clone()), " *".to_string()), sanitize_service_name(sn.clone()))); } __result }); +let all_params = v2_rt::concat(v2_rt::concat(param_strs, resource_strs), service_strs); +all_params.join(&", ".to_string()) +} } -pub fn emit_go_typed_expr( - texpr: Rc, - registry: Rc>>, - scope: &Rc, - depth: i64, - fuel: i64, -) -> String { - emit_unified_typed_expr( - texpr, - &RenderTarget::Go, - registry, - &scope, - depth, - fuel, - |pat| { - emit_unified_pattern( - pat.clone(), - RenderTarget::Go, - scope.type_env.clone().source_indices.clone(), - ) - }, - ) +pub fn emit_go_typed_expr(texpr: Rc, registry: Rc>>, scope: &Rc, depth: i64, fuel: i64) -> String { + emit_unified_typed_expr(texpr, &RenderTarget::Go, registry, &scope, depth, fuel, |pat| emit_unified_pattern(pat.clone(), RenderTarget::Go, scope.type_env.clone().source_indices.clone())) } -pub fn emit_go_transport_body( - transport: Rc, - op_name: String, - source_indices: Rc>>, - depth: i64, -) -> String { - emit_unified_transport_dispatch( - &transport, - op_name, - &source_indices, - depth, - RenderTarget::Go, - |n, t, d, si| emit_go_rest_call(n.clone(), &t, d.clone(), &si), - |n, t, d, si| emit_go_shell_call(n.clone(), t.clone(), d.clone(), &si), - |n, d| emit_go_file_call(n.clone(), d.clone()), - |n, d| emit_go_local_call(n.clone(), d.clone()), - ) +pub fn emit_go_transport_body(transport: Rc, op_name: String, source_indices: Rc>>, depth: i64) -> String { + emit_unified_transport_dispatch(&transport, op_name, &source_indices, depth, RenderTarget::Go, |n, t, d, si| emit_go_rest_call(n.clone(), &t, d.clone(), &si), |n, t, d, si| emit_go_shell_call(n.clone(), t.clone(), d.clone(), &si), |n, d| emit_go_file_call(n.clone(), d.clone()), |n, d| emit_go_local_call(n.clone(), d.clone())) } -pub fn emit_go_service_def( - item: Rc, - registry: Rc>>, - env: Rc, -) -> String { - emit_unified_service_def( - &item, - &RenderTarget::Go, - registry, - &env, - |name, transport, ops, si| { - emit_go_service_struct(name.clone(), transport.clone(), ops.clone(), si.clone()) - }, - |transport, op_name, si, depth| { - emit_go_transport_body( - transport.clone(), - op_name.clone(), - si.clone(), - depth.clone(), - ) - }, - ) +pub fn emit_go_service_def(item: Rc, registry: Rc>>, env: Rc) -> String { + emit_unified_service_def(&item, &RenderTarget::Go, registry, &env, |name, transport, ops, si| emit_go_service_struct(name.clone(), transport.clone(), ops.clone(), si.clone()), |transport, op_name, si, depth| emit_go_transport_body(transport.clone(), op_name.clone(), si.clone(), depth.clone())) } -pub fn emit_go_service_struct( - name: String, - fallback_transport: Rc, - op_children: Rc>>, - source_indices: Rc>>, -) -> String { +pub fn emit_go_service_struct(name: String, fallback_transport: Rc, op_children: Rc>>, source_indices: Rc>>) -> String { { let fs = compute_service_fields(&fallback_transport, &op_children, &source_indices); - let decls = - service_field_decls(&fs, &language_spec(RenderTarget::Go).service_fields.clone()); - if ((decls.clone().len() as i64) == 0) { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - language_spec(RenderTarget::Go) - .items - .clone() - .type_alias_keyword - .clone(), - " ".to_string(), - ), - name, - ), - " ".to_string(), - ), - language_spec(RenderTarget::Go) - .items - .clone() - .struct_keyword - .clone(), - ), - "{}".to_string(), - ) +let decls = service_field_decls(&fs, &language_spec(RenderTarget::Go).service_fields.clone()); +if ((decls.clone().len() as i64) == 0) { + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Go).items.clone().type_alias_keyword.clone(), " ".to_string()), name), " ".to_string()), language_spec(RenderTarget::Go).items.clone().struct_keyword.clone()), "{}".to_string()) } else { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - language_spec(RenderTarget::Go) - .items - .clone() - .type_alias_keyword - .clone(), - " ".to_string(), - ), - name, - ), - " ".to_string(), - ), - language_spec(RenderTarget::Go) - .items - .clone() - .struct_keyword - .clone(), - ), - " {\n".to_string(), - ), - decls.clone().join(&"\n".to_string()), - ), - "\n}".to_string(), - ) + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Go).items.clone().type_alias_keyword.clone(), " ".to_string()), name), " ".to_string()), language_spec(RenderTarget::Go).items.clone().struct_keyword.clone()), " {\n".to_string()), decls.clone().join(&"\n".to_string())), "\n}".to_string()) } - } +} } -pub fn emit_go_rest_call( - op_name: String, - transport: &Rc, - depth: i64, - source_indices: &Rc>>, -) -> String { +pub fn emit_go_rest_call(op_name: String, transport: &Rc, depth: i64, source_indices: &Rc>>) -> String { { let prefix = make_indent(depth); - let url_line = v2_rt::concat( - v2_rt::concat( - v2_rt::concat(prefix.clone(), "url := fmt.Sprintf(\"%s/".to_string()), - to_snake(op_name), - ), - "\", c.BaseURL)".to_string(), - ); - let body_line = v2_rt::concat( - prefix.clone(), - "reqBody := bytes.NewBuffer(nil)".to_string(), - ); - let req_line = v2_rt::concat( - v2_rt::concat( - prefix.clone(), - "req, err := http.NewRequest(\"POST\", url, reqBody)\n".to_string(), - ), - "if err != nil {\n\treturn nil, fmt.Errorf(\"creating request: %w\", err)\n}" - .to_string(), - ); - let auth_line = if transport_has_auth(transport.clone(), source_indices.clone()) { +let url_line = v2_rt::concat(v2_rt::concat(v2_rt::concat(prefix.clone(), "url := fmt.Sprintf(\"%s/".to_string()), to_snake(op_name)), "\", c.BaseURL)".to_string()); +let body_line = v2_rt::concat(prefix.clone(), "reqBody := bytes.NewBuffer(nil)".to_string()); +let req_line = v2_rt::concat(v2_rt::concat(prefix.clone(), "req, err := http.NewRequest(\"POST\", url, reqBody)\n".to_string()), "if err != nil {\n\treturn nil, fmt.Errorf(\"creating request: %w\", err)\n}".to_string()); +let auth_line = if transport_has_auth(transport.clone(), source_indices.clone()) { { - let header_name = - match transport_auth_header_name(transport.clone(), source_indices.clone()) { - Some(h) => h.clone(), - None => "Authorization".to_string(), - }; - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(prefix.clone(), "req.Header.Set(\"".to_string()), - header_name, - ), - "\", c.AuthToken)".to_string(), - ) - } + let header_name = match transport_auth_header_name(transport.clone(), source_indices.clone()) { + Some(h) => h.clone(), + None => "Authorization".to_string(), +}; +v2_rt::concat(v2_rt::concat(v2_rt::concat(prefix.clone(), "req.Header.Set(\"".to_string()), header_name), "\", c.AuthToken)".to_string()) +} } else { "".to_string() }; - let hdrs = transport_headers(transport.clone(), source_indices.clone()); - let header_lines = Rc::new({ - let mut __result = Vec::new(); - for h in hdrs.iter().cloned() { - __result.push(v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(prefix.clone(), "req.Header.Set(\"".to_string()), - field_init_node_name_at(h.clone(), source_indices.clone()), - ), - "\", ".to_string(), - ), - emit_simple_expr( - &field_init_node_value(&h), - &RenderTarget::Go, - &source_indices, - ), - ), - ")".to_string(), - )); - } - __result - }); - let send_lines = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(prefix.clone(), "resp, err := http.DefaultClient.Do(req)\n".to_string()), "if err != nil {\n\treturn nil, fmt.Errorf(\"sending request: %w\", err)\n}\n".to_string()), "defer resp.Body.Close()\n".to_string()), "body, err := io.ReadAll(resp.Body)\n".to_string()), "if err != nil {\n\treturn nil, fmt.Errorf(\"reading response: %w\", err)\n}\n".to_string()), "var result interface{}\n".to_string()), "if err := json.Unmarshal(body, &result); err != nil {\n".to_string()), "\treturn nil, fmt.Errorf(\"decoding response: %w\", err)\n}\n".to_string()), "return result, nil".to_string()); - let all_lines = v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - Rc::new(vec![url_line, body_line, req_line]), - if (auth_line.clone().as_str() == "".to_string().as_str()) { - Rc::new(vec![]) - } else { - Rc::new(vec![auth_line.clone()]) - }, - ), - header_lines, - ), - Rc::new(vec![send_lines]), - ); - all_lines.join(&"\n".to_string()) - } +let hdrs = transport_headers(transport.clone(), source_indices.clone()); +let header_lines = Rc::new({ let mut __result = Vec::new(); for h in hdrs.iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(prefix.clone(), "req.Header.Set(\"".to_string()), field_init_node_name_at(h.clone(), source_indices.clone())), "\", ".to_string()), emit_simple_expr(&field_init_node_value(&h), &RenderTarget::Go, &source_indices)), ")".to_string())); } __result }); +let send_lines = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(prefix.clone(), "resp, err := http.DefaultClient.Do(req)\n".to_string()), "if err != nil {\n\treturn nil, fmt.Errorf(\"sending request: %w\", err)\n}\n".to_string()), "defer resp.Body.Close()\n".to_string()), "body, err := io.ReadAll(resp.Body)\n".to_string()), "if err != nil {\n\treturn nil, fmt.Errorf(\"reading response: %w\", err)\n}\n".to_string()), "var result interface{}\n".to_string()), "if err := json.Unmarshal(body, &result); err != nil {\n".to_string()), "\treturn nil, fmt.Errorf(\"decoding response: %w\", err)\n}\n".to_string()), "return result, nil".to_string()); +let all_lines = v2_rt::concat(v2_rt::concat(v2_rt::concat(Rc::new(vec![url_line, body_line, req_line]), if (auth_line.clone().as_str() == "".to_string().as_str()) { + Rc::new(vec![]) + } else { + Rc::new(vec![auth_line.clone()]) + }), header_lines), Rc::new(vec![send_lines])); +all_lines.join(&"\n".to_string()) +} } -pub fn emit_go_shell_call( - op_name: String, - transport: Rc, - depth: i64, - source_indices: &Rc>>, -) -> String { +pub fn emit_go_shell_call(op_name: String, transport: Rc, depth: i64, source_indices: &Rc>>) -> String { { let prefix = make_indent(depth); - let cmd_line = v2_rt::concat( - v2_rt::concat( - v2_rt::concat(prefix.clone(), "cmd := exec.Command(\"".to_string()), - to_snake(op_name), - ), - "\")".to_string(), - ); - let dir_line = v2_rt::concat(prefix.clone(), "cmd.Dir = c.WorkingDir".to_string()); - let envs = transport_env(transport, source_indices.clone()); - let env_lines = Rc::new({ - let mut __result = Vec::new(); - for e in envs.iter().cloned() { - __result.push(v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - prefix.clone(), - "cmd.Env = append(cmd.Env, \"".to_string(), - ), - field_init_node_name_at(e.clone(), source_indices.clone()), - ), - "=\" + ".to_string(), - ), - emit_simple_expr( - &field_init_node_value(&e), - &RenderTarget::Go, - &source_indices, - ), - ), - ")".to_string(), - )); - } - __result - }); - let run_lines = v2_rt::concat( - v2_rt::concat( - v2_rt::concat(prefix.clone(), "output, err := cmd.Output()\n".to_string()), - "if err != nil {\n\treturn \"\", fmt.Errorf(\"running command: %w\", err)\n}\n" - .to_string(), - ), - "return string(output), nil".to_string(), - ); - let all_lines = v2_rt::concat( - v2_rt::concat(Rc::new(vec![cmd_line, dir_line]), env_lines), - Rc::new(vec![run_lines]), - ); - all_lines.join(&"\n".to_string()) - } +let cmd_line = v2_rt::concat(v2_rt::concat(v2_rt::concat(prefix.clone(), "cmd := exec.Command(\"".to_string()), to_snake(op_name)), "\")".to_string()); +let dir_line = v2_rt::concat(prefix.clone(), "cmd.Dir = c.WorkingDir".to_string()); +let envs = transport_env(transport, source_indices.clone()); +let env_lines = Rc::new({ let mut __result = Vec::new(); for e in envs.iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(prefix.clone(), "cmd.Env = append(cmd.Env, \"".to_string()), field_init_node_name_at(e.clone(), source_indices.clone())), "=\" + ".to_string()), emit_simple_expr(&field_init_node_value(&e), &RenderTarget::Go, &source_indices)), ")".to_string())); } __result }); +let run_lines = v2_rt::concat(v2_rt::concat(v2_rt::concat(prefix.clone(), "output, err := cmd.Output()\n".to_string()), "if err != nil {\n\treturn \"\", fmt.Errorf(\"running command: %w\", err)\n}\n".to_string()), "return string(output), nil".to_string()); +let all_lines = v2_rt::concat(v2_rt::concat(Rc::new(vec![cmd_line, dir_line]), env_lines), Rc::new(vec![run_lines])); +all_lines.join(&"\n".to_string()) +} } pub fn emit_go_file_call(op_name: String, depth: i64) -> String { { let prefix = make_indent(depth); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(prefix, "path := fmt.Sprintf(\"%s/".to_string()), - to_snake(op_name), - ), - "\", c.BasePath)\n".to_string(), - ), - "data, err := os.ReadFile(path)\n".to_string(), - ), - "if err != nil {\n\treturn \"\", fmt.Errorf(\"reading file: %w\", err)\n}\n" - .to_string(), - ), - "return string(data), nil".to_string(), - ) - } +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(prefix, "path := fmt.Sprintf(\"%s/".to_string()), to_snake(op_name)), "\", c.BasePath)\n".to_string()), "data, err := os.ReadFile(path)\n".to_string()), "if err != nil {\n\treturn \"\", fmt.Errorf(\"reading file: %w\", err)\n}\n".to_string()), "return string(data), nil".to_string()) +} } pub fn emit_go_local_call(op_name: String, depth: i64) -> String { { let prefix = make_indent(depth); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - prefix, - "// Local binding -- direct function call\n".to_string(), - ), - "return ".to_string(), - ), - go_export_ident(op_name), - ), - "(), nil".to_string(), - ) - } +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(prefix, "// Local binding -- direct function call\n".to_string()), "return ".to_string()), go_export_ident(op_name)), "(), nil".to_string()) +} } pub fn emit_go_resource_def(item: &Rc, env: &Rc) -> String { { let item_text = authored_name(env.clone(), item.clone()); - let cap_children = Rc::new({ - let mut __result = Vec::new(); - for c in item.children.clone().iter().cloned() { - if ((c.params.clone().len() as i64) > 0) { - __result.push(c); - } - } - __result - }); - let methods = Rc::new({ - let mut __result = Vec::new(); - for c in cap_children.iter().cloned() { - __result.push(emit_go_capability_method(&c, 1, &env)); - } - __result - }); - let methods_str = methods.join(&"\n".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - language_spec(RenderTarget::Go) - .items - .clone() - .type_alias_keyword - .clone(), - " ".to_string(), - ), - item_text, - ), - " interface {\n".to_string(), - ), - methods_str, - ), - "\n}".to_string(), - ) - } +let cap_children = Rc::new({ let mut __result = Vec::new(); for c in item.children.clone().iter().cloned() { if ((c.params.clone().len() as i64) > 0) { __result.push(c); } } __result }); +let methods = Rc::new({ let mut __result = Vec::new(); for c in cap_children.iter().cloned() { __result.push(emit_go_capability_method(&c, 1, &env)); } __result }); +let methods_str = methods.join(&"\n".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Go).items.clone().type_alias_keyword.clone(), " ".to_string()), item_text), " interface {\n".to_string()), methods_str), "\n}".to_string()) +} } pub fn emit_go_capability_method(cap_node: &Rc, depth: i64, env: &Rc) -> String { { - let input_params = Rc::new({ - let mut __result = Vec::new(); - for p in cap_node.params.clone().iter().cloned() { - __result.push(v2_rt::concat( - v2_rt::concat( - emit_ident( - param_node_name_at(p.clone(), env.source_indices.clone()), - RenderTarget::Go, - ), - " ".to_string(), - ), - emit_node_type( - param_node_type_expr(&p), - RenderTarget::Go, - env.source_indices.clone(), - ), - )); - } - __result - }); - let params_str = input_params.join(&", ".to_string()); - let ret = emit_node_type( - resolved_type(cap_node.clone()), - RenderTarget::Go, - env.source_indices.clone(), - ); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - make_indent(depth), - go_export_ident(authored_name(env.clone(), cap_node.clone())), - ), - "(".to_string(), - ), - params_str, - ), - ") (".to_string(), - ), - ret, - ), - ", error)".to_string(), - ) - } + let input_params = Rc::new({ let mut __result = Vec::new(); for p in cap_node.params.clone().iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(emit_ident(param_node_name_at(p.clone(), env.source_indices.clone()), RenderTarget::Go), " ".to_string()), emit_node_type(param_node_type_expr(&p), RenderTarget::Go, env.source_indices.clone()))); } __result }); +let params_str = input_params.join(&", ".to_string()); +let ret = emit_node_type(resolved_type(cap_node.clone()), RenderTarget::Go, env.source_indices.clone()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(make_indent(depth), go_export_ident(authored_name(env.clone(), cap_node.clone()))), "(".to_string()), params_str), ") (".to_string()), ret), ", error)".to_string()) +} } -pub fn emit_go_data_def( - name: String, - type_node: Rc, - value: Rc, - registry: Rc>>, - scope: &Rc, - depth: i64, -) -> String { +pub fn emit_go_data_def(name: String, type_node: Rc, value: Rc, registry: Rc>>, scope: &Rc, depth: i64) -> String { { - let ty_str = emit_node_type( - type_node, - RenderTarget::Go, - scope.type_env.clone().source_indices.clone(), - ); - let val_str = emit_go_typed_expr(value, registry, &scope, depth, 1024); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("var ".to_string(), go_export_ident(name)), - " ".to_string(), - ), - ty_str, - ), - " = ".to_string(), - ), - val_str, - ) - } + let ty_str = emit_node_type(type_node, RenderTarget::Go, scope.type_env.clone().source_indices.clone()); +let val_str = emit_go_typed_expr(value, registry, &scope, depth, 1024); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("var ".to_string(), go_export_ident(name)), " ".to_string()), ty_str), " = ".to_string()), val_str) +} } pub fn go_export_ident(name: String) -> String { match (*language_spec(RenderTarget::Go).visibility.clone()).clone() { - VisibilitySpec::CaseVisibility { - export_case: ec, .. - } => { - let result = apply_naming_case(name, ec.clone()); - if { - let mut __found = false; - for r in go_reserved().iter().cloned() { - if (r.clone().as_str() == result.clone().as_str()) { - __found = true; - break; - } - } - __found - } { - v2_rt::concat(result.clone(), go_reserved_escape_suffix()) - } else { - result.clone() - } + VisibilitySpec::CaseVisibility { export_case: ec, .. } => { + let result = apply_naming_case(name, ec.clone()); +if { let mut __found = false; for r in go_reserved().iter().cloned() { if (r.clone().as_str() == result.clone().as_str()) { __found = true; break; } } __found } { + v2_rt::concat(result.clone(), go_reserved_escape_suffix()) + } else { + result.clone() } - _ => "__GO_VISIBILITY_SPEC_MISMATCH__".to_string(), - } +}, + _ => "__GO_VISIBILITY_SPEC_MISMATCH__".to_string(), +} } diff --git a/src/v2/stage0/src/v2_compiler_emit_python.rs b/src/v2/stage0/src/v2_compiler_emit_python.rs index 3ca12b846ae..280d452ed08 100644 --- a/src/v2/stage0/src/v2_compiler_emit_python.rs +++ b/src/v2/stage0/src/v2_compiler_emit_python.rs @@ -1,615 +1,229 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.emit_python -pub use crate::std_induction::SubValueRelation; -use crate::std_induction::SubValueRelation::SubValueUnknown; -pub use crate::v2_compiler_artifact::RenderTarget; -use crate::v2_compiler_artifact::RenderTarget::Python; -pub use crate::v2_compiler_emit::{ - apply_named_template, apply_type_template1, apply_type_template2, apply_type_template3, - capitalize_first, compute_service_fields, effective_operation_transport, - emit_algebra_method_template, emit_bin_op_symbol, emit_container, emit_default_bin_op, - emit_error_expr, emit_expr_field_access_shared, emit_expr_var_shared, emit_ident, - emit_inferred_shared, emit_keyword, emit_lambda, emit_lambda_params, emit_let_binding, - emit_list_lit_expr, emit_literal, emit_map_type, emit_node_type, emit_null_coalesce, - emit_param_shared, emit_params_shared, emit_return, emit_shared_expr, emit_simple_expr, - emit_string_literal, emit_tco_unified, emit_typed_block_join, emit_typed_call_unified, - emit_typed_cast_shared, emit_typed_first_arg_shared, emit_typed_for_each_shared, - emit_typed_if_shared, emit_typed_index_shared, emit_typed_let_shared, emit_typed_match_unified, - emit_typed_method_call_unified, emit_typed_record_lit_unified, emit_typed_slice_shared, - emit_typed_string_interp_unified, emit_unary_op, emit_unified_init_block_stmts, - emit_unified_operation_method, emit_unified_pattern, emit_unified_service_def, - emit_unified_transport_dispatch, emit_unified_typed_expr, emit_unified_typed_func_body, - empty_emit_scope, escape_json_string, escape_python_interp_text, escape_string_literal_body, - extract_string_interp_parts, extract_test_projections, has_nested_records_node, - has_service_items, is_data_def_item, is_function_item, is_null_coalesce, is_resource_def_item, - is_service_def_item, is_service_item, is_tco_eligible, is_type_alias_item, - is_type_alias_return_node, is_type_decl_item, is_type_def_item, is_upper, language_spec, - lookup_item, make_indent, module_emit_scope, module_to_filename, order_typed_call_args, - sanitize_service_name, scope_after_expr, seed_bindings, service_fallback_transport, - service_field_ctors, service_field_decls, service_var_name, test_file_path, test_function_name, - to_lower_char, to_screaming_snake, to_snake, to_string, to_string_helper, to_upper_char, - typed_named_arg_matches, unique_strings, BlockEmitState, EmitResult, InterpPart, - ServiceFieldSet, TestProjection, -}; -pub use crate::v2_compiler_infer::{build_params_scope, expr_span, extend_scope, InferScope}; -pub use crate::v2_compiler_infer_env::{authored_name, TypeBinding, TypeEnv}; -pub use crate::v2_compiler_infer_items::{ItemInfo, ResolvedGraph, TypedModule}; -pub use crate::v2_compiler_infer_service::{ - extract_typed_service_name, is_typed_service_call_receiver, -}; -pub use crate::v2_compiler_infer_sigs::{ResolvedFuncEnv, ResolvedFuncSig}; -pub use crate::v2_compiler_infer_types::{ - node_is_keyed_collection, normalize_access_type_node, resolved_type, -}; -pub use crate::v2_compiler_languages::{ - is_string_like, scaffold_for_target, serialization_for_target, test_conventions_for_target, - ItemKeywords, TestConventions, -}; +use std::collections::HashMap; +use std::rc::Rc; use crate::v2_rt; -use crate::v2_std_core::BinOp::NullCoalesce; -use crate::v2_std_core::Cardinality::CardOptional; -use crate::v2_std_core::Connective::{Conj, Disj}; -use crate::v2_std_core::ExprData::{ - ExprBinOp, ExprBlock, ExprCall, ExprCast, ExprError, ExprFieldAccess, ExprForEach, ExprIf, - ExprIndex, ExprLambda, ExprLet, ExprListLit, ExprLiteral, ExprMatch, ExprMethodCall, - ExprRecordLit, ExprReturn, ExprSlice, ExprStringInterp, ExprUnaryOp, ExprVar, NoExprData, -}; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::v2_std_core::{Node, InferredNode, VarBindingKind, import_is_all, import_specific_names_at, module_imports, module_items, param_node_type_expr, authored_name_at, NewlineIndex, expr_var_name_at, expr_call_func_at, expr_method_name_at, let_binding_name_at, param_node_name_at, resource_use_name_at, MatchPattern, LiteralValue, TextFile, SourceSpan, resource_use_resource, BinOp, UnaryOpKind, StringPart, DeclaredFuncSig, transport_has_auth, transport_auth_header_name, transport_headers, transport_env, ExprData, make_expr_node, MethodSemantics, FieldSummary, arg_value, arm_body, arm_pattern, arm_guard, field_init_node_name_at, field_init_node_value, if_condition, if_then_branch, if_else_branch, match_scrutinee, match_arm_nodes, let_value, let_body, field_access_base, field_access_field_at, method_receiver, expr_field_access_summary, expr_method_call_semantics, record_lit_type_name_at, lambda_body, cast_expr, cast_target, return_value, foreach_variable_at, foreach_collection, foreach_body, method_arg_nodes, index_base, index_expr, slice_base, slice_start, slice_end, with_required_cardinality, Connective, is_rest_transport, is_shell_transport, is_file_transport, FieldAccessStyle, Cardinality}; +use crate::v2_std_core::InferredNode::{Resolved, CompilerError}; +use crate::v2_std_core::VarBindingKind::{FunctionValueBinding}; +use crate::v2_std_core::BinOp::{NullCoalesce}; +use crate::v2_std_core::ExprData::{NoExprData, ExprLiteral, ExprError, ExprVar, ExprFieldAccess, ExprCall, ExprMethodCall, ExprMatch, ExprIf, ExprLet, ExprRecordLit, ExprListLit, ExprBinOp, ExprUnaryOp, ExprLambda, ExprStringInterp, ExprBlock, ExprCast, ExprForEach, ExprIndex, ExprSlice, ExprReturn}; +use crate::v2_std_core::MethodSemantics::{PlainMethodSemantics, AlgebraMethodSemantics, ServiceMethodSemantics}; use crate::v2_std_core::FieldAccessStyle::{TupleFirst, TupleSecond}; -use crate::v2_std_core::InferredNode::{CompilerError, Resolved}; -use crate::v2_std_core::LiteralValue::*; +use crate::v2_std_core::StringPart::{Text, Interpolation}; +use crate::v2_std_core::Connective::{Conj, Disj}; +use crate::v2_std_core::Cardinality::{CardOptional}; use crate::v2_std_core::MatchPattern::*; -use crate::v2_std_core::MethodSemantics::{ - AlgebraMethodSemantics, PlainMethodSemantics, ServiceMethodSemantics, -}; -use crate::v2_std_core::StringPart::{Interpolation, Text}; +use crate::v2_std_core::LiteralValue::*; use crate::v2_std_core::UnaryOpKind::*; -use crate::v2_std_core::VarBindingKind::FunctionValueBinding; -pub use crate::v2_std_core::{ - arg_value, arm_body, arm_guard, arm_pattern, authored_name_at, cast_expr, cast_target, - expr_call_func_at, expr_field_access_summary, expr_method_call_semantics, expr_method_name_at, - expr_var_name_at, field_access_base, field_access_field_at, field_init_node_name_at, - field_init_node_value, foreach_body, foreach_collection, foreach_variable_at, if_condition, - if_else_branch, if_then_branch, import_is_all, import_specific_names_at, index_base, - index_expr, is_file_transport, is_rest_transport, is_shell_transport, lambda_body, - let_binding_name_at, let_body, let_value, make_expr_node, match_arm_nodes, match_scrutinee, - method_arg_nodes, method_receiver, module_imports, module_items, param_node_name_at, - param_node_type_expr, record_lit_type_name_at, resource_use_name_at, resource_use_resource, - return_value, slice_base, slice_end, slice_start, transport_auth_header_name, transport_env, - transport_has_auth, transport_headers, with_required_cardinality, BinOp, Cardinality, - Connective, DeclaredFuncSig, ExprData, FieldAccessStyle, FieldSummary, InferredNode, - LiteralValue, MatchPattern, MethodSemantics, NewlineIndex, Node, SourceSpan, StringPart, - TextFile, UnaryOpKind, VarBindingKind, -}; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; -use std::collections::HashMap; -use std::rc::Rc; +pub use crate::v2_compiler_artifact::{RenderTarget}; +use crate::v2_compiler_artifact::RenderTarget::{Python}; +pub use crate::v2_compiler_languages::{scaffold_for_target, serialization_for_target, TestConventions, ItemKeywords, test_conventions_for_target, is_string_like}; +pub use crate::v2_compiler_infer_env::{TypeEnv, TypeBinding, authored_name}; +pub use crate::v2_compiler_infer_types::{resolved_type, normalize_access_type_node, node_is_keyed_collection}; +pub use crate::v2_compiler_infer_sigs::{ResolvedFuncSig, ResolvedFuncEnv}; +pub use crate::v2_compiler_infer_items::{ResolvedGraph, TypedModule, ItemInfo}; +pub use crate::v2_compiler_infer_service::{is_typed_service_call_receiver, extract_typed_service_name}; +pub use crate::v2_compiler_infer::{InferScope, build_params_scope, extend_scope, expr_span}; +pub use crate::std_induction::{SubValueRelation}; +use crate::std_induction::SubValueRelation::{SubValueUnknown}; +pub use crate::v2_compiler_emit::{EmitResult, BlockEmitState, InterpPart, TestProjection, emit_literal, emit_bin_op_symbol, emit_keyword, emit_container, emit_map_type, emit_node_type, emit_ident, emit_let_binding, emit_simple_expr, emit_unary_op, emit_lambda, emit_error_expr, emit_return, emit_lambda_params, emit_list_lit_expr, emit_shared_expr, emit_default_bin_op, emit_string_literal, escape_python_interp_text, escape_string_literal_body, empty_emit_scope, module_emit_scope, scope_after_expr, lookup_item, typed_named_arg_matches, order_typed_call_args, unique_strings, has_nested_records_node, escape_json_string, module_to_filename, make_indent, to_string, to_string_helper, to_snake, to_screaming_snake, is_upper, to_lower_char, to_upper_char, capitalize_first, sanitize_service_name, service_var_name, test_function_name, apply_type_template1, apply_type_template2, apply_type_template3, apply_named_template, language_spec, is_null_coalesce, emit_null_coalesce, is_type_alias_return_node, is_service_item, has_service_items, is_type_def_item, is_type_alias_item, is_type_decl_item, is_function_item, is_data_def_item, is_service_def_item, is_resource_def_item, extract_test_projections, is_tco_eligible, service_fallback_transport, effective_operation_transport, ServiceFieldSet, compute_service_fields, service_field_decls, service_field_ctors, seed_bindings, emit_expr_var_shared, emit_expr_field_access_shared, extract_string_interp_parts, emit_typed_cast_shared, emit_typed_for_each_shared, emit_typed_index_shared, emit_typed_slice_shared, emit_unified_init_block_stmts, emit_typed_if_shared, emit_typed_let_shared, emit_param_shared, emit_params_shared, emit_inferred_shared, emit_typed_block_join, emit_typed_first_arg_shared, emit_algebra_method_template, emit_typed_string_interp_unified, emit_typed_record_lit_unified, emit_typed_call_unified, emit_typed_method_call_unified, emit_typed_match_unified, emit_unified_typed_expr, emit_tco_unified, emit_unified_pattern, test_file_path, emit_unified_typed_func_body, emit_unified_service_def, emit_unified_operation_method, emit_unified_transport_dispatch}; pub fn emit_python(typed: &Rc) -> Rc { { let registry = typed.item_registry.clone(); - let test_projections = extract_test_projections(typed.clone()); - let module_files = Rc::new({ - let mut __result = Vec::new(); - for tm in typed.modules.clone().iter().cloned() { - __result.push(emit_py_module(&tm, registry.clone())); - } - __result - }); - let test_files = Rc::new({ - let mut __result = Vec::new(); - for f in Rc::new({ - let mut __result = Vec::new(); - for tm in typed.modules.clone().iter().cloned() { - __result.push(emit_py_test_file( - &authored_name_at( - tm.type_env.clone().source_indices.clone(), - &tm.module.clone(), - ), - &Rc::new({ - let mut __result = Vec::new(); - for p in test_projections.clone().iter().cloned() { - if (p.module_name.clone().as_str() - == authored_name_at( - tm.type_env.clone().source_indices.clone(), - &tm.module.clone(), - ) - .as_str()) - { - __result.push(p); - } - } - __result - }), - )); - } - __result - }) - .iter() - .cloned() - { - if (f.path.clone().as_str() != "".to_string().as_str()) { - __result.push(f); - } - } - __result - }); - let init_file = emit_init_py(typed.modules.clone()); - let requirements = emit_requirements_txt(has_service_items(typed.clone())); - let files = v2_rt::concat( - v2_rt::concat(Rc::new(vec![requirements, init_file]), module_files), - test_files, - ); - Rc::new(EmitResult { - files: files, - diagnostics: Rc::new(vec![]), - }) - } +let test_projections = extract_test_projections(typed.clone()); +let module_files = Rc::new({ let mut __result = Vec::new(); for tm in typed.modules.clone().iter().cloned() { __result.push(emit_py_module(&tm, registry.clone())); } __result }); +let test_files = Rc::new({ let mut __result = Vec::new(); for f in Rc::new({ let mut __result = Vec::new(); for tm in typed.modules.clone().iter().cloned() { __result.push(emit_py_test_file(&authored_name_at(tm.type_env.clone().source_indices.clone(), &tm.module.clone()), &Rc::new({ let mut __result = Vec::new(); for p in test_projections.clone().iter().cloned() { if (p.module_name.clone().as_str() == authored_name_at(tm.type_env.clone().source_indices.clone(), &tm.module.clone()).as_str()) { __result.push(p); } } __result }))); } __result }).iter().cloned() { if (f.path.clone().as_str() != "".to_string().as_str()) { __result.push(f); } } __result }); +let init_file = emit_init_py(typed.modules.clone()); +let requirements = emit_requirements_txt(has_service_items(typed.clone())); +let files = v2_rt::concat(v2_rt::concat(Rc::new(vec![requirements, init_file]), module_files), test_files); +Rc::new(EmitResult { + files: files, + diagnostics: Rc::new(vec![]), +}) +} } pub fn py_derive_attribute() -> String { - match serialization_for_target(RenderTarget::Python) - .derive_attribute - .clone() - { - Some(attr) => attr.clone(), - None => "@dataclass".to_string(), - } + match serialization_for_target(RenderTarget::Python).derive_attribute.clone() { + Some(attr) => attr.clone(), + None => "@dataclass".to_string(), +} } pub fn py_default_value() -> String { - match serialization_for_target(RenderTarget::Python) - .default_value - .clone() - { - Some(value) => value.clone(), - None => "None".to_string(), - } + match serialization_for_target(RenderTarget::Python).default_value.clone() { + Some(value) => value.clone(), + None => "None".to_string(), +} } pub fn emit_init_py(modules: Rc>>) -> Rc { { - let import_lines = Rc::new({ - let mut __result = Vec::new(); - for tm in modules.iter().cloned() { - __result.push({ - let mod_name = module_to_filename(authored_name_at( - tm.type_env.clone().source_indices.clone(), - &tm.module.clone(), - )); - let items = language_spec(RenderTarget::Python).items.clone(); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(items.import_from_keyword.clone(), " . ".to_string()), - items.import_keyword.clone(), - ), - " ".to_string(), - ), - mod_name.clone(), - ) - }); - } - __result - }); - let content = v2_rt::concat( - v2_rt::concat( - "# Generated by v2 compiler -- do not edit.\n\n".to_string(), - import_lines.join(&"\n".to_string()), - ), - "\n".to_string(), - ); - let init_path = match scaffold_for_target(RenderTarget::Python) - .module_init_file - .clone() - { - Some(path) => path.clone(), - None => "__init__.py".to_string(), - }; - Rc::new(TextFile { - path: init_path, - content: content, - }) - } + let import_lines = Rc::new({ let mut __result = Vec::new(); for tm in modules.iter().cloned() { __result.push({ + let mod_name = module_to_filename(authored_name_at(tm.type_env.clone().source_indices.clone(), &tm.module.clone())); +let items = language_spec(RenderTarget::Python).items.clone(); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(items.import_from_keyword.clone(), " . ".to_string()), items.import_keyword.clone()), " ".to_string()), mod_name.clone()) +}); } __result }); +let content = v2_rt::concat(v2_rt::concat("# Generated by v2 compiler -- do not edit.\n\n".to_string(), import_lines.join(&"\n".to_string())), "\n".to_string()); +let init_path = match scaffold_for_target(RenderTarget::Python).module_init_file.clone() { + Some(path) => path.clone(), + None => "__init__.py".to_string(), +}; +Rc::new(TextFile { + path: init_path, + content: content, +}) +} } pub fn python_test_signature_comment(projection: &Rc) -> String { { - let params_str = Rc::new({ - let mut __result = Vec::new(); - for p in projection.params.clone().iter().cloned() { - __result.push(v2_rt::concat( - v2_rt::concat( - param_node_name_at(p.clone(), projection.source_indices.clone()), - ": ".to_string(), - ), - emit_node_type( - param_node_type_expr(&p), - RenderTarget::Python, - projection.source_indices.clone(), - ), - )); - } - __result - }) - .join(&", ".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "# Signature: ".to_string(), - sanitize_service_name(projection.service_name.clone()), - ), - ".".to_string(), - ), - projection.operation_name.clone(), - ), - "(".to_string(), - ), - params_str, - ), - ") -> ".to_string(), - ), - emit_node_type( - projection.inferred.clone(), - RenderTarget::Python, - projection.source_indices.clone(), - ), - ) - } + let params_str = Rc::new({ let mut __result = Vec::new(); for p in projection.params.clone().iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(param_node_name_at(p.clone(), projection.source_indices.clone()), ": ".to_string()), emit_node_type(param_node_type_expr(&p), RenderTarget::Python, projection.source_indices.clone()))); } __result }).join(&", ".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("# Signature: ".to_string(), sanitize_service_name(projection.service_name.clone())), ".".to_string()), projection.operation_name.clone()), "(".to_string()), params_str), ") -> ".to_string()), emit_node_type(projection.inferred.clone(), RenderTarget::Python, projection.source_indices.clone())) +} } -pub fn emit_py_test_file( - module_name: &String, - projections: &Rc>>, -) -> Rc { +pub fn emit_py_test_file(module_name: &String, projections: &Rc>>) -> Rc { if ((projections.clone().len() as i64) == 0) { Rc::new(TextFile { - path: "".to_string(), - content: "".to_string(), - }) + path: "".to_string(), + content: "".to_string(), +}) } else { { - let tests_str = Rc::new({ - let mut __result = Vec::new(); - for p in projections.clone().iter().cloned() { - __result.push(emit_py_operation_test(&p, 0)); - } - __result - }) - .join(&"\n\n".to_string()); - let content = v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "# Generated tests -- do not edit.\n".to_string(), - "# Source module: ".to_string(), - ), - module_name.clone(), - ), - "\n\n".to_string(), - ), - tests_str, - ), - "\n".to_string(), - ); - Rc::new(TextFile { - path: test_file_path(module_name.clone(), &RenderTarget::Python), - content: content, - }) - } + let tests_str = Rc::new({ let mut __result = Vec::new(); for p in projections.clone().iter().cloned() { __result.push(emit_py_operation_test(&p, 0)); } __result }).join(&"\n\n".to_string()); +let content = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("# Generated tests -- do not edit.\n".to_string(), "# Source module: ".to_string()), module_name.clone()), "\n\n".to_string()), tests_str), "\n".to_string()); +Rc::new(TextFile { + path: test_file_path(module_name.clone(), &RenderTarget::Python), + content: content, +}) +} } } pub fn emit_py_operation_test(projection: &Rc, depth: i64) -> String { { let test_name = test_function_name(&projection, RenderTarget::Python); - let indent = make_indent((depth.clone() + 1)); - let mock_setup = Rc::new({ - let mut __result = Vec::new(); - for mp in projection.mock_field_inits.clone().iter().cloned() { - __result.push(emit_py_mock_prop_setup( - &mp, - (depth.clone() + 1), - &projection.source_indices.clone(), - )); - } - __result - }) - .join(&"\n".to_string()); - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Python).items.clone().func_keyword.clone(), " ".to_string()), test_name), "() -> None:\n".to_string()), indent.clone()), python_test_signature_comment(&projection)), "\n".to_string()), indent.clone()), mock_setup), "\n".to_string()), indent.clone()), "# TODO: add dry-run support to Python service emission for full invocation tests\n".to_string()), indent.clone()), "assert True # mock data setup verified\n".to_string()) - } +let indent = make_indent((depth.clone() + 1)); +let mock_setup = Rc::new({ let mut __result = Vec::new(); for mp in projection.mock_field_inits.clone().iter().cloned() { __result.push(emit_py_mock_prop_setup(&mp, (depth.clone() + 1), &projection.source_indices.clone())); } __result }).join(&"\n".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Python).items.clone().func_keyword.clone(), " ".to_string()), test_name), "() -> None:\n".to_string()), indent.clone()), python_test_signature_comment(&projection)), "\n".to_string()), indent.clone()), mock_setup), "\n".to_string()), indent.clone()), "# TODO: add dry-run support to Python service emission for full invocation tests\n".to_string()), indent.clone()), "assert True # mock data setup verified\n".to_string()) +} } -pub fn emit_py_mock_prop_setup( - mock_prop: &Rc, - depth: i64, - source_indices: &Rc>>, -) -> String { - v2_rt::concat( - v2_rt::concat( - emit_ident( - field_init_node_name_at(mock_prop.clone(), source_indices.clone()), - RenderTarget::Python, - ), - " = ".to_string(), - ), - emit_simple_expr( - &field_init_node_value(&mock_prop), - &RenderTarget::Python, - &source_indices, - ), - ) +pub fn emit_py_mock_prop_setup(mock_prop: &Rc, depth: i64, source_indices: &Rc>>) -> String { + v2_rt::concat(v2_rt::concat(emit_ident(field_init_node_name_at(mock_prop.clone(), source_indices.clone()), RenderTarget::Python), " = ".to_string()), emit_simple_expr(&field_init_node_value(&mock_prop), &RenderTarget::Python, &source_indices)) } -pub fn emit_py_module( - typed_module: &Rc, - registry: Rc>>, -) -> Rc { +pub fn emit_py_module(typed_module: &Rc, registry: Rc>>) -> Rc { { let m = typed_module.module.clone(); - let scope = module_emit_scope(&typed_module); - let si = scope.type_env.clone().source_indices.clone(); - let mod_name_str = authored_name_at(si.clone(), &m); - let prelude = emit_py_prelude(typed_module.clone()); - let imports_str = emit_py_imports(&module_imports(m.clone()), si.clone()); - let imports_section = if (imports_str.clone().as_str() == "".to_string().as_str()) { +let scope = module_emit_scope(&typed_module); +let si = scope.type_env.clone().source_indices.clone(); +let mod_name_str = authored_name_at(si.clone(), &m); +let prelude = emit_py_prelude(typed_module.clone()); +let imports_str = emit_py_imports(&module_imports(m.clone()), si.clone()); +let imports_section = if (imports_str.clone().as_str() == "".to_string().as_str()) { "".to_string() } else { v2_rt::concat("\n".to_string(), imports_str.clone()) }; - let items_str = Rc::new({ - let mut __result = Vec::new(); - for item in typed_module.items.clone().iter().cloned() { - __result.push(emit_py_typed_item(&item, registry.clone(), &scope)); - } - __result - }) - .join(&"\n\n\n".to_string()); - let filename = module_to_filename(mod_name_str.clone()); - let content = v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "# Generated by v2 compiler -- do not edit.\n".to_string(), - "# Source module: ".to_string(), - ), - mod_name_str.clone(), - ), - "\n\n".to_string(), - ), - prelude, - ), - imports_section, - ), - "\n\n\n".to_string(), - ), - items_str, - ), - "\n".to_string(), - ); - Rc::new(TextFile { - path: v2_rt::concat( - filename, - scaffold_for_target(RenderTarget::Python) - .source_file_extension - .clone(), - ), - content: content, - }) - } +let items_str = Rc::new({ let mut __result = Vec::new(); for item in typed_module.items.clone().iter().cloned() { __result.push(emit_py_typed_item(&item, registry.clone(), &scope)); } __result }).join(&"\n\n\n".to_string()); +let filename = module_to_filename(mod_name_str.clone()); +let content = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("# Generated by v2 compiler -- do not edit.\n".to_string(), "# Source module: ".to_string()), mod_name_str.clone()), "\n\n".to_string()), prelude), imports_section), "\n\n\n".to_string()), items_str), "\n".to_string()); +Rc::new(TextFile { + path: v2_rt::concat(filename, scaffold_for_target(RenderTarget::Python).source_file_extension.clone()), + content: content, +}) +} } -pub fn emit_py_imports( - imports: &Rc>>, - source_indices: Rc>>, -) -> String { +pub fn emit_py_imports(imports: &Rc>>, source_indices: Rc>>) -> String { if ((imports.clone().len() as i64) == 0) { "".to_string() } else { { - let import_lines = Rc::new({ - let mut __result = Vec::new(); - for imp in imports.clone().iter().cloned() { - __result.push({ - let mod_name = - module_to_filename(authored_name_at(source_indices.clone(), &imp)); - let items = language_spec(RenderTarget::Python).items.clone(); - if import_is_all(imp.clone()) { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - items.import_from_keyword.clone(), - " ".to_string(), - ), - mod_name.clone(), - ), - " ".to_string(), - ), - items.import_keyword.clone(), - ), - " *".to_string(), - ) + let import_lines = Rc::new({ let mut __result = Vec::new(); for imp in imports.clone().iter().cloned() { __result.push({ + let mod_name = module_to_filename(authored_name_at(source_indices.clone(), &imp)); +let items = language_spec(RenderTarget::Python).items.clone(); +if import_is_all(imp.clone()) { + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(items.import_from_keyword.clone(), " ".to_string()), mod_name.clone()), " ".to_string()), items.import_keyword.clone()), " *".to_string()) + } else { + { + let specific_names = import_specific_names_at(imp.clone(), source_indices.clone()); +if ((specific_names.clone().len() as i64) == 0) { + "".to_string() } else { { - let specific_names = - import_specific_names_at(imp.clone(), source_indices.clone()); - if ((specific_names.clone().len() as i64) == 0) { - "".to_string() - } else { - { - let names_str = - specific_names.clone().join(&", ".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - items.import_from_keyword.clone(), - " ".to_string(), - ), - mod_name.clone(), - ), - " ".to_string(), - ), - items.import_keyword.clone(), - ), - " ".to_string(), - ), - names_str.clone(), - ) - } - } - } + let names_str = specific_names.clone().join(&", ".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(items.import_from_keyword.clone(), " ".to_string()), mod_name.clone()), " ".to_string()), items.import_keyword.clone()), " ".to_string()), names_str.clone()) +} } - }); - } - __result - }); - Rc::new({ - let mut __result = Vec::new(); - for line in import_lines.iter().cloned() { - if (line.clone().as_str() != "".to_string().as_str()) { - __result.push(line); - } +} } - __result - }) - .join(&"\n".to_string()) - } +}); } __result }); +Rc::new({ let mut __result = Vec::new(); for line in import_lines.iter().cloned() { if (line.clone().as_str() != "".to_string().as_str()) { __result.push(line); } } __result }).join(&"\n".to_string()) +} } } pub fn emit_py_prelude(typed_module: Rc) -> String { { let items = typed_module.items.clone(); - let has_structs = { - let mut __found = false; - for item in items.clone().iter().cloned() { - if (is_type_def_item(&item) && (item.connective.clone() == Connective::Conj)) { - __found = true; - break; - } - } - __found - }; - let has_enums = { - let mut __found = false; - for item in items.clone().iter().cloned() { - if (is_type_def_item(&item) && (item.connective.clone() == Connective::Disj)) { - __found = true; - break; - } - } - __found - }; - let has_services = { - let mut __found = false; - for item in items.clone().iter().cloned() { - if is_service_item(&item) { - __found = true; - break; - } - } - __found - }; - let future_import = "from __future__ import annotations\n".to_string(); - let dc_import = if has_structs.clone() { +let has_structs = { let mut __found = false; for item in items.clone().iter().cloned() { if (is_type_def_item(&item) && (item.connective.clone() == Connective::Conj)) { __found = true; break; } } __found }; +let has_enums = { let mut __found = false; for item in items.clone().iter().cloned() { if (is_type_def_item(&item) && (item.connective.clone() == Connective::Disj)) { __found = true; break; } } __found }; +let has_services = { let mut __found = false; for item in items.clone().iter().cloned() { if is_service_item(&item) { __found = true; break; } } __found }; +let future_import = "from __future__ import annotations\n".to_string(); +let dc_import = if has_structs.clone() { "from dataclasses import dataclass, field\n".to_string() } else { "".to_string() }; - let enum_import = if has_enums.clone() { +let enum_import = if has_enums.clone() { "from enum import Enum, auto\n".to_string() } else { "".to_string() }; - let typing_import = if (has_structs.clone() || has_enums.clone()) { +let typing_import = if (has_structs.clone() || has_enums.clone()) { "from typing import Optional, Union\n".to_string() } else { "".to_string() }; - let async_import = if has_services { +let async_import = if has_services { "import aiohttp\n".to_string() } else { "".to_string() }; - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(v2_rt::concat(future_import, dc_import), enum_import), - typing_import, - ), - async_import, - ) - } +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(future_import, dc_import), enum_import), typing_import), async_import) +} } -pub fn emit_py_typed_item( - item: &Rc, - registry: Rc>>, - scope: &Rc, -) -> String { +pub fn emit_py_typed_item(item: &Rc, registry: Rc>>, scope: &Rc) -> String { { let env = scope.type_env.clone(); - let item_text = authored_name(env.clone(), item.clone()); - if is_type_def_item(&item) { +let item_text = authored_name(env.clone(), item.clone()); +if is_type_def_item(&item) { emit_py_type_def_from_connective(&item, &env) } else { if is_type_alias_item(&item, env.source_indices.clone()) { - v2_rt::concat( - v2_rt::concat(item_text, " = ".to_string()), - emit_node_type( - resolved_type(item.clone()), - RenderTarget::Python, - env.source_indices.clone(), - ), - ) + v2_rt::concat(v2_rt::concat(item_text, " = ".to_string()), emit_node_type(resolved_type(item.clone()), RenderTarget::Python, env.source_indices.clone())) } else { if is_type_decl_item(&item, env.source_indices.clone()) { "".to_string() } else { if is_function_item(&item) { if ((item.uses.clone().len() as i64) > 0) { - emit_py_func_def( - &item_text, - &item.params.clone(), - resolved_type(item.clone()), - &item.uses.clone(), - item.body.clone().clone().unwrap(), - ®istry, - &scope, - ) + emit_py_func_def(&item_text, &item.params.clone(), resolved_type(item.clone()), &item.uses.clone(), item.body.clone().clone().unwrap(), ®istry, &scope) } else { - emit_py_fn_def( - &item_text, - &item.params.clone(), - resolved_type(item.clone()), - &item.body.clone().clone().unwrap(), - ®istry, - &scope, - ) + emit_py_fn_def(&item_text, &item.params.clone(), resolved_type(item.clone()), &item.body.clone().clone().unwrap(), ®istry, &scope) } } else { if is_data_def_item(&item) { - emit_py_data_def( - item_text, - item.type_annotation.clone().clone().unwrap(), - item.body.clone().clone().unwrap(), - registry, - &scope, - ) + emit_py_data_def(item_text, item.type_annotation.clone().clone().unwrap(), item.body.clone().clone().unwrap(), registry, &scope) } else { if is_service_def_item(&item) { emit_py_service_def(item.clone(), registry, env.clone()) @@ -625,915 +239,262 @@ pub fn emit_py_typed_item( } } } - } +} } pub fn emit_py_type_def_from_connective(item: &Rc, env: &Rc) -> String { { let item_text = authored_name(env.clone(), item.clone()); - let is_product = (item.connective.clone() == Connective::Conj); - if is_product { +let is_product = (item.connective.clone() == Connective::Conj); +if is_product { emit_py_dataclass_from_children(item_text, &item.children.clone(), env.clone()) } else { emit_py_enum_from_children(&item_text, &item.children.clone(), env.clone()) } - } +} } -pub fn emit_py_dataclass_from_children( - name: String, - children: &Rc>>, - env: Rc, -) -> String { +pub fn emit_py_dataclass_from_children(name: String, children: &Rc>>, env: Rc) -> String { if ((children.clone().len() as i64) == 0) { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(py_derive_attribute(), "\nclass ".to_string()), - name, - ), - ":\n pass".to_string(), - ) + v2_rt::concat(v2_rt::concat(v2_rt::concat(py_derive_attribute(), "\nclass ".to_string()), name), ":\n pass".to_string()) } else { { - let field_lines = Rc::new({ - let mut __result = Vec::new(); - for child in children.clone().iter().cloned() { - __result.push(emit_py_dataclass_field_from_child(&child, &env)); - } - __result - }); - let fields_str = field_lines.join(&"\n".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(py_derive_attribute(), "\nclass ".to_string()), - name, - ), - ":\n".to_string(), - ), - fields_str, - ) - } + let field_lines = Rc::new({ let mut __result = Vec::new(); for child in children.clone().iter().cloned() { __result.push(emit_py_dataclass_field_from_child(&child, &env)); } __result }); +let fields_str = field_lines.join(&"\n".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(py_derive_attribute(), "\nclass ".to_string()), name), ":\n".to_string()), fields_str) +} } } pub fn emit_py_dataclass_field_from_child(child: &Rc, env: &Rc) -> String { { - let ty = emit_node_type( - resolved_type(child.clone()), - RenderTarget::Python, - env.source_indices.clone(), - ); - let is_optional = - (resolved_type(child.clone()).return_cardinality.clone() == Cardinality::CardOptional); - let default_str = if is_optional { + let ty = emit_node_type(resolved_type(child.clone()), RenderTarget::Python, env.source_indices.clone()); +let is_optional = (resolved_type(child.clone()).return_cardinality.clone() == Cardinality::CardOptional); +let default_str = if is_optional { v2_rt::concat(" = ".to_string(), py_default_value()) } else { "".to_string() }; - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - " ".to_string(), - emit_ident( - authored_name(env.clone(), child.clone()), - RenderTarget::Python, - ), - ), - ": ".to_string(), - ), - ty, - ), - default_str, - ) - } +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" ".to_string(), emit_ident(authored_name(env.clone(), child.clone()), RenderTarget::Python)), ": ".to_string()), ty), default_str) +} } -pub fn emit_py_enum_from_children( - name: &String, - children: &Rc>>, - env: Rc, -) -> String { +pub fn emit_py_enum_from_children(name: &String, children: &Rc>>, env: Rc) -> String { { - let has_data = { - let mut __found = false; - for child in children.clone().iter().cloned() { - if ((child.children.clone().len() as i64) > 0) { - __found = true; - break; - } - } - __found - }; - if has_data { + let has_data = { let mut __found = false; for child in children.clone().iter().cloned() { if ((child.children.clone().len() as i64) > 0) { __found = true; break; } } __found }; +if has_data { { - let variant_classes = Rc::new({ - let mut __result = Vec::new(); - for child in children.clone().iter().cloned() { - __result.push(emit_py_variant_class_from_child(name.clone(), &child, &env)); - } - __result - }); - let variant_names = Rc::new({ - let mut __result = Vec::new(); - for child in children.clone().iter().cloned() { - __result.push(v2_rt::concat( - name.clone(), - authored_name(env.clone(), child.clone()), - )); - } - __result - }); - let union_str = variant_names.join(&", ".to_string()); - let classes_str = variant_classes.join(&"\n\n\n".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(classes_str, "\n\n\n".to_string()), - name.clone(), - ), - " = Union[".to_string(), - ), - union_str, - ), - "]".to_string(), - ) - } + let variant_classes = Rc::new({ let mut __result = Vec::new(); for child in children.clone().iter().cloned() { __result.push(emit_py_variant_class_from_child(name.clone(), &child, &env)); } __result }); +let variant_names = Rc::new({ let mut __result = Vec::new(); for child in children.clone().iter().cloned() { __result.push(v2_rt::concat(name.clone(), authored_name(env.clone(), child.clone()))); } __result }); +let union_str = variant_names.join(&", ".to_string()); +let classes_str = variant_classes.join(&"\n\n\n".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(classes_str, "\n\n\n".to_string()), name.clone()), " = Union[".to_string()), union_str), "]".to_string()) +} } else { { - let variant_lines = Rc::new({ - let mut __result = Vec::new(); - for child in children.clone().iter().cloned() { - __result.push(v2_rt::concat( - v2_rt::concat( - " ".to_string(), - authored_name(env.clone(), child.clone()), - ), - " = auto()".to_string(), - )); - } - __result - }); - let variants_str = variant_lines.join(&"\n".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - language_spec(RenderTarget::Python) - .items - .clone() - .enum_keyword - .clone(), - " ".to_string(), - ), - name.clone(), - ), - "(Enum):\n".to_string(), - ), - variants_str, - ) - } + let variant_lines = Rc::new({ let mut __result = Vec::new(); for child in children.clone().iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(" ".to_string(), authored_name(env.clone(), child.clone())), " = auto()".to_string())); } __result }); +let variants_str = variant_lines.join(&"\n".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Python).items.clone().enum_keyword.clone(), " ".to_string()), name.clone()), "(Enum):\n".to_string()), variants_str) +} } - } +} } -pub fn emit_py_variant_class_from_child( - parent_name: String, - child: &Rc, - env: &Rc, -) -> String { +pub fn emit_py_variant_class_from_child(parent_name: String, child: &Rc, env: &Rc) -> String { { let class_name = v2_rt::concat(parent_name, authored_name(env.clone(), child.clone())); - if ((child.children.clone().len() as i64) == 0) { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(py_derive_attribute(), "\nclass ".to_string()), - class_name, - ), - ":\n pass".to_string(), - ) +if ((child.children.clone().len() as i64) == 0) { + v2_rt::concat(v2_rt::concat(v2_rt::concat(py_derive_attribute(), "\nclass ".to_string()), class_name), ":\n pass".to_string()) } else { { - let field_lines = Rc::new({ - let mut __result = Vec::new(); - for f in child.children.clone().iter().cloned() { - __result.push(emit_py_dataclass_field_from_child(&f, &env)); - } - __result - }); - let fields_str = field_lines.join(&"\n".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(py_derive_attribute(), "\nclass ".to_string()), - class_name, - ), - ":\n".to_string(), - ), - fields_str, - ) - } + let field_lines = Rc::new({ let mut __result = Vec::new(); for f in child.children.clone().iter().cloned() { __result.push(emit_py_dataclass_field_from_child(&f, &env)); } __result }); +let fields_str = field_lines.join(&"\n".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(py_derive_attribute(), "\nclass ".to_string()), class_name), ":\n".to_string()), fields_str) +} } - } +} } -pub fn emit_py_fn_def( - name: &String, - params: &Rc>>, - inferred: Rc, - body: &Rc, - registry: &Rc>>, - scope: &Rc, -) -> String { +pub fn emit_py_fn_def(name: &String, params: &Rc>>, inferred: Rc, body: &Rc, registry: &Rc>>, scope: &Rc) -> String { { let depth = 0; - let si = scope.type_env.clone().source_indices.clone(); - let params_str = emit_params_shared(params.clone(), &RenderTarget::Python, si.clone()); - let ret_str = emit_inferred_shared(&inferred, &RenderTarget::Python, si.clone()); - let body_scope = build_params_scope(&scope, params.clone()); - let use_tco = is_tco_eligible(&name, &body, registry.clone(), &si); - if use_tco { +let si = scope.type_env.clone().source_indices.clone(); +let params_str = emit_params_shared(params.clone(), &RenderTarget::Python, si.clone()); +let ret_str = emit_inferred_shared(&inferred, &RenderTarget::Python, si.clone()); +let body_scope = build_params_scope(&scope, params.clone()); +let use_tco = is_tco_eligible(&name, &body, registry.clone(), &si); +if use_tco { { - let body_str = emit_tco_unified( - body.clone(), - &name, - ¶ms, - &RenderTarget::Python, - ®istry, - &body_scope, - (depth.clone() + 1), - |pat| emit_unified_pattern(pat.clone(), RenderTarget::Python, si.clone()), - ); - let kw = language_spec(RenderTarget::Python) - .items - .clone() - .func_keyword - .clone(); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(kw, " ".to_string()), - emit_ident(name.clone(), RenderTarget::Python), - ), - "(".to_string(), - ), - params_str, - ), - ")".to_string(), - ), - ret_str, - ), - ":\n".to_string(), - ), - make_indent((depth.clone() + 1)), - ), - body_str, - ) - } + let body_str = emit_tco_unified(body.clone(), &name, ¶ms, &RenderTarget::Python, ®istry, &body_scope, (depth.clone() + 1), |pat| emit_unified_pattern(pat.clone(), RenderTarget::Python, si.clone())); +let kw = language_spec(RenderTarget::Python).items.clone().func_keyword.clone(); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(kw, " ".to_string()), emit_ident(name.clone(), RenderTarget::Python)), "(".to_string()), params_str), ")".to_string()), ret_str), ":\n".to_string()), make_indent((depth.clone() + 1))), body_str) +} } else { { - let body_str = emit_py_typed_expr( - body.clone(), - registry.clone(), - &body_scope, - (depth.clone() + 1), - 1024, - ); - let kw = language_spec(RenderTarget::Python) - .items - .clone() - .func_keyword - .clone(); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(kw, " ".to_string()), - emit_ident(name.clone(), RenderTarget::Python), - ), - "(".to_string(), - ), - params_str, - ), - ")".to_string(), - ), - ret_str, - ), - ":\n".to_string(), - ), - make_indent((depth.clone() + 1)), - ), - "return ".to_string(), - ), - body_str, - ) - } + let body_str = emit_py_typed_expr(body.clone(), registry.clone(), &body_scope, (depth.clone() + 1), 1024); +let kw = language_spec(RenderTarget::Python).items.clone().func_keyword.clone(); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(kw, " ".to_string()), emit_ident(name.clone(), RenderTarget::Python)), "(".to_string()), params_str), ")".to_string()), ret_str), ":\n".to_string()), make_indent((depth.clone() + 1))), "return ".to_string()), body_str) +} } - } +} } -pub fn emit_py_func_def( - name: &String, - params: &Rc>>, - inferred: Rc, - uses: &Rc>>, - body: Rc, - registry: &Rc>>, - scope: &Rc, -) -> String { +pub fn emit_py_func_def(name: &String, params: &Rc>>, inferred: Rc, uses: &Rc>>, body: Rc, registry: &Rc>>, scope: &Rc) -> String { { let depth = 0; - let service_names = match lookup_item(registry.clone(), name.clone()) { - Some(info) => info.service_names.clone(), - None => Rc::new(vec![]), - }; - let params_str = emit_py_func_params( - params.clone(), - uses.clone(), - service_names, - scope.type_env.clone().source_indices.clone(), - ); - let ret_str = emit_inferred_shared( - &inferred, - &RenderTarget::Python, - scope.type_env.clone().source_indices.clone(), - ); - let body_scope = build_params_scope(&scope, params.clone()); - let si = scope.type_env.clone().source_indices.clone(); - let body_scope = uses.clone().iter().cloned().fold( - body_scope.clone(), - |s: Rc, u: Rc| { - extend_scope( - &s, - &resource_use_name_at(u.clone(), si.clone()), - resource_use_resource(&u), - Rc::new(SubValueRelation::SubValueUnknown), - ) - }, - ); - let body_str = emit_unified_typed_func_body( - &body, - &RenderTarget::Python, - ®istry, - &body_scope, - (depth.clone() + 1), - ); - let items = language_spec(RenderTarget::Python).items.clone(); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - items.async_prefix.clone(), - items.func_keyword.clone(), - ), - " ".to_string(), - ), - emit_ident(name.clone(), RenderTarget::Python), - ), - "(".to_string(), - ), - params_str, - ), - ")".to_string(), - ), - ret_str, - ), - ":\n".to_string(), - ), - make_indent((depth.clone() + 1)), - ), - body_str, - ) - } +let service_names = match lookup_item(registry.clone(), name.clone()) { + Some(info) => info.service_names.clone(), + None => Rc::new(vec![]), +}; +let params_str = emit_py_func_params(params.clone(), uses.clone(), service_names, scope.type_env.clone().source_indices.clone()); +let ret_str = emit_inferred_shared(&inferred, &RenderTarget::Python, scope.type_env.clone().source_indices.clone()); +let body_scope = build_params_scope(&scope, params.clone()); +let si = scope.type_env.clone().source_indices.clone(); +let body_scope = uses.clone().iter().cloned().fold(body_scope.clone(), |s: Rc, u: Rc| extend_scope(&s, &resource_use_name_at(u.clone(), si.clone()), resource_use_resource(&u), Rc::new(SubValueRelation::SubValueUnknown))); +let body_str = emit_unified_typed_func_body(&body, &RenderTarget::Python, ®istry, &body_scope, (depth.clone() + 1)); +let items = language_spec(RenderTarget::Python).items.clone(); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(items.async_prefix.clone(), items.func_keyword.clone()), " ".to_string()), emit_ident(name.clone(), RenderTarget::Python)), "(".to_string()), params_str), ")".to_string()), ret_str), ":\n".to_string()), make_indent((depth.clone() + 1))), body_str) +} } -pub fn emit_py_func_params( - params: Rc>>, - uses: Rc>>, - service_names: Rc>, - source_indices: Rc>>, -) -> String { +pub fn emit_py_func_params(params: Rc>>, uses: Rc>>, service_names: Rc>, source_indices: Rc>>) -> String { { - let param_strs = Rc::new({ - let mut __result = Vec::new(); - for p in params.iter().cloned() { - __result.push(emit_param_shared( - &p, - &RenderTarget::Python, - &source_indices, - )); - } - __result - }); - let resource_strs = Rc::new({ - let mut __result = Vec::new(); - for u in uses.iter().cloned() { - __result.push(v2_rt::concat( - v2_rt::concat( - emit_ident( - resource_use_name_at(u.clone(), source_indices.clone()), - RenderTarget::Python, - ), - ": ".to_string(), - ), - emit_node_type( - resource_use_resource(&u), - RenderTarget::Python, - source_indices.clone(), - ), - )); - } - __result - }); - let service_strs = Rc::new({ - let mut __result = Vec::new(); - for sn in service_names.iter().cloned() { - __result.push(v2_rt::concat( - v2_rt::concat(service_var_name(sn.clone()), ": ".to_string()), - sanitize_service_name(sn.clone()), - )); - } - __result - }); - let all_params = v2_rt::concat(v2_rt::concat(param_strs, resource_strs), service_strs); - all_params.join(&", ".to_string()) - } + let param_strs = Rc::new({ let mut __result = Vec::new(); for p in params.iter().cloned() { __result.push(emit_param_shared(&p, &RenderTarget::Python, &source_indices)); } __result }); +let resource_strs = Rc::new({ let mut __result = Vec::new(); for u in uses.iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(emit_ident(resource_use_name_at(u.clone(), source_indices.clone()), RenderTarget::Python), ": ".to_string()), emit_node_type(resource_use_resource(&u), RenderTarget::Python, source_indices.clone()))); } __result }); +let service_strs = Rc::new({ let mut __result = Vec::new(); for sn in service_names.iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(service_var_name(sn.clone()), ": ".to_string()), sanitize_service_name(sn.clone()))); } __result }); +let all_params = v2_rt::concat(v2_rt::concat(param_strs, resource_strs), service_strs); +all_params.join(&", ".to_string()) +} } -pub fn emit_py_typed_expr( - texpr: Rc, - registry: Rc>>, - scope: &Rc, - depth: i64, - fuel: i64, -) -> String { - emit_unified_typed_expr( - texpr, - &RenderTarget::Python, - registry, - &scope, - depth, - fuel, - |pat| { - emit_unified_pattern( - pat.clone(), - RenderTarget::Python, - scope.type_env.clone().source_indices.clone(), - ) - }, - ) +pub fn emit_py_typed_expr(texpr: Rc, registry: Rc>>, scope: &Rc, depth: i64, fuel: i64) -> String { + emit_unified_typed_expr(texpr, &RenderTarget::Python, registry, &scope, depth, fuel, |pat| emit_unified_pattern(pat.clone(), RenderTarget::Python, scope.type_env.clone().source_indices.clone())) } -pub fn emit_py_transport_body( - transport: Rc, - op_name: String, - source_indices: Rc>>, - depth: i64, -) -> String { - emit_unified_transport_dispatch( - &transport, - op_name, - &source_indices, - depth, - RenderTarget::Python, - |n, t, d, si| emit_py_rest_call(n.clone(), t.clone(), si.clone()), - |n, t, d, si| emit_py_shell_call(n.clone(), t.clone(), &si), - |n, d| emit_py_file_call(n.clone()), - |n, d| emit_py_local_call(n.clone()), - ) +pub fn emit_py_transport_body(transport: Rc, op_name: String, source_indices: Rc>>, depth: i64) -> String { + emit_unified_transport_dispatch(&transport, op_name, &source_indices, depth, RenderTarget::Python, |n, t, d, si| emit_py_rest_call(n.clone(), t.clone(), si.clone()), |n, t, d, si| emit_py_shell_call(n.clone(), t.clone(), &si), |n, d| emit_py_file_call(n.clone()), |n, d| emit_py_local_call(n.clone())) } -pub fn emit_py_service_def( - item: Rc, - registry: Rc>>, - env: Rc, -) -> String { - emit_unified_service_def( - &item, - &RenderTarget::Python, - registry, - &env, - |name, transport, ops, si| emit_py_service_init(transport.clone(), ops.clone(), si.clone()), - |transport, op_name, si, depth| { - emit_py_transport_body( - transport.clone(), - op_name.clone(), - si.clone(), - depth.clone(), - ) - }, - ) +pub fn emit_py_service_def(item: Rc, registry: Rc>>, env: Rc) -> String { + emit_unified_service_def(&item, &RenderTarget::Python, registry, &env, |name, transport, ops, si| emit_py_service_init(transport.clone(), ops.clone(), si.clone()), |transport, op_name, si, depth| emit_py_transport_body(transport.clone(), op_name.clone(), si.clone(), depth.clone())) } -pub fn emit_py_service_init( - fallback_transport: Rc, - op_children: Rc>>, - source_indices: Rc>>, -) -> String { +pub fn emit_py_service_init(fallback_transport: Rc, op_children: Rc>>, source_indices: Rc>>) -> String { { let fs = compute_service_fields(&fallback_transport, &op_children, &source_indices); - let params = service_field_decls( - &fs, - &language_spec(RenderTarget::Python).service_fields.clone(), - ); - let assigns = service_field_ctors( - &fs, - &language_spec(RenderTarget::Python).service_fields.clone(), - ); - if ((params.clone().len() as i64) == 0) { +let params = service_field_decls(&fs, &language_spec(RenderTarget::Python).service_fields.clone()); +let assigns = service_field_ctors(&fs, &language_spec(RenderTarget::Python).service_fields.clone()); +if ((params.clone().len() as i64) == 0) { "def __init__(self):\n pass".to_string() } else { { - let params_str = - v2_rt::concat("self, ".to_string(), params.clone().join(&", ".to_string())); - let assigns_str = Rc::new({ - let mut __result = Vec::new(); - for a in assigns.iter().cloned() { - __result.push(v2_rt::concat(" ".to_string(), a.clone())); - } - __result - }) - .join(&"\n".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("def __init__(".to_string(), params_str), - "):\n".to_string(), - ), - assigns_str, - ) - } + let params_str = v2_rt::concat("self, ".to_string(), params.clone().join(&", ".to_string())); +let assigns_str = Rc::new({ let mut __result = Vec::new(); for a in assigns.iter().cloned() { __result.push(v2_rt::concat(" ".to_string(), a.clone())); } __result }).join(&"\n".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat("def __init__(".to_string(), params_str), "):\n".to_string()), assigns_str) +} } - } +} } -pub fn emit_py_rest_call( - op_name: String, - transport: Rc, - source_indices: Rc>>, -) -> String { +pub fn emit_py_rest_call(op_name: String, transport: Rc, source_indices: Rc>>) -> String { { - let self_base_url = v2_rt::concat( - v2_rt::concat("{".to_string(), "self.base_url".to_string()), - "}".to_string(), - ); - let url_line = v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("url = f\"".to_string(), self_base_url), - "/".to_string(), - ), - emit_ident(op_name, RenderTarget::Python), - ), - "\"".to_string(), - ); - let headers_dict = emit_py_headers_dict(&transport, &source_indices); - let session_lines = v2_rt::concat( - v2_rt::concat( - "async with aiohttp.ClientSession() as session:\n".to_string(), - " async with session.post(url, headers=headers) as response:\n".to_string(), - ), - " return await response.json()".to_string(), - ); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(v2_rt::concat(url_line, "\n".to_string()), headers_dict), - "\n".to_string(), - ), - session_lines, - ) - } + let self_base_url = v2_rt::concat(v2_rt::concat("{".to_string(), "self.base_url".to_string()), "}".to_string()); +let url_line = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("url = f\"".to_string(), self_base_url), "/".to_string()), emit_ident(op_name, RenderTarget::Python)), "\"".to_string()); +let headers_dict = emit_py_headers_dict(&transport, &source_indices); +let session_lines = v2_rt::concat(v2_rt::concat("async with aiohttp.ClientSession() as session:\n".to_string(), " async with session.post(url, headers=headers) as response:\n".to_string()), " return await response.json()".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(url_line, "\n".to_string()), headers_dict), "\n".to_string()), session_lines) +} } -pub fn emit_py_headers_dict( - transport: &Rc, - source_indices: &Rc>>, -) -> String { +pub fn emit_py_headers_dict(transport: &Rc, source_indices: &Rc>>) -> String { { let auth_entry = if transport_has_auth(transport.clone(), source_indices.clone()) { { - let header_name = - match transport_auth_header_name(transport.clone(), source_indices.clone()) { - Some(h) => h.clone(), - None => "Authorization".to_string(), - }; - v2_rt::concat( - v2_rt::concat("\"".to_string(), header_name), - "\": self.auth_token, ".to_string(), - ) - } + let header_name = match transport_auth_header_name(transport.clone(), source_indices.clone()) { + Some(h) => h.clone(), + None => "Authorization".to_string(), +}; +v2_rt::concat(v2_rt::concat("\"".to_string(), header_name), "\": self.auth_token, ".to_string()) +} } else { "".to_string() }; - let hdrs = transport_headers(transport.clone(), source_indices.clone()); - let header_entries = Rc::new({ - let mut __result = Vec::new(); - for h in hdrs.iter().cloned() { - __result.push(v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "\"".to_string(), - field_init_node_name_at(h.clone(), source_indices.clone()), - ), - "\": ".to_string(), - ), - emit_simple_expr( - &field_init_node_value(&h), - &RenderTarget::Python, - &source_indices, - ), - )); - } - __result - }); - let all_entries = if (auth_entry.clone().as_str() == "".to_string().as_str()) { +let hdrs = transport_headers(transport.clone(), source_indices.clone()); +let header_entries = Rc::new({ let mut __result = Vec::new(); for h in hdrs.iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(v2_rt::concat("\"".to_string(), field_init_node_name_at(h.clone(), source_indices.clone())), "\": ".to_string()), emit_simple_expr(&field_init_node_value(&h), &RenderTarget::Python, &source_indices))); } __result }); +let all_entries = if (auth_entry.clone().as_str() == "".to_string().as_str()) { header_entries.join(&", ".to_string()) } else { v2_rt::concat(auth_entry.clone(), header_entries.join(&", ".to_string())) }; - v2_rt::concat( - v2_rt::concat("headers = {".to_string(), all_entries), - "}".to_string(), - ) - } +v2_rt::concat(v2_rt::concat("headers = {".to_string(), all_entries), "}".to_string()) +} } -pub fn emit_py_shell_call( - op_name: String, - transport: Rc, - source_indices: &Rc>>, -) -> String { +pub fn emit_py_shell_call(op_name: String, transport: Rc, source_indices: &Rc>>) -> String { { let envs = transport_env(transport, source_indices.clone()); - let env_dict_entries = Rc::new({ - let mut __result = Vec::new(); - for e in envs.iter().cloned() { - __result.push(v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "\"".to_string(), - field_init_node_name_at(e.clone(), source_indices.clone()), - ), - "\": ".to_string(), - ), - emit_simple_expr( - &field_init_node_value(&e), - &RenderTarget::Python, - &source_indices, - ), - )); - } - __result - }); - let env_str = v2_rt::concat( - v2_rt::concat("{".to_string(), env_dict_entries.join(&", ".to_string())), - "}".to_string(), - ); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "import subprocess\n".to_string(), - "result = subprocess.run(\n".to_string(), - ), - " [\"".to_string(), - ), - emit_ident(op_name, RenderTarget::Python), - ), - "\"],\n".to_string(), - ), - " cwd=self.working_dir or \".\",\n".to_string(), - ), - " env=".to_string(), - ), - env_str, - ), - ",\n".to_string(), - ), - " capture_output=True, text=True,\n".to_string(), - ), - ")\n".to_string(), - ), - "return result.stdout".to_string(), - ) - } +let env_dict_entries = Rc::new({ let mut __result = Vec::new(); for e in envs.iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(v2_rt::concat("\"".to_string(), field_init_node_name_at(e.clone(), source_indices.clone())), "\": ".to_string()), emit_simple_expr(&field_init_node_value(&e), &RenderTarget::Python, &source_indices))); } __result }); +let env_str = v2_rt::concat(v2_rt::concat("{".to_string(), env_dict_entries.join(&", ".to_string())), "}".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("import subprocess\n".to_string(), "result = subprocess.run(\n".to_string()), " [\"".to_string()), emit_ident(op_name, RenderTarget::Python)), "\"],\n".to_string()), " cwd=self.working_dir or \".\",\n".to_string()), " env=".to_string()), env_str), ",\n".to_string()), " capture_output=True, text=True,\n".to_string()), ")\n".to_string()), "return result.stdout".to_string()) +} } pub fn emit_py_file_call(op_name: String) -> String { { - let self_base_path = v2_rt::concat( - v2_rt::concat("{".to_string(), "self.base_path".to_string()), - "}".to_string(), - ); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("path = f\"".to_string(), self_base_path), - "/".to_string(), - ), - emit_ident(op_name, RenderTarget::Python), - ), - "\"\n".to_string(), - ), - "with open(path) as f:\n".to_string(), - ), - " return f.read()".to_string(), - ) - } + let self_base_path = v2_rt::concat(v2_rt::concat("{".to_string(), "self.base_path".to_string()), "}".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("path = f\"".to_string(), self_base_path), "/".to_string()), emit_ident(op_name, RenderTarget::Python)), "\"\n".to_string()), "with open(path) as f:\n".to_string()), " return f.read()".to_string()) +} } pub fn emit_py_local_call(op_name: String) -> String { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "# Local binding -- direct function call\n".to_string(), - "return ".to_string(), - ), - emit_ident(op_name, RenderTarget::Python), - ), - "()".to_string(), - ) + v2_rt::concat(v2_rt::concat(v2_rt::concat("# Local binding -- direct function call\n".to_string(), "return ".to_string()), emit_ident(op_name, RenderTarget::Python)), "()".to_string()) } pub fn emit_py_resource_def(item: &Rc, env: &Rc) -> String { { let item_text = authored_name(env.clone(), item.clone()); - let depth = 0; - let cap_children = item.children.clone(); - let methods = Rc::new({ - let mut __result = Vec::new(); - for c in cap_children.iter().cloned() { - __result.push(emit_py_capability_method(&c, &env)); - } - __result - }); - let methods_str = methods.join(&"\n\n".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "from abc import ABC, abstractmethod\n\n".to_string(), - language_spec(RenderTarget::Python) - .items - .clone() - .struct_keyword - .clone(), - ), - " ".to_string(), - ), - item_text, - ), - "(ABC):\n".to_string(), - ), - make_indent((depth + 1)), - ), - methods_str, - ) - } +let depth = 0; +let cap_children = item.children.clone(); +let methods = Rc::new({ let mut __result = Vec::new(); for c in cap_children.iter().cloned() { __result.push(emit_py_capability_method(&c, &env)); } __result }); +let methods_str = methods.join(&"\n\n".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("from abc import ABC, abstractmethod\n\n".to_string(), language_spec(RenderTarget::Python).items.clone().struct_keyword.clone()), " ".to_string()), item_text), "(ABC):\n".to_string()), make_indent((depth + 1))), methods_str) +} } pub fn emit_py_capability_method(cap_node: &Rc, env: &Rc) -> String { { - let input_params = Rc::new({ - let mut __result = Vec::new(); - for p in cap_node.params.clone().iter().cloned() { - __result.push(v2_rt::concat( - v2_rt::concat( - emit_ident( - param_node_name_at(p.clone(), env.source_indices.clone()), - RenderTarget::Python, - ), - ": ".to_string(), - ), - emit_node_type( - param_node_type_expr(&p), - RenderTarget::Python, - env.source_indices.clone(), - ), - )); - } - __result - }); - let params_str = input_params.join(&", ".to_string()); - let all_params = if (params_str.clone().as_str() == "".to_string().as_str()) { + let input_params = Rc::new({ let mut __result = Vec::new(); for p in cap_node.params.clone().iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(emit_ident(param_node_name_at(p.clone(), env.source_indices.clone()), RenderTarget::Python), ": ".to_string()), emit_node_type(param_node_type_expr(&p), RenderTarget::Python, env.source_indices.clone()))); } __result }); +let params_str = input_params.join(&", ".to_string()); +let all_params = if (params_str.clone().as_str() == "".to_string().as_str()) { "self".to_string() } else { v2_rt::concat("self, ".to_string(), params_str.clone()) }; - let ret = emit_node_type( - resolved_type(cap_node.clone()), - RenderTarget::Python, - env.source_indices.clone(), - ); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "@abstractmethod\n".to_string(), - language_spec(RenderTarget::Python) - .items - .clone() - .async_prefix - .clone(), - ), - language_spec(RenderTarget::Python) - .items - .clone() - .func_keyword - .clone(), - ), - " ".to_string(), - ), - emit_ident( - authored_name(env.clone(), cap_node.clone()), - RenderTarget::Python, - ), - ), - "(".to_string(), - ), - all_params, - ), - ") -> ".to_string(), - ), - ret, - ), - ":\n".to_string(), - ), - " ...".to_string(), - ) - } +let ret = emit_node_type(resolved_type(cap_node.clone()), RenderTarget::Python, env.source_indices.clone()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("@abstractmethod\n".to_string(), language_spec(RenderTarget::Python).items.clone().async_prefix.clone()), language_spec(RenderTarget::Python).items.clone().func_keyword.clone()), " ".to_string()), emit_ident(authored_name(env.clone(), cap_node.clone()), RenderTarget::Python)), "(".to_string()), all_params), ") -> ".to_string()), ret), ":\n".to_string()), " ...".to_string()) +} } -pub fn emit_py_data_def( - name: String, - type_node: Rc, - value: Rc, - registry: Rc>>, - scope: &Rc, -) -> String { +pub fn emit_py_data_def(name: String, type_node: Rc, value: Rc, registry: Rc>>, scope: &Rc) -> String { { - let ty_str = emit_node_type( - type_node, - RenderTarget::Python, - scope.type_env.clone().source_indices.clone(), - ); - let upper_name = to_screaming_snake(name); - let val_str = emit_py_typed_expr(value, registry, &scope, 0, 1024); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(v2_rt::concat(upper_name, ": ".to_string()), ty_str), - " = ".to_string(), - ), - val_str, - ) - } + let ty_str = emit_node_type(type_node, RenderTarget::Python, scope.type_env.clone().source_indices.clone()); +let upper_name = to_screaming_snake(name); +let val_str = emit_py_typed_expr(value, registry, &scope, 0, 1024); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(upper_name, ": ".to_string()), ty_str), " = ".to_string()), val_str) +} } pub fn emit_requirements_txt(has_services: bool) -> Rc { { let base_deps = "".to_string(); - let async_deps = if has_services { +let async_deps = if has_services { "aiohttp>=3.9\n".to_string() } else { "".to_string() }; - Rc::new(TextFile { - path: "requirements.txt".to_string(), - content: v2_rt::concat(base_deps, async_deps), - }) - } +Rc::new(TextFile { + path: "requirements.txt".to_string(), + content: v2_rt::concat(base_deps, async_deps), +}) +} } diff --git a/src/v2/stage0/src/v2_compiler_emit_rust.rs b/src/v2/stage0/src/v2_compiler_emit_rust.rs index 7a51d3ff8b8..b7aa3a2e8e9 100644 --- a/src/v2/stage0/src/v2_compiler_emit_rust.rs +++ b/src/v2/stage0/src/v2_compiler_emit_rust.rs @@ -1,210 +1,120 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.emit_rust -pub use crate::extdeps_languages_rust_emit::{ - rt_bridge_function_names, rt_functions, rt_ref_map_functions, rt_wraps_result, - rust_container_templates, rust_enum_derives, rust_enum_derives_copy, rust_higher_order_methods, - rust_method_wraps_result, rust_struct_derives, rust_struct_derives_copy, HigherOrderMethodSpec, -}; -pub use crate::std_induction::SubValueRelation; -use crate::std_induction::SubValueRelation::SubValueUnknown; -pub use crate::std_types::is_container_type; -pub use crate::v2_compiler_artifact::RenderTarget; -use crate::v2_compiler_artifact::RenderTarget::Rust; -pub use crate::v2_compiler_coercion::{coerce_primitive_type, is_copy, lookup_checkpoint}; -pub use crate::v2_compiler_compiler_tests_rust::compiler_tests_source; -pub use crate::v2_compiler_emit::{ - apply_named_template, apply_type_template1, apply_type_template2, apply_type_template3, - capitalize_first, compute_service_fields, effective_operation_transport, emit_bin_op_symbol, - emit_data_value_json, emit_error_expr, emit_ident, emit_keyword, emit_lambda, - emit_lambda_params, emit_let_binding, emit_let_binding_annotated, emit_list_lit_expr, - emit_literal, emit_node_type, emit_null_coalesce, emit_return, emit_shared_expr, - emit_shared_tco_expr, emit_simple_expr, emit_string_literal, emit_typed_cast_shared, - emit_typed_if_shared, emit_typed_let_shared, emit_unary_op, escape_json_string, - escape_rust_interp_text, escape_string_literal_body, extract_modifier_names, - extract_test_projections, has_mock_prefix, has_nested_records_node, has_service_items, - is_data_def_item, is_function_item, is_null_coalesce, is_resource_def_item, is_self_recursive, - is_service_def_item, is_service_item, is_tco_eligible, is_tco_identity_passthrough, - is_type_alias_item, is_type_alias_return_node, is_type_decl_item, is_type_def_item, is_upper, - language_spec, lookup_item, make_indent, module_emit_scope, module_to_filename, - order_typed_call_args, render_node_type, rust_literal_for_pattern, sanitize_service_name, - scope_after_expr, seed_bindings, service_fallback_transport, service_field_ctors, - service_field_decls, service_var_name, tco_reassign_core, test_function_name, to_lower_char, - to_pascal, to_screaming_snake, to_snake, to_string, to_string_helper, to_upper_char, - typed_named_arg_matches, unique_strings, BlockEmitState, EmitResult, InterpPart, - ServiceFieldSet, TcoFrame, TcoReassignInput, TestProjection, -}; -pub use crate::v2_compiler_infer::{ - build_emit_graph_info, build_params_scope, expr_span, extend_scope, InferScope, -}; -use crate::v2_compiler_infer_emit_info::TypeRepr::{EnumRepr, StructRepr}; -pub use crate::v2_compiler_infer_emit_info::{ - find_variant_parent, is_enum_in_summaries, is_known_variant, lookup_emit_type_summary, - variant_belongs_to_enum, EmitGraphInfo, TypeRepr, TypeSummary, -}; -pub use crate::v2_compiler_infer_env::{authored_name, lookup_type_by_name, TypeBinding, TypeEnv}; -use crate::v2_compiler_infer_items::ItemKind::DataItem; -pub use crate::v2_compiler_infer_items::{ItemInfo, ItemKind, ResolvedGraph, TypedModule}; -pub use crate::v2_compiler_infer_service::{ - extract_typed_service_name, is_typed_service_call_receiver, -}; -pub use crate::v2_compiler_infer_sigs::ResolvedFuncEnv; -pub use crate::v2_compiler_infer_types::{ - child_type_node, emit_map_has, for_each_element_type_node, is_coproduct_type, is_product_type, - is_unit_like, node_is_collection, node_is_element_collection, node_is_keyed_collection, - normalize_access_type_node, resolved_type, -}; -use crate::v2_compiler_languages::VisibilitySpec::KeywordVisibility; -pub use crate::v2_compiler_languages::{ - is_string_like, scaffold_for_target, serialization_for_target, sharing_for_target, - test_conventions_for_target, visibility_for_target, ItemKeywords, TestConventions, - VisibilitySpec, -}; -pub use crate::v2_compiler_ownership::{ - analyze_ownership, analyze_single_fold, build_movable_set, build_read_only_params, - collect_callable_refs, OwnershipProof, -}; -pub use crate::v2_compiler_runtime_rust::rust_runtime_source; +use std::collections::HashMap; +use std::rc::Rc; use crate::v2_rt; -use crate::v2_std_core::AlgebraFieldKind::*; -use crate::v2_std_core::BinOp::*; -use crate::v2_std_core::CallSemantics::{LookupCallSemantics, PlainCallSemantics}; -use crate::v2_std_core::Cardinality::{CardOptional, Required}; -use crate::v2_std_core::CompilerDiagnostic::InternalError; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::v2_std_core::{Node, InferredNode, is_compiler_error, import_is_all, import_specific_names_at, module_imports, module_items, param_node_type_expr, param_node_default_value, authored_name_at, NewlineIndex, find_child_named, expr_var_name_at, expr_call_func_at, field_access_field_at, param_node_name_at, resource_use_name_at, field_binding_name_at, generic_param_name_at, LiteralValue, ExprData, make_expr_node, FieldSummary, VarBindingKind, CallSemantics, MethodSemantics, MatchPattern, field_binding_pattern, TextFile, ErrorNode, make_error_node, SourceSpan, resource_use_resource, BinOp, AlgebraFieldKind, UnaryOpKind, StringPart, transport_base_url, transport_has_auth, transport_auth_token, transport_auth_header_name, transport_headers, transport_env, transport_method, transport_path_template, transport_query, transport_request_body, transport_stdin, transport_response_format, service_config_auth, service_config_auth_input, service_config_auth_source, service_config_endpoint, expr_has_self_call, expr_has_non_tail_self_call, field_access_base, foreach_variable_at, expr_method_name_at, let_binding_name_at, record_lit_type_name_at, arg_name_at, arg_value, arm_body, arm_pattern, arm_guard, field_init_node_name_at, field_init_node_value, make_arg_node, make_named_expr_node, let_value, let_body, lambda_body, lambda_param_names_at, foreach_collection, foreach_body, method_receiver, method_arg_nodes, match_scrutinee, match_arm_nodes, if_condition, if_then_branch, if_else_branch, index_base, index_expr, slice_base, slice_start, slice_end, cast_target, cast_expr, return_value, binop_left, binop_right, make_span, with_required_cardinality, Connective, Cardinality, is_rest_transport, is_shell_transport, is_file_transport, FieldAccessStyle, FieldValueShape, CompilerDiagnostic}; +use crate::v2_std_core::InferredNode::{Resolved, CompilerError, TypeVariable}; +use crate::v2_std_core::ExprData::{NoExprData, ExprLiteral, ExprError, ExprVar, ExprFieldAccess, ExprCall, ExprMethodCall, ExprMatch, ExprIf, ExprLet, ExprRecordLit, ExprListLit, ExprBinOp, ExprUnaryOp, ExprLambda, ExprStringInterp, ExprBlock, ExprCast, ExprForEach, ExprIndex, ExprSlice, ExprReturn}; +use crate::v2_std_core::FieldAccessStyle::{StoredField, EnumAccessor, OptionalUnwrap, TupleFirst, TupleSecond}; +use crate::v2_std_core::FieldValueShape::{OptionalValue}; +use crate::v2_std_core::VarBindingKind::{LocalValueBinding, FunctionValueBinding, VariantValueBinding, MatchBoundBinding}; +use crate::v2_std_core::CallSemantics::{PlainCallSemantics, LookupCallSemantics}; +use crate::v2_std_core::MethodSemantics::{PlainMethodSemantics, AlgebraMethodSemantics, ServiceMethodSemantics}; +use crate::v2_std_core::CompilerDiagnostic::{InternalError}; +use crate::v2_std_core::StringPart::{Text, Interpolation}; use crate::v2_std_core::Connective::{Conj, Disj, NoConnective}; -use crate::v2_std_core::ExprData::{ - ExprBinOp, ExprBlock, ExprCall, ExprCast, ExprError, ExprFieldAccess, ExprForEach, ExprIf, - ExprIndex, ExprLambda, ExprLet, ExprListLit, ExprLiteral, ExprMatch, ExprMethodCall, - ExprRecordLit, ExprReturn, ExprSlice, ExprStringInterp, ExprUnaryOp, ExprVar, NoExprData, -}; -use crate::v2_std_core::FieldAccessStyle::{ - EnumAccessor, OptionalUnwrap, StoredField, TupleFirst, TupleSecond, -}; -use crate::v2_std_core::FieldValueShape::OptionalValue; -use crate::v2_std_core::InferredNode::{CompilerError, Resolved, TypeVariable}; +use crate::v2_std_core::Cardinality::{Required, CardOptional}; use crate::v2_std_core::LiteralValue::*; use crate::v2_std_core::MatchPattern::*; -use crate::v2_std_core::MethodSemantics::{ - AlgebraMethodSemantics, PlainMethodSemantics, ServiceMethodSemantics, -}; -use crate::v2_std_core::StringPart::{Interpolation, Text}; +use crate::v2_std_core::BinOp::*; +use crate::v2_std_core::AlgebraFieldKind::*; use crate::v2_std_core::UnaryOpKind::*; -use crate::v2_std_core::VarBindingKind::{ - FunctionValueBinding, LocalValueBinding, MatchBoundBinding, VariantValueBinding, -}; -pub use crate::v2_std_core::{ - arg_name_at, arg_value, arm_body, arm_guard, arm_pattern, authored_name_at, binop_left, - binop_right, cast_expr, cast_target, expr_call_func_at, expr_has_non_tail_self_call, - expr_has_self_call, expr_method_name_at, expr_var_name_at, field_access_base, - field_access_field_at, field_binding_name_at, field_binding_pattern, field_init_node_name_at, - field_init_node_value, find_child_named, foreach_body, foreach_collection, foreach_variable_at, - generic_param_name_at, if_condition, if_else_branch, if_then_branch, import_is_all, - import_specific_names_at, index_base, index_expr, is_compiler_error, is_file_transport, - is_rest_transport, is_shell_transport, lambda_body, lambda_param_names_at, let_binding_name_at, - let_body, let_value, make_arg_node, make_error_node, make_expr_node, make_named_expr_node, - make_span, match_arm_nodes, match_scrutinee, method_arg_nodes, method_receiver, module_imports, - module_items, param_node_default_value, param_node_name_at, param_node_type_expr, - record_lit_type_name_at, resource_use_name_at, resource_use_resource, return_value, - service_config_auth, service_config_auth_input, service_config_auth_source, - service_config_endpoint, slice_base, slice_end, slice_start, transport_auth_header_name, - transport_auth_token, transport_base_url, transport_env, transport_has_auth, transport_headers, - transport_method, transport_path_template, transport_query, transport_request_body, - transport_response_format, transport_stdin, with_required_cardinality, AlgebraFieldKind, BinOp, - CallSemantics, Cardinality, CompilerDiagnostic, Connective, ErrorNode, ExprData, - FieldAccessStyle, FieldSummary, FieldValueShape, InferredNode, LiteralValue, MatchPattern, - MethodSemantics, NewlineIndex, Node, SourceSpan, StringPart, TextFile, UnaryOpKind, - VarBindingKind, -}; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; -use std::collections::HashMap; -use std::rc::Rc; - -pub fn render_rust_type( - n: Rc, - shared_types: Rc>, - source_indices: Rc>>, -) -> String { +pub use crate::v2_compiler_artifact::{RenderTarget}; +use crate::v2_compiler_artifact::RenderTarget::{Rust}; +pub use crate::extdeps_languages_rust_emit::{rt_functions, rt_ref_map_functions, rt_wraps_result, rt_bridge_function_names, rust_container_templates, rust_method_wraps_result, rust_struct_derives, rust_struct_derives_copy, rust_enum_derives, rust_enum_derives_copy, HigherOrderMethodSpec, rust_higher_order_methods}; +pub use crate::v2_compiler_languages::{scaffold_for_target, serialization_for_target, TestConventions, ItemKeywords, test_conventions_for_target, visibility_for_target, sharing_for_target, is_string_like, VisibilitySpec}; +use crate::v2_compiler_languages::VisibilitySpec::{KeywordVisibility}; +pub use crate::v2_compiler_runtime_rust::{rust_runtime_source}; +pub use crate::v2_compiler_compiler_tests_rust::{compiler_tests_source}; +pub use crate::v2_compiler_coercion::{coerce_primitive_type, is_copy, lookup_checkpoint}; +pub use crate::std_types::{is_container_type}; +pub use crate::v2_compiler_infer_env::{TypeEnv, TypeBinding, authored_name, lookup_type_by_name}; +pub use crate::v2_compiler_infer_types::{resolved_type, normalize_access_type_node, for_each_element_type_node, child_type_node, emit_map_has, node_is_keyed_collection, node_is_element_collection, node_is_collection, is_product_type, is_coproduct_type, is_unit_like}; +pub use crate::v2_compiler_infer_sigs::{ResolvedFuncEnv}; +pub use crate::v2_compiler_infer_items::{ResolvedGraph, TypedModule, ItemInfo, ItemKind}; +use crate::v2_compiler_infer_items::ItemKind::{DataItem}; +pub use crate::v2_compiler_infer_service::{is_typed_service_call_receiver, extract_typed_service_name}; +pub use crate::v2_compiler_infer::{InferScope, build_params_scope, extend_scope, build_emit_graph_info, expr_span}; +pub use crate::v2_compiler_infer_emit_info::{EmitGraphInfo, TypeSummary, lookup_emit_type_summary, is_enum_in_summaries, find_variant_parent, is_known_variant, variant_belongs_to_enum, TypeRepr}; +use crate::v2_compiler_infer_emit_info::TypeRepr::{StructRepr, EnumRepr}; +pub use crate::v2_compiler_ownership::{OwnershipProof, analyze_ownership, analyze_single_fold, build_movable_set, build_read_only_params, collect_callable_refs}; +pub use crate::std_induction::{SubValueRelation}; +use crate::std_induction::SubValueRelation::{SubValueUnknown}; +pub use crate::v2_compiler_emit::{EmitResult, BlockEmitState, TestProjection, TcoFrame, TcoReassignInput, InterpPart, rust_literal_for_pattern, emit_literal, emit_bin_op_symbol, emit_keyword, emit_node_type, render_node_type, emit_ident, emit_let_binding, emit_let_binding_annotated, emit_return, emit_unary_op, emit_lambda, emit_error_expr, emit_lambda_params, emit_null_coalesce, emit_list_lit_expr, emit_shared_expr, emit_typed_cast_shared, emit_string_literal, emit_simple_expr, escape_rust_interp_text, escape_string_literal_body, module_emit_scope, scope_after_expr, lookup_item, unique_strings, has_nested_records_node, emit_data_value_json, escape_json_string, module_to_filename, make_indent, to_string, to_string_helper, to_snake, to_screaming_snake, to_pascal, is_upper, to_lower_char, to_upper_char, capitalize_first, sanitize_service_name, service_var_name, test_function_name, apply_type_template1, apply_type_template2, apply_type_template3, apply_named_template, language_spec, is_null_coalesce, is_type_alias_return_node, is_service_item, has_service_items, typed_named_arg_matches, order_typed_call_args, is_type_def_item, is_type_alias_item, is_type_decl_item, is_function_item, is_data_def_item, is_service_def_item, is_resource_def_item, has_mock_prefix, extract_test_projections, is_tco_eligible, is_self_recursive, emit_shared_tco_expr, tco_reassign_core, is_tco_identity_passthrough, service_fallback_transport, effective_operation_transport, ServiceFieldSet, compute_service_fields, service_field_decls, service_field_ctors, extract_modifier_names, seed_bindings, emit_typed_if_shared, emit_typed_let_shared}; + +pub fn render_rust_type(n: Rc, shared_types: Rc>, source_indices: Rc>>) -> String { render_node_type(&n, &RenderTarget::Rust, &shared_types, &source_indices) } pub fn type_variable_node(id: String) -> Rc { Rc::new(Node { - name: "".to_string(), - span: make_span(0, 0), - ident_span: None, - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::TypeVariable { id: id })), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }) + name: "".to_string(), + span: make_span(0, 0), + ident_span: None, + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::TypeVariable { + id: id, +})), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}) } pub fn is_type_variable(inferred: Rc) -> bool { match (*inferred).clone() { - InferredNode::TypeVariable { .. } => true, - _ => false, - } + InferredNode::TypeVariable { .. } => true, + _ => false, +} } -pub fn is_rust_value_type( - n: Rc, - source_indices: Rc>>, -) -> bool { +pub fn is_rust_value_type(n: Rc, source_indices: Rc>>) -> bool { { let normed = normalize_access_type_node(n); - match is_copy( - RenderTarget::Rust, - authored_name_at(source_indices, &normed), - ) { - Some(v) => v.clone(), - None => false, - } - } +match is_copy(RenderTarget::Rust, authored_name_at(source_indices, &normed)) { + Some(v) => v.clone(), + None => false, +} +} } -pub fn is_rust_string_like( - n: Rc, - source_indices: Rc>>, -) -> bool { +pub fn is_rust_string_like(n: Rc, source_indices: Rc>>) -> bool { { let normed = normalize_access_type_node(n); - is_string_like( - RenderTarget::Rust, - authored_name_at(source_indices, &normed), - ) - } +is_string_like(RenderTarget::Rust, authored_name_at(source_indices, &normed)) +} } pub fn rust_source_root() -> String { match scaffold_for_target(RenderTarget::Rust).source_dir.clone() { - Some(dir) => dir.clone(), - None => "".to_string(), - } + Some(dir) => dir.clone(), + None => "".to_string(), +} } pub fn rust_source_ext() -> String { - scaffold_for_target(RenderTarget::Rust) - .source_file_extension - .clone() + scaffold_for_target(RenderTarget::Rust).source_file_extension.clone() } pub fn rust_visibility_prefix() -> String { match (*visibility_for_target(RenderTarget::Rust)).clone() { - VisibilitySpec::KeywordVisibility { prefix: p, .. } => p.clone(), - _ => "__VISIBILITY_SPEC_MISMATCH__".to_string(), - } + VisibilitySpec::KeywordVisibility { prefix: p, .. } => p.clone(), + _ => "__VISIBILITY_SPEC_MISMATCH__".to_string(), +} } pub fn rust_items() -> Rc { @@ -228,410 +138,193 @@ pub fn rust_enum_derives_copy_text() -> String { } pub fn rust_serde_tag_attr() -> String { - match serialization_for_target(RenderTarget::Rust) - .tag_attribute - .clone() - { - Some(attr) => attr.clone(), - None => emit_error_expr( - "missing serde tag_attribute for Rust".to_string(), - RenderTarget::Rust, - ), - } + match serialization_for_target(RenderTarget::Rust).tag_attribute.clone() { + Some(attr) => attr.clone(), + None => emit_error_expr("missing serde tag_attribute for Rust".to_string(), RenderTarget::Rust), +} } -pub fn resolve_wire_serde_tag_from_encoding_node( - ve: &Rc, - source_indices: &Rc>>, -) -> String { +pub fn resolve_wire_serde_tag_from_encoding_node(ve: &Rc, source_indices: &Rc>>) -> String { if ((ve.children.clone().len() as i64) > 0) { { - let naming_field = Rc::new({ - let mut __result = Vec::new(); - for fi in ve.children.clone().iter().cloned() { - if (field_init_node_name_at(fi.clone(), source_indices.clone()).as_str() - == "naming".to_string().as_str()) - { - __result.push(fi); - } - } - __result - }) - .first() - .cloned(); - match naming_field { - Some(nf) => { - let nv = field_init_node_value(&nf); - if (authored_name_at(source_indices.clone(), &nv).as_str() - == "SnakeCase".to_string().as_str()) - { - "#[serde(rename_all = \"snake_case\")]".to_string() - } else { - "".to_string() - } + let naming_field = Rc::new({ let mut __result = Vec::new(); for fi in ve.children.clone().iter().cloned() { if (field_init_node_name_at(fi.clone(), source_indices.clone()).as_str() == "naming".to_string().as_str()) { __result.push(fi); } } __result }).first().cloned(); +match naming_field { + Some(nf) => { + let nv = field_init_node_value(&nf); +if (authored_name_at(source_indices.clone(), &nv).as_str() == "SnakeCase".to_string().as_str()) { + "#[serde(rename_all = \"snake_case\")]".to_string() + } else { + "".to_string() } - None => "".to_string(), - } - } +}, + None => "".to_string(), +} +} } else { rust_serde_tag_attr() } } -pub fn resolve_wire_serde_tag( - wire_item: &Rc, - source_indices: Rc>>, -) -> String { +pub fn resolve_wire_serde_tag(wire_item: &Rc, source_indices: Rc>>) -> String { match wire_item.body.clone() { - Some(ve) => resolve_wire_serde_tag_from_encoding_node(&ve, &source_indices), - None => match (*wire_item.expr_data.clone()).clone() { - ExprData::ExprRecordLit { .. } => { - resolve_wire_serde_tag_from_encoding_node(&wire_item, &source_indices) - } - _ => rust_serde_tag_attr(), - }, - } + Some(ve) => resolve_wire_serde_tag_from_encoding_node(&ve, &source_indices), + None => match (*wire_item.expr_data.clone()).clone() { + ExprData::ExprRecordLit { .. } => resolve_wire_serde_tag_from_encoding_node(&wire_item, &source_indices), + _ => rust_serde_tag_attr(), +}, +} } pub fn item_binding_is_named(env: Rc, node: &Rc, name: &String) -> bool { - ((authored_name(env, node.clone()).as_str() == name.clone().as_str()) - || (node.name.clone().as_str() == name.clone().as_str())) -} - -pub fn resolve_wire_serde_tag_for_coproduct( - wire_contract_item: Option>, - source_indices: Rc>>, - data_items: Rc>>>>, -) -> String { - resolve_wire_serde_tag_for_coproduct_seen( - wire_contract_item, - source_indices, - data_items, - v2_rt::rc_empty_map::(), - 32, - ) -} - -pub fn resolve_wire_serde_tag_for_coproduct_seen( - mut wire_contract_item: Option>, - mut source_indices: Rc>>, - mut data_items: Rc>>>>, - mut seen_aliases: Rc>, - mut fuel: i64, -) -> String { + ((authored_name(env, node.clone()).as_str() == name.clone().as_str()) || (node.name.clone().as_str() == name.clone().as_str())) +} + +pub fn resolve_wire_serde_tag_for_coproduct(wire_contract_item: Option>, source_indices: Rc>>, data_items: Rc>>>>) -> String { + resolve_wire_serde_tag_for_coproduct_seen(wire_contract_item, source_indices, data_items, v2_rt::rc_empty_map::(), 32) +} + +pub fn resolve_wire_serde_tag_for_coproduct_seen(mut wire_contract_item: Option>, mut source_indices: Rc>>, mut data_items: Rc>>>>, mut seen_aliases: Rc>, mut fuel: i64) -> String { loop { if (fuel.clone() <= 0) { - break emit_error_expr( - "wire_contract: VariantEncoding alias chain exceeded recursion limit".to_string(), - RenderTarget::Rust, - ); - } else { + break emit_error_expr("wire_contract: VariantEncoding alias chain exceeded recursion limit".to_string(), RenderTarget::Rust); +} else { match wire_contract_item { - None => { - break rust_serde_tag_attr(); - } - Some(wc) => { - if is_data_def_item(&wc) { - match wc.body.clone() { - None => { - break emit_error_expr( - "wire_contract: data item has no initializer body".to_string(), - RenderTarget::Rust, - ); - } - Some(init) => match (*init.expr_data.clone()).clone() { - ExprData::ExprRecordLit { .. } => { - break resolve_wire_serde_tag(&init, source_indices.clone()); - } - ExprData::ExprVar { .. } => { - let alias_name = - expr_var_name_at(init.clone(), source_indices.clone()); - if (v2_rt::map_get(&seen_aliases, alias_name.clone()) != None) { - break emit_error_expr( - v2_rt::concat( - "wire_contract: cyclic VariantEncoding alias: " - .to_string(), - alias_name.clone(), - ), - RenderTarget::Rust, - ); - } else { - match v2_rt::map_get(&data_items, alias_name.clone()) { - Some(candidates) => { - if ((candidates.clone().len() as i64) == 1) { - match candidates.clone().first().cloned() { - Some(aliased_data) => { - let __tco_0 = - Some(aliased_data.clone()); - let __tco_1 = v2_rt::rc_map_insert( - seen_aliases, - alias_name.clone(), - true, - ); - let __tco_2 = (fuel - 1); - wire_contract_item = __tco_0; - seen_aliases = __tco_1; - fuel = __tco_2; - continue; - } - None => { - break emit_error_expr(v2_rt::concat("wire_contract: missing VariantEncoding data alias: ".to_string(), alias_name.clone()), RenderTarget::Rust); - } - } - } else { - break emit_error_expr(v2_rt::concat("wire_contract: ambiguous VariantEncoding data alias: ".to_string(), alias_name.clone()), RenderTarget::Rust); - } - } - None => match init.inferred.clone() { - None => { - break emit_error_expr("wire_contract: missing type inference on initializer (cannot resolve VariantEncoding alias)".to_string(), RenderTarget::Rust); - } - Some(inf) => match (*inf.clone()).clone() { - InferredNode::Resolved { node, .. } => { - if is_data_def_item(&node) { - { - let __tco_0 = Some(node.clone()); - let __tco_1 = v2_rt::rc_map_insert( - seen_aliases, - alias_name.clone(), - true, - ); - let __tco_2 = (fuel - 1); - wire_contract_item = __tco_0; - seen_aliases = __tco_1; - fuel = __tco_2; - continue; - } - } else { - break resolve_wire_serde_tag( - &node, - source_indices.clone(), - ); - } - } - InferredNode::CompilerError { - message, .. - } => { - break emit_error_expr( - v2_rt::concat( - "wire_contract: ".to_string(), - message.clone(), - ), - RenderTarget::Rust, - ); - } - InferredNode::TypeVariable { .. } => { - break emit_error_expr("wire_contract: unresolved type variable in wire_contract initializer".to_string(), RenderTarget::Rust); - } - }, - }, - } - } - } - _ => match init.inferred.clone() { - None => { - break emit_error_expr("wire_contract: missing type inference on initializer (cannot resolve VariantEncoding alias)".to_string(), RenderTarget::Rust); - } - Some(inf) => match (*inf.clone()).clone() { - InferredNode::Resolved { node, .. } => { - if is_data_def_item(&node) { - { - let __tco_0 = Some(node.clone()); - let __tco_1 = (fuel - 1); - wire_contract_item = __tco_0; - fuel = __tco_1; - continue; - } - } else { - break resolve_wire_serde_tag( - &node, - source_indices.clone(), - ); - } - } - InferredNode::CompilerError { message, .. } => { - break emit_error_expr( - v2_rt::concat( - "wire_contract: ".to_string(), - message.clone(), - ), - RenderTarget::Rust, - ); - } - InferredNode::TypeVariable { .. } => { - break emit_error_expr("wire_contract: unresolved type variable in wire_contract initializer".to_string(), RenderTarget::Rust); - } - }, - }, - }, - } - } else { - break resolve_wire_serde_tag(&wc, source_indices.clone()); - } - } - } - } - } + None => { break rust_serde_tag_attr(); }, + Some(wc) => { if is_data_def_item(&wc) { + match wc.body.clone() { + None => { break emit_error_expr("wire_contract: data item has no initializer body".to_string(), RenderTarget::Rust); }, + Some(init) => { match (*init.expr_data.clone()).clone() { + ExprData::ExprRecordLit { .. } => { break resolve_wire_serde_tag(&init, source_indices.clone()); }, + ExprData::ExprVar { .. } => { let alias_name = expr_var_name_at(init.clone(), source_indices.clone()); +if (v2_rt::map_get(&seen_aliases, alias_name.clone()) != None) { + break emit_error_expr(v2_rt::concat("wire_contract: cyclic VariantEncoding alias: ".to_string(), alias_name.clone()), RenderTarget::Rust); +} else { + match v2_rt::map_get(&data_items, alias_name.clone()) { + Some(candidates) => { if ((candidates.clone().len() as i64) == 1) { + match candidates.clone().first().cloned() { + Some(aliased_data) => { { + let __tco_0 = Some(aliased_data.clone()); +let __tco_1 = v2_rt::rc_map_insert(seen_aliases, alias_name.clone(), true); +let __tco_2 = (fuel - 1); +wire_contract_item = __tco_0; +seen_aliases = __tco_1; +fuel = __tco_2; +continue; +} }, + None => { break emit_error_expr(v2_rt::concat("wire_contract: missing VariantEncoding data alias: ".to_string(), alias_name.clone()), RenderTarget::Rust); }, +} +} else { + break emit_error_expr(v2_rt::concat("wire_contract: ambiguous VariantEncoding data alias: ".to_string(), alias_name.clone()), RenderTarget::Rust); +} }, + None => { match init.inferred.clone() { + None => { break emit_error_expr("wire_contract: missing type inference on initializer (cannot resolve VariantEncoding alias)".to_string(), RenderTarget::Rust); }, + Some(inf) => { match (*inf.clone()).clone() { + InferredNode::Resolved { node, .. } => { if is_data_def_item(&node) { + { + let __tco_0 = Some(node.clone()); +let __tco_1 = v2_rt::rc_map_insert(seen_aliases, alias_name.clone(), true); +let __tco_2 = (fuel - 1); +wire_contract_item = __tco_0; +seen_aliases = __tco_1; +fuel = __tco_2; +continue; +} +} else { + break resolve_wire_serde_tag(&node, source_indices.clone()); +} }, + InferredNode::CompilerError { message, .. } => { break emit_error_expr(v2_rt::concat("wire_contract: ".to_string(), message.clone()), RenderTarget::Rust); }, + InferredNode::TypeVariable { .. } => { break emit_error_expr("wire_contract: unresolved type variable in wire_contract initializer".to_string(), RenderTarget::Rust); }, +} }, +} }, +} +} }, + _ => { match init.inferred.clone() { + None => { break emit_error_expr("wire_contract: missing type inference on initializer (cannot resolve VariantEncoding alias)".to_string(), RenderTarget::Rust); }, + Some(inf) => { match (*inf.clone()).clone() { + InferredNode::Resolved { node, .. } => { if is_data_def_item(&node) { + { + let __tco_0 = Some(node.clone()); +let __tco_1 = (fuel - 1); +wire_contract_item = __tco_0; +fuel = __tco_1; +continue; +} +} else { + break resolve_wire_serde_tag(&node, source_indices.clone()); +} }, + InferredNode::CompilerError { message, .. } => { break emit_error_expr(v2_rt::concat("wire_contract: ".to_string(), message.clone()), RenderTarget::Rust); }, + InferredNode::TypeVariable { .. } => { break emit_error_expr("wire_contract: unresolved type variable in wire_contract initializer".to_string(), RenderTarget::Rust); }, +} }, +} }, +} }, +} +} else { + break resolve_wire_serde_tag(&wc, source_indices.clone()); +} }, +} +} +} } pub fn build_data_item_index(modules: Rc>>) -> Rc>> { - modules.iter().cloned().fold( - v2_rt::rc_empty_map::>(), - |acc: Rc>>, tm: Rc| { - let module_name = authored_name_at( - tm.type_env.clone().source_indices.clone(), - &tm.module.clone(), - ); - Rc::new({ - let mut __result = Vec::new(); - for item in tm.items.clone().iter().cloned() { - if is_data_def_item(&item) { - __result.push(item); - } - } - __result - }) - .iter() - .cloned() - .fold( - acc, - |item_acc: Rc>>, item: Rc| { - let item_name = - authored_name_at(tm.type_env.clone().source_indices.clone(), &item); - let qualified_name = v2_rt::concat( - v2_rt::concat(module_name.clone(), ".".to_string()), - item_name.clone(), - ); - v2_rt::rc_map_insert(item_acc, qualified_name.clone(), item.clone()) - }, - ) - }, - ) + modules.iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, tm: Rc| { + let module_name = authored_name_at(tm.type_env.clone().source_indices.clone(), &tm.module.clone()); +Rc::new({ let mut __result = Vec::new(); for item in tm.items.clone().iter().cloned() { if is_data_def_item(&item) { __result.push(item); } } __result }).iter().cloned().fold(acc, |item_acc: Rc>>, item: Rc| { + let item_name = authored_name_at(tm.type_env.clone().source_indices.clone(), &item); +let qualified_name = v2_rt::concat(v2_rt::concat(module_name.clone(), ".".to_string()), item_name.clone()); +v2_rt::rc_map_insert(item_acc, qualified_name.clone(), item.clone()) +}) +}) } -pub fn insert_scoped_data_item( - scoped: &Rc>>>>, - name: &String, - item: Rc, -) -> Rc>>>> { +pub fn insert_scoped_data_item(scoped: &Rc>>>>, name: &String, item: Rc) -> Rc>>>> { { let existing = match v2_rt::map_get(&scoped, name.clone()) { - Some(entries) => entries.clone(), - None => Rc::new(vec![]), - }; - v2_rt::rc_map_insert( - scoped.clone(), - name.clone(), - v2_rt::concat(existing, Rc::new(vec![item])), - ) - } + Some(entries) => entries.clone(), + None => Rc::new(vec![]), +}; +v2_rt::rc_map_insert(scoped.clone(), name.clone(), v2_rt::concat(existing, Rc::new(vec![item]))) +} } -pub fn build_scoped_data_item_index( - typed_module: &Rc, - data_items: Rc>>, -) -> Rc>>>> { +pub fn build_scoped_data_item_index(typed_module: &Rc, data_items: Rc>>) -> Rc>>>> { { - let module_name = authored_name_at( - typed_module.type_env.clone().source_indices.clone(), - &typed_module.module.clone(), - ); - let local = Rc::new({ - let mut __result = Vec::new(); - for item in typed_module.items.clone().iter().cloned() { - if is_data_def_item(&item) { - __result.push(item); - } + let module_name = authored_name_at(typed_module.type_env.clone().source_indices.clone(), &typed_module.module.clone()); +let local = Rc::new({ let mut __result = Vec::new(); for item in typed_module.items.clone().iter().cloned() { if is_data_def_item(&item) { __result.push(item); } } __result }).iter().cloned().fold(v2_rt::rc_empty_map::>>>(), |acc: Rc>>>>, item: Rc| insert_scoped_data_item(&acc, &authored_name_at(typed_module.type_env.clone().source_indices.clone(), &item), item.clone())); +module_imports(typed_module.module.clone()).iter().cloned().fold(local.clone(), |acc: Rc>>>>, imp: Rc| { + let import_path = authored_name_at(typed_module.type_env.clone().source_indices.clone(), &imp); +if import_is_all(imp.clone()) { + acc.clone() + } else { + import_specific_names_at(imp.clone(), typed_module.type_env.clone().source_indices.clone()).iter().cloned().fold(acc.clone(), |inner: Rc>>>>, imported_name: String| { + let qualified = v2_rt::concat(v2_rt::concat(import_path.clone(), ".".to_string()), imported_name.clone()); +match v2_rt::map_get(&data_items, qualified.clone()) { + Some(imported_item) => insert_scoped_data_item(&inner, &imported_name, imported_item.clone()), + None => inner.clone(), +} +}) } - __result - }) - .iter() - .cloned() - .fold( - v2_rt::rc_empty_map::>>>(), - |acc: Rc>>>>, item: Rc| { - insert_scoped_data_item( - &acc, - &authored_name_at(typed_module.type_env.clone().source_indices.clone(), &item), - item.clone(), - ) - }, - ); - module_imports(typed_module.module.clone()) - .iter() - .cloned() - .fold( - local.clone(), - |acc: Rc>>>>, imp: Rc| { - let import_path = authored_name_at( - typed_module.type_env.clone().source_indices.clone(), - &imp, - ); - if import_is_all(imp.clone()) { - acc.clone() - } else { - import_specific_names_at( - imp.clone(), - typed_module.type_env.clone().source_indices.clone(), - ) - .iter() - .cloned() - .fold( - acc.clone(), - |inner: Rc>>>>, - imported_name: String| { - let qualified = v2_rt::concat( - v2_rt::concat(import_path.clone(), ".".to_string()), - imported_name.clone(), - ); - match v2_rt::map_get(&data_items, qualified.clone()) { - Some(imported_item) => insert_scoped_data_item( - &inner, - &imported_name, - imported_item.clone(), - ), - None => inner.clone(), - } - }, - ) - } - }, - ) - } +}) +} } pub fn rust_serde_rename_template_text() -> String { - match serialization_for_target(RenderTarget::Rust) - .rename_attribute_template - .clone() - { - Some(template) => template.clone(), - None => emit_error_expr( - "missing serde rename_attribute_template for Rust".to_string(), - RenderTarget::Rust, - ), - } + match serialization_for_target(RenderTarget::Rust).rename_attribute_template.clone() { + Some(template) => template.clone(), + None => emit_error_expr("missing serde rename_attribute_template for Rust".to_string(), RenderTarget::Rust), +} } pub fn rust_test_file_path(module_name: String) -> String { { let conventions = test_conventions_for_target(RenderTarget::Rust); - let file_dir = match conventions.file_dir.clone() { - Some(dir) => dir.clone(), - None => "".to_string(), - }; - let filename = module_to_filename(module_name); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(file_dir, conventions.file_prefix.clone()), - filename, - ), - conventions.file_suffix.clone(), - ), - rust_source_ext(), - ) - } +let file_dir = match conventions.file_dir.clone() { + Some(dir) => dir.clone(), + None => "".to_string(), +}; +let filename = module_to_filename(module_name); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(file_dir, conventions.file_prefix.clone()), filename), conventions.file_suffix.clone()), rust_source_ext()) +} } pub fn rust_test_name(projection: Rc) -> String { @@ -639,285 +332,141 @@ pub fn rust_test_name(projection: Rc) -> String { } pub fn rust_async_test_decorator() -> String { - match test_conventions_for_target(RenderTarget::Rust) - .async_decorator - .clone() - { - Some(decorator) => decorator.clone(), - None => emit_error_expr( - "missing async_decorator for Rust test conventions".to_string(), - RenderTarget::Rust, - ), - } + match test_conventions_for_target(RenderTarget::Rust).async_decorator.clone() { + Some(decorator) => decorator.clone(), + None => emit_error_expr("missing async_decorator for Rust test conventions".to_string(), RenderTarget::Rust), +} } -pub fn emit_rust_block_stmts( - mut remaining: Rc>>, - mut text: Rc>, - mut scope: Rc, - mut registry: Rc>>, - mut depth: i64, - mut shared_types: Rc>, - mut emit_info: Rc, -) -> Rc { +pub fn emit_rust_block_stmts(mut remaining: Rc>>, mut text: Rc>, mut scope: Rc, mut registry: Rc>>, mut depth: i64, mut shared_types: Rc>, mut emit_info: Rc) -> Rc { loop { match remaining.clone().first().cloned() { - None => { - break Rc::new(BlockEmitState { - text: text, - scope: scope.clone(), - }); - } - Some(stmt) => { - let line = emit_typed_expr( - stmt.clone(), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - let next_scope = scope_after_expr(&stmt, &scope); - { - let __tco_0 = Rc::new( - remaining - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ); - let __tco_1 = v2_rt::rc_list_push(text, line); - let __tco_2 = next_scope; - remaining = __tco_0; - text = __tco_1; - scope = __tco_2; - continue; - } - } - } - } -} - -pub fn emit_rust_init_block_stmts( - mut remaining: Rc>>, - mut text: Rc>, - mut scope: Rc, - mut registry: Rc>>, - mut depth: i64, - mut shared_types: Rc>, - mut emit_info: Rc, -) -> Rc { + None => { break Rc::new(BlockEmitState { + text: text, + scope: scope.clone(), +}); }, + Some(stmt) => { let line = emit_typed_expr(stmt.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +let next_scope = scope_after_expr(&stmt, &scope); +{ + let __tco_0 = Rc::new(remaining.iter().cloned().skip(1 as usize).collect::>()); +let __tco_1 = v2_rt::rc_list_push(text, line); +let __tco_2 = next_scope; +remaining = __tco_0; +text = __tco_1; +scope = __tco_2; +continue; +} }, +} +} +} + +pub fn emit_rust_init_block_stmts(mut remaining: Rc>>, mut text: Rc>, mut scope: Rc, mut registry: Rc>>, mut depth: i64, mut shared_types: Rc>, mut emit_info: Rc) -> Rc { loop { match remaining.clone().first().cloned() { - None => { - break Rc::new(BlockEmitState { - text: text, - scope: scope.clone(), - }); - } - Some(stmt) => { - let rest = Rc::new( - remaining - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ); - match rest.clone().first().cloned() { - None => { - break Rc::new(BlockEmitState { - text: text, - scope: scope.clone(), - }); - } - Some(_) => { - let raw_line = emit_typed_expr( - stmt.clone(), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - let is_let = match (*stmt.expr_data.clone()).clone() { - ExprData::ExprLet => true, - _ => false, - }; - let line = if is_let { - raw_line - } else { - v2_rt::concat(raw_line, ";".to_string()) - }; - let next_scope = scope_after_expr(&stmt, &scope); - { - let __tco_0 = rest.clone(); - let __tco_1 = v2_rt::rc_list_push(text, line); - let __tco_2 = next_scope; - remaining = __tco_0; - text = __tco_1; - scope = __tco_2; - continue; - } - } - } - } - } - } + None => { break Rc::new(BlockEmitState { + text: text, + scope: scope.clone(), +}); }, + Some(stmt) => { let rest = Rc::new(remaining.clone().iter().cloned().skip(1 as usize).collect::>()); +match rest.clone().first().cloned() { + None => { break Rc::new(BlockEmitState { + text: text, + scope: scope.clone(), +}); }, + Some(_) => { let raw_line = emit_typed_expr(stmt.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +let is_let = match (*stmt.expr_data.clone()).clone() { + ExprData::ExprLet => true, + _ => false, +}; +let line = if is_let { + raw_line + } else { + v2_rt::concat(raw_line, ";".to_string()) + }; +let next_scope = scope_after_expr(&stmt, &scope); +{ + let __tco_0 = rest.clone(); +let __tco_1 = v2_rt::rc_list_push(text, line); +let __tco_2 = next_scope; +remaining = __tco_0; +text = __tco_1; +scope = __tco_2; +continue; +} }, +} }, +} +} } pub fn has_complex_variants(item: &Rc) -> bool { if ((item.children.clone().len() as i64) == 0) { false } else { - { - let mut __found = false; - for c in item.children.clone().iter().cloned() { - if (c.connective.clone() != Connective::NoConnective) { - __found = true; - break; - } - } - __found - } + { let mut __found = false; for c in item.children.clone().iter().cloned() { if (c.connective.clone() != Connective::NoConnective) { __found = true; break; } } __found } } } pub fn is_simple_disj(item: Rc) -> bool { { - let complex = Rc::new({ - let mut __result = Vec::new(); - for v in item.children.clone().iter().cloned() { - if ((v.children.clone().len() as i64) > 0) { - __result.push(v); - } - } - __result - }); - ((complex.len() as i64) == 0) - } + let complex = Rc::new({ let mut __result = Vec::new(); for v in item.children.clone().iter().cloned() { if ((v.children.clone().len() as i64) > 0) { __result.push(v); } } __result }); +((complex.len() as i64) == 0) +} } pub fn is_dag_value_type_name(name: String) -> bool { match is_copy(RenderTarget::Rust, name) { - Some(v) => v.clone(), - None => false, - } + Some(v) => v.clone(), + None => false, +} } -pub fn is_type_constant( - summary: &Rc, - recursive_type_set: Rc>, -) -> bool { +pub fn is_type_constant(summary: &Rc, recursive_type_set: Rc>) -> bool { { let is_recursive = v2_rt::map_contains_key(&recursive_type_set, summary.name.clone()); - let has_generics = ((summary.generic_param_names.clone().len() as i64) > 0); - match (*summary.repr.clone()).clone() { - TypeRepr::EnumRepr { unit_only, .. } => { - (((unit_only.clone() && !is_recursive) && !has_generics) - && !summary.has_fn_fields.clone()) - } - TypeRepr::StructRepr => { - if ((is_recursive || has_generics) || summary.has_fn_fields.clone()) { +let has_generics = ((summary.generic_param_names.clone().len() as i64) > 0); +match (*summary.repr.clone()).clone() { + TypeRepr::EnumRepr { unit_only, .. } => (((unit_only.clone() && !is_recursive) && !has_generics) && !summary.has_fn_fields.clone()), + TypeRepr::StructRepr => if ((is_recursive || has_generics) || summary.has_fn_fields.clone()) { + false + } else { + { + let field_count = (Rc::new(v2_rt::map_keys(&summary.field_summaries.clone())).len() as i64); +let ft_count = (Rc::new(v2_rt::map_keys(&summary.field_type_map.clone())).len() as i64); +if (ft_count < field_count) { false } else { - { - let field_count = - (Rc::new(v2_rt::map_keys(&summary.field_summaries.clone())).len() - as i64); - let ft_count = (Rc::new(v2_rt::map_keys(&summary.field_type_map.clone())) - .len() as i64); - if (ft_count < field_count) { - false - } else { - { - let mut __all = true; - for tn in - Rc::new(v2_rt::map_values(&summary.field_type_map.clone())) - .iter() - .cloned() - { - if !(is_dag_value_type_name(tn.clone())) { - __all = false; - break; - } - } - __all - } - } - } + { let mut __all = true; for tn in Rc::new(v2_rt::map_values(&summary.field_type_map.clone())).iter().cloned() { if !(is_dag_value_type_name(tn.clone())) { __all = false; break; } } __all } } - } - } - } +} + }, +} +} } -pub fn maybe_mark_shared_type( - acc: Rc>, - summary: &Rc, - recursive_type_set: Rc>, - target_needs_sharing: bool, -) -> Rc> { +pub fn maybe_mark_shared_type(acc: Rc>, summary: &Rc, recursive_type_set: Rc>, target_needs_sharing: bool) -> Rc> { { - let needs_sharing = (target_needs_sharing - && match (*summary.repr.clone()).clone() { - TypeRepr::StructRepr => true, - TypeRepr::EnumRepr { unit_only, .. } => (unit_only.clone() == false), - }); - if (needs_sharing && !is_type_constant(&summary, recursive_type_set)) { + let needs_sharing = (target_needs_sharing && match (*summary.repr.clone()).clone() { + TypeRepr::StructRepr => true, + TypeRepr::EnumRepr { unit_only, .. } => (unit_only.clone() == false), +}); +if (needs_sharing && !is_type_constant(&summary, recursive_type_set)) { v2_rt::rc_map_insert(acc, summary.name.clone(), true) } else { acc } - } +} } -pub fn build_shared_types( - type_summaries: Rc>>, - recursive_type_set: Rc>, - target: RenderTarget, -) -> Rc> { +pub fn build_shared_types(type_summaries: Rc>>, recursive_type_set: Rc>, target: RenderTarget) -> Rc> { { let sharing = sharing_for_target(target); - let user_shared = Rc::new(v2_rt::map_values(&type_summaries)) - .iter() - .cloned() - .fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, summary: Rc| { - maybe_mark_shared_type( - acc, - &summary, - recursive_type_set.clone(), - sharing.needs_sharing.clone(), - ) - }, - ); - let collection_keys = Rc::new({ - let mut __result = Vec::new(); - for k in Rc::new(v2_rt::map_keys(&rust_container_templates())) - .iter() - .cloned() - { - if ((sharing.needs_sharing.clone() - && (k.clone().as_str() != "optional".to_string().as_str())) - && (k.clone().as_str() != "boolean_algebra".to_string().as_str())) - { - __result.push(k); - } - } - __result - }); - collection_keys.iter().cloned().fold( - user_shared.clone(), - |acc: Rc>, key: String| { - let pascal = to_pascal(key.clone()); - v2_rt::rc_map_insert(acc, pascal.clone(), true) - }, - ) - } +let user_shared = Rc::new(v2_rt::map_values(&type_summaries)).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, summary: Rc| maybe_mark_shared_type(acc, &summary, recursive_type_set.clone(), sharing.needs_sharing.clone())); +let collection_keys = Rc::new({ let mut __result = Vec::new(); for k in Rc::new(v2_rt::map_keys(&rust_container_templates())).iter().cloned() { if ((sharing.needs_sharing.clone() && (k.clone().as_str() != "optional".to_string().as_str())) && (k.clone().as_str() != "boolean_algebra".to_string().as_str())) { __result.push(k); } } __result }); +collection_keys.iter().cloned().fold(user_shared.clone(), |acc: Rc>, key: String| { + let pascal = to_pascal(key.clone()); +v2_rt::rc_map_insert(acc, pascal.clone(), true) +}) +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -935,1166 +484,386 @@ pub struct OwnershipBuildResult { pub fn build_ownership_results(modules: &Rc>>) -> Rc { { - let callable_set = modules.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, m: Rc| { - Rc::new({ - let mut __result = Vec::new(); - for item in m.items.clone().iter().cloned() { - if (item.body.clone() != None) { - __result.push(item); - } - } - __result - }) - .iter() - .cloned() - .fold(acc, |inner: Rc>, item: Rc| { - v2_rt::rc_map_merge( - inner, - collect_callable_refs( - &item.body.clone().clone().unwrap(), - &m.type_env.clone().source_indices.clone(), - ), - ) - }) - }, - ); - let proofs = Rc::new({ - let mut __result = Vec::new(); - for m in modules.clone().iter().cloned() { - __result.extend( - (*Rc::new({ - let mut __result = Vec::new(); - for item in Rc::new({ - let mut __result = Vec::new(); - for item in m.items.clone().iter().cloned() { - if (item.body.clone() != None) { - __result.push(item); - } - } - __result - }) - .iter() - .cloned() - { - __result.push({ - let pnames = item.params.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, p: Rc| { - v2_rt::rc_map_insert( - acc, - param_node_name_at( - p.clone(), - m.type_env.clone().source_indices.clone(), - ), - true, - ) - }, - ); - let si = m.type_env.clone().source_indices.clone(); - let qualified = v2_rt::concat( - v2_rt::concat( - authored_name_at(si.clone(), &m.module.clone()), - ".".to_string(), - ), - authored_name_at(si.clone(), &item), - ); - Rc::new(OwnershipProofEntry { - name: qualified.clone(), - proof: analyze_ownership( - authored_name_at(si.clone(), &item), - item.params.clone(), - item.body.clone().clone().unwrap(), - &si, - ), - param_names: pnames.clone(), - }) - }); - } - __result - })) - .iter() - .cloned(), - ); - } - __result - }); - proofs.iter().cloned().fold( - Rc::new(OwnershipBuildResult { - ownership_index: v2_rt::rc_empty_map::>>(), - read_only_params_index: v2_rt::rc_empty_map::>>(), - }), - |acc: Rc, entry: Rc| { - let acc = Rc::try_unwrap(acc).unwrap_or_else(|rc| (*rc).clone()); - { - let read_only = if v2_rt::map_contains_key( - &callable_set, - entry.proof.clone().func_name.clone(), - ) { - v2_rt::rc_empty_map::() - } else { - build_read_only_params(entry.proof.clone(), entry.param_names.clone()) - }; - let movable = build_movable_set(entry.proof.clone()); - Rc::new(OwnershipBuildResult { - ownership_index: v2_rt::rc_map_insert( - acc.ownership_index, - entry.name.clone(), - movable.clone(), - ), - read_only_params_index: v2_rt::rc_map_insert( - acc.read_only_params_index, - entry.name.clone(), - read_only.clone(), - ), - }) - } - }, - ) - } + let callable_set = modules.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, m: Rc| Rc::new({ let mut __result = Vec::new(); for item in m.items.clone().iter().cloned() { if (item.body.clone() != None) { __result.push(item); } } __result }).iter().cloned().fold(acc, |inner: Rc>, item: Rc| v2_rt::rc_map_merge(inner, collect_callable_refs(&item.body.clone().clone().unwrap(), &m.type_env.clone().source_indices.clone())))); +let proofs = Rc::new({ let mut __result = Vec::new(); for m in modules.clone().iter().cloned() { __result.extend((*Rc::new({ let mut __result = Vec::new(); for item in Rc::new({ let mut __result = Vec::new(); for item in m.items.clone().iter().cloned() { if (item.body.clone() != None) { __result.push(item); } } __result }).iter().cloned() { __result.push({ + let pnames = item.params.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, p: Rc| v2_rt::rc_map_insert(acc, param_node_name_at(p.clone(), m.type_env.clone().source_indices.clone()), true)); +let si = m.type_env.clone().source_indices.clone(); +let qualified = v2_rt::concat(v2_rt::concat(authored_name_at(si.clone(), &m.module.clone()), ".".to_string()), authored_name_at(si.clone(), &item)); +Rc::new(OwnershipProofEntry { + name: qualified.clone(), + proof: analyze_ownership(authored_name_at(si.clone(), &item), item.params.clone(), item.body.clone().clone().unwrap(), &si), + param_names: pnames.clone(), +}) +}); } __result })).iter().cloned()); } __result }); +proofs.iter().cloned().fold(Rc::new(OwnershipBuildResult { + ownership_index: v2_rt::rc_empty_map::>>(), + read_only_params_index: v2_rt::rc_empty_map::>>(), +}), |acc: Rc, entry: Rc| { let acc = Rc::try_unwrap(acc).unwrap_or_else(|rc| (*rc).clone()); { + let read_only = if v2_rt::map_contains_key(&callable_set, entry.proof.clone().func_name.clone()) { + v2_rt::rc_empty_map::() + } else { + build_read_only_params(entry.proof.clone(), entry.param_names.clone()) + }; +let movable = build_movable_set(entry.proof.clone()); +Rc::new(OwnershipBuildResult { + ownership_index: v2_rt::rc_map_insert(acc.ownership_index, entry.name.clone(), movable.clone()), + read_only_params_index: v2_rt::rc_map_insert(acc.read_only_params_index, entry.name.clone(), read_only.clone()), +}) +} }) +} } pub fn emit_rust(typed: &Rc) -> Rc { { let base_info = build_emit_graph_info(&typed.modules.clone()); - let ownership = build_ownership_results(&typed.modules.clone()); - let shared = build_shared_types( - base_info.type_summaries.clone(), - base_info.recursive_type_set.clone(), - RenderTarget::Rust, - ); - let emit_info = Rc::new(EmitGraphInfo { - type_summaries: base_info.type_summaries.clone(), - recursive_type_set: base_info.recursive_type_set.clone(), - fielded_variants: base_info.fielded_variants.clone(), - shared_types: shared, - ownership_index: ownership.ownership_index.clone(), - movable: v2_rt::rc_empty_map::(), - variant_to_enum: base_info.variant_to_enum.clone(), - owned_bindings: v2_rt::rc_empty_map::(), - read_only_params_index: ownership.read_only_params_index.clone(), - read_only_params: v2_rt::rc_empty_map::(), - }); - let shared_types = emit_info.shared_types.clone(); - let registry = typed.item_registry.clone(); - let data_items = build_data_item_index(typed.modules.clone()); - let workflow_funcs = collect_workflow_funcs( - typed.modules.clone(), - registry.clone(), - emit_info.read_only_params_index.clone(), - ); - let workflow_default_diags = validate_workflow_param_defaults(workflow_funcs.clone()); - if ((workflow_default_diags.clone().len() as i64) > 0) { +let ownership = build_ownership_results(&typed.modules.clone()); +let shared = build_shared_types(base_info.type_summaries.clone(), base_info.recursive_type_set.clone(), RenderTarget::Rust); +let emit_info = Rc::new(EmitGraphInfo { + type_summaries: base_info.type_summaries.clone(), + recursive_type_set: base_info.recursive_type_set.clone(), + fielded_variants: base_info.fielded_variants.clone(), + shared_types: shared, + ownership_index: ownership.ownership_index.clone(), + movable: v2_rt::rc_empty_map::(), + variant_to_enum: base_info.variant_to_enum.clone(), + owned_bindings: v2_rt::rc_empty_map::(), + read_only_params_index: ownership.read_only_params_index.clone(), + read_only_params: v2_rt::rc_empty_map::(), +}); +let shared_types = emit_info.shared_types.clone(); +let registry = typed.item_registry.clone(); +let data_items = build_data_item_index(typed.modules.clone()); +let workflow_funcs = collect_workflow_funcs(typed.modules.clone(), registry.clone(), emit_info.read_only_params_index.clone()); +let workflow_default_diags = validate_workflow_param_defaults(workflow_funcs.clone()); +if ((workflow_default_diags.clone().len() as i64) > 0) { return Rc::new(EmitResult { - files: Rc::new(vec![]), - diagnostics: workflow_default_diags.clone(), - }); - } - let svc_module_map = typed.modules.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, tm: Rc| { - let svc_items = Rc::new({ - let mut __result = Vec::new(); - for item in tm.items.clone().iter().cloned() { - if is_service_item(&item) { - __result.push(item); - } - } - __result - }); - let mod_filename = module_to_filename(authored_name_at( - tm.type_env.clone().source_indices.clone(), - &tm.module.clone(), - )); - svc_items.clone().iter().cloned().fold( - acc, - |a: Rc>, svc: Rc| { - v2_rt::rc_map_insert( - a, - authored_name_at(tm.type_env.clone().source_indices.clone(), &svc), - mod_filename.clone(), - ) - }, - ) - }, - ); - let test_projections = extract_test_projections(typed.clone()); - let module_files = Rc::new({ - let mut __result = Vec::new(); - for tm in typed.modules.clone().iter().cloned() { - __result.push(emit_module_full( - &tm, - ®istry, - &emit_info, - shared_types.clone(), - svc_module_map.clone(), - data_items.clone(), - )); - } - __result - }); - let test_files = Rc::new({ - let mut __result = Vec::new(); - for f in Rc::new({ - let mut __result = Vec::new(); - for tm in typed.modules.clone().iter().cloned() { - __result.push(emit_test_file( - &authored_name_at( - tm.type_env.clone().source_indices.clone(), - &tm.module.clone(), - ), - Rc::new({ - let mut __result = Vec::new(); - for p in test_projections.clone().iter().cloned() { - if (p.module_name.clone().as_str() - == authored_name_at( - tm.type_env.clone().source_indices.clone(), - &tm.module.clone(), - ) - .as_str()) - { - __result.push(p); - } - } - __result - }), - )); - } - __result - }) - .iter() - .cloned() - { - if (f.path.clone().as_str() != "".to_string().as_str()) { - __result.push(f); - } - } - __result - }); - let has_services = has_service_items(typed.clone()); - let has_pipeline = { - let mut __found = false; - for m in typed.modules.clone().iter().cloned() { - if (authored_name_at(m.type_env.clone().source_indices.clone(), &m.module.clone()) - .as_str() - == "v2.compiler.compile".to_string().as_str()) - { - __found = true; - break; - } - } - __found - }; - let crate_name = if has_pipeline.clone() { + files: Rc::new(vec![]), + diagnostics: workflow_default_diags.clone(), +}) + } +let svc_module_map = typed.modules.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, tm: Rc| { + let svc_items = Rc::new({ let mut __result = Vec::new(); for item in tm.items.clone().iter().cloned() { if is_service_item(&item) { __result.push(item); } } __result }); +let mod_filename = module_to_filename(authored_name_at(tm.type_env.clone().source_indices.clone(), &tm.module.clone())); +svc_items.clone().iter().cloned().fold(acc, |a: Rc>, svc: Rc| v2_rt::rc_map_insert(a, authored_name_at(tm.type_env.clone().source_indices.clone(), &svc), mod_filename.clone())) +}); +let test_projections = extract_test_projections(typed.clone()); +let module_files = Rc::new({ let mut __result = Vec::new(); for tm in typed.modules.clone().iter().cloned() { __result.push(emit_module_full(&tm, ®istry, &emit_info, shared_types.clone(), svc_module_map.clone(), data_items.clone())); } __result }); +let test_files = Rc::new({ let mut __result = Vec::new(); for f in Rc::new({ let mut __result = Vec::new(); for tm in typed.modules.clone().iter().cloned() { __result.push(emit_test_file(&authored_name_at(tm.type_env.clone().source_indices.clone(), &tm.module.clone()), Rc::new({ let mut __result = Vec::new(); for p in test_projections.clone().iter().cloned() { if (p.module_name.clone().as_str() == authored_name_at(tm.type_env.clone().source_indices.clone(), &tm.module.clone()).as_str()) { __result.push(p); } } __result }))); } __result }).iter().cloned() { if (f.path.clone().as_str() != "".to_string().as_str()) { __result.push(f); } } __result }); +let has_services = has_service_items(typed.clone()); +let has_pipeline = { let mut __found = false; for m in typed.modules.clone().iter().cloned() { if (authored_name_at(m.type_env.clone().source_indices.clone(), &m.module.clone()).as_str() == "v2.compiler.compile".to_string().as_str()) { __found = true; break; } } __found }; +let crate_name = if has_pipeline.clone() { "v2_compiler".to_string() } else { "v2_compiled".to_string() }; - let cargo = emit_cargo_toml(crate_name.clone(), has_services.clone()); - let main_file = emit_main_rs( - &workflow_funcs, - &typed.modules.clone(), - &has_services, - &crate_name, - svc_module_map.clone(), - ); - let rt_file = emit_v2_rt_module(); - let compiler_tests_file = if has_pipeline.clone() { +let cargo = emit_cargo_toml(crate_name.clone(), has_services.clone()); +let main_file = emit_main_rs(&workflow_funcs, &typed.modules.clone(), &has_services, &crate_name, svc_module_map.clone()); +let rt_file = emit_v2_rt_module(); +let compiler_tests_file = if has_pipeline.clone() { Rc::new(vec![emit_compiler_tests_module()]) } else { Rc::new(vec![]) }; - let dry_run_file = if has_services.clone() { +let dry_run_file = if has_services.clone() { Rc::new(vec![emit_dry_run_module()]) } else { Rc::new(vec![]) }; - let all_mod_files = v2_rt::concat( - v2_rt::concat(module_files, Rc::new(vec![rt_file])), - dry_run_file, - ); - let lib_file = emit_lib_rs_from_files(all_mod_files.clone(), &has_pipeline); - let files = v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - Rc::new(vec![cargo, lib_file, main_file]), - all_mod_files.clone(), - ), - compiler_tests_file, - ), - test_files, - ); - Rc::new(EmitResult { - files: files, - diagnostics: Rc::new(vec![]), - }) - } +let all_mod_files = v2_rt::concat(v2_rt::concat(module_files, Rc::new(vec![rt_file])), dry_run_file); +let lib_file = emit_lib_rs_from_files(all_mod_files.clone(), &has_pipeline); +let files = v2_rt::concat(v2_rt::concat(v2_rt::concat(Rc::new(vec![cargo, lib_file, main_file]), all_mod_files.clone()), compiler_tests_file), test_files); +Rc::new(EmitResult { + files: files, + diagnostics: Rc::new(vec![]), +}) +} } pub fn emit_v2_rt_module() -> Rc { Rc::new(TextFile { - path: v2_rt::concat( - v2_rt::concat(rust_source_root(), "v2_rt".to_string()), - rust_source_ext(), - ), - content: rust_runtime_source(), - }) + path: v2_rt::concat(v2_rt::concat(rust_source_root(), "v2_rt".to_string()), rust_source_ext()), + content: rust_runtime_source(), +}) } pub fn emit_compiler_tests_module() -> Rc { Rc::new(TextFile { - path: v2_rt::concat( - v2_rt::concat(rust_source_root(), "compiler_tests".to_string()), - rust_source_ext(), - ), - content: compiler_tests_source(), - }) + path: v2_rt::concat(v2_rt::concat(rust_source_root(), "compiler_tests".to_string()), rust_source_ext()), + content: compiler_tests_source(), +}) } -pub fn emit_lib_rs_from_files( - all_module_files: Rc>>, - has_compiler_tests: &bool, -) -> Rc { +pub fn emit_lib_rs_from_files(all_module_files: Rc>>, has_compiler_tests: &bool) -> Rc { { let src_prefix_len = v2_rt::string_length(&rust_source_root()); - let ext_len = v2_rt::string_length(&rust_source_ext()); - let mod_decls = Rc::new({ - let mut __result = Vec::new(); - for f in all_module_files.iter().cloned() { - __result.push({ - let path_len = v2_rt::string_length(&f.path.clone()); - let mod_name = v2_rt::substring( - &f.path.clone(), - src_prefix_len.clone(), - (path_len.clone() - ext_len.clone()), - ); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - rust_visibility_prefix(), - rust_items().module_keyword.clone(), - ), - " ".to_string(), - ), - mod_name.clone(), - ), - ";".to_string(), - ) - }); - } - __result - }); - let hand_maintained_mods = if has_compiler_tests.clone() { +let ext_len = v2_rt::string_length(&rust_source_ext()); +let mod_decls = Rc::new({ let mut __result = Vec::new(); for f in all_module_files.iter().cloned() { __result.push({ + let path_len = v2_rt::string_length(&f.path.clone()); +let mod_name = v2_rt::substring(&f.path.clone(), src_prefix_len.clone(), (path_len.clone() - ext_len.clone())); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(rust_visibility_prefix(), rust_items().module_keyword.clone()), " ".to_string()), mod_name.clone()), ";".to_string()) +}); } __result }); +let hand_maintained_mods = if has_compiler_tests.clone() { "\npub mod v2_interpreter;\npub mod cli_run;\npub mod rest_transport_facts;".to_string() } else { "".to_string() }; - let test_mod = if has_compiler_tests.clone() { +let test_mod = if has_compiler_tests.clone() { "\n\n#[cfg(test)]\nmod compiler_tests;".to_string() } else { "".to_string() }; - let shared_types = emit_non_empty_wrappers(); - let content = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("// Generated by v2 compiler -- do not edit.\n\n".to_string(), "#![allow(unused_imports, unused_variables, unused_mut, unused_parens, dead_code, unreachable_patterns, non_shorthand_field_patterns, suspicious_double_ref_op, clippy::all)]\n\n".to_string()), mod_decls.join(&"\n".to_string())), hand_maintained_mods), "\n\n".to_string()), shared_types), test_mod); - Rc::new(TextFile { - path: v2_rt::concat( - v2_rt::concat(rust_source_root(), "lib".to_string()), - rust_source_ext(), - ), - content: v2_rt::concat(content, "\n".to_string()), - }) - } +let shared_types = emit_non_empty_wrappers(); +let content = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("// Generated by v2 compiler -- do not edit.\n\n".to_string(), "#![allow(unused_imports, unused_variables, unused_mut, unused_parens, dead_code, unreachable_patterns, non_shorthand_field_patterns, suspicious_double_ref_op, clippy::all)]\n\n".to_string()), mod_decls.join(&"\n".to_string())), hand_maintained_mods), "\n\n".to_string()), shared_types), test_mod); +Rc::new(TextFile { + path: v2_rt::concat(v2_rt::concat(rust_source_root(), "lib".to_string()), rust_source_ext()), + content: v2_rt::concat(content, "\n".to_string()), +}) +} } -pub fn emit_module( - typed_module: &Rc, - registry: Rc>>, -) -> Rc { +pub fn emit_module(typed_module: &Rc, registry: Rc>>) -> Rc { { let base_info = build_emit_graph_info(&Rc::new(vec![typed_module.clone()])); - let shared = build_shared_types( - base_info.type_summaries.clone(), - base_info.recursive_type_set.clone(), - RenderTarget::Rust, - ); - let emit_info = Rc::new(EmitGraphInfo { - type_summaries: base_info.type_summaries.clone(), - recursive_type_set: base_info.recursive_type_set.clone(), - fielded_variants: base_info.fielded_variants.clone(), - shared_types: shared, - ownership_index: base_info.ownership_index.clone(), - movable: base_info.movable.clone(), - variant_to_enum: base_info.variant_to_enum.clone(), - owned_bindings: v2_rt::rc_empty_map::(), - read_only_params_index: base_info.read_only_params_index.clone(), - read_only_params: v2_rt::rc_empty_map::(), - }); - let shared_types = emit_info.shared_types.clone(); - emit_module_full( - &typed_module, - ®istry, - &emit_info, - shared_types, - v2_rt::rc_empty_map::(), - build_data_item_index(Rc::new(vec![typed_module.clone()])), - ) - } +let shared = build_shared_types(base_info.type_summaries.clone(), base_info.recursive_type_set.clone(), RenderTarget::Rust); +let emit_info = Rc::new(EmitGraphInfo { + type_summaries: base_info.type_summaries.clone(), + recursive_type_set: base_info.recursive_type_set.clone(), + fielded_variants: base_info.fielded_variants.clone(), + shared_types: shared, + ownership_index: base_info.ownership_index.clone(), + movable: base_info.movable.clone(), + variant_to_enum: base_info.variant_to_enum.clone(), + owned_bindings: v2_rt::rc_empty_map::(), + read_only_params_index: base_info.read_only_params_index.clone(), + read_only_params: v2_rt::rc_empty_map::(), +}); +let shared_types = emit_info.shared_types.clone(); +emit_module_full(&typed_module, ®istry, &emit_info, shared_types, v2_rt::rc_empty_map::(), build_data_item_index(Rc::new(vec![typed_module.clone()]))) +} } -pub fn emit_module_full( - typed_module: &Rc, - registry: &Rc>>, - emit_info: &Rc, - shared_types: Rc>, - svc_module_map: Rc>, - data_items: Rc>>, -) -> Rc { +pub fn emit_module_full(typed_module: &Rc, registry: &Rc>>, emit_info: &Rc, shared_types: Rc>, svc_module_map: Rc>, data_items: Rc>>) -> Rc { { let m = typed_module.module.clone(); - let scope = module_emit_scope(&typed_module); - let scoped_data_items = build_scoped_data_item_index(&typed_module, data_items); - let prelude = emit_prelude(); - let local_type_names = Rc::new({ - let mut __result = Vec::new(); - for item in Rc::new({ - let mut __result = Vec::new(); - for item in typed_module.items.clone().iter().cloned() { - if is_type_def_item(&item) { - __result.push(item); - } - } - __result - }) - .iter() - .cloned() - { - __result.push(authored_name(scope.type_env.clone(), item.clone())); - } - __result - }); - let imports_str = emit_imports( - &module_imports(m.clone()), - emit_info.clone(), - registry.clone(), - local_type_names, - scope.type_env.clone().source_indices.clone(), - ); - let imports_section = if (imports_str.clone().as_str() == "".to_string().as_str()) { +let scope = module_emit_scope(&typed_module); +let scoped_data_items = build_scoped_data_item_index(&typed_module, data_items); +let prelude = emit_prelude(); +let local_type_names = Rc::new({ let mut __result = Vec::new(); for item in Rc::new({ let mut __result = Vec::new(); for item in typed_module.items.clone().iter().cloned() { if is_type_def_item(&item) { __result.push(item); } } __result }).iter().cloned() { __result.push(authored_name(scope.type_env.clone(), item.clone())); } __result }); +let imports_str = emit_imports(&module_imports(m.clone()), emit_info.clone(), registry.clone(), local_type_names, scope.type_env.clone().source_indices.clone()); +let imports_section = if (imports_str.clone().as_str() == "".to_string().as_str()) { "".to_string() } else { v2_rt::concat("\n".to_string(), imports_str.clone()) }; - let this_mod_filename = - module_to_filename(authored_name(scope.type_env.clone(), m.clone())); - let all_svc_names = Rc::new({ - let mut __result = Vec::new(); - for item in typed_module.items.clone().iter().cloned() { - __result.extend( - (*match v2_rt::map_get( - ®istry, - authored_name(scope.type_env.clone(), item.clone()), - ) { - Some(info) => info.service_names.clone(), - None => Rc::new(vec![]), - }) - .iter() - .cloned(), - ); - } - __result - }); - let extern_svc_imports = Rc::new({ - let mut __result = Vec::new(); - for sn in unique_strings(all_svc_names).iter().cloned() { - __result.extend( - (*match v2_rt::map_get(&svc_module_map, sn.clone()) { - Some(mod_file) => { - if (mod_file.clone().as_str() == this_mod_filename.clone().as_str()) { - Rc::new(vec![]) - } else { - Rc::new(vec![v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - rust_visibility_prefix(), - "use crate::".to_string(), - ), - mod_file.clone(), - ), - "::".to_string(), - ), - sanitize_service_name(sn.clone()), - ), - ";".to_string(), - )]) - } - } - None => Rc::new(vec![]), - }) - .iter() - .cloned(), - ); - } - __result - }); - let svc_imports_str = if ((extern_svc_imports.clone().len() as i64) == 0) { +let this_mod_filename = module_to_filename(authored_name(scope.type_env.clone(), m.clone())); +let all_svc_names = Rc::new({ let mut __result = Vec::new(); for item in typed_module.items.clone().iter().cloned() { __result.extend((*match v2_rt::map_get(®istry, authored_name(scope.type_env.clone(), item.clone())) { + Some(info) => info.service_names.clone(), + None => Rc::new(vec![]), +}).iter().cloned()); } __result }); +let extern_svc_imports = Rc::new({ let mut __result = Vec::new(); for sn in unique_strings(all_svc_names).iter().cloned() { __result.extend((*match v2_rt::map_get(&svc_module_map, sn.clone()) { + Some(mod_file) => if (mod_file.clone().as_str() == this_mod_filename.clone().as_str()) { + Rc::new(vec![]) + } else { + Rc::new(vec![v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(rust_visibility_prefix(), "use crate::".to_string()), mod_file.clone()), "::".to_string()), sanitize_service_name(sn.clone())), ";".to_string())]) + }, + None => Rc::new(vec![]), +}).iter().cloned()); } __result }); +let svc_imports_str = if ((extern_svc_imports.clone().len() as i64) == 0) { "".to_string() } else { - v2_rt::concat( - "\n".to_string(), - extern_svc_imports.clone().join(&"\n".to_string()), - ) + v2_rt::concat("\n".to_string(), extern_svc_imports.clone().join(&"\n".to_string())) }; - let local_enum_uses = Rc::new({ - let mut __result = Vec::new(); - for item in Rc::new({ - let mut __result = Vec::new(); - for item in typed_module.items.clone().iter().cloned() { - if (is_type_def_item(&item) && is_coproduct_type(item.clone())) { - __result.push(item); - } - } - __result - }) - .iter() - .cloned() - { - __result.push(v2_rt::concat( - v2_rt::concat( - "use self::".to_string(), - authored_name(scope.type_env.clone(), item.clone()), - ), - "::*;".to_string(), - )); - } - __result - }); - let local_uses_str = if ((local_enum_uses.clone().len() as i64) == 0) { +let local_enum_uses = Rc::new({ let mut __result = Vec::new(); for item in Rc::new({ let mut __result = Vec::new(); for item in typed_module.items.clone().iter().cloned() { if (is_type_def_item(&item) && is_coproduct_type(item.clone())) { __result.push(item); } } __result }).iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat("use self::".to_string(), authored_name(scope.type_env.clone(), item.clone())), "::*;".to_string())); } __result }); +let local_uses_str = if ((local_enum_uses.clone().len() as i64) == 0) { "".to_string() } else { - v2_rt::concat( - "\n".to_string(), - local_enum_uses.clone().join(&"\n".to_string()), - ) + v2_rt::concat("\n".to_string(), local_enum_uses.clone().join(&"\n".to_string())) }; - let wire_contract_item = Rc::new({ - let mut __result = Vec::new(); - for i in typed_module.items.clone().iter().cloned() { - if (item_binding_is_named(scope.type_env.clone(), &i, &"wire_contract".to_string()) - && match v2_rt::map_get( - &scope.item_registry.clone(), - "wire_contract".to_string(), - ) { - Some(info) => (info.kind.clone() == ItemKind::DataItem), - None => false, - }) - { - __result.push(i); - } - } - __result - }) - .first() - .cloned(); - let items_str = Rc::new({ - let mut __result = Vec::new(); - for item in typed_module.items.clone().iter().cloned() { - __result.push(emit_typed_item( - &item, - authored_name(scope.type_env.clone(), m.clone()), - ®istry, - &scope, - shared_types.clone(), - &emit_info, - wire_contract_item.clone(), - scoped_data_items.clone(), - )); - } - __result - }) - .join(&"\n\n".to_string()); - let raw_filename = module_to_filename(authored_name(scope.type_env.clone(), m.clone())); - let filename = if (raw_filename.clone().as_str() == "main".to_string().as_str()) { +let wire_contract_item = Rc::new({ let mut __result = Vec::new(); for i in typed_module.items.clone().iter().cloned() { if (item_binding_is_named(scope.type_env.clone(), &i, &"wire_contract".to_string()) && match v2_rt::map_get(&scope.item_registry.clone(), "wire_contract".to_string()) { + Some(info) => (info.kind.clone() == ItemKind::DataItem), + None => false, +}) { __result.push(i); } } __result }).first().cloned(); +let items_str = Rc::new({ let mut __result = Vec::new(); for item in typed_module.items.clone().iter().cloned() { __result.push(emit_typed_item(&item, authored_name(scope.type_env.clone(), m.clone()), ®istry, &scope, shared_types.clone(), &emit_info, wire_contract_item.clone(), scoped_data_items.clone())); } __result }).join(&"\n\n".to_string()); +let raw_filename = module_to_filename(authored_name(scope.type_env.clone(), m.clone())); +let filename = if (raw_filename.clone().as_str() == "main".to_string().as_str()) { "main_mod".to_string() } else { raw_filename.clone() }; - let module_attrs = if (authored_name(scope.type_env.clone(), m.clone()).as_str() - == "std.error_primitives".to_string().as_str()) - { +let module_attrs = if (authored_name(scope.type_env.clone(), m.clone()).as_str() == "std.error_primitives".to_string().as_str()) { "#![allow(non_camel_case_types)]\n\n".to_string() } else { "".to_string() }; - let content = v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "// Generated by v2 compiler -- do not edit.\n" - .to_string(), - "// Source module: ".to_string(), - ), - authored_name(scope.type_env.clone(), m.clone()), - ), - "\n\n".to_string(), - ), - module_attrs, - ), - prelude, - ), - imports_section, - ), - svc_imports_str, - ), - local_uses_str, - ), - "\n\n".to_string(), - ), - items_str, - ), - "\n".to_string(), - ); - Rc::new(TextFile { - path: v2_rt::concat( - v2_rt::concat(rust_source_root(), filename), - rust_source_ext(), - ), - content: content, - }) - } +let content = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("// Generated by v2 compiler -- do not edit.\n".to_string(), "// Source module: ".to_string()), authored_name(scope.type_env.clone(), m.clone())), "\n\n".to_string()), module_attrs), prelude), imports_section), svc_imports_str), local_uses_str), "\n\n".to_string()), items_str), "\n".to_string()); +Rc::new(TextFile { + path: v2_rt::concat(v2_rt::concat(rust_source_root(), filename), rust_source_ext()), + content: content, +}) +} } pub fn emit_import_name(n: &String, registry: Rc>>) -> String { { let is_data = match v2_rt::map_get(®istry, n.clone()) { - Some(info) => (info.kind.clone() == ItemKind::DataItem), - None => false, - }; - if is_data { + Some(info) => (info.kind.clone() == ItemKind::DataItem), + None => false, +}; +if is_data { to_snake(n.clone()) } else { n.clone() } - } +} } -pub fn emit_imports( - imports: &Rc>>, - emit_info: Rc, - registry: Rc>>, - local_names: Rc>, - source_indices: Rc>>, -) -> String { +pub fn emit_imports(imports: &Rc>>, emit_info: Rc, registry: Rc>>, local_names: Rc>, source_indices: Rc>>) -> String { if ((imports.clone().len() as i64) == 0) { "".to_string() } else { { let type_summaries = emit_info.type_summaries.clone(); - let import_lines = Rc::new({ - let mut __result = Vec::new(); - for imp in imports.clone().iter().cloned() { - __result.push({ - let mod_name = - module_to_filename(authored_name_at(source_indices.clone(), &imp)); - if import_is_all(imp.clone()) { - v2_rt::concat( - v2_rt::concat("use crate::".to_string(), mod_name.clone()), - "::*;".to_string(), - ) +let import_lines = Rc::new({ let mut __result = Vec::new(); for imp in imports.clone().iter().cloned() { __result.push({ + let mod_name = module_to_filename(authored_name_at(source_indices.clone(), &imp)); +if import_is_all(imp.clone()) { + v2_rt::concat(v2_rt::concat("use crate::".to_string(), mod_name.clone()), "::*;".to_string()) + } else { + { + let specific_names = import_specific_names_at(imp.clone(), source_indices.clone()); +let filtered_names = Rc::new({ let mut __result = Vec::new(); for n in specific_names.clone().iter().cloned() { if { let mut __all = true; for ln in local_names.clone().iter().cloned() { if !((ln.clone().as_str() != n.clone().as_str())) { __all = false; break; } } __all } { __result.push(n); } } __result }); +if ((filtered_names.clone().len() as i64) == 0) { + "".to_string() } else { { - let specific_names = - import_specific_names_at(imp.clone(), source_indices.clone()); - let filtered_names = Rc::new({ - let mut __result = Vec::new(); - for n in specific_names.clone().iter().cloned() { - if { - let mut __all = true; - for ln in local_names.clone().iter().cloned() { - if !(ln.clone().as_str() != n.clone().as_str()) { - __all = false; - break; - } - } - __all - } { - __result.push(n); - } - } - __result - }); - if ((filtered_names.clone().len() as i64) == 0) { + let deduped_names = unique_strings(filtered_names.clone()); +let top_level = Rc::new({ let mut __result = Vec::new(); for n in deduped_names.clone().iter().cloned() { if if is_known_variant(type_summaries.clone(), n.clone()) { + is_enum_in_summaries(type_summaries.clone(), n.clone()) + } else { + true + } { __result.push(n); } } __result }); +let all_enum_names = Rc::new({ let mut __result = Vec::new(); for n in Rc::new(v2_rt::map_keys(&type_summaries)).iter().cloned() { if is_enum_in_summaries(type_summaries.clone(), n.clone()) { __result.push(n); } } __result }); +let imported_enums = Rc::new({ let mut __result = Vec::new(); for n in deduped_names.clone().iter().cloned() { if is_enum_in_summaries(type_summaries.clone(), n.clone()) { __result.push(n); } } __result }); +let all_parents = Rc::new({ let mut __result = Vec::new(); for p in Rc::new({ let mut __result = Vec::new(); for n in deduped_names.clone().iter().cloned() { __result.push(if is_enum_in_summaries(type_summaries.clone(), n.clone()) { "".to_string() } else { + match find_variant_parent(type_summaries.clone(), n.clone(), imported_enums.clone()) { + Some(parent) => parent.clone(), + None => match find_variant_parent(type_summaries.clone(), n.clone(), all_enum_names.clone()) { + Some(parent) => parent.clone(), + None => "".to_string(), +}, +} + }); } __result }).iter().cloned() { if (p.clone().as_str() != "".to_string().as_str()) { __result.push(p); } } __result }); +let parent_list = unique_strings(all_parents.clone()); +let top_with_parents = unique_strings(v2_rt::concat(top_level.clone(), parent_list.clone())); +let main_line = if ((top_with_parents.clone().len() as i64) > 0) { { - let deduped_names = unique_strings(filtered_names.clone()); - let top_level = Rc::new({ - let mut __result = Vec::new(); - for n in deduped_names.clone().iter().cloned() { - if if is_known_variant( - type_summaries.clone(), - n.clone(), - ) { - is_enum_in_summaries( - type_summaries.clone(), - n.clone(), - ) - } else { - true - } { - __result.push(n); - } - } - __result - }); - let all_enum_names = Rc::new({ - let mut __result = Vec::new(); - for n in Rc::new(v2_rt::map_keys(&type_summaries)) - .iter() - .cloned() - { - if is_enum_in_summaries( - type_summaries.clone(), - n.clone(), - ) { - __result.push(n); - } - } - __result - }); - let imported_enums = Rc::new({ - let mut __result = Vec::new(); - for n in deduped_names.clone().iter().cloned() { - if is_enum_in_summaries( - type_summaries.clone(), - n.clone(), - ) { - __result.push(n); - } - } - __result - }); - let all_parents = Rc::new({ - let mut __result = Vec::new(); - for p in Rc::new({ - let mut __result = Vec::new(); - for n in deduped_names.clone().iter().cloned() { - __result.push( - if is_enum_in_summaries( - type_summaries.clone(), - n.clone(), - ) { - "".to_string() - } else { - match find_variant_parent( - type_summaries.clone(), - n.clone(), - imported_enums.clone(), - ) { - Some(parent) => parent.clone(), - None => match find_variant_parent( - type_summaries.clone(), - n.clone(), - all_enum_names.clone(), - ) { - Some(parent) => parent.clone(), - None => "".to_string(), - }, - } - }, - ); - } - __result - }) - .iter() - .cloned() - { - if (p.clone().as_str() != "".to_string().as_str()) { - __result.push(p); - } - } - __result - }); - let parent_list = unique_strings(all_parents.clone()); - let top_with_parents = unique_strings(v2_rt::concat( - top_level.clone(), - parent_list.clone(), - )); - let main_line = - if ((top_with_parents.clone().len() as i64) > 0) { - { - let names_str = Rc::new({ - let mut __result = Vec::new(); - for n in - top_with_parents.clone().iter().cloned() - { - __result.push(emit_import_name( - &n, - registry.clone(), - )); - } - __result - }) - .join(&", ".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - rust_visibility_prefix(), - "use crate::".to_string(), - ), - mod_name.clone(), - ), - "::{".to_string(), - ), - names_str.clone(), - ), - "};".to_string(), - ) - } - } else { - "".to_string() - }; - let variant_lines = Rc::new({ - let mut __result = Vec::new(); - for parent in parent_list.clone().iter().cloned() { - __result.push({ - let variants = Rc::new({ - let mut __result = Vec::new(); - for n in - deduped_names.clone().iter().cloned() - { - if if is_enum_in_summaries( - type_summaries.clone(), - n.clone(), - ) { - false - } else { - match find_variant_parent( - type_summaries.clone(), - n.clone(), - Rc::new(vec![parent.clone()]), - ) { - Some(_) => true, - None => false, - } - } { - __result.push(n); - } - } - __result - }); - let vars_str = - variants.clone().join(&", ".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "use crate::" - .to_string(), - mod_name.clone(), - ), - "::".to_string(), - ), - parent.clone(), - ), - "::{".to_string(), - ), - vars_str.clone(), - ), - "};".to_string(), - ) - }); - } - __result - }); - let imported_enums = Rc::new({ - let mut __result = Vec::new(); - for n in top_level.clone().iter().cloned() { - if is_enum_in_summaries( - type_summaries.clone(), - n.clone(), - ) { - __result.push(n); - } - } - __result - }); - let wildcard_enum_lines = Rc::new({ - let mut __result = Vec::new(); - for en in Rc::new({ - let mut __result = Vec::new(); - for en in imported_enums.clone().iter().cloned() { - if ({ - let mut __found = false; - for p in parent_list.clone().iter().cloned() - { - if (p.clone().as_str() - == en.clone().as_str()) - { - __found = true; - break; - } - } - __found - } == false) - { - __result.push(en); - } - } - __result - }) - .iter() - .cloned() - { - __result.push(v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "use crate::".to_string(), - mod_name.clone(), - ), - "::".to_string(), - ), - en.clone(), - ), - "::*;".to_string(), - )); - } - __result - }); - let all_lines = if (main_line.clone().as_str() - != "".to_string().as_str()) - { - v2_rt::concat( - v2_rt::concat( - Rc::new(vec![main_line.clone()]), - Rc::new({ - let mut __result = Vec::new(); - for l in - variant_lines.clone().iter().cloned() - { - if (l.clone().as_str() - != "".to_string().as_str()) - { - __result.push(l); - } - } - __result - }), - ), - wildcard_enum_lines.clone(), - ) - } else { - v2_rt::concat( - Rc::new({ - let mut __result = Vec::new(); - for l in variant_lines.clone().iter().cloned() { - if (l.clone().as_str() - != "".to_string().as_str()) - { - __result.push(l); - } - } - __result - }), - wildcard_enum_lines.clone(), - ) - }; - all_lines.clone().join(&"\n".to_string()) - } - } - } + let names_str = Rc::new({ let mut __result = Vec::new(); for n in top_with_parents.clone().iter().cloned() { __result.push(emit_import_name(&n, registry.clone())); } __result }).join(&", ".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(rust_visibility_prefix(), "use crate::".to_string()), mod_name.clone()), "::{".to_string()), names_str.clone()), "};".to_string()) +} + } else { + "".to_string() + }; +let variant_lines = Rc::new({ let mut __result = Vec::new(); for parent in parent_list.clone().iter().cloned() { __result.push({ + let variants = Rc::new({ let mut __result = Vec::new(); for n in deduped_names.clone().iter().cloned() { if if is_enum_in_summaries(type_summaries.clone(), n.clone()) { + false + } else { + match find_variant_parent(type_summaries.clone(), n.clone(), Rc::new(vec![parent.clone()])) { + Some(_) => true, + None => false, +} + } { __result.push(n); } } __result }); +let vars_str = variants.clone().join(&", ".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("use crate::".to_string(), mod_name.clone()), "::".to_string()), parent.clone()), "::{".to_string()), vars_str.clone()), "};".to_string()) +}); } __result }); +let imported_enums = Rc::new({ let mut __result = Vec::new(); for n in top_level.clone().iter().cloned() { if is_enum_in_summaries(type_summaries.clone(), n.clone()) { __result.push(n); } } __result }); +let wildcard_enum_lines = Rc::new({ let mut __result = Vec::new(); for en in Rc::new({ let mut __result = Vec::new(); for en in imported_enums.clone().iter().cloned() { if ({ let mut __found = false; for p in parent_list.clone().iter().cloned() { if (p.clone().as_str() == en.clone().as_str()) { __found = true; break; } } __found } == false) { __result.push(en); } } __result }).iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("use crate::".to_string(), mod_name.clone()), "::".to_string()), en.clone()), "::*;".to_string())); } __result }); +let all_lines = if (main_line.clone().as_str() != "".to_string().as_str()) { + v2_rt::concat(v2_rt::concat(Rc::new(vec![main_line.clone()]), Rc::new({ let mut __result = Vec::new(); for l in variant_lines.clone().iter().cloned() { if (l.clone().as_str() != "".to_string().as_str()) { __result.push(l); } } __result })), wildcard_enum_lines.clone()) + } else { + v2_rt::concat(Rc::new({ let mut __result = Vec::new(); for l in variant_lines.clone().iter().cloned() { if (l.clone().as_str() != "".to_string().as_str()) { __result.push(l); } } __result }), wildcard_enum_lines.clone()) + }; +all_lines.clone().join(&"\n".to_string()) +} } - }); - } - __result - }); - Rc::new({ - let mut __result = Vec::new(); - for line in import_lines.iter().cloned() { - if (line.clone().as_str() != "".to_string().as_str()) { - __result.push(line); - } +} } - __result - }) - .join(&"\n".to_string()) - } +}); } __result }); +Rc::new({ let mut __result = Vec::new(); for line in import_lines.iter().cloned() { if (line.clone().as_str() != "".to_string().as_str()) { __result.push(line); } } __result }).join(&"\n".to_string()) +} } } pub fn emit_prelude() -> String { { - let use_line = - "use std::collections::HashMap;\nuse std::rc::Rc;\nuse crate::v2_rt;".to_string(); - let wrapper_use = "use crate::NonEmptyVec;\nuse crate::NonEmptyBTreeSet;".to_string(); - v2_rt::concat(v2_rt::concat(use_line, "\n".to_string()), wrapper_use) - } + let use_line = "use std::collections::HashMap;\nuse std::rc::Rc;\nuse crate::v2_rt;".to_string(); +let wrapper_use = "use crate::NonEmptyVec;\nuse crate::NonEmptyBTreeSet;".to_string(); +v2_rt::concat(v2_rt::concat(use_line, "\n".to_string()), wrapper_use) +} } pub fn emit_non_empty_wrappers() -> String { { let vec_wrapper = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("#[derive(Debug, Clone, PartialEq)]\n".to_string(), "pub struct NonEmptyVec(Vec);\n\n".to_string()), "impl NonEmptyVec {\n".to_string()), " pub fn new(items: Vec) -> Result {\n".to_string()), " if items.is_empty() {\n".to_string()), " Err(\"NonEmptyVec requires at least one element\")\n".to_string()), " } else {\n".to_string()), " Ok(Self(items))\n".to_string()), " }\n".to_string()), " }\n\n".to_string()), " pub fn as_slice(&self) -> &[T] {\n".to_string()), " &self.0\n".to_string()), " }\n\n".to_string()), " pub fn into_vec(self) -> Vec {\n".to_string()), " self.0\n".to_string()), " }\n".to_string()), "}".to_string()); - let set_wrapper = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("#[derive(Debug, Clone, PartialEq)]\n".to_string(), "pub struct NonEmptyBTreeSet(std::collections::BTreeSet);\n\n".to_string()), "impl NonEmptyBTreeSet {\n".to_string()), " pub fn new(items: std::collections::BTreeSet) -> Result {\n".to_string()), " if items.is_empty() {\n".to_string()), " Err(\"NonEmptyBTreeSet requires at least one element\")\n".to_string()), " } else {\n".to_string()), " Ok(Self(items))\n".to_string()), " }\n".to_string()), " }\n\n".to_string()), " pub fn as_set(&self) -> &std::collections::BTreeSet {\n".to_string()), " &self.0\n".to_string()), " }\n\n".to_string()), " pub fn into_set(self) -> std::collections::BTreeSet {\n".to_string()), " self.0\n".to_string()), " }\n".to_string()), "}".to_string()); - v2_rt::concat(v2_rt::concat(vec_wrapper, "\n\n".to_string()), set_wrapper) - } +let set_wrapper = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("#[derive(Debug, Clone, PartialEq)]\n".to_string(), "pub struct NonEmptyBTreeSet(std::collections::BTreeSet);\n\n".to_string()), "impl NonEmptyBTreeSet {\n".to_string()), " pub fn new(items: std::collections::BTreeSet) -> Result {\n".to_string()), " if items.is_empty() {\n".to_string()), " Err(\"NonEmptyBTreeSet requires at least one element\")\n".to_string()), " } else {\n".to_string()), " Ok(Self(items))\n".to_string()), " }\n".to_string()), " }\n\n".to_string()), " pub fn as_set(&self) -> &std::collections::BTreeSet {\n".to_string()), " &self.0\n".to_string()), " }\n\n".to_string()), " pub fn into_set(self) -> std::collections::BTreeSet {\n".to_string()), " self.0\n".to_string()), " }\n".to_string()), "}".to_string()); +v2_rt::concat(v2_rt::concat(vec_wrapper, "\n\n".to_string()), set_wrapper) +} } -pub fn emit_typed_item( - item: &Rc, - module_name: String, - registry: &Rc>>, - scope: &Rc, - shared_types: Rc>, - emit_info: &Rc, - wire_contract_item: Option>, - data_items: Rc>>>>, -) -> String { +pub fn emit_typed_item(item: &Rc, module_name: String, registry: &Rc>>, scope: &Rc, shared_types: Rc>, emit_info: &Rc, wire_contract_item: Option>, data_items: Rc>>>>) -> String { { let env = scope.type_env.clone(); - let qualified_name = v2_rt::concat( - v2_rt::concat(module_name, ".".to_string()), - authored_name(env.clone(), item.clone()), - ); - let item_text = authored_name(env.clone(), item.clone()); - if is_type_def_item(&item) { - emit_type_def_from_connective( - &item, - emit_info.recursive_type_set.clone(), - shared_types, - &env, - emit_info.clone(), - &wire_contract_item, - data_items, - ) +let qualified_name = v2_rt::concat(v2_rt::concat(module_name, ".".to_string()), authored_name(env.clone(), item.clone())); +let item_text = authored_name(env.clone(), item.clone()); +if is_type_def_item(&item) { + emit_type_def_from_connective(&item, emit_info.recursive_type_set.clone(), shared_types, &env, emit_info.clone(), &wire_contract_item, data_items) } else { if is_type_alias_item(&item, env.source_indices.clone()) { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - rust_visibility_prefix(), - rust_items().type_alias_keyword.clone(), - ), - " ".to_string(), - ), - item_text, - ), - " = ".to_string(), - ), - render_rust_type( - resolved_type(item.clone()), - shared_types, - env.source_indices.clone(), - ), - ), - ";".to_string(), - ) + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(rust_visibility_prefix(), rust_items().type_alias_keyword.clone()), " ".to_string()), item_text), " = ".to_string()), render_rust_type(resolved_type(item.clone()), shared_types, env.source_indices.clone())), ";".to_string()) } else { if is_type_decl_item(&item, env.source_indices.clone()) { "".to_string() } else { if is_function_item(&item) { { - let fn_movable = match v2_rt::map_get( - &emit_info.ownership_index.clone(), - qualified_name.clone(), - ) { - Some(m) => m.clone(), - None => v2_rt::rc_empty_map::(), - }; - let item_is_tco = is_tco_eligible( - &authored_name(env.clone(), item.clone()), - &item.body.clone().clone().unwrap(), - registry.clone(), - &env.source_indices.clone(), - ); - let fn_read_only = if item_is_tco { + let fn_movable = match v2_rt::map_get(&emit_info.ownership_index.clone(), qualified_name.clone()) { + Some(m) => m.clone(), + None => v2_rt::rc_empty_map::(), +}; +let item_is_tco = is_tco_eligible(&authored_name(env.clone(), item.clone()), &item.body.clone().clone().unwrap(), registry.clone(), &env.source_indices.clone()); +let fn_read_only = if item_is_tco { v2_rt::rc_empty_map::() } else { - match v2_rt::map_get( - &emit_info.read_only_params_index.clone(), - qualified_name.clone(), - ) { - Some(m) => m.clone(), - None => v2_rt::rc_empty_map::(), - } - }; - let fn_emit_info = Rc::new(EmitGraphInfo { - type_summaries: emit_info.type_summaries.clone(), - recursive_type_set: emit_info.recursive_type_set.clone(), - fielded_variants: emit_info.fielded_variants.clone(), - shared_types: emit_info.shared_types.clone(), - ownership_index: emit_info.ownership_index.clone(), - movable: fn_movable, - variant_to_enum: emit_info.variant_to_enum.clone(), - owned_bindings: v2_rt::rc_empty_map::(), - read_only_params_index: emit_info.read_only_params_index.clone(), - read_only_params: fn_read_only, - }); - let is_effectful = match lookup_item( - registry.clone(), - authored_name(env.clone(), item.clone()), - ) { - Some(info) => { - (((info.service_names.clone().len() as i64) > 0) - || ((info.resource_names.clone().len() as i64) > 0)) - } - None => false, + match v2_rt::map_get(&emit_info.read_only_params_index.clone(), qualified_name.clone()) { + Some(m) => m.clone(), + None => v2_rt::rc_empty_map::(), +} }; - if is_effectful { - emit_func_def( - &item_text, - &item.params.clone(), - resolved_type(item.clone()), - &item.uses.clone(), - item.body.clone().clone().unwrap(), - ®istry, - &scope, - &shared_types, - &fn_emit_info, - ) +let fn_emit_info = Rc::new(EmitGraphInfo { + type_summaries: emit_info.type_summaries.clone(), + recursive_type_set: emit_info.recursive_type_set.clone(), + fielded_variants: emit_info.fielded_variants.clone(), + shared_types: emit_info.shared_types.clone(), + ownership_index: emit_info.ownership_index.clone(), + movable: fn_movable, + variant_to_enum: emit_info.variant_to_enum.clone(), + owned_bindings: v2_rt::rc_empty_map::(), + read_only_params_index: emit_info.read_only_params_index.clone(), + read_only_params: fn_read_only, +}); +let is_effectful = match lookup_item(registry.clone(), authored_name(env.clone(), item.clone())) { + Some(info) => (((info.service_names.clone().len() as i64) > 0) || ((info.resource_names.clone().len() as i64) > 0)), + None => false, +}; +if is_effectful { + emit_func_def(&item_text, &item.params.clone(), resolved_type(item.clone()), &item.uses.clone(), item.body.clone().clone().unwrap(), ®istry, &scope, &shared_types, &fn_emit_info) } else { - emit_fn_def( - &item_text, - &item.params.clone(), - resolved_type(item.clone()), - &item.body.clone().clone().unwrap(), - ®istry, - &scope, - &shared_types, - &fn_emit_info, - ) + emit_fn_def(&item_text, &item.params.clone(), resolved_type(item.clone()), &item.body.clone().clone().unwrap(), ®istry, &scope, &shared_types, &fn_emit_info) } - } +} } else { if is_data_def_item(&item) { - emit_data_def( - item_text, - &item.type_annotation.clone().clone().unwrap(), - item.body.clone().clone().unwrap(), - registry.clone(), - &scope, - 0, - &shared_types, - emit_info.clone(), - ) + emit_data_def(item_text, &item.type_annotation.clone().clone().unwrap(), item.body.clone().clone().unwrap(), registry.clone(), &scope, 0, &shared_types, emit_info.clone()) } else { if is_service_def_item(&item) { emit_service_def(&item, registry.clone(), shared_types, &env) @@ -2102,13 +871,7 @@ pub fn emit_typed_item( if is_resource_def_item(&item) { emit_resource_def(&item, shared_types, &env) } else { - v2_rt::concat( - v2_rt::concat( - "compile_error!(\"unhandled item: ".to_string(), - item_text, - ), - "\");".to_string(), - ) + v2_rt::concat(v2_rt::concat("compile_error!(\"unhandled item: ".to_string(), item_text), "\");".to_string()) } } } @@ -2116,172 +879,96 @@ pub fn emit_typed_item( } } } - } +} } -pub fn needs_box_wrapping( - mut n: Rc, - mut recursive_types: Rc>, - mut shared_types: Rc>, - mut source_indices: Rc>>, -) -> bool { +pub fn needs_box_wrapping(mut n: Rc, mut recursive_types: Rc>, mut shared_types: Rc>, mut source_indices: Rc>>) -> bool { loop { if ((n.children.clone().len() as i64) == 0) { let name = authored_name_at(source_indices, &n); - if emit_map_has(shared_types, name.clone()) { +if emit_map_has(shared_types, name.clone()) { break false; - } else { +} else { break emit_map_has(recursive_types, name.clone()); - } - } else { +} +} else { let is_optional = (n.return_cardinality.clone() == Cardinality::CardOptional); - if is_optional { +if is_optional { { let __tco_0 = with_required_cardinality(&n); - n = __tco_0; - continue; - } - } else { +n = __tco_0; +continue; +} +} else { break false; - } - } - } +} +} +} } -pub fn emit_type_params( - params: &Rc>>, - source_indices: Rc>>, -) -> String { +pub fn emit_type_params(params: &Rc>>, source_indices: Rc>>) -> String { if ((params.clone().len() as i64) == 0) { "".to_string() } else { { - let names = Rc::new({ - let mut __result = Vec::new(); - for p in params.clone().iter().cloned() { - __result.push(generic_param_name_at(p.clone(), source_indices.clone())); - } - __result - }); - v2_rt::concat( - v2_rt::concat("<".to_string(), names.join(&", ".to_string())), - ">".to_string(), - ) - } + let names = Rc::new({ let mut __result = Vec::new(); for p in params.clone().iter().cloned() { __result.push(generic_param_name_at(p.clone(), source_indices.clone())); } __result }); +v2_rt::concat(v2_rt::concat("<".to_string(), names.join(&", ".to_string())), ">".to_string()) +} } } pub fn is_function_type_param(param: &Rc) -> bool { { let type_expr = param_node_type_expr(¶m); - let type_expr_is_var = match type_expr.inferred.clone() { - Some(inf) => is_type_variable(inf.clone()), - None => false, - }; - ((type_expr_is_var && (param.name.clone().as_str() != "".to_string().as_str())) - && (param.name.clone().as_str() == type_expr.name.clone().as_str())) - } +let type_expr_is_var = match type_expr.inferred.clone() { + Some(inf) => is_type_variable(inf.clone()), + None => false, +}; +((type_expr_is_var && (param.name.clone().as_str() != "".to_string().as_str())) && (param.name.clone().as_str() == type_expr.name.clone().as_str())) +} } pub fn function_type_params(params: Rc>>) -> Rc>> { - Rc::new({ - let mut __result = Vec::new(); - for p in params.iter().cloned() { - if is_function_type_param(&p) { - __result.push(p); - } - } - __result - }) + Rc::new({ let mut __result = Vec::new(); for p in params.iter().cloned() { if is_function_type_param(&p) { __result.push(p); } } __result }) } pub fn function_value_params(params: Rc>>) -> Rc>> { - Rc::new({ - let mut __result = Vec::new(); - for p in params.iter().cloned() { - if !is_function_type_param(&p) { - __result.push(p); - } - } - __result - }) + Rc::new({ let mut __result = Vec::new(); for p in params.iter().cloned() { if !is_function_type_param(&p) { __result.push(p); } } __result }) } pub fn function_type_params_have_collision(type_params: Rc>>) -> bool { { - let names = Rc::new({ - let mut __result = Vec::new(); - for p in type_params.iter().cloned() { - __result.push(p.name.clone()); - } - __result - }); - ((names.clone().len() as i64) > (unique_strings(names.clone()).len() as i64)) - } + let names = Rc::new({ let mut __result = Vec::new(); for p in type_params.iter().cloned() { __result.push(p.name.clone()); } __result }); +((names.clone().len() as i64) > (unique_strings(names.clone()).len() as i64)) +} } -pub fn emit_type_def_from_connective( - item: &Rc, - recursive_types: Rc>, - shared_types: Rc>, - env: &Rc, - emit_info: Rc, - wire_contract_item: &Option>, - data_items: Rc>>>>, -) -> String { +pub fn emit_type_def_from_connective(item: &Rc, recursive_types: Rc>, shared_types: Rc>, env: &Rc, emit_info: Rc, wire_contract_item: &Option>, data_items: Rc>>>>) -> String { { let type_params = emit_type_params(&item.params.clone(), env.source_indices.clone()); - let item_text = authored_name(env.clone(), item.clone()); - let is_product = is_product_type(item.clone()); - if is_product { - emit_struct_from_children( - &item_text, - type_params, - &item.children.clone(), - recursive_types, - &shared_types, - env.clone(), - emit_info, - ) +let item_text = authored_name(env.clone(), item.clone()); +let is_product = is_product_type(item.clone()); +if is_product { + emit_struct_from_children(&item_text, type_params, &item.children.clone(), recursive_types, &shared_types, env.clone(), emit_info) } else { { let serde_enum_tag = match wire_contract_item.clone() { - Some(_) => resolve_wire_serde_tag_for_coproduct( - wire_contract_item.clone(), - env.source_indices.clone(), - data_items, - ), - None => rust_serde_tag_attr(), - }; - emit_enum_from_children( - &item_text, - &type_params, - &item.children.clone(), - &recursive_types, - &shared_types, - &env, - &serde_enum_tag, - ) - } + Some(_) => resolve_wire_serde_tag_for_coproduct(wire_contract_item.clone(), env.source_indices.clone(), data_items), + None => rust_serde_tag_attr(), +}; +emit_enum_from_children(&item_text, &type_params, &item.children.clone(), &recursive_types, &shared_types, &env, &serde_enum_tag) +} } - } +} } -pub fn emit_struct_from_children( - name: &String, - type_params: String, - children: &Rc>>, - recursive_types: Rc>, - shared_types: &Rc>, - env: Rc, - emit_info: Rc, -) -> String { +pub fn emit_struct_from_children(name: &String, type_params: String, children: &Rc>>, recursive_types: Rc>, shared_types: &Rc>, env: Rc, emit_info: Rc) -> String { { let has_fn_fields = match v2_rt::map_get(&emit_info.type_summaries.clone(), name.clone()) { - Some(ts) => ts.has_fn_fields.clone(), - None => false, - }; - let derives = if has_fn_fields { + Some(ts) => ts.has_fn_fields.clone(), + None => false, +}; +let derives = if has_fn_fields { "#[derive(Clone)]".to_string() } else { if emit_map_has(shared_types.clone(), name.clone()) { @@ -2290,1583 +977,468 @@ pub fn emit_struct_from_children( rust_struct_derives_copy_text() } }; - if ((children.clone().len() as i64) == 0) { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(derives, "\n".to_string()), - rust_visibility_prefix(), - ), - rust_items().struct_keyword.clone(), - ), - " ".to_string(), - ), - name.clone(), - ), - type_params, - ), - ";".to_string(), - ) +if ((children.clone().len() as i64) == 0) { + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(derives, "\n".to_string()), rust_visibility_prefix()), rust_items().struct_keyword.clone()), " ".to_string()), name.clone()), type_params), ";".to_string()) } else { { - let field_lines = Rc::new({ - let mut __result = Vec::new(); - for child in children.clone().iter().cloned() { - __result.push(emit_struct_field_from_child( - &child, - recursive_types.clone(), - &shared_types, - &env, - )); - } - __result - }); - let fields_str = field_lines.join(&"\n".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(derives, "\n".to_string()), - rust_visibility_prefix(), - ), - rust_items().struct_keyword.clone(), - ), - " ".to_string(), - ), - name.clone(), - ), - type_params, - ), - " {\n".to_string(), - ), - fields_str, - ), - "\n}".to_string(), - ) - } + let field_lines = Rc::new({ let mut __result = Vec::new(); for child in children.clone().iter().cloned() { __result.push(emit_struct_field_from_child(&child, recursive_types.clone(), &shared_types, &env)); } __result }); +let fields_str = field_lines.join(&"\n".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(derives, "\n".to_string()), rust_visibility_prefix()), rust_items().struct_keyword.clone()), " ".to_string()), name.clone()), type_params), " {\n".to_string()), fields_str), "\n}".to_string()) +} } - } +} } -pub fn emit_struct_field_from_child( - child: &Rc, - recursive_types: Rc>, - shared_types: &Rc>, - env: &Rc, -) -> String { +pub fn emit_struct_field_from_child(child: &Rc, recursive_types: Rc>, shared_types: &Rc>, env: &Rc) -> String { { let rt_child = resolved_type(child.clone()); - let ty = if ((is_product_type(rt_child.clone()) && (rt_child.ident_span.clone() != None)) - && ((rt_child.children.clone().len() as i64) > 2)) - { +let ty = if ((is_product_type(rt_child.clone()) && (rt_child.ident_span.clone() != None)) && ((rt_child.children.clone().len() as i64) > 2)) { { let rt_child_name = authored_name_at(env.source_indices.clone(), &rt_child); - match lookup_type_by_name(&env, rt_child_name.clone()) { - Some(resolved) => { - if ((resolved.params.clone().len() as i64) > 0) { - { - let base = coerce_primitive_type( - RenderTarget::Rust, - rt_child_name.clone(), - ); - let param_names = Rc::new({ - let mut __result = Vec::new(); - for p in resolved.params.clone().iter().cloned() { - __result.push(generic_param_name_at( - p.clone(), - env.source_indices.clone(), - )); - } - __result - }); - let with_params = v2_rt::concat( - v2_rt::concat( - v2_rt::concat(base, "<".to_string()), - param_names.join(&", ".to_string()), - ), - ">".to_string(), - ); - if emit_map_has(shared_types.clone(), rt_child_name.clone()) { - v2_rt::concat( - v2_rt::concat("Rc<".to_string(), with_params), - ">".to_string(), - ) - } else { - with_params - } - } +match lookup_type_by_name(&env, rt_child_name.clone()) { + Some(resolved) => if ((resolved.params.clone().len() as i64) > 0) { + { + let base = coerce_primitive_type(RenderTarget::Rust, rt_child_name.clone()); +let param_names = Rc::new({ let mut __result = Vec::new(); for p in resolved.params.clone().iter().cloned() { __result.push(generic_param_name_at(p.clone(), env.source_indices.clone())); } __result }); +let with_params = v2_rt::concat(v2_rt::concat(v2_rt::concat(base, "<".to_string()), param_names.join(&", ".to_string())), ">".to_string()); +if emit_map_has(shared_types.clone(), rt_child_name.clone()) { + v2_rt::concat(v2_rt::concat("Rc<".to_string(), with_params), ">".to_string()) } else { - render_rust_type( - rt_child.clone(), - shared_types.clone(), - env.source_indices.clone(), - ) + with_params } - } - None => render_rust_type( - rt_child.clone(), - shared_types.clone(), - env.source_indices.clone(), - ), - } - } +} + } else { + render_rust_type(rt_child.clone(), shared_types.clone(), env.source_indices.clone()) + }, + None => render_rust_type(rt_child.clone(), shared_types.clone(), env.source_indices.clone()), +} +} } else { - render_rust_type( - rt_child.clone(), - shared_types.clone(), - env.source_indices.clone(), - ) + render_rust_type(rt_child.clone(), shared_types.clone(), env.source_indices.clone()) }; - let final_ty = if needs_box_wrapping( - rt_child.clone(), - recursive_types, - shared_types.clone(), - env.source_indices.clone(), - ) { +let final_ty = if needs_box_wrapping(rt_child.clone(), recursive_types, shared_types.clone(), env.source_indices.clone()) { v2_rt::concat(v2_rt::concat("Box<".to_string(), ty), ">".to_string()) } else { ty }; - let rename_attr = match Rc::new({ - let mut __result = Vec::new(); - for p in child.properties.clone().iter().cloned() { - if (field_init_node_name_at(p.clone(), env.source_indices.clone()).as_str() - == "from_key".to_string().as_str()) - { - __result.push(p); - } - } - __result - }) - .first() - .cloned() - { - Some(prop) => match (*field_init_node_value(&prop).expr_data.clone()).clone() { - ExprData::ExprLiteral { value: lv, .. } => match (*lv.clone()).clone() { - LiteralValue::LitStr { value: key, .. } => v2_rt::concat( - v2_rt::concat( - " ".to_string(), - apply_type_template1(rust_serde_rename_template_text(), key.clone()), - ), - "\n".to_string(), - ), - _ => "".to_string(), - }, - _ => "".to_string(), - }, - None => "".to_string(), - }; - let authored = authored_name(env.clone(), child.clone()); - let snake = to_snake(authored.clone()); - let is_reserved = { - let mut __found = false; - for r in language_spec(RenderTarget::Rust) - .reserved_words - .clone() - .keywords - .clone() - .iter() - .cloned() - { - if (r.clone().as_str() == snake.clone().as_str()) { - __found = true; - break; - } - } - __found +let rename_attr = match Rc::new({ let mut __result = Vec::new(); for p in child.properties.clone().iter().cloned() { if (field_init_node_name_at(p.clone(), env.source_indices.clone()).as_str() == "from_key".to_string().as_str()) { __result.push(p); } } __result }).first().cloned() { + Some(prop) => match (*field_init_node_value(&prop).expr_data.clone()).clone() { + ExprData::ExprLiteral { value: lv, .. } => match (*lv.clone()).clone() { + LiteralValue::LitStr { value: key, .. } => v2_rt::concat(v2_rt::concat(" ".to_string(), apply_type_template1(rust_serde_rename_template_text(), key.clone())), "\n".to_string()), + _ => "".to_string(), +}, + _ => "".to_string(), +}, + None => "".to_string(), +}; +let authored = authored_name(env.clone(), child.clone()); +let snake = to_snake(authored.clone()); +let is_reserved = { let mut __found = false; for r in language_spec(RenderTarget::Rust).reserved_words.clone().keywords.clone().iter().cloned() { if (r.clone().as_str() == snake.clone().as_str()) { __found = true; break; } } __found }; +let keyword_rename = if (is_reserved && (rename_attr.clone().as_str() == "".to_string().as_str())) { + v2_rt::concat(v2_rt::concat(" #[serde(rename = \"".to_string(), snake.clone()), "\")]\n".to_string()) + } else { + "".to_string() }; - let keyword_rename = - if (is_reserved && (rename_attr.clone().as_str() == "".to_string().as_str())) { - v2_rt::concat( - v2_rt::concat(" #[serde(rename = \"".to_string(), snake.clone()), - "\")]\n".to_string(), - ) - } else { - "".to_string() - }; - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(keyword_rename, rename_attr.clone()), - " ".to_string(), - ), - rust_visibility_prefix(), - ), - emit_ident(authored.clone(), RenderTarget::Rust), - ), - ": ".to_string(), - ), - final_ty, - ), - ",".to_string(), - ) - } +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(keyword_rename, rename_attr.clone()), " ".to_string()), rust_visibility_prefix()), emit_ident(authored.clone(), RenderTarget::Rust)), ": ".to_string()), final_ty), ",".to_string()) +} } pub fn enum_derives(children: Rc>>) -> String { { - let complex = Rc::new({ - let mut __result = Vec::new(); - for v in children.iter().cloned() { - if ((v.children.clone().len() as i64) > 0) { - __result.push(v); - } - } - __result - }); - match ((complex.len() as i64) == 0) { - true => rust_enum_derives_copy_text(), - false => rust_enum_derives_text(), - } - } + let complex = Rc::new({ let mut __result = Vec::new(); for v in children.iter().cloned() { if ((v.children.clone().len() as i64) > 0) { __result.push(v); } } __result }); +match ((complex.len() as i64) == 0) { + true => rust_enum_derives_copy_text(), + false => rust_enum_derives_text(), +} +} } -pub fn emit_enum_from_children( - name: &String, - type_params: &String, - children: &Rc>>, - recursive_types: &Rc>, - shared_types: &Rc>, - env: &Rc, - serde_enum_tag: &String, -) -> String { +pub fn emit_enum_from_children(name: &String, type_params: &String, children: &Rc>>, recursive_types: &Rc>, shared_types: &Rc>, env: &Rc, serde_enum_tag: &String) -> String { { let derives = enum_derives(children.clone()); - let variant_lines = Rc::new({ - let mut __result = Vec::new(); - for child in children.clone().iter().cloned() { - __result.push(emit_variant_from_child( - &child, - recursive_types.clone(), - shared_types.clone(), - &env, - )); - } - __result - }); - let variants_str = variant_lines.join(&"\n".to_string()); - let tag_line = if (serde_enum_tag.clone().as_str() == "".to_string().as_str()) { +let variant_lines = Rc::new({ let mut __result = Vec::new(); for child in children.clone().iter().cloned() { __result.push(emit_variant_from_child(&child, recursive_types.clone(), shared_types.clone(), &env)); } __result }); +let variants_str = variant_lines.join(&"\n".to_string()); +let tag_line = if (serde_enum_tag.clone().as_str() == "".to_string().as_str()) { "".to_string() } else { v2_rt::concat(serde_enum_tag.clone(), "\n".to_string()) }; - let enum_def = v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(derives, "\n".to_string()), - tag_line, - ), - rust_visibility_prefix(), - ), - rust_items().enum_keyword.clone(), - ), - " ".to_string(), - ), - name.clone(), - ), - type_params.clone(), - ), - " {\n".to_string(), - ), - variants_str, - ), - "\n}".to_string(), - ); - let accessor_impl = emit_enum_shared_accessors( - &name, - &type_params, - &children, - recursive_types.clone(), - shared_types.clone(), - &env, - ); - if (accessor_impl.clone().as_str() == "".to_string().as_str()) { +let enum_def = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(derives, "\n".to_string()), tag_line), rust_visibility_prefix()), rust_items().enum_keyword.clone()), " ".to_string()), name.clone()), type_params.clone()), " {\n".to_string()), variants_str), "\n}".to_string()); +let accessor_impl = emit_enum_shared_accessors(&name, &type_params, &children, recursive_types.clone(), shared_types.clone(), &env); +if (accessor_impl.clone().as_str() == "".to_string().as_str()) { enum_def } else { - v2_rt::concat( - v2_rt::concat(enum_def, "\n".to_string()), - accessor_impl.clone(), - ) + v2_rt::concat(v2_rt::concat(enum_def, "\n".to_string()), accessor_impl.clone()) } - } +} } pub fn find_shared_enum_fields(children: Rc>>, env: Rc) -> Rc> { { - let fielded = Rc::new({ - let mut __result = Vec::new(); - for child in children.iter().cloned() { - if ((child.children.clone().len() as i64) > 0) { - __result.push(child); - } - } - __result - }); - if ((fielded.clone().len() as i64) == 0) { - return Rc::new(vec![]); + let fielded = Rc::new({ let mut __result = Vec::new(); for child in children.iter().cloned() { if ((child.children.clone().len() as i64) > 0) { __result.push(child); } } __result }); +if ((fielded.clone().len() as i64) == 0) { + return Rc::new(vec![]) } - let first_fields = match fielded.clone().first().cloned() { - Some(v) => Rc::new({ - let mut __result = Vec::new(); - for f in v.children.clone().iter().cloned() { - __result.push(authored_name(env.clone(), f.clone())); - } - __result - }), - None => Rc::new(vec![]), - }; - Rc::new({ - let mut __result = Vec::new(); - for fname in first_fields.iter().cloned() { - if { - let mut __all = true; - for variant in fielded.clone().iter().cloned() { - if !({ - let mut __found = false; - for f in variant.children.clone().iter().cloned() { - if (authored_name(env.clone(), f.clone()).as_str() - == fname.clone().as_str()) - { - __found = true; - break; - } - } - __found - }) { - __all = false; - break; - } - } - __all - } { - __result.push(fname); - } - } - __result - }) - } +let first_fields = match fielded.clone().first().cloned() { + Some(v) => Rc::new({ let mut __result = Vec::new(); for f in v.children.clone().iter().cloned() { __result.push(authored_name(env.clone(), f.clone())); } __result }), + None => Rc::new(vec![]), +}; +Rc::new({ let mut __result = Vec::new(); for fname in first_fields.iter().cloned() { if { let mut __all = true; for variant in fielded.clone().iter().cloned() { if !({ let mut __found = false; for f in variant.children.clone().iter().cloned() { if (authored_name(env.clone(), f.clone()).as_str() == fname.clone().as_str()) { __found = true; break; } } __found }) { __all = false; break; } } __all } { __result.push(fname); } } __result }) +} } -pub fn emit_enum_shared_accessors( - name: &String, - type_params: &String, - children: &Rc>>, - recursive_types: Rc>, - shared_types: Rc>, - env: &Rc, -) -> String { +pub fn emit_enum_shared_accessors(name: &String, type_params: &String, children: &Rc>>, recursive_types: Rc>, shared_types: Rc>, env: &Rc) -> String { { let all_shared = find_shared_enum_fields(children.clone(), env.clone()); - if ((all_shared.clone().len() as i64) == 0) { - return "".to_string(); +if ((all_shared.clone().len() as i64) == 0) { + return "".to_string() } - let fielded = Rc::new({ - let mut __result = Vec::new(); - for child in children.clone().iter().cloned() { - if ((child.children.clone().len() as i64) > 0) { - __result.push(child); - } - } - __result - }); - if ((fielded.clone().len() as i64) == 0) { - return "compile_error!(\"enum shared accessor missing fielded variant\")".to_string(); +let fielded = Rc::new({ let mut __result = Vec::new(); for child in children.clone().iter().cloned() { if ((child.children.clone().len() as i64) > 0) { __result.push(child); } } __result }); +if ((fielded.clone().len() as i64) == 0) { + return "compile_error!(\"enum shared accessor missing fielded variant\")".to_string() } - let first_fielded = fielded.clone().first().cloned().clone().unwrap(); - let shared = Rc::new({ - let mut __result = Vec::new(); - for fname in all_shared.clone().iter().cloned() { - if { - let types = Rc::new({ - let mut __result = Vec::new(); - for variant in fielded.clone().iter().cloned() { - __result.push( - match Rc::new({ - let mut __result = Vec::new(); - for f in variant.children.clone().iter().cloned() { - if (authored_name(env.clone(), f.clone()).as_str() - == fname.clone().as_str()) - { - __result.push(f); - } - } - __result - }) - .first() - .cloned() - { - Some(f) => render_rust_type( - resolved_type(f.clone()), - shared_types.clone(), - env.source_indices.clone(), - ), - None => "".to_string(), - }, - ); - } - __result - }); - let first_type = match types.clone().first().cloned() { - Some(t) => t.clone(), - None => "".to_string(), - }; +let first_fielded = fielded.clone().first().cloned().clone().unwrap(); +let shared = Rc::new({ let mut __result = Vec::new(); for fname in all_shared.clone().iter().cloned() { if { + let types = Rc::new({ let mut __result = Vec::new(); for variant in fielded.clone().iter().cloned() { __result.push(match Rc::new({ let mut __result = Vec::new(); for f in variant.children.clone().iter().cloned() { if (authored_name(env.clone(), f.clone()).as_str() == fname.clone().as_str()) { __result.push(f); } } __result }).first().cloned() { + Some(f) => render_rust_type(resolved_type(f.clone()), shared_types.clone(), env.source_indices.clone()), + None => "".to_string(), +}); } __result }); +let first_type = match types.clone().first().cloned() { + Some(t) => t.clone(), + None => "".to_string(), +}; +{ let mut __all = true; for t in types.clone().iter().cloned() { if !((t.clone().as_str() == first_type.clone().as_str())) { __all = false; break; } } __all } +} { __result.push(fname); } } __result }); +if ((shared.clone().len() as i64) == 0) { + return "".to_string() + } +let accessor_fns = Rc::new({ let mut __result = Vec::new(); for fname in shared.clone().iter().cloned() { __result.push({ + let ty = match Rc::new({ let mut __result = Vec::new(); for f in first_fielded.children.clone().iter().cloned() { if (authored_name(env.clone(), f.clone()).as_str() == fname.clone().as_str()) { __result.push(f); } } __result }).first().cloned() { + Some(f) => render_rust_type(resolved_type(f.clone()), shared_types.clone(), env.source_indices.clone()), + None => "compile_error!(\"enum shared accessor missing field metadata\")".to_string(), +}; +let arms = Rc::new({ let mut __result = Vec::new(); for child in children.clone().iter().cloned() { __result.push({ + let child_text = authored_name(env.clone(), child.clone()); +if ((child.children.clone().len() as i64) == 0) { + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" ".to_string(), name.clone()), "::".to_string()), child_text.clone()), " => panic!(\"no ".to_string()), fname.clone()), " on unit variant\"),".to_string()) + } else { { - let mut __all = true; - for t in types.clone().iter().cloned() { - if !(t.clone().as_str() == first_type.clone().as_str()) { - __all = false; - break; - } - } - __all - } - } { - __result.push(fname); + let sharing = language_spec(RenderTarget::Rust).sharing.clone(); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" ".to_string(), name.clone()), "::".to_string()), child_text.clone()), " { ".to_string()), emit_ident(fname.clone(), RenderTarget::Rust)), ": __val, .. } => ".to_string()), apply_type_template1(sharing.clone_value.clone(), "__val".to_string())), ",".to_string()) +} } - } - __result - }); - if ((shared.clone().len() as i64) == 0) { - return "".to_string(); - } - let accessor_fns = Rc::new({ - let mut __result = Vec::new(); - for fname in shared.clone().iter().cloned() { - __result.push({ - let ty = match Rc::new({ - let mut __result = Vec::new(); - for f in first_fielded.children.clone().iter().cloned() { - if (authored_name(env.clone(), f.clone()).as_str() - == fname.clone().as_str()) - { - __result.push(f); - } - } - __result - }) - .first() - .cloned() - { - Some(f) => render_rust_type( - resolved_type(f.clone()), - shared_types.clone(), - env.source_indices.clone(), - ), - None => "compile_error!(\"enum shared accessor missing field metadata\")" - .to_string(), - }; - let arms = Rc::new({ - let mut __result = Vec::new(); - for child in children.clone().iter().cloned() { - __result.push({ - let child_text = authored_name(env.clone(), child.clone()); - if ((child.children.clone().len() as i64) == 0) { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - " ".to_string(), - name.clone(), - ), - "::".to_string(), - ), - child_text.clone(), - ), - " => panic!(\"no ".to_string(), - ), - fname.clone(), - ), - " on unit variant\"),".to_string(), - ) - } else { - { - let sharing = - language_spec(RenderTarget::Rust).sharing.clone(); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - " ".to_string(), - name.clone(), - ), - "::".to_string(), - ), - child_text.clone(), - ), - " { ".to_string(), - ), - emit_ident( - fname.clone(), - RenderTarget::Rust, - ), - ), - ": __val, .. } => ".to_string(), - ), - apply_type_template1( - sharing.clone_value.clone(), - "__val".to_string(), - ), - ), - ",".to_string(), - ) - } - } - }); - } - __result - }); - let arms_str = arms.clone().join(&"\n".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - " pub fn ".to_string(), - emit_ident(fname.clone(), RenderTarget::Rust), - ), - "(&self) -> ".to_string(), - ), - ty.clone(), - ), - " {\n match self {\n".to_string(), - ), - arms_str.clone(), - ), - "\n }\n }".to_string(), - ) - }); - } - __result - }); - let fns_str = accessor_fns.join(&"\n".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("impl".to_string(), type_params.clone()), - " ".to_string(), - ), - name.clone(), - ), - type_params.clone(), - ), - " {\n".to_string(), - ), - fns_str, - ), - "\n}".to_string(), - ) - } +}); } __result }); +let arms_str = arms.clone().join(&"\n".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" pub fn ".to_string(), emit_ident(fname.clone(), RenderTarget::Rust)), "(&self) -> ".to_string()), ty.clone()), " {\n match self {\n".to_string()), arms_str.clone()), "\n }\n }".to_string()) +}); } __result }); +let fns_str = accessor_fns.join(&"\n".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("impl".to_string(), type_params.clone()), " ".to_string()), name.clone()), type_params.clone()), " {\n".to_string()), fns_str), "\n}".to_string()) +} } -pub fn emit_variant_from_child( - child: &Rc, - recursive_types: Rc>, - shared_types: Rc>, - env: &Rc, -) -> String { +pub fn emit_variant_from_child(child: &Rc, recursive_types: Rc>, shared_types: Rc>, env: &Rc) -> String { { let child_text = authored_name(env.clone(), child.clone()); - if ((child.children.clone().len() as i64) == 0) { - v2_rt::concat( - v2_rt::concat(" ".to_string(), child_text), - ",".to_string(), - ) +if ((child.children.clone().len() as i64) == 0) { + v2_rt::concat(v2_rt::concat(" ".to_string(), child_text), ",".to_string()) } else { { - let field_lines = Rc::new({ - let mut __result = Vec::new(); - for f in child.children.clone().iter().cloned() { - __result.push({ - let rt_f = resolved_type(f.clone()); - let ty = render_rust_type( - rt_f.clone(), - shared_types.clone(), - env.source_indices.clone(), - ); - let final_ty = if needs_box_wrapping( - rt_f.clone(), - recursive_types.clone(), - shared_types.clone(), - env.source_indices.clone(), - ) { - v2_rt::concat( - v2_rt::concat("Box<".to_string(), ty.clone()), - ">".to_string(), - ) - } else { - ty.clone() - }; - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - " ".to_string(), - emit_ident( - authored_name(env.clone(), f.clone()), - RenderTarget::Rust, - ), - ), - ": ".to_string(), - ), - final_ty.clone(), - ), - ",".to_string(), - ) - }); - } - __result - }); - let fields_str = field_lines.join(&"\n".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(" ".to_string(), child_text), - " {\n".to_string(), - ), - fields_str, - ), - "\n },".to_string(), - ) - } + let field_lines = Rc::new({ let mut __result = Vec::new(); for f in child.children.clone().iter().cloned() { __result.push({ + let rt_f = resolved_type(f.clone()); +let ty = render_rust_type(rt_f.clone(), shared_types.clone(), env.source_indices.clone()); +let final_ty = if needs_box_wrapping(rt_f.clone(), recursive_types.clone(), shared_types.clone(), env.source_indices.clone()) { + v2_rt::concat(v2_rt::concat("Box<".to_string(), ty.clone()), ">".to_string()) + } else { + ty.clone() + }; +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" ".to_string(), emit_ident(authored_name(env.clone(), f.clone()), RenderTarget::Rust)), ": ".to_string()), final_ty.clone()), ",".to_string()) +}); } __result }); +let fields_str = field_lines.join(&"\n".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" ".to_string(), child_text), " {\n".to_string()), fields_str), "\n },".to_string()) +} } - } +} } -pub fn emit_fn_def( - name: &String, - params: &Rc>>, - inferred: Rc, - body: &Rc, - registry: &Rc>>, - scope: &Rc, - shared_types: &Rc>, - emit_info: &Rc, -) -> String { +pub fn emit_fn_def(name: &String, params: &Rc>>, inferred: Rc, body: &Rc, registry: &Rc>>, scope: &Rc, shared_types: &Rc>, emit_info: &Rc) -> String { { let si = scope.type_env.clone().source_indices.clone(); - let type_params = function_type_params(params.clone()); - let value_params = function_value_params(params.clone()); - if function_type_params_have_collision(type_params.clone()) { - return v2_rt::concat(v2_rt::concat("compile_error!(\"type param name collides with a value param in fn '".to_string(), name.clone()), "' — a value param shares its name with a declared type param; rename the value param or dissolve via ParamKind/params-slot partition\");\n".to_string()); - } - let type_params_str = emit_type_params(&type_params, si.clone()); - let params_str = emit_params( - value_params.clone(), - shared_types.clone(), - si.clone(), - emit_info.read_only_params.clone(), - ); - let ret_str = emit_inferred(inferred, shared_types.clone(), si.clone()); - let body_scope = build_params_scope(&scope, value_params.clone()); - let depth = 0; - let use_tco = is_tco_eligible(&name, &body, registry.clone(), &si); - let needs_stacker = (is_self_recursive(&name, body.clone(), registry.clone(), si.clone()) - && (use_tco.clone() == false)); - if use_tco.clone() { +let type_params = function_type_params(params.clone()); +let value_params = function_value_params(params.clone()); +if function_type_params_have_collision(type_params.clone()) { + return v2_rt::concat(v2_rt::concat("compile_error!(\"type param name collides with a value param in fn '".to_string(), name.clone()), "' — a value param shares its name with a declared type param; rename the value param or dissolve via ParamKind/params-slot partition\");\n".to_string()) + } +let type_params_str = emit_type_params(&type_params, si.clone()); +let params_str = emit_params(value_params.clone(), shared_types.clone(), si.clone(), emit_info.read_only_params.clone()); +let ret_str = emit_inferred(inferred, shared_types.clone(), si.clone()); +let body_scope = build_params_scope(&scope, value_params.clone()); +let depth = 0; +let use_tco = is_tco_eligible(&name, &body, registry.clone(), &si); +let needs_stacker = (is_self_recursive(&name, body.clone(), registry.clone(), si.clone()) && (use_tco.clone() == false)); +if use_tco.clone() { { - let tco_params_str = - emit_tco_params(value_params.clone(), shared_types.clone(), si.clone()); - let body_str = emit_typed_tco_body( - body.clone(), - name.clone(), - value_params.clone(), - registry.clone(), - body_scope, - (depth.clone() + 1), - shared_types.clone(), - emit_info.clone(), - ); - let kw = rust_items().func_keyword.clone(); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - rust_visibility_prefix(), - kw, - ), - " ".to_string(), - ), - emit_ident( - name.clone(), - RenderTarget::Rust, - ), - ), - type_params_str, - ), - "(".to_string(), - ), - tco_params_str, - ), - ")".to_string(), - ), - ret_str, - ), - " {\n".to_string(), - ), - make_indent((depth.clone() + 1)), - ), - body_str, - ), - "\n}".to_string(), - ) - } + let tco_params_str = emit_tco_params(value_params.clone(), shared_types.clone(), si.clone()); +let body_str = emit_typed_tco_body(body.clone(), name.clone(), value_params.clone(), registry.clone(), body_scope, (depth.clone() + 1), shared_types.clone(), emit_info.clone()); +let kw = rust_items().func_keyword.clone(); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(rust_visibility_prefix(), kw), " ".to_string()), emit_ident(name.clone(), RenderTarget::Rust)), type_params_str), "(".to_string()), tco_params_str), ")".to_string()), ret_str), " {\n".to_string()), make_indent((depth.clone() + 1))), body_str), "\n}".to_string()) +} } else { - emit_fn_def_non_tco( - name.clone(), - type_params_str, - params_str, - ret_str, - body.clone(), - registry.clone(), - body_scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - needs_stacker, - ) + emit_fn_def_non_tco(name.clone(), type_params_str, params_str, ret_str, body.clone(), registry.clone(), body_scope, depth.clone(), shared_types.clone(), emit_info.clone(), needs_stacker) } - } +} } -pub fn emit_fn_def_non_tco( - name: String, - type_params_str: String, - params_str: String, - ret_str: String, - body: Rc, - registry: Rc>>, - scope: Rc, - depth: i64, - shared_types: Rc>, - emit_info: Rc, - needs_stacker: bool, -) -> String { +pub fn emit_fn_def_non_tco(name: String, type_params_str: String, params_str: String, ret_str: String, body: Rc, registry: Rc>>, scope: Rc, depth: i64, shared_types: Rc>, emit_info: Rc, needs_stacker: bool) -> String { if needs_stacker { { - let body_str = emit_typed_expr( - body, - registry, - &scope, - (depth.clone() + 2), - shared_types, - emit_info, - 1024, - ); - let kw = rust_items().func_keyword.clone(); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - rust_visibility_prefix( - ), - kw, - ), - " ".to_string(), - ), - emit_ident( - name, - RenderTarget::Rust, - ), - ), - type_params_str, - ), - "(".to_string(), - ), - params_str, - ), - ")".to_string(), - ), - ret_str, - ), - " {\n".to_string(), - ), - make_indent((depth.clone() + 1)), - ), - "stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || {\n" - .to_string(), - ), - make_indent((depth.clone() + 2)), - ), - body_str, - ), - "\n".to_string(), - ), - make_indent((depth.clone() + 1)), - ), - "})\n}".to_string(), - ) - } + let body_str = emit_typed_expr(body, registry, &scope, (depth.clone() + 2), shared_types, emit_info, 1024); +let kw = rust_items().func_keyword.clone(); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(rust_visibility_prefix(), kw), " ".to_string()), emit_ident(name, RenderTarget::Rust)), type_params_str), "(".to_string()), params_str), ")".to_string()), ret_str), " {\n".to_string()), make_indent((depth.clone() + 1))), "stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || {\n".to_string()), make_indent((depth.clone() + 2))), body_str), "\n".to_string()), make_indent((depth.clone() + 1))), "})\n}".to_string()) +} } else { { - let body_str = emit_typed_expr( - body, - registry, - &scope, - (depth.clone() + 1), - shared_types, - emit_info, - 1024, - ); - let kw = rust_items().func_keyword.clone(); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(rust_visibility_prefix(), kw), - " ".to_string(), - ), - emit_ident(name, RenderTarget::Rust), - ), - type_params_str, - ), - "(".to_string(), - ), - params_str, - ), - ")".to_string(), - ), - ret_str, - ), - " {\n".to_string(), - ), - make_indent((depth.clone() + 1)), - ), - body_str, - ), - "\n}".to_string(), - ) - } + let body_str = emit_typed_expr(body, registry, &scope, (depth.clone() + 1), shared_types, emit_info, 1024); +let kw = rust_items().func_keyword.clone(); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(rust_visibility_prefix(), kw), " ".to_string()), emit_ident(name, RenderTarget::Rust)), type_params_str), "(".to_string()), params_str), ")".to_string()), ret_str), " {\n".to_string()), make_indent((depth.clone() + 1))), body_str), "\n}".to_string()) +} } } -pub fn emit_func_def( - name: &String, - params: &Rc>>, - inferred: Rc, - uses: &Rc>>, - body: Rc, - registry: &Rc>>, - scope: &Rc, - shared_types: &Rc>, - emit_info: &Rc, -) -> String { +pub fn emit_func_def(name: &String, params: &Rc>>, inferred: Rc, uses: &Rc>>, body: Rc, registry: &Rc>>, scope: &Rc, shared_types: &Rc>, emit_info: &Rc) -> String { { if ((function_type_params(params.clone()).len() as i64) > 0) { - return v2_rt::concat(v2_rt::concat("compile_error!(\"emit_func_def saw type params in `".to_string(), name.clone()), "` — func/pattern/interface don't route through the generic-fn split today; the parser invariant at parse_block_body_from_prefix has changed. Plumb type_params through this path or dissolve via ParamKind/params-slot partition.\");\n".to_string()); + return v2_rt::concat(v2_rt::concat("compile_error!(\"emit_func_def saw type params in `".to_string(), name.clone()), "` — func/pattern/interface don't route through the generic-fn split today; the parser invariant at parse_block_body_from_prefix has changed. Plumb type_params through this path or dissolve via ParamKind/params-slot partition.\");\n".to_string()) } - let depth = 0; - let service_names = match lookup_item(registry.clone(), name.clone()) { - Some(info) => info.service_names.clone(), - None => Rc::new(vec![]), - }; - let params_str = emit_func_params( - params.clone(), - uses.clone(), - service_names, - shared_types.clone(), - scope.type_env.clone().source_indices.clone(), - emit_info.read_only_params.clone(), - ); - let ret_str = emit_func_inferred( - inferred, - shared_types.clone(), - scope.type_env.clone().source_indices.clone(), - ); - let body_scope = build_params_scope(&scope, params.clone()); - let si = scope.type_env.clone().source_indices.clone(); - let body_scope = uses.clone().iter().cloned().fold( - body_scope.clone(), - |s: Rc, u: Rc| { - extend_scope( - &s, - &resource_use_name_at(u.clone(), si.clone()), - resource_use_resource(&u), - Rc::new(SubValueRelation::SubValueUnknown), - ) - }, - ); - let body_str = emit_func_body( - &body, - ®istry, - &body_scope, - (depth.clone() + 1), - &shared_types, - &emit_info, - ); - let items = rust_items(); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - rust_visibility_prefix(), - items.async_prefix.clone(), - ), - items.func_keyword.clone(), - ), - " ".to_string(), - ), - emit_ident(name.clone(), RenderTarget::Rust), - ), - "(".to_string(), - ), - params_str, - ), - ")".to_string(), - ), - ret_str, - ), - " {\n".to_string(), - ), - make_indent((depth.clone() + 1)), - ), - body_str, - ), - "\n}".to_string(), - ) - } +let depth = 0; +let service_names = match lookup_item(registry.clone(), name.clone()) { + Some(info) => info.service_names.clone(), + None => Rc::new(vec![]), +}; +let params_str = emit_func_params(params.clone(), uses.clone(), service_names, shared_types.clone(), scope.type_env.clone().source_indices.clone(), emit_info.read_only_params.clone()); +let ret_str = emit_func_inferred(inferred, shared_types.clone(), scope.type_env.clone().source_indices.clone()); +let body_scope = build_params_scope(&scope, params.clone()); +let si = scope.type_env.clone().source_indices.clone(); +let body_scope = uses.clone().iter().cloned().fold(body_scope.clone(), |s: Rc, u: Rc| extend_scope(&s, &resource_use_name_at(u.clone(), si.clone()), resource_use_resource(&u), Rc::new(SubValueRelation::SubValueUnknown))); +let body_str = emit_func_body(&body, ®istry, &body_scope, (depth.clone() + 1), &shared_types, &emit_info); +let items = rust_items(); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(rust_visibility_prefix(), items.async_prefix.clone()), items.func_keyword.clone()), " ".to_string()), emit_ident(name.clone(), RenderTarget::Rust)), "(".to_string()), params_str), ")".to_string()), ret_str), " {\n".to_string()), make_indent((depth.clone() + 1))), body_str), "\n}".to_string()) +} } -pub fn emit_func_body( - body: &Rc, - registry: &Rc>>, - scope: &Rc, - depth: i64, - shared_types: &Rc>, - emit_info: &Rc, -) -> String { +pub fn emit_func_body(body: &Rc, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - let si = scope.type_env.clone().source_indices.clone(); - match (*body.expr_data.clone()).clone() { - ExprData::ExprLet => { + { + let si = scope.type_env.clone().source_indices.clone(); +match (*body.expr_data.clone()).clone() { + ExprData::ExprLet => { let n = let_binding_name_at(body.clone(), si); - let v = let_value(body.clone()); - let inner = let_body(body.clone()); - let val_str = emit_typed_expr( - v.clone(), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - let let_line = emit_let_binding(n.clone(), val_str, &RenderTarget::Rust); - let next_scope = extend_scope( - &scope, - &n, - resolved_type(v.clone()), - Rc::new(SubValueRelation::SubValueUnknown), - ); - match inner { - Some(bd) => v2_rt::concat( - v2_rt::concat(let_line, "\n".to_string()), - emit_func_body( - &bd, - ®istry, - &next_scope, - depth.clone(), - &shared_types, - &emit_info, - ), - ), - None => let_line, - } - } - ExprData::ExprBlock => { +let v = let_value(body.clone()); +let inner = let_body(body.clone()); +let val_str = emit_typed_expr(v.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +let let_line = emit_let_binding(n.clone(), val_str, &RenderTarget::Rust); +let next_scope = extend_scope(&scope, &n, resolved_type(v.clone()), Rc::new(SubValueRelation::SubValueUnknown)); +match inner { + Some(bd) => v2_rt::concat(v2_rt::concat(let_line, "\n".to_string()), emit_func_body(&bd, ®istry, &next_scope, depth.clone(), &shared_types, &emit_info)), + None => let_line, +} +}, + ExprData::ExprBlock => { let ss = body.children.clone(); - if ((ss.clone().len() as i64) == 0) { +if ((ss.clone().len() as i64) == 0) { "Ok(())".to_string() } else { { - let init_state = emit_rust_init_block_stmts( - ss.clone(), - Rc::new(vec![]), - scope.clone(), - registry.clone(), - depth.clone(), - shared_types.clone(), - emit_info.clone(), - ); - let last_stmt = ss.clone().last().cloned(); - let last_str = match last_stmt { - Some(s) => match (*s.expr_data.clone()).clone() { - ExprData::ExprReturn => v2_rt::concat( - v2_rt::concat( - "return Ok(".to_string(), - emit_typed_expr( - return_value(s.clone()), - registry.clone(), - &init_state.scope.clone(), - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ), - ), - ")".to_string(), - ), - _ => v2_rt::concat( - v2_rt::concat( - "Ok(".to_string(), - emit_typed_expr( - s.clone(), - registry.clone(), - &init_state.scope.clone(), - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ), - ), - ")".to_string(), - ), - }, - None => "Ok(())".to_string(), - }; - if ((init_state.text.clone().len() as i64) == 0) { + let init_state = emit_rust_init_block_stmts(ss.clone(), Rc::new(vec![]), scope.clone(), registry.clone(), depth.clone(), shared_types.clone(), emit_info.clone()); +let last_stmt = ss.clone().last().cloned(); +let last_str = match last_stmt { + Some(s) => match (*s.expr_data.clone()).clone() { + ExprData::ExprReturn => v2_rt::concat(v2_rt::concat("return Ok(".to_string(), emit_typed_expr(return_value(s.clone()), registry.clone(), &init_state.scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone(), 1024)), ")".to_string()), + _ => v2_rt::concat(v2_rt::concat("Ok(".to_string(), emit_typed_expr(s.clone(), registry.clone(), &init_state.scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone(), 1024)), ")".to_string()), +}, + None => "Ok(())".to_string(), +}; +if ((init_state.text.clone().len() as i64) == 0) { last_str } else { - v2_rt::concat( - v2_rt::concat( - init_state.text.clone().join(&"\n".to_string()), - "\n".to_string(), - ), - last_str, - ) + v2_rt::concat(v2_rt::concat(init_state.text.clone().join(&"\n".to_string()), "\n".to_string()), last_str) } - } +} } - } - ExprData::ExprReturn => v2_rt::concat( - v2_rt::concat( - "return Ok(".to_string(), - emit_typed_expr( - return_value(body.clone()), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ), - ), - ")".to_string(), - ), - _ => v2_rt::concat( - v2_rt::concat( - "Ok(".to_string(), - emit_typed_expr( - body.clone(), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ), - ), - ")".to_string(), - ), - } +}, + ExprData::ExprReturn => v2_rt::concat(v2_rt::concat("return Ok(".to_string(), emit_typed_expr(return_value(body.clone()), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024)), ")".to_string()), + _ => v2_rt::concat(v2_rt::concat("Ok(".to_string(), emit_typed_expr(body.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024)), ")".to_string()), +} +} }) } -pub fn emit_tco_params( - params: Rc>>, - shared_types: Rc>, - source_indices: Rc>>, -) -> String { +pub fn emit_tco_params(params: Rc>>, shared_types: Rc>, source_indices: Rc>>) -> String { { - let strs = Rc::new({ - let mut __result = Vec::new(); - for p in params.iter().cloned() { - __result.push(emit_tco_param(&p, shared_types.clone(), &source_indices)); - } - __result - }); - strs.join(&", ".to_string()) - } + let strs = Rc::new({ let mut __result = Vec::new(); for p in params.iter().cloned() { __result.push(emit_tco_param(&p, shared_types.clone(), &source_indices)); } __result }); +strs.join(&", ".to_string()) +} } -pub fn emit_tco_param( - param: &Rc, - shared_types: Rc>, - source_indices: &Rc>>, -) -> String { +pub fn emit_tco_param(param: &Rc, shared_types: Rc>, source_indices: &Rc>>) -> String { { let n = param_node_type_expr(¶m); - let ty = emit_rust_param_type(&n, &shared_types, &source_indices); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "mut ".to_string(), - emit_ident( - param_node_name_at(param.clone(), source_indices.clone()), - RenderTarget::Rust, - ), - ), - rust_items().param_type_sep.clone(), - ), - ty, - ) - } +let ty = emit_rust_param_type(&n, &shared_types, &source_indices); +v2_rt::concat(v2_rt::concat(v2_rt::concat("mut ".to_string(), emit_ident(param_node_name_at(param.clone(), source_indices.clone()), RenderTarget::Rust)), rust_items().param_type_sep.clone()), ty) +} } -pub fn emit_func_params( - params: Rc>>, - uses: Rc>>, - service_names: Rc>, - shared_types: Rc>, - source_indices: Rc>>, - read_only_params: Rc>, -) -> String { +pub fn emit_func_params(params: Rc>>, uses: Rc>>, service_names: Rc>, shared_types: Rc>, source_indices: Rc>>, read_only_params: Rc>) -> String { { - let param_strs = Rc::new({ - let mut __result = Vec::new(); - for p in params.iter().cloned() { - __result.push(emit_param( - &p, - shared_types.clone(), - &source_indices, - read_only_params.clone(), - )); - } - __result - }); - let resource_strs = Rc::new({ - let mut __result = Vec::new(); - for u in uses.iter().cloned() { - __result.push(v2_rt::concat( - v2_rt::concat( - emit_ident( - resource_use_name_at(u.clone(), source_indices.clone()), - RenderTarget::Rust, - ), - ": &".to_string(), - ), - render_rust_type( - resource_use_resource(&u), - shared_types.clone(), - source_indices.clone(), - ), - )); - } - __result - }); - let service_strs = Rc::new({ - let mut __result = Vec::new(); - for sn in service_names.iter().cloned() { - __result.push(v2_rt::concat( - v2_rt::concat(service_var_name(sn.clone()), ": &".to_string()), - sanitize_service_name(sn.clone()), - )); - } - __result - }); - let all_params = v2_rt::concat(v2_rt::concat(param_strs, resource_strs), service_strs); - all_params.join(&", ".to_string()) - } + let param_strs = Rc::new({ let mut __result = Vec::new(); for p in params.iter().cloned() { __result.push(emit_param(&p, shared_types.clone(), &source_indices, read_only_params.clone())); } __result }); +let resource_strs = Rc::new({ let mut __result = Vec::new(); for u in uses.iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(emit_ident(resource_use_name_at(u.clone(), source_indices.clone()), RenderTarget::Rust), ": &".to_string()), render_rust_type(resource_use_resource(&u), shared_types.clone(), source_indices.clone()))); } __result }); +let service_strs = Rc::new({ let mut __result = Vec::new(); for sn in service_names.iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(service_var_name(sn.clone()), ": &".to_string()), sanitize_service_name(sn.clone()))); } __result }); +let all_params = v2_rt::concat(v2_rt::concat(param_strs, resource_strs), service_strs); +all_params.join(&", ".to_string()) +} +} + +pub fn emit_func_inferred(inferred: Rc, shared_types: Rc>, source_indices: Rc>>) -> String { + v2_rt::concat(v2_rt::concat(" -> Result<".to_string(), render_rust_type(inferred, shared_types, source_indices)), ", Box>".to_string()) } -pub fn emit_func_inferred( - inferred: Rc, - shared_types: Rc>, - source_indices: Rc>>, -) -> String { - v2_rt::concat( - v2_rt::concat( - " -> Result<".to_string(), - render_rust_type(inferred, shared_types, source_indices), - ), - ", Box>".to_string(), - ) -} - -pub fn emit_params( - params: Rc>>, - shared_types: Rc>, - source_indices: Rc>>, - read_only_params: Rc>, -) -> String { +pub fn emit_params(params: Rc>>, shared_types: Rc>, source_indices: Rc>>, read_only_params: Rc>) -> String { { - let strs = Rc::new({ - let mut __result = Vec::new(); - for p in params.iter().cloned() { - __result.push(emit_param( - &p, - shared_types.clone(), - &source_indices, - read_only_params.clone(), - )); - } - __result - }); - strs.join(&", ".to_string()) - } + let strs = Rc::new({ let mut __result = Vec::new(); for p in params.iter().cloned() { __result.push(emit_param(&p, shared_types.clone(), &source_indices, read_only_params.clone())); } __result }); +strs.join(&", ".to_string()) +} } -pub fn emit_rust_param_type( - n: &Rc, - shared_types: &Rc>, - source_indices: &Rc>>, -) -> String { +pub fn emit_rust_param_type(n: &Rc, shared_types: &Rc>, source_indices: &Rc>>) -> String { if ((n.params.clone().len() as i64) > 0) { { - let param_types = Rc::new({ - let mut __result = Vec::new(); - for p in n.params.clone().iter().cloned() { - __result.push(render_rust_type( - param_node_type_expr(&p), - shared_types.clone(), - source_indices.clone(), - )); - } - __result - }); - let param_str = param_types.join(&", ".to_string()); - let ret_str = match n.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - render_rust_type(rt.clone(), shared_types.clone(), source_indices.clone()) - } - _ => "()".to_string(), - }; - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("impl Fn(".to_string(), param_str), - ") -> ".to_string(), - ), - ret_str, - ), - " + Clone".to_string(), - ) - } + let param_types = Rc::new({ let mut __result = Vec::new(); for p in n.params.clone().iter().cloned() { __result.push(render_rust_type(param_node_type_expr(&p), shared_types.clone(), source_indices.clone())); } __result }); +let param_str = param_types.join(&", ".to_string()); +let ret_str = match n.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => render_rust_type(rt.clone(), shared_types.clone(), source_indices.clone()), + _ => "()".to_string(), +}; +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("impl Fn(".to_string(), param_str), ") -> ".to_string()), ret_str), " + Clone".to_string()) +} } else { render_rust_type(n.clone(), shared_types.clone(), source_indices.clone()) } } -pub fn emit_param( - param: &Rc, - shared_types: Rc>, - source_indices: &Rc>>, - read_only_params: Rc>, -) -> String { +pub fn emit_param(param: &Rc, shared_types: Rc>, source_indices: &Rc>>, read_only_params: Rc>) -> String { { let n = param_node_type_expr(¶m); - let ty = emit_rust_param_type(&n, &shared_types, &source_indices); - let pname = param_node_name_at(param.clone(), source_indices.clone()); - let is_callable_param = ((n.params.clone().len() as i64) > 0); - let is_borrowable = ((v2_rt::map_contains_key(&read_only_params, pname.clone()) - && (is_callable_param == false)) - && needs_reference_node(&n, source_indices.clone())); - let final_ty = if is_borrowable { - apply_type_template1( - sharing_for_target(RenderTarget::Rust) - .borrow_param_template - .clone(), - ty, - ) +let ty = emit_rust_param_type(&n, &shared_types, &source_indices); +let pname = param_node_name_at(param.clone(), source_indices.clone()); +let is_callable_param = ((n.params.clone().len() as i64) > 0); +let is_borrowable = ((v2_rt::map_contains_key(&read_only_params, pname.clone()) && (is_callable_param == false)) && needs_reference_node(&n, source_indices.clone())); +let final_ty = if is_borrowable { + apply_type_template1(sharing_for_target(RenderTarget::Rust).borrow_param_template.clone(), ty) } else { ty }; - v2_rt::concat( - v2_rt::concat( - emit_ident(pname.clone(), RenderTarget::Rust), - rust_items().param_type_sep.clone(), - ), - final_ty, - ) - } +v2_rt::concat(v2_rt::concat(emit_ident(pname.clone(), RenderTarget::Rust), rust_items().param_type_sep.clone()), final_ty) +} } -pub fn emit_inferred( - inferred: Rc, - shared_types: Rc>, - source_indices: Rc>>, -) -> String { - v2_rt::concat( - rust_items().return_arrow.clone(), - render_rust_type(inferred, shared_types, source_indices), - ) +pub fn emit_inferred(inferred: Rc, shared_types: Rc>, source_indices: Rc>>) -> String { + v2_rt::concat(rust_items().return_arrow.clone(), render_rust_type(inferred, shared_types, source_indices)) } -pub fn needs_reference_node( - n: &Rc, - source_indices: Rc>>, -) -> bool { - if ((n.connective.clone() != Connective::NoConnective) - || ((n.children.clone().len() as i64) > 0)) - { +pub fn needs_reference_node(n: &Rc, source_indices: Rc>>) -> bool { + if ((n.connective.clone() != Connective::NoConnective) || ((n.children.clone().len() as i64) > 0)) { true } else { { - let is_copy = (is_rust_value_type(n.clone(), source_indices) - || (is_product_type(n.clone()) && ((n.children.clone().len() as i64) == 0))); - (is_copy == false) - } + let is_copy = (is_rust_value_type(n.clone(), source_indices) || (is_product_type(n.clone()) && ((n.children.clone().len() as i64) == 0))); +(is_copy == false) +} } } pub fn is_string_lit_pattern(p: Rc) -> bool { match (*p).clone() { - MatchPattern::LitPattern { value: v, .. } => match (*v.clone()).clone() { - LiteralValue::LitStr { .. } => true, - _ => false, - }, - _ => false, - } + MatchPattern::LitPattern { value: v, .. } => match (*v.clone()).clone() { + LiteralValue::LitStr { .. } => true, + _ => false, +}, + _ => false, +} } -pub fn collect_pattern_string_guards( - mut pattern: Rc, - mut source_indices: Rc>>, -) -> String { +pub fn collect_pattern_string_guards(mut pattern: Rc, mut source_indices: Rc>>) -> String { loop { match (*pattern).clone() { - MatchPattern::VariantPattern { - name: n, - field_bindings: fbs, - .. - } => { - if ((n.clone().as_str() == "Some".to_string().as_str()) - && ((fbs.clone().len() as i64) == 1)) + MatchPattern::VariantPattern { name: n, field_bindings: fbs, .. } => { if ((n.clone().as_str() == "Some".to_string().as_str()) && ((fbs.clone().len() as i64) == 1)) { + match fbs.clone().first().cloned() { + Some(fb) => { let fb_pat = field_binding_pattern(fb.clone()); +if is_string_lit_pattern(fb_pat.clone()) { + match (*fb_pat.clone()).clone() { + MatchPattern::LitPattern { ref value, .. } => { let LiteralValue::LitStr { value: s, .. } = value.as_ref() else { unreachable!() }; break v2_rt::concat("__some_val == ".to_string(), emit_string_literal(s.clone(), "".to_string())); }, + _ => { break "".to_string(); }, +} +} else { { - match fbs.clone().first().cloned() { - Some(fb) => { - let fb_pat = field_binding_pattern(fb.clone()); - if is_string_lit_pattern(fb_pat.clone()) { - match (*fb_pat.clone()).clone() { - MatchPattern::LitPattern { ref value, .. } => { - let LiteralValue::LitStr { value: s, .. } = value.as_ref() - else { - unreachable!() - }; - break v2_rt::concat( - "__some_val == ".to_string(), - emit_string_literal(s.clone(), "".to_string()), - ); - } - _ => { - break "".to_string(); - } - } - } else { - { - let __tco_0 = fb_pat.clone(); - pattern = __tco_0; - continue; - } - } - } - None => { - break "".to_string(); - } - } - } else { - let str_bindings = Rc::new({ - let mut __result = Vec::new(); - for fb in fbs.clone().iter().cloned() { - if is_string_lit_pattern(field_binding_pattern(fb.clone())) { - __result.push(fb); - } - } - __result - }); - let guards = Rc::new({ - let mut __result = Vec::new(); - for fb in str_bindings.iter().cloned() { - __result.push(match (*field_binding_pattern(fb.clone())).clone() { - MatchPattern::LitPattern { ref value, .. } => { - let LiteralValue::LitStr { value: s, .. } = value.as_ref() - else { - unreachable!() - }; - v2_rt::concat( - v2_rt::concat( - emit_ident( - field_binding_name_at( - fb.clone(), - source_indices.clone(), - ), - RenderTarget::Rust, - ), - " == ".to_string(), - ), - emit_string_literal(s.clone(), "".to_string()), - ) - } - _ => "".to_string(), - }); - } - __result - }); - break guards.join(&" && ".to_string()); - } - } - _ => { - break "".to_string(); - } - } - } + let __tco_0 = fb_pat.clone(); +pattern = __tco_0; +continue; +} +} }, + None => { break "".to_string(); }, +} +} else { + let str_bindings = Rc::new({ let mut __result = Vec::new(); for fb in fbs.clone().iter().cloned() { if is_string_lit_pattern(field_binding_pattern(fb.clone())) { __result.push(fb); } } __result }); +let guards = Rc::new({ let mut __result = Vec::new(); for fb in str_bindings.iter().cloned() { __result.push(match (*field_binding_pattern(fb.clone())).clone() { + MatchPattern::LitPattern { ref value, .. } => { let LiteralValue::LitStr { value: s, .. } = value.as_ref() else { unreachable!() }; v2_rt::concat(v2_rt::concat(emit_ident(field_binding_name_at(fb.clone(), source_indices.clone()), RenderTarget::Rust), " == ".to_string()), emit_string_literal(s.clone(), "".to_string())) }, + _ => "".to_string(), +}); } __result }); +break guards.join(&" && ".to_string()); +} }, + _ => { break "".to_string(); }, +} +} } pub fn all_arms_are_string_lit(arms: &Rc>>) -> bool { - ({ - let mut __all = true; - for arm in arms.clone().iter().cloned() { - if !(match (*arm_pattern(arm.clone())).clone() { - MatchPattern::LitPattern { value: v, .. } => match (*v.clone()).clone() { - LiteralValue::LitStr { .. } => true, - _ => false, - }, - MatchPattern::Wildcard => true, - _ => false, - }) { - __all = false; - break; - } - } - __all - } && ((arms.clone().len() as i64) > 0)) + ({ let mut __all = true; for arm in arms.clone().iter().cloned() { if !(match (*arm_pattern(arm.clone())).clone() { + MatchPattern::LitPattern { value: v, .. } => match (*v.clone()).clone() { + LiteralValue::LitStr { .. } => true, + _ => false, +}, + MatchPattern::Wildcard => true, + _ => false, +}) { __all = false; break; } } __all } && ((arms.clone().len() as i64) > 0)) } pub fn has_string_lit_with_bind(arms: &Rc>>) -> bool { { - let has_lit = { - let mut __found = false; - for arm in arms.clone().iter().cloned() { - if match (*arm_pattern(arm.clone())).clone() { - MatchPattern::LitPattern { value: v, .. } => match (*v.clone()).clone() { - LiteralValue::LitStr { .. } => true, - _ => false, - }, - _ => false, - } { - __found = true; - break; - } - } - __found - }; - let has_bind = { - let mut __found = false; - for arm in arms.clone().iter().cloned() { - if match (*arm_pattern(arm.clone())).clone() { - MatchPattern::Bind { .. } => true, - _ => false, - } { - __found = true; - break; - } - } - __found - }; - (has_lit && has_bind) - } + let has_lit = { let mut __found = false; for arm in arms.clone().iter().cloned() { if match (*arm_pattern(arm.clone())).clone() { + MatchPattern::LitPattern { value: v, .. } => match (*v.clone()).clone() { + LiteralValue::LitStr { .. } => true, + _ => false, +}, + _ => false, +} { __found = true; break; } } __found }; +let has_bind = { let mut __found = false; for arm in arms.clone().iter().cloned() { if match (*arm_pattern(arm.clone())).clone() { + MatchPattern::Bind { .. } => true, + _ => false, +} { __found = true; break; } } __found }; +(has_lit && has_bind) +} } -pub fn emit_pattern( - pattern: Rc, - shared_types: Rc>, - scrut_type: String, - source_indices: Rc>>, - emit_info: Rc, -) -> String { +pub fn emit_pattern(pattern: Rc, shared_types: Rc>, scrut_type: String, source_indices: Rc>>, emit_info: Rc) -> String { match (*pattern).clone() { - MatchPattern::Bind { name: n, .. } => emit_ident(n.clone(), RenderTarget::Rust), - MatchPattern::LitPattern { value: v, .. } => rust_literal_for_pattern(v.clone()), - MatchPattern::VariantPattern { - name: n, - parent_enum, - field_bindings: fbs, - .. - } => emit_variant_pattern( - &n, - parent_enum.clone(), - &fbs, - shared_types, - &scrut_type, - source_indices, - &emit_info, - ), - MatchPattern::Wildcard => "_".to_string(), - } + MatchPattern::Bind { name: n, .. } => emit_ident(n.clone(), RenderTarget::Rust), + MatchPattern::LitPattern { value: v, .. } => rust_literal_for_pattern(v.clone()), + MatchPattern::VariantPattern { name: n, parent_enum, field_bindings: fbs, .. } => emit_variant_pattern(&n, parent_enum.clone(), &fbs, shared_types, &scrut_type, source_indices, &emit_info), + MatchPattern::Wildcard => "_".to_string(), +} } -pub fn pattern_parent_enum( - name: &String, - parent_enum: Option, - scrut_type: &String, - type_summaries: Rc>>, -) -> Option { +pub fn pattern_parent_enum(name: &String, parent_enum: Option, scrut_type: &String, type_summaries: Rc>>) -> Option { { - let scrut_is_known_enum = ((scrut_type.clone().as_str() != "".to_string().as_str()) - && is_enum_type_name(scrut_type.clone(), type_summaries)); - if ((name.clone().as_str() == "Some".to_string().as_str()) - || (name.clone().as_str() == "None".to_string().as_str())) - { + let scrut_is_known_enum = ((scrut_type.clone().as_str() != "".to_string().as_str()) && is_enum_type_name(scrut_type.clone(), type_summaries)); +if ((name.clone().as_str() == "Some".to_string().as_str()) || (name.clone().as_str() == "None".to_string().as_str())) { None } else { if scrut_is_known_enum { @@ -3875,201 +1447,112 @@ pub fn pattern_parent_enum( parent_enum } } - } +} } -pub fn emit_variant_pattern( - name: &String, - parent_enum: Option, - field_bindings: &Rc>>, - shared_types: Rc>, - scrut_type: &String, - source_indices: Rc>>, - emit_info: &Rc, -) -> String { +pub fn emit_variant_pattern(name: &String, parent_enum: Option, field_bindings: &Rc>>, shared_types: Rc>, scrut_type: &String, source_indices: Rc>>, emit_info: &Rc) -> String { { - let resolved_parent = if ((name.clone().as_str() == "Some".to_string().as_str()) - || (name.clone().as_str() == "None".to_string().as_str())) - { + let resolved_parent = if ((name.clone().as_str() == "Some".to_string().as_str()) || (name.clone().as_str() == "None".to_string().as_str())) { None } else { - pattern_parent_enum( - &name, - parent_enum, - &scrut_type, - emit_info.type_summaries.clone(), - ) - }; - let qualified = match resolved_parent.clone() { - Some(parent) => v2_rt::concat( - v2_rt::concat(parent.clone(), "::".to_string()), - name.clone(), - ), - None => name.clone(), + pattern_parent_enum(&name, parent_enum, &scrut_type, emit_info.type_summaries.clone()) }; - if ((name.clone().as_str() == "Some".to_string().as_str()) - && ((field_bindings.clone().len() as i64) == 1)) - { +let qualified = match resolved_parent.clone() { + Some(parent) => v2_rt::concat(v2_rt::concat(parent.clone(), "::".to_string()), name.clone()), + None => name.clone(), +}; +if ((name.clone().as_str() == "Some".to_string().as_str()) && ((field_bindings.clone().len() as i64) == 1)) { match field_bindings.clone().first().cloned() { - Some(fb) => { - let fb_pat = field_binding_pattern(fb.clone()); - if is_string_lit_pattern(fb_pat.clone()) { - "Some(ref __some_val)".to_string() - } else { - { - let inner_pat = emit_pattern( - fb_pat.clone(), - shared_types.clone(), - scrut_type.clone(), - source_indices.clone(), - emit_info.clone(), - ); - v2_rt::concat( - v2_rt::concat("Some(".to_string(), inner_pat), - ")".to_string(), - ) - } - } + Some(fb) => { + let fb_pat = field_binding_pattern(fb.clone()); +if is_string_lit_pattern(fb_pat.clone()) { + "Some(ref __some_val)".to_string() + } else { + { + let inner_pat = emit_pattern(fb_pat.clone(), shared_types.clone(), scrut_type.clone(), source_indices.clone(), emit_info.clone()); +v2_rt::concat(v2_rt::concat("Some(".to_string(), inner_pat), ")".to_string()) +} } - None => qualified.clone(), - } +}, + None => qualified.clone(), +} } else { if ((field_bindings.clone().len() as i64) == 0) { { let fielded_key = match resolved_parent.clone() { - Some(parent) => v2_rt::concat( - v2_rt::concat(parent.clone(), "::".to_string()), - name.clone(), - ), - None => name.clone(), - }; - let is_fielded = - match v2_rt::map_get(&emit_info.fielded_variants.clone(), fielded_key) { - Some(true) => true, - _ => match v2_rt::map_get( - &emit_info.fielded_variants.clone(), - qualified.clone(), - ) { - Some(true) => true, - _ => false, - }, - }; - if is_fielded { + Some(parent) => v2_rt::concat(v2_rt::concat(parent.clone(), "::".to_string()), name.clone()), + None => name.clone(), +}; +let is_fielded = match v2_rt::map_get(&emit_info.fielded_variants.clone(), fielded_key) { + Some(true) => true, + _ => match v2_rt::map_get(&emit_info.fielded_variants.clone(), qualified.clone()) { + Some(true) => true, + _ => false, +}, +}; +if is_fielded { v2_rt::concat(qualified.clone(), " { .. }".to_string()) } else { qualified.clone() } - } +} } else { { - let effective_bindings = Rc::new({ - let mut __result = Vec::new(); - for fb in field_bindings.clone().iter().cloned() { - if match (*field_binding_pattern(fb.clone())).clone() { - MatchPattern::Wildcard => false, - _ => true, - } { - __result.push(fb); - } - } - __result - }); - if ((effective_bindings.clone().len() as i64) == 0) { + let effective_bindings = Rc::new({ let mut __result = Vec::new(); for fb in field_bindings.clone().iter().cloned() { if match (*field_binding_pattern(fb.clone())).clone() { + MatchPattern::Wildcard => false, + _ => true, +} { __result.push(fb); } } __result }); +if ((effective_bindings.clone().len() as i64) == 0) { { let fielded_key2 = match resolved_parent.clone() { - Some(parent) => v2_rt::concat( - v2_rt::concat(parent.clone(), "::".to_string()), - name.clone(), - ), - None => name.clone(), - }; - let is_fielded2 = match v2_rt::map_get( - &emit_info.fielded_variants.clone(), - fielded_key2, - ) { - Some(true) => true, - _ => match v2_rt::map_get( - &emit_info.fielded_variants.clone(), - qualified.clone(), - ) { - Some(true) => true, - _ => false, - }, - }; - if is_fielded2 { + Some(parent) => v2_rt::concat(v2_rt::concat(parent.clone(), "::".to_string()), name.clone()), + None => name.clone(), +}; +let is_fielded2 = match v2_rt::map_get(&emit_info.fielded_variants.clone(), fielded_key2) { + Some(true) => true, + _ => match v2_rt::map_get(&emit_info.fielded_variants.clone(), qualified.clone()) { + Some(true) => true, + _ => false, +}, +}; +if is_fielded2 { v2_rt::concat(qualified.clone(), " { .. }".to_string()) } else { qualified.clone() } - } +} } else { { - let binding_strs = Rc::new({ - let mut __result = Vec::new(); - for fb in effective_bindings.clone().iter().cloned() { - __result.push({ - let fb_name = field_binding_name_at( - fb.clone(), - source_indices.clone(), - ); - let fb_pat = field_binding_pattern(fb.clone()); - if is_string_lit_pattern(fb_pat.clone()) { - v2_rt::concat( - "ref ".to_string(), - emit_ident(fb_name.clone(), RenderTarget::Rust), - ) + let binding_strs = Rc::new({ let mut __result = Vec::new(); for fb in effective_bindings.clone().iter().cloned() { __result.push({ + let fb_name = field_binding_name_at(fb.clone(), source_indices.clone()); +let fb_pat = field_binding_pattern(fb.clone()); +if is_string_lit_pattern(fb_pat.clone()) { + v2_rt::concat("ref ".to_string(), emit_ident(fb_name.clone(), RenderTarget::Rust)) + } else { + { + let is_shorthand = match (*fb_pat.clone()).clone() { + MatchPattern::Bind { name: n, .. } => (n.clone().as_str() == fb_name.clone().as_str()), + _ => false, +}; +if is_shorthand.clone() { + emit_ident(fb_name.clone(), RenderTarget::Rust) } else { { - let is_shorthand = match (*fb_pat.clone()).clone() { - MatchPattern::Bind { name: n, .. } => { - (n.clone().as_str() - == fb_name.clone().as_str()) - } - _ => false, - }; - if is_shorthand.clone() { - emit_ident(fb_name.clone(), RenderTarget::Rust) - } else { - { - let pat_str = emit_pattern( - fb_pat.clone(), - shared_types.clone(), - "".to_string(), - source_indices.clone(), - emit_info.clone(), - ); - v2_rt::concat( - v2_rt::concat( - emit_ident( - fb_name.clone(), - RenderTarget::Rust, - ), - ": ".to_string(), - ), - pat_str.clone(), - ) - } - } - } + let pat_str = emit_pattern(fb_pat.clone(), shared_types.clone(), "".to_string(), source_indices.clone(), emit_info.clone()); +v2_rt::concat(v2_rt::concat(emit_ident(fb_name.clone(), RenderTarget::Rust), ": ".to_string()), pat_str.clone()) +} } - }); +} } - __result - }); - let bindings_str = binding_strs.join(&", ".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(qualified.clone(), " { ".to_string()), - bindings_str, - ), - ", .. }".to_string(), - ) - } +}); } __result }); +let bindings_str = binding_strs.join(&", ".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(qualified.clone(), " { ".to_string()), bindings_str), ", .. }".to_string()) +} } - } +} } } - } +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -4088,574 +1571,269 @@ pub struct RcMatchAnalysis { pub fn empty_rc_pattern_analysis() -> Rc { Rc::new(RcPatternAnalysis { - matches_rc_variant: false, - matches_option_rc_variant: false, - needs_rc_pattern: false, - ref_bound_fields: Rc::new(vec![]), - }) + matches_rc_variant: false, + matches_option_rc_variant: false, + needs_rc_pattern: false, + ref_bound_fields: Rc::new(vec![]), +}) } pub fn field_needs_rc_ref(field_name: String, rc_analysis: Rc) -> bool { - { - let mut __found = false; - for name in rc_analysis.ref_bound_fields.clone().iter().cloned() { - if (name.clone().as_str() == field_name.clone().as_str()) { - __found = true; - break; - } - } - __found - } + { let mut __found = false; for name in rc_analysis.ref_bound_fields.clone().iter().cloned() { if (name.clone().as_str() == field_name.clone().as_str()) { __found = true; break; } } __found } } -pub fn analyze_rc_pattern( - pattern: Rc, - scrut_type: String, - shared_types: &Rc>, - emit_info: &Rc, - source_indices: Rc>>, -) -> Rc { - stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || match (*pattern).clone() { - MatchPattern::VariantPattern { - name: n, - parent_enum, - field_bindings: fbs, - .. - } => { - if ((n.clone().as_str() == "Some".to_string().as_str()) - || (n.clone().as_str() == "None".to_string().as_str())) - { - if ((fbs.clone().len() as i64) == 1) { - match fbs.clone().first().cloned() { - Some(fb) => { - let inner = analyze_rc_pattern( - field_binding_pattern(fb.clone()), - "".to_string(), - &shared_types, - &emit_info, - source_indices.clone(), - ); - Rc::new(RcPatternAnalysis { - matches_rc_variant: false, - matches_option_rc_variant: ((n.clone().as_str() - == "Some".to_string().as_str()) - && inner.matches_rc_variant.clone()), - needs_rc_pattern: inner.needs_rc_pattern.clone(), - ref_bound_fields: Rc::new(vec![]), - }) - } - None => empty_rc_pattern_analysis(), - } - } else { - empty_rc_pattern_analysis() - } +pub fn analyze_rc_pattern(pattern: Rc, scrut_type: String, shared_types: &Rc>, emit_info: &Rc, source_indices: Rc>>) -> Rc { + stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { + match (*pattern).clone() { + MatchPattern::VariantPattern { name: n, parent_enum, field_bindings: fbs, .. } => if ((n.clone().as_str() == "Some".to_string().as_str()) || (n.clone().as_str() == "None".to_string().as_str())) { + if ((fbs.clone().len() as i64) == 1) { + match fbs.clone().first().cloned() { + Some(fb) => { + let inner = analyze_rc_pattern(field_binding_pattern(fb.clone()), "".to_string(), &shared_types, &emit_info, source_indices.clone()); +Rc::new(RcPatternAnalysis { + matches_rc_variant: false, + matches_option_rc_variant: ((n.clone().as_str() == "Some".to_string().as_str()) && inner.matches_rc_variant.clone()), + needs_rc_pattern: inner.needs_rc_pattern.clone(), + ref_bound_fields: Rc::new(vec![]), +}) +}, + None => empty_rc_pattern_analysis(), +} } else { - { - let matches_rc_variant = match pattern_parent_enum( - &n, - parent_enum.clone(), - &scrut_type, - emit_info.type_summaries.clone(), - ) { - Some(enum_name) => emit_map_has(shared_types.clone(), enum_name.clone()), - None => false, - }; - let ref_bound_fields = Rc::new({ - let mut __result = Vec::new(); - for fb in fbs.clone().iter().cloned() { - __result.extend( - (*if analyze_rc_pattern( - field_binding_pattern(fb.clone()), - "".to_string(), - &shared_types, - &emit_info, - source_indices.clone(), - ) - .matches_rc_variant - .clone() - { - Rc::new(vec![field_binding_name_at( - fb.clone(), - source_indices.clone(), - )]) - } else { - Rc::new(vec![]) - }) - .iter() - .cloned(), - ); - } - __result - }); - Rc::new(RcPatternAnalysis { - matches_rc_variant: matches_rc_variant, - matches_option_rc_variant: false, - needs_rc_pattern: ((ref_bound_fields.clone().len() as i64) > 0), - ref_bound_fields: ref_bound_fields.clone(), - }) - } + empty_rc_pattern_analysis() } - } - _ => empty_rc_pattern_analysis(), + } else { + { + let matches_rc_variant = match pattern_parent_enum(&n, parent_enum.clone(), &scrut_type, emit_info.type_summaries.clone()) { + Some(enum_name) => emit_map_has(shared_types.clone(), enum_name.clone()), + None => false, +}; +let ref_bound_fields = Rc::new({ let mut __result = Vec::new(); for fb in fbs.clone().iter().cloned() { __result.extend((*if analyze_rc_pattern(field_binding_pattern(fb.clone()), "".to_string(), &shared_types, &emit_info, source_indices.clone()).matches_rc_variant.clone() { + Rc::new(vec![field_binding_name_at(fb.clone(), source_indices.clone())]) + } else { + Rc::new(vec![]) + }).iter().cloned()); } __result }); +Rc::new(RcPatternAnalysis { + matches_rc_variant: matches_rc_variant, + matches_option_rc_variant: false, + needs_rc_pattern: ((ref_bound_fields.clone().len() as i64) > 0), + ref_bound_fields: ref_bound_fields.clone(), +}) +} + }, + _ => empty_rc_pattern_analysis(), +} }) } -pub fn analyze_rc_match( - scrutinee: &Rc, - arms: Rc>>, - scrut_type: String, - shared_types: &Rc>, - emit_info: Rc, - source_indices: &Rc>>, -) -> RcMatchAnalysis { +pub fn analyze_rc_match(scrutinee: &Rc, arms: Rc>>, scrut_type: String, shared_types: &Rc>, emit_info: Rc, source_indices: &Rc>>) -> RcMatchAnalysis { { - let arm_analyses = Rc::new({ - let mut __result = Vec::new(); - for arm in arms.iter().cloned() { - __result.push(analyze_rc_pattern( - arm_pattern(arm.clone()), - scrut_type.clone(), - &shared_types, - &emit_info, - source_indices.clone(), - )); - } - __result - }); - let scrutinee_is_optional = match scrutinee.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - (rt.return_cardinality.clone() == Cardinality::CardOptional) - } - _ => false, - }; - let scrutinee_is_rc_wrapped = match scrutinee.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - if (((rt.children.clone().len() as i64) == 0) && (rt.ident_span.clone() != None)) { - emit_map_has( - shared_types.clone(), - authored_name_at(source_indices.clone(), &rt), - ) - } else { - false - } - } - _ => false, - }; - let arms_want_option = { - let mut __found = false; - for a in arm_analyses.clone().iter().cloned() { - if a.matches_option_rc_variant.clone() { - __found = true; - break; - } - } - __found - }; - let arms_want_deref = { - let mut __found = false; - for a in arm_analyses.clone().iter().cloned() { - if a.matches_rc_variant.clone() { - __found = true; - break; - } - } - __found - }; - RcMatchAnalysis { - needs_option_deref: arms_want_option, - needs_deref: if scrutinee_is_optional { - false - } else { - (scrutinee_is_rc_wrapped || arms_want_deref) - }, - } - } + let arm_analyses = Rc::new({ let mut __result = Vec::new(); for arm in arms.iter().cloned() { __result.push(analyze_rc_pattern(arm_pattern(arm.clone()), scrut_type.clone(), &shared_types, &emit_info, source_indices.clone())); } __result }); +let scrutinee_is_optional = match scrutinee.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => (rt.return_cardinality.clone() == Cardinality::CardOptional), + _ => false, +}; +let scrutinee_is_rc_wrapped = match scrutinee.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => if (((rt.children.clone().len() as i64) == 0) && (rt.ident_span.clone() != None)) { + emit_map_has(shared_types.clone(), authored_name_at(source_indices.clone(), &rt)) + } else { + false + }, + _ => false, +}; +let arms_want_option = { let mut __found = false; for a in arm_analyses.clone().iter().cloned() { if a.matches_option_rc_variant.clone() { __found = true; break; } } __found }; +let arms_want_deref = { let mut __found = false; for a in arm_analyses.clone().iter().cloned() { if a.matches_rc_variant.clone() { __found = true; break; } } __found }; +RcMatchAnalysis { + needs_option_deref: arms_want_option, + needs_deref: if scrutinee_is_optional { + false + } else { + (scrutinee_is_rc_wrapped || arms_want_deref) + }, +} +} } -pub fn emit_pattern_rc_aware( - pattern: Rc, - rc_analysis: Rc, - shared_types: Rc>, - scrut_type: String, - source_indices: Rc>>, - emit_info: Rc, -) -> String { +pub fn emit_pattern_rc_aware(pattern: Rc, rc_analysis: Rc, shared_types: Rc>, scrut_type: String, source_indices: Rc>>, emit_info: Rc) -> String { match (*pattern).clone() { - MatchPattern::Bind { name: n, .. } => emit_ident(n.clone(), RenderTarget::Rust), - MatchPattern::LitPattern { value: v, .. } => rust_literal_for_pattern(v.clone()), - MatchPattern::VariantPattern { - name: n, - parent_enum, - field_bindings: fbs, - .. - } => emit_variant_pattern_rc_aware( - &n, - parent_enum.clone(), - &fbs, - rc_analysis, - &shared_types, - &scrut_type, - &source_indices, - &emit_info, - ), - MatchPattern::Wildcard => "_".to_string(), - } + MatchPattern::Bind { name: n, .. } => emit_ident(n.clone(), RenderTarget::Rust), + MatchPattern::LitPattern { value: v, .. } => rust_literal_for_pattern(v.clone()), + MatchPattern::VariantPattern { name: n, parent_enum, field_bindings: fbs, .. } => emit_variant_pattern_rc_aware(&n, parent_enum.clone(), &fbs, rc_analysis, &shared_types, &scrut_type, &source_indices, &emit_info), + MatchPattern::Wildcard => "_".to_string(), +} } -pub fn emit_variant_pattern_rc_aware( - name: &String, - parent_enum: Option, - field_bindings: &Rc>>, - rc_analysis: Rc, - shared_types: &Rc>, - scrut_type: &String, - source_indices: &Rc>>, - emit_info: &Rc, -) -> String { +pub fn emit_variant_pattern_rc_aware(name: &String, parent_enum: Option, field_bindings: &Rc>>, rc_analysis: Rc, shared_types: &Rc>, scrut_type: &String, source_indices: &Rc>>, emit_info: &Rc) -> String { { - let resolved_parent = if ((name.clone().as_str() == "Some".to_string().as_str()) - || (name.clone().as_str() == "None".to_string().as_str())) - { + let resolved_parent = if ((name.clone().as_str() == "Some".to_string().as_str()) || (name.clone().as_str() == "None".to_string().as_str())) { None } else { - pattern_parent_enum( - &name, - parent_enum, - &scrut_type, - emit_info.type_summaries.clone(), - ) - }; - let qualified = match resolved_parent.clone() { - Some(parent) => v2_rt::concat( - v2_rt::concat(parent.clone(), "::".to_string()), - name.clone(), - ), - None => name.clone(), + pattern_parent_enum(&name, parent_enum, &scrut_type, emit_info.type_summaries.clone()) }; - if ((name.clone().as_str() == "Some".to_string().as_str()) - && ((field_bindings.clone().len() as i64) == 1)) - { +let qualified = match resolved_parent.clone() { + Some(parent) => v2_rt::concat(v2_rt::concat(parent.clone(), "::".to_string()), name.clone()), + None => name.clone(), +}; +if ((name.clone().as_str() == "Some".to_string().as_str()) && ((field_bindings.clone().len() as i64) == 1)) { match field_bindings.clone().first().cloned() { - Some(fb) => { - let fb_pat = field_binding_pattern(fb.clone()); - if is_string_lit_pattern(fb_pat.clone()) { - "Some(ref __some_val)".to_string() - } else { - { - let inner_analysis = analyze_rc_pattern( - fb_pat.clone(), - scrut_type.clone(), - &shared_types, - &emit_info, - source_indices.clone(), - ); - let inner_pat = emit_pattern_rc_aware( - fb_pat.clone(), - inner_analysis.clone(), - shared_types.clone(), - scrut_type.clone(), - source_indices.clone(), - emit_info.clone(), - ); - v2_rt::concat( - v2_rt::concat("Some(".to_string(), inner_pat), - ")".to_string(), - ) - } - } + Some(fb) => { + let fb_pat = field_binding_pattern(fb.clone()); +if is_string_lit_pattern(fb_pat.clone()) { + "Some(ref __some_val)".to_string() + } else { + { + let inner_analysis = analyze_rc_pattern(fb_pat.clone(), scrut_type.clone(), &shared_types, &emit_info, source_indices.clone()); +let inner_pat = emit_pattern_rc_aware(fb_pat.clone(), inner_analysis.clone(), shared_types.clone(), scrut_type.clone(), source_indices.clone(), emit_info.clone()); +v2_rt::concat(v2_rt::concat("Some(".to_string(), inner_pat), ")".to_string()) +} } - None => qualified.clone(), - } +}, + None => qualified.clone(), +} } else { if ((field_bindings.clone().len() as i64) == 0) { { let fielded_key = match resolved_parent.clone() { - Some(parent) => v2_rt::concat( - v2_rt::concat(parent.clone(), "::".to_string()), - name.clone(), - ), - None => name.clone(), - }; - let is_fielded = - match v2_rt::map_get(&emit_info.fielded_variants.clone(), fielded_key) { - Some(true) => true, - _ => match v2_rt::map_get( - &emit_info.fielded_variants.clone(), - qualified.clone(), - ) { - Some(true) => true, - _ => false, - }, - }; - if is_fielded { + Some(parent) => v2_rt::concat(v2_rt::concat(parent.clone(), "::".to_string()), name.clone()), + None => name.clone(), +}; +let is_fielded = match v2_rt::map_get(&emit_info.fielded_variants.clone(), fielded_key) { + Some(true) => true, + _ => match v2_rt::map_get(&emit_info.fielded_variants.clone(), qualified.clone()) { + Some(true) => true, + _ => false, +}, +}; +if is_fielded { v2_rt::concat(qualified.clone(), " { .. }".to_string()) } else { qualified.clone() } - } +} } else { { - let effective_bindings = Rc::new({ - let mut __result = Vec::new(); - for fb in field_bindings.clone().iter().cloned() { - if match (*field_binding_pattern(fb.clone())).clone() { - MatchPattern::Wildcard => false, - _ => true, - } { - __result.push(fb); - } - } - __result - }); - if ((effective_bindings.clone().len() as i64) == 0) { + let effective_bindings = Rc::new({ let mut __result = Vec::new(); for fb in field_bindings.clone().iter().cloned() { if match (*field_binding_pattern(fb.clone())).clone() { + MatchPattern::Wildcard => false, + _ => true, +} { __result.push(fb); } } __result }); +if ((effective_bindings.clone().len() as i64) == 0) { { let fielded_key2 = match resolved_parent.clone() { - Some(parent) => v2_rt::concat( - v2_rt::concat(parent.clone(), "::".to_string()), - name.clone(), - ), - None => name.clone(), - }; - let is_fielded2 = match v2_rt::map_get( - &emit_info.fielded_variants.clone(), - fielded_key2, - ) { - Some(true) => true, - _ => match v2_rt::map_get( - &emit_info.fielded_variants.clone(), - qualified.clone(), - ) { - Some(true) => true, - _ => false, - }, - }; - if is_fielded2 { + Some(parent) => v2_rt::concat(v2_rt::concat(parent.clone(), "::".to_string()), name.clone()), + None => name.clone(), +}; +let is_fielded2 = match v2_rt::map_get(&emit_info.fielded_variants.clone(), fielded_key2) { + Some(true) => true, + _ => match v2_rt::map_get(&emit_info.fielded_variants.clone(), qualified.clone()) { + Some(true) => true, + _ => false, +}, +}; +if is_fielded2 { v2_rt::concat(qualified.clone(), " { .. }".to_string()) } else { qualified.clone() } - } +} } else { { - let binding_strs = Rc::new({ - let mut __result = Vec::new(); - for fb in effective_bindings.clone().iter().cloned() { - __result.push({ - let fb_name = field_binding_name_at( - fb.clone(), - source_indices.clone(), - ); - let fb_pat = field_binding_pattern(fb.clone()); - if is_string_lit_pattern(fb_pat.clone()) { - v2_rt::concat( - "ref ".to_string(), - emit_ident(fb_name.clone(), RenderTarget::Rust), - ) - } else { - if field_needs_rc_ref( - fb_name.clone(), - rc_analysis.clone(), - ) { - v2_rt::concat( - "ref ".to_string(), - emit_ident(fb_name.clone(), RenderTarget::Rust), - ) + let binding_strs = Rc::new({ let mut __result = Vec::new(); for fb in effective_bindings.clone().iter().cloned() { __result.push({ + let fb_name = field_binding_name_at(fb.clone(), source_indices.clone()); +let fb_pat = field_binding_pattern(fb.clone()); +if is_string_lit_pattern(fb_pat.clone()) { + v2_rt::concat("ref ".to_string(), emit_ident(fb_name.clone(), RenderTarget::Rust)) + } else { + if field_needs_rc_ref(fb_name.clone(), rc_analysis.clone()) { + v2_rt::concat("ref ".to_string(), emit_ident(fb_name.clone(), RenderTarget::Rust)) + } else { + { + let is_shorthand = match (*fb_pat.clone()).clone() { + MatchPattern::Bind { name: n, .. } => (n.clone().as_str() == fb_name.clone().as_str()), + _ => false, +}; +if is_shorthand.clone() { + emit_ident(fb_name.clone(), RenderTarget::Rust) } else { { - let is_shorthand = match (*fb_pat.clone()) - .clone() - { - MatchPattern::Bind { name: n, .. } => { - (n.clone().as_str() - == fb_name.clone().as_str()) - } - _ => false, - }; - if is_shorthand.clone() { - emit_ident( - fb_name.clone(), - RenderTarget::Rust, - ) - } else { - { - let inner_analysis = analyze_rc_pattern( - fb_pat.clone(), - "".to_string(), - &shared_types, - &emit_info, - source_indices.clone(), - ); - let pat_str = emit_pattern_rc_aware( - fb_pat.clone(), - inner_analysis.clone(), - shared_types.clone(), - "".to_string(), - source_indices.clone(), - emit_info.clone(), - ); - v2_rt::concat( - v2_rt::concat( - emit_ident( - fb_name.clone(), - RenderTarget::Rust, - ), - ": ".to_string(), - ), - pat_str.clone(), - ) - } - } - } + let inner_analysis = analyze_rc_pattern(fb_pat.clone(), "".to_string(), &shared_types, &emit_info, source_indices.clone()); +let pat_str = emit_pattern_rc_aware(fb_pat.clone(), inner_analysis.clone(), shared_types.clone(), "".to_string(), source_indices.clone(), emit_info.clone()); +v2_rt::concat(v2_rt::concat(emit_ident(fb_name.clone(), RenderTarget::Rust), ": ".to_string()), pat_str.clone()) +} } - } - }); +} + } } - __result - }); - let bindings_str = binding_strs.join(&", ".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(qualified.clone(), " { ".to_string()), - bindings_str, - ), - ", .. }".to_string(), - ) - } +}); } __result }); +let bindings_str = binding_strs.join(&", ".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(qualified.clone(), " { ".to_string()), bindings_str), ", .. }".to_string()) +} } - } +} } } - } +} } -pub fn rc_pattern_preludes( - mut pattern: Rc, - mut rc_analysis: Rc, - mut shared_types: Rc>, - mut source_indices: Rc>>, - mut emit_info: Rc, -) -> String { +pub fn rc_pattern_preludes(mut pattern: Rc, mut rc_analysis: Rc, mut shared_types: Rc>, mut source_indices: Rc>>, mut emit_info: Rc) -> String { loop { match (*pattern).clone() { - MatchPattern::VariantPattern { - name: n, - field_bindings: fbs, - .. - } => { - if ((n.clone().as_str() == "Some".to_string().as_str()) - || (n.clone().as_str() == "None".to_string().as_str())) - { - 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, - &emit_info, - source_indices.clone(), - ); - { - let __tco_0 = fb_pat.clone(); - let __tco_1 = inner_analysis; - pattern = __tco_0; - rc_analysis = __tco_1; - continue; - } - } - None => { - break "".to_string(); - } - } - } else { - break "".to_string(); - } - } else { - let preludes = Rc::new({ - let mut __result = Vec::new(); - for fb in fbs.clone().iter().cloned() { - __result.extend( - (*if field_needs_rc_ref( - field_binding_name_at(fb.clone(), source_indices.clone()), - rc_analysis.clone(), - ) { - Rc::new(vec![v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "let ".to_string(), - emit_pattern( - field_binding_pattern(fb.clone()), - shared_types.clone(), - "".to_string(), - source_indices.clone(), - emit_info.clone(), - ), - ), - " = ".to_string(), - ), - emit_ident( - field_binding_name_at( - fb.clone(), - source_indices.clone(), - ), - RenderTarget::Rust, - ), - ), - ".as_ref() else { unreachable!() };".to_string(), - )]) - } else { - Rc::new(vec![]) - }) - .iter() - .cloned(), - ); - } - __result - }); - break preludes.join(&" ".to_string()); - } - } - _ => { + MatchPattern::VariantPattern { name: n, field_bindings: fbs, .. } => { if ((n.clone().as_str() == "Some".to_string().as_str()) || (n.clone().as_str() == "None".to_string().as_str())) { + 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, &emit_info, source_indices.clone()); +{ + let __tco_0 = fb_pat.clone(); +let __tco_1 = inner_analysis; +pattern = __tco_0; +rc_analysis = __tco_1; +continue; +} }, + None => { break "".to_string(); }, +} +} else { break "".to_string(); - } - } - } +} +} else { + let preludes = Rc::new({ let mut __result = Vec::new(); for fb in fbs.clone().iter().cloned() { __result.extend((*if field_needs_rc_ref(field_binding_name_at(fb.clone(), source_indices.clone()), rc_analysis.clone()) { + Rc::new(vec![v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("let ".to_string(), emit_pattern(field_binding_pattern(fb.clone()), shared_types.clone(), "".to_string(), source_indices.clone(), emit_info.clone())), " = ".to_string()), emit_ident(field_binding_name_at(fb.clone(), source_indices.clone()), RenderTarget::Rust)), ".as_ref() else { unreachable!() };".to_string())]) + } else { + Rc::new(vec![]) + }).iter().cloned()); } __result }); +break preludes.join(&" ".to_string()); +} }, + _ => { break "".to_string(); }, +} +} } -pub fn explicit_record_struct_name( - type_name: Option, - inferred_node: &Rc, - shared_types: Rc>, - source_indices: Rc>>, -) -> Option { +pub fn explicit_record_struct_name(type_name: Option, inferred_node: &Rc, shared_types: Rc>, source_indices: Rc>>) -> Option { { let is_optional = (inferred_node.return_cardinality.clone() == Cardinality::CardOptional); - if is_optional { +if is_optional { { let result = type_name.clone(); - return result; - } +return result +} } - let has_structure = (inferred_node.connective.clone() != Connective::NoConnective); - let n = if ((inferred_node.type_annotation.clone() != None) && has_structure) { +let has_structure = (inferred_node.connective.clone() != Connective::NoConnective); +let n = if ((inferred_node.type_annotation.clone() != None) && has_structure) { match inferred_node.children.clone().first().cloned() { - Some(base) => base.clone(), - None => inferred_node.clone(), - } + Some(base) => base.clone(), + None => inferred_node.clone(), +} } else { inferred_node.clone() }; - let is_product = is_product_type(n.clone()); - let is_coproduct = is_coproduct_type(n.clone()); - let n_is_error = if (n.inferred.clone() != None) { +let is_product = is_product_type(n.clone()); +let is_coproduct = is_coproduct_type(n.clone()); +let n_is_error = if (n.inferred.clone() != None) { is_compiler_error(n.inferred.clone().clone().unwrap()) } else { false }; - let nname = authored_name_at(source_indices, &n); - if (nname.clone().as_str() == "__EmitTypeCacheMiss".to_string().as_str()) { +let nname = authored_name_at(source_indices, &n); +if (nname.clone().as_str() == "__EmitTypeCacheMiss".to_string().as_str()) { type_name.clone() } else { if n_is_error { @@ -4671,9 +1849,7 @@ pub fn explicit_record_struct_name( if is_coproduct { type_name.clone() } else { - if (((n.children.clone().len() as i64) == 0) - && (n.ident_span.clone() != None)) - { + if (((n.children.clone().len() as i64) == 0) && (n.ident_span.clone() != None)) { Some(nname.clone()) } else { type_name.clone() @@ -4682,502 +1858,293 @@ pub fn explicit_record_struct_name( } } } - } +} } -pub fn is_simple_type_node( - n: Rc, - source_indices: Rc>>, -) -> bool { +pub fn is_simple_type_node(n: Rc, source_indices: Rc>>) -> bool { is_rust_value_type(n, source_indices) } -pub fn variant_parent_from_binding_kind( - binding_kind: Option>, -) -> Option { +pub fn variant_parent_from_binding_kind(binding_kind: Option>) -> Option { match binding_kind.as_deref().cloned() { - Some(VarBindingKind::VariantValueBinding { parent_enum, .. }) => Some(parent_enum.clone()), - _ => None, - } + Some(VarBindingKind::VariantValueBinding { parent_enum, .. }) => Some(parent_enum.clone()), + _ => None, +} } pub fn apply_clone(expr: String) -> String { - apply_type_template1( - sharing_for_target(RenderTarget::Rust).clone_value.clone(), - expr, - ) + apply_type_template1(sharing_for_target(RenderTarget::Rust).clone_value.clone(), expr) } pub fn apply_deref_clone(expr: String) -> String { - apply_type_template1( - sharing_for_target(RenderTarget::Rust).deref_clone.clone(), - expr, - ) + apply_type_template1(sharing_for_target(RenderTarget::Rust).deref_clone.clone(), expr) } pub fn apply_field_clone(expr: String, field: String) -> String { - apply_type_template2( - sharing_for_target(RenderTarget::Rust).field_clone.clone(), - expr, - field, - ) + apply_type_template2(sharing_for_target(RenderTarget::Rust).field_clone.clone(), expr, field) } pub fn clone_iterator_suffix() -> String { sharing_for_target(RenderTarget::Rust).clone_suffix.clone() } -pub fn effective_variant_parent( - name: &String, - binding_kind: Option>, - resolved_type: Option>, - emit_info: &Rc, - source_indices: Rc>>, -) -> Option { +pub fn effective_variant_parent(name: &String, binding_kind: Option>, resolved_type: Option>, emit_info: &Rc, source_indices: Rc>>) -> Option { { let cached = match v2_rt::map_get(&emit_info.variant_to_enum.clone(), name.clone()) { - Some(p) => { - if (p.clone().as_str() != "".to_string().as_str()) { - Some(p.clone()) - } else { - None - } + Some(p) => if (p.clone().as_str() != "".to_string().as_str()) { + Some(p.clone()) + } else { + None + }, + None => None, +}; +match cached { + Some(parent) => Some(parent.clone()), + None => match resolved_type.as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => { + let rt_name = authored_name_at(source_indices, &rt); +if (((rt.ident_span.clone() != None) && (rt_name.clone().as_str() != name.clone().as_str())) && variant_belongs_to_enum(emit_info.type_summaries.clone(), name.clone(), rt_name.clone())) { + Some(rt_name.clone()) + } else { + variant_parent_from_binding_kind(binding_kind) } - None => None, - }; - match cached { - Some(parent) => Some(parent.clone()), - None => match resolved_type.as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - let rt_name = authored_name_at(source_indices, &rt); - if (((rt.ident_span.clone() != None) - && (rt_name.clone().as_str() != name.clone().as_str())) - && variant_belongs_to_enum( - emit_info.type_summaries.clone(), - name.clone(), - rt_name.clone(), - )) - { - Some(rt_name.clone()) - } else { - variant_parent_from_binding_kind(binding_kind) - } - } - _ => variant_parent_from_binding_kind(binding_kind), - }, - } - } +}, + _ => variant_parent_from_binding_kind(binding_kind), +}, +} +} } -pub fn emit_var_ref( - name: &String, - binding_kind: &Option>, - resolved_type: &Option>, - shared_types: Rc>, - registry: Rc>>, - emit_info: &Rc, - source_indices: Rc>>, -) -> String { - if ((name.clone().as_str() == "none".to_string().as_str()) - || (name.clone().as_str() == "None".to_string().as_str())) - { +pub fn emit_var_ref(name: &String, binding_kind: &Option>, resolved_type: &Option>, shared_types: Rc>, registry: Rc>>, emit_info: &Rc, source_indices: Rc>>) -> String { + if ((name.clone().as_str() == "none".to_string().as_str()) || (name.clone().as_str() == "None".to_string().as_str())) { emit_keyword("null".to_string(), RenderTarget::Rust) } else { - if ((name.clone().as_str() == "true".to_string().as_str()) - || (name.clone().as_str() == "false".to_string().as_str())) - { + if ((name.clone().as_str() == "true".to_string().as_str()) || (name.clone().as_str() == "false".to_string().as_str())) { emit_keyword(name.clone(), RenderTarget::Rust) } else { { let moves_by_value = emit_map_has(emit_info.movable.clone(), name.clone()); - let sharing = language_spec(RenderTarget::Rust).sharing.clone(); - let variant_parent = effective_variant_parent( - &name, - binding_kind.clone(), - resolved_type.clone(), - &emit_info, - source_indices, - ); - let ref_str = match variant_parent { - Some(enum_name) => { - let qualified = v2_rt::concat( - v2_rt::concat(enum_name.clone(), "::".to_string()), - name.clone(), - ); - if emit_map_has(shared_types, enum_name.clone()) { - v2_rt::concat( - v2_rt::concat("Rc::new(".to_string(), qualified), - ")".to_string(), - ) - } else { - qualified - } +let sharing = language_spec(RenderTarget::Rust).sharing.clone(); +let variant_parent = effective_variant_parent(&name, binding_kind.clone(), resolved_type.clone(), &emit_info, source_indices); +let ref_str = match variant_parent { + Some(enum_name) => { + let qualified = v2_rt::concat(v2_rt::concat(enum_name.clone(), "::".to_string()), name.clone()); +if emit_map_has(shared_types, enum_name.clone()) { + v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), qualified), ")".to_string()) + } else { + qualified } - None => match v2_rt::map_get(®istry, name.clone()) { - Some(info) => { - let is_data = (info.kind.clone() == ItemKind::DataItem); - if is_data { - v2_rt::concat(to_snake(name.clone()), "()".to_string()) - } else { - { - let is_function_value = - match binding_kind.clone().as_deref().cloned() { - Some(VarBindingKind::FunctionValueBinding) => true, - _ => false, - }; - let ident = emit_ident(name.clone(), RenderTarget::Rust); - let ident_str = if is_function_value { - ident - } else { - if moves_by_value { - ident - } else { - match resolved_type.clone() { - Some(_) => apply_type_template1( - sharing.clone_value.clone(), - ident, - ), - _ => ident, - } - } - }; - ident_str - } - } - } - None => { - let ident = emit_ident(name.clone(), RenderTarget::Rust); - let ident_str = if moves_by_value { +}, + None => match v2_rt::map_get(®istry, name.clone()) { + Some(info) => { + let is_data = (info.kind.clone() == ItemKind::DataItem); +if is_data { + v2_rt::concat(to_snake(name.clone()), "()".to_string()) + } else { + { + let is_function_value = match binding_kind.clone().as_deref().cloned() { + Some(VarBindingKind::FunctionValueBinding) => true, + _ => false, +}; +let ident = emit_ident(name.clone(), RenderTarget::Rust); +let ident_str = if is_function_value { ident } else { - match resolved_type.clone() { - Some(_) => { - apply_type_template1(sharing.clone_value.clone(), ident) - } - _ => ident, + if moves_by_value { + ident + } else { + match resolved_type.clone() { + Some(_) => apply_type_template1(sharing.clone_value.clone(), ident), + _ => ident, +} } }; - ident_str - } - }, - }; - ref_str - } +ident_str +} + } +}, + None => { + let ident = emit_ident(name.clone(), RenderTarget::Rust); +let ident_str = if moves_by_value { + ident + } else { + match resolved_type.clone() { + Some(_) => apply_type_template1(sharing.clone_value.clone(), ident), + _ => ident, +} + }; +ident_str +}, +}, +}; +ref_str +} } } } -pub fn emit_typed_expr_base( - texpr: &Rc, - registry: Rc>>, - scope: &Rc, - depth: i64, - shared_types: Rc>, - emit_info: Rc, -) -> String { +pub fn emit_typed_expr_base(texpr: &Rc, registry: Rc>>, scope: &Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { { let si = scope.type_env.clone().source_indices.clone(); - match (*texpr.expr_data.clone()).clone() { - ExprData::ExprVar { binding_kind, .. } => { - let n = expr_var_name_at(texpr.clone(), si.clone()); - if ((n.clone().as_str() == "none".to_string().as_str()) - || (n.clone().as_str() == "None".to_string().as_str())) - { - emit_keyword("null".to_string(), RenderTarget::Rust) +match (*texpr.expr_data.clone()).clone() { + ExprData::ExprVar { binding_kind, .. } => { + let n = expr_var_name_at(texpr.clone(), si.clone()); +if ((n.clone().as_str() == "none".to_string().as_str()) || (n.clone().as_str() == "None".to_string().as_str())) { + emit_keyword("null".to_string(), RenderTarget::Rust) + } else { + if ((n.clone().as_str() == "true".to_string().as_str()) || (n.clone().as_str() == "false".to_string().as_str())) { + emit_keyword(n.clone(), RenderTarget::Rust) } else { - if ((n.clone().as_str() == "true".to_string().as_str()) - || (n.clone().as_str() == "false".to_string().as_str())) { - emit_keyword(n.clone(), RenderTarget::Rust) - } else { - { - let variant_parent = effective_variant_parent( - &n, - binding_kind.clone(), - texpr.inferred.clone(), - &emit_info, - si.clone(), - ); - match variant_parent { - Some(enum_name) => { - let qualified = v2_rt::concat( - v2_rt::concat(enum_name.clone(), "::".to_string()), - n.clone(), - ); - if emit_map_has(shared_types, enum_name.clone()) { - v2_rt::concat( - v2_rt::concat("Rc::new(".to_string(), qualified), - ")".to_string(), - ) - } else { - qualified - } - } - None => match v2_rt::map_get(®istry, n.clone()) { - Some(info) => { - let is_data = (info.kind.clone() == ItemKind::DataItem); - if is_data { - v2_rt::concat(to_snake(n.clone()), "()".to_string()) - } else { - emit_ident(n.clone(), RenderTarget::Rust) - } - } - None => emit_ident(n.clone(), RenderTarget::Rust), - }, + let variant_parent = effective_variant_parent(&n, binding_kind.clone(), texpr.inferred.clone(), &emit_info, si.clone()); +match variant_parent { + Some(enum_name) => { + let qualified = v2_rt::concat(v2_rt::concat(enum_name.clone(), "::".to_string()), n.clone()); +if emit_map_has(shared_types, enum_name.clone()) { + v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), qualified), ")".to_string()) + } else { + qualified } - } - } +}, + None => match v2_rt::map_get(®istry, n.clone()) { + Some(info) => { + let is_data = (info.kind.clone() == ItemKind::DataItem); +if is_data { + v2_rt::concat(to_snake(n.clone()), "()".to_string()) + } else { + emit_ident(n.clone(), RenderTarget::Rust) + } +}, + None => emit_ident(n.clone(), RenderTarget::Rust), +}, +} +} } } - _ => emit_typed_expr( - texpr.clone(), - registry, - &scope, - depth, - shared_types, - emit_info, - 1024, - ), - } - } +}, + _ => emit_typed_expr(texpr.clone(), registry, &scope, depth, shared_types, emit_info, 1024), +} +} } -pub fn emit_typed_field_access( - base: &Rc, - field: &String, - summary: Option>, - registry: &Rc>>, - scope: &Rc, - depth: i64, - shared_types: &Rc>, - emit_info: &Rc, -) -> String { +pub fn emit_typed_field_access(base: &Rc, field: &String, summary: Option>, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { { - let base_str = emit_typed_expr_base( - &base, - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - ); - let base_is_anon_record = match base.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: bt, .. }) => { - let is_product = is_product_type(bt.clone()); - if (is_product && (bt.ident_span.clone() == None)) { - true - } else { - false - } + let base_str = emit_typed_expr_base(&base, registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone()); +let base_is_anon_record = match base.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: bt, .. }) => { + let is_product = is_product_type(bt.clone()); +if (is_product && (bt.ident_span.clone() == None)) { + true + } else { + false } - _ => false, - }; - if base_is_anon_record { +}, + _ => false, +}; +if base_is_anon_record { { let bt = resolved_type(base.clone()); - if ((bt.children.clone().len() as i64) == 1) { - emit_typed_expr( - base.clone(), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ) +if ((bt.children.clone().len() as i64) == 1) { + emit_typed_expr(base.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024) } else { { - let matches = Rc::new({ - let mut __result = Vec::new(); - for pair in Rc::new( - bt.children - .clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - { - if (authored_name_at( - scope.type_env.clone().source_indices.clone(), - &pair.1.clone(), - ) - .as_str() - == field.clone().as_str()) - { - __result.push(pair); - } - } - __result - }); - match matches.first().cloned() { - Some(m) => { - let sharing = language_spec(RenderTarget::Rust).sharing.clone(); - apply_type_template1( - sharing.clone_value.clone(), - v2_rt::concat( - v2_rt::concat(base_str, ".".to_string()), - (m.0.clone()).to_string(), - ), - ) - } - None => v2_rt::concat( - v2_rt::concat( - "compile_error!(\"anonymous record field not found: " - .to_string(), - field.clone(), - ), - "\")".to_string(), - ), - } - } + let matches = Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(bt.children.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { if (authored_name_at(scope.type_env.clone().source_indices.clone(), &pair.1.clone()).as_str() == field.clone().as_str()) { __result.push(pair); } } __result }); +match matches.first().cloned() { + Some(m) => { + let sharing = language_spec(RenderTarget::Rust).sharing.clone(); +apply_type_template1(sharing.clone_value.clone(), v2_rt::concat(v2_rt::concat(base_str, ".".to_string()), (m.0.clone()).to_string())) +}, + None => v2_rt::concat(v2_rt::concat("compile_error!(\"anonymous record field not found: ".to_string(), field.clone()), "\")".to_string()), +} +} } - } +} } else { { let sharing = language_spec(RenderTarget::Rust).sharing.clone(); - match summary { - Some(field_summary) => match field_summary.access_style.clone() { - FieldAccessStyle::TupleFirst => apply_type_template1( - sharing.clone_value.clone(), - v2_rt::concat(base_str, ".0".to_string()), - ), - FieldAccessStyle::TupleSecond => apply_type_template1( - sharing.clone_value.clone(), - v2_rt::concat(base_str, ".1".to_string()), - ), - FieldAccessStyle::OptionalUnwrap => v2_rt::concat( - apply_type_template1(sharing.clone_value.clone(), base_str), - ".unwrap()".to_string(), - ), - FieldAccessStyle::EnumAccessor => v2_rt::concat( - v2_rt::concat( - v2_rt::concat(base_str, ".".to_string()), - emit_ident(field.clone(), RenderTarget::Rust), - ), - "()".to_string(), - ), - FieldAccessStyle::StoredField => { - let base_is_owned = match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let base_name = expr_var_name_at( - base.clone(), - scope.type_env.clone().source_indices.clone(), - ); - emit_map_has(emit_info.owned_bindings.clone(), base_name) - } - _ => false, - }; - if base_is_owned { - v2_rt::concat( - v2_rt::concat(base_str, ".".to_string()), - emit_ident(field.clone(), RenderTarget::Rust), - ) - } else { - apply_type_template1( - sharing.clone_value.clone(), - v2_rt::concat( - v2_rt::concat(base_str, ".".to_string()), - emit_ident(field.clone(), RenderTarget::Rust), - ), - ) - } - } - }, - None => v2_rt::concat( - v2_rt::concat( - "compile_error!(\"field access missing reconcile summary for '" - .to_string(), - field.clone(), - ), - "'\")".to_string(), - ), - } - } +match summary { + Some(field_summary) => match field_summary.access_style.clone() { + FieldAccessStyle::TupleFirst => apply_type_template1(sharing.clone_value.clone(), v2_rt::concat(base_str, ".0".to_string())), + FieldAccessStyle::TupleSecond => apply_type_template1(sharing.clone_value.clone(), v2_rt::concat(base_str, ".1".to_string())), + FieldAccessStyle::OptionalUnwrap => v2_rt::concat(apply_type_template1(sharing.clone_value.clone(), base_str), ".unwrap()".to_string()), + FieldAccessStyle::EnumAccessor => v2_rt::concat(v2_rt::concat(v2_rt::concat(base_str, ".".to_string()), emit_ident(field.clone(), RenderTarget::Rust)), "()".to_string()), + FieldAccessStyle::StoredField => { + let base_is_owned = match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let base_name = expr_var_name_at(base.clone(), scope.type_env.clone().source_indices.clone()); +emit_map_has(emit_info.owned_bindings.clone(), base_name) +}, + _ => false, +}; +if base_is_owned { + v2_rt::concat(v2_rt::concat(base_str, ".".to_string()), emit_ident(field.clone(), RenderTarget::Rust)) + } else { + apply_type_template1(sharing.clone_value.clone(), v2_rt::concat(v2_rt::concat(base_str, ".".to_string()), emit_ident(field.clone(), RenderTarget::Rust))) + } +}, +}, + None => v2_rt::concat(v2_rt::concat("compile_error!(\"field access missing reconcile summary for '".to_string(), field.clone()), "'\")".to_string()), +} +} } - } +} } -pub fn type_needs_rc( - type_node: Rc, - source_indices: Rc>>, -) -> bool { - type_needs_rc_seen( - type_node, - v2_rt::rc_empty_map::(), - source_indices, - ) +pub fn type_needs_rc(type_node: Rc, source_indices: Rc>>) -> bool { + type_needs_rc_seen(type_node, v2_rt::rc_empty_map::(), source_indices) } -pub fn type_needs_rc_seen( - mut type_node: Rc, - mut seen: Rc>, - mut source_indices: Rc>>, -) -> bool { +pub fn type_needs_rc_seen(mut type_node: Rc, mut seen: Rc>, mut source_indices: Rc>>) -> bool { loop { let normed = normalize_access_type_node(type_node); - let is_product = is_product_type(normed.clone()); - let is_coproduct = is_coproduct_type(normed.clone()); - if is_product { +let is_product = is_product_type(normed.clone()); +let is_coproduct = is_coproduct_type(normed.clone()); +if is_product { break true; - } else { +} else { if is_coproduct { - break { - let mut __found = false; - for child in normed.children.clone().iter().cloned() { - if ((child.children.clone().len() as i64) > 0) { - __found = true; - break; - } - } - __found - }; - } else { + break { let mut __found = false; for child in normed.children.clone().iter().cloned() { if ((child.children.clone().len() as i64) > 0) { __found = true; break; } } __found }; +} else { let canonical = authored_name_at(source_indices.clone(), &normed); - if (normed.inferred.clone() != None) { +if (normed.inferred.clone() != None) { let next_seen = if (canonical.clone().as_str() == "".to_string().as_str()) { seen.clone() } else { v2_rt::rc_map_insert(seen.clone(), canonical.clone(), true) }; - { +{ let __tco_0 = resolved_type(normed.clone()); - let __tco_1 = next_seen; - type_node = __tco_0; - seen = __tco_1; - continue; - } - } else { - if ((canonical.clone().as_str() != "".to_string().as_str()) - && emit_map_has(seen.clone(), canonical.clone())) - { +let __tco_1 = next_seen; +type_node = __tco_0; +seen = __tco_1; +continue; +} +} else { + if ((canonical.clone().as_str() != "".to_string().as_str()) && emit_map_has(seen.clone(), canonical.clone())) { break false; - } else { +} else { let next_seen = if (canonical.clone().as_str() == "".to_string().as_str()) { seen.clone() } else { v2_rt::rc_map_insert(seen.clone(), canonical.clone(), true) }; - let has_structure = (normed.connective.clone() != Connective::NoConnective); - if (!has_structure && ((normed.children.clone().len() as i64) == 0)) { +let has_structure = (normed.connective.clone() != Connective::NoConnective); +if (!has_structure && ((normed.children.clone().len() as i64) == 0)) { break false; - } else { +} else { { let __tco_0 = normed.clone(); - let __tco_1 = next_seen; - type_node = __tco_0; - seen = __tco_1; - continue; - } - } - } - } - } - } - } +let __tco_1 = next_seen; +type_node = __tco_0; +seen = __tco_1; +continue; +} +} +} +} +} +} +} } pub fn rust_runtime_bridge_passes_receiver_by_ref(function_name: String) -> bool { @@ -5186,3338 +2153,1228 @@ pub fn rust_runtime_bridge_passes_receiver_by_ref(function_name: String) -> bool pub fn rust_runtime_bridge_name(function_name: String) -> String { match v2_rt::map_get(&rt_bridge_function_names(), function_name.clone()) { - Some(runtime_name) => runtime_name.clone(), - None => function_name.clone(), - } + Some(runtime_name) => runtime_name.clone(), + None => function_name.clone(), +} } -pub fn rust_empty_map_value_type_str( - map_type: Rc, - shared_types: Rc>, - source_indices: Rc>>, -) -> String { +pub fn rust_empty_map_value_type_str(map_type: Rc, shared_types: Rc>, source_indices: Rc>>) -> String { match map_type.children.clone().get(1 as usize).cloned() { - Some(value_child) => { - let rendered = - render_rust_type(child_type_node(&value_child), shared_types, source_indices); - if (rendered.clone().as_str() == "".to_string().as_str()) { - "".to_string() - } else { - rendered.clone() - } + Some(value_child) => { + let rendered = render_rust_type(child_type_node(&value_child), shared_types, source_indices); +if (rendered.clone().as_str() == "".to_string().as_str()) { + "".to_string() + } else { + rendered.clone() } - None => "".to_string(), - } +}, + None => "".to_string(), +} } -pub fn rust_empty_map_kv_type_str( - map_type: &Rc, - shared_types: &Rc>, - source_indices: &Rc>>, -) -> String { +pub fn rust_empty_map_kv_type_str(map_type: &Rc, shared_types: &Rc>, source_indices: &Rc>>) -> String { { let key_str = match map_type.children.clone().first().cloned() { - Some(key_child) => render_rust_type( - child_type_node(&key_child), - shared_types.clone(), - source_indices.clone(), - ), - None => "".to_string(), - }; - let val_str = rust_empty_map_value_type_str( - map_type.clone(), - shared_types.clone(), - source_indices.clone(), - ); - if ((key_str.clone().as_str() != "".to_string().as_str()) - && (val_str.clone().as_str() != "".to_string().as_str())) - { - v2_rt::concat( - v2_rt::concat(key_str.clone(), ", ".to_string()), - val_str.clone(), - ) + Some(key_child) => render_rust_type(child_type_node(&key_child), shared_types.clone(), source_indices.clone()), + None => "".to_string(), +}; +let val_str = rust_empty_map_value_type_str(map_type.clone(), shared_types.clone(), source_indices.clone()); +if ((key_str.clone().as_str() != "".to_string().as_str()) && (val_str.clone().as_str() != "".to_string().as_str())) { + v2_rt::concat(v2_rt::concat(key_str.clone(), ", ".to_string()), val_str.clone()) } else { "".to_string() } - } +} } pub fn rust_runtime_bridge_wraps_collection_result_in_rc(function_name: &String) -> bool { - (v2_rt::map_contains_key(&rt_wraps_result(), function_name.clone()) - || v2_rt::map_contains_key(&rust_method_wraps_result(), function_name.clone())) + (v2_rt::map_contains_key(&rt_wraps_result(), function_name.clone()) || v2_rt::map_contains_key(&rust_method_wraps_result(), function_name.clone())) } -pub fn rust_runtime_bridge_collection_result_needs_rc_elements( - function_name: String, - result_type: Option>, -) -> bool { +pub fn rust_runtime_bridge_collection_result_needs_rc_elements(function_name: String, result_type: Option>) -> bool { false } -pub fn rust_wrap_runtime_collection_result( - call_str: String, - function_name: &String, - result_type: Option>, -) -> String { +pub fn rust_wrap_runtime_collection_result(call_str: String, function_name: &String, result_type: Option>) -> String { if rust_runtime_bridge_wraps_collection_result_in_rc(&function_name) { - if rust_runtime_bridge_collection_result_needs_rc_elements( - function_name.clone(), - result_type, - ) { - v2_rt::concat( - v2_rt::concat("Rc::new((".to_string(), call_str), - ").into_iter().map(Rc::new).collect::>())".to_string(), - ) - } else { - v2_rt::concat( - v2_rt::concat("Rc::new(".to_string(), call_str), - ")".to_string(), - ) + if rust_runtime_bridge_collection_result_needs_rc_elements(function_name.clone(), result_type) { + v2_rt::concat(v2_rt::concat("Rc::new((".to_string(), call_str), ").into_iter().map(Rc::new).collect::>())".to_string()) + } else { + v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), call_str), ")".to_string()) } } else { call_str } } -pub fn emit_rust_expr_var( - expr: &Rc, - registry: Rc>>, - shared_types: Rc>, - emit_info: Rc, - source_indices: &Rc>>, -) -> String { +pub fn emit_rust_expr_var(expr: &Rc, registry: Rc>>, shared_types: Rc>, emit_info: Rc, source_indices: &Rc>>) -> String { match (*expr.expr_data.clone()).clone() { - ExprData::ExprVar { binding_kind, .. } => { - let n = expr_var_name_at(expr.clone(), source_indices.clone()); - emit_var_ref( - &n, - &binding_kind, - &expr.inferred.clone(), - shared_types, - registry, - &emit_info, - source_indices.clone(), - ) - } - _ => emit_error_expr( - "emit_rust_expr_var expected ExprVar".to_string(), - RenderTarget::Rust, - ), - } + ExprData::ExprVar { binding_kind, .. } => { + let n = expr_var_name_at(expr.clone(), source_indices.clone()); +emit_var_ref(&n, &binding_kind, &expr.inferred.clone(), shared_types, registry, &emit_info, source_indices.clone()) +}, + _ => emit_error_expr("emit_rust_expr_var expected ExprVar".to_string(), RenderTarget::Rust), +} } -pub fn emit_rust_expr_field_access( - expr: &Rc, - registry: Rc>>, - scope: &Rc, - depth: i64, - shared_types: Rc>, - emit_info: Rc, -) -> String { +pub fn emit_rust_expr_field_access(expr: &Rc, registry: Rc>>, scope: &Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { { let si = scope.type_env.clone().source_indices.clone(); - match (*expr.expr_data.clone()).clone() { - ExprData::ExprFieldAccess { summary, .. } => { - let f = field_access_field_at(expr.clone(), si); - let b = field_access_base(expr.clone()); - if is_typed_service_call_receiver( - &expr, - scope.type_env.clone().source_indices.clone(), - ) { - match extract_typed_service_name( - &expr, - &scope.type_env.clone().source_indices.clone(), - ) { - Some(svc_name) => service_var_name(svc_name.clone()), - None => emit_typed_field_access( - &b, - &f, - summary.clone(), - ®istry, - &scope, - depth, - &shared_types, - &emit_info, - ), - } - } else { - emit_typed_field_access( - &b, - &f, - summary.clone(), - ®istry, - &scope, - depth, - &shared_types, - &emit_info, - ) - } +match (*expr.expr_data.clone()).clone() { + ExprData::ExprFieldAccess { summary, .. } => { + let f = field_access_field_at(expr.clone(), si); +let b = field_access_base(expr.clone()); +if is_typed_service_call_receiver(&expr, scope.type_env.clone().source_indices.clone()) { + match extract_typed_service_name(&expr, &scope.type_env.clone().source_indices.clone()) { + Some(svc_name) => service_var_name(svc_name.clone()), + None => emit_typed_field_access(&b, &f, summary.clone(), ®istry, &scope, depth, &shared_types, &emit_info), +} + } else { + emit_typed_field_access(&b, &f, summary.clone(), ®istry, &scope, depth, &shared_types, &emit_info) } - _ => emit_error_expr( - "emit_rust_expr_field_access expected ExprFieldAccess".to_string(), - RenderTarget::Rust, - ), - } - } +}, + _ => emit_error_expr("emit_rust_expr_field_access expected ExprFieldAccess".to_string(), RenderTarget::Rust), +} +} } -pub fn emit_rust_expr_call( - expr: &Rc, - registry: Rc>>, - scope: &Rc, - depth: i64, - shared_types: Rc>, - emit_info: Rc, -) -> String { +pub fn emit_rust_expr_call(expr: &Rc, registry: Rc>>, scope: &Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { match (*expr.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { - let f = expr_call_func_at(expr.clone(), scope.type_env.clone().source_indices.clone()); - emit_typed_call_expr( - &f, - expr.children.clone(), - expr.inferred.clone(), - registry, - scope.clone(), - depth, - shared_types, - emit_info, - ) - } - _ => emit_error_expr( - "emit_rust_expr_call expected ExprCall".to_string(), - RenderTarget::Rust, - ), - } + ExprData::ExprCall { .. } => { + let f = expr_call_func_at(expr.clone(), scope.type_env.clone().source_indices.clone()); +emit_typed_call_expr(&f, expr.children.clone(), expr.inferred.clone(), registry, scope.clone(), depth, shared_types, emit_info) +}, + _ => emit_error_expr("emit_rust_expr_call expected ExprCall".to_string(), RenderTarget::Rust), +} } -pub fn emit_rust_expr_method_call( - expr: &Rc, - registry: Rc>>, - scope: &Rc, - depth: i64, - shared_types: Rc>, - emit_info: Rc, -) -> String { +pub fn emit_rust_expr_method_call(expr: &Rc, registry: Rc>>, scope: &Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { match (*expr.expr_data.clone()).clone() { - ExprData::ExprMethodCall { - method_semantics, .. - } => { - let r = method_receiver(expr.clone()); - let a = method_arg_nodes(expr.clone()); - let m = - expr_method_name_at(expr.clone(), scope.type_env.clone().source_indices.clone()); - emit_typed_method_call( - expr.clone(), - &r, - m, - &a, - expr.inferred.clone(), - &method_semantics, - ®istry, - &scope, - depth, - &shared_types, - &emit_info, - ) - } - _ => emit_error_expr( - "emit_rust_expr_method_call expected ExprMethodCall".to_string(), - RenderTarget::Rust, - ), - } + ExprData::ExprMethodCall { method_semantics, .. } => { + let r = method_receiver(expr.clone()); +let a = method_arg_nodes(expr.clone()); +let m = expr_method_name_at(expr.clone(), scope.type_env.clone().source_indices.clone()); +emit_typed_method_call(expr.clone(), &r, m, &a, expr.inferred.clone(), &method_semantics, ®istry, &scope, depth, &shared_types, &emit_info) +}, + _ => emit_error_expr("emit_rust_expr_method_call expected ExprMethodCall".to_string(), RenderTarget::Rust), +} } -pub fn emit_rust_expr_match( - expr: &Rc, - registry: Rc>>, - scope: Rc, - depth: i64, - shared_types: Rc>, - emit_info: Rc, -) -> String { +pub fn emit_rust_expr_match(expr: &Rc, registry: Rc>>, scope: Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { match (*expr.expr_data.clone()).clone() { - ExprData::ExprMatch => { - let s = match_scrutinee(expr.clone()); - let arm_list = match_arm_nodes(expr.clone()); - emit_typed_match( - &s, - &arm_list, - ®istry, - &scope, - depth, - &shared_types, - &emit_info, - ) - } - _ => emit_error_expr( - "emit_rust_expr_match expected ExprMatch".to_string(), - RenderTarget::Rust, - ), - } + ExprData::ExprMatch => { + let s = match_scrutinee(expr.clone()); +let arm_list = match_arm_nodes(expr.clone()); +emit_typed_match(&s, &arm_list, ®istry, &scope, depth, &shared_types, &emit_info) +}, + _ => emit_error_expr("emit_rust_expr_match expected ExprMatch".to_string(), RenderTarget::Rust), +} } -pub fn emit_rust_expr_if( - expr: &Rc, - registry: Rc>>, - scope: Rc, - depth: i64, - shared_types: Rc>, - emit_info: Rc, -) -> String { +pub fn emit_rust_expr_if(expr: &Rc, registry: Rc>>, scope: Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { match (*expr.expr_data.clone()).clone() { - ExprData::ExprIf => { - let c = if_condition(expr.clone()); - let t = if_then_branch(expr.clone()); - let e = if_else_branch(expr.clone()); - emit_typed_if(c, t, e, ®istry, &scope, depth, &shared_types, &emit_info) - } - _ => emit_error_expr( - "emit_rust_expr_if expected ExprIf".to_string(), - RenderTarget::Rust, - ), - } + ExprData::ExprIf => { + let c = if_condition(expr.clone()); +let t = if_then_branch(expr.clone()); +let e = if_else_branch(expr.clone()); +emit_typed_if(c, t, e, ®istry, &scope, depth, &shared_types, &emit_info) +}, + _ => emit_error_expr("emit_rust_expr_if expected ExprIf".to_string(), RenderTarget::Rust), +} } -pub fn emit_rust_expr_let( - expr: &Rc, - registry: Rc>>, - scope: &Rc, - depth: i64, - shared_types: Rc>, - emit_info: Rc, -) -> String { +pub fn emit_rust_expr_let(expr: &Rc, registry: Rc>>, scope: &Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { match (*expr.expr_data.clone()).clone() { - ExprData::ExprLet => { - let n = - let_binding_name_at(expr.clone(), scope.type_env.clone().source_indices.clone()); - let v = let_value(expr.clone()); - let bd = let_body(expr.clone()); - emit_typed_let( - n, - &v, - bd, - ®istry, - &scope, - depth, - &shared_types, - &emit_info, - ) - } - _ => emit_error_expr( - "emit_rust_expr_let expected ExprLet".to_string(), - RenderTarget::Rust, - ), - } + ExprData::ExprLet => { + let n = let_binding_name_at(expr.clone(), scope.type_env.clone().source_indices.clone()); +let v = let_value(expr.clone()); +let bd = let_body(expr.clone()); +emit_typed_let(n, &v, bd, ®istry, &scope, depth, &shared_types, &emit_info) +}, + _ => emit_error_expr("emit_rust_expr_let expected ExprLet".to_string(), RenderTarget::Rust), +} } -pub fn emit_rust_expr_record_lit( - expr: &Rc, - registry: Rc>>, - scope: &Rc, - depth: i64, - shared_types: &Rc>, - emit_info: Rc, -) -> String { +pub fn emit_rust_expr_record_lit(expr: &Rc, registry: Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: Rc) -> String { match (*expr.expr_data.clone()).clone() { - ExprData::ExprRecordLit { parent_enum, .. } => { - let tn = record_lit_type_name_at( - expr.clone(), - scope.type_env.clone().source_indices.clone(), - ); - let fs = expr.children.clone(); - let raw = emit_typed_record_lit( - &tn, - &fs, - &parent_enum, - &resolved_type(expr.clone()), - registry, - &scope, - depth, - &shared_types, - &emit_info, - ); - let rc_name = match parent_enum.clone() { - Some(en) => en.clone(), - None => match tn.clone() { - Some(n) => n.clone(), - None => "".to_string(), - }, - }; - if ((rc_name.clone().as_str() != "".to_string().as_str()) - && emit_map_has(shared_types.clone(), rc_name.clone())) - { - v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), raw), ")".to_string()) - } else { - raw - } + ExprData::ExprRecordLit { parent_enum, .. } => { + let tn = record_lit_type_name_at(expr.clone(), scope.type_env.clone().source_indices.clone()); +let fs = expr.children.clone(); +let raw = emit_typed_record_lit(&tn, &fs, &parent_enum, &resolved_type(expr.clone()), registry, &scope, depth, &shared_types, &emit_info); +let rc_name = match parent_enum.clone() { + Some(en) => en.clone(), + None => match tn.clone() { + Some(n) => n.clone(), + None => "".to_string(), +}, +}; +if ((rc_name.clone().as_str() != "".to_string().as_str()) && emit_map_has(shared_types.clone(), rc_name.clone())) { + v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), raw), ")".to_string()) + } else { + raw } - _ => emit_error_expr( - "emit_rust_expr_record_lit expected ExprRecordLit".to_string(), - RenderTarget::Rust, - ), - } +}, + _ => emit_error_expr("emit_rust_expr_record_lit expected ExprRecordLit".to_string(), RenderTarget::Rust), +} } -pub fn emit_rust_expr_string_interp( - expr: &Rc, - registry: Rc>>, - scope: Rc, - depth: i64, - shared_types: Rc>, - emit_info: Rc, -) -> String { +pub fn emit_rust_expr_string_interp(expr: &Rc, registry: Rc>>, scope: Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { match (*expr.expr_data.clone()).clone() { - ExprData::ExprStringInterp => { - let ps = Rc::new({ - let mut __result = Vec::new(); - for child in expr.children.clone().iter().cloned() { - __result.push(match (*child.expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { - let LiteralValue::LitStr { value: text, .. } = value.as_ref() else { - unreachable!() - }; - Rc::new(StringPart::Text { - value: text.clone(), - }) - } - _ => Rc::new(StringPart::Interpolation { - expr: arg_value(&child), - }), - }); - } - __result - }); - emit_typed_string_interp(&ps, registry, scope, depth, shared_types, emit_info) - } - _ => emit_error_expr( - "emit_rust_expr_string_interp expected ExprStringInterp".to_string(), - RenderTarget::Rust, - ), - } + ExprData::ExprStringInterp => { + let ps = Rc::new({ let mut __result = Vec::new(); for child in expr.children.clone().iter().cloned() { __result.push(match (*child.expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitStr { value: text, .. } = value.as_ref() else { unreachable!() }; Rc::new(StringPart::Text { + value: text.clone(), +}) }, + _ => Rc::new(StringPart::Interpolation { + expr: arg_value(&child), +}), +}); } __result }); +emit_typed_string_interp(&ps, registry, scope, depth, shared_types, emit_info) +}, + _ => emit_error_expr("emit_rust_expr_string_interp expected ExprStringInterp".to_string(), RenderTarget::Rust), +} } -pub fn emit_rust_expr_block( - expr: &Rc, - registry: Rc>>, - scope: Rc, - depth: i64, - shared_types: Rc>, - emit_info: Rc, -) -> String { +pub fn emit_rust_expr_block(expr: &Rc, registry: Rc>>, scope: Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { match (*expr.expr_data.clone()).clone() { - ExprData::ExprBlock => emit_typed_block( - expr.children.clone(), - registry, - scope, - depth, - shared_types, - emit_info, - ), - _ => emit_error_expr( - "emit_rust_expr_block expected ExprBlock".to_string(), - RenderTarget::Rust, - ), - } + ExprData::ExprBlock => emit_typed_block(expr.children.clone(), registry, scope, depth, shared_types, emit_info), + _ => emit_error_expr("emit_rust_expr_block expected ExprBlock".to_string(), RenderTarget::Rust), +} } -pub fn emit_rust_expr_cast( - expr: &Rc, - registry: Rc>>, - scope: &Rc, - depth: i64, - shared_types: Rc>, - emit_info: Rc, -) -> String { +pub fn emit_rust_expr_cast(expr: &Rc, registry: Rc>>, scope: &Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { match (*expr.expr_data.clone()).clone() { - ExprData::ExprCast => emit_typed_cast_shared( - &cast_expr(expr.clone()), - cast_target(expr.clone()), - &RenderTarget::Rust, - |child| { - emit_typed_expr( - child.clone(), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ) - }, - &scope.type_env.clone().source_indices.clone(), - ), - _ => emit_error_expr( - "emit_rust_expr_cast expected ExprCast".to_string(), - RenderTarget::Rust, - ), - } + ExprData::ExprCast => emit_typed_cast_shared(&cast_expr(expr.clone()), cast_target(expr.clone()), &RenderTarget::Rust, |child| emit_typed_expr(child.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024), &scope.type_env.clone().source_indices.clone()), + _ => emit_error_expr("emit_rust_expr_cast expected ExprCast".to_string(), RenderTarget::Rust), +} } -pub fn emit_rust_expr_for_each( - expr: &Rc, - registry: Rc>>, - scope: &Rc, - depth: i64, - shared_types: Rc>, - emit_info: Rc, -) -> String { +pub fn emit_rust_expr_for_each(expr: &Rc, registry: Rc>>, scope: &Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { match (*expr.expr_data.clone()).clone() { - ExprData::ExprForEach => { - let v = - foreach_variable_at(expr.clone(), scope.type_env.clone().source_indices.clone()); - let c = foreach_collection(expr.clone()); - let bd = foreach_body(expr.clone()); - emit_typed_for_each( - &v, - &c, - bd, - ®istry, - &scope, - depth, - &shared_types, - &emit_info, - ) - } - _ => emit_error_expr( - "emit_rust_expr_for_each expected ExprForEach".to_string(), - RenderTarget::Rust, - ), - } + ExprData::ExprForEach => { + let v = foreach_variable_at(expr.clone(), scope.type_env.clone().source_indices.clone()); +let c = foreach_collection(expr.clone()); +let bd = foreach_body(expr.clone()); +emit_typed_for_each(&v, &c, bd, ®istry, &scope, depth, &shared_types, &emit_info) +}, + _ => emit_error_expr("emit_rust_expr_for_each expected ExprForEach".to_string(), RenderTarget::Rust), +} } -pub fn emit_rust_expr_index( - expr: &Rc, - registry: Rc>>, - scope: Rc, - depth: i64, - shared_types: Rc>, - emit_info: Rc, -) -> String { +pub fn emit_rust_expr_index(expr: &Rc, registry: Rc>>, scope: Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { match (*expr.expr_data.clone()).clone() { - ExprData::ExprIndex => { - let b = index_base(expr.clone()); - let i = index_expr(expr.clone()); - emit_typed_index(&b, i, ®istry, &scope, depth, &shared_types, &emit_info) - } - _ => emit_error_expr( - "emit_rust_expr_index expected ExprIndex".to_string(), - RenderTarget::Rust, - ), - } + ExprData::ExprIndex => { + let b = index_base(expr.clone()); +let i = index_expr(expr.clone()); +emit_typed_index(&b, i, ®istry, &scope, depth, &shared_types, &emit_info) +}, + _ => emit_error_expr("emit_rust_expr_index expected ExprIndex".to_string(), RenderTarget::Rust), +} } -pub fn emit_rust_expr_slice( - expr: &Rc, - registry: Rc>>, - scope: Rc, - depth: i64, - shared_types: Rc>, - emit_info: Rc, -) -> String { +pub fn emit_rust_expr_slice(expr: &Rc, registry: Rc>>, scope: Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { match (*expr.expr_data.clone()).clone() { - ExprData::ExprSlice => { - let b = slice_base(expr.clone()); - let s = slice_start(expr.clone()); - let e = slice_end(expr.clone()); - emit_typed_slice( - &b, - s, - e, - ®istry, - &scope, - depth, - &shared_types, - &emit_info, - ) - } - _ => emit_error_expr( - "emit_rust_expr_slice expected ExprSlice".to_string(), - RenderTarget::Rust, - ), - } + ExprData::ExprSlice => { + let b = slice_base(expr.clone()); +let s = slice_start(expr.clone()); +let e = slice_end(expr.clone()); +emit_typed_slice(&b, s, e, ®istry, &scope, depth, &shared_types, &emit_info) +}, + _ => emit_error_expr("emit_rust_expr_slice expected ExprSlice".to_string(), RenderTarget::Rust), +} } -pub fn emit_rust_expr_bin_op( - expr: &Rc, - registry: Rc>>, - scope: Rc, - depth: i64, - shared_types: Rc>, - emit_info: Rc, -) -> String { +pub fn emit_rust_expr_bin_op(expr: &Rc, registry: Rc>>, scope: Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { match (*expr.expr_data.clone()).clone() { - ExprData::ExprBinOp { - op, - algebra_field: algebra, - .. - } => emit_typed_bin_op( - &op, - algebra.clone(), - &binop_left(expr.clone()), - &binop_right(expr.clone()), - ®istry, - &scope, - depth, - &shared_types, - &emit_info, - ), - _ => emit_error_expr( - "emit_rust_expr_bin_op expected ExprBinOp".to_string(), - RenderTarget::Rust, - ), - } + ExprData::ExprBinOp { op, algebra_field: algebra, .. } => emit_typed_bin_op(&op, algebra.clone(), &binop_left(expr.clone()), &binop_right(expr.clone()), ®istry, &scope, depth, &shared_types, &emit_info), + _ => emit_error_expr("emit_rust_expr_bin_op expected ExprBinOp".to_string(), RenderTarget::Rust), +} } -pub fn emit_typed_expr( - texpr: Rc, - registry: Rc>>, - scope: &Rc, - depth: i64, - shared_types: Rc>, - emit_info: Rc, - fuel: i64, -) -> String { +pub fn emit_typed_expr(texpr: Rc, registry: Rc>>, scope: &Rc, depth: i64, shared_types: Rc>, emit_info: Rc, fuel: i64) -> String { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - emit_shared_expr( - &texpr, - &RenderTarget::Rust, - scope.type_env.clone().source_indices.clone(), - |result| result.clone(), - |child| { - emit_typed_expr( - child.clone(), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - (fuel.clone() - 1), - ) - }, - |expr| { - emit_rust_expr_var( - &expr, - registry.clone(), - shared_types.clone(), - emit_info.clone(), - &scope.type_env.clone().source_indices.clone(), - ) - }, - |expr| { - emit_rust_expr_field_access( - &expr, - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - ) - }, - |expr| { - emit_rust_expr_call( - &expr, - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - ) - }, - |expr| { - emit_rust_expr_method_call( - &expr, - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - ) - }, - |expr| { - emit_rust_expr_match( - &expr, - registry.clone(), - scope.clone(), - depth.clone(), - shared_types.clone(), - emit_info.clone(), - ) - }, - |expr| { - emit_rust_expr_if( - &expr, - registry.clone(), - scope.clone(), - depth.clone(), - shared_types.clone(), - emit_info.clone(), - ) - }, - |expr| { - emit_rust_expr_let( - &expr, - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - ) - }, - |expr| { - emit_rust_expr_record_lit( - &expr, - registry.clone(), - &scope, - depth.clone(), - &shared_types, - emit_info.clone(), - ) - }, - |expr| { - emit_rust_expr_string_interp( - &expr, - registry.clone(), - scope.clone(), - depth.clone(), - shared_types.clone(), - emit_info.clone(), - ) - }, - |expr| { - emit_rust_expr_block( - &expr, - registry.clone(), - scope.clone(), - depth.clone(), - shared_types.clone(), - emit_info.clone(), - ) - }, - |expr| { - emit_rust_expr_cast( - &expr, - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - ) - }, - |expr| { - emit_rust_expr_for_each( - &expr, - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - ) - }, - |expr| { - emit_rust_expr_index( - &expr, - registry.clone(), - scope.clone(), - depth.clone(), - shared_types.clone(), - emit_info.clone(), - ) - }, - |expr| { - emit_rust_expr_slice( - &expr, - registry.clone(), - scope.clone(), - depth.clone(), - shared_types.clone(), - emit_info.clone(), - ) - }, - |expr| { - emit_rust_expr_bin_op( - &expr, - registry.clone(), - scope.clone(), - depth.clone(), - shared_types.clone(), - emit_info.clone(), - ) - }, - ) + emit_shared_expr(&texpr, &RenderTarget::Rust, scope.type_env.clone().source_indices.clone(), |result| result.clone(), |child| emit_typed_expr(child.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), (fuel.clone() - 1)), |expr| emit_rust_expr_var(&expr, registry.clone(), shared_types.clone(), emit_info.clone(), &scope.type_env.clone().source_indices.clone()), |expr| emit_rust_expr_field_access(&expr, registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone()), |expr| emit_rust_expr_call(&expr, registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone()), |expr| emit_rust_expr_method_call(&expr, registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone()), |expr| emit_rust_expr_match(&expr, registry.clone(), scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone()), |expr| emit_rust_expr_if(&expr, registry.clone(), scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone()), |expr| emit_rust_expr_let(&expr, registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone()), |expr| emit_rust_expr_record_lit(&expr, registry.clone(), &scope, depth.clone(), &shared_types, emit_info.clone()), |expr| emit_rust_expr_string_interp(&expr, registry.clone(), scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone()), |expr| emit_rust_expr_block(&expr, registry.clone(), scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone()), |expr| emit_rust_expr_cast(&expr, registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone()), |expr| emit_rust_expr_for_each(&expr, registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone()), |expr| emit_rust_expr_index(&expr, registry.clone(), scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone()), |expr| emit_rust_expr_slice(&expr, registry.clone(), scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone()), |expr| emit_rust_expr_bin_op(&expr, registry.clone(), scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone())) }) } -pub fn emit_cloned_arg( - texpr: Rc, - registry: Rc>>, - scope: Rc, - depth: i64, - shared_types: Rc>, - emit_info: Rc, -) -> String { - emit_typed_expr( - texpr, - registry, - &scope, - depth, - shared_types, - emit_info, - 1024, - ) -} - -pub fn is_enum_type_name( - type_name: String, - type_summaries: Rc>>, -) -> bool { +pub fn emit_cloned_arg(texpr: Rc, registry: Rc>>, scope: Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { + emit_typed_expr(texpr, registry, &scope, depth, shared_types, emit_info, 1024) +} + +pub fn is_enum_type_name(type_name: String, type_summaries: Rc>>) -> bool { is_enum_in_summaries(type_summaries, type_name) } -pub fn contextual_variant_parent( - variant_name: &String, - parent_enum: Option, - resolved_type: &Rc, - emit_info: Rc, - source_indices: Rc>>, -) -> Option { +pub fn contextual_variant_parent(variant_name: &String, parent_enum: Option, resolved_type: &Rc, emit_info: Rc, source_indices: Rc>>) -> Option { match parent_enum { - Some(explicit_parent) => { - if variant_belongs_to_enum( - emit_info.type_summaries.clone(), - variant_name.clone(), - explicit_parent.clone(), - ) { - Some(explicit_parent.clone()) - } else { - None - } - } - None => { - let rt_name = authored_name_at(source_indices, &resolved_type); - if (((resolved_type.ident_span.clone() != None) - && (rt_name.clone().as_str() != variant_name.clone().as_str())) - && variant_belongs_to_enum( - emit_info.type_summaries.clone(), - variant_name.clone(), - rt_name.clone(), - )) - { - Some(rt_name.clone()) - } else { - None - } + Some(explicit_parent) => if variant_belongs_to_enum(emit_info.type_summaries.clone(), variant_name.clone(), explicit_parent.clone()) { + Some(explicit_parent.clone()) + } else { + None + }, + None => { + let rt_name = authored_name_at(source_indices, &resolved_type); +if (((resolved_type.ident_span.clone() != None) && (rt_name.clone().as_str() != variant_name.clone().as_str())) && variant_belongs_to_enum(emit_info.type_summaries.clone(), variant_name.clone(), rt_name.clone())) { + Some(rt_name.clone()) + } else { + None } - } +}, +} } -pub fn is_map_typed_expr( - texpr: Rc, - source_indices: Rc>>, -) -> bool { +pub fn is_map_typed_expr(texpr: Rc, source_indices: Rc>>) -> bool { match texpr.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: n, .. }) => { - node_is_keyed_collection(&n, source_indices) - } - _ => false, - } + Some(InferredNode::Resolved { node: n, .. }) => node_is_keyed_collection(&n, source_indices), + _ => false, +} } -pub fn emit_typed_call_expr( - func: &String, - args: Rc>>, - inferred: Option>, - registry: Rc>>, - scope: Rc, - depth: i64, - shared_types: Rc>, - emit_info: Rc, -) -> String { +pub fn emit_typed_call_expr(func: &String, args: Rc>>, inferred: Option>, registry: Rc>>, scope: Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { { let call_str = if (func.clone().as_str() == "empty_map".to_string().as_str()) { match inferred.as_deref().cloned() { - Some(InferredNode::Resolved { node: ret_type, .. }) => { - let kv_type_str = rust_empty_map_kv_type_str( - &ret_type, - &shared_types, - &scope.type_env.clone().source_indices.clone(), - ); - if (kv_type_str.clone().as_str() != "".to_string().as_str()) { - v2_rt::concat( - v2_rt::concat( - "v2_rt::rc_empty_map::<".to_string(), - kv_type_str.clone(), - ), - ">()".to_string(), - ) - } else { - "Rc::new(HashMap::new()) /* BRIDGE: empty_map value type unresolved */" - .to_string() - } + Some(InferredNode::Resolved { node: ret_type, .. }) => { + let kv_type_str = rust_empty_map_kv_type_str(&ret_type, &shared_types, &scope.type_env.clone().source_indices.clone()); +if (kv_type_str.clone().as_str() != "".to_string().as_str()) { + v2_rt::concat(v2_rt::concat("v2_rt::rc_empty_map::<".to_string(), kv_type_str.clone()), ">()".to_string()) + } else { + "Rc::new(HashMap::new()) /* BRIDGE: empty_map value type unresolved */".to_string() } - _ => "Rc::new(HashMap::new()) /* BRIDGE: empty_map return type unresolved */" - .to_string(), - } +}, + _ => "Rc::new(HashMap::new()) /* BRIDGE: empty_map return type unresolved */".to_string(), +} } else { - emit_typed_call( - &func, - &args, - ®istry, - &scope, - depth, - &shared_types, - &emit_info, - ) + emit_typed_call(&func, &args, ®istry, &scope, depth, &shared_types, &emit_info) }; - if rust_runtime_bridge_wraps_collection_result_in_rc(&func) { - v2_rt::concat( - v2_rt::concat("Rc::new(".to_string(), call_str), - ")".to_string(), - ) +if rust_runtime_bridge_wraps_collection_result_in_rc(&func) { + v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), call_str), ")".to_string()) } else { call_str } - } +} } -pub fn emit_typed_call( - func: &String, - args: &Rc>>, - registry: &Rc>>, - scope: &Rc, - depth: i64, - shared_types: &Rc>, - emit_info: &Rc, -) -> String { +pub fn emit_typed_call(func: &String, args: &Rc>>, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { { if (func.clone().as_str() == "get".to_string().as_str()) { { let get_args = order_typed_call_args(&args, func.clone(), &scope); - let get_list = get_args.clone().first().cloned(); - let get_idx = get_args.clone().get(1 as usize).cloned(); - let get_result = match get_list { - Some(list_arg) => match get_idx { - Some(idx_arg) => { - let list_str = emit_typed_expr( - arg_value(&list_arg), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - let index_str = emit_typed_expr( - arg_value(&idx_arg), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(list_str, ".get((".to_string()), - index_str, - ), - ") as usize)".to_string(), - ), - clone_iterator_suffix(), - ) - } - None => "compile_error!(\"get call missing index argument\")".to_string(), - }, - None => "compile_error!(\"get call missing list argument\")".to_string(), - }; - return get_result; - } +let get_list = get_args.clone().first().cloned(); +let get_idx = get_args.clone().get(1 as usize).cloned(); +let get_result = match get_list { + Some(list_arg) => match get_idx { + Some(idx_arg) => { + let list_str = emit_typed_expr(arg_value(&list_arg), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +let index_str = emit_typed_expr(arg_value(&idx_arg), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(list_str, ".get((".to_string()), index_str), ") as usize)".to_string()), clone_iterator_suffix()) +}, + None => "compile_error!(\"get call missing index argument\")".to_string(), +}, + None => "compile_error!(\"get call missing list argument\")".to_string(), +}; +return get_result +} } - if (func.clone().as_str() == "with".to_string().as_str()) { +if (func.clone().as_str() == "with".to_string().as_str()) { { let with_args = order_typed_call_args(&args, func.clone(), &scope); - if ((with_args.clone().len() as i64) == 0) { - return "compile_error!(\"with call missing base record\")".to_string(); +if ((with_args.clone().len() as i64) == 0) { + return "compile_error!(\"with call missing base record\")".to_string() } - let base_arg = arg_value(&with_args.clone().first().cloned().clone().unwrap()); - if ((with_args.clone().len() as i64) < 2) { - return "compile_error!(\"with call missing update record\")".to_string(); +let base_arg = arg_value(&with_args.clone().first().cloned().clone().unwrap()); +if ((with_args.clone().len() as i64) < 2) { + return "compile_error!(\"with call missing update record\")".to_string() } - let update_arg = - arg_value(&with_args.clone().get(1 as usize).cloned().clone().unwrap()); - let base_str = emit_typed_expr( - base_arg.clone(), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - let type_name = if (base_arg.inferred.clone() != None) { - authored_name_at( - scope.type_env.clone().source_indices.clone(), - &resolved_type(base_arg.clone()), - ) +let update_arg = arg_value(&with_args.clone().get(1 as usize).cloned().clone().unwrap()); +let base_str = emit_typed_expr(base_arg.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +let type_name = if (base_arg.inferred.clone() != None) { + authored_name_at(scope.type_env.clone().source_indices.clone(), &resolved_type(base_arg.clone())) } else { "compile_error!(\"with call missing resolved record type\")".to_string() }; - let field_strs = match (*update_arg.expr_data.clone()).clone() { - ExprData::ExprRecordLit { .. } => Rc::new({ - let mut __result = Vec::new(); - for f in update_arg.children.clone().iter().cloned() { - __result.push(v2_rt::concat( - v2_rt::concat( - emit_ident( - field_init_node_name_at( - f.clone(), - scope.type_env.clone().source_indices.clone(), - ), - RenderTarget::Rust, - ), - ": ".to_string(), - ), - emit_typed_expr( - field_init_node_value(&f), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ), - )); - } - __result - }), - _ => Rc::new(vec![emit_typed_expr( - update_arg.clone(), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - )]), - }; - let fields_str = field_strs.join(&", ".to_string()); - let needs_rc = emit_map_has(shared_types.clone(), type_name.clone()); - let sharing = language_spec(RenderTarget::Rust).sharing.clone(); - let spread = if needs_rc.clone() { +let field_strs = match (*update_arg.expr_data.clone()).clone() { + ExprData::ExprRecordLit { .. } => Rc::new({ let mut __result = Vec::new(); for f in update_arg.children.clone().iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(emit_ident(field_init_node_name_at(f.clone(), scope.type_env.clone().source_indices.clone()), RenderTarget::Rust), ": ".to_string()), emit_typed_expr(field_init_node_value(&f), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024))); } __result }), + _ => Rc::new(vec![emit_typed_expr(update_arg.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024)]), +}; +let fields_str = field_strs.join(&", ".to_string()); +let needs_rc = emit_map_has(shared_types.clone(), type_name.clone()); +let sharing = language_spec(RenderTarget::Rust).sharing.clone(); +let spread = if needs_rc.clone() { apply_type_template1(sharing.deref_clone.clone(), base_str) } else { apply_type_template1(sharing.clone_value.clone(), base_str) }; - let raw = v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(type_name.clone(), " { ".to_string()), - fields_str, - ), - ", ..".to_string(), - ), - spread, - ), - " }".to_string(), - ); - if needs_rc.clone() { - return v2_rt::concat( - v2_rt::concat("Rc::new(".to_string(), raw), - ")".to_string(), - ); +let raw = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(type_name.clone(), " { ".to_string()), fields_str), ", ..".to_string()), spread), " }".to_string()); +if needs_rc.clone() { + return v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), raw), ")".to_string()) } else { - return raw; + return raw } - } +} } - if (func.clone().as_str() == "to_string".to_string().as_str()) { +if (func.clone().as_str() == "to_string".to_string().as_str()) { { let to_string_args = order_typed_call_args(&args, func.clone(), &scope); - let ts_result = match to_string_args.first().cloned() { - Some(value_arg) => v2_rt::concat( - v2_rt::concat( - "(".to_string(), - emit_typed_expr( - arg_value(&value_arg), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ), - ), - ").to_string()".to_string(), - ), - None => "compile_error!(\"to_string call missing value argument\")".to_string(), - }; - return ts_result; - } +let ts_result = match to_string_args.first().cloned() { + Some(value_arg) => v2_rt::concat(v2_rt::concat("(".to_string(), emit_typed_expr(arg_value(&value_arg), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024)), ").to_string()".to_string()), + None => "compile_error!(\"to_string call missing value argument\")".to_string(), +}; +return ts_result +} } - let collection_scope = if ((((func.clone().as_str() == "map".to_string().as_str()) - || (func.clone().as_str() == "filter".to_string().as_str())) - || (func.clone().as_str() == "flat_map".to_string().as_str())) - || (func.clone().as_str() == "fold".to_string().as_str())) - { +let collection_scope = if ((((func.clone().as_str() == "map".to_string().as_str()) || (func.clone().as_str() == "filter".to_string().as_str())) || (func.clone().as_str() == "flat_map".to_string().as_str())) || (func.clone().as_str() == "fold".to_string().as_str())) { { let call_args = order_typed_call_args(&args, func.clone(), &scope); - match call_args.last().cloned() { - Some(a) => match (*arg_value(&a).expr_data.clone()).clone() { - ExprData::ExprLambda => { - let lps = lambda_param_names_at( - arg_value(&a), - scope.type_env.clone().source_indices.clone(), - ); - lambda_scope_from_children( - scope.clone(), - lps, - Rc::new( - arg_value(&a) - .children - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - ) - } - _ => scope.clone(), - }, - None => scope.clone(), - } - } +match call_args.last().cloned() { + Some(a) => match (*arg_value(&a).expr_data.clone()).clone() { + ExprData::ExprLambda => { + let lps = lambda_param_names_at(arg_value(&a), scope.type_env.clone().source_indices.clone()); +lambda_scope_from_children(scope.clone(), lps, Rc::new(arg_value(&a).children.clone().iter().cloned().skip(1 as usize).collect::>())) +}, + _ => scope.clone(), +}, + None => scope.clone(), +} +} } else { scope.clone() }; - let ordered_args = order_typed_call_args(&args, func.clone(), &collection_scope); - let callee = lookup_item(registry.clone(), func.clone()); - let filled_args = fill_default_args( - &ordered_args, - callee.clone(), - registry.clone(), - collection_scope.clone(), - depth.clone(), - shared_types.clone(), - emit_info.clone(), - ); - let is_rt = v2_rt::map_contains_key(&rt_functions(), func.clone()); - let is_rt_ref_map = v2_rt::map_contains_key(&rt_ref_map_functions(), func.clone()); - let callee_qualified = match callee.clone() { - Some(info) => v2_rt::concat( - v2_rt::concat(info.module_name.clone(), ".".to_string()), - func.clone(), - ), - None => func.clone(), - }; - let callee_read_only = - match v2_rt::map_get(&emit_info.read_only_params_index.clone(), callee_qualified) { - Some(m) => m.clone(), - None => v2_rt::rc_empty_map::(), - }; - let callee_is_tco = match callee.clone() { - Some(info) => { - (info.is_self_recursive.clone() && (info.has_non_tail_self_call.clone() == false)) - } - None => false, - }; - let callee_borrow_positions = if callee_is_tco { +let ordered_args = order_typed_call_args(&args, func.clone(), &collection_scope); +let callee = lookup_item(registry.clone(), func.clone()); +let filled_args = fill_default_args(&ordered_args, callee.clone(), registry.clone(), collection_scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone()); +let is_rt = v2_rt::map_contains_key(&rt_functions(), func.clone()); +let is_rt_ref_map = v2_rt::map_contains_key(&rt_ref_map_functions(), func.clone()); +let callee_qualified = match callee.clone() { + Some(info) => v2_rt::concat(v2_rt::concat(info.module_name.clone(), ".".to_string()), func.clone()), + None => func.clone(), +}; +let callee_read_only = match v2_rt::map_get(&emit_info.read_only_params_index.clone(), callee_qualified) { + Some(m) => m.clone(), + None => v2_rt::rc_empty_map::(), +}; +let callee_is_tco = match callee.clone() { + Some(info) => (info.is_self_recursive.clone() && (info.has_non_tail_self_call.clone() == false)), + None => false, +}; +let callee_borrow_positions = if callee_is_tco { v2_rt::rc_empty_map::() } else { match callee.clone() { - Some(info) => Rc::new( - info.params - .clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - .fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, pair: (i64, Rc)| { - let pname = param_node_name_at( - pair.1.clone(), - collection_scope.type_env.clone().source_indices.clone(), - ); - let n = param_node_type_expr(&pair.1.clone()); - let is_callable = ((n.params.clone().len() as i64) > 0); - let is_borrowable = - ((v2_rt::map_contains_key(&callee_read_only, pname.clone()) - && (is_callable.clone() == false)) - && needs_reference_node( - &n, - collection_scope.type_env.clone().source_indices.clone(), - )); - if is_borrowable.clone() { - v2_rt::rc_map_insert(acc.clone(), (pair.0.clone()).to_string(), true) - } else { - acc.clone() - } - }, - ), - None => v2_rt::rc_empty_map::(), - } + Some(info) => Rc::new(info.params.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, pair: (i64, Rc)| { + let pname = param_node_name_at(pair.1.clone(), collection_scope.type_env.clone().source_indices.clone()); +let n = param_node_type_expr(&pair.1.clone()); +let is_callable = ((n.params.clone().len() as i64) > 0); +let is_borrowable = ((v2_rt::map_contains_key(&callee_read_only, pname.clone()) && (is_callable.clone() == false)) && needs_reference_node(&n, collection_scope.type_env.clone().source_indices.clone())); +if is_borrowable.clone() { + v2_rt::rc_map_insert(acc.clone(), (pair.0.clone()).to_string(), true) + } else { + acc.clone() + } +}), + None => v2_rt::rc_empty_map::(), +} }; - let arg_strs = Rc::new({ - let mut __result = Vec::new(); - for pair in Rc::new( - filled_args - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - { - __result.push({ - let idx = pair.0.clone(); - let a = pair.1.clone(); - if (is_rt_ref_map.clone() && (idx.clone() == 0)) { - { - let base = emit_typed_expr_base( - &arg_value(&a), - registry.clone(), - &collection_scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - ); - v2_rt::concat("&".to_string(), base.clone()) - } - } else { - if v2_rt::map_contains_key( - &callee_borrow_positions, - (idx.clone()).to_string(), - ) { - { - let base = emit_typed_expr_base( - &arg_value(&a), - registry.clone(), - &collection_scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - ); - apply_type_template1( - sharing_for_target(RenderTarget::Rust) - .borrow_arg_template - .clone(), - base.clone(), - ) - } - } else { - emit_cloned_arg( - arg_value(&a), - registry.clone(), - collection_scope.clone(), - depth.clone(), - shared_types.clone(), - emit_info.clone(), - ) - } - } - }); - } - __result - }); - let extra_args = match callee.clone() { - Some(info) => { - let has_effects = (((info.service_names.clone().len() as i64) > 0) - || ((info.resource_names.clone().len() as i64) > 0)); - if has_effects.clone() { +let arg_strs = Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(filled_args.iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { __result.push({ + let idx = pair.0.clone(); +let a = pair.1.clone(); +if (is_rt_ref_map.clone() && (idx.clone() == 0)) { + { + let base = emit_typed_expr_base(&arg_value(&a), registry.clone(), &collection_scope, depth.clone(), shared_types.clone(), emit_info.clone()); +v2_rt::concat("&".to_string(), base.clone()) +} + } else { + if v2_rt::map_contains_key(&callee_borrow_positions, (idx.clone()).to_string()) { { - let resource_args = Rc::new({ - let mut __result = Vec::new(); - for rn in info.resource_names.clone().iter().cloned() { - __result.push(v2_rt::concat( - "&".to_string(), - emit_ident(rn.clone(), RenderTarget::Rust), - )); - } - __result - }); - let service_args = Rc::new({ - let mut __result = Vec::new(); - for sn in info.service_names.clone().iter().cloned() { - __result.push(service_var_name(sn.clone())); - } - __result - }); - v2_rt::concat(resource_args, service_args) - } + let base = emit_typed_expr_base(&arg_value(&a), registry.clone(), &collection_scope, depth.clone(), shared_types.clone(), emit_info.clone()); +apply_type_template1(sharing_for_target(RenderTarget::Rust).borrow_arg_template.clone(), base.clone()) +} } else { - Rc::new(vec![]) + emit_cloned_arg(arg_value(&a), registry.clone(), collection_scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone()) } } - None => Rc::new(vec![]), - }; - let all_args = v2_rt::concat(arg_strs, extra_args); - let args_str = all_args.clone().join(&", ".to_string()); - let runtime_name = rust_runtime_bridge_name(func.clone()); - let func_name = if is_rt.clone() { - v2_rt::concat( - "v2_rt::".to_string(), - emit_ident(runtime_name, RenderTarget::Rust), - ) +}); } __result }); +let extra_args = match callee.clone() { + Some(info) => { + let has_effects = (((info.service_names.clone().len() as i64) > 0) || ((info.resource_names.clone().len() as i64) > 0)); +if has_effects.clone() { + { + let resource_args = Rc::new({ let mut __result = Vec::new(); for rn in info.resource_names.clone().iter().cloned() { __result.push(v2_rt::concat("&".to_string(), emit_ident(rn.clone(), RenderTarget::Rust))); } __result }); +let service_args = Rc::new({ let mut __result = Vec::new(); for sn in info.service_names.clone().iter().cloned() { __result.push(service_var_name(sn.clone())); } __result }); +v2_rt::concat(resource_args, service_args) +} + } else { + Rc::new(vec![]) + } +}, + None => Rc::new(vec![]), +}; +let all_args = v2_rt::concat(arg_strs, extra_args); +let args_str = all_args.clone().join(&", ".to_string()); +let runtime_name = rust_runtime_bridge_name(func.clone()); +let func_name = if is_rt.clone() { + v2_rt::concat("v2_rt::".to_string(), emit_ident(runtime_name, RenderTarget::Rust)) } else { emit_ident(func.clone(), RenderTarget::Rust) }; - let call_str = if ((is_rt.clone() - && (func.clone().as_str() == "concat".to_string().as_str())) - && ((all_args.clone().len() as i64) > 2)) - { +let call_str = if ((is_rt.clone() && (func.clone().as_str() == "concat".to_string().as_str())) && ((all_args.clone().len() as i64) > 2)) { emit_nested_rt_concat(all_args.clone(), "".to_string(), shared_types.clone()) } else { - v2_rt::concat( - v2_rt::concat(v2_rt::concat(func_name, "(".to_string()), args_str), - ")".to_string(), - ) + v2_rt::concat(v2_rt::concat(v2_rt::concat(func_name, "(".to_string()), args_str), ")".to_string()) }; - match callee.clone() { - Some(info) => { - let has_effects = (((info.service_names.clone().len() as i64) > 0) - || ((info.resource_names.clone().len() as i64) > 0)); - if has_effects.clone() { - v2_rt::concat(call_str, ".await?".to_string()) - } else { - call_str - } +match callee.clone() { + Some(info) => { + let has_effects = (((info.service_names.clone().len() as i64) > 0) || ((info.resource_names.clone().len() as i64) > 0)); +if has_effects.clone() { + v2_rt::concat(call_str, ".await?".to_string()) + } else { + call_str } - None => call_str, - } - } +}, + None => call_str, +} +} } -pub fn fill_default_args( - ordered: &Rc>>, - callee: Option>, - registry: Rc>>, - scope: Rc, - depth: i64, - shared_types: Rc>, - emit_info: Rc, -) -> Rc>> { +pub fn fill_default_args(ordered: &Rc>>, callee: Option>, registry: Rc>>, scope: Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> Rc>> { match callee { - Some(info) => { - let provided_names = Rc::new({ - let mut __result = Vec::new(); - for a in ordered.clone().iter().cloned() { - __result.push( - match arg_name_at(a.clone(), scope.type_env.clone().source_indices.clone()) - { - Some(n) => n.clone(), - None => "".to_string(), - }, - ); - } - __result - }); - let missing_with_defaults = Rc::new({ - let mut __result = Vec::new(); - for p in info.params.clone().iter().cloned() { - if { - let is_provided = { - let mut __found = false; - for n in provided_names.clone().iter().cloned() { - if (n.clone().as_str() - == param_node_name_at( - p.clone(), - scope.type_env.clone().source_indices.clone(), - ) - .as_str()) - { - __found = true; - break; - } - } - __found - }; - if is_provided.clone() { - false - } else { - (param_node_default_value(&p) != None) - } - } { - __result.push(p); - } - } - __result - }); - let default_args = Rc::new({ - let mut __result = Vec::new(); - for p in missing_with_defaults.iter().cloned() { - __result.push(make_arg_node( - Some(param_node_name_at( - p.clone(), - scope.type_env.clone().source_indices.clone(), - )), - param_node_default_value(&p).clone().unwrap(), - p.span.clone(), - p.span.clone(), - )); - } - __result - }); - v2_rt::concat(ordered.clone(), default_args) - } - None => ordered.clone(), - } + Some(info) => { + let provided_names = Rc::new({ let mut __result = Vec::new(); for a in ordered.clone().iter().cloned() { __result.push(match arg_name_at(a.clone(), scope.type_env.clone().source_indices.clone()) { + Some(n) => n.clone(), + None => "".to_string(), +}); } __result }); +let missing_with_defaults = Rc::new({ let mut __result = Vec::new(); for p in info.params.clone().iter().cloned() { if { + let is_provided = { let mut __found = false; for n in provided_names.clone().iter().cloned() { if (n.clone().as_str() == param_node_name_at(p.clone(), scope.type_env.clone().source_indices.clone()).as_str()) { __found = true; break; } } __found }; +if is_provided.clone() { + false + } else { + (param_node_default_value(&p) != None) + } +} { __result.push(p); } } __result }); +let default_args = Rc::new({ let mut __result = Vec::new(); for p in missing_with_defaults.iter().cloned() { __result.push(make_arg_node(Some(param_node_name_at(p.clone(), scope.type_env.clone().source_indices.clone())), param_node_default_value(&p).clone().unwrap(), p.span.clone(), p.span.clone())); } __result }); +v2_rt::concat(ordered.clone(), default_args) +}, + None => ordered.clone(), +} } -pub fn fill_op_default_args( - ordered: &Rc>>, - op_params: Rc>>, - registry: Rc>>, - scope: Rc, - depth: i64, - shared_types: Rc>, - emit_info: Rc, -) -> Rc>> { +pub fn fill_op_default_args(ordered: &Rc>>, op_params: Rc>>, registry: Rc>>, scope: Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> Rc>> { { let si = scope.type_env.clone().source_indices.clone(); - let arg_map = ordered.clone().iter().cloned().fold( - v2_rt::rc_empty_map::>(), - |acc: Rc>>, a: Rc| match arg_name_at( - a.clone(), - si.clone(), - ) { - Some(n) => v2_rt::rc_map_insert(acc.clone(), n.clone(), a.clone()), - None => acc.clone(), +let arg_map = ordered.clone().iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, a: Rc| match arg_name_at(a.clone(), si.clone()) { + Some(n) => v2_rt::rc_map_insert(acc.clone(), n.clone(), a.clone()), + None => acc.clone(), +}); +let unnamed_args = Rc::new({ let mut __result = Vec::new(); for a in ordered.clone().iter().cloned() { if (arg_name_at(a.clone(), si.clone()) == None) { __result.push(a); } } __result }); +let named_ordered = Rc::new({ let mut __result = Vec::new(); for p in op_params.iter().cloned() { __result.extend((*{ + let pname = param_node_name_at(p.clone(), si.clone()); +match v2_rt::map_get(&arg_map, pname.clone()) { + Some(arg) => Rc::new(vec![arg.clone()]), + None => if (param_node_default_value(&p) != None) { + Rc::new(vec![make_arg_node(Some(pname.clone()), param_node_default_value(&p).clone().unwrap(), p.span.clone(), p.span.clone())]) + } else { + Rc::new(vec![]) }, - ); - let unnamed_args = Rc::new({ - let mut __result = Vec::new(); - for a in ordered.clone().iter().cloned() { - if (arg_name_at(a.clone(), si.clone()) == None) { - __result.push(a); - } - } - __result - }); - let named_ordered = Rc::new({ - let mut __result = Vec::new(); - for p in op_params.iter().cloned() { - __result.extend( - (*{ - let pname = param_node_name_at(p.clone(), si.clone()); - match v2_rt::map_get(&arg_map, pname.clone()) { - Some(arg) => Rc::new(vec![arg.clone()]), - None => { - if (param_node_default_value(&p) != None) { - Rc::new(vec![make_arg_node( - Some(pname.clone()), - param_node_default_value(&p).clone().unwrap(), - p.span.clone(), - p.span.clone(), - )]) - } else { - Rc::new(vec![]) - } - } - } - }) - .iter() - .cloned(), - ); - } - __result - }); - v2_rt::concat(named_ordered, unnamed_args) - } +} +}).iter().cloned()); } __result }); +v2_rt::concat(named_ordered, unnamed_args) +} } -pub fn emit_nested_rt_concat( - mut remaining: Rc>, - mut acc: String, - mut shared_types: Rc>, -) -> String { +pub fn emit_nested_rt_concat(mut remaining: Rc>, mut acc: String, mut shared_types: Rc>) -> String { loop { match remaining.clone().first().cloned() { - None => { - break acc.clone(); - } - Some(arg) => { - let next_acc = if (acc.clone().as_str() == "".to_string().as_str()) { - arg.clone() - } else { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("v2_rt::concat(".to_string(), acc.clone()), - ", ".to_string(), - ), - arg.clone(), - ), - ")".to_string(), - ) - }; - { - let __tco_0 = Rc::new( - remaining - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ); - let __tco_1 = next_acc; - remaining = __tco_0; - acc = __tco_1; - continue; - } - } - } - } + None => { break acc.clone(); }, + Some(arg) => { let next_acc = if (acc.clone().as_str() == "".to_string().as_str()) { + arg.clone() + } else { + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("v2_rt::concat(".to_string(), acc.clone()), ", ".to_string()), arg.clone()), ")".to_string()) + }; +{ + let __tco_0 = Rc::new(remaining.iter().cloned().skip(1 as usize).collect::>()); +let __tco_1 = next_acc; +remaining = __tco_0; +acc = __tco_1; +continue; +} }, +} +} } -pub fn emit_typed_for_each( - variable: &String, - collection: &Rc, - body: Rc, - registry: &Rc>>, - scope: &Rc, - depth: i64, - shared_types: &Rc>, - emit_info: &Rc, -) -> String { +pub fn emit_typed_for_each(variable: &String, collection: &Rc, body: Rc, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { { let sharing = language_spec(RenderTarget::Rust).sharing.clone(); - let coll_str = emit_typed_expr( - collection.clone(), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - let elem_type = for_each_element_type_node( - resolved_type(collection.clone()), - scope.type_env.clone().source_indices.clone(), - ); - let body_scope = extend_scope( - &scope, - &variable, - elem_type, - Rc::new(SubValueRelation::SubValueUnknown), - ); - let body_str = emit_typed_expr( - body, - registry.clone(), - &body_scope, - (depth.clone() + 2), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - let ind1 = make_indent((depth.clone() + 1)); - let ind2 = make_indent((depth.clone() + 2)); - let ind0 = make_indent(depth.clone()); - let iter_str = apply_type_template1(sharing.iter_owned.clone(), coll_str); - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\n".to_string(), ind1.clone()), "let mut __collect = Vec::new();\n".to_string()), ind1.clone()), "for ".to_string()), emit_ident(variable.clone(), RenderTarget::Rust)), " in ".to_string()), iter_str), " {\n".to_string()), ind2), "__collect.push(".to_string()), body_str), ");\n".to_string()), ind1.clone()), "}\n".to_string()), ind1.clone()), "Rc::new(__collect)\n".to_string()), ind0), "}".to_string()) - } +let coll_str = emit_typed_expr(collection.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +let elem_type = for_each_element_type_node(resolved_type(collection.clone()), scope.type_env.clone().source_indices.clone()); +let body_scope = extend_scope(&scope, &variable, elem_type, Rc::new(SubValueRelation::SubValueUnknown)); +let body_str = emit_typed_expr(body, registry.clone(), &body_scope, (depth.clone() + 2), shared_types.clone(), emit_info.clone(), 1024); +let ind1 = make_indent((depth.clone() + 1)); +let ind2 = make_indent((depth.clone() + 2)); +let ind0 = make_indent(depth.clone()); +let iter_str = apply_type_template1(sharing.iter_owned.clone(), coll_str); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\n".to_string(), ind1.clone()), "let mut __collect = Vec::new();\n".to_string()), ind1.clone()), "for ".to_string()), emit_ident(variable.clone(), RenderTarget::Rust)), " in ".to_string()), iter_str), " {\n".to_string()), ind2), "__collect.push(".to_string()), body_str), ");\n".to_string()), ind1.clone()), "}\n".to_string()), ind1.clone()), "Rc::new(__collect)\n".to_string()), ind0), "}".to_string()) +} } -pub fn emit_typed_index( - base: &Rc, - index: Rc, - registry: &Rc>>, - scope: &Rc, - depth: i64, - shared_types: &Rc>, - emit_info: &Rc, -) -> String { +pub fn emit_typed_index(base: &Rc, index: Rc, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { { let spec = language_spec(RenderTarget::Rust); - let base_str = emit_typed_expr( - base.clone(), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - let index_str = emit_typed_expr( - index, - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - let base_node = normalize_access_type_node(resolved_type(base.clone())); - let is_map = - node_is_keyed_collection(&base_node, scope.type_env.clone().source_indices.clone()); - if is_rust_string_like( - base_node.clone(), - scope.type_env.clone().source_indices.clone(), - ) { - apply_type_template2( - spec.indexing.clone().string_index.clone(), - base_str, - index_str, - ) +let base_str = emit_typed_expr(base.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +let index_str = emit_typed_expr(index, registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +let base_node = normalize_access_type_node(resolved_type(base.clone())); +let is_map = node_is_keyed_collection(&base_node, scope.type_env.clone().source_indices.clone()); +if is_rust_string_like(base_node.clone(), scope.type_env.clone().source_indices.clone()) { + apply_type_template2(spec.indexing.clone().string_index.clone(), base_str, index_str) } else { if is_map { apply_type_template2(spec.indexing.clone().map_index.clone(), base_str, index_str) } else { - apply_type_template2( - spec.indexing.clone().list_index.clone(), - base_str, - index_str, - ) + apply_type_template2(spec.indexing.clone().list_index.clone(), base_str, index_str) } } - } +} } -pub fn emit_typed_slice( - base: &Rc, - start: Rc, - end: Rc, - registry: &Rc>>, - scope: &Rc, - depth: i64, - shared_types: &Rc>, - emit_info: &Rc, -) -> String { +pub fn emit_typed_slice(base: &Rc, start: Rc, end: Rc, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { { let spec = language_spec(RenderTarget::Rust); - let base_str = emit_typed_expr( - base.clone(), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - let start_str = emit_typed_expr( - start, - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - let end_str = emit_typed_expr( - end, - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - let base_node = normalize_access_type_node(resolved_type(base.clone())); - if is_rust_string_like(base_node, scope.type_env.clone().source_indices.clone()) { +let base_str = emit_typed_expr(base.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +let start_str = emit_typed_expr(start, registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +let end_str = emit_typed_expr(end, registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +let base_node = normalize_access_type_node(resolved_type(base.clone())); +if is_rust_string_like(base_node, scope.type_env.clone().source_indices.clone()) { match spec.indexing.clone().string_slice.clone() { - Some(tmpl) => apply_type_template3(tmpl.clone(), base_str, start_str, end_str), - None => emit_error_expr( - "unsupported string slice for target".to_string(), - RenderTarget::Rust, - ), - } + Some(tmpl) => apply_type_template3(tmpl.clone(), base_str, start_str, end_str), + None => emit_error_expr("unsupported string slice for target".to_string(), RenderTarget::Rust), +} } else { match spec.indexing.clone().list_slice.clone() { - Some(tmpl) => apply_type_template3(tmpl.clone(), base_str, start_str, end_str), - None => emit_error_expr( - "unsupported list slice for target".to_string(), - RenderTarget::Rust, - ), - } - } - } + Some(tmpl) => apply_type_template3(tmpl.clone(), base_str, start_str, end_str), + None => emit_error_expr("unsupported list slice for target".to_string(), RenderTarget::Rust), } - -pub fn collection_element_type( - receiver_type: Option>, - shared_types: Rc>, - source_indices: &Rc>>, -) -> String { - match receiver_type.as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - let __rt_is_container = node_is_element_collection(&rt, source_indices.clone()); - if __rt_is_container { - match rt.children.clone().first().cloned() { - Some(elem_child) => { - let elem_node = child_type_node(&elem_child); - let elem_is_error = if (elem_node.inferred.clone() != None) { - is_compiler_error(elem_node.inferred.clone().clone().unwrap()) - } else { - false - }; - let elem_is_type_var = if (elem_node.inferred.clone() != None) { - is_type_variable(elem_node.inferred.clone().clone().unwrap()) - } else { - false - }; - if (elem_is_error || elem_is_type_var) { - "_".to_string() - } else { - render_rust_type( - elem_node.clone(), - shared_types, - source_indices.clone(), - ) - } - } - None => "_".to_string(), - } - } else { - "_".to_string() - } } - _ => "_".to_string(), - } } - -pub fn lambda_scope_from_children( - scope: Rc, - params: Rc>, - param_nodes: Rc>>, -) -> Rc { - Rc::new( - params - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - .fold(scope.clone(), |acc: Rc, pair: (i64, String)| { - let idx = pair.0.clone(); - let param_name = pair.1.clone(); - let param_type = match param_nodes.clone().get(idx.clone() as usize).cloned() { - Some(pn) => match pn.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { - node: resolved_type, - .. - }) => resolved_type.clone(), - _ => type_variable_node("lambda_param".to_string()), - }, - None => type_variable_node("lambda_param".to_string()), - }; - extend_scope( - &acc, - ¶m_name, - param_type.clone(), - Rc::new(SubValueRelation::SubValueUnknown), - ) - }) } -pub fn lambda_param_type_strs( - params: Rc>, - param_nodes: Rc>>, - fallback_types: Rc>, - shared_types: Rc>, - source_indices: Rc>>, -) -> Rc> { - Rc::new({ - let mut __result = Vec::new(); - for pair in Rc::new( - params - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - { - __result.push({ - let idx = pair.0.clone(); - let param_name = pair.1.clone(); - let inferred_type = match param_nodes.clone().get(idx.clone() as usize).cloned() { - Some(pn) => match pn.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { - node: param_type, .. - }) => { - let param_is_error = if (param_type.inferred.clone() != None) { - is_compiler_error(param_type.inferred.clone().clone().unwrap()) - } else { - false - }; - let param_is_type_var = if (param_type.inferred.clone() != None) { - is_type_variable(param_type.inferred.clone().clone().unwrap()) - } else { - false - }; - if (param_is_type_var.clone() || param_is_error.clone()) { - None - } else { - Some(render_rust_type( - param_type.clone(), - shared_types.clone(), - source_indices.clone(), - )) - } - } - _ => None, - }, - None => None, +pub fn collection_element_type(receiver_type: Option>, shared_types: Rc>, source_indices: &Rc>>) -> String { + match receiver_type.as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => { + let __rt_is_container = node_is_element_collection(&rt, source_indices.clone()); +if __rt_is_container { + match rt.children.clone().first().cloned() { + Some(elem_child) => { + let elem_node = child_type_node(&elem_child); +let elem_is_error = if (elem_node.inferred.clone() != None) { + is_compiler_error(elem_node.inferred.clone().clone().unwrap()) + } else { + false }; - let fallback_type = match fallback_types.clone().get(idx.clone() as usize).cloned() - { - Some(ty) => ty.clone(), - None => "_".to_string(), +let elem_is_type_var = if (elem_node.inferred.clone() != None) { + is_type_variable(elem_node.inferred.clone().clone().unwrap()) + } else { + false }; - let spec = language_spec(RenderTarget::Rust); - let ident = emit_ident(param_name.clone(), RenderTarget::Rust); - match inferred_type.clone() { - Some(ty) => apply_type_template2( - spec.annotations.clone().lambda_param_typed.clone(), - ident.clone(), - ty.clone(), - ), - None => apply_type_template2( - spec.annotations.clone().lambda_param_typed.clone(), - ident.clone(), - fallback_type.clone(), - ), +if (elem_is_error || elem_is_type_var) { + "_".to_string() + } else { + render_rust_type(elem_node.clone(), shared_types, source_indices.clone()) } - }); +}, + None => "_".to_string(), +} + } else { + "_".to_string() } - __result - }) +}, + _ => "_".to_string(), +} } -pub fn emit_typed_collection_lambda( - lambda_expr: &Rc, - elem_type_str: String, - registry: Rc>>, - scope: &Rc, - depth: i64, - shared_types: &Rc>, - emit_info: Rc, -) -> String { - match (*lambda_expr.expr_data.clone()).clone() { - ExprData::ExprLambda => { - let ps = lambda_param_names_at( - lambda_expr.clone(), - scope.type_env.clone().source_indices.clone(), - ); - let bd = lambda_body(lambda_expr.clone()); - let pn = Rc::new( - lambda_expr - .children - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ); - let param_strs = lambda_param_type_strs( - ps.clone(), - pn.clone(), - Rc::new(vec![elem_type_str]), - shared_types.clone(), - scope.type_env.clone().source_indices.clone(), - ); - let params_str = param_strs.join(&", ".to_string()); - let lambda_scope = lambda_scope_from_children(scope.clone(), ps.clone(), pn.clone()); - let body_str = emit_typed_expr( - bd, - registry, - &lambda_scope, - depth, - shared_types.clone(), - emit_info, - 1024, - ); - v2_rt::concat( - v2_rt::concat(v2_rt::concat("|".to_string(), params_str), "| ".to_string()), - body_str, - ) - } - _ => emit_typed_expr( - lambda_expr.clone(), - registry, - &scope, - depth, - shared_types.clone(), - emit_info, - 1024, - ), - } +pub fn lambda_scope_from_children(scope: Rc, params: Rc>, param_nodes: Rc>>) -> Rc { + Rc::new(params.iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned().fold(scope.clone(), |acc: Rc, pair: (i64, String)| { + let idx = pair.0.clone(); +let param_name = pair.1.clone(); +let param_type = match param_nodes.clone().get(idx.clone() as usize).cloned() { + Some(pn) => match pn.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: resolved_type, .. }) => resolved_type.clone(), + _ => type_variable_node("lambda_param".to_string()), +}, + None => type_variable_node("lambda_param".to_string()), +}; +extend_scope(&acc, ¶m_name, param_type.clone(), Rc::new(SubValueRelation::SubValueUnknown)) +}) } -pub fn emit_typed_fold_lambda( - lambda_expr: &Rc, - acc_type_str: &String, - elem_type_str: String, - registry: Rc>>, - scope: &Rc, - depth: i64, - shared_types: &Rc>, - emit_info: &Rc, -) -> String { - match (*lambda_expr.expr_data.clone()).clone() { - ExprData::ExprLambda => { - let ps = lambda_param_names_at( - lambda_expr.clone(), - scope.type_env.clone().source_indices.clone(), - ); - let bd = lambda_body(lambda_expr.clone()); - let pn = Rc::new( - lambda_expr - .children - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ); - let safe_acc_type = if (((acc_type_str.clone().as_str() - == "Rc>".to_string().as_str()) - || (acc_type_str.clone().as_str() == "Vec<()>".to_string().as_str())) - || (acc_type_str.clone().as_str() == "Option<()>".to_string().as_str())) - { - "_".to_string() +pub fn lambda_param_type_strs(params: Rc>, param_nodes: Rc>>, fallback_types: Rc>, shared_types: Rc>, source_indices: Rc>>) -> Rc> { + Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(params.iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { __result.push({ + let idx = pair.0.clone(); +let param_name = pair.1.clone(); +let inferred_type = match param_nodes.clone().get(idx.clone() as usize).cloned() { + Some(pn) => match pn.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: param_type, .. }) => { + let param_is_error = if (param_type.inferred.clone() != None) { + is_compiler_error(param_type.inferred.clone().clone().unwrap()) } else { - acc_type_str.clone() + false }; - let fallback_types = Rc::new({ - let mut __result = Vec::new(); - for pair in Rc::new( - ps.clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - { - __result.push(if (pair.0.clone() == 0) { - safe_acc_type.clone() - } else { - elem_type_str.clone() - }); - } - __result - }); - let param_strs = lambda_param_type_strs( - ps.clone(), - Rc::new(vec![]), - fallback_types, - shared_types.clone(), - scope.type_env.clone().source_indices.clone(), - ); - let params_str = param_strs.join(&", ".to_string()); - let lambda_scope = lambda_scope_from_children(scope.clone(), ps.clone(), pn); - let body_str = emit_typed_expr( - bd, - registry, - &lambda_scope, - depth, - shared_types.clone(), - emit_info.clone(), - 1024, - ); - let acc_name = match ps.clone().first().cloned() { - Some(n) => n.clone(), - None => "".to_string(), +let param_is_type_var = if (param_type.inferred.clone() != None) { + is_type_variable(param_type.inferred.clone().clone().unwrap()) + } else { + false }; - let needs_unwrap = ((acc_name.clone().as_str() != "".to_string().as_str()) - && emit_map_has(emit_info.owned_bindings.clone(), acc_name.clone())); - if needs_unwrap { - { - let acc_ident = emit_ident(acc_name.clone(), RenderTarget::Rust); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("|".to_string(), params_str), - "| { let ".to_string(), - ), - acc_ident.clone(), - ), - " = Rc::try_unwrap(".to_string(), - ), - acc_ident.clone(), - ), - ").unwrap_or_else(|rc| (*rc).clone()); ".to_string(), - ), - body_str, - ), - " }".to_string(), - ) - } +if (param_is_type_var.clone() || param_is_error.clone()) { + None } else { - v2_rt::concat( - v2_rt::concat(v2_rt::concat("|".to_string(), params_str), "| ".to_string()), - body_str, - ) + Some(render_rust_type(param_type.clone(), shared_types.clone(), source_indices.clone())) } +}, + _ => None, +}, + None => None, +}; +let fallback_type = match fallback_types.clone().get(idx.clone() as usize).cloned() { + Some(ty) => ty.clone(), + None => "_".to_string(), +}; +let spec = language_spec(RenderTarget::Rust); +let ident = emit_ident(param_name.clone(), RenderTarget::Rust); +match inferred_type.clone() { + Some(ty) => apply_type_template2(spec.annotations.clone().lambda_param_typed.clone(), ident.clone(), ty.clone()), + None => apply_type_template2(spec.annotations.clone().lambda_param_typed.clone(), ident.clone(), fallback_type.clone()), +} +}); } __result }) +} + +pub fn emit_typed_collection_lambda(lambda_expr: &Rc, elem_type_str: String, registry: Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: Rc) -> String { + match (*lambda_expr.expr_data.clone()).clone() { + ExprData::ExprLambda => { + let ps = lambda_param_names_at(lambda_expr.clone(), scope.type_env.clone().source_indices.clone()); +let bd = lambda_body(lambda_expr.clone()); +let pn = Rc::new(lambda_expr.children.clone().iter().cloned().skip(1 as usize).collect::>()); +let param_strs = lambda_param_type_strs(ps.clone(), pn.clone(), Rc::new(vec![elem_type_str]), shared_types.clone(), scope.type_env.clone().source_indices.clone()); +let params_str = param_strs.join(&", ".to_string()); +let lambda_scope = lambda_scope_from_children(scope.clone(), ps.clone(), pn.clone()); +let body_str = emit_typed_expr(bd, registry, &lambda_scope, depth, shared_types.clone(), emit_info, 1024); +v2_rt::concat(v2_rt::concat(v2_rt::concat("|".to_string(), params_str), "| ".to_string()), body_str) +}, + _ => emit_typed_expr(lambda_expr.clone(), registry, &scope, depth, shared_types.clone(), emit_info, 1024), +} +} + +pub fn emit_typed_fold_lambda(lambda_expr: &Rc, acc_type_str: &String, elem_type_str: String, registry: Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { + match (*lambda_expr.expr_data.clone()).clone() { + ExprData::ExprLambda => { + let ps = lambda_param_names_at(lambda_expr.clone(), scope.type_env.clone().source_indices.clone()); +let bd = lambda_body(lambda_expr.clone()); +let pn = Rc::new(lambda_expr.children.clone().iter().cloned().skip(1 as usize).collect::>()); +let safe_acc_type = if (((acc_type_str.clone().as_str() == "Rc>".to_string().as_str()) || (acc_type_str.clone().as_str() == "Vec<()>".to_string().as_str())) || (acc_type_str.clone().as_str() == "Option<()>".to_string().as_str())) { + "_".to_string() + } else { + acc_type_str.clone() + }; +let fallback_types = Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(ps.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { __result.push(if (pair.0.clone() == 0) { + safe_acc_type.clone() + } else { + elem_type_str.clone() + }); } __result }); +let param_strs = lambda_param_type_strs(ps.clone(), Rc::new(vec![]), fallback_types, shared_types.clone(), scope.type_env.clone().source_indices.clone()); +let params_str = param_strs.join(&", ".to_string()); +let lambda_scope = lambda_scope_from_children(scope.clone(), ps.clone(), pn); +let body_str = emit_typed_expr(bd, registry, &lambda_scope, depth, shared_types.clone(), emit_info.clone(), 1024); +let acc_name = match ps.clone().first().cloned() { + Some(n) => n.clone(), + None => "".to_string(), +}; +let needs_unwrap = ((acc_name.clone().as_str() != "".to_string().as_str()) && emit_map_has(emit_info.owned_bindings.clone(), acc_name.clone())); +if needs_unwrap { + { + let acc_ident = emit_ident(acc_name.clone(), RenderTarget::Rust); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("|".to_string(), params_str), "| { let ".to_string()), acc_ident.clone()), " = Rc::try_unwrap(".to_string()), acc_ident.clone()), ").unwrap_or_else(|rc| (*rc).clone()); ".to_string()), body_str), " }".to_string()) +} + } else { + v2_rt::concat(v2_rt::concat(v2_rt::concat("|".to_string(), params_str), "| ".to_string()), body_str) } - _ => emit_typed_expr( - lambda_expr.clone(), - registry, - &scope, - depth, - shared_types.clone(), - emit_info.clone(), - 1024, - ), - } +}, + _ => emit_typed_expr(lambda_expr.clone(), registry, &scope, depth, shared_types.clone(), emit_info.clone(), 1024), +} } -pub fn emit_rust_fold_method_call( - method_call_node: Rc, - fold_accumulator_type: Option>, - result_type: Option>, - receiver: &Rc, - args: &Rc>>, - registry: &Rc>>, - scope: &Rc, - depth: i64, - shared_types: &Rc>, - emit_info: &Rc, -) -> String { +pub fn emit_rust_fold_method_call(method_call_node: Rc, fold_accumulator_type: Option>, result_type: Option>, receiver: &Rc, args: &Rc>>, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { { - let recv_str = emit_typed_expr( - receiver.clone(), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - let elem_type_str = collection_element_type( - receiver.inferred.clone(), - shared_types.clone(), - &scope.type_env.clone().source_indices.clone(), - ); - let contextual_acc_type = match result_type.as_deref().cloned() { - Some(InferredNode::Resolved { - node: method_result_type, - .. - }) => Some(method_result_type.clone()), - _ => None, - }; - let acc_type_node = match fold_accumulator_type { - Some(acc_type) => { - let acc_children_have_unit = ({ - let mut __found = false; - for c in acc_type.children.clone().iter().cloned() { - if (is_unit_like(&c) || (c.ident_span.clone() == None)) { - __found = true; - break; - } - } - __found - } || { - let mut __found = false; - for c in acc_type.children.clone().iter().cloned() { - if { - let mut __found = false; - for gc in c.children.clone().iter().cloned() { - if (is_unit_like(&gc) || (gc.ident_span.clone() == None)) { - __found = true; - break; - } - } - __found - } { - __found = true; - break; - } - } - __found - }); - let is_under_resolved_map = (node_is_keyed_collection( - &acc_type, - scope.type_env.clone().source_indices.clone(), - ) && (((acc_type.children.clone().len() as i64) - == 0) - || acc_children_have_unit)); - let is_under_resolved_list = (node_is_element_collection( - &acc_type, - scope.type_env.clone().source_indices.clone(), - ) && ((acc_type.children.clone().len() as i64) == 0)); - let is_under_resolved_non_collection = ((!node_is_keyed_collection( - &acc_type, - scope.type_env.clone().source_indices.clone(), - ) && !node_is_element_collection( - &acc_type, - scope.type_env.clone().source_indices.clone(), - )) && !node_is_collection( - &acc_type, - scope.type_env.clone().source_indices.clone(), - )); - if ((is_under_resolved_map || is_under_resolved_list) - || is_under_resolved_non_collection) - { - match contextual_acc_type { - Some(concrete_type) => concrete_type.clone(), - None => acc_type.clone(), - } - } else { - acc_type.clone() - } + let recv_str = emit_typed_expr(receiver.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +let elem_type_str = collection_element_type(receiver.inferred.clone(), shared_types.clone(), &scope.type_env.clone().source_indices.clone()); +let contextual_acc_type = match result_type.as_deref().cloned() { + Some(InferredNode::Resolved { node: method_result_type, .. }) => Some(method_result_type.clone()), + _ => None, +}; +let acc_type_node = match fold_accumulator_type { + Some(acc_type) => { + let acc_children_have_unit = ({ let mut __found = false; for c in acc_type.children.clone().iter().cloned() { if (is_unit_like(&c) || (c.ident_span.clone() == None)) { __found = true; break; } } __found } || { let mut __found = false; for c in acc_type.children.clone().iter().cloned() { if { let mut __found = false; for gc in c.children.clone().iter().cloned() { if (is_unit_like(&gc) || (gc.ident_span.clone() == None)) { __found = true; break; } } __found } { __found = true; break; } } __found }); +let is_under_resolved_map = (node_is_keyed_collection(&acc_type, scope.type_env.clone().source_indices.clone()) && (((acc_type.children.clone().len() as i64) == 0) || acc_children_have_unit)); +let is_under_resolved_list = (node_is_element_collection(&acc_type, scope.type_env.clone().source_indices.clone()) && ((acc_type.children.clone().len() as i64) == 0)); +let is_under_resolved_non_collection = ((!node_is_keyed_collection(&acc_type, scope.type_env.clone().source_indices.clone()) && !node_is_element_collection(&acc_type, scope.type_env.clone().source_indices.clone())) && !node_is_collection(&acc_type, scope.type_env.clone().source_indices.clone())); +if ((is_under_resolved_map || is_under_resolved_list) || is_under_resolved_non_collection) { + match contextual_acc_type { + Some(concrete_type) => concrete_type.clone(), + None => acc_type.clone(), +} + } else { + acc_type.clone() } - None => match contextual_acc_type { - Some(concrete_type) => concrete_type.clone(), - None => match args.clone().first().cloned() { - Some(init_arg) => { - if (arg_value(&init_arg).inferred.clone() != None) { - resolved_type(arg_value(&init_arg)) - } else { - type_variable_node("fold_accum".to_string()) - } - } - None => type_variable_node("fold_accum".to_string()), - }, - }, - }; - let acc_type_name = authored_name_at( - scope.type_env.clone().source_indices.clone(), - &acc_type_node, - ); - let fold_lambda_node = match args.clone().get(1 as usize).cloned() { - Some(a) => arg_value(&a), - None => type_variable_node("".to_string()), - }; - let acc_param_name = match (*fold_lambda_node.expr_data.clone()).clone() { - ExprData::ExprLambda => match lambda_param_names_at( - fold_lambda_node.clone(), - scope.type_env.clone().source_indices.clone(), - ) - .first() - .cloned() - { - Some(n) => n.clone(), - None => "".to_string(), - }, - _ => "".to_string(), - }; - let fold_proof = analyze_single_fold( - &method_call_node, - &scope.type_env.clone().source_indices.clone(), - ); - let structural_unwrap = ((fold_proof.eligible.clone() - && fold_proof.body_constructs_acc.clone()) - && fold_proof.safe_field_moves.clone()); - let structural_move = - (fold_proof.eligible.clone() && fold_proof.whole_acc_single_use.clone()); - let acc_unwrap = - (structural_unwrap && emit_map_has(shared_types.clone(), acc_type_name.clone())); - let fold_emit_info = if acc_unwrap { +}, + None => match contextual_acc_type { + Some(concrete_type) => concrete_type.clone(), + None => match args.clone().first().cloned() { + Some(init_arg) => if (arg_value(&init_arg).inferred.clone() != None) { + resolved_type(arg_value(&init_arg)) + } else { + type_variable_node("fold_accum".to_string()) + }, + None => type_variable_node("fold_accum".to_string()), +}, +}, +}; +let acc_type_name = authored_name_at(scope.type_env.clone().source_indices.clone(), &acc_type_node); +let fold_lambda_node = match args.clone().get(1 as usize).cloned() { + Some(a) => arg_value(&a), + None => type_variable_node("".to_string()), +}; +let acc_param_name = match (*fold_lambda_node.expr_data.clone()).clone() { + ExprData::ExprLambda => match lambda_param_names_at(fold_lambda_node.clone(), scope.type_env.clone().source_indices.clone()).first().cloned() { + Some(n) => n.clone(), + None => "".to_string(), +}, + _ => "".to_string(), +}; +let fold_proof = analyze_single_fold(&method_call_node, &scope.type_env.clone().source_indices.clone()); +let structural_unwrap = ((fold_proof.eligible.clone() && fold_proof.body_constructs_acc.clone()) && fold_proof.safe_field_moves.clone()); +let structural_move = (fold_proof.eligible.clone() && fold_proof.whole_acc_single_use.clone()); +let acc_unwrap = (structural_unwrap && emit_map_has(shared_types.clone(), acc_type_name.clone())); +let fold_emit_info = if acc_unwrap { match (*fold_lambda_node.expr_data.clone()).clone() { - ExprData::ExprLambda => { - let ps = lambda_param_names_at( - fold_lambda_node.clone(), - scope.type_env.clone().source_indices.clone(), - ); - match ps.first().cloned() { - Some(acc_name) => Rc::new(EmitGraphInfo { - type_summaries: emit_info.type_summaries.clone(), - recursive_type_set: emit_info.recursive_type_set.clone(), - fielded_variants: emit_info.fielded_variants.clone(), - shared_types: emit_info.shared_types.clone(), - ownership_index: emit_info.ownership_index.clone(), - movable: emit_info.movable.clone(), - variant_to_enum: emit_info.variant_to_enum.clone(), - owned_bindings: v2_rt::rc_map_insert( - emit_info.owned_bindings.clone(), - acc_name.clone(), - true, - ), - read_only_params_index: emit_info.read_only_params_index.clone(), - read_only_params: emit_info.read_only_params.clone(), - }), - None => emit_info.clone(), - } - } - _ => emit_info.clone(), - } + ExprData::ExprLambda => { + let ps = lambda_param_names_at(fold_lambda_node.clone(), scope.type_env.clone().source_indices.clone()); +match ps.first().cloned() { + Some(acc_name) => Rc::new(EmitGraphInfo { + type_summaries: emit_info.type_summaries.clone(), + recursive_type_set: emit_info.recursive_type_set.clone(), + fielded_variants: emit_info.fielded_variants.clone(), + shared_types: emit_info.shared_types.clone(), + ownership_index: emit_info.ownership_index.clone(), + movable: emit_info.movable.clone(), + variant_to_enum: emit_info.variant_to_enum.clone(), + owned_bindings: v2_rt::rc_map_insert(emit_info.owned_bindings.clone(), acc_name.clone(), true), + read_only_params_index: emit_info.read_only_params_index.clone(), + read_only_params: emit_info.read_only_params.clone(), +}), + None => emit_info.clone(), +} +}, + _ => emit_info.clone(), +} } else { if structural_move { match (*fold_lambda_node.expr_data.clone()).clone() { - ExprData::ExprLambda => { - let ps = lambda_param_names_at( - fold_lambda_node.clone(), - scope.type_env.clone().source_indices.clone(), - ); - match ps.first().cloned() { - Some(acc_name) => Rc::new(EmitGraphInfo { - type_summaries: emit_info.type_summaries.clone(), - recursive_type_set: emit_info.recursive_type_set.clone(), - fielded_variants: emit_info.fielded_variants.clone(), - shared_types: emit_info.shared_types.clone(), - ownership_index: emit_info.ownership_index.clone(), - movable: v2_rt::rc_map_insert( - emit_info.movable.clone(), - acc_name.clone(), - true, - ), - variant_to_enum: emit_info.variant_to_enum.clone(), - owned_bindings: emit_info.owned_bindings.clone(), - read_only_params_index: emit_info.read_only_params_index.clone(), - read_only_params: emit_info.read_only_params.clone(), - }), - None => emit_info.clone(), - } - } - _ => emit_info.clone(), - } + ExprData::ExprLambda => { + let ps = lambda_param_names_at(fold_lambda_node.clone(), scope.type_env.clone().source_indices.clone()); +match ps.first().cloned() { + Some(acc_name) => Rc::new(EmitGraphInfo { + type_summaries: emit_info.type_summaries.clone(), + recursive_type_set: emit_info.recursive_type_set.clone(), + fielded_variants: emit_info.fielded_variants.clone(), + shared_types: emit_info.shared_types.clone(), + ownership_index: emit_info.ownership_index.clone(), + movable: v2_rt::rc_map_insert(emit_info.movable.clone(), acc_name.clone(), true), + variant_to_enum: emit_info.variant_to_enum.clone(), + owned_bindings: emit_info.owned_bindings.clone(), + read_only_params_index: emit_info.read_only_params_index.clone(), + read_only_params: emit_info.read_only_params.clone(), +}), + None => emit_info.clone(), +} +}, + _ => emit_info.clone(), +} } else { emit_info.clone() } }; - let acc_type_str = render_rust_type( - acc_type_node.clone(), - shared_types.clone(), - scope.type_env.clone().source_indices.clone(), - ); - let is_bare_container = (((acc_type_node.children.clone().len() as i64) == 0) - && is_container_type(acc_type_name.clone())); - let lambda_acc_type_str = if is_bare_container { +let acc_type_str = render_rust_type(acc_type_node.clone(), shared_types.clone(), scope.type_env.clone().source_indices.clone()); +let is_bare_container = (((acc_type_node.children.clone().len() as i64) == 0) && is_container_type(acc_type_name.clone())); +let lambda_acc_type_str = if is_bare_container { "_".to_string() } else { acc_type_str.clone() }; - let acc_has_unit_child = ({ - let mut __found = false; - for c in acc_type_node.children.clone().iter().cloned() { - if (is_unit_like(&c) || (c.ident_span.clone() == None)) { - __found = true; - break; - } - } - __found - } || { - let mut __found = false; - for c in acc_type_node.children.clone().iter().cloned() { - if { - let mut __found = false; - for gc in c.children.clone().iter().cloned() { - if (is_unit_like(&gc) || (gc.ident_span.clone() == None)) { - __found = true; - break; - } - } - __found - } { - __found = true; - break; - } - } - __found - }); - let init_str = match args.clone().first().cloned() { - Some(init_arg) => match (*arg_value(&init_arg).expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { - let init_func = expr_call_func_at( - arg_value(&init_arg), - scope.type_env.clone().source_indices.clone(), - ); - if ((((init_func.clone().as_str() == "empty_map".to_string().as_str()) - && (acc_type_str.clone().as_str() != "_".to_string().as_str())) - && (acc_type_str.clone().as_str() != "".to_string().as_str())) - && !acc_has_unit_child) - { - { - let kv_type_str = rust_empty_map_kv_type_str( - &acc_type_node, - &shared_types, - &scope.type_env.clone().source_indices.clone(), - ); - if (kv_type_str.clone().as_str() != "".to_string().as_str()) { - v2_rt::concat( - v2_rt::concat( - "v2_rt::rc_empty_map::<".to_string(), - kv_type_str.clone(), - ), - ">()".to_string(), - ) - } else { - "Rc::new(HashMap::new()) /* BRIDGE: fold empty_map value type unresolved */".to_string() - } - } +let acc_has_unit_child = ({ let mut __found = false; for c in acc_type_node.children.clone().iter().cloned() { if (is_unit_like(&c) || (c.ident_span.clone() == None)) { __found = true; break; } } __found } || { let mut __found = false; for c in acc_type_node.children.clone().iter().cloned() { if { let mut __found = false; for gc in c.children.clone().iter().cloned() { if (is_unit_like(&gc) || (gc.ident_span.clone() == None)) { __found = true; break; } } __found } { __found = true; break; } } __found }); +let init_str = match args.clone().first().cloned() { + Some(init_arg) => match (*arg_value(&init_arg).expr_data.clone()).clone() { + ExprData::ExprCall { .. } => { + let init_func = expr_call_func_at(arg_value(&init_arg), scope.type_env.clone().source_indices.clone()); +if ((((init_func.clone().as_str() == "empty_map".to_string().as_str()) && (acc_type_str.clone().as_str() != "_".to_string().as_str())) && (acc_type_str.clone().as_str() != "".to_string().as_str())) && !acc_has_unit_child) { + { + let kv_type_str = rust_empty_map_kv_type_str(&acc_type_node, &shared_types, &scope.type_env.clone().source_indices.clone()); +if (kv_type_str.clone().as_str() != "".to_string().as_str()) { + v2_rt::concat(v2_rt::concat("v2_rt::rc_empty_map::<".to_string(), kv_type_str.clone()), ">()".to_string()) } else { - if (init_func.clone().as_str() == "empty_map".to_string().as_str()) { - "Rc::new(HashMap::new()) /* BRIDGE: fold empty_map accumulator type unresolved */".to_string() - } else { - emit_typed_expr( - arg_value(&init_arg), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - fold_emit_info.clone(), - 1024, - ) - } + "Rc::new(HashMap::new()) /* BRIDGE: fold empty_map value type unresolved */".to_string() } +} + } else { + if (init_func.clone().as_str() == "empty_map".to_string().as_str()) { + "Rc::new(HashMap::new()) /* BRIDGE: fold empty_map accumulator type unresolved */".to_string() + } else { + emit_typed_expr(arg_value(&init_arg), registry.clone(), &scope, depth.clone(), shared_types.clone(), fold_emit_info.clone(), 1024) } - _ => emit_typed_expr( - arg_value(&init_arg), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - fold_emit_info.clone(), - 1024, - ), - }, - None => "compile_error!(\"missing fold init argument\")".to_string(), - }; - let fold_fn = match args.clone().get(1 as usize).cloned() { - Some(a) => emit_typed_fold_lambda( - &arg_value(&a), - &lambda_acc_type_str, - elem_type_str, - registry.clone(), - &scope, - depth.clone(), - &shared_types, - &fold_emit_info, - ), - None => "compile_error!(\"missing fold function argument\")".to_string(), - }; - let sharing = language_spec(RenderTarget::Rust).sharing.clone(); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - apply_type_template1(sharing.iter_owned.clone(), recv_str), - ".fold(".to_string(), - ), - init_str, - ), - ", ".to_string(), - ), - fold_fn, - ), - ")".to_string(), - ) - } + } +}, + _ => emit_typed_expr(arg_value(&init_arg), registry.clone(), &scope, depth.clone(), shared_types.clone(), fold_emit_info.clone(), 1024), +}, + None => "compile_error!(\"missing fold init argument\")".to_string(), +}; +let fold_fn = match args.clone().get(1 as usize).cloned() { + Some(a) => emit_typed_fold_lambda(&arg_value(&a), &lambda_acc_type_str, elem_type_str, registry.clone(), &scope, depth.clone(), &shared_types, &fold_emit_info), + None => "compile_error!(\"missing fold function argument\")".to_string(), +}; +let sharing = language_spec(RenderTarget::Rust).sharing.clone(); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(apply_type_template1(sharing.iter_owned.clone(), recv_str), ".fold(".to_string()), init_str), ", ".to_string()), fold_fn), ")".to_string()) +} } -pub fn emit_rust_sort_by_method_call( - receiver: &Rc, - args: Rc>>, - registry: &Rc>>, - scope: &Rc, - depth: i64, - shared_types: &Rc>, - emit_info: &Rc, -) -> String { +pub fn emit_rust_sort_by_method_call(receiver: &Rc, args: Rc>>, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { { - let recv_str = emit_typed_expr( - receiver.clone(), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - let elem_type_str = match receiver.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - let resolved = rt.clone(); - let elem = for_each_element_type_node( - resolved, - scope.type_env.clone().source_indices.clone(), - ); - let elem_is_type_var = if (elem.inferred.clone() != None) { - is_type_variable(elem.inferred.clone().clone().unwrap()) - } else { - false - }; - if ((elem.ident_span.clone() != None) && !elem_is_type_var) { - render_rust_type( - elem.clone(), - shared_types.clone(), - scope.type_env.clone().source_indices.clone(), - ) - } else { - "_".to_string() - } + let recv_str = emit_typed_expr(receiver.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +let elem_type_str = match receiver.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => { + let resolved = rt.clone(); +let elem = for_each_element_type_node(resolved, scope.type_env.clone().source_indices.clone()); +let elem_is_type_var = if (elem.inferred.clone() != None) { + is_type_variable(elem.inferred.clone().clone().unwrap()) + } else { + false + }; +if ((elem.ident_span.clone() != None) && !elem_is_type_var) { + render_rust_type(elem.clone(), shared_types.clone(), scope.type_env.clone().source_indices.clone()) + } else { + "_".to_string() } - _ => "_".to_string(), - }; - let sort_key_fn = match args.first().cloned() { - Some(a) => emit_typed_collection_lambda( - &arg_value(&a), - elem_type_str.clone(), - registry.clone(), - &scope, - depth.clone(), - &shared_types, - emit_info.clone(), - ), - None => "compile_error!(\"missing sort_by key function argument\")".to_string(), - }; - let sharing = language_spec(RenderTarget::Rust).sharing.clone(); - let iter_str = apply_type_template1(sharing.iter_owned.clone(), recv_str); - let a_clone = apply_type_template1(sharing.clone_value.clone(), "a".to_string()); - let b_clone = apply_type_template1(sharing.clone_value.clone(), "b".to_string()); - if (elem_type_str.clone().as_str() == "_".to_string().as_str()) { +}, + _ => "_".to_string(), +}; +let sort_key_fn = match args.first().cloned() { + Some(a) => emit_typed_collection_lambda(&arg_value(&a), elem_type_str.clone(), registry.clone(), &scope, depth.clone(), &shared_types, emit_info.clone()), + None => "compile_error!(\"missing sort_by key function argument\")".to_string(), +}; +let sharing = language_spec(RenderTarget::Rust).sharing.clone(); +let iter_str = apply_type_template1(sharing.iter_owned.clone(), recv_str); +let a_clone = apply_type_template1(sharing.clone_value.clone(), "a".to_string()); +let b_clone = apply_type_template1(sharing.clone_value.clone(), "b".to_string()); +if (elem_type_str.clone().as_str() == "_".to_string().as_str()) { v2_rt::concat(v2_rt::concat("Rc::new({ let mut __sorted: Vec<_> = ".to_string(), iter_str), ".collect(); __sorted.sort_by(|a, b| { a.partial_cmp(b).unwrap_or(std::cmp::Ordering::Equal) }); __sorted })".to_string()) } else { v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("Rc::new({ let mut __sorted: Vec<_> = ".to_string(), iter_str), ".collect(); __sorted.sort_by(|a: &".to_string()), elem_type_str.clone()), ", b: &".to_string()), elem_type_str.clone()), "| { let __ka = (".to_string()), sort_key_fn.clone()), ")(".to_string()), a_clone), "); let __kb = (".to_string()), sort_key_fn.clone()), ")(".to_string()), b_clone), "); __ka.partial_cmp(&__kb).unwrap_or(std::cmp::Ordering::Equal) }); __sorted })".to_string()) } - } +} } -pub fn emit_rust_map_method_call( - receiver: &Rc, - args: &Rc>>, - registry: &Rc>>, - scope: &Rc, - depth: i64, - shared_types: &Rc>, - emit_info: &Rc, -) -> String { +pub fn emit_rust_map_method_call(receiver: &Rc, args: &Rc>>, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { { - let recv_str = emit_typed_expr( - receiver.clone(), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - let first_arg_str = emit_typed_first_arg( - args.clone(), - registry.clone(), - scope.clone(), - depth.clone(), - shared_types.clone(), - emit_info.clone(), - ); - let recv_is_optional = match receiver.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - (rt.return_cardinality.clone() == Cardinality::CardOptional) - } - _ => false, - }; - if recv_is_optional { + let recv_str = emit_typed_expr(receiver.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +let first_arg_str = emit_typed_first_arg(args.clone(), registry.clone(), scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone()); +let recv_is_optional = match receiver.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => (rt.return_cardinality.clone() == Cardinality::CardOptional), + _ => false, +}; +if recv_is_optional { match args.clone().first().cloned() { - Some(a) => match (*arg_value(&a).expr_data.clone()).clone() { - ExprData::ExprLambda => { - let bd = match arg_value(&a).children.clone().first().cloned() { - Some(v) => v.clone(), - None => arg_value(&a), - }; - let ps = lambda_param_names_at( - arg_value(&a), - scope.type_env.clone().source_indices.clone(), - ); - let dag_name = match ps.clone().first().cloned() { - Some(n) => n.clone(), - None => "__x".to_string(), - }; - let p = emit_ident(dag_name, RenderTarget::Rust); - let lambda_scope = lambda_scope_from_children( - scope.clone(), - ps.clone(), - Rc::new( - arg_value(&a) - .children - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - ); - let body_str = emit_typed_expr( - bd, - registry.clone(), - &lambda_scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(v2_rt::concat(recv_str, ".map(|".to_string()), p), - "| ".to_string(), - ), - body_str, - ), - ")".to_string(), - ) - } - _ => v2_rt::concat( - v2_rt::concat(v2_rt::concat(recv_str, ".map(".to_string()), first_arg_str), - ")".to_string(), - ), - }, - None => v2_rt::concat( - v2_rt::concat(v2_rt::concat(recv_str, ".map(".to_string()), first_arg_str), - ")".to_string(), - ), - } + Some(a) => match (*arg_value(&a).expr_data.clone()).clone() { + ExprData::ExprLambda => { + let bd = match arg_value(&a).children.clone().first().cloned() { + Some(v) => v.clone(), + None => arg_value(&a), +}; +let ps = lambda_param_names_at(arg_value(&a), scope.type_env.clone().source_indices.clone()); +let dag_name = match ps.clone().first().cloned() { + Some(n) => n.clone(), + None => "__x".to_string(), +}; +let p = emit_ident(dag_name, RenderTarget::Rust); +let lambda_scope = lambda_scope_from_children(scope.clone(), ps.clone(), Rc::new(arg_value(&a).children.clone().iter().cloned().skip(1 as usize).collect::>())); +let body_str = emit_typed_expr(bd, registry.clone(), &lambda_scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(recv_str, ".map(|".to_string()), p), "| ".to_string()), body_str), ")".to_string()) +}, + _ => v2_rt::concat(v2_rt::concat(v2_rt::concat(recv_str, ".map(".to_string()), first_arg_str), ")".to_string()), +}, + None => v2_rt::concat(v2_rt::concat(v2_rt::concat(recv_str, ".map(".to_string()), first_arg_str), ")".to_string()), +} } else { { let sharing = language_spec(RenderTarget::Rust).sharing.clone(); - let iter_str = apply_type_template1(sharing.iter_owned.clone(), recv_str); - match args.clone().first().cloned() { - Some(a) => { - match (*arg_value(&a).expr_data.clone()).clone() { - ExprData::ExprLambda => { - let bd = match arg_value(&a).children.clone().first().cloned() { - Some(v) => v.clone(), - None => arg_value(&a), - }; - let ps = lambda_param_names_at( - arg_value(&a), - scope.type_env.clone().source_indices.clone(), - ); - let dag_name = match ps.clone().first().cloned() { - Some(n) => n.clone(), - None => "__x".to_string(), - }; - let p = emit_ident(dag_name, RenderTarget::Rust); - let lambda_scope = lambda_scope_from_children( - scope.clone(), - ps.clone(), - Rc::new( - arg_value(&a) - .children - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - ); - let body_str = emit_typed_expr( - bd, - registry.clone(), - &lambda_scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("Rc::new({ let mut __result = Vec::new(); for ".to_string(), p), " in ".to_string()), iter_str), " { __result.push(".to_string()), body_str), "); } __result })".to_string()) - } - _ => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("Rc::new(".to_string(), iter_str), - ".map(".to_string(), - ), - first_arg_str, - ), - ").collect::>())".to_string(), - ), - } - } - None => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("Rc::new(".to_string(), iter_str), - ".map(".to_string(), - ), - first_arg_str, - ), - ").collect::>())".to_string(), - ), - } - } +let iter_str = apply_type_template1(sharing.iter_owned.clone(), recv_str); +match args.clone().first().cloned() { + Some(a) => match (*arg_value(&a).expr_data.clone()).clone() { + ExprData::ExprLambda => { + let bd = match arg_value(&a).children.clone().first().cloned() { + Some(v) => v.clone(), + None => arg_value(&a), +}; +let ps = lambda_param_names_at(arg_value(&a), scope.type_env.clone().source_indices.clone()); +let dag_name = match ps.clone().first().cloned() { + Some(n) => n.clone(), + None => "__x".to_string(), +}; +let p = emit_ident(dag_name, RenderTarget::Rust); +let lambda_scope = lambda_scope_from_children(scope.clone(), ps.clone(), Rc::new(arg_value(&a).children.clone().iter().cloned().skip(1 as usize).collect::>())); +let body_str = emit_typed_expr(bd, registry.clone(), &lambda_scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("Rc::new({ let mut __result = Vec::new(); for ".to_string(), p), " in ".to_string()), iter_str), " { __result.push(".to_string()), body_str), "); } __result })".to_string()) +}, + _ => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), iter_str), ".map(".to_string()), first_arg_str), ").collect::>())".to_string()), +}, + None => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), iter_str), ".map(".to_string()), first_arg_str), ").collect::>())".to_string()), +} +} } - } +} } -pub fn emit_rust_higher_order_method( - ho_spec: &Rc, - receiver: Rc, - args: &Rc>>, - registry: &Rc>>, - scope: &Rc, - depth: i64, - shared_types: &Rc>, - emit_info: &Rc, -) -> String { +pub fn emit_rust_higher_order_method(ho_spec: &Rc, receiver: Rc, args: &Rc>>, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { { let sharing = language_spec(RenderTarget::Rust).sharing.clone(); - let recv_str = emit_typed_expr( - receiver, - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - let first_arg_str = emit_typed_first_arg( - args.clone(), - registry.clone(), - scope.clone(), - depth.clone(), - shared_types.clone(), - emit_info.clone(), - ); - let iter_str = apply_type_template1(sharing.iter_owned.clone(), recv_str); - match args.clone().first().cloned() { - Some(a) => match (*arg_value(&a).expr_data.clone()).clone() { - ExprData::ExprLambda => { - let bd = match arg_value(&a).children.clone().first().cloned() { - Some(v) => v.clone(), - None => arg_value(&a), - }; - let ps = lambda_param_names_at( - arg_value(&a), - scope.type_env.clone().source_indices.clone(), - ); - let dag_name = match ps.clone().first().cloned() { - Some(n) => n.clone(), - None => "__x".to_string(), - }; - let p = emit_ident(dag_name, RenderTarget::Rust); - let lambda_scope = lambda_scope_from_children( - scope.clone(), - ps.clone(), - Rc::new( - arg_value(&a) - .children - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - ); - let body_str = emit_typed_expr( - bd, - registry.clone(), - &lambda_scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - let inner_iter = apply_type_template1( - sharing.iter_owned.clone(), - v2_rt::concat( - v2_rt::concat("(*".to_string(), body_str.clone()), - ")".to_string(), - ), - ); - let bindings = v2_rt::rc_map_insert( - v2_rt::rc_map_insert( - v2_rt::rc_map_insert( - seed_bindings("param".to_string(), p), - "body".to_string(), - body_str.clone(), - ), - "iter".to_string(), - iter_str, - ), - "inner_iter".to_string(), - inner_iter, - ); - let raw = apply_named_template(ho_spec.inline_template.clone(), &bindings); - if ho_spec.wraps_in_sharing.clone() { - v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), raw), ")".to_string()) - } else { - raw - } - } - _ => { - let bindings = v2_rt::rc_map_insert( - seed_bindings("iter".to_string(), iter_str), - "arg".to_string(), - first_arg_str, - ); - let raw = apply_named_template(ho_spec.fn_ref_template.clone(), &bindings); - if ho_spec.wraps_in_sharing.clone() { - v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), raw), ")".to_string()) - } else { - raw - } - } - }, - None => { - let bindings = v2_rt::rc_map_insert( - seed_bindings("iter".to_string(), iter_str), - "arg".to_string(), - first_arg_str, - ); - let raw = apply_named_template(ho_spec.fn_ref_template.clone(), &bindings); - if ho_spec.wraps_in_sharing.clone() { - v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), raw), ")".to_string()) - } else { - raw - } +let recv_str = emit_typed_expr(receiver, registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +let first_arg_str = emit_typed_first_arg(args.clone(), registry.clone(), scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone()); +let iter_str = apply_type_template1(sharing.iter_owned.clone(), recv_str); +match args.clone().first().cloned() { + Some(a) => match (*arg_value(&a).expr_data.clone()).clone() { + ExprData::ExprLambda => { + let bd = match arg_value(&a).children.clone().first().cloned() { + Some(v) => v.clone(), + None => arg_value(&a), +}; +let ps = lambda_param_names_at(arg_value(&a), scope.type_env.clone().source_indices.clone()); +let dag_name = match ps.clone().first().cloned() { + Some(n) => n.clone(), + None => "__x".to_string(), +}; +let p = emit_ident(dag_name, RenderTarget::Rust); +let lambda_scope = lambda_scope_from_children(scope.clone(), ps.clone(), Rc::new(arg_value(&a).children.clone().iter().cloned().skip(1 as usize).collect::>())); +let body_str = emit_typed_expr(bd, registry.clone(), &lambda_scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +let inner_iter = apply_type_template1(sharing.iter_owned.clone(), v2_rt::concat(v2_rt::concat("(*".to_string(), body_str.clone()), ")".to_string())); +let bindings = v2_rt::rc_map_insert(v2_rt::rc_map_insert(v2_rt::rc_map_insert(seed_bindings("param".to_string(), p), "body".to_string(), body_str.clone()), "iter".to_string(), iter_str), "inner_iter".to_string(), inner_iter); +let raw = apply_named_template(ho_spec.inline_template.clone(), &bindings); +if ho_spec.wraps_in_sharing.clone() { + v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), raw), ")".to_string()) + } else { + raw } - } - } +}, + _ => { + let bindings = v2_rt::rc_map_insert(seed_bindings("iter".to_string(), iter_str), "arg".to_string(), first_arg_str); +let raw = apply_named_template(ho_spec.fn_ref_template.clone(), &bindings); +if ho_spec.wraps_in_sharing.clone() { + v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), raw), ")".to_string()) + } else { + raw + } +}, +}, + None => { + let bindings = v2_rt::rc_map_insert(seed_bindings("iter".to_string(), iter_str), "arg".to_string(), first_arg_str); +let raw = apply_named_template(ho_spec.fn_ref_template.clone(), &bindings); +if ho_spec.wraps_in_sharing.clone() { + v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), raw), ")".to_string()) + } else { + raw + } +}, +} +} } -pub fn emit_rust_get_method_call( - receiver: &Rc, - args: Rc>>, - registry: &Rc>>, - scope: &Rc, - depth: i64, - shared_types: &Rc>, - emit_info: &Rc, -) -> String { +pub fn emit_rust_get_method_call(receiver: &Rc, args: Rc>>, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { { - let recv_str = emit_typed_expr( - receiver.clone(), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - let index_str = match args.first().cloned() { - Some(a) => emit_typed_expr( - arg_value(&a), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ), - None => "compile_error!(\"get method missing index\")".to_string(), - }; - let receiver_resolved = match receiver.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { .. }) => true, - _ => false, - }; - if is_map_typed_expr( - receiver.clone(), - scope.type_env.clone().source_indices.clone(), - ) { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("v2_rt::map_get(&".to_string(), recv_str), - ", ".to_string(), - ), - index_str, - ), - ")".to_string(), - ) + let recv_str = emit_typed_expr(receiver.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +let index_str = match args.first().cloned() { + Some(a) => emit_typed_expr(arg_value(&a), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024), + None => "compile_error!(\"get method missing index\")".to_string(), +}; +let receiver_resolved = match receiver.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { .. }) => true, + _ => false, +}; +if is_map_typed_expr(receiver.clone(), scope.type_env.clone().source_indices.clone()) { + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("v2_rt::map_get(&".to_string(), recv_str), ", ".to_string()), index_str), ")".to_string()) } else { if receiver_resolved { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(v2_rt::concat(recv_str, ".get((".to_string()), index_str), - ") as usize)".to_string(), - ), - clone_iterator_suffix(), - ) + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(recv_str, ".get((".to_string()), index_str), ") as usize)".to_string()), clone_iterator_suffix()) } else { "compile_error!(\"get: receiver type unresolved\")".to_string() } } - } +} } -pub fn emit_rust_with_method_call( - receiver: &Rc, - args: &Rc>>, - registry: &Rc>>, - scope: &Rc, - depth: i64, - shared_types: &Rc>, - emit_info: &Rc, -) -> String { +pub fn emit_rust_with_method_call(receiver: &Rc, args: &Rc>>, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { { - let base_str = emit_typed_expr( - receiver.clone(), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - let type_name = match receiver.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - let rt_is_error = if (rt.inferred.clone() != None) { - is_compiler_error(rt.inferred.clone().clone().unwrap()) - } else { - false - }; - if (rt_is_error || (rt.ident_span.clone() == None)) { - "compile_error!(\"with method missing resolved record type\")".to_string() - } else { - authored_name_at(scope.type_env.clone().source_indices.clone(), &rt) - } + let base_str = emit_typed_expr(receiver.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +let type_name = match receiver.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => { + let rt_is_error = if (rt.inferred.clone() != None) { + is_compiler_error(rt.inferred.clone().clone().unwrap()) + } else { + false + }; +if (rt_is_error || (rt.ident_span.clone() == None)) { + "compile_error!(\"with method missing resolved record type\")".to_string() + } else { + authored_name_at(scope.type_env.clone().source_indices.clone(), &rt) } - _ => "compile_error!(\"with method missing resolved record type\")".to_string(), - }; - if ((args.clone().len() as i64) == 0) { - return "compile_error!(\"with method missing update record\")".to_string(); +}, + _ => "compile_error!(\"with method missing resolved record type\")".to_string(), +}; +if ((args.clone().len() as i64) == 0) { + return "compile_error!(\"with method missing update record\")".to_string() } - let update_arg = arg_value(&args.clone().first().cloned().clone().unwrap()); - let field_strs = match (*update_arg.expr_data.clone()).clone() { - ExprData::ExprRecordLit { .. } => Rc::new({ - let mut __result = Vec::new(); - for f in update_arg.children.clone().iter().cloned() { - __result.push(v2_rt::concat( - v2_rt::concat( - emit_ident( - field_init_node_name_at( - f.clone(), - scope.type_env.clone().source_indices.clone(), - ), - RenderTarget::Rust, - ), - ": ".to_string(), - ), - emit_typed_expr( - field_init_node_value(&f), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ), - )); - } - __result - }), - _ => Rc::new(vec![emit_typed_expr( - update_arg.clone(), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - )]), - }; - let fields_str = field_strs.join(&", ".to_string()); - let needs_rc = emit_map_has(shared_types.clone(), type_name.clone()); - let sharing = language_spec(RenderTarget::Rust).sharing.clone(); - let spread = if needs_rc.clone() { +let update_arg = arg_value(&args.clone().first().cloned().clone().unwrap()); +let field_strs = match (*update_arg.expr_data.clone()).clone() { + ExprData::ExprRecordLit { .. } => Rc::new({ let mut __result = Vec::new(); for f in update_arg.children.clone().iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(emit_ident(field_init_node_name_at(f.clone(), scope.type_env.clone().source_indices.clone()), RenderTarget::Rust), ": ".to_string()), emit_typed_expr(field_init_node_value(&f), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024))); } __result }), + _ => Rc::new(vec![emit_typed_expr(update_arg.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024)]), +}; +let fields_str = field_strs.join(&", ".to_string()); +let needs_rc = emit_map_has(shared_types.clone(), type_name.clone()); +let sharing = language_spec(RenderTarget::Rust).sharing.clone(); +let spread = if needs_rc.clone() { apply_type_template1(sharing.deref_clone.clone(), base_str) } else { apply_type_template1(sharing.clone_value.clone(), base_str) }; - let raw = v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(type_name.clone(), " { ".to_string()), - fields_str, - ), - ", ..".to_string(), - ), - spread, - ), - " }".to_string(), - ); - if needs_rc.clone() { +let raw = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(type_name.clone(), " { ".to_string()), fields_str), ", ..".to_string()), spread), " }".to_string()); +if needs_rc.clone() { v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), raw), ")".to_string()) } else { raw } - } +} } -pub fn emit_rust_first_method_call( - receiver: &Rc, - registry: &Rc>>, - scope: &Rc, - depth: i64, - shared_types: &Rc>, - emit_info: &Rc, -) -> String { +pub fn emit_rust_first_method_call(receiver: &Rc, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { match (*receiver.expr_data.clone()).clone() { - ExprData::ExprMethodCall { .. } => { - if (expr_method_name_at( - receiver.clone(), - scope.type_env.clone().source_indices.clone(), - ) - .as_str() - == "skip".to_string().as_str()) - { - { - let skip_recv = method_receiver(receiver.clone()); - let skip_args = method_arg_nodes(receiver.clone()); - let recv_str = emit_typed_expr( - skip_recv, - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - let arg_str = emit_typed_first_arg( - skip_args, - registry.clone(), - scope.clone(), - depth.clone(), - shared_types.clone(), - emit_info.clone(), - ); - v2_rt::concat( - v2_rt::concat(v2_rt::concat(recv_str, ".get(".to_string()), arg_str), - " as usize).cloned()".to_string(), - ) - } - } else { - { - let recv_str = emit_typed_expr( - receiver.clone(), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - v2_rt::concat(recv_str, ".first().cloned()".to_string()) - } - } - } - _ => { - let recv_str = emit_typed_expr( - receiver.clone(), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - v2_rt::concat(recv_str, ".first().cloned()".to_string()) - } - } + ExprData::ExprMethodCall { .. } => if (expr_method_name_at(receiver.clone(), scope.type_env.clone().source_indices.clone()).as_str() == "skip".to_string().as_str()) { + { + let skip_recv = method_receiver(receiver.clone()); +let skip_args = method_arg_nodes(receiver.clone()); +let recv_str = emit_typed_expr(skip_recv, registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +let arg_str = emit_typed_first_arg(skip_args, registry.clone(), scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(recv_str, ".get(".to_string()), arg_str), " as usize).cloned()".to_string()) +} + } else { + { + let recv_str = emit_typed_expr(receiver.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +v2_rt::concat(recv_str, ".first().cloned()".to_string()) +} + }, + _ => { + let recv_str = emit_typed_expr(receiver.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +v2_rt::concat(recv_str, ".first().cloned()".to_string()) +}, +} } -pub fn emit_rust_generic_method_call( - method_name: String, - receiver: Rc, - args: Rc>>, - result_type: Option>, - registry: &Rc>>, - scope: &Rc, - depth: i64, - shared_types: &Rc>, - emit_info: &Rc, -) -> String { +pub fn emit_rust_generic_method_call(method_name: String, receiver: Rc, args: Rc>>, result_type: Option>, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { { let function_name = method_name; - let recv_str = if rust_runtime_bridge_passes_receiver_by_ref(function_name.clone()) { - v2_rt::concat( - "&".to_string(), - emit_typed_expr_base( - &receiver, - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - ), - ) - } else { - emit_cloned_arg( - receiver, - registry.clone(), - scope.clone(), - depth.clone(), - shared_types.clone(), - emit_info.clone(), - ) +let recv_str = if rust_runtime_bridge_passes_receiver_by_ref(function_name.clone()) { + v2_rt::concat("&".to_string(), emit_typed_expr_base(&receiver, registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone())) + } else { + emit_cloned_arg(receiver, registry.clone(), scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone()) }; - let arg_strs = Rc::new({ - let mut __result = Vec::new(); - for a in args.iter().cloned() { - __result.push(emit_cloned_arg( - arg_value(&a), - registry.clone(), - scope.clone(), - depth.clone(), - shared_types.clone(), - emit_info.clone(), - )); - } - __result - }); - let all_strs = v2_rt::concat(Rc::new(vec![recv_str]), arg_strs); - let bridge_name = rust_runtime_bridge_name(function_name.clone()); - let lowered = v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "v2_rt::".to_string(), - emit_ident(bridge_name, RenderTarget::Rust), - ), - "(".to_string(), - ), - all_strs.join(&", ".to_string()), - ), - ")".to_string(), - ); - if rust_runtime_bridge_wraps_collection_result_in_rc(&function_name) { - v2_rt::concat( - v2_rt::concat("Rc::new(".to_string(), lowered), - ")".to_string(), - ) +let arg_strs = Rc::new({ let mut __result = Vec::new(); for a in args.iter().cloned() { __result.push(emit_cloned_arg(arg_value(&a), registry.clone(), scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone())); } __result }); +let all_strs = v2_rt::concat(Rc::new(vec![recv_str]), arg_strs); +let bridge_name = rust_runtime_bridge_name(function_name.clone()); +let lowered = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("v2_rt::".to_string(), emit_ident(bridge_name, RenderTarget::Rust)), "(".to_string()), all_strs.join(&", ".to_string())), ")".to_string()); +if rust_runtime_bridge_wraps_collection_result_in_rc(&function_name) { + v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), lowered), ")".to_string()) } else { lowered } - } +} } -pub fn emit_typed_method_call( - method_call_node: Rc, - receiver: &Rc, - method: String, - args: &Rc>>, - result_type: Option>, - method_semantics: &Option>, - registry: &Rc>>, - scope: &Rc, - depth: i64, - shared_types: &Rc>, - emit_info: &Rc, -) -> String { +pub fn emit_typed_method_call(method_call_node: Rc, receiver: &Rc, method: String, args: &Rc>>, result_type: Option>, method_semantics: &Option>, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { if (method_semantics.clone() != None) { match (*method_semantics.clone().unwrap()).clone() { - MethodSemantics::ServiceMethodSemantics { - service_name: svc_name, - op_params, - .. - } => { - let var_name = service_var_name(svc_name.clone()); - let si = scope.type_env.clone().source_indices.clone(); - let filled_args = fill_op_default_args( - &args, - op_params.clone(), - registry.clone(), - scope.clone(), - depth.clone(), - shared_types.clone(), - emit_info.clone(), - ); - let optional_param_set = Rc::new({ - let mut __result = Vec::new(); - for p in op_params.clone().iter().cloned() { - if (param_node_type_expr(&p).return_cardinality.clone() - == Cardinality::CardOptional) - { - __result.push(p); - } - } - __result - }) - .iter() - .cloned() - .fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, p: Rc| { - v2_rt::rc_map_insert(acc, param_node_name_at(p.clone(), si.clone()), true) - }, - ); - let json_param_set = Rc::new({ - let mut __result = Vec::new(); - for p in op_params.clone().iter().cloned() { - if (coerce_primitive_type( - RenderTarget::Rust, - authored_name_at(si.clone(), ¶m_node_type_expr(&p)), - ) - .as_str() - == "serde_json::Value".to_string().as_str()) - { - __result.push(p); - } - } - __result - }) - .iter() - .cloned() - .fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, p: Rc| { - v2_rt::rc_map_insert(acc, param_node_name_at(p.clone(), si.clone()), true) - }, - ); - let arg_strs = Rc::new({ - let mut __result = Vec::new(); - for a in filled_args.iter().cloned() { - __result.push({ - let arg_str = emit_typed_expr( - arg_value(&a), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - let aname = match arg_name_at(a.clone(), si.clone()) { - Some(n) => n.clone(), - None => "".to_string(), - }; - let param_is_json = match v2_rt::map_get(&json_param_set, aname.clone()) - { - Some(_) => true, - None => false, - }; - let param_is_optional = - match v2_rt::map_get(&optional_param_set, aname.clone()) { - Some(_) => true, - None => false, - }; - let needs_optional = (param_is_optional.clone() - && (is_already_optional( - &arg_value(&a), - emit_info.clone(), - &scope, - ) == false)); - let coerced = if (param_is_json.clone() - && is_string_typed_expr(arg_value(&a), si.clone())) - { - v2_rt::concat( - v2_rt::concat( - "serde_json::from_str(&".to_string(), - arg_str.clone(), - ), - ").unwrap()".to_string(), - ) - } else { - arg_str.clone() - }; - if needs_optional.clone() { - v2_rt::concat( - v2_rt::concat("Some(".to_string(), coerced.clone()), - ")".to_string(), - ) - } else { - coerced.clone() - } - }); - } - __result - }); - let args_str = arg_strs.join(&", ".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(var_name, ".".to_string()), - emit_ident(method, RenderTarget::Rust), - ), - "(".to_string(), - ), - args_str, - ), - ").await?".to_string(), - ) - } - MethodSemantics::AlgebraMethodSemantics { - method_def, - fold_accumulator_type, - .. - } => { - let method_name = - authored_name_at(scope.type_env.clone().source_indices.clone(), &method_def); - if (method_name.clone().as_str() == "fold".to_string().as_str()) { - emit_rust_fold_method_call( - method_call_node, - fold_accumulator_type.clone(), - result_type, - &receiver, - &args, - ®istry, - &scope, - depth.clone(), - &shared_types, - &emit_info, - ) + MethodSemantics::ServiceMethodSemantics { service_name: svc_name, op_params, .. } => { + let var_name = service_var_name(svc_name.clone()); +let si = scope.type_env.clone().source_indices.clone(); +let filled_args = fill_op_default_args(&args, op_params.clone(), registry.clone(), scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone()); +let optional_param_set = Rc::new({ let mut __result = Vec::new(); for p in op_params.clone().iter().cloned() { if (param_node_type_expr(&p).return_cardinality.clone() == Cardinality::CardOptional) { __result.push(p); } } __result }).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, p: Rc| v2_rt::rc_map_insert(acc, param_node_name_at(p.clone(), si.clone()), true)); +let json_param_set = Rc::new({ let mut __result = Vec::new(); for p in op_params.clone().iter().cloned() { if (coerce_primitive_type(RenderTarget::Rust, authored_name_at(si.clone(), ¶m_node_type_expr(&p))).as_str() == "serde_json::Value".to_string().as_str()) { __result.push(p); } } __result }).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, p: Rc| v2_rt::rc_map_insert(acc, param_node_name_at(p.clone(), si.clone()), true)); +let arg_strs = Rc::new({ let mut __result = Vec::new(); for a in filled_args.iter().cloned() { __result.push({ + let arg_str = emit_typed_expr(arg_value(&a), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +let aname = match arg_name_at(a.clone(), si.clone()) { + Some(n) => n.clone(), + None => "".to_string(), +}; +let param_is_json = match v2_rt::map_get(&json_param_set, aname.clone()) { + Some(_) => true, + None => false, +}; +let param_is_optional = match v2_rt::map_get(&optional_param_set, aname.clone()) { + Some(_) => true, + None => false, +}; +let needs_optional = (param_is_optional.clone() && (is_already_optional(&arg_value(&a), emit_info.clone(), &scope) == false)); +let coerced = if (param_is_json.clone() && is_string_typed_expr(arg_value(&a), si.clone())) { + v2_rt::concat(v2_rt::concat("serde_json::from_str(&".to_string(), arg_str.clone()), ").unwrap()".to_string()) } else { - if (method_name.clone().as_str() == "sort_by".to_string().as_str()) { - emit_rust_sort_by_method_call( - &receiver, - args.clone(), - ®istry, - &scope, - depth.clone(), - &shared_types, - &emit_info, - ) + arg_str.clone() + }; +if needs_optional.clone() { + v2_rt::concat(v2_rt::concat("Some(".to_string(), coerced.clone()), ")".to_string()) + } else { + coerced.clone() + } +}); } __result }); +let args_str = arg_strs.join(&", ".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(var_name, ".".to_string()), emit_ident(method, RenderTarget::Rust)), "(".to_string()), args_str), ").await?".to_string()) +}, + MethodSemantics::AlgebraMethodSemantics { method_def, fold_accumulator_type, .. } => { + let method_name = authored_name_at(scope.type_env.clone().source_indices.clone(), &method_def); +if (method_name.clone().as_str() == "fold".to_string().as_str()) { + emit_rust_fold_method_call(method_call_node, fold_accumulator_type.clone(), result_type, &receiver, &args, ®istry, &scope, depth.clone(), &shared_types, &emit_info) + } else { + if (method_name.clone().as_str() == "sort_by".to_string().as_str()) { + emit_rust_sort_by_method_call(&receiver, args.clone(), ®istry, &scope, depth.clone(), &shared_types, &emit_info) + } else { + if (method_name.clone().as_str() == "map".to_string().as_str()) { + emit_rust_map_method_call(&receiver, &args, ®istry, &scope, depth.clone(), &shared_types, &emit_info) } else { - if (method_name.clone().as_str() == "map".to_string().as_str()) { - emit_rust_map_method_call( - &receiver, - &args, - ®istry, - &scope, - depth.clone(), - &shared_types, - &emit_info, - ) + match Rc::new({ let mut __result = Vec::new(); for s in rust_higher_order_methods().iter().cloned() { if (s.method_name.clone().as_str() == method_name.clone().as_str()) { __result.push(s); } } __result }).first().cloned() { + Some(ho_spec) => emit_rust_higher_order_method(&ho_spec, receiver.clone(), &args, ®istry, &scope, depth.clone(), &shared_types, &emit_info), + None => if (method_name.clone().as_str() == "get".to_string().as_str()) { + emit_rust_get_method_call(&receiver, args.clone(), ®istry, &scope, depth.clone(), &shared_types, &emit_info) } else { - match Rc::new({ - let mut __result = Vec::new(); - for s in rust_higher_order_methods().iter().cloned() { - if (s.method_name.clone().as_str() - == method_name.clone().as_str()) - { - __result.push(s); - } - } - __result - }) - .first() - .cloned() - { - Some(ho_spec) => emit_rust_higher_order_method( - &ho_spec, - receiver.clone(), - &args, - ®istry, - &scope, - depth.clone(), - &shared_types, - &emit_info, - ), - None => { - if (method_name.clone().as_str() == "get".to_string().as_str()) - { - emit_rust_get_method_call( - &receiver, - args.clone(), - ®istry, - &scope, - depth.clone(), - &shared_types, - &emit_info, - ) - } else { - if (method_name.clone().as_str() - == "with".to_string().as_str()) + if (method_name.clone().as_str() == "with".to_string().as_str()) { + emit_rust_with_method_call(&receiver, &args, ®istry, &scope, depth.clone(), &shared_types, &emit_info) + } else { + if (method_name.clone().as_str() == "string_contains".to_string().as_str()) { + emit_rust_generic_method_call("string_contains".to_string(), receiver.clone(), args.clone(), result_type, ®istry, &scope, depth.clone(), &shared_types, &emit_info) + } else { + if (method_name.clone().as_str() == "concat".to_string().as_str()) { { - emit_rust_with_method_call( - &receiver, - &args, - ®istry, - &scope, - depth.clone(), - &shared_types, - &emit_info, - ) + let recv_str = emit_typed_expr(receiver.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +let arg_strs = Rc::new({ let mut __result = Vec::new(); for a in args.clone().iter().cloned() { __result.push(emit_typed_expr(arg_value(&a), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024)); } __result }); +let all_arg_strs = v2_rt::concat(Rc::new(vec![recv_str]), arg_strs); +emit_nested_rt_concat(all_arg_strs, "".to_string(), shared_types.clone()) +} + } else { + if (method_name.clone().as_str() == "first".to_string().as_str()) { + emit_rust_first_method_call(&receiver, ®istry, &scope, depth.clone(), &shared_types, &emit_info) } else { - if (method_name.clone().as_str() - == "string_contains".to_string().as_str()) { - emit_rust_generic_method_call( - "string_contains".to_string(), - receiver.clone(), - args.clone(), - result_type, - ®istry, - &scope, - depth.clone(), - &shared_types, - &emit_info, - ) - } else { - if (method_name.clone().as_str() - == "concat".to_string().as_str()) - { - { - let recv_str = emit_typed_expr( - receiver.clone(), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - let arg_strs = Rc::new({ - let mut __result = Vec::new(); - for a in args.clone().iter().cloned() { - __result.push(emit_typed_expr( - arg_value(&a), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - )); - } - __result - }); - let all_arg_strs = v2_rt::concat( - Rc::new(vec![recv_str]), - arg_strs, - ); - emit_nested_rt_concat( - all_arg_strs, - "".to_string(), - shared_types.clone(), - ) - } - } else { - if (method_name.clone().as_str() - == "first".to_string().as_str()) - { - emit_rust_first_method_call( - &receiver, - ®istry, - &scope, - depth.clone(), - &shared_types, - &emit_info, - ) - } else { - { - let recv_str = emit_typed_expr( - receiver.clone(), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - let first_arg_str = - emit_typed_first_arg( - args.clone(), - registry.clone(), - scope.clone(), - depth.clone(), - shared_types.clone(), - emit_info.clone(), - ); - let spec = - language_spec(RenderTarget::Rust); - match spec.method_templates.clone() { + let recv_str = emit_typed_expr(receiver.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +let first_arg_str = emit_typed_first_arg(args.clone(), registry.clone(), scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone()); +let spec = language_spec(RenderTarget::Rust); +match spec.method_templates.clone() { Some(templates) => match v2_rt::map_get(&templates, method_name.clone()) { Some(tmpl) => { let bindings = v2_rt::rc_map_insert(seed_bindings("recv".to_string(), recv_str), "arg".to_string(), first_arg_str); @@ -8532,334 +3389,115 @@ if rust_runtime_bridge_wraps_collection_result_in_rc(&method_name) { }, None => emit_rust_generic_method_call(method_name.clone(), receiver.clone(), args.clone(), result_type, ®istry, &scope, depth.clone(), &shared_types, &emit_info), } - } - } - } - } +} } } } } - } + }, +} } } } - MethodSemantics::PlainMethodSemantics => { - let recv_str = emit_typed_expr( - receiver.clone(), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - let arg_strs = Rc::new({ - let mut __result = Vec::new(); - for a in args.clone().iter().cloned() { - __result.push(emit_typed_expr( - arg_value(&a), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - )); - } - __result - }); - let args_str = arg_strs.join(&", ".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(recv_str, ".".to_string()), - emit_ident(method, RenderTarget::Rust), - ), - "(".to_string(), - ), - args_str, - ), - ")".to_string(), - ) - } - } +}, + MethodSemantics::PlainMethodSemantics => { + let recv_str = emit_typed_expr(receiver.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +let arg_strs = Rc::new({ let mut __result = Vec::new(); for a in args.clone().iter().cloned() { __result.push(emit_typed_expr(arg_value(&a), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024)); } __result }); +let args_str = arg_strs.join(&", ".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(recv_str, ".".to_string()), emit_ident(method, RenderTarget::Rust)), "(".to_string()), args_str), ")".to_string()) +}, +} } else { "compile_error!(\"method call missing reconcile semantics\")".to_string() } } -pub fn emit_typed_first_arg( - args: Rc>>, - registry: Rc>>, - scope: Rc, - depth: i64, - shared_types: Rc>, - emit_info: Rc, -) -> String { +pub fn emit_typed_first_arg(args: Rc>>, registry: Rc>>, scope: Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { match args.first().cloned() { - Some(a) => emit_typed_expr( - arg_value(&a), - registry, - &scope, - depth, - shared_types, - emit_info, - 1024, - ), - None => "compile_error!(\"missing method argument\")".to_string(), - } + Some(a) => emit_typed_expr(arg_value(&a), registry, &scope, depth, shared_types, emit_info, 1024), + None => "compile_error!(\"missing method argument\")".to_string(), +} } -pub fn emit_typed_match( - scrutinee: &Rc, - arms: &Rc>>, - registry: &Rc>>, - scope: &Rc, - depth: i64, - shared_types: &Rc>, - emit_info: &Rc, -) -> String { +pub fn emit_typed_match(scrutinee: &Rc, arms: &Rc>>, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { { - let scrut_str = emit_typed_expr( - scrutinee.clone(), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - let scrut_type = match scrutinee.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - let is_optional = (rt.return_cardinality.clone() == Cardinality::CardOptional); - if is_optional { - authored_name_at( - scope.type_env.clone().source_indices.clone(), - &with_required_cardinality(&rt), - ) - } else { - authored_name_at(scope.type_env.clone().source_indices.clone(), &rt) - } - } - _ => "".to_string(), - }; - let rc_match = analyze_rc_match( - &scrutinee, - arms.clone(), - scrut_type.clone(), - &shared_types, - emit_info.clone(), - &scope.type_env.clone().source_indices.clone(), - ); - let match_result_type = match arms.clone().first().cloned() { - Some(first_arm) => resolved_type(arm_body(&first_arm)), - None => type_variable_node("match_result".to_string()), - }; - let arm_strs = Rc::new({ - let mut __result = Vec::new(); - for arm in arms.clone().iter().cloned() { - __result.push(emit_typed_match_arm( - &arm, - ®istry, - &scope, - depth.clone(), - &shared_types, - &emit_info, - &scrut_type, - match_result_type.clone(), - false, - )); + let scrut_str = emit_typed_expr(scrutinee.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +let scrut_type = match scrutinee.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => { + let is_optional = (rt.return_cardinality.clone() == Cardinality::CardOptional); +if is_optional { + authored_name_at(scope.type_env.clone().source_indices.clone(), &with_required_cardinality(&rt)) + } else { + authored_name_at(scope.type_env.clone().source_indices.clone(), &rt) } - __result - }); - let arms_str = arm_strs.join(&"\n".to_string()); - let needs_as_str = (all_arms_are_string_lit(&arms) && ((arms.clone().len() as i64) > 0)); - let needs_string_from = has_string_lit_with_bind(&arms); - if rc_match.needs_option_deref.clone() { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("match ".to_string(), scrut_str), - ".as_deref()".to_string(), - ), - clone_iterator_suffix(), - ), - " {\n".to_string(), - ), - arms_str, - ), - "\n}".to_string(), - ) +}, + _ => "".to_string(), +}; +let rc_match = analyze_rc_match(&scrutinee, arms.clone(), scrut_type.clone(), &shared_types, emit_info.clone(), &scope.type_env.clone().source_indices.clone()); +let match_result_type = match arms.clone().first().cloned() { + Some(first_arm) => resolved_type(arm_body(&first_arm)), + None => type_variable_node("match_result".to_string()), +}; +let arm_strs = Rc::new({ let mut __result = Vec::new(); for arm in arms.clone().iter().cloned() { __result.push(emit_typed_match_arm(&arm, ®istry, &scope, depth.clone(), &shared_types, &emit_info, &scrut_type, match_result_type.clone(), false)); } __result }); +let arms_str = arm_strs.join(&"\n".to_string()); +let needs_as_str = (all_arms_are_string_lit(&arms) && ((arms.clone().len() as i64) > 0)); +let needs_string_from = has_string_lit_with_bind(&arms); +if rc_match.needs_option_deref.clone() { + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("match ".to_string(), scrut_str), ".as_deref()".to_string()), clone_iterator_suffix()), " {\n".to_string()), arms_str), "\n}".to_string()) } else { if rc_match.needs_deref.clone() { { let sharing = language_spec(RenderTarget::Rust).sharing.clone(); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "match ".to_string(), - apply_type_template1(sharing.deref_clone.clone(), scrut_str), - ), - " {\n".to_string(), - ), - arms_str, - ), - "\n}".to_string(), - ) - } +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("match ".to_string(), apply_type_template1(sharing.deref_clone.clone(), scrut_str)), " {\n".to_string()), arms_str), "\n}".to_string()) +} } else { if needs_as_str { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("match ".to_string(), scrut_str), - ".as_str() {\n".to_string(), - ), - arms_str, - ), - "\n}".to_string(), - ) + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("match ".to_string(), scrut_str), ".as_str() {\n".to_string()), arms_str), "\n}".to_string()) } else { if needs_string_from { { - let sf_arm_strs = Rc::new({ - let mut __result = Vec::new(); - for arm in arms.clone().iter().cloned() { - __result.push(emit_typed_match_arm( - &arm, - ®istry, - &scope, - depth.clone(), - &shared_types, - &emit_info, - &scrut_type, - match_result_type.clone(), - true, - )); - } - __result - }); - let sf_arms_str = sf_arm_strs.join(&"\n".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("match ".to_string(), scrut_str), - " {\n".to_string(), - ), - sf_arms_str, - ), - "\n}".to_string(), - ) - } + let sf_arm_strs = Rc::new({ let mut __result = Vec::new(); for arm in arms.clone().iter().cloned() { __result.push(emit_typed_match_arm(&arm, ®istry, &scope, depth.clone(), &shared_types, &emit_info, &scrut_type, match_result_type.clone(), true)); } __result }); +let sf_arms_str = sf_arm_strs.join(&"\n".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("match ".to_string(), scrut_str), " {\n".to_string()), sf_arms_str), "\n}".to_string()) +} } else { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("match ".to_string(), scrut_str), - " {\n".to_string(), - ), - arms_str, - ), - "\n}".to_string(), - ) + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("match ".to_string(), scrut_str), " {\n".to_string()), arms_str), "\n}".to_string()) } } } } - } +} } -pub fn emit_typed_match_arm( - arm: &Rc, - registry: &Rc>>, - scope: &Rc, - depth: i64, - shared_types: &Rc>, - emit_info: &Rc, - scrut_type: &String, - match_result_type: Rc, - string_from_mode: bool, -) -> String { +pub fn emit_typed_match_arm(arm: &Rc, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc, scrut_type: &String, match_result_type: Rc, string_from_mode: bool) -> String { { let arm_pat = arm_pattern(arm.clone()); - let arm_g = arm_guard(&arm); - let arm_b = arm_body(&arm); - let si = scope.type_env.clone().source_indices.clone(); - let rc_analysis = analyze_rc_pattern( - arm_pat.clone(), - scrut_type.clone(), - &shared_types, - &emit_info, - si.clone(), - ); - let pat_str = if string_from_mode { +let arm_g = arm_guard(&arm); +let arm_b = arm_body(&arm); +let si = scope.type_env.clone().source_indices.clone(); +let rc_analysis = analyze_rc_pattern(arm_pat.clone(), scrut_type.clone(), &shared_types, &emit_info, si.clone()); +let pat_str = if string_from_mode { match (*arm_pat.clone()).clone() { - MatchPattern::LitPattern { value: v, .. } => match (*v.clone()).clone() { - LiteralValue::LitStr { value: s, .. } => v2_rt::concat( - v2_rt::concat( - "ref __s if __s == \"".to_string(), - escape_string_literal_body(s.clone()), - ), - "\"".to_string(), - ), - _ => rust_literal_for_pattern(v.clone()), - }, - _ => emit_pattern( - arm_pat.clone(), - shared_types.clone(), - scrut_type.clone(), - si.clone(), - emit_info.clone(), - ), - } + MatchPattern::LitPattern { value: v, .. } => match (*v.clone()).clone() { + LiteralValue::LitStr { value: s, .. } => v2_rt::concat(v2_rt::concat("ref __s if __s == \"".to_string(), escape_string_literal_body(s.clone())), "\"".to_string()), + _ => rust_literal_for_pattern(v.clone()), +}, + _ => emit_pattern(arm_pat.clone(), shared_types.clone(), scrut_type.clone(), si.clone(), emit_info.clone()), +} } else { if rc_analysis.needs_rc_pattern.clone() { - emit_pattern_rc_aware( - arm_pat.clone(), - rc_analysis.clone(), - shared_types.clone(), - scrut_type.clone(), - si.clone(), - emit_info.clone(), - ) + emit_pattern_rc_aware(arm_pat.clone(), rc_analysis.clone(), shared_types.clone(), scrut_type.clone(), si.clone(), emit_info.clone()) } else { - emit_pattern( - arm_pat.clone(), - shared_types.clone(), - scrut_type.clone(), - si.clone(), - emit_info.clone(), - ) + emit_pattern(arm_pat.clone(), shared_types.clone(), scrut_type.clone(), si.clone(), emit_info.clone()) } }; - let field_guards = collect_pattern_string_guards(arm_pat.clone(), si.clone()); - let arm_guard_str = match arm_g { - Some(g) => emit_typed_expr( - g.clone(), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ), - None => "".to_string(), - }; - let guard_str = if ((field_guards.clone().as_str() != "".to_string().as_str()) - && (arm_guard_str.clone().as_str() != "".to_string().as_str())) - { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(" if ".to_string(), field_guards.clone()), - " && ".to_string(), - ), - arm_guard_str.clone(), - ) +let field_guards = collect_pattern_string_guards(arm_pat.clone(), si.clone()); +let arm_guard_str = match arm_g { + Some(g) => emit_typed_expr(g.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024), + None => "".to_string(), +}; +let guard_str = if ((field_guards.clone().as_str() != "".to_string().as_str()) && (arm_guard_str.clone().as_str() != "".to_string().as_str())) { + v2_rt::concat(v2_rt::concat(v2_rt::concat(" if ".to_string(), field_guards.clone()), " && ".to_string()), arm_guard_str.clone()) } else { if (field_guards.clone().as_str() != "".to_string().as_str()) { v2_rt::concat(" if ".to_string(), field_guards.clone()) @@ -8871,878 +3509,376 @@ pub fn emit_typed_match_arm( } } }; - let body_str = match (*arm_b.expr_data.clone()).clone() { - ExprData::ExprVar { - binding_kind: body_binding_kind, - .. - } => { - let body_name = expr_var_name_at(arm_b.clone(), si.clone()); - if (variant_parent_from_binding_kind(body_binding_kind.clone()) != None) { - emit_var_ref( - &body_name, - &body_binding_kind, - &Some(Rc::new(InferredNode::Resolved { - node: match_result_type, - })), - shared_types.clone(), - registry.clone(), - &emit_info, - si.clone(), - ) - } else { - emit_typed_expr( - arm_b.clone(), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ) - } +let body_str = match (*arm_b.expr_data.clone()).clone() { + ExprData::ExprVar { binding_kind: body_binding_kind, .. } => { + let body_name = expr_var_name_at(arm_b.clone(), si.clone()); +if (variant_parent_from_binding_kind(body_binding_kind.clone()) != None) { + emit_var_ref(&body_name, &body_binding_kind, &Some(Rc::new(InferredNode::Resolved { + node: match_result_type, +})), shared_types.clone(), registry.clone(), &emit_info, si.clone()) + } else { + emit_typed_expr(arm_b.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024) } - _ => emit_typed_expr( - arm_b.clone(), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ), - }; - if rc_analysis.needs_rc_pattern.clone() { +}, + _ => emit_typed_expr(arm_b.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024), +}; +if rc_analysis.needs_rc_pattern.clone() { { - let prelude = rc_pattern_preludes( - arm_pat.clone(), - rc_analysis.clone(), - shared_types.clone(), - si.clone(), - emit_info.clone(), - ); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(" ".to_string(), pat_str), - guard_str, - ), - " => { ".to_string(), - ), - prelude, - ), - " ".to_string(), - ), - body_str, - ), - " },".to_string(), - ) - } + let prelude = rc_pattern_preludes(arm_pat.clone(), rc_analysis.clone(), shared_types.clone(), si.clone(), emit_info.clone()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" ".to_string(), pat_str), guard_str), " => { ".to_string()), prelude), " ".to_string()), body_str), " },".to_string()) +} } else { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(v2_rt::concat(" ".to_string(), pat_str), guard_str), - " => ".to_string(), - ), - body_str, - ), - ",".to_string(), - ) + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" ".to_string(), pat_str), guard_str), " => ".to_string()), body_str), ",".to_string()) } - } +} } -pub fn emit_typed_if( - condition: Rc, - then_branch: Rc, - else_branch: Option>, - registry: &Rc>>, - scope: &Rc, - depth: i64, - shared_types: &Rc>, - emit_info: &Rc, -) -> String { +pub fn emit_typed_if(condition: Rc, then_branch: Rc, else_branch: Option>, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { { - let cond_str = emit_typed_expr( - condition, - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - emit_typed_if_shared( - cond_str, - &then_branch, - else_branch, - None, - depth.clone(), - &RenderTarget::Rust, - scope.type_env.clone().source_indices.clone(), - |node, d| { - emit_typed_expr( - node.clone(), - registry.clone(), - &scope, - d.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ) - }, - ) - } + let cond_str = emit_typed_expr(condition, registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +emit_typed_if_shared(cond_str, &then_branch, else_branch, None, depth.clone(), &RenderTarget::Rust, scope.type_env.clone().source_indices.clone(), |node, d| emit_typed_expr(node.clone(), registry.clone(), &scope, d.clone(), shared_types.clone(), emit_info.clone(), 1024)) +} } -pub fn emit_typed_let( - name: String, - value: &Rc, - body: Option>, - registry: &Rc>>, - scope: &Rc, - depth: i64, - shared_types: &Rc>, - emit_info: &Rc, -) -> String { +pub fn emit_typed_let(name: String, value: &Rc, body: Option>, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { { - let val_str = emit_typed_expr( - value.clone(), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - emit_typed_let_shared( - &name, - val_str, - body, - RenderTarget::Rust, - |bd, sc| { - emit_typed_expr( - bd.clone(), - registry.clone(), - &sc, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ) - }, - scope.clone(), - value.clone(), - ) - } + let val_str = emit_typed_expr(value.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +emit_typed_let_shared(&name, val_str, body, RenderTarget::Rust, |bd, sc| emit_typed_expr(bd.clone(), registry.clone(), &sc, depth.clone(), shared_types.clone(), emit_info.clone(), 1024), scope.clone(), value.clone()) +} } -pub fn is_optional_struct_field( - emit_info: Rc, - struct_name: String, - field_name: String, -) -> bool { +pub fn is_optional_struct_field(emit_info: Rc, struct_name: String, field_name: String) -> bool { match lookup_emit_type_summary(emit_info, struct_name) { - Some(summary) => match v2_rt::map_get(&summary.field_summaries.clone(), field_name) { - Some(field_summary) => match field_summary.value_shape.clone() { - FieldValueShape::OptionalValue => true, - _ => false, - }, - None => false, - }, - None => false, - } + Some(summary) => match v2_rt::map_get(&summary.field_summaries.clone(), field_name) { + Some(field_summary) => match field_summary.value_shape.clone() { + FieldValueShape::OptionalValue => true, + _ => false, +}, + None => false, +}, + None => false, +} } -pub fn is_already_optional( - texpr: &Rc, - emit_info: Rc, - scope: &Rc, -) -> bool { +pub fn is_already_optional(texpr: &Rc, emit_info: Rc, scope: &Rc) -> bool { { let si = scope.type_env.clone().source_indices.clone(); - let n = expr_var_name_at(texpr.clone(), si.clone()); - let tn = record_lit_type_name_at(texpr.clone(), si.clone()); - let f = field_access_field_at(texpr.clone(), si.clone()); - match (*texpr.expr_data.clone()).clone() { - ExprData::ExprLiteral { value: v, .. } => match (*v.clone()).clone() { - LiteralValue::LitNull => true, - _ => false, - }, - ExprData::ExprVar { .. } => { - if ((n.clone().as_str() == "none".to_string().as_str()) - || (n.clone().as_str() == "None".to_string().as_str())) - { - true - } else { - match texpr.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - (rt.return_cardinality.clone() == Cardinality::CardOptional) - } - _ => match v2_rt::map_get(&scope.locals.clone(), n.clone()) { - Some(binding) => { - (binding.resolved.clone().return_cardinality.clone() - == Cardinality::CardOptional) - } - None => false, - }, - } - } - } - ExprData::ExprRecordLit { .. } => match tn { - Some(name) => { - ((name.clone().as_str() == "Some".to_string().as_str()) - || (name.clone().as_str() == "None".to_string().as_str())) - } - None => false, - }, - ExprData::ExprFieldAccess { - summary: fa_summary, - .. - } => { - let b = field_access_base(texpr.clone()); - let summary_says_optional = match fa_summary.clone() { - Some(fs) => match fs.value_shape.clone() { - FieldValueShape::OptionalValue => true, - _ => false, - }, - None => false, - }; - if summary_says_optional { - true - } else { - match b.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { - node: base_type, .. - }) => { - let resolved_base = base_type.clone(); - if is_optional_struct_field( - emit_info, - authored_name_at( - scope.type_env.clone().source_indices.clone(), - &resolved_base, - ), - f, - ) { - true - } else { - match texpr.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - (rt.return_cardinality.clone() == Cardinality::CardOptional) - } - _ => false, - } - } - } - _ => match texpr.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - (rt.return_cardinality.clone() == Cardinality::CardOptional) - } - _ => false, - }, +let n = expr_var_name_at(texpr.clone(), si.clone()); +let tn = record_lit_type_name_at(texpr.clone(), si.clone()); +let f = field_access_field_at(texpr.clone(), si.clone()); +match (*texpr.expr_data.clone()).clone() { + ExprData::ExprLiteral { value: v, .. } => match (*v.clone()).clone() { + LiteralValue::LitNull => true, + _ => false, +}, + ExprData::ExprVar { .. } => if ((n.clone().as_str() == "none".to_string().as_str()) || (n.clone().as_str() == "None".to_string().as_str())) { + true + } else { + match texpr.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => (rt.return_cardinality.clone() == Cardinality::CardOptional), + _ => match v2_rt::map_get(&scope.locals.clone(), n.clone()) { + Some(binding) => (binding.resolved.clone().return_cardinality.clone() == Cardinality::CardOptional), + None => false, +}, +} + }, + ExprData::ExprRecordLit { .. } => match tn { + Some(name) => ((name.clone().as_str() == "Some".to_string().as_str()) || (name.clone().as_str() == "None".to_string().as_str())), + None => false, +}, + ExprData::ExprFieldAccess { summary: fa_summary, .. } => { + let b = field_access_base(texpr.clone()); +let summary_says_optional = match fa_summary.clone() { + Some(fs) => match fs.value_shape.clone() { + FieldValueShape::OptionalValue => true, + _ => false, +}, + None => false, +}; +if summary_says_optional { + true + } else { + match b.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: base_type, .. }) => { + let resolved_base = base_type.clone(); +if is_optional_struct_field(emit_info, authored_name_at(scope.type_env.clone().source_indices.clone(), &resolved_base), f) { + true + } else { + match texpr.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => (rt.return_cardinality.clone() == Cardinality::CardOptional), + _ => false, +} } - } +}, + _ => match texpr.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => (rt.return_cardinality.clone() == Cardinality::CardOptional), + _ => false, +}, +} } - _ => match texpr.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - (rt.return_cardinality.clone() == Cardinality::CardOptional) - } - _ => false, - }, - } - } +}, + _ => match texpr.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => (rt.return_cardinality.clone() == Cardinality::CardOptional), + _ => false, +}, +} +} } -pub fn lookup_struct_field_type_name( - struct_node: &Rc, - field_name: &String, - variant_name: Option, - source_indices: &Rc>>, -) -> Option { +pub fn lookup_struct_field_type_name(struct_node: &Rc, field_name: &String, variant_name: Option, source_indices: &Rc>>) -> Option { { - let direct = match find_child_named( - struct_node.clone(), - field_name.clone(), - source_indices.clone(), - ) { - Some(field_child) => { - if (field_child.inferred.clone() != None) { - { - let field_type = resolved_type(field_child.clone()); - let ft_is_type_var = if (field_type.inferred.clone() != None) { - is_type_variable(field_type.inferred.clone().clone().unwrap()) - } else { - false - }; - if ((field_type.ident_span.clone() != None) && !ft_is_type_var.clone()) { - Some(authored_name_at(source_indices.clone(), &field_type)) - } else { - None - } - } + let direct = match find_child_named(struct_node.clone(), field_name.clone(), source_indices.clone()) { + Some(field_child) => if (field_child.inferred.clone() != None) { + { + let field_type = resolved_type(field_child.clone()); +let ft_is_type_var = if (field_type.inferred.clone() != None) { + is_type_variable(field_type.inferred.clone().clone().unwrap()) + } else { + false + }; +if ((field_type.ident_span.clone() != None) && !ft_is_type_var.clone()) { + Some(authored_name_at(source_indices.clone(), &field_type)) } else { None } - } - None => None, - }; - match direct.clone() { - Some(_) => direct.clone(), - None => match variant_name { - Some(vn) => { - match find_child_named(struct_node.clone(), vn.clone(), source_indices.clone()) - { - Some(variant_child) => match find_child_named( - variant_child.clone(), - field_name.clone(), - source_indices.clone(), - ) { - Some(field_child) => { - if (field_child.inferred.clone() != None) { - { - let field_type = resolved_type(field_child.clone()); - let ft_is_type_var = - if (field_type.inferred.clone() != None) { - is_type_variable( - field_type.inferred.clone().clone().unwrap(), - ) - } else { - false - }; - if ((field_type.ident_span.clone() != None) - && !ft_is_type_var.clone()) - { - Some(authored_name_at( - source_indices.clone(), - &field_type, - )) - } else { - None - } - } - } else { - None - } - } - None => None, - }, - None => None, - } +} + } else { + None + }, + None => None, +}; +match direct.clone() { + Some(_) => direct.clone(), + None => match variant_name { + Some(vn) => match find_child_named(struct_node.clone(), vn.clone(), source_indices.clone()) { + Some(variant_child) => match find_child_named(variant_child.clone(), field_name.clone(), source_indices.clone()) { + Some(field_child) => if (field_child.inferred.clone() != None) { + { + let field_type = resolved_type(field_child.clone()); +let ft_is_type_var = if (field_type.inferred.clone() != None) { + is_type_variable(field_type.inferred.clone().clone().unwrap()) + } else { + false + }; +if ((field_type.ident_span.clone() != None) && !ft_is_type_var.clone()) { + Some(authored_name_at(source_indices.clone(), &field_type)) + } else { + None } - None => None, - }, - } - } +} + } else { + None + }, + None => None, +}, + None => None, +}, + None => None, +}, +} +} } -pub fn emit_field_value_with_context( - field_value: &Rc, - struct_node: &Rc, - outer_type_name: Option, - field_name: &String, - registry: Rc>>, - scope: &Rc, - depth: i64, - shared_types: &Rc>, - emit_info: &Rc, -) -> String { +pub fn emit_field_value_with_context(field_value: &Rc, struct_node: &Rc, outer_type_name: Option, field_name: &String, registry: Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { match (*field_value.expr_data.clone()).clone() { - ExprData::ExprRecordLit { - parent_enum: pe, .. - } => { - let inner_fields = field_value.children.clone(); - let tn = record_lit_type_name_at( - field_value.clone(), - scope.type_env.clone().source_indices.clone(), - ); - match tn.clone() { - Some(variant_name) => { - let node_lookup = lookup_struct_field_type_name( - &struct_node, - &field_name, - outer_type_name, - &scope.type_env.clone().source_indices.clone(), - ); - let expected_type = match node_lookup.clone() { - Some(_) => node_lookup.clone(), - None => { - if (struct_node.ident_span.clone() != None) { - match lookup_emit_type_summary( - emit_info.clone(), - authored_name_at( - scope.type_env.clone().source_indices.clone(), - &struct_node, - ), - ) { - Some(summary) => v2_rt::map_get( - &summary.field_type_map.clone(), - field_name.clone(), - ), - None => None, - } - } else { - None - } - } - }; - let corrected_parent = match expected_type { - Some(et) => { - if variant_belongs_to_enum( - emit_info.type_summaries.clone(), - variant_name.clone(), - et.clone(), - ) { - Some(et.clone()) - } else { - pe.clone() - } - } - None => pe.clone(), - }; - let raw = emit_typed_record_lit( - &tn, - &inner_fields, - &corrected_parent, - &resolved_type(field_value.clone()), - registry, - &scope, - depth, - &shared_types, - &emit_info, - ); - let rc_name = match corrected_parent.clone() { - Some(en) => en.clone(), - None => variant_name.clone(), - }; - if ((rc_name.clone().as_str() != "".to_string().as_str()) - && emit_map_has(shared_types.clone(), rc_name.clone())) - { - v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), raw), ")".to_string()) - } else { - raw - } - } - None => emit_typed_expr( - field_value.clone(), - registry, - &scope, - depth, - shared_types.clone(), - emit_info.clone(), - 1024, - ), + ExprData::ExprRecordLit { parent_enum: pe, .. } => { + let inner_fields = field_value.children.clone(); +let tn = record_lit_type_name_at(field_value.clone(), scope.type_env.clone().source_indices.clone()); +match tn.clone() { + Some(variant_name) => { + let node_lookup = lookup_struct_field_type_name(&struct_node, &field_name, outer_type_name, &scope.type_env.clone().source_indices.clone()); +let expected_type = match node_lookup.clone() { + Some(_) => node_lookup.clone(), + None => if (struct_node.ident_span.clone() != None) { + match lookup_emit_type_summary(emit_info.clone(), authored_name_at(scope.type_env.clone().source_indices.clone(), &struct_node)) { + Some(summary) => v2_rt::map_get(&summary.field_type_map.clone(), field_name.clone()), + None => None, +} + } else { + None + }, +}; +let corrected_parent = match expected_type { + Some(et) => if variant_belongs_to_enum(emit_info.type_summaries.clone(), variant_name.clone(), et.clone()) { + Some(et.clone()) + } else { + pe.clone() + }, + None => pe.clone(), +}; +let raw = emit_typed_record_lit(&tn, &inner_fields, &corrected_parent, &resolved_type(field_value.clone()), registry, &scope, depth, &shared_types, &emit_info); +let rc_name = match corrected_parent.clone() { + Some(en) => en.clone(), + None => variant_name.clone(), +}; +if ((rc_name.clone().as_str() != "".to_string().as_str()) && emit_map_has(shared_types.clone(), rc_name.clone())) { + v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), raw), ")".to_string()) + } else { + raw } - } - _ => emit_typed_expr( - field_value.clone(), - registry, - &scope, - depth, - shared_types.clone(), - emit_info.clone(), - 1024, - ), - } +}, + None => emit_typed_expr(field_value.clone(), registry, &scope, depth, shared_types.clone(), emit_info.clone(), 1024), +} +}, + _ => emit_typed_expr(field_value.clone(), registry, &scope, depth, shared_types.clone(), emit_info.clone(), 1024), +} } -pub fn find_struct_name_by_fields( - field_names: &Rc>, - type_summaries: Rc>>, -) -> Option { +pub fn find_struct_name_by_fields(field_names: &Rc>, type_summaries: Rc>>) -> Option { { let n_fields = (field_names.clone().len() as i64); - if (n_fields.clone() == 0) { - return None; - } - let candidates = Rc::new({ - let mut __result = Vec::new(); - for summary in Rc::new(v2_rt::map_values(&type_summaries)).iter().cloned() { - if match (*summary.repr.clone()).clone() { - TypeRepr::StructRepr => { - let ftm_keys = Rc::new(v2_rt::map_keys(&summary.field_type_map.clone())); - if ((ftm_keys.clone().len() as i64) == n_fields.clone()) { - { - let mut __all = true; - for fn_name in field_names.clone().iter().cloned() { - if !(v2_rt::map_contains_key( - &summary.field_type_map.clone(), - fn_name.clone(), - )) { - __all = false; - break; - } - } - __all - } - } else { - false - } - } - _ => false, - } { - __result.push(summary); - } +if (n_fields.clone() == 0) { + return None + } +let candidates = Rc::new({ let mut __result = Vec::new(); for summary in Rc::new(v2_rt::map_values(&type_summaries)).iter().cloned() { if match (*summary.repr.clone()).clone() { + TypeRepr::StructRepr => { + let ftm_keys = Rc::new(v2_rt::map_keys(&summary.field_type_map.clone())); +if ((ftm_keys.clone().len() as i64) == n_fields.clone()) { + { let mut __all = true; for fn_name in field_names.clone().iter().cloned() { if !(v2_rt::map_contains_key(&summary.field_type_map.clone(), fn_name.clone())) { __all = false; break; } } __all } + } else { + false } - __result - }); - match candidates.first().cloned() { - Some(s) => Some(s.name.clone()), - None => None, - } - } +}, + _ => false, +} { __result.push(summary); } } __result }); +match candidates.first().cloned() { + Some(s) => Some(s.name.clone()), + None => None, +} +} } -pub fn emit_typed_record_lit( - type_name: &Option, - fields: &Rc>>, - parent_enum: &Option, - resolved_type: &Rc, - registry: Rc>>, - scope: &Rc, - depth: i64, - shared_types: &Rc>, - emit_info: &Rc, -) -> String { +pub fn emit_typed_record_lit(type_name: &Option, fields: &Rc>>, parent_enum: &Option, resolved_type: &Rc, registry: Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { { - let struct_name = explicit_record_struct_name( - type_name.clone(), - &resolved_type, - shared_types.clone(), - scope.type_env.clone().source_indices.clone(), - ); - let qualified_name = match struct_name { - Some(sn) => Some(sn.clone()), - None => { - let rt_name = authored_name_at( - scope.type_env.clone().source_indices.clone(), - &resolved_type, - ); - if ((resolved_type.ident_span.clone() != None) - && v2_rt::map_contains_key(&emit_info.type_summaries.clone(), rt_name.clone())) - { - Some(rt_name.clone()) - } else { - None - } + let struct_name = explicit_record_struct_name(type_name.clone(), &resolved_type, shared_types.clone(), scope.type_env.clone().source_indices.clone()); +let qualified_name = match struct_name { + Some(sn) => Some(sn.clone()), + None => { + let rt_name = authored_name_at(scope.type_env.clone().source_indices.clone(), &resolved_type); +if ((resolved_type.ident_span.clone() != None) && v2_rt::map_contains_key(&emit_info.type_summaries.clone(), rt_name.clone())) { + Some(rt_name.clone()) + } else { + None } - }; - match qualified_name { - None => { - let is_product = is_product_type(resolved_type.clone()); - if (is_product && (resolved_type.ident_span.clone() == None)) { - if ((fields.clone().len() as i64) == 1) { - match fields.clone().first().cloned() { - Some(f) => emit_typed_expr( - field_init_node_value(&f), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ), - None => { - "compile_error!(\"empty anonymous record literal\")".to_string() - } - } - } else { - { - let lit_field_names = Rc::new({ - let mut __result = Vec::new(); - for f in fields.clone().iter().cloned() { - __result.push(field_init_node_name_at( - f.clone(), - scope.type_env.clone().source_indices.clone(), - )); - } - __result - }); - match find_struct_name_by_fields( - &lit_field_names, - emit_info.type_summaries.clone(), - ) { - Some(resolved_sn) => { - let field_strs = Rc::new({ - let mut __result = Vec::new(); - for f in fields.clone().iter().cloned() { - __result.push({ - let fname = field_init_node_name_at( - f.clone(), - scope.type_env.clone().source_indices.clone(), - ); - let fval = emit_typed_expr( - field_init_node_value(&f), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - " ".to_string(), - emit_ident( - fname.clone(), - RenderTarget::Rust, - ), - ), - ": ".to_string(), - ), - fval.clone(), - ), - ",".to_string(), - ) - }); - } - __result - }); - let body = field_strs.join(&"\n".to_string()); - let struct_lit = v2_rt::concat( - v2_rt::concat( - v2_rt::concat(resolved_sn.clone(), " {\n".to_string()), - body, - ), - "\n}".to_string(), - ); - if emit_map_has(shared_types.clone(), resolved_sn.clone()) { - v2_rt::concat( - v2_rt::concat("Rc::new(".to_string(), struct_lit), - ")".to_string(), - ) - } else { - struct_lit - } - } - None => { - let vals = Rc::new({ - let mut __result = Vec::new(); - for f in fields.clone().iter().cloned() { - __result.push(emit_typed_expr( - field_init_node_value(&f), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - )); - } - __result - }); - v2_rt::concat( - v2_rt::concat( - "(".to_string(), - vals.join(&", ".to_string()), - ), - ")".to_string(), - ) - } - } - } - } +}, +}; +match qualified_name { + None => { + let is_product = is_product_type(resolved_type.clone()); +if (is_product && (resolved_type.ident_span.clone() == None)) { + if ((fields.clone().len() as i64) == 1) { + match fields.clone().first().cloned() { + Some(f) => emit_typed_expr(field_init_node_value(&f), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024), + None => "compile_error!(\"empty anonymous record literal\")".to_string(), +} } else { - "compile_error!(\"cannot resolve anonymous record type in emitter\")" - .to_string() + { + let lit_field_names = Rc::new({ let mut __result = Vec::new(); for f in fields.clone().iter().cloned() { __result.push(field_init_node_name_at(f.clone(), scope.type_env.clone().source_indices.clone())); } __result }); +match find_struct_name_by_fields(&lit_field_names, emit_info.type_summaries.clone()) { + Some(resolved_sn) => { + let field_strs = Rc::new({ let mut __result = Vec::new(); for f in fields.clone().iter().cloned() { __result.push({ + let fname = field_init_node_name_at(f.clone(), scope.type_env.clone().source_indices.clone()); +let fval = emit_typed_expr(field_init_node_value(&f), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" ".to_string(), emit_ident(fname.clone(), RenderTarget::Rust)), ": ".to_string()), fval.clone()), ",".to_string()) +}); } __result }); +let body = field_strs.join(&"\n".to_string()); +let struct_lit = v2_rt::concat(v2_rt::concat(v2_rt::concat(resolved_sn.clone(), " {\n".to_string()), body), "\n}".to_string()); +if emit_map_has(shared_types.clone(), resolved_sn.clone()) { + v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), struct_lit), ")".to_string()) + } else { + struct_lit + } +}, + None => { + let vals = Rc::new({ let mut __result = Vec::new(); for f in fields.clone().iter().cloned() { __result.push(emit_typed_expr(field_init_node_value(&f), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024)); } __result }); +v2_rt::concat(v2_rt::concat("(".to_string(), vals.join(&", ".to_string())), ")".to_string()) +}, +} +} } + } else { + "compile_error!(\"cannot resolve anonymous record type in emitter\")".to_string() } - Some(tn) => { - let si = scope.type_env.clone().source_indices.clone(); - let context_lookup = contextual_variant_parent( - &tn, - parent_enum.clone(), - &resolved_type, - emit_info.clone(), - si.clone(), - ); - let effective_parent = match context_lookup { - Some(context_parent) => Some(context_parent.clone()), - None => { - let rt_is_type_var = if (resolved_type.inferred.clone() != None) { - is_type_variable(resolved_type.inferred.clone().clone().unwrap()) - } else { - false - }; - let rt_name = authored_name_at(si.clone(), &resolved_type); - if ((((resolved_type.ident_span.clone() != None) - && (rt_name.clone().as_str() != tn.clone().as_str())) - && !rt_is_type_var) - && (rt_name.clone().as_str() != "Error".to_string().as_str())) - { - Some(rt_name.clone()) - } else { - parent_enum.clone() - } - } - }; - let display_tn = if ((tn.clone().as_str() == "Some".to_string().as_str()) - || (tn.clone().as_str() == "None".to_string().as_str())) - { - tn.clone() +}, + Some(tn) => { + let si = scope.type_env.clone().source_indices.clone(); +let context_lookup = contextual_variant_parent(&tn, parent_enum.clone(), &resolved_type, emit_info.clone(), si.clone()); +let effective_parent = match context_lookup { + Some(context_parent) => Some(context_parent.clone()), + None => { + let rt_is_type_var = if (resolved_type.inferred.clone() != None) { + is_type_variable(resolved_type.inferred.clone().clone().unwrap()) } else { - match effective_parent { - Some(resolved_parent_enum) => v2_rt::concat( - v2_rt::concat(resolved_parent_enum.clone(), "::".to_string()), - tn.clone(), - ), - None => tn.clone(), - } + false }; - if ((tn.clone().as_str() == "Some".to_string().as_str()) - && ((fields.clone().len() as i64) == 1)) - { - match fields.clone().first().cloned() { - Some(f) => { - let inner = emit_typed_expr( - field_init_node_value(&f), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - v2_rt::concat( - v2_rt::concat("Some(".to_string(), inner), - ")".to_string(), - ) - } - None => v2_rt::concat(display_tn, " {}".to_string()), - } +let rt_name = authored_name_at(si.clone(), &resolved_type); +if ((((resolved_type.ident_span.clone() != None) && (rt_name.clone().as_str() != tn.clone().as_str())) && !rt_is_type_var) && (rt_name.clone().as_str() != "Error".to_string().as_str())) { + Some(rt_name.clone()) } else { - if ((fields.clone().len() as i64) == 0) { - { - let empty_raw = v2_rt::concat(display_tn, " {}".to_string()); - let record_parent_enum = match parent_enum.clone() { - Some(en) => en.clone(), - None => "".to_string(), + parent_enum.clone() + } +}, +}; +let display_tn = if ((tn.clone().as_str() == "Some".to_string().as_str()) || (tn.clone().as_str() == "None".to_string().as_str())) { + tn.clone() + } else { + match effective_parent { + Some(resolved_parent_enum) => v2_rt::concat(v2_rt::concat(resolved_parent_enum.clone(), "::".to_string()), tn.clone()), + None => tn.clone(), +} + }; +if ((tn.clone().as_str() == "Some".to_string().as_str()) && ((fields.clone().len() as i64) == 1)) { + match fields.clone().first().cloned() { + Some(f) => { + let inner = emit_typed_expr(field_init_node_value(&f), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +v2_rt::concat(v2_rt::concat("Some(".to_string(), inner), ")".to_string()) +}, + None => v2_rt::concat(display_tn, " {}".to_string()), +} + } else { + if ((fields.clone().len() as i64) == 0) { + { + let empty_raw = v2_rt::concat(display_tn, " {}".to_string()); +let record_parent_enum = match parent_enum.clone() { + Some(en) => en.clone(), + None => "".to_string(), +}; +empty_raw +} + } else { + { + let field_strs = Rc::new({ let mut __result = Vec::new(); for f in fields.clone().iter().cloned() { __result.push({ + let f_name = field_init_node_name_at(f.clone(), scope.type_env.clone().source_indices.clone()); +let f_value = field_init_node_value(&f); +let val_str = emit_field_value_with_context(&f_value, &resolved_type, type_name.clone(), &f_name, registry.clone(), &scope, depth.clone(), &shared_types, &emit_info); +let needs_wrap = (is_optional_struct_field(emit_info.clone(), tn.clone(), f_name.clone()) && (is_already_optional(&f_value, emit_info.clone(), &scope) == false)); +let field_val = if needs_wrap.clone() { + v2_rt::concat(v2_rt::concat("Some(".to_string(), val_str.clone()), ")".to_string()) + } else { + val_str.clone() }; - empty_raw - } - } else { - { - let field_strs = Rc::new({ - let mut __result = Vec::new(); - for f in fields.clone().iter().cloned() { - __result.push({ - let f_name = field_init_node_name_at( - f.clone(), - scope.type_env.clone().source_indices.clone(), - ); - let f_value = field_init_node_value(&f); - let val_str = emit_field_value_with_context( - &f_value, - &resolved_type, - type_name.clone(), - &f_name, - registry.clone(), - &scope, - depth.clone(), - &shared_types, - &emit_info, - ); - let needs_wrap = (is_optional_struct_field( - emit_info.clone(), - tn.clone(), - f_name.clone(), - ) && (is_already_optional( - &f_value, - emit_info.clone(), - &scope, - ) == false)); - let field_val = if needs_wrap.clone() { - v2_rt::concat( - v2_rt::concat("Some(".to_string(), val_str.clone()), - ")".to_string(), - ) - } else { - val_str.clone() - }; - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - " ".to_string(), - emit_ident( - f_name.clone(), - RenderTarget::Rust, - ), - ), - ": ".to_string(), - ), - field_val.clone(), - ), - ",".to_string(), - ) - }); - } - __result - }); - let provided_names = Rc::new({ - let mut __result = Vec::new(); - for f in fields.clone().iter().cloned() { - __result.push(field_init_node_name_at( - f.clone(), - scope.type_env.clone().source_indices.clone(), - )); - } - __result - }); - let provided_set = provided_names.iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, n: String| { - v2_rt::rc_map_insert(acc, n.clone(), true) - }, - ); - let summary = lookup_emit_type_summary(emit_info.clone(), tn.clone()); - let default_strs = match summary { - Some(s) => { - let fs = s.field_summaries.clone(); - let ftm = s.field_type_map.clone(); - let missing = Rc::new({ - let mut __result = Vec::new(); - for k in Rc::new(v2_rt::map_keys(&fs)).iter().cloned() { - if !emit_map_has(provided_set.clone(), k.clone()) { - __result.push(k); - } - } - __result - }); - let all_defaultable = { - let mut __all = true; - for fname in missing.clone().iter().cloned() { - if !({ - let has_zv = - match v2_rt::map_get(&ftm, fname.clone()) { - Some(ft) => match rust_zero_value(&ft) { - Some(_) => true, - None => false, - }, - None => false, - }; - (has_zv.clone() - || is_optional_struct_field( - emit_info.clone(), - tn.clone(), - fname.clone(), - )) - }) { - __all = false; - break; - } - } - __all - }; - if all_defaultable { - Rc::new({ - let mut __result = Vec::new(); - for fname in missing.clone().iter().cloned() { - __result.extend((*if is_optional_struct_field(emit_info.clone(), tn.clone(), fname.clone()) { +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" ".to_string(), emit_ident(f_name.clone(), RenderTarget::Rust)), ": ".to_string()), field_val.clone()), ",".to_string()) +}); } __result }); +let provided_names = Rc::new({ let mut __result = Vec::new(); for f in fields.clone().iter().cloned() { __result.push(field_init_node_name_at(f.clone(), scope.type_env.clone().source_indices.clone())); } __result }); +let provided_set = provided_names.iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, n: String| v2_rt::rc_map_insert(acc, n.clone(), true)); +let summary = lookup_emit_type_summary(emit_info.clone(), tn.clone()); +let default_strs = match summary { + Some(s) => { + let fs = s.field_summaries.clone(); +let ftm = s.field_type_map.clone(); +let missing = Rc::new({ let mut __result = Vec::new(); for k in Rc::new(v2_rt::map_keys(&fs)).iter().cloned() { if !emit_map_has(provided_set.clone(), k.clone()) { __result.push(k); } } __result }); +let all_defaultable = { let mut __all = true; for fname in missing.clone().iter().cloned() { if !({ + let has_zv = match v2_rt::map_get(&ftm, fname.clone()) { + Some(ft) => match rust_zero_value(&ft) { + Some(_) => true, + None => false, +}, + None => false, +}; +(has_zv.clone() || is_optional_struct_field(emit_info.clone(), tn.clone(), fname.clone())) +}) { __all = false; break; } } __all }; +if all_defaultable { + Rc::new({ let mut __result = Vec::new(); for fname in missing.clone().iter().cloned() { __result.extend((*if is_optional_struct_field(emit_info.clone(), tn.clone(), fname.clone()) { Rc::new(vec![v2_rt::concat(v2_rt::concat(" ".to_string(), emit_ident(fname.clone(), RenderTarget::Rust)), ": None,".to_string())]) } else { match v2_rt::map_get(&ftm, fname.clone()) { @@ -9752,32 +3888,23 @@ pub fn emit_typed_record_lit( }, None => Rc::new(vec![]), } - }).iter().cloned()); - } - __result - }) - } else { - Rc::new(vec![]) - } - } - None => Rc::new(vec![]), - }; - let all_field_strs = v2_rt::concat(field_strs, default_strs); - let fields_str = all_field_strs.join(&"\n".to_string()); - let raw = v2_rt::concat( - v2_rt::concat( - v2_rt::concat(display_tn, " {\n".to_string()), - fields_str, - ), - "\n}".to_string(), - ); - raw - } - } + }).iter().cloned()); } __result }) + } else { + Rc::new(vec![]) + } +}, + None => Rc::new(vec![]), +}; +let all_field_strs = v2_rt::concat(field_strs, default_strs); +let fields_str = all_field_strs.join(&"\n".to_string()); +let raw = v2_rt::concat(v2_rt::concat(v2_rt::concat(display_tn, " {\n".to_string()), fields_str), "\n}".to_string()); +raw +} } } - } - } +}, +} +} } pub fn rust_zero_value(type_name: &String) -> Option { @@ -9788,10 +3915,7 @@ pub fn rust_zero_value(type_name: &String) -> Option { Some("false".to_string()) } else { if (type_name.clone().as_str() == "String".to_string().as_str()) { - Some(v2_rt::concat( - "\"\"".to_string(), - ".to_string()".to_string(), - )) + Some(v2_rt::concat("\"\"".to_string(), ".to_string()".to_string())) } else { None } @@ -9799,1058 +3923,330 @@ pub fn rust_zero_value(type_name: &String) -> Option { } } -pub fn emit_typed_bin_op( - op: &BinOp, - algebra_field: Option, - left: &Rc, - right: &Rc, - registry: &Rc>>, - scope: &Rc, - depth: i64, - shared_types: &Rc>, - emit_info: &Rc, -) -> String { +pub fn emit_typed_bin_op(op: &BinOp, algebra_field: Option, left: &Rc, right: &Rc, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { { - let l_str = emit_typed_expr( - left.clone(), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - let r_str = emit_typed_expr( - right.clone(), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - if is_null_coalesce(op.clone()) { + let l_str = emit_typed_expr(left.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +let r_str = emit_typed_expr(right.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +if is_null_coalesce(op.clone()) { emit_null_coalesce(l_str, r_str, RenderTarget::Rust) } else { { let op_str = emit_bin_op_symbol(op.clone(), &RenderTarget::Rust, algebra_field); - if is_string_comparison( - op.clone(), - left.clone(), - right.clone(), - &scope.type_env.clone().source_indices.clone(), - ) { +if is_string_comparison(op.clone(), left.clone(), right.clone(), &scope.type_env.clone().source_indices.clone()) { { let l_optional = is_optional_typed_expr(left.clone()); - let r_optional = is_optional_typed_expr(right.clone()); - if (l_optional.clone() || r_optional.clone()) { +let r_optional = is_optional_typed_expr(right.clone()); +if (l_optional.clone() || r_optional.clone()) { { let l_cmp = if l_optional.clone() { v2_rt::concat(l_str, ".as_deref()".to_string()) } else { - v2_rt::concat( - v2_rt::concat("Some(".to_string(), l_str), - ".as_str())".to_string(), - ) + v2_rt::concat(v2_rt::concat("Some(".to_string(), l_str), ".as_str())".to_string()) }; - let r_cmp = if r_optional.clone() { +let r_cmp = if r_optional.clone() { v2_rt::concat(r_str, ".as_deref()".to_string()) } else { - v2_rt::concat( - v2_rt::concat("Some(".to_string(), r_str), - ".as_str())".to_string(), - ) + v2_rt::concat(v2_rt::concat("Some(".to_string(), r_str), ".as_str())".to_string()) }; - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("(".to_string(), l_cmp), - " ".to_string(), - ), - op_str, - ), - " ".to_string(), - ), - r_cmp, - ), - ")".to_string(), - ) - } +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("(".to_string(), l_cmp), " ".to_string()), op_str), " ".to_string()), r_cmp), ")".to_string()) +} } else { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("(".to_string(), l_str), - ".as_str() ".to_string(), - ), - op_str, - ), - " ".to_string(), - ), - r_str, - ), - ".as_str())".to_string(), - ) + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("(".to_string(), l_str), ".as_str() ".to_string()), op_str), " ".to_string()), r_str), ".as_str())".to_string()) } - } +} } else { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("(".to_string(), l_str), - " ".to_string(), - ), - op_str, - ), - " ".to_string(), - ), - r_str, - ), - ")".to_string(), - ) + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("(".to_string(), l_str), " ".to_string()), op_str), " ".to_string()), r_str), ")".to_string()) } - } +} } - } +} } pub fn is_optional_typed_expr(e: Rc) -> bool { match e.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - (rt.return_cardinality.clone() == Cardinality::CardOptional) - } - _ => false, - } + Some(InferredNode::Resolved { node: rt, .. }) => (rt.return_cardinality.clone() == Cardinality::CardOptional), + _ => false, +} } -pub fn is_string_comparison( - op: BinOp, - left: Rc, - right: Rc, - source_indices: &Rc>>, -) -> bool { +pub fn is_string_comparison(op: BinOp, left: Rc, right: Rc, source_indices: &Rc>>) -> bool { match op { - BinOp::Eq => { - (is_string_typed_expr(left, source_indices.clone()) - && is_string_typed_expr(right, source_indices.clone())) - } - BinOp::Ne => { - (is_string_typed_expr(left, source_indices.clone()) - && is_string_typed_expr(right, source_indices.clone())) - } - _ => false, - } + BinOp::Eq => (is_string_typed_expr(left, source_indices.clone()) && is_string_typed_expr(right, source_indices.clone())), + BinOp::Ne => (is_string_typed_expr(left, source_indices.clone()) && is_string_typed_expr(right, source_indices.clone())), + _ => false, +} } -pub fn is_string_typed_expr( - e: Rc, - source_indices: Rc>>, -) -> bool { +pub fn is_string_typed_expr(e: Rc, source_indices: Rc>>) -> bool { match e.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - let is_optional = (rt.return_cardinality.clone() == Cardinality::CardOptional); - let inner = if is_optional { - with_required_cardinality(&rt) - } else { - rt.clone() - }; - is_rust_string_like(inner, source_indices) - } - _ => false, - } + Some(InferredNode::Resolved { node: rt, .. }) => { + let is_optional = (rt.return_cardinality.clone() == Cardinality::CardOptional); +let inner = if is_optional { + with_required_cardinality(&rt) + } else { + rt.clone() + }; +is_rust_string_like(inner, source_indices) +}, + _ => false, +} } -pub fn emit_typed_string_interp( - parts: &Rc>>, - registry: Rc>>, - scope: Rc, - depth: i64, - shared_types: Rc>, - emit_info: Rc, -) -> String { +pub fn emit_typed_string_interp(parts: &Rc>>, registry: Rc>>, scope: Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { { - let has_interpolations = { - let mut __found = false; - for p in parts.clone().iter().cloned() { - if match (*p.clone()).clone() { - StringPart::Interpolation { .. } => true, - _ => false, - } { - __found = true; - break; - } - } - __found - }; - let fmt_parts = Rc::new({ - let mut __result = Vec::new(); - for p in parts.clone().iter().cloned() { - __result.push(typed_interp_format_part( - p.clone(), - registry.clone(), - scope.clone(), - depth.clone(), - shared_types.clone(), - emit_info.clone(), - has_interpolations.clone(), - )); - } - __result - }); - let fmt_str = Rc::new({ - let mut __result = Vec::new(); - for p in fmt_parts.clone().iter().cloned() { - __result.push(p.format_segment.clone()); - } - __result - }) - .join(&"".to_string()); - let args = Rc::new({ - let mut __result = Vec::new(); - for a in Rc::new({ - let mut __result = Vec::new(); - for p in fmt_parts.clone().iter().cloned() { - __result.push(p.arg_expr.clone()); - } - __result - }) - .iter() - .cloned() - { - if (a.clone().as_str() != "".to_string().as_str()) { - __result.push(a); - } - } - __result - }); - if ((args.clone().len() as i64) == 0) { - v2_rt::concat( - v2_rt::concat("\"".to_string(), fmt_str), - "\".to_string()".to_string(), - ) + let has_interpolations = { let mut __found = false; for p in parts.clone().iter().cloned() { if match (*p.clone()).clone() { + StringPart::Interpolation { .. } => true, + _ => false, +} { __found = true; break; } } __found }; +let fmt_parts = Rc::new({ let mut __result = Vec::new(); for p in parts.clone().iter().cloned() { __result.push(typed_interp_format_part(p.clone(), registry.clone(), scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone(), has_interpolations.clone())); } __result }); +let fmt_str = Rc::new({ let mut __result = Vec::new(); for p in fmt_parts.clone().iter().cloned() { __result.push(p.format_segment.clone()); } __result }).join(&"".to_string()); +let args = Rc::new({ let mut __result = Vec::new(); for a in Rc::new({ let mut __result = Vec::new(); for p in fmt_parts.clone().iter().cloned() { __result.push(p.arg_expr.clone()); } __result }).iter().cloned() { if (a.clone().as_str() != "".to_string().as_str()) { __result.push(a); } } __result }); +if ((args.clone().len() as i64) == 0) { + v2_rt::concat(v2_rt::concat("\"".to_string(), fmt_str), "\".to_string()".to_string()) } else { { let args_str = args.clone().join(&", ".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("format!(\"".to_string(), fmt_str), - "\", ".to_string(), - ), - args_str, - ), - ")".to_string(), - ) - } - } - } +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("format!(\"".to_string(), fmt_str), "\", ".to_string()), args_str), ")".to_string()) } - -pub fn typed_interp_format_part( - part: Rc, - registry: Rc>>, - scope: Rc, - depth: i64, - shared_types: Rc>, - emit_info: Rc, - has_interpolations: bool, -) -> Rc { - match (*part).clone() { - StringPart::Text { value: v, .. } => { - let escaped = if has_interpolations { - escape_rust_interp_text(v.clone()) - } else { - escape_string_literal_body(v.clone()) - }; - Rc::new(InterpPart { - format_segment: escaped, - arg_expr: "".to_string(), - }) } - StringPart::Interpolation { expr: e, .. } => Rc::new(InterpPart { - format_segment: "{}".to_string(), - arg_expr: emit_typed_expr( - e.clone(), - registry, - &scope, - depth, - shared_types, - emit_info, - 1024, - ), - }), - } } - -pub fn emit_typed_block( - stmts: Rc>>, - registry: Rc>>, - scope: Rc, - depth: i64, - shared_types: Rc>, - emit_info: Rc, -) -> String { - { - let state = emit_rust_block_stmts( - stmts, - Rc::new(vec![]), - scope, - registry, - (depth.clone() + 1), - shared_types, - emit_info, - ); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("{\n".to_string(), make_indent((depth.clone() + 1))), - state.text.clone().join(&"\n".to_string()), - ), - "\n}".to_string(), - ) - } } -pub fn emit_tco_init_block_stmts( - mut remaining: Rc>>, - mut text: Rc>, - mut scope: Rc, - mut registry: Rc>>, - mut depth: i64, - mut shared_types: Rc>, - mut emit_info: Rc, - mut params: Rc>>, -) -> Rc { - loop { - match remaining.clone().first().cloned() { - None => { - break Rc::new(BlockEmitState { - text: text, - scope: scope.clone(), - }); - } - Some(stmt) => { - let rest = Rc::new( - remaining - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ); - match rest.clone().first().cloned() { - None => { - break Rc::new(BlockEmitState { - text: text, - scope: scope.clone(), - }); - } - Some(_) => { - let line = emit_tco_init_stmt( - &stmt, - params.clone(), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - ); - let next_scope = scope_after_expr(&stmt, &scope); - { - let __tco_0 = rest.clone(); - let __tco_1 = v2_rt::rc_list_push(text, line); - let __tco_2 = next_scope; - remaining = __tco_0; - text = __tco_1; - scope = __tco_2; - continue; - } - } - } - } - } - } +pub fn typed_interp_format_part(part: Rc, registry: Rc>>, scope: Rc, depth: i64, shared_types: Rc>, emit_info: Rc, has_interpolations: bool) -> Rc { + match (*part).clone() { + StringPart::Text { value: v, .. } => { + let escaped = if has_interpolations { + escape_rust_interp_text(v.clone()) + } else { + escape_string_literal_body(v.clone()) + }; +Rc::new(InterpPart { + format_segment: escaped, + arg_expr: "".to_string(), +}) +}, + StringPart::Interpolation { expr: e, .. } => Rc::new(InterpPart { + format_segment: "{}".to_string(), + arg_expr: emit_typed_expr(e.clone(), registry, &scope, depth, shared_types, emit_info, 1024), +}), +} +} + +pub fn emit_typed_block(stmts: Rc>>, registry: Rc>>, scope: Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { + { + let state = emit_rust_block_stmts(stmts, Rc::new(vec![]), scope, registry, (depth.clone() + 1), shared_types, emit_info); +v2_rt::concat(v2_rt::concat(v2_rt::concat("{\n".to_string(), make_indent((depth.clone() + 1))), state.text.clone().join(&"\n".to_string())), "\n}".to_string()) +} } -pub fn emit_tco_init_stmt( - stmt: &Rc, - params: Rc>>, - registry: Rc>>, - scope: &Rc, - depth: i64, - shared_types: Rc>, - emit_info: Rc, -) -> String { +pub fn emit_tco_init_block_stmts(mut remaining: Rc>>, mut text: Rc>, mut scope: Rc, mut registry: Rc>>, mut depth: i64, mut shared_types: Rc>, mut emit_info: Rc, mut params: Rc>>) -> Rc { + loop { + match remaining.clone().first().cloned() { + None => { break Rc::new(BlockEmitState { + text: text, + scope: scope.clone(), +}); }, + Some(stmt) => { let rest = Rc::new(remaining.clone().iter().cloned().skip(1 as usize).collect::>()); +match rest.clone().first().cloned() { + None => { break Rc::new(BlockEmitState { + text: text, + scope: scope.clone(), +}); }, + Some(_) => { let line = emit_tco_init_stmt(&stmt, params.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone()); +let next_scope = scope_after_expr(&stmt, &scope); +{ + let __tco_0 = rest.clone(); +let __tco_1 = v2_rt::rc_list_push(text, line); +let __tco_2 = next_scope; +remaining = __tco_0; +text = __tco_1; +scope = __tco_2; +continue; +} }, +} }, +} +} +} + +pub fn emit_tco_init_stmt(stmt: &Rc, params: Rc>>, registry: Rc>>, scope: &Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { match (*stmt.expr_data.clone()).clone() { - ExprData::ExprLet => { - let n = - let_binding_name_at(stmt.clone(), scope.type_env.clone().source_indices.clone()); - let v = let_value(stmt.clone()); - let val_str = - emit_typed_expr(v, registry, &scope, depth, shared_types, emit_info, 1024); - let is_param = { - let mut __found = false; - for p in params.iter().cloned() { - if (param_node_name_at( - p.clone(), - scope.type_env.clone().source_indices.clone(), - ) - .as_str() - == n.clone().as_str()) - { - __found = true; - break; - } - } - __found - }; - if is_param { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(emit_ident(n.clone(), RenderTarget::Rust), " = ".to_string()), - val_str, - ), - ";".to_string(), - ) - } else { - emit_let_binding(n.clone(), val_str, &RenderTarget::Rust) - } + ExprData::ExprLet => { + let n = let_binding_name_at(stmt.clone(), scope.type_env.clone().source_indices.clone()); +let v = let_value(stmt.clone()); +let val_str = emit_typed_expr(v, registry, &scope, depth, shared_types, emit_info, 1024); +let is_param = { let mut __found = false; for p in params.iter().cloned() { if (param_node_name_at(p.clone(), scope.type_env.clone().source_indices.clone()).as_str() == n.clone().as_str()) { __found = true; break; } } __found }; +if is_param { + v2_rt::concat(v2_rt::concat(v2_rt::concat(emit_ident(n.clone(), RenderTarget::Rust), " = ".to_string()), val_str), ";".to_string()) + } else { + emit_let_binding(n.clone(), val_str, &RenderTarget::Rust) } - _ => emit_typed_expr( - stmt.clone(), - registry, - &scope, - depth, - shared_types, - emit_info, - 1024, - ), - } +}, + _ => emit_typed_expr(stmt.clone(), registry, &scope, depth, shared_types, emit_info, 1024), +} } -pub fn emit_typed_tco_body( - texpr: Rc, - fn_name: String, - params: Rc>>, - registry: Rc>>, - scope: Rc, - depth: i64, - shared_types: Rc>, - emit_info: Rc, -) -> String { +pub fn emit_typed_tco_body(texpr: Rc, fn_name: String, params: Rc>>, registry: Rc>>, scope: Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { { - let inner = emit_typed_tco_expr( - texpr, - &fn_name, - params, - registry, - scope, - (depth.clone() + 1), - shared_types, - emit_info, - ); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("loop {\n".to_string(), make_indent((depth.clone() + 1))), - inner, - ), - "\n}".to_string(), - ) - } + let inner = emit_typed_tco_expr(texpr, &fn_name, params, registry, scope, (depth.clone() + 1), shared_types, emit_info); +v2_rt::concat(v2_rt::concat(v2_rt::concat("loop {\n".to_string(), make_indent((depth.clone() + 1))), inner), "\n}".to_string()) +} } -pub fn emit_rust_tco_non_self_call( - frame: &Rc, - registry: Rc>>, - shared_types: Rc>, - emit_info: Rc, -) -> String { +pub fn emit_rust_tco_non_self_call(frame: &Rc, registry: Rc>>, shared_types: Rc>, emit_info: Rc) -> String { match (*frame.expr.clone().expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { - let f = expr_call_func_at( - frame.expr.clone(), - frame.scope.clone().type_env.clone().source_indices.clone(), - ); - let call_str = emit_typed_call( - &f, - &frame.expr.clone().children.clone(), - ®istry, - &frame.scope.clone(), - frame.depth.clone(), - &shared_types, - &emit_info, - ); - v2_rt::concat( - v2_rt::concat("break ".to_string(), call_str), - ";".to_string(), - ) - } - _ => emit_error_expr( - "emit_rust_tco_non_self_call expected ExprCall".to_string(), - RenderTarget::Rust, - ), - } + ExprData::ExprCall { .. } => { + let f = expr_call_func_at(frame.expr.clone(), frame.scope.clone().type_env.clone().source_indices.clone()); +let call_str = emit_typed_call(&f, &frame.expr.clone().children.clone(), ®istry, &frame.scope.clone(), frame.depth.clone(), &shared_types, &emit_info); +v2_rt::concat(v2_rt::concat("break ".to_string(), call_str), ";".to_string()) +}, + _ => emit_error_expr("emit_rust_tco_non_self_call expected ExprCall".to_string(), RenderTarget::Rust), +} } -pub fn emit_rust_tco_if( - frame: &Rc, - fn_name: &String, - params: &Rc>>, - registry: &Rc>>, - shared_types: &Rc>, - emit_info: &Rc, -) -> String { +pub fn emit_rust_tco_if(frame: &Rc, fn_name: &String, params: &Rc>>, registry: &Rc>>, shared_types: &Rc>, emit_info: &Rc) -> String { match (*frame.expr.clone().expr_data.clone()).clone() { - ExprData::ExprIf => { - let c = if_condition(frame.expr.clone()); - let t = if_then_branch(frame.expr.clone()); - let e = if_else_branch(frame.expr.clone()); - let cond_str = emit_typed_expr( - c, - registry.clone(), - &frame.scope.clone(), - frame.depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - let then_str = emit_typed_tco_expr( - t, - &fn_name, - params.clone(), - registry.clone(), - frame.scope.clone(), - (frame.depth.clone() + 1), - shared_types.clone(), - emit_info.clone(), - ); - match e { - Some(eb) => { - let else_str = emit_typed_tco_expr( - eb.clone(), - &fn_name, - params.clone(), - registry.clone(), - frame.scope.clone(), - (frame.depth.clone() + 1), - shared_types.clone(), - emit_info.clone(), - ); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("if ".to_string(), cond_str), - " {\n".to_string(), - ), - make_indent((frame.depth.clone() + 1)), - ), - then_str, - ), - "\n} else {\n".to_string(), - ), - make_indent((frame.depth.clone() + 1)), - ), - else_str, - ), - "\n}".to_string(), - ) - } - None => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("if ".to_string(), cond_str), - " {\n".to_string(), - ), - make_indent((frame.depth.clone() + 1)), - ), - then_str, - ), - "\n}".to_string(), - ), - } - } - _ => emit_error_expr( - "emit_rust_tco_if expected ExprIf".to_string(), - RenderTarget::Rust, - ), - } + ExprData::ExprIf => { + let c = if_condition(frame.expr.clone()); +let t = if_then_branch(frame.expr.clone()); +let e = if_else_branch(frame.expr.clone()); +let cond_str = emit_typed_expr(c, registry.clone(), &frame.scope.clone(), frame.depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +let then_str = emit_typed_tco_expr(t, &fn_name, params.clone(), registry.clone(), frame.scope.clone(), (frame.depth.clone() + 1), shared_types.clone(), emit_info.clone()); +match e { + Some(eb) => { + let else_str = emit_typed_tco_expr(eb.clone(), &fn_name, params.clone(), registry.clone(), frame.scope.clone(), (frame.depth.clone() + 1), shared_types.clone(), emit_info.clone()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("if ".to_string(), cond_str), " {\n".to_string()), make_indent((frame.depth.clone() + 1))), then_str), "\n} else {\n".to_string()), make_indent((frame.depth.clone() + 1))), else_str), "\n}".to_string()) +}, + None => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("if ".to_string(), cond_str), " {\n".to_string()), make_indent((frame.depth.clone() + 1))), then_str), "\n}".to_string()), +} +}, + _ => emit_error_expr("emit_rust_tco_if expected ExprIf".to_string(), RenderTarget::Rust), +} } -pub fn emit_rust_tco_match( - frame: &Rc, - fn_name: String, - params: Rc>>, - registry: &Rc>>, - shared_types: &Rc>, - emit_info: &Rc, -) -> String { +pub fn emit_rust_tco_match(frame: &Rc, fn_name: String, params: Rc>>, registry: &Rc>>, shared_types: &Rc>, emit_info: &Rc) -> String { match (*frame.expr.clone().expr_data.clone()).clone() { - ExprData::ExprMatch => { - let s = match_scrutinee(frame.expr.clone()); - let arm_list = match_arm_nodes(frame.expr.clone()); - let scrut_str = emit_typed_expr( - s.clone(), - registry.clone(), - &frame.scope.clone(), - frame.depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - let tco_scrut_type = match s.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - let is_optional = (rt.return_cardinality.clone() == Cardinality::CardOptional); - if is_optional { - authored_name_at( - frame.scope.clone().type_env.clone().source_indices.clone(), - &with_required_cardinality(&rt), - ) - } else { - authored_name_at( - frame.scope.clone().type_env.clone().source_indices.clone(), - &rt, - ) - } - } - _ => "".to_string(), - }; - let rc_match = analyze_rc_match( - &s, - arm_list.clone(), - tco_scrut_type.clone(), - &shared_types, - emit_info.clone(), - &frame.scope.clone().type_env.clone().source_indices.clone(), - ); - let arm_strs = Rc::new({ - let mut __result = Vec::new(); - for arm in arm_list.clone().iter().cloned() { - __result.push(emit_typed_tco_match_arm( - &arm, - fn_name.clone(), - params.clone(), - ®istry, - &frame.scope.clone(), - frame.depth.clone(), - &shared_types, - &emit_info, - &tco_scrut_type, - )); - } - __result - }); - let arms_str = arm_strs.join(&"\n".to_string()); - let tco_needs_as_str = - (all_arms_are_string_lit(&arm_list) && ((arm_list.clone().len() as i64) > 0)); - if rc_match.needs_option_deref.clone() { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("match ".to_string(), scrut_str), - ".as_deref()".to_string(), - ), - clone_iterator_suffix(), - ), - " {\n".to_string(), - ), - arms_str, - ), - "\n}".to_string(), - ) + ExprData::ExprMatch => { + let s = match_scrutinee(frame.expr.clone()); +let arm_list = match_arm_nodes(frame.expr.clone()); +let scrut_str = emit_typed_expr(s.clone(), registry.clone(), &frame.scope.clone(), frame.depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +let tco_scrut_type = match s.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => { + let is_optional = (rt.return_cardinality.clone() == Cardinality::CardOptional); +if is_optional { + authored_name_at(frame.scope.clone().type_env.clone().source_indices.clone(), &with_required_cardinality(&rt)) } else { - if rc_match.needs_deref.clone() { - { - let sharing = language_spec(RenderTarget::Rust).sharing.clone(); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "match ".to_string(), - apply_type_template1( - sharing.deref_clone.clone(), - scrut_str, - ), - ), - " {\n".to_string(), - ), - arms_str, - ), - "\n}".to_string(), - ) - } + authored_name_at(frame.scope.clone().type_env.clone().source_indices.clone(), &rt) + } +}, + _ => "".to_string(), +}; +let rc_match = analyze_rc_match(&s, arm_list.clone(), tco_scrut_type.clone(), &shared_types, emit_info.clone(), &frame.scope.clone().type_env.clone().source_indices.clone()); +let arm_strs = Rc::new({ let mut __result = Vec::new(); for arm in arm_list.clone().iter().cloned() { __result.push(emit_typed_tco_match_arm(&arm, fn_name.clone(), params.clone(), ®istry, &frame.scope.clone(), frame.depth.clone(), &shared_types, &emit_info, &tco_scrut_type)); } __result }); +let arms_str = arm_strs.join(&"\n".to_string()); +let tco_needs_as_str = (all_arms_are_string_lit(&arm_list) && ((arm_list.clone().len() as i64) > 0)); +if rc_match.needs_option_deref.clone() { + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("match ".to_string(), scrut_str), ".as_deref()".to_string()), clone_iterator_suffix()), " {\n".to_string()), arms_str), "\n}".to_string()) + } else { + if rc_match.needs_deref.clone() { + { + let sharing = language_spec(RenderTarget::Rust).sharing.clone(); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("match ".to_string(), apply_type_template1(sharing.deref_clone.clone(), scrut_str)), " {\n".to_string()), arms_str), "\n}".to_string()) +} + } else { + if tco_needs_as_str { + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("match ".to_string(), scrut_str), ".as_str() {\n".to_string()), arms_str), "\n}".to_string()) } else { - if tco_needs_as_str { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("match ".to_string(), scrut_str), - ".as_str() {\n".to_string(), - ), - arms_str, - ), - "\n}".to_string(), - ) - } else { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("match ".to_string(), scrut_str), - " {\n".to_string(), - ), - arms_str, - ), - "\n}".to_string(), - ) - } + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("match ".to_string(), scrut_str), " {\n".to_string()), arms_str), "\n}".to_string()) } } } - _ => emit_error_expr( - "emit_rust_tco_match expected ExprMatch".to_string(), - RenderTarget::Rust, - ), - } +}, + _ => emit_error_expr("emit_rust_tco_match expected ExprMatch".to_string(), RenderTarget::Rust), +} } -pub fn emit_rust_tco_let( - frame: &Rc, - fn_name: String, - params: &Rc>>, - registry: &Rc>>, - shared_types: &Rc>, - emit_info: &Rc, -) -> String { +pub fn emit_rust_tco_let(frame: &Rc, fn_name: String, params: &Rc>>, registry: &Rc>>, shared_types: &Rc>, emit_info: &Rc) -> String { match (*frame.expr.clone().expr_data.clone()).clone() { - ExprData::ExprLet => { - let n = let_binding_name_at( - frame.expr.clone(), - frame.scope.clone().type_env.clone().source_indices.clone(), - ); - let v = let_value(frame.expr.clone()); - let bd = let_body(frame.expr.clone()); - let val_str = emit_typed_expr( - v.clone(), - registry.clone(), - &frame.scope.clone(), - frame.depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - let is_param = { - let mut __found = false; - for p in params.clone().iter().cloned() { - if (param_node_name_at( - p.clone(), - frame.scope.clone().type_env.clone().source_indices.clone(), - ) - .as_str() - == n.clone().as_str()) - { - __found = true; - break; - } - } - __found - }; - let let_line = if is_param { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(emit_ident(n.clone(), RenderTarget::Rust), " = ".to_string()), - val_str, - ), - ";".to_string(), - ) - } else { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "let ".to_string(), - emit_ident(n.clone(), RenderTarget::Rust), - ), - " = ".to_string(), - ), - val_str, - ), - ";".to_string(), - ) - }; - let next_scope = extend_scope( - &frame.scope.clone(), - &n, - resolved_type(v.clone()), - Rc::new(SubValueRelation::SubValueUnknown), - ); - match bd { - Some(b) => v2_rt::concat( - v2_rt::concat(let_line, "\n".to_string()), - emit_typed_tco_expr( - b.clone(), - &fn_name, - params.clone(), - registry.clone(), - next_scope, - frame.depth.clone(), - shared_types.clone(), - emit_info.clone(), - ), - ), - None => let_line, - } - } - _ => emit_error_expr( - "emit_rust_tco_let expected ExprLet".to_string(), - RenderTarget::Rust, - ), - } + ExprData::ExprLet => { + let n = let_binding_name_at(frame.expr.clone(), frame.scope.clone().type_env.clone().source_indices.clone()); +let v = let_value(frame.expr.clone()); +let bd = let_body(frame.expr.clone()); +let val_str = emit_typed_expr(v.clone(), registry.clone(), &frame.scope.clone(), frame.depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +let is_param = { let mut __found = false; for p in params.clone().iter().cloned() { if (param_node_name_at(p.clone(), frame.scope.clone().type_env.clone().source_indices.clone()).as_str() == n.clone().as_str()) { __found = true; break; } } __found }; +let let_line = if is_param { + v2_rt::concat(v2_rt::concat(v2_rt::concat(emit_ident(n.clone(), RenderTarget::Rust), " = ".to_string()), val_str), ";".to_string()) + } else { + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("let ".to_string(), emit_ident(n.clone(), RenderTarget::Rust)), " = ".to_string()), val_str), ";".to_string()) + }; +let next_scope = extend_scope(&frame.scope.clone(), &n, resolved_type(v.clone()), Rc::new(SubValueRelation::SubValueUnknown)); +match bd { + Some(b) => v2_rt::concat(v2_rt::concat(let_line, "\n".to_string()), emit_typed_tco_expr(b.clone(), &fn_name, params.clone(), registry.clone(), next_scope, frame.depth.clone(), shared_types.clone(), emit_info.clone())), + None => let_line, +} +}, + _ => emit_error_expr("emit_rust_tco_let expected ExprLet".to_string(), RenderTarget::Rust), +} } -pub fn emit_rust_tco_block( - frame: &Rc, - fn_name: String, - params: &Rc>>, - registry: &Rc>>, - shared_types: &Rc>, - emit_info: &Rc, -) -> String { +pub fn emit_rust_tco_block(frame: &Rc, fn_name: String, params: &Rc>>, registry: &Rc>>, shared_types: &Rc>, emit_info: &Rc) -> String { match (*frame.expr.clone().expr_data.clone()).clone() { - ExprData::ExprBlock => { - let ss = frame.expr.clone().children.clone(); - if ((ss.clone().len() as i64) == 0) { - "break;".to_string() - } else { - { - let init_state = emit_tco_init_block_stmts( - ss.clone(), - Rc::new(vec![]), - frame.scope.clone(), - registry.clone(), - frame.depth.clone(), - shared_types.clone(), - emit_info.clone(), - params.clone(), - ); - let last_str = match ss.clone().last().cloned() { - Some(last_expr) => emit_typed_tco_expr( - last_expr.clone(), - &fn_name, - params.clone(), - registry.clone(), - init_state.scope.clone(), - frame.depth.clone(), - shared_types.clone(), - emit_info.clone(), - ), - None => "break;".to_string(), - }; - if ((init_state.text.clone().len() as i64) == 0) { - last_str - } else { - v2_rt::concat( - v2_rt::concat( - init_state.text.clone().join(&"\n".to_string()), - "\n".to_string(), - ), - last_str, - ) - } + ExprData::ExprBlock => { + let ss = frame.expr.clone().children.clone(); +if ((ss.clone().len() as i64) == 0) { + "break;".to_string() + } else { + { + let init_state = emit_tco_init_block_stmts(ss.clone(), Rc::new(vec![]), frame.scope.clone(), registry.clone(), frame.depth.clone(), shared_types.clone(), emit_info.clone(), params.clone()); +let last_str = match ss.clone().last().cloned() { + Some(last_expr) => emit_typed_tco_expr(last_expr.clone(), &fn_name, params.clone(), registry.clone(), init_state.scope.clone(), frame.depth.clone(), shared_types.clone(), emit_info.clone()), + None => "break;".to_string(), +}; +if ((init_state.text.clone().len() as i64) == 0) { + last_str + } else { + v2_rt::concat(v2_rt::concat(init_state.text.clone().join(&"\n".to_string()), "\n".to_string()), last_str) } - } +} } - _ => emit_error_expr( - "emit_rust_tco_block expected ExprBlock".to_string(), - RenderTarget::Rust, - ), - } +}, + _ => emit_error_expr("emit_rust_tco_block expected ExprBlock".to_string(), RenderTarget::Rust), +} } -pub fn emit_rust_tco_default_return( - frame: &Rc, - registry: Rc>>, - shared_types: Rc>, - emit_info: Rc, -) -> String { +pub fn emit_rust_tco_default_return(frame: &Rc, registry: Rc>>, shared_types: Rc>, emit_info: Rc) -> String { { - let val_str = emit_typed_expr( - frame.expr.clone(), - registry, - &frame.scope.clone(), - frame.depth.clone(), - shared_types, - emit_info, - 1024, - ); - v2_rt::concat( - v2_rt::concat("break ".to_string(), val_str), - ";".to_string(), - ) - } + let val_str = emit_typed_expr(frame.expr.clone(), registry, &frame.scope.clone(), frame.depth.clone(), shared_types, emit_info, 1024); +v2_rt::concat(v2_rt::concat("break ".to_string(), val_str), ";".to_string()) +} } -pub fn emit_typed_tco_expr( - texpr: Rc, - fn_name: &String, - params: Rc>>, - registry: Rc>>, - scope: Rc, - depth: i64, - shared_types: Rc>, - emit_info: Rc, -) -> String { - emit_shared_tco_expr( - Rc::new(TcoFrame { - expr: texpr, - scope: scope, - depth: depth, - }), - fn_name.clone(), - |input| { - emit_typed_tco_reassign( - input.args.clone(), - ¶ms, - registry.clone(), - &input.scope.clone(), - input.depth.clone(), - shared_types.clone(), - &emit_info, - ) - }, - |frame| { - emit_rust_tco_non_self_call( - &frame, - registry.clone(), - shared_types.clone(), - emit_info.clone(), - ) - }, - |frame| { - emit_rust_tco_if( - &frame, - &fn_name, - ¶ms, - ®istry, - &shared_types, - &emit_info, - ) - }, - |frame| { - emit_rust_tco_match( - &frame, - fn_name.clone(), - params.clone(), - ®istry, - &shared_types, - &emit_info, - ) - }, - |frame| { - emit_rust_tco_let( - &frame, - fn_name.clone(), - ¶ms, - ®istry, - &shared_types, - &emit_info, - ) - }, - |frame| { - emit_rust_tco_block( - &frame, - fn_name.clone(), - ¶ms, - ®istry, - &shared_types, - &emit_info, - ) - }, - |frame| { - emit_rust_tco_default_return( - &frame, - registry.clone(), - shared_types.clone(), - emit_info.clone(), - ) - }, - ) -} - -pub fn emit_typed_tco_match_arm( - arm: &Rc, - fn_name: String, - params: Rc>>, - registry: &Rc>>, - scope: &Rc, - depth: i64, - shared_types: &Rc>, - emit_info: &Rc, - scrut_type: &String, -) -> String { +pub fn emit_typed_tco_expr(texpr: Rc, fn_name: &String, params: Rc>>, registry: Rc>>, scope: Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { + emit_shared_tco_expr(Rc::new(TcoFrame { + expr: texpr, + scope: scope, + depth: depth, +}), fn_name.clone(), |input| emit_typed_tco_reassign(input.args.clone(), ¶ms, registry.clone(), &input.scope.clone(), input.depth.clone(), shared_types.clone(), &emit_info), |frame| emit_rust_tco_non_self_call(&frame, registry.clone(), shared_types.clone(), emit_info.clone()), |frame| emit_rust_tco_if(&frame, &fn_name, ¶ms, ®istry, &shared_types, &emit_info), |frame| emit_rust_tco_match(&frame, fn_name.clone(), params.clone(), ®istry, &shared_types, &emit_info), |frame| emit_rust_tco_let(&frame, fn_name.clone(), ¶ms, ®istry, &shared_types, &emit_info), |frame| emit_rust_tco_block(&frame, fn_name.clone(), ¶ms, ®istry, &shared_types, &emit_info), |frame| emit_rust_tco_default_return(&frame, registry.clone(), shared_types.clone(), emit_info.clone())) +} + +pub fn emit_typed_tco_match_arm(arm: &Rc, fn_name: String, params: Rc>>, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc, scrut_type: &String) -> String { { let arm_pat = arm_pattern(arm.clone()); - let arm_g = arm_guard(&arm); - let arm_b = arm_body(&arm); - let si = scope.type_env.clone().source_indices.clone(); - let rc_analysis = analyze_rc_pattern( - arm_pat.clone(), - scrut_type.clone(), - &shared_types, - &emit_info, - si.clone(), - ); - let pat_str = if rc_analysis.needs_rc_pattern.clone() { - emit_pattern_rc_aware( - arm_pat.clone(), - rc_analysis.clone(), - shared_types.clone(), - scrut_type.clone(), - si.clone(), - emit_info.clone(), - ) - } else { - emit_pattern( - arm_pat.clone(), - shared_types.clone(), - scrut_type.clone(), - si.clone(), - emit_info.clone(), - ) - }; - let field_guards = collect_pattern_string_guards(arm_pat.clone(), si.clone()); - let arm_guard_str = match arm_g { - Some(g) => emit_typed_expr( - g.clone(), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ), - None => "".to_string(), +let arm_g = arm_guard(&arm); +let arm_b = arm_body(&arm); +let si = scope.type_env.clone().source_indices.clone(); +let rc_analysis = analyze_rc_pattern(arm_pat.clone(), scrut_type.clone(), &shared_types, &emit_info, si.clone()); +let pat_str = if rc_analysis.needs_rc_pattern.clone() { + emit_pattern_rc_aware(arm_pat.clone(), rc_analysis.clone(), shared_types.clone(), scrut_type.clone(), si.clone(), emit_info.clone()) + } else { + emit_pattern(arm_pat.clone(), shared_types.clone(), scrut_type.clone(), si.clone(), emit_info.clone()) }; - let guard_str = if ((field_guards.clone().as_str() != "".to_string().as_str()) - && (arm_guard_str.clone().as_str() != "".to_string().as_str())) - { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(" if ".to_string(), field_guards.clone()), - " && ".to_string(), - ), - arm_guard_str.clone(), - ) +let field_guards = collect_pattern_string_guards(arm_pat.clone(), si.clone()); +let arm_guard_str = match arm_g { + Some(g) => emit_typed_expr(g.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024), + None => "".to_string(), +}; +let guard_str = if ((field_guards.clone().as_str() != "".to_string().as_str()) && (arm_guard_str.clone().as_str() != "".to_string().as_str())) { + v2_rt::concat(v2_rt::concat(v2_rt::concat(" if ".to_string(), field_guards.clone()), " && ".to_string()), arm_guard_str.clone()) } else { if (field_guards.clone().as_str() != "".to_string().as_str()) { v2_rt::concat(" if ".to_string(), field_guards.clone()) @@ -10862,529 +4258,199 @@ pub fn emit_typed_tco_match_arm( } } }; - let body_str = emit_typed_tco_expr( - arm_b, - &fn_name, - params, - registry.clone(), - scope.clone(), - depth.clone(), - shared_types.clone(), - emit_info.clone(), - ); - if rc_analysis.needs_rc_pattern.clone() { +let body_str = emit_typed_tco_expr(arm_b, &fn_name, params, registry.clone(), scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone()); +if rc_analysis.needs_rc_pattern.clone() { { - let prelude = rc_pattern_preludes( - arm_pat.clone(), - rc_analysis.clone(), - shared_types.clone(), - si.clone(), - emit_info.clone(), - ); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(" ".to_string(), pat_str), - guard_str, - ), - " => { ".to_string(), - ), - prelude, - ), - " ".to_string(), - ), - body_str, - ), - " },".to_string(), - ) - } + let prelude = rc_pattern_preludes(arm_pat.clone(), rc_analysis.clone(), shared_types.clone(), si.clone(), emit_info.clone()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" ".to_string(), pat_str), guard_str), " => { ".to_string()), prelude), " ".to_string()), body_str), " },".to_string()) +} } else { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(v2_rt::concat(" ".to_string(), pat_str), guard_str), - " => { ".to_string(), - ), - body_str, - ), - " },".to_string(), - ) + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" ".to_string(), pat_str), guard_str), " => { ".to_string()), body_str), " },".to_string()) } - } +} } -pub fn expr_references_var( - node: &Rc, - var_name: String, - source_indices: Rc>>, -) -> bool { +pub fn expr_references_var(node: &Rc, var_name: String, source_indices: Rc>>) -> bool { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*node.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - (expr_var_name_at(node.clone(), source_indices.clone()).as_str() - == var_name.clone().as_str()) - } - _ => { - let mut __found = false; - for c in node.children.clone().iter().cloned() { - if expr_references_var(&c, var_name.clone(), source_indices.clone()) { - __found = true; - break; - } - } - __found - } - } + ExprData::ExprVar { .. } => (expr_var_name_at(node.clone(), source_indices.clone()).as_str() == var_name.clone().as_str()), + _ => { let mut __found = false; for c in node.children.clone().iter().cloned() { if expr_references_var(&c, var_name.clone(), source_indices.clone()) { __found = true; break; } } __found }, +} }) } -pub fn emit_typed_tco_reassign( - args: Rc>>, - params: &Rc>>, - registry: Rc>>, - scope: &Rc, - depth: i64, - shared_types: Rc>, - emit_info: &Rc, -) -> String { +pub fn emit_typed_tco_reassign(args: Rc>>, params: &Rc>>, registry: Rc>>, scope: &Rc, depth: i64, shared_types: Rc>, emit_info: &Rc) -> String { { let si = scope.type_env.clone().source_indices.clone(); - let arg_values = Rc::new({ - let mut __result = Vec::new(); - for a in args.iter().cloned() { - __result.push(arg_value(&a)); - } - __result - }); - let identity_params = Rc::new( - params - .clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - .fold( - v2_rt::rc_empty_map::(), - |m: Rc>, pair: (i64, Rc)| { - let pname = param_node_name_at(pair.1.clone(), si.clone()); - let av = match arg_values.clone().get(pair.0.clone() as usize).cloned() { - Some(v) => v.clone(), - None => pair.1.clone(), - }; - if is_tco_identity_passthrough(&av, pname.clone(), si.clone()) { - v2_rt::rc_map_insert(m.clone(), pname.clone(), true) - } else { - m.clone() - } - }, - ); - let filtered_arg_values = Rc::new({ - let mut __result = Vec::new(); - for pair in Rc::new({ - let mut __result = Vec::new(); - for pair in Rc::new( - params - .clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - { - if match v2_rt::map_get( - &identity_params, - param_node_name_at(pair.1.clone(), si.clone()), - ) { - Some(_) => false, - None => true, - } { - __result.push(pair); - } - } - __result - }) - .iter() - .cloned() - { - __result.push( - match arg_values.clone().get(pair.0.clone() as usize).cloned() { - Some(v) => v.clone(), - None => pair.1.clone(), - }, - ); - } - __result - }); - let filtered_params = Rc::new({ - let mut __result = Vec::new(); - for p in params.clone().iter().cloned() { - if match v2_rt::map_get(&identity_params, param_node_name_at(p.clone(), si.clone())) - { - Some(_) => false, - None => true, - } { - __result.push(p); - } - } - __result - }); - let tco_movable = - filtered_params.clone().iter().cloned().fold( - emit_info.movable.clone(), - |m: Rc>, p: Rc| { - let pname = param_node_name_at(p.clone(), si.clone()); - let ref_count = filtered_arg_values.clone().iter().cloned().fold( - 0, - |n: i64, av: Rc| { - if expr_references_var(&av, pname.clone(), si.clone()) { - (n.clone() + 1) - } else { - n.clone() - } - }, - ); - if (ref_count.clone() <= 1) { - v2_rt::rc_map_insert(m.clone(), pname.clone(), true) - } else { - m.clone() - } - }, - ); - let tco_emit_info = Rc::new(EmitGraphInfo { - movable: tco_movable, - ..(*emit_info.clone()).clone() - }); - let ordered_args = Rc::new({ - let mut __result = Vec::new(); - for av in filtered_arg_values.clone().iter().cloned() { - __result.push(emit_typed_expr( - av.clone(), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - tco_emit_info.clone(), - 1024, - )); +let arg_values = Rc::new({ let mut __result = Vec::new(); for a in args.iter().cloned() { __result.push(arg_value(&a)); } __result }); +let identity_params = Rc::new(params.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned().fold(v2_rt::rc_empty_map::(), |m: Rc>, pair: (i64, Rc)| { + let pname = param_node_name_at(pair.1.clone(), si.clone()); +let av = match arg_values.clone().get(pair.0.clone() as usize).cloned() { + Some(v) => v.clone(), + None => pair.1.clone(), +}; +if is_tco_identity_passthrough(&av, pname.clone(), si.clone()) { + v2_rt::rc_map_insert(m.clone(), pname.clone(), true) + } else { + m.clone() } - __result - }); - let param_names = Rc::new({ - let mut __result = Vec::new(); - for p in filtered_params.clone().iter().cloned() { - __result.push(emit_ident( - param_node_name_at(p.clone(), si.clone()), - RenderTarget::Rust, - )); +}); +let filtered_arg_values = Rc::new({ let mut __result = Vec::new(); for pair in Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(params.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { if match v2_rt::map_get(&identity_params, param_node_name_at(pair.1.clone(), si.clone())) { + Some(_) => false, + None => true, +} { __result.push(pair); } } __result }).iter().cloned() { __result.push(match arg_values.clone().get(pair.0.clone() as usize).cloned() { + Some(v) => v.clone(), + None => pair.1.clone(), +}); } __result }); +let filtered_params = Rc::new({ let mut __result = Vec::new(); for p in params.clone().iter().cloned() { if match v2_rt::map_get(&identity_params, param_node_name_at(p.clone(), si.clone())) { + Some(_) => false, + None => true, +} { __result.push(p); } } __result }); +let tco_movable = filtered_params.clone().iter().cloned().fold(emit_info.movable.clone(), |m: Rc>, p: Rc| { + let pname = param_node_name_at(p.clone(), si.clone()); +let ref_count = filtered_arg_values.clone().iter().cloned().fold(0, |n: i64, av: Rc| if expr_references_var(&av, pname.clone(), si.clone()) { + (n.clone() + 1) + } else { + n.clone() + }); +if (ref_count.clone() <= 1) { + v2_rt::rc_map_insert(m.clone(), pname.clone(), true) + } else { + m.clone() } - __result - }); - let all_lines = tco_reassign_core( - ordered_args, - param_names, - "__tco_".to_string(), - "let ".to_string(), - " = ".to_string(), - ";".to_string(), - "continue;".to_string(), - &"".to_string(), - ); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("{\n".to_string(), make_indent((depth.clone() + 1))), - all_lines.join(&"\n".to_string()), - ), - "\n}".to_string(), - ) - } +}); +let tco_emit_info = Rc::new(EmitGraphInfo { movable: tco_movable, ..(*emit_info.clone()).clone() }); +let ordered_args = Rc::new({ let mut __result = Vec::new(); for av in filtered_arg_values.clone().iter().cloned() { __result.push(emit_typed_expr(av.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), tco_emit_info.clone(), 1024)); } __result }); +let param_names = Rc::new({ let mut __result = Vec::new(); for p in filtered_params.clone().iter().cloned() { __result.push(emit_ident(param_node_name_at(p.clone(), si.clone()), RenderTarget::Rust)); } __result }); +let all_lines = tco_reassign_core(ordered_args, param_names, "__tco_".to_string(), "let ".to_string(), " = ".to_string(), ";".to_string(), "continue;".to_string(), &"".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat("{\n".to_string(), make_indent((depth.clone() + 1))), all_lines.join(&"\n".to_string())), "\n}".to_string()) +} } -pub fn emit_service_def( - item: &Rc, - registry: Rc>>, - shared_types: Rc>, - env: &Rc, -) -> String { +pub fn emit_service_def(item: &Rc, registry: Rc>>, shared_types: Rc>, env: &Rc) -> String { { let safe_name = sanitize_service_name(authored_name(env.clone(), item.clone())); - let fallback_transport = service_fallback_transport(&item); - let op_children = item.children.clone(); - let struct_def = emit_service_struct( - safe_name.clone(), - fallback_transport.clone(), - op_children.clone(), - item.clone(), - env.source_indices.clone(), - ); - let impl_block = emit_service_impl( - &safe_name, - &fallback_transport, - &op_children, - registry, - shared_types, - &env, - &item, - ); - v2_rt::concat(v2_rt::concat(struct_def, "\n\n".to_string()), impl_block) - } +let fallback_transport = service_fallback_transport(&item); +let op_children = item.children.clone(); +let struct_def = emit_service_struct(safe_name.clone(), fallback_transport.clone(), op_children.clone(), item.clone(), env.source_indices.clone()); +let impl_block = emit_service_impl(&safe_name, &fallback_transport, &op_children, registry, shared_types, &env, &item); +v2_rt::concat(v2_rt::concat(struct_def, "\n\n".to_string()), impl_block) +} } -pub fn emit_service_struct( - name: String, - fallback_transport: Rc, - op_children: Rc>>, - service_item: Rc, - source_indices: Rc>>, -) -> String { +pub fn emit_service_struct(name: String, fallback_transport: Rc, op_children: Rc>>, service_item: Rc, source_indices: Rc>>) -> String { { let derives = "#[derive(Debug, Clone)]".to_string(); - let config_fields = emit_service_config_fields( - fallback_transport, - op_children, - service_item, - &source_indices, - ); - let dry_run_field = "\n pub dry_run: crate::dry_run::DryRunMode,".to_string(); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(v2_rt::concat(derives, "\npub struct ".to_string()), name), - " {\n".to_string(), - ), - config_fields, - ), - dry_run_field, - ), - "\n}".to_string(), - ) - } +let config_fields = emit_service_config_fields(fallback_transport, op_children, service_item, &source_indices); +let dry_run_field = "\n pub dry_run: crate::dry_run::DryRunMode,".to_string(); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(derives, "\npub struct ".to_string()), name), " {\n".to_string()), config_fields), dry_run_field), "\n}".to_string()) +} } -pub fn emit_service_config_fields( - fallback_transport: Rc, - op_children: Rc>>, - service_item: Rc, - source_indices: &Rc>>, -) -> String { +pub fn emit_service_config_fields(fallback_transport: Rc, op_children: Rc>>, service_item: Rc, source_indices: &Rc>>) -> String { { let fs = compute_service_fields(&fallback_transport, &op_children, &source_indices); - let has_svc_auth = match service_config_auth_source(service_item, source_indices.clone()) { - Some(_) => true, - None => false, - }; - let fs = if has_svc_auth { +let has_svc_auth = match service_config_auth_source(service_item, source_indices.clone()) { + Some(_) => true, + None => false, +}; +let fs = if has_svc_auth { ServiceFieldSet { - has_rest: fs.has_rest.clone(), - has_shell: fs.has_shell.clone(), - has_file: fs.has_file.clone(), - has_auth: true, - } + has_rest: fs.has_rest.clone(), + has_shell: fs.has_shell.clone(), + has_file: fs.has_file.clone(), + has_auth: true, +} } else { fs.clone() }; - let decls = service_field_decls( - &fs, - &language_spec(RenderTarget::Rust).service_fields.clone(), - ); - if ((decls.clone().len() as i64) == 0) { +let decls = service_field_decls(&fs, &language_spec(RenderTarget::Rust).service_fields.clone()); +if ((decls.clone().len() as i64) == 0) { " // No configuration needed for local binding.\n".to_string() } else { decls.clone().join(&"".to_string()) } - } +} } -pub fn emit_service_impl( - name: &String, - transport: &Rc, - op_children: &Rc>>, - registry: Rc>>, - shared_types: Rc>, - env: &Rc, - service_item: &Rc, -) -> String { +pub fn emit_service_impl(name: &String, transport: &Rc, op_children: &Rc>>, registry: Rc>>, shared_types: Rc>, env: &Rc, service_item: &Rc) -> String { { let depth = 0; - let new_method = emit_service_new_method( - name.clone(), - &transport, - op_children.clone(), - &service_item, - &env.source_indices.clone(), - ); - let method_strs = Rc::new({ - let mut __result = Vec::new(); - for op_node in op_children.clone().iter().cloned() { - __result.push(emit_operation_method( - name.clone(), - transport.clone(), - &op_node, - ®istry, - (depth.clone() + 1), - &shared_types, - &env, - service_item.clone(), - )); - } - __result - }); - let all_methods = v2_rt::concat(Rc::new(vec![new_method]), method_strs); - let methods_str = all_methods.join(&"\n\n".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("impl ".to_string(), name.clone()), - " {\n".to_string(), - ), - make_indent((depth.clone() + 1)), - ), - methods_str, - ), - "\n}".to_string(), - ) - } +let new_method = emit_service_new_method(name.clone(), &transport, op_children.clone(), &service_item, &env.source_indices.clone()); +let method_strs = Rc::new({ let mut __result = Vec::new(); for op_node in op_children.clone().iter().cloned() { __result.push(emit_operation_method(name.clone(), transport.clone(), &op_node, ®istry, (depth.clone() + 1), &shared_types, &env, service_item.clone())); } __result }); +let all_methods = v2_rt::concat(Rc::new(vec![new_method]), method_strs); +let methods_str = all_methods.join(&"\n\n".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("impl ".to_string(), name.clone()), " {\n".to_string()), make_indent((depth.clone() + 1))), methods_str), "\n}".to_string()) +} } -pub fn emit_service_new_method( - name: String, - fallback_transport: &Rc, - op_children: Rc>>, - service_item: &Rc, - source_indices: &Rc>>, -) -> String { +pub fn emit_service_new_method(name: String, fallback_transport: &Rc, op_children: Rc>>, service_item: &Rc, source_indices: &Rc>>) -> String { { let fs = compute_service_fields(&fallback_transport, &op_children, &source_indices); - let has_svc_auth = - match service_config_auth_source(service_item.clone(), source_indices.clone()) { - Some(_) => true, - None => false, - }; - let fs = if has_svc_auth { +let has_svc_auth = match service_config_auth_source(service_item.clone(), source_indices.clone()) { + Some(_) => true, + None => false, +}; +let fs = if has_svc_auth { ServiceFieldSet { - has_rest: fs.has_rest.clone(), - has_shell: fs.has_shell.clone(), - has_file: fs.has_file.clone(), - has_auth: true, - } + has_rest: fs.has_rest.clone(), + has_shell: fs.has_shell.clone(), + has_file: fs.has_file.clone(), + has_auth: true, +} } else { fs.clone() }; - let from_config = - match service_config_endpoint(service_item.clone(), source_indices.clone()) { - Some(ep) => match (*ep.expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { - let LiteralValue::LitStr { value: s, .. } = value.as_ref() else { - unreachable!() - }; - s.clone() - } - _ => "".to_string(), - }, - None => "".to_string(), - }; - let base_url_default = if (from_config.clone().as_str() != "".to_string().as_str()) { +let from_config = match service_config_endpoint(service_item.clone(), source_indices.clone()) { + Some(ep) => match (*ep.expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitStr { value: s, .. } = value.as_ref() else { unreachable!() }; s.clone() }, + _ => "".to_string(), +}, + None => "".to_string(), +}; +let base_url_default = if (from_config.clone().as_str() != "".to_string().as_str()) { from_config.clone() } else { if fs.has_rest.clone() { { - let fallback_is_rest = - is_rest_transport(fallback_transport.clone(), source_indices.clone()); - let from_fallback = if fallback_is_rest { - match transport_base_url(fallback_transport.clone(), source_indices.clone()) - { - Some(bu) => match (*bu.expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { - let LiteralValue::LitStr { value: s, .. } = value.as_ref() - else { - unreachable!() - }; - s.clone() - } - _ => "".to_string(), - }, - None => "".to_string(), - } + let fallback_is_rest = is_rest_transport(fallback_transport.clone(), source_indices.clone()); +let from_fallback = if fallback_is_rest { + match transport_base_url(fallback_transport.clone(), source_indices.clone()) { + Some(bu) => match (*bu.expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitStr { value: s, .. } = value.as_ref() else { unreachable!() }; s.clone() }, + _ => "".to_string(), +}, + None => "".to_string(), +} } else { "".to_string() }; - if (from_fallback.clone().as_str() != "".to_string().as_str()) { +if (from_fallback.clone().as_str() != "".to_string().as_str()) { from_fallback.clone() } else { "http://localhost".to_string() } - } +} } else { "".to_string() } }; - let ctors = service_field_ctors( - &fs, - &language_spec(RenderTarget::Rust).service_fields.clone(), - ); - let ctors = Rc::new({ - let mut __result = Vec::new(); - for c in ctors.clone().iter().cloned() { - __result.push(apply_type_template1(c.clone(), base_url_default.clone())); - } - __result - }); - let ctors = match service_config_auth_source(service_item.clone(), source_indices.clone()) { - Some(src) => Rc::new({ - let mut __result = Vec::new(); - for c in ctors.clone().iter().cloned() { - __result.push(if v2_rt::contains(c.clone(), "auth_token".to_string()) { - emit_auth_source_ctor(&src, source_indices.clone()) - } else { - c.clone() - }); - } - __result - }), - None => ctors.clone(), - }; - let inits = ctors.clone().join(&"".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "pub fn new(dry_run: crate::dry_run::DryRunMode) -> Self {\n" - .to_string(), - " ".to_string(), - ), - name, - ), - " {\n".to_string(), - ), - inits, - ), - " dry_run,\n".to_string(), - ), - " }\n".to_string(), - ), - "}".to_string(), - ) - } +let ctors = service_field_ctors(&fs, &language_spec(RenderTarget::Rust).service_fields.clone()); +let ctors = Rc::new({ let mut __result = Vec::new(); for c in ctors.clone().iter().cloned() { __result.push(apply_type_template1(c.clone(), base_url_default.clone())); } __result }); +let ctors = match service_config_auth_source(service_item.clone(), source_indices.clone()) { + Some(src) => Rc::new({ let mut __result = Vec::new(); for c in ctors.clone().iter().cloned() { __result.push(if v2_rt::contains(c.clone(), "auth_token".to_string()) { + emit_auth_source_ctor(&src, source_indices.clone()) + } else { + c.clone() + }); } __result }), + None => ctors.clone(), +}; +let inits = ctors.clone().join(&"".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("pub fn new(dry_run: crate::dry_run::DryRunMode) -> Self {\n".to_string(), " ".to_string()), name), " {\n".to_string()), inits), " dry_run,\n".to_string()), " }\n".to_string()), "}".to_string()) +} } -pub fn emit_auth_source_ctor( - source_expr: &Rc, - source_indices: Rc>>, -) -> String { +pub fn emit_auth_source_ctor(source_expr: &Rc, source_indices: Rc>>) -> String { match (*source_expr.expr_data.clone()).clone() { ExprData::ExprRecordLit { .. } => match record_lit_type_name_at(source_expr.clone(), source_indices) { Some(variant) => if (variant.clone().as_str() == "EnvVar".to_string().as_str()) { @@ -11404,195 +4470,47 @@ pub fn emit_auth_source_ctor( } } -pub fn emit_modifier_doc_from_props( - properties: Rc>>, - source_indices: Rc>>, -) -> String { +pub fn emit_modifier_doc_from_props(properties: Rc>>, source_indices: Rc>>) -> String { { let names = extract_modifier_names(properties, source_indices); - if ((names.clone().len() as i64) == 0) { +if ((names.clone().len() as i64) == 0) { "".to_string() } else { - v2_rt::concat( - v2_rt::concat( - "/// Modifiers: ".to_string(), - names.clone().join(&", ".to_string()), - ), - "\n".to_string(), - ) + v2_rt::concat(v2_rt::concat("/// Modifiers: ".to_string(), names.clone().join(&", ".to_string())), "\n".to_string()) } - } +} } -pub fn emit_operation_method( - service_name: String, - transport: Rc, - op_node: &Rc, - registry: &Rc>>, - depth: i64, - shared_types: &Rc>, - env: &Rc, - service_item: Rc, -) -> String { +pub fn emit_operation_method(service_name: String, transport: Rc, op_node: &Rc, registry: &Rc>>, depth: i64, shared_types: &Rc>, env: &Rc, service_item: Rc) -> String { { let op_text = authored_name(env.clone(), op_node.clone()); - let input_params = Rc::new({ - let mut __result = Vec::new(); - for p in op_node.params.clone().iter().cloned() { - __result.push(v2_rt::concat( - v2_rt::concat( - emit_ident( - param_node_name_at(p.clone(), env.source_indices.clone()), - RenderTarget::Rust, - ), - rust_items().param_type_sep.clone(), - ), - emit_rust_param_type( - ¶m_node_type_expr(&p), - &shared_types, - &env.source_indices.clone(), - ), - )); - } - __result - }); - let params_str = input_params.join(&", ".to_string()); - let all_params = if (params_str.clone().as_str() == "".to_string().as_str()) { +let input_params = Rc::new({ let mut __result = Vec::new(); for p in op_node.params.clone().iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(emit_ident(param_node_name_at(p.clone(), env.source_indices.clone()), RenderTarget::Rust), rust_items().param_type_sep.clone()), emit_rust_param_type(¶m_node_type_expr(&p), &shared_types, &env.source_indices.clone()))); } __result }); +let params_str = input_params.join(&", ".to_string()); +let all_params = if (params_str.clone().as_str() == "".to_string().as_str()) { "&self".to_string() } else { v2_rt::concat("&self, ".to_string(), params_str.clone()) }; - let ret_type = render_rust_type( - resolved_type(op_node.clone()), - shared_types.clone(), - env.source_indices.clone(), - ); - let eff_transport = effective_operation_transport(op_node.clone(), transport); - let op_inferred = resolved_type(op_node.clone()); - let real_body = emit_transport_call( - &eff_transport, - op_text.clone(), - registry.clone(), - (depth.clone() + 2), - op_inferred, - service_item, - op_node.clone(), - &env.source_indices.clone(), - shared_types.clone(), - env.clone(), - ); - let mock_props = Rc::new({ - let mut __result = Vec::new(); - for p in op_node.properties.clone().iter().cloned() { - if has_mock_prefix(&field_init_node_name_at( - p.clone(), - env.source_indices.clone(), - )) { - __result.push(p); - } - } - __result - }); - let dry_run_body = emit_dry_run_branch_from_props( - &op_text, - &resolved_type(op_node.clone()), - &mock_props, - registry.clone(), - &env.source_indices.clone(), - &op_node, - env.clone(), - shared_types.clone(), - ); - let body = v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "if self.dry_run.is_dry_run() {\n".to_string(), - make_indent((depth.clone() + 2)), - ), - dry_run_body, - ), - "\n".to_string(), - ), - "} else {\n".to_string(), - ), - make_indent((depth.clone() + 2)), - ), - real_body, - ), - "\n".to_string(), - ), - "}".to_string(), - ); - let modifier_doc = - emit_modifier_doc_from_props(op_node.properties.clone(), env.source_indices.clone()); - let items = rust_items(); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - modifier_doc, - rust_visibility_prefix(), - ), - items.async_prefix.clone(), - ), - items.func_keyword.clone(), - ), - " ".to_string(), - ), - emit_ident(op_text.clone(), RenderTarget::Rust), - ), - "(".to_string(), - ), - all_params, - ), - ") -> Result<".to_string(), - ), - ret_type, - ), - ", Box> {\n".to_string(), - ), - make_indent((depth.clone() + 1)), - ), - body, - ), - "\n}".to_string(), - ) - } +let ret_type = render_rust_type(resolved_type(op_node.clone()), shared_types.clone(), env.source_indices.clone()); +let eff_transport = effective_operation_transport(op_node.clone(), transport); +let op_inferred = resolved_type(op_node.clone()); +let real_body = emit_transport_call(&eff_transport, op_text.clone(), registry.clone(), (depth.clone() + 2), op_inferred, service_item, op_node.clone(), &env.source_indices.clone(), shared_types.clone(), env.clone()); +let mock_props = Rc::new({ let mut __result = Vec::new(); for p in op_node.properties.clone().iter().cloned() { if has_mock_prefix(&field_init_node_name_at(p.clone(), env.source_indices.clone())) { __result.push(p); } } __result }); +let dry_run_body = emit_dry_run_branch_from_props(&op_text, &resolved_type(op_node.clone()), &mock_props, registry.clone(), &env.source_indices.clone(), &op_node, env.clone(), shared_types.clone()); +let body = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("if self.dry_run.is_dry_run() {\n".to_string(), make_indent((depth.clone() + 2))), dry_run_body), "\n".to_string()), "} else {\n".to_string()), make_indent((depth.clone() + 2))), real_body), "\n".to_string()), "}".to_string()); +let modifier_doc = emit_modifier_doc_from_props(op_node.properties.clone(), env.source_indices.clone()); +let items = rust_items(); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(modifier_doc, rust_visibility_prefix()), items.async_prefix.clone()), items.func_keyword.clone()), " ".to_string()), emit_ident(op_text.clone(), RenderTarget::Rust)), "(".to_string()), all_params), ") -> Result<".to_string()), ret_type), ", Box> {\n".to_string()), make_indent((depth.clone() + 1))), body), "\n}".to_string()) +} } -pub fn emit_dry_run_branch_from_props( - op_name: &String, - inferred: &Rc, - mock_props: &Rc>>, - registry: Rc>>, - source_indices: &Rc>>, - op_node: &Rc, - env: Rc, - shared_types: Rc>, -) -> String { +pub fn emit_dry_run_branch_from_props(op_name: &String, inferred: &Rc, mock_props: &Rc>>, registry: Rc>>, source_indices: &Rc>>, op_node: &Rc, env: Rc, shared_types: Rc>) -> String { { - let log_line = v2_rt::concat( - v2_rt::concat("eprintln!(\"[dry-run] ".to_string(), op_name.clone()), - "\");".to_string(), - ); - if ((mock_props.clone().len() as i64) > 0) { + let log_line = v2_rt::concat(v2_rt::concat("eprintln!(\"[dry-run] ".to_string(), op_name.clone()), "\");".to_string()); +if ((mock_props.clone().len() as i64) > 0) { { let first_mock = mock_props.clone().first().cloned(); - match first_mock { +match first_mock { Some(mp) => { let mock_json = emit_data_value_json(&field_init_node_value(&mp), source_indices.clone()); let is_multi_field_conj = ((inferred.connective.clone() == Connective::Conj) && ((inferred.children.clone().len() as i64) > 1)); @@ -11660,58 +4578,19 @@ v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::con }, None => v2_rt::concat(log_line, "\ncompile_error!(\"mock property list was non-empty but first() returned None\")".to_string()), } - } +} } else { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - log_line, - "\ncompile_error!(\"no mock data available for dry-run operation: " - .to_string(), - ), - op_name.clone(), - ), - "\")".to_string(), - ) + v2_rt::concat(v2_rt::concat(v2_rt::concat(log_line, "\ncompile_error!(\"no mock data available for dry-run operation: ".to_string()), op_name.clone()), "\")".to_string()) } - } +} } -pub fn emit_transport_call( - transport: &Rc, - op_name: String, - registry: Rc>>, - depth: i64, - inferred: Rc, - service_item: Rc, - op_node: Rc, - source_indices: &Rc>>, - shared_types: Rc>, - env: Rc, -) -> String { +pub fn emit_transport_call(transport: &Rc, op_name: String, registry: Rc>>, depth: i64, inferred: Rc, service_item: Rc, op_node: Rc, source_indices: &Rc>>, shared_types: Rc>, env: Rc) -> String { if is_rest_transport(transport.clone(), source_indices.clone()) { - emit_rest_call( - op_name, - &transport, - registry, - depth, - service_item, - op_node, - &source_indices, - shared_types, - env, - ) + emit_rest_call(op_name, &transport, registry, depth, service_item, op_node, &source_indices, shared_types, env) } else { if is_shell_transport(transport.clone()) { - emit_shell_call( - op_name, - &transport, - registry, - depth, - inferred, - &op_node, - &source_indices, - ) + emit_shell_call(op_name, &transport, registry, depth, inferred, &op_node, &source_indices) } else { if is_file_transport(transport.clone(), source_indices.clone()) { emit_file_call(op_name, inferred) @@ -11722,250 +4601,104 @@ pub fn emit_transport_call( } } -pub fn emit_rest_call( - op_name: String, - transport: &Rc, - registry: Rc>>, - depth: i64, - service_item: Rc, - op_node: Rc, - source_indices: &Rc>>, - shared_types: Rc>, - env: Rc, -) -> String { +pub fn emit_rest_call(op_name: String, transport: &Rc, registry: Rc>>, depth: i64, service_item: Rc, op_node: Rc, source_indices: &Rc>>, shared_types: Rc>, env: Rc) -> String { { - let client_init = - "let client = reqwest::Client::builder().user_agent(\"gunbc/1.0\").build()?;" - .to_string(); - let url_line = emit_rest_url_line(transport.clone(), op_name, &source_indices); - let http_method = emit_rest_http_method(transport.clone(), &source_indices); - let auth_line = - emit_rest_auth_line(&transport, &service_item, http_method, &source_indices); - let query_line = emit_rest_query_line(transport.clone(), &source_indices); - let body_line = emit_rest_body_line(transport.clone(), &source_indices); - let headers = transport_headers(transport.clone(), source_indices.clone()); - let header_lines = Rc::new({ - let mut __result = Vec::new(); - for h in headers.iter().cloned() { - __result.push({ - let hval = field_init_node_value(&h); - let val_str = emit_simple_expr(&hval, &RenderTarget::Rust, &source_indices); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "let request = request.header(\"".to_string(), - field_init_node_name_at(h.clone(), source_indices.clone()), - ), - "\", ".to_string(), - ), - val_str.clone(), - ), - ");".to_string(), - ) - }); - } - __result - }); - let send_line = "let response = request.send().await?;".to_string(); - let response_handling = emit_response_code_handling( - &op_node, - transport.clone(), - &source_indices, - shared_types, - env, - ); - let all_lines = Rc::new({ - let mut __result = Vec::new(); - for l in v2_rt::concat( - v2_rt::concat( - Rc::new(vec![client_init, url_line, auth_line]), - header_lines, - ), - Rc::new(vec![query_line, body_line, send_line, response_handling]), - ) - .iter() - .cloned() - { - if (l.clone().as_str() != "".to_string().as_str()) { - __result.push(l); - } - } - __result - }); - all_lines.join(&"\n".to_string()) - } + let client_init = "let client = reqwest::Client::builder().user_agent(\"gunbc/1.0\").build()?;".to_string(); +let url_line = emit_rest_url_line(transport.clone(), op_name, &source_indices); +let http_method = emit_rest_http_method(transport.clone(), &source_indices); +let auth_line = emit_rest_auth_line(&transport, &service_item, http_method, &source_indices); +let query_line = emit_rest_query_line(transport.clone(), &source_indices); +let body_line = emit_rest_body_line(transport.clone(), &source_indices); +let headers = transport_headers(transport.clone(), source_indices.clone()); +let header_lines = Rc::new({ let mut __result = Vec::new(); for h in headers.iter().cloned() { __result.push({ + let hval = field_init_node_value(&h); +let val_str = emit_simple_expr(&hval, &RenderTarget::Rust, &source_indices); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("let request = request.header(\"".to_string(), field_init_node_name_at(h.clone(), source_indices.clone())), "\", ".to_string()), val_str.clone()), ");".to_string()) +}); } __result }); +let send_line = "let response = request.send().await?;".to_string(); +let response_handling = emit_response_code_handling(&op_node, transport.clone(), &source_indices, shared_types, env); +let all_lines = Rc::new({ let mut __result = Vec::new(); for l in v2_rt::concat(v2_rt::concat(Rc::new(vec![client_init, url_line, auth_line]), header_lines), Rc::new(vec![query_line, body_line, send_line, response_handling])).iter().cloned() { if (l.clone().as_str() != "".to_string().as_str()) { __result.push(l); } } __result }); +all_lines.join(&"\n".to_string()) +} } -pub fn emit_rest_http_method( - transport: Rc, - source_indices: &Rc>>, -) -> String { +pub fn emit_rest_http_method(transport: Rc, source_indices: &Rc>>) -> String { match transport_method(transport, source_indices.clone()) { - Some(m) => match m.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { .. }) => { - let method_name = expr_var_name_at(m.clone(), source_indices.clone()); - Rc::new({ - let mut __result = Vec::new(); - for ch in Rc::new(method_name.chars().map(|c| c as i64).collect::>()) - .iter() - .cloned() - { - __result.push(to_lower_char(ch.clone())); - } - __result - }) - .join(&"".to_string()) - } - _ => "compile_error!(\"transport method type not resolved\")".to_string(), - }, - None => "compile_error!(\"transport method not specified\")".to_string(), - } + Some(m) => match m.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { .. }) => { + let method_name = expr_var_name_at(m.clone(), source_indices.clone()); +Rc::new({ let mut __result = Vec::new(); for ch in Rc::new(method_name.chars().map(|c| c as i64).collect::>()).iter().cloned() { __result.push(to_lower_char(ch.clone())); } __result }).join(&"".to_string()) +}, + _ => "compile_error!(\"transport method type not resolved\")".to_string(), +}, + None => "compile_error!(\"transport method not specified\")".to_string(), +} } -pub fn emit_rest_url_line( - transport: Rc, - op_name: String, - source_indices: &Rc>>, -) -> String { +pub fn emit_rest_url_line(transport: Rc, op_name: String, source_indices: &Rc>>) -> String { match transport_path_template(transport, source_indices.clone()) { - Some(path_node) => match (*path_node.expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { - let LiteralValue::LitStr { - value: path_str, .. - } = value.as_ref() - else { - unreachable!() - }; - v2_rt::concat( - v2_rt::concat( - "let url = format!(\"{}".to_string(), - escape_string_literal_body(path_str.clone()), - ), - "\", self.base_url);".to_string(), - ) - } - ExprData::ExprStringInterp => { - let parts = Rc::new({ - let mut __result = Vec::new(); - for child in path_node.children.clone().iter().cloned() { - __result.push(match (*child.expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { - let LiteralValue::LitStr { value: text, .. } = value.as_ref() - else { - unreachable!() - }; - Rc::new(StringPart::Text { - value: text.clone(), - }) - } - _ => Rc::new(StringPart::Interpolation { - expr: arg_value(&child), - }), - }); - } - __result - }); - let fmt_segments = Rc::new({ - let mut __result = Vec::new(); - for p in parts.clone().iter().cloned() { - __result.push(match (*p.clone()).clone() { - StringPart::Text { value: v, .. } => escape_rust_interp_text(v.clone()), - StringPart::Interpolation { .. } => "{}".to_string(), - }); - } - __result - }); - let fmt_str = fmt_segments.join(&"".to_string()); - let args = Rc::new({ - let mut __result = Vec::new(); - for p in parts.clone().iter().cloned() { - __result.extend( - (*match (*p.clone()).clone() { - StringPart::Text { .. } => Rc::new(vec![]), - StringPart::Interpolation { expr: e, .. } => { - let var_name = emit_ident( - expr_var_name_at(e.clone(), source_indices.clone()), - RenderTarget::Rust, - ); - let is_opt = is_optional_typed_expr(e.clone()); - if is_opt.clone() { - Rc::new(vec![v2_rt::concat( - var_name.clone(), - ".as_deref().unwrap_or(\"\")".to_string(), - )]) - } else { - Rc::new(vec![var_name.clone()]) - } - } - }) - .iter() - .cloned(), - ); - } - __result - }); - if ((args.clone().len() as i64) == 0) { - v2_rt::concat( - v2_rt::concat("let url = format!(\"{}".to_string(), fmt_str), - "\", self.base_url);".to_string(), - ) - } else { - { - let args_str = args.clone().join(&", ".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("let url = format!(\"{}".to_string(), fmt_str), - "\", self.base_url, ".to_string(), - ), - args_str, - ), - ");".to_string(), - ) - } - } + Some(path_node) => match (*path_node.expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitStr { value: path_str, .. } = value.as_ref() else { unreachable!() }; v2_rt::concat(v2_rt::concat("let url = format!(\"{}".to_string(), escape_string_literal_body(path_str.clone())), "\", self.base_url);".to_string()) }, + ExprData::ExprStringInterp => { + let parts = Rc::new({ let mut __result = Vec::new(); for child in path_node.children.clone().iter().cloned() { __result.push(match (*child.expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitStr { value: text, .. } = value.as_ref() else { unreachable!() }; Rc::new(StringPart::Text { + value: text.clone(), +}) }, + _ => Rc::new(StringPart::Interpolation { + expr: arg_value(&child), +}), +}); } __result }); +let fmt_segments = Rc::new({ let mut __result = Vec::new(); for p in parts.clone().iter().cloned() { __result.push(match (*p.clone()).clone() { + StringPart::Text { value: v, .. } => escape_rust_interp_text(v.clone()), + StringPart::Interpolation { .. } => "{}".to_string(), +}); } __result }); +let fmt_str = fmt_segments.join(&"".to_string()); +let args = Rc::new({ let mut __result = Vec::new(); for p in parts.clone().iter().cloned() { __result.extend((*match (*p.clone()).clone() { + StringPart::Text { .. } => Rc::new(vec![]), + StringPart::Interpolation { expr: e, .. } => { + let var_name = emit_ident(expr_var_name_at(e.clone(), source_indices.clone()), RenderTarget::Rust); +let is_opt = is_optional_typed_expr(e.clone()); +if is_opt.clone() { + Rc::new(vec![v2_rt::concat(var_name.clone(), ".as_deref().unwrap_or(\"\")".to_string())]) + } else { + Rc::new(vec![var_name.clone()]) } - _ => "compile_error!(\"transport path must be a string literal or interpolation\");" - .to_string(), - }, - None => v2_rt::concat( - v2_rt::concat( - "let url = format!(\"{}/{}\", self.base_url, \"".to_string(), - emit_ident(op_name, RenderTarget::Rust), - ), - "\");".to_string(), - ), - } +}, +}).iter().cloned()); } __result }); +if ((args.clone().len() as i64) == 0) { + v2_rt::concat(v2_rt::concat("let url = format!(\"{}".to_string(), fmt_str), "\", self.base_url);".to_string()) + } else { + { + let args_str = args.clone().join(&", ".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("let url = format!(\"{}".to_string(), fmt_str), "\", self.base_url, ".to_string()), args_str), ");".to_string()) +} + } +}, + _ => "compile_error!(\"transport path must be a string literal or interpolation\");".to_string(), +}, + None => v2_rt::concat(v2_rt::concat("let url = format!(\"{}/{}\", self.base_url, \"".to_string(), emit_ident(op_name, RenderTarget::Rust)), "\");".to_string()), +} } -pub fn emit_rest_auth_line( - transport: &Rc, - service_item: &Rc, - http_method: String, - source_indices: &Rc>>, -) -> String { +pub fn emit_rest_auth_line(transport: &Rc, service_item: &Rc, http_method: String, source_indices: &Rc>>) -> String { { let auth_scheme = service_config_auth(service_item.clone(), source_indices.clone()); - let auth_input = service_config_auth_input(service_item.clone(), source_indices.clone()); - match auth_scheme { - Some(auth) => { - let has_auth_source = match service_config_auth_source( - service_item.clone(), - source_indices.clone(), - ) { - Some(_) => true, - None => false, - }; - let token_param = if has_auth_source { - "self.auth_token.clone()".to_string() - } else { - match auth_input { +let auth_input = service_config_auth_input(service_item.clone(), source_indices.clone()); +match auth_scheme { + Some(auth) => { + let has_auth_source = match service_config_auth_source(service_item.clone(), source_indices.clone()) { + Some(_) => true, + None => false, +}; +let token_param = if has_auth_source { + "self.auth_token.clone()".to_string() + } else { + match auth_input { Some(ai) => emit_simple_expr(&ai, &RenderTarget::Rust, &source_indices), None => "compile_error!(\"service config has auth but no auth_input or auth_source\")".to_string(), } - }; - match (*auth.expr_data.clone()).clone() { + }; +match (*auth.expr_data.clone()).clone() { ExprData::ExprVar { .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("let request = client.".to_string(), http_method), "(&url)\n .header(\"Authorization\", format!(\"Bearer {}\", ".to_string()), token_param), "));".to_string()), ExprData::ExprCall { .. } => { let header_name = match auth.children.clone().first().cloned() { @@ -11979,104 +4712,41 @@ v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::con }, _ => v2_rt::concat(v2_rt::concat("compile_error!(\"unrecognized auth scheme expression shape\"); let request = client.".to_string(), http_method), "(&url);".to_string()), } - } - None => { - if transport_has_auth(transport.clone(), source_indices.clone()) { - { - let header_name = match transport_auth_header_name( - transport.clone(), - source_indices.clone(), - ) { - Some(h) => h.clone(), - None => "Authorization".to_string(), - }; - let token_node = - match transport_auth_token(transport.clone(), source_indices.clone()) { - Some(tn) => { - emit_simple_expr(&tn, &RenderTarget::Rust, &source_indices) - } - None => "\"\"".to_string(), - }; - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "let request = client.".to_string(), - http_method, - ), - "(&url)\n .header(\"".to_string(), - ), - header_name, - ), - "\", ".to_string(), - ), - token_node, - ), - ");".to_string(), - ) - } - } else { - v2_rt::concat( - v2_rt::concat("let request = client.".to_string(), http_method), - "(&url);".to_string(), - ) - } - } - } - } +}, + None => if transport_has_auth(transport.clone(), source_indices.clone()) { + { + let header_name = match transport_auth_header_name(transport.clone(), source_indices.clone()) { + Some(h) => h.clone(), + None => "Authorization".to_string(), +}; +let token_node = match transport_auth_token(transport.clone(), source_indices.clone()) { + Some(tn) => emit_simple_expr(&tn, &RenderTarget::Rust, &source_indices), + None => "\"\"".to_string(), +}; +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("let request = client.".to_string(), http_method), "(&url)\n .header(\"".to_string()), header_name), "\", ".to_string()), token_node), ");".to_string()) +} + } else { + v2_rt::concat(v2_rt::concat("let request = client.".to_string(), http_method), "(&url);".to_string()) + }, +} +} } -pub fn emit_rest_query_line( - transport: Rc, - source_indices: &Rc>>, -) -> String { +pub fn emit_rest_query_line(transport: Rc, source_indices: &Rc>>) -> String { match transport_query(transport, source_indices.clone()) { - Some(q) => { - let pairs = Rc::new({ - let mut __result = Vec::new(); - for fi in q.children.clone().iter().cloned() { - __result.push(v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "(\"".to_string(), - field_init_node_name_at(fi.clone(), source_indices.clone()), - ), - "\", &".to_string(), - ), - emit_simple_expr( - &field_init_node_value(&fi), - &RenderTarget::Rust, - &source_indices, - ), - ), - ".to_string())".to_string(), - )); - } - __result - }); - if ((pairs.clone().len() as i64) > 0) { - v2_rt::concat( - v2_rt::concat( - "let request = request.query(&[".to_string(), - pairs.clone().join(&", ".to_string()), - ), - "]);".to_string(), - ) - } else { - "".to_string() - } + Some(q) => { + let pairs = Rc::new({ let mut __result = Vec::new(); for fi in q.children.clone().iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("(\"".to_string(), field_init_node_name_at(fi.clone(), source_indices.clone())), "\", &".to_string()), emit_simple_expr(&field_init_node_value(&fi), &RenderTarget::Rust, &source_indices)), ".to_string())".to_string())); } __result }); +if ((pairs.clone().len() as i64) > 0) { + v2_rt::concat(v2_rt::concat("let request = request.query(&[".to_string(), pairs.clone().join(&", ".to_string())), "]);".to_string()) + } else { + "".to_string() } - None => "".to_string(), - } +}, + None => "".to_string(), +} } -pub fn emit_rest_body_line( - transport: Rc, - source_indices: &Rc>>, -) -> String { +pub fn emit_rest_body_line(transport: Rc, source_indices: &Rc>>) -> String { match transport_request_body(transport, source_indices.clone()) { Some(b) => match (*b.expr_data.clone()).clone() { ExprData::ExprRecordLit { .. } => { @@ -12116,161 +4786,74 @@ pub fn has_response_prefix(name: &String) -> bool { } } -pub fn child_from_key( - ch: Rc, - source_indices: Rc>>, -) -> Option { - match Rc::new({ - let mut __result = Vec::new(); - for p in ch.properties.clone().iter().cloned() { - if (field_init_node_name_at(p.clone(), source_indices.clone()).as_str() - == "from_key".to_string().as_str()) - { - __result.push(p); - } - } - __result - }) - .first() - .cloned() - { - Some(prop) => match (*field_init_node_value(&prop).expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { - let LiteralValue::LitStr { value: s, .. } = value.as_ref() else { - unreachable!() - }; - Some(s.clone()) - } - _ => None, - }, - None => None, - } +pub fn child_from_key(ch: Rc, source_indices: Rc>>) -> Option { + match Rc::new({ let mut __result = Vec::new(); for p in ch.properties.clone().iter().cloned() { if (field_init_node_name_at(p.clone(), source_indices.clone()).as_str() == "from_key".to_string().as_str()) { __result.push(p); } } __result }).first().cloned() { + Some(prop) => match (*field_init_node_value(&prop).expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitStr { value: s, .. } = value.as_ref() else { unreachable!() }; Some(s.clone()) }, + _ => None, +}, + None => None, +} } -pub fn has_from_key_fields( - op_node: Rc, - source_indices: Rc>>, -) -> bool { +pub fn has_from_key_fields(op_node: Rc, source_indices: Rc>>) -> bool { { let rt = resolved_type(op_node); - let is_conj = (rt.connective.clone() == Connective::Conj); - let from_key_count = (Rc::new({ - let mut __result = Vec::new(); - for ch in rt.children.clone().iter().cloned() { - if match child_from_key(ch.clone(), source_indices.clone()) { - Some(_) => true, - None => false, - } { - __result.push(ch); - } - } - __result - }) - .len() as i64); - (is_conj && (from_key_count > 0)) - } +let is_conj = (rt.connective.clone() == Connective::Conj); +let from_key_count = (Rc::new({ let mut __result = Vec::new(); for ch in rt.children.clone().iter().cloned() { if match child_from_key(ch.clone(), source_indices.clone()) { + Some(_) => true, + None => false, +} { __result.push(ch); } } __result }).len() as i64); +(is_conj && (from_key_count > 0)) +} } -pub fn has_response_200_property( - op_node: Rc, - source_indices: Rc>>, -) -> bool { - { - let mut __found = false; - for p in op_node.properties.clone().iter().cloned() { - if (field_init_node_name_at(p.clone(), source_indices.clone()).as_str() - == "response_200".to_string().as_str()) - { - __found = true; - break; - } - } - __found - } +pub fn has_response_200_property(op_node: Rc, source_indices: Rc>>) -> bool { + { let mut __found = false; for p in op_node.properties.clone().iter().cloned() { if (field_init_node_name_at(p.clone(), source_indices.clone()).as_str() == "response_200".to_string().as_str()) { __found = true; break; } } __found } } -pub fn operation_response_200_resolved_type( - op_node: Rc, - source_indices: &Rc>>, - env: Rc, -) -> Option> { - match Rc::new({ - let mut __result = Vec::new(); - for p in op_node.properties.clone().iter().cloned() { - if (field_init_node_name_at(p.clone(), source_indices.clone()).as_str() - == "response_200".to_string().as_str()) - { - __result.push(p); - } - } - __result - }) - .first() - .cloned() - { - Some(p) => { - let v = field_init_node_value(&p); - match v.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: tn, .. }) => Some(tn.clone()), - _ => { - let type_name = authored_name_at( - source_indices.clone(), - &normalize_access_type_node(v.clone()), - ); - if (type_name.clone().as_str() == "".to_string().as_str()) { - None - } else { - lookup_type_by_name(&env, type_name.clone()) - } - } +pub fn operation_response_200_resolved_type(op_node: Rc, source_indices: &Rc>>, env: Rc) -> Option> { + match Rc::new({ let mut __result = Vec::new(); for p in op_node.properties.clone().iter().cloned() { if (field_init_node_name_at(p.clone(), source_indices.clone()).as_str() == "response_200".to_string().as_str()) { __result.push(p); } } __result }).first().cloned() { + Some(p) => { + let v = field_init_node_value(&p); +match v.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: tn, .. }) => Some(tn.clone()), + _ => { + let type_name = authored_name_at(source_indices.clone(), &normalize_access_type_node(v.clone())); +if (type_name.clone().as_str() == "".to_string().as_str()) { + None + } else { + lookup_type_by_name(&env, type_name.clone()) } - } - None => None, - } +}, +} +}, + None => None, +} } -pub fn is_json_wire_declaration_type( - t: Rc, - source_indices: Rc>>, -) -> bool { +pub fn is_json_wire_declaration_type(t: Rc, source_indices: Rc>>) -> bool { { let n = authored_name_at(source_indices, &normalize_access_type_node(t)); - if (n.clone().as_str() == "Json".to_string().as_str()) { +if (n.clone().as_str() == "Json".to_string().as_str()) { true } else { { - let parts = Rc::new( - n.clone() - .split(&".".to_string()) - .map(|s| s.to_string()) - .collect::>(), - ); - match parts.last().cloned() { - Some(last) => (last.clone().as_str() == "Json".to_string().as_str()), - None => false, - } - } + let parts = Rc::new(n.clone().split(&".".to_string()).map(|s| s.to_string()).collect::>()); +match parts.last().cloned() { + Some(last) => (last.clone().as_str() == "Json".to_string().as_str()), + None => false, +} +} } - } +} } pub fn path_segment_is_list_index(seg: &String) -> bool { if (v2_rt::string_length(&seg) == 0) { false } else { - { - let mut __all = true; - for c in Rc::new(seg.clone().chars().map(|c| c as i64).collect::>()) - .iter() - .cloned() - { - if !((c.clone() >= 48) && (c.clone() <= 57)) { - __all = false; - break; - } - } - __all - } + { let mut __all = true; for c in Rc::new(seg.clone().chars().map(|c| c as i64).collect::>()).iter().cloned() { if !(((c.clone() >= 48) && (c.clone() <= 57))) { __all = false; break; } } __all } } } @@ -12281,337 +4864,146 @@ pub struct WirePathProjection { pub ok: bool, } -pub fn wire_child_for_segment( - wire_node: Rc, - seg: String, - source_indices: Rc>>, -) -> Option> { +pub fn wire_child_for_segment(wire_node: Rc, seg: String, source_indices: Rc>>) -> Option> { { let normed = normalize_access_type_node(wire_node); - match Rc::new({ - let mut __result = Vec::new(); - for ch in normed.children.clone().iter().cloned() { - if { - let authored = authored_name_at(source_indices.clone(), &ch); - let wire_key = match child_from_key(ch.clone(), source_indices.clone()) { - Some(k) => k.clone(), - None => authored.clone(), - }; - (wire_key.clone().as_str() == seg.clone().as_str()) - } { - __result.push(ch); - } - } - __result - }) - .first() - .cloned() - { - Some(ch) => Some(ch.clone()), - None => None, - } - } +match Rc::new({ let mut __result = Vec::new(); for ch in normed.children.clone().iter().cloned() { if { + let authored = authored_name_at(source_indices.clone(), &ch); +let wire_key = match child_from_key(ch.clone(), source_indices.clone()) { + Some(k) => k.clone(), + None => authored.clone(), +}; +(wire_key.clone().as_str() == seg.clone().as_str()) +} { __result.push(ch); } } __result }).first().cloned() { + Some(ch) => Some(ch.clone()), + None => None, +} +} } -pub fn advance_wire_path_projection( - state: &Rc, - seg: &String, - full_path: String, - source_indices: &Rc>>, -) -> Rc { +pub fn advance_wire_path_projection(state: &Rc, seg: &String, full_path: String, source_indices: &Rc>>) -> Rc { if !state.ok.clone() { state.clone() } else { if path_segment_is_list_index(&seg) { { let next_node = match state.node.clone() { - Some(n) => Some(for_each_element_type_node( - n.clone(), - source_indices.clone(), - )), - None => None, - }; - Rc::new(WirePathProjection { - expr: v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("(".to_string(), state.expr.clone()), - ").get(".to_string(), - ), - seg.clone(), - ), - ").ok_or_else(|| format!(\"REST path missing index " - .to_string(), - ), - seg.clone(), - ), - " at ".to_string(), - ), - full_path, - ), - "\"))?".to_string(), - ), - node: next_node, - ok: true, - }) - } + Some(n) => Some(for_each_element_type_node(n.clone(), source_indices.clone())), + None => None, +}; +Rc::new(WirePathProjection { + expr: v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("(".to_string(), state.expr.clone()), ").get(".to_string()), seg.clone()), ").ok_or_else(|| format!(\"REST path missing index ".to_string()), seg.clone()), " at ".to_string()), full_path), "\"))?".to_string()), + node: next_node, + ok: true, +}) +} } else { match state.node.clone() { - Some(n) => { - match wire_child_for_segment(n.clone(), seg.clone(), source_indices.clone()) { - Some(ch) => Rc::new(WirePathProjection { - expr: v2_rt::concat( - v2_rt::concat( - v2_rt::concat("(".to_string(), state.expr.clone()), - ").".to_string(), - ), - emit_ident( - authored_name_at(source_indices.clone(), &ch), - RenderTarget::Rust, - ), - ), - node: Some(resolved_type(ch.clone())), - ok: true, - }), - None => Rc::new(WirePathProjection { - expr: state.expr.clone(), - node: None, - ok: false, - }), - } - } - None => Rc::new(WirePathProjection { - expr: state.expr.clone(), - node: None, - ok: false, - }), - } + Some(n) => match wire_child_for_segment(n.clone(), seg.clone(), source_indices.clone()) { + Some(ch) => Rc::new(WirePathProjection { + expr: v2_rt::concat(v2_rt::concat(v2_rt::concat("(".to_string(), state.expr.clone()), ").".to_string()), emit_ident(authored_name_at(source_indices.clone(), &ch), RenderTarget::Rust)), + node: Some(resolved_type(ch.clone())), + ok: true, +}), + None => Rc::new(WirePathProjection { + expr: state.expr.clone(), + node: None, + ok: false, +}), +}, + None => Rc::new(WirePathProjection { + expr: state.expr.clone(), + node: None, + ok: false, +}), +} } } } -pub fn emit_wire_struct_path_chain( - base: String, - wire_node: Rc, - from_path: &String, - source_indices: Rc>>, -) -> Rc { +pub fn emit_wire_struct_path_chain(base: String, wire_node: Rc, from_path: &String, source_indices: Rc>>) -> Rc { { - let segs = Rc::new({ - let mut __result = Vec::new(); - for s in Rc::new( - from_path - .clone() - .split(&"/".to_string()) - .map(|s| s.to_string()) - .collect::>(), - ) - .iter() - .cloned() - { - if (s.clone().as_str() != "".to_string().as_str()) { - __result.push(s); - } - } - __result - }); - segs.iter().cloned().fold( - Rc::new(WirePathProjection { - expr: base, - node: Some(wire_node), - ok: true, - }), - |acc: Rc, seg: String| { - advance_wire_path_projection(&acc, &seg, from_path.clone(), &source_indices) - }, - ) - } + let segs = Rc::new({ let mut __result = Vec::new(); for s in Rc::new(from_path.clone().split(&"/".to_string()).map(|s| s.to_string()).collect::>()).iter().cloned() { if (s.clone().as_str() != "".to_string().as_str()) { __result.push(s); } } __result }); +segs.iter().cloned().fold(Rc::new(WirePathProjection { + expr: base, + node: Some(wire_node), + ok: true, +}), |acc: Rc, seg: String| advance_wire_path_projection(&acc, &seg, from_path.clone(), &source_indices)) +} } -pub fn emit_typed_wire_field_assign( - field_name: String, - from_path: &String, - wire_node: Rc, - source_indices: Rc>>, -) -> String { +pub fn emit_typed_wire_field_assign(field_name: String, from_path: &String, wire_node: Rc, source_indices: Rc>>) -> String { { - let projection = emit_wire_struct_path_chain( - "__rest_wire".to_string(), - wire_node, - &from_path, - source_indices, - ); - if projection.ok.clone() { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("let ".to_string(), field_name), - " = ".to_string(), - ), - projection.expr.clone(), - ), - ".clone();\n".to_string(), - ) + let projection = emit_wire_struct_path_chain("__rest_wire".to_string(), wire_node, &from_path, source_indices); +if projection.ok.clone() { + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("let ".to_string(), field_name), " = ".to_string()), projection.expr.clone()), ".clone();\n".to_string()) } else { v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("let ".to_string(), field_name), " = compile_error!(\"REST typed response path could not be resolved against declared 200 body: ".to_string()), from_path.clone()), "\");\n".to_string()) } - } +} } pub fn escape_json_pointer_segment(seg: String) -> String { - v2_rt::replace( - v2_rt::replace(seg, "~".to_string(), "~0".to_string()), - "/".to_string(), - "~1".to_string(), - ) -} - -pub fn emit_json_value_extract( - var_name: String, - from_path: &String, - dag_type_name: String, -) -> String { + v2_rt::replace(v2_rt::replace(seg, "~".to_string(), "~0".to_string()), "/".to_string(), "~1".to_string()) +} + +pub fn emit_json_value_extract(var_name: String, from_path: &String, dag_type_name: String) -> String { { - let escaped_path = Rc::new({ - let mut __result = Vec::new(); - for seg in Rc::new( - from_path - .clone() - .split(&"/".to_string()) - .map(|s| s.to_string()) - .collect::>(), - ) - .iter() - .cloned() - { - __result.push(escape_json_pointer_segment(seg.clone())); - } - __result - }) - .join(&"/".to_string()); - let pointer = v2_rt::concat("/".to_string(), escaped_path); - let rust_type = coerce_primitive_type(RenderTarget::Rust, dag_type_name); - let accessor = if (rust_type.clone().as_str() == "String".to_string().as_str()) { - v2_rt::concat( - v2_rt::concat( - ".and_then(|v| v.as_str()).map(|s| s.to_string()).ok_or(\"missing field: " - .to_string(), - from_path.clone(), - ), - "\")?".to_string(), - ) + let escaped_path = Rc::new({ let mut __result = Vec::new(); for seg in Rc::new(from_path.clone().split(&"/".to_string()).map(|s| s.to_string()).collect::>()).iter().cloned() { __result.push(escape_json_pointer_segment(seg.clone())); } __result }).join(&"/".to_string()); +let pointer = v2_rt::concat("/".to_string(), escaped_path); +let rust_type = coerce_primitive_type(RenderTarget::Rust, dag_type_name); +let accessor = if (rust_type.clone().as_str() == "String".to_string().as_str()) { + v2_rt::concat(v2_rt::concat(".and_then(|v| v.as_str()).map(|s| s.to_string()).ok_or(\"missing field: ".to_string(), from_path.clone()), "\")?".to_string()) } else { if (rust_type.clone().as_str() == "i64".to_string().as_str()) { - v2_rt::concat( - v2_rt::concat( - ".and_then(|v| v.as_i64()).ok_or(\"missing field: ".to_string(), - from_path.clone(), - ), - "\")?".to_string(), - ) + v2_rt::concat(v2_rt::concat(".and_then(|v| v.as_i64()).ok_or(\"missing field: ".to_string(), from_path.clone()), "\")?".to_string()) } else { if (rust_type.clone().as_str() == "f64".to_string().as_str()) { - v2_rt::concat( - v2_rt::concat( - ".and_then(|v| v.as_f64()).ok_or(\"missing field: ".to_string(), - from_path.clone(), - ), - "\")?".to_string(), - ) + v2_rt::concat(v2_rt::concat(".and_then(|v| v.as_f64()).ok_or(\"missing field: ".to_string(), from_path.clone()), "\")?".to_string()) } else { if (rust_type.clone().as_str() == "bool".to_string().as_str()) { - v2_rt::concat( - v2_rt::concat( - ".and_then(|v| v.as_bool()).ok_or(\"missing field: ".to_string(), - from_path.clone(), - ), - "\")?".to_string(), - ) + v2_rt::concat(v2_rt::concat(".and_then(|v| v.as_bool()).ok_or(\"missing field: ".to_string(), from_path.clone()), "\")?".to_string()) } else { v2_rt::concat(v2_rt::concat(".cloned().map(|v| serde_json::from_value(v)).transpose()?.ok_or(\"missing field: ".to_string(), from_path.clone()), "\")?".to_string()) } } } }; - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("let ".to_string(), var_name), - " = json_body.pointer(\"".to_string(), - ), - pointer, - ), - "\")".to_string(), - ), - accessor, - ), - ";".to_string(), - ) - } +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("let ".to_string(), var_name), " = json_body.pointer(\"".to_string()), pointer), "\")".to_string()), accessor), ";".to_string()) +} } -pub fn emit_from_key_extraction( - op_node: &Rc, - source_indices: &Rc>>, - shared_types: Rc>, - env: Rc, -) -> String { +pub fn emit_from_key_extraction(op_node: &Rc, source_indices: &Rc>>, shared_types: Rc>, env: Rc) -> String { { let rt = resolved_type(op_node.clone()); - let children = rt.children.clone(); - let wire_opt = operation_response_200_resolved_type(op_node.clone(), &source_indices, env); - if (has_response_200_property(op_node.clone(), source_indices.clone()) - && match wire_opt.clone() { - None => true, - Some(_) => false, - }) - { +let children = rt.children.clone(); +let wire_opt = operation_response_200_resolved_type(op_node.clone(), &source_indices, env); +if (has_response_200_property(op_node.clone(), source_indices.clone()) && match wire_opt.clone() { + None => true, + Some(_) => false, +}) { "compile_error!(\"REST response_200: declared HTTP 200 body type is present but could not be resolved (empty name, missing TypeEnv binding, or inference gap); illegal state\");\n".to_string() } else { { let use_typed_wire = match wire_opt.clone() { - Some(tn) => !is_json_wire_declaration_type(tn.clone(), source_indices.clone()), - None => false, - }; - let prelude = match wire_opt.clone() { - Some(tn) => { - if is_json_wire_declaration_type(tn.clone(), source_indices.clone()) { - "let json_body: serde_json::Value = response.json().await?;\n" - .to_string() - } else { - { - let wire_ty = match tn.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => rt.clone(), - _ => tn.clone(), - }; - v2_rt::concat( - v2_rt::concat( - "let __rest_wire: ".to_string(), - render_rust_type( - wire_ty, - shared_types, - source_indices.clone(), - ), - ), - " = response.json().await?;\n".to_string(), - ) - } - } - } - None => { - "let json_body: serde_json::Value = response.json().await?;\n".to_string() - } - }; - let extract_lines = Rc::new({ - let mut __result = Vec::new(); - for ch in children.clone().iter().cloned() { - __result.push({ + Some(tn) => !is_json_wire_declaration_type(tn.clone(), source_indices.clone()), + None => false, +}; +let prelude = match wire_opt.clone() { + Some(tn) => if is_json_wire_declaration_type(tn.clone(), source_indices.clone()) { + "let json_body: serde_json::Value = response.json().await?;\n".to_string() + } else { + { + let wire_ty = match tn.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => rt.clone(), + _ => tn.clone(), +}; +v2_rt::concat(v2_rt::concat("let __rest_wire: ".to_string(), render_rust_type(wire_ty, shared_types, source_indices.clone())), " = response.json().await?;\n".to_string()) +} + }, + None => "let json_body: serde_json::Value = response.json().await?;\n".to_string(), +}; +let extract_lines = Rc::new({ let mut __result = Vec::new(); for ch in children.clone().iter().cloned() { __result.push({ let ch_name = authored_name_at(source_indices.clone(), &ch); let field_name = emit_ident(ch_name.clone(), RenderTarget::Rust); let from_path = match child_from_key(ch.clone(), source_indices.clone()) { @@ -12629,201 +5021,83 @@ match ch.inferred.clone().as_deref().cloned() { }, _ => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("let ".to_string(), field_name.clone()), " = compile_error!(\"unresolved type for output field: ".to_string()), ch_name.clone()), "\");".to_string()), } -}); - } - __result - }); - let field_names = Rc::new({ - let mut __result = Vec::new(); - for ch in children.clone().iter().cloned() { - __result.push(emit_ident( - authored_name_at(source_indices.clone(), &ch), - RenderTarget::Rust, - )); - } - __result - }); - let tuple_body = if ((field_names.clone().len() as i64) == 1) { - v2_rt::concat( - v2_rt::concat( - "(".to_string(), - field_names.clone().first().cloned().clone().unwrap(), - ), - ",)".to_string(), - ) +}); } __result }); +let field_names = Rc::new({ let mut __result = Vec::new(); for ch in children.clone().iter().cloned() { __result.push(emit_ident(authored_name_at(source_indices.clone(), &ch), RenderTarget::Rust)); } __result }); +let tuple_body = if ((field_names.clone().len() as i64) == 1) { + v2_rt::concat(v2_rt::concat("(".to_string(), field_names.clone().first().cloned().clone().unwrap()), ",)".to_string()) } else { - v2_rt::concat( - v2_rt::concat("(".to_string(), field_names.clone().join(&", ".to_string())), - ")".to_string(), - ) + v2_rt::concat(v2_rt::concat("(".to_string(), field_names.clone().join(&", ".to_string())), ")".to_string()) }; - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(prelude, extract_lines.join(&"\n".to_string())), - "\nOk(".to_string(), - ), - tuple_body, - ), - ")".to_string(), - ) - } +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(prelude, extract_lines.join(&"\n".to_string())), "\nOk(".to_string()), tuple_body), ")".to_string()) +} } - } +} } -pub fn emit_plain_response_body( - op_node: Rc, - transport: Rc, - source_indices: &Rc>>, -) -> String { +pub fn emit_plain_response_body(op_node: Rc, transport: Rc, source_indices: &Rc>>) -> String { { let is_text = match transport_response_format(transport, source_indices.clone()) { - Some(fmt) => { - (authored_name_at(source_indices.clone(), &fmt).as_str() - == "Text".to_string().as_str()) - } - None => false, - }; - if is_text { + Some(fmt) => (authored_name_at(source_indices.clone(), &fmt).as_str() == "Text".to_string().as_str()), + None => false, +}; +if is_text { "let result = response.text().await?;\nOk(result)".to_string() } else { "let result = response.json().await?;\nOk(result)".to_string() } - } +} } -pub fn emit_response_code_handling( - op_node: &Rc, - transport: Rc, - source_indices: &Rc>>, - shared_types: Rc>, - env: Rc, -) -> String { +pub fn emit_response_code_handling(op_node: &Rc, transport: Rc, source_indices: &Rc>>, shared_types: Rc>, env: Rc) -> String { { let use_from_key = has_from_key_fields(op_node.clone(), source_indices.clone()); - let response_props = Rc::new({ - let mut __result = Vec::new(); - for p in op_node.properties.clone().iter().cloned() { - if has_response_prefix(&field_init_node_name_at(p.clone(), source_indices.clone())) - { - __result.push(p); - } - } - __result - }); - if ((response_props.clone().len() as i64) == 0) { +let response_props = Rc::new({ let mut __result = Vec::new(); for p in op_node.properties.clone().iter().cloned() { if has_response_prefix(&field_init_node_name_at(p.clone(), source_indices.clone())) { __result.push(p); } } __result }); +if ((response_props.clone().len() as i64) == 0) { if use_from_key.clone() { - emit_from_key_extraction( - &op_node, - &source_indices, - shared_types.clone(), - env.clone(), - ) + emit_from_key_extraction(&op_node, &source_indices, shared_types.clone(), env.clone()) } else { emit_plain_response_body(op_node.clone(), transport.clone(), &source_indices) } } else { { - let arms = Rc::new({ - let mut __result = Vec::new(); - for p in response_props.clone().iter().cloned() { - __result.push(emit_response_arm( - p.clone(), - op_node.clone(), - use_from_key.clone(), - transport.clone(), - &source_indices, - shared_types.clone(), - env.clone(), - )); - } - __result - }); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "let status = response.status().as_u16();\n".to_string(), - "match status {\n".to_string(), - ), - arms.join(&"\n".to_string()), - ), - "\n _ => Err(format!(\"unexpected status code: {}\", status).into())\n" - .to_string(), - ), - "}".to_string(), - ) - } + let arms = Rc::new({ let mut __result = Vec::new(); for p in response_props.clone().iter().cloned() { __result.push(emit_response_arm(p.clone(), op_node.clone(), use_from_key.clone(), transport.clone(), &source_indices, shared_types.clone(), env.clone())); } __result }); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("let status = response.status().as_u16();\n".to_string(), "match status {\n".to_string()), arms.join(&"\n".to_string())), "\n _ => Err(format!(\"unexpected status code: {}\", status).into())\n".to_string()), "}".to_string()) +} } - } +} } -pub fn emit_response_arm( - prop: Rc, - op_node: Rc, - use_from_key: bool, - transport: Rc, - source_indices: &Rc>>, - shared_types: Rc>, - env: Rc, -) -> String { +pub fn emit_response_arm(prop: Rc, op_node: Rc, use_from_key: bool, transport: Rc, source_indices: &Rc>>, shared_types: Rc>, env: Rc) -> String { { let name = field_init_node_name_at(prop, source_indices.clone()); - let code_str = v2_rt::substring(&name, 9, v2_rt::string_length(&name)); - let is_success = if (v2_rt::string_length(&code_str) >= 1) { +let code_str = v2_rt::substring(&name, 9, v2_rt::string_length(&name)); +let is_success = if (v2_rt::string_length(&code_str) >= 1) { (v2_rt::substring(&code_str, 0, 1).as_str() == "2".to_string().as_str()) } else { false }; - let pattern = if (code_str.clone().as_str() == "nonzero".to_string().as_str()) { +let pattern = if (code_str.clone().as_str() == "nonzero".to_string().as_str()) { "_".to_string() } else { - if ((v2_rt::string_length(&code_str) == 3) - && (v2_rt::substring(&code_str, 1, 3).as_str() == "xx".to_string().as_str())) - { + if ((v2_rt::string_length(&code_str) == 3) && (v2_rt::substring(&code_str, 1, 3).as_str() == "xx".to_string().as_str())) { { let prefix = v2_rt::substring(&code_str, 0, 1); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(prefix.clone(), "00..=".to_string()), - prefix.clone(), - ), - "99".to_string(), - ) - } +v2_rt::concat(v2_rt::concat(v2_rt::concat(prefix.clone(), "00..=".to_string()), prefix.clone()), "99".to_string()) +} } else { code_str.clone() } }; - if is_success { +if is_success { if use_from_key { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(" ".to_string(), pattern), - " => { ".to_string(), - ), - emit_from_key_extraction(&op_node, &source_indices, shared_types, env), - ), - " },".to_string(), - ) + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" ".to_string(), pattern), " => { ".to_string()), emit_from_key_extraction(&op_node, &source_indices, shared_types, env)), " },".to_string()) } else { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(" ".to_string(), pattern), - " => { ".to_string(), - ), - emit_plain_response_body(op_node, transport, &source_indices), - ), - " },".to_string(), - ) + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" ".to_string(), pattern), " => { ".to_string()), emit_plain_response_body(op_node, transport, &source_indices)), " },".to_string()) } } else { v2_rt::concat(v2_rt::concat(" ".to_string(), pattern), " => { let err_body = response.text().await.unwrap_or_default(); Err(format!(\"HTTP {}: {}\", status, err_body).into()) },".to_string()) } - } +} } pub fn has_exit_prefix(name: &String) -> bool { @@ -12834,472 +5108,205 @@ pub fn has_exit_prefix(name: &String) -> bool { } } -pub fn emit_exit_code_handling( - op_node: Rc, - inferred: Rc, - source_indices: Rc>>, -) -> String { +pub fn emit_exit_code_handling(op_node: Rc, inferred: Rc, source_indices: Rc>>) -> String { { - let exit_props = Rc::new({ - let mut __result = Vec::new(); - for p in op_node.properties.clone().iter().cloned() { - if has_exit_prefix(&field_init_node_name_at(p.clone(), source_indices.clone())) { - __result.push(p); - } - } - __result - }); - if ((exit_props.clone().len() as i64) == 0) { + let exit_props = Rc::new({ let mut __result = Vec::new(); for p in op_node.properties.clone().iter().cloned() { if has_exit_prefix(&field_init_node_name_at(p.clone(), source_indices.clone())) { __result.push(p); } } __result }); +if ((exit_props.clone().len() as i64) == 0) { emit_shell_return(inferred.clone(), &source_indices) } else { { - let has_nonzero = { - let mut __found = false; - for p in exit_props.clone().iter().cloned() { - if (field_init_node_name_at(p.clone(), source_indices.clone()).as_str() - == "exit_nonzero".to_string().as_str()) - { - __found = true; - break; - } - } - __found - }; - let exit_arms = Rc::new({ - let mut __result = Vec::new(); - for p in exit_props.clone().iter().cloned() { - __result.push(emit_exit_arm(p.clone(), inferred.clone(), &source_indices)); - } - __result - }); - let default_arm = if has_nonzero { + let has_nonzero = { let mut __found = false; for p in exit_props.clone().iter().cloned() { if (field_init_node_name_at(p.clone(), source_indices.clone()).as_str() == "exit_nonzero".to_string().as_str()) { __found = true; break; } } __found }; +let exit_arms = Rc::new({ let mut __result = Vec::new(); for p in exit_props.clone().iter().cloned() { __result.push(emit_exit_arm(p.clone(), inferred.clone(), &source_indices)); } __result }); +let default_arm = if has_nonzero { "".to_string() } else { "\n _ => { let stderr = String::from_utf8_lossy(&output.stderr).to_string(); Err(stderr.into()) },".to_string() }; - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "let exit_code = output.status.code().unwrap_or(-1);\n".to_string(), - "match exit_code {\n".to_string(), - ), - exit_arms.join(&"\n".to_string()), - ), - default_arm, - ), - "\n}".to_string(), - ) - } +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("let exit_code = output.status.code().unwrap_or(-1);\n".to_string(), "match exit_code {\n".to_string()), exit_arms.join(&"\n".to_string())), default_arm), "\n}".to_string()) +} } - } +} } -pub fn emit_exit_arm( - prop: Rc, - inferred: Rc, - source_indices: &Rc>>, -) -> String { +pub fn emit_exit_arm(prop: Rc, inferred: Rc, source_indices: &Rc>>) -> String { { let name = field_init_node_name_at(prop, source_indices.clone()); - let code_str = v2_rt::substring(&name, 5, v2_rt::string_length(&name)); - let pattern = if (code_str.clone().as_str() == "nonzero".to_string().as_str()) { +let code_str = v2_rt::substring(&name, 5, v2_rt::string_length(&name)); +let pattern = if (code_str.clone().as_str() == "nonzero".to_string().as_str()) { "_".to_string() } else { code_str.clone() }; - let is_success = (code_str.clone().as_str() == "0".to_string().as_str()); - if is_success { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(" ".to_string(), pattern), - " => { ".to_string(), - ), - emit_shell_return(inferred, &source_indices), - ), - " },".to_string(), - ) +let is_success = (code_str.clone().as_str() == "0".to_string().as_str()); +if is_success { + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" ".to_string(), pattern), " => { ".to_string()), emit_shell_return(inferred, &source_indices)), " },".to_string()) } else { v2_rt::concat(v2_rt::concat(" ".to_string(), pattern), " => { let stderr = String::from_utf8_lossy(&output.stderr).to_string(); Err(stderr.into()) },".to_string()) } - } +} } -pub fn emit_shell_call( - op_name: String, - transport: &Rc, - registry: Rc>>, - depth: i64, - inferred: Rc, - op_node: &Rc, - source_indices: &Rc>>, -) -> String { +pub fn emit_shell_call(op_name: String, transport: &Rc, registry: Rc>>, depth: i64, inferred: Rc, op_node: &Rc, source_indices: &Rc>>) -> String { { let argv = transport.children.clone(); - let optional_params = Rc::new({ - let mut __result = Vec::new(); - for p in op_node.params.clone().iter().cloned() { - if (param_node_type_expr(&p).return_cardinality.clone() - == Cardinality::CardOptional) - { - __result.push(p); - } - } - __result - }) - .iter() - .cloned() - .fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, p: Rc| { - v2_rt::rc_map_insert( - acc, - param_node_name_at(p.clone(), source_indices.clone()), - true, - ) - }, - ); - let has_stdin = match transport_stdin(transport.clone(), source_indices.clone()) { - Some(_) => true, - None => false, - }; - let let_kw = if has_stdin.clone() { +let optional_params = Rc::new({ let mut __result = Vec::new(); for p in op_node.params.clone().iter().cloned() { if (param_node_type_expr(&p).return_cardinality.clone() == Cardinality::CardOptional) { __result.push(p); } } __result }).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, p: Rc| v2_rt::rc_map_insert(acc, param_node_name_at(p.clone(), source_indices.clone()), true)); +let has_stdin = match transport_stdin(transport.clone(), source_indices.clone()) { + Some(_) => true, + None => false, +}; +let let_kw = if has_stdin.clone() { "let mut output".to_string() } else { "let output".to_string() }; - let cmd_line = if ((argv.clone().len() as i64) > 0) { +let cmd_line = if ((argv.clone().len() as i64) > 0) { match argv.clone().first().cloned() { - Some(first_arg) => v2_rt::concat( - v2_rt::concat( - v2_rt::concat(let_kw, " = std::process::Command::new(".to_string()), - emit_shell_argv_element( - &first_arg, - optional_params.clone(), - source_indices.clone(), - ), - ), - ")".to_string(), - ), - None => v2_rt::concat( - v2_rt::concat( - v2_rt::concat(let_kw, " = std::process::Command::new(\"".to_string()), - emit_ident(op_name, RenderTarget::Rust), - ), - "\")".to_string(), - ), - } + Some(first_arg) => v2_rt::concat(v2_rt::concat(v2_rt::concat(let_kw, " = std::process::Command::new(".to_string()), emit_shell_argv_element(&first_arg, optional_params.clone(), source_indices.clone())), ")".to_string()), + None => v2_rt::concat(v2_rt::concat(v2_rt::concat(let_kw, " = std::process::Command::new(\"".to_string()), emit_ident(op_name, RenderTarget::Rust)), "\")".to_string()), +} } else { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(let_kw, " = std::process::Command::new(\"".to_string()), - emit_ident(op_name, RenderTarget::Rust), - ), - "\")".to_string(), - ) + v2_rt::concat(v2_rt::concat(v2_rt::concat(let_kw, " = std::process::Command::new(\"".to_string()), emit_ident(op_name, RenderTarget::Rust)), "\")".to_string()) }; - let arg_lines = if ((argv.clone().len() as i64) > 1) { - Rc::new({ - let mut __result = Vec::new(); - for arg in Rc::new( - argv.clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ) - .iter() - .cloned() - { - __result.push(v2_rt::concat( - v2_rt::concat( - " .arg(".to_string(), - emit_shell_argv_element( - &arg, - optional_params.clone(), - source_indices.clone(), - ), - ), - ")".to_string(), - )); - } - __result - }) +let arg_lines = if ((argv.clone().len() as i64) > 1) { + Rc::new({ let mut __result = Vec::new(); for arg in Rc::new(argv.clone().iter().cloned().skip(1 as usize).collect::>()).iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(" .arg(".to_string(), emit_shell_argv_element(&arg, optional_params.clone(), source_indices.clone())), ")".to_string())); } __result }) } else { Rc::new(vec![]) }; - let env_entries = transport_env(transport.clone(), source_indices.clone()); - let env_lines = Rc::new({ - let mut __result = Vec::new(); - for e in env_entries.iter().cloned() { - __result.push(v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - " .env(\"".to_string(), - field_init_node_name_at(e.clone(), source_indices.clone()), - ), - "\", ".to_string(), - ), - emit_simple_expr( - &field_init_node_value(&e), - &RenderTarget::Rust, - &source_indices, - ), - ), - ")".to_string(), - )); - } - __result - }); - let wd_line = " .current_dir(self.working_dir.as_deref().unwrap_or(\".\"))".to_string(); - if has_stdin.clone() { +let env_entries = transport_env(transport.clone(), source_indices.clone()); +let env_lines = Rc::new({ let mut __result = Vec::new(); for e in env_entries.iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" .env(\"".to_string(), field_init_node_name_at(e.clone(), source_indices.clone())), "\", ".to_string()), emit_simple_expr(&field_init_node_value(&e), &RenderTarget::Rust, &source_indices)), ")".to_string())); } __result }); +let wd_line = " .current_dir(self.working_dir.as_deref().unwrap_or(\".\"))".to_string(); +if has_stdin.clone() { { - let stdin_expr = transport_stdin(transport.clone(), source_indices.clone()) - .clone() - .unwrap(); - let stdin_var = match (*stdin_expr.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => emit_ident( - expr_var_name_at(stdin_expr.clone(), source_indices.clone()), - RenderTarget::Rust, - ), - _ => emit_simple_expr(&stdin_expr, &RenderTarget::Rust, &source_indices), - }; - let spawn_line = " .stdin(std::process::Stdio::piped())\n .stdout(std::process::Stdio::piped())\n .stderr(std::process::Stdio::piped())".to_string(); - let spawn_exec = " .spawn()?;".to_string(); - let write_block = v2_rt::concat(v2_rt::concat("{\n use std::io::Write;\n if let Some(mut stdin) = output.stdin.take() {\n stdin.write_all(".to_string(), stdin_var), ".as_bytes())?;\n }\n}".to_string()); - let wait_line = "let output = output.wait_with_output()?;".to_string(); - let check_line = - "let stdout = String::from_utf8_lossy(&output.stdout).to_string();".to_string(); - let return_line = - emit_exit_code_handling(op_node.clone(), inferred, source_indices.clone()); - let all_lines = v2_rt::concat( - v2_rt::concat(v2_rt::concat(Rc::new(vec![cmd_line]), arg_lines), env_lines), - Rc::new(vec![ - wd_line, - spawn_line, - spawn_exec, - write_block, - wait_line, - check_line, - return_line, - ]), - ); - all_lines.join(&"\n".to_string()) - } + let stdin_expr = transport_stdin(transport.clone(), source_indices.clone()).clone().unwrap(); +let stdin_var = match (*stdin_expr.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => emit_ident(expr_var_name_at(stdin_expr.clone(), source_indices.clone()), RenderTarget::Rust), + _ => emit_simple_expr(&stdin_expr, &RenderTarget::Rust, &source_indices), +}; +let spawn_line = " .stdin(std::process::Stdio::piped())\n .stdout(std::process::Stdio::piped())\n .stderr(std::process::Stdio::piped())".to_string(); +let spawn_exec = " .spawn()?;".to_string(); +let write_block = v2_rt::concat(v2_rt::concat("{\n use std::io::Write;\n if let Some(mut stdin) = output.stdin.take() {\n stdin.write_all(".to_string(), stdin_var), ".as_bytes())?;\n }\n}".to_string()); +let wait_line = "let output = output.wait_with_output()?;".to_string(); +let check_line = "let stdout = String::from_utf8_lossy(&output.stdout).to_string();".to_string(); +let return_line = emit_exit_code_handling(op_node.clone(), inferred, source_indices.clone()); +let all_lines = v2_rt::concat(v2_rt::concat(v2_rt::concat(Rc::new(vec![cmd_line]), arg_lines), env_lines), Rc::new(vec![wd_line, spawn_line, spawn_exec, write_block, wait_line, check_line, return_line])); +all_lines.join(&"\n".to_string()) +} } else { { let output_line = " .output()?;".to_string(); - let check_line = - "let stdout = String::from_utf8_lossy(&output.stdout).to_string();".to_string(); - let return_line = - emit_exit_code_handling(op_node.clone(), inferred, source_indices.clone()); - let all_lines = v2_rt::concat( - v2_rt::concat(v2_rt::concat(Rc::new(vec![cmd_line]), arg_lines), env_lines), - Rc::new(vec![wd_line, output_line, check_line, return_line]), - ); - all_lines.join(&"\n".to_string()) - } - } - } +let check_line = "let stdout = String::from_utf8_lossy(&output.stdout).to_string();".to_string(); +let return_line = emit_exit_code_handling(op_node.clone(), inferred, source_indices.clone()); +let all_lines = v2_rt::concat(v2_rt::concat(v2_rt::concat(Rc::new(vec![cmd_line]), arg_lines), env_lines), Rc::new(vec![wd_line, output_line, check_line, return_line])); +all_lines.join(&"\n".to_string()) } - -pub fn emit_shell_argv_element( - arg: &Rc, - optional_params: Rc>, - source_indices: Rc>>, -) -> String { - match (*arg.expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { - let LiteralValue::LitStr { value: s, .. } = value.as_ref() else { - unreachable!() - }; - v2_rt::concat( - v2_rt::concat("\"".to_string(), escape_string_literal_body(s.clone())), - "\"".to_string(), - ) - } - ExprData::ExprStringInterp => { - let parts = Rc::new({ - let mut __result = Vec::new(); - for child in arg.children.clone().iter().cloned() { - __result.push(match (*child.expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { - let LiteralValue::LitStr { value: text, .. } = value.as_ref() else { - unreachable!() - }; - Rc::new(StringPart::Text { - value: text.clone(), - }) - } - _ => Rc::new(StringPart::Interpolation { - expr: arg_value(&child), - }), - }); - } - __result - }); - let fmt_segments = Rc::new({ - let mut __result = Vec::new(); - for p in parts.clone().iter().cloned() { - __result.push(match (*p.clone()).clone() { - StringPart::Text { value: v, .. } => escape_rust_interp_text(v.clone()), - StringPart::Interpolation { .. } => "{}".to_string(), - }); - } - __result - }); - let fmt_str = fmt_segments.join(&"".to_string()); - let args = Rc::new({ - let mut __result = Vec::new(); - for p in parts.clone().iter().cloned() { - __result.extend( - (*match (*p.clone()).clone() { - StringPart::Text { .. } => Rc::new(vec![]), - StringPart::Interpolation { expr: e, .. } => { - let name = expr_var_name_at(e.clone(), source_indices.clone()); - let var_name = emit_ident(name.clone(), RenderTarget::Rust); - let is_opt = (is_optional_typed_expr(e.clone()) - || match v2_rt::map_get(&optional_params, name.clone()) { - Some(_) => true, - None => false, - }); - if is_opt.clone() { - Rc::new(vec![v2_rt::concat( - var_name.clone(), - ".as_deref().unwrap_or(\"\")".to_string(), - )]) - } else { - Rc::new(vec![var_name.clone()]) - } - } - }) - .iter() - .cloned(), - ); - } - __result - }); - let args_str = args.join(&", ".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("&format!(\"".to_string(), fmt_str), - "\", ".to_string(), - ), - args_str, - ), - ")".to_string(), - ) - } - ExprData::ExprVar { .. } => { - let name = expr_var_name_at(arg.clone(), source_indices.clone()); - let var_name = emit_ident(name.clone(), RenderTarget::Rust); - let is_opt = (is_optional_typed_expr(arg.clone()) - || match v2_rt::map_get(&optional_params, name.clone()) { - Some(_) => true, - None => false, - }); - if is_opt.clone() { - v2_rt::concat( - v2_rt::concat("&".to_string(), var_name.clone()), - ".as_deref().unwrap_or(\"\").to_string()".to_string(), - ) - } else { - v2_rt::concat( - v2_rt::concat("&".to_string(), var_name.clone()), - ".to_string()".to_string(), - ) - } } - _ => emit_simple_expr(&arg, &RenderTarget::Rust, &source_indices), - } +} } -pub fn emit_shell_return( - inferred: Rc, - source_indices: &Rc>>, -) -> String { - { - let effective = unwrap_single_field_product(inferred); - let is_product = is_product_type(effective.clone()); - let single_from = - if (is_product.clone() && ((effective.children.clone().len() as i64) == 1)) { - match effective.children.clone().first().cloned() { - Some(ch) => child_from_key(ch.clone(), source_indices.clone()), - None => None, - } +pub fn emit_shell_argv_element(arg: &Rc, optional_params: Rc>, source_indices: Rc>>) -> String { + match (*arg.expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitStr { value: s, .. } = value.as_ref() else { unreachable!() }; v2_rt::concat(v2_rt::concat("\"".to_string(), escape_string_literal_body(s.clone())), "\"".to_string()) }, + ExprData::ExprStringInterp => { + let parts = Rc::new({ let mut __result = Vec::new(); for child in arg.children.clone().iter().cloned() { __result.push(match (*child.expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitStr { value: text, .. } = value.as_ref() else { unreachable!() }; Rc::new(StringPart::Text { + value: text.clone(), +}) }, + _ => Rc::new(StringPart::Interpolation { + expr: arg_value(&child), +}), +}); } __result }); +let fmt_segments = Rc::new({ let mut __result = Vec::new(); for p in parts.clone().iter().cloned() { __result.push(match (*p.clone()).clone() { + StringPart::Text { value: v, .. } => escape_rust_interp_text(v.clone()), + StringPart::Interpolation { .. } => "{}".to_string(), +}); } __result }); +let fmt_str = fmt_segments.join(&"".to_string()); +let args = Rc::new({ let mut __result = Vec::new(); for p in parts.clone().iter().cloned() { __result.extend((*match (*p.clone()).clone() { + StringPart::Text { .. } => Rc::new(vec![]), + StringPart::Interpolation { expr: e, .. } => { + let name = expr_var_name_at(e.clone(), source_indices.clone()); +let var_name = emit_ident(name.clone(), RenderTarget::Rust); +let is_opt = (is_optional_typed_expr(e.clone()) || match v2_rt::map_get(&optional_params, name.clone()) { + Some(_) => true, + None => false, +}); +if is_opt.clone() { + Rc::new(vec![v2_rt::concat(var_name.clone(), ".as_deref().unwrap_or(\"\")".to_string())]) } else { - None - }; - match single_from { - Some(channel) => { - let is_optional = - (effective.return_cardinality.clone() == Cardinality::CardOptional); - emit_shell_channel_expr(&channel, is_optional.clone()) - } - None => { - if (is_product.clone() && ((effective.children.clone().len() as i64) > 1)) { - { - let needs_stderr = { - let mut __found = false; - for ch in effective.children.clone().iter().cloned() { - if match child_from_key(ch.clone(), source_indices.clone()) { - Some(ref __some_val) if __some_val == "stderr" => true, - _ => false, - } { - __found = true; - break; - } - } - __found - }; - let stderr_line = if needs_stderr { - "let stderr = String::from_utf8_lossy(&output.stderr).to_string();" - .to_string() - } else { - "".to_string() - }; - let field_exprs = Rc::new({ - let mut __result = Vec::new(); - for ch in effective.children.clone().iter().cloned() { - __result.push({ - let is_optional = (ch.return_cardinality.clone() - == Cardinality::CardOptional); - let channel = - match child_from_key(ch.clone(), source_indices.clone()) { - Some(c) => c.clone(), - None => "stdout".to_string(), - }; - emit_shell_channel_expr(&channel, is_optional.clone()) - }); - } - __result - }); - let lines = if (stderr_line.clone().as_str() != "".to_string().as_str()) { - v2_rt::concat(stderr_line.clone(), "\n".to_string()) - } else { - "".to_string() - }; - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(lines, "Ok((".to_string()), - field_exprs.join(&", ".to_string()), - ), - "))".to_string(), - ) - } - } else { - { - let is_optional = - (effective.return_cardinality.clone() == Cardinality::CardOptional); - emit_shell_channel_expr(&"stdout".to_string(), is_optional.clone()) - } - } + Rc::new(vec![var_name.clone()]) } +}, +}).iter().cloned()); } __result }); +let args_str = args.join(&", ".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("&format!(\"".to_string(), fmt_str), "\", ".to_string()), args_str), ")".to_string()) +}, + ExprData::ExprVar { .. } => { + let name = expr_var_name_at(arg.clone(), source_indices.clone()); +let var_name = emit_ident(name.clone(), RenderTarget::Rust); +let is_opt = (is_optional_typed_expr(arg.clone()) || match v2_rt::map_get(&optional_params, name.clone()) { + Some(_) => true, + None => false, +}); +if is_opt.clone() { + v2_rt::concat(v2_rt::concat("&".to_string(), var_name.clone()), ".as_deref().unwrap_or(\"\").to_string()".to_string()) + } else { + v2_rt::concat(v2_rt::concat("&".to_string(), var_name.clone()), ".to_string()".to_string()) } - } +}, + _ => emit_simple_expr(&arg, &RenderTarget::Rust, &source_indices), +} +} + +pub fn emit_shell_return(inferred: Rc, source_indices: &Rc>>) -> String { + { + let effective = unwrap_single_field_product(inferred); +let is_product = is_product_type(effective.clone()); +let single_from = if (is_product.clone() && ((effective.children.clone().len() as i64) == 1)) { + match effective.children.clone().first().cloned() { + Some(ch) => child_from_key(ch.clone(), source_indices.clone()), + None => None, +} + } else { + None + }; +match single_from { + Some(channel) => { + let is_optional = (effective.return_cardinality.clone() == Cardinality::CardOptional); +emit_shell_channel_expr(&channel, is_optional.clone()) +}, + None => if (is_product.clone() && ((effective.children.clone().len() as i64) > 1)) { + { + let needs_stderr = { let mut __found = false; for ch in effective.children.clone().iter().cloned() { if match child_from_key(ch.clone(), source_indices.clone()) { + Some(ref __some_val) if __some_val == "stderr" => true, + _ => false, +} { __found = true; break; } } __found }; +let stderr_line = if needs_stderr { + "let stderr = String::from_utf8_lossy(&output.stderr).to_string();".to_string() + } else { + "".to_string() + }; +let field_exprs = Rc::new({ let mut __result = Vec::new(); for ch in effective.children.clone().iter().cloned() { __result.push({ + let is_optional = (ch.return_cardinality.clone() == Cardinality::CardOptional); +let channel = match child_from_key(ch.clone(), source_indices.clone()) { + Some(c) => c.clone(), + None => "stdout".to_string(), +}; +emit_shell_channel_expr(&channel, is_optional.clone()) +}); } __result }); +let lines = if (stderr_line.clone().as_str() != "".to_string().as_str()) { + v2_rt::concat(stderr_line.clone(), "\n".to_string()) + } else { + "".to_string() + }; +v2_rt::concat(v2_rt::concat(v2_rt::concat(lines, "Ok((".to_string()), field_exprs.join(&", ".to_string())), "))".to_string()) +} + } else { + { + let is_optional = (effective.return_cardinality.clone() == Cardinality::CardOptional); +emit_shell_channel_expr(&"stdout".to_string(), is_optional.clone()) +} + }, +} +} } pub fn emit_shell_channel_expr(channel: &String, is_optional: bool) -> String { @@ -13317,709 +5324,252 @@ pub fn emit_shell_channel_expr(channel: &String, is_optional: bool) -> String { } } }; - if is_optional { +if is_optional { v2_rt::concat(v2_rt::concat("Some(".to_string(), base), ")".to_string()) } else { base } - } +} } pub fn unwrap_single_field_product(n: Rc) -> Rc { { let is_product = is_product_type(n.clone()); - if ((is_product && (n.ident_span.clone() == None)) - && ((n.children.clone().len() as i64) == 1)) - { +if ((is_product && (n.ident_span.clone() == None)) && ((n.children.clone().len() as i64) == 1)) { match n.children.clone().first().cloned() { - Some(field_node) => resolved_type(field_node.clone()), - None => n.clone(), - } + Some(field_node) => resolved_type(field_node.clone()), + None => n.clone(), +} } else { n.clone() } - } +} } pub fn emit_file_call(op_name: String, inferred: Rc) -> String { { let effective = unwrap_single_field_product(inferred); - let is_product = is_product_type(effective.clone()); - let parse_line = if (is_product && ((effective.children.clone().len() as i64) > 1)) { +let is_product = is_product_type(effective.clone()); +let parse_line = if (is_product && ((effective.children.clone().len() as i64) > 1)) { "let parsed: serde_json::Value = serde_json::from_str(&content)?;\nOk(serde_json::from_value(parsed)?)".to_string() } else { "Ok(content)".to_string() }; - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "let path = format!(\"{}/{}\", self.base_path, \"".to_string(), - emit_ident(op_name, RenderTarget::Rust), - ), - "\");\n".to_string(), - ), - "let content = std::fs::read_to_string(&path)?;\n".to_string(), - ), - parse_line, - ) - } +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("let path = format!(\"{}/{}\", self.base_path, \"".to_string(), emit_ident(op_name, RenderTarget::Rust)), "\");\n".to_string()), "let content = std::fs::read_to_string(&path)?;\n".to_string()), parse_line) +} } pub fn emit_local_call(op_name: String) -> String { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "// Local binding -- direct function call\n".to_string(), - "Ok(".to_string(), - ), - emit_ident(op_name, RenderTarget::Rust), - ), - "())".to_string(), - ) -} - -pub fn emit_resource_def( - item: &Rc, - shared_types: Rc>, - env: &Rc, -) -> String { + v2_rt::concat(v2_rt::concat(v2_rt::concat("// Local binding -- direct function call\n".to_string(), "Ok(".to_string()), emit_ident(op_name, RenderTarget::Rust)), "())".to_string()) +} + +pub fn emit_resource_def(item: &Rc, shared_types: Rc>, env: &Rc) -> String { { let item_text = authored_name(env.clone(), item.clone()); - let cap_children = item.children.clone(); - if ((cap_children.clone().len() as i64) == 0) { - v2_rt::concat( - v2_rt::concat( - "#[derive(Debug, Clone)]\npub struct ".to_string(), - item_text, - ), - ";".to_string(), - ) +let cap_children = item.children.clone(); +if ((cap_children.clone().len() as i64) == 0) { + v2_rt::concat(v2_rt::concat("#[derive(Debug, Clone)]\npub struct ".to_string(), item_text), ";".to_string()) } else { { let depth = 0; - let cap_methods = Rc::new({ - let mut __result = Vec::new(); - for c in cap_children.clone().iter().cloned() { - __result.push(emit_capability_method(&c, &shared_types, &env)); - } - __result - }); - let methods_str = cap_methods.join(&"\n\n".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "#[async_trait::async_trait]\npub trait ".to_string(), - item_text, - ), - " {\n".to_string(), - ), - make_indent((depth + 1)), - ), - methods_str, - ), - "\n}".to_string(), - ) - } +let cap_methods = Rc::new({ let mut __result = Vec::new(); for c in cap_children.clone().iter().cloned() { __result.push(emit_capability_method(&c, &shared_types, &env)); } __result }); +let methods_str = cap_methods.join(&"\n\n".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("#[async_trait::async_trait]\npub trait ".to_string(), item_text), " {\n".to_string()), make_indent((depth + 1))), methods_str), "\n}".to_string()) +} } - } +} } -pub fn emit_capability_method( - cap_node: &Rc, - shared_types: &Rc>, - env: &Rc, -) -> String { +pub fn emit_capability_method(cap_node: &Rc, shared_types: &Rc>, env: &Rc) -> String { { - let input_params = Rc::new({ - let mut __result = Vec::new(); - for p in cap_node.params.clone().iter().cloned() { - __result.push(v2_rt::concat( - v2_rt::concat( - emit_ident( - param_node_name_at(p.clone(), env.source_indices.clone()), - RenderTarget::Rust, - ), - rust_items().param_type_sep.clone(), - ), - emit_rust_param_type( - ¶m_node_type_expr(&p), - &shared_types, - &env.source_indices.clone(), - ), - )); - } - __result - }); - let params_str = input_params.join(&", ".to_string()); - let all_params = if (params_str.clone().as_str() == "".to_string().as_str()) { + let input_params = Rc::new({ let mut __result = Vec::new(); for p in cap_node.params.clone().iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(emit_ident(param_node_name_at(p.clone(), env.source_indices.clone()), RenderTarget::Rust), rust_items().param_type_sep.clone()), emit_rust_param_type(¶m_node_type_expr(&p), &shared_types, &env.source_indices.clone()))); } __result }); +let params_str = input_params.join(&", ".to_string()); +let all_params = if (params_str.clone().as_str() == "".to_string().as_str()) { "&self".to_string() } else { v2_rt::concat("&self, ".to_string(), params_str.clone()) }; - let ret = render_rust_type( - resolved_type(cap_node.clone()), - shared_types.clone(), - env.source_indices.clone(), - ); - let items = rust_items(); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - items.async_prefix.clone(), - items.func_keyword.clone(), - ), - " ".to_string(), - ), - emit_ident( - authored_name(env.clone(), cap_node.clone()), - RenderTarget::Rust, - ), - ), - "(".to_string(), - ), - all_params, - ), - ") -> Result<".to_string(), - ), - ret, - ), - ", Box>;".to_string(), - ) - } +let ret = render_rust_type(resolved_type(cap_node.clone()), shared_types.clone(), env.source_indices.clone()); +let items = rust_items(); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(items.async_prefix.clone(), items.func_keyword.clone()), " ".to_string()), emit_ident(authored_name(env.clone(), cap_node.clone()), RenderTarget::Rust)), "(".to_string()), all_params), ") -> Result<".to_string()), ret), ", Box>;".to_string()) +} } pub fn data_value_has_cross_refs(value: &Rc) -> bool { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*value.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => true, - ExprData::ExprListLit => { - let mut __found = false; - for c in value.children.clone().iter().cloned() { - if data_value_has_cross_refs(&c) { - __found = true; - break; - } - } - __found - } - ExprData::ExprRecordLit { .. } => { - let mut __found = false; - for f in value.children.clone().iter().cloned() { - if data_value_has_cross_refs(&field_init_node_value(&f)) { - __found = true; - break; - } - } - __found - } - _ => false, - } + ExprData::ExprVar { .. } => true, + ExprData::ExprListLit => { let mut __found = false; for c in value.children.clone().iter().cloned() { if data_value_has_cross_refs(&c) { __found = true; break; } } __found }, + ExprData::ExprRecordLit { .. } => { let mut __found = false; for f in value.children.clone().iter().cloned() { if data_value_has_cross_refs(&field_init_node_value(&f)) { __found = true; break; } } __found }, + _ => false, +} }) } -pub fn emit_data_def( - name: String, - type_node: &Rc, - value: Rc, - registry: Rc>>, - scope: &Rc, - depth: i64, - shared_types: &Rc>, - emit_info: Rc, -) -> String { +pub fn emit_data_def(name: String, type_node: &Rc, value: Rc, registry: Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: Rc) -> String { { - let ty_str = render_rust_type( - type_node.clone(), - shared_types.clone(), - scope.type_env.clone().source_indices.clone(), - ); - let fn_name = to_snake(name); - let needs_rc = v2_rt::map_contains_key( - &shared_types, - authored_name_at(scope.type_env.clone().source_indices.clone(), &type_node), - ); - if is_simple_type_node( - type_node.clone(), - scope.type_env.clone().source_indices.clone(), - ) { + let ty_str = render_rust_type(type_node.clone(), shared_types.clone(), scope.type_env.clone().source_indices.clone()); +let fn_name = to_snake(name); +let needs_rc = v2_rt::map_contains_key(&shared_types, authored_name_at(scope.type_env.clone().source_indices.clone(), &type_node)); +if is_simple_type_node(type_node.clone(), scope.type_env.clone().source_indices.clone()) { { - let val_str = emit_typed_expr( - value, - registry, - &scope, - depth, - shared_types.clone(), - emit_info, - 1024, - ); - let kw = rust_items().func_keyword.clone(); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(rust_visibility_prefix(), kw), - " ".to_string(), - ), - fn_name, - ), - "() -> ".to_string(), - ), - ty_str.clone(), - ), - " { ".to_string(), - ), - val_str, - ), - " }".to_string(), - ) - } + let val_str = emit_typed_expr(value, registry, &scope, depth, shared_types.clone(), emit_info, 1024); +let kw = rust_items().func_keyword.clone(); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(rust_visibility_prefix(), kw), " ".to_string()), fn_name), "() -> ".to_string()), ty_str.clone()), " { ".to_string()), val_str), " }".to_string()) +} } else { { - let body = emit_data_def_body( - &type_node, - &value, - registry, - &scope, - depth, - shared_types.clone(), - emit_info, - &needs_rc, - ); - let kw = rust_items().func_keyword.clone(); - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(rust_visibility_prefix(), kw), " ".to_string()), fn_name), "() -> ".to_string()), ty_str.clone()), " {\n".to_string()), " thread_local! {\n".to_string()), " static CACHED: ".to_string()), ty_str.clone()), " = {\n".to_string()), body), "\n".to_string()), " };\n".to_string()), " }\n".to_string()), " CACHED.with(|c| c.clone())\n".to_string()), "}".to_string()) - } + let body = emit_data_def_body(&type_node, &value, registry, &scope, depth, shared_types.clone(), emit_info, &needs_rc); +let kw = rust_items().func_keyword.clone(); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(rust_visibility_prefix(), kw), " ".to_string()), fn_name), "() -> ".to_string()), ty_str.clone()), " {\n".to_string()), " thread_local! {\n".to_string()), " static CACHED: ".to_string()), ty_str.clone()), " = {\n".to_string()), body), "\n".to_string()), " };\n".to_string()), " }\n".to_string()), " CACHED.with(|c| c.clone())\n".to_string()), "}".to_string()) +} } - } +} } -pub fn emit_data_def_body( - type_node: &Rc, - value: &Rc, - registry: Rc>>, - scope: &Rc, - depth: i64, - shared_types: Rc>, - emit_info: Rc, - needs_rc: &bool, -) -> String { - if (has_nested_records_node( - type_node.clone(), - scope.type_env.clone().source_indices.clone(), - ) && !data_value_has_cross_refs(&value)) - { +pub fn emit_data_def_body(type_node: &Rc, value: &Rc, registry: Rc>>, scope: &Rc, depth: i64, shared_types: Rc>, emit_info: Rc, needs_rc: &bool) -> String { + if (has_nested_records_node(type_node.clone(), scope.type_env.clone().source_indices.clone()) && !data_value_has_cross_refs(&value)) { { - let json_str = - emit_data_value_json(&value, scope.type_env.clone().source_indices.clone()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - " serde_json::from_value(serde_json::json!(".to_string(), - json_str, - ), - "))\n".to_string(), - ), - " .expect(\"valid data definition\")".to_string(), - ) - } + let json_str = emit_data_value_json(&value, scope.type_env.clone().source_indices.clone()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(" serde_json::from_value(serde_json::json!(".to_string(), json_str), "))\n".to_string()), " .expect(\"valid data definition\")".to_string()) +} } else { { - let is_map = - node_is_keyed_collection(&type_node, scope.type_env.clone().source_indices.clone()); - if is_map { + let is_map = node_is_keyed_collection(&type_node, scope.type_env.clone().source_indices.clone()); +if is_map { match (*value.expr_data.clone()).clone() { - ExprData::ExprRecordLit { .. } => { - let inserts = Rc::new({ - let mut __result = Vec::new(); - for f in value.children.clone().iter().cloned() { - __result.push({ - let val_str = emit_typed_expr( - field_init_node_value(&f), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - " __m.insert(\"".to_string(), - field_init_node_name_at( - f.clone(), - scope - .type_env - .clone() - .source_indices - .clone(), - ), - ), - "\".to_string(), ".to_string(), - ), - val_str.clone(), - ), - ");".to_string(), - ) - }); - } - __result - }); - let inserts_str = inserts.join(&"\n".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - " let mut __m = HashMap::new();\n".to_string(), - inserts_str, - ), - "\n".to_string(), - ), - " Rc::new(__m)".to_string(), - ) - } - _ => { - let val_str = emit_typed_expr( - value.clone(), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - v2_rt::concat(" ".to_string(), val_str.clone()) - } - } + ExprData::ExprRecordLit { .. } => { + let inserts = Rc::new({ let mut __result = Vec::new(); for f in value.children.clone().iter().cloned() { __result.push({ + let val_str = emit_typed_expr(field_init_node_value(&f), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" __m.insert(\"".to_string(), field_init_node_name_at(f.clone(), scope.type_env.clone().source_indices.clone())), "\".to_string(), ".to_string()), val_str.clone()), ");".to_string()) +}); } __result }); +let inserts_str = inserts.join(&"\n".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(" let mut __m = HashMap::new();\n".to_string(), inserts_str), "\n".to_string()), " Rc::new(__m)".to_string()) +}, + _ => { + let val_str = emit_typed_expr(value.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +v2_rt::concat(" ".to_string(), val_str.clone()) +}, +} } else { { - let val_str = emit_typed_expr( - value.clone(), - registry.clone(), - &scope, - depth.clone(), - shared_types.clone(), - emit_info.clone(), - 1024, - ); - let is_already_wrapped = match (*value.expr_data.clone()).clone() { - ExprData::ExprRecordLit { .. } => true, - ExprData::ExprListLit => true, - _ => false, - }; - let wrap_start = if (needs_rc.clone() && !is_already_wrapped.clone()) { + let val_str = emit_typed_expr(value.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); +let is_already_wrapped = match (*value.expr_data.clone()).clone() { + ExprData::ExprRecordLit { .. } => true, + ExprData::ExprListLit => true, + _ => false, +}; +let wrap_start = if (needs_rc.clone() && !is_already_wrapped.clone()) { "Rc::new(".to_string() } else { "".to_string() }; - let wrap_end = if (needs_rc.clone() && !is_already_wrapped.clone()) { +let wrap_end = if (needs_rc.clone() && !is_already_wrapped.clone()) { ")".to_string() } else { "".to_string() }; - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(" ".to_string(), wrap_start), - val_str.clone(), - ), - wrap_end, - ) - } +v2_rt::concat(v2_rt::concat(v2_rt::concat(" ".to_string(), wrap_start), val_str.clone()), wrap_end) +} } - } +} } } -pub fn emit_test_file( - module_name: &String, - projections: Rc>>, -) -> Rc { +pub fn emit_test_file(module_name: &String, projections: Rc>>) -> Rc { { let depth = 0; - let test_fns = Rc::new({ - let mut __result = Vec::new(); - for p in projections.iter().cloned() { - __result.push(emit_operation_test(&p, (depth.clone() + 1))); - } - __result - }); - if ((test_fns.clone().len() as i64) == 0) { +let test_fns = Rc::new({ let mut __result = Vec::new(); for p in projections.iter().cloned() { __result.push(emit_operation_test(&p, (depth.clone() + 1))); } __result }); +if ((test_fns.clone().len() as i64) == 0) { Rc::new(TextFile { - path: "".to_string(), - content: "".to_string(), - }) + path: "".to_string(), + content: "".to_string(), +}) } else { { let filename = module_to_filename(module_name.clone()); - let tests_str = test_fns.clone().join(&"\n\n".to_string()); - let content = v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "// Generated tests -- do not edit.\n" - .to_string(), - "// Source module: ".to_string(), - ), - module_name.clone(), - ), - "\n\n".to_string(), - ), - "#[cfg(test)]\nmod tests {\n".to_string(), - ), - " use super::*;\n\n".to_string(), - ), - make_indent((depth.clone() + 1)), - ), - tests_str, - ), - "\n".to_string(), - ), - "}\n".to_string(), - ); - Rc::new(TextFile { - path: rust_test_file_path(module_name.clone()), - content: content, - }) - } +let tests_str = test_fns.clone().join(&"\n\n".to_string()); +let content = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("// Generated tests -- do not edit.\n".to_string(), "// Source module: ".to_string()), module_name.clone()), "\n\n".to_string()), "#[cfg(test)]\nmod tests {\n".to_string()), " use super::*;\n\n".to_string()), make_indent((depth.clone() + 1))), tests_str), "\n".to_string()), "}\n".to_string()); +Rc::new(TextFile { + path: rust_test_file_path(module_name.clone()), + content: content, +}) +} } - } +} } pub fn rust_test_signature_comment(projection: &Rc) -> String { { - let params_str = Rc::new({ - let mut __result = Vec::new(); - for p in projection.params.clone().iter().cloned() { - __result.push(v2_rt::concat( - v2_rt::concat( - param_node_name_at(p.clone(), projection.source_indices.clone()), - ": ".to_string(), - ), - emit_rust_param_type( - ¶m_node_type_expr(&p), - &v2_rt::rc_empty_map::(), - &projection.source_indices.clone(), - ), - )); - } - __result - }) - .join(&", ".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "// Signature: ".to_string(), - sanitize_service_name(projection.service_name.clone()), - ), - ".".to_string(), - ), - projection.operation_name.clone(), - ), - "(".to_string(), - ), - params_str, - ), - ") -> ".to_string(), - ), - emit_node_type( - projection.inferred.clone(), - RenderTarget::Rust, - projection.source_indices.clone(), - ), - ) - } + let params_str = Rc::new({ let mut __result = Vec::new(); for p in projection.params.clone().iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(param_node_name_at(p.clone(), projection.source_indices.clone()), ": ".to_string()), emit_rust_param_type(¶m_node_type_expr(&p), &v2_rt::rc_empty_map::(), &projection.source_indices.clone()))); } __result }).join(&", ".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("// Signature: ".to_string(), sanitize_service_name(projection.service_name.clone())), ".".to_string()), projection.operation_name.clone()), "(".to_string()), params_str), ") -> ".to_string()), emit_node_type(projection.inferred.clone(), RenderTarget::Rust, projection.source_indices.clone())) +} } pub fn emit_operation_test(projection: &Rc, depth: i64) -> String { { let test_name = rust_test_name(projection.clone()); - let struct_name = sanitize_service_name(projection.service_name.clone()); - let op_method = to_snake(projection.operation_name.clone()); - let indent = make_indent((depth + 1)); - let param_args = Rc::new({ - let mut __result = Vec::new(); - for p in projection.params.clone().iter().cloned() { - __result.push(emit_rust_default_value( - p.clone(), - projection.source_indices.clone(), - )); - } - __result - }); - let args_str = param_args.join(&", ".to_string()); - let call_args = if (args_str.clone().as_str() == "".to_string().as_str()) { +let struct_name = sanitize_service_name(projection.service_name.clone()); +let op_method = to_snake(projection.operation_name.clone()); +let indent = make_indent((depth + 1)); +let param_args = Rc::new({ let mut __result = Vec::new(); for p in projection.params.clone().iter().cloned() { __result.push(emit_rust_default_value(p.clone(), projection.source_indices.clone())); } __result }); +let args_str = param_args.join(&", ".to_string()); +let call_args = if (args_str.clone().as_str() == "".to_string().as_str()) { "".to_string() } else { args_str.clone() }; - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(rust_async_test_decorator(), "\nasync fn ".to_string()), test_name), "() {\n".to_string()), indent.clone()), rust_test_signature_comment(&projection)), "\n".to_string()), indent.clone()), "let service = ".to_string()), struct_name.clone()), "::new(crate::dry_run::DryRunMode(true));\n".to_string()), indent.clone()), "let result = service.".to_string()), emit_ident(op_method, RenderTarget::Rust)), "(".to_string()), call_args), ").await;\n".to_string()), indent.clone()), "assert!(result.is_ok(), \"".to_string()), struct_name.clone()), ".".to_string()), projection.operation_name.clone()), " should succeed in dry-run mode: {:?}\", result.err());\n".to_string()), "}".to_string()) - } +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(rust_async_test_decorator(), "\nasync fn ".to_string()), test_name), "() {\n".to_string()), indent.clone()), rust_test_signature_comment(&projection)), "\n".to_string()), indent.clone()), "let service = ".to_string()), struct_name.clone()), "::new(crate::dry_run::DryRunMode(true));\n".to_string()), indent.clone()), "let result = service.".to_string()), emit_ident(op_method, RenderTarget::Rust)), "(".to_string()), call_args), ").await;\n".to_string()), indent.clone()), "assert!(result.is_ok(), \"".to_string()), struct_name.clone()), ".".to_string()), projection.operation_name.clone()), " should succeed in dry-run mode: {:?}\", result.err());\n".to_string()), "}".to_string()) +} } -pub fn emit_rust_default_value( - param: Rc, - source_indices: Rc>>, -) -> String { +pub fn emit_rust_default_value(param: Rc, source_indices: Rc>>) -> String { { let type_name = authored_name_at(source_indices, ¶m_node_type_expr(¶m)); - match lookup_checkpoint(RenderTarget::Rust, type_name.clone()) { - Some(cp) => match cp.default_expr.clone() { - Some(expr) => expr.clone(), - None => v2_rt::concat( - v2_rt::concat( - "compile_error!(\"no test default for type: ".to_string(), - type_name.clone(), - ), - "\")".to_string(), - ), - }, - None => v2_rt::concat( - v2_rt::concat( - "compile_error!(\"no test default for type: ".to_string(), - type_name.clone(), - ), - "\")".to_string(), - ), - } - } +match lookup_checkpoint(RenderTarget::Rust, type_name.clone()) { + Some(cp) => match cp.default_expr.clone() { + Some(expr) => expr.clone(), + None => v2_rt::concat(v2_rt::concat("compile_error!(\"no test default for type: ".to_string(), type_name.clone()), "\")".to_string()), +}, + None => v2_rt::concat(v2_rt::concat("compile_error!(\"no test default for type: ".to_string(), type_name.clone()), "\")".to_string()), +} +} } -pub fn emit_mock_prop_setup( - mock_prop: &Rc, - depth: i64, - source_indices: &Rc>>, -) -> String { +pub fn emit_mock_prop_setup(mock_prop: &Rc, depth: i64, source_indices: &Rc>>) -> String { { - let body_str = emit_simple_expr( - &field_init_node_value(&mock_prop), - &RenderTarget::Rust, - &source_indices, - ); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "let ".to_string(), - field_init_node_name_at(mock_prop.clone(), source_indices.clone()), - ), - " = ".to_string(), - ), - body_str, - ), - ";".to_string(), - ) - } + let body_str = emit_simple_expr(&field_init_node_value(&mock_prop), &RenderTarget::Rust, &source_indices); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("let ".to_string(), field_init_node_name_at(mock_prop.clone(), source_indices.clone())), " = ".to_string()), body_str), ";".to_string()) +} } pub fn emit_cargo_dep(name: String, version: String, features: &Rc>) -> String { if ((features.clone().len() as i64) > 0) { { - let feat_strs = Rc::new({ - let mut __result = Vec::new(); - for f in features.clone().iter().cloned() { - __result.push(v2_rt::concat( - v2_rt::concat("\"".to_string(), f.clone()), - "\"".to_string(), - )); - } - __result - }); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(name, " = { version = \"".to_string()), - version, - ), - "\", features = [".to_string(), - ), - feat_strs.join(&", ".to_string()), - ), - "] }\n".to_string(), - ) - } + let feat_strs = Rc::new({ let mut __result = Vec::new(); for f in features.clone().iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat("\"".to_string(), f.clone()), "\"".to_string())); } __result }); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(name, " = { version = \"".to_string()), version), "\", features = [".to_string()), feat_strs.join(&", ".to_string())), "] }\n".to_string()) +} } else { - v2_rt::concat( - v2_rt::concat(v2_rt::concat(name, " = \"".to_string()), version), - "\"\n".to_string(), - ) + v2_rt::concat(v2_rt::concat(v2_rt::concat(name, " = \"".to_string()), version), "\"\n".to_string()) } } pub fn emit_cargo_toml(crate_name: String, has_services: bool) -> Rc { { - let header = v2_rt::concat( - v2_rt::concat("[package]\nname = \"".to_string(), crate_name), - "\"\nversion = \"0.1.0\"\nedition = \"2021\"\n".to_string(), - ); - let workspace = "\n[workspace]\n".to_string(); - let base_deps = Rc::new(vec![ - emit_cargo_dep( - "serde".to_string(), - "1".to_string(), - &Rc::new(vec!["derive".to_string(), "rc".to_string()]), - ), - emit_cargo_dep("serde_json".to_string(), "1".to_string(), &Rc::new(vec![])), - emit_cargo_dep("stacker".to_string(), "0.1".to_string(), &Rc::new(vec![])), - emit_cargo_dep( - "clap".to_string(), - "4".to_string(), - &Rc::new(vec!["derive".to_string()]), - ), - emit_cargo_dep("lazy_static".to_string(), "1".to_string(), &Rc::new(vec![])), - ]); - let async_deps = if has_services { - Rc::new(vec![ - emit_cargo_dep( - "tokio".to_string(), - "1".to_string(), - &Rc::new(vec!["full".to_string()]), - ), - emit_cargo_dep( - "reqwest".to_string(), - "0.12".to_string(), - &Rc::new(vec!["json".to_string()]), - ), - emit_cargo_dep( - "async-trait".to_string(), - "0.1".to_string(), - &Rc::new(vec![]), - ), - ]) + let header = v2_rt::concat(v2_rt::concat("[package]\nname = \"".to_string(), crate_name), "\"\nversion = \"0.1.0\"\nedition = \"2021\"\n".to_string()); +let workspace = "\n[workspace]\n".to_string(); +let base_deps = Rc::new(vec![emit_cargo_dep("serde".to_string(), "1".to_string(), &Rc::new(vec!["derive".to_string(), "rc".to_string()])), emit_cargo_dep("serde_json".to_string(), "1".to_string(), &Rc::new(vec![])), emit_cargo_dep("stacker".to_string(), "0.1".to_string(), &Rc::new(vec![])), emit_cargo_dep("clap".to_string(), "4".to_string(), &Rc::new(vec!["derive".to_string()])), emit_cargo_dep("lazy_static".to_string(), "1".to_string(), &Rc::new(vec![]))]); +let async_deps = if has_services { + Rc::new(vec![emit_cargo_dep("tokio".to_string(), "1".to_string(), &Rc::new(vec!["full".to_string()])), emit_cargo_dep("reqwest".to_string(), "0.12".to_string(), &Rc::new(vec!["json".to_string()])), emit_cargo_dep("async-trait".to_string(), "0.1".to_string(), &Rc::new(vec![]))]) } else { Rc::new(vec![]) }; - let all_deps = v2_rt::concat(base_deps, async_deps); - Rc::new(TextFile { - path: "Cargo.toml".to_string(), - content: v2_rt::concat( - v2_rt::concat( - v2_rt::concat(header, workspace), - "\n[dependencies]\n".to_string(), - ), - all_deps.join(&"".to_string()), - ), - }) - } +let all_deps = v2_rt::concat(base_deps, async_deps); +Rc::new(TextFile { + path: "Cargo.toml".to_string(), + content: v2_rt::concat(v2_rt::concat(v2_rt::concat(header, workspace), "\n[dependencies]\n".to_string()), all_deps.join(&"".to_string())), +}) +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -14037,119 +5587,73 @@ pub struct WorkflowFunc { pub fn extract_literal_string(expr: Rc) -> Option { match (*expr.expr_data.clone()).clone() { - ExprData::ExprLiteral { value: v, .. } => match (*v.clone()).clone() { - LiteralValue::LitStr { value: s, .. } => Some(s.clone()), - LiteralValue::LitBool { value: b, .. } => Some(if b.clone() { - "true".to_string() - } else { - "false".to_string() - }), - _ => None, - }, - _ => None, - } + ExprData::ExprLiteral { value: v, .. } => match (*v.clone()).clone() { + LiteralValue::LitStr { value: s, .. } => Some(s.clone()), + LiteralValue::LitBool { value: b, .. } => Some(if b.clone() { + "true".to_string() + } else { + "false".to_string() + }), + _ => None, +}, + _ => None, +} } -pub fn resolve_param_default( - param: Rc, - registry: Rc>>, - module_items: Rc>>, - source_indices: &Rc>>, -) -> Option { +pub fn resolve_param_default(param: Rc, registry: Rc>>, module_items: Rc>>, source_indices: &Rc>>) -> Option { match param_node_default_value(¶m) { - Some(dv) => match (*dv.expr_data.clone()).clone() { - ExprData::ExprLiteral { .. } => extract_literal_string(dv.clone()), - ExprData::ExprVar { .. } => { - match lookup_item(registry, authored_name_at(source_indices.clone(), &dv)) { - Some(info) => match info.kind.clone() { - ItemKind::DataItem => match Rc::new({ - let mut __result = Vec::new(); - for i in module_items.iter().cloned() { - if (authored_name_at(source_indices.clone(), &i).as_str() - == authored_name_at(source_indices.clone(), &dv).as_str()) - { - __result.push(i); - } - } - __result - }) - .first() - .cloned() - { - Some(data_item) => match data_item.body.clone() { - Some(body) => extract_literal_string(body.clone()), - None => None, - }, - None => None, - }, - _ => None, - }, - None => None, - } - } - _ => None, - }, - None => None, - } + Some(dv) => match (*dv.expr_data.clone()).clone() { + ExprData::ExprLiteral { .. } => extract_literal_string(dv.clone()), + ExprData::ExprVar { .. } => match lookup_item(registry, authored_name_at(source_indices.clone(), &dv)) { + Some(info) => match info.kind.clone() { + ItemKind::DataItem => match Rc::new({ let mut __result = Vec::new(); for i in module_items.iter().cloned() { if (authored_name_at(source_indices.clone(), &i).as_str() == authored_name_at(source_indices.clone(), &dv).as_str()) { __result.push(i); } } __result }).first().cloned() { + Some(data_item) => match data_item.body.clone() { + Some(body) => extract_literal_string(body.clone()), + None => None, +}, + None => None, +}, + _ => None, +}, + None => None, +}, + _ => None, +}, + None => None, +} } -pub fn to_workflow_func( - item: &Rc, - module_name: &String, - registry: &Rc>>, - module_items: Rc>>, - source_indices: &Rc>>, - read_only_params_index: Rc>>>, -) -> Rc { +pub fn to_workflow_func(item: &Rc, module_name: &String, registry: &Rc>>, module_items: Rc>>, source_indices: &Rc>>, read_only_params_index: Rc>>>) -> Rc { { let item_name = authored_name_at(source_indices.clone(), &item); - let svc_names = match lookup_item(registry.clone(), item_name.clone()) { - Some(info) => info.service_names.clone(), - None => Rc::new(vec![]), - }; - let defaults = item.params.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, p: Rc| match resolve_param_default( - p.clone(), - registry.clone(), - module_items.clone(), - &source_indices, - ) { - Some(lit) => v2_rt::rc_map_insert( - acc.clone(), - param_node_name_at(p.clone(), source_indices.clone()), - lit.clone(), - ), - None => acc.clone(), - }, - ); - let qualified = v2_rt::concat( - v2_rt::concat(module_name.clone(), ".".to_string()), - item_name.clone(), - ); - let ro_params = match v2_rt::map_get(&read_only_params_index, qualified) { - Some(m) => m.clone(), - None => v2_rt::rc_empty_map::(), - }; - Rc::new(WorkflowFunc { - name: item_name.clone(), - module_name: module_name.clone(), - params: item.params.clone(), - inferred: resolved_type(item.clone()), - uses: item.uses.clone(), - service_names: svc_names, - resolved_defaults: defaults, - read_only_params: ro_params, - source_indices: source_indices.clone(), - }) - } +let svc_names = match lookup_item(registry.clone(), item_name.clone()) { + Some(info) => info.service_names.clone(), + None => Rc::new(vec![]), +}; +let defaults = item.params.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, p: Rc| match resolve_param_default(p.clone(), registry.clone(), module_items.clone(), &source_indices) { + Some(lit) => v2_rt::rc_map_insert(acc.clone(), param_node_name_at(p.clone(), source_indices.clone()), lit.clone()), + None => acc.clone(), +}); +let qualified = v2_rt::concat(v2_rt::concat(module_name.clone(), ".".to_string()), item_name.clone()); +let ro_params = match v2_rt::map_get(&read_only_params_index, qualified) { + Some(m) => m.clone(), + None => v2_rt::rc_empty_map::(), +}; +Rc::new(WorkflowFunc { + name: item_name.clone(), + module_name: module_name.clone(), + params: item.params.clone(), + inferred: resolved_type(item.clone()), + uses: item.uses.clone(), + service_names: svc_names, + resolved_defaults: defaults, + read_only_params: ro_params, + source_indices: source_indices.clone(), +}) +} } -pub fn is_workflow_item( - item: &Rc, - registry: Rc>>, - source_indices: Rc>>, -) -> bool { +pub fn is_workflow_item(item: &Rc, registry: Rc>>, source_indices: Rc>>) -> bool { if (item.body.clone() == None) { false } else { @@ -14157,89 +5661,36 @@ pub fn is_workflow_item( true } else { match lookup_item(registry, authored_name_at(source_indices, &item)) { - Some(info) => { - (((info.service_names.clone().len() as i64) > 0) - || ((info.resource_names.clone().len() as i64) > 0)) - } - None => true, - } + Some(info) => (((info.service_names.clone().len() as i64) > 0) || ((info.resource_names.clone().len() as i64) > 0)), + None => true, +} } } } -pub fn collect_workflow_funcs( - modules: Rc>>, - registry: Rc>>, - read_only_params_index: Rc>>>, -) -> Rc>> { - Rc::new({ - let mut __result = Vec::new(); - for tm in modules.iter().cloned() { - __result.extend( - (*Rc::new({ - let mut __result = Vec::new(); - for item in Rc::new({ - let mut __result = Vec::new(); - for item in tm.items.clone().iter().cloned() { - if is_workflow_item( - &item, - registry.clone(), - tm.type_env.clone().source_indices.clone(), - ) { - __result.push(item); - } - } - __result - }) - .iter() - .cloned() - { - __result.push(to_workflow_func( - &item, - &authored_name_at( - tm.type_env.clone().source_indices.clone(), - &tm.module.clone(), - ), - ®istry, - tm.items.clone(), - &tm.type_env.clone().source_indices.clone(), - read_only_params_index.clone(), - )); - } - __result - })) - .iter() - .cloned(), - ); - } - __result - }) +pub fn collect_workflow_funcs(modules: Rc>>, registry: Rc>>, read_only_params_index: Rc>>>) -> Rc>> { + Rc::new({ let mut __result = Vec::new(); for tm in modules.iter().cloned() { __result.extend((*Rc::new({ let mut __result = Vec::new(); for item in Rc::new({ let mut __result = Vec::new(); for item in tm.items.clone().iter().cloned() { if is_workflow_item(&item, registry.clone(), tm.type_env.clone().source_indices.clone()) { __result.push(item); } } __result }).iter().cloned() { __result.push(to_workflow_func(&item, &authored_name_at(tm.type_env.clone().source_indices.clone(), &tm.module.clone()), ®istry, tm.items.clone(), &tm.type_env.clone().source_indices.clone(), read_only_params_index.clone())); } __result })).iter().cloned()); } __result }) } pub fn cli_default_literal_value(expr: Rc) -> Option { match (*expr.expr_data.clone()).clone() { - ExprData::ExprLiteral { value: v, .. } => match (*v.clone()).clone() { - LiteralValue::LitStr { value: s, .. } => Some(s.clone()), - LiteralValue::LitInt { value: i, .. } => Some((i.clone()).to_string()), - LiteralValue::LitFloat { value: f, .. } => Some(f.clone()), - LiteralValue::LitBool { value: b, .. } => Some(if b.clone() { - emit_keyword("true".to_string(), RenderTarget::Rust) - } else { - emit_keyword("false".to_string(), RenderTarget::Rust) - }), - LiteralValue::LitNull => None, - }, - _ => None, - } + ExprData::ExprLiteral { value: v, .. } => match (*v.clone()).clone() { + LiteralValue::LitStr { value: s, .. } => Some(s.clone()), + LiteralValue::LitInt { value: i, .. } => Some((i.clone()).to_string()), + LiteralValue::LitFloat { value: f, .. } => Some(f.clone()), + LiteralValue::LitBool { value: b, .. } => Some(if b.clone() { + emit_keyword("true".to_string(), RenderTarget::Rust) + } else { + emit_keyword("false".to_string(), RenderTarget::Rust) + }), + LiteralValue::LitNull => None, +}, + _ => None, +} } -pub fn validate_workflow_param_defaults( - workflow_funcs: Rc>>, -) -> Rc>> { - Rc::new({ - let mut __result = Vec::new(); - for wf in workflow_funcs.iter().cloned() { - __result.extend((*Rc::new({ let mut __result = Vec::new(); for param in wf.params.clone().iter().cloned() { __result.extend((*match param_node_default_value(¶m) { +pub fn validate_workflow_param_defaults(workflow_funcs: Rc>>) -> Rc>> { + Rc::new({ let mut __result = Vec::new(); for wf in workflow_funcs.iter().cloned() { __result.extend((*Rc::new({ let mut __result = Vec::new(); for param in wf.params.clone().iter().cloned() { __result.extend((*match param_node_default_value(¶m) { Some(dv) => { let param_name = authored_name_at(wf.source_indices.clone(), ¶m); let resolved = match v2_rt::map_get(&wf.resolved_defaults.clone(), param_name.clone()) { @@ -14259,617 +5710,257 @@ if resolved.clone() { } }, None => Rc::new(vec![]), -}).iter().cloned()); } __result })).iter().cloned()); - } - __result - }) +}).iter().cloned()); } __result })).iter().cloned()); } __result }) } pub fn find_resource_module(resource_name: String, modules: Rc>>) -> String { { - let matching = Rc::new({ - let mut __result = Vec::new(); - for m in modules.iter().cloned() { - if { - let mut __found = false; - for item in m.items.clone().iter().cloned() { - if (authored_name_at(m.type_env.clone().source_indices.clone(), &item) - .as_str() - == resource_name.clone().as_str()) - { - __found = true; - break; - } - } - __found - } { - __result.push(m); - } - } - __result - }); - let result = match matching.first().cloned() { - Some(tm) => module_to_filename(authored_name_at( - tm.type_env.clone().source_indices.clone(), - &tm.module.clone(), - )), - None => "".to_string(), - }; - result - } + let matching = Rc::new({ let mut __result = Vec::new(); for m in modules.iter().cloned() { if { let mut __found = false; for item in m.items.clone().iter().cloned() { if (authored_name_at(m.type_env.clone().source_indices.clone(), &item).as_str() == resource_name.clone().as_str()) { __found = true; break; } } __found } { __result.push(m); } } __result }); +let result = match matching.first().cloned() { + Some(tm) => module_to_filename(authored_name_at(tm.type_env.clone().source_indices.clone(), &tm.module.clone())), + None => "".to_string(), +}; +result +} } -pub fn emit_main_rs( - workflow_funcs: &Rc>>, - modules: &Rc>>, - has_services: &bool, - crate_name: &String, - svc_module_map: Rc>, -) -> Rc { +pub fn emit_main_rs(workflow_funcs: &Rc>>, modules: &Rc>>, has_services: &bool, crate_name: &String, svc_module_map: Rc>) -> Rc { { - let has_pipeline = { - let mut __found = false; - for m in modules.clone().iter().cloned() { - if (authored_name_at(m.type_env.clone().source_indices.clone(), &m.module.clone()) - .as_str() - == "v2.compiler.compile".to_string().as_str()) - { - __found = true; - break; - } - } - __found - }; - let resource_type_names = Rc::new({ - let mut __result = Vec::new(); - for wf in workflow_funcs.clone().iter().cloned() { - __result.extend( - (*Rc::new({ - let mut __result = Vec::new(); - for u in wf.uses.clone().iter().cloned() { - __result.push(authored_name_at( - wf.source_indices.clone(), - &resource_use_resource(&u), - )); - } - __result - })) - .iter() - .cloned(), - ); - } - __result - }); - let unique_resource_types = unique_strings(resource_type_names); - let resource_imports = Rc::new({ - let mut __result = Vec::new(); - for rname in unique_resource_types.iter().cloned() { - __result.extend( - (*{ - let mod_name = find_resource_module(rname.clone(), modules.clone()); - if (mod_name.clone().as_str() != "".to_string().as_str()) { - Rc::new(vec![v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "use ".to_string(), - crate_name.clone(), - ), - "::".to_string(), - ), - mod_name.clone(), - ), - "::".to_string(), - ), - rname.clone(), - ), - ";".to_string(), - )]) - } else { - Rc::new(vec![]) - } - }) - .iter() - .cloned(), - ); - } - __result - }); - let resource_imports_str = resource_imports.join(&"\n".to_string()); - let all_svc_names = Rc::new({ - let mut __result = Vec::new(); - for wf in workflow_funcs.clone().iter().cloned() { - __result.extend((*wf.service_names.clone()).iter().cloned()); - } - __result - }); - let unique_svc_names = unique_strings(all_svc_names); - let svc_imports = Rc::new({ - let mut __result = Vec::new(); - for sn in unique_svc_names.iter().cloned() { - __result.extend( - (*{ - let struct_name = sanitize_service_name(sn.clone()); - match v2_rt::map_get(&svc_module_map, sn.clone()) { - Some(mod_name) => Rc::new(vec![v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "use ".to_string(), - crate_name.clone(), - ), - "::".to_string(), - ), - mod_name.clone(), - ), - "::".to_string(), - ), - struct_name.clone(), - ), - ";".to_string(), - )]), - None => Rc::new(vec![]), - } - }) - .iter() - .cloned(), - ); - } - __result - }); - let svc_imports_str = svc_imports.join(&"\n".to_string()); - let header = v2_rt::concat( - v2_rt::concat( - "// Generated by v2 compiler -- do not edit.\n\n".to_string(), - "#![allow(unused_parens, clippy::all, clippy::disallowed_macros)]\n\n".to_string(), - ), - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("use clap::".to_string(), "{".to_string()), - "Parser, Subcommand".to_string(), - ), - "}".to_string(), - ), - ";\n".to_string(), - ), - ); - let crate_use = if has_services.clone() { - v2_rt::concat( - v2_rt::concat("use ".to_string(), crate_name.clone()), - "::dry_run::DryRunMode;\n".to_string(), - ) + let has_pipeline = { let mut __found = false; for m in modules.clone().iter().cloned() { if (authored_name_at(m.type_env.clone().source_indices.clone(), &m.module.clone()).as_str() == "v2.compiler.compile".to_string().as_str()) { __found = true; break; } } __found }; +let resource_type_names = Rc::new({ let mut __result = Vec::new(); for wf in workflow_funcs.clone().iter().cloned() { __result.extend((*Rc::new({ let mut __result = Vec::new(); for u in wf.uses.clone().iter().cloned() { __result.push(authored_name_at(wf.source_indices.clone(), &resource_use_resource(&u))); } __result })).iter().cloned()); } __result }); +let unique_resource_types = unique_strings(resource_type_names); +let resource_imports = Rc::new({ let mut __result = Vec::new(); for rname in unique_resource_types.iter().cloned() { __result.extend((*{ + let mod_name = find_resource_module(rname.clone(), modules.clone()); +if (mod_name.clone().as_str() != "".to_string().as_str()) { + Rc::new(vec![v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("use ".to_string(), crate_name.clone()), "::".to_string()), mod_name.clone()), "::".to_string()), rname.clone()), ";".to_string())]) + } else { + Rc::new(vec![]) + } +}).iter().cloned()); } __result }); +let resource_imports_str = resource_imports.join(&"\n".to_string()); +let all_svc_names = Rc::new({ let mut __result = Vec::new(); for wf in workflow_funcs.clone().iter().cloned() { __result.extend((*wf.service_names.clone()).iter().cloned()); } __result }); +let unique_svc_names = unique_strings(all_svc_names); +let svc_imports = Rc::new({ let mut __result = Vec::new(); for sn in unique_svc_names.iter().cloned() { __result.extend((*{ + let struct_name = sanitize_service_name(sn.clone()); +match v2_rt::map_get(&svc_module_map, sn.clone()) { + Some(mod_name) => Rc::new(vec![v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("use ".to_string(), crate_name.clone()), "::".to_string()), mod_name.clone()), "::".to_string()), struct_name.clone()), ";".to_string())]), + None => Rc::new(vec![]), +} +}).iter().cloned()); } __result }); +let svc_imports_str = svc_imports.join(&"\n".to_string()); +let header = v2_rt::concat(v2_rt::concat("// Generated by v2 compiler -- do not edit.\n\n".to_string(), "#![allow(unused_parens, clippy::all, clippy::disallowed_macros)]\n\n".to_string()), v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("use clap::".to_string(), "{".to_string()), "Parser, Subcommand".to_string()), "}".to_string()), ";\n".to_string())); +let crate_use = if has_services.clone() { + v2_rt::concat(v2_rt::concat("use ".to_string(), crate_name.clone()), "::dry_run::DryRunMode;\n".to_string()) } else { "".to_string() }; - let resource_use = if (resource_imports_str.clone().as_str() != "".to_string().as_str()) { +let resource_use = if (resource_imports_str.clone().as_str() != "".to_string().as_str()) { v2_rt::concat(resource_imports_str.clone(), "\n".to_string()) } else { "".to_string() }; - let svc_use = if (svc_imports_str.clone().as_str() != "".to_string().as_str()) { +let svc_use = if (svc_imports_str.clone().as_str() != "".to_string().as_str()) { v2_rt::concat(svc_imports_str.clone(), "\n".to_string()) } else { "".to_string() }; - let mod_uses = - emit_main_mod_uses(workflow_funcs.clone(), has_pipeline.clone(), &crate_name); - let cli_struct = emit_cli_struct(workflow_funcs.clone()); - let subcommand_enum = emit_subcommand_enum(workflow_funcs.clone(), &has_pipeline); - let pipeline_fns = if has_pipeline.clone() { +let mod_uses = emit_main_mod_uses(workflow_funcs.clone(), has_pipeline.clone(), &crate_name); +let cli_struct = emit_cli_struct(workflow_funcs.clone()); +let subcommand_enum = emit_subcommand_enum(workflow_funcs.clone(), &has_pipeline); +let pipeline_fns = if has_pipeline.clone() { emit_main_pipeline_fns(crate_name.clone()) } else { "".to_string() }; - let main_fn = emit_main_fn( - workflow_funcs.clone(), - &has_services, - &has_pipeline, - &crate_name, - ); - let diagnostic_fns = if has_pipeline.clone() { +let main_fn = emit_main_fn(workflow_funcs.clone(), &has_services, &has_pipeline, &crate_name); +let diagnostic_fns = if has_pipeline.clone() { emit_main_diagnostic_fns(crate_name.clone()) } else { "".to_string() }; - let content = v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(header, crate_use), - resource_use, - ), - svc_use, - ), - mod_uses, - ), - "\n".to_string(), - ), - cli_struct, - ), - "\n\n".to_string(), - ), - subcommand_enum, - ), - "\n\n".to_string(), - ), - pipeline_fns, - ), - main_fn, - ), - "\n".to_string(), - ), - diagnostic_fns, - ); - Rc::new(TextFile { - path: v2_rt::concat( - v2_rt::concat(rust_source_root(), "main".to_string()), - rust_source_ext(), - ), - content: content, - }) - } +let content = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(header, crate_use), resource_use), svc_use), mod_uses), "\n".to_string()), cli_struct), "\n\n".to_string()), subcommand_enum), "\n\n".to_string()), pipeline_fns), main_fn), "\n".to_string()), diagnostic_fns); +Rc::new(TextFile { + path: v2_rt::concat(v2_rt::concat(rust_source_root(), "main".to_string()), rust_source_ext()), + content: content, +}) +} } -pub fn emit_main_mod_uses( - workflow_funcs: Rc>>, - has_pipeline: bool, - crate_name: &String, -) -> String { +pub fn emit_main_mod_uses(workflow_funcs: Rc>>, has_pipeline: bool, crate_name: &String) -> String { { - let mod_names = Rc::new({ - let mut __result = Vec::new(); - for wf in workflow_funcs.iter().cloned() { - __result.push(module_to_filename(wf.module_name.clone())); - } - __result - }); - let unique_mods = unique_strings(mod_names); - let use_lines = Rc::new({ - let mut __result = Vec::new(); - for m in unique_mods.iter().cloned() { - __result.push(v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("use ".to_string(), crate_name.clone()), - "::".to_string(), - ), - m.clone(), - ), - ";".to_string(), - )); - } - __result - }); - let base = use_lines.join(&"\n".to_string()); - if has_pipeline { + let mod_names = Rc::new({ let mut __result = Vec::new(); for wf in workflow_funcs.iter().cloned() { __result.push(module_to_filename(wf.module_name.clone())); } __result }); +let unique_mods = unique_strings(mod_names); +let use_lines = Rc::new({ let mut __result = Vec::new(); for m in unique_mods.iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("use ".to_string(), crate_name.clone()), "::".to_string()), m.clone()), ";".to_string())); } __result }); +let base = use_lines.join(&"\n".to_string()); +if has_pipeline { { let pipeline_mod = module_to_filename("v2.compiler.compile".to_string()); - let artifact_mod = module_to_filename("v2.compiler.artifact".to_string()); - let core_mod = module_to_filename("v2.std.core".to_string()); - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(base, "\nuse std::collections::HashMap;\n".to_string()), "use std::rc::Rc;\n".to_string()), "use ".to_string()), crate_name.clone()), "::".to_string()), pipeline_mod.clone()), ";\n".to_string()), "use ".to_string()), crate_name.clone()), "::".to_string()), pipeline_mod.clone()), "::PipelineResult;\n".to_string()), "use ".to_string()), crate_name.clone()), "::".to_string()), artifact_mod), ";\n".to_string()), "use ".to_string()), crate_name.clone()), "::".to_string()), core_mod), "::".to_string()), "{".to_string()), "\n diagnostic_to_message, diagnostic_to_span,\n".to_string()), " byte_to_line_col, source_line_at, NewlineIndex,\n".to_string()), " CompilerDiagnostic,\n".to_string()), "}".to_string()), ";\n".to_string()), "use ".to_string()), crate_name.clone()), "::cli_run;\n".to_string()) - } +let artifact_mod = module_to_filename("v2.compiler.artifact".to_string()); +let core_mod = module_to_filename("v2.std.core".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(base, "\nuse std::collections::HashMap;\n".to_string()), "use std::rc::Rc;\n".to_string()), "use ".to_string()), crate_name.clone()), "::".to_string()), pipeline_mod.clone()), ";\n".to_string()), "use ".to_string()), crate_name.clone()), "::".to_string()), pipeline_mod.clone()), "::PipelineResult;\n".to_string()), "use ".to_string()), crate_name.clone()), "::".to_string()), artifact_mod), ";\n".to_string()), "use ".to_string()), crate_name.clone()), "::".to_string()), core_mod), "::".to_string()), "{".to_string()), "\n diagnostic_to_message, diagnostic_to_span,\n".to_string()), " byte_to_line_col, source_line_at, NewlineIndex,\n".to_string()), " CompilerDiagnostic,\n".to_string()), "}".to_string()), ";\n".to_string()), "use ".to_string()), crate_name.clone()), "::cli_run;\n".to_string()) +} } else { base } - } +} } pub fn emit_cli_struct(workflow_funcs: Rc>>) -> String { v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("#[derive(Parser)]\n".to_string(), "#[command(name = \"v2-compiled\", about = \"Generated CLI from DAG compiler\")]\n".to_string()), "struct Cli {\n".to_string()), " #[command(subcommand)]\n".to_string()), " command: Commands,\n".to_string()), " /// Run in dry-run mode (mock all service calls)\n".to_string()), " #[arg(long, global = true)]\n".to_string()), " dry_run: bool,\n".to_string()), "}".to_string()) } -pub fn emit_subcommand_enum( - workflow_funcs: Rc>>, - has_pipeline: &bool, -) -> String { +pub fn emit_subcommand_enum(workflow_funcs: Rc>>, has_pipeline: &bool) -> String { { let depth = 0; - let variants = Rc::new({ - let mut __result = Vec::new(); - for wf in workflow_funcs.iter().cloned() { - __result.push(emit_subcommand_variant(&wf, (depth.clone() + 1))); - } - __result - }); - let compile_variant = if has_pipeline.clone() { +let variants = Rc::new({ let mut __result = Vec::new(); for wf in workflow_funcs.iter().cloned() { __result.push(emit_subcommand_variant(&wf, (depth.clone() + 1))); } __result }); +let compile_variant = if has_pipeline.clone() { v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("/// Compile .dag source files to a target language\n".to_string(), make_indent((depth.clone() + 1))), "Compile {\n".to_string()), make_indent((depth.clone() + 2))), "/// Source root directories (searched recursively for .dag files).\n".to_string()), make_indent((depth.clone() + 2))), "/// Module imports are resolved transitively from these roots.\n".to_string()), make_indent((depth.clone() + 2))), "#[arg(long = \"source-root\")]\n".to_string()), make_indent((depth.clone() + 2))), "source_roots: Vec,\n".to_string()), make_indent((depth.clone() + 2))), "/// Legacy: single source directory (all .dag files loaded, no import resolution)\n".to_string()), make_indent((depth.clone() + 2))), "#[arg(long = \"source-dir\")]\n".to_string()), make_indent((depth.clone() + 2))), "source_dir: Option,\n".to_string()), make_indent((depth.clone() + 2))), "#[arg(long)]\n".to_string()), make_indent((depth.clone() + 2))), "output_dir: String,\n".to_string()), make_indent((depth.clone() + 2))), "/// Target language: rust, python, go, dag\n".to_string()), make_indent((depth.clone() + 2))), "#[arg(long, default_value = \"rust\")]\n".to_string()), make_indent((depth.clone() + 2))), "target: String,\n".to_string()), make_indent((depth.clone() + 1))), "},".to_string()) } else { "".to_string() }; - let run_variant = if has_pipeline.clone() { +let run_variant = if has_pipeline.clone() { v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("/// Execute a .dag program directly (interpreter)\n".to_string(), make_indent((depth.clone() + 1))), "Run {\n".to_string()), make_indent((depth.clone() + 2))), "/// Source root directories (searched recursively for .dag files)\n".to_string()), make_indent((depth.clone() + 2))), "#[arg(long = \"source-root\")]\n".to_string()), make_indent((depth.clone() + 2))), "source_roots: Vec,\n".to_string()), make_indent((depth.clone() + 2))), "/// Entry function to execute (default: \"main\")\n".to_string()), make_indent((depth.clone() + 2))), "#[arg(long, default_value = \"main\")]\n".to_string()), make_indent((depth.clone() + 2))), "function: String,\n".to_string()), make_indent((depth.clone() + 1))), "},".to_string()) } else { "".to_string() }; - let all_variants = if has_pipeline.clone() { +let all_variants = if has_pipeline.clone() { v2_rt::concat(variants, Rc::new(vec![compile_variant, run_variant])) } else { variants }; - let variants_str = all_variants.join(&"\n".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "#[derive(Subcommand)]\n".to_string(), - "enum Commands {\n".to_string(), - ), - make_indent((depth.clone() + 1)), - ), - variants_str, - ), - "\n".to_string(), - ), - "}".to_string(), - ) - } +let variants_str = all_variants.join(&"\n".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("#[derive(Subcommand)]\n".to_string(), "enum Commands {\n".to_string()), make_indent((depth.clone() + 1))), variants_str), "\n".to_string()), "}".to_string()) +} } pub fn emit_subcommand_variant(wf: &Rc, depth: i64) -> String { { let variant_name = to_pascal(wf.name.clone()); - let doc_line = v2_rt::concat( - v2_rt::concat("/// Run the ".to_string(), wf.name.clone()), - " workflow".to_string(), - ); - if ((wf.params.clone().len() as i64) == 0) { - v2_rt::concat( - v2_rt::concat(v2_rt::concat(doc_line, "\n".to_string()), variant_name), - ",".to_string(), - ) +let doc_line = v2_rt::concat(v2_rt::concat("/// Run the ".to_string(), wf.name.clone()), " workflow".to_string()); +if ((wf.params.clone().len() as i64) == 0) { + v2_rt::concat(v2_rt::concat(v2_rt::concat(doc_line, "\n".to_string()), variant_name), ",".to_string()) } else { { - let fields = Rc::new({ - let mut __result = Vec::new(); - for p in wf.params.clone().iter().cloned() { - __result.push(emit_subcommand_field( - &p, - &wf.source_indices.clone(), - wf.resolved_defaults.clone(), - )); - } - __result - }); - let fields_str = fields.join(&"\n".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(doc_line, "\n".to_string()), - variant_name, - ), - " {\n".to_string(), - ), - make_indent((depth + 1)), - ), - fields_str, - ), - "\n".to_string(), - ), - "},".to_string(), - ) - } + let fields = Rc::new({ let mut __result = Vec::new(); for p in wf.params.clone().iter().cloned() { __result.push(emit_subcommand_field(&p, &wf.source_indices.clone(), wf.resolved_defaults.clone())); } __result }); +let fields_str = fields.join(&"\n".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(doc_line, "\n".to_string()), variant_name), " {\n".to_string()), make_indent((depth + 1))), fields_str), "\n".to_string()), "},".to_string()) +} } - } +} } -pub fn emit_subcommand_field( - param: &Rc, - source_indices: &Rc>>, - resolved_defaults: Rc>, -) -> String { +pub fn emit_subcommand_field(param: &Rc, source_indices: &Rc>>, resolved_defaults: Rc>) -> String { { - let field_name = emit_ident( - param_node_name_at(param.clone(), source_indices.clone()), - RenderTarget::Rust, - ); - let param_name = param_node_name_at(param.clone(), source_indices.clone()); - let field_type = - emit_cli_param_type_node(¶m_node_type_expr(¶m), source_indices.clone()); - let default_attr = match v2_rt::map_get(&resolved_defaults, param_name) { - Some(resolved) => v2_rt::concat( - v2_rt::concat( - "#[arg(long, default_value = \"".to_string(), - resolved.clone(), - ), - "\")]\n".to_string(), - ), - None => match param_node_default_value(¶m) { - Some(dv) => match cli_default_literal_value(dv.clone()) { - Some(default_value) => v2_rt::concat( - v2_rt::concat( - "#[arg(long, default_value = \"".to_string(), - default_value.clone(), - ), - "\")]\n".to_string(), - ), - None => "#[arg(long)]\n".to_string(), - }, - None => "#[arg(long)]\n".to_string(), - }, - }; - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(v2_rt::concat(default_attr, field_name), ": ".to_string()), - field_type, - ), - ",".to_string(), - ) - } + let field_name = emit_ident(param_node_name_at(param.clone(), source_indices.clone()), RenderTarget::Rust); +let param_name = param_node_name_at(param.clone(), source_indices.clone()); +let field_type = emit_cli_param_type_node(¶m_node_type_expr(¶m), source_indices.clone()); +let default_attr = match v2_rt::map_get(&resolved_defaults, param_name) { + Some(resolved) => v2_rt::concat(v2_rt::concat("#[arg(long, default_value = \"".to_string(), resolved.clone()), "\")]\n".to_string()), + None => match param_node_default_value(¶m) { + Some(dv) => match cli_default_literal_value(dv.clone()) { + Some(default_value) => v2_rt::concat(v2_rt::concat("#[arg(long, default_value = \"".to_string(), default_value.clone()), "\")]\n".to_string()), + None => "#[arg(long)]\n".to_string(), +}, + None => "#[arg(long)]\n".to_string(), +}, +}; +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(default_attr, field_name), ": ".to_string()), field_type), ",".to_string()) +} } -pub fn emit_cli_param_type_node( - n: &Rc, - source_indices: Rc>>, -) -> String { +pub fn emit_cli_param_type_node(n: &Rc, source_indices: Rc>>) -> String { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - let is_optional = (n.return_cardinality.clone() == Cardinality::CardOptional); - let has_structure = (n.connective.clone() != Connective::NoConnective); - if is_optional { - v2_rt::concat( - v2_rt::concat( - "Option<".to_string(), - emit_cli_param_type_node(&with_required_cardinality(&n), source_indices), - ), - ">".to_string(), - ) - } else { - if has_structure { - "String".to_string() + { + let is_optional = (n.return_cardinality.clone() == Cardinality::CardOptional); +let has_structure = (n.connective.clone() != Connective::NoConnective); +if is_optional { + v2_rt::concat(v2_rt::concat("Option<".to_string(), emit_cli_param_type_node(&with_required_cardinality(&n), source_indices)), ">".to_string()) } else { - if ((n.children.clone().len() as i64) == 0) { - { - let nname = authored_name_at(source_indices, &n); - let mapped = coerce_primitive_type(RenderTarget::Rust, nname.clone()); - if (mapped.clone().as_str() != nname.clone().as_str()) { - mapped.clone() - } else { - "String".to_string() - } - } - } else { + if has_structure { "String".to_string() + } else { + if ((n.children.clone().len() as i64) == 0) { + { + let nname = authored_name_at(source_indices, &n); +let mapped = coerce_primitive_type(RenderTarget::Rust, nname.clone()); +if (mapped.clone().as_str() != nname.clone().as_str()) { + mapped.clone() + } else { + "String".to_string() + } +} + } else { + "String".to_string() + } } } - } +} }) } -pub fn emit_main_fn( - workflow_funcs: Rc>>, - has_services: &bool, - has_pipeline: &bool, - crate_name: &String, -) -> String { +pub fn emit_main_fn(workflow_funcs: Rc>>, has_services: &bool, has_pipeline: &bool, crate_name: &String) -> String { { let depth = 0; - let async_attr = if has_services.clone() { +let async_attr = if has_services.clone() { "#[tokio::main]\nasync fn main() ".to_string() } else { "fn main() ".to_string() }; - let parse_line = "let cli = Cli::parse();".to_string(); - let dry_run_line = if has_services.clone() { +let parse_line = "let cli = Cli::parse();".to_string(); +let dry_run_line = if has_services.clone() { "let dry_run = DryRunMode(cli.dry_run);".to_string() } else { "".to_string() }; - let match_arms = Rc::new({ - let mut __result = Vec::new(); - for wf in workflow_funcs.iter().cloned() { - __result.push(emit_main_match_arm(&wf, &has_services)); - } - __result - }); - let compile_arm = if has_pipeline.clone() { +let match_arms = Rc::new({ let mut __result = Vec::new(); for wf in workflow_funcs.iter().cloned() { __result.push(emit_main_match_arm(&wf, &has_services)); } __result }); +let compile_arm = if has_pipeline.clone() { emit_compile_match_arm(crate_name.clone()) } else { "".to_string() }; - let run_arm = if has_pipeline.clone() { +let run_arm = if has_pipeline.clone() { emit_run_match_arm(crate_name.clone()) } else { "".to_string() }; - let all_arms = if has_pipeline.clone() { +let all_arms = if has_pipeline.clone() { v2_rt::concat(match_arms, Rc::new(vec![compile_arm, run_arm])) } else { match_arms }; - let arms_str = all_arms.join(&"\n".to_string()); - let match_block = v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "match cli.command {\n".to_string(), - make_indent((depth.clone() + 2)), - ), - arms_str, - ), - "\n }".to_string(), - ); - let result_handling = if has_services.clone() { +let arms_str = all_arms.join(&"\n".to_string()); +let match_block = v2_rt::concat(v2_rt::concat(v2_rt::concat("match cli.command {\n".to_string(), make_indent((depth.clone() + 2))), arms_str), "\n }".to_string()); +let result_handling = if has_services.clone() { match_block } else { - v2_rt::concat( - v2_rt::concat("let _result = ".to_string(), match_block), - ";".to_string(), - ) + v2_rt::concat(v2_rt::concat("let _result = ".to_string(), match_block), ";".to_string()) }; - let body_lines = if (dry_run_line.clone().as_str() == "".to_string().as_str()) { +let body_lines = if (dry_run_line.clone().as_str() == "".to_string().as_str()) { v2_rt::concat(v2_rt::concat(parse_line, "\n".to_string()), result_handling) } else { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(parse_line, "\n".to_string()), - dry_run_line.clone(), - ), - "\n".to_string(), - ), - result_handling, - ) + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(parse_line, "\n".to_string()), dry_run_line.clone()), "\n".to_string()), result_handling) }; - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(async_attr, "{\n".to_string()), - make_indent((depth.clone() + 1)), - ), - body_lines, - ), - "\n}".to_string(), - ) - } +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(async_attr, "{\n".to_string()), make_indent((depth.clone() + 1))), body_lines), "\n}".to_string()) +} } pub fn emit_compile_match_arm(crate_name: String) -> String { { let pipeline_mod = module_to_filename("v2.compiler.compile".to_string()); - let artifact_mod = module_to_filename("v2.compiler.artifact".to_string()); - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("Commands::Compile { source_roots, source_dir, output_dir, target } => {\n".to_string(), " let render_target = match target.as_str() {\n".to_string()), " \"rust\" => ".to_string()), artifact_mod.clone()), "::RenderTarget::Rust,\n".to_string()), " \"python\" => ".to_string()), artifact_mod.clone()), "::RenderTarget::Python,\n".to_string()), " \"go\" => ".to_string()), artifact_mod.clone()), "::RenderTarget::Go,\n".to_string()), " \"dag\" => ".to_string()), artifact_mod.clone()), "::RenderTarget::Dag,\n".to_string()), " other => {\n".to_string()), " eprintln!(\"unknown target: {}. supported: rust, python, go, dag\", other);\n".to_string()), " std::process::exit(1);\n".to_string()), " }\n".to_string()), " };\n".to_string()), "\n".to_string()), " let sources = if !source_roots.is_empty() {\n".to_string()), " // FF-9: Import-driven resolution from source roots\n".to_string()), " let index = build_module_index(&source_roots);\n".to_string()), " eprintln!(\"indexed {} modules from {} source roots\", index.len(), source_roots.len());\n".to_string()), "\n".to_string()), " // Entry modules: all .dag files in the FIRST source root.\n".to_string()), " // Additional roots are dependency pools resolved via imports.\n".to_string()), " // This is intentional: --source-root src/v2 --source-root dsl\n".to_string()), " // means 'compile src/v2, using dsl as a dependency pool.'\n".to_string()), " let first_root = std::path::Path::new(&source_roots[0]);\n".to_string()), " let mut entry_files = Vec::new();\n".to_string()), " if first_root.is_dir() {\n".to_string()), " let mut dag_paths = Vec::new();\n".to_string()), " collect_dag_files(first_root, &mut dag_paths);\n".to_string()), " for path in dag_paths {\n".to_string()), " let content = std::fs::read_to_string(&path)\n".to_string()), " .unwrap_or_else(|e| panic!(\"failed to read {:?}: {}\", path, e));\n".to_string()), " entry_files.push((path.to_string_lossy().to_string(), content));\n".to_string()), " }\n".to_string()), " }\n".to_string()), "\n".to_string()), " let mut seen: HashMap> = HashMap::new();\n".to_string()), " let mut entry_for_queue = Vec::new();\n".to_string()), " for (path, content) in &entry_files {\n".to_string()), " if let Some(mod_path) = extract_module_path(content) {\n".to_string()), " let source = Rc::new(".to_string()), pipeline_mod.clone()), "::SourceFile {\n".to_string()), " path: path.clone(),\n".to_string()), " content: content.clone(),\n".to_string()), " });\n".to_string()), " seen.insert(mod_path, source);\n".to_string()), " }\n".to_string()), " entry_for_queue.push((path.clone(), content.clone()));\n".to_string()), " }\n".to_string()), "\n".to_string()), " let mut resolved = resolve_transitively_with_seen(entry_for_queue, &index, seen);\n".to_string()), " for (path, content) in entry_files {\n".to_string()), " let already_there = resolved.iter().any(|s| s.path == path);\n".to_string()), " if !already_there {\n".to_string()), " resolved.push(Rc::new(".to_string()), pipeline_mod.clone()), "::SourceFile { path, content }));\n".to_string()), " }\n".to_string()), " }\n".to_string()), " eprintln!(\"resolved {} sources (transitive import closure)\", resolved.len());\n".to_string()), " resolved\n".to_string()), "\n".to_string()), " } else if let Some(dir) = source_dir {\n".to_string()), " // Legacy: flat directory scan (backward compatibility)\n".to_string()), " let mut dag_paths = Vec::new();\n".to_string()), " collect_dag_files(std::path::Path::new(&dir), &mut dag_paths);\n".to_string()), " let mut sources = Vec::new();\n".to_string()), " for path in &dag_paths {\n".to_string()), " let content = std::fs::read_to_string(path)\n".to_string()), " .unwrap_or_else(|e| panic!(\"failed to read {:?}: {}\", path, e));\n".to_string()), " let filename = path.file_name().unwrap().to_string_lossy().to_string();\n".to_string()), " sources.push(Rc::new(".to_string()), pipeline_mod.clone()), "::SourceFile {\n".to_string()), " path: filename,\n".to_string()), " content,\n".to_string()), " }));\n".to_string()), " }\n".to_string()), " eprintln!(\"compiling {} .dag files from {} (target: {})\", sources.len(), dir, target);\n".to_string()), " sources\n".to_string()), "\n".to_string()), " } else {\n".to_string()), " eprintln!(\"error: provide --source-root or --source-dir\");\n".to_string()), " std::process::exit(1);\n".to_string()), " };\n".to_string()), "\n".to_string()), " let result = ".to_string()), pipeline_mod.clone()), "::compile_sources(Rc::new(sources), render_target);\n".to_string()), "\n".to_string()), " std::fs::create_dir_all(format!(\"{}/src\", output_dir))\n".to_string()), " .unwrap_or_else(|e| panic!(\"failed to create output dir: {}\", e));\n".to_string()), " for file in result.files.iter() {\n".to_string()), " let out_path = format!(\"{}/{}\", output_dir, file.path);\n".to_string()), " if let Some(parent) = std::path::Path::new(&out_path).parent() {\n".to_string()), " std::fs::create_dir_all(parent).ok();\n".to_string()), " }\n".to_string()), " std::fs::write(&out_path, &*file.content)\n".to_string()), " .unwrap_or_else(|e| panic!(\"failed to write {}: {}\", file.path, e));\n".to_string()), " }\n".to_string()), " eprintln!(\"compiled: {} files emitted, {} diagnostics\",\n".to_string()), " result.files.len(), result.diagnostics.len());\n".to_string()), " render_diagnostics(&result);\n".to_string()), " // Complexity violations are non-blocking (analyzer limitations).\n".to_string()), " let hard_errors = result.diagnostics.iter().any(|d| {\n".to_string()), " !matches!(*d.diagnostic.clone(), CompilerDiagnostic::ComplexityUnknown { .. })\n".to_string()), " });\n".to_string()), " if hard_errors {\n".to_string()), " std::process::exit(1);\n".to_string()), " }\n".to_string()), " if result.files.is_empty() {\n".to_string()), " eprintln!(\"error: no files emitted\");\n".to_string()), " std::process::exit(1);\n".to_string()), " }\n".to_string()), " },".to_string()) - } +let artifact_mod = module_to_filename("v2.compiler.artifact".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("Commands::Compile { source_roots, source_dir, output_dir, target } => {\n".to_string(), " let render_target = match target.as_str() {\n".to_string()), " \"rust\" => ".to_string()), artifact_mod.clone()), "::RenderTarget::Rust,\n".to_string()), " \"python\" => ".to_string()), artifact_mod.clone()), "::RenderTarget::Python,\n".to_string()), " \"go\" => ".to_string()), artifact_mod.clone()), "::RenderTarget::Go,\n".to_string()), " \"dag\" => ".to_string()), artifact_mod.clone()), "::RenderTarget::Dag,\n".to_string()), " other => {\n".to_string()), " eprintln!(\"unknown target: {}. supported: rust, python, go, dag\", other);\n".to_string()), " std::process::exit(1);\n".to_string()), " }\n".to_string()), " };\n".to_string()), "\n".to_string()), " let sources = if !source_roots.is_empty() {\n".to_string()), " // FF-9: Import-driven resolution from source roots\n".to_string()), " let index = build_module_index(&source_roots);\n".to_string()), " eprintln!(\"indexed {} modules from {} source roots\", index.len(), source_roots.len());\n".to_string()), "\n".to_string()), " // Entry modules: all .dag files in the FIRST source root.\n".to_string()), " // Additional roots are dependency pools resolved via imports.\n".to_string()), " // This is intentional: --source-root src/v2 --source-root dsl\n".to_string()), " // means 'compile src/v2, using dsl as a dependency pool.'\n".to_string()), " let first_root = std::path::Path::new(&source_roots[0]);\n".to_string()), " let mut entry_files = Vec::new();\n".to_string()), " if first_root.is_dir() {\n".to_string()), " let mut dag_paths = Vec::new();\n".to_string()), " collect_dag_files(first_root, &mut dag_paths);\n".to_string()), " for path in dag_paths {\n".to_string()), " let content = std::fs::read_to_string(&path)\n".to_string()), " .unwrap_or_else(|e| panic!(\"failed to read {:?}: {}\", path, e));\n".to_string()), " entry_files.push((path.to_string_lossy().to_string(), content));\n".to_string()), " }\n".to_string()), " }\n".to_string()), "\n".to_string()), " let mut seen: HashMap> = HashMap::new();\n".to_string()), " let mut entry_for_queue = Vec::new();\n".to_string()), " for (path, content) in &entry_files {\n".to_string()), " if let Some(mod_path) = extract_module_path(content) {\n".to_string()), " let source = Rc::new(".to_string()), pipeline_mod.clone()), "::SourceFile {\n".to_string()), " path: path.clone(),\n".to_string()), " content: content.clone(),\n".to_string()), " });\n".to_string()), " seen.insert(mod_path, source);\n".to_string()), " }\n".to_string()), " entry_for_queue.push((path.clone(), content.clone()));\n".to_string()), " }\n".to_string()), "\n".to_string()), " let mut resolved = resolve_transitively_with_seen(entry_for_queue, &index, seen);\n".to_string()), " for (path, content) in entry_files {\n".to_string()), " let already_there = resolved.iter().any(|s| s.path == path);\n".to_string()), " if !already_there {\n".to_string()), " resolved.push(Rc::new(".to_string()), pipeline_mod.clone()), "::SourceFile { path, content }));\n".to_string()), " }\n".to_string()), " }\n".to_string()), " eprintln!(\"resolved {} sources (transitive import closure)\", resolved.len());\n".to_string()), " resolved\n".to_string()), "\n".to_string()), " } else if let Some(dir) = source_dir {\n".to_string()), " // Legacy: flat directory scan (backward compatibility)\n".to_string()), " let mut dag_paths = Vec::new();\n".to_string()), " collect_dag_files(std::path::Path::new(&dir), &mut dag_paths);\n".to_string()), " let mut sources = Vec::new();\n".to_string()), " for path in &dag_paths {\n".to_string()), " let content = std::fs::read_to_string(path)\n".to_string()), " .unwrap_or_else(|e| panic!(\"failed to read {:?}: {}\", path, e));\n".to_string()), " let filename = path.file_name().unwrap().to_string_lossy().to_string();\n".to_string()), " sources.push(Rc::new(".to_string()), pipeline_mod.clone()), "::SourceFile {\n".to_string()), " path: filename,\n".to_string()), " content,\n".to_string()), " }));\n".to_string()), " }\n".to_string()), " eprintln!(\"compiling {} .dag files from {} (target: {})\", sources.len(), dir, target);\n".to_string()), " sources\n".to_string()), "\n".to_string()), " } else {\n".to_string()), " eprintln!(\"error: provide --source-root or --source-dir\");\n".to_string()), " std::process::exit(1);\n".to_string()), " };\n".to_string()), "\n".to_string()), " let result = ".to_string()), pipeline_mod.clone()), "::compile_sources(Rc::new(sources), render_target);\n".to_string()), "\n".to_string()), " std::fs::create_dir_all(format!(\"{}/src\", output_dir))\n".to_string()), " .unwrap_or_else(|e| panic!(\"failed to create output dir: {}\", e));\n".to_string()), " for file in result.files.iter() {\n".to_string()), " let out_path = format!(\"{}/{}\", output_dir, file.path);\n".to_string()), " if let Some(parent) = std::path::Path::new(&out_path).parent() {\n".to_string()), " std::fs::create_dir_all(parent).ok();\n".to_string()), " }\n".to_string()), " std::fs::write(&out_path, &*file.content)\n".to_string()), " .unwrap_or_else(|e| panic!(\"failed to write {}: {}\", file.path, e));\n".to_string()), " }\n".to_string()), " eprintln!(\"compiled: {} files emitted, {} diagnostics\",\n".to_string()), " result.files.len(), result.diagnostics.len());\n".to_string()), " render_diagnostics(&result);\n".to_string()), " // Complexity violations are non-blocking (analyzer limitations).\n".to_string()), " let hard_errors = result.diagnostics.iter().any(|d| {\n".to_string()), " !matches!(*d.diagnostic.clone(), CompilerDiagnostic::ComplexityUnknown { .. })\n".to_string()), " });\n".to_string()), " if hard_errors {\n".to_string()), " std::process::exit(1);\n".to_string()), " }\n".to_string()), " if result.files.is_empty() {\n".to_string()), " eprintln!(\"error: no files emitted\");\n".to_string()), " std::process::exit(1);\n".to_string()), " }\n".to_string()), " },".to_string()) +} } pub fn emit_run_match_arm(crate_name: String) -> String { - v2_rt::concat( - v2_rt::concat( - "\n Commands::Run { source_roots, function } => {\n".to_string(), - " cli_run::handle_run(source_roots, function);\n".to_string(), - ), - " },".to_string(), - ) + v2_rt::concat(v2_rt::concat("\n Commands::Run { source_roots, function } => {\n".to_string(), " cli_run::handle_run(source_roots, function);\n".to_string()), " },".to_string()) } pub fn emit_main_pipeline_fns(crate_name: String) -> String { { let pipeline_mod = module_to_filename("v2.compiler.compile".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(emit_collect_dag_files_fn(), emit_extract_module_path_fn()), - emit_extract_import_paths_fn(), - ), - emit_build_module_index_fn(), - ), - emit_resolve_transitively_fn(&crate_name, &pipeline_mod), - ) - } +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(emit_collect_dag_files_fn(), emit_extract_module_path_fn()), emit_extract_import_paths_fn()), emit_build_module_index_fn()), emit_resolve_transitively_fn(&crate_name, &pipeline_mod)) +} } pub fn emit_collect_dag_files_fn() -> String { @@ -14895,183 +5986,96 @@ pub fn emit_resolve_transitively_fn(crate_name: &String, pipeline_mod: &String) pub fn emit_main_diagnostic_fns(crate_name: String) -> String { { let core_mod = module_to_filename("v2.std.core".to_string()); - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("\nfn render_diagnostics(result: &PipelineResult) {\n".to_string(), " if result.diagnostics.is_empty() {\n".to_string()), " return;\n".to_string()), " }\n".to_string()), "\n".to_string()), " let index_map: HashMap> = result\n".to_string()), " .newline_indices\n".to_string()), " .iter()\n".to_string()), " .map(|idx| (idx.file.clone(), idx.clone()))\n".to_string()), " .collect();\n".to_string()), "\n".to_string()), " for d in result.diagnostics.iter() {\n".to_string()), " render_one_diagnostic(d, &index_map, \"\");\n".to_string()), " }\n".to_string()), "\n".to_string()), " eprintln!(\"\\n{} error(s)\", result.diagnostics.len());\n".to_string()), "}\n".to_string()), "\n".to_string()), "fn render_one_diagnostic(\n".to_string()), " d: &".to_string()), crate_name), "::".to_string()), core_mod), "::ErrorNode,\n".to_string()), " index_map: &HashMap>,\n".to_string()), " indent: &str,\n".to_string()), ") {\n".to_string()), " let severity = \"error\";\n".to_string()), " let message = diagnostic_to_message(d.diagnostic.clone());\n".to_string()), " let span = diagnostic_to_span(d.diagnostic.clone());\n".to_string()), "\n".to_string()), " let location = if !span.file.is_empty() {\n".to_string()), " if let Some(idx) = index_map.get(&span.file) {\n".to_string()), " let lc = byte_to_line_col(idx, span.start);\n".to_string()), " format!(\"{}:{}:{}\", span.file, lc.line, lc.col)\n".to_string()), " } else {\n".to_string()), " span.file.clone()\n".to_string()), " }\n".to_string()), " } else if !d.module_name.is_empty() {\n".to_string()), " d.module_name.clone()\n".to_string()), " } else {\n".to_string()), " String::new()\n".to_string()), " };\n".to_string()), "\n".to_string()), " if location.is_empty() {\n".to_string()), " eprintln!(\"{}{}: {}\", indent, severity, message);\n".to_string()), " } else {\n".to_string()), " eprintln!(\"{}{}[{}]: {}\", indent, severity, location, message);\n".to_string()), " }\n".to_string()), "\n".to_string()), " if !span.file.is_empty() {\n".to_string()), " if let Some(idx) = index_map.get(&span.file) {\n".to_string()), " let lc = byte_to_line_col(idx, span.start);\n".to_string()), " let line_text = source_line_at(idx, lc.line);\n".to_string()), " let line_num = format!(\"{}\", lc.line);\n".to_string()), " let gutter_width = line_num.len();\n".to_string()), " eprintln!(\"{} {} |\", indent, \" \".repeat(gutter_width));\n".to_string()), " eprintln!(\"{} {} | {}\", indent, line_num, line_text);\n".to_string()), "\n".to_string()), " let span_len = std::cmp::max(1, (span.end - span.start) as usize);\n".to_string()), " let col_offset = (lc.col - 1) as usize;\n".to_string()), " eprintln!(\n".to_string()), " \"{} {} | {}{}\",\n".to_string()), " indent,\n".to_string()), " \" \".repeat(gutter_width),\n".to_string()), " \" \".repeat(col_offset),\n".to_string()), " \"^\".repeat(std::cmp::min(span_len, line_text.len().saturating_sub(col_offset)))\n".to_string()), " );\n".to_string()), " }\n".to_string()), " }\n".to_string()), "}\n".to_string()) - } +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("\nfn render_diagnostics(result: &PipelineResult) {\n".to_string(), " if result.diagnostics.is_empty() {\n".to_string()), " return;\n".to_string()), " }\n".to_string()), "\n".to_string()), " let index_map: HashMap> = result\n".to_string()), " .newline_indices\n".to_string()), " .iter()\n".to_string()), " .map(|idx| (idx.file.clone(), idx.clone()))\n".to_string()), " .collect();\n".to_string()), "\n".to_string()), " for d in result.diagnostics.iter() {\n".to_string()), " render_one_diagnostic(d, &index_map, \"\");\n".to_string()), " }\n".to_string()), "\n".to_string()), " eprintln!(\"\\n{} error(s)\", result.diagnostics.len());\n".to_string()), "}\n".to_string()), "\n".to_string()), "fn render_one_diagnostic(\n".to_string()), " d: &".to_string()), crate_name), "::".to_string()), core_mod), "::ErrorNode,\n".to_string()), " index_map: &HashMap>,\n".to_string()), " indent: &str,\n".to_string()), ") {\n".to_string()), " let severity = \"error\";\n".to_string()), " let message = diagnostic_to_message(d.diagnostic.clone());\n".to_string()), " let span = diagnostic_to_span(d.diagnostic.clone());\n".to_string()), "\n".to_string()), " let location = if !span.file.is_empty() {\n".to_string()), " if let Some(idx) = index_map.get(&span.file) {\n".to_string()), " let lc = byte_to_line_col(idx, span.start);\n".to_string()), " format!(\"{}:{}:{}\", span.file, lc.line, lc.col)\n".to_string()), " } else {\n".to_string()), " span.file.clone()\n".to_string()), " }\n".to_string()), " } else if !d.module_name.is_empty() {\n".to_string()), " d.module_name.clone()\n".to_string()), " } else {\n".to_string()), " String::new()\n".to_string()), " };\n".to_string()), "\n".to_string()), " if location.is_empty() {\n".to_string()), " eprintln!(\"{}{}: {}\", indent, severity, message);\n".to_string()), " } else {\n".to_string()), " eprintln!(\"{}{}[{}]: {}\", indent, severity, location, message);\n".to_string()), " }\n".to_string()), "\n".to_string()), " if !span.file.is_empty() {\n".to_string()), " if let Some(idx) = index_map.get(&span.file) {\n".to_string()), " let lc = byte_to_line_col(idx, span.start);\n".to_string()), " let line_text = source_line_at(idx, lc.line);\n".to_string()), " let line_num = format!(\"{}\", lc.line);\n".to_string()), " let gutter_width = line_num.len();\n".to_string()), " eprintln!(\"{} {} |\", indent, \" \".repeat(gutter_width));\n".to_string()), " eprintln!(\"{} {} | {}\", indent, line_num, line_text);\n".to_string()), "\n".to_string()), " let span_len = std::cmp::max(1, (span.end - span.start) as usize);\n".to_string()), " let col_offset = (lc.col - 1) as usize;\n".to_string()), " eprintln!(\n".to_string()), " \"{} {} | {}{}\",\n".to_string()), " indent,\n".to_string()), " \" \".repeat(gutter_width),\n".to_string()), " \" \".repeat(col_offset),\n".to_string()), " \"^\".repeat(std::cmp::min(span_len, line_text.len().saturating_sub(col_offset)))\n".to_string()), " );\n".to_string()), " }\n".to_string()), " }\n".to_string()), "}\n".to_string()) +} } pub fn emit_main_match_arm(wf: &Rc, has_services: &bool) -> String { { let variant_name = to_pascal(wf.name.clone()); - let mod_name = module_to_filename(wf.module_name.clone()); - let fn_name = emit_ident(wf.name.clone(), RenderTarget::Rust); - let await_suffix = if has_services.clone() { +let mod_name = module_to_filename(wf.module_name.clone()); +let fn_name = emit_ident(wf.name.clone(), RenderTarget::Rust); +let await_suffix = if has_services.clone() { ".await".to_string() } else { "".to_string() }; - let call_expr = if ((wf.params.clone().len() as i64) == 0) { +let call_expr = if ((wf.params.clone().len() as i64) == 0) { { let service_args = emit_main_service_args(wf.clone(), has_services.clone()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(v2_rt::concat(mod_name, "::".to_string()), fn_name), - "(".to_string(), - ), - service_args, - ), - ")".to_string(), - ), - await_suffix, - ) - } +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(mod_name, "::".to_string()), fn_name), "(".to_string()), service_args), ")".to_string()), await_suffix) +} } else { { let call_args = emit_main_call_args(&wf, has_services.clone()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(v2_rt::concat(mod_name, "::".to_string()), fn_name), - "(".to_string(), - ), - call_args, - ), - ")".to_string(), - ), - await_suffix, - ) - } +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(mod_name, "::".to_string()), fn_name), "(".to_string()), call_args), ")".to_string()), await_suffix) +} }; - let pattern = if ((wf.params.clone().len() as i64) == 0) { +let pattern = if ((wf.params.clone().len() as i64) == 0) { v2_rt::concat("Commands::".to_string(), variant_name) } else { { - let field_binds = Rc::new({ - let mut __result = Vec::new(); - for p in wf.params.clone().iter().cloned() { - __result.push(emit_ident( - param_node_name_at(p.clone(), wf.source_indices.clone()), - RenderTarget::Rust, - )); - } - __result - }); - let binds_str = field_binds.join(&", ".to_string()); - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("Commands::".to_string(), variant_name), - " { ".to_string(), - ), - binds_str, - ), - " }".to_string(), - ) - } + let field_binds = Rc::new({ let mut __result = Vec::new(); for p in wf.params.clone().iter().cloned() { __result.push(emit_ident(param_node_name_at(p.clone(), wf.source_indices.clone()), RenderTarget::Rust)); } __result }); +let binds_str = field_binds.join(&", ".to_string()); +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("Commands::".to_string(), variant_name), " { ".to_string()), binds_str), " }".to_string()) +} }; - if has_services.clone() { +if has_services.clone() { v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(pattern, " => {\n".to_string()), " match ".to_string()), call_expr), " {\n".to_string()), " Ok(value) => {\n".to_string()), " let json = serde_json::to_string_pretty(&value).unwrap_or_else(|_| format!(\"{:?}\", value));\n".to_string()), " println!(\"{}\", json);\n".to_string()), " }\n".to_string()), " Err(e) => {\n".to_string()), " eprintln!(\"Error: {}\", e);\n".to_string()), " std::process::exit(1);\n".to_string()), " }\n".to_string()), " }\n".to_string()), " }".to_string()) } else { - v2_rt::concat( - v2_rt::concat(v2_rt::concat(pattern, " => ".to_string()), call_expr), - ",".to_string(), - ) + v2_rt::concat(v2_rt::concat(v2_rt::concat(pattern, " => ".to_string()), call_expr), ",".to_string()) } - } +} } pub fn emit_main_call_args(wf: &Rc, has_services: bool) -> String { { - let param_args = Rc::new({ - let mut __result = Vec::new(); - for p in wf.params.clone().iter().cloned() { - __result.push({ - let pname = param_node_name_at(p.clone(), wf.source_indices.clone()); - let ident = emit_ident(pname.clone(), RenderTarget::Rust); - let n = param_node_type_expr(&p); - let is_borrowable = - ((v2_rt::map_contains_key(&wf.read_only_params.clone(), pname.clone()) - && ((n.params.clone().len() as i64) == 0)) - && needs_reference_node(&n, wf.source_indices.clone())); - if is_borrowable.clone() { - v2_rt::concat("&".to_string(), ident.clone()) - } else { - ident.clone() - } - }); + let param_args = Rc::new({ let mut __result = Vec::new(); for p in wf.params.clone().iter().cloned() { __result.push({ + let pname = param_node_name_at(p.clone(), wf.source_indices.clone()); +let ident = emit_ident(pname.clone(), RenderTarget::Rust); +let n = param_node_type_expr(&p); +let is_borrowable = ((v2_rt::map_contains_key(&wf.read_only_params.clone(), pname.clone()) && ((n.params.clone().len() as i64) == 0)) && needs_reference_node(&n, wf.source_indices.clone())); +if is_borrowable.clone() { + v2_rt::concat("&".to_string(), ident.clone()) + } else { + ident.clone() } - __result - }); - let service_args = emit_main_service_arg_list(&wf, has_services); - let all_args = v2_rt::concat(param_args, service_args); - all_args.join(&", ".to_string()) - } +}); } __result }); +let service_args = emit_main_service_arg_list(&wf, has_services); +let all_args = v2_rt::concat(param_args, service_args); +all_args.join(&", ".to_string()) +} } pub fn emit_main_service_args(wf: Rc, has_services: bool) -> String { { let service_args = emit_main_service_arg_list(&wf, has_services); - service_args.join(&", ".to_string()) - } +service_args.join(&", ".to_string()) +} } pub fn emit_main_service_arg_list(wf: &Rc, has_services: bool) -> Rc> { { let sharing = language_spec(RenderTarget::Rust).sharing.clone(); - let resource_args = Rc::new({ - let mut __result = Vec::new(); - for u in wf.uses.clone().iter().cloned() { - __result.push(v2_rt::concat( - "&".to_string(), - authored_name_at(wf.source_indices.clone(), &resource_use_resource(&u)), - )); - } - __result - }); - let svc_args = Rc::new({ - let mut __result = Vec::new(); - for sn in wf.service_names.clone().iter().cloned() { - __result.push({ - let struct_name = sanitize_service_name(sn.clone()); - if has_services.clone() { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("&".to_string(), struct_name.clone()), - "::new(".to_string(), - ), - apply_type_template1( - sharing.clone_value.clone(), - "dry_run".to_string(), - ), - ), - ")".to_string(), - ) - } else { - v2_rt::concat( - v2_rt::concat("&".to_string(), struct_name.clone()), - "::new()".to_string(), - ) - } - }); +let resource_args = Rc::new({ let mut __result = Vec::new(); for u in wf.uses.clone().iter().cloned() { __result.push(v2_rt::concat("&".to_string(), authored_name_at(wf.source_indices.clone(), &resource_use_resource(&u)))); } __result }); +let svc_args = Rc::new({ let mut __result = Vec::new(); for sn in wf.service_names.clone().iter().cloned() { __result.push({ + let struct_name = sanitize_service_name(sn.clone()); +if has_services.clone() { + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("&".to_string(), struct_name.clone()), "::new(".to_string()), apply_type_template1(sharing.clone_value.clone(), "dry_run".to_string())), ")".to_string()) + } else { + v2_rt::concat(v2_rt::concat("&".to_string(), struct_name.clone()), "::new()".to_string()) } - __result - }); - v2_rt::concat(resource_args, svc_args) - } +}); } __result }); +v2_rt::concat(resource_args, svc_args) +} } pub fn emit_dry_run_module() -> Rc { { let content = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("// Generated by v2 compiler -- do not edit.\n".to_string(), "//\n".to_string()), "// Dry-run support: when DryRunMode(true), service methods return\n".to_string()), "// mock data instead of performing real I/O.\n\n".to_string()), "#[derive(Debug, Clone)]\n".to_string()), "pub struct DryRunMode(pub bool);\n\n".to_string()), "impl DryRunMode {\n".to_string()), " pub fn is_dry_run(&self) -> bool {\n".to_string()), " self.0\n".to_string()), " }\n".to_string()), "}\n\n".to_string()), "impl Default for DryRunMode {\n".to_string()), " fn default() -> Self {\n".to_string()), " DryRunMode(false)\n".to_string()), " }\n".to_string()), "}\n".to_string()); - Rc::new(TextFile { - path: v2_rt::concat( - v2_rt::concat(rust_source_root(), "dry_run".to_string()), - rust_source_ext(), - ), - content: content, - }) - } +Rc::new(TextFile { + path: v2_rt::concat(v2_rt::concat(rust_source_root(), "dry_run".to_string()), rust_source_ext()), + content: content, +}) +} } diff --git a/src/v2/stage0/src/v2_compiler_infer.rs b/src/v2/stage0/src/v2_compiler_infer.rs index cd823a0e656..da2b7a9a5bc 100644 --- a/src/v2/stage0/src/v2_compiler_infer.rs +++ b/src/v2/stage0/src/v2_compiler_infer.rs @@ -1,143 +1,56 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.infer -use self::SizeExpr::*; -pub use crate::std_algebra::CollectionSizeEffect; -use crate::std_algebra::CollectionSizeEffect::ShrinkEffect; -pub use crate::std_coercion::{dag_can_cast, is_dag_cast_domain_type}; -use crate::std_induction::RecursionShape::{ - DirectRecursion, ListRecursion, MapValueRecursion, OptionalRecursion, SetRecursion, -}; -use crate::std_induction::ShrinkFactor::{ConstantShrink, ProportionalShrink, UnitShrink}; -use crate::std_induction::SubValueRelation::{ - ArithmeticDescent, IteratedSubValue, PreservedValue, StrictSubValue, SubValueUnknown, -}; -pub use crate::std_induction::{ - compose_sub_value, compose_sub_value_relations, join_sub_value, meet_sub_value, - sub_value_to_evidence, InductiveField, RecursionShape, ShrinkFactor, SubValueRelation, -}; -pub use crate::std_node::{compiler_inductive_fields, compiler_recursive_types}; -use crate::std_termination::PositiveDescentAmount::OneStep; -pub use crate::std_termination::{ - positive_descent_amount_from_positive_int, proportional_divisor_from_int_at_least_two, - PositiveDescentAmount, -}; -pub use crate::std_types::{container_param_name, SourceSpan}; -pub use crate::v2_compiler_infer_access::{ - check_index_access_node, check_slice_access_node, AccessCheckResultNode, -}; -pub use crate::v2_compiler_infer_cycle::detect_type_cycles_kahn; -use crate::v2_compiler_infer_emit_info::TypeRepr::{EnumRepr, StructRepr}; -pub use crate::v2_compiler_infer_emit_info::{ - add_emit_item_summary, build_enum_field_summaries, build_struct_field_summaries, - derive_variant_to_enum, empty_emit_graph_info, lookup_emit_type_summary, EmitGraphInfo, - EmitInfoBuildState, TypeRepr, TypeSummary, -}; -pub use crate::v2_compiler_infer_env::{ - inductive_fields_for, inductive_fields_list_to_map, is_recursive_type, - is_recursive_type_by_name, lookup_type, lookup_type_by_name, lookup_type_for, merge_envs, - merge_inductive_fields, put_inductive_field, put_inductive_field_cross, TypeBinding, TypeEnv, -}; -use crate::v2_compiler_infer_items::ItemKind::{ - DataItem, FnItem, FuncItem, OtherItem, ServiceItem, TypeItem, -}; -pub use crate::v2_compiler_infer_items::{ - inferred_to_outputs, item_kind, variant_locals_from_items, ItemInfo, ItemKind, ResolvedGraph, - TypedGraph, TypedModule, -}; -pub use crate::v2_compiler_infer_lookup::{ - field_summary_for_type, lookup_coproduct_common_field_node, lookup_field_type_node, - lookup_func_sig, lookup_in_scope, map_key_type_in_env, map_value_type_in_env, - resolve_known_method_node, resolve_scrutinee_type_node, KnownMethodResolution, -}; -pub use crate::v2_compiler_infer_method::{ - builtin_kernel_seed_diagnostics, infer_builtin_call_type, resolve_builtin_call_type, -}; -use crate::v2_compiler_infer_patterns::PatternSubject::*; -pub use crate::v2_compiler_infer_patterns::{ - check_match_exhaustiveness, lookup_field_in_variant, lookup_result_subject, - lookup_variant_in_type, pattern_binding_type, pattern_subject_from_inferred, - pattern_subject_from_node, NodeLookupResult, PatternSubject, -}; -pub use crate::v2_compiler_infer_resolve::{ - resolve_item_types, resolve_node, ItemResult, NodeResolveResult, -}; -pub use crate::v2_compiler_infer_service::{ - check_service_field_access_node, check_service_method_call_node, collect_called_func_names, - collect_typed_service_calls, expand_transitive_services, extract_typed_service_name, - is_typed_service_call_receiver, service_op_entry, OpEntry, ServiceMethodResult, UniqueAccum, -}; -pub use crate::v2_compiler_infer_sigs::{ - resolve_func_sigs, ResolveFuncSigsResult, ResolvedFuncEnv, ResolvedFuncSig, -}; -pub use crate::v2_compiler_infer_types::{ - bare_map_node, callable_inferred, child_type_node, emit_map_has, extract_optional_inner_node, - for_each_element_type_node, infer_binop_type_node, infer_literal_node, is_fully_resolved, - make_callable_type, make_container_type, method_receiver_element_node, node_is_collection, - node_is_element_collection, node_is_keyed_collection, node_type_compatible, node_type_deps, - node_type_equals, node_type_shape, nominal_type_ref, normalize_access_type_node, - prefer_specific_type, resolve_type_variables_from_template, resolved_type, - template_return_has_variables, template_return_is_receiver_self, KernelTypeBuild, -}; -pub use crate::v2_compiler_resolve::{ModuleGraph, ResolvedImport, ResolvedModule}; +use std::collections::HashMap; +use std::rc::Rc; use crate::v2_rt; -use crate::v2_std_core::BinOp::{ - Add, And, Div, Eq, Ge, Gt, Le, Lt, Mod, Mul, Ne, NullCoalesce, Or, Sub, -}; -use crate::v2_std_core::CallSemantics::{LookupCallSemantics, PlainCallSemantics}; -use crate::v2_std_core::Cardinality::{CardOptional, Required}; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::std_types::{SourceSpan, container_param_name}; +pub use crate::std_coercion::{dag_can_cast, is_dag_cast_domain_type}; +pub use crate::v2_std_core::{Node, InternTable, intern, intern_str, authored_name_at, NewlineIndex, has_child_named, build_newline_index, module_node, module_imports, module_items, import_is_all, make_param_node, param_node_name_at, param_node_type_expr, field_node_type_expr, Connective, ExprData, make_expr_node, make_named_expr_node, make_expr_error_node, expr_var_name_at, field_access_base, field_access_field_at, expr_call_func_at, expr_method_name_at, let_binding_name_at, foreach_variable_at, lambda_param_names_at, record_lit_type_name_at, make_arg_node, make_arm_node, arm_pattern, arm_guard, arm_body, make_field_init_node, field_init_node_name_at, field_init_node_value, make_text_part_node, make_interp_part_node, map_children, arg_value, arg_name_at, has_inferred, is_compiler_error, InferredNode, Cardinality, ErrorNode, make_error_node, is_error_diagnostic, resource_use_name_at, resource_use_resource, kernel_type_set, is_kernel_type, is_child_accessor_in_model, is_tree_size_reducing, is_property_contraction, expr_has_self_call, expr_has_non_tail_self_call, DeclaredFuncSig, DeclaredFuncEnv, LiteralValue, FieldAccessStyle, FieldValueShape, FieldSummary, VarBindingKind, CallSemantics, MethodSemantics, ExprErrorKind, BinOp, UnaryOpKind, unaryop_operand, MatchPattern, StringPart, make_field_binding_node, field_binding_name_at, field_binding_pattern, let_value, let_body, lambda_body, foreach_collection, foreach_body, method_receiver, method_arg_nodes, match_scrutinee, match_arm_nodes, if_condition, if_then_branch, if_else_branch, index_base, index_expr, slice_base, slice_start, slice_end, cast_target, cast_expr, return_value, binop_left, binop_right, make_transport_node, local_transport_node, with_optional_cardinality, with_required_cardinality, no_span, make_span, unit_type, bool_type, string_type, int_type, float_type, none_type, error_type, is_container_type, container_expected_arity, default_ident_span, node_name_span, CompilerDiagnostic}; +use crate::v2_std_core::Connective::{Conj, Disj, NoConnective, Arrow}; +use crate::v2_std_core::ExprData::{NoExprData, ExprLiteral, ExprError, ExprVar, ExprFieldAccess, ExprCall, ExprMethodCall, ExprMatch, ExprIf, ExprLet, ExprRecordLit, ExprListLit, ExprBinOp, ExprUnaryOp, ExprLambda, ExprStringInterp, ExprBlock, ExprCast, ExprForEach, ExprIndex, ExprSlice, ExprReturn}; +use crate::v2_std_core::InferredNode::{Resolved, CompilerError, TypeVariable}; +use crate::v2_std_core::Cardinality::{Required, CardOptional}; use crate::v2_std_core::CompilerDiagnostic::{InternalError, VariantCollision}; -use crate::v2_std_core::Connective::{Arrow, Conj, Disj, NoConnective}; -use crate::v2_std_core::ExprData::{ - ExprBinOp, ExprBlock, ExprCall, ExprCast, ExprError, ExprFieldAccess, ExprForEach, ExprIf, - ExprIndex, ExprLambda, ExprLet, ExprListLit, ExprLiteral, ExprMatch, ExprMethodCall, - ExprRecordLit, ExprReturn, ExprSlice, ExprStringInterp, ExprUnaryOp, ExprVar, NoExprData, -}; -use crate::v2_std_core::ExprErrorKind::{InternalExprError, ParseRecoveryError, SemanticExprError}; -use crate::v2_std_core::FieldAccessStyle::{ - EnumAccessor, OptionalUnwrap, StoredField, TupleFirst, TupleSecond, -}; -use crate::v2_std_core::FieldValueShape::{OptionalValue, PlainValue}; -use crate::v2_std_core::InferredNode::{CompilerError, Resolved, TypeVariable}; -use crate::v2_std_core::LiteralValue::{LitBool, LitFloat, LitInt, LitNull, LitStr}; +use crate::v2_std_core::LiteralValue::{LitStr, LitInt, LitFloat, LitBool, LitNull}; +use crate::v2_std_core::FieldAccessStyle::{StoredField, EnumAccessor, OptionalUnwrap, TupleFirst, TupleSecond}; +use crate::v2_std_core::FieldValueShape::{PlainValue, OptionalValue}; +use crate::v2_std_core::VarBindingKind::{LocalValueBinding, FunctionValueBinding, VariantValueBinding, MatchBoundBinding}; +use crate::v2_std_core::CallSemantics::{PlainCallSemantics, LookupCallSemantics}; +use crate::v2_std_core::MethodSemantics::{PlainMethodSemantics, AlgebraMethodSemantics, ServiceMethodSemantics}; +use crate::v2_std_core::ExprErrorKind::{ParseRecoveryError, SemanticExprError, InternalExprError}; +use crate::v2_std_core::BinOp::{Add, Sub, Mul, Div, Mod, Eq, Ne, Lt, Gt, Le, Ge, And, Or, NullCoalesce}; +use crate::v2_std_core::UnaryOpKind::{Not, Neg}; use crate::v2_std_core::MatchPattern::{Bind, VariantPattern, Wildcard}; -use crate::v2_std_core::MethodSemantics::{ - AlgebraMethodSemantics, PlainMethodSemantics, ServiceMethodSemantics, -}; -use crate::v2_std_core::StringPart::{Interpolation, Text}; -use crate::v2_std_core::UnaryOpKind::{Neg, Not}; -use crate::v2_std_core::VarBindingKind::{ - FunctionValueBinding, LocalValueBinding, MatchBoundBinding, VariantValueBinding, -}; -pub use crate::v2_std_core::{ - arg_name_at, arg_value, arm_body, arm_guard, arm_pattern, authored_name_at, binop_left, - binop_right, bool_type, build_newline_index, cast_expr, cast_target, container_expected_arity, - default_ident_span, error_type, expr_call_func_at, expr_has_non_tail_self_call, - expr_has_self_call, expr_method_name_at, expr_var_name_at, field_access_base, - field_access_field_at, field_binding_name_at, field_binding_pattern, field_init_node_name_at, - field_init_node_value, field_node_type_expr, float_type, foreach_body, foreach_collection, - foreach_variable_at, has_child_named, has_inferred, if_condition, if_else_branch, - if_then_branch, import_is_all, index_base, index_expr, int_type, intern, intern_str, - is_child_accessor_in_model, is_compiler_error, is_container_type, is_error_diagnostic, - is_kernel_type, is_property_contraction, is_tree_size_reducing, kernel_type_set, lambda_body, - lambda_param_names_at, let_binding_name_at, let_body, let_value, local_transport_node, - make_arg_node, make_arm_node, make_error_node, make_expr_error_node, make_expr_node, - make_field_binding_node, make_field_init_node, make_interp_part_node, make_named_expr_node, - make_param_node, make_span, make_text_part_node, make_transport_node, map_children, - match_arm_nodes, match_scrutinee, method_arg_nodes, method_receiver, module_imports, - module_items, module_node, no_span, node_name_span, none_type, param_node_name_at, - param_node_type_expr, record_lit_type_name_at, resource_use_name_at, resource_use_resource, - return_value, slice_base, slice_end, slice_start, string_type, unaryop_operand, unit_type, - with_optional_cardinality, with_required_cardinality, BinOp, CallSemantics, Cardinality, - CompilerDiagnostic, Connective, DeclaredFuncEnv, DeclaredFuncSig, ErrorNode, ExprData, - ExprErrorKind, FieldAccessStyle, FieldSummary, FieldValueShape, InferredNode, InternTable, - LiteralValue, MatchPattern, MethodSemantics, NewlineIndex, Node, StringPart, UnaryOpKind, - VarBindingKind, -}; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; -use std::collections::HashMap; -use std::rc::Rc; +use crate::v2_std_core::StringPart::{Text, Interpolation}; +pub use crate::v2_compiler_resolve::{ModuleGraph, ResolvedModule, ResolvedImport}; +pub use crate::v2_compiler_infer_types::{nominal_type_ref, make_container_type, make_callable_type, KernelTypeBuild, node_is_keyed_collection, node_is_element_collection, node_is_collection, is_fully_resolved, resolve_type_variables_from_template, template_return_has_variables, template_return_is_receiver_self, bare_map_node, callable_inferred, normalize_access_type_node, node_type_shape, node_type_compatible, node_type_equals, prefer_specific_type, node_type_deps, method_receiver_element_node, infer_literal_node, infer_binop_type_node, extract_optional_inner_node, for_each_element_type_node, resolved_type, child_type_node, emit_map_has}; +pub use crate::v2_compiler_infer_method::{builtin_kernel_seed_diagnostics, infer_builtin_call_type, resolve_builtin_call_type}; +pub use crate::v2_compiler_infer_cycle::{detect_type_cycles_kahn}; +pub use crate::v2_compiler_infer_env::{TypeEnv, TypeBinding, is_recursive_type, is_recursive_type_by_name, lookup_type, lookup_type_by_name, lookup_type_for, merge_envs, put_inductive_field, put_inductive_field_cross, merge_inductive_fields, inductive_fields_for, inductive_fields_list_to_map}; +pub use crate::std_node::{compiler_inductive_fields, compiler_recursive_types}; +pub use crate::std_induction::{InductiveField, RecursionShape, SubValueRelation, ShrinkFactor, sub_value_to_evidence, meet_sub_value, join_sub_value, compose_sub_value, compose_sub_value_relations}; +use crate::std_induction::RecursionShape::{DirectRecursion, ListRecursion, OptionalRecursion, SetRecursion, MapValueRecursion}; +use crate::std_induction::SubValueRelation::{StrictSubValue, IteratedSubValue, ArithmeticDescent, PreservedValue, SubValueUnknown}; +use crate::std_induction::ShrinkFactor::{UnitShrink, ConstantShrink, ProportionalShrink}; +pub use crate::std_termination::{positive_descent_amount_from_positive_int, proportional_divisor_from_int_at_least_two, PositiveDescentAmount}; +use crate::std_termination::PositiveDescentAmount::{OneStep}; +pub use crate::std_algebra::{CollectionSizeEffect}; +use crate::std_algebra::CollectionSizeEffect::{ShrinkEffect}; +pub use crate::v2_compiler_infer_resolve::{resolve_node, resolve_item_types, NodeResolveResult, ItemResult}; +pub use crate::v2_compiler_infer_sigs::{ResolvedFuncSig, ResolvedFuncEnv, ResolveFuncSigsResult, resolve_func_sigs}; +pub use crate::v2_compiler_infer_emit_info::{TypeRepr, TypeSummary, EmitGraphInfo, EmitInfoBuildState, empty_emit_graph_info, lookup_emit_type_summary, build_struct_field_summaries, build_enum_field_summaries, add_emit_item_summary, derive_variant_to_enum}; +use crate::v2_compiler_infer_emit_info::TypeRepr::{StructRepr, EnumRepr}; +pub use crate::v2_compiler_infer_items::{ItemKind, ItemInfo, TypedModule, TypedGraph, ResolvedGraph, inferred_to_outputs, item_kind, variant_locals_from_items}; +use crate::v2_compiler_infer_items::ItemKind::{FnItem, FuncItem, TypeItem, DataItem, ServiceItem, OtherItem}; +pub use crate::v2_compiler_infer_service::{UniqueAccum, OpEntry, ServiceMethodResult, is_typed_service_call_receiver, extract_typed_service_name, collect_typed_service_calls, collect_called_func_names, expand_transitive_services, check_service_field_access_node, check_service_method_call_node, service_op_entry}; +pub use crate::v2_compiler_infer_patterns::{NodeLookupResult, PatternSubject, lookup_variant_in_type, lookup_field_in_variant, pattern_subject_from_inferred, pattern_subject_from_node, lookup_result_subject, pattern_binding_type, check_match_exhaustiveness}; +use crate::v2_compiler_infer_patterns::PatternSubject::*; +pub use crate::v2_compiler_infer_lookup::{KnownMethodResolution, resolve_known_method_node, resolve_scrutinee_type_node, field_summary_for_type, lookup_field_type_node, lookup_coproduct_common_field_node, map_value_type_in_env, map_key_type_in_env, lookup_in_scope, lookup_func_sig}; +pub use crate::v2_compiler_infer_access::{AccessCheckResultNode, check_index_access_node, check_slice_access_node}; +use self::SizeExpr::*; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] pub struct ItemContribution { @@ -191,57 +104,43 @@ pub struct BlockInferState { pub typed_stmts: Rc>>, } -pub fn infer_block_stmts( - mut remaining: Rc>>, - mut remaining_count: i64, - mut scope: Rc, - mut typed_stmts: Rc>>, - mut diag_chunks: Rc>>>>, - mut last_type: Rc, - mut expected: Option>, -) -> Rc { +pub fn infer_block_stmts(mut remaining: Rc>>, mut remaining_count: i64, mut scope: Rc, mut typed_stmts: Rc>>, mut diag_chunks: Rc>>>>, mut last_type: Rc, mut expected: Option>) -> Rc { loop { match remaining.clone().first().cloned() { - None => { - break Rc::new(BlockInferState { - scope: scope.clone(), - diag_chunks: diag_chunks, - last_type: last_type, - typed_stmts: typed_stmts, - }); - } - Some(stmt) => { - let is_last = (remaining_count.clone() == 1); - let stmt_expected = if is_last { expected.clone() } else { None }; - let stmt_result = infer_expr(&stmt, &scope, &stmt_expected); - let stmt_typed = stmt_result.typed.clone(); - let stmt_diags = stmt_result.diagnostics.clone(); - let stmt_rt = resolved_type(stmt_typed.clone()); - let next_scope = scope_after_stmt_node(&stmt, stmt_rt.clone(), &scope); - { - let __tco_0 = Rc::new( - remaining - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ); - let __tco_1 = (remaining_count - 1); - let __tco_2 = next_scope; - let __tco_3 = v2_rt::rc_list_push(typed_stmts, stmt_typed.clone()); - let __tco_4 = v2_rt::rc_list_push(diag_chunks, stmt_diags); - let __tco_5 = stmt_rt.clone(); - remaining = __tco_0; - remaining_count = __tco_1; - scope = __tco_2; - typed_stmts = __tco_3; - diag_chunks = __tco_4; - last_type = __tco_5; - continue; - } - } - } - } + None => { break Rc::new(BlockInferState { + scope: scope.clone(), + diag_chunks: diag_chunks, + last_type: last_type, + typed_stmts: typed_stmts, +}); }, + Some(stmt) => { let is_last = (remaining_count.clone() == 1); +let stmt_expected = if is_last { + expected.clone() + } else { + None + }; +let stmt_result = infer_expr(&stmt, &scope, &stmt_expected); +let stmt_typed = stmt_result.typed.clone(); +let stmt_diags = stmt_result.diagnostics.clone(); +let stmt_rt = resolved_type(stmt_typed.clone()); +let next_scope = scope_after_stmt_node(&stmt, stmt_rt.clone(), &scope); +{ + let __tco_0 = Rc::new(remaining.iter().cloned().skip(1 as usize).collect::>()); +let __tco_1 = (remaining_count - 1); +let __tco_2 = next_scope; +let __tco_3 = v2_rt::rc_list_push(typed_stmts, stmt_typed.clone()); +let __tco_4 = v2_rt::rc_list_push(diag_chunks, stmt_diags); +let __tco_5 = stmt_rt.clone(); +remaining = __tco_0; +remaining_count = __tco_1; +scope = __tco_2; +typed_stmts = __tco_3; +diag_chunks = __tco_4; +last_type = __tco_5; +continue; +} }, +} +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -323,163 +222,81 @@ pub struct LocalContributionState { pub diag_chunks: Rc>>>>, } -pub fn merge_scope_from_imports( - mut remaining: Rc>>, - mut parent_index: Rc>>, - mut env: Rc, - mut func_sigs: Rc>>, - mut svc_registry: Rc>>>>, - mut svc_locals: Rc>>, -) -> Rc { +pub fn merge_scope_from_imports(mut remaining: Rc>>, mut parent_index: Rc>>, mut env: Rc, mut func_sigs: Rc>>, mut svc_registry: Rc>>>>, mut svc_locals: Rc>>) -> Rc { loop { match remaining.clone().first().cloned() { - None => { - break Rc::new(InferScopeComponents { - func_sigs: func_sigs, - svc_registry: svc_registry, - svc_locals: svc_locals, - }); + None => { break Rc::new(InferScopeComponents { + func_sigs: func_sigs, + svc_registry: svc_registry, + svc_locals: svc_locals, +}); }, + Some(imp) => { match v2_rt::map_get(&parent_index, imp.module_path.clone()) { + Some(typed_parent) => { let next_func_sigs = Rc::new(v2_rt::map_values(&typed_parent.func_env.clone().signatures.clone())).iter().cloned().fold(func_sigs, |acc: Rc>>, rsig: Rc| { + let sig_key = rsig.name.clone(); +let sig_params = rsig.params.clone(); +let sig_rt = rsig.inferred.clone(); +let sig_async = rsig.is_async.clone(); +v2_rt::rc_map_insert(acc, sig_key.clone(), Rc::new(DeclaredFuncSig { + name: sig_key.clone(), + params: sig_params.clone(), + inferred: Some(sig_rt.clone()), + is_async: sig_async.clone(), + output_provenance: rsig.output_provenance.clone(), + variant_provenance: rsig.variant_provenance.clone(), +})) +}); +let parent_result = typed_parent.items.clone().iter().cloned().fold(Rc::new(InferScopeComponents { + func_sigs: next_func_sigs, + svc_registry: svc_registry, + svc_locals: svc_locals, +}), |acc: Rc, titem: Rc| if ((titem.transport.clone() != None) && ((titem.children.clone().len() as i64) > 0)) { + { + let entries = Rc::new({ let mut __result = Vec::new(); for c in titem.children.clone().iter().cloned() { __result.push(Rc::new(OpEntry { + name: authored_name_at(env.source_indices.clone(), &c), + outputs: inferred_to_outputs(&c.inferred.clone(), c.span.clone(), env.source_indices.clone()), + params: c.params.clone(), +})); } __result }); +let root = namespace_root_from_properties(titem.properties.clone(), authored_name_at(env.source_indices.clone(), &titem), env.source_indices.clone()); +Rc::new(InferScopeComponents { + func_sigs: acc.func_sigs.clone(), + svc_registry: v2_rt::rc_map_insert(acc.svc_registry.clone(), authored_name_at(env.source_indices.clone(), &titem), entries.clone()), + svc_locals: v2_rt::rc_map_insert(acc.svc_locals.clone(), root.clone(), nominal_type_binding(&root)), +}) +} + } else { + if (((((titem.body.clone() != None) && ((titem.params.clone().len() as i64) == 0)) && (titem.transport.clone() == None)) && (titem.connective.clone() == Connective::NoConnective)) && (titem.inferred.clone() != None)) { + Rc::new(InferScopeComponents { + func_sigs: acc.func_sigs.clone(), + svc_registry: acc.svc_registry.clone(), + svc_locals: v2_rt::rc_map_insert(acc.svc_locals.clone(), authored_name_at(env.source_indices.clone(), &titem), Rc::new(TypeBinding { + name: authored_name_at(env.source_indices.clone(), &titem), + resolved: resolved_type(titem.clone()), + provenance: Rc::new(SubValueRelation::SubValueUnknown), +})), +}) + } else { + acc.clone() } - Some(imp) => match v2_rt::map_get(&parent_index, imp.module_path.clone()) { - Some(typed_parent) => { - let next_func_sigs = Rc::new(v2_rt::map_values( - &typed_parent.func_env.clone().signatures.clone(), - )) - .iter() - .cloned() - .fold( - func_sigs, - |acc: Rc>>, - rsig: Rc| { - let sig_key = rsig.name.clone(); - let sig_params = rsig.params.clone(); - let sig_rt = rsig.inferred.clone(); - let sig_async = rsig.is_async.clone(); - v2_rt::rc_map_insert( - acc, - sig_key.clone(), - Rc::new(DeclaredFuncSig { - name: sig_key.clone(), - params: sig_params.clone(), - inferred: Some(sig_rt.clone()), - is_async: sig_async.clone(), - output_provenance: rsig.output_provenance.clone(), - variant_provenance: rsig.variant_provenance.clone(), - }), - ) - }, - ); - let parent_result = typed_parent.items.clone().iter().cloned().fold( - Rc::new(InferScopeComponents { - func_sigs: next_func_sigs, - svc_registry: svc_registry, - svc_locals: svc_locals, - }), - |acc: Rc, titem: Rc| { - if ((titem.transport.clone() != None) - && ((titem.children.clone().len() as i64) > 0)) - { - { - let entries = Rc::new({ - let mut __result = Vec::new(); - for c in titem.children.clone().iter().cloned() { - __result.push(Rc::new(OpEntry { - name: authored_name_at( - env.source_indices.clone(), - &c, - ), - outputs: inferred_to_outputs( - &c.inferred.clone(), - c.span.clone(), - env.source_indices.clone(), - ), - params: c.params.clone(), - })); - } - __result - }); - let root = namespace_root_from_properties( - titem.properties.clone(), - authored_name_at(env.source_indices.clone(), &titem), - env.source_indices.clone(), - ); - Rc::new(InferScopeComponents { - func_sigs: acc.func_sigs.clone(), - svc_registry: v2_rt::rc_map_insert( - acc.svc_registry.clone(), - authored_name_at(env.source_indices.clone(), &titem), - entries.clone(), - ), - svc_locals: v2_rt::rc_map_insert( - acc.svc_locals.clone(), - root.clone(), - nominal_type_binding(&root), - ), - }) - } - } else { - if (((((titem.body.clone() != None) - && ((titem.params.clone().len() as i64) == 0)) - && (titem.transport.clone() == None)) - && (titem.connective.clone() == Connective::NoConnective)) - && (titem.inferred.clone() != None)) - { - Rc::new(InferScopeComponents { - func_sigs: acc.func_sigs.clone(), - svc_registry: acc.svc_registry.clone(), - svc_locals: v2_rt::rc_map_insert( - acc.svc_locals.clone(), - authored_name_at(env.source_indices.clone(), &titem), - Rc::new(TypeBinding { - name: authored_name_at( - env.source_indices.clone(), - &titem, - ), - resolved: resolved_type(titem.clone()), - provenance: Rc::new( - SubValueRelation::SubValueUnknown, - ), - }), - ), - }) - } else { - acc.clone() - } - } - }, - ); - { - let __tco_0 = Rc::new( - remaining - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ); - let __tco_1 = parent_result.func_sigs.clone(); - let __tco_2 = parent_result.svc_registry.clone(); - let __tco_3 = parent_result.svc_locals.clone(); - remaining = __tco_0; - func_sigs = __tco_1; - svc_registry = __tco_2; - svc_locals = __tco_3; - continue; - } - } - None => { - let __tco_0 = Rc::new( - remaining - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ); - remaining = __tco_0; - continue; - } - }, - } - } + }); +{ + let __tco_0 = Rc::new(remaining.iter().cloned().skip(1 as usize).collect::>()); +let __tco_1 = parent_result.func_sigs.clone(); +let __tco_2 = parent_result.svc_registry.clone(); +let __tco_3 = parent_result.svc_locals.clone(); +remaining = __tco_0; +func_sigs = __tco_1; +svc_registry = __tco_2; +svc_locals = __tco_3; +continue; +} }, + None => { { + let __tco_0 = Rc::new(remaining.iter().cloned().skip(1 as usize).collect::>()); +remaining = __tco_0; +continue; +} }, +} }, +} +} } pub fn nominal_leaf_type(name: String) -> Rc { @@ -488,17 +305,17 @@ pub fn nominal_leaf_type(name: String) -> Rc { pub fn nominal_type_binding(name: &String) -> Rc { Rc::new(TypeBinding { - name: name.clone(), - resolved: nominal_leaf_type(name.clone()), - provenance: Rc::new(SubValueRelation::SubValueUnknown), - }) + name: name.clone(), + resolved: nominal_leaf_type(name.clone()), + provenance: Rc::new(SubValueRelation::SubValueUnknown), +}) } pub fn set_has(m: Rc>, key: String) -> bool { match v2_rt::map_get(&m, key) { - Some(_) => true, - None => false, - } + Some(_) => true, + None => false, +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -507,242 +324,147 @@ pub struct FieldRecursionResult { pub element_type: String, } -pub fn classify_field_recursion( - field_node: &Rc, - parent_name: &String, - recursive_type_set: Rc>, - source_indices: &Rc>>, -) -> Option> { +pub fn classify_field_recursion(field_node: &Rc, parent_name: &String, recursive_type_set: Rc>, source_indices: &Rc>>) -> Option> { { let type_expr = match field_node.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => rt.clone(), - _ => field_node_type_expr(&field_node), - }; - let field_type_name = authored_name_at(source_indices.clone(), &type_expr); - if (field_type_name.clone().as_str() == parent_name.clone().as_str()) { + Some(InferredNode::Resolved { node: rt, .. }) => rt.clone(), + _ => field_node_type_expr(&field_node), +}; +let field_type_name = authored_name_at(source_indices.clone(), &type_expr); +if (field_type_name.clone().as_str() == parent_name.clone().as_str()) { match field_node.return_cardinality.clone() { - Cardinality::CardOptional => Some(Rc::new(FieldRecursionResult { - shape: RecursionShape::OptionalRecursion, - element_type: parent_name.clone(), - })), - _ => Some(Rc::new(FieldRecursionResult { - shape: RecursionShape::DirectRecursion, - element_type: parent_name.clone(), - })), - } + Cardinality::CardOptional => Some(Rc::new(FieldRecursionResult { + shape: RecursionShape::OptionalRecursion, + element_type: parent_name.clone(), +})), + _ => Some(Rc::new(FieldRecursionResult { + shape: RecursionShape::DirectRecursion, + element_type: parent_name.clone(), +})), +} } else { if is_container_type(field_type_name.clone()) { { let arity = match container_expected_arity(field_type_name.clone()) { - Some(a) => a.clone(), - None => 0, - }; - let value_index = if (arity == 2) { 1 } else { 0 }; - let value_type = match type_expr - .children - .clone() - .get(value_index as usize) - .cloned() - { - Some(t) => authored_name_at(source_indices.clone(), &t), - None => "".to_string(), + Some(a) => a.clone(), + None => 0, +}; +let value_index = if (arity == 2) { + 1 + } else { + 0 }; - let is_recursive_element = ((value_type.clone().as_str() - == parent_name.clone().as_str()) - || set_has(recursive_type_set, value_type.clone())); - if is_recursive_element { +let value_type = match type_expr.children.clone().get(value_index as usize).cloned() { + Some(t) => authored_name_at(source_indices.clone(), &t), + None => "".to_string(), +}; +let is_recursive_element = ((value_type.clone().as_str() == parent_name.clone().as_str()) || set_has(recursive_type_set, value_type.clone())); +if is_recursive_element { { - let elem = - if (value_type.clone().as_str() == parent_name.clone().as_str()) { - parent_name.clone() - } else { - value_type.clone() - }; - match field_type_name.clone().as_str() { - "List" => Some(Rc::new(FieldRecursionResult { - shape: RecursionShape::ListRecursion, - element_type: elem, - })), - "Set" => Some(Rc::new(FieldRecursionResult { - shape: RecursionShape::SetRecursion, - element_type: elem, - })), - "Map" => Some(Rc::new(FieldRecursionResult { - shape: RecursionShape::MapValueRecursion, - element_type: elem, - })), - _ => None, - } - } + let elem = if (value_type.clone().as_str() == parent_name.clone().as_str()) { + parent_name.clone() + } else { + value_type.clone() + }; +match field_type_name.clone().as_str() { + "List" => Some(Rc::new(FieldRecursionResult { + shape: RecursionShape::ListRecursion, + element_type: elem, +})), + "Set" => Some(Rc::new(FieldRecursionResult { + shape: RecursionShape::SetRecursion, + element_type: elem, +})), + "Map" => Some(Rc::new(FieldRecursionResult { + shape: RecursionShape::MapValueRecursion, + element_type: elem, +})), + _ => None, +} +} } else { None } - } +} } else { if set_has(recursive_type_set, field_type_name.clone()) { match field_node.return_cardinality.clone() { - Cardinality::CardOptional => Some(Rc::new(FieldRecursionResult { - shape: RecursionShape::OptionalRecursion, - element_type: field_type_name.clone(), - })), - _ => Some(Rc::new(FieldRecursionResult { - shape: RecursionShape::DirectRecursion, - element_type: field_type_name.clone(), - })), - } + Cardinality::CardOptional => Some(Rc::new(FieldRecursionResult { + shape: RecursionShape::OptionalRecursion, + element_type: field_type_name.clone(), +})), + _ => Some(Rc::new(FieldRecursionResult { + shape: RecursionShape::DirectRecursion, + element_type: field_type_name.clone(), +})), +} } else { None } } } - } +} } -pub fn collect_fields_inductive( - fields: Rc>>, - parent_name: String, - variant_name: String, - recursive_type_set: Rc>, - acc: Rc>>>>, - source_indices: Rc>>, -) -> Rc>>>> { - fields.iter().cloned().fold( - acc.clone(), - |field_acc: Rc>>>>, field_node: Rc| { - match classify_field_recursion( - &field_node, - &parent_name, - recursive_type_set.clone(), - &source_indices, - ) { - Some(result) => put_inductive_field_cross( - &field_acc, - &parent_name, - variant_name.clone(), - authored_name_at(source_indices.clone(), &field_node), - result.shape.clone(), - result.element_type.clone(), - ), - None => field_acc.clone(), - } - }, - ) +pub fn collect_fields_inductive(fields: Rc>>, parent_name: String, variant_name: String, recursive_type_set: Rc>, acc: Rc>>>>, source_indices: Rc>>) -> Rc>>>> { + fields.iter().cloned().fold(acc.clone(), |field_acc: Rc>>>>, field_node: Rc| match classify_field_recursion(&field_node, &parent_name, recursive_type_set.clone(), &source_indices) { + Some(result) => put_inductive_field_cross(&field_acc, &parent_name, variant_name.clone(), authored_name_at(source_indices.clone(), &field_node), result.shape.clone(), result.element_type.clone()), + None => field_acc.clone(), +}) } -pub fn collect_item_inductive_fields( - item: &Rc, - recursive_type_set: Rc>, - source_indices: &Rc>>, -) -> Rc>>>> { +pub fn collect_item_inductive_fields(item: &Rc, recursive_type_set: Rc>, source_indices: &Rc>>) -> Rc>>>> { { let item_name = authored_name_at(source_indices.clone(), &item); - match item.connective.clone() { - Connective::Disj => item.children.clone().iter().cloned().fold( - v2_rt::rc_empty_map::>>>(), - |variant_acc: Rc>>>>, - variant_node: Rc| { - collect_fields_inductive( - variant_node.children.clone(), - item_name.clone(), - authored_name_at(source_indices.clone(), &variant_node), - recursive_type_set.clone(), - variant_acc, - source_indices.clone(), - ) - }, - ), - Connective::Conj => collect_fields_inductive( - item.children.clone(), - item_name.clone(), - "".to_string(), - recursive_type_set.clone(), - v2_rt::rc_empty_map::>>>(), - source_indices.clone(), - ), - _ => v2_rt::rc_empty_map::>>>(), - } - } +match item.connective.clone() { + Connective::Disj => item.children.clone().iter().cloned().fold(v2_rt::rc_empty_map::>>>(), |variant_acc: Rc>>>>, variant_node: Rc| collect_fields_inductive(variant_node.children.clone(), item_name.clone(), authored_name_at(source_indices.clone(), &variant_node), recursive_type_set.clone(), variant_acc, source_indices.clone())), + Connective::Conj => collect_fields_inductive(item.children.clone(), item_name.clone(), "".to_string(), recursive_type_set.clone(), v2_rt::rc_empty_map::>>>(), source_indices.clone()), + _ => v2_rt::rc_empty_map::>>>(), +} +} } -pub fn build_item_inductive_fields( - items: Rc>>, - recursive_type_set: Rc>, - source_indices: Rc>>, -) -> Rc>>>> { - items.iter().cloned().fold( - v2_rt::rc_empty_map::>>>(), - |acc: Rc>>>>, item: Rc| { - merge_inductive_fields( - acc, - &collect_item_inductive_fields(&item, recursive_type_set.clone(), &source_indices), - ) - }, - ) +pub fn build_item_inductive_fields(items: Rc>>, recursive_type_set: Rc>, source_indices: Rc>>) -> Rc>>>> { + items.iter().cloned().fold(v2_rt::rc_empty_map::>>>(), |acc: Rc>>>>, item: Rc| merge_inductive_fields(acc, &collect_item_inductive_fields(&item, recursive_type_set.clone(), &source_indices))) } -pub fn nominal_ref_node( - name: &String, - span: Rc, - ident_span: Option>, -) -> Rc { +pub fn nominal_ref_node(name: &String, span: Rc, ident_span: Option>) -> Rc { Rc::new(Node { - name: name.clone(), - span: span, - ident_span: ident_span, - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::Resolved { - node: nominal_leaf_type(name.clone()), - })), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }) + name: name.clone(), + span: span, + ident_span: ident_span, + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::Resolved { + node: nominal_leaf_type(name.clone()), +})), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}) } pub fn resolved_callable_type(func_params: Rc>>, ret: Rc) -> Rc { make_callable_type(func_params, ret) } -pub fn namespace_root_from_properties( - properties: Rc>>, - name: String, - source_indices: Rc>>, -) -> String { - match Rc::new({ - let mut __result = Vec::new(); - for p in properties.iter().cloned() { - if (field_init_node_name_at(p.clone(), source_indices.clone()).as_str() - == "namespace_root".to_string().as_str()) - { - __result.push(p); - } - } - __result - }) - .first() - .cloned() - { - Some(ns_prop) => match (*field_init_node_value(&ns_prop).expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { - let LiteralValue::LitStr { value: root, .. } = value.as_ref() else { - unreachable!() - }; - root.clone() - } - _ => name, - }, - None => name, - } +pub fn namespace_root_from_properties(properties: Rc>>, name: String, source_indices: Rc>>) -> String { + match Rc::new({ let mut __result = Vec::new(); for p in properties.iter().cloned() { if (field_init_node_name_at(p.clone(), source_indices.clone()).as_str() == "namespace_root".to_string().as_str()) { __result.push(p); } } __result }).first().cloned() { + Some(ns_prop) => match (*field_init_node_value(&ns_prop).expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitStr { value: root, .. } = value.as_ref() else { unreachable!() }; root.clone() }, + _ => name, +}, + None => name, +} } pub fn expr_span(texpr: Rc) -> Rc { @@ -751,9 +473,9 @@ pub fn expr_span(texpr: Rc) -> Rc { pub fn ok_infer(texpr: Rc) -> Rc { Rc::new(InferResult { - typed: texpr, - diagnostics: Rc::new(vec![]), - }) + typed: texpr, + diagnostics: Rc::new(vec![]), +}) } pub fn semantic_expr_error_node(message: String, span: Rc) -> Rc { @@ -766,64 +488,46 @@ pub fn internal_expr_error_node(message: String, span: Rc) -> Rc, name: &String) -> Option { match v2_rt::map_get(&scope.locals.clone(), name.clone()) { - Some(binding) => { - match lookup_type_for(&scope.type_env.clone(), &binding.resolved.clone()) { - Some(parent) => { - let is_coproduct = (parent.connective.clone() == Connective::Disj); - if is_coproduct { - if has_child_named( - parent.clone(), - name.clone(), - scope.type_env.clone().source_indices.clone(), - ) { - Some(authored_name_at( - scope.type_env.clone().source_indices.clone(), - &binding.resolved.clone(), - )) - } else { - None - } - } else { - None - } - } - None => None, + Some(binding) => match lookup_type_for(&scope.type_env.clone(), &binding.resolved.clone()) { + Some(parent) => { + let is_coproduct = (parent.connective.clone() == Connective::Disj); +if is_coproduct { + if has_child_named(parent.clone(), name.clone(), scope.type_env.clone().source_indices.clone()) { + Some(authored_name_at(scope.type_env.clone().source_indices.clone(), &binding.resolved.clone())) + } else { + None } + } else { + None } - None => None, - } +}, + None => None, +}, + None => None, +} } pub fn infer_var_binding_kind(scope: &Rc, name: &String) -> Rc { match lookup_variant_parent_enum(&scope, &name) { - Some(parent_enum) => Rc::new(VarBindingKind::VariantValueBinding { - parent_enum: parent_enum.clone(), - }), - None => match v2_rt::map_get(&scope.locals.clone(), name.clone()) { - Some(_) => { - if v2_rt::map_has(&scope.match_bound_names.clone(), name.clone()) { - Rc::new(VarBindingKind::MatchBoundBinding) - } else { - Rc::new(VarBindingKind::LocalValueBinding) - } - } - None => Rc::new(VarBindingKind::FunctionValueBinding), - }, - } + Some(parent_enum) => Rc::new(VarBindingKind::VariantValueBinding { + parent_enum: parent_enum.clone(), +}), + None => match v2_rt::map_get(&scope.locals.clone(), name.clone()) { + Some(_) => if v2_rt::map_has(&scope.match_bound_names.clone(), name.clone()) { + Rc::new(VarBindingKind::MatchBoundBinding) + } else { + Rc::new(VarBindingKind::LocalValueBinding) + }, + None => Rc::new(VarBindingKind::FunctionValueBinding), +}, +} } -pub fn inference_error( - message: String, - span: Rc, - module_name: String, -) -> Rc { - make_error_node( - Rc::new(CompilerDiagnostic::InternalError { - message: message, - span: span, - }), - module_name, - ) +pub fn inference_error(message: String, span: Rc, module_name: String) -> Rc { + make_error_node(Rc::new(CompilerDiagnostic::InternalError { + message: message, + span: span, +}), module_name) } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -835,11 +539,11 @@ pub struct KernelListTyDiag { pub fn list_kernel_ty_from_element(element: Rc) -> Rc { { let b = make_container_type(&"List".to_string(), element); - Rc::new(KernelListTyDiag { - ty: b.ty.clone(), - miss_diags: b.diagnostics.clone(), - }) - } +Rc::new(KernelListTyDiag { + ty: b.ty.clone(), + miss_diags: b.diagnostics.clone(), +}) +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -848,118 +552,80 @@ pub struct Tier2bBt { pub kernel_diags: Rc>>, } -pub fn infer_tier2b_builtin_with_kernel_diags( - func_name: &String, - typed_args: Rc>>, - scope: Rc, - span: Rc, -) -> Rc { - if ((func_name.clone().as_str() == "lookup".to_string().as_str()) - || (func_name.clone().as_str() == "map_get".to_string().as_str())) - { +pub fn infer_tier2b_builtin_with_kernel_diags(func_name: &String, typed_args: Rc>>, scope: Rc, span: Rc) -> Rc { + if ((func_name.clone().as_str() == "lookup".to_string().as_str()) || (func_name.clone().as_str() == "map_get".to_string().as_str())) { Rc::new(Tier2bBt { - bt: match typed_args.first().cloned() { - Some(receiver_arg) => match arg_value(&receiver_arg) - .inferred - .clone() - .as_deref() - .cloned() - { - Some(InferredNode::Resolved { - node: receiver_type, - .. - }) => { - match map_value_type_in_env(receiver_type.clone(), &scope.type_env.clone()) - { - Some(value_type) => with_optional_cardinality(&value_type), - None => resolve_builtin_call_type(func_name.clone()), - } - } - _ => resolve_builtin_call_type(func_name.clone()), - }, - None => resolve_builtin_call_type(func_name.clone()), - }, - kernel_diags: Rc::new(vec![]), - }) + bt: match typed_args.first().cloned() { + Some(receiver_arg) => match arg_value(&receiver_arg).inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: receiver_type, .. }) => match map_value_type_in_env(receiver_type.clone(), &scope.type_env.clone()) { + Some(value_type) => with_optional_cardinality(&value_type), + None => resolve_builtin_call_type(func_name.clone()), +}, + _ => resolve_builtin_call_type(func_name.clone()), +}, + None => resolve_builtin_call_type(func_name.clone()), +}, + kernel_diags: Rc::new(vec![]), +}) } else { if (func_name.clone().as_str() == "map_keys".to_string().as_str()) { match typed_args.first().cloned() { - Some(receiver_arg) => match arg_value(&receiver_arg) - .inferred - .clone() - .as_deref() - .cloned() - { - Some(InferredNode::Resolved { - node: receiver_type, - .. - }) => match map_key_type_in_env(receiver_type.clone(), &scope.type_env.clone()) - { - Some(key_type) => { - let lk = list_kernel_ty_from_element(key_type.clone()); - Rc::new(Tier2bBt { - bt: lk.ty.clone(), - kernel_diags: lk.miss_diags.clone(), - }) - } - None => Rc::new(Tier2bBt { - bt: resolve_builtin_call_type(func_name.clone()), - kernel_diags: Rc::new(vec![]), - }), - }, - _ => Rc::new(Tier2bBt { - bt: resolve_builtin_call_type(func_name.clone()), - kernel_diags: Rc::new(vec![]), - }), - }, - None => Rc::new(Tier2bBt { - bt: resolve_builtin_call_type(func_name.clone()), - kernel_diags: Rc::new(vec![]), - }), - } + Some(receiver_arg) => match arg_value(&receiver_arg).inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: receiver_type, .. }) => match map_key_type_in_env(receiver_type.clone(), &scope.type_env.clone()) { + Some(key_type) => { + let lk = list_kernel_ty_from_element(key_type.clone()); +Rc::new(Tier2bBt { + bt: lk.ty.clone(), + kernel_diags: lk.miss_diags.clone(), +}) +}, + None => Rc::new(Tier2bBt { + bt: resolve_builtin_call_type(func_name.clone()), + kernel_diags: Rc::new(vec![]), +}), +}, + _ => Rc::new(Tier2bBt { + bt: resolve_builtin_call_type(func_name.clone()), + kernel_diags: Rc::new(vec![]), +}), +}, + None => Rc::new(Tier2bBt { + bt: resolve_builtin_call_type(func_name.clone()), + kernel_diags: Rc::new(vec![]), +}), +} } else { if (func_name.clone().as_str() == "map_values".to_string().as_str()) { match typed_args.first().cloned() { - Some(receiver_arg) => match arg_value(&receiver_arg) - .inferred - .clone() - .as_deref() - .cloned() - { - Some(InferredNode::Resolved { - node: receiver_type, - .. - }) => match map_value_type_in_env( - receiver_type.clone(), - &scope.type_env.clone(), - ) { - Some(value_type) => { - let lv = list_kernel_ty_from_element(value_type.clone()); - Rc::new(Tier2bBt { - bt: lv.ty.clone(), - kernel_diags: lv.miss_diags.clone(), - }) - } - None => Rc::new(Tier2bBt { - bt: resolve_builtin_call_type(func_name.clone()), - kernel_diags: Rc::new(vec![]), - }), - }, - _ => Rc::new(Tier2bBt { - bt: resolve_builtin_call_type(func_name.clone()), - kernel_diags: Rc::new(vec![]), - }), - }, - None => Rc::new(Tier2bBt { - bt: resolve_builtin_call_type(func_name.clone()), - kernel_diags: Rc::new(vec![]), - }), - } + Some(receiver_arg) => match arg_value(&receiver_arg).inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: receiver_type, .. }) => match map_value_type_in_env(receiver_type.clone(), &scope.type_env.clone()) { + Some(value_type) => { + let lv = list_kernel_ty_from_element(value_type.clone()); +Rc::new(Tier2bBt { + bt: lv.ty.clone(), + kernel_diags: lv.miss_diags.clone(), +}) +}, + None => Rc::new(Tier2bBt { + bt: resolve_builtin_call_type(func_name.clone()), + kernel_diags: Rc::new(vec![]), +}), +}, + _ => Rc::new(Tier2bBt { + bt: resolve_builtin_call_type(func_name.clone()), + kernel_diags: Rc::new(vec![]), +}), +}, + None => Rc::new(Tier2bBt { + bt: resolve_builtin_call_type(func_name.clone()), + kernel_diags: Rc::new(vec![]), +}), +} } else { Rc::new(Tier2bBt { - bt: resolve_builtin_call_type(func_name.clone()), - kernel_diags: Rc::new(vec![]), - }) + bt: resolve_builtin_call_type(func_name.clone()), + kernel_diags: Rc::new(vec![]), +}) } } } @@ -971,571 +637,344 @@ pub struct MethodPipeFallback { pub kernel_diags: Rc>>, } -pub fn method_pipe_map_keys_values_fallback( - recv_rt: &Rc, - method_name: &String, - scope: Rc, - span: Rc, -) -> Rc { +pub fn method_pipe_map_keys_values_fallback(recv_rt: &Rc, method_name: &String, scope: Rc, span: Rc) -> Rc { if (method_name.clone().as_str() == "map_keys".to_string().as_str()) { match map_key_type_in_env(recv_rt.clone(), &scope.type_env.clone()) { - Some(key_type) => { - let lk = list_kernel_ty_from_element(key_type.clone()); - Rc::new(MethodPipeFallback { - result_ty: lk.ty.clone(), - kernel_diags: lk.miss_diags.clone(), - }) - } - None => Rc::new(MethodPipeFallback { - result_ty: recv_rt.clone(), - kernel_diags: Rc::new(vec![]), - }), - } + Some(key_type) => { + let lk = list_kernel_ty_from_element(key_type.clone()); +Rc::new(MethodPipeFallback { + result_ty: lk.ty.clone(), + kernel_diags: lk.miss_diags.clone(), +}) +}, + None => Rc::new(MethodPipeFallback { + result_ty: recv_rt.clone(), + kernel_diags: Rc::new(vec![]), +}), +} } else { if (method_name.clone().as_str() == "map_values".to_string().as_str()) { match map_value_type_in_env(recv_rt.clone(), &scope.type_env.clone()) { - Some(value_type) => { - let lv = list_kernel_ty_from_element(value_type.clone()); - Rc::new(MethodPipeFallback { - result_ty: lv.ty.clone(), - kernel_diags: lv.miss_diags.clone(), - }) - } - None => Rc::new(MethodPipeFallback { - result_ty: recv_rt.clone(), - kernel_diags: Rc::new(vec![]), - }), - } + Some(value_type) => { + let lv = list_kernel_ty_from_element(value_type.clone()); +Rc::new(MethodPipeFallback { + result_ty: lv.ty.clone(), + kernel_diags: lv.miss_diags.clone(), +}) +}, + None => Rc::new(MethodPipeFallback { + result_ty: recv_rt.clone(), + kernel_diags: Rc::new(vec![]), +}), +} } else { Rc::new(MethodPipeFallback { - result_ty: recv_rt.clone(), - kernel_diags: Rc::new(vec![]), - }) + result_ty: recv_rt.clone(), + kernel_diags: Rc::new(vec![]), +}) } } } -pub fn categorized_error( - message: String, - span: Rc, - module_name: String, - category: String, -) -> Rc { - make_error_node( - Rc::new(CompilerDiagnostic::InternalError { - message: message, - span: span, - }), - module_name, - ) -} - -pub fn validate_cast( - source_inferred: Option>, - target_name: &String, - span: Rc, - source_indices: Rc>>, - module_name: String, -) -> Option> { +pub fn categorized_error(message: String, span: Rc, module_name: String, category: String) -> Rc { + make_error_node(Rc::new(CompilerDiagnostic::InternalError { + message: message, + span: span, +}), module_name) +} + +pub fn validate_cast(source_inferred: Option>, target_name: &String, span: Rc, source_indices: Rc>>, module_name: String) -> Option> { match source_inferred.as_deref().cloned() { - Some(InferredNode::Resolved { node: src_node, .. }) => { - let source_name = authored_name_at(source_indices, &src_node); - if (source_name.clone().as_str() == target_name.clone().as_str()) { + Some(InferredNode::Resolved { node: src_node, .. }) => { + let source_name = authored_name_at(source_indices, &src_node); +if (source_name.clone().as_str() == target_name.clone().as_str()) { + None + } else { + if !is_dag_cast_domain_type(source_name.clone()) { None } else { - if !is_dag_cast_domain_type(source_name.clone()) { + if !is_dag_cast_domain_type(target_name.clone()) { None } else { - if !is_dag_cast_domain_type(target_name.clone()) { + if dag_can_cast(source_name.clone(), target_name.clone()) { None } else { - if dag_can_cast(source_name.clone(), target_name.clone()) { - None - } else { - { - let msg = v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "invalid cast: ".to_string(), - source_name.clone(), - ), - " as ".to_string(), - ), - target_name.clone(), - ); - let diag = Rc::new(CompilerDiagnostic::InternalError { - message: msg, - span: span, - }); - Some(make_error_node(diag, module_name)) - } - } + { + let msg = v2_rt::concat(v2_rt::concat(v2_rt::concat("invalid cast: ".to_string(), source_name.clone()), " as ".to_string()), target_name.clone()); +let diag = Rc::new(CompilerDiagnostic::InternalError { + message: msg, + span: span, +}); +Some(make_error_node(diag, module_name)) +} } } } } - _ => None, - } +}, + _ => None, +} } pub fn type_variable_node(id: String) -> Rc { Rc::new(Node { - name: "".to_string(), - span: make_span(0, 0), - ident_span: None, - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::TypeVariable { id: id })), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }) + name: "".to_string(), + span: make_span(0, 0), + ident_span: None, + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::TypeVariable { + id: id, +})), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}) } pub fn is_type_variable(inferred: Rc) -> bool { match (*inferred).clone() { - InferredNode::TypeVariable { .. } => true, - _ => false, - } + InferredNode::TypeVariable { .. } => true, + _ => false, +} } -pub fn inferred_or_error( - result: Option>, - fallback_message: String, - fallback_span: Rc, -) -> Rc { +pub fn inferred_or_error(result: Option>, fallback_message: String, fallback_span: Rc) -> Rc { match result { - Some(inferred) => inferred.clone(), - None => Rc::new(InferredNode::CompilerError { - message: fallback_message, - span: fallback_span, - }), - } + Some(inferred) => inferred.clone(), + None => Rc::new(InferredNode::CompilerError { + message: fallback_message, + span: fallback_span, +}), +} } -pub fn resolve_pattern_subject( - scope: Rc, - scrutinee_subject: Rc, -) -> Rc { +pub fn resolve_pattern_subject(scope: Rc, scrutinee_subject: Rc) -> Rc { match (*scrutinee_subject).clone() { - PatternSubject::PatternResolved { - node: scrutinee_type, - .. - } => pattern_subject_from_node(&resolve_scrutinee_type_node( - scope.type_env.clone(), - scrutinee_type.clone(), - )), - PatternSubject::PatternDynamic { - span: dynamic_span, .. - } => Rc::new(PatternSubject::PatternDynamic { - span: dynamic_span.clone(), - }), - PatternSubject::PatternLookupBlocked => Rc::new(PatternSubject::PatternLookupBlocked), - } + PatternSubject::PatternResolved { node: scrutinee_type, .. } => pattern_subject_from_node(&resolve_scrutinee_type_node(scope.type_env.clone(), scrutinee_type.clone())), + PatternSubject::PatternDynamic { span: dynamic_span, .. } => Rc::new(PatternSubject::PatternDynamic { + span: dynamic_span.clone(), +}), + PatternSubject::PatternLookupBlocked => Rc::new(PatternSubject::PatternLookupBlocked), +} } -pub fn annotate_pattern_parent_enums( - pattern: Rc, - scrutinee_subject: Rc, - scope: &Rc, -) -> Rc { +pub fn annotate_pattern_parent_enums(pattern: Rc, scrutinee_subject: Rc, scope: &Rc) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*pattern.clone()).clone() { - MatchPattern::VariantPattern { - name: variant_name, - field_bindings: bindings, - .. - } => { - let resolved_scrut = resolve_pattern_subject(scope.clone(), scrutinee_subject); - let inferred_parent = match (*resolved_scrut.clone()).clone() { - PatternSubject::PatternResolved { - node: resolved_scrut_node, - .. - } => { - if ((resolved_scrut_node.return_cardinality.clone() - == Cardinality::CardOptional) - && ((variant_name.clone().as_str() == "Some".to_string().as_str()) - || (variant_name.clone().as_str() == "None".to_string().as_str()))) - { - Some("Optional".to_string()) - } else { - { - let is_coproduct = - (resolved_scrut_node.connective.clone() == Connective::Disj); - if is_coproduct { - Some(authored_name_at( - scope.type_env.clone().source_indices.clone(), - &resolved_scrut_node, - )) - } else { - None - } - } - } - } - PatternSubject::PatternDynamic { .. } => None, - PatternSubject::PatternLookupBlocked => None, - }; - let variant_lookup = lookup_variant_in_type( - resolved_scrut.clone(), - &variant_name, - scope.module_name.clone(), - &scope.type_env.clone().source_indices.clone(), - ); - let variant_subject = lookup_result_subject(variant_lookup); - let annotated_bindings = Rc::new({ - let mut __result = Vec::new(); - for binding in bindings.clone().iter().cloned() { - __result.push({ - let field_lookup = lookup_field_in_variant( - variant_subject.clone(), - &field_binding_name_at( - binding.clone(), - scope.type_env.clone().source_indices.clone(), - ), - scope.module_name.clone(), - &scope.type_env.clone().source_indices.clone(), - ); - let field_subject = lookup_result_subject(field_lookup.clone()); - make_field_binding_node( - &field_binding_name_at( - binding.clone(), - scope.type_env.clone().source_indices.clone(), - ), - annotate_pattern_parent_enums( - field_binding_pattern(binding.clone()), - field_subject.clone(), - &scope, - ), - binding.span.clone(), - node_name_span(&binding), - ) - }); + MatchPattern::VariantPattern { name: variant_name, field_bindings: bindings, .. } => { + let resolved_scrut = resolve_pattern_subject(scope.clone(), scrutinee_subject); +let inferred_parent = match (*resolved_scrut.clone()).clone() { + PatternSubject::PatternResolved { node: resolved_scrut_node, .. } => if ((resolved_scrut_node.return_cardinality.clone() == Cardinality::CardOptional) && ((variant_name.clone().as_str() == "Some".to_string().as_str()) || (variant_name.clone().as_str() == "None".to_string().as_str()))) { + Some("Optional".to_string()) + } else { + { + let is_coproduct = (resolved_scrut_node.connective.clone() == Connective::Disj); +if is_coproduct { + Some(authored_name_at(scope.type_env.clone().source_indices.clone(), &resolved_scrut_node)) + } else { + None } - __result - }); - match inferred_parent { - Some(parent_name) => Rc::new(MatchPattern::VariantPattern { - name: variant_name.clone(), - parent_enum: Some(parent_name.clone()), - field_bindings: annotated_bindings, - }), - None => Rc::new(MatchPattern::VariantPattern { - name: variant_name.clone(), - parent_enum: None, - field_bindings: annotated_bindings, - }), - } - } - _ => pattern.clone(), - } +} + }, + PatternSubject::PatternDynamic { .. } => None, + PatternSubject::PatternLookupBlocked => None, +}; +let variant_lookup = lookup_variant_in_type(resolved_scrut.clone(), &variant_name, scope.module_name.clone(), &scope.type_env.clone().source_indices.clone()); +let variant_subject = lookup_result_subject(variant_lookup); +let annotated_bindings = Rc::new({ let mut __result = Vec::new(); for binding in bindings.clone().iter().cloned() { __result.push({ + let field_lookup = lookup_field_in_variant(variant_subject.clone(), &field_binding_name_at(binding.clone(), scope.type_env.clone().source_indices.clone()), scope.module_name.clone(), &scope.type_env.clone().source_indices.clone()); +let field_subject = lookup_result_subject(field_lookup.clone()); +make_field_binding_node(&field_binding_name_at(binding.clone(), scope.type_env.clone().source_indices.clone()), annotate_pattern_parent_enums(field_binding_pattern(binding.clone()), field_subject.clone(), &scope), binding.span.clone(), node_name_span(&binding)) +}); } __result }); +match inferred_parent { + Some(parent_name) => Rc::new(MatchPattern::VariantPattern { + name: variant_name.clone(), + parent_enum: Some(parent_name.clone()), + field_bindings: annotated_bindings, +}), + None => Rc::new(MatchPattern::VariantPattern { + name: variant_name.clone(), + parent_enum: None, + field_bindings: annotated_bindings, +}), +} +}, + _ => pattern.clone(), +} }) } pub fn build_params_scope(scope: &Rc, params: Rc>>) -> Rc { { - let new_locals = params.iter().cloned().fold( - scope.locals.clone(), - |acc: Rc>>, p: Rc| { - v2_rt::rc_map_insert( - acc, - param_node_name_at(p.clone(), scope.type_env.clone().source_indices.clone()), - Rc::new(TypeBinding { - name: param_node_name_at( - p.clone(), - scope.type_env.clone().source_indices.clone(), - ), - resolved: param_node_type_expr(&p), - provenance: Rc::new(SubValueRelation::PreservedValue), - }), - ) - }, - ); - Rc::new(InferScope { - type_env: scope.type_env.clone(), - func_env: scope.func_env.clone(), - locals: new_locals, - match_bound_names: scope.match_bound_names.clone(), - module_name: scope.module_name.clone(), - service_registry: scope.service_registry.clone(), - item_registry: scope.item_registry.clone(), - lambda_param_provenance: v2_rt::rc_empty_map::>(), - }) - } + let new_locals = params.iter().cloned().fold(scope.locals.clone(), |acc: Rc>>, p: Rc| v2_rt::rc_map_insert(acc, param_node_name_at(p.clone(), scope.type_env.clone().source_indices.clone()), Rc::new(TypeBinding { + name: param_node_name_at(p.clone(), scope.type_env.clone().source_indices.clone()), + resolved: param_node_type_expr(&p), + provenance: Rc::new(SubValueRelation::PreservedValue), +}))); +Rc::new(InferScope { + type_env: scope.type_env.clone(), + func_env: scope.func_env.clone(), + locals: new_locals, + match_bound_names: scope.match_bound_names.clone(), + module_name: scope.module_name.clone(), + service_registry: scope.service_registry.clone(), + item_registry: scope.item_registry.clone(), + lambda_param_provenance: v2_rt::rc_empty_map::>(), +}) +} } -pub fn extend_scope( - scope: &Rc, - name: &String, - resolved: Rc, - provenance: Rc, -) -> Rc { +pub fn extend_scope(scope: &Rc, name: &String, resolved: Rc, provenance: Rc) -> Rc { Rc::new(InferScope { - type_env: scope.type_env.clone(), - func_env: scope.func_env.clone(), - locals: v2_rt::rc_map_insert( - scope.locals.clone(), - name.clone(), - Rc::new(TypeBinding { - name: name.clone(), - resolved: resolved, - provenance: provenance, - }), - ), - match_bound_names: scope.match_bound_names.clone(), - module_name: scope.module_name.clone(), - service_registry: scope.service_registry.clone(), - item_registry: scope.item_registry.clone(), - lambda_param_provenance: scope.lambda_param_provenance.clone(), - }) + type_env: scope.type_env.clone(), + func_env: scope.func_env.clone(), + locals: v2_rt::rc_map_insert(scope.locals.clone(), name.clone(), Rc::new(TypeBinding { + name: name.clone(), + resolved: resolved, + provenance: provenance, +})), + match_bound_names: scope.match_bound_names.clone(), + module_name: scope.module_name.clone(), + service_registry: scope.service_registry.clone(), + item_registry: scope.item_registry.clone(), + lambda_param_provenance: scope.lambda_param_provenance.clone(), +}) } -pub fn extend_scope_match_bound( - scope: &Rc, - name: &String, - resolved: Rc, - provenance: Rc, -) -> Rc { +pub fn extend_scope_match_bound(scope: &Rc, name: &String, resolved: Rc, provenance: Rc) -> Rc { Rc::new(InferScope { - type_env: scope.type_env.clone(), - func_env: scope.func_env.clone(), - locals: v2_rt::rc_map_insert( - scope.locals.clone(), - name.clone(), - Rc::new(TypeBinding { - name: name.clone(), - resolved: resolved, - provenance: provenance, - }), - ), - match_bound_names: v2_rt::rc_map_insert( - scope.match_bound_names.clone(), - name.clone(), - true, - ), - module_name: scope.module_name.clone(), - service_registry: scope.service_registry.clone(), - item_registry: scope.item_registry.clone(), - lambda_param_provenance: scope.lambda_param_provenance.clone(), - }) + type_env: scope.type_env.clone(), + func_env: scope.func_env.clone(), + locals: v2_rt::rc_map_insert(scope.locals.clone(), name.clone(), Rc::new(TypeBinding { + name: name.clone(), + resolved: resolved, + provenance: provenance, +})), + match_bound_names: v2_rt::rc_map_insert(scope.match_bound_names.clone(), name.clone(), true), + module_name: scope.module_name.clone(), + service_registry: scope.service_registry.clone(), + item_registry: scope.item_registry.clone(), + lambda_param_provenance: scope.lambda_param_provenance.clone(), +}) } pub fn extend_scope_with_params(scope: &Rc, params: Rc>) -> Rc { { - let new_locals = params.iter().cloned().fold( - scope.locals.clone(), - |acc: Rc>>, p: String| { - v2_rt::rc_map_insert( - acc, - p.clone(), - Rc::new(TypeBinding { - name: p.clone(), - resolved: type_variable_node("lambda_param".to_string()), - provenance: Rc::new(SubValueRelation::SubValueUnknown), - }), - ) - }, - ); - Rc::new(InferScope { - type_env: scope.type_env.clone(), - func_env: scope.func_env.clone(), - locals: new_locals, - match_bound_names: scope.match_bound_names.clone(), - module_name: scope.module_name.clone(), - service_registry: scope.service_registry.clone(), - item_registry: scope.item_registry.clone(), - lambda_param_provenance: scope.lambda_param_provenance.clone(), - }) - } + let new_locals = params.iter().cloned().fold(scope.locals.clone(), |acc: Rc>>, p: String| v2_rt::rc_map_insert(acc, p.clone(), Rc::new(TypeBinding { + name: p.clone(), + resolved: type_variable_node("lambda_param".to_string()), + provenance: Rc::new(SubValueRelation::SubValueUnknown), +}))); +Rc::new(InferScope { + type_env: scope.type_env.clone(), + func_env: scope.func_env.clone(), + locals: new_locals, + match_bound_names: scope.match_bound_names.clone(), + module_name: scope.module_name.clone(), + service_registry: scope.service_registry.clone(), + item_registry: scope.item_registry.clone(), + lambda_param_provenance: scope.lambda_param_provenance.clone(), +}) +} } -pub fn scope_after_stmt_node( - stmt: &Rc, - stmt_type: Rc, - scope: &Rc, -) -> Rc { +pub fn scope_after_stmt_node(stmt: &Rc, stmt_type: Rc, scope: &Rc) -> Rc { match (*stmt.expr_data.clone()).clone() { - ExprData::ExprLet => { - if ((stmt.children.clone().len() as i64) <= 1) { - { - let val = match stmt.children.clone().first().cloned() { - Some(v) => v.clone(), - None => stmt.clone(), - }; - extend_scope( - &scope, - &let_binding_name_at( - stmt.clone(), - scope.type_env.clone().source_indices.clone(), - ), - stmt_type, - classify_binding_provenance(&val, &scope), - ) - } - } else { - scope.clone() - } - } - _ => scope.clone(), - } + ExprData::ExprLet => if ((stmt.children.clone().len() as i64) <= 1) { + { + let val = match stmt.children.clone().first().cloned() { + Some(v) => v.clone(), + None => stmt.clone(), +}; +extend_scope(&scope, &let_binding_name_at(stmt.clone(), scope.type_env.clone().source_indices.clone()), stmt_type, classify_binding_provenance(&val, &scope)) +} + } else { + scope.clone() + }, + _ => scope.clone(), +} } -pub fn derive_field_provenance( - scope: &Rc, - scrutinee_provenance: &Rc, - scrutinee_subject: Rc, - variant_name: String, - field_name: String, -) -> Rc { +pub fn derive_field_provenance(scope: &Rc, scrutinee_provenance: &Rc, scrutinee_subject: Rc, variant_name: String, field_name: String) -> Rc { match (*scrutinee_provenance.clone()).clone() { - SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), - _ => { - let scrut_type_name = match (*scrutinee_subject).clone() { - PatternSubject::PatternResolved { node: n, .. } => authored_name_at( - scope.type_env.clone().source_indices.clone(), - &resolved_type(n.clone()), - ), - _ => "".to_string(), - }; - if (scrut_type_name.clone().as_str() == "".to_string().as_str()) { - Rc::new(SubValueRelation::SubValueUnknown) - } else { - { - let ind_fields = - inductive_fields_for(scope.type_env.clone(), scrut_type_name.clone()); - let matching = Rc::new({ - let mut __result = Vec::new(); - for f in ind_fields.iter().cloned() { - if ((f.variant_name.clone().as_str() == variant_name.clone().as_str()) - && (f.field_name.clone().as_str() == field_name.clone().as_str())) - { - __result.push(f); - } - } - __result - }) - .first() - .cloned(); - match matching { - Some(ind_field) => { - compose_sub_value(scrutinee_provenance.clone(), ind_field.clone()) - } - None => Rc::new(SubValueRelation::SubValueUnknown), - } - } - } + SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), + _ => { + let scrut_type_name = match (*scrutinee_subject).clone() { + PatternSubject::PatternResolved { node: n, .. } => authored_name_at(scope.type_env.clone().source_indices.clone(), &resolved_type(n.clone())), + _ => "".to_string(), +}; +if (scrut_type_name.clone().as_str() == "".to_string().as_str()) { + Rc::new(SubValueRelation::SubValueUnknown) + } else { + { + let ind_fields = inductive_fields_for(scope.type_env.clone(), scrut_type_name.clone()); +let matching = Rc::new({ let mut __result = Vec::new(); for f in ind_fields.iter().cloned() { if ((f.variant_name.clone().as_str() == variant_name.clone().as_str()) && (f.field_name.clone().as_str() == field_name.clone().as_str())) { __result.push(f); } } __result }).first().cloned(); +match matching { + Some(ind_field) => compose_sub_value(scrutinee_provenance.clone(), ind_field.clone()), + None => Rc::new(SubValueRelation::SubValueUnknown), +} +} } - } +}, +} } -pub fn extend_scope_with_pattern_node( - scope: &Rc, - pattern: Rc, - scrutinee_subject: &Rc, - scrutinee_provenance: Rc, -) -> Rc { - stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || match (*pattern).clone() { - MatchPattern::Bind { name: n, .. } => Rc::new(PatternScopeResult { - scope: extend_scope_match_bound( - &scope, - &n, - pattern_binding_type(scrutinee_subject.clone()), - scrutinee_provenance.clone(), - ), - diagnostics: Rc::new(vec![]), - }), - MatchPattern::Wildcard => Rc::new(PatternScopeResult { - scope: scope.clone(), - diagnostics: Rc::new(vec![]), - }), - MatchPattern::LitPattern { .. } => Rc::new(PatternScopeResult { - scope: scope.clone(), - diagnostics: Rc::new(vec![]), - }), - MatchPattern::VariantPattern { - name: vname, - field_bindings: bindings, - .. - } => { +pub fn extend_scope_with_pattern_node(scope: &Rc, pattern: Rc, scrutinee_subject: &Rc, scrutinee_provenance: Rc) -> Rc { + stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { + match (*pattern).clone() { + MatchPattern::Bind { name: n, .. } => Rc::new(PatternScopeResult { + scope: extend_scope_match_bound(&scope, &n, pattern_binding_type(scrutinee_subject.clone()), scrutinee_provenance.clone()), + diagnostics: Rc::new(vec![]), +}), + MatchPattern::Wildcard => Rc::new(PatternScopeResult { + scope: scope.clone(), + diagnostics: Rc::new(vec![]), +}), + MatchPattern::LitPattern { .. } => Rc::new(PatternScopeResult { + scope: scope.clone(), + diagnostics: Rc::new(vec![]), +}), + MatchPattern::VariantPattern { name: vname, field_bindings: bindings, .. } => { let resolved_scrut = resolve_pattern_subject(scope.clone(), scrutinee_subject.clone()); - let variant_lookup = lookup_variant_in_type( - resolved_scrut, - &vname, - scope.module_name.clone(), - &scope.type_env.clone().source_indices.clone(), - ); - let variant_subject = lookup_result_subject(variant_lookup.clone()); - let variant_diags = variant_lookup.diagnostics.clone(); - bindings.clone().iter().cloned().fold( - Rc::new(PatternScopeResult { - scope: scope.clone(), - diagnostics: variant_diags, - }), - |acc: Rc, fb: Rc| { - let field_name = field_binding_name_at( - fb.clone(), - scope.type_env.clone().source_indices.clone(), - ); - let field_lookup = lookup_field_in_variant( - variant_subject.clone(), - &field_name, - scope.module_name.clone(), - &scope.type_env.clone().source_indices.clone(), - ); - let field_subject = lookup_result_subject(field_lookup.clone()); - let field_type = pattern_binding_type(field_subject.clone()); - let field_provenance = derive_field_provenance( - &scope, - &scrutinee_provenance, - scrutinee_subject.clone(), - vname.clone(), - field_name.clone(), - ); - let fb_pattern = field_binding_pattern(fb.clone()); - match (*fb_pattern.clone()).clone() { - MatchPattern::Bind { name: n, .. } => Rc::new(PatternScopeResult { - scope: extend_scope_match_bound( - &acc.scope.clone(), - &n, - field_type.clone(), - field_provenance.clone(), - ), - diagnostics: v2_rt::concat( - acc.diagnostics.clone(), - field_lookup.diagnostics.clone(), - ), - }), - _ => { - let nested = extend_scope_with_pattern_node( - &acc.scope.clone(), - fb_pattern.clone(), - &field_subject, - field_provenance.clone(), - ); - Rc::new(PatternScopeResult { - scope: nested.scope.clone(), - diagnostics: v2_rt::concat( - acc.diagnostics.clone(), - v2_rt::concat( - field_lookup.diagnostics.clone(), - nested.diagnostics.clone(), - ), - ), - }) - } - } - }, - ) - } +let variant_lookup = lookup_variant_in_type(resolved_scrut, &vname, scope.module_name.clone(), &scope.type_env.clone().source_indices.clone()); +let variant_subject = lookup_result_subject(variant_lookup.clone()); +let variant_diags = variant_lookup.diagnostics.clone(); +bindings.clone().iter().cloned().fold(Rc::new(PatternScopeResult { + scope: scope.clone(), + diagnostics: variant_diags, +}), |acc: Rc, fb: Rc| { + let field_name = field_binding_name_at(fb.clone(), scope.type_env.clone().source_indices.clone()); +let field_lookup = lookup_field_in_variant(variant_subject.clone(), &field_name, scope.module_name.clone(), &scope.type_env.clone().source_indices.clone()); +let field_subject = lookup_result_subject(field_lookup.clone()); +let field_type = pattern_binding_type(field_subject.clone()); +let field_provenance = derive_field_provenance(&scope, &scrutinee_provenance, scrutinee_subject.clone(), vname.clone(), field_name.clone()); +let fb_pattern = field_binding_pattern(fb.clone()); +match (*fb_pattern.clone()).clone() { + MatchPattern::Bind { name: n, .. } => Rc::new(PatternScopeResult { + scope: extend_scope_match_bound(&acc.scope.clone(), &n, field_type.clone(), field_provenance.clone()), + diagnostics: v2_rt::concat(acc.diagnostics.clone(), field_lookup.diagnostics.clone()), +}), + _ => { + let nested = extend_scope_with_pattern_node(&acc.scope.clone(), fb_pattern.clone(), &field_subject, field_provenance.clone()); +Rc::new(PatternScopeResult { + scope: nested.scope.clone(), + diagnostics: v2_rt::concat(acc.diagnostics.clone(), v2_rt::concat(field_lookup.diagnostics.clone(), nested.diagnostics.clone())), +}) +}, +} +}) +}, +} }) } @@ -1547,298 +986,164 @@ pub fn method_name_is(opt: &Option, expected: String) -> bool { } } -pub fn arg_has_name( - arg: Rc, - name: String, - source_indices: Rc>>, -) -> bool { +pub fn arg_has_name(arg: Rc, name: String, source_indices: Rc>>) -> bool { { let n = arg_name_at(arg, source_indices); - if (n.clone() == None) { +if (n.clone() == None) { false } else { (n.clone().unwrap().as_str() == name.as_str()) } - } +} } -pub fn extract_fold_init_info( - method_name: Option, - method_args: &Rc>>, - min_args: i64, - scope: &Rc, - expected: Option>, -) -> Option> { +pub fn extract_fold_init_info(method_name: Option, method_args: &Rc>>, min_args: i64, scope: &Rc, expected: Option>) -> Option> { { let is_fold = method_name_is(&method_name, "fold".to_string()); - if (is_fold && ((method_args.clone().len() as i64) >= min_args)) { +if (is_fold && ((method_args.clone().len() as i64) >= min_args)) { { - let init_arg = match Rc::new({ - let mut __result = Vec::new(); - for a in method_args.clone().iter().cloned() { - if arg_has_name( - a.clone(), - "init".to_string(), - scope.type_env.clone().source_indices.clone(), - ) { - __result.push(a); - } - } - __result - }) - .first() - .cloned() - { - Some(a) => Some(a.clone()), - None => method_args.clone().first().cloned(), - }; - match init_arg { - Some(ia) => { - let init_result = infer_expr(&arg_value(&ia), &scope, &expected); - Some(Rc::new(ArgInferResult { - typed_arg: make_arg_node( - arg_name_at( - ia.clone(), - scope.type_env.clone().source_indices.clone(), - ), - init_result.typed.clone(), - ia.span.clone(), - ia.span.clone(), - ), - diagnostics: init_result.diagnostics.clone(), - })) - } - None => None, - } - } + let init_arg = match Rc::new({ let mut __result = Vec::new(); for a in method_args.clone().iter().cloned() { if arg_has_name(a.clone(), "init".to_string(), scope.type_env.clone().source_indices.clone()) { __result.push(a); } } __result }).first().cloned() { + Some(a) => Some(a.clone()), + None => method_args.clone().first().cloned(), +}; +match init_arg { + Some(ia) => { + let init_result = infer_expr(&arg_value(&ia), &scope, &expected); +Some(Rc::new(ArgInferResult { + typed_arg: make_arg_node(arg_name_at(ia.clone(), scope.type_env.clone().source_indices.clone()), init_result.typed.clone(), ia.span.clone(), ia.span.clone()), + diagnostics: init_result.diagnostics.clone(), +})) +}, + None => None, +} +} } else { None } - } +} } -pub fn derive_element_provenance( - coll_expr: Rc, - elem_type: &Rc, - scope: &Rc, -) -> Rc { +pub fn derive_element_provenance(coll_expr: Rc, elem_type: &Rc, scope: &Rc) -> Rc { { let coll_prov = classify_binding_provenance(&coll_expr, &scope); - match (*coll_prov).clone() { - SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), - _ => { - if (authored_name_at(scope.type_env.clone().source_indices.clone(), &elem_type) - .as_str() - == "".to_string().as_str()) - { - Rc::new(SubValueRelation::SubValueUnknown) - } else { - { - let ind_fields = inductive_fields_for( - scope.type_env.clone(), - authored_name_at( - scope.type_env.clone().source_indices.clone(), - &elem_type, - ), - ); - let list_field = Rc::new({ - let mut __result = Vec::new(); - for f in ind_fields.iter().cloned() { - if match f.shape.clone() { - RecursionShape::ListRecursion => true, - _ => false, - } { - __result.push(f); - } - } - __result - }) - .first() - .cloned(); - match list_field { - Some(f) => { - Rc::new(SubValueRelation::IteratedSubValue { field: f.clone() }) - } - None => Rc::new(SubValueRelation::SubValueUnknown), - } - } - } - } - } - } +match (*coll_prov).clone() { + SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), + _ => if (authored_name_at(scope.type_env.clone().source_indices.clone(), &elem_type).as_str() == "".to_string().as_str()) { + Rc::new(SubValueRelation::SubValueUnknown) + } else { + { + let ind_fields = inductive_fields_for(scope.type_env.clone(), authored_name_at(scope.type_env.clone().source_indices.clone(), &elem_type)); +let list_field = Rc::new({ let mut __result = Vec::new(); for f in ind_fields.iter().cloned() { if match f.shape.clone() { + RecursionShape::ListRecursion => true, + _ => false, +} { __result.push(f); } } __result }).first().cloned(); +match list_field { + Some(f) => Rc::new(SubValueRelation::IteratedSubValue { + field: f.clone(), +}), + None => Rc::new(SubValueRelation::SubValueUnknown), +} +} + }, +} +} } -pub fn infer_method_args_with_fold( - method_name: Option, - method_args: Rc>>, - fold_info: Option>, - fold_acc_type: Rc, - element_type: Rc, - elem_provenance: Rc, - scope: Rc, -) -> Rc>> { +pub fn infer_method_args_with_fold(method_name: Option, method_args: Rc>>, fold_info: Option>, fold_acc_type: Rc, element_type: Rc, elem_provenance: Rc, scope: Rc) -> Rc>> { { let is_fold = method_name_is(&method_name, "fold".to_string()); - Rc::new({ - let mut __result = Vec::new(); - for idx_pair in Rc::new( - method_args - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - { - __result.push({ - let a = idx_pair.1.clone(); - let idx = idx_pair.0.clone(); - let is_init_arg = (arg_has_name( - a.clone(), - "init".to_string(), - scope.type_env.clone().source_indices.clone(), - ) || ((arg_name_at( - a.clone(), - scope.type_env.clone().source_indices.clone(), - ) == None) - && (idx.clone() == 0))); - if ((is_fold.clone() && (fold_info.clone() != None)) && is_init_arg.clone()) { - match fold_info.clone() { - Some(fi) => fi.clone(), - None => infer_arg_with_element_type(&a, element_type.clone(), &scope), - } - } else { - if (is_fold.clone() && (fold_info.clone() != None)) { - { - let fold_params = Rc::new(vec![ - make_param_node( - &"acc".to_string(), - fold_acc_type.clone(), - None, - no_span(), - no_span(), - ), - make_param_node( - &"elem".to_string(), - element_type.clone(), - None, - no_span(), - no_span(), - ), - ]); - let fold_callable = Rc::new(Node { - name: "".to_string(), - span: no_span(), - ident_span: None, - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: fold_params.clone(), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - let lam_value = arg_value(&a); - let prov_map = match (*elem_provenance.clone()).clone() { - SubValueRelation::SubValueUnknown => { - v2_rt::rc_empty_map::>() - } - _ => v2_rt::rc_map_insert( - v2_rt::rc_empty_map::>(), - "elem".to_string(), - elem_provenance.clone(), - ), - }; - let fold_scope = Rc::new(InferScope { - type_env: scope.type_env.clone(), - func_env: scope.func_env.clone(), - locals: scope.locals.clone(), - match_bound_names: scope.match_bound_names.clone(), - module_name: scope.module_name.clone(), - service_registry: scope.service_registry.clone(), - item_registry: scope.item_registry.clone(), - lambda_param_provenance: prov_map.clone(), - }); - let ar = infer_expr( - &lam_value, - &fold_scope, - &Some(fold_callable.clone()), - ); - Rc::new(ArgInferResult { - typed_arg: make_arg_node( - arg_name_at( - a.clone(), - scope.type_env.clone().source_indices.clone(), - ), - ar.typed.clone(), - a.span.clone(), - a.span.clone(), - ), - diagnostics: ar.diagnostics.clone(), - }) - } +Rc::new({ let mut __result = Vec::new(); for idx_pair in Rc::new(method_args.iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { __result.push({ + let a = idx_pair.1.clone(); +let idx = idx_pair.0.clone(); +let is_init_arg = (arg_has_name(a.clone(), "init".to_string(), scope.type_env.clone().source_indices.clone()) || ((arg_name_at(a.clone(), scope.type_env.clone().source_indices.clone()) == None) && (idx.clone() == 0))); +if ((is_fold.clone() && (fold_info.clone() != None)) && is_init_arg.clone()) { + match fold_info.clone() { + Some(fi) => fi.clone(), + None => infer_arg_with_element_type(&a, element_type.clone(), &scope), +} + } else { + if (is_fold.clone() && (fold_info.clone() != None)) { + { + let fold_params = Rc::new(vec![make_param_node(&"acc".to_string(), fold_acc_type.clone(), None, no_span(), no_span()), make_param_node(&"elem".to_string(), element_type.clone(), None, no_span(), no_span())]); +let fold_callable = Rc::new(Node { + name: "".to_string(), + span: no_span(), + ident_span: None, + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: fold_params.clone(), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +let lam_value = arg_value(&a); +let prov_map = match (*elem_provenance.clone()).clone() { + SubValueRelation::SubValueUnknown => v2_rt::rc_empty_map::>(), + _ => v2_rt::rc_map_insert(v2_rt::rc_empty_map::>(), "elem".to_string(), elem_provenance.clone()), +}; +let fold_scope = Rc::new(InferScope { + type_env: scope.type_env.clone(), + func_env: scope.func_env.clone(), + locals: scope.locals.clone(), + match_bound_names: scope.match_bound_names.clone(), + module_name: scope.module_name.clone(), + service_registry: scope.service_registry.clone(), + item_registry: scope.item_registry.clone(), + lambda_param_provenance: prov_map.clone(), +}); +let ar = infer_expr(&lam_value, &fold_scope, &Some(fold_callable.clone())); +Rc::new(ArgInferResult { + typed_arg: make_arg_node(arg_name_at(a.clone(), scope.type_env.clone().source_indices.clone()), ar.typed.clone(), a.span.clone(), a.span.clone()), + diagnostics: ar.diagnostics.clone(), +}) +} + } else { + { + let nf_lam_value = arg_value(&a); +let nf_prov_map = match (*elem_provenance.clone()).clone() { + SubValueRelation::SubValueUnknown => v2_rt::rc_empty_map::>(), + _ => v2_rt::rc_map_insert(v2_rt::rc_empty_map::>(), "elem".to_string(), elem_provenance.clone()), +}; +let nf_scope = if is_lambda_expr(nf_lam_value.clone()) { + Rc::new(InferScope { + type_env: scope.type_env.clone(), + func_env: scope.func_env.clone(), + locals: scope.locals.clone(), + match_bound_names: scope.match_bound_names.clone(), + module_name: scope.module_name.clone(), + service_registry: scope.service_registry.clone(), + item_registry: scope.item_registry.clone(), + lambda_param_provenance: nf_prov_map.clone(), +}) } else { - { - let nf_lam_value = arg_value(&a); - let nf_prov_map = match (*elem_provenance.clone()).clone() { - SubValueRelation::SubValueUnknown => { - v2_rt::rc_empty_map::>() - } - _ => v2_rt::rc_map_insert( - v2_rt::rc_empty_map::>(), - "elem".to_string(), - elem_provenance.clone(), - ), - }; - let nf_scope = if is_lambda_expr(nf_lam_value.clone()) { - Rc::new(InferScope { - type_env: scope.type_env.clone(), - func_env: scope.func_env.clone(), - locals: scope.locals.clone(), - match_bound_names: scope.match_bound_names.clone(), - module_name: scope.module_name.clone(), - service_registry: scope.service_registry.clone(), - item_registry: scope.item_registry.clone(), - lambda_param_provenance: nf_prov_map.clone(), - }) - } else { - scope.clone() - }; - infer_arg_with_element_type(&a, element_type.clone(), &nf_scope) - } - } - } - }); + scope.clone() + }; +infer_arg_with_element_type(&a, element_type.clone(), &nf_scope) +} + } } - __result - }) - } +}); } __result }) +} } pub fn is_lambda_expr(e: Rc) -> bool { match (*e.expr_data.clone()).clone() { - ExprData::ExprLambda => true, - _ => false, - } + ExprData::ExprLambda => true, + _ => false, +} } pub fn seed_override_map() -> Rc>> { - Rc::new(vec!["".to_string()]).iter().cloned().fold( - v2_rt::rc_empty_map::>(), - |acc: Rc>>, k: String| { - v2_rt::rc_map_insert(acc, k.clone(), unit_type()) - }, - ) + Rc::new(vec!["".to_string()]).iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, k: String| v2_rt::rc_map_insert(acc, k.clone(), unit_type())) } pub fn fold_override_map(key: String, value: Rc) -> Rc>> { @@ -1849,704 +1154,355 @@ pub fn empty_override_map() -> Rc>> { seed_override_map() } -pub fn infer_arg_with_element_type( - arg: &Rc, - element_type: Rc, - scope: &Rc, -) -> Rc { +pub fn infer_arg_with_element_type(arg: &Rc, element_type: Rc, scope: &Rc) -> Rc { { let ar = infer_expr(&arg_value(&arg), &scope, &Some(element_type)); - Rc::new(ArgInferResult { - typed_arg: make_arg_node( - arg_name_at(arg.clone(), scope.type_env.clone().source_indices.clone()), - ar.typed.clone(), - arg.span.clone(), - arg.span.clone(), - ), - diagnostics: ar.diagnostics.clone(), - }) - } +Rc::new(ArgInferResult { + typed_arg: make_arg_node(arg_name_at(arg.clone(), scope.type_env.clone().source_indices.clone()), ar.typed.clone(), arg.span.clone(), arg.span.clone()), + diagnostics: ar.diagnostics.clone(), +}) +} } -pub fn infer_expr( - texpr: &Rc, - scope: &Rc, - expected: &Option>, -) -> Rc { +pub fn infer_expr(texpr: &Rc, scope: &Rc, expected: &Option>) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*texpr.expr_data.clone()).clone() { - ExprData::ExprLiteral { value: lit, .. } => { - let span = texpr.span.clone(); - ok_infer(make_expr_node( - Rc::new(ExprData::ExprLiteral { value: lit.clone() }), - Rc::new(vec![]), - Some(Rc::new(InferredNode::Resolved { - node: infer_literal_node(lit.clone()), - })), - span.clone(), - )) - } - ExprData::ExprError { kind, message, .. } => { - let span = texpr.span.clone(); + ExprData::ExprLiteral { value: lit, .. } => { + let span = texpr.span.clone(); +ok_infer(make_expr_node(Rc::new(ExprData::ExprLiteral { + value: lit.clone(), +}), Rc::new(vec![]), Some(Rc::new(InferredNode::Resolved { + node: infer_literal_node(lit.clone()), +})), span.clone())) +}, + ExprData::ExprError { kind, message, .. } => { + let span = texpr.span.clone(); +Rc::new(InferResult { + typed: make_expr_error_node(kind.clone(), &message, &span), + diagnostics: Rc::new(vec![]), +}) +}, + ExprData::ExprVar { .. } => { + let name = expr_var_name_at(texpr.clone(), scope.type_env.clone().source_indices.clone()); +let span = texpr.span.clone(); +match v2_rt::map_get(&scope.locals.clone(), name.clone()) { + Some(binding) => { + let binding_kind = infer_var_binding_kind(&scope, &name); +ok_infer(make_named_expr_node(&name, Rc::new(ExprData::ExprVar { + binding_kind: Some(binding_kind), +}), Rc::new(vec![]), Some(Rc::new(InferredNode::Resolved { + node: binding.resolved.clone(), +})), span.clone(), span.clone())) +}, + None => match lookup_func_sig(scope.func_env.clone(), name.clone()) { + Some(fsig) => if ((fsig.params.clone().len() as i64) == 0) { + ok_infer(make_named_expr_node(&name, Rc::new(ExprData::ExprCall { + call_semantics: Some(CallSemantics::PlainCallSemantics), + descent_evidence: None, +}), Rc::new(vec![]), Some(Rc::new(InferredNode::Resolved { + node: fsig.inferred.clone(), +})), span.clone(), span.clone())) + } else { + ok_infer(make_named_expr_node(&name, Rc::new(ExprData::ExprVar { + binding_kind: Some(Rc::new(VarBindingKind::FunctionValueBinding)), +}), Rc::new(vec![]), Some(Rc::new(InferredNode::Resolved { + node: resolved_callable_type(fsig.params.clone(), fsig.inferred.clone()), +})), span.clone(), span.clone())) + }, + None => { + let err_texpr = make_named_expr_node(&name, Rc::new(ExprData::ExprVar { + binding_kind: None, +}), Rc::new(vec![]), Some(Rc::new(InferredNode::Resolved { + node: error_type(), +})), span.clone(), span.clone()); +Rc::new(InferResult { + typed: err_texpr, + diagnostics: Rc::new(vec![inference_error(v2_rt::concat(v2_rt::concat("undefined variable '".to_string(), name.clone()), "'".to_string()), span.clone(), scope.module_name.clone())]), +}) +}, +}, +} +}, + ExprData::ExprFieldAccess { .. } => { + let field_name = field_access_field_at(texpr.clone(), scope.type_env.clone().source_indices.clone()); +let span = texpr.span.clone(); +let base_expr = field_access_base(texpr.clone()); +let base_result = infer_expr(&base_expr, &scope, &None); +let base_typed = base_result.typed.clone(); +let base_diags = base_result.diagnostics.clone(); +let base_rt = resolved_type(base_typed.clone()); +let resolved_base = resolve_scrutinee_type_node(scope.type_env.clone(), base_rt.clone()); +let resolved_base_is_error = if (resolved_base.inferred.clone() != None) { + is_compiler_error(resolved_base.inferred.clone().clone().unwrap()) + } else { + false + }; +if resolved_base_is_error { Rc::new(InferResult { - typed: make_expr_error_node(kind.clone(), &message, &span), - diagnostics: Rc::new(vec![]), - }) - } - ExprData::ExprVar { .. } => { - let name = - expr_var_name_at(texpr.clone(), scope.type_env.clone().source_indices.clone()); - let span = texpr.span.clone(); - match v2_rt::map_get(&scope.locals.clone(), name.clone()) { - Some(binding) => { - let binding_kind = infer_var_binding_kind(&scope, &name); - ok_infer(make_named_expr_node( - &name, - Rc::new(ExprData::ExprVar { - binding_kind: Some(binding_kind), - }), - Rc::new(vec![]), - Some(Rc::new(InferredNode::Resolved { - node: binding.resolved.clone(), - })), - span.clone(), - span.clone(), - )) - } - None => match lookup_func_sig(scope.func_env.clone(), name.clone()) { - Some(fsig) => { - if ((fsig.params.clone().len() as i64) == 0) { - ok_infer(make_named_expr_node( - &name, - Rc::new(ExprData::ExprCall { - call_semantics: Some(CallSemantics::PlainCallSemantics), - descent_evidence: None, - }), - Rc::new(vec![]), - Some(Rc::new(InferredNode::Resolved { - node: fsig.inferred.clone(), - })), - span.clone(), - span.clone(), - )) - } else { - ok_infer(make_named_expr_node( - &name, - Rc::new(ExprData::ExprVar { - binding_kind: Some(Rc::new( - VarBindingKind::FunctionValueBinding, - )), - }), - Rc::new(vec![]), - Some(Rc::new(InferredNode::Resolved { - node: resolved_callable_type( - fsig.params.clone(), - fsig.inferred.clone(), - ), - })), - span.clone(), - span.clone(), - )) - } - } - None => { - let err_texpr = make_named_expr_node( - &name, - Rc::new(ExprData::ExprVar { binding_kind: None }), - Rc::new(vec![]), - Some(Rc::new(InferredNode::Resolved { node: error_type() })), - span.clone(), - span.clone(), - ); - Rc::new(InferResult { - typed: err_texpr, - diagnostics: Rc::new(vec![inference_error( - v2_rt::concat( - v2_rt::concat( - "undefined variable '".to_string(), - name.clone(), - ), - "'".to_string(), - ), - span.clone(), - scope.module_name.clone(), - )]), - }) - } - }, - } - } - ExprData::ExprFieldAccess { .. } => { - let field_name = field_access_field_at( - texpr.clone(), - scope.type_env.clone().source_indices.clone(), - ); - let span = texpr.span.clone(); - let base_expr = field_access_base(texpr.clone()); - let base_result = infer_expr(&base_expr, &scope, &None); - let base_typed = base_result.typed.clone(); - let base_diags = base_result.diagnostics.clone(); - let base_rt = resolved_type(base_typed.clone()); - let resolved_base = - resolve_scrutinee_type_node(scope.type_env.clone(), base_rt.clone()); - let resolved_base_is_error = if (resolved_base.inferred.clone() != None) { - is_compiler_error(resolved_base.inferred.clone().clone().unwrap()) - } else { - false - }; - if resolved_base_is_error { - Rc::new(InferResult { - typed: make_expr_error_node( - ExprErrorKind::SemanticExprError, - &"error type cascade".to_string(), - &span, - ), - diagnostics: base_diags, - }) - } else { - match lookup_field_type_node( - &resolved_base, - &field_name, - scope.type_env.clone().source_indices.clone(), - ) { - Some(field_type) => { - let field_summary = field_summary_for_type( - base_rt.clone(), - &scope.type_env.clone(), - &field_name, - ); - let fa_texpr = make_named_expr_node( - &field_name, - Rc::new(ExprData::ExprFieldAccess { - summary: field_summary, - }), - Rc::new(vec![base_typed.clone()]), - Some(Rc::new(InferredNode::Resolved { - node: field_type.clone(), - })), - span.clone(), - node_name_span(&texpr), - ); - Rc::new(InferResult { - typed: fa_texpr, - diagnostics: base_diags, - }) - } - None => { - let base_is_type_var = if (resolved_base.inferred.clone() != None) { - is_type_variable(resolved_base.inferred.clone().clone().unwrap()) - } else { - false - }; - if base_is_type_var { - { - let fa_texpr = make_named_expr_node( - &field_name, - Rc::new(ExprData::ExprFieldAccess { - summary: Some(Rc::new(FieldSummary { - access_style: FieldAccessStyle::StoredField, - value_shape: FieldValueShape::PlainValue, - })), - }), - Rc::new(vec![base_typed.clone()]), - Some(Rc::new(InferredNode::TypeVariable { - id: "field_of_type_var".to_string(), - })), - span.clone(), - node_name_span(&texpr), - ); - Rc::new(InferResult { - typed: fa_texpr, - diagnostics: base_diags, - }) - } - } else { - match check_service_field_access_node( - &base_rt, - field_name.clone(), - scope.service_registry.clone(), - scope.type_env.clone().source_indices.clone(), - ) { - Some(svc_type) => { - let fa_texpr = make_named_expr_node( - &field_name, - Rc::new(ExprData::ExprFieldAccess { - summary: Some(Rc::new(FieldSummary { - access_style: FieldAccessStyle::StoredField, - value_shape: FieldValueShape::PlainValue, - })), - }), - Rc::new(vec![base_typed.clone()]), - Some(Rc::new(InferredNode::Resolved { - node: svc_type.clone(), - })), - span.clone(), - node_name_span(&texpr), - ); - Rc::new(InferResult { - typed: fa_texpr, - diagnostics: base_diags, - }) - } - None => { - let error_message = v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "no field '".to_string(), - field_name.clone(), - ), - "' on type '".to_string(), - ), - authored_name_at( - scope.type_env.clone().source_indices.clone(), - &resolved_base, - ), - ), - "'".to_string(), - ); - let fa_texpr = make_expr_error_node( - ExprErrorKind::SemanticExprError, - &error_message, - &span, - ); - Rc::new(InferResult { - typed: fa_texpr, - diagnostics: v2_rt::concat( - base_diags, - Rc::new(vec![inference_error( - error_message.clone(), - span.clone(), - scope.module_name.clone(), - )]), - ), - }) - } - } - } - } + typed: make_expr_error_node(ExprErrorKind::SemanticExprError, &"error type cascade".to_string(), &span), + diagnostics: base_diags, +}) + } else { + match lookup_field_type_node(&resolved_base, &field_name, scope.type_env.clone().source_indices.clone()) { + Some(field_type) => { + let field_summary = field_summary_for_type(base_rt.clone(), &scope.type_env.clone(), &field_name); +let fa_texpr = make_named_expr_node(&field_name, Rc::new(ExprData::ExprFieldAccess { + summary: field_summary, +}), Rc::new(vec![base_typed.clone()]), Some(Rc::new(InferredNode::Resolved { + node: field_type.clone(), +})), span.clone(), node_name_span(&texpr)); +Rc::new(InferResult { + typed: fa_texpr, + diagnostics: base_diags, +}) +}, + None => { + let base_is_type_var = if (resolved_base.inferred.clone() != None) { + is_type_variable(resolved_base.inferred.clone().clone().unwrap()) + } else { + false + }; +if base_is_type_var { + { + let fa_texpr = make_named_expr_node(&field_name, Rc::new(ExprData::ExprFieldAccess { + summary: Some(Rc::new(FieldSummary { + access_style: FieldAccessStyle::StoredField, + value_shape: FieldValueShape::PlainValue, +})), +}), Rc::new(vec![base_typed.clone()]), Some(Rc::new(InferredNode::TypeVariable { + id: "field_of_type_var".to_string(), +})), span.clone(), node_name_span(&texpr)); +Rc::new(InferResult { + typed: fa_texpr, + diagnostics: base_diags, +}) +} + } else { + match check_service_field_access_node(&base_rt, field_name.clone(), scope.service_registry.clone(), scope.type_env.clone().source_indices.clone()) { + Some(svc_type) => { + let fa_texpr = make_named_expr_node(&field_name, Rc::new(ExprData::ExprFieldAccess { + summary: Some(Rc::new(FieldSummary { + access_style: FieldAccessStyle::StoredField, + value_shape: FieldValueShape::PlainValue, +})), +}), Rc::new(vec![base_typed.clone()]), Some(Rc::new(InferredNode::Resolved { + node: svc_type.clone(), +})), span.clone(), node_name_span(&texpr)); +Rc::new(InferResult { + typed: fa_texpr, + diagnostics: base_diags, +}) +}, + None => { + let error_message = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("no field '".to_string(), field_name.clone()), "' on type '".to_string()), authored_name_at(scope.type_env.clone().source_indices.clone(), &resolved_base)), "'".to_string()); +let fa_texpr = make_expr_error_node(ExprErrorKind::SemanticExprError, &error_message, &span); +Rc::new(InferResult { + typed: fa_texpr, + diagnostics: v2_rt::concat(base_diags, Rc::new(vec![inference_error(error_message.clone(), span.clone(), scope.module_name.clone())])), +}) +}, +} } - } +}, +} } - ExprData::ExprCall { .. } => { - let func_name = - expr_call_func_at(texpr.clone(), scope.type_env.clone().source_indices.clone()); - let span = texpr.span.clone(); - let call_args = texpr.children.clone(); - let sig = lookup_func_sig(scope.func_env.clone(), func_name.clone()); - let sig_params = match sig.clone() { - Some(s) => s.params.clone(), - None => Rc::new(vec![]), - }; - let has_lambda = { - let mut __found = false; - for a in call_args.clone().iter().cloned() { - if is_lambda_expr(arg_value(&a)) { - __found = true; - break; - } - } - __found - }; - let call_method_args = Rc::new( - call_args - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ); - let call_method_name = Some(func_name.clone()); - let call_fold_info = extract_fold_init_info( - call_method_name.clone(), - &call_method_args, - 2, - &scope, - expected.clone(), - ); - let call_fold_acc_type = match call_fold_info.clone() { - Some(fi) => resolved_type(arg_value(&fi.typed_arg.clone())), - None => error_type(), - }; - let arg_infer_results = if ((has_lambda && ((call_args.clone().len() as i64) >= 2)) - && (sig.clone() == None)) - { - match call_args.clone().first().cloned() { - Some(first_arg) => { - let first_result = infer_expr(&arg_value(&first_arg), &scope, &None); - let first_type = resolved_type(first_result.typed.clone()); - let elem_type = for_each_element_type_node( - first_type, - scope.type_env.clone().source_indices.clone(), - ); - let call_elem_provenance = derive_element_provenance( - first_result.typed.clone(), - &elem_type, - &scope, - ); - let remaining_results = infer_method_args_with_fold( - call_method_name.clone(), - call_method_args.clone(), - call_fold_info.clone(), - call_fold_acc_type.clone(), - elem_type.clone(), - call_elem_provenance, - scope.clone(), - ); - v2_rt::concat( - Rc::new(vec![Rc::new(ArgInferResult { - typed_arg: make_arg_node( - arg_name_at( - first_arg.clone(), - scope.type_env.clone().source_indices.clone(), - ), - first_result.typed.clone(), - first_arg.span.clone(), - first_arg.span.clone(), - ), - diagnostics: first_result.diagnostics.clone(), - })]), - remaining_results, - ) - } - None => Rc::new(vec![]), - } - } else { - Rc::new({ - let mut __result = Vec::new(); - for pair in Rc::new( - call_args - .clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - { - __result.push({ - let a = pair.1.clone(); - let formal_param_type = match sig_params - .clone() - .get(pair.0.clone() as usize) - .cloned() - { - Some(p) => param_node_type_expr(&p), - None => type_variable_node("callable_param".to_string()), - }; - let has_formal = match sig_params - .clone() - .get(pair.0.clone() as usize) - .cloned() - { - Some(_) => true, - None => false, - }; - let expected = if has_formal.clone() { - Some(formal_param_type.clone()) - } else { - None - }; - let ar = infer_expr(&arg_value(&a), &scope, &expected); - Rc::new(ArgInferResult { - typed_arg: make_arg_node( - arg_name_at( - a.clone(), - scope.type_env.clone().source_indices.clone(), - ), - ar.typed.clone(), - a.span.clone(), - a.span.clone(), - ), - diagnostics: ar.diagnostics.clone(), - }) - }); - } - __result - }) - }; - let typed_args = Rc::new({ - let mut __result = Vec::new(); - for air in arg_infer_results.clone().iter().cloned() { - __result.push(air.typed_arg.clone()); - } - __result - }); - let arg_diags = Rc::new({ - let mut __result = Vec::new(); - for air in arg_infer_results.clone().iter().cloned() { - __result.extend((*air.diagnostics.clone()).iter().cloned()); - } - __result - }); - let typed_arg_nodes = typed_args.clone(); - if (sig.clone() != None) { - { - let resolved_type = match sig.clone() { - Some(s) => s.inferred.clone(), - None => error_type(), - }; - Rc::new(InferResult { - typed: make_named_expr_node( - &func_name, - Rc::new(ExprData::ExprCall { - call_semantics: Some(CallSemantics::PlainCallSemantics), - descent_evidence: None, - }), - typed_arg_nodes, - Some(Rc::new(InferredNode::Resolved { - node: resolved_type, - })), - span.clone(), - node_name_span(&texpr), - ), - diagnostics: arg_diags, - }) - } - } else { - { - let first_arg_type = match typed_args.clone().first().cloned() { - Some(ta) => resolved_type(arg_value(&ta)), - None => unit_type(), - }; - let method_receiver = match typed_args.clone().first().cloned() { - Some(ta) => arg_value(&ta), - None => internal_expr_error_node( - "method bridge missing receiver".to_string(), - span.clone(), - ), - }; - let call_acc_is_under_resolved = !is_fully_resolved( - &call_fold_acc_type, - &scope.type_env.clone().source_indices.clone(), - ); - let refined_call_fold_acc_type = - if ((call_fold_info.clone() != None) && call_acc_is_under_resolved) { - match Rc::new({ - let mut __result = Vec::new(); - for a in typed_args.clone().iter().cloned() { - if is_lambda_expr(arg_value(&a)) { - __result.push(a); - } - } - __result - }) - .first() - .cloned() - { - Some(lambda_arg) => resolved_type(arg_value(&lambda_arg)), - None => call_fold_acc_type.clone(), - } +}, + ExprData::ExprCall { .. } => { + let func_name = expr_call_func_at(texpr.clone(), scope.type_env.clone().source_indices.clone()); +let span = texpr.span.clone(); +let call_args = texpr.children.clone(); +let sig = lookup_func_sig(scope.func_env.clone(), func_name.clone()); +let sig_params = match sig.clone() { + Some(s) => s.params.clone(), + None => Rc::new(vec![]), +}; +let has_lambda = { let mut __found = false; for a in call_args.clone().iter().cloned() { if is_lambda_expr(arg_value(&a)) { __found = true; break; } } __found }; +let call_method_args = Rc::new(call_args.clone().iter().cloned().skip(1 as usize).collect::>()); +let call_method_name = Some(func_name.clone()); +let call_fold_info = extract_fold_init_info(call_method_name.clone(), &call_method_args, 2, &scope, expected.clone()); +let call_fold_acc_type = match call_fold_info.clone() { + Some(fi) => resolved_type(arg_value(&fi.typed_arg.clone())), + None => error_type(), +}; +let arg_infer_results = if ((has_lambda && ((call_args.clone().len() as i64) >= 2)) && (sig.clone() == None)) { + match call_args.clone().first().cloned() { + Some(first_arg) => { + let first_result = infer_expr(&arg_value(&first_arg), &scope, &None); +let first_type = resolved_type(first_result.typed.clone()); +let elem_type = for_each_element_type_node(first_type, scope.type_env.clone().source_indices.clone()); +let call_elem_provenance = derive_element_provenance(first_result.typed.clone(), &elem_type, &scope); +let remaining_results = infer_method_args_with_fold(call_method_name.clone(), call_method_args.clone(), call_fold_info.clone(), call_fold_acc_type.clone(), elem_type.clone(), call_elem_provenance, scope.clone()); +v2_rt::concat(Rc::new(vec![Rc::new(ArgInferResult { + typed_arg: make_arg_node(arg_name_at(first_arg.clone(), scope.type_env.clone().source_indices.clone()), first_result.typed.clone(), first_arg.span.clone(), first_arg.span.clone()), + diagnostics: first_result.diagnostics.clone(), +})]), remaining_results) +}, + None => Rc::new(vec![]), +} + } else { + Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(call_args.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { __result.push({ + let a = pair.1.clone(); +let formal_param_type = match sig_params.clone().get(pair.0.clone() as usize).cloned() { + Some(p) => param_node_type_expr(&p), + None => type_variable_node("callable_param".to_string()), +}; +let has_formal = match sig_params.clone().get(pair.0.clone() as usize).cloned() { + Some(_) => true, + None => false, +}; +let expected = if has_formal.clone() { + Some(formal_param_type.clone()) + } else { + None + }; +let ar = infer_expr(&arg_value(&a), &scope, &expected); +Rc::new(ArgInferResult { + typed_arg: make_arg_node(arg_name_at(a.clone(), scope.type_env.clone().source_indices.clone()), ar.typed.clone(), a.span.clone(), a.span.clone()), + diagnostics: ar.diagnostics.clone(), +}) +}); } __result }) + }; +let typed_args = Rc::new({ let mut __result = Vec::new(); for air in arg_infer_results.clone().iter().cloned() { __result.push(air.typed_arg.clone()); } __result }); +let arg_diags = Rc::new({ let mut __result = Vec::new(); for air in arg_infer_results.clone().iter().cloned() { __result.extend((*air.diagnostics.clone()).iter().cloned()); } __result }); +let typed_arg_nodes = typed_args.clone(); +if (sig.clone() != None) { + { + let resolved_type = match sig.clone() { + Some(s) => s.inferred.clone(), + None => error_type(), +}; +Rc::new(InferResult { + typed: make_named_expr_node(&func_name, Rc::new(ExprData::ExprCall { + call_semantics: Some(CallSemantics::PlainCallSemantics), + descent_evidence: None, +}), typed_arg_nodes, Some(Rc::new(InferredNode::Resolved { + node: resolved_type, +})), span.clone(), node_name_span(&texpr)), + diagnostics: arg_diags, +}) +} + } else { + { + let first_arg_type = match typed_args.clone().first().cloned() { + Some(ta) => resolved_type(arg_value(&ta)), + None => unit_type(), +}; +let method_receiver = match typed_args.clone().first().cloned() { + Some(ta) => arg_value(&ta), + None => internal_expr_error_node("method bridge missing receiver".to_string(), span.clone()), +}; +let call_acc_is_under_resolved = !is_fully_resolved(&call_fold_acc_type, &scope.type_env.clone().source_indices.clone()); +let refined_call_fold_acc_type = if ((call_fold_info.clone() != None) && call_acc_is_under_resolved) { + match Rc::new({ let mut __result = Vec::new(); for a in typed_args.clone().iter().cloned() { if is_lambda_expr(arg_value(&a)) { __result.push(a); } } __result }).first().cloned() { + Some(lambda_arg) => resolved_type(arg_value(&lambda_arg)), + None => call_fold_acc_type.clone(), +} + } else { + call_fold_acc_type.clone() + }; +let method_resolution = resolve_known_method_node(method_receiver.clone(), &first_arg_type, &func_name, if (call_fold_info.clone() != None) { + Some(refined_call_fold_acc_type.clone()) + } else { + None + }, scope.service_registry.clone(), &scope.type_env.clone().source_indices.clone()); +let is_known_method = (method_resolution.result_type.clone() != None); +if (is_known_method && ((typed_args.clone().len() as i64) > 0)) { + { + let receiver = method_receiver.clone(); +let remaining = Rc::new(typed_args.clone().iter().cloned().skip(1 as usize).collect::>()); +let base_result_type = match method_resolution.result_type.clone() { + Some(mt) => mt.clone(), + None => error_type(), +}; +let method_tv = if (method_resolution.semantics.clone() == None) { + Rc::new(KernelTypeBuild { + ty: base_result_type.clone(), + diagnostics: Rc::new(vec![]), +}) + } else { + match (*method_resolution.semantics.clone().clone().unwrap()).clone() { + MethodSemantics::AlgebraMethodSemantics { algebra_template: at, .. } => match at.clone() { + Some(t) => if (template_return_has_variables(t.clone()) || !is_fully_resolved(&base_result_type, &scope.type_env.clone().source_indices.clone())) { + { + let call_arg_types = Rc::new({ let mut __result = Vec::new(); for a in remaining.clone().iter().cloned() { __result.push(resolved_type(arg_value(&a))); } __result }); +let fold_overrides = if (call_fold_info.clone() != None) { + fold_override_map("FoldAccumulator".to_string(), refined_call_fold_acc_type.clone()) + } else { + empty_override_map() + }; +resolve_type_variables_from_template(&t, call_arg_types, &first_arg_type, fold_overrides, &scope.type_env.clone().source_indices.clone()) +} + } else { + Rc::new(KernelTypeBuild { + ty: base_result_type.clone(), + diagnostics: Rc::new(vec![]), +}) + }, + None => Rc::new(KernelTypeBuild { + ty: base_result_type.clone(), + diagnostics: Rc::new(vec![]), +}), +}, + _ => Rc::new(KernelTypeBuild { + ty: base_result_type.clone(), + diagnostics: Rc::new(vec![]), +}), +} + }; +let bridge_result_type = method_tv.ty.clone(); +let template_subst_diags = method_tv.diagnostics.clone(); +let returns_receiver_self = if (method_resolution.semantics.clone() == None) { + false } else { - call_fold_acc_type.clone() + match (*method_resolution.semantics.clone().clone().unwrap()).clone() { + MethodSemantics::AlgebraMethodSemantics { algebra_template: at, .. } => match at.clone() { + Some(t) => template_return_is_receiver_self(t.clone()), + None => false, +}, + _ => false, +} }; - let method_resolution = resolve_known_method_node( - method_receiver.clone(), - &first_arg_type, - &func_name, - if (call_fold_info.clone() != None) { - Some(refined_call_fold_acc_type.clone()) +let final_receiver = if ((returns_receiver_self && is_fully_resolved(&bridge_result_type, &scope.type_env.clone().source_indices.clone())) && !is_fully_resolved(&first_arg_type, &scope.type_env.clone().source_indices.clone())) { + Rc::new(Node { + name: receiver.name.clone(), + span: receiver.span.clone(), + ident_span: receiver.ident_span.clone(), + children: bridge_result_type.children.clone(), + connective: receiver.connective.clone(), + params: receiver.params.clone(), + inferred: Some(Rc::new(InferredNode::Resolved { + node: bridge_result_type.clone(), +})), + return_cardinality: receiver.return_cardinality.clone(), + uses: receiver.uses.clone(), + body: receiver.body.clone(), + transport: receiver.transport.clone(), + properties: receiver.properties.clone(), + type_annotation: receiver.type_annotation.clone(), + is_self_recursive: receiver.is_self_recursive.clone(), + has_non_tail_self_call: receiver.has_non_tail_self_call.clone(), + match_pattern: receiver.match_pattern.clone(), + expr_data: receiver.expr_data.clone(), + ident: None, +}) } else { - None - }, - scope.service_registry.clone(), - &scope.type_env.clone().source_indices.clone(), - ); - let is_known_method = (method_resolution.result_type.clone() != None); - if (is_known_method && ((typed_args.clone().len() as i64) > 0)) { + receiver.clone() + }; +let remaining_arg_nodes = Rc::new({ let mut __result = Vec::new(); for ta in remaining.clone().iter().cloned() { __result.push(make_arg_node(arg_name_at(ta.clone(), scope.type_env.clone().source_indices.clone()), arg_value(&ta), span.clone(), span.clone())); } __result }); +Rc::new(InferResult { + typed: make_named_expr_node(&func_name, Rc::new(ExprData::ExprMethodCall { + method_semantics: method_resolution.semantics.clone(), +}), v2_rt::concat(Rc::new(vec![final_receiver]), remaining_arg_nodes), Some(Rc::new(InferredNode::Resolved { + node: bridge_result_type.clone(), +})), span.clone(), node_name_span(&texpr)), + diagnostics: v2_rt::concat(v2_rt::concat(arg_diags, method_resolution.diagnostics.clone()), template_subst_diags), +}) +} + } else { + if (func_name.clone().as_str() == "empty_map".to_string().as_str()) { { - let receiver = method_receiver.clone(); - let remaining = Rc::new( - typed_args - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ); - let base_result_type = match method_resolution.result_type.clone() { - Some(mt) => mt.clone(), - None => error_type(), - }; - let method_tv = if (method_resolution.semantics.clone() == None) { - Rc::new(KernelTypeBuild { - ty: base_result_type.clone(), - diagnostics: Rc::new(vec![]), - }) - } else { - match (*method_resolution.semantics.clone().clone().unwrap()) - .clone() - { - MethodSemantics::AlgebraMethodSemantics { - algebra_template: at, - .. - } => match at.clone() { - Some(t) => { - if (template_return_has_variables(t.clone()) - || !is_fully_resolved( - &base_result_type, - &scope - .type_env - .clone() - .source_indices - .clone(), - )) - { - { - let call_arg_types = Rc::new({ - let mut __result = Vec::new(); - for a in - remaining.clone().iter().cloned() - { - __result.push(resolved_type( - arg_value(&a), - )); - } - __result - }); - let fold_overrides = - if (call_fold_info.clone() != None) { - fold_override_map( - "FoldAccumulator".to_string(), - refined_call_fold_acc_type - .clone(), - ) - } else { - empty_override_map() - }; - resolve_type_variables_from_template( - &t, - call_arg_types, - &first_arg_type, - fold_overrides, - &scope - .type_env - .clone() - .source_indices - .clone(), - ) - } - } else { - Rc::new(KernelTypeBuild { - ty: base_result_type.clone(), - diagnostics: Rc::new(vec![]), - }) - } - } - None => Rc::new(KernelTypeBuild { - ty: base_result_type.clone(), - diagnostics: Rc::new(vec![]), - }), - }, - _ => Rc::new(KernelTypeBuild { - ty: base_result_type.clone(), - diagnostics: Rc::new(vec![]), - }), - } - }; - let bridge_result_type = method_tv.ty.clone(); - let template_subst_diags = method_tv.diagnostics.clone(); - let returns_receiver_self = if (method_resolution.semantics.clone() - == None) - { - false - } else { - match (*method_resolution.semantics.clone().clone().unwrap()) - .clone() - { - MethodSemantics::AlgebraMethodSemantics { - algebra_template: at, - .. - } => match at.clone() { - Some(t) => template_return_is_receiver_self(t.clone()), - None => false, - }, - _ => false, - } - }; - let final_receiver = if ((returns_receiver_self - && is_fully_resolved( - &bridge_result_type, - &scope.type_env.clone().source_indices.clone(), - )) - && !is_fully_resolved( - &first_arg_type, - &scope.type_env.clone().source_indices.clone(), - )) { - Rc::new(Node { - name: receiver.name.clone(), - span: receiver.span.clone(), - ident_span: receiver.ident_span.clone(), - children: bridge_result_type.children.clone(), - connective: receiver.connective.clone(), - params: receiver.params.clone(), - inferred: Some(Rc::new(InferredNode::Resolved { - node: bridge_result_type.clone(), - })), - return_cardinality: receiver.return_cardinality.clone(), - uses: receiver.uses.clone(), - body: receiver.body.clone(), - transport: receiver.transport.clone(), - properties: receiver.properties.clone(), - type_annotation: receiver.type_annotation.clone(), - is_self_recursive: receiver.is_self_recursive.clone(), - has_non_tail_self_call: receiver - .has_non_tail_self_call - .clone(), - match_pattern: receiver.match_pattern.clone(), - expr_data: receiver.expr_data.clone(), - ident: None, - }) - } else { - receiver.clone() - }; - let remaining_arg_nodes = Rc::new({ - let mut __result = Vec::new(); - for ta in remaining.clone().iter().cloned() { - __result.push(make_arg_node( - arg_name_at( - ta.clone(), - scope.type_env.clone().source_indices.clone(), - ), - arg_value(&ta), - span.clone(), - span.clone(), - )); - } - __result - }); - Rc::new(InferResult { - typed: make_named_expr_node( - &func_name, - Rc::new(ExprData::ExprMethodCall { - method_semantics: method_resolution.semantics.clone(), - }), - v2_rt::concat( - Rc::new(vec![final_receiver]), - remaining_arg_nodes, - ), - Some(Rc::new(InferredNode::Resolved { - node: bridge_result_type.clone(), - })), - span.clone(), - node_name_span(&texpr), - ), - diagnostics: v2_rt::concat( - v2_rt::concat( - arg_diags, - method_resolution.diagnostics.clone(), - ), - template_subst_diags, - ), - }) - } - } else { - if (func_name.clone().as_str() == "empty_map".to_string().as_str()) { - { - let bare_m = bare_map_node(); - match expected.clone() { + let bare_m = bare_map_node(); +match expected.clone() { Some(exp) => if node_is_keyed_collection(&exp, scope.type_env.clone().source_indices.clone()) { Rc::new(InferResult { typed: make_named_expr_node(&func_name, Rc::new(ExprData::ExprCall { @@ -2605,1758 +1561,976 @@ match bare_m { }), }, } - } +} + } else { + if (infer_builtin_call_type(func_name.clone()) != None) { + { + let tier2b = infer_tier2b_builtin_with_kernel_diags(&func_name, typed_args.clone(), scope.clone(), span.clone()); +let bt = tier2b.bt.clone(); +let call_semantics = if (func_name.clone().as_str() == "lookup".to_string().as_str()) { + Some(CallSemantics::LookupCallSemantics) + } else { + Some(CallSemantics::PlainCallSemantics) + }; +Rc::new(InferResult { + typed: make_named_expr_node(&func_name, Rc::new(ExprData::ExprCall { + call_semantics: call_semantics, + descent_evidence: None, +}), typed_arg_nodes, Some(Rc::new(InferredNode::Resolved { + node: bt, +})), span.clone(), node_name_span(&texpr)), + diagnostics: v2_rt::concat(arg_diags, tier2b.kernel_diags.clone()), +}) +} } else { - if (infer_builtin_call_type(func_name.clone()) != None) { - { - let tier2b = infer_tier2b_builtin_with_kernel_diags( - &func_name, - typed_args.clone(), - scope.clone(), - span.clone(), - ); - let bt = tier2b.bt.clone(); - let call_semantics = if (func_name.clone().as_str() - == "lookup".to_string().as_str()) + { + let callable_local = match v2_rt::map_get(&scope.locals.clone(), func_name.clone()) { + Some(binding) => if ((binding.resolved.clone().params.clone().len() as i64) > 0) { + Some(binding.resolved.clone()) + } else { + None + }, + None => None, +}; +if (callable_local.clone() != None) { { - Some(CallSemantics::LookupCallSemantics) - } else { - Some(CallSemantics::PlainCallSemantics) - }; - Rc::new(InferResult { - typed: make_named_expr_node( - &func_name, - Rc::new(ExprData::ExprCall { - call_semantics: call_semantics, - descent_evidence: None, - }), - typed_arg_nodes, - Some(Rc::new(InferredNode::Resolved { node: bt })), - span.clone(), - node_name_span(&texpr), - ), - diagnostics: v2_rt::concat( - arg_diags, - tier2b.kernel_diags.clone(), - ), - }) - } - } else { - { - let callable_local = match v2_rt::map_get( - &scope.locals.clone(), - func_name.clone(), - ) { - Some(binding) => { - if ((binding.resolved.clone().params.clone().len() - as i64) - > 0) - { - Some(binding.resolved.clone()) - } else { - None - } - } - None => None, - }; - if (callable_local.clone() != None) { - { - let callable_type = match callable_local.clone() { - Some(ct) => ct.clone(), - None => error_type(), - }; - let resolved_type = - callable_inferred(&callable_type); - Rc::new(InferResult { - typed: make_named_expr_node( - &func_name, - Rc::new(ExprData::ExprCall { - call_semantics: Some( - CallSemantics::PlainCallSemantics, - ), - descent_evidence: None, - }), - typed_arg_nodes, - Some(Rc::new(InferredNode::Resolved { - node: resolved_type, - })), - span.clone(), - node_name_span(&texpr), - ), - diagnostics: arg_diags, - }) - } - } else { - { - let type_match = lookup_type_by_name( - &scope.type_env.clone(), - func_name.clone(), - ); - let resolved_type = match type_match.clone() { - Some(tn) => tn.clone(), - None => error_type(), - }; - let call_diags = match type_match.clone() { - Some(_) => Rc::new(vec![]), - None => Rc::new(vec![inference_error( - v2_rt::concat( - v2_rt::concat( - "function '".to_string(), - func_name.clone(), - ), - "' not found in scope".to_string(), - ), - span.clone(), - scope.module_name.clone(), - )]), - }; - Rc::new(InferResult { - typed: make_named_expr_node( - &func_name, - Rc::new(ExprData::ExprCall { - call_semantics: Some( - CallSemantics::PlainCallSemantics, - ), - descent_evidence: None, - }), - typed_arg_nodes, - Some(Rc::new(InferredNode::Resolved { - node: resolved_type, - })), - span.clone(), - node_name_span(&texpr), - ), - diagnostics: v2_rt::concat( - arg_diags, call_diags, - ), - }) - } - } + let callable_type = match callable_local.clone() { + Some(ct) => ct.clone(), + None => error_type(), +}; +let resolved_type = callable_inferred(&callable_type); +Rc::new(InferResult { + typed: make_named_expr_node(&func_name, Rc::new(ExprData::ExprCall { + call_semantics: Some(CallSemantics::PlainCallSemantics), + descent_evidence: None, +}), typed_arg_nodes, Some(Rc::new(InferredNode::Resolved { + node: resolved_type, +})), span.clone(), node_name_span(&texpr)), + diagnostics: arg_diags, +}) +} + } else { + { + let type_match = lookup_type_by_name(&scope.type_env.clone(), func_name.clone()); +let resolved_type = match type_match.clone() { + Some(tn) => tn.clone(), + None => error_type(), +}; +let call_diags = match type_match.clone() { + Some(_) => Rc::new(vec![]), + None => Rc::new(vec![inference_error(v2_rt::concat(v2_rt::concat("function '".to_string(), func_name.clone()), "' not found in scope".to_string()), span.clone(), scope.module_name.clone())]), +}; +Rc::new(InferResult { + typed: make_named_expr_node(&func_name, Rc::new(ExprData::ExprCall { + call_semantics: Some(CallSemantics::PlainCallSemantics), + descent_evidence: None, +}), typed_arg_nodes, Some(Rc::new(InferredNode::Resolved { + node: resolved_type, +})), span.clone(), node_name_span(&texpr)), + diagnostics: v2_rt::concat(arg_diags, call_diags), +}) +} } - } +} } } } - } +} } - ExprData::ExprMethodCall { .. } => { - let method_name = expr_method_name_at( - texpr.clone(), - scope.type_env.clone().source_indices.clone(), - ); - let span = texpr.span.clone(); - let recv = method_receiver(texpr.clone()); - let mc_args = method_arg_nodes(texpr.clone()); - let recv_result = infer_expr(&recv, &scope, &None); - let recv_typed = recv_result.typed.clone(); - let recv_diags = recv_result.diagnostics.clone(); - let recv_rt = resolved_type(recv_typed.clone()); - let recv_elem_type = for_each_element_type_node( - recv_rt.clone(), - scope.type_env.clone().source_indices.clone(), - ); - let mc_method_name = Some(method_name.clone()); - let fold_info = extract_fold_init_info( - mc_method_name.clone(), - &mc_args, - 2, - &scope, - expected.clone(), - ); - let fold_acc_type = match fold_info.clone() { - Some(fi) => resolved_type(arg_value(&fi.typed_arg.clone())), - None => error_type(), - }; - let mc_elem_provenance = - derive_element_provenance(recv_typed.clone(), &recv_elem_type, &scope); - let mc_arg_infer_results = infer_method_args_with_fold( - mc_method_name.clone(), - mc_args.clone(), - fold_info.clone(), - fold_acc_type.clone(), - recv_elem_type.clone(), - mc_elem_provenance, - scope.clone(), - ); - let typed_mc_args = Rc::new({ - let mut __result = Vec::new(); - for air in mc_arg_infer_results.clone().iter().cloned() { - __result.push(air.typed_arg.clone()); - } - __result - }); - let mc_arg_diags = Rc::new({ - let mut __result = Vec::new(); - for air in mc_arg_infer_results.clone().iter().cloned() { - __result.extend((*air.diagnostics.clone()).iter().cloned()); - } - __result - }); - let mc_acc_is_under_resolved = !is_fully_resolved( - &fold_acc_type, - &scope.type_env.clone().source_indices.clone(), - ); - let refined_fold_acc_type = - if ((fold_info.clone() != None) && mc_acc_is_under_resolved) { - match Rc::new({ - let mut __result = Vec::new(); - for a in typed_mc_args.clone().iter().cloned() { - if is_lambda_expr(arg_value(&a)) { - __result.push(a); - } - } - __result - }) - .first() - .cloned() - { - Some(lambda_arg) => resolved_type(arg_value(&lambda_arg)), - None => fold_acc_type.clone(), - } - } else { - fold_acc_type.clone() - }; - let method_resolution = resolve_known_method_node( - recv_typed.clone(), - &recv_rt, - &method_name, - if (fold_info.clone() != None) { - Some(refined_fold_acc_type.clone()) - } else { - None - }, - scope.service_registry.clone(), - &scope.type_env.clone().source_indices.clone(), - ); - let pipe_fb = match method_resolution.result_type.clone() { - Some(rt) => Rc::new(MethodPipeFallback { - result_ty: rt.clone(), - kernel_diags: Rc::new(vec![]), - }), - None => method_pipe_map_keys_values_fallback( - &recv_rt, - &method_name, - scope.clone(), - span.clone(), - ), - }; - let base_result_type = pipe_fb.result_ty.clone(); - let method_tv_mc = if (method_resolution.semantics.clone() == None) { +}, + ExprData::ExprMethodCall { .. } => { + let method_name = expr_method_name_at(texpr.clone(), scope.type_env.clone().source_indices.clone()); +let span = texpr.span.clone(); +let recv = method_receiver(texpr.clone()); +let mc_args = method_arg_nodes(texpr.clone()); +let recv_result = infer_expr(&recv, &scope, &None); +let recv_typed = recv_result.typed.clone(); +let recv_diags = recv_result.diagnostics.clone(); +let recv_rt = resolved_type(recv_typed.clone()); +let recv_elem_type = for_each_element_type_node(recv_rt.clone(), scope.type_env.clone().source_indices.clone()); +let mc_method_name = Some(method_name.clone()); +let fold_info = extract_fold_init_info(mc_method_name.clone(), &mc_args, 2, &scope, expected.clone()); +let fold_acc_type = match fold_info.clone() { + Some(fi) => resolved_type(arg_value(&fi.typed_arg.clone())), + None => error_type(), +}; +let mc_elem_provenance = derive_element_provenance(recv_typed.clone(), &recv_elem_type, &scope); +let mc_arg_infer_results = infer_method_args_with_fold(mc_method_name.clone(), mc_args.clone(), fold_info.clone(), fold_acc_type.clone(), recv_elem_type.clone(), mc_elem_provenance, scope.clone()); +let typed_mc_args = Rc::new({ let mut __result = Vec::new(); for air in mc_arg_infer_results.clone().iter().cloned() { __result.push(air.typed_arg.clone()); } __result }); +let mc_arg_diags = Rc::new({ let mut __result = Vec::new(); for air in mc_arg_infer_results.clone().iter().cloned() { __result.extend((*air.diagnostics.clone()).iter().cloned()); } __result }); +let mc_acc_is_under_resolved = !is_fully_resolved(&fold_acc_type, &scope.type_env.clone().source_indices.clone()); +let refined_fold_acc_type = if ((fold_info.clone() != None) && mc_acc_is_under_resolved) { + match Rc::new({ let mut __result = Vec::new(); for a in typed_mc_args.clone().iter().cloned() { if is_lambda_expr(arg_value(&a)) { __result.push(a); } } __result }).first().cloned() { + Some(lambda_arg) => resolved_type(arg_value(&lambda_arg)), + None => fold_acc_type.clone(), +} + } else { + fold_acc_type.clone() + }; +let method_resolution = resolve_known_method_node(recv_typed.clone(), &recv_rt, &method_name, if (fold_info.clone() != None) { + Some(refined_fold_acc_type.clone()) + } else { + None + }, scope.service_registry.clone(), &scope.type_env.clone().source_indices.clone()); +let pipe_fb = match method_resolution.result_type.clone() { + Some(rt) => Rc::new(MethodPipeFallback { + result_ty: rt.clone(), + kernel_diags: Rc::new(vec![]), +}), + None => method_pipe_map_keys_values_fallback(&recv_rt, &method_name, scope.clone(), span.clone()), +}; +let base_result_type = pipe_fb.result_ty.clone(); +let method_tv_mc = if (method_resolution.semantics.clone() == None) { + Rc::new(KernelTypeBuild { + ty: base_result_type.clone(), + diagnostics: Rc::new(vec![]), +}) + } else { + match (*method_resolution.semantics.clone().clone().unwrap()).clone() { + MethodSemantics::AlgebraMethodSemantics { algebra_template: at, .. } => match at.clone() { + Some(t) => if (template_return_has_variables(t.clone()) || !is_fully_resolved(&base_result_type, &scope.type_env.clone().source_indices.clone())) { + { + let mc_arg_types = Rc::new({ let mut __result = Vec::new(); for a in typed_mc_args.clone().iter().cloned() { __result.push(resolved_type(arg_value(&a))); } __result }); +let mc_fold_overrides = if (fold_info.clone() != None) { + fold_override_map("FoldAccumulator".to_string(), refined_fold_acc_type.clone()) + } else { + empty_override_map() + }; +resolve_type_variables_from_template(&t, mc_arg_types, &recv_rt, mc_fold_overrides, &scope.type_env.clone().source_indices.clone()) +} + } else { Rc::new(KernelTypeBuild { - ty: base_result_type.clone(), - diagnostics: Rc::new(vec![]), - }) + ty: base_result_type.clone(), + diagnostics: Rc::new(vec![]), +}) + }, + None => Rc::new(KernelTypeBuild { + ty: base_result_type.clone(), + diagnostics: Rc::new(vec![]), +}), +}, + _ => Rc::new(KernelTypeBuild { + ty: base_result_type.clone(), + diagnostics: Rc::new(vec![]), +}), +} + }; +let result_type = method_tv_mc.ty.clone(); +let mc_template_diags = method_tv_mc.diagnostics.clone(); +let method_semantics = if (method_resolution.semantics.clone() != None) { + method_resolution.semantics.clone() + } else { + Some(Rc::new(MethodSemantics::PlainMethodSemantics)) + }; +let typed_mc_arg_nodes = typed_mc_args.clone(); +let mc_texpr = make_named_expr_node(&method_name, Rc::new(ExprData::ExprMethodCall { + method_semantics: method_semantics, +}), v2_rt::concat(Rc::new(vec![recv_typed.clone()]), typed_mc_arg_nodes), Some(Rc::new(InferredNode::Resolved { + node: result_type, +})), span.clone(), node_name_span(&texpr)); +Rc::new(InferResult { + typed: mc_texpr, + diagnostics: v2_rt::concat(v2_rt::concat(v2_rt::concat(recv_diags, mc_arg_diags), pipe_fb.kernel_diags.clone()), v2_rt::concat(method_resolution.diagnostics.clone(), mc_template_diags)), +}) +}, + ExprData::ExprMatch => { + let span = texpr.span.clone(); +let scrut = match_scrutinee(texpr.clone()); +let arm_nodes = match_arm_nodes(texpr.clone()); +let scrut_result = infer_expr(&scrut, &scope, &None); +let scrut_typed = scrut_result.typed.clone(); +let scrut_diags = scrut_result.diagnostics.clone(); +let scrut_rt = resolved_type(scrut_typed.clone()); +let scrut_subject = pattern_subject_from_inferred(scrut_typed.inferred.clone()); +let scrut_provenance = classify_binding_provenance(&scrut, &scope); +let arm_infer_results = Rc::new({ let mut __result = Vec::new(); for arm_node in arm_nodes.clone().iter().cloned() { __result.push({ + let arm_pat = arm_pattern(arm_node.clone()); +let arm_g = arm_guard(&arm_node); +let arm_b = arm_body(&arm_node); +let typed_pattern = annotate_pattern_parent_enums(arm_pat.clone(), scrut_subject.clone(), &scope); +let pattern_result = extend_scope_with_pattern_node(&scope, typed_pattern.clone(), &scrut_subject, scrut_provenance.clone()); +let arm_scope = pattern_result.scope.clone(); +let pattern_diags = pattern_result.diagnostics.clone(); +let guard_result = if (arm_g.clone() != None) { + Some(infer_expr(&arm_g.clone().unwrap(), &arm_scope, &None)) } else { - match (*method_resolution.semantics.clone().clone().unwrap()).clone() { - MethodSemantics::AlgebraMethodSemantics { - algebra_template: at, - .. - } => match at.clone() { - Some(t) => { - if (template_return_has_variables(t.clone()) - || !is_fully_resolved( - &base_result_type, - &scope.type_env.clone().source_indices.clone(), - )) - { - { - let mc_arg_types = Rc::new({ - let mut __result = Vec::new(); - for a in typed_mc_args.clone().iter().cloned() { - __result.push(resolved_type(arg_value(&a))); - } - __result - }); - let mc_fold_overrides = if (fold_info.clone() != None) { - fold_override_map( - "FoldAccumulator".to_string(), - refined_fold_acc_type.clone(), - ) - } else { - empty_override_map() - }; - resolve_type_variables_from_template( - &t, - mc_arg_types, - &recv_rt, - mc_fold_overrides, - &scope.type_env.clone().source_indices.clone(), - ) - } - } else { - Rc::new(KernelTypeBuild { - ty: base_result_type.clone(), - diagnostics: Rc::new(vec![]), - }) - } - } - None => Rc::new(KernelTypeBuild { - ty: base_result_type.clone(), - diagnostics: Rc::new(vec![]), - }), - }, - _ => Rc::new(KernelTypeBuild { - ty: base_result_type.clone(), - diagnostics: Rc::new(vec![]), - }), - } + None }; - let result_type = method_tv_mc.ty.clone(); - let mc_template_diags = method_tv_mc.diagnostics.clone(); - let method_semantics = if (method_resolution.semantics.clone() != None) { - method_resolution.semantics.clone() +let body_result = infer_expr(&arm_b, &arm_scope, &expected); +let body_typed = body_result.typed.clone(); +let body_diags = body_result.diagnostics.clone(); +let guard_unwrapped = match guard_result.clone() { + Some(gr) => gr.clone(), + None => Rc::new(InferResult { + typed: arm_b.clone(), + diagnostics: Rc::new(vec![]), +}), +}; +let guard_diags = if (guard_result.clone() != None) { + guard_unwrapped.diagnostics.clone() } else { - Some(Rc::new(MethodSemantics::PlainMethodSemantics)) + Rc::new(vec![]) }; - let typed_mc_arg_nodes = typed_mc_args.clone(); - let mc_texpr = make_named_expr_node( - &method_name, - Rc::new(ExprData::ExprMethodCall { - method_semantics: method_semantics, - }), - v2_rt::concat(Rc::new(vec![recv_typed.clone()]), typed_mc_arg_nodes), - Some(Rc::new(InferredNode::Resolved { node: result_type })), - span.clone(), - node_name_span(&texpr), - ); - Rc::new(InferResult { - typed: mc_texpr, - diagnostics: v2_rt::concat( - v2_rt::concat( - v2_rt::concat(recv_diags, mc_arg_diags), - pipe_fb.kernel_diags.clone(), - ), - v2_rt::concat(method_resolution.diagnostics.clone(), mc_template_diags), - ), - }) - } - ExprData::ExprMatch => { - let span = texpr.span.clone(); - let scrut = match_scrutinee(texpr.clone()); - let arm_nodes = match_arm_nodes(texpr.clone()); - let scrut_result = infer_expr(&scrut, &scope, &None); - let scrut_typed = scrut_result.typed.clone(); - let scrut_diags = scrut_result.diagnostics.clone(); - let scrut_rt = resolved_type(scrut_typed.clone()); - let scrut_subject = pattern_subject_from_inferred(scrut_typed.inferred.clone()); - let scrut_provenance = classify_binding_provenance(&scrut, &scope); - let arm_infer_results = Rc::new({ - let mut __result = Vec::new(); - for arm_node in arm_nodes.clone().iter().cloned() { - __result.push({ +Rc::new(ArmInferResult { + typed_arm: make_arm_node(typed_pattern.clone(), if (guard_result.clone() != None) { + Some(guard_unwrapped.typed.clone()) + } else { + None + }, body_typed.clone(), span.clone()), + diagnostics: v2_rt::concat(pattern_diags.clone(), v2_rt::concat(guard_diags.clone(), body_diags.clone())), + body_type: resolved_type(body_typed.clone()), +}) +}); } __result }); +let arm_body_types = Rc::new({ let mut __result = Vec::new(); for ar in arm_infer_results.clone().iter().cloned() { __result.push(ar.body_type.clone()); } __result }); +let unified_arm_type = match arm_body_types.clone().first().cloned() { + Some(first_type) => Rc::new(arm_body_types.clone().iter().cloned().skip(1 as usize).collect::>()).iter().cloned().fold(first_type, |acc: Rc, t: Rc| prefer_specific_type(acc, t.clone(), &scope.type_env.clone().source_indices.clone())), + None => scrut_rt.clone(), +}; +let arm_infer_results = if is_fully_resolved(&unified_arm_type, &scope.type_env.clone().source_indices.clone()) { + Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(arm_nodes.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { __result.push({ + let idx = pair.0.clone(); +let arm_node = pair.1.clone(); +let original_list = Rc::new({ let mut __result = Vec::new(); for ap in Rc::new({ let mut __result = Vec::new(); for ap in Rc::new(arm_infer_results.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { if (ap.0.clone() == idx.clone()) { __result.push(ap); } } __result }).iter().cloned() { __result.push(ap.1.clone()); } __result }); +let original = match original_list.clone().first().cloned() { + Some(ar) => ar.clone(), + None => Rc::new(ArmInferResult { + typed_arm: arm_node.clone(), + diagnostics: Rc::new(vec![]), + body_type: scrut_rt.clone(), +}), +}; +if !is_fully_resolved(&original.body_type.clone(), &scope.type_env.clone().source_indices.clone()) { + { let arm_pat = arm_pattern(arm_node.clone()); - let arm_g = arm_guard(&arm_node); - let arm_b = arm_body(&arm_node); - let typed_pattern = annotate_pattern_parent_enums( - arm_pat.clone(), - scrut_subject.clone(), - &scope, - ); - let pattern_result = extend_scope_with_pattern_node( - &scope, - typed_pattern.clone(), - &scrut_subject, - scrut_provenance.clone(), - ); - let arm_scope = pattern_result.scope.clone(); - let pattern_diags = pattern_result.diagnostics.clone(); - let guard_result = if (arm_g.clone() != None) { +let arm_g = arm_guard(&arm_node); +let arm_b = arm_body(&arm_node); +let typed_pattern = annotate_pattern_parent_enums(arm_pat.clone(), scrut_subject.clone(), &scope); +let pattern_result = extend_scope_with_pattern_node(&scope, typed_pattern.clone(), &scrut_subject, scrut_provenance.clone()); +let arm_scope = pattern_result.scope.clone(); +let pattern_diags = pattern_result.diagnostics.clone(); +let guard_result = if (arm_g.clone() != None) { Some(infer_expr(&arm_g.clone().unwrap(), &arm_scope, &None)) } else { None }; - let body_result = infer_expr(&arm_b, &arm_scope, &expected); - let body_typed = body_result.typed.clone(); - let body_diags = body_result.diagnostics.clone(); - let guard_unwrapped = match guard_result.clone() { - Some(gr) => gr.clone(), - None => Rc::new(InferResult { - typed: arm_b.clone(), - diagnostics: Rc::new(vec![]), - }), - }; - let guard_diags = if (guard_result.clone() != None) { +let body_result = infer_expr(&arm_b, &arm_scope, &Some(unified_arm_type.clone())); +let body_typed = body_result.typed.clone(); +let body_diags = body_result.diagnostics.clone(); +let guard_unwrapped = match guard_result.clone() { + Some(gr) => gr.clone(), + None => Rc::new(InferResult { + typed: arm_b.clone(), + diagnostics: Rc::new(vec![]), +}), +}; +let guard_diags = if (guard_result.clone() != None) { guard_unwrapped.diagnostics.clone() } else { Rc::new(vec![]) }; - Rc::new(ArmInferResult { - typed_arm: make_arm_node( - typed_pattern.clone(), - if (guard_result.clone() != None) { - Some(guard_unwrapped.typed.clone()) - } else { - None - }, - body_typed.clone(), - span.clone(), - ), - diagnostics: v2_rt::concat( - pattern_diags.clone(), - v2_rt::concat(guard_diags.clone(), body_diags.clone()), - ), - body_type: resolved_type(body_typed.clone()), - }) - }); - } - __result - }); - let arm_body_types = Rc::new({ - let mut __result = Vec::new(); - for ar in arm_infer_results.clone().iter().cloned() { - __result.push(ar.body_type.clone()); +Rc::new(ArmInferResult { + typed_arm: make_arm_node(typed_pattern.clone(), if (guard_result.clone() != None) { + Some(guard_unwrapped.typed.clone()) + } else { + None + }, body_typed.clone(), span.clone()), + diagnostics: v2_rt::concat(pattern_diags.clone(), v2_rt::concat(guard_diags.clone(), body_diags.clone())), + body_type: resolved_type(body_typed.clone()), +}) +} + } else { + original.clone() } - __result - }); - let unified_arm_type = match arm_body_types.clone().first().cloned() { - Some(first_type) => Rc::new( - arm_body_types - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ) - .iter() - .cloned() - .fold(first_type, |acc: Rc, t: Rc| { - prefer_specific_type( - acc, - t.clone(), - &scope.type_env.clone().source_indices.clone(), - ) - }), - None => scrut_rt.clone(), - }; - let arm_infer_results = if is_fully_resolved( - &unified_arm_type, - &scope.type_env.clone().source_indices.clone(), - ) { - Rc::new({ - let mut __result = Vec::new(); - for pair in Rc::new( - arm_nodes - .clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - { - __result.push({ - let idx = pair.0.clone(); - let arm_node = pair.1.clone(); - let original_list = Rc::new({ - let mut __result = Vec::new(); - for ap in Rc::new({ - let mut __result = Vec::new(); - for ap in Rc::new( - arm_infer_results - .clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - { - if (ap.0.clone() == idx.clone()) { - __result.push(ap); - } - } - __result - }) - .iter() - .cloned() - { - __result.push(ap.1.clone()); - } - __result - }); - let original = match original_list.clone().first().cloned() { - Some(ar) => ar.clone(), - None => Rc::new(ArmInferResult { - typed_arm: arm_node.clone(), - diagnostics: Rc::new(vec![]), - body_type: scrut_rt.clone(), - }), - }; - if !is_fully_resolved( - &original.body_type.clone(), - &scope.type_env.clone().source_indices.clone(), - ) { - { - let arm_pat = arm_pattern(arm_node.clone()); - let arm_g = arm_guard(&arm_node); - let arm_b = arm_body(&arm_node); - let typed_pattern = annotate_pattern_parent_enums( - arm_pat.clone(), - scrut_subject.clone(), - &scope, - ); - let pattern_result = extend_scope_with_pattern_node( - &scope, - typed_pattern.clone(), - &scrut_subject, - scrut_provenance.clone(), - ); - let arm_scope = pattern_result.scope.clone(); - let pattern_diags = pattern_result.diagnostics.clone(); - let guard_result = if (arm_g.clone() != None) { - Some(infer_expr( - &arm_g.clone().unwrap(), - &arm_scope, - &None, - )) - } else { - None - }; - let body_result = infer_expr( - &arm_b, - &arm_scope, - &Some(unified_arm_type.clone()), - ); - let body_typed = body_result.typed.clone(); - let body_diags = body_result.diagnostics.clone(); - let guard_unwrapped = match guard_result.clone() { - Some(gr) => gr.clone(), - None => Rc::new(InferResult { - typed: arm_b.clone(), - diagnostics: Rc::new(vec![]), - }), - }; - let guard_diags = if (guard_result.clone() != None) { - guard_unwrapped.diagnostics.clone() - } else { - Rc::new(vec![]) - }; - Rc::new(ArmInferResult { - typed_arm: make_arm_node( - typed_pattern.clone(), - if (guard_result.clone() != None) { - Some(guard_unwrapped.typed.clone()) - } else { - None - }, - body_typed.clone(), - span.clone(), - ), - diagnostics: v2_rt::concat( - pattern_diags.clone(), - v2_rt::concat( - guard_diags.clone(), - body_diags.clone(), - ), - ), - body_type: resolved_type(body_typed.clone()), - }) - } - } else { - original.clone() - } - }); - } - __result - }) +}); } __result }) + } else { + arm_infer_results.clone() + }; +let typed_arms = Rc::new({ let mut __result = Vec::new(); for ar in arm_infer_results.clone().iter().cloned() { __result.push(ar.typed_arm.clone()); } __result }); +let arm_diags = Rc::new({ let mut __result = Vec::new(); for ar in arm_infer_results.clone().iter().cloned() { __result.extend((*ar.diagnostics.clone()).iter().cloned()); } __result }); +let result_type = unified_arm_type.clone(); +let empty_arms_diags = if ((arm_infer_results.clone().len() as i64) == 0) { + Rc::new(vec![inference_error("match expression has no arms".to_string(), span.clone(), scope.module_name.clone())]) + } else { + Rc::new(vec![]) + }; +let exhaustiveness_diags = match (*resolve_pattern_subject(scope.clone(), scrut_subject.clone())).clone() { + PatternSubject::PatternResolved { node: resolved_scrutinee, .. } => check_match_exhaustiveness(&resolved_scrutinee, &typed_arms, &scope.type_env.clone(), span.clone(), scope.module_name.clone()), + PatternSubject::PatternDynamic { .. } => Rc::new(vec![]), + PatternSubject::PatternLookupBlocked => Rc::new(vec![]), +}; +let match_texpr = make_expr_node(Rc::new(ExprData::ExprMatch), v2_rt::concat(Rc::new(vec![scrut_typed.clone()]), typed_arms.clone()), Some(Rc::new(InferredNode::Resolved { + node: result_type, +})), span.clone()); +Rc::new(InferResult { + typed: match_texpr, + diagnostics: v2_rt::concat(v2_rt::concat(v2_rt::concat(scrut_diags, arm_diags), empty_arms_diags), exhaustiveness_diags), +}) +}, + ExprData::ExprIf => { + let span = texpr.span.clone(); +let cond = if_condition(texpr.clone()); +let then_expr = if_then_branch(texpr.clone()); +let else_expr = if_else_branch(texpr.clone()); +let cond_result = infer_expr(&cond, &scope, &None); +let cond_typed = cond_result.typed.clone(); +let cond_diags = cond_result.diagnostics.clone(); +let then_result = infer_expr(&then_expr, &scope, &expected); +let then_typed = then_result.typed.clone(); +let then_diags = then_result.diagnostics.clone(); +match else_expr { + Some(else_branch) => { + let else_result = infer_expr(&else_branch, &scope, &expected); +let then_rt = resolved_type(then_result.typed.clone()); +let else_rt = resolved_type(else_result.typed.clone()); +let then_result = if (!is_fully_resolved(&then_rt, &scope.type_env.clone().source_indices.clone()) && is_fully_resolved(&else_rt, &scope.type_env.clone().source_indices.clone())) { + infer_expr(&then_expr, &scope, &Some(else_rt.clone())) } else { - arm_infer_results.clone() + then_result.clone() }; - let typed_arms = Rc::new({ - let mut __result = Vec::new(); - for ar in arm_infer_results.clone().iter().cloned() { - __result.push(ar.typed_arm.clone()); - } - __result - }); - let arm_diags = Rc::new({ - let mut __result = Vec::new(); - for ar in arm_infer_results.clone().iter().cloned() { - __result.extend((*ar.diagnostics.clone()).iter().cloned()); - } - __result - }); - let result_type = unified_arm_type.clone(); - let empty_arms_diags = if ((arm_infer_results.clone().len() as i64) == 0) { - Rc::new(vec![inference_error( - "match expression has no arms".to_string(), - span.clone(), - scope.module_name.clone(), - )]) +let else_result = if (!is_fully_resolved(&else_rt, &scope.type_env.clone().source_indices.clone()) && is_fully_resolved(&then_rt, &scope.type_env.clone().source_indices.clone())) { + infer_expr(&else_branch, &scope, &Some(then_rt.clone())) } else { - Rc::new(vec![]) + else_result.clone() }; - let exhaustiveness_diags = match (*resolve_pattern_subject( - scope.clone(), - scrut_subject.clone(), - )) - .clone() - { - PatternSubject::PatternResolved { - node: resolved_scrutinee, - .. - } => check_match_exhaustiveness( - &resolved_scrutinee, - &typed_arms, - &scope.type_env.clone(), - span.clone(), - scope.module_name.clone(), - ), - PatternSubject::PatternDynamic { .. } => Rc::new(vec![]), - PatternSubject::PatternLookupBlocked => Rc::new(vec![]), +let then_typed = then_result.typed.clone(); +let then_diags = then_result.diagnostics.clone(); +let else_typed = else_result.typed.clone(); +let else_diags = else_result.diagnostics.clone(); +let then_rt = resolved_type(then_typed.clone()); +let else_rt = resolved_type(else_typed.clone()); +let unified = prefer_specific_type(then_rt.clone(), else_rt.clone(), &scope.type_env.clone().source_indices.clone()); +let branch_diags = if node_type_compatible(then_rt.clone(), else_rt.clone(), scope.type_env.clone().source_indices.clone()) { + Rc::new(vec![]) + } else { + Rc::new(vec![inference_error(v2_rt::concat(v2_rt::concat(v2_rt::concat("if branches resolve to incompatible types: ".to_string(), node_type_shape(&then_rt, &scope.type_env.clone().source_indices.clone())), " vs ".to_string()), node_type_shape(&else_rt, &scope.type_env.clone().source_indices.clone())), span.clone(), scope.module_name.clone())]) }; - let match_texpr = make_expr_node( - Rc::new(ExprData::ExprMatch), - v2_rt::concat(Rc::new(vec![scrut_typed.clone()]), typed_arms.clone()), - Some(Rc::new(InferredNode::Resolved { node: result_type })), - span.clone(), - ); - Rc::new(InferResult { - typed: match_texpr, - diagnostics: v2_rt::concat( - v2_rt::concat(v2_rt::concat(scrut_diags, arm_diags), empty_arms_diags), - exhaustiveness_diags, - ), - }) - } - ExprData::ExprIf => { - let span = texpr.span.clone(); - let cond = if_condition(texpr.clone()); - let then_expr = if_then_branch(texpr.clone()); - let else_expr = if_else_branch(texpr.clone()); - let cond_result = infer_expr(&cond, &scope, &None); - let cond_typed = cond_result.typed.clone(); - let cond_diags = cond_result.diagnostics.clone(); - let then_result = infer_expr(&then_expr, &scope, &expected); - let then_typed = then_result.typed.clone(); - let then_diags = then_result.diagnostics.clone(); - match else_expr { - Some(else_branch) => { - let else_result = infer_expr(&else_branch, &scope, &expected); - let then_rt = resolved_type(then_result.typed.clone()); - let else_rt = resolved_type(else_result.typed.clone()); - let then_result = if (!is_fully_resolved( - &then_rt, - &scope.type_env.clone().source_indices.clone(), - ) && is_fully_resolved( - &else_rt, - &scope.type_env.clone().source_indices.clone(), - )) { - infer_expr(&then_expr, &scope, &Some(else_rt.clone())) - } else { - then_result.clone() - }; - let else_result = if (!is_fully_resolved( - &else_rt, - &scope.type_env.clone().source_indices.clone(), - ) && is_fully_resolved( - &then_rt, - &scope.type_env.clone().source_indices.clone(), - )) { - infer_expr(&else_branch, &scope, &Some(then_rt.clone())) - } else { - else_result.clone() - }; - let then_typed = then_result.typed.clone(); - let then_diags = then_result.diagnostics.clone(); - let else_typed = else_result.typed.clone(); - let else_diags = else_result.diagnostics.clone(); - let then_rt = resolved_type(then_typed.clone()); - let else_rt = resolved_type(else_typed.clone()); - let unified = prefer_specific_type( - then_rt.clone(), - else_rt.clone(), - &scope.type_env.clone().source_indices.clone(), - ); - let branch_diags = if node_type_compatible( - then_rt.clone(), - else_rt.clone(), - scope.type_env.clone().source_indices.clone(), - ) { - Rc::new(vec![]) - } else { - Rc::new(vec![inference_error( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "if branches resolve to incompatible types: " - .to_string(), - node_type_shape( - &then_rt, - &scope.type_env.clone().source_indices.clone(), - ), - ), - " vs ".to_string(), - ), - node_type_shape( - &else_rt, - &scope.type_env.clone().source_indices.clone(), - ), - ), - span.clone(), - scope.module_name.clone(), - )]) - }; - let if_texpr = make_expr_node( - Rc::new(ExprData::ExprIf), - Rc::new(vec![cond_typed, then_typed.clone(), else_typed.clone()]), - Some(Rc::new(InferredNode::Resolved { node: unified })), - span.clone(), - ); - Rc::new(InferResult { - typed: if_texpr, - diagnostics: v2_rt::concat( - v2_rt::concat(v2_rt::concat(cond_diags, then_diags), else_diags), - branch_diags, - ), - }) - } - None => { - let if_texpr2 = make_expr_node( - Rc::new(ExprData::ExprIf), - Rc::new(vec![cond_typed, then_typed.clone()]), - Some(Rc::new(InferredNode::Resolved { node: unit_type() })), - span.clone(), - ); - Rc::new(InferResult { - typed: if_texpr2, - diagnostics: v2_rt::concat(cond_diags, then_diags), - }) - } - } - } - ExprData::ExprLet => { - let let_name = let_binding_name_at( - texpr.clone(), - scope.type_env.clone().source_indices.clone(), - ); - let span = texpr.span.clone(); - let val_expr = let_value(texpr.clone()); - let body_expr = let_body(texpr.clone()); - let is_tail_return = match body_expr.clone() { - Some(bd) => match (*bd.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - (authored_name_at(scope.type_env.clone().source_indices.clone(), &bd) - .as_str() - == let_name.clone().as_str()) - } - _ => false, - }, - None => false, - }; - let val_expected = if is_tail_return { - expected.clone() - } else { - None - }; - let val_result = infer_expr(&val_expr, &scope, &val_expected); - let val_typed = val_result.typed.clone(); - let val_diags = val_result.diagnostics.clone(); - let val_type = resolved_type(val_typed.clone()); - if (body_expr.clone() == None) { - { - let let_texpr = make_named_expr_node( - &let_name, - Rc::new(ExprData::ExprLet), - Rc::new(vec![val_typed.clone()]), - Some(Rc::new(InferredNode::Resolved { node: val_type })), - span.clone(), - node_name_span(&texpr), - ); - Rc::new(InferResult { - typed: let_texpr, - diagnostics: val_diags, - }) - } - } else { - { - let extended = extend_scope( - &scope, - &let_name, - val_type, - classify_binding_provenance(&val_typed, &scope), - ); - let body_result = - infer_expr(&body_expr.clone().unwrap(), &extended, &expected); - let body_typed = body_result.typed.clone(); - let body_diags = body_result.diagnostics.clone(); - let let_texpr2 = make_named_expr_node( - &let_name, - Rc::new(ExprData::ExprLet), - Rc::new(vec![val_typed.clone(), body_typed.clone()]), - body_typed.inferred.clone(), - span.clone(), - node_name_span(&texpr), - ); - Rc::new(InferResult { - typed: let_texpr2, - diagnostics: v2_rt::concat(val_diags, body_diags.clone()), - }) - } - } - } - ExprData::ExprRecordLit { .. } => { - let span = texpr.span.clone(); - let field_inits = texpr.children.clone(); - infer_record_lit( - &record_lit_type_name_at( - texpr.clone(), - scope.type_env.clone().source_indices.clone(), - ), - field_inits, - &span, - node_name_span(&texpr), - &scope, - ) +let if_texpr = make_expr_node(Rc::new(ExprData::ExprIf), Rc::new(vec![cond_typed, then_typed.clone(), else_typed.clone()]), Some(Rc::new(InferredNode::Resolved { + node: unified, +})), span.clone()); +Rc::new(InferResult { + typed: if_texpr, + diagnostics: v2_rt::concat(v2_rt::concat(v2_rt::concat(cond_diags, then_diags), else_diags), branch_diags), +}) +}, + None => { + let if_texpr2 = make_expr_node(Rc::new(ExprData::ExprIf), Rc::new(vec![cond_typed, then_typed.clone()]), Some(Rc::new(InferredNode::Resolved { + node: unit_type(), +})), span.clone()); +Rc::new(InferResult { + typed: if_texpr2, + diagnostics: v2_rt::concat(cond_diags, then_diags), +}) +}, +} +}, + ExprData::ExprLet => { + let let_name = let_binding_name_at(texpr.clone(), scope.type_env.clone().source_indices.clone()); +let span = texpr.span.clone(); +let val_expr = let_value(texpr.clone()); +let body_expr = let_body(texpr.clone()); +let is_tail_return = match body_expr.clone() { + Some(bd) => match (*bd.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => (authored_name_at(scope.type_env.clone().source_indices.clone(), &bd).as_str() == let_name.clone().as_str()), + _ => false, +}, + None => false, +}; +let val_expected = if is_tail_return { + expected.clone() + } else { + None + }; +let val_result = infer_expr(&val_expr, &scope, &val_expected); +let val_typed = val_result.typed.clone(); +let val_diags = val_result.diagnostics.clone(); +let val_type = resolved_type(val_typed.clone()); +if (body_expr.clone() == None) { + { + let let_texpr = make_named_expr_node(&let_name, Rc::new(ExprData::ExprLet), Rc::new(vec![val_typed.clone()]), Some(Rc::new(InferredNode::Resolved { + node: val_type, +})), span.clone(), node_name_span(&texpr)); +Rc::new(InferResult { + typed: let_texpr, + diagnostics: val_diags, +}) +} + } else { + { + let extended = extend_scope(&scope, &let_name, val_type, classify_binding_provenance(&val_typed, &scope)); +let body_result = infer_expr(&body_expr.clone().unwrap(), &extended, &expected); +let body_typed = body_result.typed.clone(); +let body_diags = body_result.diagnostics.clone(); +let let_texpr2 = make_named_expr_node(&let_name, Rc::new(ExprData::ExprLet), Rc::new(vec![val_typed.clone(), body_typed.clone()]), body_typed.inferred.clone(), span.clone(), node_name_span(&texpr)); +Rc::new(InferResult { + typed: let_texpr2, + diagnostics: v2_rt::concat(val_diags, body_diags.clone()), +}) +} } - ExprData::ExprListLit => { - let span = texpr.span.clone(); - let elements = texpr.children.clone(); - let elem_expected = match expected.clone() { - Some(exp) => { - if node_is_element_collection( - &exp, - scope.type_env.clone().source_indices.clone(), - ) { - match exp.children.clone().first().cloned() { - Some(elem) => Some(child_type_node(&elem)), - None => None, - } - } else { - None - } - } - None => None, - }; - let elem_results = Rc::new({ - let mut __result = Vec::new(); - for e in elements.iter().cloned() { - __result.push(infer_expr(&e, &scope, &elem_expected)); - } - __result - }); - let typed_elements = Rc::new({ - let mut __result = Vec::new(); - for r in elem_results.clone().iter().cloned() { - __result.push(r.typed.clone()); - } - __result - }); - let elem_diags = Rc::new({ - let mut __result = Vec::new(); - for r in elem_results.clone().iter().cloned() { - __result.extend((*r.diagnostics.clone()).iter().cloned()); - } - __result - }); - let elem_type_node = if ((elem_results.clone().len() as i64) > 0) { - match elem_results.clone().first().cloned() { - Some(r) => resolved_type(r.typed.clone()), - None => unit_type(), - } +}, + ExprData::ExprRecordLit { .. } => { + let span = texpr.span.clone(); +let field_inits = texpr.children.clone(); +infer_record_lit(&record_lit_type_name_at(texpr.clone(), scope.type_env.clone().source_indices.clone()), field_inits, &span, node_name_span(&texpr), &scope) +}, + ExprData::ExprListLit => { + let span = texpr.span.clone(); +let elements = texpr.children.clone(); +let elem_expected = match expected.clone() { + Some(exp) => if node_is_element_collection(&exp, scope.type_env.clone().source_indices.clone()) { + match exp.children.clone().first().cloned() { + Some(elem) => Some(child_type_node(&elem)), + None => None, +} + } else { + None + }, + None => None, +}; +let elem_results = Rc::new({ let mut __result = Vec::new(); for e in elements.iter().cloned() { __result.push(infer_expr(&e, &scope, &elem_expected)); } __result }); +let typed_elements = Rc::new({ let mut __result = Vec::new(); for r in elem_results.clone().iter().cloned() { __result.push(r.typed.clone()); } __result }); +let elem_diags = Rc::new({ let mut __result = Vec::new(); for r in elem_results.clone().iter().cloned() { __result.extend((*r.diagnostics.clone()).iter().cloned()); } __result }); +let elem_type_node = if ((elem_results.clone().len() as i64) > 0) { + match elem_results.clone().first().cloned() { + Some(r) => resolved_type(r.typed.clone()), + None => unit_type(), +} + } else { + match expected.clone() { + Some(exp) => if node_is_element_collection(&exp, scope.type_env.clone().source_indices.clone()) { + match exp.children.clone().first().cloned() { + Some(elem) => child_type_node(&elem), + None => unit_type(), +} } else { - match expected.clone() { - Some(exp) => { - if node_is_element_collection( - &exp, - scope.type_env.clone().source_indices.clone(), - ) { - match exp.children.clone().first().cloned() { - Some(elem) => child_type_node(&elem), - None => unit_type(), - } - } else { - unit_type() - } - } - None => unit_type(), - } - }; - let empty_list_diags = if ((elem_results.clone().len() as i64) == 0) { - match expected.clone() { - Some(exp) => { - if node_is_element_collection( - &exp, - scope.type_env.clone().source_indices.clone(), - ) { - match exp.children.clone().first().cloned() { - Some(_) => Rc::new(vec![]), - None => Rc::new(vec![inference_error( - "empty list literal: expected type has no element type" - .to_string(), - span.clone(), - scope.module_name.clone(), - )]), - } - } else { - Rc::new(vec![inference_error( - "empty list literal: expected type is not a collection" - .to_string(), - span.clone(), - scope.module_name.clone(), - )]) - } - } - None => Rc::new(vec![]), - } + unit_type() + }, + None => unit_type(), +} + }; +let empty_list_diags = if ((elem_results.clone().len() as i64) == 0) { + match expected.clone() { + Some(exp) => if node_is_element_collection(&exp, scope.type_env.clone().source_indices.clone()) { + match exp.children.clone().first().cloned() { + Some(_) => Rc::new(vec![]), + None => Rc::new(vec![inference_error("empty list literal: expected type has no element type".to_string(), span.clone(), scope.module_name.clone())]), +} } else { - Rc::new(vec![]) - }; - let list_k = list_kernel_ty_from_element(elem_type_node.clone()); - let ll_texpr = make_expr_node( - Rc::new(ExprData::ExprListLit), - typed_elements, - Some(Rc::new(InferredNode::Resolved { - node: list_k.ty.clone(), - })), - span.clone(), - ); - Rc::new(InferResult { - typed: ll_texpr, - diagnostics: v2_rt::concat( - v2_rt::concat(elem_diags, empty_list_diags), - list_k.miss_diags.clone(), - ), - }) - } - ExprData::ExprBinOp { op, .. } => { - let span = texpr.span.clone(); - let left_expr = binop_left(texpr.clone()); - let right_expr = binop_right(texpr.clone()); - let left_result = infer_expr(&left_expr, &scope, &None); - let left_typed = left_result.typed.clone(); - let left_diags = left_result.diagnostics.clone(); - let right_result = infer_expr(&right_expr, &scope, &None); - let right_typed = right_result.typed.clone(); - let right_diags = right_result.diagnostics.clone(); - let binop_info = infer_binop_type_node( - &op, - &resolved_type(left_typed.clone()), - scope.type_env.clone().source_indices.clone(), - ); - let bo_texpr = make_expr_node( - Rc::new(ExprData::ExprBinOp { - op: op.clone(), - algebra_field: binop_info.algebra_field.clone(), - }), - Rc::new(vec![left_typed.clone(), right_typed]), - Some(Rc::new(InferredNode::Resolved { - node: binop_info.result_type.clone(), - })), - span.clone(), - ); - Rc::new(InferResult { - typed: bo_texpr, - diagnostics: v2_rt::concat(left_diags, right_diags), - }) - } - ExprData::ExprUnaryOp { op, .. } => { - let span = texpr.span.clone(); - let operand_expr = unaryop_operand(texpr.clone()); - let operand_result = infer_expr(&operand_expr, &scope, &None); - let operand_typed = operand_result.typed.clone(); - let operand_diags = operand_result.diagnostics.clone(); - let result_type = match op.clone() { - UnaryOpKind::Not => bool_type(), - UnaryOpKind::Neg => resolved_type(operand_typed.clone()), - }; - let uo_texpr = make_expr_node( - Rc::new(ExprData::ExprUnaryOp { op: op.clone() }), - Rc::new(vec![operand_typed.clone()]), - Some(Rc::new(InferredNode::Resolved { node: result_type })), - span.clone(), - ); - Rc::new(InferResult { - typed: uo_texpr, - diagnostics: operand_diags, - }) - } - ExprData::ExprLambda => { - let span = texpr.span.clone(); - let lam_body = lambda_body(texpr.clone()); - let lam_params = lambda_param_names_at( - texpr.clone(), - scope.type_env.clone().source_indices.clone(), - ); - let lam_param_nodes = Rc::new( - texpr - .children - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ); - let elem_prov = match v2_rt::map_get( - &scope.lambda_param_provenance.clone(), - "elem".to_string(), - ) { - Some(p) => p.clone(), - None => Rc::new(SubValueRelation::SubValueUnknown), - }; - let lam_scope = if (expected.clone() != None) { - { - let exp = expected.clone().unwrap(); - if ((exp.params.clone().len() as i64) > 0) { - Rc::new( - lam_params - .clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - .fold( - scope.clone(), - |acc: Rc, pair: (i64, String)| { - let param_prov = if (pair.0.clone() - == ((lam_params.clone().len() as i64) - 1)) - { - elem_prov.clone() - } else { - Rc::new(SubValueRelation::SubValueUnknown) - }; - match exp.params.clone().get(pair.0.clone() as usize).cloned() { - Some(cp) => extend_scope( - &acc, - &pair.1.clone(), - param_node_type_expr(&cp), - param_prov.clone(), - ), - None => extend_scope( - &acc, - &pair.1.clone(), - type_variable_node("callable_param".to_string()), - param_prov.clone(), - ), - } - }, - ) - } else { - if ((lam_params.clone().len() as i64) == 1) { - match lam_params.clone().first().cloned() { - Some(p) => { - extend_scope(&scope, &p, exp.clone(), elem_prov.clone()) - } - None => scope.clone(), - } + Rc::new(vec![inference_error("empty list literal: expected type is not a collection".to_string(), span.clone(), scope.module_name.clone())]) + }, + None => Rc::new(vec![]), +} + } else { + Rc::new(vec![]) + }; +let list_k = list_kernel_ty_from_element(elem_type_node.clone()); +let ll_texpr = make_expr_node(Rc::new(ExprData::ExprListLit), typed_elements, Some(Rc::new(InferredNode::Resolved { + node: list_k.ty.clone(), +})), span.clone()); +Rc::new(InferResult { + typed: ll_texpr, + diagnostics: v2_rt::concat(v2_rt::concat(elem_diags, empty_list_diags), list_k.miss_diags.clone()), +}) +}, + ExprData::ExprBinOp { op, .. } => { + let span = texpr.span.clone(); +let left_expr = binop_left(texpr.clone()); +let right_expr = binop_right(texpr.clone()); +let left_result = infer_expr(&left_expr, &scope, &None); +let left_typed = left_result.typed.clone(); +let left_diags = left_result.diagnostics.clone(); +let right_result = infer_expr(&right_expr, &scope, &None); +let right_typed = right_result.typed.clone(); +let right_diags = right_result.diagnostics.clone(); +let binop_info = infer_binop_type_node(&op, &resolved_type(left_typed.clone()), scope.type_env.clone().source_indices.clone()); +let bo_texpr = make_expr_node(Rc::new(ExprData::ExprBinOp { + op: op.clone(), + algebra_field: binop_info.algebra_field.clone(), +}), Rc::new(vec![left_typed.clone(), right_typed]), Some(Rc::new(InferredNode::Resolved { + node: binop_info.result_type.clone(), +})), span.clone()); +Rc::new(InferResult { + typed: bo_texpr, + diagnostics: v2_rt::concat(left_diags, right_diags), +}) +}, + ExprData::ExprUnaryOp { op, .. } => { + let span = texpr.span.clone(); +let operand_expr = unaryop_operand(texpr.clone()); +let operand_result = infer_expr(&operand_expr, &scope, &None); +let operand_typed = operand_result.typed.clone(); +let operand_diags = operand_result.diagnostics.clone(); +let result_type = match op.clone() { + UnaryOpKind::Not => bool_type(), + UnaryOpKind::Neg => resolved_type(operand_typed.clone()), +}; +let uo_texpr = make_expr_node(Rc::new(ExprData::ExprUnaryOp { + op: op.clone(), +}), Rc::new(vec![operand_typed.clone()]), Some(Rc::new(InferredNode::Resolved { + node: result_type, +})), span.clone()); +Rc::new(InferResult { + typed: uo_texpr, + diagnostics: operand_diags, +}) +}, + ExprData::ExprLambda => { + let span = texpr.span.clone(); +let lam_body = lambda_body(texpr.clone()); +let lam_params = lambda_param_names_at(texpr.clone(), scope.type_env.clone().source_indices.clone()); +let lam_param_nodes = Rc::new(texpr.children.clone().iter().cloned().skip(1 as usize).collect::>()); +let elem_prov = match v2_rt::map_get(&scope.lambda_param_provenance.clone(), "elem".to_string()) { + Some(p) => p.clone(), + None => Rc::new(SubValueRelation::SubValueUnknown), +}; +let lam_scope = if (expected.clone() != None) { + { + let exp = expected.clone().unwrap(); +if ((exp.params.clone().len() as i64) > 0) { + Rc::new(lam_params.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned().fold(scope.clone(), |acc: Rc, pair: (i64, String)| { + let param_prov = if (pair.0.clone() == ((lam_params.clone().len() as i64) - 1)) { + elem_prov.clone() } else { - Rc::new( - lam_params - .clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - .fold( - scope.clone(), - |acc: Rc, pair: (i64, String)| { - let param_prov = if (pair.0.clone() - == ((lam_params.clone().len() as i64) - 1)) - { - elem_prov.clone() - } else { - Rc::new(SubValueRelation::SubValueUnknown) - }; - if (pair.0.clone() - == ((lam_params.clone().len() as i64) - 1)) - { - extend_scope( - &acc, - &pair.1.clone(), - exp.clone(), - param_prov.clone(), - ) - } else { - extend_scope( - &acc, - &pair.1.clone(), - type_variable_node("lambda_param".to_string()), - param_prov.clone(), - ) - } - }, - ) - } - } - } - } else { - extend_scope_with_params(&scope, lam_params.clone()) - }; - let body_expected = if (expected.clone() != None) { - { - let exp = expected.clone().unwrap(); - if ((exp.params.clone().len() as i64) > 0) { - Some(callable_inferred(&exp)) + Rc::new(SubValueRelation::SubValueUnknown) + }; +match exp.params.clone().get(pair.0.clone() as usize).cloned() { + Some(cp) => extend_scope(&acc, &pair.1.clone(), param_node_type_expr(&cp), param_prov.clone()), + None => extend_scope(&acc, &pair.1.clone(), type_variable_node("callable_param".to_string()), param_prov.clone()), +} +}) + } else { + if ((lam_params.clone().len() as i64) == 1) { + match lam_params.clone().first().cloned() { + Some(p) => extend_scope(&scope, &p, exp.clone(), elem_prov.clone()), + None => scope.clone(), +} } else { - None - } - } - } else { - None - }; - let body_scope = Rc::new(InferScope { - type_env: lam_scope.type_env.clone(), - func_env: lam_scope.func_env.clone(), - locals: lam_scope.locals.clone(), - match_bound_names: lam_scope.match_bound_names.clone(), - module_name: lam_scope.module_name.clone(), - service_registry: lam_scope.service_registry.clone(), - item_registry: lam_scope.item_registry.clone(), - lambda_param_provenance: v2_rt::rc_empty_map::>(), - }); - let body_result = infer_expr(&lam_body, &body_scope, &body_expected); - let body_typed = body_result.typed.clone(); - let body_diags = body_result.diagnostics.clone(); - let typed_param_nodes = Rc::new({ - let mut __result = Vec::new(); - for pair in Rc::new( - lam_param_nodes - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - { - __result.push({ - let pn = pair.1.clone(); - let param_name = - match lam_params.clone().get(pair.0.clone() as usize).cloned() { - Some(n) => n.clone(), - None => "".to_string(), - }; - let param_type = - match v2_rt::map_get(&lam_scope.locals.clone(), param_name.clone()) - { - Some(binding) => Some(Rc::new(InferredNode::Resolved { - node: binding.resolved.clone(), - })), - None => None, + Rc::new(lam_params.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned().fold(scope.clone(), |acc: Rc, pair: (i64, String)| { + let param_prov = if (pair.0.clone() == ((lam_params.clone().len() as i64) - 1)) { + elem_prov.clone() + } else { + Rc::new(SubValueRelation::SubValueUnknown) }; - Rc::new(Node { - name: pn.name.clone(), - ident: pn.ident.clone(), - span: pn.span.clone(), - ident_span: pn.ident_span.clone(), - children: pn.children.clone(), - connective: pn.connective.clone(), - params: pn.params.clone(), - inferred: param_type.clone(), - return_cardinality: pn.return_cardinality.clone(), - uses: pn.uses.clone(), - body: pn.body.clone(), - transport: pn.transport.clone(), - properties: pn.properties.clone(), - type_annotation: pn.type_annotation.clone(), - is_self_recursive: pn.is_self_recursive.clone(), - has_non_tail_self_call: pn.has_non_tail_self_call.clone(), - match_pattern: pn.match_pattern.clone(), - expr_data: pn.expr_data.clone(), - }) - }); - } - __result - }); - let lam_texpr = make_expr_node( - Rc::new(ExprData::ExprLambda), - v2_rt::concat(Rc::new(vec![body_typed.clone()]), typed_param_nodes), - body_typed.inferred.clone(), - span.clone(), - ); - Rc::new(InferResult { - typed: lam_texpr, - diagnostics: body_diags.clone(), - }) - } - ExprData::ExprStringInterp => { - let span = texpr.span.clone(); - let typed_part_nodes = Rc::new({ - let mut __result = Vec::new(); - for part_node in texpr.children.clone().iter().cloned() { - __result.push(match (*part_node.expr_data.clone()).clone() { - ExprData::ExprLiteral { .. } => part_node.clone(), - _ => match part_node.children.clone().first().cloned() { - Some(inner) => { - let r = infer_expr(&inner, &scope, &None); - make_interp_part_node(r.typed.clone(), part_node.span.clone()) - } - None => part_node.clone(), - }, - }); - } - __result - }); - let interp_diags = Rc::new({ - let mut __result = Vec::new(); - for part_node in texpr.children.clone().iter().cloned() { - __result.extend( - (*match (*part_node.expr_data.clone()).clone() { - ExprData::ExprLiteral { .. } => Rc::new(vec![]), - _ => match part_node.children.clone().first().cloned() { - Some(inner) => { - let r = infer_expr(&inner, &scope, &None); - r.diagnostics.clone() - } - None => Rc::new(vec![]), - }, - }) - .iter() - .cloned(), - ); - } - __result - }); - let si_texpr = make_expr_node( - Rc::new(ExprData::ExprStringInterp), - typed_part_nodes, - Some(Rc::new(InferredNode::Resolved { - node: string_type(), - })), - span.clone(), - ); - Rc::new(InferResult { - typed: si_texpr, - diagnostics: interp_diags, - }) - } - ExprData::ExprBlock => { - let span = texpr.span.clone(); - let stmts = texpr.children.clone(); - if ((stmts.clone().len() as i64) > 0) { - { - let state = infer_block_stmts( - stmts.clone(), - (stmts.clone().len() as i64), - scope.clone(), - Rc::new(vec![]), - Rc::new(vec![]), - unit_type(), - expected.clone(), - ); - let blk_texpr = make_expr_node( - Rc::new(ExprData::ExprBlock), - state.typed_stmts.clone(), - Some(Rc::new(InferredNode::Resolved { - node: state.last_type.clone(), - })), - span.clone(), - ); - Rc::new(InferResult { - typed: blk_texpr, - diagnostics: Rc::new({ - let mut __result = Vec::new(); - for c in state.diag_chunks.clone().iter().cloned() { - __result.extend((*c.clone()).iter().cloned()); +if (pair.0.clone() == ((lam_params.clone().len() as i64) - 1)) { + extend_scope(&acc, &pair.1.clone(), exp.clone(), param_prov.clone()) + } else { + extend_scope(&acc, &pair.1.clone(), type_variable_node("lambda_param".to_string()), param_prov.clone()) } - __result - }), - }) +}) + } } - } else { - ok_infer(make_expr_node( - Rc::new(ExprData::ExprBlock), - Rc::new(vec![]), - Some(Rc::new(InferredNode::Resolved { node: unit_type() })), - span.clone(), - )) - } - } - ExprData::ExprCast => { - let span = texpr.span.clone(); - let cast_inner = cast_expr(texpr.clone()); - let target_type = cast_target(texpr.clone()); - let inner_result = infer_expr(&cast_inner, &scope, &None); - let inner_typed = inner_result.typed.clone(); - let inner_diags = inner_result.diagnostics.clone(); - let si = scope.type_env.clone().source_indices.clone(); - let target_name = authored_name_at(si.clone(), &target_type); - let cast_diag = validate_cast( - inner_typed.inferred.clone(), - &target_name, - span.clone(), - si.clone(), - scope.module_name.clone(), - ); - let cast_diags = match cast_diag { - Some(d) => Rc::new(vec![d.clone()]), - None => Rc::new(vec![]), - }; - let cast_texpr = make_expr_node( - Rc::new(ExprData::ExprCast), - Rc::new(vec![inner_typed.clone(), target_type.clone()]), - Some(Rc::new(InferredNode::Resolved { - node: target_type.clone(), - })), - span.clone(), - ); - Rc::new(InferResult { - typed: cast_texpr, - diagnostics: v2_rt::concat(inner_diags, cast_diags), - }) - } - ExprData::ExprForEach => { - let variable = foreach_variable_at( - texpr.clone(), - scope.type_env.clone().source_indices.clone(), - ); - let span = texpr.span.clone(); - let coll = foreach_collection(texpr.clone()); - let body_expr = foreach_body(texpr.clone()); - let coll_result = infer_expr(&coll, &scope, &None); - let coll_typed = coll_result.typed.clone(); - let coll_diags = coll_result.diagnostics.clone(); - let elem_type_node = for_each_element_type_node( - resolved_type(coll_typed.clone()), - scope.type_env.clone().source_indices.clone(), - ); - let elem_provenance = - derive_element_provenance(coll_typed.clone(), &elem_type_node, &scope); - let body_scope = - extend_scope(&scope, &variable, elem_type_node.clone(), elem_provenance); - let body_result = infer_expr(&body_expr, &body_scope, &None); - let body_typed = body_result.typed.clone(); - let body_diags = body_result.diagnostics.clone(); - let fe_texpr = make_named_expr_node( - &variable, - Rc::new(ExprData::ExprForEach), - Rc::new(vec![coll_typed.clone(), body_typed.clone()]), - body_typed.inferred.clone(), - span.clone(), - node_name_span(&texpr), - ); - Rc::new(InferResult { - typed: fe_texpr, - diagnostics: v2_rt::concat(coll_diags, body_diags.clone()), - }) - } - ExprData::ExprIndex => { - let span = texpr.span.clone(); - let base_expr = index_base(texpr.clone()); - let idx_key = index_expr(texpr.clone()); - let base_result = infer_expr(&base_expr, &scope, &None); - let base_typed = base_result.typed.clone(); - let base_diags = base_result.diagnostics.clone(); - let index_result = infer_expr(&idx_key, &scope, &None); - let index_typed = index_result.typed.clone(); - let index_diags = index_result.diagnostics.clone(); - let index_check = match base_typed.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { - node: base_type, .. - }) => match index_typed.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { - node: index_type, .. - }) => Some(check_index_access_node( - base_type.clone(), - index_type.clone(), - &span, - scope.module_name.clone(), - &scope.type_env.clone().source_indices.clone(), - )), - _ => None, - }, - _ => None, - }; - let access_failure_inferred = match base_typed.inferred.clone().as_deref().cloned() - { - Some(InferredNode::Resolved { .. }) => index_typed.inferred.clone(), - _ => base_typed.inferred.clone(), - }; - let idx_inferred = match index_check.clone() { - Some(checked) => checked.inferred.clone(), - None => Some(inferred_or_error( - access_failure_inferred, - "invalid index access".to_string(), - span.clone(), - )), - }; - let index_access_diags = match index_check.clone() { - Some(checked) => checked.diagnostics.clone(), - None => Rc::new(vec![]), - }; - let idx_texpr = make_expr_node( - Rc::new(ExprData::ExprIndex), - Rc::new(vec![base_typed.clone(), index_typed.clone()]), - idx_inferred, - span.clone(), - ); - Rc::new(InferResult { - typed: idx_texpr, - diagnostics: v2_rt::concat( - v2_rt::concat(base_diags, index_diags), - index_access_diags, - ), - }) - } - ExprData::ExprSlice => { - let span = texpr.span.clone(); - let base_expr = slice_base(texpr.clone()); - let start_expr = slice_start(texpr.clone()); - let end_expr = slice_end(texpr.clone()); - let base_result = infer_expr(&base_expr, &scope, &None); - let base_typed = base_result.typed.clone(); - let base_diags = base_result.diagnostics.clone(); - let start_result = infer_expr(&start_expr, &scope, &None); - let start_typed = start_result.typed.clone(); - let start_diags = start_result.diagnostics.clone(); - let end_result = infer_expr(&end_expr, &scope, &None); - let end_typed = end_result.typed.clone(); - let end_diags = end_result.diagnostics.clone(); - let slice_check = match base_typed.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { - node: base_type, .. - }) => match start_typed.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { - node: start_type, .. - }) => match end_typed.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: end_type, .. }) => { - Some(check_slice_access_node( - base_type.clone(), - start_type.clone(), - end_type.clone(), - &span, - &scope.module_name.clone(), - &scope.type_env.clone().source_indices.clone(), - )) - } - _ => None, - }, - _ => None, - }, - _ => None, - }; - let access_failure_inferred = match base_typed.inferred.clone().as_deref().cloned() +} + } else { + extend_scope_with_params(&scope, lam_params.clone()) + }; +let body_expected = if (expected.clone() != None) { { - Some(InferredNode::Resolved { .. }) => { - match start_typed.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { .. }) => end_typed.inferred.clone(), - _ => start_typed.inferred.clone(), - } + let exp = expected.clone().unwrap(); +if ((exp.params.clone().len() as i64) > 0) { + Some(callable_inferred(&exp)) + } else { + None } - _ => base_typed.inferred.clone(), - }; - let slc_inferred = match slice_check.clone() { - Some(checked) => checked.inferred.clone(), - None => Some(inferred_or_error( - access_failure_inferred, - "invalid slice access".to_string(), - span.clone(), - )), - }; - let slice_access_diags = match slice_check.clone() { - Some(checked) => checked.diagnostics.clone(), - None => Rc::new(vec![]), - }; - let slc_texpr = make_expr_node( - Rc::new(ExprData::ExprSlice), - Rc::new(vec![ - base_typed.clone(), - start_typed.clone(), - end_typed.clone(), - ]), - slc_inferred, - span.clone(), - ); - Rc::new(InferResult { - typed: slc_texpr, - diagnostics: v2_rt::concat( - v2_rt::concat(v2_rt::concat(base_diags, start_diags), end_diags), - slice_access_diags, - ), - }) - } - ExprData::ExprReturn => { - let span = texpr.span.clone(); - let inner_expr = return_value(texpr.clone()); - let inner_result = infer_expr(&inner_expr, &scope, &expected); - let ret_texpr = make_expr_node( - Rc::new(ExprData::ExprReturn), - Rc::new(vec![inner_result.typed.clone()]), - inner_result.typed.clone().inferred.clone(), - span.clone(), - ); - Rc::new(InferResult { - typed: ret_texpr, - diagnostics: inner_result.diagnostics.clone(), - }) - } - _ => { - let span = texpr.span.clone(); - Rc::new(InferResult { - typed: make_expr_error_node( - ExprErrorKind::InternalExprError, - &"unhandled expression variant in infer_expr".to_string(), - &span, - ), - diagnostics: Rc::new(vec![inference_error( - "unhandled expression variant in infer_expr".to_string(), - span.clone(), - scope.module_name.clone(), - )]), - }) +} + } else { + None + }; +let body_scope = Rc::new(InferScope { + type_env: lam_scope.type_env.clone(), + func_env: lam_scope.func_env.clone(), + locals: lam_scope.locals.clone(), + match_bound_names: lam_scope.match_bound_names.clone(), + module_name: lam_scope.module_name.clone(), + service_registry: lam_scope.service_registry.clone(), + item_registry: lam_scope.item_registry.clone(), + lambda_param_provenance: v2_rt::rc_empty_map::>(), +}); +let body_result = infer_expr(&lam_body, &body_scope, &body_expected); +let body_typed = body_result.typed.clone(); +let body_diags = body_result.diagnostics.clone(); +let typed_param_nodes = Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(lam_param_nodes.iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { __result.push({ + let pn = pair.1.clone(); +let param_name = match lam_params.clone().get(pair.0.clone() as usize).cloned() { + Some(n) => n.clone(), + None => "".to_string(), +}; +let param_type = match v2_rt::map_get(&lam_scope.locals.clone(), param_name.clone()) { + Some(binding) => Some(Rc::new(InferredNode::Resolved { + node: binding.resolved.clone(), +})), + None => None, +}; +Rc::new(Node { + name: pn.name.clone(), + ident: pn.ident.clone(), + span: pn.span.clone(), + ident_span: pn.ident_span.clone(), + children: pn.children.clone(), + connective: pn.connective.clone(), + params: pn.params.clone(), + inferred: param_type.clone(), + return_cardinality: pn.return_cardinality.clone(), + uses: pn.uses.clone(), + body: pn.body.clone(), + transport: pn.transport.clone(), + properties: pn.properties.clone(), + type_annotation: pn.type_annotation.clone(), + is_self_recursive: pn.is_self_recursive.clone(), + has_non_tail_self_call: pn.has_non_tail_self_call.clone(), + match_pattern: pn.match_pattern.clone(), + expr_data: pn.expr_data.clone(), +}) +}); } __result }); +let lam_texpr = make_expr_node(Rc::new(ExprData::ExprLambda), v2_rt::concat(Rc::new(vec![body_typed.clone()]), typed_param_nodes), body_typed.inferred.clone(), span.clone()); +Rc::new(InferResult { + typed: lam_texpr, + diagnostics: body_diags.clone(), +}) +}, + ExprData::ExprStringInterp => { + let span = texpr.span.clone(); +let typed_part_nodes = Rc::new({ let mut __result = Vec::new(); for part_node in texpr.children.clone().iter().cloned() { __result.push(match (*part_node.expr_data.clone()).clone() { + ExprData::ExprLiteral { .. } => part_node.clone(), + _ => match part_node.children.clone().first().cloned() { + Some(inner) => { + let r = infer_expr(&inner, &scope, &None); +make_interp_part_node(r.typed.clone(), part_node.span.clone()) +}, + None => part_node.clone(), +}, +}); } __result }); +let interp_diags = Rc::new({ let mut __result = Vec::new(); for part_node in texpr.children.clone().iter().cloned() { __result.extend((*match (*part_node.expr_data.clone()).clone() { + ExprData::ExprLiteral { .. } => Rc::new(vec![]), + _ => match part_node.children.clone().first().cloned() { + Some(inner) => { + let r = infer_expr(&inner, &scope, &None); +r.diagnostics.clone() +}, + None => Rc::new(vec![]), +}, +}).iter().cloned()); } __result }); +let si_texpr = make_expr_node(Rc::new(ExprData::ExprStringInterp), typed_part_nodes, Some(Rc::new(InferredNode::Resolved { + node: string_type(), +})), span.clone()); +Rc::new(InferResult { + typed: si_texpr, + diagnostics: interp_diags, +}) +}, + ExprData::ExprBlock => { + let span = texpr.span.clone(); +let stmts = texpr.children.clone(); +if ((stmts.clone().len() as i64) > 0) { + { + let state = infer_block_stmts(stmts.clone(), (stmts.clone().len() as i64), scope.clone(), Rc::new(vec![]), Rc::new(vec![]), unit_type(), expected.clone()); +let blk_texpr = make_expr_node(Rc::new(ExprData::ExprBlock), state.typed_stmts.clone(), Some(Rc::new(InferredNode::Resolved { + node: state.last_type.clone(), +})), span.clone()); +Rc::new(InferResult { + typed: blk_texpr, + diagnostics: Rc::new({ let mut __result = Vec::new(); for c in state.diag_chunks.clone().iter().cloned() { __result.extend((*c.clone()).iter().cloned()); } __result }), +}) +} + } else { + ok_infer(make_expr_node(Rc::new(ExprData::ExprBlock), Rc::new(vec![]), Some(Rc::new(InferredNode::Resolved { + node: unit_type(), +})), span.clone())) } - } +}, + ExprData::ExprCast => { + let span = texpr.span.clone(); +let cast_inner = cast_expr(texpr.clone()); +let target_type = cast_target(texpr.clone()); +let inner_result = infer_expr(&cast_inner, &scope, &None); +let inner_typed = inner_result.typed.clone(); +let inner_diags = inner_result.diagnostics.clone(); +let si = scope.type_env.clone().source_indices.clone(); +let target_name = authored_name_at(si.clone(), &target_type); +let cast_diag = validate_cast(inner_typed.inferred.clone(), &target_name, span.clone(), si.clone(), scope.module_name.clone()); +let cast_diags = match cast_diag { + Some(d) => Rc::new(vec![d.clone()]), + None => Rc::new(vec![]), +}; +let cast_texpr = make_expr_node(Rc::new(ExprData::ExprCast), Rc::new(vec![inner_typed.clone(), target_type.clone()]), Some(Rc::new(InferredNode::Resolved { + node: target_type.clone(), +})), span.clone()); +Rc::new(InferResult { + typed: cast_texpr, + diagnostics: v2_rt::concat(inner_diags, cast_diags), +}) +}, + ExprData::ExprForEach => { + let variable = foreach_variable_at(texpr.clone(), scope.type_env.clone().source_indices.clone()); +let span = texpr.span.clone(); +let coll = foreach_collection(texpr.clone()); +let body_expr = foreach_body(texpr.clone()); +let coll_result = infer_expr(&coll, &scope, &None); +let coll_typed = coll_result.typed.clone(); +let coll_diags = coll_result.diagnostics.clone(); +let elem_type_node = for_each_element_type_node(resolved_type(coll_typed.clone()), scope.type_env.clone().source_indices.clone()); +let elem_provenance = derive_element_provenance(coll_typed.clone(), &elem_type_node, &scope); +let body_scope = extend_scope(&scope, &variable, elem_type_node.clone(), elem_provenance); +let body_result = infer_expr(&body_expr, &body_scope, &None); +let body_typed = body_result.typed.clone(); +let body_diags = body_result.diagnostics.clone(); +let fe_texpr = make_named_expr_node(&variable, Rc::new(ExprData::ExprForEach), Rc::new(vec![coll_typed.clone(), body_typed.clone()]), body_typed.inferred.clone(), span.clone(), node_name_span(&texpr)); +Rc::new(InferResult { + typed: fe_texpr, + diagnostics: v2_rt::concat(coll_diags, body_diags.clone()), +}) +}, + ExprData::ExprIndex => { + let span = texpr.span.clone(); +let base_expr = index_base(texpr.clone()); +let idx_key = index_expr(texpr.clone()); +let base_result = infer_expr(&base_expr, &scope, &None); +let base_typed = base_result.typed.clone(); +let base_diags = base_result.diagnostics.clone(); +let index_result = infer_expr(&idx_key, &scope, &None); +let index_typed = index_result.typed.clone(); +let index_diags = index_result.diagnostics.clone(); +let index_check = match base_typed.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: base_type, .. }) => match index_typed.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: index_type, .. }) => Some(check_index_access_node(base_type.clone(), index_type.clone(), &span, scope.module_name.clone(), &scope.type_env.clone().source_indices.clone())), + _ => None, +}, + _ => None, +}; +let access_failure_inferred = match base_typed.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { .. }) => index_typed.inferred.clone(), + _ => base_typed.inferred.clone(), +}; +let idx_inferred = match index_check.clone() { + Some(checked) => checked.inferred.clone(), + None => Some(inferred_or_error(access_failure_inferred, "invalid index access".to_string(), span.clone())), +}; +let index_access_diags = match index_check.clone() { + Some(checked) => checked.diagnostics.clone(), + None => Rc::new(vec![]), +}; +let idx_texpr = make_expr_node(Rc::new(ExprData::ExprIndex), Rc::new(vec![base_typed.clone(), index_typed.clone()]), idx_inferred, span.clone()); +Rc::new(InferResult { + typed: idx_texpr, + diagnostics: v2_rt::concat(v2_rt::concat(base_diags, index_diags), index_access_diags), +}) +}, + ExprData::ExprSlice => { + let span = texpr.span.clone(); +let base_expr = slice_base(texpr.clone()); +let start_expr = slice_start(texpr.clone()); +let end_expr = slice_end(texpr.clone()); +let base_result = infer_expr(&base_expr, &scope, &None); +let base_typed = base_result.typed.clone(); +let base_diags = base_result.diagnostics.clone(); +let start_result = infer_expr(&start_expr, &scope, &None); +let start_typed = start_result.typed.clone(); +let start_diags = start_result.diagnostics.clone(); +let end_result = infer_expr(&end_expr, &scope, &None); +let end_typed = end_result.typed.clone(); +let end_diags = end_result.diagnostics.clone(); +let slice_check = match base_typed.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: base_type, .. }) => match start_typed.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: start_type, .. }) => match end_typed.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: end_type, .. }) => Some(check_slice_access_node(base_type.clone(), start_type.clone(), end_type.clone(), &span, &scope.module_name.clone(), &scope.type_env.clone().source_indices.clone())), + _ => None, +}, + _ => None, +}, + _ => None, +}; +let access_failure_inferred = match base_typed.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { .. }) => match start_typed.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { .. }) => end_typed.inferred.clone(), + _ => start_typed.inferred.clone(), +}, + _ => base_typed.inferred.clone(), +}; +let slc_inferred = match slice_check.clone() { + Some(checked) => checked.inferred.clone(), + None => Some(inferred_or_error(access_failure_inferred, "invalid slice access".to_string(), span.clone())), +}; +let slice_access_diags = match slice_check.clone() { + Some(checked) => checked.diagnostics.clone(), + None => Rc::new(vec![]), +}; +let slc_texpr = make_expr_node(Rc::new(ExprData::ExprSlice), Rc::new(vec![base_typed.clone(), start_typed.clone(), end_typed.clone()]), slc_inferred, span.clone()); +Rc::new(InferResult { + typed: slc_texpr, + diagnostics: v2_rt::concat(v2_rt::concat(v2_rt::concat(base_diags, start_diags), end_diags), slice_access_diags), +}) +}, + ExprData::ExprReturn => { + let span = texpr.span.clone(); +let inner_expr = return_value(texpr.clone()); +let inner_result = infer_expr(&inner_expr, &scope, &expected); +let ret_texpr = make_expr_node(Rc::new(ExprData::ExprReturn), Rc::new(vec![inner_result.typed.clone()]), inner_result.typed.clone().inferred.clone(), span.clone()); +Rc::new(InferResult { + typed: ret_texpr, + diagnostics: inner_result.diagnostics.clone(), +}) +}, + _ => { + let span = texpr.span.clone(); +Rc::new(InferResult { + typed: make_expr_error_node(ExprErrorKind::InternalExprError, &"unhandled expression variant in infer_expr".to_string(), &span), + diagnostics: Rc::new(vec![inference_error("unhandled expression variant in infer_expr".to_string(), span.clone(), scope.module_name.clone())]), +}) +}, +} }) } -pub fn infer_record_lit( - type_name: &Option, - field_inits: Rc>>, - span: &Rc, - name_span: Rc, - scope: &Rc, -) -> Rc { +pub fn infer_record_lit(type_name: &Option, field_inits: Rc>>, span: &Rc, name_span: Rc, scope: &Rc) -> Rc { { let struct_def = match type_name.clone() { - Some(tn) => lookup_type_by_name(&scope.type_env.clone(), tn.clone()), - None => None, - }; - let struct_fields = match struct_def { - Some(sd) => sd.children.clone(), - None => Rc::new(vec![]), - }; - let fi_infer_results = Rc::new({ - let mut __result = Vec::new(); - for fi in field_inits.iter().cloned() { - __result.push({ - let fi_name = field_init_node_name_at( - fi.clone(), - scope.type_env.clone().source_indices.clone(), - ); - let field_expected = match Rc::new({ - let mut __result = Vec::new(); - for sf in struct_fields.clone().iter().cloned() { - if (authored_name_at( - scope.type_env.clone().source_indices.clone(), - &sf, - ) - .as_str() - == fi_name.clone().as_str()) - { - __result.push(sf); - } - } - __result - }) - .first() - .cloned() - { - Some(sf) => { - let ft = resolved_type(sf.clone()); - if (ft.ident_span.clone() != None) { - Some(ft.clone()) - } else { - None - } - } - None => None, - }; - let ar = infer_expr(&field_init_node_value(&fi), &scope, &field_expected); - let ar_typed = ar.typed.clone(); - let ar_diags = ar.diagnostics.clone(); - Rc::new(FieldInferResult { - typed_field: make_field_init_node( - &fi_name, - ar_typed.clone(), - fi.span.clone(), - node_name_span(&fi), - ), - infer_result: ar.clone(), - diagnostics: ar_diags.clone(), - }) - }); - } - __result - }); - let typed_fields = Rc::new({ - let mut __result = Vec::new(); - for fir in fi_infer_results.clone().iter().cloned() { - __result.push(fir.typed_field.clone()); - } - __result - }); - let fi_diags = Rc::new({ - let mut __result = Vec::new(); - for fir in fi_infer_results.clone().iter().cloned() { - __result.extend((*fir.diagnostics.clone()).iter().cloned()); - } - __result - }); - if (type_name.clone() == None) { + Some(tn) => lookup_type_by_name(&scope.type_env.clone(), tn.clone()), + None => None, +}; +let struct_fields = match struct_def { + Some(sd) => sd.children.clone(), + None => Rc::new(vec![]), +}; +let fi_infer_results = Rc::new({ let mut __result = Vec::new(); for fi in field_inits.iter().cloned() { __result.push({ + let fi_name = field_init_node_name_at(fi.clone(), scope.type_env.clone().source_indices.clone()); +let field_expected = match Rc::new({ let mut __result = Vec::new(); for sf in struct_fields.clone().iter().cloned() { if (authored_name_at(scope.type_env.clone().source_indices.clone(), &sf).as_str() == fi_name.clone().as_str()) { __result.push(sf); } } __result }).first().cloned() { + Some(sf) => { + let ft = resolved_type(sf.clone()); +if (ft.ident_span.clone() != None) { + Some(ft.clone()) + } else { + None + } +}, + None => None, +}; +let ar = infer_expr(&field_init_node_value(&fi), &scope, &field_expected); +let ar_typed = ar.typed.clone(); +let ar_diags = ar.diagnostics.clone(); +Rc::new(FieldInferResult { + typed_field: make_field_init_node(&fi_name, ar_typed.clone(), fi.span.clone(), node_name_span(&fi)), + infer_result: ar.clone(), + diagnostics: ar_diags.clone(), +}) +}); } __result }); +let typed_fields = Rc::new({ let mut __result = Vec::new(); for fir in fi_infer_results.clone().iter().cloned() { __result.push(fir.typed_field.clone()); } __result }); +let fi_diags = Rc::new({ let mut __result = Vec::new(); for fir in fi_infer_results.clone().iter().cloned() { __result.extend((*fir.diagnostics.clone()).iter().cloned()); } __result }); +if (type_name.clone() == None) { { - let child_nodes = Rc::new({ - let mut __result = Vec::new(); - for fir in fi_infer_results.clone().iter().cloned() { - __result.push(Rc::new(Node { - name: field_init_node_name_at( - fir.typed_field.clone(), - scope.type_env.clone().source_indices.clone(), - ), - span: fir.typed_field.clone().span.clone(), - ident_span: fir.typed_field.clone().ident_span.clone(), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: fir.infer_result.clone().typed.clone().inferred.clone(), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - })); - } - __result - }); - let anon_node = Rc::new(Node { - name: "".to_string(), - span: no_span(), - ident_span: None, - children: child_nodes, - connective: Connective::Conj, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - let typed_field_nodes = typed_fields; - let texpr = make_expr_node( - Rc::new(ExprData::ExprRecordLit { parent_enum: None }), - typed_field_nodes, - Some(Rc::new(InferredNode::Resolved { node: anon_node })), - span.clone(), - ); - Rc::new(InferResult { - typed: texpr, - diagnostics: fi_diags, - }) - } + let child_nodes = Rc::new({ let mut __result = Vec::new(); for fir in fi_infer_results.clone().iter().cloned() { __result.push(Rc::new(Node { + name: field_init_node_name_at(fir.typed_field.clone(), scope.type_env.clone().source_indices.clone()), + span: fir.typed_field.clone().span.clone(), + ident_span: fir.typed_field.clone().ident_span.clone(), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: fir.infer_result.clone().typed.clone().inferred.clone(), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +})); } __result }); +let anon_node = Rc::new(Node { + name: "".to_string(), + span: no_span(), + ident_span: None, + children: child_nodes, + connective: Connective::Conj, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +let typed_field_nodes = typed_fields; +let texpr = make_expr_node(Rc::new(ExprData::ExprRecordLit { + parent_enum: None, +}), typed_field_nodes, Some(Rc::new(InferredNode::Resolved { + node: anon_node, +})), span.clone()); +Rc::new(InferResult { + typed: texpr, + diagnostics: fi_diags, +}) +} } else { { - let type_lookup = - lookup_type_by_name(&scope.type_env.clone(), type_name.clone().unwrap()); - let local_variant_parent = - lookup_variant_parent_enum(&scope, &type_name.clone().unwrap()); - let effective_lookup = match type_lookup.clone() { - Some(_) => type_lookup.clone(), - None => { - let local_lookup = - lookup_in_scope(scope.locals.clone(), type_name.clone().unwrap()); - match local_lookup { - Some(local_node) => { - lookup_type_for(&scope.type_env.clone(), &local_node) - } - None => None, - } - } - }; - let raw_resolved = match effective_lookup.clone() { - Some(tn) => tn.clone(), - None => error_type(), - }; - let expected_optional_parent = Some("Optional".to_string()); - let is_some_ctor = ((type_name.clone().unwrap().as_str() - == "Some".to_string().as_str()) - && (local_variant_parent.clone().as_deref() - == expected_optional_parent.as_deref())); - let resolved_node = if is_some_ctor { + let type_lookup = lookup_type_by_name(&scope.type_env.clone(), type_name.clone().unwrap()); +let local_variant_parent = lookup_variant_parent_enum(&scope, &type_name.clone().unwrap()); +let effective_lookup = match type_lookup.clone() { + Some(_) => type_lookup.clone(), + None => { + let local_lookup = lookup_in_scope(scope.locals.clone(), type_name.clone().unwrap()); +match local_lookup { + Some(local_node) => lookup_type_for(&scope.type_env.clone(), &local_node), + None => None, +} +}, +}; +let raw_resolved = match effective_lookup.clone() { + Some(tn) => tn.clone(), + None => error_type(), +}; +let expected_optional_parent = Some("Optional".to_string()); +let is_some_ctor = ((type_name.clone().unwrap().as_str() == "Some".to_string().as_str()) && (local_variant_parent.clone().as_deref() == expected_optional_parent.as_deref())); +let resolved_node = if is_some_ctor { { - let val_field = Rc::new({ - let mut __result = Vec::new(); - for fir in fi_infer_results.clone().iter().cloned() { - if (field_init_node_name_at( - fir.typed_field.clone(), - scope.type_env.clone().source_indices.clone(), - ) - .as_str() - == "value".to_string().as_str()) - { - __result.push(fir); - } - } - __result - }) - .first() - .cloned(); - match val_field { - Some(val_fir) => with_optional_cardinality(&resolved_type( - val_fir.infer_result.clone().typed.clone(), - )), - None => raw_resolved, - } - } + let val_field = Rc::new({ let mut __result = Vec::new(); for fir in fi_infer_results.clone().iter().cloned() { if (field_init_node_name_at(fir.typed_field.clone(), scope.type_env.clone().source_indices.clone()).as_str() == "value".to_string().as_str()) { __result.push(fir); } } __result }).first().cloned(); +match val_field { + Some(val_fir) => with_optional_cardinality(&resolved_type(val_fir.infer_result.clone().typed.clone())), + None => raw_resolved, +} +} } else { raw_resolved }; - let type_diags = match effective_lookup.clone() { - Some(_) => Rc::new(vec![]), - None => Rc::new(vec![inference_error( - v2_rt::concat( - v2_rt::concat("type '".to_string(), type_name.clone().unwrap()), - "' not found in scope".to_string(), - ), - span.clone(), - scope.module_name.clone(), - )]), - }; - let typed_field_nodes2 = typed_fields; - let rl_name = match type_name.clone() { - Some(tn_val) => tn_val.clone(), - None => "".to_string(), - }; - let texpr = make_named_expr_node( - &rl_name, - Rc::new(ExprData::ExprRecordLit { - parent_enum: local_variant_parent.clone(), - }), - typed_field_nodes2, - Some(Rc::new(InferredNode::Resolved { - node: resolved_node, - })), - span.clone(), - name_span, - ); - Rc::new(InferResult { - typed: texpr, - diagnostics: v2_rt::concat(fi_diags, type_diags), - }) - } +let type_diags = match effective_lookup.clone() { + Some(_) => Rc::new(vec![]), + None => Rc::new(vec![inference_error(v2_rt::concat(v2_rt::concat("type '".to_string(), type_name.clone().unwrap()), "' not found in scope".to_string()), span.clone(), scope.module_name.clone())]), +}; +let typed_field_nodes2 = typed_fields; +let rl_name = match type_name.clone() { + Some(tn_val) => tn_val.clone(), + None => "".to_string(), +}; +let texpr = make_named_expr_node(&rl_name, Rc::new(ExprData::ExprRecordLit { + parent_enum: local_variant_parent.clone(), +}), typed_field_nodes2, Some(Rc::new(InferredNode::Resolved { + node: resolved_node, +})), span.clone(), name_span); +Rc::new(InferResult { + typed: texpr, + diagnostics: v2_rt::concat(fi_diags, type_diags), +}) +} } - } +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum SizeExpr { - ParamSize { param: String }, - DividedSize { param: String, divisor: i64 }, + ParamSize { + param: String, + }, + DividedSize { + param: String, + divisor: i64, + }, } impl SizeExpr { pub fn param(&self) -> String { @@ -4382,182 +2556,119 @@ pub struct DescentContext { pub fn classify_size_expr(val: &Rc, ctx: &Rc) -> Option> { match (*val.expr_data.clone()).clone() { - ExprData::ExprMethodCall { .. } => { - let mname = - expr_method_name_at(val.clone(), ctx.type_env.clone().source_indices.clone()); - if (mname.as_str() == "count".to_string().as_str()) { - { - let receiver = method_receiver(val.clone()); - match (*receiver.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let rname = expr_var_name_at( - receiver.clone(), - ctx.type_env.clone().source_indices.clone(), - ); - match v2_rt::map_get(&ctx.param_names.clone(), rname.clone()) { - Some(_) => Some(Rc::new(SizeExpr::ParamSize { - param: rname.clone(), - })), - None => None, - } - } - _ => None, - } - } + ExprData::ExprMethodCall { .. } => { + let mname = expr_method_name_at(val.clone(), ctx.type_env.clone().source_indices.clone()); +if (mname.as_str() == "count".to_string().as_str()) { + { + let receiver = method_receiver(val.clone()); +match (*receiver.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let rname = expr_var_name_at(receiver.clone(), ctx.type_env.clone().source_indices.clone()); +match v2_rt::map_get(&ctx.param_names.clone(), rname.clone()) { + Some(_) => Some(Rc::new(SizeExpr::ParamSize { + param: rname.clone(), +})), + None => None, +} +}, + _ => None, +} +} + } else { + None + } +}, + ExprData::ExprBinOp { .. } => { + let left = binop_left(val.clone()); +let right = binop_right(val.clone()); +match (*val.expr_data.clone()).clone() { + ExprData::ExprBinOp { op: BinOp::Div, .. } => match (*left.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let lname = expr_var_name_at(left.clone(), ctx.type_env.clone().source_indices.clone()); +match v2_rt::map_get(&ctx.size_aliases.clone(), lname).as_deref().cloned() { + Some(SizeExpr::ParamSize { param: p, .. }) => match (*right.expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitInt { value: d, .. } = value.as_ref() else { unreachable!() }; if (d.clone() > 0) { + Some(Rc::new(SizeExpr::DividedSize { + param: p.clone(), + divisor: d.clone(), +})) } else { None - } - } - ExprData::ExprBinOp { .. } => { - let left = binop_left(val.clone()); - let right = binop_right(val.clone()); - match (*val.expr_data.clone()).clone() { - ExprData::ExprBinOp { op: BinOp::Div, .. } => match (*left.expr_data.clone()) - .clone() - { - ExprData::ExprVar { .. } => { - let lname = expr_var_name_at( - left.clone(), - ctx.type_env.clone().source_indices.clone(), - ); - match v2_rt::map_get(&ctx.size_aliases.clone(), lname) - .as_deref() - .cloned() - { - Some(SizeExpr::ParamSize { param: p, .. }) => { - match (*right.expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { - let LiteralValue::LitInt { value: d, .. } = value.as_ref() - else { - unreachable!() - }; - if (d.clone() > 0) { - Some(Rc::new(SizeExpr::DividedSize { - param: p.clone(), - divisor: d.clone(), - })) - } else { - None - } - } - _ => None, - } - } - _ => None, - } - } - _ => None, - }, - _ => None, - } - } - _ => None, - } + } }, + _ => None, +}, + _ => None, +} +}, + _ => None, +}, + _ => None, +} +}, + _ => None, +} } -pub fn proportional_skip_alias_plus_literal( - alias_expr: &Rc, - lit_expr: Rc, - param_name: &String, - ctx: &Rc, -) -> Option> { +pub fn proportional_skip_alias_plus_literal(alias_expr: &Rc, lit_expr: Rc, param_name: &String, ctx: &Rc) -> Option> { match (*alias_expr.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let aname = expr_var_name_at( - alias_expr.clone(), - ctx.type_env.clone().source_indices.clone(), - ); - match v2_rt::map_get(&ctx.size_aliases.clone(), aname) - .as_deref() - .cloned() - { - Some(SizeExpr::DividedSize { - param: p, - divisor: d, - .. - }) => { - if (p.clone().as_str() == param_name.clone().as_str()) { - match (*lit_expr.expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { - let LiteralValue::LitInt { value: k, .. } = value.as_ref() else { - unreachable!() - }; - if (k.clone() > 0) { - match proportional_divisor_from_int_at_least_two(d.clone()) { - Some(div_w) => { - let synth_field = Rc::new(InductiveField { - type_name: param_name.clone(), - variant_name: "".to_string(), - field_name: "skip".to_string(), - shape: RecursionShape::ListRecursion, - element_type: param_name.clone(), - }); - Some(Rc::new(SubValueRelation::StrictSubValue { - field: synth_field, - factor: Rc::new(ShrinkFactor::ProportionalShrink { - divisor: div_w.clone(), - }), - })) - } - None => None, - } - } else { - None - } - } - _ => None, - } - } else { - None - } - } - _ => None, - } - } - _ => None, - } + ExprData::ExprVar { .. } => { + let aname = expr_var_name_at(alias_expr.clone(), ctx.type_env.clone().source_indices.clone()); +match v2_rt::map_get(&ctx.size_aliases.clone(), aname).as_deref().cloned() { + Some(SizeExpr::DividedSize { param: p, divisor: d, .. }) => if (p.clone().as_str() == param_name.clone().as_str()) { + match (*lit_expr.expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitInt { value: k, .. } = value.as_ref() else { unreachable!() }; if (k.clone() > 0) { + match proportional_divisor_from_int_at_least_two(d.clone()) { + Some(div_w) => { + let synth_field = Rc::new(InductiveField { + type_name: param_name.clone(), + variant_name: "".to_string(), + field_name: "skip".to_string(), + shape: RecursionShape::ListRecursion, + element_type: param_name.clone(), +}); +Some(Rc::new(SubValueRelation::StrictSubValue { + field: synth_field, + factor: Rc::new(ShrinkFactor::ProportionalShrink { + divisor: div_w.clone(), +}), +})) +}, + None => None, +} + } else { + None + } }, + _ => None, +} + } else { + None + }, + _ => None, +} +}, + _ => None, +} } -pub fn classify_collection_shrink( - arg_expr: &Rc, - param_name: &String, - ctx: &Rc, -) -> Rc { +pub fn classify_collection_shrink(arg_expr: &Rc, param_name: &String, ctx: &Rc) -> Rc { match (*arg_expr.expr_data.clone()).clone() { - ExprData::ExprMethodCall { .. } => { - let mname = expr_method_name_at( - arg_expr.clone(), - ctx.type_env.clone().source_indices.clone(), - ); - if ((mname.clone().as_str() == "take".to_string().as_str()) - || (mname.clone().as_str() == "skip".to_string().as_str())) + ExprData::ExprMethodCall { .. } => { + let mname = expr_method_name_at(arg_expr.clone(), ctx.type_env.clone().source_indices.clone()); +if ((mname.clone().as_str() == "take".to_string().as_str()) || (mname.clone().as_str() == "skip".to_string().as_str())) { { - { - let receiver = method_receiver(arg_expr.clone()); - match (*receiver.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let rname = expr_var_name_at( - receiver.clone(), - ctx.type_env.clone().source_indices.clone(), - ); - if (rname.as_str() == param_name.clone().as_str()) { - { - let args = method_arg_nodes(arg_expr.clone()); - match args.first().cloned() { - Some(arg_node) => { - let arg_val = arg_value(&arg_node); - match (*arg_val.expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { - let LiteralValue::LitInt { value: k, .. } = - value.as_ref() - else { - unreachable!() - }; - if ((k.clone() > 0) - && (mname.clone().as_str() - == "skip".to_string().as_str())) - { - match positive_descent_amount_from_positive_int(k.clone()) { + let receiver = method_receiver(arg_expr.clone()); +match (*receiver.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let rname = expr_var_name_at(receiver.clone(), ctx.type_env.clone().source_indices.clone()); +if (rname.as_str() == param_name.clone().as_str()) { + { + let args = method_arg_nodes(arg_expr.clone()); +match args.first().cloned() { + Some(arg_node) => { + let arg_val = arg_value(&arg_node); +match (*arg_val.expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitInt { value: k, .. } = value.as_ref() else { unreachable!() }; if ((k.clone() > 0) && (mname.clone().as_str() == "skip".to_string().as_str())) { + match positive_descent_amount_from_positive_int(k.clone()) { Some(steps) => { let synth_field = Rc::new(InductiveField { type_name: param_name.clone(), @@ -4575,31 +2686,14 @@ Rc::new(SubValueRelation::StrictSubValue { }, None => Rc::new(SubValueRelation::SubValueUnknown), } - } else { - Rc::new(SubValueRelation::SubValueUnknown) - } - } - ExprData::ExprVar { .. } => { - let aname = expr_var_name_at( - arg_val.clone(), - ctx.type_env.clone().source_indices.clone(), - ); - match v2_rt::map_get( - &ctx.size_aliases.clone(), - aname, - ) - .as_deref() - .cloned() - { - Some(SizeExpr::DividedSize { - param: p, - divisor: d, - .. - }) => { - if (p.clone().as_str() - == param_name.clone().as_str()) - { - match proportional_divisor_from_int_at_least_two(d.clone()) { + } else { + Rc::new(SubValueRelation::SubValueUnknown) + } }, + ExprData::ExprVar { .. } => { + let aname = expr_var_name_at(arg_val.clone(), ctx.type_env.clone().source_indices.clone()); +match v2_rt::map_get(&ctx.size_aliases.clone(), aname).as_deref().cloned() { + Some(SizeExpr::DividedSize { param: p, divisor: d, .. }) => if (p.clone().as_str() == param_name.clone().as_str()) { + match proportional_divisor_from_int_at_least_two(d.clone()) { Some(div_w) => { let synth_field = Rc::new(InductiveField { type_name: param_name.clone(), @@ -4617,66 +2711,50 @@ Rc::new(SubValueRelation::StrictSubValue { }, None => Rc::new(SubValueRelation::SubValueUnknown), } - } else { - Rc::new(SubValueRelation::SubValueUnknown) - } - } - _ => Rc::new( - SubValueRelation::SubValueUnknown, - ), - } - } - ExprData::ExprBinOp { op, .. } => { - match op.clone() { - BinOp::Add => { - if (mname.clone().as_str() - == "skip".to_string().as_str()) - { - { - let left = - binop_left(arg_val.clone()); - let right = binop_right( - arg_val.clone(), - ); - match proportional_skip_alias_plus_literal(&left, right.clone(), ¶m_name, &ctx) { + } else { + Rc::new(SubValueRelation::SubValueUnknown) + }, + _ => Rc::new(SubValueRelation::SubValueUnknown), +} +}, + ExprData::ExprBinOp { op, .. } => match op.clone() { + BinOp::Add => if (mname.clone().as_str() == "skip".to_string().as_str()) { + { + let left = binop_left(arg_val.clone()); +let right = binop_right(arg_val.clone()); +match proportional_skip_alias_plus_literal(&left, right.clone(), ¶m_name, &ctx) { Some(rel) => rel.clone(), None => match proportional_skip_alias_plus_literal(&right, left.clone(), ¶m_name, &ctx) { Some(rel) => rel.clone(), None => Rc::new(SubValueRelation::SubValueUnknown), }, } - } - } else { - Rc::new(SubValueRelation::SubValueUnknown) - } - } - BinOp::Sub => Rc::new( - SubValueRelation::SubValueUnknown, - ), - _ => Rc::new( - SubValueRelation::SubValueUnknown, - ), - } - } - _ => Rc::new(SubValueRelation::SubValueUnknown), - } - } - None => Rc::new(SubValueRelation::SubValueUnknown), - } - } - } else { - Rc::new(SubValueRelation::SubValueUnknown) - } - } - _ => Rc::new(SubValueRelation::SubValueUnknown), +} + } else { + Rc::new(SubValueRelation::SubValueUnknown) + }, + BinOp::Sub => Rc::new(SubValueRelation::SubValueUnknown), + _ => Rc::new(SubValueRelation::SubValueUnknown), +}, + _ => Rc::new(SubValueRelation::SubValueUnknown), +} +}, + None => Rc::new(SubValueRelation::SubValueUnknown), +} +} + } else { + Rc::new(SubValueRelation::SubValueUnknown) } - } - } else { - Rc::new(SubValueRelation::SubValueUnknown) - } +}, + _ => Rc::new(SubValueRelation::SubValueUnknown), +} +} + } else { + Rc::new(SubValueRelation::SubValueUnknown) } - _ => Rc::new(SubValueRelation::SubValueUnknown), - } +}, + _ => Rc::new(SubValueRelation::SubValueUnknown), +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -4687,870 +2765,464 @@ pub struct BlockAnnotateAcc { pub fn method_callback_element_position(semantics: Option>) -> Option { match semantics.as_deref().cloned() { - Some(MethodSemantics::AlgebraMethodSemantics { - algebra_template: at, - .. - }) => match at.clone() { - Some(template) => template.callback_element_position.clone(), - None => None, - }, - _ => None, - } + Some(MethodSemantics::AlgebraMethodSemantics { algebra_template: at, .. }) => match at.clone() { + Some(template) => template.callback_element_position.clone(), + None => None, +}, + _ => None, +} } -pub fn maybe_insert_composed_field_relation( - acc: Rc>>, - fname: String, - composed: Option>, -) -> Rc>> { +pub fn maybe_insert_composed_field_relation(acc: Rc>>, fname: String, composed: Option>) -> Rc>> { match composed { - Some(rel) => match (*rel.clone()).clone() { - SubValueRelation::SubValueUnknown => acc, - _ => v2_rt::rc_map_insert(acc, fname, rel.clone()), - }, - None => acc, - } + Some(rel) => match (*rel.clone()).clone() { + SubValueRelation::SubValueUnknown => acc, + _ => v2_rt::rc_map_insert(acc, fname, rel.clone()), +}, + None => acc, +} } -pub fn maybe_insert_output_field_relation( - acc: Rc>>, - idx: i64, - fname: String, - sig: Rc, - val: Rc, - ctx: Rc, -) -> Rc>> { +pub fn maybe_insert_output_field_relation(acc: Rc>>, idx: i64, fname: String, sig: Rc, val: Rc, ctx: Rc) -> Rc>> { { let composed = match sig.output_provenance.clone().get(idx as usize).cloned() { - Some(param_map) => classify_call_via_provenance(val, ¶m_map, ctx), - None => None, - }; - maybe_insert_composed_field_relation(acc, fname, composed) - } -} - -pub fn maybe_insert_match_field_relation( - fp_acc: Rc>>, - pname: &String, - field_label: String, - vname: String, - scrut_rel: Option>, - param_types: Rc>, - type_env: Rc, -) -> Rc>> { - match scrut_rel { - Some(rel) => { - let lookup_type = match (*rel.clone()).clone() { - SubValueRelation::PreservedValue => { - match v2_rt::map_get(¶m_types, pname.clone()) { - Some(t) => t.clone(), - None => "".to_string(), - } - } - SubValueRelation::StrictSubValue { field: f, .. } => f.element_type.clone(), - SubValueRelation::IteratedSubValue { field: f, .. } => f.element_type.clone(), - _ => "".to_string(), - }; - if (lookup_type.clone().as_str() != "".to_string().as_str()) { - { - let ind_fields = inductive_fields_for(type_env, lookup_type.clone()); - let matching = Rc::new({ - let mut __result = Vec::new(); - for f in ind_fields.iter().cloned() { - if ((f.field_name.clone().as_str() == field_label.clone().as_str()) - && ((f.variant_name.clone().as_str() == vname.clone().as_str()) - || (f.variant_name.clone().as_str() - == "".to_string().as_str()))) - { - __result.push(f); - } - } - __result - }) - .first() - .cloned(); - match matching { - Some(ind_field) => v2_rt::rc_map_insert( - fp_acc, - pname.clone(), - compose_sub_value(rel.clone(), ind_field.clone()), - ), - None => fp_acc, - } - } - } else { - fp_acc - } - } - None => fp_acc, - } + Some(param_map) => classify_call_via_provenance(val, ¶m_map, ctx), + None => None, +}; +maybe_insert_composed_field_relation(acc, fname, composed) } - -pub fn build_per_field_for_let( - val: &Rc, - binding_name: String, - ctx: &Rc, -) -> Rc>>>> { - match (*val.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { - let callee = - expr_call_func_at(val.clone(), ctx.type_env.clone().source_indices.clone()); - match v2_rt::map_get(&ctx.func_sigs.clone(), callee) { - Some(sig) => { - if ((sig.output_provenance.clone().len() as i64) > 1) { - { - let return_type = sig.inferred.clone(); - let field_map = Rc::new( - return_type - .children - .clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - .fold( - v2_rt::rc_empty_map::>(), - |acc: Rc>>, - pair: (i64, Rc)| { - let idx = pair.0.clone(); - let field_node = pair.1.clone(); - let fname = authored_name_at( - ctx.type_env.clone().source_indices.clone(), - &field_node, - ); - maybe_insert_output_field_relation( - acc, - idx.clone(), - fname.clone(), - sig.clone(), - val.clone(), - ctx.clone(), - ) - }, - ); - if ((Rc::new(v2_rt::map_keys(&field_map)).len() as i64) > 0) { - v2_rt::rc_map_insert( - ctx.per_field_vars.clone(), - binding_name, - field_map.clone(), - ) - } else { - ctx.per_field_vars.clone() - } - } - } else { - ctx.per_field_vars.clone() - } - } - None => ctx.per_field_vars.clone(), - } - } - ExprData::ExprMethodCall { .. } => { - let callee = - expr_method_name_at(val.clone(), ctx.type_env.clone().source_indices.clone()); - match v2_rt::map_get(&ctx.func_sigs.clone(), callee) { - Some(sig) => { - if ((sig.output_provenance.clone().len() as i64) > 1) { - { - let return_type = sig.inferred.clone(); - let field_map = Rc::new( - return_type - .children - .clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - .fold( - v2_rt::rc_empty_map::>(), - |acc: Rc>>, - pair: (i64, Rc)| { - let idx = pair.0.clone(); - let field_node = pair.1.clone(); - let fname = authored_name_at( - ctx.type_env.clone().source_indices.clone(), - &field_node, - ); - maybe_insert_output_field_relation( - acc, - idx.clone(), - fname.clone(), - sig.clone(), - val.clone(), - ctx.clone(), - ) - }, - ); - if ((Rc::new(v2_rt::map_keys(&field_map)).len() as i64) > 0) { - v2_rt::rc_map_insert( - ctx.per_field_vars.clone(), - binding_name, - field_map.clone(), - ) - } else { - ctx.per_field_vars.clone() - } - } - } else { - ctx.per_field_vars.clone() - } - } - None => ctx.per_field_vars.clone(), - } +} + +pub fn maybe_insert_match_field_relation(fp_acc: Rc>>, pname: &String, field_label: String, vname: String, scrut_rel: Option>, param_types: Rc>, type_env: Rc) -> Rc>> { + match scrut_rel { + Some(rel) => { + let lookup_type = match (*rel.clone()).clone() { + SubValueRelation::PreservedValue => match v2_rt::map_get(¶m_types, pname.clone()) { + Some(t) => t.clone(), + None => "".to_string(), +}, + SubValueRelation::StrictSubValue { field: f, .. } => f.element_type.clone(), + SubValueRelation::IteratedSubValue { field: f, .. } => f.element_type.clone(), + _ => "".to_string(), +}; +if (lookup_type.clone().as_str() != "".to_string().as_str()) { + { + let ind_fields = inductive_fields_for(type_env, lookup_type.clone()); +let matching = Rc::new({ let mut __result = Vec::new(); for f in ind_fields.iter().cloned() { if ((f.field_name.clone().as_str() == field_label.clone().as_str()) && ((f.variant_name.clone().as_str() == vname.clone().as_str()) || (f.variant_name.clone().as_str() == "".to_string().as_str()))) { __result.push(f); } } __result }).first().cloned(); +match matching { + Some(ind_field) => v2_rt::rc_map_insert(fp_acc, pname.clone(), compose_sub_value(rel.clone(), ind_field.clone())), + None => fp_acc, +} +} + } else { + fp_acc } - _ => ctx.per_field_vars.clone(), - } +}, + None => fp_acc, +} } -pub fn resolve_collection_field( - mut expr: Rc, - mut ctx: Rc, -) -> Option> { - loop { - match (*expr.expr_data.clone()).clone() { - ExprData::ExprFieldAccess { .. } => { - let base = field_access_base(expr.clone()); - let fname = field_access_field_at( - expr.clone(), - ctx.type_env.clone().source_indices.clone(), - ); - match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let bname = expr_var_name_at( - base.clone(), - ctx.type_env.clone().source_indices.clone(), - ); - let base_type = - match v2_rt::map_get(&ctx.param_names.clone(), bname.clone()) { - Some(t) => t.clone(), - None => { - match v2_rt::map_get(&ctx.sub_value_vars.clone(), bname.clone()) - { - Some(rel) => match (*rel.clone()).clone() { - SubValueRelation::StrictSubValue { - field: f, .. - } => f.element_type.clone(), - SubValueRelation::IteratedSubValue { - field: f, .. - } => f.element_type.clone(), - _ => "".to_string(), - }, - None => "".to_string(), - } - } - }; - if (base_type.clone().as_str() != "".to_string().as_str()) { - break Rc::new({ - let mut __result = Vec::new(); - for f in Rc::new({ - let mut __result = Vec::new(); - for f in inductive_fields_for( - ctx.type_env.clone(), - base_type.clone(), - ) - .iter() - .cloned() - { - if (f.field_name.clone().as_str() == fname.clone().as_str()) - { - __result.push(f); - } - } - __result - }) - .iter() - .cloned() - { - if match f.shape.clone() { - RecursionShape::ListRecursion => true, - _ => false, - } { - __result.push(f); - } - } - __result - }) - .first() - .cloned(); - } else { - break None; - } - } - _ => { - break None; - } - } - } - ExprData::ExprVar { .. } => { - let rname = - expr_var_name_at(expr.clone(), ctx.type_env.clone().source_indices.clone()); - match v2_rt::map_get(&ctx.sub_value_vars.clone(), rname) { - Some(rel) => match (*rel.clone()).clone() { - SubValueRelation::StrictSubValue { field: f, .. } => { - match f.shape.clone() { - RecursionShape::ListRecursion => { - break Some(f.clone()); - } - _ => { - break None; - } - } - } - SubValueRelation::IteratedSubValue { field: f, .. } => { - match f.shape.clone() { - RecursionShape::ListRecursion => { - break Some(f.clone()); - } - _ => { - break None; - } - } - } - _ => { - break None; - } - }, - None => { - break None; - } +pub fn build_per_field_for_let(val: &Rc, binding_name: String, ctx: &Rc) -> Rc>>>> { + match (*val.expr_data.clone()).clone() { + ExprData::ExprCall { .. } => { + let callee = expr_call_func_at(val.clone(), ctx.type_env.clone().source_indices.clone()); +match v2_rt::map_get(&ctx.func_sigs.clone(), callee) { + Some(sig) => if ((sig.output_provenance.clone().len() as i64) > 1) { + { + let return_type = sig.inferred.clone(); +let field_map = Rc::new(return_type.children.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, pair: (i64, Rc)| { + let idx = pair.0.clone(); +let field_node = pair.1.clone(); +let fname = authored_name_at(ctx.type_env.clone().source_indices.clone(), &field_node); +maybe_insert_output_field_relation(acc, idx.clone(), fname.clone(), sig.clone(), val.clone(), ctx.clone()) +}); +if ((Rc::new(v2_rt::map_keys(&field_map)).len() as i64) > 0) { + v2_rt::rc_map_insert(ctx.per_field_vars.clone(), binding_name, field_map.clone()) + } else { + ctx.per_field_vars.clone() } - } - ExprData::ExprMethodCall { .. } => { - let inner_mname = - expr_method_name_at(expr.clone(), ctx.type_env.clone().source_indices.clone()); - let is_collection_preserving = (((((inner_mname.clone().as_str() - == "enumerate".to_string().as_str()) - || (inner_mname.clone().as_str() == "skip".to_string().as_str())) - || (inner_mname.clone().as_str() == "take".to_string().as_str())) - || (inner_mname.clone().as_str() == "filter".to_string().as_str())) - || (inner_mname.clone().as_str() == "reverse".to_string().as_str())); - if is_collection_preserving { - { - let __tco_0 = method_receiver(expr); - expr = __tco_0; - continue; - } +} + } else { + ctx.per_field_vars.clone() + }, + None => ctx.per_field_vars.clone(), +} +}, + ExprData::ExprMethodCall { .. } => { + let callee = expr_method_name_at(val.clone(), ctx.type_env.clone().source_indices.clone()); +match v2_rt::map_get(&ctx.func_sigs.clone(), callee) { + Some(sig) => if ((sig.output_provenance.clone().len() as i64) > 1) { + { + let return_type = sig.inferred.clone(); +let field_map = Rc::new(return_type.children.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, pair: (i64, Rc)| { + let idx = pair.0.clone(); +let field_node = pair.1.clone(); +let fname = authored_name_at(ctx.type_env.clone().source_indices.clone(), &field_node); +maybe_insert_output_field_relation(acc, idx.clone(), fname.clone(), sig.clone(), val.clone(), ctx.clone()) +}); +if ((Rc::new(v2_rt::map_keys(&field_map)).len() as i64) > 0) { + v2_rt::rc_map_insert(ctx.per_field_vars.clone(), binding_name, field_map.clone()) } else { - break None; + ctx.per_field_vars.clone() } - } - _ => { - break None; - } - } - } +} + } else { + ctx.per_field_vars.clone() + }, + None => ctx.per_field_vars.clone(), +} +}, + _ => ctx.per_field_vars.clone(), +} +} + +pub fn resolve_collection_field(mut expr: Rc, mut ctx: Rc) -> Option> { + loop { + match (*expr.expr_data.clone()).clone() { + ExprData::ExprFieldAccess { .. } => { let base = field_access_base(expr.clone()); +let fname = field_access_field_at(expr.clone(), ctx.type_env.clone().source_indices.clone()); +match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { let bname = expr_var_name_at(base.clone(), ctx.type_env.clone().source_indices.clone()); +let base_type = match v2_rt::map_get(&ctx.param_names.clone(), bname.clone()) { + Some(t) => t.clone(), + None => match v2_rt::map_get(&ctx.sub_value_vars.clone(), bname.clone()) { + Some(rel) => match (*rel.clone()).clone() { + SubValueRelation::StrictSubValue { field: f, .. } => f.element_type.clone(), + SubValueRelation::IteratedSubValue { field: f, .. } => f.element_type.clone(), + _ => "".to_string(), +}, + None => "".to_string(), +}, +}; +if (base_type.clone().as_str() != "".to_string().as_str()) { + break Rc::new({ let mut __result = Vec::new(); for f in Rc::new({ let mut __result = Vec::new(); for f in inductive_fields_for(ctx.type_env.clone(), base_type.clone()).iter().cloned() { if (f.field_name.clone().as_str() == fname.clone().as_str()) { __result.push(f); } } __result }).iter().cloned() { if match f.shape.clone() { + RecursionShape::ListRecursion => true, + _ => false, +} { __result.push(f); } } __result }).first().cloned(); +} else { + break None; +} }, + _ => { break None; }, +} }, + ExprData::ExprVar { .. } => { let rname = expr_var_name_at(expr.clone(), ctx.type_env.clone().source_indices.clone()); +match v2_rt::map_get(&ctx.sub_value_vars.clone(), rname) { + Some(rel) => { match (*rel.clone()).clone() { + SubValueRelation::StrictSubValue { field: f, .. } => { match f.shape.clone() { + RecursionShape::ListRecursion => { break Some(f.clone()); }, + _ => { break None; }, +} }, + SubValueRelation::IteratedSubValue { field: f, .. } => { match f.shape.clone() { + RecursionShape::ListRecursion => { break Some(f.clone()); }, + _ => { break None; }, +} }, + _ => { break None; }, +} }, + None => { break None; }, +} }, + ExprData::ExprMethodCall { .. } => { let inner_mname = expr_method_name_at(expr.clone(), ctx.type_env.clone().source_indices.clone()); +let is_collection_preserving = (((((inner_mname.clone().as_str() == "enumerate".to_string().as_str()) || (inner_mname.clone().as_str() == "skip".to_string().as_str())) || (inner_mname.clone().as_str() == "take".to_string().as_str())) || (inner_mname.clone().as_str() == "filter".to_string().as_str())) || (inner_mname.clone().as_str() == "reverse".to_string().as_str())); +if is_collection_preserving { + { + let __tco_0 = method_receiver(expr); +expr = __tco_0; +continue; +} +} else { + break None; +} }, + _ => { break None; }, +} +} } pub fn classify_binding_provenance(val: &Rc, scope: &Rc) -> Rc { match (*val.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let vname = - expr_var_name_at(val.clone(), scope.type_env.clone().source_indices.clone()); - match v2_rt::map_get(&scope.locals.clone(), vname) { - Some(binding) => binding.provenance.clone(), - None => Rc::new(SubValueRelation::SubValueUnknown), - } - } - ExprData::ExprFieldAccess { .. } => { - let base = field_access_base(val.clone()); - let field = - field_access_field_at(val.clone(), scope.type_env.clone().source_indices.clone()); - match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let bname = expr_var_name_at( - base.clone(), - scope.type_env.clone().source_indices.clone(), - ); - match v2_rt::map_get(&scope.locals.clone(), bname) { - Some(binding) => { - let fields = inductive_fields_for( - scope.type_env.clone(), - authored_name_at( - scope.type_env.clone().source_indices.clone(), - &binding.resolved.clone(), - ), - ); - let matching = Rc::new({ - let mut __result = Vec::new(); - for f in fields.iter().cloned() { - if (f.field_name.clone().as_str() == field.clone().as_str()) { - __result.push(f); - } - } - __result - }) - .first() - .cloned(); - match matching { - Some(ind_field) => { - compose_sub_value(binding.provenance.clone(), ind_field.clone()) - } - None => Rc::new(SubValueRelation::SubValueUnknown), - } - } - None => Rc::new(SubValueRelation::SubValueUnknown), - } - } - _ => Rc::new(SubValueRelation::SubValueUnknown), - } - } - _ => Rc::new(SubValueRelation::SubValueUnknown), - } + ExprData::ExprVar { .. } => { + let vname = expr_var_name_at(val.clone(), scope.type_env.clone().source_indices.clone()); +match v2_rt::map_get(&scope.locals.clone(), vname) { + Some(binding) => binding.provenance.clone(), + None => Rc::new(SubValueRelation::SubValueUnknown), +} +}, + ExprData::ExprFieldAccess { .. } => { + let base = field_access_base(val.clone()); +let field = field_access_field_at(val.clone(), scope.type_env.clone().source_indices.clone()); +match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let bname = expr_var_name_at(base.clone(), scope.type_env.clone().source_indices.clone()); +match v2_rt::map_get(&scope.locals.clone(), bname) { + Some(binding) => { + let fields = inductive_fields_for(scope.type_env.clone(), authored_name_at(scope.type_env.clone().source_indices.clone(), &binding.resolved.clone())); +let matching = Rc::new({ let mut __result = Vec::new(); for f in fields.iter().cloned() { if (f.field_name.clone().as_str() == field.clone().as_str()) { __result.push(f); } } __result }).first().cloned(); +match matching { + Some(ind_field) => compose_sub_value(binding.provenance.clone(), ind_field.clone()), + None => Rc::new(SubValueRelation::SubValueUnknown), +} +}, + None => Rc::new(SubValueRelation::SubValueUnknown), +} +}, + _ => Rc::new(SubValueRelation::SubValueUnknown), +} +}, + _ => Rc::new(SubValueRelation::SubValueUnknown), +} } -pub fn classify_let_value( - val: &Rc, - ctx: &Rc, -) -> Option> { +pub fn classify_let_value(val: &Rc, ctx: &Rc) -> Option> { match (*val.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let vname = expr_var_name_at(val.clone(), ctx.type_env.clone().source_indices.clone()); - match v2_rt::map_get(&ctx.scope_locals.clone(), vname) { - Some(binding) => match (*binding.provenance.clone()).clone() { - SubValueRelation::SubValueUnknown => None, - _ => Some(binding.provenance.clone()), - }, - None => None, - } - } - ExprData::ExprFieldAccess { .. } => { - let base = field_access_base(val.clone()); - let field = - field_access_field_at(val.clone(), ctx.type_env.clone().source_indices.clone()); - match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let bname = - expr_var_name_at(base.clone(), ctx.type_env.clone().source_indices.clone()); - let from_per_field = - match v2_rt::map_get(&ctx.per_field_vars.clone(), bname.clone()) { - Some(field_map) => v2_rt::map_get(&field_map, field.clone()), - None => None, - }; - match from_per_field { - Some(rel) => Some(rel.clone()), - None => { - let type_name = - match v2_rt::map_get(&ctx.scope_locals.clone(), bname.clone()) { - Some(binding) => authored_name_at( - ctx.type_env.clone().source_indices.clone(), - &binding.resolved.clone(), - ), - None => match v2_rt::map_get( - &ctx.param_names.clone(), - bname.clone(), - ) { - Some(t) => t.clone(), - None => "".to_string(), - }, - }; - if (type_name.clone().as_str() != "".to_string().as_str()) { - { - let fields = inductive_fields_for( - ctx.type_env.clone(), - type_name.clone(), - ); - let matching = Rc::new({ - let mut __result = Vec::new(); - for f in fields.iter().cloned() { - if (f.field_name.clone().as_str() - == field.clone().as_str()) - { - __result.push(f); - } - } - __result - }) - .first() - .cloned(); - match matching { - Some(ind_field) => { - Some(Rc::new(SubValueRelation::StrictSubValue { - field: ind_field.clone(), - factor: Rc::new(ShrinkFactor::UnitShrink), - })) - } - None => None, - } - } - } else { - None - } - } - } - } - _ => None, - } - } - ExprData::ExprCall { .. } => { - let callee = - expr_call_func_at(val.clone(), ctx.type_env.clone().source_indices.clone()); - let from_provenance = match v2_rt::map_get(&ctx.func_sigs.clone(), callee.clone()) { - Some(sig) => match sig.output_provenance.clone().first().cloned() { - Some(param_map) => { - classify_call_via_provenance(val.clone(), ¶m_map, ctx.clone()) - } - None => None, - }, - None => None, - }; - match from_provenance.clone() { - Some(_) => from_provenance.clone(), - None => { - if (is_child_accessor_in_model(callee.clone()) - || is_tree_size_reducing(callee.clone())) + ExprData::ExprVar { .. } => { + let vname = expr_var_name_at(val.clone(), ctx.type_env.clone().source_indices.clone()); +match v2_rt::map_get(&ctx.scope_locals.clone(), vname) { + Some(binding) => match (*binding.provenance.clone()).clone() { + SubValueRelation::SubValueUnknown => None, + _ => Some(binding.provenance.clone()), +}, + None => None, +} +}, + ExprData::ExprFieldAccess { .. } => { + let base = field_access_base(val.clone()); +let field = field_access_field_at(val.clone(), ctx.type_env.clone().source_indices.clone()); +match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let bname = expr_var_name_at(base.clone(), ctx.type_env.clone().source_indices.clone()); +let from_per_field = match v2_rt::map_get(&ctx.per_field_vars.clone(), bname.clone()) { + Some(field_map) => v2_rt::map_get(&field_map, field.clone()), + None => None, +}; +match from_per_field { + Some(rel) => Some(rel.clone()), + None => { + let type_name = match v2_rt::map_get(&ctx.scope_locals.clone(), bname.clone()) { + Some(binding) => authored_name_at(ctx.type_env.clone().source_indices.clone(), &binding.resolved.clone()), + None => match v2_rt::map_get(&ctx.param_names.clone(), bname.clone()) { + Some(t) => t.clone(), + None => "".to_string(), +}, +}; +if (type_name.clone().as_str() != "".to_string().as_str()) { { - { - let call_args = val.children.clone(); - match call_args.first().cloned() { - Some(first_arg) => { - let inner = arg_value(&first_arg); - match (*inner.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let iname = expr_var_name_at( - inner.clone(), - ctx.type_env.clone().source_indices.clone(), - ); - let inner_type = match v2_rt::map_get( - &ctx.param_names.clone(), - iname.clone(), - ) { - Some(t) => t.clone(), - None => match v2_rt::map_get( - &ctx.sub_value_vars.clone(), - iname.clone(), - ) { - Some(rel) => match (*rel.clone()).clone() { - SubValueRelation::StrictSubValue { - field: f, - .. - } => f.element_type.clone(), - SubValueRelation::IteratedSubValue { - field: f, - .. - } => f.element_type.clone(), - _ => "".to_string(), - }, - None => "".to_string(), - }, - }; - if (inner_type.clone().as_str() - != "".to_string().as_str()) - { - { - let fields = inductive_fields_for( - ctx.type_env.clone(), - inner_type.clone(), - ); - let cf = - Rc::new({ - let mut __result = Vec::new(); - for f in fields.iter().cloned() { - if match f.shape.clone() { + let fields = inductive_fields_for(ctx.type_env.clone(), type_name.clone()); +let matching = Rc::new({ let mut __result = Vec::new(); for f in fields.iter().cloned() { if (f.field_name.clone().as_str() == field.clone().as_str()) { __result.push(f); } } __result }).first().cloned(); +match matching { + Some(ind_field) => Some(Rc::new(SubValueRelation::StrictSubValue { + field: ind_field.clone(), + factor: Rc::new(ShrinkFactor::UnitShrink), +})), + None => None, +} +} + } else { + None + } +}, +} +}, + _ => None, +} +}, + ExprData::ExprCall { .. } => { + let callee = expr_call_func_at(val.clone(), ctx.type_env.clone().source_indices.clone()); +let from_provenance = match v2_rt::map_get(&ctx.func_sigs.clone(), callee.clone()) { + Some(sig) => match sig.output_provenance.clone().first().cloned() { + Some(param_map) => classify_call_via_provenance(val.clone(), ¶m_map, ctx.clone()), + None => None, +}, + None => None, +}; +match from_provenance.clone() { + Some(_) => from_provenance.clone(), + None => if (is_child_accessor_in_model(callee.clone()) || is_tree_size_reducing(callee.clone())) { + { + let call_args = val.children.clone(); +match call_args.first().cloned() { + Some(first_arg) => { + let inner = arg_value(&first_arg); +match (*inner.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let iname = expr_var_name_at(inner.clone(), ctx.type_env.clone().source_indices.clone()); +let inner_type = match v2_rt::map_get(&ctx.param_names.clone(), iname.clone()) { + Some(t) => t.clone(), + None => match v2_rt::map_get(&ctx.sub_value_vars.clone(), iname.clone()) { + Some(rel) => match (*rel.clone()).clone() { + SubValueRelation::StrictSubValue { field: f, .. } => f.element_type.clone(), + SubValueRelation::IteratedSubValue { field: f, .. } => f.element_type.clone(), + _ => "".to_string(), +}, + None => "".to_string(), +}, +}; +if (inner_type.clone().as_str() != "".to_string().as_str()) { + { + let fields = inductive_fields_for(ctx.type_env.clone(), inner_type.clone()); +let cf = Rc::new({ let mut __result = Vec::new(); for f in fields.iter().cloned() { if match f.shape.clone() { RecursionShape::ListRecursion => true, _ => false, -} { __result.push(f); } - } - __result - }) - .first() - .cloned(); - match cf { - Some(ind_field) => Some(Rc::new( - SubValueRelation::StrictSubValue { - field: ind_field.clone(), - factor: Rc::new( - ShrinkFactor::UnitShrink, - ), - }, - )), - None => None, - } - } - } else { - None - } - } - _ => None, - } - } - None => None, - } +} { __result.push(f); } } __result }).first().cloned(); +match cf { + Some(ind_field) => Some(Rc::new(SubValueRelation::StrictSubValue { + field: ind_field.clone(), + factor: Rc::new(ShrinkFactor::UnitShrink), +})), + None => None, +} +} + } else { + None } - } else { - None - } +}, + _ => None, +} +}, + None => None, +} +} + } else { + None + }, +} +}, + _ => { + let type_based = match val.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => if is_container_type(authored_name_at(ctx.type_env.clone().source_indices.clone(), &rt)) { + { + let elem = match rt.children.clone().first().cloned() { + Some(c) => authored_name_at(ctx.type_env.clone().source_indices.clone(), &c), + None => "".to_string(), +}; +if ((elem.clone().as_str() != "".to_string().as_str()) && is_recursive_type_by_name(&ctx.type_env.clone(), elem.clone())) { + { + let fields = inductive_fields_for(ctx.type_env.clone(), elem.clone()); +let cf = Rc::new({ let mut __result = Vec::new(); for f in fields.iter().cloned() { if match f.shape.clone() { + RecursionShape::ListRecursion => true, + _ => false, +} { __result.push(f); } } __result }).first().cloned(); +match cf { + Some(ind_field) => Some(Rc::new(SubValueRelation::StrictSubValue { + field: ind_field.clone(), + factor: Rc::new(ShrinkFactor::UnitShrink), +})), + None => None, +} +} + } else { + None } - } - } - _ => { - let type_based = match val.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - if is_container_type(authored_name_at( - ctx.type_env.clone().source_indices.clone(), - &rt, - )) { - { - let elem = match rt.children.clone().first().cloned() { - Some(c) => authored_name_at( - ctx.type_env.clone().source_indices.clone(), - &c, - ), - None => "".to_string(), - }; - if ((elem.clone().as_str() != "".to_string().as_str()) - && is_recursive_type_by_name(&ctx.type_env.clone(), elem.clone())) - { - { - let fields = - inductive_fields_for(ctx.type_env.clone(), elem.clone()); - let cf = Rc::new({ - let mut __result = Vec::new(); - for f in fields.iter().cloned() { - if match f.shape.clone() { - RecursionShape::ListRecursion => true, - _ => false, - } { - __result.push(f); - } - } - __result - }) - .first() - .cloned(); - match cf { - Some(ind_field) => { - Some(Rc::new(SubValueRelation::StrictSubValue { - field: ind_field.clone(), - factor: Rc::new(ShrinkFactor::UnitShrink), - })) - } - None => None, - } - } - } else { - None - } - } +} + } else { + None + }, + _ => None, +}; +match type_based.clone() { + Some(_) => type_based.clone(), + None => match (*val.expr_data.clone()).clone() { + ExprData::ExprBinOp { op, .. } => { + let left = binop_left(val.clone()); +let right = binop_right(val.clone()); +match op.clone() { + BinOp::Sub => match (*left.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let lname = expr_var_name_at(left.clone(), ctx.type_env.clone().source_indices.clone()); +if ((v2_rt::map_get(&ctx.param_names.clone(), lname.clone()) != None) || (v2_rt::map_get(&ctx.sub_value_vars.clone(), lname.clone()) != None)) { + match (*right.expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitInt { value: k, .. } = value.as_ref() else { unreachable!() }; match positive_descent_amount_from_positive_int(k.clone()) { + Some(steps) => Some(Rc::new(SubValueRelation::ArithmeticDescent { + param: lname.clone(), + factor: Rc::new(ShrinkFactor::ConstantShrink { + steps: steps.clone(), +}), +})), + None => None, +} }, + _ => None, +} + } else { + None + } +}, + _ => None, +}, + BinOp::Div => { + let left_name = match (*left.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let lname = expr_var_name_at(left.clone(), ctx.type_env.clone().source_indices.clone()); +if ((v2_rt::map_get(&ctx.param_names.clone(), lname.clone()) != None) || (v2_rt::map_get(&ctx.sub_value_vars.clone(), lname.clone()) != None)) { + lname.clone() } else { - None + "".to_string() } - } - _ => None, - }; - match type_based.clone() { - Some(_) => type_based.clone(), - None => match (*val.expr_data.clone()).clone() { - ExprData::ExprBinOp { op, .. } => { - let left = binop_left(val.clone()); - let right = binop_right(val.clone()); - match op.clone() { - BinOp::Sub => match (*left.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let lname = expr_var_name_at( - left.clone(), - ctx.type_env.clone().source_indices.clone(), - ); - if ((v2_rt::map_get(&ctx.param_names.clone(), lname.clone()) - != None) - || (v2_rt::map_get( - &ctx.sub_value_vars.clone(), - lname.clone(), - ) != None)) - { - match (*right.expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { - let LiteralValue::LitInt { value: k, .. } = - value.as_ref() - else { - unreachable!() - }; - match positive_descent_amount_from_positive_int( - k.clone(), - ) { - Some(steps) => Some(Rc::new( - SubValueRelation::ArithmeticDescent { - param: lname.clone(), - factor: Rc::new( - ShrinkFactor::ConstantShrink { - steps: steps.clone(), - }, - ), - }, - )), - None => None, - } - } - _ => None, - } - } else { - None - } - } - _ => None, - }, - BinOp::Div => { - let left_name = match (*left.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let lname = expr_var_name_at( - left.clone(), - ctx.type_env.clone().source_indices.clone(), - ); - if ((v2_rt::map_get( - &ctx.param_names.clone(), - lname.clone(), - ) != None) - || (v2_rt::map_get( - &ctx.sub_value_vars.clone(), - lname.clone(), - ) != None)) - { - lname.clone() - } else { - "".to_string() - } - } - ExprData::ExprBinOp { op: BinOp::Sub, .. } => { - let inner_left = binop_left(left.clone()); - match (*inner_left.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let lname = expr_var_name_at( - inner_left.clone(), - ctx.type_env.clone().source_indices.clone(), - ); - if ((v2_rt::map_get( - &ctx.param_names.clone(), - lname.clone(), - ) != None) - || (v2_rt::map_get( - &ctx.sub_value_vars.clone(), - lname.clone(), - ) != None)) - { - lname.clone() - } else { - "".to_string() - } - } - _ => "".to_string(), - } - } - _ => "".to_string(), - }; - if (left_name.clone().as_str() != "".to_string().as_str()) { - match (*right.expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { - let LiteralValue::LitInt { value: k, .. } = - value.as_ref() - else { - unreachable!() - }; - match proportional_divisor_from_int_at_least_two( - k.clone(), - ) { - Some(div_w) => Some(Rc::new( - SubValueRelation::ArithmeticDescent { - param: left_name.clone(), - factor: Rc::new( - ShrinkFactor::ProportionalShrink { - divisor: div_w.clone(), - }, - ), - }, - )), - None => None, - } - } - _ => None, - } - } else { - None - } - } - BinOp::Add => None, - _ => None, +}, + ExprData::ExprBinOp { op: BinOp::Sub, .. } => { + let inner_left = binop_left(left.clone()); +match (*inner_left.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let lname = expr_var_name_at(inner_left.clone(), ctx.type_env.clone().source_indices.clone()); +if ((v2_rt::map_get(&ctx.param_names.clone(), lname.clone()) != None) || (v2_rt::map_get(&ctx.sub_value_vars.clone(), lname.clone()) != None)) { + lname.clone() + } else { + "".to_string() } - } - ExprData::ExprMethodCall { .. } => { - let mname = expr_method_name_at( - val.clone(), - ctx.type_env.clone().source_indices.clone(), - ); - let is_collection_preserving = (((((mname.clone().as_str() - == "skip".to_string().as_str()) - || (mname.clone().as_str() == "filter".to_string().as_str())) - || (mname.clone().as_str() == "take".to_string().as_str())) - || (mname.clone().as_str() == "enumerate".to_string().as_str())) - || (mname.clone().as_str() == "reverse".to_string().as_str())); - if is_collection_preserving { - { - let receiver = method_receiver(val.clone()); - let coll_field = - resolve_collection_field(receiver.clone(), ctx.clone()); - match coll_field { - Some(ind_field) => { - Some(Rc::new(SubValueRelation::StrictSubValue { - field: ind_field.clone(), - factor: Rc::new(ShrinkFactor::UnitShrink), - })) - } - None => { - if (mname.clone().as_str() == "skip".to_string().as_str()) { - { - let skip_args = method_arg_nodes(val.clone()); - let skip_amount = match skip_args.first().cloned() { - Some(a) => match (*arg_value(&a) - .expr_data - .clone()) - .clone() - { - ExprData::ExprLiteral { - ref value, .. - } => { - let LiteralValue::LitInt { - value: k, - .. - } = value.as_ref() - else { - unreachable!() - }; - if (k.clone() > 0) { - k.clone() - } else { - 0 - } - } - _ => 0, - }, - None => 0, - }; - if (skip_amount.clone() > 0) { - match (*receiver.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let rname = expr_var_name_at( - receiver.clone(), - ctx.type_env - .clone() - .source_indices - .clone(), - ); - if ((v2_rt::map_get( - &ctx.param_names.clone(), - rname.clone(), - ) != None) - || (v2_rt::map_get( - &ctx.sub_value_vars.clone(), - rname.clone(), - ) != None)) - { - match positive_descent_amount_from_positive_int(skip_amount.clone()) { +}, + _ => "".to_string(), +} +}, + _ => "".to_string(), +}; +if (left_name.clone().as_str() != "".to_string().as_str()) { + match (*right.expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitInt { value: k, .. } = value.as_ref() else { unreachable!() }; match proportional_divisor_from_int_at_least_two(k.clone()) { + Some(div_w) => Some(Rc::new(SubValueRelation::ArithmeticDescent { + param: left_name.clone(), + factor: Rc::new(ShrinkFactor::ProportionalShrink { + divisor: div_w.clone(), +}), +})), + None => None, +} }, + _ => None, +} + } else { + None + } +}, + BinOp::Add => None, + _ => None, +} +}, + ExprData::ExprMethodCall { .. } => { + let mname = expr_method_name_at(val.clone(), ctx.type_env.clone().source_indices.clone()); +let is_collection_preserving = (((((mname.clone().as_str() == "skip".to_string().as_str()) || (mname.clone().as_str() == "filter".to_string().as_str())) || (mname.clone().as_str() == "take".to_string().as_str())) || (mname.clone().as_str() == "enumerate".to_string().as_str())) || (mname.clone().as_str() == "reverse".to_string().as_str())); +if is_collection_preserving { + { + let receiver = method_receiver(val.clone()); +let coll_field = resolve_collection_field(receiver.clone(), ctx.clone()); +match coll_field { + Some(ind_field) => Some(Rc::new(SubValueRelation::StrictSubValue { + field: ind_field.clone(), + factor: Rc::new(ShrinkFactor::UnitShrink), +})), + None => if (mname.clone().as_str() == "skip".to_string().as_str()) { + { + let skip_args = method_arg_nodes(val.clone()); +let skip_amount = match skip_args.first().cloned() { + Some(a) => match (*arg_value(&a).expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitInt { value: k, .. } = value.as_ref() else { unreachable!() }; if (k.clone() > 0) { + k.clone() + } else { + 0 + } }, + _ => 0, +}, + None => 0, +}; +if (skip_amount.clone() > 0) { + match (*receiver.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let rname = expr_var_name_at(receiver.clone(), ctx.type_env.clone().source_indices.clone()); +if ((v2_rt::map_get(&ctx.param_names.clone(), rname.clone()) != None) || (v2_rt::map_get(&ctx.sub_value_vars.clone(), rname.clone()) != None)) { + match positive_descent_amount_from_positive_int(skip_amount.clone()) { Some(steps) => { let synth_field = Rc::new(InductiveField { type_name: rname.clone(), @@ -5568,628 +3240,350 @@ Some(Rc::new(SubValueRelation::StrictSubValue { }, None => None, } - } else { - None - } - } - _ => None, - } - } else { - None - } - } - } else { - None - } + } else { + None } - } +}, + _ => None, +} + } else { + None } - } else { - None - } - } - _ => None, - }, +} + } else { + None + }, +} +} + } else { + None } - } - } +}, + _ => None, +}, +} +}, +} } -pub fn classify_call_via_provenance( - call: Rc, - param_map: &Rc>>, - ctx: Rc, -) -> Option> { +pub fn classify_call_via_provenance(call: Rc, param_map: &Rc>>, ctx: Rc) -> Option> { { let call_args = call.children.clone(); - let arg_by_name = call_args.iter().cloned().fold( - v2_rt::rc_empty_map::>(), - |acc: Rc>>, arg_node: Rc| match arg_name_at( - arg_node.clone(), - ctx.type_env.clone().source_indices.clone(), - ) { - Some(aname) => { - v2_rt::rc_map_insert(acc.clone(), aname.clone(), arg_value(&arg_node)) - } - None => acc.clone(), - }, - ); - Rc::new(v2_rt::map_keys(¶m_map)).iter().cloned().fold( - None, - |result: _, callee_pname: String| match v2_rt::map_get(¶m_map, callee_pname.clone()) - { - Some(callee_rel) => match v2_rt::map_get(&arg_by_name, callee_pname.clone()) { - Some(arg_expr) => { - let arg_rel = classify_call_arg_provenance(&arg_expr, &ctx); - match arg_rel.clone() { - Some(arel) => { - let composed = - compose_output_relations(arel.clone(), callee_rel.clone()); - match result.clone() { - Some(prev) => { - Some(meet_sub_value(prev.clone(), composed.clone())) - } - None => Some(composed.clone()), - } - } - None => result.clone(), - } - } - None => result.clone(), - }, - None => result.clone(), - }, - ) - } +let arg_by_name = call_args.iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, arg_node: Rc| match arg_name_at(arg_node.clone(), ctx.type_env.clone().source_indices.clone()) { + Some(aname) => v2_rt::rc_map_insert(acc.clone(), aname.clone(), arg_value(&arg_node)), + None => acc.clone(), +}); +Rc::new(v2_rt::map_keys(¶m_map)).iter().cloned().fold(None, |result: _, callee_pname: String| match v2_rt::map_get(¶m_map, callee_pname.clone()) { + Some(callee_rel) => match v2_rt::map_get(&arg_by_name, callee_pname.clone()) { + Some(arg_expr) => { + let arg_rel = classify_call_arg_provenance(&arg_expr, &ctx); +match arg_rel.clone() { + Some(arel) => { + let composed = compose_output_relations(arel.clone(), callee_rel.clone()); +match result.clone() { + Some(prev) => Some(meet_sub_value(prev.clone(), composed.clone())), + None => Some(composed.clone()), +} +}, + None => result.clone(), +} +}, + None => result.clone(), +}, + None => result.clone(), +}) +} } -pub fn classify_call_arg_provenance( - arg_expr: &Rc, - ctx: &Rc, -) -> Option> { +pub fn classify_call_arg_provenance(arg_expr: &Rc, ctx: &Rc) -> Option> { match (*arg_expr.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let name = expr_var_name_at( - arg_expr.clone(), - ctx.type_env.clone().source_indices.clone(), - ); - if (v2_rt::map_get(&ctx.param_names.clone(), name.clone()) != None) { - Some(Rc::new(SubValueRelation::PreservedValue)) - } else { - v2_rt::map_get(&ctx.sub_value_vars.clone(), name.clone()) - } + ExprData::ExprVar { .. } => { + let name = expr_var_name_at(arg_expr.clone(), ctx.type_env.clone().source_indices.clone()); +if (v2_rt::map_get(&ctx.param_names.clone(), name.clone()) != None) { + Some(Rc::new(SubValueRelation::PreservedValue)) + } else { + v2_rt::map_get(&ctx.sub_value_vars.clone(), name.clone()) } - _ => classify_let_value(&arg_expr, &ctx), - } +}, + _ => classify_let_value(&arg_expr, &ctx), +} } pub fn merge_argument_relations(rels: &Rc>>) -> Rc { match rels.clone().first().cloned() { - None => Rc::new(SubValueRelation::SubValueUnknown), - Some(first_rel) => Rc::new( - rels.clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ) - .iter() - .cloned() - .fold( - first_rel.clone(), - |acc: Rc, rel: Rc| meet_sub_value(acc, rel.clone()), - ), - } + None => Rc::new(SubValueRelation::SubValueUnknown), + Some(first_rel) => Rc::new(rels.clone().iter().cloned().skip(1 as usize).collect::>()).iter().cloned().fold(first_rel.clone(), |acc: Rc, rel: Rc| meet_sub_value(acc, rel.clone())), +} } -pub fn classify_argument( - arg_expr: &Rc, - param_name: &String, - ctx: &Rc, -) -> Rc { +pub fn classify_argument(arg_expr: &Rc, param_name: &String, ctx: &Rc) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*arg_expr.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let vname = expr_var_name_at( - arg_expr.clone(), - ctx.type_env.clone().source_indices.clone(), - ); - if (vname.clone().as_str() == param_name.clone().as_str()) { - Rc::new(SubValueRelation::PreservedValue) - } else { - match v2_rt::map_get(&ctx.sub_value_vars.clone(), vname.clone()) { - Some(rel) => rel.clone(), - None => Rc::new(SubValueRelation::SubValueUnknown), - } - } - } - ExprData::ExprFieldAccess { .. } => { - let base = field_access_base(arg_expr.clone()); - let field = field_access_field_at( - arg_expr.clone(), - ctx.type_env.clone().source_indices.clone(), - ); - match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let bname = expr_var_name_at( - base.clone(), - ctx.type_env.clone().source_indices.clone(), - ); - let type_name = - match v2_rt::map_get(&ctx.param_names.clone(), bname.clone()) { - Some(t) => t.clone(), - None => { - match v2_rt::map_get(&ctx.sub_value_vars.clone(), bname.clone()) - { - Some(rel) => match (*rel.clone()).clone() { - SubValueRelation::StrictSubValue { - field: f, .. - } => f.element_type.clone(), - SubValueRelation::IteratedSubValue { - field: f, .. - } => f.element_type.clone(), - _ => "".to_string(), - }, - None => "".to_string(), - } - } - }; - let fields = inductive_fields_for(ctx.type_env.clone(), type_name); - let matching = Rc::new({ - let mut __result = Vec::new(); - for f in fields.iter().cloned() { - if (f.field_name.clone().as_str() == field.clone().as_str()) { - __result.push(f); - } - } - __result - }) - .first() - .cloned(); - match matching { - Some(ind_field) => Rc::new(SubValueRelation::StrictSubValue { - field: ind_field.clone(), - factor: Rc::new(ShrinkFactor::UnitShrink), - }), - None => Rc::new(SubValueRelation::SubValueUnknown), - } - } - _ => Rc::new(SubValueRelation::SubValueUnknown), - } - } - ExprData::ExprCall { .. } => { - let call_args = arg_expr.children.clone(); - match call_args.first().cloned() { - Some(first_arg) => { - let inner = arg_value(&first_arg); - let inner_rel = classify_argument(&inner, ¶m_name, &ctx); - match (*inner_rel.clone()).clone() { - SubValueRelation::StrictSubValue { .. } => inner_rel.clone(), - SubValueRelation::IteratedSubValue { .. } => inner_rel.clone(), - SubValueRelation::ArithmeticDescent { .. } => inner_rel.clone(), - SubValueRelation::PreservedValue => { - let callee = expr_call_func_at( - arg_expr.clone(), - ctx.type_env.clone().source_indices.clone(), - ); - let from_provenance = - match v2_rt::map_get(&ctx.func_sigs.clone(), callee.clone()) { - Some(sig) => { - match sig.output_provenance.clone().first().cloned() { - Some(param_map) => classify_call_via_provenance( - arg_expr.clone(), - ¶m_map, - ctx.clone(), - ), - None => None, - } - } - None => None, - }; - match from_provenance { - Some(prov_rel) => prov_rel.clone(), - None => { - if (is_child_accessor_in_model(callee.clone()) - || is_tree_size_reducing(callee.clone())) - { - { - let type_name = match v2_rt::map_get( - &ctx.param_names.clone(), - param_name.clone(), - ) { - Some(t) => t.clone(), - None => "".to_string(), - }; - let fields = inductive_fields_for( - ctx.type_env.clone(), - type_name, - ); - let cf = Rc::new({ - let mut __result = Vec::new(); - for f in fields.iter().cloned() { - if match f.shape.clone() { - RecursionShape::ListRecursion => true, - _ => false, - } { - __result.push(f); - } - } - __result - }) - .first() - .cloned(); - match cf { - Some(ind_field) => { - Rc::new(SubValueRelation::StrictSubValue { - field: ind_field.clone(), - factor: Rc::new( - ShrinkFactor::UnitShrink, - ), - }) - } - None => { - Rc::new(SubValueRelation::PreservedValue) - } - } - } - } else { - if is_property_contraction(callee.clone()) { - Rc::new(SubValueRelation::ArithmeticDescent { - param: param_name.clone(), - factor: Rc::new(ShrinkFactor::ConstantShrink { - steps: Rc::new( - PositiveDescentAmount::OneStep, - ), - }), - }) - } else { - Rc::new(SubValueRelation::PreservedValue) - } - } - } - } - } - SubValueRelation::SubValueUnknown => { - Rc::new(SubValueRelation::SubValueUnknown) - } - } - } - None => Rc::new(SubValueRelation::SubValueUnknown), - } - } - ExprData::ExprMethodCall { .. } => { - classify_collection_shrink(&arg_expr, ¶m_name, &ctx) + ExprData::ExprVar { .. } => { + let vname = expr_var_name_at(arg_expr.clone(), ctx.type_env.clone().source_indices.clone()); +if (vname.clone().as_str() == param_name.clone().as_str()) { + Rc::new(SubValueRelation::PreservedValue) + } else { + match v2_rt::map_get(&ctx.sub_value_vars.clone(), vname.clone()) { + Some(rel) => rel.clone(), + None => Rc::new(SubValueRelation::SubValueUnknown), +} } - ExprData::ExprBinOp { op, .. } => { - let left = binop_left(arg_expr.clone()); - let right = binop_right(arg_expr.clone()); - match op.clone() { - BinOp::Sub => { - let left_is_param = match (*left.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - ((expr_var_name_at( - left.clone(), - ctx.type_env.clone().source_indices.clone(), - ) - .as_str() - == param_name.clone().as_str()) - || (v2_rt::map_get( - &ctx.sub_value_vars.clone(), - expr_var_name_at( - left.clone(), - ctx.type_env.clone().source_indices.clone(), - ), - ) != None)) - } - _ => false, - }; - if left_is_param { - match (*right.expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { - let LiteralValue::LitInt { value: k, .. } = value.as_ref() - else { - unreachable!() - }; - match positive_descent_amount_from_positive_int(k.clone()) { - Some(steps) => { - Rc::new(SubValueRelation::ArithmeticDescent { - param: param_name.clone(), - factor: Rc::new(ShrinkFactor::ConstantShrink { - steps: steps.clone(), - }), - }) - } - None => Rc::new(SubValueRelation::SubValueUnknown), - } - } - _ => Rc::new(SubValueRelation::SubValueUnknown), - } - } else { - Rc::new(SubValueRelation::SubValueUnknown) - } - } - BinOp::Div => { - let left_is_param = match (*left.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - ((expr_var_name_at( - left.clone(), - ctx.type_env.clone().source_indices.clone(), - ) - .as_str() - == param_name.clone().as_str()) - || (v2_rt::map_get( - &ctx.sub_value_vars.clone(), - expr_var_name_at( - left.clone(), - ctx.type_env.clone().source_indices.clone(), - ), - ) != None)) - } - ExprData::ExprBinOp { op: BinOp::Sub, .. } => { - let inner_left = binop_left(left.clone()); - match (*inner_left.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - ((expr_var_name_at( - inner_left.clone(), - ctx.type_env.clone().source_indices.clone(), - ) - .as_str() - == param_name.clone().as_str()) - || (v2_rt::map_get( - &ctx.sub_value_vars.clone(), - expr_var_name_at( - inner_left.clone(), - ctx.type_env.clone().source_indices.clone(), - ), - ) != None)) - } - _ => false, - } - } - _ => false, - }; - if left_is_param { - match (*right.expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { - let LiteralValue::LitInt { value: k, .. } = value.as_ref() - else { - unreachable!() - }; - match proportional_divisor_from_int_at_least_two(k.clone()) { - Some(div_w) => { - Rc::new(SubValueRelation::ArithmeticDescent { - param: param_name.clone(), - factor: Rc::new(ShrinkFactor::ProportionalShrink { - divisor: div_w.clone(), - }), - }) - } - None => Rc::new(SubValueRelation::SubValueUnknown), - } - } - _ => Rc::new(SubValueRelation::SubValueUnknown), - } +}, + ExprData::ExprFieldAccess { .. } => { + let base = field_access_base(arg_expr.clone()); +let field = field_access_field_at(arg_expr.clone(), ctx.type_env.clone().source_indices.clone()); +match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let bname = expr_var_name_at(base.clone(), ctx.type_env.clone().source_indices.clone()); +let type_name = match v2_rt::map_get(&ctx.param_names.clone(), bname.clone()) { + Some(t) => t.clone(), + None => match v2_rt::map_get(&ctx.sub_value_vars.clone(), bname.clone()) { + Some(rel) => match (*rel.clone()).clone() { + SubValueRelation::StrictSubValue { field: f, .. } => f.element_type.clone(), + SubValueRelation::IteratedSubValue { field: f, .. } => f.element_type.clone(), + _ => "".to_string(), +}, + None => "".to_string(), +}, +}; +let fields = inductive_fields_for(ctx.type_env.clone(), type_name); +let matching = Rc::new({ let mut __result = Vec::new(); for f in fields.iter().cloned() { if (f.field_name.clone().as_str() == field.clone().as_str()) { __result.push(f); } } __result }).first().cloned(); +match matching { + Some(ind_field) => Rc::new(SubValueRelation::StrictSubValue { + field: ind_field.clone(), + factor: Rc::new(ShrinkFactor::UnitShrink), +}), + None => Rc::new(SubValueRelation::SubValueUnknown), +} +}, + _ => Rc::new(SubValueRelation::SubValueUnknown), +} +}, + ExprData::ExprCall { .. } => { + let call_args = arg_expr.children.clone(); +match call_args.first().cloned() { + Some(first_arg) => { + let inner = arg_value(&first_arg); +let inner_rel = classify_argument(&inner, ¶m_name, &ctx); +match (*inner_rel.clone()).clone() { + SubValueRelation::StrictSubValue { .. } => inner_rel.clone(), + SubValueRelation::IteratedSubValue { .. } => inner_rel.clone(), + SubValueRelation::ArithmeticDescent { .. } => inner_rel.clone(), + SubValueRelation::PreservedValue => { + let callee = expr_call_func_at(arg_expr.clone(), ctx.type_env.clone().source_indices.clone()); +let from_provenance = match v2_rt::map_get(&ctx.func_sigs.clone(), callee.clone()) { + Some(sig) => match sig.output_provenance.clone().first().cloned() { + Some(param_map) => classify_call_via_provenance(arg_expr.clone(), ¶m_map, ctx.clone()), + None => None, +}, + None => None, +}; +match from_provenance { + Some(prov_rel) => prov_rel.clone(), + None => if (is_child_accessor_in_model(callee.clone()) || is_tree_size_reducing(callee.clone())) { + { + let type_name = match v2_rt::map_get(&ctx.param_names.clone(), param_name.clone()) { + Some(t) => t.clone(), + None => "".to_string(), +}; +let fields = inductive_fields_for(ctx.type_env.clone(), type_name); +let cf = Rc::new({ let mut __result = Vec::new(); for f in fields.iter().cloned() { if match f.shape.clone() { + RecursionShape::ListRecursion => true, + _ => false, +} { __result.push(f); } } __result }).first().cloned(); +match cf { + Some(ind_field) => Rc::new(SubValueRelation::StrictSubValue { + field: ind_field.clone(), + factor: Rc::new(ShrinkFactor::UnitShrink), +}), + None => Rc::new(SubValueRelation::PreservedValue), +} +} + } else { + if is_property_contraction(callee.clone()) { + Rc::new(SubValueRelation::ArithmeticDescent { + param: param_name.clone(), + factor: Rc::new(ShrinkFactor::ConstantShrink { + steps: Rc::new(PositiveDescentAmount::OneStep), +}), +}) } else { - Rc::new(SubValueRelation::SubValueUnknown) + Rc::new(SubValueRelation::PreservedValue) } - } - BinOp::Add => Rc::new(SubValueRelation::SubValueUnknown), - _ => Rc::new(SubValueRelation::SubValueUnknown), + }, +} +}, + SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), +} +}, + None => Rc::new(SubValueRelation::SubValueUnknown), +} +}, + ExprData::ExprMethodCall { .. } => classify_collection_shrink(&arg_expr, ¶m_name, &ctx), + ExprData::ExprBinOp { op, .. } => { + let left = binop_left(arg_expr.clone()); +let right = binop_right(arg_expr.clone()); +match op.clone() { + BinOp::Sub => { + let left_is_param = match (*left.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => ((expr_var_name_at(left.clone(), ctx.type_env.clone().source_indices.clone()).as_str() == param_name.clone().as_str()) || (v2_rt::map_get(&ctx.sub_value_vars.clone(), expr_var_name_at(left.clone(), ctx.type_env.clone().source_indices.clone())) != None)), + _ => false, +}; +if left_is_param { + match (*right.expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitInt { value: k, .. } = value.as_ref() else { unreachable!() }; match positive_descent_amount_from_positive_int(k.clone()) { + Some(steps) => Rc::new(SubValueRelation::ArithmeticDescent { + param: param_name.clone(), + factor: Rc::new(ShrinkFactor::ConstantShrink { + steps: steps.clone(), +}), +}), + None => Rc::new(SubValueRelation::SubValueUnknown), +} }, + _ => Rc::new(SubValueRelation::SubValueUnknown), +} + } else { + Rc::new(SubValueRelation::SubValueUnknown) } - } - ExprData::ExprMatch => { - let arm_rels = Rc::new({ - let mut __result = Vec::new(); - for arm in match_arm_nodes(arg_expr.clone()).iter().cloned() { - __result.push(classify_argument(&arm_body(&arm), ¶m_name, &ctx)); - } - __result - }); - merge_argument_relations(&arm_rels) - } - ExprData::ExprIf => { - let then_rel = - classify_argument(&if_then_branch(arg_expr.clone()), ¶m_name, &ctx); - let else_rel = match if_else_branch(arg_expr.clone()) { - Some(e) => classify_argument(&e, ¶m_name, &ctx), - None => Rc::new(SubValueRelation::SubValueUnknown), - }; - merge_argument_relations(&Rc::new(vec![then_rel, else_rel])) - } - ExprData::ExprBlock => match arg_expr.children.clone().last().cloned() { - Some(last_expr) => classify_argument(&last_expr, ¶m_name, &ctx), - None => Rc::new(SubValueRelation::SubValueUnknown), - }, - ExprData::ExprLet => match let_body(arg_expr.clone()) { - Some(body) => classify_argument(&body, ¶m_name, &ctx), - None => Rc::new(SubValueRelation::SubValueUnknown), - }, - ExprData::ExprCast => { - classify_argument(&cast_expr(arg_expr.clone()), ¶m_name, &ctx) - } - ExprData::ExprReturn => match arg_expr.children.clone().first().cloned() { - Some(inner) => classify_argument(&inner, ¶m_name, &ctx), - None => Rc::new(SubValueRelation::SubValueUnknown), - }, - _ => Rc::new(SubValueRelation::SubValueUnknown), - } +}, + BinOp::Div => { + let left_is_param = match (*left.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => ((expr_var_name_at(left.clone(), ctx.type_env.clone().source_indices.clone()).as_str() == param_name.clone().as_str()) || (v2_rt::map_get(&ctx.sub_value_vars.clone(), expr_var_name_at(left.clone(), ctx.type_env.clone().source_indices.clone())) != None)), + ExprData::ExprBinOp { op: BinOp::Sub, .. } => { + let inner_left = binop_left(left.clone()); +match (*inner_left.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => ((expr_var_name_at(inner_left.clone(), ctx.type_env.clone().source_indices.clone()).as_str() == param_name.clone().as_str()) || (v2_rt::map_get(&ctx.sub_value_vars.clone(), expr_var_name_at(inner_left.clone(), ctx.type_env.clone().source_indices.clone())) != None)), + _ => false, +} +}, + _ => false, +}; +if left_is_param { + match (*right.expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitInt { value: k, .. } = value.as_ref() else { unreachable!() }; match proportional_divisor_from_int_at_least_two(k.clone()) { + Some(div_w) => Rc::new(SubValueRelation::ArithmeticDescent { + param: param_name.clone(), + factor: Rc::new(ShrinkFactor::ProportionalShrink { + divisor: div_w.clone(), +}), +}), + None => Rc::new(SubValueRelation::SubValueUnknown), +} }, + _ => Rc::new(SubValueRelation::SubValueUnknown), +} + } else { + Rc::new(SubValueRelation::SubValueUnknown) + } +}, + BinOp::Add => Rc::new(SubValueRelation::SubValueUnknown), + _ => Rc::new(SubValueRelation::SubValueUnknown), +} +}, + ExprData::ExprMatch => { + let arm_rels = Rc::new({ let mut __result = Vec::new(); for arm in match_arm_nodes(arg_expr.clone()).iter().cloned() { __result.push(classify_argument(&arm_body(&arm), ¶m_name, &ctx)); } __result }); +merge_argument_relations(&arm_rels) +}, + ExprData::ExprIf => { + let then_rel = classify_argument(&if_then_branch(arg_expr.clone()), ¶m_name, &ctx); +let else_rel = match if_else_branch(arg_expr.clone()) { + Some(e) => classify_argument(&e, ¶m_name, &ctx), + None => Rc::new(SubValueRelation::SubValueUnknown), +}; +merge_argument_relations(&Rc::new(vec![then_rel, else_rel])) +}, + ExprData::ExprBlock => match arg_expr.children.clone().last().cloned() { + Some(last_expr) => classify_argument(&last_expr, ¶m_name, &ctx), + None => Rc::new(SubValueRelation::SubValueUnknown), +}, + ExprData::ExprLet => match let_body(arg_expr.clone()) { + Some(body) => classify_argument(&body, ¶m_name, &ctx), + None => Rc::new(SubValueRelation::SubValueUnknown), +}, + ExprData::ExprCast => classify_argument(&cast_expr(arg_expr.clone()), ¶m_name, &ctx), + ExprData::ExprReturn => match arg_expr.children.clone().first().cloned() { + Some(inner) => classify_argument(&inner, ¶m_name, &ctx), + None => Rc::new(SubValueRelation::SubValueUnknown), +}, + _ => Rc::new(SubValueRelation::SubValueUnknown), +} }) } -pub fn read_arg_provenance( - arg_expr: &Rc, - param_name: String, - ctx: &Rc, -) -> Rc { +pub fn read_arg_provenance(arg_expr: &Rc, param_name: String, ctx: &Rc) -> Rc { match (*arg_expr.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let vname = expr_var_name_at( - arg_expr.clone(), - ctx.type_env.clone().source_indices.clone(), - ); - match v2_rt::map_get(&ctx.scope_locals.clone(), vname) { - Some(binding) => match (*binding.provenance.clone()).clone() { - SubValueRelation::SubValueUnknown => { - classify_argument(&arg_expr, ¶m_name, &ctx) - } - _ => binding.provenance.clone(), - }, - None => classify_argument(&arg_expr, ¶m_name, &ctx), - } - } - ExprData::ExprFieldAccess { .. } => { - let base = field_access_base(arg_expr.clone()); - let field = field_access_field_at( - arg_expr.clone(), - ctx.type_env.clone().source_indices.clone(), - ); - match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let bname = - expr_var_name_at(base.clone(), ctx.type_env.clone().source_indices.clone()); - match v2_rt::map_get(&ctx.scope_locals.clone(), bname) { - Some(binding) => match (*binding.provenance.clone()).clone() { - SubValueRelation::SubValueUnknown => { - classify_argument(&arg_expr, ¶m_name, &ctx) - } - _ => { - let fields = inductive_fields_for( - ctx.type_env.clone(), - authored_name_at( - ctx.type_env.clone().source_indices.clone(), - &binding.resolved.clone(), - ), - ); - let matching = Rc::new({ - let mut __result = Vec::new(); - for f in fields.iter().cloned() { - if (f.field_name.clone().as_str() == field.clone().as_str()) - { - __result.push(f); - } - } - __result - }) - .first() - .cloned(); - match matching { - Some(ind_field) => compose_sub_value( - binding.provenance.clone(), - ind_field.clone(), - ), - None => Rc::new(SubValueRelation::SubValueUnknown), - } - } - }, - None => classify_argument(&arg_expr, ¶m_name, &ctx), - } - } - _ => Rc::new(SubValueRelation::SubValueUnknown), - } - } - ExprData::ExprCall { .. } => classify_argument(&arg_expr, ¶m_name, &ctx), - ExprData::ExprMethodCall { .. } => classify_argument(&arg_expr, ¶m_name, &ctx), - ExprData::ExprBinOp { .. } => classify_argument(&arg_expr, ¶m_name, &ctx), - ExprData::ExprMatch => classify_argument(&arg_expr, ¶m_name, &ctx), - ExprData::ExprIf => classify_argument(&arg_expr, ¶m_name, &ctx), - ExprData::ExprBlock => classify_argument(&arg_expr, ¶m_name, &ctx), - ExprData::ExprLet => classify_argument(&arg_expr, ¶m_name, &ctx), - ExprData::ExprCast => classify_argument(&arg_expr, ¶m_name, &ctx), - ExprData::ExprReturn => classify_argument(&arg_expr, ¶m_name, &ctx), - _ => Rc::new(SubValueRelation::SubValueUnknown), - } + ExprData::ExprVar { .. } => { + let vname = expr_var_name_at(arg_expr.clone(), ctx.type_env.clone().source_indices.clone()); +match v2_rt::map_get(&ctx.scope_locals.clone(), vname) { + Some(binding) => match (*binding.provenance.clone()).clone() { + SubValueRelation::SubValueUnknown => classify_argument(&arg_expr, ¶m_name, &ctx), + _ => binding.provenance.clone(), +}, + None => classify_argument(&arg_expr, ¶m_name, &ctx), +} +}, + ExprData::ExprFieldAccess { .. } => { + let base = field_access_base(arg_expr.clone()); +let field = field_access_field_at(arg_expr.clone(), ctx.type_env.clone().source_indices.clone()); +match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let bname = expr_var_name_at(base.clone(), ctx.type_env.clone().source_indices.clone()); +match v2_rt::map_get(&ctx.scope_locals.clone(), bname) { + Some(binding) => match (*binding.provenance.clone()).clone() { + SubValueRelation::SubValueUnknown => classify_argument(&arg_expr, ¶m_name, &ctx), + _ => { + let fields = inductive_fields_for(ctx.type_env.clone(), authored_name_at(ctx.type_env.clone().source_indices.clone(), &binding.resolved.clone())); +let matching = Rc::new({ let mut __result = Vec::new(); for f in fields.iter().cloned() { if (f.field_name.clone().as_str() == field.clone().as_str()) { __result.push(f); } } __result }).first().cloned(); +match matching { + Some(ind_field) => compose_sub_value(binding.provenance.clone(), ind_field.clone()), + None => Rc::new(SubValueRelation::SubValueUnknown), +} +}, +}, + None => classify_argument(&arg_expr, ¶m_name, &ctx), +} +}, + _ => Rc::new(SubValueRelation::SubValueUnknown), +} +}, + ExprData::ExprCall { .. } => classify_argument(&arg_expr, ¶m_name, &ctx), + ExprData::ExprMethodCall { .. } => classify_argument(&arg_expr, ¶m_name, &ctx), + ExprData::ExprBinOp { .. } => classify_argument(&arg_expr, ¶m_name, &ctx), + ExprData::ExprMatch => classify_argument(&arg_expr, ¶m_name, &ctx), + ExprData::ExprIf => classify_argument(&arg_expr, ¶m_name, &ctx), + ExprData::ExprBlock => classify_argument(&arg_expr, ¶m_name, &ctx), + ExprData::ExprLet => classify_argument(&arg_expr, ¶m_name, &ctx), + ExprData::ExprCast => classify_argument(&arg_expr, ¶m_name, &ctx), + ExprData::ExprReturn => classify_argument(&arg_expr, ¶m_name, &ctx), + _ => Rc::new(SubValueRelation::SubValueUnknown), +} +} + +pub fn build_call_evidence(call_node: &Rc, ctx: &Rc) -> Rc>> { + { + let arg_map = Rc::new(call_node.children.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, pair: (i64, Rc)| { + let idx = pair.0.clone(); +let arg_node = pair.1.clone(); +let aname = arg_name_at(arg_node.clone(), ctx.type_env.clone().source_indices.clone()); +match aname.clone() { + Some(pname) => v2_rt::rc_map_insert(acc.clone(), pname.clone(), arg_value(&arg_node)), + None => acc.clone(), +} +}); +let positional_args = Rc::new({ let mut __result = Vec::new(); for arg_node in Rc::new({ let mut __result = Vec::new(); for arg_node in call_node.children.clone().iter().cloned() { if (arg_name_at(arg_node.clone(), ctx.type_env.clone().source_indices.clone()) == None) { __result.push(arg_node); } } __result }).iter().cloned() { __result.push(arg_value(&arg_node)); } __result }); +let positional_idx = 0; +Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(ctx.param_order.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { __result.push({ + let def_idx = pair.0.clone(); +let pname = pair.1.clone(); +match v2_rt::map_get(&arg_map, pname.clone()) { + Some(arg_val) => read_arg_provenance(&arg_val, pname.clone(), &ctx), + None => match positional_args.clone().get(def_idx.clone() as usize).cloned() { + Some(arg_val) => read_arg_provenance(&arg_val, pname.clone(), &ctx), + None => Rc::new(SubValueRelation::SubValueUnknown), +}, +} +}); } __result }) } - -pub fn build_call_evidence( - call_node: &Rc, - ctx: &Rc, -) -> Rc>> { - { - let arg_map = Rc::new( - call_node - .children - .clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - .fold( - v2_rt::rc_empty_map::>(), - |acc: Rc>>, pair: (i64, Rc)| { - let idx = pair.0.clone(); - let arg_node = pair.1.clone(); - let aname = arg_name_at( - arg_node.clone(), - ctx.type_env.clone().source_indices.clone(), - ); - match aname.clone() { - Some(pname) => { - v2_rt::rc_map_insert(acc.clone(), pname.clone(), arg_value(&arg_node)) - } - None => acc.clone(), - } - }, - ); - let positional_args = Rc::new({ - let mut __result = Vec::new(); - for arg_node in Rc::new({ - let mut __result = Vec::new(); - for arg_node in call_node.children.clone().iter().cloned() { - if (arg_name_at( - arg_node.clone(), - ctx.type_env.clone().source_indices.clone(), - ) == None) - { - __result.push(arg_node); - } - } - __result - }) - .iter() - .cloned() - { - __result.push(arg_value(&arg_node)); - } - __result - }); - let positional_idx = 0; - Rc::new({ - let mut __result = Vec::new(); - for pair in Rc::new( - ctx.param_order - .clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - { - __result.push({ - let def_idx = pair.0.clone(); - let pname = pair.1.clone(); - match v2_rt::map_get(&arg_map, pname.clone()) { - Some(arg_val) => read_arg_provenance(&arg_val, pname.clone(), &ctx), - None => match positional_args - .clone() - .get(def_idx.clone() as usize) - .cloned() - { - Some(arg_val) => read_arg_provenance(&arg_val, pname.clone(), &ctx), - None => Rc::new(SubValueRelation::SubValueUnknown), - }, - } - }); - } - __result - }) - } } pub fn descent_source_type(found: String, arg_node: &Rc, ctx: &Rc) -> String { @@ -6197,334 +3591,188 @@ pub fn descent_source_type(found: String, arg_node: &Rc, ctx: &Rc found.clone(), - _ => { - let arg_val = arg_value(&arg_node); - match (*arg_val.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let vname = expr_var_name_at( - arg_val.clone(), - ctx.type_env.clone().source_indices.clone(), - ); - match v2_rt::map_get(&ctx.param_names.clone(), vname) { - Some(t) => t.clone(), - None => "".to_string(), - } - } - _ => "".to_string(), - } - } - } + ExprData::ExprLambda => found.clone(), + _ => { + let arg_val = arg_value(&arg_node); +match (*arg_val.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let vname = expr_var_name_at(arg_val.clone(), ctx.type_env.clone().source_indices.clone()); +match v2_rt::map_get(&ctx.param_names.clone(), vname) { + Some(t) => t.clone(), + None => "".to_string(), +} +}, + _ => "".to_string(), +} +}, +} } } pub fn annotate_descent(body: &Rc, ctx: &Rc) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*body.expr_data.clone()).clone() { - ExprData::ExprCall { - call_semantics: cs, .. - } => { - let evidence = build_call_evidence(&body, &ctx); - let source_type = - body.children.clone().iter().cloned().fold( - "".to_string(), - |found: String, arg_node: Rc| { - descent_source_type(found, &arg_node, &ctx) + ExprData::ExprCall { call_semantics: cs, .. } => { + let evidence = build_call_evidence(&body, &ctx); +let source_type = body.children.clone().iter().cloned().fold("".to_string(), |found: String, arg_node: Rc| descent_source_type(found, &arg_node, &ctx)); +let annotated_children = Rc::new({ let mut __result = Vec::new(); for child in body.children.clone().iter().cloned() { __result.push({ + let arg_val = arg_value(&child); +match (*arg_val.expr_data.clone()).clone() { + ExprData::ExprLambda => if (source_type.clone().as_str() != "".to_string().as_str()) { + { + let lparams = lambda_param_names_at(arg_val.clone(), ctx.type_env.clone().source_indices.clone()); +let p1 = match lparams.clone().first().cloned() { + Some(n) => n.clone(), + None => "".to_string(), +}; +let p2 = match lparams.clone().get(1 as usize).cloned() { + Some(n) => n.clone(), + None => "".to_string(), +}; +let lambda_ctx = Rc::new(DescentContext { + fn_name: ctx.fn_name.clone(), + param_names: if (p2.clone().as_str() != "".to_string().as_str()) { + v2_rt::rc_map_insert(v2_rt::rc_map_insert(ctx.param_names.clone(), p1.clone(), source_type.clone()), p2.clone(), source_type.clone()) + } else { + if (p1.clone().as_str() != "".to_string().as_str()) { + v2_rt::rc_map_insert(ctx.param_names.clone(), p1.clone(), source_type.clone()) + } else { + ctx.param_names.clone() + } }, - ); - let annotated_children = Rc::new({ - let mut __result = Vec::new(); - for child in body.children.clone().iter().cloned() { - __result.push({ - let arg_val = arg_value(&child); - match (*arg_val.expr_data.clone()).clone() { - ExprData::ExprLambda => { - if (source_type.clone().as_str() != "".to_string().as_str()) { - { - let lparams = lambda_param_names_at( - arg_val.clone(), - ctx.type_env.clone().source_indices.clone(), - ); - let p1 = match lparams.clone().first().cloned() { - Some(n) => n.clone(), - None => "".to_string(), - }; - let p2 = match lparams.clone().get(1 as usize).cloned() - { - Some(n) => n.clone(), - None => "".to_string(), - }; - let lambda_ctx = Rc::new(DescentContext { - fn_name: ctx.fn_name.clone(), - param_names: if (p2.clone().as_str() - != "".to_string().as_str()) - { - v2_rt::rc_map_insert( - v2_rt::rc_map_insert( - ctx.param_names.clone(), - p1.clone(), - source_type.clone(), - ), - p2.clone(), - source_type.clone(), - ) - } else { - if (p1.clone().as_str() - != "".to_string().as_str()) - { - v2_rt::rc_map_insert( - ctx.param_names.clone(), - p1.clone(), - source_type.clone(), - ) - } else { - ctx.param_names.clone() - } - }, - param_order: ctx.param_order.clone(), - type_env: ctx.type_env.clone(), - sub_value_vars: if (p1.clone().as_str() - != "".to_string().as_str()) - { - { - let source_fields = inductive_fields_for( - ctx.type_env.clone(), - source_type.clone(), - ); - let cf = Rc::new({ - let mut __result = Vec::new(); - for f in source_fields - .clone() - .iter() - .cloned() - { - if match f.shape.clone() { + param_order: ctx.param_order.clone(), + type_env: ctx.type_env.clone(), + sub_value_vars: if (p1.clone().as_str() != "".to_string().as_str()) { + { + let source_fields = inductive_fields_for(ctx.type_env.clone(), source_type.clone()); +let cf = Rc::new({ let mut __result = Vec::new(); for f in source_fields.clone().iter().cloned() { if match f.shape.clone() { RecursionShape::ListRecursion => true, _ => false, -} { __result.push(f); } - } - __result - }) - .first() - .cloned(); - let rel = match cf.clone() { +} { __result.push(f); } } __result }).first().cloned(); +let rel = match cf.clone() { Some(f) => Rc::new(SubValueRelation::IteratedSubValue { field: f.clone(), }), None => Rc::new(SubValueRelation::PreservedValue), }; - if (p2.clone().as_str() - != "".to_string().as_str()) - { - v2_rt::rc_map_insert( - v2_rt::rc_map_insert( - ctx.sub_value_vars.clone(), - p1.clone(), - rel.clone(), - ), - p2.clone(), - rel.clone(), - ) - } else { - v2_rt::rc_map_insert( - ctx.sub_value_vars.clone(), - p1.clone(), - rel.clone(), - ) - } - } - } else { - ctx.sub_value_vars.clone() - }, - size_aliases: ctx.size_aliases.clone(), - scope_locals: ctx.scope_locals.clone(), - func_sigs: ctx.func_sigs.clone(), - per_field_vars: ctx.per_field_vars.clone(), - }); - make_arg_node( - arg_name_at( - child.clone(), - ctx.type_env.clone().source_indices.clone(), - ), - annotate_descent(&arg_val, &lambda_ctx), - child.span.clone(), - child.span.clone(), - ) - } - } else { - make_arg_node( - arg_name_at( - child.clone(), - ctx.type_env.clone().source_indices.clone(), - ), - annotate_descent(&arg_val, &ctx), - child.span.clone(), - child.span.clone(), - ) - } - } - _ => make_arg_node( - arg_name_at( - child.clone(), - ctx.type_env.clone().source_indices.clone(), - ), - annotate_descent(&arg_val, &ctx), - child.span.clone(), - child.span.clone(), - ), - } - }); - } - __result - }); - Rc::new(Node { - name: body.name.clone(), - span: body.span.clone(), - ident_span: body.ident_span.clone(), - children: annotated_children, - connective: body.connective.clone(), - params: body.params.clone(), - inferred: body.inferred.clone(), - return_cardinality: body.return_cardinality.clone(), - uses: body.uses.clone(), - body: body.body.clone(), - transport: body.transport.clone(), - properties: body.properties.clone(), - type_annotation: body.type_annotation.clone(), - is_self_recursive: body.is_self_recursive.clone(), - has_non_tail_self_call: body.has_non_tail_self_call.clone(), - match_pattern: body.match_pattern.clone(), - expr_data: Rc::new(ExprData::ExprCall { - call_semantics: cs.clone(), - descent_evidence: Some(evidence), - }), - ident: None, - }) - } - ExprData::ExprMatch => { - let scrut = match_scrutinee(body.clone()); - let scrut_type = match (*scrut.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let sname = expr_var_name_at( - scrut.clone(), - ctx.type_env.clone().source_indices.clone(), - ); - match v2_rt::map_get(&ctx.param_names.clone(), sname.clone()) { - Some(t) => t.clone(), - None => { - match v2_rt::map_get(&ctx.sub_value_vars.clone(), sname.clone()) { - Some(rel) => match (*rel.clone()).clone() { - SubValueRelation::StrictSubValue { field: f, .. } => { - f.element_type.clone() - } - SubValueRelation::IteratedSubValue { field: f, .. } => { - f.element_type.clone() - } - _ => "".to_string(), - }, - None => "".to_string(), - } - } - } - } - _ => "".to_string(), - }; - let scrut_inducing_field = match (*scrut.expr_data.clone()).clone() { - ExprData::ExprFieldAccess { .. } => { - let base = field_access_base(scrut.clone()); - let fname = field_access_field_at( - scrut.clone(), - ctx.type_env.clone().source_indices.clone(), - ); - match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let bname = expr_var_name_at( - base.clone(), - ctx.type_env.clone().source_indices.clone(), - ); - let base_type = - match v2_rt::map_get(&ctx.param_names.clone(), bname.clone()) { - Some(t) => t.clone(), - None => "".to_string(), - }; - if (base_type.clone().as_str() != "".to_string().as_str()) { - { - let ind_fields = inductive_fields_for( - ctx.type_env.clone(), - base_type.clone(), - ); - Rc::new({ - let mut __result = Vec::new(); - for f in ind_fields.clone().iter().cloned() { - if (f.field_name.clone().as_str() - == fname.clone().as_str()) - { - __result.push(f); - } - } - __result - }) - .first() - .cloned() - } +if (p2.clone().as_str() != "".to_string().as_str()) { + v2_rt::rc_map_insert(v2_rt::rc_map_insert(ctx.sub_value_vars.clone(), p1.clone(), rel.clone()), p2.clone(), rel.clone()) } else { - None + v2_rt::rc_map_insert(ctx.sub_value_vars.clone(), p1.clone(), rel.clone()) } - } - _ => None, - } - } - ExprData::ExprMethodCall { .. } => { - let mname = expr_method_name_at( - scrut.clone(), - ctx.type_env.clone().source_indices.clone(), - ); - if ((mname.clone().as_str() == "first".to_string().as_str()) - || (mname.clone().as_str() == "last".to_string().as_str())) - { - { - let receiver = method_receiver(scrut.clone()); - resolve_collection_field(receiver.clone(), ctx.clone()) - } +} } else { - None - } - } - _ => None, - }; - let scrut_has_inductive = (((scrut_type.clone().as_str() - != "".to_string().as_str()) - && ((inductive_fields_for(ctx.type_env.clone(), scrut_type.clone()).len() - as i64) - > 0)) - || (scrut_inducing_field.clone() != None)); - let scrut_variant_sig = match (*scrut.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { - let callee = expr_call_func_at( - scrut.clone(), - ctx.type_env.clone().source_indices.clone(), - ); - match v2_rt::map_get(&ctx.func_sigs.clone(), callee) { - Some(sig) => { - if ((Rc::new(v2_rt::map_keys(&sig.variant_provenance.clone())).len() - as i64) - > 0) - { - Some(sig.clone()) - } else { - None - } - } - None => None, - } + ctx.sub_value_vars.clone() + }, + size_aliases: ctx.size_aliases.clone(), + scope_locals: ctx.scope_locals.clone(), + func_sigs: ctx.func_sigs.clone(), + per_field_vars: ctx.per_field_vars.clone(), +}); +make_arg_node(arg_name_at(child.clone(), ctx.type_env.clone().source_indices.clone()), annotate_descent(&arg_val, &lambda_ctx), child.span.clone(), child.span.clone()) +} + } else { + make_arg_node(arg_name_at(child.clone(), ctx.type_env.clone().source_indices.clone()), annotate_descent(&arg_val, &ctx), child.span.clone(), child.span.clone()) + }, + _ => make_arg_node(arg_name_at(child.clone(), ctx.type_env.clone().source_indices.clone()), annotate_descent(&arg_val, &ctx), child.span.clone(), child.span.clone()), +} +}); } __result }); +Rc::new(Node { + name: body.name.clone(), + span: body.span.clone(), + ident_span: body.ident_span.clone(), + children: annotated_children, + connective: body.connective.clone(), + params: body.params.clone(), + inferred: body.inferred.clone(), + return_cardinality: body.return_cardinality.clone(), + uses: body.uses.clone(), + body: body.body.clone(), + transport: body.transport.clone(), + properties: body.properties.clone(), + type_annotation: body.type_annotation.clone(), + is_self_recursive: body.is_self_recursive.clone(), + has_non_tail_self_call: body.has_non_tail_self_call.clone(), + match_pattern: body.match_pattern.clone(), + expr_data: Rc::new(ExprData::ExprCall { + call_semantics: cs.clone(), + descent_evidence: Some(evidence), +}), + ident: None, +}) +}, + ExprData::ExprMatch => { + let scrut = match_scrutinee(body.clone()); +let scrut_type = match (*scrut.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let sname = expr_var_name_at(scrut.clone(), ctx.type_env.clone().source_indices.clone()); +match v2_rt::map_get(&ctx.param_names.clone(), sname.clone()) { + Some(t) => t.clone(), + None => match v2_rt::map_get(&ctx.sub_value_vars.clone(), sname.clone()) { + Some(rel) => match (*rel.clone()).clone() { + SubValueRelation::StrictSubValue { field: f, .. } => f.element_type.clone(), + SubValueRelation::IteratedSubValue { field: f, .. } => f.element_type.clone(), + _ => "".to_string(), +}, + None => "".to_string(), +}, +} +}, + _ => "".to_string(), +}; +let scrut_inducing_field = match (*scrut.expr_data.clone()).clone() { + ExprData::ExprFieldAccess { .. } => { + let base = field_access_base(scrut.clone()); +let fname = field_access_field_at(scrut.clone(), ctx.type_env.clone().source_indices.clone()); +match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let bname = expr_var_name_at(base.clone(), ctx.type_env.clone().source_indices.clone()); +let base_type = match v2_rt::map_get(&ctx.param_names.clone(), bname.clone()) { + Some(t) => t.clone(), + None => "".to_string(), +}; +if (base_type.clone().as_str() != "".to_string().as_str()) { + { + let ind_fields = inductive_fields_for(ctx.type_env.clone(), base_type.clone()); +Rc::new({ let mut __result = Vec::new(); for f in ind_fields.clone().iter().cloned() { if (f.field_name.clone().as_str() == fname.clone().as_str()) { __result.push(f); } } __result }).first().cloned() +} + } else { + None } - _ => None, - }; - let annotated_scrut = annotate_descent(&scrut, &ctx); - let annotated_arms = Rc::new({ - let mut __result = Vec::new(); - for arm_node in match_arm_nodes(body.clone()).iter().cloned() { - __result.push({ +}, + _ => None, +} +}, + ExprData::ExprMethodCall { .. } => { + let mname = expr_method_name_at(scrut.clone(), ctx.type_env.clone().source_indices.clone()); +if ((mname.clone().as_str() == "first".to_string().as_str()) || (mname.clone().as_str() == "last".to_string().as_str())) { + { + let receiver = method_receiver(scrut.clone()); +resolve_collection_field(receiver.clone(), ctx.clone()) +} + } else { + None + } +}, + _ => None, +}; +let scrut_has_inductive = (((scrut_type.clone().as_str() != "".to_string().as_str()) && ((inductive_fields_for(ctx.type_env.clone(), scrut_type.clone()).len() as i64) > 0)) || (scrut_inducing_field.clone() != None)); +let scrut_variant_sig = match (*scrut.expr_data.clone()).clone() { + ExprData::ExprCall { .. } => { + let callee = expr_call_func_at(scrut.clone(), ctx.type_env.clone().source_indices.clone()); +match v2_rt::map_get(&ctx.func_sigs.clone(), callee) { + Some(sig) => if ((Rc::new(v2_rt::map_keys(&sig.variant_provenance.clone())).len() as i64) > 0) { + Some(sig.clone()) + } else { + None + }, + None => None, +} +}, + _ => None, +}; +let annotated_scrut = annotate_descent(&scrut, &ctx); +let annotated_arms = Rc::new({ let mut __result = Vec::new(); for arm_node in match_arm_nodes(body.clone()).iter().cloned() { __result.push({ let variant_arm_ctx = match scrut_variant_sig.clone() { Some(sig) => arm_ctx_from_variant_provenance(arm_node.clone(), sig.clone(), scrut.clone(), &ctx), None => None, @@ -6631,933 +3879,578 @@ match matching.clone() { scope_locals: ctx.scope_locals.clone(), func_sigs: ctx.func_sigs.clone(), per_field_vars: ctx.per_field_vars.clone(), -}) - } else { - match scrut_inducing_field.clone() { - Some(ind_field) => Rc::new(DescentContext { +}) + } else { + match scrut_inducing_field.clone() { + Some(ind_field) => Rc::new(DescentContext { + fn_name: ctx.fn_name.clone(), + param_names: v2_rt::rc_map_insert(ctx.param_names.clone(), bname.clone(), ind_field.element_type.clone()), + param_order: ctx.param_order.clone(), + type_env: ctx.type_env.clone(), + sub_value_vars: v2_rt::rc_map_insert(ctx.sub_value_vars.clone(), bname.clone(), Rc::new(SubValueRelation::StrictSubValue { + field: ind_field.clone(), + factor: Rc::new(ShrinkFactor::UnitShrink), +})), + size_aliases: ctx.size_aliases.clone(), + scope_locals: ctx.scope_locals.clone(), + func_sigs: ctx.func_sigs.clone(), + per_field_vars: ctx.per_field_vars.clone(), +}), + None => ctx.clone(), +} + }, + _ => ctx.clone(), +} + } else { + ctx.clone() + }, +}; +let annotated_body = annotate_descent(&arm_body(&arm_node), &arm_ctx); +make_arm_node(arm_pattern(arm_node.clone()), arm_guard(&arm_node), annotated_body.clone(), arm_node.span.clone()) +}); } __result }); +Rc::new(Node { + name: body.name.clone(), + span: body.span.clone(), + ident_span: body.ident_span.clone(), + children: v2_rt::concat(Rc::new(vec![annotated_scrut]), annotated_arms), + connective: body.connective.clone(), + params: body.params.clone(), + inferred: body.inferred.clone(), + return_cardinality: body.return_cardinality.clone(), + uses: body.uses.clone(), + body: body.body.clone(), + transport: body.transport.clone(), + properties: body.properties.clone(), + type_annotation: body.type_annotation.clone(), + is_self_recursive: body.is_self_recursive.clone(), + has_non_tail_self_call: body.has_non_tail_self_call.clone(), + match_pattern: body.match_pattern.clone(), + expr_data: body.expr_data.clone(), + ident: None, +}) +}, + ExprData::ExprLet => { + let val = let_value(body.clone()); +let binding_name = let_binding_name_at(body.clone(), ctx.type_env.clone().source_indices.clone()); +let val_relation = classify_let_value(&val, &ctx); +let size_alias = classify_size_expr(&val, &ctx); +let inner_size_aliases = match size_alias { + Some(se) => v2_rt::rc_map_insert(ctx.size_aliases.clone(), binding_name.clone(), se.clone()), + None => ctx.size_aliases.clone(), +}; +let inner_per_field = build_per_field_for_let(&val, binding_name.clone(), &ctx); +let inner_ctx = match val_relation { + Some(rel) => { + let sub_type = match (*rel.clone()).clone() { + SubValueRelation::StrictSubValue { field: f, .. } => f.element_type.clone(), + SubValueRelation::IteratedSubValue { field: f, .. } => f.element_type.clone(), + _ => "".to_string(), +}; +Rc::new(DescentContext { + fn_name: ctx.fn_name.clone(), + param_names: if (sub_type.clone().as_str() != "".to_string().as_str()) { + v2_rt::rc_map_insert(ctx.param_names.clone(), binding_name.clone(), sub_type.clone()) + } else { + ctx.param_names.clone() + }, + param_order: ctx.param_order.clone(), + type_env: ctx.type_env.clone(), + sub_value_vars: v2_rt::rc_map_insert(ctx.sub_value_vars.clone(), binding_name.clone(), rel.clone()), + size_aliases: inner_size_aliases, + scope_locals: v2_rt::rc_map_insert(ctx.scope_locals.clone(), binding_name.clone(), Rc::new(TypeBinding { + name: binding_name.clone(), + resolved: resolved_type(val.clone()), + provenance: rel.clone(), +})), + func_sigs: ctx.func_sigs.clone(), + per_field_vars: inner_per_field, +}) +}, + None => Rc::new(DescentContext { + fn_name: ctx.fn_name.clone(), + param_names: ctx.param_names.clone(), + param_order: ctx.param_order.clone(), + type_env: ctx.type_env.clone(), + sub_value_vars: ctx.sub_value_vars.clone(), + size_aliases: inner_size_aliases, + scope_locals: v2_rt::rc_map_insert(ctx.scope_locals.clone(), binding_name.clone(), Rc::new(TypeBinding { + name: binding_name.clone(), + resolved: resolved_type(val.clone()), + provenance: Rc::new(SubValueRelation::SubValueUnknown), +})), + func_sigs: ctx.func_sigs.clone(), + per_field_vars: inner_per_field, +}), +}; +let annotated_value = annotate_descent(&val, &ctx); +let annotated_children = match let_body(body.clone()) { + Some(body_child) => Rc::new(vec![annotated_value, annotate_descent(&body_child, &inner_ctx)]), + None => Rc::new(vec![annotated_value]), +}; +Rc::new(Node { + name: body.name.clone(), + span: body.span.clone(), + ident_span: body.ident_span.clone(), + children: annotated_children, + connective: body.connective.clone(), + params: body.params.clone(), + inferred: body.inferred.clone(), + return_cardinality: body.return_cardinality.clone(), + uses: body.uses.clone(), + body: body.body.clone(), + transport: body.transport.clone(), + properties: body.properties.clone(), + type_annotation: body.type_annotation.clone(), + is_self_recursive: body.is_self_recursive.clone(), + has_non_tail_self_call: body.has_non_tail_self_call.clone(), + match_pattern: body.match_pattern.clone(), + expr_data: body.expr_data.clone(), + ident: None, +}) +}, + ExprData::ExprBlock => { + let threaded = body.children.clone().iter().cloned().fold(Rc::new(BlockAnnotateAcc { + ctx: ctx.clone(), + children: Rc::new(vec![]), +}), |acc: Rc, child: Rc| { + let annotated = annotate_descent(&child, &acc.ctx.clone()); +let next_ctx = match (*child.expr_data.clone()).clone() { + ExprData::ExprLet => { + let val = let_value(child.clone()); +let bname = let_binding_name_at(child.clone(), ctx.type_env.clone().source_indices.clone()); +let val_rel = classify_let_value(&val, &acc.ctx.clone()); +let sa = classify_size_expr(&val, &acc.ctx.clone()); +let new_sa = match sa.clone() { + Some(se) => v2_rt::rc_map_insert(acc.ctx.clone().size_aliases.clone(), bname.clone(), se.clone()), + None => acc.ctx.clone().size_aliases.clone(), +}; +match val_rel.clone() { + Some(rel) => { + let sub_type = match (*rel.clone()).clone() { + SubValueRelation::StrictSubValue { field: f, .. } => f.element_type.clone(), + SubValueRelation::IteratedSubValue { field: f, .. } => f.element_type.clone(), + _ => "".to_string(), +}; +Rc::new(DescentContext { + fn_name: acc.ctx.clone().fn_name.clone(), + param_names: if (sub_type.clone().as_str() != "".to_string().as_str()) { + v2_rt::rc_map_insert(acc.ctx.clone().param_names.clone(), bname.clone(), sub_type.clone()) + } else { + acc.ctx.clone().param_names.clone() + }, + param_order: acc.ctx.clone().param_order.clone(), + type_env: acc.ctx.clone().type_env.clone(), + sub_value_vars: v2_rt::rc_map_insert(acc.ctx.clone().sub_value_vars.clone(), bname.clone(), rel.clone()), + size_aliases: new_sa.clone(), + scope_locals: v2_rt::rc_map_insert(acc.ctx.clone().scope_locals.clone(), bname.clone(), Rc::new(TypeBinding { + name: bname.clone(), + resolved: resolved_type(val.clone()), + provenance: rel.clone(), +})), + func_sigs: acc.ctx.clone().func_sigs.clone(), + per_field_vars: acc.ctx.clone().per_field_vars.clone(), +}) +}, + None => Rc::new(DescentContext { + fn_name: acc.ctx.clone().fn_name.clone(), + param_names: acc.ctx.clone().param_names.clone(), + param_order: acc.ctx.clone().param_order.clone(), + type_env: acc.ctx.clone().type_env.clone(), + sub_value_vars: acc.ctx.clone().sub_value_vars.clone(), + size_aliases: new_sa.clone(), + scope_locals: v2_rt::rc_map_insert(acc.ctx.clone().scope_locals.clone(), bname.clone(), Rc::new(TypeBinding { + name: bname.clone(), + resolved: resolved_type(val.clone()), + provenance: Rc::new(SubValueRelation::SubValueUnknown), +})), + func_sigs: acc.ctx.clone().func_sigs.clone(), + per_field_vars: acc.ctx.clone().per_field_vars.clone(), +}), +} +}, + _ => acc.ctx.clone(), +}; +Rc::new(BlockAnnotateAcc { + ctx: next_ctx.clone(), + children: v2_rt::concat(acc.children.clone(), Rc::new(vec![annotated.clone()])), +}) +}); +Rc::new(Node { + name: body.name.clone(), + span: body.span.clone(), + ident_span: body.ident_span.clone(), + children: threaded.children.clone(), + connective: body.connective.clone(), + params: body.params.clone(), + inferred: body.inferred.clone(), + return_cardinality: body.return_cardinality.clone(), + uses: body.uses.clone(), + body: body.body.clone(), + transport: body.transport.clone(), + properties: body.properties.clone(), + type_annotation: body.type_annotation.clone(), + is_self_recursive: body.is_self_recursive.clone(), + has_non_tail_self_call: body.has_non_tail_self_call.clone(), + match_pattern: body.match_pattern.clone(), + expr_data: body.expr_data.clone(), + ident: None, +}) +}, + ExprData::ExprMethodCall { method_semantics: ms, .. } => { + let mname = expr_method_name_at(body.clone(), ctx.type_env.clone().source_indices.clone()); +let elem_position = method_callback_element_position(ms.clone()); +if (elem_position.clone() != None) { + { + let raw_receiver = method_receiver(body.clone()); +let receiver = match (*raw_receiver.expr_data.clone()).clone() { + ExprData::ExprMethodCall { .. } => { + let inner_mname = expr_method_name_at(raw_receiver.clone(), ctx.type_env.clone().source_indices.clone()); +if (inner_mname.as_str() == "enumerate".to_string().as_str()) { + method_receiver(raw_receiver.clone()) + } else { + raw_receiver.clone() + } +}, + _ => raw_receiver.clone(), +}; +let receiver_field = match (*receiver.expr_data.clone()).clone() { + ExprData::ExprFieldAccess { .. } => { + let base = field_access_base(receiver.clone()); +let fname = field_access_field_at(receiver.clone(), ctx.type_env.clone().source_indices.clone()); +match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let bname = expr_var_name_at(base.clone(), ctx.type_env.clone().source_indices.clone()); +let base_type = match v2_rt::map_get(&ctx.param_names.clone(), bname.clone()) { + Some(t) => t.clone(), + None => match v2_rt::map_get(&ctx.sub_value_vars.clone(), bname.clone()) { + Some(rel) => match (*rel.clone()).clone() { + SubValueRelation::StrictSubValue { field: f, .. } => f.element_type.clone(), + SubValueRelation::IteratedSubValue { field: f, .. } => f.element_type.clone(), + _ => "".to_string(), +}, + None => "".to_string(), +}, +}; +if (base_type.clone().as_str() != "".to_string().as_str()) { + Rc::new({ let mut __result = Vec::new(); for f in inductive_fields_for(ctx.type_env.clone(), base_type.clone()).iter().cloned() { if (f.field_name.clone().as_str() == fname.clone().as_str()) { __result.push(f); } } __result }).first().cloned() + } else { + None + } +}, + _ => None, +} +}, + ExprData::ExprVar { .. } => { + let rname = expr_var_name_at(receiver.clone(), ctx.type_env.clone().source_indices.clone()); +match v2_rt::map_get(&ctx.sub_value_vars.clone(), rname) { + Some(rel) => match (*rel.clone()).clone() { + SubValueRelation::StrictSubValue { field: f, .. } => match f.shape.clone() { + RecursionShape::ListRecursion => Some(f.clone()), + _ => None, +}, + SubValueRelation::IteratedSubValue { field: f, .. } => match f.shape.clone() { + RecursionShape::ListRecursion => Some(f.clone()), + _ => None, +}, + _ => None, +}, + None => None, +} +}, + _ => None, +}; +let method_args = method_arg_nodes(body.clone()); +let lambda_arg = Rc::new({ let mut __result = Vec::new(); for a in method_args.iter().cloned() { if match (*arg_value(&a).expr_data.clone()).clone() { + ExprData::ExprLambda => true, + _ => false, +} { __result.push(a); } } __result }).first().cloned(); +let lambda_elem_info = match lambda_arg { + Some(la) => { + let lambda_node = arg_value(&la); +let lparams = lambda_param_names_at(lambda_node, ctx.type_env.clone().source_indices.clone()); +lparams.clone().get(elem_position.clone().unwrap() as usize).cloned() +}, + None => None, +}; +let is_fold = (elem_position.clone().unwrap() > 0); +let inner_ctx = match lambda_elem_info { + Some(elem_name) => match receiver_field { + Some(ind_field) => Rc::new(DescentContext { + fn_name: ctx.fn_name.clone(), + param_names: v2_rt::rc_map_insert(ctx.param_names.clone(), elem_name.clone(), ind_field.element_type.clone()), + param_order: ctx.param_order.clone(), + type_env: ctx.type_env.clone(), + sub_value_vars: if is_fold { + v2_rt::rc_map_insert(v2_rt::rc_empty_map::>(), elem_name.clone(), Rc::new(SubValueRelation::IteratedSubValue { + field: ind_field.clone(), +})) + } else { + v2_rt::rc_map_insert(ctx.sub_value_vars.clone(), elem_name.clone(), Rc::new(SubValueRelation::IteratedSubValue { + field: ind_field.clone(), +})) + }, + size_aliases: ctx.size_aliases.clone(), + scope_locals: ctx.scope_locals.clone(), + func_sigs: ctx.func_sigs.clone(), + per_field_vars: ctx.per_field_vars.clone(), +}), + None => Rc::new(DescentContext { + fn_name: ctx.fn_name.clone(), + param_names: ctx.param_names.clone(), + param_order: ctx.param_order.clone(), + type_env: ctx.type_env.clone(), + sub_value_vars: if is_fold { + v2_rt::rc_empty_map::>() + } else { + ctx.sub_value_vars.clone() + }, + size_aliases: ctx.size_aliases.clone(), + scope_locals: ctx.scope_locals.clone(), + func_sigs: ctx.func_sigs.clone(), + per_field_vars: ctx.per_field_vars.clone(), +}), +}, + None => ctx.clone(), +}; +let annotated_receiver = annotate_descent(&method_receiver(body.clone()), &ctx); +let annotated_args = Rc::new({ let mut __result = Vec::new(); for arg_node in method_arg_nodes(body.clone()).iter().cloned() { __result.push({ + let arg_val = arg_value(&arg_node); +let is_lambda = match (*arg_val.expr_data.clone()).clone() { + ExprData::ExprLambda => true, + _ => false, +}; +if is_lambda.clone() { + make_arg_node(match arg_name_at(arg_node.clone(), ctx.type_env.clone().source_indices.clone()) { + Some(n) => Some(n.clone()), + None => None, +}, annotate_descent(&arg_val, &inner_ctx), arg_node.span.clone(), arg_node.span.clone()) + } else { + make_arg_node(match arg_name_at(arg_node.clone(), ctx.type_env.clone().source_indices.clone()) { + Some(n) => Some(n.clone()), + None => None, +}, annotate_descent(&arg_val, &ctx), arg_node.span.clone(), arg_node.span.clone()) + } +}); } __result }); +Rc::new(Node { + name: body.name.clone(), + span: body.span.clone(), + ident_span: body.ident_span.clone(), + children: v2_rt::concat(Rc::new(vec![annotated_receiver]), annotated_args), + connective: body.connective.clone(), + params: body.params.clone(), + inferred: body.inferred.clone(), + return_cardinality: body.return_cardinality.clone(), + uses: body.uses.clone(), + body: body.body.clone(), + transport: body.transport.clone(), + properties: body.properties.clone(), + type_annotation: body.type_annotation.clone(), + is_self_recursive: body.is_self_recursive.clone(), + has_non_tail_self_call: body.has_non_tail_self_call.clone(), + match_pattern: body.match_pattern.clone(), + expr_data: body.expr_data.clone(), + ident: None, +}) +} + } else { + map_children(&body, |child| annotate_descent(&child, &ctx)) + } +}, + ExprData::ExprForEach => { + let coll = foreach_collection(body.clone()); +let fe_body = foreach_body(body.clone()); +let fe_var = foreach_variable_at(body.clone(), ctx.type_env.clone().source_indices.clone()); +let coll_field = resolve_collection_field(coll.clone(), ctx.clone()); +let inner_ctx = match coll_field { + Some(ind_field) => Rc::new(DescentContext { + fn_name: ctx.fn_name.clone(), + param_names: v2_rt::rc_map_insert(ctx.param_names.clone(), fe_var.clone(), ind_field.element_type.clone()), + param_order: ctx.param_order.clone(), + type_env: ctx.type_env.clone(), + sub_value_vars: v2_rt::rc_map_insert(v2_rt::rc_empty_map::>(), fe_var.clone(), Rc::new(SubValueRelation::IteratedSubValue { + field: ind_field.clone(), +})), + size_aliases: ctx.size_aliases.clone(), + scope_locals: ctx.scope_locals.clone(), + func_sigs: ctx.func_sigs.clone(), + per_field_vars: ctx.per_field_vars.clone(), +}), + None => Rc::new(DescentContext { fn_name: ctx.fn_name.clone(), - param_names: v2_rt::rc_map_insert(ctx.param_names.clone(), bname.clone(), ind_field.element_type.clone()), + param_names: ctx.param_names.clone(), param_order: ctx.param_order.clone(), type_env: ctx.type_env.clone(), - sub_value_vars: v2_rt::rc_map_insert(ctx.sub_value_vars.clone(), bname.clone(), Rc::new(SubValueRelation::StrictSubValue { - field: ind_field.clone(), - factor: Rc::new(ShrinkFactor::UnitShrink), -})), + sub_value_vars: v2_rt::rc_empty_map::>(), size_aliases: ctx.size_aliases.clone(), scope_locals: ctx.scope_locals.clone(), func_sigs: ctx.func_sigs.clone(), per_field_vars: ctx.per_field_vars.clone(), }), - None => ctx.clone(), -} - }, - _ => ctx.clone(), -} - } else { - ctx.clone() - }, }; -let annotated_body = annotate_descent(&arm_body(&arm_node), &arm_ctx); -make_arm_node(arm_pattern(arm_node.clone()), arm_guard(&arm_node), annotated_body.clone(), arm_node.span.clone()) -}); - } - __result - }); - Rc::new(Node { - name: body.name.clone(), - span: body.span.clone(), - ident_span: body.ident_span.clone(), - children: v2_rt::concat(Rc::new(vec![annotated_scrut]), annotated_arms), - connective: body.connective.clone(), - params: body.params.clone(), - inferred: body.inferred.clone(), - return_cardinality: body.return_cardinality.clone(), - uses: body.uses.clone(), - body: body.body.clone(), - transport: body.transport.clone(), - properties: body.properties.clone(), - type_annotation: body.type_annotation.clone(), - is_self_recursive: body.is_self_recursive.clone(), - has_non_tail_self_call: body.has_non_tail_self_call.clone(), - match_pattern: body.match_pattern.clone(), - expr_data: body.expr_data.clone(), - ident: None, - }) - } - ExprData::ExprLet => { - let val = let_value(body.clone()); - let binding_name = - let_binding_name_at(body.clone(), ctx.type_env.clone().source_indices.clone()); - let val_relation = classify_let_value(&val, &ctx); - let size_alias = classify_size_expr(&val, &ctx); - let inner_size_aliases = match size_alias { - Some(se) => v2_rt::rc_map_insert( - ctx.size_aliases.clone(), - binding_name.clone(), - se.clone(), - ), - None => ctx.size_aliases.clone(), - }; - let inner_per_field = build_per_field_for_let(&val, binding_name.clone(), &ctx); - let inner_ctx = match val_relation { - Some(rel) => { - let sub_type = match (*rel.clone()).clone() { - SubValueRelation::StrictSubValue { field: f, .. } => { - f.element_type.clone() - } - SubValueRelation::IteratedSubValue { field: f, .. } => { - f.element_type.clone() - } - _ => "".to_string(), - }; - Rc::new(DescentContext { - fn_name: ctx.fn_name.clone(), - param_names: if (sub_type.clone().as_str() != "".to_string().as_str()) { - v2_rt::rc_map_insert( - ctx.param_names.clone(), - binding_name.clone(), - sub_type.clone(), - ) - } else { - ctx.param_names.clone() - }, - param_order: ctx.param_order.clone(), - type_env: ctx.type_env.clone(), - sub_value_vars: v2_rt::rc_map_insert( - ctx.sub_value_vars.clone(), - binding_name.clone(), - rel.clone(), - ), - size_aliases: inner_size_aliases, - scope_locals: v2_rt::rc_map_insert( - ctx.scope_locals.clone(), - binding_name.clone(), - Rc::new(TypeBinding { - name: binding_name.clone(), - resolved: resolved_type(val.clone()), - provenance: rel.clone(), - }), - ), - func_sigs: ctx.func_sigs.clone(), - per_field_vars: inner_per_field, - }) - } - None => Rc::new(DescentContext { - fn_name: ctx.fn_name.clone(), - param_names: ctx.param_names.clone(), - param_order: ctx.param_order.clone(), - type_env: ctx.type_env.clone(), - sub_value_vars: ctx.sub_value_vars.clone(), - size_aliases: inner_size_aliases, - scope_locals: v2_rt::rc_map_insert( - ctx.scope_locals.clone(), - binding_name.clone(), - Rc::new(TypeBinding { - name: binding_name.clone(), - resolved: resolved_type(val.clone()), - provenance: Rc::new(SubValueRelation::SubValueUnknown), - }), - ), - func_sigs: ctx.func_sigs.clone(), - per_field_vars: inner_per_field, - }), - }; - let annotated_value = annotate_descent(&val, &ctx); - let annotated_children = match let_body(body.clone()) { - Some(body_child) => Rc::new(vec![ - annotated_value, - annotate_descent(&body_child, &inner_ctx), - ]), - None => Rc::new(vec![annotated_value]), - }; - Rc::new(Node { - name: body.name.clone(), - span: body.span.clone(), - ident_span: body.ident_span.clone(), - children: annotated_children, - connective: body.connective.clone(), - params: body.params.clone(), - inferred: body.inferred.clone(), - return_cardinality: body.return_cardinality.clone(), - uses: body.uses.clone(), - body: body.body.clone(), - transport: body.transport.clone(), - properties: body.properties.clone(), - type_annotation: body.type_annotation.clone(), - is_self_recursive: body.is_self_recursive.clone(), - has_non_tail_self_call: body.has_non_tail_self_call.clone(), - match_pattern: body.match_pattern.clone(), - expr_data: body.expr_data.clone(), - ident: None, - }) - } - ExprData::ExprBlock => { - let threaded = body.children.clone().iter().cloned().fold( - Rc::new(BlockAnnotateAcc { - ctx: ctx.clone(), - children: Rc::new(vec![]), - }), - |acc: Rc, child: Rc| { - let annotated = annotate_descent(&child, &acc.ctx.clone()); - let next_ctx = match (*child.expr_data.clone()).clone() { - ExprData::ExprLet => { - let val = let_value(child.clone()); - let bname = let_binding_name_at( - child.clone(), - ctx.type_env.clone().source_indices.clone(), - ); - let val_rel = classify_let_value(&val, &acc.ctx.clone()); - let sa = classify_size_expr(&val, &acc.ctx.clone()); - let new_sa = match sa.clone() { - Some(se) => v2_rt::rc_map_insert( - acc.ctx.clone().size_aliases.clone(), - bname.clone(), - se.clone(), - ), - None => acc.ctx.clone().size_aliases.clone(), - }; - match val_rel.clone() { - Some(rel) => { - let sub_type = match (*rel.clone()).clone() { - SubValueRelation::StrictSubValue { - field: f, .. - } => f.element_type.clone(), - SubValueRelation::IteratedSubValue { - field: f, .. - } => f.element_type.clone(), - _ => "".to_string(), - }; - Rc::new(DescentContext { - fn_name: acc.ctx.clone().fn_name.clone(), - param_names: if (sub_type.clone().as_str() - != "".to_string().as_str()) - { - v2_rt::rc_map_insert( - acc.ctx.clone().param_names.clone(), - bname.clone(), - sub_type.clone(), - ) - } else { - acc.ctx.clone().param_names.clone() - }, - param_order: acc.ctx.clone().param_order.clone(), - type_env: acc.ctx.clone().type_env.clone(), - sub_value_vars: v2_rt::rc_map_insert( - acc.ctx.clone().sub_value_vars.clone(), - bname.clone(), - rel.clone(), - ), - size_aliases: new_sa.clone(), - scope_locals: v2_rt::rc_map_insert( - acc.ctx.clone().scope_locals.clone(), - bname.clone(), - Rc::new(TypeBinding { - name: bname.clone(), - resolved: resolved_type(val.clone()), - provenance: rel.clone(), - }), - ), - func_sigs: acc.ctx.clone().func_sigs.clone(), - per_field_vars: acc.ctx.clone().per_field_vars.clone(), - }) - } - None => Rc::new(DescentContext { - fn_name: acc.ctx.clone().fn_name.clone(), - param_names: acc.ctx.clone().param_names.clone(), - param_order: acc.ctx.clone().param_order.clone(), - type_env: acc.ctx.clone().type_env.clone(), - sub_value_vars: acc.ctx.clone().sub_value_vars.clone(), - size_aliases: new_sa.clone(), - scope_locals: v2_rt::rc_map_insert( - acc.ctx.clone().scope_locals.clone(), - bname.clone(), - Rc::new(TypeBinding { - name: bname.clone(), - resolved: resolved_type(val.clone()), - provenance: Rc::new( - SubValueRelation::SubValueUnknown, - ), - }), - ), - func_sigs: acc.ctx.clone().func_sigs.clone(), - per_field_vars: acc.ctx.clone().per_field_vars.clone(), - }), - } - } - _ => acc.ctx.clone(), - }; - Rc::new(BlockAnnotateAcc { - ctx: next_ctx.clone(), - children: v2_rt::concat( - acc.children.clone(), - Rc::new(vec![annotated.clone()]), - ), - }) - }, - ); - Rc::new(Node { - name: body.name.clone(), - span: body.span.clone(), - ident_span: body.ident_span.clone(), - children: threaded.children.clone(), - connective: body.connective.clone(), - params: body.params.clone(), - inferred: body.inferred.clone(), - return_cardinality: body.return_cardinality.clone(), - uses: body.uses.clone(), - body: body.body.clone(), - transport: body.transport.clone(), - properties: body.properties.clone(), - type_annotation: body.type_annotation.clone(), - is_self_recursive: body.is_self_recursive.clone(), - has_non_tail_self_call: body.has_non_tail_self_call.clone(), - match_pattern: body.match_pattern.clone(), - expr_data: body.expr_data.clone(), - ident: None, - }) - } - ExprData::ExprMethodCall { - method_semantics: ms, - .. - } => { - let mname = - expr_method_name_at(body.clone(), ctx.type_env.clone().source_indices.clone()); - let elem_position = method_callback_element_position(ms.clone()); - if (elem_position.clone() != None) { - { - let raw_receiver = method_receiver(body.clone()); - let receiver = match (*raw_receiver.expr_data.clone()).clone() { - ExprData::ExprMethodCall { .. } => { - let inner_mname = expr_method_name_at( - raw_receiver.clone(), - ctx.type_env.clone().source_indices.clone(), - ); - if (inner_mname.as_str() == "enumerate".to_string().as_str()) { - method_receiver(raw_receiver.clone()) - } else { - raw_receiver.clone() - } - } - _ => raw_receiver.clone(), - }; - let receiver_field = match (*receiver.expr_data.clone()).clone() { - ExprData::ExprFieldAccess { .. } => { - let base = field_access_base(receiver.clone()); - let fname = field_access_field_at( - receiver.clone(), - ctx.type_env.clone().source_indices.clone(), - ); - match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let bname = expr_var_name_at( - base.clone(), - ctx.type_env.clone().source_indices.clone(), - ); - let base_type = match v2_rt::map_get( - &ctx.param_names.clone(), - bname.clone(), - ) { - Some(t) => t.clone(), - None => match v2_rt::map_get( - &ctx.sub_value_vars.clone(), - bname.clone(), - ) { - Some(rel) => match (*rel.clone()).clone() { - SubValueRelation::StrictSubValue { - field: f, - .. - } => f.element_type.clone(), - SubValueRelation::IteratedSubValue { - field: f, - .. - } => f.element_type.clone(), - _ => "".to_string(), - }, - None => "".to_string(), - }, - }; - if (base_type.clone().as_str() != "".to_string().as_str()) { - Rc::new({ - let mut __result = Vec::new(); - for f in inductive_fields_for( - ctx.type_env.clone(), - base_type.clone(), - ) - .iter() - .cloned() - { - if (f.field_name.clone().as_str() - == fname.clone().as_str()) - { - __result.push(f); - } - } - __result - }) - .first() - .cloned() - } else { - None - } - } - _ => None, - } - } - ExprData::ExprVar { .. } => { - let rname = expr_var_name_at( - receiver.clone(), - ctx.type_env.clone().source_indices.clone(), - ); - match v2_rt::map_get(&ctx.sub_value_vars.clone(), rname) { - Some(rel) => match (*rel.clone()).clone() { - SubValueRelation::StrictSubValue { field: f, .. } => { - match f.shape.clone() { - RecursionShape::ListRecursion => Some(f.clone()), - _ => None, - } - } - SubValueRelation::IteratedSubValue { field: f, .. } => { - match f.shape.clone() { - RecursionShape::ListRecursion => Some(f.clone()), - _ => None, - } - } - _ => None, - }, - None => None, - } - } - _ => None, - }; - let method_args = method_arg_nodes(body.clone()); - let lambda_arg = Rc::new({ - let mut __result = Vec::new(); - for a in method_args.iter().cloned() { - if match (*arg_value(&a).expr_data.clone()).clone() { - ExprData::ExprLambda => true, - _ => false, - } { - __result.push(a); - } - } - __result - }) - .first() - .cloned(); - let lambda_elem_info = match lambda_arg { - Some(la) => { - let lambda_node = arg_value(&la); - let lparams = lambda_param_names_at( - lambda_node, - ctx.type_env.clone().source_indices.clone(), - ); - lparams - .clone() - .get(elem_position.clone().unwrap() as usize) - .cloned() - } - None => None, - }; - let is_fold = (elem_position.clone().unwrap() > 0); - let inner_ctx = match lambda_elem_info { - Some(elem_name) => match receiver_field { - Some(ind_field) => Rc::new(DescentContext { - fn_name: ctx.fn_name.clone(), - param_names: v2_rt::rc_map_insert( - ctx.param_names.clone(), - elem_name.clone(), - ind_field.element_type.clone(), - ), - param_order: ctx.param_order.clone(), - type_env: ctx.type_env.clone(), - sub_value_vars: if is_fold { - v2_rt::rc_map_insert( - v2_rt::rc_empty_map::>(), - elem_name.clone(), - Rc::new(SubValueRelation::IteratedSubValue { - field: ind_field.clone(), - }), - ) - } else { - v2_rt::rc_map_insert( - ctx.sub_value_vars.clone(), - elem_name.clone(), - Rc::new(SubValueRelation::IteratedSubValue { - field: ind_field.clone(), - }), - ) - }, - size_aliases: ctx.size_aliases.clone(), - scope_locals: ctx.scope_locals.clone(), - func_sigs: ctx.func_sigs.clone(), - per_field_vars: ctx.per_field_vars.clone(), - }), - None => Rc::new(DescentContext { - fn_name: ctx.fn_name.clone(), - param_names: ctx.param_names.clone(), - param_order: ctx.param_order.clone(), - type_env: ctx.type_env.clone(), - sub_value_vars: if is_fold { - v2_rt::rc_empty_map::>() - } else { - ctx.sub_value_vars.clone() - }, - size_aliases: ctx.size_aliases.clone(), - scope_locals: ctx.scope_locals.clone(), - func_sigs: ctx.func_sigs.clone(), - per_field_vars: ctx.per_field_vars.clone(), - }), - }, - None => ctx.clone(), - }; - let annotated_receiver = - annotate_descent(&method_receiver(body.clone()), &ctx); - let annotated_args = Rc::new({ - let mut __result = Vec::new(); - for arg_node in method_arg_nodes(body.clone()).iter().cloned() { - __result.push({ - let arg_val = arg_value(&arg_node); - let is_lambda = match (*arg_val.expr_data.clone()).clone() { - ExprData::ExprLambda => true, - _ => false, - }; - if is_lambda.clone() { - make_arg_node( - match arg_name_at( - arg_node.clone(), - ctx.type_env.clone().source_indices.clone(), - ) { - Some(n) => Some(n.clone()), - None => None, - }, - annotate_descent(&arg_val, &inner_ctx), - arg_node.span.clone(), - arg_node.span.clone(), - ) - } else { - make_arg_node( - match arg_name_at( - arg_node.clone(), - ctx.type_env.clone().source_indices.clone(), - ) { - Some(n) => Some(n.clone()), - None => None, - }, - annotate_descent(&arg_val, &ctx), - arg_node.span.clone(), - arg_node.span.clone(), - ) - } - }); - } - __result - }); - Rc::new(Node { - name: body.name.clone(), - span: body.span.clone(), - ident_span: body.ident_span.clone(), - children: v2_rt::concat( - Rc::new(vec![annotated_receiver]), - annotated_args, - ), - connective: body.connective.clone(), - params: body.params.clone(), - inferred: body.inferred.clone(), - return_cardinality: body.return_cardinality.clone(), - uses: body.uses.clone(), - body: body.body.clone(), - transport: body.transport.clone(), - properties: body.properties.clone(), - type_annotation: body.type_annotation.clone(), - is_self_recursive: body.is_self_recursive.clone(), - has_non_tail_self_call: body.has_non_tail_self_call.clone(), - match_pattern: body.match_pattern.clone(), - expr_data: body.expr_data.clone(), - ident: None, - }) - } - } else { - map_children(&body, |child| annotate_descent(&child, &ctx)) - } - } - ExprData::ExprForEach => { - let coll = foreach_collection(body.clone()); - let fe_body = foreach_body(body.clone()); - let fe_var = - foreach_variable_at(body.clone(), ctx.type_env.clone().source_indices.clone()); - let coll_field = resolve_collection_field(coll.clone(), ctx.clone()); - let inner_ctx = match coll_field { - Some(ind_field) => Rc::new(DescentContext { - fn_name: ctx.fn_name.clone(), - param_names: v2_rt::rc_map_insert( - ctx.param_names.clone(), - fe_var.clone(), - ind_field.element_type.clone(), - ), - param_order: ctx.param_order.clone(), - type_env: ctx.type_env.clone(), - sub_value_vars: v2_rt::rc_map_insert( - v2_rt::rc_empty_map::>(), - fe_var.clone(), - Rc::new(SubValueRelation::IteratedSubValue { - field: ind_field.clone(), - }), - ), - size_aliases: ctx.size_aliases.clone(), - scope_locals: ctx.scope_locals.clone(), - func_sigs: ctx.func_sigs.clone(), - per_field_vars: ctx.per_field_vars.clone(), - }), - None => Rc::new(DescentContext { - fn_name: ctx.fn_name.clone(), - param_names: ctx.param_names.clone(), - param_order: ctx.param_order.clone(), - type_env: ctx.type_env.clone(), - sub_value_vars: v2_rt::rc_empty_map::>(), - size_aliases: ctx.size_aliases.clone(), - scope_locals: ctx.scope_locals.clone(), - func_sigs: ctx.func_sigs.clone(), - per_field_vars: ctx.per_field_vars.clone(), - }), - }; - let annotated_coll = annotate_descent(&coll, &ctx); - let annotated_body = annotate_descent(&fe_body, &inner_ctx); - Rc::new(Node { - name: body.name.clone(), - span: body.span.clone(), - ident_span: body.ident_span.clone(), - children: Rc::new(vec![annotated_coll, annotated_body.clone()]), - connective: body.connective.clone(), - params: body.params.clone(), - inferred: body.inferred.clone(), - return_cardinality: body.return_cardinality.clone(), - uses: body.uses.clone(), - body: body.body.clone(), - transport: body.transport.clone(), - properties: body.properties.clone(), - type_annotation: body.type_annotation.clone(), - is_self_recursive: body.is_self_recursive.clone(), - has_non_tail_self_call: body.has_non_tail_self_call.clone(), - match_pattern: body.match_pattern.clone(), - expr_data: body.expr_data.clone(), - ident: None, - }) - } - _ => map_children(&body, |child| annotate_descent(&child, &ctx)), - } +let annotated_coll = annotate_descent(&coll, &ctx); +let annotated_body = annotate_descent(&fe_body, &inner_ctx); +Rc::new(Node { + name: body.name.clone(), + span: body.span.clone(), + ident_span: body.ident_span.clone(), + children: Rc::new(vec![annotated_coll, annotated_body.clone()]), + connective: body.connective.clone(), + params: body.params.clone(), + inferred: body.inferred.clone(), + return_cardinality: body.return_cardinality.clone(), + uses: body.uses.clone(), + body: body.body.clone(), + transport: body.transport.clone(), + properties: body.properties.clone(), + type_annotation: body.type_annotation.clone(), + is_self_recursive: body.is_self_recursive.clone(), + has_non_tail_self_call: body.has_non_tail_self_call.clone(), + match_pattern: body.match_pattern.clone(), + expr_data: body.expr_data.clone(), + ident: None, +}) +}, + _ => map_children(&body, |child| annotate_descent(&child, &ctx)), +} }) } -pub fn resolved_type_name( - n: &Rc, - source_indices: Rc>>, -) -> String { +pub fn resolved_type_name(n: &Rc, source_indices: Rc>>) -> String { match n.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => authored_name_at(source_indices, &rt), - _ => match n.children.clone().first().cloned() { - Some(c) => authored_name_at(source_indices, &c), - None => "".to_string(), - }, - } + Some(InferredNode::Resolved { node: rt, .. }) => authored_name_at(source_indices, &rt), + _ => match n.children.clone().first().cloned() { + Some(c) => authored_name_at(source_indices, &c), + None => "".to_string(), +}, +} } -pub fn infer_output_provenance( - body: &Rc, - params: &Rc>>, - type_env: &Rc, - scope_locals: Rc>>, - func_sigs: &Rc>>, -) -> Rc>>>> { +pub fn infer_output_provenance(body: &Rc, params: &Rc>>, type_env: &Rc, scope_locals: Rc>>, func_sigs: &Rc>>) -> Rc>>>> { { - let param_names = Rc::new({ - let mut __result = Vec::new(); - for p in params.clone().iter().cloned() { - __result.push(param_node_name_at( - p.clone(), - type_env.source_indices.clone(), - )); + let param_names = Rc::new({ let mut __result = Vec::new(); for p in params.clone().iter().cloned() { __result.push(param_node_name_at(p.clone(), type_env.source_indices.clone())); } __result }); +let param_types = params.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, p: Rc| { + let pname = param_node_name_at(p.clone(), type_env.source_indices.clone()); +let ptype = resolved_type_name(&p, type_env.source_indices.clone()); +if ((pname.clone().as_str() != "".to_string().as_str()) && (ptype.clone().as_str() != "".to_string().as_str())) { + v2_rt::rc_map_insert(acc.clone(), pname.clone(), ptype.clone()) + } else { + acc.clone() } - __result - }); - let param_types = params.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, p: Rc| { - let pname = param_node_name_at(p.clone(), type_env.source_indices.clone()); - let ptype = resolved_type_name(&p, type_env.source_indices.clone()); - if ((pname.clone().as_str() != "".to_string().as_str()) - && (ptype.clone().as_str() != "".to_string().as_str())) - { - v2_rt::rc_map_insert(acc.clone(), pname.clone(), ptype.clone()) - } else { - acc.clone() - } - }, - ); - let scalar = classify_body_provenance( - &body, - ¶m_names, - ¶m_types, - &type_env, - &func_sigs, - &v2_rt::rc_empty_map::>>>(), - ); - if ((Rc::new(v2_rt::map_keys(&scalar)).len() as i64) > 0) { +}); +let scalar = classify_body_provenance(&body, ¶m_names, ¶m_types, &type_env, &func_sigs, &v2_rt::rc_empty_map::>>>()); +if ((Rc::new(v2_rt::map_keys(&scalar)).len() as i64) > 0) { Rc::new(vec![scalar.clone()]) } else { { - let per_field = classify_body_per_field( - body.clone(), - param_names.clone(), - param_types.clone(), - &type_env, - func_sigs.clone(), - v2_rt::rc_empty_map::>>>(), - ); - if (((per_field.clone().len() as i64) > 0) && { - let mut __found = false; - for m in per_field.clone().iter().cloned() { - if ((Rc::new(v2_rt::map_keys(&m)).len() as i64) > 0) { - __found = true; - break; - } - } - __found - }) { + let per_field = classify_body_per_field(body.clone(), param_names.clone(), param_types.clone(), &type_env, func_sigs.clone(), v2_rt::rc_empty_map::>>>()); +if (((per_field.clone().len() as i64) > 0) && { let mut __found = false; for m in per_field.clone().iter().cloned() { if ((Rc::new(v2_rt::map_keys(&m)).len() as i64) > 0) { __found = true; break; } } __found }) { per_field.clone() } else { Rc::new(vec![]) } - } +} } - } +} } -pub fn classify_body_provenance( - expr: &Rc, - param_names: &Rc>, - param_types: &Rc>, - type_env: &Rc, - func_sigs: &Rc>>, - let_prov: &Rc>>>>, -) -> Rc>> { +pub fn classify_body_provenance(expr: &Rc, param_names: &Rc>, param_types: &Rc>, type_env: &Rc, func_sigs: &Rc>>, let_prov: &Rc>>>>) -> Rc>> { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*expr.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let vname = expr_var_name_at(expr.clone(), type_env.source_indices.clone()); - match v2_rt::map_get(&let_prov, vname.clone()) { - Some(prov) => prov.clone(), - None => { - if { - let mut __found = false; - for pn in param_names.clone().iter().cloned() { - if (pn.clone().as_str() == vname.clone().as_str()) { - __found = true; - break; - } - } - __found - } { - v2_rt::rc_map_insert( - v2_rt::rc_empty_map::>(), - vname.clone(), - Rc::new(SubValueRelation::PreservedValue), - ) - } else { - v2_rt::rc_empty_map::>() - } - } - } - } - ExprData::ExprFieldAccess { .. } => { - let base = field_access_base(expr.clone()); - let field = field_access_field_at(expr.clone(), type_env.source_indices.clone()); - let base_prov = classify_body_provenance( - &base, - ¶m_names, - ¶m_types, - &type_env, - &func_sigs, - &let_prov, - ); - Rc::new(v2_rt::map_keys(&base_prov)).iter().cloned().fold( - v2_rt::rc_empty_map::>(), - |acc: Rc>>, pname: String| { - match v2_rt::map_get(&base_prov, pname.clone()) { - Some(base_rel) => { - let type_for_lookup = match (*base_rel.clone()).clone() { - SubValueRelation::PreservedValue => { - match v2_rt::map_get(¶m_types, pname.clone()) { - Some(t) => t.clone(), - None => "".to_string(), - } - } - SubValueRelation::StrictSubValue { field: f, .. } => { - f.element_type.clone() - } - SubValueRelation::IteratedSubValue { field: f, .. } => { - f.element_type.clone() - } - _ => "".to_string(), - }; - if (type_for_lookup.clone().as_str() != "".to_string().as_str()) { - { - let fields = inductive_fields_for( - type_env.clone(), - type_for_lookup.clone(), - ); - let matching = Rc::new({ - let mut __result = Vec::new(); - for f in fields.clone().iter().cloned() { - if (f.field_name.clone().as_str() - == field.clone().as_str()) - { - __result.push(f); - } - } - __result - }) - .first() - .cloned(); - match matching.clone() { - Some(ind_field) => v2_rt::rc_map_insert( - acc.clone(), - pname.clone(), - compose_sub_value( - base_rel.clone(), - ind_field.clone(), - ), - ), - None => acc.clone(), - } - } - } else { - acc.clone() - } - } - None => acc.clone(), - } - }, - ) - } - ExprData::ExprCall { .. } => { - let callee = expr_call_func_at(expr.clone(), type_env.source_indices.clone()); - compose_callee_provenance( - callee, - call_args_by_name(expr.clone(), type_env.source_indices.clone()), - param_names.clone(), - param_types.clone(), - type_env.clone(), - &func_sigs, - let_prov.clone(), - ) - } - ExprData::ExprMethodCall { - method_semantics: ms, - .. - } => { - let mname = expr_method_name_at(expr.clone(), type_env.source_indices.clone()); - let callee_result = compose_callee_provenance( - mname.clone(), - method_call_args_by_name( - &expr, - func_sigs.clone(), - &type_env.source_indices.clone(), - ), - param_names.clone(), - param_types.clone(), - type_env.clone(), - &func_sigs, - let_prov.clone(), - ); - if ((Rc::new(v2_rt::map_keys(&callee_result)).len() as i64) > 0) { - callee_result.clone() - } else { + ExprData::ExprVar { .. } => { + let vname = expr_var_name_at(expr.clone(), type_env.source_indices.clone()); +match v2_rt::map_get(&let_prov, vname.clone()) { + Some(prov) => prov.clone(), + None => if { let mut __found = false; for pn in param_names.clone().iter().cloned() { if (pn.clone().as_str() == vname.clone().as_str()) { __found = true; break; } } __found } { + v2_rt::rc_map_insert(v2_rt::rc_empty_map::>(), vname.clone(), Rc::new(SubValueRelation::PreservedValue)) + } else { + v2_rt::rc_empty_map::>() + }, +} +}, + ExprData::ExprFieldAccess { .. } => { + let base = field_access_base(expr.clone()); +let field = field_access_field_at(expr.clone(), type_env.source_indices.clone()); +let base_prov = classify_body_provenance(&base, ¶m_names, ¶m_types, &type_env, &func_sigs, &let_prov); +Rc::new(v2_rt::map_keys(&base_prov)).iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, pname: String| match v2_rt::map_get(&base_prov, pname.clone()) { + Some(base_rel) => { + let type_for_lookup = match (*base_rel.clone()).clone() { + SubValueRelation::PreservedValue => match v2_rt::map_get(¶m_types, pname.clone()) { + Some(t) => t.clone(), + None => "".to_string(), +}, + SubValueRelation::StrictSubValue { field: f, .. } => f.element_type.clone(), + SubValueRelation::IteratedSubValue { field: f, .. } => f.element_type.clone(), + _ => "".to_string(), +}; +if (type_for_lookup.clone().as_str() != "".to_string().as_str()) { { - let is_shrink = match ms.clone().as_deref().cloned() { - Some(MethodSemantics::AlgebraMethodSemantics { - size_effect: se, - .. - }) => match se.clone() { - Some(CollectionSizeEffect::ShrinkEffect) => true, - _ => false, - }, - _ => false, - }; - if (is_shrink - && match method_arg_nodes(expr.clone()).first().cloned() { - Some(arg_node) => match (*arg_value(&arg_node).expr_data.clone()) - .clone() - { - ExprData::ExprLiteral { ref value, .. } => { - let LiteralValue::LitInt { value: n, .. } = value.as_ref() - else { - unreachable!() - }; - (n.clone() > 0) - } - _ => false, - }, - None => false, - }) + let fields = inductive_fields_for(type_env.clone(), type_for_lookup.clone()); +let matching = Rc::new({ let mut __result = Vec::new(); for f in fields.clone().iter().cloned() { if (f.field_name.clone().as_str() == field.clone().as_str()) { __result.push(f); } } __result }).first().cloned(); +match matching.clone() { + Some(ind_field) => v2_rt::rc_map_insert(acc.clone(), pname.clone(), compose_sub_value(base_rel.clone(), ind_field.clone())), + None => acc.clone(), +} +} + } else { + acc.clone() + } +}, + None => acc.clone(), +}) +}, + ExprData::ExprCall { .. } => { + let callee = expr_call_func_at(expr.clone(), type_env.source_indices.clone()); +compose_callee_provenance(callee, call_args_by_name(expr.clone(), type_env.source_indices.clone()), param_names.clone(), param_types.clone(), type_env.clone(), &func_sigs, let_prov.clone()) +}, + ExprData::ExprMethodCall { method_semantics: ms, .. } => { + let mname = expr_method_name_at(expr.clone(), type_env.source_indices.clone()); +let callee_result = compose_callee_provenance(mname.clone(), method_call_args_by_name(&expr, func_sigs.clone(), &type_env.source_indices.clone()), param_names.clone(), param_types.clone(), type_env.clone(), &func_sigs, let_prov.clone()); +if ((Rc::new(v2_rt::map_keys(&callee_result)).len() as i64) > 0) { + callee_result.clone() + } else { + { + let is_shrink = match ms.clone().as_deref().cloned() { + Some(MethodSemantics::AlgebraMethodSemantics { size_effect: se, .. }) => match se.clone() { + Some(CollectionSizeEffect::ShrinkEffect) => true, + _ => false, +}, + _ => false, +}; +if (is_shrink && match method_arg_nodes(expr.clone()).first().cloned() { + Some(arg_node) => match (*arg_value(&arg_node).expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitInt { value: n, .. } = value.as_ref() else { unreachable!() }; (n.clone() > 0) }, + _ => false, +}, + None => false, +}) { { - { - let recv = method_receiver(expr.clone()); - let recv_prov = classify_body_provenance( - &recv, - ¶m_names, - ¶m_types, - &type_env, - &func_sigs, - &let_prov, - ); - Rc::new(v2_rt::map_keys(&recv_prov)).iter().cloned().fold( - v2_rt::rc_empty_map::>(), - |acc: Rc>>, - pname: String| { - match v2_rt::map_get(&recv_prov, pname.clone()) { - Some(recv_rel) => { - let synth_field = Rc::new(InductiveField { - type_name: pname.clone(), - variant_name: "".to_string(), - field_name: mname.clone(), - shape: RecursionShape::ListRecursion, - element_type: pname.clone(), - }); - v2_rt::rc_map_insert( - acc.clone(), - pname.clone(), - compose_sub_value( - recv_rel.clone(), - synth_field.clone(), - ), - ) - } - None => acc.clone(), - } - }, - ) - } - } else { - v2_rt::rc_empty_map::>() - } + let recv = method_receiver(expr.clone()); +let recv_prov = classify_body_provenance(&recv, ¶m_names, ¶m_types, &type_env, &func_sigs, &let_prov); +Rc::new(v2_rt::map_keys(&recv_prov)).iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, pname: String| match v2_rt::map_get(&recv_prov, pname.clone()) { + Some(recv_rel) => { + let synth_field = Rc::new(InductiveField { + type_name: pname.clone(), + variant_name: "".to_string(), + field_name: mname.clone(), + shape: RecursionShape::ListRecursion, + element_type: pname.clone(), +}); +v2_rt::rc_map_insert(acc.clone(), pname.clone(), compose_sub_value(recv_rel.clone(), synth_field.clone())) +}, + None => acc.clone(), +}) +} + } else { + v2_rt::rc_empty_map::>() } - } +} } - ExprData::ExprMatch => { - let scrut = match_scrutinee(expr.clone()); - let scrut_prov = classify_body_provenance( - &scrut, - ¶m_names, - ¶m_types, - &type_env, - &func_sigs, - &let_prov, - ); - let arms = match_arm_nodes(expr.clone()); - let arm_provs = Rc::new({ - let mut __result = Vec::new(); - for arm in arms.iter().cloned() { - __result.push({ +}, + ExprData::ExprMatch => { + let scrut = match_scrutinee(expr.clone()); +let scrut_prov = classify_body_provenance(&scrut, ¶m_names, ¶m_types, &type_env, &func_sigs, &let_prov); +let arms = match_arm_nodes(expr.clone()); +let arm_provs = Rc::new({ let mut __result = Vec::new(); for arm in arms.iter().cloned() { __result.push({ let arm_let_prov = match (*arm_pattern(arm.clone())).clone() { MatchPattern::VariantPattern { name: vname, field_bindings: bindings, .. } => bindings.clone().iter().cloned().fold(let_prov.clone(), |acc: Rc>>>>, binding: Rc| { let field_label = field_binding_name_at(binding.clone(), type_env.source_indices.clone()); @@ -7578,141 +4471,64 @@ v2_rt::rc_map_insert(acc.clone(), bind_name.clone(), field_prov.clone()) _ => let_prov.clone(), }; classify_body_provenance(&arm_body(&arm), ¶m_names, ¶m_types, &type_env, &func_sigs, &arm_let_prov) +}); } __result }); +meet_body_provenance_maps(&arm_provs) +}, + ExprData::ExprIf => { + let then_prov = classify_body_provenance(&if_then_branch(expr.clone()), ¶m_names, ¶m_types, &type_env, &func_sigs, &let_prov); +match if_else_branch(expr.clone()) { + Some(else_expr) => { + let else_prov = classify_body_provenance(&else_expr, ¶m_names, ¶m_types, &type_env, &func_sigs, &let_prov); +meet_body_provenance_maps(&Rc::new(vec![then_prov, else_prov])) +}, + None => then_prov, +} +}, + ExprData::ExprLet => { + let value = let_value(expr.clone()); +let bname = let_binding_name_at(expr.clone(), type_env.source_indices.clone()); +let value_prov = classify_body_provenance(&value, ¶m_names, ¶m_types, &type_env, &func_sigs, &let_prov); +let updated = v2_rt::rc_map_insert(let_prov.clone(), bname.clone(), value_prov.clone()); +match let_body(expr.clone()) { + Some(body) => classify_body_provenance(&body, ¶m_names, ¶m_types, &type_env, &func_sigs, &updated), + None => v2_rt::rc_empty_map::>(), +} +}, + ExprData::ExprBlock => { + let block_result = expr.children.clone().iter().cloned().fold(Rc::new(BlockProvFoldState { + prov: let_prov.clone(), + last: empty_prov_map(), +}), |state: Rc, stmt: Rc| match (*stmt.expr_data.clone()).clone() { + ExprData::ExprLet => { + let bname = let_binding_name_at(stmt.clone(), type_env.source_indices.clone()); +let value = let_value(stmt.clone()); +let value_prov = classify_body_provenance(&value, ¶m_names, ¶m_types, &type_env, &func_sigs, &state.prov.clone()); +let updated_prov = v2_rt::rc_map_insert(state.prov.clone(), bname.clone(), value_prov.clone()); +match let_body(stmt.clone()) { + Some(body) => Rc::new(BlockProvFoldState { + prov: state.prov.clone(), + last: classify_body_provenance(&body, ¶m_names, ¶m_types, &type_env, &func_sigs, &updated_prov), +}), + None => Rc::new(BlockProvFoldState { + prov: updated_prov.clone(), + last: value_prov.clone(), +}), +} +}, + _ => Rc::new(BlockProvFoldState { + prov: state.prov.clone(), + last: classify_body_provenance(&stmt, ¶m_names, ¶m_types, &type_env, &func_sigs, &state.prov.clone()), +}), }); - } - __result - }); - meet_body_provenance_maps(&arm_provs) - } - ExprData::ExprIf => { - let then_prov = classify_body_provenance( - &if_then_branch(expr.clone()), - ¶m_names, - ¶m_types, - &type_env, - &func_sigs, - &let_prov, - ); - match if_else_branch(expr.clone()) { - Some(else_expr) => { - let else_prov = classify_body_provenance( - &else_expr, - ¶m_names, - ¶m_types, - &type_env, - &func_sigs, - &let_prov, - ); - meet_body_provenance_maps(&Rc::new(vec![then_prov, else_prov])) - } - None => then_prov, - } - } - ExprData::ExprLet => { - let value = let_value(expr.clone()); - let bname = let_binding_name_at(expr.clone(), type_env.source_indices.clone()); - let value_prov = classify_body_provenance( - &value, - ¶m_names, - ¶m_types, - &type_env, - &func_sigs, - &let_prov, - ); - let updated = - v2_rt::rc_map_insert(let_prov.clone(), bname.clone(), value_prov.clone()); - match let_body(expr.clone()) { - Some(body) => classify_body_provenance( - &body, - ¶m_names, - ¶m_types, - &type_env, - &func_sigs, - &updated, - ), - None => v2_rt::rc_empty_map::>(), - } - } - ExprData::ExprBlock => { - let block_result = expr.children.clone().iter().cloned().fold( - Rc::new(BlockProvFoldState { - prov: let_prov.clone(), - last: empty_prov_map(), - }), - |state: Rc, stmt: Rc| match (*stmt.expr_data.clone()) - .clone() - { - ExprData::ExprLet => { - let bname = - let_binding_name_at(stmt.clone(), type_env.source_indices.clone()); - let value = let_value(stmt.clone()); - let value_prov = classify_body_provenance( - &value, - ¶m_names, - ¶m_types, - &type_env, - &func_sigs, - &state.prov.clone(), - ); - let updated_prov = v2_rt::rc_map_insert( - state.prov.clone(), - bname.clone(), - value_prov.clone(), - ); - match let_body(stmt.clone()) { - Some(body) => Rc::new(BlockProvFoldState { - prov: state.prov.clone(), - last: classify_body_provenance( - &body, - ¶m_names, - ¶m_types, - &type_env, - &func_sigs, - &updated_prov, - ), - }), - None => Rc::new(BlockProvFoldState { - prov: updated_prov.clone(), - last: value_prov.clone(), - }), - } - } - _ => Rc::new(BlockProvFoldState { - prov: state.prov.clone(), - last: classify_body_provenance( - &stmt, - ¶m_names, - ¶m_types, - &type_env, - &func_sigs, - &state.prov.clone(), - ), - }), - }, - ); - block_result.last.clone() - } - ExprData::ExprCast => classify_body_provenance( - &cast_expr(expr.clone()), - ¶m_names, - ¶m_types, - &type_env, - &func_sigs, - &let_prov, - ), - ExprData::ExprReturn => match expr.children.clone().first().cloned() { - Some(inner) => classify_body_provenance( - &inner, - ¶m_names, - ¶m_types, - &type_env, - &func_sigs, - &let_prov, - ), - None => v2_rt::rc_empty_map::>(), - }, - _ => v2_rt::rc_empty_map::>(), - } +block_result.last.clone() +}, + ExprData::ExprCast => classify_body_provenance(&cast_expr(expr.clone()), ¶m_names, ¶m_types, &type_env, &func_sigs, &let_prov), + ExprData::ExprReturn => match expr.children.clone().first().cloned() { + Some(inner) => classify_body_provenance(&inner, ¶m_names, ¶m_types, &type_env, &func_sigs, &let_prov), + None => v2_rt::rc_empty_map::>(), +}, + _ => v2_rt::rc_empty_map::>(), +} }) } @@ -7722,275 +4538,112 @@ pub struct BlockProvFoldState { pub last: Rc>>, } -pub fn call_args_by_name( - call: Rc, - source_indices: Rc>>, -) -> Rc>> { - call.children.clone().iter().cloned().fold( - v2_rt::rc_empty_map::>(), - |acc: Rc>>, arg_node: Rc| match arg_name_at( - arg_node.clone(), - source_indices.clone(), - ) { - Some(aname) => v2_rt::rc_map_insert(acc.clone(), aname.clone(), arg_value(&arg_node)), - None => acc.clone(), - }, - ) +pub fn call_args_by_name(call: Rc, source_indices: Rc>>) -> Rc>> { + call.children.clone().iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, arg_node: Rc| match arg_name_at(arg_node.clone(), source_indices.clone()) { + Some(aname) => v2_rt::rc_map_insert(acc.clone(), aname.clone(), arg_value(&arg_node)), + None => acc.clone(), +}) } -pub fn method_call_args_by_name( - call: &Rc, - func_sigs: Rc>>, - source_indices: &Rc>>, -) -> Rc>> { +pub fn method_call_args_by_name(call: &Rc, func_sigs: Rc>>, source_indices: &Rc>>) -> Rc>> { { let mname = expr_method_name_at(call.clone(), source_indices.clone()); - let recv = method_receiver(call.clone()); - let mc_args = method_arg_nodes(call.clone()); - let base = match v2_rt::map_get(&func_sigs, mname) { - Some(sig) => match sig.params.clone().first().cloned() { - Some(first_p) => { - let first_pname = param_node_name_at(first_p.clone(), source_indices.clone()); - if (first_pname.clone().as_str() != "".to_string().as_str()) { - v2_rt::rc_map_insert( - v2_rt::rc_empty_map::>(), - first_pname.clone(), - recv, - ) - } else { - v2_rt::rc_empty_map::>() - } - } - None => v2_rt::rc_empty_map::>(), - }, - None => v2_rt::rc_empty_map::>(), - }; - mc_args.iter().cloned().fold( - base, - |acc: Rc>>, arg_node: Rc| match arg_name_at( - arg_node.clone(), - source_indices.clone(), - ) { - Some(aname) => { - v2_rt::rc_map_insert(acc.clone(), aname.clone(), arg_value(&arg_node)) - } - None => acc.clone(), - }, - ) - } +let recv = method_receiver(call.clone()); +let mc_args = method_arg_nodes(call.clone()); +let base = match v2_rt::map_get(&func_sigs, mname) { + Some(sig) => match sig.params.clone().first().cloned() { + Some(first_p) => { + let first_pname = param_node_name_at(first_p.clone(), source_indices.clone()); +if (first_pname.clone().as_str() != "".to_string().as_str()) { + v2_rt::rc_map_insert(v2_rt::rc_empty_map::>(), first_pname.clone(), recv) + } else { + v2_rt::rc_empty_map::>() + } +}, + None => v2_rt::rc_empty_map::>(), +}, + None => v2_rt::rc_empty_map::>(), +}; +mc_args.iter().cloned().fold(base, |acc: Rc>>, arg_node: Rc| match arg_name_at(arg_node.clone(), source_indices.clone()) { + Some(aname) => v2_rt::rc_map_insert(acc.clone(), aname.clone(), arg_value(&arg_node)), + None => acc.clone(), +}) +} } -pub fn compose_callee_provenance( - callee: String, - arg_by_name: Rc>>, - param_names: Rc>, - param_types: Rc>, - type_env: Rc, - func_sigs: &Rc>>, - let_prov: Rc>>>>, -) -> Rc>> { +pub fn compose_callee_provenance(callee: String, arg_by_name: Rc>>, param_names: Rc>, param_types: Rc>, type_env: Rc, func_sigs: &Rc>>, let_prov: Rc>>>>) -> Rc>> { match v2_rt::map_get(&func_sigs, callee) { - Some(sig) => match sig.output_provenance.clone().first().cloned() { - Some(callee_prov) => Rc::new(v2_rt::map_keys(&callee_prov)).iter().cloned().fold( - v2_rt::rc_empty_map::>(), - |acc: Rc>>, callee_pname: String| { - match v2_rt::map_get(&callee_prov, callee_pname.clone()) { - Some(callee_rel) => { - match v2_rt::map_get(&arg_by_name, callee_pname.clone()) { - Some(arg) => { - let arg_prov = classify_body_provenance( - &arg, - ¶m_names, - ¶m_types, - &type_env, - &func_sigs, - &let_prov, - ); - Rc::new(v2_rt::map_keys(&arg_prov)).iter().cloned().fold( - acc.clone(), - |inner: Rc>>, - pname: String| { - match v2_rt::map_get(&arg_prov, pname.clone()) { - Some(arg_rel) => { - let composed = compose_sub_value_relations( - arg_rel.clone(), - callee_rel.clone(), - ); - match (*composed.clone()).clone() { - SubValueRelation::SubValueUnknown => { - inner.clone() - } - _ => match v2_rt::map_get( - &inner, - pname.clone(), - ) { - Some(existing) => v2_rt::rc_map_insert( - inner.clone(), - pname.clone(), - meet_sub_value( - existing.clone(), - composed.clone(), - ), - ), - None => v2_rt::rc_map_insert( - inner.clone(), - pname.clone(), - composed.clone(), - ), - }, - } - } - None => inner.clone(), - } - }, - ) - } - None => acc.clone(), - } - } - None => acc.clone(), - } - }, - ), - None => v2_rt::rc_empty_map::>(), - }, - None => v2_rt::rc_empty_map::>(), - } + Some(sig) => match sig.output_provenance.clone().first().cloned() { + Some(callee_prov) => Rc::new(v2_rt::map_keys(&callee_prov)).iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, callee_pname: String| match v2_rt::map_get(&callee_prov, callee_pname.clone()) { + Some(callee_rel) => match v2_rt::map_get(&arg_by_name, callee_pname.clone()) { + Some(arg) => { + let arg_prov = classify_body_provenance(&arg, ¶m_names, ¶m_types, &type_env, &func_sigs, &let_prov); +Rc::new(v2_rt::map_keys(&arg_prov)).iter().cloned().fold(acc.clone(), |inner: Rc>>, pname: String| match v2_rt::map_get(&arg_prov, pname.clone()) { + Some(arg_rel) => { + let composed = compose_sub_value_relations(arg_rel.clone(), callee_rel.clone()); +match (*composed.clone()).clone() { + SubValueRelation::SubValueUnknown => inner.clone(), + _ => match v2_rt::map_get(&inner, pname.clone()) { + Some(existing) => v2_rt::rc_map_insert(inner.clone(), pname.clone(), meet_sub_value(existing.clone(), composed.clone())), + None => v2_rt::rc_map_insert(inner.clone(), pname.clone(), composed.clone()), +}, +} +}, + None => inner.clone(), +}) +}, + None => acc.clone(), +}, + None => acc.clone(), +}), + None => v2_rt::rc_empty_map::>(), +}, + None => v2_rt::rc_empty_map::>(), +} } -pub fn classify_body_per_field( - expr: Rc, - param_names: Rc>, - param_types: Rc>, - type_env: &Rc, - func_sigs: Rc>>, - let_prov: Rc>>>>, -) -> Rc>>>> { +pub fn classify_body_per_field(expr: Rc, param_names: Rc>, param_types: Rc>, type_env: &Rc, func_sigs: Rc>>, let_prov: Rc>>>>) -> Rc>>>> { { let unwrapped = unwrap_body_terminal(&expr, let_prov, type_env.clone()); - let terminal = unwrapped.expr.clone(); - let terminal_prov = unwrapped.let_prov.clone(); - classify_terminal_per_field( - &terminal, - param_names, - param_types, - &type_env, - func_sigs, - terminal_prov, - ) - } +let terminal = unwrapped.expr.clone(); +let terminal_prov = unwrapped.let_prov.clone(); +classify_terminal_per_field(&terminal, param_names, param_types, &type_env, func_sigs, terminal_prov) +} } -pub fn classify_terminal_per_field( - expr: &Rc, - param_names: Rc>, - param_types: Rc>, - type_env: &Rc, - func_sigs: Rc>>, - let_prov: Rc>>>>, -) -> Rc>>>> { +pub fn classify_terminal_per_field(expr: &Rc, param_names: Rc>, param_types: Rc>, type_env: &Rc, func_sigs: Rc>>, let_prov: Rc>>>>) -> Rc>>>> { match (*expr.expr_data.clone()).clone() { - ExprData::ExprRecordLit { .. } => Rc::new({ - let mut __result = Vec::new(); - for fi in expr.children.clone().iter().cloned() { - __result.push(classify_body_provenance( - &field_init_node_value(&fi), - ¶m_names, - ¶m_types, - &type_env, - &func_sigs, - &let_prov, - )); - } - __result - }), - ExprData::ExprMatch => { - let arm_results = Rc::new({ - let mut __result = Vec::new(); - for arm in match_arm_nodes(expr.clone()).iter().cloned() { - __result.push({ - let arm_unwrapped = unwrap_body_terminal( - &arm_body(&arm), - let_prov.clone(), - type_env.clone(), - ); - match (*arm_unwrapped.expr.clone().expr_data.clone()).clone() { - ExprData::ExprRecordLit { .. } => Rc::new({ - let mut __result = Vec::new(); - for fi in - arm_unwrapped.expr.clone().children.clone().iter().cloned() - { - __result.push(classify_body_provenance( - &field_init_node_value(&fi), - ¶m_names, - ¶m_types, - &type_env, - &func_sigs, - &arm_unwrapped.let_prov.clone(), - )); - } - __result - }), - _ => Rc::new(vec![]), - } - }); - } - __result - }); - meet_per_field_results(&arm_results) - } - ExprData::ExprIf => { - let then_unwrapped = unwrap_body_terminal( - &if_then_branch(expr.clone()), - let_prov.clone(), - type_env.clone(), - ); - let then_result = match (*then_unwrapped.expr.clone().expr_data.clone()).clone() { - ExprData::ExprRecordLit { .. } => Rc::new({ - let mut __result = Vec::new(); - for fi in then_unwrapped.expr.clone().children.clone().iter().cloned() { - __result.push(classify_body_provenance( - &field_init_node_value(&fi), - ¶m_names, - ¶m_types, - &type_env, - &func_sigs, - &then_unwrapped.let_prov.clone(), - )); - } - __result - }), - _ => Rc::new(vec![]), - }; - match if_else_branch(expr.clone()) { - Some(else_expr) => { - let else_unwrapped = - unwrap_body_terminal(&else_expr, let_prov.clone(), type_env.clone()); - let else_result = match (*else_unwrapped.expr.clone().expr_data.clone()).clone() - { - ExprData::ExprRecordLit { .. } => Rc::new({ - let mut __result = Vec::new(); - for fi in else_unwrapped.expr.clone().children.clone().iter().cloned() { - __result.push(classify_body_provenance( - &field_init_node_value(&fi), - ¶m_names, - ¶m_types, - &type_env, - &func_sigs, - &else_unwrapped.let_prov.clone(), - )); - } - __result - }), - _ => Rc::new(vec![]), - }; - meet_per_field_results(&Rc::new(vec![then_result, else_result])) - } - None => then_result, - } - } - _ => Rc::new(vec![]), - } + ExprData::ExprRecordLit { .. } => Rc::new({ let mut __result = Vec::new(); for fi in expr.children.clone().iter().cloned() { __result.push(classify_body_provenance(&field_init_node_value(&fi), ¶m_names, ¶m_types, &type_env, &func_sigs, &let_prov)); } __result }), + ExprData::ExprMatch => { + let arm_results = Rc::new({ let mut __result = Vec::new(); for arm in match_arm_nodes(expr.clone()).iter().cloned() { __result.push({ + let arm_unwrapped = unwrap_body_terminal(&arm_body(&arm), let_prov.clone(), type_env.clone()); +match (*arm_unwrapped.expr.clone().expr_data.clone()).clone() { + ExprData::ExprRecordLit { .. } => Rc::new({ let mut __result = Vec::new(); for fi in arm_unwrapped.expr.clone().children.clone().iter().cloned() { __result.push(classify_body_provenance(&field_init_node_value(&fi), ¶m_names, ¶m_types, &type_env, &func_sigs, &arm_unwrapped.let_prov.clone())); } __result }), + _ => Rc::new(vec![]), +} +}); } __result }); +meet_per_field_results(&arm_results) +}, + ExprData::ExprIf => { + let then_unwrapped = unwrap_body_terminal(&if_then_branch(expr.clone()), let_prov.clone(), type_env.clone()); +let then_result = match (*then_unwrapped.expr.clone().expr_data.clone()).clone() { + ExprData::ExprRecordLit { .. } => Rc::new({ let mut __result = Vec::new(); for fi in then_unwrapped.expr.clone().children.clone().iter().cloned() { __result.push(classify_body_provenance(&field_init_node_value(&fi), ¶m_names, ¶m_types, &type_env, &func_sigs, &then_unwrapped.let_prov.clone())); } __result }), + _ => Rc::new(vec![]), +}; +match if_else_branch(expr.clone()) { + Some(else_expr) => { + let else_unwrapped = unwrap_body_terminal(&else_expr, let_prov.clone(), type_env.clone()); +let else_result = match (*else_unwrapped.expr.clone().expr_data.clone()).clone() { + ExprData::ExprRecordLit { .. } => Rc::new({ let mut __result = Vec::new(); for fi in else_unwrapped.expr.clone().children.clone().iter().cloned() { __result.push(classify_body_provenance(&field_init_node_value(&fi), ¶m_names, ¶m_types, &type_env, &func_sigs, &else_unwrapped.let_prov.clone())); } __result }), + _ => Rc::new(vec![]), +}; +meet_per_field_results(&Rc::new(vec![then_result, else_result])) +}, + None => then_result, +} +}, + _ => Rc::new(vec![]), +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -7999,884 +4652,401 @@ pub struct BodyTerminal { pub let_prov: Rc>>>>, } -pub fn unwrap_body_terminal( - expr: &Rc, - let_prov: Rc>>>>, - type_env: Rc, -) -> Rc { +pub fn unwrap_body_terminal(expr: &Rc, let_prov: Rc>>>>, type_env: Rc) -> Rc { match (*expr.expr_data.clone()).clone() { - ExprData::ExprBlock => match expr.children.clone().last().cloned() { - Some(last_stmt) => Rc::new(BodyTerminal { - expr: last_stmt.clone(), - let_prov: let_prov, - }), - None => Rc::new(BodyTerminal { - expr: expr.clone(), - let_prov: let_prov, - }), - }, - _ => Rc::new(BodyTerminal { - expr: expr.clone(), - let_prov: let_prov, - }), - } + ExprData::ExprBlock => match expr.children.clone().last().cloned() { + Some(last_stmt) => Rc::new(BodyTerminal { + expr: last_stmt.clone(), + let_prov: let_prov, +}), + None => Rc::new(BodyTerminal { + expr: expr.clone(), + let_prov: let_prov, +}), +}, + _ => Rc::new(BodyTerminal { + expr: expr.clone(), + let_prov: let_prov, +}), +} } -pub fn meet_per_field_results( - results: &Rc>>>>>>, -) -> Rc>>>> { +pub fn meet_per_field_results(results: &Rc>>>>>>) -> Rc>>>> { match results.clone().first().cloned() { - None => Rc::new(vec![]), - Some(first_result) => { - if ((first_result.clone().len() as i64) == 0) { + None => Rc::new(vec![]), + Some(first_result) => if ((first_result.clone().len() as i64) == 0) { + Rc::new(vec![]) + } else { + { + let all_same_count = { let mut __all = true; for r in results.clone().iter().cloned() { if !(((r.clone().len() as i64) == (first_result.clone().len() as i64))) { __all = false; break; } } __all }; +if !all_same_count { Rc::new(vec![]) } else { - { - let all_same_count = { - let mut __all = true; - for r in results.clone().iter().cloned() { - if !((r.clone().len() as i64) == (first_result.clone().len() as i64)) { - __all = false; - break; - } - } - __all - }; - if !all_same_count { - Rc::new(vec![]) - } else { - Rc::new({ - let mut __result = Vec::new(); - for pair in Rc::new( - first_result - .clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - { - __result.push({ - let idx = pair.0.clone(); - let field_provs = Rc::new({ - let mut __result = Vec::new(); - for r in results.clone().iter().cloned() { - __result.push( - match r.clone().get(idx.clone() as usize).cloned() { - Some(m) => m.clone(), - None => empty_prov_map(), - }, - ); - } - __result - }); - meet_body_provenance_maps(&field_provs) - }); - } - __result - }) - } - } + Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(first_result.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { __result.push({ + let idx = pair.0.clone(); +let field_provs = Rc::new({ let mut __result = Vec::new(); for r in results.clone().iter().cloned() { __result.push(match r.clone().get(idx.clone() as usize).cloned() { + Some(m) => m.clone(), + None => empty_prov_map(), +}); } __result }); +meet_body_provenance_maps(&field_provs) +}); } __result }) } - } - } +} + }, +} } pub fn empty_prov_map() -> Rc>> { v2_rt::rc_empty_map::>() } -pub fn meet_body_provenance_maps( - provs: &Rc>>>>, -) -> Rc>> { +pub fn meet_body_provenance_maps(provs: &Rc>>>>) -> Rc>> { match provs.clone().first().cloned() { - None => empty_prov_map(), - Some(first_prov) => Rc::new( - provs - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ) - .iter() - .cloned() - .fold( - first_prov.clone(), - |acc: Rc>>, - prov: Rc>>| { - intersect_prov_maps(&acc, prov.clone()) - }, - ), - } + None => empty_prov_map(), + Some(first_prov) => Rc::new(provs.clone().iter().cloned().skip(1 as usize).collect::>()).iter().cloned().fold(first_prov.clone(), |acc: Rc>>, prov: Rc>>| intersect_prov_maps(&acc, prov.clone())), +} } -pub fn intersect_prov_maps( - a: &Rc>>, - b: Rc>>, -) -> Rc>> { - Rc::new(v2_rt::map_keys(&a)).iter().cloned().fold( - empty_prov_map(), - |result: Rc>>, key: String| match v2_rt::map_get( - &b, - key.clone(), - ) { - Some(b_rel) => match v2_rt::map_get(&a, key.clone()) { - Some(a_rel) => v2_rt::rc_map_insert( - result.clone(), - key.clone(), - meet_sub_value(a_rel.clone(), b_rel.clone()), - ), - None => result.clone(), - }, - None => result.clone(), - }, - ) +pub fn intersect_prov_maps(a: &Rc>>, b: Rc>>) -> Rc>> { + Rc::new(v2_rt::map_keys(&a)).iter().cloned().fold(empty_prov_map(), |result: Rc>>, key: String| match v2_rt::map_get(&b, key.clone()) { + Some(b_rel) => match v2_rt::map_get(&a, key.clone()) { + Some(a_rel) => v2_rt::rc_map_insert(result.clone(), key.clone(), meet_sub_value(a_rel.clone(), b_rel.clone())), + None => result.clone(), +}, + None => result.clone(), +}) } -pub fn arm_ctx_from_variant_provenance( - arm_node: Rc, - sig: Rc, - scrut: Rc, - ctx: &Rc, -) -> Option> { +pub fn arm_ctx_from_variant_provenance(arm_node: Rc, sig: Rc, scrut: Rc, ctx: &Rc) -> Option> { match (*arm_pattern(arm_node)).clone() { - MatchPattern::VariantPattern { - name: vname, - field_bindings: bindings, - .. - } => match v2_rt::map_get(&sig.variant_provenance.clone(), vname.clone()) { - Some(variant_field_map) => { - let call_args = - call_args_by_name(scrut, ctx.type_env.clone().source_indices.clone()); - let extended = bindings.clone().iter().cloned().fold( - ctx.clone(), - |c: Rc, fb: Rc| { - let field_label = field_binding_name_at( - fb.clone(), - ctx.type_env.clone().source_indices.clone(), - ); - let bind_name = match (*field_binding_pattern(fb.clone())).clone() { - MatchPattern::Bind { name: bn, .. } => bn.clone(), - _ => "".to_string(), - }; - if ((bind_name.clone().as_str() == "".to_string().as_str()) - || (field_label.clone().as_str() == "".to_string().as_str())) - { - c.clone() - } else { - match v2_rt::map_get(&variant_field_map, field_label.clone()) { - Some(param_map) => { - let composed = compose_callee_param_map( - ¶m_map, - call_args.clone(), - c.param_order.clone(), - c.param_names.clone(), - c.type_env.clone(), - c.func_sigs.clone(), - v2_rt::rc_empty_map::< - String, - Rc>>, - >(), - ); - let all_rels = Rc::new({ - let mut __result = Vec::new(); - for k in Rc::new(v2_rt::map_keys(&composed)).iter().cloned() - { - __result.push( - match v2_rt::map_get(&composed, k.clone()) { - Some(r) => r.clone(), - None => { - Rc::new(SubValueRelation::SubValueUnknown) - } - }, - ); - } - __result - }); - let best = merge_argument_relations(&all_rels); - match (*best.clone()).clone() { - SubValueRelation::SubValueUnknown => c.clone(), - _ => Rc::new(DescentContext { - fn_name: c.fn_name.clone(), - param_names: c.param_names.clone(), - param_order: c.param_order.clone(), - type_env: c.type_env.clone(), - sub_value_vars: v2_rt::rc_map_insert( - c.sub_value_vars.clone(), - bind_name.clone(), - best.clone(), - ), - size_aliases: c.size_aliases.clone(), - scope_locals: c.scope_locals.clone(), - func_sigs: c.func_sigs.clone(), - per_field_vars: c.per_field_vars.clone(), - }), - } - } - None => c.clone(), - } - } - }, - ); - Some(extended) + MatchPattern::VariantPattern { name: vname, field_bindings: bindings, .. } => match v2_rt::map_get(&sig.variant_provenance.clone(), vname.clone()) { + Some(variant_field_map) => { + let call_args = call_args_by_name(scrut, ctx.type_env.clone().source_indices.clone()); +let extended = bindings.clone().iter().cloned().fold(ctx.clone(), |c: Rc, fb: Rc| { + let field_label = field_binding_name_at(fb.clone(), ctx.type_env.clone().source_indices.clone()); +let bind_name = match (*field_binding_pattern(fb.clone())).clone() { + MatchPattern::Bind { name: bn, .. } => bn.clone(), + _ => "".to_string(), +}; +if ((bind_name.clone().as_str() == "".to_string().as_str()) || (field_label.clone().as_str() == "".to_string().as_str())) { + c.clone() + } else { + match v2_rt::map_get(&variant_field_map, field_label.clone()) { + Some(param_map) => { + let composed = compose_callee_param_map(¶m_map, call_args.clone(), c.param_order.clone(), c.param_names.clone(), c.type_env.clone(), c.func_sigs.clone(), v2_rt::rc_empty_map::>>>()); +let all_rels = Rc::new({ let mut __result = Vec::new(); for k in Rc::new(v2_rt::map_keys(&composed)).iter().cloned() { __result.push(match v2_rt::map_get(&composed, k.clone()) { + Some(r) => r.clone(), + None => Rc::new(SubValueRelation::SubValueUnknown), +}); } __result }); +let best = merge_argument_relations(&all_rels); +match (*best.clone()).clone() { + SubValueRelation::SubValueUnknown => c.clone(), + _ => Rc::new(DescentContext { + fn_name: c.fn_name.clone(), + param_names: c.param_names.clone(), + param_order: c.param_order.clone(), + type_env: c.type_env.clone(), + sub_value_vars: v2_rt::rc_map_insert(c.sub_value_vars.clone(), bind_name.clone(), best.clone()), + size_aliases: c.size_aliases.clone(), + scope_locals: c.scope_locals.clone(), + func_sigs: c.func_sigs.clone(), + per_field_vars: c.per_field_vars.clone(), +}), +} +}, + None => c.clone(), +} } - None => None, - }, - _ => None, - } +}); +Some(extended) +}, + None => None, +}, + _ => None, +} } -pub fn compose_callee_param_map( - callee_prov: &Rc>>, - arg_by_name: Rc>>, - param_names: Rc>, - param_types: Rc>, - type_env: Rc, - func_sigs: Rc>>, - let_prov: Rc>>>>, -) -> Rc>> { - Rc::new(v2_rt::map_keys(&callee_prov)).iter().cloned().fold( - v2_rt::rc_empty_map::>(), - |acc: Rc>>, callee_pname: String| match v2_rt::map_get( - &callee_prov, - callee_pname.clone(), - ) { - Some(callee_rel) => match v2_rt::map_get(&arg_by_name, callee_pname.clone()) { - Some(arg) => { - let arg_prov = classify_body_provenance( - &arg, - ¶m_names, - ¶m_types, - &type_env, - &func_sigs, - &let_prov, - ); - Rc::new(v2_rt::map_keys(&arg_prov)).iter().cloned().fold( - acc.clone(), - |inner: Rc>>, pname: String| { - match v2_rt::map_get(&arg_prov, pname.clone()) { - Some(arg_rel) => { - let composed = compose_sub_value_relations( - arg_rel.clone(), - callee_rel.clone(), - ); - match (*composed.clone()).clone() { - SubValueRelation::SubValueUnknown => inner.clone(), - _ => v2_rt::rc_map_insert( - inner.clone(), - pname.clone(), - composed.clone(), - ), - } - } - None => inner.clone(), - } - }, - ) - } - None => acc.clone(), - }, - None => acc.clone(), - }, - ) +pub fn compose_callee_param_map(callee_prov: &Rc>>, arg_by_name: Rc>>, param_names: Rc>, param_types: Rc>, type_env: Rc, func_sigs: Rc>>, let_prov: Rc>>>>) -> Rc>> { + Rc::new(v2_rt::map_keys(&callee_prov)).iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, callee_pname: String| match v2_rt::map_get(&callee_prov, callee_pname.clone()) { + Some(callee_rel) => match v2_rt::map_get(&arg_by_name, callee_pname.clone()) { + Some(arg) => { + let arg_prov = classify_body_provenance(&arg, ¶m_names, ¶m_types, &type_env, &func_sigs, &let_prov); +Rc::new(v2_rt::map_keys(&arg_prov)).iter().cloned().fold(acc.clone(), |inner: Rc>>, pname: String| match v2_rt::map_get(&arg_prov, pname.clone()) { + Some(arg_rel) => { + let composed = compose_sub_value_relations(arg_rel.clone(), callee_rel.clone()); +match (*composed.clone()).clone() { + SubValueRelation::SubValueUnknown => inner.clone(), + _ => v2_rt::rc_map_insert(inner.clone(), pname.clone(), composed.clone()), +} +}, + None => inner.clone(), +}) +}, + None => acc.clone(), +}, + None => acc.clone(), +}) } -pub fn compose_output_relations( - arg_rel: Rc, - callee_rel: Rc, -) -> Rc { +pub fn compose_output_relations(arg_rel: Rc, callee_rel: Rc) -> Rc { compose_sub_value_relations(arg_rel, callee_rel) } -pub fn compute_variant_provenance( - body: Rc, - return_type: Rc, - params: &Rc>>, - type_env: &Rc, - func_sigs: Rc>>, -) -> Rc>>>>>> { +pub fn compute_variant_provenance(body: Rc, return_type: Rc, params: &Rc>>, type_env: &Rc, func_sigs: Rc>>) -> Rc>>>>>> { { let rt_name = authored_name_at(type_env.source_indices.clone(), &return_type); - let rt_def = lookup_type_by_name(&type_env, rt_name.clone()); - match rt_def { - Some(def_node) => match def_node.connective.clone() { - Connective::Disj => { - let param_names = Rc::new({ - let mut __result = Vec::new(); - for p in params.clone().iter().cloned() { - __result.push(param_node_name_at( - p.clone(), - type_env.source_indices.clone(), - )); - } - __result - }); - let param_types = params.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, p: Rc| { - let pname = - param_node_name_at(p.clone(), type_env.source_indices.clone()); - let ptype = resolved_type_name(&p, type_env.source_indices.clone()); - if ((pname.clone().as_str() != "".to_string().as_str()) - && (ptype.clone().as_str() != "".to_string().as_str())) - { - v2_rt::rc_map_insert(acc.clone(), pname.clone(), ptype.clone()) - } else { - acc.clone() - } - }, - ); - collect_variant_constructors( - &body, - rt_name.clone(), - ¶m_names, - ¶m_types, - &type_env, - &func_sigs, - v2_rt::rc_empty_map::>>>(), - &v2_rt::rc_empty_map::< - String, - Rc>>>>, - >(), - ) +let rt_def = lookup_type_by_name(&type_env, rt_name.clone()); +match rt_def { + Some(def_node) => match def_node.connective.clone() { + Connective::Disj => { + let param_names = Rc::new({ let mut __result = Vec::new(); for p in params.clone().iter().cloned() { __result.push(param_node_name_at(p.clone(), type_env.source_indices.clone())); } __result }); +let param_types = params.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, p: Rc| { + let pname = param_node_name_at(p.clone(), type_env.source_indices.clone()); +let ptype = resolved_type_name(&p, type_env.source_indices.clone()); +if ((pname.clone().as_str() != "".to_string().as_str()) && (ptype.clone().as_str() != "".to_string().as_str())) { + v2_rt::rc_map_insert(acc.clone(), pname.clone(), ptype.clone()) + } else { + acc.clone() } - _ => v2_rt::rc_empty_map::< - String, - Rc>>>>, - >(), - }, - None => v2_rt::rc_empty_map::< - String, - Rc>>>>, - >(), - } - } +}); +collect_variant_constructors(&body, rt_name.clone(), ¶m_names, ¶m_types, &type_env, &func_sigs, v2_rt::rc_empty_map::>>>(), &v2_rt::rc_empty_map::>>>>>()) +}, + _ => v2_rt::rc_empty_map::>>>>>(), +}, + None => v2_rt::rc_empty_map::>>>>>(), +} +} } -pub fn collect_variant_constructors( - body: &Rc, - parent_enum: String, - param_names: &Rc>, - param_types: &Rc>, - type_env: &Rc, - func_sigs: &Rc>>, - let_prov: Rc>>>>, - acc: &Rc>>>>>>, -) -> Rc>>>>>> { +pub fn collect_variant_constructors(body: &Rc, parent_enum: String, param_names: &Rc>, param_types: &Rc>, type_env: &Rc, func_sigs: &Rc>>, let_prov: Rc>>>>, acc: &Rc>>>>>>) -> Rc>>>>>> { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*body.expr_data.clone()).clone() { - ExprData::ExprRecordLit { - parent_enum: pe, .. - } => match pe.clone() { - Some(enum_name) => { - if (enum_name.clone().as_str() == parent_enum.clone().as_str()) { - { - let variant_name = body.name.clone(); - let field_prov_map = body.children.clone().iter().cloned().fold( - v2_rt::rc_empty_map::< - String, - Rc>>, - >(), - |m: Rc< - HashMap>>>, - >, - fi: Rc| { - let fname = field_init_node_name_at( - fi.clone(), - type_env.source_indices.clone(), - ); - let fprov = classify_body_provenance( - &field_init_node_value(&fi), - ¶m_names, - ¶m_types, - &type_env, - &func_sigs, - &let_prov, - ); - if (fname.clone().as_str() != "".to_string().as_str()) { - v2_rt::rc_map_insert( - m.clone(), - fname.clone(), - fprov.clone(), - ) - } else { - m.clone() - } - }, - ); - match v2_rt::map_get(&acc, variant_name.clone()) { - Some(existing) => { - let merged = merge_field_prov_maps(&existing, &field_prov_map); - v2_rt::rc_map_insert(acc.clone(), variant_name.clone(), merged) - } - None => v2_rt::rc_map_insert( - acc.clone(), - variant_name.clone(), - field_prov_map, - ), - } - } + ExprData::ExprRecordLit { parent_enum: pe, .. } => match pe.clone() { + Some(enum_name) => if (enum_name.clone().as_str() == parent_enum.clone().as_str()) { + { + let variant_name = body.name.clone(); +let field_prov_map = body.children.clone().iter().cloned().fold(v2_rt::rc_empty_map::>>>(), |m: Rc>>>>, fi: Rc| { + let fname = field_init_node_name_at(fi.clone(), type_env.source_indices.clone()); +let fprov = classify_body_provenance(&field_init_node_value(&fi), ¶m_names, ¶m_types, &type_env, &func_sigs, &let_prov); +if (fname.clone().as_str() != "".to_string().as_str()) { + v2_rt::rc_map_insert(m.clone(), fname.clone(), fprov.clone()) } else { - acc.clone() - } - } - None => acc.clone(), - }, - ExprData::ExprMatch => match_arm_nodes(body.clone()).iter().cloned().fold( - acc.clone(), - |a: Rc< - HashMap>>>>>, - >, - arm: Rc| { - collect_variant_constructors( - &arm_body(&arm), - parent_enum.clone(), - ¶m_names, - ¶m_types, - &type_env, - &func_sigs, - let_prov.clone(), - &a, - ) - }, - ), - ExprData::ExprIf => { - let then_acc = collect_variant_constructors( - &if_then_branch(body.clone()), - parent_enum.clone(), - ¶m_names, - ¶m_types, - &type_env, - &func_sigs, - let_prov.clone(), - &acc, - ); - match if_else_branch(body.clone()) { - Some(eb) => collect_variant_constructors( - &eb, - parent_enum.clone(), - ¶m_names, - ¶m_types, - &type_env, - &func_sigs, - let_prov.clone(), - &then_acc, - ), - None => then_acc, - } - } - ExprData::ExprLet => match let_body(body.clone()) { - Some(b) => { - let bname = let_binding_name_at(body.clone(), type_env.source_indices.clone()); - let value_prov = classify_body_provenance( - &let_value(body.clone()), - ¶m_names, - ¶m_types, - &type_env, - &func_sigs, - &let_prov, - ); - let new_lp = v2_rt::rc_map_insert(let_prov.clone(), bname.clone(), value_prov); - collect_variant_constructors( - &b, - parent_enum.clone(), - ¶m_names, - ¶m_types, - &type_env, - &func_sigs, - new_lp, - &acc, - ) - } - None => acc.clone(), - }, - ExprData::ExprBlock => { - let stmts = body.children.clone(); - let stmt_count = (stmts.clone().len() as i64); - if (stmt_count.clone() == 0) { - acc.clone() - } else { - { - let final_lp = Rc::new( - stmts - .clone() - .iter() - .cloned() - .take((stmt_count.clone() - 1) as usize) - .collect::>(), - ) - .iter() - .cloned() - .fold( - let_prov.clone(), - |lp: Rc>>>>, - stmt: Rc| match (*stmt - .expr_data - .clone()) - .clone() - { - ExprData::ExprLet => { - let bname = let_binding_name_at( - stmt.clone(), - type_env.source_indices.clone(), - ); - let vprov = classify_body_provenance( - &let_value(stmt.clone()), - ¶m_names, - ¶m_types, - &type_env, - &func_sigs, - &lp, - ); - v2_rt::rc_map_insert(lp.clone(), bname.clone(), vprov.clone()) - } - _ => lp.clone(), - }, - ); - match stmts - .clone() - .get((stmt_count.clone() - 1) as usize) - .cloned() - { - Some(last) => collect_variant_constructors( - &last, - parent_enum.clone(), - ¶m_names, - ¶m_types, - &type_env, - &func_sigs, - final_lp, - &acc, - ), - None => acc.clone(), - } + m.clone() } - } +}); +match v2_rt::map_get(&acc, variant_name.clone()) { + Some(existing) => { + let merged = merge_field_prov_maps(&existing, &field_prov_map); +v2_rt::rc_map_insert(acc.clone(), variant_name.clone(), merged) +}, + None => v2_rt::rc_map_insert(acc.clone(), variant_name.clone(), field_prov_map), +} +} + } else { + acc.clone() + }, + None => acc.clone(), +}, + ExprData::ExprMatch => match_arm_nodes(body.clone()).iter().cloned().fold(acc.clone(), |a: Rc>>>>>>, arm: Rc| collect_variant_constructors(&arm_body(&arm), parent_enum.clone(), ¶m_names, ¶m_types, &type_env, &func_sigs, let_prov.clone(), &a)), + ExprData::ExprIf => { + let then_acc = collect_variant_constructors(&if_then_branch(body.clone()), parent_enum.clone(), ¶m_names, ¶m_types, &type_env, &func_sigs, let_prov.clone(), &acc); +match if_else_branch(body.clone()) { + Some(eb) => collect_variant_constructors(&eb, parent_enum.clone(), ¶m_names, ¶m_types, &type_env, &func_sigs, let_prov.clone(), &then_acc), + None => then_acc, +} +}, + ExprData::ExprLet => match let_body(body.clone()) { + Some(b) => { + let bname = let_binding_name_at(body.clone(), type_env.source_indices.clone()); +let value_prov = classify_body_provenance(&let_value(body.clone()), ¶m_names, ¶m_types, &type_env, &func_sigs, &let_prov); +let new_lp = v2_rt::rc_map_insert(let_prov.clone(), bname.clone(), value_prov); +collect_variant_constructors(&b, parent_enum.clone(), ¶m_names, ¶m_types, &type_env, &func_sigs, new_lp, &acc) +}, + None => acc.clone(), +}, + ExprData::ExprBlock => { + let stmts = body.children.clone(); +let stmt_count = (stmts.clone().len() as i64); +if (stmt_count.clone() == 0) { + acc.clone() + } else { + { + let final_lp = Rc::new(stmts.clone().iter().cloned().take((stmt_count.clone() - 1) as usize).collect::>()).iter().cloned().fold(let_prov.clone(), |lp: Rc>>>>, stmt: Rc| match (*stmt.expr_data.clone()).clone() { + ExprData::ExprLet => { + let bname = let_binding_name_at(stmt.clone(), type_env.source_indices.clone()); +let vprov = classify_body_provenance(&let_value(stmt.clone()), ¶m_names, ¶m_types, &type_env, &func_sigs, &lp); +v2_rt::rc_map_insert(lp.clone(), bname.clone(), vprov.clone()) +}, + _ => lp.clone(), +}); +match stmts.clone().get((stmt_count.clone() - 1) as usize).cloned() { + Some(last) => collect_variant_constructors(&last, parent_enum.clone(), ¶m_names, ¶m_types, &type_env, &func_sigs, final_lp, &acc), + None => acc.clone(), +} +} } - _ => acc.clone(), - } +}, + _ => acc.clone(), +} }) } -pub fn merge_field_prov_maps( - a: &Rc>>>>, - b: &Rc>>>>, -) -> Rc>>>> { +pub fn merge_field_prov_maps(a: &Rc>>>>, b: &Rc>>>>) -> Rc>>>> { { - let from_a = Rc::new(v2_rt::map_keys(&a)).iter().cloned().fold( - v2_rt::rc_empty_map::>>>(), - |result: Rc>>>>, - fname: String| match v2_rt::map_get(&a, fname.clone()) { - Some(a_prov) => match v2_rt::map_get(&b, fname.clone()) { - Some(b_prov) => v2_rt::rc_map_insert( - result.clone(), - fname.clone(), - union_prov_maps(&a_prov, &b_prov), - ), - None => v2_rt::rc_map_insert(result.clone(), fname.clone(), a_prov.clone()), - }, - None => result.clone(), - }, - ); - Rc::new(v2_rt::map_keys(&b)).iter().cloned().fold( - from_a, - |result: Rc>>>>, - fname: String| { - if (v2_rt::map_get(&result, fname.clone()) != None) { - result.clone() - } else { - match v2_rt::map_get(&b, fname.clone()) { - Some(b_prov) => { - v2_rt::rc_map_insert(result.clone(), fname.clone(), b_prov.clone()) - } - None => result.clone(), - } - } - }, - ) - } + let from_a = Rc::new(v2_rt::map_keys(&a)).iter().cloned().fold(v2_rt::rc_empty_map::>>>(), |result: Rc>>>>, fname: String| match v2_rt::map_get(&a, fname.clone()) { + Some(a_prov) => match v2_rt::map_get(&b, fname.clone()) { + Some(b_prov) => v2_rt::rc_map_insert(result.clone(), fname.clone(), union_prov_maps(&a_prov, &b_prov)), + None => v2_rt::rc_map_insert(result.clone(), fname.clone(), a_prov.clone()), +}, + None => result.clone(), +}); +Rc::new(v2_rt::map_keys(&b)).iter().cloned().fold(from_a, |result: Rc>>>>, fname: String| if (v2_rt::map_get(&result, fname.clone()) != None) { + result.clone() + } else { + match v2_rt::map_get(&b, fname.clone()) { + Some(b_prov) => v2_rt::rc_map_insert(result.clone(), fname.clone(), b_prov.clone()), + None => result.clone(), +} + }) +} } -pub fn union_prov_maps( - a: &Rc>>, - b: &Rc>>, -) -> Rc>> { +pub fn union_prov_maps(a: &Rc>>, b: &Rc>>) -> Rc>> { { - let from_a = Rc::new(v2_rt::map_keys(&a)).iter().cloned().fold( - empty_prov_map(), - |result: Rc>>, key: String| match v2_rt::map_get( - &a, - key.clone(), - ) { - Some(a_rel) => match v2_rt::map_get(&b, key.clone()) { - Some(b_rel) => v2_rt::rc_map_insert( - result.clone(), - key.clone(), - join_sub_value(a_rel.clone(), b_rel.clone()), - ), - None => v2_rt::rc_map_insert(result.clone(), key.clone(), a_rel.clone()), - }, - None => result.clone(), - }, - ); - Rc::new(v2_rt::map_keys(&b)).iter().cloned().fold( - from_a, - |result: Rc>>, key: String| { - if (v2_rt::map_get(&result, key.clone()) != None) { - result.clone() - } else { - match v2_rt::map_get(&b, key.clone()) { - Some(b_rel) => { - v2_rt::rc_map_insert(result.clone(), key.clone(), b_rel.clone()) - } - None => result.clone(), - } - } - }, - ) - } + let from_a = Rc::new(v2_rt::map_keys(&a)).iter().cloned().fold(empty_prov_map(), |result: Rc>>, key: String| match v2_rt::map_get(&a, key.clone()) { + Some(a_rel) => match v2_rt::map_get(&b, key.clone()) { + Some(b_rel) => v2_rt::rc_map_insert(result.clone(), key.clone(), join_sub_value(a_rel.clone(), b_rel.clone())), + None => v2_rt::rc_map_insert(result.clone(), key.clone(), a_rel.clone()), +}, + None => result.clone(), +}); +Rc::new(v2_rt::map_keys(&b)).iter().cloned().fold(from_a, |result: Rc>>, key: String| if (v2_rt::map_get(&result, key.clone()) != None) { + result.clone() + } else { + match v2_rt::map_get(&b, key.clone()) { + Some(b_rel) => v2_rt::rc_map_insert(result.clone(), key.clone(), b_rel.clone()), + None => result.clone(), +} + }) +} } -pub fn populate_output_provenance( - typed_items: Rc>>, - func_env: Rc, - type_env: Rc, - locals: Rc>>, -) -> Rc { +pub fn populate_output_provenance(typed_items: Rc>>, func_env: Rc, type_env: Rc, locals: Rc>>) -> Rc { { - let updated_sigs = typed_items.iter().cloned().fold( - func_env.signatures.clone(), - |acc: Rc>>, item: Rc| { - if ((item.params.clone().len() as i64) > 0) { - { - let fn_name = authored_name_at(type_env.source_indices.clone(), &item); - if (is_child_accessor_in_model(fn_name.clone()) - || is_tree_size_reducing(fn_name.clone())) - { - match item.params.clone().first().cloned() { - Some(first_param) => { - let pname = param_node_name_at( - first_param.clone(), - type_env.source_indices.clone(), - ); - let ptype = resolved_type_name( - &first_param, - type_env.source_indices.clone(), - ); - if ((ptype.clone().as_str() != "".to_string().as_str()) - && (pname.clone().as_str() != "".to_string().as_str())) - { - { - let fields = inductive_fields_for( - type_env.clone(), - ptype.clone(), - ); - let list_field = Rc::new({ - let mut __result = Vec::new(); - for f in fields.clone().iter().cloned() { - if match f.shape.clone() { - RecursionShape::ListRecursion => true, - _ => false, - } { - __result.push(f); - } - } - __result - }) - .first() - .cloned(); - match list_field.clone() { - Some(ind_field) => { - let provenance = - Rc::new(vec![v2_rt::rc_map_insert( - v2_rt::rc_empty_map::< - String, - Rc, - >( - ), - pname.clone(), - Rc::new( - SubValueRelation::StrictSubValue { - field: ind_field.clone(), - factor: Rc::new( - ShrinkFactor::UnitShrink, - ), - }, - ), - )]); - match v2_rt::map_get(&acc, fn_name.clone()) { - Some(sig) => v2_rt::rc_map_insert( - acc.clone(), - fn_name.clone(), - Rc::new(ResolvedFuncSig { - name: sig.name.clone(), - params: sig.params.clone(), - inferred: sig.inferred.clone(), - is_async: sig.is_async.clone(), - output_provenance: provenance - .clone(), - variant_provenance: sig - .variant_provenance - .clone(), - }), - ), - None => acc.clone(), - } - } - None => acc.clone(), - } - } - } else { - acc.clone() - } - } - None => acc.clone(), - } + let updated_sigs = typed_items.iter().cloned().fold(func_env.signatures.clone(), |acc: Rc>>, item: Rc| if ((item.params.clone().len() as i64) > 0) { + { + let fn_name = authored_name_at(type_env.source_indices.clone(), &item); +if (is_child_accessor_in_model(fn_name.clone()) || is_tree_size_reducing(fn_name.clone())) { + match item.params.clone().first().cloned() { + Some(first_param) => { + let pname = param_node_name_at(first_param.clone(), type_env.source_indices.clone()); +let ptype = resolved_type_name(&first_param, type_env.source_indices.clone()); +if ((ptype.clone().as_str() != "".to_string().as_str()) && (pname.clone().as_str() != "".to_string().as_str())) { + { + let fields = inductive_fields_for(type_env.clone(), ptype.clone()); +let list_field = Rc::new({ let mut __result = Vec::new(); for f in fields.clone().iter().cloned() { if match f.shape.clone() { + RecursionShape::ListRecursion => true, + _ => false, +} { __result.push(f); } } __result }).first().cloned(); +match list_field.clone() { + Some(ind_field) => { + let provenance = Rc::new(vec![v2_rt::rc_map_insert(v2_rt::rc_empty_map::>(), pname.clone(), Rc::new(SubValueRelation::StrictSubValue { + field: ind_field.clone(), + factor: Rc::new(ShrinkFactor::UnitShrink), +}))]); +match v2_rt::map_get(&acc, fn_name.clone()) { + Some(sig) => v2_rt::rc_map_insert(acc.clone(), fn_name.clone(), Rc::new(ResolvedFuncSig { + name: sig.name.clone(), + params: sig.params.clone(), + inferred: sig.inferred.clone(), + is_async: sig.is_async.clone(), + output_provenance: provenance.clone(), + variant_provenance: sig.variant_provenance.clone(), +})), + None => acc.clone(), +} +}, + None => acc.clone(), +} +} } else { - match item.body.clone() { - Some(body) => { - if !expr_has_self_call( - &body, - &fn_name, - &type_env.source_indices.clone(), - ) { - { - let provenance = infer_output_provenance( - &body, - &item.params.clone(), - &type_env, - locals.clone(), - &acc, - ); - let variant_prov = - match item.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { - node: rt, - .. - }) => compute_variant_provenance( - body.clone(), - rt.clone(), - &item.params.clone(), - &type_env, - acc.clone(), - ), - _ => v2_rt::rc_empty_map::< - String, - Rc< - HashMap< - String, - Rc< - HashMap< - String, - Rc, - >, - >, - >, - >, - >( - ), - }; - let has_scalar = - ((provenance.clone().len() as i64) > 0); - let has_variant = - ((Rc::new(v2_rt::map_keys(&variant_prov)).len() - as i64) - > 0); - if (has_scalar.clone() || has_variant.clone()) { - match v2_rt::map_get(&acc, fn_name.clone()) { - Some(sig) => v2_rt::rc_map_insert( - acc.clone(), - fn_name.clone(), - Rc::new(ResolvedFuncSig { - name: sig.name.clone(), - params: sig.params.clone(), - inferred: sig.inferred.clone(), - is_async: sig.is_async.clone(), - output_provenance: if has_scalar.clone() - { - provenance.clone() - } else { - sig.output_provenance.clone() - }, - variant_provenance: if has_variant - .clone() - { - variant_prov.clone() - } else { - sig.variant_provenance.clone() - }, - }), - ), - None => acc.clone(), - } - } else { - acc.clone() - } - } - } else { - acc.clone() - } - } - None => acc.clone(), - } + acc.clone() } - } +}, + None => acc.clone(), +} } else { - acc.clone() + match item.body.clone() { + Some(body) => if !expr_has_self_call(&body, &fn_name, &type_env.source_indices.clone()) { + { + let provenance = infer_output_provenance(&body, &item.params.clone(), &type_env, locals.clone(), &acc); +let variant_prov = match item.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => compute_variant_provenance(body.clone(), rt.clone(), &item.params.clone(), &type_env, acc.clone()), + _ => v2_rt::rc_empty_map::>>>>>(), +}; +let has_scalar = ((provenance.clone().len() as i64) > 0); +let has_variant = ((Rc::new(v2_rt::map_keys(&variant_prov)).len() as i64) > 0); +if (has_scalar.clone() || has_variant.clone()) { + match v2_rt::map_get(&acc, fn_name.clone()) { + Some(sig) => v2_rt::rc_map_insert(acc.clone(), fn_name.clone(), Rc::new(ResolvedFuncSig { + name: sig.name.clone(), + params: sig.params.clone(), + inferred: sig.inferred.clone(), + is_async: sig.is_async.clone(), + output_provenance: if has_scalar.clone() { + provenance.clone() + } else { + sig.output_provenance.clone() + }, + variant_provenance: if has_variant.clone() { + variant_prov.clone() + } else { + sig.variant_provenance.clone() + }, +})), + None => acc.clone(), +} + } else { + acc.clone() + } +} + } else { + acc.clone() + }, + None => acc.clone(), +} } - }, - ); - Rc::new(ResolvedFuncEnv { - signatures: updated_sigs, - }) - } +} + } else { + acc.clone() + }); +Rc::new(ResolvedFuncEnv { + signatures: updated_sigs, +}) +} } -pub fn annotate_descent_evidence( - body: Rc, - fn_name: String, - params: &Rc>>, - type_env: &Rc, - scope_locals: Rc>>, - func_sigs: Rc>>, -) -> Rc { +pub fn annotate_descent_evidence(body: Rc, fn_name: String, params: &Rc>>, type_env: &Rc, scope_locals: Rc>>, func_sigs: Rc>>) -> Rc { { - let param_name_map = params.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, p: Rc| { - let pname = param_node_name_at(p.clone(), type_env.source_indices.clone()); - let ptype = resolved_type_name(&p, type_env.source_indices.clone()); - v2_rt::rc_map_insert(acc, pname.clone(), ptype.clone()) - }, - ); - let param_order_list = Rc::new({ - let mut __result = Vec::new(); - for p in params.clone().iter().cloned() { - __result.push(param_node_name_at( - p.clone(), - type_env.source_indices.clone(), - )); - } - __result - }); - let ctx = Rc::new(DescentContext { - fn_name: fn_name, - param_names: param_name_map, - param_order: param_order_list, - type_env: type_env.clone(), - sub_value_vars: v2_rt::rc_empty_map::>(), - size_aliases: v2_rt::rc_empty_map::>(), - scope_locals: scope_locals, - func_sigs: func_sigs, - per_field_vars: v2_rt::rc_empty_map::>>>( - ), - }); - annotate_descent(&body, &ctx) - } + let param_name_map = params.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, p: Rc| { + let pname = param_node_name_at(p.clone(), type_env.source_indices.clone()); +let ptype = resolved_type_name(&p, type_env.source_indices.clone()); +v2_rt::rc_map_insert(acc, pname.clone(), ptype.clone()) +}); +let param_order_list = Rc::new({ let mut __result = Vec::new(); for p in params.clone().iter().cloned() { __result.push(param_node_name_at(p.clone(), type_env.source_indices.clone())); } __result }); +let ctx = Rc::new(DescentContext { + fn_name: fn_name, + param_names: param_name_map, + param_order: param_order_list, + type_env: type_env.clone(), + sub_value_vars: v2_rt::rc_empty_map::>(), + size_aliases: v2_rt::rc_empty_map::>(), + scope_locals: scope_locals, + func_sigs: func_sigs, + per_field_vars: v2_rt::rc_empty_map::>>>(), +}); +annotate_descent(&body, &ctx) +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -8890,1939 +5060,1147 @@ pub struct InferTransportResult { pub transport: Option>, pub diagnostics: Rc>>, } - -pub fn infer_property_values( - props: Rc>>, - scope: Rc, -) -> Rc { - { - let results = Rc::new({ - let mut __result = Vec::new(); - for p in props.iter().cloned() { - __result.push({ - let val = field_init_node_value(&p); - let val_result = infer_expr(&val, &scope, &None); - ( - Rc::new(Node { - name: p.name.clone(), - span: p.span.clone(), - ident_span: p.ident_span.clone(), - children: Rc::new(vec![val_result.typed.clone()]), - connective: p.connective.clone(), - params: p.params.clone(), - inferred: p.inferred.clone(), - return_cardinality: p.return_cardinality.clone(), - uses: p.uses.clone(), - body: p.body.clone(), - transport: p.transport.clone(), - properties: p.properties.clone(), - type_annotation: p.type_annotation.clone(), - is_self_recursive: p.is_self_recursive.clone(), - has_non_tail_self_call: p.has_non_tail_self_call.clone(), - match_pattern: p.match_pattern.clone(), - expr_data: p.expr_data.clone(), - ident: None, - }), - val_result.diagnostics.clone(), - ) - }); - } - __result - }); - Rc::new(InferPropertiesResult { - props: Rc::new({ - let mut __result = Vec::new(); - for r in results.clone().iter().cloned() { - __result.push(r.0.clone()); - } - __result - }), - diagnostics: Rc::new({ - let mut __result = Vec::new(); - for r in results.clone().iter().cloned() { - __result.extend((*r.1.clone()).iter().cloned()); - } - __result - }), - }) - } -} - -pub fn infer_auth_source_properties( - props: Rc>>, - scope: Rc, -) -> Rc { - { - let results = Rc::new({ - let mut __result = Vec::new(); - for p in props.iter().cloned() { - __result.push( - if (field_init_node_name_at( - p.clone(), - scope.type_env.clone().source_indices.clone(), - ) - .as_str() - == "svc_auth_source".to_string().as_str()) - { - { - let val = field_init_node_value(&p); - let val_result = infer_expr(&val, &scope, &None); - ( - Rc::new(Node { - name: p.name.clone(), - span: p.span.clone(), - ident_span: p.ident_span.clone(), - children: Rc::new(vec![val_result.typed.clone()]), - connective: p.connective.clone(), - params: p.params.clone(), - inferred: p.inferred.clone(), - return_cardinality: p.return_cardinality.clone(), - uses: p.uses.clone(), - body: p.body.clone(), - transport: p.transport.clone(), - properties: p.properties.clone(), - type_annotation: p.type_annotation.clone(), - is_self_recursive: p.is_self_recursive.clone(), - has_non_tail_self_call: p.has_non_tail_self_call.clone(), - match_pattern: p.match_pattern.clone(), - expr_data: p.expr_data.clone(), - ident: None, - }), - val_result.diagnostics.clone(), - ) - } - } else { - (p.clone(), Rc::new(vec![])) - }, - ); - } - __result - }); - Rc::new(InferPropertiesResult { - props: Rc::new({ - let mut __result = Vec::new(); - for r in results.clone().iter().cloned() { - __result.push(r.0.clone()); - } - __result - }), - diagnostics: Rc::new({ - let mut __result = Vec::new(); - for r in results.clone().iter().cloned() { - __result.extend((*r.1.clone()).iter().cloned()); - } - __result - }), - }) - } + +pub fn infer_property_values(props: Rc>>, scope: Rc) -> Rc { + { + let results = Rc::new({ let mut __result = Vec::new(); for p in props.iter().cloned() { __result.push({ + let val = field_init_node_value(&p); +let val_result = infer_expr(&val, &scope, &None); +(Rc::new(Node { + name: p.name.clone(), + span: p.span.clone(), + ident_span: p.ident_span.clone(), + children: Rc::new(vec![val_result.typed.clone()]), + connective: p.connective.clone(), + params: p.params.clone(), + inferred: p.inferred.clone(), + return_cardinality: p.return_cardinality.clone(), + uses: p.uses.clone(), + body: p.body.clone(), + transport: p.transport.clone(), + properties: p.properties.clone(), + type_annotation: p.type_annotation.clone(), + is_self_recursive: p.is_self_recursive.clone(), + has_non_tail_self_call: p.has_non_tail_self_call.clone(), + match_pattern: p.match_pattern.clone(), + expr_data: p.expr_data.clone(), + ident: None, +}), val_result.diagnostics.clone()) +}); } __result }); +Rc::new(InferPropertiesResult { + props: Rc::new({ let mut __result = Vec::new(); for r in results.clone().iter().cloned() { __result.push(r.0.clone()); } __result }), + diagnostics: Rc::new({ let mut __result = Vec::new(); for r in results.clone().iter().cloned() { __result.extend((*r.1.clone()).iter().cloned()); } __result }), +}) +} +} + +pub fn infer_auth_source_properties(props: Rc>>, scope: Rc) -> Rc { + { + let results = Rc::new({ let mut __result = Vec::new(); for p in props.iter().cloned() { __result.push(if (field_init_node_name_at(p.clone(), scope.type_env.clone().source_indices.clone()).as_str() == "svc_auth_source".to_string().as_str()) { + { + let val = field_init_node_value(&p); +let val_result = infer_expr(&val, &scope, &None); +(Rc::new(Node { + name: p.name.clone(), + span: p.span.clone(), + ident_span: p.ident_span.clone(), + children: Rc::new(vec![val_result.typed.clone()]), + connective: p.connective.clone(), + params: p.params.clone(), + inferred: p.inferred.clone(), + return_cardinality: p.return_cardinality.clone(), + uses: p.uses.clone(), + body: p.body.clone(), + transport: p.transport.clone(), + properties: p.properties.clone(), + type_annotation: p.type_annotation.clone(), + is_self_recursive: p.is_self_recursive.clone(), + has_non_tail_self_call: p.has_non_tail_self_call.clone(), + match_pattern: p.match_pattern.clone(), + expr_data: p.expr_data.clone(), + ident: None, +}), val_result.diagnostics.clone()) +} + } else { + (p.clone(), Rc::new(vec![])) + }); } __result }); +Rc::new(InferPropertiesResult { + props: Rc::new({ let mut __result = Vec::new(); for r in results.clone().iter().cloned() { __result.push(r.0.clone()); } __result }), + diagnostics: Rc::new({ let mut __result = Vec::new(); for r in results.clone().iter().cloned() { __result.extend((*r.1.clone()).iter().cloned()); } __result }), +}) +} } -pub fn infer_transport_node( - transport: Option>, - scope: Rc, -) -> Rc { +pub fn infer_transport_node(transport: Option>, scope: Rc) -> Rc { match transport { - None => Rc::new(InferTransportResult { - transport: None, - diagnostics: Rc::new(vec![]), - }), - Some(t) => { - let prop_result = infer_property_values(t.properties.clone(), scope); - Rc::new(InferTransportResult { - transport: Some(Rc::new(Node { - name: t.name.clone(), - span: t.span.clone(), - ident_span: t.ident_span.clone(), - children: t.children.clone(), - connective: t.connective.clone(), - params: t.params.clone(), - inferred: t.inferred.clone(), - return_cardinality: t.return_cardinality.clone(), - uses: t.uses.clone(), - body: t.body.clone(), - transport: t.transport.clone(), - properties: prop_result.props.clone(), - type_annotation: t.type_annotation.clone(), - is_self_recursive: t.is_self_recursive.clone(), - has_non_tail_self_call: t.has_non_tail_self_call.clone(), - match_pattern: t.match_pattern.clone(), - expr_data: t.expr_data.clone(), - ident: None, - })), - diagnostics: prop_result.diagnostics.clone(), - }) - } - } + None => Rc::new(InferTransportResult { + transport: None, + diagnostics: Rc::new(vec![]), +}), + Some(t) => { + let prop_result = infer_property_values(t.properties.clone(), scope); +Rc::new(InferTransportResult { + transport: Some(Rc::new(Node { + name: t.name.clone(), + span: t.span.clone(), + ident_span: t.ident_span.clone(), + children: t.children.clone(), + connective: t.connective.clone(), + params: t.params.clone(), + inferred: t.inferred.clone(), + return_cardinality: t.return_cardinality.clone(), + uses: t.uses.clone(), + body: t.body.clone(), + transport: t.transport.clone(), + properties: prop_result.props.clone(), + type_annotation: t.type_annotation.clone(), + is_self_recursive: t.is_self_recursive.clone(), + has_non_tail_self_call: t.has_non_tail_self_call.clone(), + match_pattern: t.match_pattern.clone(), + expr_data: t.expr_data.clone(), + ident: None, +})), + diagnostics: prop_result.diagnostics.clone(), +}) +}, +} } pub fn infer_item(item: &Rc, scope: &Rc) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - let typed_anno = item.type_annotation.clone(); - let transport_scope = if ((item.params.clone().len() as i64) > 0) { - build_params_scope(&scope, item.params.clone()) - } else { - scope.clone() - }; - let transport_result = infer_transport_node(item.transport.clone(), transport_scope); - let typed_transport = transport_result.transport.clone(); - let transport_diags = transport_result.diagnostics.clone(); - let props_result = infer_auth_source_properties(item.properties.clone(), scope.clone()); - let typed_properties = props_result.props.clone(); - let props_diags = props_result.diagnostics.clone(); - if ((item.connective.clone() != Connective::NoConnective) - && (item.transport.clone() == None)) { - Rc::new(TypedItemResult { - item: Rc::new(Node { - name: item.name.clone(), - span: item.span.clone(), - ident_span: item.ident_span.clone(), - children: Rc::new({ - let mut __result = Vec::new(); - for c in item.children.clone().iter().cloned() { - __result.push(infer_item(&c, &scope).item.clone()); - } - __result - }), - params: item.params.clone(), - inferred: Some(Rc::new(InferredNode::Resolved { node: unit_type() })), - return_cardinality: item.return_cardinality.clone(), - uses: item.uses.clone(), - body: None, - connective: item.connective.clone(), - transport: typed_transport, - properties: typed_properties, - type_annotation: typed_anno, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }), - diagnostics: v2_rt::concat(transport_diags, props_diags), - }) - } else { - if ((item.body.clone() != None) && ((item.params.clone().len() as i64) > 0)) { - { - let fn_scope = build_params_scope(&scope, item.params.clone()); - let fn_scope = item.uses.clone().iter().cloned().fold( - fn_scope.clone(), - |s: Rc, u: Rc| { - extend_scope( - &s, - &resource_use_name_at( - u.clone(), - scope.type_env.clone().source_indices.clone(), - ), - resource_use_resource(&u), - Rc::new(SubValueRelation::SubValueUnknown), - ) - }, - ); - let fn_return_expected = if (item.inferred.clone() != None) { - Some(resolved_type(item.clone())) - } else { - None - }; - let body_result = infer_expr( - &item.body.clone().clone().unwrap(), - &fn_scope, - &fn_return_expected, - ); - let body_typed = body_result.typed.clone(); - let body_diags = body_result.diagnostics.clone(); - let inferred_ret = if (item.inferred.clone() != None) { - item.inferred.clone() - } else { - body_typed.inferred.clone() - }; - let is_recursive = expr_has_self_call( - &body_typed, - &authored_name_at(scope.type_env.clone().source_indices.clone(), &item), - &scope.type_env.clone().source_indices.clone(), - ); - let annotated_body = if is_recursive.clone() { - annotate_descent_evidence( - body_typed.clone(), - authored_name_at(scope.type_env.clone().source_indices.clone(), &item), - &item.params.clone(), - &scope.type_env.clone(), - fn_scope.locals.clone(), - scope.func_env.clone().signatures.clone(), - ) - } else { - body_typed.clone() - }; - Rc::new(TypedItemResult { - item: Rc::new(Node { - name: item.name.clone(), - span: item.span.clone(), - ident_span: item.ident_span.clone(), - children: Rc::new({ - let mut __result = Vec::new(); - for c in item.children.clone().iter().cloned() { - __result.push(infer_item(&c, &scope).item.clone()); - } - __result - }), - params: item.params.clone(), - inferred: inferred_ret, - return_cardinality: item.return_cardinality.clone(), - uses: item.uses.clone(), - body: Some(annotated_body), - connective: Connective::NoConnective, - transport: typed_transport, - properties: typed_properties, - type_annotation: typed_anno, - is_self_recursive: is_recursive.clone(), - has_non_tail_self_call: expr_has_non_tail_self_call( - &body_typed, - &authored_name_at( - scope.type_env.clone().source_indices.clone(), - &item, - ), - true, - &scope.type_env.clone().source_indices.clone(), - ), - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }), - diagnostics: v2_rt::concat( - v2_rt::concat(transport_diags, props_diags), - body_diags, - ), - }) - } + let typed_anno = item.type_annotation.clone(); +let transport_scope = if ((item.params.clone().len() as i64) > 0) { + build_params_scope(&scope, item.params.clone()) } else { - if (((item.body.clone() != None) && ((item.params.clone().len() as i64) == 0)) - && (item.inferred.clone() != None)) - { + scope.clone() + }; +let transport_result = infer_transport_node(item.transport.clone(), transport_scope); +let typed_transport = transport_result.transport.clone(); +let transport_diags = transport_result.diagnostics.clone(); +let props_result = infer_auth_source_properties(item.properties.clone(), scope.clone()); +let typed_properties = props_result.props.clone(); +let props_diags = props_result.diagnostics.clone(); +if ((item.connective.clone() != Connective::NoConnective) && (item.transport.clone() == None)) { + Rc::new(TypedItemResult { + item: Rc::new(Node { + name: item.name.clone(), + span: item.span.clone(), + ident_span: item.ident_span.clone(), + children: Rc::new({ let mut __result = Vec::new(); for c in item.children.clone().iter().cloned() { __result.push(infer_item(&c, &scope).item.clone()); } __result }), + params: item.params.clone(), + inferred: Some(Rc::new(InferredNode::Resolved { + node: unit_type(), +})), + return_cardinality: item.return_cardinality.clone(), + uses: item.uses.clone(), + body: None, + connective: item.connective.clone(), + transport: typed_transport, + properties: typed_properties, + type_annotation: typed_anno, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}), + diagnostics: v2_rt::concat(transport_diags, props_diags), +}) + } else { + if ((item.body.clone() != None) && ((item.params.clone().len() as i64) > 0)) { { - let fn_scope = scope.clone(); - let body_result = infer_expr( - &item.body.clone().clone().unwrap(), - &fn_scope, - &Some(resolved_type(item.clone())), - ); - let body_typed = body_result.typed.clone(); - let body_diags = body_result.diagnostics.clone(); - Rc::new(TypedItemResult { - item: Rc::new(Node { - name: item.name.clone(), - span: item.span.clone(), - ident_span: item.ident_span.clone(), - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: item.inferred.clone(), - return_cardinality: item.return_cardinality.clone(), - uses: Rc::new(vec![]), - body: Some(body_typed.clone()), - connective: Connective::NoConnective, - transport: typed_transport, - properties: typed_properties, - type_annotation: typed_anno, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }), - diagnostics: v2_rt::concat( - v2_rt::concat(transport_diags, props_diags), - body_diags, - ), - }) - } + let fn_scope = build_params_scope(&scope, item.params.clone()); +let fn_scope = item.uses.clone().iter().cloned().fold(fn_scope.clone(), |s: Rc, u: Rc| extend_scope(&s, &resource_use_name_at(u.clone(), scope.type_env.clone().source_indices.clone()), resource_use_resource(&u), Rc::new(SubValueRelation::SubValueUnknown))); +let fn_return_expected = if (item.inferred.clone() != None) { + Some(resolved_type(item.clone())) + } else { + None + }; +let body_result = infer_expr(&item.body.clone().clone().unwrap(), &fn_scope, &fn_return_expected); +let body_typed = body_result.typed.clone(); +let body_diags = body_result.diagnostics.clone(); +let inferred_ret = if (item.inferred.clone() != None) { + item.inferred.clone() + } else { + body_typed.inferred.clone() + }; +let is_recursive = expr_has_self_call(&body_typed, &authored_name_at(scope.type_env.clone().source_indices.clone(), &item), &scope.type_env.clone().source_indices.clone()); +let annotated_body = if is_recursive.clone() { + annotate_descent_evidence(body_typed.clone(), authored_name_at(scope.type_env.clone().source_indices.clone(), &item), &item.params.clone(), &scope.type_env.clone(), fn_scope.locals.clone(), scope.func_env.clone().signatures.clone()) + } else { + body_typed.clone() + }; +Rc::new(TypedItemResult { + item: Rc::new(Node { + name: item.name.clone(), + span: item.span.clone(), + ident_span: item.ident_span.clone(), + children: Rc::new({ let mut __result = Vec::new(); for c in item.children.clone().iter().cloned() { __result.push(infer_item(&c, &scope).item.clone()); } __result }), + params: item.params.clone(), + inferred: inferred_ret, + return_cardinality: item.return_cardinality.clone(), + uses: item.uses.clone(), + body: Some(annotated_body), + connective: Connective::NoConnective, + transport: typed_transport, + properties: typed_properties, + type_annotation: typed_anno, + is_self_recursive: is_recursive.clone(), + has_non_tail_self_call: expr_has_non_tail_self_call(&body_typed, &authored_name_at(scope.type_env.clone().source_indices.clone(), &item), true, &scope.type_env.clone().source_indices.clone()), + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}), + diagnostics: v2_rt::concat(v2_rt::concat(transport_diags, props_diags), body_diags), +}) +} } else { - if ((item.body.clone() != None) && ((item.params.clone().len() as i64) == 0)) { + if (((item.body.clone() != None) && ((item.params.clone().len() as i64) == 0)) && (item.inferred.clone() != None)) { { - let data_expected = if (item.type_annotation.clone() != None) { - Some(item.type_annotation.clone().clone().unwrap()) - } else { - None - }; - let val_result = infer_expr( - &item.body.clone().clone().unwrap(), - &scope, - &data_expected, - ); - let val_typed = val_result.typed.clone(); - let val_diags = val_result.diagnostics.clone(); - let inferred_ret = if (item.type_annotation.clone() != None) { - Some(Rc::new(InferredNode::Resolved { - node: item.type_annotation.clone().clone().unwrap(), - })) - } else { - val_typed.inferred.clone() - }; - Rc::new(TypedItemResult { - item: Rc::new(Node { - name: item.name.clone(), - span: item.span.clone(), - ident_span: item.ident_span.clone(), - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: inferred_ret, - return_cardinality: item.return_cardinality.clone(), - uses: Rc::new(vec![]), - body: Some(val_typed.clone()), - connective: Connective::NoConnective, - transport: typed_transport, - properties: typed_properties, - type_annotation: typed_anno, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }), - diagnostics: v2_rt::concat( - v2_rt::concat(transport_diags, props_diags), - val_diags, - ), - }) - } + let fn_scope = scope.clone(); +let body_result = infer_expr(&item.body.clone().clone().unwrap(), &fn_scope, &Some(resolved_type(item.clone()))); +let body_typed = body_result.typed.clone(); +let body_diags = body_result.diagnostics.clone(); +Rc::new(TypedItemResult { + item: Rc::new(Node { + name: item.name.clone(), + span: item.span.clone(), + ident_span: item.ident_span.clone(), + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: item.inferred.clone(), + return_cardinality: item.return_cardinality.clone(), + uses: Rc::new(vec![]), + body: Some(body_typed.clone()), + connective: Connective::NoConnective, + transport: typed_transport, + properties: typed_properties, + type_annotation: typed_anno, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}), + diagnostics: v2_rt::concat(v2_rt::concat(transport_diags, props_diags), body_diags), +}) +} } else { - if (((item.params.clone().len() as i64) > 0) && (item.body.clone() == None)) - { - Rc::new(TypedItemResult { - item: Rc::new(Node { - name: item.name.clone(), - span: item.span.clone(), - ident_span: item.ident_span.clone(), - children: Rc::new({ - let mut __result = Vec::new(); - for c in item.children.clone().iter().cloned() { - __result.push(infer_item(&c, &scope).item.clone()); - } - __result - }), - params: item.params.clone(), - inferred: if (item.inferred.clone() != None) { - item.inferred.clone() - } else { - Some(Rc::new(InferredNode::Resolved { node: unit_type() })) - }, - return_cardinality: item.return_cardinality.clone(), - uses: item.uses.clone(), - body: None, - connective: Connective::NoConnective, - transport: typed_transport, - properties: typed_properties, - type_annotation: typed_anno, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }), - diagnostics: v2_rt::concat(transport_diags, props_diags), - }) + if ((item.body.clone() != None) && ((item.params.clone().len() as i64) == 0)) { + { + let data_expected = if (item.type_annotation.clone() != None) { + Some(item.type_annotation.clone().clone().unwrap()) + } else { + None + }; +let val_result = infer_expr(&item.body.clone().clone().unwrap(), &scope, &data_expected); +let val_typed = val_result.typed.clone(); +let val_diags = val_result.diagnostics.clone(); +let inferred_ret = if (item.type_annotation.clone() != None) { + Some(Rc::new(InferredNode::Resolved { + node: item.type_annotation.clone().clone().unwrap(), +})) + } else { + val_typed.inferred.clone() + }; +Rc::new(TypedItemResult { + item: Rc::new(Node { + name: item.name.clone(), + span: item.span.clone(), + ident_span: item.ident_span.clone(), + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: inferred_ret, + return_cardinality: item.return_cardinality.clone(), + uses: Rc::new(vec![]), + body: Some(val_typed.clone()), + connective: Connective::NoConnective, + transport: typed_transport, + properties: typed_properties, + type_annotation: typed_anno, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}), + diagnostics: v2_rt::concat(v2_rt::concat(transport_diags, props_diags), val_diags), +}) +} } else { - Rc::new(TypedItemResult { - item: Rc::new(Node { - name: item.name.clone(), - span: item.span.clone(), - ident_span: item.ident_span.clone(), - children: Rc::new({ - let mut __result = Vec::new(); - for c in item.children.clone().iter().cloned() { - __result.push(infer_item(&c, &scope).item.clone()); - } - __result - }), - params: item.params.clone(), - inferred: if (item.inferred.clone() != None) { - item.inferred.clone() - } else { - Some(Rc::new(InferredNode::Resolved { node: unit_type() })) - }, - return_cardinality: item.return_cardinality.clone(), - uses: item.uses.clone(), - body: None, - connective: item.connective.clone(), - transport: typed_transport, - properties: typed_properties, - type_annotation: typed_anno, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }), - diagnostics: v2_rt::concat(transport_diags, props_diags), - }) + if (((item.params.clone().len() as i64) > 0) && (item.body.clone() == None)) { + Rc::new(TypedItemResult { + item: Rc::new(Node { + name: item.name.clone(), + span: item.span.clone(), + ident_span: item.ident_span.clone(), + children: Rc::new({ let mut __result = Vec::new(); for c in item.children.clone().iter().cloned() { __result.push(infer_item(&c, &scope).item.clone()); } __result }), + params: item.params.clone(), + inferred: if (item.inferred.clone() != None) { + item.inferred.clone() + } else { + Some(Rc::new(InferredNode::Resolved { + node: unit_type(), +})) + }, + return_cardinality: item.return_cardinality.clone(), + uses: item.uses.clone(), + body: None, + connective: Connective::NoConnective, + transport: typed_transport, + properties: typed_properties, + type_annotation: typed_anno, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}), + diagnostics: v2_rt::concat(transport_diags, props_diags), +}) + } else { + Rc::new(TypedItemResult { + item: Rc::new(Node { + name: item.name.clone(), + span: item.span.clone(), + ident_span: item.ident_span.clone(), + children: Rc::new({ let mut __result = Vec::new(); for c in item.children.clone().iter().cloned() { __result.push(infer_item(&c, &scope).item.clone()); } __result }), + params: item.params.clone(), + inferred: if (item.inferred.clone() != None) { + item.inferred.clone() + } else { + Some(Rc::new(InferredNode::Resolved { + node: unit_type(), +})) + }, + return_cardinality: item.return_cardinality.clone(), + uses: item.uses.clone(), + body: None, + connective: item.connective.clone(), + transport: typed_transport, + properties: typed_properties, + type_annotation: typed_anno, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}), + diagnostics: v2_rt::concat(transport_diags, props_diags), +}) + } } } } } - } +} }) } -pub fn infer_items( - items: Rc>>, - scope: Rc, -) -> Rc>> { - Rc::new({ - let mut __result = Vec::new(); - for item in items.iter().cloned() { - __result.push(infer_item(&item, &scope)); - } - __result - }) +pub fn infer_items(items: Rc>>, scope: Rc) -> Rc>> { + Rc::new({ let mut __result = Vec::new(); for item in items.iter().cloned() { __result.push(infer_item(&item, &scope)); } __result }) } pub fn is_type_variable_name(name: &String) -> bool { - (((((name.clone().as_str() == "T".to_string().as_str()) - || (name.clone().as_str() == "K".to_string().as_str())) - || (name.clone().as_str() == "V".to_string().as_str())) - || (name.clone().as_str() == "MappedElement".to_string().as_str())) - || (name.clone().as_str() == "FoldAccumulator".to_string().as_str())) -} - -pub fn collect_parent_bindings_filtered( - envs: Rc>>, -) -> Rc>> { - envs.iter().cloned().fold( - v2_rt::rc_empty_map::>(), - |acc: Rc>>, env: Rc| { - Rc::new(v2_rt::map_keys(&env.bindings.clone())) - .iter() - .cloned() - .fold( - acc, - |bacc: Rc>>, ident: i64| { - let name = intern_str(env.intern_table.clone(), ident.clone()); - if is_type_variable_name(&name) { - bacc.clone() - } else { - match v2_rt::map_get(&env.bindings.clone(), ident.clone()) { - Some(binding) => v2_rt::rc_map_insert( - bacc.clone(), - ident.clone(), - binding.clone(), - ), - None => bacc.clone(), - } - } - }, - ) - }, - ) + (((((name.clone().as_str() == "T".to_string().as_str()) || (name.clone().as_str() == "K".to_string().as_str())) || (name.clone().as_str() == "V".to_string().as_str())) || (name.clone().as_str() == "MappedElement".to_string().as_str())) || (name.clone().as_str() == "FoldAccumulator".to_string().as_str())) +} + +pub fn collect_parent_bindings_filtered(envs: Rc>>) -> Rc>> { + envs.iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, env: Rc| Rc::new(v2_rt::map_keys(&env.bindings.clone())).iter().cloned().fold(acc, |bacc: Rc>>, ident: i64| { + let name = intern_str(env.intern_table.clone(), ident.clone()); +if is_type_variable_name(&name) { + bacc.clone() + } else { + match v2_rt::map_get(&env.bindings.clone(), ident.clone()) { + Some(binding) => v2_rt::rc_map_insert(bacc.clone(), ident.clone(), binding.clone()), + None => bacc.clone(), +} + } +})) } pub fn kernel_span(name: &String) -> Rc { Rc::new(SourceSpan { - file: v2_rt::concat( - v2_rt::concat("".to_string(), - ), - start: 0, - end: v2_rt::string_length(&name), - }) + file: v2_rt::concat(v2_rt::concat("".to_string()), + start: 0, + end: v2_rt::string_length(&name), +}) } -pub fn build_type_env( - module: &Rc, - parent_index: &Rc>>, - source_indices: &Rc>>, - intern_table: &Rc, -) -> Rc { +pub fn build_type_env(module: &Rc, parent_index: &Rc>>, source_indices: &Rc>>, intern_table: &Rc) -> Rc { { - let source_indices = Rc::new(v2_rt::map_keys(&kernel_type_set())) - .iter() - .cloned() - .fold( - source_indices.clone(), - |acc: Rc>>, name: String| { - v2_rt::rc_map_insert( - acc, - v2_rt::concat( - v2_rt::concat("".to_string(), - ), - build_newline_index( - v2_rt::concat( - v2_rt::concat("".to_string(), - ), - &name, - ), - ) - }, - ); - let source_indices = Rc::new(vec![ - "Optional".to_string(), - "Some".to_string(), - "None".to_string(), - "value".to_string(), - "none".to_string(), - ]) - .iter() - .cloned() - .fold( - source_indices.clone(), - |acc: Rc>>, name: String| { - v2_rt::rc_map_insert( - acc, - v2_rt::concat( - v2_rt::concat("".to_string(), - ), - build_newline_index( - v2_rt::concat( - v2_rt::concat("".to_string(), - ), - &name, - ), - ) - }, - ); - let intern_table = Rc::new(v2_rt::map_keys(&kernel_type_set())) - .iter() - .cloned() - .fold(intern_table.clone(), |t: Rc, name: String| { - intern(&t, &name).table.clone() - }); - let intern_table = Rc::new(vec![ - "Optional".to_string(), - "Some".to_string(), - "None".to_string(), - "value".to_string(), - "none".to_string(), - ]) - .iter() - .cloned() - .fold(intern_table.clone(), |t: Rc, name: String| { - intern(&t, &name).table.clone() - }); - let intern_table = Rc::new(v2_rt::map_keys(&compiler_recursive_types())) - .iter() - .cloned() - .fold(intern_table.clone(), |t: Rc, name: String| { - intern(&t, &name).table.clone() - }); - let kernel_bindings_base = Rc::new(v2_rt::map_keys(&kernel_type_set())) - .iter() - .cloned() - .fold( - v2_rt::rc_empty_map::>(), - |acc: Rc>>, name: String| { - v2_rt::rc_map_insert( - acc, - intern(&intern_table, &name).id.clone(), - Rc::new(TypeBinding { - name: name.clone(), - resolved: Rc::new(Node { - name: name.clone(), - span: kernel_span(&name), - ident_span: Some(kernel_span(&name)), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }), - provenance: Rc::new(SubValueRelation::SubValueUnknown), - }), - ) - }, - ); - let unit_span = kernel_span(&"Unit".to_string()); - let kernel_bindings = v2_rt::rc_map_insert( - kernel_bindings_base, - intern(&intern_table, &"Unit".to_string()).id.clone(), - Rc::new(TypeBinding { - name: "Unit".to_string(), - resolved: Rc::new(Node { - name: "Unit".to_string(), - span: unit_span.clone(), - ident_span: Some(unit_span.clone()), - children: Rc::new(vec![]), - connective: Connective::Conj, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }), - provenance: Rc::new(SubValueRelation::SubValueUnknown), - }), - ); - let some_value_field = Rc::new(Node { - name: "value".to_string(), - span: kernel_span(&"value".to_string()), - ident_span: Some(kernel_span(&"value".to_string())), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::TypeVariable { - id: "some_value".to_string(), - })), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - let some_variant = Rc::new(Node { - name: "Some".to_string(), - span: kernel_span(&"Some".to_string()), - ident_span: Some(kernel_span(&"Some".to_string())), - children: Rc::new(vec![some_value_field]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - let kernel_optional = Rc::new(Node { - name: "Optional".to_string(), - span: kernel_span(&"Optional".to_string()), - ident_span: Some(kernel_span(&"Optional".to_string())), - children: Rc::new(vec![some_variant, none_type()]), - connective: Connective::Disj, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - let kernel_bindings = v2_rt::rc_map_insert( - kernel_bindings.clone(), - intern(&intern_table, &"Optional".to_string()).id.clone(), - Rc::new(TypeBinding { - name: "Optional".to_string(), - resolved: kernel_optional, - provenance: Rc::new(SubValueRelation::SubValueUnknown), - }), - ); - let node_fields = inductive_fields_list_to_map(compiler_inductive_fields()); - let kernel_recursive_types = Rc::new({ - let mut __result = Vec::new(); - for name in Rc::new(v2_rt::map_keys(&compiler_recursive_types())) - .iter() - .cloned() - { - __result.push(intern(&intern_table, &name).id.clone()); - } - __result - }); - let kernel_recursive_type_set = Rc::new(v2_rt::map_keys(&compiler_recursive_types())) - .iter() - .cloned() - .fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, name: String| { - v2_rt::rc_map_insert(acc, intern(&intern_table, &name).id.clone(), true) - }, - ); - let kernel = Rc::new(TypeEnv { - bindings: kernel_bindings.clone(), - recursive_types: kernel_recursive_types, - recursive_type_set: kernel_recursive_type_set, - inductive_fields: node_fields, - source_indices: source_indices.clone(), - intern_table: intern_table.clone(), - }); - let imports_std_types = { - let mut __found = false; - for imp in module.resolved_imports.clone().iter().cloned() { - if (imp.module_path.clone().as_str() == "std.types".to_string().as_str()) { - __found = true; - break; - } - } - __found - }; - let module_name_str = authored_name_at(source_indices.clone(), &module.module.clone()); - let std_types_parent_env = if ((module_name_str.clone().as_str() - != "std.types".to_string().as_str()) - && (imports_std_types == false)) - { + let source_indices = Rc::new(v2_rt::map_keys(&kernel_type_set())).iter().cloned().fold(source_indices.clone(), |acc: Rc>>, name: String| v2_rt::rc_map_insert(acc, v2_rt::concat(v2_rt::concat("".to_string()), build_newline_index(v2_rt::concat(v2_rt::concat("".to_string()), &name))); +let source_indices = Rc::new(vec!["Optional".to_string(), "Some".to_string(), "None".to_string(), "value".to_string(), "none".to_string()]).iter().cloned().fold(source_indices.clone(), |acc: Rc>>, name: String| v2_rt::rc_map_insert(acc, v2_rt::concat(v2_rt::concat("".to_string()), build_newline_index(v2_rt::concat(v2_rt::concat("".to_string()), &name))); +let intern_table = Rc::new(v2_rt::map_keys(&kernel_type_set())).iter().cloned().fold(intern_table.clone(), |t: Rc, name: String| intern(&t, &name).table.clone()); +let intern_table = Rc::new(vec!["Optional".to_string(), "Some".to_string(), "None".to_string(), "value".to_string(), "none".to_string()]).iter().cloned().fold(intern_table.clone(), |t: Rc, name: String| intern(&t, &name).table.clone()); +let intern_table = Rc::new(v2_rt::map_keys(&compiler_recursive_types())).iter().cloned().fold(intern_table.clone(), |t: Rc, name: String| intern(&t, &name).table.clone()); +let kernel_bindings_base = Rc::new(v2_rt::map_keys(&kernel_type_set())).iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, name: String| v2_rt::rc_map_insert(acc, intern(&intern_table, &name).id.clone(), Rc::new(TypeBinding { + name: name.clone(), + resolved: Rc::new(Node { + name: name.clone(), + span: kernel_span(&name), + ident_span: Some(kernel_span(&name)), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}), + provenance: Rc::new(SubValueRelation::SubValueUnknown), +}))); +let unit_span = kernel_span(&"Unit".to_string()); +let kernel_bindings = v2_rt::rc_map_insert(kernel_bindings_base, intern(&intern_table, &"Unit".to_string()).id.clone(), Rc::new(TypeBinding { + name: "Unit".to_string(), + resolved: Rc::new(Node { + name: "Unit".to_string(), + span: unit_span.clone(), + ident_span: Some(unit_span.clone()), + children: Rc::new(vec![]), + connective: Connective::Conj, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}), + provenance: Rc::new(SubValueRelation::SubValueUnknown), +})); +let some_value_field = Rc::new(Node { + name: "value".to_string(), + span: kernel_span(&"value".to_string()), + ident_span: Some(kernel_span(&"value".to_string())), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::TypeVariable { + id: "some_value".to_string(), +})), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +let some_variant = Rc::new(Node { + name: "Some".to_string(), + span: kernel_span(&"Some".to_string()), + ident_span: Some(kernel_span(&"Some".to_string())), + children: Rc::new(vec![some_value_field]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +let kernel_optional = Rc::new(Node { + name: "Optional".to_string(), + span: kernel_span(&"Optional".to_string()), + ident_span: Some(kernel_span(&"Optional".to_string())), + children: Rc::new(vec![some_variant, none_type()]), + connective: Connective::Disj, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +let kernel_bindings = v2_rt::rc_map_insert(kernel_bindings.clone(), intern(&intern_table, &"Optional".to_string()).id.clone(), Rc::new(TypeBinding { + name: "Optional".to_string(), + resolved: kernel_optional, + provenance: Rc::new(SubValueRelation::SubValueUnknown), +})); +let node_fields = inductive_fields_list_to_map(compiler_inductive_fields()); +let kernel_recursive_types = Rc::new({ let mut __result = Vec::new(); for name in Rc::new(v2_rt::map_keys(&compiler_recursive_types())).iter().cloned() { __result.push(intern(&intern_table, &name).id.clone()); } __result }); +let kernel_recursive_type_set = Rc::new(v2_rt::map_keys(&compiler_recursive_types())).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, name: String| v2_rt::rc_map_insert(acc, intern(&intern_table, &name).id.clone(), true)); +let kernel = Rc::new(TypeEnv { + bindings: kernel_bindings.clone(), + recursive_types: kernel_recursive_types, + recursive_type_set: kernel_recursive_type_set, + inductive_fields: node_fields, + source_indices: source_indices.clone(), + intern_table: intern_table.clone(), +}); +let imports_std_types = { let mut __found = false; for imp in module.resolved_imports.clone().iter().cloned() { if (imp.module_path.clone().as_str() == "std.types".to_string().as_str()) { __found = true; break; } } __found }; +let module_name_str = authored_name_at(source_indices.clone(), &module.module.clone()); +let std_types_parent_env = if ((module_name_str.clone().as_str() != "std.types".to_string().as_str()) && (imports_std_types == false)) { match v2_rt::map_get(&parent_index, "std.types".to_string()) { - Some(typed_std) => Rc::new(vec![typed_std.type_env.clone()]), - None => Rc::new(vec![]), - } + Some(typed_std) => Rc::new(vec![typed_std.type_env.clone()]), + None => Rc::new(vec![]), +} } else { Rc::new(vec![]) }; - let imported_parent_envs = Rc::new({ - let mut __result = Vec::new(); - for imp in module.resolved_imports.clone().iter().cloned() { - __result.extend( - (*match v2_rt::map_get(&parent_index, imp.module_path.clone()) { - Some(typed_parent) => Rc::new(vec![typed_parent.type_env.clone()]), - None => Rc::new(vec![]), - }) - .iter() - .cloned(), - ); - } - __result - }); - let parent_envs = v2_rt::concat(std_types_parent_env.clone(), imported_parent_envs); - let std_import_bindings = collect_parent_bindings_filtered(std_types_parent_env.clone()); - let import_bindings = module.resolved_imports.clone().iter().cloned().fold( - std_import_bindings, - |acc: Rc>>, imp: Rc| match v2_rt::map_get( - &parent_index, - imp.module_path.clone(), - ) { - Some(typed_parent) => { - if (imp.module_path.clone().as_str() == "std.types".to_string().as_str()) { - Rc::new(v2_rt::map_keys( - &typed_parent.type_env.clone().bindings.clone(), - )) - .iter() - .cloned() - .fold( - acc.clone(), - |bacc: Rc>>, ident: i64| { - let name = intern_str( - typed_parent.type_env.clone().intern_table.clone(), - ident.clone(), - ); - if is_type_variable_name(&name) { - bacc.clone() - } else { - match v2_rt::map_get( - &typed_parent.type_env.clone().bindings.clone(), - ident.clone(), - ) { - Some(binding) => v2_rt::rc_map_insert( - bacc.clone(), - ident.clone(), - binding.clone(), - ), - None => bacc.clone(), - } - } - }, - ) - } else { - v2_rt::rc_map_merge( - acc.clone(), - typed_parent.type_env.clone().bindings.clone(), - ) - } +let imported_parent_envs = Rc::new({ let mut __result = Vec::new(); for imp in module.resolved_imports.clone().iter().cloned() { __result.extend((*match v2_rt::map_get(&parent_index, imp.module_path.clone()) { + Some(typed_parent) => Rc::new(vec![typed_parent.type_env.clone()]), + None => Rc::new(vec![]), +}).iter().cloned()); } __result }); +let parent_envs = v2_rt::concat(std_types_parent_env.clone(), imported_parent_envs); +let std_import_bindings = collect_parent_bindings_filtered(std_types_parent_env.clone()); +let import_bindings = module.resolved_imports.clone().iter().cloned().fold(std_import_bindings, |acc: Rc>>, imp: Rc| match v2_rt::map_get(&parent_index, imp.module_path.clone()) { + Some(typed_parent) => if (imp.module_path.clone().as_str() == "std.types".to_string().as_str()) { + Rc::new(v2_rt::map_keys(&typed_parent.type_env.clone().bindings.clone())).iter().cloned().fold(acc.clone(), |bacc: Rc>>, ident: i64| { + let name = intern_str(typed_parent.type_env.clone().intern_table.clone(), ident.clone()); +if is_type_variable_name(&name) { + bacc.clone() + } else { + match v2_rt::map_get(&typed_parent.type_env.clone().bindings.clone(), ident.clone()) { + Some(binding) => v2_rt::rc_map_insert(bacc.clone(), ident.clone(), binding.clone()), + None => bacc.clone(), +} } - None => acc.clone(), - }, - ); - let import_recursive = parent_envs - .clone() - .iter() - .cloned() - .fold(Rc::new(vec![]), |acc: _, env: Rc| { - v2_rt::concat(acc, env.recursive_types.clone()) - }); - let import_recursive_set = parent_envs.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, env: Rc| { - v2_rt::rc_map_merge(acc, env.recursive_type_set.clone()) - }, - ); - let import_inductive_fields = parent_envs.clone().iter().cloned().fold( - v2_rt::rc_empty_map::>>>(), - |acc: Rc>>>>, env: Rc| { - merge_inductive_fields(acc, &env.inductive_fields.clone()) - }, - ); - let import_env = Rc::new(TypeEnv { - bindings: import_bindings, - recursive_types: import_recursive, - recursive_type_set: import_recursive_set, - inductive_fields: import_inductive_fields, - source_indices: source_indices.clone(), - intern_table: intern_table.clone(), - }); - let import_diags = Rc::new({ - let mut __result = Vec::new(); - for imp in module.resolved_imports.clone().iter().cloned() { - __result.extend( - (*match v2_rt::map_get(&parent_index, imp.module_path.clone()) { - Some(_) => Rc::new(vec![]), - None => Rc::new(vec![make_error_node( - Rc::new(CompilerDiagnostic::InternalError { - message: v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "missing parent environment for imported module '" - .to_string(), - imp.module_path.clone(), - ), - "' while typechecking '".to_string(), - ), - module_name_str.clone(), - ), - "'".to_string(), - ), - span: imp.target_module.clone().clone().unwrap().span.clone(), - }), - module_name_str.clone(), - )]), - }) - .iter() - .cloned(), - ); - } - __result - }); - let local_bindings = module_items(module.module.clone()).iter().cloned().fold( - v2_rt::rc_empty_map::>(), - |acc: Rc>>, item: Rc| { - let item_ident = intern( - &intern_table, - &authored_name_at(source_indices.clone(), &item), - ) - .id - .clone(); - let has_structure = (item.connective.clone() != Connective::NoConnective); - if has_structure.clone() { +}) + } else { + v2_rt::rc_map_merge(acc.clone(), typed_parent.type_env.clone().bindings.clone()) + }, + None => acc.clone(), +}); +let import_recursive = parent_envs.clone().iter().cloned().fold(Rc::new(vec![]), |acc: _, env: Rc| v2_rt::concat(acc, env.recursive_types.clone())); +let import_recursive_set = parent_envs.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, env: Rc| v2_rt::rc_map_merge(acc, env.recursive_type_set.clone())); +let import_inductive_fields = parent_envs.clone().iter().cloned().fold(v2_rt::rc_empty_map::>>>(), |acc: Rc>>>>, env: Rc| merge_inductive_fields(acc, &env.inductive_fields.clone())); +let import_env = Rc::new(TypeEnv { + bindings: import_bindings, + recursive_types: import_recursive, + recursive_type_set: import_recursive_set, + inductive_fields: import_inductive_fields, + source_indices: source_indices.clone(), + intern_table: intern_table.clone(), +}); +let import_diags = Rc::new({ let mut __result = Vec::new(); for imp in module.resolved_imports.clone().iter().cloned() { __result.extend((*match v2_rt::map_get(&parent_index, imp.module_path.clone()) { + Some(_) => Rc::new(vec![]), + None => Rc::new(vec![make_error_node(Rc::new(CompilerDiagnostic::InternalError { + message: v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("missing parent environment for imported module '".to_string(), imp.module_path.clone()), "' while typechecking '".to_string()), module_name_str.clone()), "'".to_string()), + span: imp.target_module.clone().clone().unwrap().span.clone(), +}), module_name_str.clone())]), +}).iter().cloned()); } __result }); +let local_bindings = module_items(module.module.clone()).iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, item: Rc| { + let item_ident = intern(&intern_table, &authored_name_at(source_indices.clone(), &item)).id.clone(); +let has_structure = (item.connective.clone() != Connective::NoConnective); +if has_structure.clone() { + { + let type_node = Rc::new(Node { + name: item.name.clone(), + span: item.span.clone(), + ident_span: item.ident_span.clone(), + children: item.children.clone(), + connective: item.connective.clone(), + params: item.params.clone(), + inferred: None, + return_cardinality: item.return_cardinality.clone(), + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +v2_rt::rc_map_insert(acc.clone(), item_ident.clone(), Rc::new(TypeBinding { + name: authored_name_at(source_indices.clone(), &item), + resolved: type_node.clone(), + provenance: Rc::new(SubValueRelation::SubValueUnknown), +})) +} + } else { + if (((item.inferred.clone() != None) && ((item.params.clone().len() as i64) == 0)) && (item.body.clone() == None)) { { - let type_node = Rc::new(Node { - name: item.name.clone(), - span: item.span.clone(), - ident_span: item.ident_span.clone(), - children: item.children.clone(), - connective: item.connective.clone(), - params: item.params.clone(), - inferred: None, - return_cardinality: item.return_cardinality.clone(), - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - v2_rt::rc_map_insert( - acc.clone(), - item_ident.clone(), - Rc::new(TypeBinding { - name: authored_name_at(source_indices.clone(), &item), - resolved: type_node.clone(), - provenance: Rc::new(SubValueRelation::SubValueUnknown), - }), - ) - } + let alias_node = Rc::new(Node { + name: item.name.clone(), + span: item.span.clone(), + ident_span: item.ident_span.clone(), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: item.inferred.clone(), + return_cardinality: item.return_cardinality.clone(), + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +v2_rt::rc_map_insert(acc.clone(), item_ident.clone(), Rc::new(TypeBinding { + name: authored_name_at(source_indices.clone(), &item), + resolved: alias_node.clone(), + provenance: Rc::new(SubValueRelation::SubValueUnknown), +})) +} } else { - if (((item.inferred.clone() != None) - && ((item.params.clone().len() as i64) == 0)) - && (item.body.clone() == None)) - { + if ((item.transport.clone() == None) && ((item.children.clone().len() as i64) > 0)) { { - let alias_node = Rc::new(Node { - name: item.name.clone(), - span: item.span.clone(), - ident_span: item.ident_span.clone(), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: item.inferred.clone(), - return_cardinality: item.return_cardinality.clone(), - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - v2_rt::rc_map_insert( - acc.clone(), - item_ident.clone(), - Rc::new(TypeBinding { - name: authored_name_at(source_indices.clone(), &item), - resolved: alias_node.clone(), - provenance: Rc::new(SubValueRelation::SubValueUnknown), - }), - ) - } + let ref_node = nominal_ref_node(&authored_name_at(source_indices.clone(), &item), item.span.clone(), item.ident_span.clone()); +v2_rt::rc_map_insert(acc.clone(), item_ident.clone(), Rc::new(TypeBinding { + name: authored_name_at(source_indices.clone(), &item), + resolved: ref_node.clone(), + provenance: Rc::new(SubValueRelation::SubValueUnknown), +})) +} } else { - if ((item.transport.clone() == None) - && ((item.children.clone().len() as i64) > 0)) - { + if (((((item.params.clone().len() as i64) > 0) && (item.connective.clone() == Connective::NoConnective)) && (item.body.clone() == None)) && (item.transport.clone() == None)) { { - let ref_node = nominal_ref_node( - &authored_name_at(source_indices.clone(), &item), - item.span.clone(), - item.ident_span.clone(), - ); - v2_rt::rc_map_insert( - acc.clone(), - item_ident.clone(), - Rc::new(TypeBinding { - name: authored_name_at(source_indices.clone(), &item), - resolved: ref_node.clone(), - provenance: Rc::new(SubValueRelation::SubValueUnknown), - }), - ) - } + let bare_node = Rc::new(Node { + name: item.name.clone(), + span: item.span.clone(), + ident_span: item.ident_span.clone(), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: item.params.clone(), + inferred: item.inferred.clone(), + return_cardinality: item.return_cardinality.clone(), + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +v2_rt::rc_map_insert(acc.clone(), item_ident.clone(), Rc::new(TypeBinding { + name: authored_name_at(source_indices.clone(), &item), + resolved: bare_node.clone(), + provenance: Rc::new(SubValueRelation::SubValueUnknown), +})) +} } else { - if (((((item.params.clone().len() as i64) > 0) - && (item.connective.clone() == Connective::NoConnective)) - && (item.body.clone() == None)) - && (item.transport.clone() == None)) - { - { - let bare_node = Rc::new(Node { - name: item.name.clone(), - span: item.span.clone(), - ident_span: item.ident_span.clone(), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: item.params.clone(), - inferred: item.inferred.clone(), - return_cardinality: item.return_cardinality.clone(), - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - v2_rt::rc_map_insert( - acc.clone(), - item_ident.clone(), - Rc::new(TypeBinding { - name: authored_name_at(source_indices.clone(), &item), - resolved: bare_node.clone(), - provenance: Rc::new(SubValueRelation::SubValueUnknown), - }), - ) - } + if ((((((item.properties.clone().len() as i64) > 0) && (item.connective.clone() == Connective::NoConnective)) && (item.transport.clone() == None)) && (item.inferred.clone() == None)) && ((item.params.clone().len() as i64) == 0)) { + v2_rt::rc_map_insert(acc.clone(), item_ident.clone(), nominal_type_binding(&authored_name_at(source_indices.clone(), &item))) } else { - if ((((((item.properties.clone().len() as i64) > 0) - && (item.connective.clone() == Connective::NoConnective)) - && (item.transport.clone() == None)) - && (item.inferred.clone() == None)) - && ((item.params.clone().len() as i64) == 0)) - { - v2_rt::rc_map_insert( - acc.clone(), - item_ident.clone(), - nominal_type_binding(&authored_name_at( - source_indices.clone(), - &item, - )), - ) - } else { - acc.clone() - } + acc.clone() } } } } - }, - ); - let param_bindings = module_items(module.module.clone()).iter().cloned().fold( - v2_rt::rc_empty_map::>(), - |acc: Rc>>, item: Rc| { - let is_type_decl = match v2_rt::map_get( - &local_bindings, - intern( - &intern_table, - &authored_name_at(source_indices.clone(), &item), - ) - .id - .clone(), - ) { - Some(_) => true, - None => false, - }; - if (((item.params.clone().len() as i64) > 0) && is_type_decl.clone()) { - { - let result = item.params.clone().iter().cloned().fold( - acc.clone(), - |pacc: Rc>>, p: Rc| { - v2_rt::rc_map_insert( - pacc, - intern( - &intern_table, - &authored_name_at(source_indices.clone(), &p), - ) - .id - .clone(), - nominal_type_binding(&authored_name_at( - source_indices.clone(), - &p, - )), - ) - }, - ); - result.clone() - } - } else { - acc.clone() - } - }, - ); - let local_name_set = Rc::new(v2_rt::map_keys(&local_bindings)) - .iter() - .cloned() - .fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, ident: i64| { - v2_rt::rc_map_insert(acc, ident.clone(), true) - }, - ); - let all_local_bindings = v2_rt::rc_map_merge(local_bindings.clone(), param_bindings); - let pre_local_env = Rc::new(TypeEnv { - bindings: all_local_bindings, - recursive_types: Rc::new(vec![]), - recursive_type_set: v2_rt::rc_empty_map::(), - inductive_fields: v2_rt::rc_empty_map::>>>(), - source_indices: source_indices.clone(), - intern_table: intern_table.clone(), - }); - let merged = merge_envs(&Rc::new(vec![kernel, import_env, pre_local_env])); - let all_deps_map = Rc::new(v2_rt::map_values(&merged.bindings.clone())) - .iter() - .cloned() - .fold( - v2_rt::rc_empty_map::>>(), - |acc: Rc>>>, b: Rc| { - v2_rt::rc_map_insert( - acc, - b.name.clone(), - node_type_deps(&b.resolved.clone(), &source_indices), - ) - }, - ); - let str_bindings = Rc::new(v2_rt::map_values(&merged.bindings.clone())) - .iter() - .cloned() - .fold( - v2_rt::rc_empty_map::>(), - |acc: Rc>>, b: Rc| { - v2_rt::rc_map_insert(acc, b.name.clone(), b.clone()) - }, - ); - let cycle_set_str = detect_type_cycles_kahn(&all_deps_map, str_bindings); - let cycle_set = Rc::new({ - let mut __result = Vec::new(); - for name in cycle_set_str.clone().iter().cloned() { - __result.push(intern(&intern_table, &name).id.clone()); } - __result - }); - let cycle_map = cycle_set_str.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, name: String| { - v2_rt::rc_map_insert(acc, name.clone(), true) - }, - ); - let cross_type_set_str = v2_rt::rc_map_merge(cycle_map, compiler_recursive_types()); - let cross_type_set = Rc::new(v2_rt::map_keys(&cross_type_set_str)) - .iter() - .cloned() - .fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, name: String| { - v2_rt::rc_map_insert(acc, intern(&intern_table, &name).id.clone(), true) - }, - ); - let local_inductive_fields = build_item_inductive_fields( - module_items(module.module.clone()), - cross_type_set_str.clone(), - source_indices.clone(), - ); - let merged_inductive_fields = - merge_inductive_fields(merged.inductive_fields.clone(), &local_inductive_fields); - let unresolved_env = Rc::new(TypeEnv { - bindings: merged.bindings.clone(), - recursive_types: cycle_set, - recursive_type_set: cross_type_set, - inductive_fields: merged_inductive_fields, - source_indices: source_indices.clone(), - intern_table: intern_table.clone(), - }); - let resolved = resolve_env_bindings( - &unresolved_env, - module_name_str.clone(), - &local_name_set, - all_deps_map.clone(), - ); - let resolved_env_out = resolved.env.clone(); - let resolved_diags = resolved.diagnostics.clone(); - let final_env = Rc::new(TypeEnv { - bindings: resolved_env_out.bindings.clone(), - recursive_types: resolved_env_out.recursive_types.clone(), - recursive_type_set: resolved_env_out.recursive_type_set.clone(), - inductive_fields: resolved_env_out.inductive_fields.clone(), - source_indices: resolved_env_out.source_indices.clone(), - intern_table: intern_table.clone(), - }); - Rc::new(BuildTypeEnvResult { - env: final_env, - diagnostics: v2_rt::concat(import_diags, resolved_diags), - }) - } +}); +let param_bindings = module_items(module.module.clone()).iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, item: Rc| { + let is_type_decl = match v2_rt::map_get(&local_bindings, intern(&intern_table, &authored_name_at(source_indices.clone(), &item)).id.clone()) { + Some(_) => true, + None => false, +}; +if (((item.params.clone().len() as i64) > 0) && is_type_decl.clone()) { + { + let result = item.params.clone().iter().cloned().fold(acc.clone(), |pacc: Rc>>, p: Rc| v2_rt::rc_map_insert(pacc, intern(&intern_table, &authored_name_at(source_indices.clone(), &p)).id.clone(), nominal_type_binding(&authored_name_at(source_indices.clone(), &p)))); +result.clone() +} + } else { + acc.clone() + } +}); +let local_name_set = Rc::new(v2_rt::map_keys(&local_bindings)).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, ident: i64| v2_rt::rc_map_insert(acc, ident.clone(), true)); +let all_local_bindings = v2_rt::rc_map_merge(local_bindings.clone(), param_bindings); +let pre_local_env = Rc::new(TypeEnv { + bindings: all_local_bindings, + recursive_types: Rc::new(vec![]), + recursive_type_set: v2_rt::rc_empty_map::(), + inductive_fields: v2_rt::rc_empty_map::>>>(), + source_indices: source_indices.clone(), + intern_table: intern_table.clone(), +}); +let merged = merge_envs(&Rc::new(vec![kernel, import_env, pre_local_env])); +let all_deps_map = Rc::new(v2_rt::map_values(&merged.bindings.clone())).iter().cloned().fold(v2_rt::rc_empty_map::>>(), |acc: Rc>>>, b: Rc| v2_rt::rc_map_insert(acc, b.name.clone(), node_type_deps(&b.resolved.clone(), &source_indices))); +let str_bindings = Rc::new(v2_rt::map_values(&merged.bindings.clone())).iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, b: Rc| v2_rt::rc_map_insert(acc, b.name.clone(), b.clone())); +let cycle_set_str = detect_type_cycles_kahn(&all_deps_map, str_bindings); +let cycle_set = Rc::new({ let mut __result = Vec::new(); for name in cycle_set_str.clone().iter().cloned() { __result.push(intern(&intern_table, &name).id.clone()); } __result }); +let cycle_map = cycle_set_str.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, name: String| v2_rt::rc_map_insert(acc, name.clone(), true)); +let cross_type_set_str = v2_rt::rc_map_merge(cycle_map, compiler_recursive_types()); +let cross_type_set = Rc::new(v2_rt::map_keys(&cross_type_set_str)).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, name: String| v2_rt::rc_map_insert(acc, intern(&intern_table, &name).id.clone(), true)); +let local_inductive_fields = build_item_inductive_fields(module_items(module.module.clone()), cross_type_set_str.clone(), source_indices.clone()); +let merged_inductive_fields = merge_inductive_fields(merged.inductive_fields.clone(), &local_inductive_fields); +let unresolved_env = Rc::new(TypeEnv { + bindings: merged.bindings.clone(), + recursive_types: cycle_set, + recursive_type_set: cross_type_set, + inductive_fields: merged_inductive_fields, + source_indices: source_indices.clone(), + intern_table: intern_table.clone(), +}); +let resolved = resolve_env_bindings(&unresolved_env, module_name_str.clone(), &local_name_set, all_deps_map.clone()); +let resolved_env_out = resolved.env.clone(); +let resolved_diags = resolved.diagnostics.clone(); +let final_env = Rc::new(TypeEnv { + bindings: resolved_env_out.bindings.clone(), + recursive_types: resolved_env_out.recursive_types.clone(), + recursive_type_set: resolved_env_out.recursive_type_set.clone(), + inductive_fields: resolved_env_out.inductive_fields.clone(), + source_indices: resolved_env_out.source_indices.clone(), + intern_table: intern_table.clone(), +}); +Rc::new(BuildTypeEnvResult { + env: final_env, + diagnostics: v2_rt::concat(import_diags, resolved_diags), +}) +} } -pub fn build_type_env_unresolved( - module: &Rc, - parent_index: &Rc>>, - source_indices: &Rc>>, - intern_table: &Rc, -) -> Rc { +pub fn build_type_env_unresolved(module: &Rc, parent_index: &Rc>>, source_indices: &Rc>>, intern_table: &Rc) -> Rc { { - let intern_table = Rc::new(v2_rt::map_keys(&kernel_type_set())) - .iter() - .cloned() - .fold(intern_table.clone(), |t: Rc, name: String| { - intern(&t, &name).table.clone() - }); - let intern_table = Rc::new(vec!["Optional".to_string()]) - .iter() - .cloned() - .fold(intern_table.clone(), |t: Rc, name: String| { - intern(&t, &name).table.clone() - }); - let zero_span = make_span(0, 0); - let kernel_bindings = Rc::new(v2_rt::map_keys(&kernel_type_set())) - .iter() - .cloned() - .fold( - v2_rt::rc_empty_map::>(), - |acc: Rc>>, name: String| { - v2_rt::rc_map_insert( - acc, - intern(&intern_table, &name).id.clone(), - Rc::new(TypeBinding { - name: name.clone(), - resolved: Rc::new(Node { - name: name.clone(), - span: kernel_span(&name), - ident_span: Some(kernel_span(&name)), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }), - provenance: Rc::new(SubValueRelation::SubValueUnknown), - }), - ) - }, - ); - let some_value_field = Rc::new(Node { - name: "value".to_string(), - span: kernel_span(&"value".to_string()), - ident_span: Some(kernel_span(&"value".to_string())), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::TypeVariable { - id: "some_value".to_string(), - })), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - let some_variant = Rc::new(Node { - name: "Some".to_string(), - span: kernel_span(&"Some".to_string()), - ident_span: Some(kernel_span(&"Some".to_string())), - children: Rc::new(vec![some_value_field]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - let kernel_optional = Rc::new(Node { - name: "Optional".to_string(), - span: kernel_span(&"Optional".to_string()), - ident_span: Some(kernel_span(&"Optional".to_string())), - children: Rc::new(vec![some_variant, none_type()]), - connective: Connective::Disj, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - let kernel_bindings = v2_rt::rc_map_insert( - kernel_bindings.clone(), - intern(&intern_table, &"Optional".to_string()).id.clone(), - Rc::new(TypeBinding { - name: "Optional".to_string(), - resolved: kernel_optional, - provenance: Rc::new(SubValueRelation::SubValueUnknown), - }), - ); - let kernel = Rc::new(TypeEnv { - bindings: kernel_bindings.clone(), - recursive_types: Rc::new(vec![]), - recursive_type_set: v2_rt::rc_empty_map::(), - inductive_fields: v2_rt::rc_empty_map::>>>(), - source_indices: source_indices.clone(), - intern_table: intern_table.clone(), - }); - let imports_std_types = { - let mut __found = false; - for imp in module.resolved_imports.clone().iter().cloned() { - if (imp.module_path.clone().as_str() == "std.types".to_string().as_str()) { - __found = true; - break; - } - } - __found - }; - let module_name_str = authored_name_at(source_indices.clone(), &module.module.clone()); - let std_types_parent_env = if ((module_name_str.as_str() - != "std.types".to_string().as_str()) - && (imports_std_types == false)) - { + let intern_table = Rc::new(v2_rt::map_keys(&kernel_type_set())).iter().cloned().fold(intern_table.clone(), |t: Rc, name: String| intern(&t, &name).table.clone()); +let intern_table = Rc::new(vec!["Optional".to_string()]).iter().cloned().fold(intern_table.clone(), |t: Rc, name: String| intern(&t, &name).table.clone()); +let zero_span = make_span(0, 0); +let kernel_bindings = Rc::new(v2_rt::map_keys(&kernel_type_set())).iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, name: String| v2_rt::rc_map_insert(acc, intern(&intern_table, &name).id.clone(), Rc::new(TypeBinding { + name: name.clone(), + resolved: Rc::new(Node { + name: name.clone(), + span: kernel_span(&name), + ident_span: Some(kernel_span(&name)), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}), + provenance: Rc::new(SubValueRelation::SubValueUnknown), +}))); +let some_value_field = Rc::new(Node { + name: "value".to_string(), + span: kernel_span(&"value".to_string()), + ident_span: Some(kernel_span(&"value".to_string())), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::TypeVariable { + id: "some_value".to_string(), +})), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +let some_variant = Rc::new(Node { + name: "Some".to_string(), + span: kernel_span(&"Some".to_string()), + ident_span: Some(kernel_span(&"Some".to_string())), + children: Rc::new(vec![some_value_field]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +let kernel_optional = Rc::new(Node { + name: "Optional".to_string(), + span: kernel_span(&"Optional".to_string()), + ident_span: Some(kernel_span(&"Optional".to_string())), + children: Rc::new(vec![some_variant, none_type()]), + connective: Connective::Disj, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +let kernel_bindings = v2_rt::rc_map_insert(kernel_bindings.clone(), intern(&intern_table, &"Optional".to_string()).id.clone(), Rc::new(TypeBinding { + name: "Optional".to_string(), + resolved: kernel_optional, + provenance: Rc::new(SubValueRelation::SubValueUnknown), +})); +let kernel = Rc::new(TypeEnv { + bindings: kernel_bindings.clone(), + recursive_types: Rc::new(vec![]), + recursive_type_set: v2_rt::rc_empty_map::(), + inductive_fields: v2_rt::rc_empty_map::>>>(), + source_indices: source_indices.clone(), + intern_table: intern_table.clone(), +}); +let imports_std_types = { let mut __found = false; for imp in module.resolved_imports.clone().iter().cloned() { if (imp.module_path.clone().as_str() == "std.types".to_string().as_str()) { __found = true; break; } } __found }; +let module_name_str = authored_name_at(source_indices.clone(), &module.module.clone()); +let std_types_parent_env = if ((module_name_str.as_str() != "std.types".to_string().as_str()) && (imports_std_types == false)) { match v2_rt::map_get(&parent_index, "std.types".to_string()) { - Some(typed_std) => Rc::new(vec![typed_std.type_env.clone()]), - None => Rc::new(vec![]), - } + Some(typed_std) => Rc::new(vec![typed_std.type_env.clone()]), + None => Rc::new(vec![]), +} } else { Rc::new(vec![]) }; - let imported_parent_envs = Rc::new({ - let mut __result = Vec::new(); - for imp in module.resolved_imports.clone().iter().cloned() { - __result.extend( - (*match v2_rt::map_get(&parent_index, imp.module_path.clone()) { - Some(typed_parent) => Rc::new(vec![typed_parent.type_env.clone()]), - None => Rc::new(vec![]), - }) - .iter() - .cloned(), - ); - } - __result - }); - let parent_envs = v2_rt::concat(std_types_parent_env.clone(), imported_parent_envs); - let std_import_bindings = collect_parent_bindings_filtered(std_types_parent_env.clone()); - let import_bindings = module.resolved_imports.clone().iter().cloned().fold( - std_import_bindings, - |acc: Rc>>, imp: Rc| match v2_rt::map_get( - &parent_index, - imp.module_path.clone(), - ) { - Some(typed_parent) => { - if (imp.module_path.clone().as_str() == "std.types".to_string().as_str()) { - Rc::new(v2_rt::map_keys( - &typed_parent.type_env.clone().bindings.clone(), - )) - .iter() - .cloned() - .fold( - acc.clone(), - |bacc: Rc>>, ident: i64| { - let name = intern_str( - typed_parent.type_env.clone().intern_table.clone(), - ident.clone(), - ); - if is_type_variable_name(&name) { - bacc.clone() - } else { - match v2_rt::map_get( - &typed_parent.type_env.clone().bindings.clone(), - ident.clone(), - ) { - Some(binding) => v2_rt::rc_map_insert( - bacc.clone(), - ident.clone(), - binding.clone(), - ), - None => bacc.clone(), - } - } - }, - ) - } else { - v2_rt::rc_map_merge( - acc.clone(), - typed_parent.type_env.clone().bindings.clone(), - ) - } +let imported_parent_envs = Rc::new({ let mut __result = Vec::new(); for imp in module.resolved_imports.clone().iter().cloned() { __result.extend((*match v2_rt::map_get(&parent_index, imp.module_path.clone()) { + Some(typed_parent) => Rc::new(vec![typed_parent.type_env.clone()]), + None => Rc::new(vec![]), +}).iter().cloned()); } __result }); +let parent_envs = v2_rt::concat(std_types_parent_env.clone(), imported_parent_envs); +let std_import_bindings = collect_parent_bindings_filtered(std_types_parent_env.clone()); +let import_bindings = module.resolved_imports.clone().iter().cloned().fold(std_import_bindings, |acc: Rc>>, imp: Rc| match v2_rt::map_get(&parent_index, imp.module_path.clone()) { + Some(typed_parent) => if (imp.module_path.clone().as_str() == "std.types".to_string().as_str()) { + Rc::new(v2_rt::map_keys(&typed_parent.type_env.clone().bindings.clone())).iter().cloned().fold(acc.clone(), |bacc: Rc>>, ident: i64| { + let name = intern_str(typed_parent.type_env.clone().intern_table.clone(), ident.clone()); +if is_type_variable_name(&name) { + bacc.clone() + } else { + match v2_rt::map_get(&typed_parent.type_env.clone().bindings.clone(), ident.clone()) { + Some(binding) => v2_rt::rc_map_insert(bacc.clone(), ident.clone(), binding.clone()), + None => bacc.clone(), +} } - None => acc.clone(), - }, - ); - let import_recursive = parent_envs - .clone() - .iter() - .cloned() - .fold(Rc::new(vec![]), |acc: _, env: Rc| { - v2_rt::concat(acc, env.recursive_types.clone()) - }); - let import_recursive_set = parent_envs.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, env: Rc| { - v2_rt::rc_map_merge(acc, env.recursive_type_set.clone()) - }, - ); - let import_inductive_fields = parent_envs.clone().iter().cloned().fold( - v2_rt::rc_empty_map::>>>(), - |acc: Rc>>>>, env: Rc| { - merge_inductive_fields(acc, &env.inductive_fields.clone()) - }, - ); - let import_env = Rc::new(TypeEnv { - bindings: import_bindings, - recursive_types: import_recursive, - recursive_type_set: import_recursive_set, - inductive_fields: import_inductive_fields, - source_indices: source_indices.clone(), - intern_table: intern_table.clone(), - }); - let local_bindings = module_items(module.module.clone()).iter().cloned().fold( - v2_rt::rc_empty_map::>(), - |acc: Rc>>, item: Rc| { - let item_ident = intern( - &intern_table, - &authored_name_at(source_indices.clone(), &item), - ) - .id - .clone(); - let has_structure = (item.connective.clone() != Connective::NoConnective); - if has_structure.clone() { +}) + } else { + v2_rt::rc_map_merge(acc.clone(), typed_parent.type_env.clone().bindings.clone()) + }, + None => acc.clone(), +}); +let import_recursive = parent_envs.clone().iter().cloned().fold(Rc::new(vec![]), |acc: _, env: Rc| v2_rt::concat(acc, env.recursive_types.clone())); +let import_recursive_set = parent_envs.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, env: Rc| v2_rt::rc_map_merge(acc, env.recursive_type_set.clone())); +let import_inductive_fields = parent_envs.clone().iter().cloned().fold(v2_rt::rc_empty_map::>>>(), |acc: Rc>>>>, env: Rc| merge_inductive_fields(acc, &env.inductive_fields.clone())); +let import_env = Rc::new(TypeEnv { + bindings: import_bindings, + recursive_types: import_recursive, + recursive_type_set: import_recursive_set, + inductive_fields: import_inductive_fields, + source_indices: source_indices.clone(), + intern_table: intern_table.clone(), +}); +let local_bindings = module_items(module.module.clone()).iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, item: Rc| { + let item_ident = intern(&intern_table, &authored_name_at(source_indices.clone(), &item)).id.clone(); +let has_structure = (item.connective.clone() != Connective::NoConnective); +if has_structure.clone() { + { + let type_node = Rc::new(Node { + name: item.name.clone(), + span: item.span.clone(), + ident_span: item.ident_span.clone(), + children: item.children.clone(), + connective: item.connective.clone(), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: item.return_cardinality.clone(), + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +v2_rt::rc_map_insert(acc.clone(), item_ident.clone(), Rc::new(TypeBinding { + name: authored_name_at(source_indices.clone(), &item), + resolved: type_node.clone(), + provenance: Rc::new(SubValueRelation::SubValueUnknown), +})) +} + } else { + if (((item.inferred.clone() != None) && ((item.params.clone().len() as i64) == 0)) && (item.body.clone() == None)) { { - let type_node = Rc::new(Node { - name: item.name.clone(), - span: item.span.clone(), - ident_span: item.ident_span.clone(), - children: item.children.clone(), - connective: item.connective.clone(), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: item.return_cardinality.clone(), - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - v2_rt::rc_map_insert( - acc.clone(), - item_ident.clone(), - Rc::new(TypeBinding { - name: authored_name_at(source_indices.clone(), &item), - resolved: type_node.clone(), - provenance: Rc::new(SubValueRelation::SubValueUnknown), - }), - ) - } + let alias_node = Rc::new(Node { + name: item.name.clone(), + span: item.span.clone(), + ident_span: item.ident_span.clone(), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: item.inferred.clone(), + return_cardinality: item.return_cardinality.clone(), + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +v2_rt::rc_map_insert(acc.clone(), item_ident.clone(), Rc::new(TypeBinding { + name: authored_name_at(source_indices.clone(), &item), + resolved: alias_node.clone(), + provenance: Rc::new(SubValueRelation::SubValueUnknown), +})) +} } else { - if (((item.inferred.clone() != None) - && ((item.params.clone().len() as i64) == 0)) - && (item.body.clone() == None)) - { + if ((item.transport.clone() == None) && ((item.children.clone().len() as i64) > 0)) { { - let alias_node = Rc::new(Node { - name: item.name.clone(), - span: item.span.clone(), - ident_span: item.ident_span.clone(), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: item.inferred.clone(), - return_cardinality: item.return_cardinality.clone(), - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - v2_rt::rc_map_insert( - acc.clone(), - item_ident.clone(), - Rc::new(TypeBinding { - name: authored_name_at(source_indices.clone(), &item), - resolved: alias_node.clone(), - provenance: Rc::new(SubValueRelation::SubValueUnknown), - }), - ) - } + let ref_node = nominal_ref_node(&authored_name_at(source_indices.clone(), &item), item.span.clone(), item.ident_span.clone()); +v2_rt::rc_map_insert(acc.clone(), item_ident.clone(), Rc::new(TypeBinding { + name: authored_name_at(source_indices.clone(), &item), + resolved: ref_node.clone(), + provenance: Rc::new(SubValueRelation::SubValueUnknown), +})) +} } else { - if ((item.transport.clone() == None) - && ((item.children.clone().len() as i64) > 0)) - { - { - let ref_node = nominal_ref_node( - &authored_name_at(source_indices.clone(), &item), - item.span.clone(), - item.ident_span.clone(), - ); - v2_rt::rc_map_insert( - acc.clone(), - item_ident.clone(), - Rc::new(TypeBinding { - name: authored_name_at(source_indices.clone(), &item), - resolved: ref_node.clone(), - provenance: Rc::new(SubValueRelation::SubValueUnknown), - }), - ) - } + if ((((((item.properties.clone().len() as i64) > 0) && (item.connective.clone() == Connective::NoConnective)) && (item.transport.clone() == None)) && (item.inferred.clone() == None)) && ((item.params.clone().len() as i64) == 0)) { + v2_rt::rc_map_insert(acc.clone(), item_ident.clone(), nominal_type_binding(&authored_name_at(source_indices.clone(), &item))) } else { - if ((((((item.properties.clone().len() as i64) > 0) - && (item.connective.clone() == Connective::NoConnective)) - && (item.transport.clone() == None)) - && (item.inferred.clone() == None)) - && ((item.params.clone().len() as i64) == 0)) - { - v2_rt::rc_map_insert( - acc.clone(), - item_ident.clone(), - nominal_type_binding(&authored_name_at( - source_indices.clone(), - &item, - )), - ) - } else { - acc.clone() - } + acc.clone() } } } - }, - ); - let pre_local_env = Rc::new(TypeEnv { - bindings: local_bindings, - recursive_types: Rc::new(vec![]), - recursive_type_set: v2_rt::rc_empty_map::(), - inductive_fields: v2_rt::rc_empty_map::>>>(), - source_indices: source_indices.clone(), - intern_table: intern_table.clone(), - }); - let merged = merge_envs(&Rc::new(vec![kernel, import_env, pre_local_env])); - let all_deps_map = Rc::new(v2_rt::map_values(&merged.bindings.clone())) - .iter() - .cloned() - .fold( - v2_rt::rc_empty_map::>>(), - |acc: Rc>>>, b: Rc| { - v2_rt::rc_map_insert( - acc, - b.name.clone(), - node_type_deps(&b.resolved.clone(), &source_indices), - ) - }, - ); - let str_bindings = Rc::new(v2_rt::map_values(&merged.bindings.clone())) - .iter() - .cloned() - .fold( - v2_rt::rc_empty_map::>(), - |acc: Rc>>, b: Rc| { - v2_rt::rc_map_insert(acc, b.name.clone(), b.clone()) - }, - ); - let cycle_set_str = detect_type_cycles_kahn(&all_deps_map, str_bindings); - let cycle_set = Rc::new({ - let mut __result = Vec::new(); - for name in cycle_set_str.clone().iter().cloned() { - __result.push(intern(&intern_table, &name).id.clone()); } - __result - }); - let cycle_map = cycle_set_str.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, name: String| { - v2_rt::rc_map_insert(acc, name.clone(), true) - }, - ); - let cross_type_set_str = v2_rt::rc_map_merge(cycle_map, compiler_recursive_types()); - let cross_type_set = Rc::new(v2_rt::map_keys(&cross_type_set_str)) - .iter() - .cloned() - .fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, name: String| { - v2_rt::rc_map_insert(acc, intern(&intern_table, &name).id.clone(), true) - }, - ); - let local_inductive_fields = build_item_inductive_fields( - module_items(module.module.clone()), - cross_type_set_str.clone(), - source_indices.clone(), - ); - let merged_inductive_fields = - merge_inductive_fields(merged.inductive_fields.clone(), &local_inductive_fields); - let unresolved_env = Rc::new(TypeEnv { - bindings: merged.bindings.clone(), - recursive_types: cycle_set, - recursive_type_set: cross_type_set, - inductive_fields: merged_inductive_fields, - source_indices: source_indices.clone(), - intern_table: intern_table.clone(), - }); - Rc::new(BuildTypeEnvResult { - env: unresolved_env, - diagnostics: Rc::new(vec![]), - }) - } +}); +let pre_local_env = Rc::new(TypeEnv { + bindings: local_bindings, + recursive_types: Rc::new(vec![]), + recursive_type_set: v2_rt::rc_empty_map::(), + inductive_fields: v2_rt::rc_empty_map::>>>(), + source_indices: source_indices.clone(), + intern_table: intern_table.clone(), +}); +let merged = merge_envs(&Rc::new(vec![kernel, import_env, pre_local_env])); +let all_deps_map = Rc::new(v2_rt::map_values(&merged.bindings.clone())).iter().cloned().fold(v2_rt::rc_empty_map::>>(), |acc: Rc>>>, b: Rc| v2_rt::rc_map_insert(acc, b.name.clone(), node_type_deps(&b.resolved.clone(), &source_indices))); +let str_bindings = Rc::new(v2_rt::map_values(&merged.bindings.clone())).iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, b: Rc| v2_rt::rc_map_insert(acc, b.name.clone(), b.clone())); +let cycle_set_str = detect_type_cycles_kahn(&all_deps_map, str_bindings); +let cycle_set = Rc::new({ let mut __result = Vec::new(); for name in cycle_set_str.clone().iter().cloned() { __result.push(intern(&intern_table, &name).id.clone()); } __result }); +let cycle_map = cycle_set_str.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, name: String| v2_rt::rc_map_insert(acc, name.clone(), true)); +let cross_type_set_str = v2_rt::rc_map_merge(cycle_map, compiler_recursive_types()); +let cross_type_set = Rc::new(v2_rt::map_keys(&cross_type_set_str)).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, name: String| v2_rt::rc_map_insert(acc, intern(&intern_table, &name).id.clone(), true)); +let local_inductive_fields = build_item_inductive_fields(module_items(module.module.clone()), cross_type_set_str.clone(), source_indices.clone()); +let merged_inductive_fields = merge_inductive_fields(merged.inductive_fields.clone(), &local_inductive_fields); +let unresolved_env = Rc::new(TypeEnv { + bindings: merged.bindings.clone(), + recursive_types: cycle_set, + recursive_type_set: cross_type_set, + inductive_fields: merged_inductive_fields, + source_indices: source_indices.clone(), + intern_table: intern_table.clone(), +}); +Rc::new(BuildTypeEnvResult { + env: unresolved_env, + diagnostics: Rc::new(vec![]), +}) +} } -pub fn build_item_info( - item: &Rc, - source_indices: &Rc>>, - module_name: String, -) -> Rc { +pub fn build_item_info(item: &Rc, source_indices: &Rc>>, module_name: String) -> Rc { { let kind = item_kind(&item); - let res_names = Rc::new({ - let mut __result = Vec::new(); - for u in item.uses.clone().iter().cloned() { - __result.push(resource_use_name_at(u.clone(), source_indices.clone())); - } - __result - }); - let item_name_str = authored_name_at(source_indices.clone(), &item); - match kind.clone() { - ItemKind::FuncItem => Rc::new(ItemInfo { - name: item_name_str.clone(), - module_name: module_name, - kind: kind.clone(), - service_names: if (item.body.clone() == None) { - Rc::new(vec![]) - } else { - collect_typed_service_calls( - item.body.clone().clone().unwrap(), - source_indices.clone(), - ) - }, - resource_names: res_names, - params: item.params.clone(), - is_self_recursive: false, - has_non_tail_self_call: false, - }), - ItemKind::FnItem => Rc::new(ItemInfo { - name: item_name_str.clone(), - module_name: module_name, - kind: kind.clone(), - service_names: if (item.body.clone() == None) { - Rc::new(vec![]) - } else { - collect_typed_service_calls( - item.body.clone().clone().unwrap(), - source_indices.clone(), - ) - }, - resource_names: res_names, - params: item.params.clone(), - is_self_recursive: if (item.body.clone() == None) { - false - } else { - expr_has_self_call( - &item.body.clone().clone().unwrap(), - &item_name_str, - &source_indices, - ) - }, - has_non_tail_self_call: if (item.body.clone() == None) { - false - } else { - expr_has_non_tail_self_call( - &item.body.clone().clone().unwrap(), - &item_name_str, - true, - &source_indices, - ) - }, - }), - _ => Rc::new(ItemInfo { - name: item_name_str.clone(), - module_name: module_name, - kind: kind.clone(), - service_names: Rc::new(vec![]), - resource_names: res_names, - params: item.params.clone(), - is_self_recursive: false, - has_non_tail_self_call: false, - }), - } - } +let res_names = Rc::new({ let mut __result = Vec::new(); for u in item.uses.clone().iter().cloned() { __result.push(resource_use_name_at(u.clone(), source_indices.clone())); } __result }); +let item_name_str = authored_name_at(source_indices.clone(), &item); +match kind.clone() { + ItemKind::FuncItem => Rc::new(ItemInfo { + name: item_name_str.clone(), + module_name: module_name, + kind: kind.clone(), + service_names: if (item.body.clone() == None) { + Rc::new(vec![]) + } else { + collect_typed_service_calls(item.body.clone().clone().unwrap(), source_indices.clone()) + }, + resource_names: res_names, + params: item.params.clone(), + is_self_recursive: false, + has_non_tail_self_call: false, +}), + ItemKind::FnItem => Rc::new(ItemInfo { + name: item_name_str.clone(), + module_name: module_name, + kind: kind.clone(), + service_names: if (item.body.clone() == None) { + Rc::new(vec![]) + } else { + collect_typed_service_calls(item.body.clone().clone().unwrap(), source_indices.clone()) + }, + resource_names: res_names, + params: item.params.clone(), + is_self_recursive: if (item.body.clone() == None) { + false + } else { + expr_has_self_call(&item.body.clone().clone().unwrap(), &item_name_str, &source_indices) + }, + has_non_tail_self_call: if (item.body.clone() == None) { + false + } else { + expr_has_non_tail_self_call(&item.body.clone().clone().unwrap(), &item_name_str, true, &source_indices) + }, +}), + _ => Rc::new(ItemInfo { + name: item_name_str.clone(), + module_name: module_name, + kind: kind.clone(), + service_names: Rc::new(vec![]), + resource_names: res_names, + params: item.params.clone(), + is_self_recursive: false, + has_non_tail_self_call: false, +}), +} +} } -pub fn analyze_item( - item: Rc, - env: &Rc, - module_name: &String, -) -> Rc { +pub fn analyze_item(item: Rc, env: &Rc, module_name: &String) -> Rc { { let resolved = resolve_item_types(&item, &env, &module_name); - let ritem = resolved.item.clone(); - let is_func = ((ritem.params.clone().len() as i64) > 0); - let is_zero_arg_func = ((((ritem.params.clone().len() as i64) == 0) - && (ritem.inferred.clone() != None)) - && (ritem.body.clone() != None)); - let func_sig = if (is_func || is_zero_arg_func) { +let ritem = resolved.item.clone(); +let is_func = ((ritem.params.clone().len() as i64) > 0); +let is_zero_arg_func = ((((ritem.params.clone().len() as i64) == 0) && (ritem.inferred.clone() != None)) && (ritem.body.clone() != None)); +let func_sig = if (is_func || is_zero_arg_func) { { let declared_rt = if (ritem.inferred.clone() != None) { Some(resolved_type(ritem.clone())) } else { None }; - Some(Rc::new(DeclaredFuncSig { - name: authored_name_at(env.source_indices.clone(), &ritem), - params: ritem.params.clone(), - inferred: declared_rt, - is_async: ((ritem.uses.clone().len() as i64) > 0), - output_provenance: Rc::new(vec![]), - variant_provenance: v2_rt::rc_empty_map::< - String, - Rc>>>>, - >(), - })) - } +Some(Rc::new(DeclaredFuncSig { + name: authored_name_at(env.source_indices.clone(), &ritem), + params: ritem.params.clone(), + inferred: declared_rt, + is_async: ((ritem.uses.clone().len() as i64) > 0), + output_provenance: Rc::new(vec![]), + variant_provenance: v2_rt::rc_empty_map::>>>>>(), +})) +} } else { None }; - let svc_entries = - if ((ritem.transport.clone() != None) && ((ritem.children.clone().len() as i64) > 0)) { - Rc::new({ - let mut __result = Vec::new(); - for c in ritem.children.clone().iter().cloned() { - __result.push(service_op_entry(&c, &env.source_indices.clone())); - } - __result - }) - } else { - Rc::new(vec![]) - }; - let svc_local = - if ((ritem.transport.clone() != None) && ((ritem.children.clone().len() as i64) > 0)) { - { - let root = namespace_root_from_properties( - ritem.properties.clone(), - authored_name_at(env.source_indices.clone(), &ritem), - env.source_indices.clone(), - ); - Some(nominal_type_binding(&root)) - } - } else { - None - }; - Rc::new(ItemContribution { - resolved_item: ritem.clone(), - resolve_diagnostics: resolved.diagnostics.clone(), - func_sig: func_sig, - svc_entries: svc_entries, - svc_local: svc_local, - item_info: build_item_info(&ritem, &env.source_indices.clone(), module_name.clone()), - }) - } +let svc_entries = if ((ritem.transport.clone() != None) && ((ritem.children.clone().len() as i64) > 0)) { + Rc::new({ let mut __result = Vec::new(); for c in ritem.children.clone().iter().cloned() { __result.push(service_op_entry(&c, &env.source_indices.clone())); } __result }) + } else { + Rc::new(vec![]) + }; +let svc_local = if ((ritem.transport.clone() != None) && ((ritem.children.clone().len() as i64) > 0)) { + { + let root = namespace_root_from_properties(ritem.properties.clone(), authored_name_at(env.source_indices.clone(), &ritem), env.source_indices.clone()); +Some(nominal_type_binding(&root)) +} + } else { + None + }; +Rc::new(ItemContribution { + resolved_item: ritem.clone(), + resolve_diagnostics: resolved.diagnostics.clone(), + func_sig: func_sig, + svc_entries: svc_entries, + svc_local: svc_local, + item_info: build_item_info(&ritem, &env.source_indices.clone(), module_name.clone()), +}) +} } -pub fn fold_module_contributions( - mut remaining: Rc>>, - mut resolved_items: Rc>>, - mut func_sigs: Rc>>, - mut svc_registry: Rc>>>>, - mut svc_locals: Rc>>, - mut item_registry: Rc>>, - mut diag_chunks: Rc>>>>, - mut source_indices: Rc>>, -) -> Rc { +pub fn fold_module_contributions(mut remaining: Rc>>, mut resolved_items: Rc>>, mut func_sigs: Rc>>, mut svc_registry: Rc>>>>, mut svc_locals: Rc>>, mut item_registry: Rc>>, mut diag_chunks: Rc>>>>, mut source_indices: Rc>>) -> Rc { loop { match remaining.clone().first().cloned() { - None => { - break Rc::new(LocalContributionState { - resolved_items: resolved_items, - func_sigs: func_sigs, - svc_registry: svc_registry, - svc_locals: svc_locals, - item_registry: item_registry, - diag_chunks: diag_chunks, - }); - } - Some(contribution) => { - let next_func_sigs = match contribution.func_sig.clone() { - Some(sig) => v2_rt::rc_map_insert(func_sigs, sig.name.clone(), sig.clone()), - None => func_sigs, - }; - let next_svc_registry = if ((contribution.svc_entries.clone().len() as i64) > 0) { - v2_rt::rc_map_insert( - svc_registry, - authored_name_at( - source_indices.clone(), - &contribution.resolved_item.clone(), - ), - contribution.svc_entries.clone(), - ) - } else { - svc_registry - }; - let next_svc_locals = match contribution.svc_local.clone() { - Some(binding) => { - v2_rt::rc_map_insert(svc_locals, binding.name.clone(), binding.clone()) - } - None => svc_locals, - }; - { - let __tco_0 = Rc::new( - remaining - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ); - let __tco_1 = - v2_rt::rc_list_push(resolved_items, contribution.resolved_item.clone()); - let __tco_2 = next_func_sigs; - let __tco_3 = next_svc_registry; - let __tco_4 = next_svc_locals; - let __tco_5 = v2_rt::rc_map_insert( - item_registry, - contribution.item_info.clone().name.clone(), - contribution.item_info.clone(), - ); - let __tco_6 = - v2_rt::rc_list_push(diag_chunks, contribution.resolve_diagnostics.clone()); - remaining = __tco_0; - resolved_items = __tco_1; - func_sigs = __tco_2; - svc_registry = __tco_3; - svc_locals = __tco_4; - item_registry = __tco_5; - diag_chunks = __tco_6; - continue; - } - } - } - } -} - -pub fn build_module_context( - contributions: Rc>>, - parent_index: Rc>>, - resolved_imports: &Rc>>, - env: &Rc, - module_name: &String, -) -> Rc { + None => { break Rc::new(LocalContributionState { + resolved_items: resolved_items, + func_sigs: func_sigs, + svc_registry: svc_registry, + svc_locals: svc_locals, + item_registry: item_registry, + diag_chunks: diag_chunks, +}); }, + Some(contribution) => { let next_func_sigs = match contribution.func_sig.clone() { + Some(sig) => v2_rt::rc_map_insert(func_sigs, sig.name.clone(), sig.clone()), + None => func_sigs, +}; +let next_svc_registry = if ((contribution.svc_entries.clone().len() as i64) > 0) { + v2_rt::rc_map_insert(svc_registry, authored_name_at(source_indices.clone(), &contribution.resolved_item.clone()), contribution.svc_entries.clone()) + } else { + svc_registry + }; +let next_svc_locals = match contribution.svc_local.clone() { + Some(binding) => v2_rt::rc_map_insert(svc_locals, binding.name.clone(), binding.clone()), + None => svc_locals, +}; +{ + let __tco_0 = Rc::new(remaining.iter().cloned().skip(1 as usize).collect::>()); +let __tco_1 = v2_rt::rc_list_push(resolved_items, contribution.resolved_item.clone()); +let __tco_2 = next_func_sigs; +let __tco_3 = next_svc_registry; +let __tco_4 = next_svc_locals; +let __tco_5 = v2_rt::rc_map_insert(item_registry, contribution.item_info.clone().name.clone(), contribution.item_info.clone()); +let __tco_6 = v2_rt::rc_list_push(diag_chunks, contribution.resolve_diagnostics.clone()); +remaining = __tco_0; +resolved_items = __tco_1; +func_sigs = __tco_2; +svc_registry = __tco_3; +svc_locals = __tco_4; +item_registry = __tco_5; +diag_chunks = __tco_6; +continue; +} }, +} +} +} + +pub fn build_module_context(contributions: Rc>>, parent_index: Rc>>, resolved_imports: &Rc>>, env: &Rc, module_name: &String) -> Rc { { - let local = fold_module_contributions( - contributions, - Rc::new(vec![]), - v2_rt::rc_empty_map::>(), - v2_rt::rc_empty_map::>>>(), - v2_rt::rc_empty_map::>(), - v2_rt::rc_empty_map::>(), - Rc::new(vec![]), - env.source_indices.clone(), - ); - let imported_enum_names = resolved_imports.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, imp: Rc| { - imp.specific_names.clone().iter().cloned().fold( - acc, - |inner: Rc>, n: String| { - v2_rt::rc_map_insert(inner, n.clone(), true) - }, - ) - }, - ); - let variant_fold = Rc::new(v2_rt::map_values(&env.bindings.clone())).iter().cloned().fold(Rc::new(VariantFoldState { + let local = fold_module_contributions(contributions, Rc::new(vec![]), v2_rt::rc_empty_map::>(), v2_rt::rc_empty_map::>>>(), v2_rt::rc_empty_map::>(), v2_rt::rc_empty_map::>(), Rc::new(vec![]), env.source_indices.clone()); +let imported_enum_names = resolved_imports.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, imp: Rc| imp.specific_names.clone().iter().cloned().fold(acc, |inner: Rc>, n: String| v2_rt::rc_map_insert(inner, n.clone(), true))); +let variant_fold = Rc::new(v2_rt::map_values(&env.bindings.clone())).iter().cloned().fold(Rc::new(VariantFoldState { locals: v2_rt::rc_empty_map::>(), collision_errors: Rc::new(vec![]), }), |acc: Rc, binding: Rc| { @@ -10872,59 +6250,22 @@ if (curr_is_imported.clone() && prev_is_imported.clone()) { acc.clone() } }); - let imported_variant_locals = variant_fold.locals.clone(); - let variant_collision_errors = variant_fold.collision_errors.clone(); - let env_variant_locals = variant_locals_from_items( - local.resolved_items.clone(), - imported_variant_locals, - env.source_indices.clone(), - ); - let merged_scope = merge_scope_from_imports( - resolved_imports.clone(), - parent_index, - env.clone(), - v2_rt::rc_empty_map::>(), - local.svc_registry.clone(), - local.svc_locals.clone(), - ); - let all_declared_sigs = - v2_rt::rc_map_merge(merged_scope.func_sigs.clone(), local.func_sigs.clone()); - let resolve_result = resolve_func_sigs( - &all_declared_sigs, - &local.resolved_items.clone(), - module_name.clone(), - &env.source_indices.clone(), - ); - let all_locals = Rc::new(v2_rt::map_values(&merged_scope.svc_locals.clone())) - .iter() - .cloned() - .fold( - env_variant_locals, - |acc: Rc>>, binding: Rc| { - v2_rt::rc_map_insert(acc, binding.name.clone(), binding.clone()) - }, - ); - Rc::new(ModuleContext { - resolved_items: local.resolved_items.clone(), - func_env: resolve_result.func_env.clone(), - svc_registry: merged_scope.svc_registry.clone(), - locals: all_locals, - item_registry: local.item_registry.clone(), - diagnostics: v2_rt::concat( - v2_rt::concat( - Rc::new({ - let mut __result = Vec::new(); - for c in local.diag_chunks.clone().iter().cloned() { - __result.extend((*c.clone()).iter().cloned()); - } - __result - }), - resolve_result.diagnostics.clone(), - ), - variant_collision_errors, - ), - }) - } +let imported_variant_locals = variant_fold.locals.clone(); +let variant_collision_errors = variant_fold.collision_errors.clone(); +let env_variant_locals = variant_locals_from_items(local.resolved_items.clone(), imported_variant_locals, env.source_indices.clone()); +let merged_scope = merge_scope_from_imports(resolved_imports.clone(), parent_index, env.clone(), v2_rt::rc_empty_map::>(), local.svc_registry.clone(), local.svc_locals.clone()); +let all_declared_sigs = v2_rt::rc_map_merge(merged_scope.func_sigs.clone(), local.func_sigs.clone()); +let resolve_result = resolve_func_sigs(&all_declared_sigs, &local.resolved_items.clone(), module_name.clone(), &env.source_indices.clone()); +let all_locals = Rc::new(v2_rt::map_values(&merged_scope.svc_locals.clone())).iter().cloned().fold(env_variant_locals, |acc: Rc>>, binding: Rc| v2_rt::rc_map_insert(acc, binding.name.clone(), binding.clone())); +Rc::new(ModuleContext { + resolved_items: local.resolved_items.clone(), + func_env: resolve_result.func_env.clone(), + svc_registry: merged_scope.svc_registry.clone(), + locals: all_locals, + item_registry: local.item_registry.clone(), + diagnostics: v2_rt::concat(v2_rt::concat(Rc::new({ let mut __result = Vec::new(); for c in local.diag_chunks.clone().iter().cloned() { __result.extend((*c.clone()).iter().cloned()); } __result }), resolve_result.diagnostics.clone()), variant_collision_errors), +}) +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -10933,174 +6274,90 @@ pub struct TypecheckModuleResult { pub diagnostics: Rc>>, } -pub fn typecheck_module( - resolved: &Rc, - parent_index: &Rc>>, - source_indices: &Rc>>, - intern_table: Rc, -) -> Rc { +pub fn typecheck_module(resolved: &Rc, parent_index: &Rc>>, source_indices: &Rc>>, intern_table: Rc) -> Rc { { let env_result = build_type_env(&resolved, &parent_index, &source_indices, &intern_table); - let env = env_result.env.clone(); - let env_diags = env_result.diagnostics.clone(); - let env_errors = Rc::new({ - let mut __result = Vec::new(); - for d in env_diags.clone().iter().cloned() { - if is_error_diagnostic(d.diagnostic.clone()) { - __result.push(d); - } - } - __result - }); - let seed_diags = builtin_kernel_seed_diagnostics(); - if ((env_errors.len() as i64) > 0) { +let env = env_result.env.clone(); +let env_diags = env_result.diagnostics.clone(); +let env_errors = Rc::new({ let mut __result = Vec::new(); for d in env_diags.clone().iter().cloned() { if is_error_diagnostic(d.diagnostic.clone()) { __result.push(d); } } __result }); +let seed_diags = builtin_kernel_seed_diagnostics(); +if ((env_errors.len() as i64) > 0) { return Rc::new(TypecheckModuleResult { - typed: Rc::new(TypedModule { - module: resolved.module.clone(), - items: Rc::new(vec![]), - type_env: env.clone(), - func_env: Rc::new(ResolvedFuncEnv { - signatures: v2_rt::rc_empty_map::>(), - }), - item_registry: v2_rt::rc_empty_map::>(), - }), - diagnostics: v2_rt::concat(env_diags.clone(), seed_diags.clone()), - }); + typed: Rc::new(TypedModule { + module: resolved.module.clone(), + items: Rc::new(vec![]), + type_env: env.clone(), + func_env: Rc::new(ResolvedFuncEnv { + signatures: v2_rt::rc_empty_map::>(), +}), + item_registry: v2_rt::rc_empty_map::>(), +}), + diagnostics: v2_rt::concat(env_diags.clone(), seed_diags.clone()), +}) } - let resolved_module_name = - authored_name_at(source_indices.clone(), &resolved.module.clone()); - let contributions = Rc::new({ - let mut __result = Vec::new(); - for item in module_items(resolved.module.clone()).iter().cloned() { - __result.push(analyze_item(item.clone(), &env, &resolved_module_name)); - } - __result - }); - let ctx = build_module_context( - contributions, - parent_index.clone(), - &resolved.resolved_imports.clone(), - &env, - &resolved_module_name, - ); - let data_locals = ctx.resolved_items.clone().iter().cloned().fold( - ctx.locals.clone(), - |acc: Rc>>, item: Rc| { - if ((((item.body.clone() != None) && ((item.params.clone().len() as i64) == 0)) - && (item.inferred.clone() == None)) - && (item.type_annotation.clone() != None)) - { - v2_rt::rc_map_insert( - acc.clone(), - authored_name_at(source_indices.clone(), &item), - Rc::new(TypeBinding { - name: authored_name_at(source_indices.clone(), &item), - resolved: item.type_annotation.clone().clone().unwrap(), - provenance: Rc::new(SubValueRelation::SubValueUnknown), - }), - ) - } else { - acc.clone() - } - }, - ); - let infer_scope = Rc::new(InferScope { - type_env: env.clone(), - func_env: ctx.func_env.clone(), - locals: data_locals.clone(), - match_bound_names: v2_rt::rc_empty_map::(), - module_name: resolved_module_name.clone(), - service_registry: ctx.svc_registry.clone(), - item_registry: ctx.item_registry.clone(), - lambda_param_provenance: v2_rt::rc_empty_map::>(), - }); - let typed_item_results = infer_items(ctx.resolved_items.clone(), infer_scope); - let typed_items = Rc::new({ - let mut __result = Vec::new(); - for tir in typed_item_results.clone().iter().cloned() { - __result.push(tir.item.clone()); - } - __result - }); - let infer_diags = Rc::new({ - let mut __result = Vec::new(); - for tir in typed_item_results.clone().iter().cloned() { - __result.extend((*tir.diagnostics.clone()).iter().cloned()); - } - __result - }); - let updated_func_env = populate_output_provenance( - typed_items.clone(), - ctx.func_env.clone(), - env.clone(), - data_locals.clone(), - ); - let reannotated_items = Rc::new({ - let mut __result = Vec::new(); - for item in typed_items.clone().iter().cloned() { - __result.push( - if (item.is_self_recursive.clone() && (item.body.clone() != None)) { - Rc::new(Node { - name: item.name.clone(), - span: item.span.clone(), - ident_span: item.ident_span.clone(), - children: item.children.clone(), - params: item.params.clone(), - inferred: item.inferred.clone(), - return_cardinality: item.return_cardinality.clone(), - uses: item.uses.clone(), - body: Some(annotate_descent_evidence( - item.body.clone().clone().unwrap(), - authored_name_at(source_indices.clone(), &item), - &item.params.clone(), - &env, - data_locals.clone(), - updated_func_env.signatures.clone(), - )), - connective: item.connective.clone(), - transport: item.transport.clone(), - properties: item.properties.clone(), - type_annotation: item.type_annotation.clone(), - is_self_recursive: item.is_self_recursive.clone(), - has_non_tail_self_call: item.has_non_tail_self_call.clone(), - match_pattern: item.match_pattern.clone(), - expr_data: item.expr_data.clone(), - ident: None, - }) - } else { - item.clone() - }, - ); - } - __result - }); - let typed_base = module_node( - &resolved_module_name, - module_imports(resolved.module.clone()), - ctx.resolved_items.clone(), - &resolved.module.clone().span.clone(), - ); - let typed_module = Rc::new(Node { - ident_span: resolved.module.clone().ident_span.clone(), - ..(*typed_base).clone() +let resolved_module_name = authored_name_at(source_indices.clone(), &resolved.module.clone()); +let contributions = Rc::new({ let mut __result = Vec::new(); for item in module_items(resolved.module.clone()).iter().cloned() { __result.push(analyze_item(item.clone(), &env, &resolved_module_name)); } __result }); +let ctx = build_module_context(contributions, parent_index.clone(), &resolved.resolved_imports.clone(), &env, &resolved_module_name); +let data_locals = ctx.resolved_items.clone().iter().cloned().fold(ctx.locals.clone(), |acc: Rc>>, item: Rc| if ((((item.body.clone() != None) && ((item.params.clone().len() as i64) == 0)) && (item.inferred.clone() == None)) && (item.type_annotation.clone() != None)) { + v2_rt::rc_map_insert(acc.clone(), authored_name_at(source_indices.clone(), &item), Rc::new(TypeBinding { + name: authored_name_at(source_indices.clone(), &item), + resolved: item.type_annotation.clone().clone().unwrap(), + provenance: Rc::new(SubValueRelation::SubValueUnknown), +})) + } else { + acc.clone() }); - Rc::new(TypecheckModuleResult { - typed: Rc::new(TypedModule { - module: typed_module, - items: reannotated_items, - type_env: env.clone(), - func_env: updated_func_env.clone(), - item_registry: ctx.item_registry.clone(), - }), - diagnostics: v2_rt::concat( - v2_rt::concat( - v2_rt::concat(env_diags.clone(), ctx.diagnostics.clone()), - infer_diags, - ), - seed_diags.clone(), - ), - }) - } +let infer_scope = Rc::new(InferScope { + type_env: env.clone(), + func_env: ctx.func_env.clone(), + locals: data_locals.clone(), + match_bound_names: v2_rt::rc_empty_map::(), + module_name: resolved_module_name.clone(), + service_registry: ctx.svc_registry.clone(), + item_registry: ctx.item_registry.clone(), + lambda_param_provenance: v2_rt::rc_empty_map::>(), +}); +let typed_item_results = infer_items(ctx.resolved_items.clone(), infer_scope); +let typed_items = Rc::new({ let mut __result = Vec::new(); for tir in typed_item_results.clone().iter().cloned() { __result.push(tir.item.clone()); } __result }); +let infer_diags = Rc::new({ let mut __result = Vec::new(); for tir in typed_item_results.clone().iter().cloned() { __result.extend((*tir.diagnostics.clone()).iter().cloned()); } __result }); +let updated_func_env = populate_output_provenance(typed_items.clone(), ctx.func_env.clone(), env.clone(), data_locals.clone()); +let reannotated_items = Rc::new({ let mut __result = Vec::new(); for item in typed_items.clone().iter().cloned() { __result.push(if (item.is_self_recursive.clone() && (item.body.clone() != None)) { + Rc::new(Node { + name: item.name.clone(), + span: item.span.clone(), + ident_span: item.ident_span.clone(), + children: item.children.clone(), + params: item.params.clone(), + inferred: item.inferred.clone(), + return_cardinality: item.return_cardinality.clone(), + uses: item.uses.clone(), + body: Some(annotate_descent_evidence(item.body.clone().clone().unwrap(), authored_name_at(source_indices.clone(), &item), &item.params.clone(), &env, data_locals.clone(), updated_func_env.signatures.clone())), + connective: item.connective.clone(), + transport: item.transport.clone(), + properties: item.properties.clone(), + type_annotation: item.type_annotation.clone(), + is_self_recursive: item.is_self_recursive.clone(), + has_non_tail_self_call: item.has_non_tail_self_call.clone(), + match_pattern: item.match_pattern.clone(), + expr_data: item.expr_data.clone(), + ident: None, +}) + } else { + item.clone() + }); } __result }); +let typed_base = module_node(&resolved_module_name, module_imports(resolved.module.clone()), ctx.resolved_items.clone(), &resolved.module.clone().span.clone()); +let typed_module = Rc::new(Node { ident_span: resolved.module.clone().ident_span.clone(), ..(*typed_base).clone() }); +Rc::new(TypecheckModuleResult { + typed: Rc::new(TypedModule { + module: typed_module, + items: reannotated_items, + type_env: env.clone(), + func_env: updated_func_env.clone(), + item_registry: ctx.item_registry.clone(), +}), + diagnostics: v2_rt::concat(v2_rt::concat(v2_rt::concat(env_diags.clone(), ctx.diagnostics.clone()), infer_diags), seed_diags.clone()), +}) +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -11121,494 +6378,227 @@ pub struct BindingsAccum { pub diagnostics: Rc>>, } -pub fn resolve_env_bindings( - env: &Rc, - module_name: String, - local_names: &Rc>, - deps_map: Rc>>>, -) -> Rc { +pub fn resolve_env_bindings(env: &Rc, module_name: String, local_names: &Rc>, deps_map: Rc>>>) -> Rc { { - let remaining = Rc::new({ - let mut __result = Vec::new(); - for b in Rc::new({ - let mut __result = Vec::new(); - for b in Rc::new(v2_rt::map_values(&env.bindings.clone())) - .iter() - .cloned() - { - if v2_rt::map_contains_key( - &local_names, - intern(&env.intern_table.clone(), &b.name.clone()) - .id - .clone(), - ) { - __result.push(b); - } - } - __result - }) - .iter() - .cloned() - { - __result.push(b.name.clone()); - } - __result - }); - topo_resolve_types( - remaining.clone(), - env.clone(), - module_name, - Rc::new(vec![]), - local_names.clone(), - deps_map, - (remaining.clone().len() as i64), - ) - } + let remaining = Rc::new({ let mut __result = Vec::new(); for b in Rc::new({ let mut __result = Vec::new(); for b in Rc::new(v2_rt::map_values(&env.bindings.clone())).iter().cloned() { if v2_rt::map_contains_key(&local_names, intern(&env.intern_table.clone(), &b.name.clone()).id.clone()) { __result.push(b); } } __result }).iter().cloned() { __result.push(b.name.clone()); } __result }); +topo_resolve_types(remaining.clone(), env.clone(), module_name, Rc::new(vec![]), local_names.clone(), deps_map, (remaining.clone().len() as i64)) +} } -pub fn topo_resolve_types( - mut remaining: Rc>, - mut env: Rc, - mut module_name: String, - mut diagnostics: Rc>>, - mut local_names: Rc>, - mut deps_map: Rc>>>, - mut fuel: i64, -) -> Rc { +pub fn topo_resolve_types(mut remaining: Rc>, mut env: Rc, mut module_name: String, mut diagnostics: Rc>>, mut local_names: Rc>, mut deps_map: Rc>>>, mut fuel: i64) -> Rc { loop { if ((remaining.clone().len() as i64) == 0) { return Rc::new(EnvResolveResult { - env: env.clone(), - diagnostics: diagnostics.clone(), - }); + env: env.clone(), + diagnostics: diagnostics.clone(), +}) } - let remaining_set = remaining.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, name: String| { - v2_rt::rc_map_insert(acc, name.clone(), true) - }, - ); - let ready = Rc::new({ - let mut __result = Vec::new(); - for name in remaining.clone().iter().cloned() { - if match v2_rt::map_get(&deps_map, name.clone()) { - Some(deps) => { - let mut __all = true; - for dep in deps.clone().iter().cloned() { - if !((((is_kernel_type(dep.clone()) - || (dep.clone().as_str() == "None".to_string().as_str())) - || (dep.clone().as_str() == "".to_string().as_str())) - || is_recursive_type_by_name(&env, dep.clone())) - || (emit_map_has(remaining_set.clone(), dep.clone()) == false)) - { - __all = false; - break; - } - } - __all - } - None => true, - } { - __result.push(name); - } - } - __result - }); - if ((ready.clone().len() as i64) == 0) { +let remaining_set = remaining.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, name: String| v2_rt::rc_map_insert(acc, name.clone(), true)); +let ready = Rc::new({ let mut __result = Vec::new(); for name in remaining.clone().iter().cloned() { if match v2_rt::map_get(&deps_map, name.clone()) { + Some(deps) => { let mut __all = true; for dep in deps.clone().iter().cloned() { if !(((((is_kernel_type(dep.clone()) || (dep.clone().as_str() == "None".to_string().as_str())) || (dep.clone().as_str() == "".to_string().as_str())) || is_recursive_type_by_name(&env, dep.clone())) || (emit_map_has(remaining_set.clone(), dep.clone()) == false))) { __all = false; break; } } __all }, + None => true, +} { __result.push(name); } } __result }); +if ((ready.clone().len() as i64) == 0) { { - let stuck_accum = remaining.clone().iter().cloned().fold( - Rc::new(BindingsAccum { - bindings: env.bindings.clone(), - diagnostics: Rc::new(vec![]), - }), - |acc: Rc, name: String| { - let ident = intern(&env.intern_table.clone(), &name).id.clone(); - match v2_rt::map_get(&env.bindings.clone(), ident.clone()) { - Some(binding) => { - let result = resolve_node( - binding.resolved.clone(), - env.clone(), - module_name.clone(), - ); - Rc::new(BindingsAccum { - bindings: v2_rt::rc_map_insert( - acc.bindings.clone(), - ident.clone(), - Rc::new(TypeBinding { - name: name.clone(), - resolved: result.resolved.clone(), - provenance: Rc::new(SubValueRelation::SubValueUnknown), - }), - ), - diagnostics: v2_rt::concat( - acc.diagnostics.clone(), - result.diagnostics.clone(), - ), - }) - } - None => acc.clone(), - } - }, - ); - return Rc::new(EnvResolveResult { - env: Rc::new(TypeEnv { - bindings: stuck_accum.bindings.clone(), - recursive_types: env.recursive_types.clone(), - recursive_type_set: env.recursive_type_set.clone(), - inductive_fields: env.inductive_fields.clone(), - source_indices: env.source_indices.clone(), - intern_table: env.intern_table.clone(), - }), - diagnostics: v2_rt::concat( - diagnostics.clone(), - stuck_accum.diagnostics.clone(), - ), - }); - } + let stuck_accum = remaining.clone().iter().cloned().fold(Rc::new(BindingsAccum { + bindings: env.bindings.clone(), + diagnostics: Rc::new(vec![]), +}), |acc: Rc, name: String| { + let ident = intern(&env.intern_table.clone(), &name).id.clone(); +match v2_rt::map_get(&env.bindings.clone(), ident.clone()) { + Some(binding) => { + let result = resolve_node(binding.resolved.clone(), env.clone(), module_name.clone()); +Rc::new(BindingsAccum { + bindings: v2_rt::rc_map_insert(acc.bindings.clone(), ident.clone(), Rc::new(TypeBinding { + name: name.clone(), + resolved: result.resolved.clone(), + provenance: Rc::new(SubValueRelation::SubValueUnknown), +})), + diagnostics: v2_rt::concat(acc.diagnostics.clone(), result.diagnostics.clone()), +}) +}, + None => acc.clone(), +} +}); +return Rc::new(EnvResolveResult { + env: Rc::new(TypeEnv { + bindings: stuck_accum.bindings.clone(), + recursive_types: env.recursive_types.clone(), + recursive_type_set: env.recursive_type_set.clone(), + inductive_fields: env.inductive_fields.clone(), + source_indices: env.source_indices.clone(), + intern_table: env.intern_table.clone(), +}), + diagnostics: v2_rt::concat(diagnostics.clone(), stuck_accum.diagnostics.clone()), +}) +} } - let ready_accum = ready.clone().iter().cloned().fold( - Rc::new(BindingsAccum { - bindings: env.bindings.clone(), - diagnostics: Rc::new(vec![]), - }), - |acc: Rc, name: String| { - let ident = intern(&env.intern_table.clone(), &name).id.clone(); - match v2_rt::map_get(&env.bindings.clone(), ident.clone()) { - Some(binding) => { - let result = resolve_node( - binding.resolved.clone(), - env.clone(), - module_name.clone(), - ); - Rc::new(BindingsAccum { - bindings: v2_rt::rc_map_insert( - acc.bindings.clone(), - ident.clone(), - Rc::new(TypeBinding { - name: name.clone(), - resolved: result.resolved.clone(), - provenance: Rc::new(SubValueRelation::SubValueUnknown), - }), - ), - diagnostics: v2_rt::concat( - acc.diagnostics.clone(), - result.diagnostics.clone(), - ), - }) - } - None => acc.clone(), - } - }, - ); - let ready_set = ready.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, name: String| { - v2_rt::rc_map_insert(acc, name.clone(), true) - }, - ); - let next_remaining = Rc::new({ - let mut __result = Vec::new(); - for name in remaining.clone().iter().cloned() { - if (emit_map_has(ready_set.clone(), name.clone()) == false) { - __result.push(name); - } - } - __result - }); - { +let ready_accum = ready.clone().iter().cloned().fold(Rc::new(BindingsAccum { + bindings: env.bindings.clone(), + diagnostics: Rc::new(vec![]), +}), |acc: Rc, name: String| { + let ident = intern(&env.intern_table.clone(), &name).id.clone(); +match v2_rt::map_get(&env.bindings.clone(), ident.clone()) { + Some(binding) => { + let result = resolve_node(binding.resolved.clone(), env.clone(), module_name.clone()); +Rc::new(BindingsAccum { + bindings: v2_rt::rc_map_insert(acc.bindings.clone(), ident.clone(), Rc::new(TypeBinding { + name: name.clone(), + resolved: result.resolved.clone(), + provenance: Rc::new(SubValueRelation::SubValueUnknown), +})), + diagnostics: v2_rt::concat(acc.diagnostics.clone(), result.diagnostics.clone()), +}) +}, + None => acc.clone(), +} +}); +let ready_set = ready.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, name: String| v2_rt::rc_map_insert(acc, name.clone(), true)); +let next_remaining = Rc::new({ let mut __result = Vec::new(); for name in remaining.clone().iter().cloned() { if (emit_map_has(ready_set.clone(), name.clone()) == false) { __result.push(name); } } __result }); +{ let __tco_0 = next_remaining; - let __tco_1 = Rc::new(TypeEnv { - bindings: ready_accum.bindings.clone(), - recursive_types: env.recursive_types.clone(), - recursive_type_set: env.recursive_type_set.clone(), - inductive_fields: env.inductive_fields.clone(), - source_indices: env.source_indices.clone(), - intern_table: env.intern_table.clone(), - }); - let __tco_2 = v2_rt::concat(diagnostics, ready_accum.diagnostics.clone()); - let __tco_3 = (fuel - 1); - remaining = __tco_0; - env = __tco_1; - diagnostics = __tco_2; - fuel = __tco_3; - continue; - } - } +let __tco_1 = Rc::new(TypeEnv { + bindings: ready_accum.bindings.clone(), + recursive_types: env.recursive_types.clone(), + recursive_type_set: env.recursive_type_set.clone(), + inductive_fields: env.inductive_fields.clone(), + source_indices: env.source_indices.clone(), + intern_table: env.intern_table.clone(), +}); +let __tco_2 = v2_rt::concat(diagnostics, ready_accum.diagnostics.clone()); +let __tco_3 = (fuel - 1); +remaining = __tco_0; +env = __tco_1; +diagnostics = __tco_2; +fuel = __tco_3; +continue; +} +} } -pub fn collect_parent_envs( - resolved: &Rc, - module_index: Rc>>, - source_indices: Rc>>, -) -> Rc { +pub fn collect_parent_envs(resolved: &Rc, module_index: Rc>>, source_indices: Rc>>) -> Rc { { - let modules = Rc::new({ - let mut __result = Vec::new(); - for imp in resolved.resolved_imports.clone().iter().cloned() { - __result.extend( - (*match v2_rt::map_get(&module_index, imp.module_path.clone()) { - Some(typed) => Rc::new(vec![typed.clone()]), - None => Rc::new(vec![]), - }) - .iter() - .cloned(), - ); - } - __result - }); - let resolved_mod_name = authored_name_at(source_indices, &resolved.module.clone()); - let diagnostics = Rc::new({ - let mut __result = Vec::new(); - for imp in resolved.resolved_imports.clone().iter().cloned() { - __result.extend( - (*match v2_rt::map_get(&module_index, imp.module_path.clone()) { - Some(_) => Rc::new(vec![]), - None => Rc::new(vec![make_error_node( - Rc::new(CompilerDiagnostic::InternalError { - message: v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "missing parent environment for imported module '" - .to_string(), - imp.module_path.clone(), - ), - "' while ordering '".to_string(), - ), - resolved_mod_name.clone(), - ), - "'".to_string(), - ), - span: imp.target_module.clone().clone().unwrap().span.clone(), - }), - resolved_mod_name.clone(), - )]), - }) - .iter() - .cloned(), - ); - } - __result - }); - Rc::new(ParentModulesResult { - modules: modules, - diagnostics: diagnostics, - }) - } + let modules = Rc::new({ let mut __result = Vec::new(); for imp in resolved.resolved_imports.clone().iter().cloned() { __result.extend((*match v2_rt::map_get(&module_index, imp.module_path.clone()) { + Some(typed) => Rc::new(vec![typed.clone()]), + None => Rc::new(vec![]), +}).iter().cloned()); } __result }); +let resolved_mod_name = authored_name_at(source_indices, &resolved.module.clone()); +let diagnostics = Rc::new({ let mut __result = Vec::new(); for imp in resolved.resolved_imports.clone().iter().cloned() { __result.extend((*match v2_rt::map_get(&module_index, imp.module_path.clone()) { + Some(_) => Rc::new(vec![]), + None => Rc::new(vec![make_error_node(Rc::new(CompilerDiagnostic::InternalError { + message: v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("missing parent environment for imported module '".to_string(), imp.module_path.clone()), "' while ordering '".to_string()), resolved_mod_name.clone()), "'".to_string()), + span: imp.target_module.clone().clone().unwrap().span.clone(), +}), resolved_mod_name.clone())]), +}).iter().cloned()); } __result }); +Rc::new(ParentModulesResult { + modules: modules, + diagnostics: diagnostics, +}) +} } -pub fn build_fielded_variants( - modules: Rc>>, - type_summaries: Rc>>, -) -> Rc> { +pub fn build_fielded_variants(modules: Rc>>, type_summaries: Rc>>) -> Rc> { { - let result = modules.iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, m: Rc| { - let items = m.items.clone(); - let si = m.type_env.clone().source_indices.clone(); - items.clone().iter().cloned().fold( - acc, - |inner: Rc>, item: Rc| { - let is_enum = match v2_rt::map_get( - &type_summaries, - authored_name_at(si.clone(), &item), - ) { - Some(summary) => match (*summary.repr.clone()).clone() { - TypeRepr::EnumRepr { .. } => true, - _ => false, - }, - None => false, - }; - if is_enum.clone() { - { - let enum_name = authored_name_at(si.clone(), &item); - let variants = item.children.clone(); - variants.clone().iter().cloned().fold( - inner.clone(), - |vacc: Rc>, variant: Rc| { - let has_fields = - ((variant.children.clone().len() as i64) > 0); - if has_fields.clone() { - v2_rt::rc_map_insert( - vacc.clone(), - v2_rt::concat( - v2_rt::concat( - enum_name.clone(), - "::".to_string(), - ), - authored_name_at(si.clone(), &variant), - ), - true, - ) - } else { - vacc.clone() - } - }, - ) + let result = modules.iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, m: Rc| { + let items = m.items.clone(); +let si = m.type_env.clone().source_indices.clone(); +items.clone().iter().cloned().fold(acc, |inner: Rc>, item: Rc| { + let is_enum = match v2_rt::map_get(&type_summaries, authored_name_at(si.clone(), &item)) { + Some(summary) => match (*summary.repr.clone()).clone() { + TypeRepr::EnumRepr { .. } => true, + _ => false, +}, + None => false, +}; +if is_enum.clone() { + { + let enum_name = authored_name_at(si.clone(), &item); +let variants = item.children.clone(); +variants.clone().iter().cloned().fold(inner.clone(), |vacc: Rc>, variant: Rc| { + let has_fields = ((variant.children.clone().len() as i64) > 0); +if has_fields.clone() { + v2_rt::rc_map_insert(vacc.clone(), v2_rt::concat(v2_rt::concat(enum_name.clone(), "::".to_string()), authored_name_at(si.clone(), &variant)), true) + } else { + vacc.clone() } - } else { - inner.clone() - } - }, - ) - }, - ); - result - } +}) +} + } else { + inner.clone() + } +}) +}); +result +} } pub fn build_emit_graph_info(modules: &Rc>>) -> Rc { { let init = Rc::new(EmitInfoBuildState { - type_summaries: v2_rt::rc_empty_map::>(), - }); - let built = modules.clone().iter().cloned().fold( - init.clone(), - |state: Rc, typed_module: Rc| { - typed_module.items.clone().iter().cloned().fold( - state, - |inner_state: Rc, item: Rc| { - add_emit_item_summary( - inner_state, - &item, - &typed_module.type_env.clone().source_indices.clone(), - ) - }, - ) - }, - ); - let all_recursive = modules.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, m: Rc| { - Rc::new(v2_rt::map_keys( - &m.type_env.clone().recursive_type_set.clone(), - )) - .iter() - .cloned() - .fold(acc, |inner: Rc>, ident: i64| { - v2_rt::rc_map_insert( - inner, - intern_str(m.type_env.clone().intern_table.clone(), ident.clone()), - true, - ) - }) - }, - ); - let fielded = build_fielded_variants(modules.clone(), built.type_summaries.clone()); - let vtoe = derive_variant_to_enum(built.type_summaries.clone()); - Rc::new(EmitGraphInfo { - type_summaries: built.type_summaries.clone(), - recursive_type_set: all_recursive, - fielded_variants: fielded, - shared_types: v2_rt::rc_empty_map::(), - ownership_index: v2_rt::rc_empty_map::>>(), - movable: v2_rt::rc_empty_map::(), - variant_to_enum: vtoe, - owned_bindings: v2_rt::rc_empty_map::(), - read_only_params_index: v2_rt::rc_empty_map::>>(), - read_only_params: v2_rt::rc_empty_map::(), - }) - } + type_summaries: v2_rt::rc_empty_map::>(), +}); +let built = modules.clone().iter().cloned().fold(init.clone(), |state: Rc, typed_module: Rc| typed_module.items.clone().iter().cloned().fold(state, |inner_state: Rc, item: Rc| add_emit_item_summary(inner_state, &item, &typed_module.type_env.clone().source_indices.clone()))); +let all_recursive = modules.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, m: Rc| Rc::new(v2_rt::map_keys(&m.type_env.clone().recursive_type_set.clone())).iter().cloned().fold(acc, |inner: Rc>, ident: i64| v2_rt::rc_map_insert(inner, intern_str(m.type_env.clone().intern_table.clone(), ident.clone()), true))); +let fielded = build_fielded_variants(modules.clone(), built.type_summaries.clone()); +let vtoe = derive_variant_to_enum(built.type_summaries.clone()); +Rc::new(EmitGraphInfo { + type_summaries: built.type_summaries.clone(), + recursive_type_set: all_recursive, + fielded_variants: fielded, + shared_types: v2_rt::rc_empty_map::(), + ownership_index: v2_rt::rc_empty_map::>>(), + movable: v2_rt::rc_empty_map::(), + variant_to_enum: vtoe, + owned_bindings: v2_rt::rc_empty_map::(), + read_only_params_index: v2_rt::rc_empty_map::>>(), + read_only_params: v2_rt::rc_empty_map::(), +}) +} } -pub fn typecheck( - graph: Rc, - source_indices: Rc>>, - intern_table: Rc, -) -> Rc { - typecheck_modules( - graph.modules.clone(), - Rc::new(vec![]), - v2_rt::rc_empty_map::>(), - v2_rt::rc_empty_map::>(), - Rc::new(vec![]), - source_indices, - intern_table, - ) -} - -pub fn typecheck_modules( - mut remaining: Rc>>, - mut modules: Rc>>, - mut module_index: Rc>>, - mut item_registry: Rc>>, - mut diag_chunks: Rc>>>>, - mut source_indices: Rc>>, - mut intern_table: Rc, -) -> Rc { - loop { - match remaining.clone().first().cloned() { - None => { - let expanded_registry = - expand_transitive_services(modules.clone(), item_registry, 5); - break Rc::new(TypedGraph { - modules: modules.clone(), - item_registry: expanded_registry, - diagnostics: Rc::new({ - let mut __result = Vec::new(); - for c in diag_chunks.iter().cloned() { - __result.extend((*c.clone()).iter().cloned()); - } - __result - }), - }); - } - Some(resolved) => { - let parent_result = - collect_parent_envs(&resolved, module_index.clone(), source_indices.clone()); - let tc_result = typecheck_module( - &resolved, - &module_index, - &source_indices, - intern_table.clone(), - ); - let typed = tc_result.typed.clone(); - let tc_diags = tc_result.diagnostics.clone(); - { - let __tco_0 = Rc::new( - remaining - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ); - let __tco_1 = v2_rt::rc_list_push(modules, typed.clone()); - let __tco_2 = v2_rt::rc_map_insert( - module_index, - authored_name_at(source_indices.clone(), &typed.module.clone()), - typed.clone(), - ); - let __tco_3 = v2_rt::rc_map_merge(item_registry, typed.item_registry.clone()); - let __tco_4 = v2_rt::rc_list_push( - v2_rt::rc_list_push(diag_chunks, parent_result.diagnostics.clone()), - tc_diags, - ); - remaining = __tco_0; - modules = __tco_1; - module_index = __tco_2; - item_registry = __tco_3; - diag_chunks = __tco_4; - continue; - } - } - } - } +pub fn typecheck(graph: Rc, source_indices: Rc>>, intern_table: Rc) -> Rc { + typecheck_modules(graph.modules.clone(), Rc::new(vec![]), v2_rt::rc_empty_map::>(), v2_rt::rc_empty_map::>(), Rc::new(vec![]), source_indices, intern_table) } -pub fn reconcile( - graph: Rc, - source_indices: Rc>>, - intern_table: Rc, -) -> Rc { +pub fn typecheck_modules(mut remaining: Rc>>, mut modules: Rc>>, mut module_index: Rc>>, mut item_registry: Rc>>, mut diag_chunks: Rc>>>>, mut source_indices: Rc>>, mut intern_table: Rc) -> Rc { + loop { + match remaining.clone().first().cloned() { + None => { let expanded_registry = expand_transitive_services(modules.clone(), item_registry, 5); +break Rc::new(TypedGraph { + modules: modules.clone(), + item_registry: expanded_registry, + diagnostics: Rc::new({ let mut __result = Vec::new(); for c in diag_chunks.iter().cloned() { __result.extend((*c.clone()).iter().cloned()); } __result }), +}); }, + Some(resolved) => { let parent_result = collect_parent_envs(&resolved, module_index.clone(), source_indices.clone()); +let tc_result = typecheck_module(&resolved, &module_index, &source_indices, intern_table.clone()); +let typed = tc_result.typed.clone(); +let tc_diags = tc_result.diagnostics.clone(); +{ + let __tco_0 = Rc::new(remaining.iter().cloned().skip(1 as usize).collect::>()); +let __tco_1 = v2_rt::rc_list_push(modules, typed.clone()); +let __tco_2 = v2_rt::rc_map_insert(module_index, authored_name_at(source_indices.clone(), &typed.module.clone()), typed.clone()); +let __tco_3 = v2_rt::rc_map_merge(item_registry, typed.item_registry.clone()); +let __tco_4 = v2_rt::rc_list_push(v2_rt::rc_list_push(diag_chunks, parent_result.diagnostics.clone()), tc_diags); +remaining = __tco_0; +modules = __tco_1; +module_index = __tco_2; +item_registry = __tco_3; +diag_chunks = __tco_4; +continue; +} }, +} +} +} + +pub fn reconcile(graph: Rc, source_indices: Rc>>, intern_table: Rc) -> Rc { { let typed = typecheck(graph, source_indices, intern_table); - let emit_info = build_emit_graph_info(&typed.modules.clone()); - Rc::new(ResolvedGraph { - modules: typed.modules.clone(), - item_registry: typed.item_registry.clone(), - diagnostics: typed.diagnostics.clone(), - emit_graph_info: emit_info, - }) - } +let emit_info = build_emit_graph_info(&typed.modules.clone()); +Rc::new(ResolvedGraph { + modules: typed.modules.clone(), + item_registry: typed.item_registry.clone(), + diagnostics: typed.diagnostics.clone(), + emit_graph_info: emit_info, +}) +} } diff --git a/src/v2/stage0/src/v2_compiler_infer_access.rs b/src/v2/stage0/src/v2_compiler_infer_access.rs index 5351728cdb0..88ef0d55a1d 100644 --- a/src/v2/stage0/src/v2_compiler_infer_access.rs +++ b/src/v2/stage0/src/v2_compiler_infer_access.rs @@ -1,22 +1,16 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.infer_access -pub use crate::std_types::{is_ordered_element_collection, SourceSpan}; -pub use crate::v2_compiler_infer_types::{ - for_each_element_type_node, node_is_element_collection, node_is_keyed_collection, - node_type_equals, normalize_access_type_node, resolved_type, -}; -use crate::v2_rt; -use crate::v2_std_core::CompilerDiagnostic::InternalError; -use crate::v2_std_core::InferredNode::{CompilerError, Resolved}; -pub use crate::v2_std_core::{ - authored_name_at, diagnostic_to_message, int_type, make_error_node, string_type, unit_type, - with_optional_cardinality, CompilerDiagnostic, ErrorNode, InferredNode, NewlineIndex, Node, -}; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::std_types::{SourceSpan, is_ordered_element_collection}; +pub use crate::v2_std_core::{Node, NewlineIndex, authored_name_at, InferredNode, ErrorNode, make_error_node, diagnostic_to_message, with_optional_cardinality, unit_type, string_type, int_type, CompilerDiagnostic}; +use crate::v2_std_core::InferredNode::{Resolved, CompilerError}; +use crate::v2_std_core::CompilerDiagnostic::{InternalError}; +pub use crate::v2_compiler_infer_types::{resolved_type, normalize_access_type_node, node_type_equals, node_is_keyed_collection, node_is_element_collection, for_each_element_type_node}; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] pub struct AccessCheckResultNode { @@ -31,210 +25,124 @@ pub struct KeyedCollectionParts { } pub fn access_error(message: String, span: Rc, module_name: String) -> Rc { - make_error_node( - Rc::new(CompilerDiagnostic::InternalError { - message: message, - span: span, - }), - module_name, - ) + make_error_node(Rc::new(CompilerDiagnostic::InternalError { + message: message, + span: span, +}), module_name) } -pub fn access_result( - inferred: Rc, - diagnostics: &Rc>>, - span: Rc, - fallback_message: String, -) -> Rc { +pub fn access_result(inferred: Rc, diagnostics: &Rc>>, span: Rc, fallback_message: String) -> Rc { if ((diagnostics.clone().len() as i64) == 0) { Rc::new(AccessCheckResultNode { - inferred: Some(Rc::new(InferredNode::Resolved { node: inferred })), - diagnostics: diagnostics.clone(), - }) + inferred: Some(Rc::new(InferredNode::Resolved { + node: inferred, +})), + diagnostics: diagnostics.clone(), +}) } else { { let message = match diagnostics.clone().first().cloned() { - Some(diag) => diagnostic_to_message(diag.diagnostic.clone()), - None => fallback_message, - }; - Rc::new(AccessCheckResultNode { - inferred: Some(Rc::new(InferredNode::CompilerError { - message: message, - span: span, - })), - diagnostics: diagnostics.clone(), - }) - } + Some(diag) => diagnostic_to_message(diag.diagnostic.clone()), + None => fallback_message, +}; +Rc::new(AccessCheckResultNode { + inferred: Some(Rc::new(InferredNode::CompilerError { + message: message, + span: span, +})), + diagnostics: diagnostics.clone(), +}) +} } } -pub fn keyed_collection_parts( - n: &Rc, - source_indices: Rc>>, -) -> Option> { +pub fn keyed_collection_parts(n: &Rc, source_indices: Rc>>) -> Option> { if (node_is_keyed_collection(&n, source_indices) && ((n.children.clone().len() as i64) >= 2)) { match n.children.clone().first().cloned() { - Some(key_child) => match n.children.clone().get(1 as usize).cloned() { - Some(value_child) => Some(Rc::new(KeyedCollectionParts { - key_type: resolved_type(key_child.clone()), - value_type: resolved_type(value_child.clone()), - })), - None => None, - }, - None => None, - } + Some(key_child) => match n.children.clone().get(1 as usize).cloned() { + Some(value_child) => Some(Rc::new(KeyedCollectionParts { + key_type: resolved_type(key_child.clone()), + value_type: resolved_type(value_child.clone()), +})), + None => None, +}, + None => None, +} } else { None } } -pub fn check_index_access_node( - base_type: Rc, - index_type: Rc, - span: &Rc, - module_name: String, - source_indices: &Rc>>, -) -> Rc { +pub fn check_index_access_node(base_type: Rc, index_type: Rc, span: &Rc, module_name: String, source_indices: &Rc>>) -> Rc { { let normed = normalize_access_type_node(base_type); - let normed_index = normalize_access_type_node(index_type); - let base_is_string = node_type_equals(&normed, &string_type(), source_indices.clone()); - let index_is_int = node_type_equals(&normed_index, &int_type(), source_indices.clone()); - if base_is_string { +let normed_index = normalize_access_type_node(index_type); +let base_is_string = node_type_equals(&normed, &string_type(), source_indices.clone()); +let index_is_int = node_type_equals(&normed_index, &int_type(), source_indices.clone()); +if base_is_string { { let diags = if index_is_int { Rc::new(vec![]) } else { - Rc::new(vec![access_error( - "string index requires an Int index".to_string(), - span.clone(), - module_name, - )]) + Rc::new(vec![access_error("string index requires an Int index".to_string(), span.clone(), module_name)]) }; - access_result( - string_type(), - &diags, - span.clone(), - "invalid string index access".to_string(), - ) - } +access_result(string_type(), &diags, span.clone(), "invalid string index access".to_string()) +} } else { match keyed_collection_parts(&normed, source_indices.clone()) { - Some(parts) => { - let key_diags = if node_type_equals( - &parts.key_type.clone(), - &normed_index, - source_indices.clone(), - ) { - Rc::new(vec![]) - } else { - Rc::new(vec![access_error("keyed collection index key type does not match the collection key type".to_string(), span.clone(), module_name)]) - }; - access_result( - with_optional_cardinality(&parts.value_type.clone()), - &key_diags, - span.clone(), - "invalid keyed collection index access".to_string(), - ) - } - None => { - if node_is_keyed_collection(&normed, source_indices.clone()) { - { - let malformed_diags = Rc::new(vec![access_error( - "malformed keyed collection type in index access".to_string(), - span.clone(), - module_name, - )]); - access_result( - unit_type(), - &malformed_diags, - span.clone(), - "malformed keyed collection type in index access".to_string(), - ) - } - } else { - if ((is_ordered_element_collection(authored_name_at( - source_indices.clone(), - &normed, - )) && node_is_element_collection(&normed, source_indices.clone())) - && index_is_int) - { - { - let elem = for_each_element_type_node( - normed.clone(), - source_indices.clone(), - ); - access_result( - with_optional_cardinality(&elem), - &Rc::new(vec![]), - span.clone(), - "list index access".to_string(), - ) - } - } else { - { - let diags = Rc::new(vec![access_error("indexing is only supported for String, keyed collection, and list values".to_string(), span.clone(), module_name)]); - access_result( - unit_type(), - &diags, - span.clone(), - "invalid index access".to_string(), - ) - } - } - } + Some(parts) => { + let key_diags = if node_type_equals(&parts.key_type.clone(), &normed_index, source_indices.clone()) { + Rc::new(vec![]) + } else { + Rc::new(vec![access_error("keyed collection index key type does not match the collection key type".to_string(), span.clone(), module_name)]) + }; +access_result(with_optional_cardinality(&parts.value_type.clone()), &key_diags, span.clone(), "invalid keyed collection index access".to_string()) +}, + None => if node_is_keyed_collection(&normed, source_indices.clone()) { + { + let malformed_diags = Rc::new(vec![access_error("malformed keyed collection type in index access".to_string(), span.clone(), module_name)]); +access_result(unit_type(), &malformed_diags, span.clone(), "malformed keyed collection type in index access".to_string()) +} + } else { + if ((is_ordered_element_collection(authored_name_at(source_indices.clone(), &normed)) && node_is_element_collection(&normed, source_indices.clone())) && index_is_int) { + { + let elem = for_each_element_type_node(normed.clone(), source_indices.clone()); +access_result(with_optional_cardinality(&elem), &Rc::new(vec![]), span.clone(), "list index access".to_string()) +} + } else { + { + let diags = Rc::new(vec![access_error("indexing is only supported for String, keyed collection, and list values".to_string(), span.clone(), module_name)]); +access_result(unit_type(), &diags, span.clone(), "invalid index access".to_string()) +} } - } + }, +} } - } +} } -pub fn check_slice_access_node( - base_type: Rc, - start_type: Rc, - end_type: Rc, - span: &Rc, - module_name: &String, - source_indices: &Rc>>, -) -> Rc { +pub fn check_slice_access_node(base_type: Rc, start_type: Rc, end_type: Rc, span: &Rc, module_name: &String, source_indices: &Rc>>) -> Rc { { let normed_base = normalize_access_type_node(base_type); - let base_is_string = node_type_equals(&normed_base, &string_type(), source_indices.clone()); - let base_diags = if base_is_string { +let base_is_string = node_type_equals(&normed_base, &string_type(), source_indices.clone()); +let base_diags = if base_is_string { Rc::new(vec![]) } else { - Rc::new(vec![access_error( - "slice is only supported for String values".to_string(), - span.clone(), - module_name.clone(), - )]) + Rc::new(vec![access_error("slice is only supported for String values".to_string(), span.clone(), module_name.clone())]) }; - let normed_start = normalize_access_type_node(start_type); - let start_diags = if node_type_equals(&normed_start, &int_type(), source_indices.clone()) { +let normed_start = normalize_access_type_node(start_type); +let start_diags = if node_type_equals(&normed_start, &int_type(), source_indices.clone()) { Rc::new(vec![]) } else { - Rc::new(vec![access_error( - "slice start requires an Int index".to_string(), - span.clone(), - module_name.clone(), - )]) + Rc::new(vec![access_error("slice start requires an Int index".to_string(), span.clone(), module_name.clone())]) }; - let normed_end = normalize_access_type_node(end_type); - let end_diags = if node_type_equals(&normed_end, &int_type(), source_indices.clone()) { +let normed_end = normalize_access_type_node(end_type); +let end_diags = if node_type_equals(&normed_end, &int_type(), source_indices.clone()) { Rc::new(vec![]) } else { - Rc::new(vec![access_error( - "slice end requires an Int index".to_string(), - span.clone(), - module_name.clone(), - )]) + Rc::new(vec![access_error("slice end requires an Int index".to_string(), span.clone(), module_name.clone())]) }; - let all_diags = v2_rt::concat(v2_rt::concat(base_diags, start_diags), end_diags); - access_result( - string_type(), - &all_diags, - span.clone(), - "invalid slice access".to_string(), - ) - } +let all_diags = v2_rt::concat(v2_rt::concat(base_diags, start_diags), end_diags); +access_result(string_type(), &all_diags, span.clone(), "invalid slice access".to_string()) +} } diff --git a/src/v2/stage0/src/v2_compiler_infer_cycle.rs b/src/v2/stage0/src/v2_compiler_infer_cycle.rs index f174744c84e..7ed18be2ecf 100644 --- a/src/v2/stage0/src/v2_compiler_infer_cycle.rs +++ b/src/v2/stage0/src/v2_compiler_infer_cycle.rs @@ -1,144 +1,77 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.infer_cycle -pub use crate::v2_compiler_infer_env::TypeBinding; -use crate::v2_rt; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::v2_compiler_infer_env::{TypeBinding}; pub fn set_has(m: Rc>, key: String) -> bool { { let result = match v2_rt::map_get(&m, key) { - Some(_) => true, - None => false, - }; - result - } + Some(_) => true, + None => false, +}; +result +} } -pub fn compute_in_graph_deps( - all_names: Rc>, - deps_map: Rc>>>, - name_set: Rc>, -) -> Rc>>> { +pub fn compute_in_graph_deps(all_names: Rc>, deps_map: Rc>>>, name_set: Rc>) -> Rc>>> { { - let result = all_names.iter().cloned().fold( - v2_rt::rc_empty_map::>>(), - |acc: Rc>>>, name: String| match v2_rt::map_get( - &deps_map, - name.clone(), - ) { - Some(deps) => { - let local = Rc::new({ - let mut __result = Vec::new(); - for d in deps.clone().iter().cloned() { - if ((d.clone().as_str() != name.clone().as_str()) - && set_has(name_set.clone(), d.clone())) - { - __result.push(d); - } - } - __result - }); - v2_rt::rc_map_insert(acc.clone(), name.clone(), local.clone()) - } - None => v2_rt::rc_map_insert(acc.clone(), name.clone(), Rc::new(vec![])), - }, - ); - result - } + let result = all_names.iter().cloned().fold(v2_rt::rc_empty_map::>>(), |acc: Rc>>>, name: String| match v2_rt::map_get(&deps_map, name.clone()) { + Some(deps) => { + let local = Rc::new({ let mut __result = Vec::new(); for d in deps.clone().iter().cloned() { if ((d.clone().as_str() != name.clone().as_str()) && set_has(name_set.clone(), d.clone())) { __result.push(d); } } __result }); +v2_rt::rc_map_insert(acc.clone(), name.clone(), local.clone()) +}, + None => v2_rt::rc_map_insert(acc.clone(), name.clone(), Rc::new(vec![])), +}); +result +} } -pub fn build_reverse_adj( - all_names: Rc>, - local_deps: Rc>>>, -) -> Rc>>> { - all_names.iter().cloned().fold( - v2_rt::rc_empty_map::>>(), - |acc: Rc>>>, name: String| match v2_rt::map_get( - &local_deps, - name.clone(), - ) { - Some(deps) => deps.clone().iter().cloned().fold( - acc.clone(), - |inner_acc: Rc>>>, dep: String| { - let existing = match v2_rt::map_get(&inner_acc, dep.clone()) { - Some(v) => v.clone(), - None => Rc::new(vec![]), - }; - v2_rt::rc_map_insert( - inner_acc.clone(), - dep.clone(), - v2_rt::rc_list_push(existing.clone(), name.clone()), - ) - }, - ), - None => acc.clone(), - }, - ) +pub fn build_reverse_adj(all_names: Rc>, local_deps: Rc>>>) -> Rc>>> { + all_names.iter().cloned().fold(v2_rt::rc_empty_map::>>(), |acc: Rc>>>, name: String| match v2_rt::map_get(&local_deps, name.clone()) { + Some(deps) => deps.clone().iter().cloned().fold(acc.clone(), |inner_acc: Rc>>>, dep: String| { + let existing = match v2_rt::map_get(&inner_acc, dep.clone()) { + Some(v) => v.clone(), + None => Rc::new(vec![]), +}; +v2_rt::rc_map_insert(inner_acc.clone(), dep.clone(), v2_rt::rc_list_push(existing.clone(), name.clone())) +}), + None => acc.clone(), +}) } -pub fn build_in_degree( - all_names: Rc>, - local_deps: Rc>>>, -) -> Rc> { - all_names.iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, name: String| { - let deg = match v2_rt::map_get(&local_deps, name.clone()) { - Some(deps) => (deps.clone().len() as i64), - None => 0, - }; - v2_rt::rc_map_insert(acc, name.clone(), deg.clone()) - }, - ) +pub fn build_in_degree(all_names: Rc>, local_deps: Rc>>>) -> Rc> { + all_names.iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, name: String| { + let deg = match v2_rt::map_get(&local_deps, name.clone()) { + Some(deps) => (deps.clone().len() as i64), + None => 0, +}; +v2_rt::rc_map_insert(acc, name.clone(), deg.clone()) +}) } -pub fn kahn_remove_loop( - remaining: &Rc>, - local_deps: &Rc>>>, -) -> Rc> { +pub fn kahn_remove_loop(remaining: &Rc>, local_deps: &Rc>>>) -> Rc> { { let reverse_adj = build_reverse_adj(remaining.clone(), local_deps.clone()); - let in_degree = build_in_degree(remaining.clone(), local_deps.clone()); - let initial_queue = Rc::new({ - let mut __result = Vec::new(); - for n in remaining.clone().iter().cloned() { - if match v2_rt::map_get(&in_degree, n.clone()) { - Some(d) => (d.clone() == 0), - None => true, - } { - __result.push(n); - } - } - __result - }); - let final_state = kahn_cycle_drain( - initial_queue, - in_degree.clone(), - reverse_adj, - 0, - (remaining.clone().len() as i64), - ); - if (final_state.removed_count.clone() == (remaining.clone().len() as i64)) { +let in_degree = build_in_degree(remaining.clone(), local_deps.clone()); +let initial_queue = Rc::new({ let mut __result = Vec::new(); for n in remaining.clone().iter().cloned() { if match v2_rt::map_get(&in_degree, n.clone()) { + Some(d) => (d.clone() == 0), + None => true, +} { __result.push(n); } } __result }); +let final_state = kahn_cycle_drain(initial_queue, in_degree.clone(), reverse_adj, 0, (remaining.clone().len() as i64)); +if (final_state.removed_count.clone() == (remaining.clone().len() as i64)) { Rc::new(vec![]) } else { - Rc::new({ - let mut __result = Vec::new(); - for n in remaining.clone().iter().cloned() { - if match v2_rt::map_get(&final_state.in_degree.clone(), n.clone()) { - Some(d) => (d.clone() > 0), - None => false, - } { - __result.push(n); - } - } - __result - }) + Rc::new({ let mut __result = Vec::new(); for n in remaining.clone().iter().cloned() { if match v2_rt::map_get(&final_state.in_degree.clone(), n.clone()) { + Some(d) => (d.clone() > 0), + None => false, +} { __result.push(n); } } __result }) } - } +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -147,147 +80,78 @@ pub struct KahnState { pub removed_count: i64, } -pub fn kahn_cycle_drain( - mut queue: Rc>, - mut in_degree: Rc>, - mut reverse_adj: Rc>>>, - mut removed_count: i64, - mut fuel: i64, -) -> Rc { +pub fn kahn_cycle_drain(mut queue: Rc>, mut in_degree: Rc>, mut reverse_adj: Rc>>>, mut removed_count: i64, mut fuel: i64) -> Rc { loop { if ((queue.clone().len() as i64) == 0) { return Rc::new(KahnState { - in_degree: in_degree.clone(), - removed_count: removed_count.clone(), - }); + in_degree: in_degree.clone(), + removed_count: removed_count.clone(), +}) } - let result = queue.clone().iter().cloned().fold( - Rc::new(KahnState { - in_degree: in_degree.clone(), - removed_count: removed_count.clone(), - }), - |state: Rc, node: String| { - let state = Rc::try_unwrap(state).unwrap_or_else(|rc| (*rc).clone()); - { - let dependents = match v2_rt::map_get(&reverse_adj, node.clone()) { - Some(v) => v.clone(), - None => Rc::new(vec![]), - }; - let new_deg = dependents.clone().iter().cloned().fold( - state.in_degree, - |deg_acc: Rc>, dep: String| { - let old = match v2_rt::map_get(°_acc, dep.clone()) { - Some(d) => d.clone(), - None => 0, - }; - v2_rt::rc_map_insert(deg_acc.clone(), dep.clone(), (old.clone() - 1)) - }, - ); - Rc::new(KahnState { - in_degree: new_deg.clone(), - removed_count: (state.removed_count + 1), - }) +let result = queue.clone().iter().cloned().fold(Rc::new(KahnState { + in_degree: in_degree.clone(), + removed_count: removed_count.clone(), +}), |state: Rc, node: String| { let state = Rc::try_unwrap(state).unwrap_or_else(|rc| (*rc).clone()); { + let dependents = match v2_rt::map_get(&reverse_adj, node.clone()) { + Some(v) => v.clone(), + None => Rc::new(vec![]), +}; +let new_deg = dependents.clone().iter().cloned().fold(state.in_degree, |deg_acc: Rc>, dep: String| { + let old = match v2_rt::map_get(°_acc, dep.clone()) { + Some(d) => d.clone(), + None => 0, +}; +v2_rt::rc_map_insert(deg_acc.clone(), dep.clone(), (old.clone() - 1)) +}); +Rc::new(KahnState { + in_degree: new_deg.clone(), + removed_count: (state.removed_count + 1), +}) +} }); +let next_queue = queue.clone().iter().cloned().fold(Rc::new(vec![]), |acc: _, node: String| { + let dependents = match v2_rt::map_get(&reverse_adj, node.clone()) { + Some(v) => v.clone(), + None => Rc::new(vec![]), +}; +dependents.clone().iter().cloned().fold(acc, |inner_acc: _, dep: String| { + let deg = match v2_rt::map_get(&result.in_degree.clone(), dep.clone()) { + Some(d) => d.clone(), + None => 0, +}; +if (deg.clone() == 0) { + v2_rt::rc_list_push(inner_acc.clone(), dep.clone()) + } else { + inner_acc.clone() } - }, - ); - let next_queue = - queue - .clone() - .iter() - .cloned() - .fold(Rc::new(vec![]), |acc: _, node: String| { - let dependents = match v2_rt::map_get(&reverse_adj, node.clone()) { - Some(v) => v.clone(), - None => Rc::new(vec![]), - }; - dependents - .clone() - .iter() - .cloned() - .fold(acc, |inner_acc: _, dep: String| { - let deg = match v2_rt::map_get(&result.in_degree.clone(), dep.clone()) { - Some(d) => d.clone(), - None => 0, - }; - if (deg.clone() == 0) { - v2_rt::rc_list_push(inner_acc.clone(), dep.clone()) - } else { - inner_acc.clone() - } - }) - }); - { +}) +}); +{ let __tco_0 = next_queue; - let __tco_1 = result.in_degree.clone(); - let __tco_2 = result.removed_count.clone(); - let __tco_3 = (fuel - 1); - queue = __tco_0; - in_degree = __tco_1; - removed_count = __tco_2; - fuel = __tco_3; - continue; - } - } +let __tco_1 = result.in_degree.clone(); +let __tco_2 = result.removed_count.clone(); +let __tco_3 = (fuel - 1); +queue = __tco_0; +in_degree = __tco_1; +removed_count = __tco_2; +fuel = __tco_3; +continue; +} +} } -pub fn detect_type_cycles_kahn( - deps_map: &Rc>>>, - bindings: Rc>>, -) -> Rc> { +pub fn detect_type_cycles_kahn(deps_map: &Rc>>>, bindings: Rc>>) -> Rc> { { - let all_names = Rc::new({ - let mut __result = Vec::new(); - for b in Rc::new(v2_rt::map_values(&bindings)).iter().cloned() { - __result.push(b.name.clone()); - } - __result - }); - let name_set = all_names.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, n: String| v2_rt::rc_map_insert(acc, n.clone(), true), - ); - let local_deps = compute_in_graph_deps(all_names.clone(), deps_map.clone(), name_set); - let self_refs = Rc::new({ - let mut __result = Vec::new(); - for name in all_names.clone().iter().cloned() { - if match v2_rt::map_get(&deps_map, name.clone()) { - Some(deps) => { - let mut __found = false; - for d in deps.clone().iter().cloned() { - if (d.clone().as_str() == name.clone().as_str()) { - __found = true; - break; - } - } - __found - } - None => false, - } { - __result.push(name); - } - } - __result - }); - let cycle_members = kahn_remove_loop(&all_names, &local_deps); - let sr_set = self_refs.iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, n: String| v2_rt::rc_map_insert(acc, n.clone(), true), - ); - let cm_set = cycle_members - .iter() - .cloned() - .fold(sr_set, |acc: Rc>, n: String| { - v2_rt::rc_map_insert(acc, n.clone(), true) - }); - let result = Rc::new({ - let mut __result = Vec::new(); - for n in all_names.clone().iter().cloned() { - if set_has(cm_set.clone(), n.clone()) { - __result.push(n); - } - } - __result - }); - result - } + let all_names = Rc::new({ let mut __result = Vec::new(); for b in Rc::new(v2_rt::map_values(&bindings)).iter().cloned() { __result.push(b.name.clone()); } __result }); +let name_set = all_names.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, n: String| v2_rt::rc_map_insert(acc, n.clone(), true)); +let local_deps = compute_in_graph_deps(all_names.clone(), deps_map.clone(), name_set); +let self_refs = Rc::new({ let mut __result = Vec::new(); for name in all_names.clone().iter().cloned() { if match v2_rt::map_get(&deps_map, name.clone()) { + Some(deps) => { let mut __found = false; for d in deps.clone().iter().cloned() { if (d.clone().as_str() == name.clone().as_str()) { __found = true; break; } } __found }, + None => false, +} { __result.push(name); } } __result }); +let cycle_members = kahn_remove_loop(&all_names, &local_deps); +let sr_set = self_refs.iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, n: String| v2_rt::rc_map_insert(acc, n.clone(), true)); +let cm_set = cycle_members.iter().cloned().fold(sr_set, |acc: Rc>, n: String| v2_rt::rc_map_insert(acc, n.clone(), true)); +let result = Rc::new({ let mut __result = Vec::new(); for n in all_names.clone().iter().cloned() { if set_has(cm_set.clone(), n.clone()) { __result.push(n); } } __result }); +result +} } diff --git a/src/v2/stage0/src/v2_compiler_infer_emit_info.rs b/src/v2/stage0/src/v2_compiler_infer_emit_info.rs index 67d890b8ea6..228cb3dbe9d 100644 --- a/src/v2/stage0/src/v2_compiler_infer_emit_info.rs +++ b/src/v2/stage0/src/v2_compiler_infer_emit_info.rs @@ -1,46 +1,40 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.infer_emit_info -use self::TypeRepr::*; -pub use crate::v2_compiler_infer_types::{ - child_type_node, emit_map_has, node_type_equals, normalize_access_type_node, -}; -use crate::v2_rt; -use crate::v2_std_core::Cardinality::CardOptional; -use crate::v2_std_core::Connective::{Arrow, Conj, NoConnective}; -use crate::v2_std_core::FieldAccessStyle::{EnumAccessor, StoredField, TupleFirst, TupleSecond}; -use crate::v2_std_core::FieldValueShape::{OptionalValue, PlainValue}; -use crate::v2_std_core::InferredNode::{Resolved, TypeVariable}; -pub use crate::v2_std_core::{ - authored_name_at, find_child_named, has_child_named, param_node_name_at, - with_required_cardinality, Cardinality, Connective, FieldAccessStyle, FieldSummary, - FieldValueShape, InferredNode, NewlineIndex, Node, -}; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::v2_std_core::{Node, authored_name_at, NewlineIndex, find_child_named, has_child_named, InferredNode, FieldAccessStyle, FieldValueShape, FieldSummary, with_required_cardinality, Connective, param_node_name_at, Cardinality}; +use crate::v2_std_core::InferredNode::{Resolved, TypeVariable}; +use crate::v2_std_core::FieldAccessStyle::{StoredField, EnumAccessor, TupleFirst, TupleSecond}; +use crate::v2_std_core::FieldValueShape::{PlainValue, OptionalValue}; +use crate::v2_std_core::Connective::{Conj, NoConnective, Arrow}; +use crate::v2_std_core::Cardinality::{CardOptional}; +pub use crate::v2_compiler_infer_types::{normalize_access_type_node, child_type_node, emit_map_has, node_type_equals}; +use self::TypeRepr::*; pub fn is_type_variable(inferred: Rc) -> bool { match (*inferred).clone() { - InferredNode::TypeVariable { .. } => true, - _ => false, - } + InferredNode::TypeVariable { .. } => true, + _ => false, +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum TypeRepr { StructRepr, - EnumRepr { unit_only: bool }, + EnumRepr { + unit_only: bool, + }, } impl TypeRepr { pub fn unit_only(&self) -> bool { match self { TypeRepr::StructRepr => panic!("no unit_only on unit variant"), - TypeRepr::EnumRepr { - unit_only: __val, .. - } => __val.clone(), + TypeRepr::EnumRepr { unit_only: __val, .. } => __val.clone(), } } } @@ -77,532 +71,253 @@ pub struct EmitInfoBuildState { pub fn empty_emit_graph_info() -> Rc { Rc::new(EmitGraphInfo { - type_summaries: v2_rt::rc_empty_map::>(), - recursive_type_set: v2_rt::rc_empty_map::(), - fielded_variants: v2_rt::rc_empty_map::(), - shared_types: v2_rt::rc_empty_map::(), - ownership_index: v2_rt::rc_empty_map::>>(), - movable: v2_rt::rc_empty_map::(), - variant_to_enum: v2_rt::rc_empty_map::(), - owned_bindings: v2_rt::rc_empty_map::(), - read_only_params_index: v2_rt::rc_empty_map::>>(), - read_only_params: v2_rt::rc_empty_map::(), - }) + type_summaries: v2_rt::rc_empty_map::>(), + recursive_type_set: v2_rt::rc_empty_map::(), + fielded_variants: v2_rt::rc_empty_map::(), + shared_types: v2_rt::rc_empty_map::(), + ownership_index: v2_rt::rc_empty_map::>>(), + movable: v2_rt::rc_empty_map::(), + variant_to_enum: v2_rt::rc_empty_map::(), + owned_bindings: v2_rt::rc_empty_map::(), + read_only_params_index: v2_rt::rc_empty_map::>>(), + read_only_params: v2_rt::rc_empty_map::(), +}) } -pub fn variant_has_fields( - emit_info: Rc, - enum_name: String, - variant_name: String, -) -> bool { +pub fn variant_has_fields(emit_info: Rc, enum_name: String, variant_name: String) -> bool { { let key = v2_rt::concat(v2_rt::concat(enum_name, "::".to_string()), variant_name); - match v2_rt::map_get(&emit_info.fielded_variants.clone(), key) { - Some(v) => v.clone(), - None => false, - } - } +match v2_rt::map_get(&emit_info.fielded_variants.clone(), key) { + Some(v) => v.clone(), + None => false, +} +} } -pub fn lookup_emit_type_summary( - emit_info: Rc, - type_name: String, -) -> Option> { +pub fn lookup_emit_type_summary(emit_info: Rc, type_name: String) -> Option> { v2_rt::map_get(&emit_info.type_summaries.clone(), type_name) } -pub fn derive_variant_to_enum( - type_summaries: Rc>>, -) -> Rc> { - Rc::new(v2_rt::map_values(&type_summaries)) - .iter() - .cloned() - .fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, summary: Rc| match (*summary - .repr - .clone()) - .clone() - { - TypeRepr::EnumRepr { .. } => { - Rc::new(v2_rt::map_keys(&summary.variant_name_set.clone())) - .iter() - .cloned() - .fold( - acc.clone(), - |inner: Rc>, vn: String| match v2_rt::map_get( - &inner, - vn.clone(), - ) { - Some(_) => { - v2_rt::rc_map_insert(inner.clone(), vn.clone(), "".to_string()) - } - None => v2_rt::rc_map_insert( - inner.clone(), - vn.clone(), - summary.name.clone(), - ), - }, - ) - } - _ => acc.clone(), - }, - ) +pub fn derive_variant_to_enum(type_summaries: Rc>>) -> Rc> { + Rc::new(v2_rt::map_values(&type_summaries)).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, summary: Rc| match (*summary.repr.clone()).clone() { + TypeRepr::EnumRepr { .. } => Rc::new(v2_rt::map_keys(&summary.variant_name_set.clone())).iter().cloned().fold(acc.clone(), |inner: Rc>, vn: String| match v2_rt::map_get(&inner, vn.clone()) { + Some(_) => v2_rt::rc_map_insert(inner.clone(), vn.clone(), "".to_string()), + None => v2_rt::rc_map_insert(inner.clone(), vn.clone(), summary.name.clone()), +}), + _ => acc.clone(), +}) } -pub fn is_known_variant( - type_summaries: Rc>>, - name: String, -) -> bool { - { - let mut __found = false; - for summary in Rc::new(v2_rt::map_values(&type_summaries)).iter().cloned() { - if match (*summary.repr.clone()).clone() { - TypeRepr::EnumRepr { .. } => { - emit_map_has(summary.variant_name_set.clone(), name.clone()) - } - _ => false, - } { - __found = true; - break; - } - } - __found - } +pub fn is_known_variant(type_summaries: Rc>>, name: String) -> bool { + { let mut __found = false; for summary in Rc::new(v2_rt::map_values(&type_summaries)).iter().cloned() { if match (*summary.repr.clone()).clone() { + TypeRepr::EnumRepr { .. } => emit_map_has(summary.variant_name_set.clone(), name.clone()), + _ => false, +} { __found = true; break; } } __found } } -pub fn variant_belongs_to_enum( - type_summaries: Rc>>, - variant_name: String, - enum_name: String, -) -> bool { +pub fn variant_belongs_to_enum(type_summaries: Rc>>, variant_name: String, enum_name: String) -> bool { match v2_rt::map_get(&type_summaries, enum_name) { - Some(summary) => match (*summary.repr.clone()).clone() { - TypeRepr::EnumRepr { .. } => { - emit_map_has(summary.variant_name_set.clone(), variant_name) - } - _ => false, - }, - None => false, - } + Some(summary) => match (*summary.repr.clone()).clone() { + TypeRepr::EnumRepr { .. } => emit_map_has(summary.variant_name_set.clone(), variant_name), + _ => false, +}, + None => false, +} } -pub fn is_enum_in_summaries( - type_summaries: Rc>>, - type_name: String, -) -> bool { +pub fn is_enum_in_summaries(type_summaries: Rc>>, type_name: String) -> bool { match v2_rt::map_get(&type_summaries, type_name) { - Some(summary) => match (*summary.repr.clone()).clone() { - TypeRepr::EnumRepr { .. } => true, - _ => false, - }, - None => false, - } + Some(summary) => match (*summary.repr.clone()).clone() { + TypeRepr::EnumRepr { .. } => true, + _ => false, +}, + None => false, +} } -pub fn find_variant_parent( - type_summaries: Rc>>, - variant_name: String, - scope_enums: Rc>, -) -> Option { - Rc::new({ - let mut __result = Vec::new(); - for en in scope_enums.iter().cloned() { - if variant_belongs_to_enum(type_summaries.clone(), variant_name.clone(), en.clone()) { - __result.push(en); - } - } - __result - }) - .first() - .cloned() +pub fn find_variant_parent(type_summaries: Rc>>, variant_name: String, scope_enums: Rc>) -> Option { + Rc::new({ let mut __result = Vec::new(); for en in scope_enums.iter().cloned() { if variant_belongs_to_enum(type_summaries.clone(), variant_name.clone(), en.clone()) { __result.push(en); } } __result }).first().cloned() } pub fn field_value_shape_from_type_node(type_node: Rc) -> FieldValueShape { { let normed = normalize_access_type_node(type_node); - let is_optional = (normed.return_cardinality.clone() == Cardinality::CardOptional); - if is_optional { +let is_optional = (normed.return_cardinality.clone() == Cardinality::CardOptional); +if is_optional { FieldValueShape::OptionalValue } else { FieldValueShape::PlainValue } - } +} } pub fn is_tuple_type(n: &Rc) -> bool { - (((n.connective.clone() == Connective::Conj) && (n.ident_span.clone() == None)) - && ((n.children.clone().len() as i64) == 2)) + (((n.connective.clone() == Connective::Conj) && (n.ident_span.clone() == None)) && ((n.children.clone().len() as i64) == 2)) } -pub fn build_struct_field_summaries( - parent: &Rc, - source_indices: Rc>>, -) -> Rc>> { +pub fn build_struct_field_summaries(parent: &Rc, source_indices: Rc>>) -> Rc>> { { let is_pair = is_tuple_type(&parent); - Rc::new( - parent - .children - .clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - .fold( - v2_rt::rc_empty_map::>(), - |acc: Rc>>, pair: (i64, Rc)| { - let idx = pair.0.clone(); - let child = pair.1.clone(); - if (child.inferred.clone() == None) { - acc.clone() - } else { - { - let style = if is_pair.clone() { - if (idx.clone() == 0) { - FieldAccessStyle::TupleFirst - } else { - FieldAccessStyle::TupleSecond - } +Rc::new(parent.children.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, pair: (i64, Rc)| { + let idx = pair.0.clone(); +let child = pair.1.clone(); +if (child.inferred.clone() == None) { + acc.clone() + } else { + { + let style = if is_pair.clone() { + if (idx.clone() == 0) { + FieldAccessStyle::TupleFirst } else { - FieldAccessStyle::StoredField - }; - let key = authored_name_at(source_indices.clone(), &child); - v2_rt::rc_map_insert( - acc.clone(), - key.clone(), - Rc::new(FieldSummary { - access_style: style.clone(), - value_shape: field_value_shape_from_type_node(child_type_node( - &child, - )), - }), - ) - } - } - }, - ) - } + FieldAccessStyle::TupleSecond + } + } else { + FieldAccessStyle::StoredField + }; +let key = authored_name_at(source_indices.clone(), &child); +v2_rt::rc_map_insert(acc.clone(), key.clone(), Rc::new(FieldSummary { + access_style: style.clone(), + value_shape: field_value_shape_from_type_node(child_type_node(&child)), +})) +} + } +}) +} } -pub fn find_first_enum_field_node( - variants: Rc>>, - field_name: String, - source_indices: Rc>>, -) -> Option> { +pub fn find_first_enum_field_node(variants: Rc>>, field_name: String, source_indices: Rc>>) -> Option> { match variants.first().cloned() { - Some(variant) => match find_child_named(variant.clone(), field_name, source_indices) { - Some(field_child) => Some(field_child.clone()), - None => None, - }, - None => None, - } + Some(variant) => match find_child_named(variant.clone(), field_name, source_indices) { + Some(field_child) => Some(field_child.clone()), + None => None, +}, + None => None, +} } -pub fn enum_field_present_in_all_variants( - variants: Rc>>, - field_name: String, - source_indices: Rc>>, -) -> bool { - { - let mut __all = true; - for variant in variants.iter().cloned() { - if !(has_child_named(variant.clone(), field_name.clone(), source_indices.clone())) { - __all = false; - break; - } - } - __all - } +pub fn enum_field_present_in_all_variants(variants: Rc>>, field_name: String, source_indices: Rc>>) -> bool { + { let mut __all = true; for variant in variants.iter().cloned() { if !(has_child_named(variant.clone(), field_name.clone(), source_indices.clone())) { __all = false; break; } } __all } } -pub fn enum_field_type_consistent( - variants: Rc>>, - field_name: String, - expected: Rc, - source_indices: Rc>>, -) -> bool { - { - let mut __all = true; - for variant in variants.iter().cloned() { - if !(match find_child_named(variant.clone(), field_name.clone(), source_indices.clone()) - { - Some(field_child) => node_type_equals( - &child_type_node(&field_child), - &expected, - source_indices.clone(), - ), - None => false, - }) { - __all = false; - break; - } - } - __all - } +pub fn enum_field_type_consistent(variants: Rc>>, field_name: String, expected: Rc, source_indices: Rc>>) -> bool { + { let mut __all = true; for variant in variants.iter().cloned() { if !(match find_child_named(variant.clone(), field_name.clone(), source_indices.clone()) { + Some(field_child) => node_type_equals(&child_type_node(&field_child), &expected, source_indices.clone()), + None => false, +}) { __all = false; break; } } __all } } -pub fn build_enum_field_summaries( - variants: &Rc>>, - source_indices: Rc>>, -) -> Rc>> { +pub fn build_enum_field_summaries(variants: &Rc>>, source_indices: Rc>>) -> Rc>> { { let first_field_names = match variants.clone().first().cloned() { - Some(first_variant) => Rc::new({ - let mut __result = Vec::new(); - for f in first_variant.children.clone().iter().cloned() { - __result.push(authored_name_at(source_indices.clone(), &f)); - } - __result - }), - None => Rc::new(vec![]), - }; - let shared = Rc::new({ - let mut __result = Vec::new(); - for field_name in first_field_names.iter().cloned() { - if enum_field_present_in_all_variants( - variants.clone(), - field_name.clone(), - source_indices.clone(), - ) { - __result.push(field_name); - } - } - __result - }); - let consistent = Rc::new({ - let mut __result = Vec::new(); - for field_name in shared.iter().cloned() { - if match find_first_enum_field_node( - variants.clone(), - field_name.clone(), - source_indices.clone(), - ) { - Some(first_field) => enum_field_type_consistent( - variants.clone(), - field_name.clone(), - child_type_node(&first_field), - source_indices.clone(), - ), - None => false, - } { - __result.push(field_name); - } - } - __result - }); - consistent.iter().cloned().fold( - v2_rt::rc_empty_map::>(), - |acc: Rc>>, field_name: String| { - match find_first_enum_field_node( - variants.clone(), - field_name.clone(), - source_indices.clone(), - ) { - Some(first_field) => v2_rt::rc_map_insert( - acc.clone(), - field_name.clone(), - Rc::new(FieldSummary { - access_style: FieldAccessStyle::EnumAccessor, - value_shape: field_value_shape_from_type_node(child_type_node( - &first_field, - )), - }), - ), - None => acc.clone(), - } - }, - ) - } + Some(first_variant) => Rc::new({ let mut __result = Vec::new(); for f in first_variant.children.clone().iter().cloned() { __result.push(authored_name_at(source_indices.clone(), &f)); } __result }), + None => Rc::new(vec![]), +}; +let shared = Rc::new({ let mut __result = Vec::new(); for field_name in first_field_names.iter().cloned() { if enum_field_present_in_all_variants(variants.clone(), field_name.clone(), source_indices.clone()) { __result.push(field_name); } } __result }); +let consistent = Rc::new({ let mut __result = Vec::new(); for field_name in shared.iter().cloned() { if match find_first_enum_field_node(variants.clone(), field_name.clone(), source_indices.clone()) { + Some(first_field) => enum_field_type_consistent(variants.clone(), field_name.clone(), child_type_node(&first_field), source_indices.clone()), + None => false, +} { __result.push(field_name); } } __result }); +consistent.iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, field_name: String| match find_first_enum_field_node(variants.clone(), field_name.clone(), source_indices.clone()) { + Some(first_field) => v2_rt::rc_map_insert(acc.clone(), field_name.clone(), Rc::new(FieldSummary { + access_style: FieldAccessStyle::EnumAccessor, + value_shape: field_value_shape_from_type_node(child_type_node(&first_field)), +})), + None => acc.clone(), +}) +} } -pub fn build_field_type_map( - children: Rc>>, - source_indices: Rc>>, -) -> Rc> { - children.iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, child: Rc| match child - .inferred - .clone() - .as_deref() - .cloned() - { - Some(InferredNode::Resolved { node: ft, .. }) => { - let resolved_name = authored_name_at( - source_indices.clone(), - &normalize_access_type_node(ft.clone()), - ); - let ft_is_type_var = if (ft.inferred.clone() != None) { - is_type_variable(ft.inferred.clone().clone().unwrap()) - } else { - false - }; - let key = authored_name_at(source_indices.clone(), &child); - if (((resolved_name.clone().as_str() != "".to_string().as_str()) - && !ft_is_type_var.clone()) - && (resolved_name.clone().as_str() != "Dynamic".to_string().as_str())) - { - v2_rt::rc_map_insert(acc.clone(), key.clone(), resolved_name.clone()) - } else { - acc.clone() - } - } - _ => acc.clone(), - }, - ) +pub fn build_field_type_map(children: Rc>>, source_indices: Rc>>) -> Rc> { + children.iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, child: Rc| match child.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: ft, .. }) => { + let resolved_name = authored_name_at(source_indices.clone(), &normalize_access_type_node(ft.clone())); +let ft_is_type_var = if (ft.inferred.clone() != None) { + is_type_variable(ft.inferred.clone().clone().unwrap()) + } else { + false + }; +let key = authored_name_at(source_indices.clone(), &child); +if (((resolved_name.clone().as_str() != "".to_string().as_str()) && !ft_is_type_var.clone()) && (resolved_name.clone().as_str() != "Dynamic".to_string().as_str())) { + v2_rt::rc_map_insert(acc.clone(), key.clone(), resolved_name.clone()) + } else { + acc.clone() + } +}, + _ => acc.clone(), +}) } -pub fn build_type_summary( - item: &Rc, - source_indices: &Rc>>, -) -> Option> { +pub fn build_type_summary(item: &Rc, source_indices: &Rc>>) -> Option> { { - if (((item.connective.clone() == Connective::NoConnective) - || (item.connective.clone() == Connective::Arrow)) - || (item.transport.clone() != None)) - { - return None; + if (((item.connective.clone() == Connective::NoConnective) || (item.connective.clone() == Connective::Arrow)) || (item.transport.clone() != None)) { + return None } - let gpn = Rc::new({ - let mut __result = Vec::new(); - for p in item.params.clone().iter().cloned() { - __result.push(param_node_name_at(p.clone(), source_indices.clone())); - } - __result - }); - let is_product = (item.connective.clone() == Connective::Conj); - let has_fn = { - let mut __found = false; - for child in item.children.clone().iter().cloned() { - if match child.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - (rt.connective.clone() == Connective::Arrow) - } - _ => false, - } { - __found = true; - break; - } - } - __found - }; - if is_product { +let gpn = Rc::new({ let mut __result = Vec::new(); for p in item.params.clone().iter().cloned() { __result.push(param_node_name_at(p.clone(), source_indices.clone())); } __result }); +let is_product = (item.connective.clone() == Connective::Conj); +let has_fn = { let mut __found = false; for child in item.children.clone().iter().cloned() { if match child.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => (rt.connective.clone() == Connective::Arrow), + _ => false, +} { __found = true; break; } } __found }; +if is_product { Some(Rc::new(TypeSummary { - name: authored_name_at(source_indices.clone(), &item), - repr: Rc::new(TypeRepr::StructRepr), - field_summaries: build_struct_field_summaries(&item, source_indices.clone()), - field_type_map: build_field_type_map(item.children.clone(), source_indices.clone()), - variant_name_set: v2_rt::rc_empty_map::(), - generic_param_names: gpn, - has_fn_fields: has_fn, - })) + name: authored_name_at(source_indices.clone(), &item), + repr: Rc::new(TypeRepr::StructRepr), + field_summaries: build_struct_field_summaries(&item, source_indices.clone()), + field_type_map: build_field_type_map(item.children.clone(), source_indices.clone()), + variant_name_set: v2_rt::rc_empty_map::(), + generic_param_names: gpn, + has_fn_fields: has_fn, +})) } else { { - let unit_only = { - let mut __all = true; - for child in item.children.clone().iter().cloned() { - if !((child.children.clone().len() as i64) == 0) { - __all = false; - break; - } - } - __all - }; - Some(Rc::new(TypeSummary { - name: authored_name_at(source_indices.clone(), &item), - repr: Rc::new(TypeRepr::EnumRepr { - unit_only: unit_only, - }), - field_summaries: build_enum_field_summaries( - &item.children.clone(), - source_indices.clone(), - ), - field_type_map: v2_rt::rc_empty_map::(), - variant_name_set: item.children.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, child: Rc| { - v2_rt::rc_map_insert( - acc, - authored_name_at(source_indices.clone(), &child), - true, - ) - }, - ), - generic_param_names: gpn, - has_fn_fields: has_fn, - })) - } + let unit_only = { let mut __all = true; for child in item.children.clone().iter().cloned() { if !(((child.children.clone().len() as i64) == 0)) { __all = false; break; } } __all }; +Some(Rc::new(TypeSummary { + name: authored_name_at(source_indices.clone(), &item), + repr: Rc::new(TypeRepr::EnumRepr { + unit_only: unit_only, +}), + field_summaries: build_enum_field_summaries(&item.children.clone(), source_indices.clone()), + field_type_map: v2_rt::rc_empty_map::(), + variant_name_set: item.children.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, child: Rc| v2_rt::rc_map_insert(acc, authored_name_at(source_indices.clone(), &child), true)), + generic_param_names: gpn, + has_fn_fields: has_fn, +})) +} } - } +} } -pub fn add_emit_item_summary( - state: Rc, - item: &Rc, - source_indices: &Rc>>, -) -> Rc { +pub fn add_emit_item_summary(state: Rc, item: &Rc, source_indices: &Rc>>) -> Rc { match build_type_summary(&item, &source_indices) { - Some(summary) => { - let with_variants = match (*summary.repr.clone()).clone() { - TypeRepr::EnumRepr { .. } => item.children.clone().iter().cloned().fold( - state.type_summaries.clone(), - |acc: Rc>>, variant: Rc| { - if ((variant.children.clone().len() as i64) > 0) { - { - let v_has_fn = { - let mut __found = false; - for vc in variant.children.clone().iter().cloned() { - if match vc.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - (rt.connective.clone() == Connective::Arrow) - } - _ => false, - } { - __found = true; - break; - } - } - __found - }; - let vname = authored_name_at(source_indices.clone(), &variant); - v2_rt::rc_map_insert( - acc.clone(), - vname.clone(), - Rc::new(TypeSummary { - name: vname.clone(), - repr: Rc::new(TypeRepr::StructRepr), - field_summaries: build_struct_field_summaries( - &variant, - source_indices.clone(), - ), - field_type_map: build_field_type_map( - variant.children.clone(), - source_indices.clone(), - ), - variant_name_set: v2_rt::rc_empty_map::(), - generic_param_names: Rc::new(vec![]), - has_fn_fields: v_has_fn.clone(), - }), - ) - } - } else { - acc.clone() - } - }, - ), - _ => state.type_summaries.clone(), - }; - let next_summaries = - v2_rt::rc_map_insert(with_variants, summary.name.clone(), summary.clone()); - Rc::new(EmitInfoBuildState { - type_summaries: next_summaries, - }) - } - None => state, - } + Some(summary) => { + let with_variants = match (*summary.repr.clone()).clone() { + TypeRepr::EnumRepr { .. } => item.children.clone().iter().cloned().fold(state.type_summaries.clone(), |acc: Rc>>, variant: Rc| if ((variant.children.clone().len() as i64) > 0) { + { + let v_has_fn = { let mut __found = false; for vc in variant.children.clone().iter().cloned() { if match vc.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => (rt.connective.clone() == Connective::Arrow), + _ => false, +} { __found = true; break; } } __found }; +let vname = authored_name_at(source_indices.clone(), &variant); +v2_rt::rc_map_insert(acc.clone(), vname.clone(), Rc::new(TypeSummary { + name: vname.clone(), + repr: Rc::new(TypeRepr::StructRepr), + field_summaries: build_struct_field_summaries(&variant, source_indices.clone()), + field_type_map: build_field_type_map(variant.children.clone(), source_indices.clone()), + variant_name_set: v2_rt::rc_empty_map::(), + generic_param_names: Rc::new(vec![]), + has_fn_fields: v_has_fn.clone(), +})) +} + } else { + acc.clone() + }), + _ => state.type_summaries.clone(), +}; +let next_summaries = v2_rt::rc_map_insert(with_variants, summary.name.clone(), summary.clone()); +Rc::new(EmitInfoBuildState { + type_summaries: next_summaries, +}) +}, + None => state, +} } diff --git a/src/v2/stage0/src/v2_compiler_infer_env.rs b/src/v2/stage0/src/v2_compiler_infer_env.rs index 0fce851de90..d3dc148b5eb 100644 --- a/src/v2/stage0/src/v2_compiler_infer_env.rs +++ b/src/v2/stage0/src/v2_compiler_infer_env.rs @@ -1,18 +1,15 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.infer_env -use crate::std_induction::RecursionShape::{DirectRecursion, ListRecursion, OptionalRecursion}; -use crate::std_induction::SubValueRelation::{PreservedValue, SubValueUnknown}; -pub use crate::std_induction::{InductiveField, RecursionShape, SubValueRelation}; -use crate::v2_rt; -pub use crate::v2_std_core::{ - authored_name_at, empty_intern_table, intern, intern_find, intern_str, merge_intern_tables, - source_text_at, InternTable, NewlineIndex, Node, -}; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::v2_std_core::{Node, NewlineIndex, InternTable, empty_intern_table, merge_intern_tables, intern, intern_find, intern_str, source_text_at, authored_name_at}; +pub use crate::std_induction::{InductiveField, RecursionShape, SubValueRelation}; +use crate::std_induction::RecursionShape::{DirectRecursion, ListRecursion, OptionalRecursion}; +use crate::std_induction::SubValueRelation::{SubValueUnknown, PreservedValue}; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] pub struct TypeEnv { @@ -33,30 +30,30 @@ pub struct TypeBinding { pub fn is_recursive_type(env: Rc, ident: i64) -> bool { match v2_rt::map_get(&env.recursive_type_set.clone(), ident) { - Some(_) => true, - _ => false, - } + Some(_) => true, + _ => false, +} } pub fn is_recursive_type_by_name(env: &Rc, name: String) -> bool { match intern_find(env.intern_table.clone(), name) { - Some(id) => is_recursive_type(env.clone(), id.clone()), - None => false, - } + Some(id) => is_recursive_type(env.clone(), id.clone()), + None => false, +} } pub fn lookup_type(env: Rc, ident: i64) -> Option> { match v2_rt::map_get(&env.bindings.clone(), ident) { - Some(binding) => Some(binding.resolved.clone()), - None => None, - } + Some(binding) => Some(binding.resolved.clone()), + None => None, +} } pub fn lookup_type_by_name(env: &Rc, name: String) -> Option> { match intern_find(env.intern_table.clone(), name) { - Some(id) => lookup_type(env.clone(), id.clone()), - None => None, - } + Some(id) => lookup_type(env.clone(), id.clone()), + None => None, +} } pub fn authored_name(env: Rc, node: Rc) -> String { @@ -65,192 +62,102 @@ pub fn authored_name(env: Rc, node: Rc) -> String { pub fn lookup_type_for(env: &Rc, node: &Rc) -> Option> { match node.ident.clone() { - Some(id) => lookup_type(env.clone(), id.clone()), - None => lookup_type_by_name(&env, authored_name(env.clone(), node.clone())), - } + Some(id) => lookup_type(env.clone(), id.clone()), + None => lookup_type_by_name(&env, authored_name(env.clone(), node.clone())), +} } pub fn is_recursive_type_for(env: &Rc, node: &Rc) -> bool { match node.ident.clone() { - Some(id) => is_recursive_type(env.clone(), id.clone()), - None => is_recursive_type_by_name(&env, authored_name(env.clone(), node.clone())), - } + Some(id) => is_recursive_type(env.clone(), id.clone()), + None => is_recursive_type_by_name(&env, authored_name(env.clone(), node.clone())), +} } pub fn inductive_fields_for(env: Rc, type_name: String) -> Rc>> { match v2_rt::map_get(&env.inductive_fields.clone(), type_name) { - Some(fields) => fields.clone(), - None => Rc::new(vec![]), - } + Some(fields) => fields.clone(), + None => Rc::new(vec![]), +} } -pub fn is_inductive_field( - env: Rc, - type_name: String, - variant_name: String, - field_name: String, -) -> bool { - { - let mut __found = false; - for f in inductive_fields_for(env, type_name).iter().cloned() { - if ((f.variant_name.clone().as_str() == variant_name.clone().as_str()) - && (f.field_name.clone().as_str() == field_name.clone().as_str())) - { - __found = true; - break; - } - } - __found - } +pub fn is_inductive_field(env: Rc, type_name: String, variant_name: String, field_name: String) -> bool { + { let mut __found = false; for f in inductive_fields_for(env, type_name).iter().cloned() { if ((f.variant_name.clone().as_str() == variant_name.clone().as_str()) && (f.field_name.clone().as_str() == field_name.clone().as_str())) { __found = true; break; } } __found } } -pub fn put_inductive_field( - fields: &Rc>>>>, - type_name: &String, - variant_name: String, - field_name: String, - shape: RecursionShape, -) -> Rc>>>> { +pub fn put_inductive_field(fields: &Rc>>>>, type_name: &String, variant_name: String, field_name: String, shape: RecursionShape) -> Rc>>>> { { let existing = match v2_rt::map_get(&fields, type_name.clone()) { - Some(fs) => fs.clone(), - None => Rc::new(vec![]), - }; - v2_rt::rc_map_insert( - fields.clone(), - type_name.clone(), - v2_rt::concat( - existing, - Rc::new(vec![Rc::new(InductiveField { - type_name: type_name.clone(), - variant_name: variant_name, - field_name: field_name, - shape: shape, - element_type: type_name.clone(), - })]), - ), - ) - } + Some(fs) => fs.clone(), + None => Rc::new(vec![]), +}; +v2_rt::rc_map_insert(fields.clone(), type_name.clone(), v2_rt::concat(existing, Rc::new(vec![Rc::new(InductiveField { + type_name: type_name.clone(), + variant_name: variant_name, + field_name: field_name, + shape: shape, + element_type: type_name.clone(), +})]))) +} } -pub fn put_inductive_field_cross( - fields: &Rc>>>>, - type_name: &String, - variant_name: String, - field_name: String, - shape: RecursionShape, - element_type: String, -) -> Rc>>>> { +pub fn put_inductive_field_cross(fields: &Rc>>>>, type_name: &String, variant_name: String, field_name: String, shape: RecursionShape, element_type: String) -> Rc>>>> { { let existing = match v2_rt::map_get(&fields, type_name.clone()) { - Some(fs) => fs.clone(), - None => Rc::new(vec![]), - }; - v2_rt::rc_map_insert( - fields.clone(), - type_name.clone(), - v2_rt::concat( - existing, - Rc::new(vec![Rc::new(InductiveField { - type_name: type_name.clone(), - variant_name: variant_name, - field_name: field_name, - shape: shape, - element_type: element_type, - })]), - ), - ) - } -} - -pub fn merge_inductive_fields( - left: Rc>>>>, - right: &Rc>>>>, -) -> Rc>>>> { - Rc::new(v2_rt::map_keys(&right)).iter().cloned().fold( - left.clone(), - |acc: Rc>>>>, type_name: String| { - match v2_rt::map_get(&right, type_name.clone()) { - Some(incoming) => { - let existing = match v2_rt::map_get(&acc, type_name.clone()) { - Some(fs) => fs.clone(), - None => Rc::new(vec![]), - }; - v2_rt::rc_map_insert( - acc.clone(), - type_name.clone(), - v2_rt::concat(existing.clone(), incoming.clone()), - ) - } - None => acc.clone(), - } - }, - ) + Some(fs) => fs.clone(), + None => Rc::new(vec![]), +}; +v2_rt::rc_map_insert(fields.clone(), type_name.clone(), v2_rt::concat(existing, Rc::new(vec![Rc::new(InductiveField { + type_name: type_name.clone(), + variant_name: variant_name, + field_name: field_name, + shape: shape, + element_type: element_type, +})]))) +} +} + +pub fn merge_inductive_fields(left: Rc>>>>, right: &Rc>>>>) -> Rc>>>> { + Rc::new(v2_rt::map_keys(&right)).iter().cloned().fold(left.clone(), |acc: Rc>>>>, type_name: String| match v2_rt::map_get(&right, type_name.clone()) { + Some(incoming) => { + let existing = match v2_rt::map_get(&acc, type_name.clone()) { + Some(fs) => fs.clone(), + None => Rc::new(vec![]), +}; +v2_rt::rc_map_insert(acc.clone(), type_name.clone(), v2_rt::concat(existing.clone(), incoming.clone())) +}, + None => acc.clone(), +}) } -pub fn inductive_fields_list_to_map( - fields: Rc>>, -) -> Rc>>>> { - fields.iter().cloned().fold( - v2_rt::rc_empty_map::>>>(), - |acc: Rc>>>>, field: Rc| { - let existing = match v2_rt::map_get(&acc, field.type_name.clone()) { - Some(fs) => fs.clone(), - None => Rc::new(vec![]), - }; - v2_rt::rc_map_insert( - acc.clone(), - field.type_name.clone(), - v2_rt::concat(existing.clone(), Rc::new(vec![field.clone()])), - ) - }, - ) +pub fn inductive_fields_list_to_map(fields: Rc>>) -> Rc>>>> { + fields.iter().cloned().fold(v2_rt::rc_empty_map::>>>(), |acc: Rc>>>>, field: Rc| { + let existing = match v2_rt::map_get(&acc, field.type_name.clone()) { + Some(fs) => fs.clone(), + None => Rc::new(vec![]), +}; +v2_rt::rc_map_insert(acc.clone(), field.type_name.clone(), v2_rt::concat(existing.clone(), Rc::new(vec![field.clone()]))) +}) } pub fn merge_envs(envs: &Rc>>) -> Rc { { - let merged_bindings = envs.clone().iter().cloned().fold( - v2_rt::rc_empty_map::>(), - |acc: Rc>>, env: Rc| { - v2_rt::rc_map_merge(acc, env.bindings.clone()) - }, - ); - let merged_recursive = envs - .clone() - .iter() - .cloned() - .fold(Rc::new(vec![]), |acc: _, env: Rc| { - v2_rt::concat(acc, env.recursive_types.clone()) - }); - let merged_recursive_set = envs.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, env: Rc| { - v2_rt::rc_map_merge(acc, env.recursive_type_set.clone()) - }, - ); - let merged_inductive_fields = envs.clone().iter().cloned().fold( - v2_rt::rc_empty_map::>>>(), - |acc: Rc>>>>, env: Rc| { - merge_inductive_fields(acc, &env.inductive_fields.clone()) - }, - ); - let merged_source_indices = envs.clone().iter().cloned().fold( - v2_rt::rc_empty_map::>(), - |acc: Rc>>, env: Rc| { - v2_rt::rc_map_merge(acc, env.source_indices.clone()) - }, - ); - let merged_intern_table = match envs.clone().first().cloned() { - Some(first_env) => first_env.intern_table.clone(), - None => empty_intern_table(), - }; - Rc::new(TypeEnv { - bindings: merged_bindings, - recursive_types: merged_recursive, - recursive_type_set: merged_recursive_set, - inductive_fields: merged_inductive_fields, - source_indices: merged_source_indices, - intern_table: merged_intern_table, - }) - } + let merged_bindings = envs.clone().iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, env: Rc| v2_rt::rc_map_merge(acc, env.bindings.clone())); +let merged_recursive = envs.clone().iter().cloned().fold(Rc::new(vec![]), |acc: _, env: Rc| v2_rt::concat(acc, env.recursive_types.clone())); +let merged_recursive_set = envs.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, env: Rc| v2_rt::rc_map_merge(acc, env.recursive_type_set.clone())); +let merged_inductive_fields = envs.clone().iter().cloned().fold(v2_rt::rc_empty_map::>>>(), |acc: Rc>>>>, env: Rc| merge_inductive_fields(acc, &env.inductive_fields.clone())); +let merged_source_indices = envs.clone().iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, env: Rc| v2_rt::rc_map_merge(acc, env.source_indices.clone())); +let merged_intern_table = match envs.clone().first().cloned() { + Some(first_env) => first_env.intern_table.clone(), + None => empty_intern_table(), +}; +Rc::new(TypeEnv { + bindings: merged_bindings, + recursive_types: merged_recursive, + recursive_type_set: merged_recursive_set, + inductive_fields: merged_inductive_fields, + source_indices: merged_source_indices, + intern_table: merged_intern_table, +}) +} } diff --git a/src/v2/stage0/src/v2_compiler_infer_items.rs b/src/v2/stage0/src/v2_compiler_infer_items.rs index 59c2ce01482..774ee8dfc9e 100644 --- a/src/v2/stage0/src/v2_compiler_infer_items.rs +++ b/src/v2/stage0/src/v2_compiler_infer_items.rs @@ -1,27 +1,23 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.infer_items -use self::ItemKind::*; -pub use crate::std_induction::SubValueRelation; -use crate::std_induction::SubValueRelation::SubValueUnknown; -pub use crate::std_types::SourceSpan; -pub use crate::v2_compiler_infer_emit_info::EmitGraphInfo; -pub use crate::v2_compiler_infer_env::{TypeBinding, TypeEnv}; -pub use crate::v2_compiler_infer_sigs::ResolvedFuncEnv; -pub use crate::v2_compiler_infer_types::child_type_node; -use crate::v2_rt; -use crate::v2_std_core::Cardinality::Required; -use crate::v2_std_core::Connective::{Conj, Disj, NoConnective}; -use crate::v2_std_core::InferredNode::{CompilerError, Resolved, TypeVariable}; -pub use crate::v2_std_core::{ - authored_name_at, expr_has_non_tail_self_call, expr_has_self_call, make_field_node, - make_param_node, no_span, node_name_span, param_node_name_at, param_node_type_expr, - Cardinality, Connective, ErrorNode, InferredNode, NewlineIndex, Node, -}; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::std_types::{SourceSpan}; +pub use crate::v2_std_core::{Node, ErrorNode, make_param_node, param_node_name_at, param_node_type_expr, make_field_node, InferredNode, Cardinality, expr_has_self_call, expr_has_non_tail_self_call, Connective, node_name_span, no_span, NewlineIndex, authored_name_at}; +use crate::v2_std_core::InferredNode::{Resolved, CompilerError, TypeVariable}; +use crate::v2_std_core::Cardinality::{Required}; +use crate::v2_std_core::Connective::{Conj, Disj, NoConnective}; +pub use crate::v2_compiler_infer_types::{child_type_node}; +pub use crate::std_induction::{SubValueRelation}; +use crate::std_induction::SubValueRelation::{SubValueUnknown}; +pub use crate::v2_compiler_infer_env::{TypeEnv, TypeBinding}; +pub use crate::v2_compiler_infer_sigs::{ResolvedFuncEnv}; +pub use crate::v2_compiler_infer_emit_info::{EmitGraphInfo}; +use self::ItemKind::*; #[derive(Debug, Clone, Copy, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] @@ -70,92 +66,46 @@ pub struct ResolvedGraph { pub emit_graph_info: Rc, } -pub fn inferred_to_outputs( - inferred: &Option>, - span: Rc, - source_indices: Rc>>, -) -> Rc>> { +pub fn inferred_to_outputs(inferred: &Option>, span: Rc, source_indices: Rc>>) -> Rc>> { if (inferred.clone() == None) { Rc::new(vec![]) } else { match (*inferred.clone().unwrap()).clone() { - InferredNode::CompilerError { .. } => Rc::new(vec![]), - InferredNode::TypeVariable { .. } => Rc::new(vec![]), - InferredNode::Resolved { node: rt, .. } => { - let has_structure = (rt.connective.clone() != Connective::NoConnective); - if has_structure { - { - let is_product = (rt.connective.clone() == Connective::Conj); - if is_product { - if (rt.ident_span.clone() == None) { - Rc::new({ - let mut __result = Vec::new(); - for child in rt.children.clone().iter().cloned() { - __result.push({ - let child_type = child_type_node(&child); - make_field_node( - &authored_name_at(source_indices.clone(), &child), - child_type.clone(), - Cardinality::Required, - None, - None, - span.clone(), - node_name_span(&child), - ) - }); - } - __result - }) - } else { - Rc::new(vec![make_field_node( - &"value".to_string(), - rt.clone(), - Cardinality::Required, - None, - None, - span.clone(), - no_span(), - )]) - } + InferredNode::CompilerError { .. } => Rc::new(vec![]), + InferredNode::TypeVariable { .. } => Rc::new(vec![]), + InferredNode::Resolved { node: rt, .. } => { + let has_structure = (rt.connective.clone() != Connective::NoConnective); +if has_structure { + { + let is_product = (rt.connective.clone() == Connective::Conj); +if is_product { + if (rt.ident_span.clone() == None) { + Rc::new({ let mut __result = Vec::new(); for child in rt.children.clone().iter().cloned() { __result.push({ + let child_type = child_type_node(&child); +make_field_node(&authored_name_at(source_indices.clone(), &child), child_type.clone(), Cardinality::Required, None, None, span.clone(), node_name_span(&child)) +}); } __result }) } else { - Rc::new(vec![make_field_node( - &"value".to_string(), - rt.clone(), - Cardinality::Required, - None, - None, - span.clone(), - no_span(), - )]) + Rc::new(vec![make_field_node(&"value".to_string(), rt.clone(), Cardinality::Required, None, None, span.clone(), no_span())]) } - } - } else { - if ((rt.connective.clone() == Connective::Conj) - && ((rt.children.clone().len() as i64) == 0)) - { - Rc::new(vec![]) } else { - Rc::new(vec![make_field_node( - &"value".to_string(), - rt.clone(), - Cardinality::Required, - None, - None, - span.clone(), - no_span(), - )]) + Rc::new(vec![make_field_node(&"value".to_string(), rt.clone(), Cardinality::Required, None, None, span.clone(), no_span())]) } +} + } else { + if ((rt.connective.clone() == Connective::Conj) && ((rt.children.clone().len() as i64) == 0)) { + Rc::new(vec![]) + } else { + Rc::new(vec![make_field_node(&"value".to_string(), rt.clone(), Cardinality::Required, None, None, span.clone(), no_span())]) } } - } +}, +} } } pub fn item_kind(item: &Rc) -> ItemKind { { - let kind = if ((item.connective.clone() != Connective::NoConnective) - && (item.transport.clone() == None)) - { + let kind = if ((item.connective.clone() != Connective::NoConnective) && (item.transport.clone() == None)) { ItemKind::TypeItem } else { if (item.transport.clone() != None) { @@ -180,38 +130,24 @@ pub fn item_kind(item: &Rc) -> ItemKind { } } }; - kind - } +kind +} } -pub fn variant_locals_from_items( - items: Rc>>, - init: Rc>>, - source_indices: Rc>>, -) -> Rc>> { - items.iter().cloned().fold( - init, - |acc: Rc>>, item: Rc| { - let is_coproduct = (item.connective.clone() == Connective::Disj); - if is_coproduct.clone() { - item.children.clone().iter().cloned().fold( - acc.clone(), - |vacc: Rc>>, child: Rc| { - let child_name = authored_name_at(source_indices.clone(), &child); - v2_rt::rc_map_insert( - vacc, - child_name.clone(), - Rc::new(TypeBinding { - name: child_name.clone(), - resolved: item.clone(), - provenance: Rc::new(SubValueRelation::SubValueUnknown), - }), - ) - }, - ) - } else { - acc.clone() - } - }, - ) +pub fn variant_locals_from_items(items: Rc>>, init: Rc>>, source_indices: Rc>>) -> Rc>> { + items.iter().cloned().fold(init, |acc: Rc>>, item: Rc| { + let is_coproduct = (item.connective.clone() == Connective::Disj); +if is_coproduct.clone() { + item.children.clone().iter().cloned().fold(acc.clone(), |vacc: Rc>>, child: Rc| { + let child_name = authored_name_at(source_indices.clone(), &child); +v2_rt::rc_map_insert(vacc, child_name.clone(), Rc::new(TypeBinding { + name: child_name.clone(), + resolved: item.clone(), + provenance: Rc::new(SubValueRelation::SubValueUnknown), +})) +}) + } else { + acc.clone() + } +}) } diff --git a/src/v2/stage0/src/v2_compiler_infer_lookup.rs b/src/v2/stage0/src/v2_compiler_infer_lookup.rs index 9b5cdb6a1fc..8acb05ae1b6 100644 --- a/src/v2/stage0/src/v2_compiler_infer_lookup.rs +++ b/src/v2/stage0/src/v2_compiler_infer_lookup.rs @@ -1,53 +1,34 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.infer_lookup -use crate::std_algebra::AlgebraTypeTemplate::{ContainerOf, ReceiverSelf}; -use crate::std_algebra::CollectionSizeEffect::*; -use crate::std_algebra::ContainerSource::{Named, SameAsReceiver}; -use crate::std_algebra::CostShape::*; -pub use crate::std_algebra::{ - algebra_templates_for_profile, kernel_algebra_profile, AlgebraFieldTemplate, - AlgebraTypeTemplate, CollectionSizeEffect, ContainerSource, CostShape, -}; -pub use crate::v2_compiler_infer_emit_info::{ - build_enum_field_summaries, build_struct_field_summaries, -}; -pub use crate::v2_compiler_infer_env::{ - authored_name, is_recursive_type, lookup_type, lookup_type_for, TypeBinding, TypeEnv, -}; -pub use crate::v2_compiler_infer_service::{ - check_service_method_call_node, OpEntry, ServiceMethodResult, -}; -pub use crate::v2_compiler_infer_sigs::{ResolvedFuncEnv, ResolvedFuncSig}; -pub use crate::v2_compiler_infer_types::{ - child_type_node, emit_map_has, enrich_kernel_type, method_receiver_element_node, - node_is_keyed_collection, nominal_type_ref, normalize_access_type_node, -}; -use crate::v2_rt; -use crate::v2_std_core::Cardinality::{CardOptional, Required}; -use crate::v2_std_core::Connective::{Conj, Disj, NoConnective}; -use crate::v2_std_core::FieldAccessStyle::OptionalUnwrap; -use crate::v2_std_core::FieldValueShape::{OptionalValue, PlainValue}; -use crate::v2_std_core::InferredNode::{Resolved, TypeVariable}; -use crate::v2_std_core::MethodSemantics::{ - AlgebraMethodSemantics, PlainMethodSemantics, ServiceMethodSemantics, -}; -pub use crate::v2_std_core::{ - authored_name_at, find_child_named, has_child_named, param_node_type_expr, - with_optional_cardinality, with_required_cardinality, Cardinality, Connective, ErrorNode, - FieldAccessStyle, FieldSummary, FieldValueShape, InferredNode, MethodSemantics, NewlineIndex, - Node, -}; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::v2_std_core::{Node, param_node_type_expr, authored_name_at, NewlineIndex, find_child_named, has_child_named, InferredNode, Cardinality, MethodSemantics, FieldAccessStyle, FieldValueShape, FieldSummary, with_optional_cardinality, with_required_cardinality, Connective, ErrorNode}; +use crate::v2_std_core::InferredNode::{Resolved, TypeVariable}; +use crate::v2_std_core::Cardinality::{Required, CardOptional}; +use crate::v2_std_core::MethodSemantics::{PlainMethodSemantics, AlgebraMethodSemantics, ServiceMethodSemantics}; +use crate::v2_std_core::FieldAccessStyle::{OptionalUnwrap}; +use crate::v2_std_core::FieldValueShape::{PlainValue, OptionalValue}; +use crate::v2_std_core::Connective::{Conj, Disj, NoConnective}; +pub use crate::std_algebra::{CollectionSizeEffect, CostShape, AlgebraFieldTemplate, AlgebraTypeTemplate, ContainerSource, kernel_algebra_profile, algebra_templates_for_profile}; +use crate::std_algebra::AlgebraTypeTemplate::{ReceiverSelf, ContainerOf}; +use crate::std_algebra::ContainerSource::{SameAsReceiver, Named}; +use crate::std_algebra::CollectionSizeEffect::*; +use crate::std_algebra::CostShape::*; +pub use crate::v2_compiler_infer_types::{child_type_node, nominal_type_ref, normalize_access_type_node, node_is_keyed_collection, method_receiver_element_node, emit_map_has, enrich_kernel_type}; +pub use crate::v2_compiler_infer_env::{TypeEnv, TypeBinding, authored_name, is_recursive_type, lookup_type, lookup_type_for}; +pub use crate::v2_compiler_infer_emit_info::{build_struct_field_summaries, build_enum_field_summaries}; +pub use crate::v2_compiler_infer_sigs::{ResolvedFuncSig, ResolvedFuncEnv}; +pub use crate::v2_compiler_infer_service::{OpEntry, ServiceMethodResult, check_service_method_call_node}; pub fn is_type_variable(inferred: Rc) -> bool { match (*inferred).clone() { - InferredNode::TypeVariable { .. } => true, - _ => false, - } + InferredNode::TypeVariable { .. } => true, + _ => false, +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -57,296 +38,221 @@ pub struct KnownMethodResolution { pub diagnostics: Rc>>, } -pub fn lookup_in_scope( - locals: Rc>>, - name: String, -) -> Option> { +pub fn lookup_in_scope(locals: Rc>>, name: String) -> Option> { match v2_rt::map_get(&locals, name) { - Some(binding) => Some(binding.resolved.clone()), - None => None, - } + Some(binding) => Some(binding.resolved.clone()), + None => None, +} } pub fn lookup_func_sig(func_env: Rc, name: String) -> Option> { v2_rt::map_get(&func_env.signatures.clone(), name) } -pub fn lookup_field_type_node( - n: &Rc, - field_name: &String, - source_indices: Rc>>, -) -> Option> { +pub fn lookup_field_type_node(n: &Rc, field_name: &String, source_indices: Rc>>) -> Option> { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - let is_optional = (n.return_cardinality.clone() == Cardinality::CardOptional); - if is_optional { - { - let inner = with_required_cardinality(&n); - if (field_name.clone().as_str() == "value".to_string().as_str()) { - Some(inner) - } else { - match lookup_field_type_node(&inner, &field_name, source_indices) { - Some(inner_result) => Some(with_optional_cardinality(&inner_result)), - None => None, + { + let is_optional = (n.return_cardinality.clone() == Cardinality::CardOptional); +if is_optional { + { + let inner = with_required_cardinality(&n); +if (field_name.clone().as_str() == "value".to_string().as_str()) { + Some(inner) + } else { + match lookup_field_type_node(&inner, &field_name, source_indices) { + Some(inner_result) => Some(with_optional_cardinality(&inner_result)), + None => None, +} } - } - } - } else { - { - let has_structure = (n.connective.clone() != Connective::NoConnective); - if has_structure { - { - let is_product = (n.connective.clone() == Connective::Conj); - if is_product { - match find_child_named(n.clone(), field_name.clone(), source_indices) { - Some(field_child) => Some(child_type_node(&field_child)), - None => None, +} + } else { + { + let has_structure = (n.connective.clone() != Connective::NoConnective); +if has_structure { + { + let is_product = (n.connective.clone() == Connective::Conj); +if is_product { + match find_child_named(n.clone(), field_name.clone(), source_indices) { + Some(field_child) => Some(child_type_node(&field_child)), + None => None, +} + } else { + lookup_coproduct_common_field_node(&n.children.clone(), &field_name, &source_indices) } - } else { - lookup_coproduct_common_field_node( - &n.children.clone(), - &field_name, - &source_indices, - ) - } +} + } else { + None } - } else { - None - } +} } - } +} }) } -pub fn lookup_coproduct_common_field_node( - variants: &Rc>>, - field_name: &String, - source_indices: &Rc>>, -) -> Option> { +pub fn lookup_coproduct_common_field_node(variants: &Rc>>, field_name: &String, source_indices: &Rc>>) -> Option> { { - let found_in_all = { - let mut __all = true; - for v in variants.clone().iter().cloned() { - if !(has_child_named(v.clone(), field_name.clone(), source_indices.clone())) { - __all = false; - break; - } - } - __all - }; - let first_field = if found_in_all { + let found_in_all = { let mut __all = true; for v in variants.clone().iter().cloned() { if !(has_child_named(v.clone(), field_name.clone(), source_indices.clone())) { __all = false; break; } } __all }; +let first_field = if found_in_all { match variants.clone().first().cloned() { - Some(first_variant) => find_child_named( - first_variant.clone(), - field_name.clone(), - source_indices.clone(), - ), - None => None, - } + Some(first_variant) => find_child_named(first_variant.clone(), field_name.clone(), source_indices.clone()), + None => None, +} } else { None }; - match first_field { - Some(field_child) => Some(child_type_node(&field_child)), - None => None, - } - } +match first_field { + Some(field_child) => Some(child_type_node(&field_child)), + None => None, +} +} } pub fn resolve_scrutinee_type_node(env: Rc, n: Rc) -> Rc { resolve_scrutinee_type_node_seen(&env, n, &v2_rt::rc_empty_map::()) } -pub fn resolve_scrutinee_type_node_seen( - env: &Rc, - n: Rc, - seen: &Rc>, -) -> Rc { +pub fn resolve_scrutinee_type_node_seen(env: &Rc, n: Rc, seen: &Rc>) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - let n_is_type_var = if (n.inferred.clone() != None) { - is_type_variable(n.inferred.clone().clone().unwrap()) - } else { - false - }; - if n_is_type_var { - return n.clone(); - } - let normed = normalize_access_type_node(n.clone()); - if ((normed.connective.clone() == Connective::NoConnective) - && ((normed.children.clone().len() as i64) == 0)) { - { - let canonical = authored_name(env.clone(), normed.clone()); - if (normed.inferred.clone() != None) { - { - let next_seen = if (canonical.clone().as_str() == "".to_string().as_str()) { - seen.clone() - } else { - v2_rt::rc_map_insert(seen.clone(), canonical.clone(), true) - }; - match normed.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: target, .. }) => { - if ((((authored_name(env.clone(), target.clone()).as_str() - == canonical.clone().as_str()) - && (target.inferred.clone() == None)) - && (target.connective.clone() == Connective::NoConnective)) - && ((target.children.clone().len() as i64) == 0)) - { - normed.clone() - } else { - resolve_scrutinee_type_node_seen( - &env, - target.clone(), - &next_seen, - ) - } - } - _ => normed.clone(), - } - } - } else { - if ((canonical.clone().as_str() != "".to_string().as_str()) - && emit_map_has(seen.clone(), canonical.clone())) - { - nominal_type_ref(&canonical) - } else { + let n_is_type_var = if (n.inferred.clone() != None) { + is_type_variable(n.inferred.clone().clone().unwrap()) + } else { + false + }; +if n_is_type_var { + return n.clone() + } +let normed = normalize_access_type_node(n.clone()); +if ((normed.connective.clone() == Connective::NoConnective) && ((normed.children.clone().len() as i64) == 0)) { + { + let canonical = authored_name(env.clone(), normed.clone()); +if (normed.inferred.clone() != None) { { - let next_seen = - if (canonical.clone().as_str() == "".to_string().as_str()) { + let next_seen = if (canonical.clone().as_str() == "".to_string().as_str()) { + seen.clone() + } else { + v2_rt::rc_map_insert(seen.clone(), canonical.clone(), true) + }; +match normed.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: target, .. }) => if ((((authored_name(env.clone(), target.clone()).as_str() == canonical.clone().as_str()) && (target.inferred.clone() == None)) && (target.connective.clone() == Connective::NoConnective)) && ((target.children.clone().len() as i64) == 0)) { + normed.clone() + } else { + resolve_scrutinee_type_node_seen(&env, target.clone(), &next_seen) + }, + _ => normed.clone(), +} +} + } else { + if ((canonical.clone().as_str() != "".to_string().as_str()) && emit_map_has(seen.clone(), canonical.clone())) { + nominal_type_ref(&canonical) + } else { + { + let next_seen = if (canonical.clone().as_str() == "".to_string().as_str()) { seen.clone() } else { v2_rt::rc_map_insert(seen.clone(), canonical.clone(), true) }; - match lookup_type_for(&env, &normed) { - Some(resolved) => { - if ((((authored_name(env.clone(), resolved.clone()).as_str() - == canonical.clone().as_str()) - && (resolved.inferred.clone() == None)) - && (resolved.connective.clone() - == Connective::NoConnective)) - && ((resolved.children.clone().len() as i64) == 0)) +match lookup_type_for(&env, &normed) { + Some(resolved) => if ((((authored_name(env.clone(), resolved.clone()).as_str() == canonical.clone().as_str()) && (resolved.inferred.clone() == None)) && (resolved.connective.clone() == Connective::NoConnective)) && ((resolved.children.clone().len() as i64) == 0)) { + normed.clone() + } else { { - normed.clone() - } else { - { - let result = resolve_scrutinee_type_node_seen( - &env, - resolved.clone(), - &next_seen, - ); - let is_optional = (normed.return_cardinality.clone() - == Cardinality::CardOptional); - if is_optional { - with_optional_cardinality(&result) - } else { - result - } + let result = resolve_scrutinee_type_node_seen(&env, resolved.clone(), &next_seen); +let is_optional = (normed.return_cardinality.clone() == Cardinality::CardOptional); +if is_optional { + with_optional_cardinality(&result) + } else { + result } - } - } - None => normed.clone(), - } +} + }, + None => normed.clone(), +} +} } } - } +} + } else { + normed.clone() } - } else { - normed.clone() - } +} }) } pub fn map_value_type_in_env(type_node: Rc, env: &Rc) -> Option> { { let normed = normalize_access_type_node(type_node); - let resolved = resolve_scrutinee_type_node(env.clone(), normed); - let map_type = normalize_access_type_node(resolved); - if (node_is_keyed_collection(&map_type, env.source_indices.clone()) - && ((map_type.children.clone().len() as i64) >= 2)) - { +let resolved = resolve_scrutinee_type_node(env.clone(), normed); +let map_type = normalize_access_type_node(resolved); +if (node_is_keyed_collection(&map_type, env.source_indices.clone()) && ((map_type.children.clone().len() as i64) >= 2)) { match map_type.children.clone().get(1 as usize).cloned() { - Some(value_type) => Some(value_type.clone()), - None => None, - } + Some(value_type) => Some(value_type.clone()), + None => None, +} } else { None } - } +} } pub fn map_key_type_in_env(type_node: Rc, env: &Rc) -> Option> { { let normed = normalize_access_type_node(type_node); - let resolved = resolve_scrutinee_type_node(env.clone(), normed); - let map_type = normalize_access_type_node(resolved); - if (node_is_keyed_collection(&map_type, env.source_indices.clone()) - && ((map_type.children.clone().len() as i64) >= 1)) - { +let resolved = resolve_scrutinee_type_node(env.clone(), normed); +let map_type = normalize_access_type_node(resolved); +if (node_is_keyed_collection(&map_type, env.source_indices.clone()) && ((map_type.children.clone().len() as i64) >= 1)) { match map_type.children.clone().first().cloned() { - Some(key_type) => Some(key_type.clone()), - None => None, - } + Some(key_type) => Some(key_type.clone()), + None => None, +} } else { None } - } +} } -pub fn field_summary_for_type( - base_type: Rc, - env: &Rc, - field: &String, -) -> Option> { +pub fn field_summary_for_type(base_type: Rc, env: &Rc, field: &String) -> Option> { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - let resolved = resolve_scrutinee_type_node(env.clone(), base_type); - let normed = normalize_access_type_node(resolved.clone()); - let normed_opt = (normed.return_cardinality.clone() == Cardinality::CardOptional); - if ((field.clone().as_str() == "value".to_string().as_str()) && normed_opt.clone()) { - Some(Rc::new(FieldSummary { - access_style: FieldAccessStyle::OptionalUnwrap, - value_shape: FieldValueShape::PlainValue, - })) - } else { - if normed_opt.clone() { - { - let inner = with_required_cardinality(&normed); - match field_summary_for_type(inner, &env, &field) { - Some(inner_summary) => Some(Rc::new(FieldSummary { - access_style: inner_summary.access_style.clone(), - value_shape: FieldValueShape::OptionalValue, - })), - None => None, - } - } + { + let resolved = resolve_scrutinee_type_node(env.clone(), base_type); +let normed = normalize_access_type_node(resolved.clone()); +let normed_opt = (normed.return_cardinality.clone() == Cardinality::CardOptional); +if ((field.clone().as_str() == "value".to_string().as_str()) && normed_opt.clone()) { + Some(Rc::new(FieldSummary { + access_style: FieldAccessStyle::OptionalUnwrap, + value_shape: FieldValueShape::PlainValue, +})) } else { - { - let no_structure = (resolved.connective.clone() == Connective::NoConnective); - if no_structure { - None - } else { - { - let is_product = (resolved.connective.clone() == Connective::Conj); - if is_product { - v2_rt::map_get( - &build_struct_field_summaries( - &resolved, - env.source_indices.clone(), - ), - field.clone(), - ) - } else { - v2_rt::map_get( - &build_enum_field_summaries( - &resolved.children.clone(), - env.source_indices.clone(), - ), - field.clone(), - ) - } + if normed_opt.clone() { + { + let inner = with_required_cardinality(&normed); +match field_summary_for_type(inner, &env, &field) { + Some(inner_summary) => Some(Rc::new(FieldSummary { + access_style: inner_summary.access_style.clone(), + value_shape: FieldValueShape::OptionalValue, +})), + None => None, +} +} + } else { + { + let no_structure = (resolved.connective.clone() == Connective::NoConnective); +if no_structure { + None + } else { + { + let is_product = (resolved.connective.clone() == Connective::Conj); +if is_product { + v2_rt::map_get(&build_struct_field_summaries(&resolved, env.source_indices.clone()), field.clone()) + } else { + v2_rt::map_get(&build_enum_field_summaries(&resolved.children.clone(), env.source_indices.clone()), field.clone()) + } +} } - } +} } } - } +} }) } @@ -365,199 +271,136 @@ pub struct StructuralMethodLookup { pub kernel_diagnostics: Rc>>, } -pub fn lookup_field_in_product( - product: Rc, - method_name: String, - source_indices: Rc>>, -) -> Option> { +pub fn lookup_field_in_product(product: Rc, method_name: String, source_indices: Rc>>) -> Option> { { - let matching = Rc::new({ - let mut __result = Vec::new(); - for c in product.children.clone().iter().cloned() { - if (authored_name_at(source_indices.clone(), &c).as_str() - == method_name.clone().as_str()) - { - __result.push(c); - } - } - __result - }); - match matching.first().cloned() { - Some(field) => match field.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - if ((rt.params.clone().len() as i64) > 0) { - match rt.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { - node: return_type, .. - }) => Some(Rc::new(MethodFieldResult { - field_node: field.clone(), - result_type: return_type.clone(), - size_effect: None, - cost_shape: None, - algebra_template: None, - })), - _ => Some(Rc::new(MethodFieldResult { - field_node: field.clone(), - result_type: rt.clone(), - size_effect: None, - cost_shape: None, - algebra_template: None, - })), - } - } else { - Some(Rc::new(MethodFieldResult { - field_node: field.clone(), - result_type: rt.clone(), - size_effect: None, - cost_shape: None, - algebra_template: None, - })) - } - } - _ => None, - }, - None => None, - } - } + let matching = Rc::new({ let mut __result = Vec::new(); for c in product.children.clone().iter().cloned() { if (authored_name_at(source_indices.clone(), &c).as_str() == method_name.clone().as_str()) { __result.push(c); } } __result }); +match matching.first().cloned() { + Some(field) => match field.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => if ((rt.params.clone().len() as i64) > 0) { + match rt.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: return_type, .. }) => Some(Rc::new(MethodFieldResult { + field_node: field.clone(), + result_type: return_type.clone(), + size_effect: None, + cost_shape: None, + algebra_template: None, +})), + _ => Some(Rc::new(MethodFieldResult { + field_node: field.clone(), + result_type: rt.clone(), + size_effect: None, + cost_shape: None, + algebra_template: None, +})), +} + } else { + Some(Rc::new(MethodFieldResult { + field_node: field.clone(), + result_type: rt.clone(), + size_effect: None, + cost_shape: None, + algebra_template: None, +})) + }, + _ => None, +}, + None => None, +} +} } -pub fn lookup_structural_method( - receiver_type: &Rc, - method_name: &String, - source_indices: &Rc>>, -) -> Rc { +pub fn lookup_structural_method(receiver_type: &Rc, method_name: &String, source_indices: &Rc>>) -> Rc { { let is_product = (receiver_type.connective.clone() == Connective::Conj); - if is_product { +if is_product { { - let direct = lookup_field_in_product( - receiver_type.clone(), - method_name.clone(), - source_indices.clone(), - ); - Rc::new(StructuralMethodLookup { - resolution: direct, - kernel_diagnostics: Rc::new(vec![]), - }) - } + let direct = lookup_field_in_product(receiver_type.clone(), method_name.clone(), source_indices.clone()); +Rc::new(StructuralMethodLookup { + resolution: direct, + kernel_diagnostics: Rc::new(vec![]), +}) +} } else { { - let enriched = enrich_kernel_type( - &authored_name_at(source_indices.clone(), &receiver_type), - &receiver_type, - source_indices.clone(), - ); - if ((enriched.ty.clone().connective.clone() == Connective::Conj) - && ((enriched.ty.clone().children.clone().len() as i64) > 0)) - { + let enriched = enrich_kernel_type(&authored_name_at(source_indices.clone(), &receiver_type), &receiver_type, source_indices.clone()); +if ((enriched.ty.clone().connective.clone() == Connective::Conj) && ((enriched.ty.clone().children.clone().len() as i64) > 0)) { { - let base_result = lookup_field_in_product( - enriched.ty.clone(), - method_name.clone(), - source_indices.clone(), - ); - match base_result.clone() { - Some(mfr) => { - let profile = v2_rt::map_get( - &kernel_algebra_profile(), - authored_name_at(source_indices.clone(), &receiver_type), - ); - let template_match = match profile { - Some(p) => { - let templates = algebra_templates_for_profile(p.clone()); - Rc::new({ - let mut __result = Vec::new(); - for t in templates.iter().cloned() { - if (t.name.clone().as_str() - == method_name.clone().as_str()) - { - __result.push(t); - } - } - __result - }) - .first() - .cloned() - } - None => None, - }; - let resolution = match template_match { - Some(t) => Some(Rc::new(MethodFieldResult { - field_node: mfr.field_node.clone(), - result_type: mfr.result_type.clone(), - size_effect: t.size_effect.clone(), - cost_shape: t.cost_shape.clone(), - algebra_template: Some(t.clone()), - })), - None => base_result.clone(), - }; - Rc::new(StructuralMethodLookup { - resolution: resolution, - kernel_diagnostics: enriched.diagnostics.clone(), - }) - } - None => Rc::new(StructuralMethodLookup { - resolution: None, - kernel_diagnostics: enriched.diagnostics.clone(), - }), - } - } + let base_result = lookup_field_in_product(enriched.ty.clone(), method_name.clone(), source_indices.clone()); +match base_result.clone() { + Some(mfr) => { + let profile = v2_rt::map_get(&kernel_algebra_profile(), authored_name_at(source_indices.clone(), &receiver_type)); +let template_match = match profile { + Some(p) => { + let templates = algebra_templates_for_profile(p.clone()); +Rc::new({ let mut __result = Vec::new(); for t in templates.iter().cloned() { if (t.name.clone().as_str() == method_name.clone().as_str()) { __result.push(t); } } __result }).first().cloned() +}, + None => None, +}; +let resolution = match template_match { + Some(t) => Some(Rc::new(MethodFieldResult { + field_node: mfr.field_node.clone(), + result_type: mfr.result_type.clone(), + size_effect: t.size_effect.clone(), + cost_shape: t.cost_shape.clone(), + algebra_template: Some(t.clone()), +})), + None => base_result.clone(), +}; +Rc::new(StructuralMethodLookup { + resolution: resolution, + kernel_diagnostics: enriched.diagnostics.clone(), +}) +}, + None => Rc::new(StructuralMethodLookup { + resolution: None, + kernel_diagnostics: enriched.diagnostics.clone(), +}), +} +} } else { Rc::new(StructuralMethodLookup { - resolution: None, - kernel_diagnostics: enriched.diagnostics.clone(), - }) + resolution: None, + kernel_diagnostics: enriched.diagnostics.clone(), +}) } - } +} } - } +} } -pub fn resolve_known_method_node( - receiver: Rc, - receiver_type: &Rc, - method_name: &String, - fold_accumulator_type: Option>, - service_registry: Rc>>>>, - source_indices: &Rc>>, -) -> Rc { +pub fn resolve_known_method_node(receiver: Rc, receiver_type: &Rc, method_name: &String, fold_accumulator_type: Option>, service_registry: Rc>>>>, source_indices: &Rc>>) -> Rc { { let tier0 = lookup_structural_method(&receiver_type, &method_name, &source_indices); - match tier0.resolution.clone() { - Some(mfr) => { - let semantics = Rc::new(MethodSemantics::AlgebraMethodSemantics { - method_def: mfr.field_node.clone(), - fold_accumulator_type: fold_accumulator_type, - size_effect: mfr.size_effect.clone(), - cost_shape: mfr.cost_shape.clone(), - algebra_template: mfr.algebra_template.clone(), - }); - Rc::new(KnownMethodResolution { - semantics: Some(semantics), - result_type: Some(mfr.result_type.clone()), - diagnostics: tier0.kernel_diagnostics.clone(), - }) - } - None => match check_service_method_call_node( - &receiver_type, - method_name.clone(), - service_registry, - source_indices.clone(), - ) { - Some(svc_result) => Rc::new(KnownMethodResolution { - semantics: Some(Rc::new(MethodSemantics::ServiceMethodSemantics { - service_name: authored_name_at(source_indices.clone(), &receiver_type), - op_params: svc_result.op_params.clone(), - })), - result_type: Some(svc_result.result_type.clone()), - diagnostics: tier0.kernel_diagnostics.clone(), - }), - None => Rc::new(KnownMethodResolution { - semantics: None, - result_type: None, - diagnostics: tier0.kernel_diagnostics.clone(), - }), - }, - } - } +match tier0.resolution.clone() { + Some(mfr) => { + let semantics = Rc::new(MethodSemantics::AlgebraMethodSemantics { + method_def: mfr.field_node.clone(), + fold_accumulator_type: fold_accumulator_type, + size_effect: mfr.size_effect.clone(), + cost_shape: mfr.cost_shape.clone(), + algebra_template: mfr.algebra_template.clone(), +}); +Rc::new(KnownMethodResolution { + semantics: Some(semantics), + result_type: Some(mfr.result_type.clone()), + diagnostics: tier0.kernel_diagnostics.clone(), +}) +}, + None => match check_service_method_call_node(&receiver_type, method_name.clone(), service_registry, source_indices.clone()) { + Some(svc_result) => Rc::new(KnownMethodResolution { + semantics: Some(Rc::new(MethodSemantics::ServiceMethodSemantics { + service_name: authored_name_at(source_indices.clone(), &receiver_type), + op_params: svc_result.op_params.clone(), +})), + result_type: Some(svc_result.result_type.clone()), + diagnostics: tier0.kernel_diagnostics.clone(), +}), + None => Rc::new(KnownMethodResolution { + semantics: None, + result_type: None, + diagnostics: tier0.kernel_diagnostics.clone(), +}), +}, +} +} } diff --git a/src/v2/stage0/src/v2_compiler_infer_method.rs b/src/v2/stage0/src/v2_compiler_infer_method.rs index 9112905ccf9..18facf0ef9b 100644 --- a/src/v2/stage0/src/v2_compiler_infer_method.rs +++ b/src/v2/stage0/src/v2_compiler_infer_method.rs @@ -1,58 +1,50 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.infer_method -pub use crate::std_types::SourceSpan; -pub use crate::v2_compiler_infer_types::{make_container_type, make_map_type}; -use crate::v2_rt; -use crate::v2_std_core::Cardinality::Required; -use crate::v2_std_core::Connective::NoConnective; -use crate::v2_std_core::ExprData::NoExprData; -use crate::v2_std_core::InferredNode::{Resolved, TypeVariable}; -pub use crate::v2_std_core::{ - bool_type, int_type, make_span, string_type, unit_type, with_optional_cardinality, Cardinality, - Connective, ErrorNode, ExprData, InferredNode, Node, -}; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::std_types::{SourceSpan}; +pub use crate::v2_std_core::{Node, ErrorNode, make_span, with_optional_cardinality, unit_type, bool_type, string_type, int_type, InferredNode, Connective, Cardinality, ExprData}; +use crate::v2_std_core::InferredNode::{TypeVariable, Resolved}; +use crate::v2_std_core::Connective::{NoConnective}; +use crate::v2_std_core::Cardinality::{Required}; +use crate::v2_std_core::ExprData::{NoExprData}; +pub use crate::v2_compiler_infer_types::{make_container_type, make_map_type}; pub fn type_variable_node(id: String) -> Rc { Rc::new(Node { - name: "".to_string(), - span: make_span(0, 0), - ident_span: None, - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::TypeVariable { id: id })), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }) + name: "".to_string(), + span: make_span(0, 0), + ident_span: None, + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::TypeVariable { + id: id, +})), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}) } pub fn map_of_type_variables() -> Rc { - make_map_type( - type_variable_node("map_key".to_string()), - type_variable_node("map_value".to_string()), - ) - .ty - .clone() + make_map_type(type_variable_node("map_key".to_string()), type_variable_node("map_value".to_string())).ty.clone() } pub fn list_of_type_variable(id: String) -> Rc { - make_container_type(&"List".to_string(), type_variable_node(id)) - .ty - .clone() + make_container_type(&"List".to_string(), type_variable_node(id)).ty.clone() } pub fn list_of_element(element: Rc) -> Rc { @@ -64,86 +56,41 @@ pub fn seed_node_map(key: String, value: Rc) -> Rc Rc>> { - v2_rt::concat( - make_map_type( - type_variable_node("map_key".to_string()), - type_variable_node("map_value".to_string()), - ) - .diagnostics - .clone(), - make_container_type( - &"List".to_string(), - type_variable_node("collection_element".to_string()), - ) - .diagnostics - .clone(), - ) + v2_rt::concat(make_map_type(type_variable_node("map_key".to_string()), type_variable_node("map_value".to_string())).diagnostics.clone(), make_container_type(&"List".to_string(), type_variable_node("collection_element".to_string())).diagnostics.clone()) } pub fn builtin_function_registry() -> Rc>> { { let m = seed_node_map("count".to_string(), int_type()); - let m = v2_rt::rc_map_insert(m.clone(), "string_length".to_string(), int_type()); - let m = v2_rt::rc_map_insert(m.clone(), "code_point".to_string(), int_type()); - let m = v2_rt::rc_map_insert(m.clone(), "to_int".to_string(), int_type()); - let m = v2_rt::rc_map_insert(m.clone(), "scan_while".to_string(), int_type()); - let m = v2_rt::rc_map_insert(m.clone(), "scan_string_end".to_string(), int_type()); - let m = v2_rt::rc_map_insert(m.clone(), "scan_to_eol".to_string(), int_type()); - let m = v2_rt::rc_map_insert(m.clone(), "skip_horizontal_ws".to_string(), int_type()); - let m = v2_rt::rc_map_insert( - m.clone(), - "parse_int".to_string(), - with_optional_cardinality(&int_type()), - ); - let m = v2_rt::rc_map_insert(m.clone(), "char_at".to_string(), string_type()); - let m = v2_rt::rc_map_insert(m.clone(), "substring".to_string(), string_type()); - let m = v2_rt::rc_map_insert(m.clone(), "from_code_point".to_string(), string_type()); - let m = v2_rt::rc_map_insert(m.clone(), "chars_to_string".to_string(), string_type()); - let m = v2_rt::rc_map_insert(m.clone(), "to_string".to_string(), string_type()); - let m = v2_rt::rc_map_insert(m.clone(), "concat".to_string(), string_type()); - let m = v2_rt::rc_map_insert(m.clone(), "map_insert".to_string(), map_of_type_variables()); - let m = v2_rt::rc_map_insert(m.clone(), "map_merge".to_string(), map_of_type_variables()); - let m = v2_rt::rc_map_insert(m.clone(), "with".to_string(), map_of_type_variables()); - let m = v2_rt::rc_map_insert(m.clone(), "map_contains_key".to_string(), bool_type()); - let m = v2_rt::rc_map_insert(m.clone(), "map_has".to_string(), bool_type()); - let m = v2_rt::rc_map_insert(m.clone(), "emit_map_has".to_string(), bool_type()); - let m = v2_rt::rc_map_insert( - m.clone(), - "lookup".to_string(), - with_optional_cardinality(&type_variable_node("map_value".to_string())), - ); - let m = v2_rt::rc_map_insert( - m.clone(), - "map_get".to_string(), - with_optional_cardinality(&type_variable_node("map_value".to_string())), - ); - let m = v2_rt::rc_map_insert( - m.clone(), - "Some".to_string(), - with_optional_cardinality(&type_variable_node("some_inner".to_string())), - ); - let m = v2_rt::rc_map_insert( - m.clone(), - "map_keys".to_string(), - list_of_type_variable("collection_element".to_string()), - ); - let m = v2_rt::rc_map_insert( - m.clone(), - "map_values".to_string(), - list_of_type_variable("collection_element".to_string()), - ); - let m = v2_rt::rc_map_insert( - m.clone(), - "reverse".to_string(), - list_of_type_variable("collection_element".to_string()), - ); - let m = v2_rt::rc_map_insert( - m.clone(), - "list_push".to_string(), - list_of_type_variable("collection_element".to_string()), - ); - m.clone() - } +let m = v2_rt::rc_map_insert(m.clone(), "string_length".to_string(), int_type()); +let m = v2_rt::rc_map_insert(m.clone(), "code_point".to_string(), int_type()); +let m = v2_rt::rc_map_insert(m.clone(), "to_int".to_string(), int_type()); +let m = v2_rt::rc_map_insert(m.clone(), "scan_while".to_string(), int_type()); +let m = v2_rt::rc_map_insert(m.clone(), "scan_string_end".to_string(), int_type()); +let m = v2_rt::rc_map_insert(m.clone(), "scan_to_eol".to_string(), int_type()); +let m = v2_rt::rc_map_insert(m.clone(), "skip_horizontal_ws".to_string(), int_type()); +let m = v2_rt::rc_map_insert(m.clone(), "parse_int".to_string(), with_optional_cardinality(&int_type())); +let m = v2_rt::rc_map_insert(m.clone(), "char_at".to_string(), string_type()); +let m = v2_rt::rc_map_insert(m.clone(), "substring".to_string(), string_type()); +let m = v2_rt::rc_map_insert(m.clone(), "from_code_point".to_string(), string_type()); +let m = v2_rt::rc_map_insert(m.clone(), "chars_to_string".to_string(), string_type()); +let m = v2_rt::rc_map_insert(m.clone(), "to_string".to_string(), string_type()); +let m = v2_rt::rc_map_insert(m.clone(), "concat".to_string(), string_type()); +let m = v2_rt::rc_map_insert(m.clone(), "map_insert".to_string(), map_of_type_variables()); +let m = v2_rt::rc_map_insert(m.clone(), "map_merge".to_string(), map_of_type_variables()); +let m = v2_rt::rc_map_insert(m.clone(), "with".to_string(), map_of_type_variables()); +let m = v2_rt::rc_map_insert(m.clone(), "map_contains_key".to_string(), bool_type()); +let m = v2_rt::rc_map_insert(m.clone(), "map_has".to_string(), bool_type()); +let m = v2_rt::rc_map_insert(m.clone(), "emit_map_has".to_string(), bool_type()); +let m = v2_rt::rc_map_insert(m.clone(), "lookup".to_string(), with_optional_cardinality(&type_variable_node("map_value".to_string()))); +let m = v2_rt::rc_map_insert(m.clone(), "map_get".to_string(), with_optional_cardinality(&type_variable_node("map_value".to_string()))); +let m = v2_rt::rc_map_insert(m.clone(), "Some".to_string(), with_optional_cardinality(&type_variable_node("some_inner".to_string()))); +let m = v2_rt::rc_map_insert(m.clone(), "map_keys".to_string(), list_of_type_variable("collection_element".to_string())); +let m = v2_rt::rc_map_insert(m.clone(), "map_values".to_string(), list_of_type_variable("collection_element".to_string())); +let m = v2_rt::rc_map_insert(m.clone(), "reverse".to_string(), list_of_type_variable("collection_element".to_string())); +let m = v2_rt::rc_map_insert(m.clone(), "list_push".to_string(), list_of_type_variable("collection_element".to_string())); +m.clone() +} } pub fn infer_builtin_call_type(name: String) -> Option> { @@ -152,7 +99,7 @@ pub fn infer_builtin_call_type(name: String) -> Option> { pub fn resolve_builtin_call_type(name: String) -> Rc { match infer_builtin_call_type(name) { - Some(v) => v.clone(), - None => unit_type(), - } + Some(v) => v.clone(), + None => unit_type(), +} } diff --git a/src/v2/stage0/src/v2_compiler_infer_patterns.rs b/src/v2/stage0/src/v2_compiler_infer_patterns.rs index 4bcb95f3031..54c48623cc0 100644 --- a/src/v2/stage0/src/v2_compiler_infer_patterns.rs +++ b/src/v2/stage0/src/v2_compiler_infer_patterns.rs @@ -1,31 +1,24 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.infer_patterns -use self::NodeLookupStatus::*; -use self::PatternSubject::*; -pub use crate::std_types::SourceSpan; -pub use crate::v2_compiler_infer_env::{lookup_type, lookup_type_by_name, TypeEnv}; -pub use crate::v2_compiler_infer_types::{ - child_type_node, emit_map_has, extract_optional_inner_node, -}; -use crate::v2_rt; -use crate::v2_std_core::Cardinality::{CardOptional, Required}; -use crate::v2_std_core::CompilerDiagnostic::{FieldNotFound, NonExhaustiveMatch, VariantNotFound}; -use crate::v2_std_core::Connective::{Disj, NoConnective}; -use crate::v2_std_core::ExprData::NoExprData; -use crate::v2_std_core::InferredNode::{CompilerError, Resolved, TypeVariable}; -use crate::v2_std_core::LiteralValue::LitBool; -use crate::v2_std_core::MatchPattern::LitPattern; -pub use crate::v2_std_core::{ - arm_pattern, authored_name_at, error_type, find_child_named, is_compiler_error, kernel_span, - make_error_node, no_span, none_type, with_optional_cardinality, Cardinality, - CompilerDiagnostic, Connective, ErrorNode, ExprData, InferredNode, LiteralValue, MatchPattern, - NewlineIndex, Node, -}; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::std_types::{SourceSpan}; +pub use crate::v2_std_core::{Node, find_child_named, NewlineIndex, authored_name_at, ExprData, InferredNode, is_compiler_error, Cardinality, Connective, ErrorNode, make_error_node, MatchPattern, arm_pattern, LiteralValue, with_optional_cardinality, none_type, error_type, no_span, kernel_span, CompilerDiagnostic}; +use crate::v2_std_core::ExprData::{NoExprData}; +use crate::v2_std_core::InferredNode::{Resolved, CompilerError, TypeVariable}; +use crate::v2_std_core::Cardinality::{Required, CardOptional}; +use crate::v2_std_core::Connective::{Disj, NoConnective}; +use crate::v2_std_core::CompilerDiagnostic::{VariantNotFound, FieldNotFound, NonExhaustiveMatch}; +use crate::v2_std_core::MatchPattern::{LitPattern}; +use crate::v2_std_core::LiteralValue::{LitBool}; +pub use crate::v2_compiler_infer_types::{child_type_node, extract_optional_inner_node, emit_map_has}; +pub use crate::v2_compiler_infer_env::{TypeEnv, lookup_type, lookup_type_by_name}; +use self::NodeLookupStatus::*; +use self::PatternSubject::*; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] pub struct NodeLookupResult { @@ -36,7 +29,9 @@ pub struct NodeLookupResult { #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum NodeLookupStatus { - LookupResolved { node: Rc }, + LookupResolved { + node: Rc, + }, LookupFailed, } impl NodeLookupStatus { @@ -51,63 +46,69 @@ impl NodeLookupStatus { #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum PatternSubject { - PatternResolved { node: Rc }, - PatternDynamic { span: Rc }, + PatternResolved { + node: Rc, + }, + PatternDynamic { + span: Rc, + }, PatternLookupBlocked, } pub fn is_type_variable(inferred: Rc) -> bool { match (*inferred).clone() { - InferredNode::TypeVariable { .. } => true, - _ => false, - } + InferredNode::TypeVariable { .. } => true, + _ => false, +} } pub fn synthesize_optional_some_variant(scrut: &Rc) -> Rc { { let inner = extract_optional_inner_node(&scrut); - let value_field = Rc::new(Node { - name: "value".to_string(), - span: scrut.span.clone(), - ident_span: Some(kernel_span(&"value".to_string())), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::Resolved { node: inner })), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - let some_node = Rc::new(Node { - name: "Some".to_string(), - span: scrut.span.clone(), - ident_span: Some(kernel_span(&"Some".to_string())), - children: Rc::new(vec![value_field]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - some_node - } +let value_field = Rc::new(Node { + name: "value".to_string(), + span: scrut.span.clone(), + ident_span: Some(kernel_span(&"value".to_string())), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::Resolved { + node: inner, +})), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +let some_node = Rc::new(Node { + name: "Some".to_string(), + span: scrut.span.clone(), + ident_span: Some(kernel_span(&"Some".to_string())), + children: Rc::new(vec![value_field]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +some_node +} } pub fn pattern_subject_from_node(n: &Rc) -> Rc { @@ -117,290 +118,179 @@ pub fn pattern_subject_from_node(n: &Rc) -> Rc { } else { false }; - if is_error { +if is_error { Rc::new(PatternSubject::PatternLookupBlocked) } else { - Rc::new(PatternSubject::PatternResolved { node: n.clone() }) + Rc::new(PatternSubject::PatternResolved { + node: n.clone(), +}) } - } +} } pub fn pattern_subject_from_inferred(n: Option>) -> Rc { match n.as_deref().cloned() { - Some(InferredNode::Resolved { node: resolved, .. }) => pattern_subject_from_node(&resolved), - _ => Rc::new(PatternSubject::PatternLookupBlocked), - } + Some(InferredNode::Resolved { node: resolved, .. }) => pattern_subject_from_node(&resolved), + _ => Rc::new(PatternSubject::PatternLookupBlocked), +} } pub fn node_lookup_resolved(node: Rc) -> Rc { Rc::new(NodeLookupResult { - status: Rc::new(NodeLookupStatus::LookupResolved { node: node }), - diagnostics: Rc::new(vec![]), - }) + status: Rc::new(NodeLookupStatus::LookupResolved { + node: node, +}), + diagnostics: Rc::new(vec![]), +}) } pub fn node_lookup_failed(diagnostics: Rc>>) -> Rc { Rc::new(NodeLookupResult { - status: Rc::new(NodeLookupStatus::LookupFailed), - diagnostics: diagnostics, - }) + status: Rc::new(NodeLookupStatus::LookupFailed), + diagnostics: diagnostics, +}) } pub fn lookup_result_subject(result: Rc) -> Rc { match (*result.status.clone()).clone() { - NodeLookupStatus::LookupResolved { node: resolved, .. } => { - pattern_subject_from_node(&resolved) - } - NodeLookupStatus::LookupFailed => Rc::new(PatternSubject::PatternLookupBlocked), - } + NodeLookupStatus::LookupResolved { node: resolved, .. } => pattern_subject_from_node(&resolved), + NodeLookupStatus::LookupFailed => Rc::new(PatternSubject::PatternLookupBlocked), +} } pub fn pattern_binding_type(subject: Rc) -> Rc { match (*subject).clone() { - PatternSubject::PatternResolved { node: resolved, .. } => resolved.clone(), - PatternSubject::PatternDynamic { .. } => error_type(), - PatternSubject::PatternLookupBlocked => error_type(), - } + PatternSubject::PatternResolved { node: resolved, .. } => resolved.clone(), + PatternSubject::PatternDynamic { .. } => error_type(), + PatternSubject::PatternLookupBlocked => error_type(), +} } -pub fn variant_not_found_result( - scrut: &Rc, - variant_name: String, - module_name: String, - source_indices: Rc>>, -) -> Rc { - node_lookup_failed(Rc::new(vec![make_error_node( - Rc::new(CompilerDiagnostic::VariantNotFound { - variant: variant_name, - type_name: authored_name_at(source_indices, &scrut), - span: scrut.span.clone(), - }), - module_name, - )])) +pub fn variant_not_found_result(scrut: &Rc, variant_name: String, module_name: String, source_indices: Rc>>) -> Rc { + node_lookup_failed(Rc::new(vec![make_error_node(Rc::new(CompilerDiagnostic::VariantNotFound { + variant: variant_name, + type_name: authored_name_at(source_indices, &scrut), + span: scrut.span.clone(), +}), module_name)])) } -pub fn lookup_variant_in_type( - scrut: Rc, - variant_name: &String, - module_name: String, - source_indices: &Rc>>, -) -> Rc { +pub fn lookup_variant_in_type(scrut: Rc, variant_name: &String, module_name: String, source_indices: &Rc>>) -> Rc { match (*scrut).clone() { - PatternSubject::PatternLookupBlocked => node_lookup_failed(Rc::new(vec![])), - PatternSubject::PatternDynamic { - span: dynamic_span, .. - } => node_lookup_failed(Rc::new(vec![make_error_node( - Rc::new(CompilerDiagnostic::VariantNotFound { - variant: variant_name.clone(), - type_name: "unresolved".to_string(), - span: dynamic_span.clone(), - }), - module_name, - )])), - PatternSubject::PatternResolved { - node: scrut_node, .. - } => { - let scrut_opt = (scrut_node.return_cardinality.clone() == Cardinality::CardOptional); - if (((scrut_node.connective.clone() == Connective::NoConnective) - && ((scrut_node.children.clone().len() as i64) == 0)) - && (scrut_opt.clone() == false)) + PatternSubject::PatternLookupBlocked => node_lookup_failed(Rc::new(vec![])), + PatternSubject::PatternDynamic { span: dynamic_span, .. } => node_lookup_failed(Rc::new(vec![make_error_node(Rc::new(CompilerDiagnostic::VariantNotFound { + variant: variant_name.clone(), + type_name: "unresolved".to_string(), + span: dynamic_span.clone(), +}), module_name)])), + PatternSubject::PatternResolved { node: scrut_node, .. } => { + let scrut_opt = (scrut_node.return_cardinality.clone() == Cardinality::CardOptional); +if (((scrut_node.connective.clone() == Connective::NoConnective) && ((scrut_node.children.clone().len() as i64) == 0)) && (scrut_opt.clone() == false)) { + node_lookup_failed(Rc::new(vec![])) + } else { { - node_lookup_failed(Rc::new(vec![])) - } else { - { - let direct_match = find_child_named( - scrut_node.clone(), - variant_name.clone(), - source_indices.clone(), - ); - let fallback = if (scrut_opt.clone() - && (variant_name.clone().as_str() == "Some".to_string().as_str())) - { - node_lookup_resolved(synthesize_optional_some_variant(&scrut_node)) + let direct_match = find_child_named(scrut_node.clone(), variant_name.clone(), source_indices.clone()); +let fallback = if (scrut_opt.clone() && (variant_name.clone().as_str() == "Some".to_string().as_str())) { + node_lookup_resolved(synthesize_optional_some_variant(&scrut_node)) + } else { + if (scrut_opt.clone() && (variant_name.clone().as_str() == "None".to_string().as_str())) { + node_lookup_resolved(none_type()) } else { - if (scrut_opt.clone() - && (variant_name.clone().as_str() == "None".to_string().as_str())) - { - node_lookup_resolved(none_type()) - } else { - variant_not_found_result( - &scrut_node, - variant_name.clone(), - module_name, - source_indices.clone(), - ) - } - }; - match direct_match { - Some(v) => node_lookup_resolved(v.clone()), - None => fallback, + variant_not_found_result(&scrut_node, variant_name.clone(), module_name, source_indices.clone()) } - } - } + }; +match direct_match { + Some(v) => node_lookup_resolved(v.clone()), + None => fallback, +} +} } - } +}, +} } -pub fn lookup_field_in_variant( - variant: Rc, - field_name: &String, - module_name: String, - source_indices: &Rc>>, -) -> Rc { +pub fn lookup_field_in_variant(variant: Rc, field_name: &String, module_name: String, source_indices: &Rc>>) -> Rc { match (*variant).clone() { - PatternSubject::PatternLookupBlocked => node_lookup_failed(Rc::new(vec![])), - PatternSubject::PatternDynamic { - span: dynamic_span, .. - } => node_lookup_failed(Rc::new(vec![make_error_node( - Rc::new(CompilerDiagnostic::FieldNotFound { - field: field_name.clone(), - type_name: "unresolved".to_string(), - span: dynamic_span.clone(), - }), - module_name, - )])), - PatternSubject::PatternResolved { - node: variant_node, .. - } => match find_child_named( - variant_node.clone(), - field_name.clone(), - source_indices.clone(), - ) { - Some(field_child) => { - let resolved = child_type_node(&field_child); - node_lookup_resolved(resolved) - } - None => node_lookup_failed(Rc::new(vec![make_error_node( - Rc::new(CompilerDiagnostic::FieldNotFound { - field: field_name.clone(), - type_name: authored_name_at(source_indices.clone(), &variant_node), - span: variant_node.span.clone(), - }), - module_name, - )])), - }, - } + PatternSubject::PatternLookupBlocked => node_lookup_failed(Rc::new(vec![])), + PatternSubject::PatternDynamic { span: dynamic_span, .. } => node_lookup_failed(Rc::new(vec![make_error_node(Rc::new(CompilerDiagnostic::FieldNotFound { + field: field_name.clone(), + type_name: "unresolved".to_string(), + span: dynamic_span.clone(), +}), module_name)])), + PatternSubject::PatternResolved { node: variant_node, .. } => match find_child_named(variant_node.clone(), field_name.clone(), source_indices.clone()) { + Some(field_child) => { + let resolved = child_type_node(&field_child); +node_lookup_resolved(resolved) +}, + None => node_lookup_failed(Rc::new(vec![make_error_node(Rc::new(CompilerDiagnostic::FieldNotFound { + field: field_name.clone(), + type_name: authored_name_at(source_indices.clone(), &variant_node), + span: variant_node.span.clone(), +}), module_name)])), +}, +} } -pub fn check_match_exhaustiveness( - scrutinee_type: &Rc, - arms: &Rc>>, - env: &Rc, - span: Rc, - module_name: String, -) -> Rc>> { +pub fn check_match_exhaustiveness(scrutinee_type: &Rc, arms: &Rc>>, env: &Rc, span: Rc, module_name: String) -> Rc>> { { - let scrut_is_optional = - (scrutinee_type.return_cardinality.clone() == Cardinality::CardOptional); - let has_structure = (scrutinee_type.connective.clone() != Connective::NoConnective); - let resolved_raw = if has_structure { + let scrut_is_optional = (scrutinee_type.return_cardinality.clone() == Cardinality::CardOptional); +let has_structure = (scrutinee_type.connective.clone() != Connective::NoConnective); +let resolved_raw = if has_structure { scrutinee_type.clone() } else { - match lookup_type_by_name( - &env, - authored_name_at(env.source_indices.clone(), &scrutinee_type), - ) { - Some(def) => def.clone(), - None => scrutinee_type.clone(), - } + match lookup_type_by_name(&env, authored_name_at(env.source_indices.clone(), &scrutinee_type)) { + Some(def) => def.clone(), + None => scrutinee_type.clone(), +} }; - let resolved = if scrut_is_optional { +let resolved = if scrut_is_optional { with_optional_cardinality(&resolved_raw) } else { resolved_raw }; - let is_coproduct = (resolved.connective.clone() == Connective::Disj); - let resolved_is_optional = - (resolved.return_cardinality.clone() == Cardinality::CardOptional); - if (is_coproduct || resolved_is_optional.clone()) { +let is_coproduct = (resolved.connective.clone() == Connective::Disj); +let resolved_is_optional = (resolved.return_cardinality.clone() == Cardinality::CardOptional); +if (is_coproduct || resolved_is_optional.clone()) { { let variant_names = if resolved_is_optional.clone() { Rc::new(vec!["Some".to_string(), "None".to_string()]) } else { - Rc::new({ - let mut __result = Vec::new(); - for c in resolved.children.clone().iter().cloned() { - __result.push(authored_name_at(env.source_indices.clone(), &c)); - } - __result - }) - }; - let has_catch_all = { - let mut __found = false; - for arm in arms.clone().iter().cloned() { - if match (*arm_pattern(arm.clone())).clone() { - MatchPattern::Wildcard => true, - MatchPattern::Bind { .. } => true, - _ => false, - } { - __found = true; - break; - } - } - __found + Rc::new({ let mut __result = Vec::new(); for c in resolved.children.clone().iter().cloned() { __result.push(authored_name_at(env.source_indices.clone(), &c)); } __result }) }; - if has_catch_all { +let has_catch_all = { let mut __found = false; for arm in arms.clone().iter().cloned() { if match (*arm_pattern(arm.clone())).clone() { + MatchPattern::Wildcard => true, + MatchPattern::Bind { .. } => true, + _ => false, +} { __found = true; break; } } __found }; +if has_catch_all { Rc::new(vec![]) } else { { - let covered_set = arms.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, arm: Rc| match (*arm_pattern( - arm.clone(), - )) - .clone() - { - MatchPattern::VariantPattern { name: n, .. } => { - v2_rt::rc_map_insert(acc.clone(), n.clone(), true) - } - MatchPattern::LitPattern { value: v, .. } => { - match (*v.clone()).clone() { - LiteralValue::LitBool { value: b, .. } => { - if b.clone() { - v2_rt::rc_map_insert( - acc.clone(), - "True".to_string(), - true, - ) - } else { - v2_rt::rc_map_insert( - acc.clone(), - "False".to_string(), - true, - ) - } - } - _ => acc.clone(), - } - } - _ => acc.clone(), - }, - ); - let uncovered = Rc::new({ - let mut __result = Vec::new(); - for v in variant_names.iter().cloned() { - if (emit_map_has(covered_set.clone(), v.clone()) == false) { - __result.push(v); - } - } - __result - }); - if ((uncovered.clone().len() as i64) > 0) { - Rc::new(vec![make_error_node( - Rc::new(CompilerDiagnostic::NonExhaustiveMatch { - missing: uncovered.clone(), - span: span, - }), - module_name, - )]) + let covered_set = arms.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, arm: Rc| match (*arm_pattern(arm.clone())).clone() { + MatchPattern::VariantPattern { name: n, .. } => v2_rt::rc_map_insert(acc.clone(), n.clone(), true), + MatchPattern::LitPattern { value: v, .. } => match (*v.clone()).clone() { + LiteralValue::LitBool { value: b, .. } => if b.clone() { + v2_rt::rc_map_insert(acc.clone(), "True".to_string(), true) + } else { + v2_rt::rc_map_insert(acc.clone(), "False".to_string(), true) + }, + _ => acc.clone(), +}, + _ => acc.clone(), +}); +let uncovered = Rc::new({ let mut __result = Vec::new(); for v in variant_names.iter().cloned() { if (emit_map_has(covered_set.clone(), v.clone()) == false) { __result.push(v); } } __result }); +if ((uncovered.clone().len() as i64) > 0) { + Rc::new(vec![make_error_node(Rc::new(CompilerDiagnostic::NonExhaustiveMatch { + missing: uncovered.clone(), + span: span, +}), module_name)]) } else { Rc::new(vec![]) } - } +} } - } +} } else { Rc::new(vec![]) } - } +} } diff --git a/src/v2/stage0/src/v2_compiler_infer_resolve.rs b/src/v2/stage0/src/v2_compiler_infer_resolve.rs index 53f5cbf2aaf..7aa5398c202 100644 --- a/src/v2/stage0/src/v2_compiler_infer_resolve.rs +++ b/src/v2/stage0/src/v2_compiler_infer_resolve.rs @@ -1,55 +1,32 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.infer_resolve -use self::AliasKind::*; -pub use crate::std_induction::SubValueRelation; -use crate::std_induction::SubValueRelation::SubValueUnknown; -pub use crate::std_types::{container_param_name, SourceSpan}; -pub use crate::v2_compiler_infer_env::{ - authored_name, is_recursive_type, is_recursive_type_by_name, is_recursive_type_for, - lookup_type, lookup_type_by_name, lookup_type_for, TypeBinding, TypeEnv, -}; -pub use crate::v2_compiler_infer_types::{ - child_type_node, node_is_keyed_collection, resolved_type, -}; -use crate::v2_rt; -use crate::v2_std_core::Cardinality::{CardOptional, Required}; -use crate::v2_std_core::CompilerDiagnostic::{ArityMismatch, InternalError, UnresolvedType}; -use crate::v2_std_core::Connective::{Conj, Disj, NoConnective}; -use crate::v2_std_core::ExprData::{ - ExprBinOp, ExprBlock, ExprCall, ExprCast, ExprError, ExprFieldAccess, ExprForEach, ExprIf, - ExprIndex, ExprLambda, ExprLet, ExprListLit, ExprLiteral, ExprMatch, ExprMethodCall, - ExprRecordLit, ExprReturn, ExprSlice, ExprStringInterp, ExprUnaryOp, ExprVar, NoExprData, -}; -use crate::v2_std_core::ExprErrorKind::SemanticExprError; -use crate::v2_std_core::InferredNode::{CompilerError, Resolved, TypeVariable}; -use crate::v2_std_core::MatchPattern::Wildcard; -use crate::v2_std_core::StringPart::{Interpolation, Text}; -pub use crate::v2_std_core::{ - arg_name_at, arg_value, arm_body, arm_guard, arm_pattern, authored_name_at, default_ident_span, - expr_call_func_at, expr_method_name_at, field_init_node_name_at, field_init_node_value, - field_node_cardinality, field_node_default_value, field_node_from_key, field_node_name_at, - field_node_type_expr, foreach_variable_at, intern, is_compiler_error, is_container_type, - is_kernel_type, is_local_transport, kernel_span, let_binding_name_at, local_transport_node, - make_arg_node, make_arm_node, make_error_node, make_expr_error_node, make_expr_node, - make_field_init_node, make_field_node, make_interp_part_node, make_named_expr_node, - make_param_node, make_resource_use_node, make_text_part_node, make_transport_node, - map_children, no_span, node_name_span, param_node_default_value, param_node_name_at, - param_node_type_expr, resource_use_name_at, resource_use_resource, string_type, - transport_request_body, unit_type, with_optional_cardinality, with_required_cardinality, - Cardinality, CompilerDiagnostic, Connective, ErrorNode, ExprData, ExprErrorKind, InferredNode, - MatchPattern, NewlineIndex, Node, StringPart, -}; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::std_types::{SourceSpan, container_param_name}; +pub use crate::v2_std_core::{Node, authored_name_at, NewlineIndex, make_param_node, param_node_name_at, param_node_type_expr, param_node_default_value, make_field_node, field_node_name_at, field_node_type_expr, field_node_cardinality, field_node_default_value, field_node_from_key, InferredNode, is_compiler_error, ErrorNode, make_error_node, Cardinality, StringPart, MatchPattern, ExprData, ExprErrorKind, make_expr_node, make_named_expr_node, make_expr_error_node, map_children, expr_call_func_at, expr_method_name_at, let_binding_name_at, foreach_variable_at, make_arg_node, arg_name_at, arg_value, make_arm_node, arm_pattern, arm_guard, arm_body, make_field_init_node, field_init_node_name_at, field_init_node_value, make_resource_use_node, resource_use_name_at, resource_use_resource, make_text_part_node, make_interp_part_node, make_transport_node, local_transport_node, is_local_transport, transport_request_body, is_kernel_type, is_container_type, with_optional_cardinality, with_required_cardinality, Connective, no_span, unit_type, string_type, default_ident_span, kernel_span, node_name_span, intern, CompilerDiagnostic}; +use crate::v2_std_core::InferredNode::{Resolved, CompilerError, TypeVariable}; +use crate::v2_std_core::CompilerDiagnostic::{InternalError, ArityMismatch, UnresolvedType}; +use crate::v2_std_core::Cardinality::{Required, CardOptional}; +use crate::v2_std_core::StringPart::{Text, Interpolation}; +use crate::v2_std_core::MatchPattern::{Wildcard}; +use crate::v2_std_core::ExprData::{NoExprData, ExprLiteral, ExprError, ExprVar, ExprFieldAccess, ExprCall, ExprMethodCall, ExprMatch, ExprIf, ExprLet, ExprRecordLit, ExprListLit, ExprBinOp, ExprUnaryOp, ExprLambda, ExprStringInterp, ExprBlock, ExprCast, ExprForEach, ExprIndex, ExprSlice, ExprReturn}; +use crate::v2_std_core::ExprErrorKind::{SemanticExprError}; +use crate::v2_std_core::Connective::{Conj, Disj, NoConnective}; +pub use crate::v2_compiler_infer_types::{resolved_type, child_type_node, node_is_keyed_collection}; +pub use crate::std_induction::{SubValueRelation}; +use crate::std_induction::SubValueRelation::{SubValueUnknown}; +pub use crate::v2_compiler_infer_env::{TypeEnv, TypeBinding, lookup_type, lookup_type_by_name, lookup_type_for, is_recursive_type, is_recursive_type_by_name, is_recursive_type_for, authored_name}; +use self::AliasKind::*; pub fn is_type_variable(inferred: Rc) -> bool { match (*inferred).clone() { - InferredNode::TypeVariable { .. } => true, - _ => false, - } + InferredNode::TypeVariable { .. } => true, + _ => false, +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -125,139 +102,96 @@ pub fn resolve_node(n: Rc, env: Rc, module_name: String) -> Rc, env: &Rc) -> bool { { let has_structure = (n.connective.clone() != Connective::NoConnective); - if has_structure { +if has_structure { false } else { match lookup_type_for(&env, &n) { - Some(decl) => { - if ((decl.params.clone().len() as i64) > 0) { - if is_container_type(authored_name(env.clone(), n.clone())) { - false - } else { - if (decl.inferred.clone() != None) { - true - } else { - true - } - } + Some(decl) => if ((decl.params.clone().len() as i64) > 0) { + if is_container_type(authored_name(env.clone(), n.clone())) { + false + } else { + if (decl.inferred.clone() != None) { + true } else { - false + true } } - None => false, - } + } else { + false + }, + None => false, +} } - } +} } -pub fn substitute_type_slots( - n: &Rc, - slot_bindings: &Rc>>, - decl_name: &String, - source_indices: &Rc>>, -) -> Rc { +pub fn substitute_type_slots(n: &Rc, slot_bindings: &Rc>>, decl_name: &String, source_indices: &Rc>>) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - let is_slot = (((((n.children.clone().len() as i64) == 0) - && (n.connective.clone() == Connective::NoConnective)) - && (n.body.clone() == None)) - && (n.inferred.clone() == None)); - if is_slot { - match v2_rt::map_get(&slot_bindings, authored_name_at(source_indices.clone(), &n)) { - Some(concrete) => concrete.clone(), - None => n.clone(), - } - } else { - { - let new_children = Rc::new({ - let mut __result = Vec::new(); - for child in n.children.clone().iter().cloned() { - __result.push( - if (authored_name_at(source_indices.clone(), &child).as_str() - == decl_name.clone().as_str()) - { - { - let substituted_args = Rc::new({ - let mut __result = Vec::new(); - for arg in child.children.clone().iter().cloned() { - __result.push(substitute_type_slots( - &arg, - &slot_bindings, - &decl_name, - &source_indices, - )); - } - __result - }); - Rc::new(Node { - name: child.name.clone(), - span: child.span.clone(), - ident_span: child.ident_span.clone(), - children: substituted_args.clone(), - connective: child.connective.clone(), - params: child.params.clone(), - inferred: child.inferred.clone(), - return_cardinality: child.return_cardinality.clone(), - uses: child.uses.clone(), - body: child.body.clone(), - transport: child.transport.clone(), - properties: child.properties.clone(), - type_annotation: child.type_annotation.clone(), - is_self_recursive: child.is_self_recursive.clone(), - has_non_tail_self_call: child - .has_non_tail_self_call - .clone(), - match_pattern: child.match_pattern.clone(), - expr_data: child.expr_data.clone(), - ident: None, - }) - } - } else { - substitute_type_slots( - &child, - &slot_bindings, - &decl_name, - &source_indices, - ) - }, - ); - } - __result - }); - let new_inferred = match n.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - Some(Rc::new(InferredNode::Resolved { - node: substitute_type_slots( - &rt, - &slot_bindings, - &decl_name, - &source_indices, - ), - })) - } - _ => n.inferred.clone(), - }; - Rc::new(Node { - name: n.name.clone(), - span: n.span.clone(), - ident_span: n.ident_span.clone(), - children: new_children, - connective: n.connective.clone(), - params: n.params.clone(), - inferred: new_inferred, - return_cardinality: n.return_cardinality.clone(), - uses: n.uses.clone(), - body: n.body.clone(), - transport: n.transport.clone(), - properties: n.properties.clone(), - type_annotation: n.type_annotation.clone(), - is_self_recursive: n.is_self_recursive.clone(), - has_non_tail_self_call: n.has_non_tail_self_call.clone(), - match_pattern: n.match_pattern.clone(), - expr_data: n.expr_data.clone(), - ident: None, - }) + { + let is_slot = (((((n.children.clone().len() as i64) == 0) && (n.connective.clone() == Connective::NoConnective)) && (n.body.clone() == None)) && (n.inferred.clone() == None)); +if is_slot { + match v2_rt::map_get(&slot_bindings, authored_name_at(source_indices.clone(), &n)) { + Some(concrete) => concrete.clone(), + None => n.clone(), +} + } else { + { + let new_children = Rc::new({ let mut __result = Vec::new(); for child in n.children.clone().iter().cloned() { __result.push(if (authored_name_at(source_indices.clone(), &child).as_str() == decl_name.clone().as_str()) { + { + let substituted_args = Rc::new({ let mut __result = Vec::new(); for arg in child.children.clone().iter().cloned() { __result.push(substitute_type_slots(&arg, &slot_bindings, &decl_name, &source_indices)); } __result }); +Rc::new(Node { + name: child.name.clone(), + span: child.span.clone(), + ident_span: child.ident_span.clone(), + children: substituted_args.clone(), + connective: child.connective.clone(), + params: child.params.clone(), + inferred: child.inferred.clone(), + return_cardinality: child.return_cardinality.clone(), + uses: child.uses.clone(), + body: child.body.clone(), + transport: child.transport.clone(), + properties: child.properties.clone(), + type_annotation: child.type_annotation.clone(), + is_self_recursive: child.is_self_recursive.clone(), + has_non_tail_self_call: child.has_non_tail_self_call.clone(), + match_pattern: child.match_pattern.clone(), + expr_data: child.expr_data.clone(), + ident: None, +}) +} + } else { + substitute_type_slots(&child, &slot_bindings, &decl_name, &source_indices) + }); } __result }); +let new_inferred = match n.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => Some(Rc::new(InferredNode::Resolved { + node: substitute_type_slots(&rt, &slot_bindings, &decl_name, &source_indices), +})), + _ => n.inferred.clone(), +}; +Rc::new(Node { + name: n.name.clone(), + span: n.span.clone(), + ident_span: n.ident_span.clone(), + children: new_children, + connective: n.connective.clone(), + params: n.params.clone(), + inferred: new_inferred, + return_cardinality: n.return_cardinality.clone(), + uses: n.uses.clone(), + body: n.body.clone(), + transport: n.transport.clone(), + properties: n.properties.clone(), + type_annotation: n.type_annotation.clone(), + is_self_recursive: n.is_self_recursive.clone(), + has_non_tail_self_call: n.has_non_tail_self_call.clone(), + match_pattern: n.match_pattern.clone(), + expr_data: n.expr_data.clone(), + ident: None, +}) +} } - } +} }) } @@ -272,286 +206,185 @@ pub enum AliasKind { pub fn classify_alias(target: &Rc) -> AliasKind { { let nc = (target.connective.clone() == Connective::NoConnective); - if (((target.children.clone().len() as i64) > 0) && nc.clone()) { +if (((target.children.clone().len() as i64) > 0) && nc.clone()) { AliasKind::AliasParameterized } else { - if ((((target.children.clone().len() as i64) == 0) && nc.clone()) - && (target.ident_span.clone() != None)) - { + if ((((target.children.clone().len() as i64) == 0) && nc.clone()) && (target.ident_span.clone() != None)) { AliasKind::AliasLeaf } else { AliasKind::AliasPassthrough } } - } +} } -pub fn resolve_alias_target( - target: Rc, - env: &Rc, - module_name: String, - depth: i64, -) -> Rc { +pub fn resolve_alias_target(target: Rc, env: &Rc, module_name: String, depth: i64) -> Rc { match classify_alias(&target) { - AliasKind::AliasParameterized => { - resolve_node_bounded(&target, &env, &module_name, (depth + 1)) - .resolved - .clone() - } - AliasKind::AliasLeaf => { - match lookup_type_by_name(&env, authored_name_at(env.source_indices.clone(), &target)) { - Some(env_target) => env_target.clone(), - None => target.clone(), - } - } - AliasKind::AliasPassthrough => target.clone(), - } + AliasKind::AliasParameterized => resolve_node_bounded(&target, &env, &module_name, (depth + 1)).resolved.clone(), + AliasKind::AliasLeaf => match lookup_type_by_name(&env, authored_name_at(env.source_indices.clone(), &target)) { + Some(env_target) => env_target.clone(), + None => target.clone(), +}, + AliasKind::AliasPassthrough => target.clone(), +} } -pub fn resolve_node_bounded( - n: &Rc, - env: &Rc, - module_name: &String, - depth: i64, -) -> Rc { +pub fn resolve_node_bounded(n: &Rc, env: &Rc, module_name: &String, depth: i64) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - if (depth.clone() > 100) { - return Rc::new(NodeResolveResult { - resolved: n.clone(), - diagnostics: Rc::new(vec![make_error_node( - Rc::new(CompilerDiagnostic::InternalError { - message: v2_rt::concat( - v2_rt::concat( - "internal: type resolution exceeded depth 100 for '".to_string(), - authored_name(env.clone(), n.clone()), - ), - "'".to_string(), - ), - span: n.span.clone(), - }), - module_name.clone(), - )]), - }); - } - let has_structure = (n.connective.clone() != Connective::NoConnective); - if has_structure { - { - let is_product = (n.connective.clone() == Connective::Conj); - if is_product { - if (n.type_annotation.clone() != None) { - match n.children.clone().first().cloned() { - Some(base) => { - let base_result = resolve_node_bounded( - &base, - &env, - &module_name, - (depth.clone() + 1), - ); - let base_resolved = base_result.resolved.clone(); - let base_diags = base_result.diagnostics.clone(); - Rc::new(NodeResolveResult { - resolved: Rc::new(Node { - name: n.name.clone(), - span: n.span.clone(), - ident_span: n.ident_span.clone(), - children: Rc::new(vec![base_resolved]), - connective: n.connective.clone(), - params: n.params.clone(), - inferred: n.inferred.clone(), - return_cardinality: n.return_cardinality.clone(), - uses: n.uses.clone(), - body: n.body.clone(), - transport: n.transport.clone(), - properties: n.properties.clone(), - type_annotation: n.type_annotation.clone(), - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }), - diagnostics: base_diags, - }) - } - None => Rc::new(NodeResolveResult { - resolved: n.clone(), - diagnostics: Rc::new(vec![]), - }), + { + if (depth.clone() > 100) { + return Rc::new(NodeResolveResult { + resolved: n.clone(), + diagnostics: Rc::new(vec![make_error_node(Rc::new(CompilerDiagnostic::InternalError { + message: v2_rt::concat(v2_rt::concat("internal: type resolution exceeded depth 100 for '".to_string(), authored_name(env.clone(), n.clone())), "'".to_string()), + span: n.span.clone(), +}), module_name.clone())]), +}) + } +let has_structure = (n.connective.clone() != Connective::NoConnective); +if has_structure { + { + let is_product = (n.connective.clone() == Connective::Conj); +if is_product { + if (n.type_annotation.clone() != None) { + match n.children.clone().first().cloned() { + Some(base) => { + let base_result = resolve_node_bounded(&base, &env, &module_name, (depth.clone() + 1)); +let base_resolved = base_result.resolved.clone(); +let base_diags = base_result.diagnostics.clone(); +Rc::new(NodeResolveResult { + resolved: Rc::new(Node { + name: n.name.clone(), + span: n.span.clone(), + ident_span: n.ident_span.clone(), + children: Rc::new(vec![base_resolved]), + connective: n.connective.clone(), + params: n.params.clone(), + inferred: n.inferred.clone(), + return_cardinality: n.return_cardinality.clone(), + uses: n.uses.clone(), + body: n.body.clone(), + transport: n.transport.clone(), + properties: n.properties.clone(), + type_annotation: n.type_annotation.clone(), + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}), + diagnostics: base_diags, +}) +}, + None => Rc::new(NodeResolveResult { + resolved: n.clone(), + diagnostics: Rc::new(vec![]), +}), +} + } else { + { + let child_results = Rc::new({ let mut __result = Vec::new(); for child in n.children.clone().iter().cloned() { __result.push(if (child.inferred.clone() == None) { + Rc::new(NodeResolveResult { + resolved: child.clone(), + diagnostics: Rc::new(vec![]), +}) + } else { + { + let child_rt = resolved_type(child.clone()); +let rt_result = resolve_node_bounded(&child_rt, &env, &module_name, (depth.clone() + 1)); +let rt_resolved = rt_result.resolved.clone(); +let rt_diags = rt_result.diagnostics.clone(); +Rc::new(NodeResolveResult { + resolved: Rc::new(Node { + name: child.name.clone(), + span: child.span.clone(), + ident_span: child.ident_span.clone(), + children: child.children.clone(), + connective: child.connective.clone(), + params: child.params.clone(), + inferred: Some(Rc::new(InferredNode::Resolved { + node: rt_resolved.clone(), +})), + return_cardinality: child.return_cardinality.clone(), + uses: child.uses.clone(), + body: child.body.clone(), + transport: child.transport.clone(), + properties: child.properties.clone(), + type_annotation: child.type_annotation.clone(), + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}), + diagnostics: rt_diags.clone(), +}) +} + }); } __result }); +let resolved_children = Rc::new({ let mut __result = Vec::new(); for cr in child_results.clone().iter().cloned() { __result.push(cr.resolved.clone()); } __result }); +let all_diags = Rc::new({ let mut __result = Vec::new(); for cr in child_results.clone().iter().cloned() { __result.extend((*cr.diagnostics.clone()).iter().cloned()); } __result }); +Rc::new(NodeResolveResult { + resolved: Rc::new(Node { + name: n.name.clone(), + span: n.span.clone(), + ident_span: n.ident_span.clone(), + children: resolved_children, + connective: n.connective.clone(), + params: n.params.clone(), + inferred: n.inferred.clone(), + return_cardinality: n.return_cardinality.clone(), + uses: n.uses.clone(), + body: n.body.clone(), + transport: n.transport.clone(), + properties: n.properties.clone(), + type_annotation: n.type_annotation.clone(), + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}), + diagnostics: all_diags, +}) +} } } else { { - let child_results = Rc::new({ - let mut __result = Vec::new(); - for child in n.children.clone().iter().cloned() { - __result.push(if (child.inferred.clone() == None) { - Rc::new(NodeResolveResult { - resolved: child.clone(), - diagnostics: Rc::new(vec![]), - }) - } else { - { - let child_rt = resolved_type(child.clone()); - let rt_result = resolve_node_bounded( - &child_rt, - &env, - &module_name, - (depth.clone() + 1), - ); - let rt_resolved = rt_result.resolved.clone(); - let rt_diags = rt_result.diagnostics.clone(); + let is_optional = (n.return_cardinality.clone() == Cardinality::CardOptional); +if is_optional { + { + let inner = with_required_cardinality(&n); +let inner_result = resolve_node_bounded(&inner, &env, &module_name, (depth.clone() + 1)); +let inner_resolved = inner_result.resolved.clone(); +let inner_diags = inner_result.diagnostics.clone(); +Rc::new(NodeResolveResult { + resolved: with_optional_cardinality(&inner_resolved), + diagnostics: inner_diags, +}) +} + } else { + { + let variant_results = Rc::new({ let mut __result = Vec::new(); for variant_child in n.children.clone().iter().cloned() { __result.push({ + let field_results = Rc::new({ let mut __result = Vec::new(); for field_child in variant_child.children.clone().iter().cloned() { __result.push(if (field_child.inferred.clone() == None) { Rc::new(NodeResolveResult { - resolved: Rc::new(Node { - name: child.name.clone(), - span: child.span.clone(), - ident_span: child.ident_span.clone(), - children: child.children.clone(), - connective: child.connective.clone(), - params: child.params.clone(), - inferred: Some(Rc::new( - InferredNode::Resolved { - node: rt_resolved.clone(), - }, - )), - return_cardinality: child - .return_cardinality - .clone(), - uses: child.uses.clone(), - body: child.body.clone(), - transport: child.transport.clone(), - properties: child.properties.clone(), - type_annotation: child.type_annotation.clone(), - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }), - diagnostics: rt_diags.clone(), - }) - } - }); - } - __result - }); - let resolved_children = Rc::new({ - let mut __result = Vec::new(); - for cr in child_results.clone().iter().cloned() { - __result.push(cr.resolved.clone()); - } - __result - }); - let all_diags = Rc::new({ - let mut __result = Vec::new(); - for cr in child_results.clone().iter().cloned() { - __result.extend((*cr.diagnostics.clone()).iter().cloned()); - } - __result - }); - Rc::new(NodeResolveResult { - resolved: Rc::new(Node { - name: n.name.clone(), - span: n.span.clone(), - ident_span: n.ident_span.clone(), - children: resolved_children, - connective: n.connective.clone(), - params: n.params.clone(), - inferred: n.inferred.clone(), - return_cardinality: n.return_cardinality.clone(), - uses: n.uses.clone(), - body: n.body.clone(), - transport: n.transport.clone(), - properties: n.properties.clone(), - type_annotation: n.type_annotation.clone(), - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }), - diagnostics: all_diags, - }) - } - } - } else { - { - let is_optional = - (n.return_cardinality.clone() == Cardinality::CardOptional); - if is_optional { - { - let inner = with_required_cardinality(&n); - let inner_result = resolve_node_bounded( - &inner, - &env, - &module_name, - (depth.clone() + 1), - ); - let inner_resolved = inner_result.resolved.clone(); - let inner_diags = inner_result.diagnostics.clone(); - Rc::new(NodeResolveResult { - resolved: with_optional_cardinality(&inner_resolved), - diagnostics: inner_diags, - }) - } - } else { - { - let variant_results = Rc::new({ - let mut __result = Vec::new(); - for variant_child in n.children.clone().iter().cloned() { - __result.push({ - let field_results = Rc::new({ - let mut __result = Vec::new(); - for field_child in - variant_child.children.clone().iter().cloned() - { - __result.push( - if (field_child.inferred.clone() == None) { - Rc::new(NodeResolveResult { - resolved: field_child.clone(), - diagnostics: Rc::new(vec![]), - }) - } else { - { - let field_rt = resolved_type( - field_child.clone(), - ); - let is_self_ref = ((authored_name( - env.clone(), - field_rt.clone(), - ) - .as_str() - == authored_name( - env.clone(), - n.clone(), - ) - .as_str()) - && ((field_rt - .children - .clone() - .len() - as i64) - > 0)); - let rt_result = if is_self_ref - .clone() - { - Rc::new(NodeResolveResult { - resolved: field_rt.clone(), - diagnostics: Rc::new( - vec![], - ), - }) - } else { - resolve_node_bounded( - &field_rt, - &env, - &module_name, - (depth.clone() + 1), - ) - }; - let rt_resolved = - rt_result.resolved.clone(); - let rt_diags = - rt_result.diagnostics.clone(); - Rc::new(NodeResolveResult { + resolved: field_child.clone(), + diagnostics: Rc::new(vec![]), +}) + } else { + { + let field_rt = resolved_type(field_child.clone()); +let is_self_ref = ((authored_name(env.clone(), field_rt.clone()).as_str() == authored_name(env.clone(), n.clone()).as_str()) && ((field_rt.children.clone().len() as i64) > 0)); +let rt_result = if is_self_ref.clone() { + Rc::new(NodeResolveResult { + resolved: field_rt.clone(), + diagnostics: Rc::new(vec![]), +}) + } else { + resolve_node_bounded(&field_rt, &env, &module_name, (depth.clone() + 1)) + }; +let rt_resolved = rt_result.resolved.clone(); +let rt_diags = rt_result.diagnostics.clone(); +Rc::new(NodeResolveResult { resolved: Rc::new(Node { name: field_child.name.clone(), span: field_child.span.clone(), @@ -576,2106 +409,1249 @@ pub fn resolve_node_bounded( }), diagnostics: rt_diags.clone(), }) - } - }, - ); - } - __result - }); - let resolved_fields = Rc::new({ - let mut __result = Vec::new(); - for fr in field_results.clone().iter().cloned() { - __result.push(fr.resolved.clone()); - } - __result - }); - let field_diags = Rc::new({ - let mut __result = Vec::new(); - for fr in field_results.clone().iter().cloned() { - __result.extend( - (*fr.diagnostics.clone()).iter().cloned(), - ); - } - __result - }); - Rc::new(NodeResolveResult { - resolved: Rc::new(Node { - name: variant_child.name.clone(), - span: variant_child.span.clone(), - ident_span: variant_child.ident_span.clone(), - children: resolved_fields.clone(), - connective: variant_child.connective.clone(), - params: variant_child.params.clone(), - inferred: variant_child.inferred.clone(), - return_cardinality: variant_child - .return_cardinality - .clone(), - uses: variant_child.uses.clone(), - body: variant_child.body.clone(), - transport: variant_child.transport.clone(), - properties: variant_child.properties.clone(), - type_annotation: variant_child - .type_annotation - .clone(), - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }), - diagnostics: field_diags.clone(), - }) - }); - } - __result - }); - let resolved_variants = Rc::new({ - let mut __result = Vec::new(); - for vr in variant_results.clone().iter().cloned() { - __result.push(vr.resolved.clone()); - } - __result - }); - let all_diags = Rc::new({ - let mut __result = Vec::new(); - for vr in variant_results.clone().iter().cloned() { - __result.extend((*vr.diagnostics.clone()).iter().cloned()); - } - __result - }); - Rc::new(NodeResolveResult { - resolved: Rc::new(Node { - name: n.name.clone(), - span: n.span.clone(), - ident_span: n.ident_span.clone(), - children: resolved_variants, - connective: n.connective.clone(), - params: n.params.clone(), - inferred: n.inferred.clone(), - return_cardinality: n.return_cardinality.clone(), - uses: n.uses.clone(), - body: n.body.clone(), - transport: n.transport.clone(), - properties: n.properties.clone(), - type_annotation: n.type_annotation.clone(), - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }), - diagnostics: all_diags, - }) +} + }); } __result }); +let resolved_fields = Rc::new({ let mut __result = Vec::new(); for fr in field_results.clone().iter().cloned() { __result.push(fr.resolved.clone()); } __result }); +let field_diags = Rc::new({ let mut __result = Vec::new(); for fr in field_results.clone().iter().cloned() { __result.extend((*fr.diagnostics.clone()).iter().cloned()); } __result }); +Rc::new(NodeResolveResult { + resolved: Rc::new(Node { + name: variant_child.name.clone(), + span: variant_child.span.clone(), + ident_span: variant_child.ident_span.clone(), + children: resolved_fields.clone(), + connective: variant_child.connective.clone(), + params: variant_child.params.clone(), + inferred: variant_child.inferred.clone(), + return_cardinality: variant_child.return_cardinality.clone(), + uses: variant_child.uses.clone(), + body: variant_child.body.clone(), + transport: variant_child.transport.clone(), + properties: variant_child.properties.clone(), + type_annotation: variant_child.type_annotation.clone(), + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}), + diagnostics: field_diags.clone(), +}) +}); } __result }); +let resolved_variants = Rc::new({ let mut __result = Vec::new(); for vr in variant_results.clone().iter().cloned() { __result.push(vr.resolved.clone()); } __result }); +let all_diags = Rc::new({ let mut __result = Vec::new(); for vr in variant_results.clone().iter().cloned() { __result.extend((*vr.diagnostics.clone()).iter().cloned()); } __result }); +Rc::new(NodeResolveResult { + resolved: Rc::new(Node { + name: n.name.clone(), + span: n.span.clone(), + ident_span: n.ident_span.clone(), + children: resolved_variants, + connective: n.connective.clone(), + params: n.params.clone(), + inferred: n.inferred.clone(), + return_cardinality: n.return_cardinality.clone(), + uses: n.uses.clone(), + body: n.body.clone(), + transport: n.transport.clone(), + properties: n.properties.clone(), + type_annotation: n.type_annotation.clone(), + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}), + diagnostics: all_diags, +}) +} } - } +} } - } - } - } else { - if (((n.children.clone().len() as i64) > 0) && is_user_generic_use_site(&n, &env)) { - { - let type_name = authored_name(env.clone(), n.clone()); - let decl = match lookup_type_for(&env, &n) { - Some(d) => d.clone(), - None => n.clone(), - }; - let expected_arity = (decl.params.clone().len() as i64); - let actual_arity = (n.children.clone().len() as i64); - let arity_diags = if (expected_arity.clone() != actual_arity.clone()) { - Rc::new(vec![make_error_node( - Rc::new(CompilerDiagnostic::ArityMismatch { - name: type_name.clone(), - expected: expected_arity.clone(), - got: actual_arity.clone(), - span: n.span.clone(), - }), - module_name.clone(), - )]) - } else { - Rc::new(vec![]) - }; - let arg_results = Rc::new({ - let mut __result = Vec::new(); - for child in n.children.clone().iter().cloned() { - __result.push(resolve_node_bounded( - &child, - &env, - &module_name, - (depth.clone() + 1), - )); - } - __result - }); - let resolved_args = Rc::new({ - let mut __result = Vec::new(); - for ar in arg_results.clone().iter().cloned() { - __result.push(ar.resolved.clone()); - } - __result - }); - let arg_diags = Rc::new({ - let mut __result = Vec::new(); - for ar in arg_results.clone().iter().cloned() { - __result.extend((*ar.diagnostics.clone()).iter().cloned()); - } - __result - }); - let slot_bindings = Rc::new( - decl.params - .clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - .fold( - v2_rt::rc_empty_map::>(), - |acc: Rc>>, pair: (i64, Rc)| { +} + } else { + if (((n.children.clone().len() as i64) > 0) && is_user_generic_use_site(&n, &env)) { + { + let type_name = authored_name(env.clone(), n.clone()); +let decl = match lookup_type_for(&env, &n) { + Some(d) => d.clone(), + None => n.clone(), +}; +let expected_arity = (decl.params.clone().len() as i64); +let actual_arity = (n.children.clone().len() as i64); +let arity_diags = if (expected_arity.clone() != actual_arity.clone()) { + Rc::new(vec![make_error_node(Rc::new(CompilerDiagnostic::ArityMismatch { + name: type_name.clone(), + expected: expected_arity.clone(), + got: actual_arity.clone(), + span: n.span.clone(), +}), module_name.clone())]) + } else { + Rc::new(vec![]) + }; +let arg_results = Rc::new({ let mut __result = Vec::new(); for child in n.children.clone().iter().cloned() { __result.push(resolve_node_bounded(&child, &env, &module_name, (depth.clone() + 1))); } __result }); +let resolved_args = Rc::new({ let mut __result = Vec::new(); for ar in arg_results.clone().iter().cloned() { __result.push(ar.resolved.clone()); } __result }); +let arg_diags = Rc::new({ let mut __result = Vec::new(); for ar in arg_results.clone().iter().cloned() { __result.extend((*ar.diagnostics.clone()).iter().cloned()); } __result }); +let slot_bindings = Rc::new(decl.params.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, pair: (i64, Rc)| { let idx = pair.0.clone(); - let slot_name = - authored_name_at(env.source_indices.clone(), &pair.1.clone()); - match Rc::new({ - let mut __result = Vec::new(); - for p in Rc::new({ - let mut __result = Vec::new(); - for p in Rc::new( - resolved_args - .clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - { - if (p.0.clone() == idx.clone()) { - __result.push(p); - } - } - __result - }) - .iter() - .cloned() - { - __result.push(p.1.clone()); - } - __result - }) - .first() - .cloned() +let slot_name = authored_name_at(env.source_indices.clone(), &pair.1.clone()); +match Rc::new({ let mut __result = Vec::new(); for p in Rc::new({ let mut __result = Vec::new(); for p in Rc::new(resolved_args.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { if (p.0.clone() == idx.clone()) { __result.push(p); } } __result }).iter().cloned() { __result.push(p.1.clone()); } __result }).first().cloned() { + Some(arg) => v2_rt::rc_map_insert(acc.clone(), slot_name.clone(), arg.clone()), + None => acc.clone(), +} +}); +let is_parameterized_alias = (((decl.inferred.clone() != None) && ((decl.children.clone().len() as i64) == 0)) && (decl.connective.clone() == Connective::NoConnective)); +if is_parameterized_alias { { - Some(arg) => v2_rt::rc_map_insert( - acc.clone(), - slot_name.clone(), - arg.clone(), - ), - None => acc.clone(), - } - }, - ); - let is_parameterized_alias = (((decl.inferred.clone() != None) - && ((decl.children.clone().len() as i64) == 0)) - && (decl.connective.clone() == Connective::NoConnective)); - if is_parameterized_alias { - { - let alias_target = match decl.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: target, .. }) => { - substitute_type_slots( - &target, - &slot_bindings, - &type_name, - &env.source_indices.clone(), - ) - } - _ => n.clone(), - }; - let target_result = resolve_node_bounded( - &alias_target, - &env, - &module_name, - (depth.clone() + 1), - ); - let is_recursive = is_recursive_type_by_name(&env, type_name.clone()); - let resolved_node = Rc::new(Node { - name: type_name.clone(), - span: n.span.clone(), - ident_span: n.ident_span.clone(), - children: target_result.resolved.clone().children.clone(), - connective: target_result.resolved.clone().connective.clone(), - params: Rc::new(vec![]), - inferred: n.inferred.clone(), - return_cardinality: n.return_cardinality.clone(), - uses: n.uses.clone(), - body: n.body.clone(), - transport: n.transport.clone(), - properties: target_result.resolved.clone().properties.clone(), - type_annotation: n.type_annotation.clone(), - is_self_recursive: is_recursive, - has_non_tail_self_call: n.has_non_tail_self_call.clone(), - match_pattern: n.match_pattern.clone(), - expr_data: n.expr_data.clone(), - ident: None, - }); - Rc::new(NodeResolveResult { - resolved: resolved_node, - diagnostics: v2_rt::concat( - v2_rt::concat(arity_diags, arg_diags), - target_result.diagnostics.clone(), - ), - }) - } - } else { - { - let substituted_children = Rc::new({ - let mut __result = Vec::new(); - for child in decl.children.clone().iter().cloned() { - __result.push(substitute_type_slots( - &child, - &slot_bindings, - &type_name, - &env.source_indices.clone(), - )); - } - __result - }); - let is_recursive = is_recursive_type_by_name(&env, type_name.clone()); - let result = Rc::new(NodeResolveResult { - resolved: Rc::new(Node { - name: type_name.clone(), - span: n.span.clone(), - ident_span: n.ident_span.clone(), - children: substituted_children, - connective: decl.connective.clone(), - params: Rc::new(vec![]), - inferred: n.inferred.clone(), - return_cardinality: n.return_cardinality.clone(), - uses: n.uses.clone(), - body: n.body.clone(), - transport: n.transport.clone(), - properties: decl.properties.clone(), - type_annotation: n.type_annotation.clone(), - is_self_recursive: is_recursive, - has_non_tail_self_call: n.has_non_tail_self_call.clone(), - match_pattern: n.match_pattern.clone(), - expr_data: n.expr_data.clone(), - ident: None, - }), - diagnostics: v2_rt::concat(arity_diags, arg_diags), - }); - result - } - } - } - } else { - { - let is_map = node_is_keyed_collection(&n, env.source_indices.clone()); - if is_map { - { - let type_name = authored_name(env.clone(), n.clone()); - let key_child_node = match n.children.clone().first().cloned() { - Some(k) => k.clone(), - None => unit_type(), - }; - let val_child_node = match n.children.clone().get(1 as usize).cloned() { - Some(v) => v.clone(), - None => unit_type(), - }; - let key_type = child_type_node(&key_child_node); - let val_type = child_type_node(&val_child_node); - let key_result = resolve_node_bounded( - &key_type, - &env, - &module_name, - (depth.clone() + 1), - ); - let key_resolved = key_result.resolved.clone(); - let key_diags = key_result.diagnostics.clone(); - let val_result = resolve_node_bounded( - &val_type, - &env, - &module_name, - (depth.clone() + 1), - ); - let val_resolved = val_result.resolved.clone(); - let val_diags = val_result.diagnostics.clone(); - let key_param_name = if (key_child_node.inferred.clone() != None) { - authored_name(env.clone(), key_child_node.clone()) - } else { - match container_param_name(type_name.clone(), 0) { - Some(pn) => pn.clone(), - None => authored_name(env.clone(), key_child_node.clone()), - } - }; - let val_param_name = if (val_child_node.inferred.clone() != None) { - authored_name(env.clone(), val_child_node.clone()) - } else { - match container_param_name(type_name.clone(), 1) { - Some(pn) => pn.clone(), - None => authored_name(env.clone(), val_child_node.clone()), - } - }; - let resolved_key_child = Rc::new(Node { - name: key_param_name, - span: key_child_node.span.clone(), - ident_span: key_child_node.ident_span.clone(), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::Resolved { - node: key_resolved, - })), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - let resolved_val_child = Rc::new(Node { - name: val_param_name, - span: val_child_node.span.clone(), - ident_span: val_child_node.ident_span.clone(), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::Resolved { - node: val_resolved, - })), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - Rc::new(NodeResolveResult { - resolved: Rc::new(Node { - name: type_name.clone(), - span: n.span.clone(), - ident_span: n.ident_span.clone(), - children: Rc::new(vec![resolved_key_child, resolved_val_child]), - connective: n.connective.clone(), - params: n.params.clone(), - inferred: n.inferred.clone(), - return_cardinality: n.return_cardinality.clone(), - uses: n.uses.clone(), - body: n.body.clone(), - transport: n.transport.clone(), - properties: n.properties.clone(), - type_annotation: n.type_annotation.clone(), - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }), - diagnostics: v2_rt::concat(key_diags, val_diags), - }) + let alias_target = match decl.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: target, .. }) => substitute_type_slots(&target, &slot_bindings, &type_name, &env.source_indices.clone()), + _ => n.clone(), +}; +let target_result = resolve_node_bounded(&alias_target, &env, &module_name, (depth.clone() + 1)); +let is_recursive = is_recursive_type_by_name(&env, type_name.clone()); +let resolved_node = Rc::new(Node { + name: type_name.clone(), + span: n.span.clone(), + ident_span: n.ident_span.clone(), + children: target_result.resolved.clone().children.clone(), + connective: target_result.resolved.clone().connective.clone(), + params: Rc::new(vec![]), + inferred: n.inferred.clone(), + return_cardinality: n.return_cardinality.clone(), + uses: n.uses.clone(), + body: n.body.clone(), + transport: n.transport.clone(), + properties: target_result.resolved.clone().properties.clone(), + type_annotation: n.type_annotation.clone(), + is_self_recursive: is_recursive, + has_non_tail_self_call: n.has_non_tail_self_call.clone(), + match_pattern: n.match_pattern.clone(), + expr_data: n.expr_data.clone(), + ident: None, +}); +Rc::new(NodeResolveResult { + resolved: resolved_node, + diagnostics: v2_rt::concat(v2_rt::concat(arity_diags, arg_diags), target_result.diagnostics.clone()), +}) +} + } else { + { + let substituted_children = Rc::new({ let mut __result = Vec::new(); for child in decl.children.clone().iter().cloned() { __result.push(substitute_type_slots(&child, &slot_bindings, &type_name, &env.source_indices.clone())); } __result }); +let is_recursive = is_recursive_type_by_name(&env, type_name.clone()); +let result = Rc::new(NodeResolveResult { + resolved: Rc::new(Node { + name: type_name.clone(), + span: n.span.clone(), + ident_span: n.ident_span.clone(), + children: substituted_children, + connective: decl.connective.clone(), + params: Rc::new(vec![]), + inferred: n.inferred.clone(), + return_cardinality: n.return_cardinality.clone(), + uses: n.uses.clone(), + body: n.body.clone(), + transport: n.transport.clone(), + properties: decl.properties.clone(), + type_annotation: n.type_annotation.clone(), + is_self_recursive: is_recursive, + has_non_tail_self_call: n.has_non_tail_self_call.clone(), + match_pattern: n.match_pattern.clone(), + expr_data: n.expr_data.clone(), + ident: None, +}), + diagnostics: v2_rt::concat(arity_diags, arg_diags), +}); +result +} } - } else { - if ((n.children.clone().len() as i64) == 1) { +} + } else { + { + let is_map = node_is_keyed_collection(&n, env.source_indices.clone()); +if is_map { { let type_name = authored_name(env.clone(), n.clone()); - match n.children.clone().first().cloned() { - Some(child_node) => { +let key_child_node = match n.children.clone().first().cloned() { + Some(k) => k.clone(), + None => unit_type(), +}; +let val_child_node = match n.children.clone().get(1 as usize).cloned() { + Some(v) => v.clone(), + None => unit_type(), +}; +let key_type = child_type_node(&key_child_node); +let val_type = child_type_node(&val_child_node); +let key_result = resolve_node_bounded(&key_type, &env, &module_name, (depth.clone() + 1)); +let key_resolved = key_result.resolved.clone(); +let key_diags = key_result.diagnostics.clone(); +let val_result = resolve_node_bounded(&val_type, &env, &module_name, (depth.clone() + 1)); +let val_resolved = val_result.resolved.clone(); +let val_diags = val_result.diagnostics.clone(); +let key_param_name = if (key_child_node.inferred.clone() != None) { + authored_name(env.clone(), key_child_node.clone()) + } else { + match container_param_name(type_name.clone(), 0) { + Some(pn) => pn.clone(), + None => authored_name(env.clone(), key_child_node.clone()), +} + }; +let val_param_name = if (val_child_node.inferred.clone() != None) { + authored_name(env.clone(), val_child_node.clone()) + } else { + match container_param_name(type_name.clone(), 1) { + Some(pn) => pn.clone(), + None => authored_name(env.clone(), val_child_node.clone()), +} + }; +let resolved_key_child = Rc::new(Node { + name: key_param_name, + span: key_child_node.span.clone(), + ident_span: key_child_node.ident_span.clone(), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::Resolved { + node: key_resolved, +})), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +let resolved_val_child = Rc::new(Node { + name: val_param_name, + span: val_child_node.span.clone(), + ident_span: val_child_node.ident_span.clone(), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::Resolved { + node: val_resolved, +})), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +Rc::new(NodeResolveResult { + resolved: Rc::new(Node { + name: type_name.clone(), + span: n.span.clone(), + ident_span: n.ident_span.clone(), + children: Rc::new(vec![resolved_key_child, resolved_val_child]), + connective: n.connective.clone(), + params: n.params.clone(), + inferred: n.inferred.clone(), + return_cardinality: n.return_cardinality.clone(), + uses: n.uses.clone(), + body: n.body.clone(), + transport: n.transport.clone(), + properties: n.properties.clone(), + type_annotation: n.type_annotation.clone(), + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}), + diagnostics: v2_rt::concat(key_diags, val_diags), +}) +} + } else { + if ((n.children.clone().len() as i64) == 1) { + { + let type_name = authored_name(env.clone(), n.clone()); +match n.children.clone().first().cloned() { + Some(child_node) => { let el_type = child_type_node(&child_node); - let el_result = resolve_node_bounded( - &el_type, - &env, - &module_name, - (depth.clone() + 1), - ); - let el_resolved = el_result.resolved.clone(); - let el_diags = el_result.diagnostics.clone(); - let el_param_name = if (child_node.inferred.clone() != None) - { +let el_result = resolve_node_bounded(&el_type, &env, &module_name, (depth.clone() + 1)); +let el_resolved = el_result.resolved.clone(); +let el_diags = el_result.diagnostics.clone(); +let el_param_name = if (child_node.inferred.clone() != None) { authored_name(env.clone(), child_node.clone()) } else { match container_param_name(type_name.clone(), 0) { - Some(pn) => pn.clone(), - None => { - authored_name(env.clone(), child_node.clone()) - } - } + Some(pn) => pn.clone(), + None => authored_name(env.clone(), child_node.clone()), +} }; - let resolved_child = Rc::new(Node { - name: el_param_name, - span: child_node.span.clone(), - ident_span: child_node.ident_span.clone(), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::Resolved { - node: el_resolved, - })), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); +let resolved_child = Rc::new(Node { + name: el_param_name, + span: child_node.span.clone(), + ident_span: child_node.ident_span.clone(), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::Resolved { + node: el_resolved, +})), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +Rc::new(NodeResolveResult { + resolved: Rc::new(Node { + name: type_name.clone(), + span: n.span.clone(), + ident_span: n.ident_span.clone(), + children: Rc::new(vec![resolved_child]), + connective: n.connective.clone(), + params: n.params.clone(), + inferred: n.inferred.clone(), + return_cardinality: n.return_cardinality.clone(), + uses: n.uses.clone(), + body: n.body.clone(), + transport: n.transport.clone(), + properties: n.properties.clone(), + type_annotation: n.type_annotation.clone(), + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}), + diagnostics: el_diags, +}) +}, + None => Rc::new(NodeResolveResult { + resolved: n.clone(), + diagnostics: Rc::new(vec![]), +}), +} +} + } else { + if ((n.children.clone().len() as i64) == 0) { + if is_recursive_type_for(&env, &n) { Rc::new(NodeResolveResult { - resolved: Rc::new(Node { - name: type_name.clone(), - span: n.span.clone(), - ident_span: n.ident_span.clone(), - children: Rc::new(vec![resolved_child]), - connective: n.connective.clone(), - params: n.params.clone(), - inferred: n.inferred.clone(), - return_cardinality: n.return_cardinality.clone(), - uses: n.uses.clone(), - body: n.body.clone(), - transport: n.transport.clone(), - properties: n.properties.clone(), - type_annotation: n.type_annotation.clone(), - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }), - diagnostics: el_diags, - }) - } - None => Rc::new(NodeResolveResult { - resolved: n.clone(), - diagnostics: Rc::new(vec![]), - }), - } - } - } else { - if ((n.children.clone().len() as i64) == 0) { - if is_recursive_type_for(&env, &n) { - Rc::new(NodeResolveResult { - resolved: n.clone(), - diagnostics: Rc::new(vec![]), - }) - } else { - match lookup_type_for(&env, &n) { - Some(resolved) => { - let structurally_resolved = if (((resolved - .connective - .clone() - == Connective::NoConnective) - && ((resolved.children.clone().len() as i64) == 0)) - && (resolved.inferred.clone() != None)) - { - match resolved.inferred.clone().as_deref().cloned() - { - Some(InferredNode::Resolved { - node: target, - .. - }) => target.clone(), - _ => resolved.clone(), - } + resolved: n.clone(), + diagnostics: Rc::new(vec![]), +}) + } else { + match lookup_type_for(&env, &n) { + Some(resolved) => { + let structurally_resolved = if (((resolved.connective.clone() == Connective::NoConnective) && ((resolved.children.clone().len() as i64) == 0)) && (resolved.inferred.clone() != None)) { + match resolved.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: target, .. }) => target.clone(), + _ => resolved.clone(), +} } else { resolved.clone() }; - let is_optional = (n.return_cardinality.clone() - == Cardinality::CardOptional); - let final_resolved = if is_optional { +let is_optional = (n.return_cardinality.clone() == Cardinality::CardOptional); +let final_resolved = if is_optional { with_optional_cardinality(&structurally_resolved) } else { structurally_resolved }; - Rc::new(NodeResolveResult { - resolved: final_resolved, - diagnostics: Rc::new(vec![]), - }) - } - None => { +Rc::new(NodeResolveResult { + resolved: final_resolved, + diagnostics: Rc::new(vec![]), +}) +}, + None => { let n_is_error = if (n.inferred.clone() != None) { - is_compiler_error( - n.inferred.clone().clone().unwrap(), - ) + is_compiler_error(n.inferred.clone().clone().unwrap()) } else { false }; - let n_is_callable = - ((n.params.clone().len() as i64) > 0); - let n_is_type_var = if (n.inferred.clone() != None) { - is_type_variable( - n.inferred.clone().clone().unwrap(), - ) +let n_is_callable = ((n.params.clone().len() as i64) > 0); +let n_is_type_var = if (n.inferred.clone() != None) { + is_type_variable(n.inferred.clone().clone().unwrap()) } else { false }; - if (((is_kernel_type(authored_name( - env.clone(), - n.clone(), - )) || n_is_type_var) - || n_is_error) - || n_is_callable) - { +if (((is_kernel_type(authored_name(env.clone(), n.clone())) || n_is_type_var) || n_is_error) || n_is_callable) { Rc::new(NodeResolveResult { - resolved: n.clone(), - diagnostics: Rc::new(vec![]), - }) + resolved: n.clone(), + diagnostics: Rc::new(vec![]), +}) } else { Rc::new(NodeResolveResult { - resolved: n.clone(), - diagnostics: Rc::new(vec![make_error_node( - Rc::new( - CompilerDiagnostic::UnresolvedType { - name: authored_name( - env.clone(), - n.clone(), - ), - span: n.span.clone(), - }, - ), - module_name.clone(), - )]), - }) + resolved: n.clone(), + diagnostics: Rc::new(vec![make_error_node(Rc::new(CompilerDiagnostic::UnresolvedType { + name: authored_name(env.clone(), n.clone()), + span: n.span.clone(), +}), module_name.clone())]), +}) } - } +}, +} } + } else { + Rc::new(NodeResolveResult { + resolved: n.clone(), + diagnostics: Rc::new(vec![]), +}) } - } else { - Rc::new(NodeResolveResult { - resolved: n.clone(), - diagnostics: Rc::new(vec![]), - }) } } - } +} } } - } +} }) } -pub fn resolve_optional_node( - n: &Option>, - env: Rc, - module_name: String, -) -> Rc { +pub fn resolve_optional_node(n: &Option>, env: Rc, module_name: String) -> Rc { if (n.clone() == None) { Rc::new(NodeResolveResult { - resolved: unit_type(), - diagnostics: Rc::new(vec![]), - }) + resolved: unit_type(), + diagnostics: Rc::new(vec![]), +}) } else { match (*n.clone().unwrap()).clone() { - InferredNode::Resolved { node: inner, .. } => { - resolve_node(inner.clone(), env, module_name) - } - InferredNode::CompilerError { - message: msg, - span: sp, - .. - } => Rc::new(NodeResolveResult { - resolved: make_expr_error_node(ExprErrorKind::SemanticExprError, &msg, &sp), - diagnostics: Rc::new(vec![make_error_node( - Rc::new(CompilerDiagnostic::InternalError { - message: msg.clone(), - span: sp.clone(), - }), - module_name, - )]), - }), - InferredNode::TypeVariable { .. } => Rc::new(NodeResolveResult { - resolved: unit_type(), - diagnostics: Rc::new(vec![]), - }), - } + InferredNode::Resolved { node: inner, .. } => resolve_node(inner.clone(), env, module_name), + InferredNode::CompilerError { message: msg, span: sp, .. } => Rc::new(NodeResolveResult { + resolved: make_expr_error_node(ExprErrorKind::SemanticExprError, &msg, &sp), + diagnostics: Rc::new(vec![make_error_node(Rc::new(CompilerDiagnostic::InternalError { + message: msg.clone(), + span: sp.clone(), +}), module_name)]), +}), + InferredNode::TypeVariable { .. } => Rc::new(NodeResolveResult { + resolved: unit_type(), + diagnostics: Rc::new(vec![]), +}), +} } } pub fn resolve_field(field: &Rc, env: &Rc, module_name: &String) -> Rc { { - let type_result = resolve_node( - field_node_type_expr(&field), - env.clone(), - module_name.clone(), - ); - let type_resolved = type_result.resolved.clone(); - let type_diags = type_result.diagnostics.clone(); - let default_resolved = match field_node_default_value(&field) { - Some(default_value) => Some(resolve_expr_types( - &default_value, - &env, - module_name.clone(), - )), - None => None, - }; - let default_diags = match default_resolved.clone() { - Some(result) => result.diagnostics.clone(), - None => Rc::new(vec![]), - }; - Rc::new(FieldResult { - field: make_field_node( - &field_node_name_at(field.clone(), env.source_indices.clone()), - type_resolved, - field_node_cardinality(field.clone()), - match default_resolved.clone() { - Some(result) => Some(result.expr.clone()), - None => None, - }, - field_node_from_key(field.clone(), env.source_indices.clone()), - field.span.clone(), - node_name_span(&field), - ), - diagnostics: v2_rt::concat(type_diags, default_diags), - }) - } + let type_result = resolve_node(field_node_type_expr(&field), env.clone(), module_name.clone()); +let type_resolved = type_result.resolved.clone(); +let type_diags = type_result.diagnostics.clone(); +let default_resolved = match field_node_default_value(&field) { + Some(default_value) => Some(resolve_expr_types(&default_value, &env, module_name.clone())), + None => None, +}; +let default_diags = match default_resolved.clone() { + Some(result) => result.diagnostics.clone(), + None => Rc::new(vec![]), +}; +Rc::new(FieldResult { + field: make_field_node(&field_node_name_at(field.clone(), env.source_indices.clone()), type_resolved, field_node_cardinality(field.clone()), match default_resolved.clone() { + Some(result) => Some(result.expr.clone()), + None => None, +}, field_node_from_key(field.clone(), env.source_indices.clone()), field.span.clone(), node_name_span(&field)), + diagnostics: v2_rt::concat(type_diags, default_diags), +}) +} } pub fn resolve_param(param: &Rc, env: &Rc, module_name: &String) -> Rc { { - let type_result = resolve_node( - param_node_type_expr(¶m), - env.clone(), - module_name.clone(), - ); - let type_resolved = type_result.resolved.clone(); - let type_diags = type_result.diagnostics.clone(); - let default_resolved = match param_node_default_value(¶m) { - Some(default_value) => Some(resolve_expr_types( - &default_value, - &env, - module_name.clone(), - )), - None => None, - }; - let default_diags = match default_resolved.clone() { - Some(result) => result.diagnostics.clone(), - None => Rc::new(vec![]), - }; - Rc::new(ParamResult { - param: make_param_node( - ¶m_node_name_at(param.clone(), env.source_indices.clone()), - type_resolved, - match default_resolved.clone() { - Some(result) => Some(result.expr.clone()), - None => None, - }, - param.span.clone(), - node_name_span(¶m), - ), - diagnostics: v2_rt::concat(type_diags, default_diags), - }) - } + let type_result = resolve_node(param_node_type_expr(¶m), env.clone(), module_name.clone()); +let type_resolved = type_result.resolved.clone(); +let type_diags = type_result.diagnostics.clone(); +let default_resolved = match param_node_default_value(¶m) { + Some(default_value) => Some(resolve_expr_types(&default_value, &env, module_name.clone())), + None => None, +}; +let default_diags = match default_resolved.clone() { + Some(result) => result.diagnostics.clone(), + None => Rc::new(vec![]), +}; +Rc::new(ParamResult { + param: make_param_node(¶m_node_name_at(param.clone(), env.source_indices.clone()), type_resolved, match default_resolved.clone() { + Some(result) => Some(result.expr.clone()), + None => None, +}, param.span.clone(), node_name_span(¶m)), + diagnostics: v2_rt::concat(type_diags, default_diags), +}) +} } -pub fn resolve_resource_use( - ru: &Rc, - env: &Rc, - module_name: String, -) -> Rc { +pub fn resolve_resource_use(ru: &Rc, env: &Rc, module_name: String) -> Rc { { let type_result = resolve_node(resource_use_resource(&ru), env.clone(), module_name); - let type_resolved = type_result.resolved.clone(); - let type_diags = type_result.diagnostics.clone(); - Rc::new(ResourceUseResult { - resource_use: make_resource_use_node( - &resource_use_name_at(ru.clone(), env.source_indices.clone()), - type_resolved, - ru.span.clone(), - node_name_span(&ru), - ), - diagnostics: type_diags, - }) - } +let type_resolved = type_result.resolved.clone(); +let type_diags = type_result.diagnostics.clone(); +Rc::new(ResourceUseResult { + resource_use: make_resource_use_node(&resource_use_name_at(ru.clone(), env.source_indices.clone()), type_resolved, ru.span.clone(), node_name_span(&ru)), + diagnostics: type_diags, +}) +} } -pub fn resolve_named_arg( - arg: &Rc, - env: &Rc, - module_name: String, -) -> Rc { +pub fn resolve_named_arg(arg: &Rc, env: &Rc, module_name: String) -> Rc { { let value_result = resolve_expr_types(&arg_value(&arg), &env, module_name); - let value_expr = value_result.expr.clone(); - let value_diags = value_result.diagnostics.clone(); - Rc::new(NamedArgResolveResult { - arg: make_arg_node( - arg_name_at(arg.clone(), env.source_indices.clone()), - value_expr, - arg.span.clone(), - node_name_span(&arg), - ), - diagnostics: value_diags, - }) - } +let value_expr = value_result.expr.clone(); +let value_diags = value_result.diagnostics.clone(); +Rc::new(NamedArgResolveResult { + arg: make_arg_node(arg_name_at(arg.clone(), env.source_indices.clone()), value_expr, arg.span.clone(), node_name_span(&arg)), + diagnostics: value_diags, +}) +} } -pub fn resolve_field_init( - field_init: &Rc, - env: &Rc, - module_name: String, -) -> Rc { +pub fn resolve_field_init(field_init: &Rc, env: &Rc, module_name: String) -> Rc { { - let value_result = - resolve_expr_types(&field_init_node_value(&field_init), &env, module_name); - let value_expr = value_result.expr.clone(); - let value_diags = value_result.diagnostics.clone(); - Rc::new(FieldInitResolveResult { - field_init: make_field_init_node( - &field_init_node_name_at(field_init.clone(), env.source_indices.clone()), - value_expr, - field_init.span.clone(), - node_name_span(&field_init), - ), - diagnostics: value_diags, - }) - } + let value_result = resolve_expr_types(&field_init_node_value(&field_init), &env, module_name); +let value_expr = value_result.expr.clone(); +let value_diags = value_result.diagnostics.clone(); +Rc::new(FieldInitResolveResult { + field_init: make_field_init_node(&field_init_node_name_at(field_init.clone(), env.source_indices.clone()), value_expr, field_init.span.clone(), node_name_span(&field_init)), + diagnostics: value_diags, +}) +} } -pub fn resolve_match_arm( - arm: &Rc, - env: &Rc, - module_name: &String, -) -> Rc { +pub fn resolve_match_arm(arm: &Rc, env: &Rc, module_name: &String) -> Rc { { let arm_g = arm_guard(&arm); - let guard_result = match arm_g { - Some(guard) => Some(resolve_expr_types(&guard, &env, module_name.clone())), - None => None, - }; - let guard_diags = match guard_result.clone() { - Some(result) => result.diagnostics.clone(), - None => Rc::new(vec![]), - }; - let body_result = resolve_expr_types(&arm_body(&arm), &env, module_name.clone()); - let body_expr = body_result.expr.clone(); - let body_diags = body_result.diagnostics.clone(); - Rc::new(MatchArmResolveResult { - arm: make_arm_node( - arm_pattern(arm.clone()), - match guard_result.clone() { - Some(result) => Some(result.expr.clone()), - None => None, - }, - body_expr, - arm.span.clone(), - ), - diagnostics: v2_rt::concat(guard_diags, body_diags), - }) - } +let guard_result = match arm_g { + Some(guard) => Some(resolve_expr_types(&guard, &env, module_name.clone())), + None => None, +}; +let guard_diags = match guard_result.clone() { + Some(result) => result.diagnostics.clone(), + None => Rc::new(vec![]), +}; +let body_result = resolve_expr_types(&arm_body(&arm), &env, module_name.clone()); +let body_expr = body_result.expr.clone(); +let body_diags = body_result.diagnostics.clone(); +Rc::new(MatchArmResolveResult { + arm: make_arm_node(arm_pattern(arm.clone()), match guard_result.clone() { + Some(result) => Some(result.expr.clone()), + None => None, +}, body_expr, arm.span.clone()), + diagnostics: v2_rt::concat(guard_diags, body_diags), +}) +} } -pub fn resolve_string_part( - part: Rc, - env: Rc, - module_name: String, -) -> Rc { +pub fn resolve_string_part(part: Rc, env: Rc, module_name: String) -> Rc { match (*part).clone() { - StringPart::Text { value, .. } => Rc::new(StringPartResolveResult { - part: Rc::new(StringPart::Text { - value: value.clone(), - }), - diagnostics: Rc::new(vec![]), - }), - StringPart::Interpolation { expr, .. } => { - let expr_result = resolve_expr_types(&expr, &env, module_name); - let resolved_expr = expr_result.expr.clone(); - let expr_diags = expr_result.diagnostics.clone(); - Rc::new(StringPartResolveResult { - part: Rc::new(StringPart::Interpolation { - expr: resolved_expr, - }), - diagnostics: expr_diags, - }) - } - } + StringPart::Text { value, .. } => Rc::new(StringPartResolveResult { + part: Rc::new(StringPart::Text { + value: value.clone(), +}), + diagnostics: Rc::new(vec![]), +}), + StringPart::Interpolation { expr, .. } => { + let expr_result = resolve_expr_types(&expr, &env, module_name); +let resolved_expr = expr_result.expr.clone(); +let expr_diags = expr_result.diagnostics.clone(); +Rc::new(StringPartResolveResult { + part: Rc::new(StringPart::Interpolation { + expr: resolved_expr, +}), + diagnostics: expr_diags, +}) +}, +} } -pub fn resolve_transport_binding( - transport: &Rc, - env: &Rc, - module_name: &String, -) -> Rc { +pub fn resolve_transport_binding(transport: &Rc, env: &Rc, module_name: &String) -> Rc { if is_local_transport(&transport, &env.source_indices.clone()) { Rc::new(TransportResolveResult { - transport: transport.clone(), - diagnostics: Rc::new(vec![]), - }) + transport: transport.clone(), + diagnostics: Rc::new(vec![]), +}) } else { { - let prop_results = Rc::new({ - let mut __result = Vec::new(); - for p in transport.properties.clone().iter().cloned() { - __result.push({ - let val_result = resolve_expr_types( - &field_init_node_value(&p), - &env, - module_name.clone(), - ); - Rc::new(FieldInitResolveResult { - field_init: make_field_init_node( - &field_init_node_name_at(p.clone(), env.source_indices.clone()), - val_result.expr.clone(), - p.span.clone(), - node_name_span(&p), - ), - diagnostics: val_result.diagnostics.clone(), - }) - }); - } - __result - }); - let resolved_props = Rc::new({ - let mut __result = Vec::new(); - for pr in prop_results.clone().iter().cloned() { - __result.push(pr.field_init.clone()); - } - __result - }); - let prop_diags = Rc::new({ - let mut __result = Vec::new(); - for pr in prop_results.clone().iter().cloned() { - __result.extend((*pr.diagnostics.clone()).iter().cloned()); - } - __result - }); - let child_results = Rc::new({ - let mut __result = Vec::new(); - for c in transport.children.clone().iter().cloned() { - __result.push(resolve_expr_types(&c, &env, module_name.clone())); - } - __result - }); - let resolved_children = Rc::new({ - let mut __result = Vec::new(); - for cr in child_results.clone().iter().cloned() { - __result.push(cr.expr.clone()); - } - __result - }); - let child_diags = Rc::new({ - let mut __result = Vec::new(); - for cr in child_results.clone().iter().cloned() { - __result.extend((*cr.diagnostics.clone()).iter().cloned()); - } - __result - }); - let body_diags = - match transport_request_body(transport.clone(), env.source_indices.clone()) { - Some(b) => match (*b.expr_data.clone()).clone() { - ExprData::ExprRecordLit { .. } => Rc::new(vec![]), - _ => Rc::new( - vec![make_error_node(Rc::new(CompilerDiagnostic::InternalError { + let prop_results = Rc::new({ let mut __result = Vec::new(); for p in transport.properties.clone().iter().cloned() { __result.push({ + let val_result = resolve_expr_types(&field_init_node_value(&p), &env, module_name.clone()); +Rc::new(FieldInitResolveResult { + field_init: make_field_init_node(&field_init_node_name_at(p.clone(), env.source_indices.clone()), val_result.expr.clone(), p.span.clone(), node_name_span(&p)), + diagnostics: val_result.diagnostics.clone(), +}) +}); } __result }); +let resolved_props = Rc::new({ let mut __result = Vec::new(); for pr in prop_results.clone().iter().cloned() { __result.push(pr.field_init.clone()); } __result }); +let prop_diags = Rc::new({ let mut __result = Vec::new(); for pr in prop_results.clone().iter().cloned() { __result.extend((*pr.diagnostics.clone()).iter().cloned()); } __result }); +let child_results = Rc::new({ let mut __result = Vec::new(); for c in transport.children.clone().iter().cloned() { __result.push(resolve_expr_types(&c, &env, module_name.clone())); } __result }); +let resolved_children = Rc::new({ let mut __result = Vec::new(); for cr in child_results.clone().iter().cloned() { __result.push(cr.expr.clone()); } __result }); +let child_diags = Rc::new({ let mut __result = Vec::new(); for cr in child_results.clone().iter().cloned() { __result.extend((*cr.diagnostics.clone()).iter().cloned()); } __result }); +let body_diags = match transport_request_body(transport.clone(), env.source_indices.clone()) { + Some(b) => match (*b.expr_data.clone()).clone() { + ExprData::ExprRecordLit { .. } => Rc::new(vec![]), + _ => Rc::new(vec![make_error_node(Rc::new(CompilerDiagnostic::InternalError { message: "transport body must be a record expression { field: value, ... }".to_string(), span: b.span.clone(), -}), module_name.clone())], - ), - }, - None => Rc::new(vec![]), - }; - Rc::new(TransportResolveResult { - transport: make_transport_node( - resolved_props, - resolved_children, - transport.body.clone(), - transport.span.clone(), - ), - diagnostics: v2_rt::concat(v2_rt::concat(prop_diags, child_diags), body_diags), - }) - } +}), module_name.clone())]), +}, + None => Rc::new(vec![]), +}; +Rc::new(TransportResolveResult { + transport: make_transport_node(resolved_props, resolved_children, transport.body.clone(), transport.span.clone()), + diagnostics: v2_rt::concat(v2_rt::concat(prop_diags, child_diags), body_diags), +}) +} } } -pub fn resolve_expr_types( - texpr: &Rc, - env: &Rc, - module_name: String, -) -> Rc { +pub fn resolve_expr_types(texpr: &Rc, env: &Rc, module_name: String) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*texpr.expr_data.clone()).clone() { - ExprData::ExprLiteral { .. } => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), - }), - ExprData::ExprError { kind, message, .. } => Rc::new(ExprResolveResult { - expr: make_expr_error_node(kind.clone(), &message, &texpr.span.clone()), - diagnostics: Rc::new(vec![make_error_node( - Rc::new(CompilerDiagnostic::InternalError { - message: message.clone(), - span: texpr.span.clone(), - }), - module_name.clone(), - )]), - }), - ExprData::ExprVar { .. } => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), - }), - ExprData::ExprFieldAccess { .. } => { - let r = match texpr.children.clone().first().cloned() { - Some(base) => resolve_expr_types(&base, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), - }), - }; - Rc::new(ExprResolveResult { - expr: map_children(&texpr, |child| r.expr.clone()), - diagnostics: r.diagnostics.clone(), - }) - } - ExprData::ExprCall { - call_semantics: cs, - descent_evidence: de, - .. - } => { - let resolved_children = Rc::new({ - let mut __result = Vec::new(); - for arg_node in texpr.children.clone().iter().cloned() { - __result.push({ - let val = match arg_node.children.clone().first().cloned() { - Some(v) => v.clone(), - None => arg_node.clone(), - }; - let vr = resolve_expr_types(&val, &env, module_name.clone()); - make_arg_node( - if (arg_node.ident_span.clone() == None) { - None - } else { - Some(authored_name(env.clone(), arg_node.clone())) - }, - vr.expr.clone(), - arg_node.span.clone(), - node_name_span(&arg_node), - ) - }); - } - __result - }); - let all_diags = Rc::new({ - let mut __result = Vec::new(); - for arg_node in texpr.children.clone().iter().cloned() { - __result.extend( - (*{ - let val = match arg_node.children.clone().first().cloned() { - Some(v) => v.clone(), - None => arg_node.clone(), - }; - let vr = resolve_expr_types(&val, &env, module_name.clone()); - vr.diagnostics.clone() - }) - .iter() - .cloned(), - ); - } - __result - }); - Rc::new(ExprResolveResult { - expr: make_named_expr_node( - &expr_call_func_at(texpr.clone(), env.source_indices.clone()), - Rc::new(ExprData::ExprCall { - call_semantics: cs.clone(), - descent_evidence: de.clone(), - }), - resolved_children, - texpr.inferred.clone(), - texpr.span.clone(), - node_name_span(&texpr), - ), - diagnostics: all_diags, - }) - } - ExprData::ExprMethodCall { - method_semantics: ms, - .. - } => { - let resolved_children = Rc::new({ - let mut __result = Vec::new(); - for pair in Rc::new( - texpr - .children - .clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() + ExprData::ExprLiteral { .. } => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), +}), + ExprData::ExprError { kind, message, .. } => Rc::new(ExprResolveResult { + expr: make_expr_error_node(kind.clone(), &message, &texpr.span.clone()), + diagnostics: Rc::new(vec![make_error_node(Rc::new(CompilerDiagnostic::InternalError { + message: message.clone(), + span: texpr.span.clone(), +}), module_name.clone())]), +}), + ExprData::ExprVar { .. } => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), +}), + ExprData::ExprFieldAccess { .. } => { + let r = match texpr.children.clone().first().cloned() { + Some(base) => resolve_expr_types(&base, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), +}), +}; +Rc::new(ExprResolveResult { + expr: map_children(&texpr, |child| r.expr.clone()), + diagnostics: r.diagnostics.clone(), +}) +}, + ExprData::ExprCall { call_semantics: cs, descent_evidence: de, .. } => { + let resolved_children = Rc::new({ let mut __result = Vec::new(); for arg_node in texpr.children.clone().iter().cloned() { __result.push({ + let val = match arg_node.children.clone().first().cloned() { + Some(v) => v.clone(), + None => arg_node.clone(), +}; +let vr = resolve_expr_types(&val, &env, module_name.clone()); +make_arg_node(if (arg_node.ident_span.clone() == None) { + None + } else { + Some(authored_name(env.clone(), arg_node.clone())) + }, vr.expr.clone(), arg_node.span.clone(), node_name_span(&arg_node)) +}); } __result }); +let all_diags = Rc::new({ let mut __result = Vec::new(); for arg_node in texpr.children.clone().iter().cloned() { __result.extend((*{ + let val = match arg_node.children.clone().first().cloned() { + Some(v) => v.clone(), + None => arg_node.clone(), +}; +let vr = resolve_expr_types(&val, &env, module_name.clone()); +vr.diagnostics.clone() +}).iter().cloned()); } __result }); +Rc::new(ExprResolveResult { + expr: make_named_expr_node(&expr_call_func_at(texpr.clone(), env.source_indices.clone()), Rc::new(ExprData::ExprCall { + call_semantics: cs.clone(), + descent_evidence: de.clone(), +}), resolved_children, texpr.inferred.clone(), texpr.span.clone(), node_name_span(&texpr)), + diagnostics: all_diags, +}) +}, + ExprData::ExprMethodCall { method_semantics: ms, .. } => { + let resolved_children = Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(texpr.children.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { __result.push({ + let idx = pair.0.clone(); +let child = pair.1.clone(); +if (idx.clone() == 0) { { - __result.push({ - let idx = pair.0.clone(); - let child = pair.1.clone(); - if (idx.clone() == 0) { - { - let rr = resolve_expr_types(&child, &env, module_name.clone()); - rr.expr.clone() - } - } else { - { - let val = match child.children.clone().first().cloned() { - Some(v) => v.clone(), - None => child.clone(), - }; - let vr = resolve_expr_types(&val, &env, module_name.clone()); - make_arg_node( - if (child.ident_span.clone() == None) { - None - } else { - Some(authored_name_at( - env.source_indices.clone(), - &child, - )) - }, - vr.expr.clone(), - child.span.clone(), - node_name_span(&child), - ) - } - } - }); - } - __result - }); - let all_diags = Rc::new({ - let mut __result = Vec::new(); - for pair in Rc::new( - texpr - .children - .clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() + let rr = resolve_expr_types(&child, &env, module_name.clone()); +rr.expr.clone() +} + } else { { - __result.extend( - (*{ - let idx = pair.0.clone(); - let child = pair.1.clone(); - if (idx.clone() == 0) { - { - let rr = - resolve_expr_types(&child, &env, module_name.clone()); - rr.diagnostics.clone() - } - } else { - { - let val = match child.children.clone().first().cloned() { - Some(v) => v.clone(), - None => child.clone(), - }; - let vr = - resolve_expr_types(&val, &env, module_name.clone()); - vr.diagnostics.clone() - } - } - }) - .iter() - .cloned(), - ); - } - __result - }); - Rc::new(ExprResolveResult { - expr: make_named_expr_node( - &expr_method_name_at(texpr.clone(), env.source_indices.clone()), - Rc::new(ExprData::ExprMethodCall { - method_semantics: ms.clone(), - }), - resolved_children, - texpr.inferred.clone(), - texpr.span.clone(), - node_name_span(&texpr), - ), - diagnostics: all_diags, - }) - } - ExprData::ExprMatch => { - let resolved_children = Rc::new({ - let mut __result = Vec::new(); - for pair in Rc::new( - texpr - .children - .clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() + let val = match child.children.clone().first().cloned() { + Some(v) => v.clone(), + None => child.clone(), +}; +let vr = resolve_expr_types(&val, &env, module_name.clone()); +make_arg_node(if (child.ident_span.clone() == None) { + None + } else { + Some(authored_name_at(env.source_indices.clone(), &child)) + }, vr.expr.clone(), child.span.clone(), node_name_span(&child)) +} + } +}); } __result }); +let all_diags = Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(texpr.children.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { __result.extend((*{ + let idx = pair.0.clone(); +let child = pair.1.clone(); +if (idx.clone() == 0) { { - __result.push({ - let idx = pair.0.clone(); - let child = pair.1.clone(); - if (idx.clone() == 0) { - { - let sr = resolve_expr_types(&child, &env, module_name.clone()); - sr.expr.clone() - } - } else { - { - let arm_ch = child.children.clone(); - let has_guard = ((arm_ch.clone().len() as i64) == 2); - if has_guard.clone() { - { - let guard_r = match arm_ch.clone().first().cloned() { - Some(g) => resolve_expr_types( - &g, - &env, - module_name.clone(), - ), - None => Rc::new(ExprResolveResult { - expr: child.clone(), - diagnostics: Rc::new(vec![]), - }), - }; - let body_r = - match arm_ch.clone().get(1 as usize).cloned() { - Some(b) => resolve_expr_types( - &b, - &env, - module_name.clone(), - ), - None => Rc::new(ExprResolveResult { - expr: child.clone(), - diagnostics: Rc::new(vec![]), - }), - }; - make_arm_node( - match child.match_pattern.clone() { - Some(p) => p.clone(), - None => Rc::new(MatchPattern::Wildcard), - }, - Some(guard_r.expr.clone()), - body_r.expr.clone(), - child.span.clone(), - ) - } - } else { - { - let body_r = match arm_ch.clone().first().cloned() { - Some(b) => resolve_expr_types( - &b, - &env, - module_name.clone(), - ), - None => Rc::new(ExprResolveResult { - expr: child.clone(), - diagnostics: Rc::new(vec![]), - }), - }; - make_arm_node( - match child.match_pattern.clone() { - Some(p) => p.clone(), - None => Rc::new(MatchPattern::Wildcard), - }, - None, - body_r.expr.clone(), - child.span.clone(), - ) - } - } - } - } - }); - } - __result - }); - let all_diags = Rc::new({ - let mut __result = Vec::new(); - for pair in Rc::new( - texpr - .children - .clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() + let rr = resolve_expr_types(&child, &env, module_name.clone()); +rr.diagnostics.clone() +} + } else { { - __result.extend( - (*{ - let idx = pair.0.clone(); - let child = pair.1.clone(); - if (idx.clone() == 0) { - { - let sr = - resolve_expr_types(&child, &env, module_name.clone()); - sr.diagnostics.clone() - } - } else { - { - let arm_ch = child.children.clone(); - let has_guard = ((arm_ch.clone().len() as i64) == 2); - if has_guard.clone() { - { - let guard_r = match arm_ch.clone().first().cloned() - { - Some(g) => resolve_expr_types( - &g, - &env, - module_name.clone(), - ), - None => Rc::new(ExprResolveResult { - expr: child.clone(), - diagnostics: Rc::new(vec![]), - }), - }; - let body_r = - match arm_ch.clone().get(1 as usize).cloned() { - Some(b) => resolve_expr_types( - &b, - &env, - module_name.clone(), - ), - None => Rc::new(ExprResolveResult { - expr: child.clone(), - diagnostics: Rc::new(vec![]), - }), - }; - v2_rt::concat( - guard_r.diagnostics.clone(), - body_r.diagnostics.clone(), - ) - } - } else { - { - let body_r = match arm_ch.clone().first().cloned() { - Some(b) => resolve_expr_types( - &b, - &env, - module_name.clone(), - ), - None => Rc::new(ExprResolveResult { - expr: child.clone(), - diagnostics: Rc::new(vec![]), - }), - }; - body_r.diagnostics.clone() - } - } - } - } - }) - .iter() - .cloned(), - ); - } - __result - }); - Rc::new(ExprResolveResult { - expr: make_expr_node( - Rc::new(ExprData::ExprMatch), - resolved_children, - texpr.inferred.clone(), - texpr.span.clone(), - ), - diagnostics: all_diags, - }) - } - ExprData::ExprIf => { - let ch = texpr.children.clone(); - let cr = match ch.clone().first().cloned() { - Some(c) => resolve_expr_types(&c, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), - }), - }; - let tr = match ch.clone().get(1 as usize).cloned() { - Some(t) => resolve_expr_types(&t, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), - }), - }; - let er = match ch.clone().get(2 as usize).cloned() { - Some(e) => Some(resolve_expr_types(&e, &env, module_name.clone())), - None => None, - }; - let resolved_children = match er.clone() { - Some(r) => Rc::new(vec![cr.expr.clone(), tr.expr.clone(), r.expr.clone()]), - None => Rc::new(vec![cr.expr.clone(), tr.expr.clone()]), - }; - Rc::new(ExprResolveResult { - expr: make_expr_node( - Rc::new(ExprData::ExprIf), - resolved_children, - texpr.inferred.clone(), - texpr.span.clone(), - ), - diagnostics: v2_rt::concat( - v2_rt::concat(cr.diagnostics.clone(), tr.diagnostics.clone()), - match er.clone() { - Some(r) => r.diagnostics.clone(), - None => Rc::new(vec![]), - }, - ), - }) - } - ExprData::ExprLet => { - let ch = texpr.children.clone(); - let vr = match ch.clone().first().cloned() { - Some(v) => resolve_expr_types(&v, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), - }), - }; - let br = match ch.clone().get(1 as usize).cloned() { - Some(bd) => Some(resolve_expr_types(&bd, &env, module_name.clone())), - None => None, - }; - let resolved_children = match br.clone() { - Some(r) => Rc::new(vec![vr.expr.clone(), r.expr.clone()]), - None => Rc::new(vec![vr.expr.clone()]), - }; - Rc::new(ExprResolveResult { - expr: make_named_expr_node( - &let_binding_name_at(texpr.clone(), env.source_indices.clone()), - Rc::new(ExprData::ExprLet), - resolved_children, - texpr.inferred.clone(), - texpr.span.clone(), - node_name_span(&texpr), - ), - diagnostics: v2_rt::concat( - vr.diagnostics.clone(), - match br.clone() { - Some(r) => r.diagnostics.clone(), - None => Rc::new(vec![]), - }, - ), - }) - } - ExprData::ExprRecordLit { - parent_enum: pe, .. - } => { - let resolved_children = Rc::new({ - let mut __result = Vec::new(); - for fi_node in texpr.children.clone().iter().cloned() { - __result.push({ - let val = match fi_node.children.clone().first().cloned() { - Some(v) => v.clone(), - None => fi_node.clone(), - }; - let vr = resolve_expr_types(&val, &env, module_name.clone()); - make_field_init_node( - &authored_name(env.clone(), fi_node.clone()), - vr.expr.clone(), - fi_node.span.clone(), - node_name_span(&fi_node), - ) - }); - } - __result - }); - let all_diags = Rc::new({ - let mut __result = Vec::new(); - for fi_node in texpr.children.clone().iter().cloned() { - __result.extend( - (*{ - let val = match fi_node.children.clone().first().cloned() { - Some(v) => v.clone(), - None => fi_node.clone(), - }; - let vr = resolve_expr_types(&val, &env, module_name.clone()); - vr.diagnostics.clone() - }) - .iter() - .cloned(), - ); - } - __result - }); - Rc::new(ExprResolveResult { - expr: make_named_expr_node( - &authored_name_at(env.source_indices.clone(), &texpr), - Rc::new(ExprData::ExprRecordLit { - parent_enum: pe.clone(), - }), - resolved_children, - texpr.inferred.clone(), - texpr.span.clone(), - node_name_span(&texpr), - ), - diagnostics: all_diags, - }) - } - ExprData::ExprListLit => { - let el_results = Rc::new({ - let mut __result = Vec::new(); - for el in texpr.children.clone().iter().cloned() { - __result.push(resolve_expr_types(&el, &env, module_name.clone())); - } - __result - }); - let resolved_children = Rc::new({ - let mut __result = Vec::new(); - for r in el_results.clone().iter().cloned() { - __result.push(r.expr.clone()); - } - __result - }); - let all_diags = Rc::new({ - let mut __result = Vec::new(); - for r in el_results.clone().iter().cloned() { - __result.extend((*r.diagnostics.clone()).iter().cloned()); - } - __result - }); - Rc::new(ExprResolveResult { - expr: make_expr_node( - Rc::new(ExprData::ExprListLit), - resolved_children, - texpr.inferred.clone(), - texpr.span.clone(), - ), - diagnostics: all_diags, - }) - } - ExprData::ExprBinOp { - op, - algebra_field: af, - .. - } => { - let ch = texpr.children.clone(); - let lr = match ch.clone().first().cloned() { - Some(l) => resolve_expr_types(&l, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), - }), - }; - let rr = match ch.clone().get(1 as usize).cloned() { - Some(r) => resolve_expr_types(&r, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), - }), - }; - Rc::new(ExprResolveResult { - expr: make_expr_node( - Rc::new(ExprData::ExprBinOp { - op: op.clone(), - algebra_field: af.clone(), - }), - Rc::new(vec![lr.expr.clone(), rr.expr.clone()]), - texpr.inferred.clone(), - texpr.span.clone(), - ), - diagnostics: v2_rt::concat(lr.diagnostics.clone(), rr.diagnostics.clone()), - }) - } - ExprData::ExprUnaryOp { op, .. } => { - let r = match texpr.children.clone().first().cloned() { - Some(o) => resolve_expr_types(&o, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), - }), - }; - Rc::new(ExprResolveResult { - expr: make_expr_node( - Rc::new(ExprData::ExprUnaryOp { op: op.clone() }), - Rc::new(vec![r.expr.clone()]), - texpr.inferred.clone(), - texpr.span.clone(), - ), - diagnostics: r.diagnostics.clone(), - }) - } - ExprData::ExprLambda => { - let lam_param_nodes = Rc::new( - texpr - .children - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ); - let r = match texpr.children.clone().first().cloned() { - Some(b) => resolve_expr_types(&b, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), - }), - }; - Rc::new(ExprResolveResult { - expr: make_expr_node( - Rc::new(ExprData::ExprLambda), - v2_rt::concat(Rc::new(vec![r.expr.clone()]), lam_param_nodes), - texpr.inferred.clone(), - texpr.span.clone(), - ), - diagnostics: r.diagnostics.clone(), - }) - } - ExprData::ExprStringInterp => { - let resolved_children = Rc::new({ - let mut __result = Vec::new(); - for part_node in texpr.children.clone().iter().cloned() { - __result.push(match (*part_node.expr_data.clone()).clone() { - ExprData::ExprLiteral { .. } => part_node.clone(), - _ => match part_node.children.clone().first().cloned() { - Some(inner) => { - let r = resolve_expr_types(&inner, &env, module_name.clone()); - make_interp_part_node(r.expr.clone(), part_node.span.clone()) - } - None => part_node.clone(), - }, - }); - } - __result - }); - let all_diags = Rc::new({ - let mut __result = Vec::new(); - for part_node in texpr.children.clone().iter().cloned() { - __result.extend( - (*match (*part_node.expr_data.clone()).clone() { - ExprData::ExprLiteral { .. } => Rc::new(vec![]), - _ => match part_node.children.clone().first().cloned() { - Some(inner) => { - let r = - resolve_expr_types(&inner, &env, module_name.clone()); - r.diagnostics.clone() - } - None => Rc::new(vec![]), - }, - }) - .iter() - .cloned(), - ); - } - __result - }); - Rc::new(ExprResolveResult { - expr: make_expr_node( - Rc::new(ExprData::ExprStringInterp), - resolved_children, - texpr.inferred.clone(), - texpr.span.clone(), - ), - diagnostics: all_diags, - }) - } - ExprData::ExprBlock => { - let stmt_results = Rc::new({ - let mut __result = Vec::new(); - for s in texpr.children.clone().iter().cloned() { - __result.push(resolve_expr_types(&s, &env, module_name.clone())); - } - __result - }); - let resolved_children = Rc::new({ - let mut __result = Vec::new(); - for r in stmt_results.clone().iter().cloned() { - __result.push(r.expr.clone()); - } - __result - }); - let all_diags = Rc::new({ - let mut __result = Vec::new(); - for r in stmt_results.clone().iter().cloned() { - __result.extend((*r.diagnostics.clone()).iter().cloned()); - } - __result - }); - Rc::new(ExprResolveResult { - expr: make_expr_node( - Rc::new(ExprData::ExprBlock), - resolved_children, - texpr.inferred.clone(), - texpr.span.clone(), - ), - diagnostics: all_diags, - }) - } - ExprData::ExprCast => { - let ch = texpr.children.clone(); - let r = match ch.clone().first().cloned() { - Some(inner) => resolve_expr_types(&inner, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), - }), - }; - let tr = match ch.clone().get(1 as usize).cloned() { - Some(target) => resolve_node(target.clone(), env.clone(), module_name.clone()), - None => Rc::new(NodeResolveResult { - resolved: unit_type(), - diagnostics: Rc::new(vec![]), - }), - }; - Rc::new(ExprResolveResult { - expr: make_expr_node( - Rc::new(ExprData::ExprCast), - Rc::new(vec![r.expr.clone(), tr.resolved.clone()]), - texpr.inferred.clone(), - texpr.span.clone(), - ), - diagnostics: v2_rt::concat(r.diagnostics.clone(), tr.diagnostics.clone()), - }) - } - ExprData::ExprForEach => { - let ch = texpr.children.clone(); - let cr = match ch.clone().first().cloned() { - Some(c) => resolve_expr_types(&c, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), - }), - }; - let br = match ch.clone().get(1 as usize).cloned() { - Some(b) => resolve_expr_types(&b, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), - }), - }; - Rc::new(ExprResolveResult { - expr: make_named_expr_node( - &foreach_variable_at(texpr.clone(), env.source_indices.clone()), - Rc::new(ExprData::ExprForEach), - Rc::new(vec![cr.expr.clone(), br.expr.clone()]), - texpr.inferred.clone(), - texpr.span.clone(), - node_name_span(&texpr), - ), - diagnostics: v2_rt::concat(cr.diagnostics.clone(), br.diagnostics.clone()), - }) - } - ExprData::ExprIndex => { - let ch = texpr.children.clone(); - let br = match ch.clone().first().cloned() { - Some(base) => resolve_expr_types(&base, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), - }), - }; - let ir = match ch.clone().get(1 as usize).cloned() { - Some(index) => resolve_expr_types(&index, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), - }), - }; - Rc::new(ExprResolveResult { - expr: make_expr_node( - Rc::new(ExprData::ExprIndex), - Rc::new(vec![br.expr.clone(), ir.expr.clone()]), - texpr.inferred.clone(), - texpr.span.clone(), - ), - diagnostics: v2_rt::concat(br.diagnostics.clone(), ir.diagnostics.clone()), - }) - } - ExprData::ExprSlice => { - let ch = texpr.children.clone(); - let br = match ch.clone().first().cloned() { - Some(base) => resolve_expr_types(&base, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), - }), - }; - let sr = match ch.clone().get(1 as usize).cloned() { - Some(start) => resolve_expr_types(&start, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), - }), - }; - let er = match ch.clone().get(2 as usize).cloned() { - Some(end_e) => resolve_expr_types(&end_e, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), - }), - }; - Rc::new(ExprResolveResult { - expr: make_expr_node( - Rc::new(ExprData::ExprSlice), - Rc::new(vec![br.expr.clone(), sr.expr.clone(), er.expr.clone()]), - texpr.inferred.clone(), - texpr.span.clone(), - ), - diagnostics: v2_rt::concat( - v2_rt::concat(br.diagnostics.clone(), sr.diagnostics.clone()), - er.diagnostics.clone(), - ), - }) - } - ExprData::ExprReturn => { - let r = match texpr.children.clone().first().cloned() { - Some(inner) => resolve_expr_types(&inner, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), - }), - }; - Rc::new(ExprResolveResult { - expr: make_expr_node( - Rc::new(ExprData::ExprReturn), - Rc::new(vec![r.expr.clone()]), - texpr.inferred.clone(), - texpr.span.clone(), - ), - diagnostics: r.diagnostics.clone(), - }) - } - ExprData::NoExprData => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), - }), - } - }) + let val = match child.children.clone().first().cloned() { + Some(v) => v.clone(), + None => child.clone(), +}; +let vr = resolve_expr_types(&val, &env, module_name.clone()); +vr.diagnostics.clone() } - -pub fn fn_type_param_names( - item: Rc, - source_indices: Rc>>, -) -> Rc> { - Rc::new({ - let mut __result = Vec::new(); - for p in Rc::new({ - let mut __result = Vec::new(); - for p in item.params.clone().iter().cloned() { - if (param_node_name_at(p.clone(), source_indices.clone()).as_str() - == authored_name_at(source_indices.clone(), ¶m_node_type_expr(&p)).as_str()) - { - __result.push(p); } - } - __result - }) - .iter() - .cloned() - { - __result.push(param_node_name_at(p.clone(), source_indices.clone())); - } - __result - }) +}).iter().cloned()); } __result }); +Rc::new(ExprResolveResult { + expr: make_named_expr_node(&expr_method_name_at(texpr.clone(), env.source_indices.clone()), Rc::new(ExprData::ExprMethodCall { + method_semantics: ms.clone(), +}), resolved_children, texpr.inferred.clone(), texpr.span.clone(), node_name_span(&texpr)), + diagnostics: all_diags, +}) +}, + ExprData::ExprMatch => { + let resolved_children = Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(texpr.children.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { __result.push({ + let idx = pair.0.clone(); +let child = pair.1.clone(); +if (idx.clone() == 0) { + { + let sr = resolve_expr_types(&child, &env, module_name.clone()); +sr.expr.clone() } - -pub fn has_duplicate_type_param_name(names: &Rc>) -> bool { - { - let mut __found = false; - for pair in Rc::new( - names - .clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - { - if { + } else { + { + let arm_ch = child.children.clone(); +let has_guard = ((arm_ch.clone().len() as i64) == 2); +if has_guard.clone() { + { + let guard_r = match arm_ch.clone().first().cloned() { + Some(g) => resolve_expr_types(&g, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: child.clone(), + diagnostics: Rc::new(vec![]), +}), +}; +let body_r = match arm_ch.clone().get(1 as usize).cloned() { + Some(b) => resolve_expr_types(&b, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: child.clone(), + diagnostics: Rc::new(vec![]), +}), +}; +make_arm_node(match child.match_pattern.clone() { + Some(p) => p.clone(), + None => Rc::new(MatchPattern::Wildcard), +}, Some(guard_r.expr.clone()), body_r.expr.clone(), child.span.clone()) +} + } else { + { + let body_r = match arm_ch.clone().first().cloned() { + Some(b) => resolve_expr_types(&b, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: child.clone(), + diagnostics: Rc::new(vec![]), +}), +}; +make_arm_node(match child.match_pattern.clone() { + Some(p) => p.clone(), + None => Rc::new(MatchPattern::Wildcard), +}, None, body_r.expr.clone(), child.span.clone()) +} + } +} + } +}); } __result }); +let all_diags = Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(texpr.children.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { __result.extend((*{ let idx = pair.0.clone(); - let s = pair.1.clone(); - { - let mut __found = false; - for other in Rc::new( - names - .clone() - .iter() - .cloned() - .skip((idx.clone() + 1) as usize) - .collect::>(), - ) - .iter() - .cloned() +let child = pair.1.clone(); +if (idx.clone() == 0) { { - if (other.clone().as_str() == s.clone().as_str()) { - __found = true; - break; + let sr = resolve_expr_types(&child, &env, module_name.clone()); +sr.diagnostics.clone() +} + } else { + { + let arm_ch = child.children.clone(); +let has_guard = ((arm_ch.clone().len() as i64) == 2); +if has_guard.clone() { + { + let guard_r = match arm_ch.clone().first().cloned() { + Some(g) => resolve_expr_types(&g, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: child.clone(), + diagnostics: Rc::new(vec![]), +}), +}; +let body_r = match arm_ch.clone().get(1 as usize).cloned() { + Some(b) => resolve_expr_types(&b, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: child.clone(), + diagnostics: Rc::new(vec![]), +}), +}; +v2_rt::concat(guard_r.diagnostics.clone(), body_r.diagnostics.clone()) +} + } else { + { + let body_r = match arm_ch.clone().first().cloned() { + Some(b) => resolve_expr_types(&b, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: child.clone(), + diagnostics: Rc::new(vec![]), +}), +}; +body_r.diagnostics.clone() +} } - } - __found +} } - } { - __found = true; - break; - } - } - __found - } +}).iter().cloned()); } __result }); +Rc::new(ExprResolveResult { + expr: make_expr_node(Rc::new(ExprData::ExprMatch), resolved_children, texpr.inferred.clone(), texpr.span.clone()), + diagnostics: all_diags, +}) +}, + ExprData::ExprIf => { + let ch = texpr.children.clone(); +let cr = match ch.clone().first().cloned() { + Some(c) => resolve_expr_types(&c, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), +}), +}; +let tr = match ch.clone().get(1 as usize).cloned() { + Some(t) => resolve_expr_types(&t, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), +}), +}; +let er = match ch.clone().get(2 as usize).cloned() { + Some(e) => Some(resolve_expr_types(&e, &env, module_name.clone())), + None => None, +}; +let resolved_children = match er.clone() { + Some(r) => Rc::new(vec![cr.expr.clone(), tr.expr.clone(), r.expr.clone()]), + None => Rc::new(vec![cr.expr.clone(), tr.expr.clone()]), +}; +Rc::new(ExprResolveResult { + expr: make_expr_node(Rc::new(ExprData::ExprIf), resolved_children, texpr.inferred.clone(), texpr.span.clone()), + diagnostics: v2_rt::concat(v2_rt::concat(cr.diagnostics.clone(), tr.diagnostics.clone()), match er.clone() { + Some(r) => r.diagnostics.clone(), + None => Rc::new(vec![]), +}), +}) +}, + ExprData::ExprLet => { + let ch = texpr.children.clone(); +let vr = match ch.clone().first().cloned() { + Some(v) => resolve_expr_types(&v, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), +}), +}; +let br = match ch.clone().get(1 as usize).cloned() { + Some(bd) => Some(resolve_expr_types(&bd, &env, module_name.clone())), + None => None, +}; +let resolved_children = match br.clone() { + Some(r) => Rc::new(vec![vr.expr.clone(), r.expr.clone()]), + None => Rc::new(vec![vr.expr.clone()]), +}; +Rc::new(ExprResolveResult { + expr: make_named_expr_node(&let_binding_name_at(texpr.clone(), env.source_indices.clone()), Rc::new(ExprData::ExprLet), resolved_children, texpr.inferred.clone(), texpr.span.clone(), node_name_span(&texpr)), + diagnostics: v2_rt::concat(vr.diagnostics.clone(), match br.clone() { + Some(r) => r.diagnostics.clone(), + None => Rc::new(vec![]), +}), +}) +}, + ExprData::ExprRecordLit { parent_enum: pe, .. } => { + let resolved_children = Rc::new({ let mut __result = Vec::new(); for fi_node in texpr.children.clone().iter().cloned() { __result.push({ + let val = match fi_node.children.clone().first().cloned() { + Some(v) => v.clone(), + None => fi_node.clone(), +}; +let vr = resolve_expr_types(&val, &env, module_name.clone()); +make_field_init_node(&authored_name(env.clone(), fi_node.clone()), vr.expr.clone(), fi_node.span.clone(), node_name_span(&fi_node)) +}); } __result }); +let all_diags = Rc::new({ let mut __result = Vec::new(); for fi_node in texpr.children.clone().iter().cloned() { __result.extend((*{ + let val = match fi_node.children.clone().first().cloned() { + Some(v) => v.clone(), + None => fi_node.clone(), +}; +let vr = resolve_expr_types(&val, &env, module_name.clone()); +vr.diagnostics.clone() +}).iter().cloned()); } __result }); +Rc::new(ExprResolveResult { + expr: make_named_expr_node(&authored_name_at(env.source_indices.clone(), &texpr), Rc::new(ExprData::ExprRecordLit { + parent_enum: pe.clone(), +}), resolved_children, texpr.inferred.clone(), texpr.span.clone(), node_name_span(&texpr)), + diagnostics: all_diags, +}) +}, + ExprData::ExprListLit => { + let el_results = Rc::new({ let mut __result = Vec::new(); for el in texpr.children.clone().iter().cloned() { __result.push(resolve_expr_types(&el, &env, module_name.clone())); } __result }); +let resolved_children = Rc::new({ let mut __result = Vec::new(); for r in el_results.clone().iter().cloned() { __result.push(r.expr.clone()); } __result }); +let all_diags = Rc::new({ let mut __result = Vec::new(); for r in el_results.clone().iter().cloned() { __result.extend((*r.diagnostics.clone()).iter().cloned()); } __result }); +Rc::new(ExprResolveResult { + expr: make_expr_node(Rc::new(ExprData::ExprListLit), resolved_children, texpr.inferred.clone(), texpr.span.clone()), + diagnostics: all_diags, +}) +}, + ExprData::ExprBinOp { op, algebra_field: af, .. } => { + let ch = texpr.children.clone(); +let lr = match ch.clone().first().cloned() { + Some(l) => resolve_expr_types(&l, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), +}), +}; +let rr = match ch.clone().get(1 as usize).cloned() { + Some(r) => resolve_expr_types(&r, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), +}), +}; +Rc::new(ExprResolveResult { + expr: make_expr_node(Rc::new(ExprData::ExprBinOp { + op: op.clone(), + algebra_field: af.clone(), +}), Rc::new(vec![lr.expr.clone(), rr.expr.clone()]), texpr.inferred.clone(), texpr.span.clone()), + diagnostics: v2_rt::concat(lr.diagnostics.clone(), rr.diagnostics.clone()), +}) +}, + ExprData::ExprUnaryOp { op, .. } => { + let r = match texpr.children.clone().first().cloned() { + Some(o) => resolve_expr_types(&o, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), +}), +}; +Rc::new(ExprResolveResult { + expr: make_expr_node(Rc::new(ExprData::ExprUnaryOp { + op: op.clone(), +}), Rc::new(vec![r.expr.clone()]), texpr.inferred.clone(), texpr.span.clone()), + diagnostics: r.diagnostics.clone(), +}) +}, + ExprData::ExprLambda => { + let lam_param_nodes = Rc::new(texpr.children.clone().iter().cloned().skip(1 as usize).collect::>()); +let r = match texpr.children.clone().first().cloned() { + Some(b) => resolve_expr_types(&b, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), +}), +}; +Rc::new(ExprResolveResult { + expr: make_expr_node(Rc::new(ExprData::ExprLambda), v2_rt::concat(Rc::new(vec![r.expr.clone()]), lam_param_nodes), texpr.inferred.clone(), texpr.span.clone()), + diagnostics: r.diagnostics.clone(), +}) +}, + ExprData::ExprStringInterp => { + let resolved_children = Rc::new({ let mut __result = Vec::new(); for part_node in texpr.children.clone().iter().cloned() { __result.push(match (*part_node.expr_data.clone()).clone() { + ExprData::ExprLiteral { .. } => part_node.clone(), + _ => match part_node.children.clone().first().cloned() { + Some(inner) => { + let r = resolve_expr_types(&inner, &env, module_name.clone()); +make_interp_part_node(r.expr.clone(), part_node.span.clone()) +}, + None => part_node.clone(), +}, +}); } __result }); +let all_diags = Rc::new({ let mut __result = Vec::new(); for part_node in texpr.children.clone().iter().cloned() { __result.extend((*match (*part_node.expr_data.clone()).clone() { + ExprData::ExprLiteral { .. } => Rc::new(vec![]), + _ => match part_node.children.clone().first().cloned() { + Some(inner) => { + let r = resolve_expr_types(&inner, &env, module_name.clone()); +r.diagnostics.clone() +}, + None => Rc::new(vec![]), +}, +}).iter().cloned()); } __result }); +Rc::new(ExprResolveResult { + expr: make_expr_node(Rc::new(ExprData::ExprStringInterp), resolved_children, texpr.inferred.clone(), texpr.span.clone()), + diagnostics: all_diags, +}) +}, + ExprData::ExprBlock => { + let stmt_results = Rc::new({ let mut __result = Vec::new(); for s in texpr.children.clone().iter().cloned() { __result.push(resolve_expr_types(&s, &env, module_name.clone())); } __result }); +let resolved_children = Rc::new({ let mut __result = Vec::new(); for r in stmt_results.clone().iter().cloned() { __result.push(r.expr.clone()); } __result }); +let all_diags = Rc::new({ let mut __result = Vec::new(); for r in stmt_results.clone().iter().cloned() { __result.extend((*r.diagnostics.clone()).iter().cloned()); } __result }); +Rc::new(ExprResolveResult { + expr: make_expr_node(Rc::new(ExprData::ExprBlock), resolved_children, texpr.inferred.clone(), texpr.span.clone()), + diagnostics: all_diags, +}) +}, + ExprData::ExprCast => { + let ch = texpr.children.clone(); +let r = match ch.clone().first().cloned() { + Some(inner) => resolve_expr_types(&inner, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), +}), +}; +let tr = match ch.clone().get(1 as usize).cloned() { + Some(target) => resolve_node(target.clone(), env.clone(), module_name.clone()), + None => Rc::new(NodeResolveResult { + resolved: unit_type(), + diagnostics: Rc::new(vec![]), +}), +}; +Rc::new(ExprResolveResult { + expr: make_expr_node(Rc::new(ExprData::ExprCast), Rc::new(vec![r.expr.clone(), tr.resolved.clone()]), texpr.inferred.clone(), texpr.span.clone()), + diagnostics: v2_rt::concat(r.diagnostics.clone(), tr.diagnostics.clone()), +}) +}, + ExprData::ExprForEach => { + let ch = texpr.children.clone(); +let cr = match ch.clone().first().cloned() { + Some(c) => resolve_expr_types(&c, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), +}), +}; +let br = match ch.clone().get(1 as usize).cloned() { + Some(b) => resolve_expr_types(&b, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), +}), +}; +Rc::new(ExprResolveResult { + expr: make_named_expr_node(&foreach_variable_at(texpr.clone(), env.source_indices.clone()), Rc::new(ExprData::ExprForEach), Rc::new(vec![cr.expr.clone(), br.expr.clone()]), texpr.inferred.clone(), texpr.span.clone(), node_name_span(&texpr)), + diagnostics: v2_rt::concat(cr.diagnostics.clone(), br.diagnostics.clone()), +}) +}, + ExprData::ExprIndex => { + let ch = texpr.children.clone(); +let br = match ch.clone().first().cloned() { + Some(base) => resolve_expr_types(&base, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), +}), +}; +let ir = match ch.clone().get(1 as usize).cloned() { + Some(index) => resolve_expr_types(&index, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), +}), +}; +Rc::new(ExprResolveResult { + expr: make_expr_node(Rc::new(ExprData::ExprIndex), Rc::new(vec![br.expr.clone(), ir.expr.clone()]), texpr.inferred.clone(), texpr.span.clone()), + diagnostics: v2_rt::concat(br.diagnostics.clone(), ir.diagnostics.clone()), +}) +}, + ExprData::ExprSlice => { + let ch = texpr.children.clone(); +let br = match ch.clone().first().cloned() { + Some(base) => resolve_expr_types(&base, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), +}), +}; +let sr = match ch.clone().get(1 as usize).cloned() { + Some(start) => resolve_expr_types(&start, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), +}), +}; +let er = match ch.clone().get(2 as usize).cloned() { + Some(end_e) => resolve_expr_types(&end_e, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), +}), +}; +Rc::new(ExprResolveResult { + expr: make_expr_node(Rc::new(ExprData::ExprSlice), Rc::new(vec![br.expr.clone(), sr.expr.clone(), er.expr.clone()]), texpr.inferred.clone(), texpr.span.clone()), + diagnostics: v2_rt::concat(v2_rt::concat(br.diagnostics.clone(), sr.diagnostics.clone()), er.diagnostics.clone()), +}) +}, + ExprData::ExprReturn => { + let r = match texpr.children.clone().first().cloned() { + Some(inner) => resolve_expr_types(&inner, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), +}), +}; +Rc::new(ExprResolveResult { + expr: make_expr_node(Rc::new(ExprData::ExprReturn), Rc::new(vec![r.expr.clone()]), texpr.inferred.clone(), texpr.span.clone()), + diagnostics: r.diagnostics.clone(), +}) +}, + ExprData::NoExprData => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), +}), +} + }) +} + +pub fn fn_type_param_names(item: Rc, source_indices: Rc>>) -> Rc> { + Rc::new({ let mut __result = Vec::new(); for p in Rc::new({ let mut __result = Vec::new(); for p in item.params.clone().iter().cloned() { if (param_node_name_at(p.clone(), source_indices.clone()).as_str() == authored_name_at(source_indices.clone(), ¶m_node_type_expr(&p)).as_str()) { __result.push(p); } } __result }).iter().cloned() { __result.push(param_node_name_at(p.clone(), source_indices.clone())); } __result }) +} + +pub fn has_duplicate_type_param_name(names: &Rc>) -> bool { + { let mut __found = false; for pair in Rc::new(names.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { if { + let idx = pair.0.clone(); +let s = pair.1.clone(); +{ let mut __found = false; for other in Rc::new(names.clone().iter().cloned().skip((idx.clone() + 1) as usize).collect::>()).iter().cloned() { if (other.clone().as_str() == s.clone().as_str()) { __found = true; break; } } __found } +} { __found = true; break; } } __found } } -pub fn resolve_item_types( - item: &Rc, - env: &Rc, - module_name: &String, -) -> Rc { +pub fn resolve_item_types(item: &Rc, env: &Rc, module_name: &String) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - let tp_names = fn_type_param_names(item.clone(), env.source_indices.clone()); - let collision_diags = if has_duplicate_type_param_name(&tp_names) { - Rc::new(vec![make_error_node(Rc::new(CompilerDiagnostic::InternalError { + { + let tp_names = fn_type_param_names(item.clone(), env.source_indices.clone()); +let collision_diags = if has_duplicate_type_param_name(&tp_names) { + Rc::new(vec![make_error_node(Rc::new(CompilerDiagnostic::InternalError { message: v2_rt::concat(v2_rt::concat("type param name collides with a value param in fn '".to_string(), authored_name_at(env.source_indices.clone(), &item)), "' — a value param shares its name with a declared type param (e.g., `fn f(T: T)`). Rename the value param, or dissolve via ParamKind / params-slot partition.".to_string()), span: item.span.clone(), }), module_name.clone())]) - } else { - Rc::new(vec![]) - }; - let env = tp_names.clone().iter().cloned().fold( - env.clone(), - |e: Rc, tp_name: String| { - Rc::new(TypeEnv { - bindings: v2_rt::rc_map_insert( - e.bindings.clone(), - intern(&e.intern_table.clone(), &tp_name).id.clone(), - Rc::new(TypeBinding { - name: tp_name.clone(), - resolved: Rc::new(Node { - name: tp_name.clone(), - span: kernel_span(&tp_name), - ident_span: Some(kernel_span(&tp_name)), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::TypeVariable { - id: tp_name.clone(), - })), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }), - provenance: Rc::new(SubValueRelation::SubValueUnknown), - }), - ), - recursive_types: e.recursive_types.clone(), - recursive_type_set: e.recursive_type_set.clone(), - inductive_fields: e.inductive_fields.clone(), - source_indices: e.source_indices.clone(), - intern_table: e.intern_table.clone(), - }) - }, - ); - let param_results = Rc::new({ - let mut __result = Vec::new(); - for p in item.params.clone().iter().cloned() { - __result.push(resolve_param(&p, &env, &module_name)); - } - __result - }); - let resolved_params = Rc::new({ - let mut __result = Vec::new(); - for pr in param_results.clone().iter().cloned() { - __result.push(pr.param.clone()); - } - __result - }); - let param_diags = Rc::new({ - let mut __result = Vec::new(); - for pr in param_results.clone().iter().cloned() { - __result.extend((*pr.diagnostics.clone()).iter().cloned()); - } - __result - }); - let ret_result = - resolve_optional_node(&item.inferred.clone(), env.clone(), module_name.clone()); - let ret_resolved = ret_result.resolved.clone(); - let ret_diags = ret_result.diagnostics.clone(); - let resolved_ret = if (item.inferred.clone() == None) { - None - } else { - Some(Rc::new(InferredNode::Resolved { node: ret_resolved })) - }; - let use_results = Rc::new({ - let mut __result = Vec::new(); - for u in item.uses.clone().iter().cloned() { - __result.push(resolve_resource_use(&u, &env, module_name.clone())); - } - __result - }); - let resolved_uses = Rc::new({ - let mut __result = Vec::new(); - for ur in use_results.clone().iter().cloned() { - __result.push(ur.resource_use.clone()); - } - __result - }); - let use_diags = Rc::new({ - let mut __result = Vec::new(); - for ur in use_results.clone().iter().cloned() { - __result.extend((*ur.diagnostics.clone()).iter().cloned()); - } - __result - }); - let body_resolved = if (item.body.clone() == None) { - Rc::new(ExprResolveResult { - expr: item.clone(), - diagnostics: Rc::new(vec![]), - }) - } else { - resolve_expr_types( - &item.body.clone().clone().unwrap(), - &env, - module_name.clone(), - ) - }; - let resolved_body = if (item.body.clone() == None) { - None - } else { - Some(body_resolved.expr.clone()) - }; - let body_diags = if (item.body.clone() == None) { - Rc::new(vec![]) - } else { - body_resolved.diagnostics.clone() - }; - let anno_resolved = if (item.type_annotation.clone() == None) { - Rc::new(NodeResolveResult { - resolved: unit_type(), - diagnostics: Rc::new(vec![]), - }) - } else { - resolve_node( - item.type_annotation.clone().clone().unwrap(), - env.clone(), - module_name.clone(), - ) - }; - let resolved_anno = if (item.type_annotation.clone() == None) { - None - } else { - Some(anno_resolved.resolved.clone()) - }; - let anno_diags = anno_resolved.diagnostics.clone(); - let transport_resolved = if (item.transport.clone() == None) { - Rc::new(TransportResolveResult { - transport: local_transport_node(no_span()), - diagnostics: Rc::new(vec![]), - }) - } else { - resolve_transport_binding(&item.transport.clone().clone().unwrap(), &env, &module_name) - }; - let resolved_transport = if (item.transport.clone() == None) { - None - } else { - Some(transport_resolved.transport.clone()) - }; - let transport_diags = transport_resolved.diagnostics.clone(); - let prop_results = Rc::new({ - let mut __result = Vec::new(); - for p in item.properties.clone().iter().cloned() { - __result.push(resolve_field_init(&p, &env, module_name.clone())); - } - __result - }); - let resolved_props = Rc::new({ - let mut __result = Vec::new(); - for pr in prop_results.clone().iter().cloned() { - __result.push(pr.field_init.clone()); - } - __result - }); - let prop_diags = Rc::new({ - let mut __result = Vec::new(); - for pr in prop_results.clone().iter().cloned() { - __result.extend((*pr.diagnostics.clone()).iter().cloned()); - } - __result - }); - let child_results = Rc::new({ - let mut __result = Vec::new(); - for child in item.children.clone().iter().cloned() { - __result.push(resolve_item_types(&child, &env, &module_name)); - } - __result - }); - let resolved_children = Rc::new({ - let mut __result = Vec::new(); - for cr in child_results.clone().iter().cloned() { - __result.push(cr.item.clone()); - } - __result - }); - let child_diags = Rc::new({ - let mut __result = Vec::new(); - for cr in child_results.clone().iter().cloned() { - __result.extend((*cr.diagnostics.clone()).iter().cloned()); - } - __result - }); - Rc::new(ItemResult { - item: Rc::new(Node { - name: item.name.clone(), - span: item.span.clone(), - ident_span: item.ident_span.clone(), - children: resolved_children, - params: resolved_params, - inferred: resolved_ret, - return_cardinality: item.return_cardinality.clone(), - uses: resolved_uses, - body: resolved_body, - connective: item.connective.clone(), - transport: resolved_transport, - properties: resolved_props, - type_annotation: resolved_anno, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }), - diagnostics: v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(collision_diags, param_diags), - ret_diags, - ), - use_diags, - ), - body_diags, - ), - anno_diags, - ), - transport_diags, - ), - prop_diags, - ), - child_diags, - ), - }) + } else { + Rc::new(vec![]) + }; +let env = tp_names.clone().iter().cloned().fold(env.clone(), |e: Rc, tp_name: String| Rc::new(TypeEnv { + bindings: v2_rt::rc_map_insert(e.bindings.clone(), intern(&e.intern_table.clone(), &tp_name).id.clone(), Rc::new(TypeBinding { + name: tp_name.clone(), + resolved: Rc::new(Node { + name: tp_name.clone(), + span: kernel_span(&tp_name), + ident_span: Some(kernel_span(&tp_name)), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::TypeVariable { + id: tp_name.clone(), +})), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}), + provenance: Rc::new(SubValueRelation::SubValueUnknown), +})), + recursive_types: e.recursive_types.clone(), + recursive_type_set: e.recursive_type_set.clone(), + inductive_fields: e.inductive_fields.clone(), + source_indices: e.source_indices.clone(), + intern_table: e.intern_table.clone(), +})); +let param_results = Rc::new({ let mut __result = Vec::new(); for p in item.params.clone().iter().cloned() { __result.push(resolve_param(&p, &env, &module_name)); } __result }); +let resolved_params = Rc::new({ let mut __result = Vec::new(); for pr in param_results.clone().iter().cloned() { __result.push(pr.param.clone()); } __result }); +let param_diags = Rc::new({ let mut __result = Vec::new(); for pr in param_results.clone().iter().cloned() { __result.extend((*pr.diagnostics.clone()).iter().cloned()); } __result }); +let ret_result = resolve_optional_node(&item.inferred.clone(), env.clone(), module_name.clone()); +let ret_resolved = ret_result.resolved.clone(); +let ret_diags = ret_result.diagnostics.clone(); +let resolved_ret = if (item.inferred.clone() == None) { + None + } else { + Some(Rc::new(InferredNode::Resolved { + node: ret_resolved, +})) + }; +let use_results = Rc::new({ let mut __result = Vec::new(); for u in item.uses.clone().iter().cloned() { __result.push(resolve_resource_use(&u, &env, module_name.clone())); } __result }); +let resolved_uses = Rc::new({ let mut __result = Vec::new(); for ur in use_results.clone().iter().cloned() { __result.push(ur.resource_use.clone()); } __result }); +let use_diags = Rc::new({ let mut __result = Vec::new(); for ur in use_results.clone().iter().cloned() { __result.extend((*ur.diagnostics.clone()).iter().cloned()); } __result }); +let body_resolved = if (item.body.clone() == None) { + Rc::new(ExprResolveResult { + expr: item.clone(), + diagnostics: Rc::new(vec![]), +}) + } else { + resolve_expr_types(&item.body.clone().clone().unwrap(), &env, module_name.clone()) + }; +let resolved_body = if (item.body.clone() == None) { + None + } else { + Some(body_resolved.expr.clone()) + }; +let body_diags = if (item.body.clone() == None) { + Rc::new(vec![]) + } else { + body_resolved.diagnostics.clone() + }; +let anno_resolved = if (item.type_annotation.clone() == None) { + Rc::new(NodeResolveResult { + resolved: unit_type(), + diagnostics: Rc::new(vec![]), +}) + } else { + resolve_node(item.type_annotation.clone().clone().unwrap(), env.clone(), module_name.clone()) + }; +let resolved_anno = if (item.type_annotation.clone() == None) { + None + } else { + Some(anno_resolved.resolved.clone()) + }; +let anno_diags = anno_resolved.diagnostics.clone(); +let transport_resolved = if (item.transport.clone() == None) { + Rc::new(TransportResolveResult { + transport: local_transport_node(no_span()), + diagnostics: Rc::new(vec![]), +}) + } else { + resolve_transport_binding(&item.transport.clone().clone().unwrap(), &env, &module_name) + }; +let resolved_transport = if (item.transport.clone() == None) { + None + } else { + Some(transport_resolved.transport.clone()) + }; +let transport_diags = transport_resolved.diagnostics.clone(); +let prop_results = Rc::new({ let mut __result = Vec::new(); for p in item.properties.clone().iter().cloned() { __result.push(resolve_field_init(&p, &env, module_name.clone())); } __result }); +let resolved_props = Rc::new({ let mut __result = Vec::new(); for pr in prop_results.clone().iter().cloned() { __result.push(pr.field_init.clone()); } __result }); +let prop_diags = Rc::new({ let mut __result = Vec::new(); for pr in prop_results.clone().iter().cloned() { __result.extend((*pr.diagnostics.clone()).iter().cloned()); } __result }); +let child_results = Rc::new({ let mut __result = Vec::new(); for child in item.children.clone().iter().cloned() { __result.push(resolve_item_types(&child, &env, &module_name)); } __result }); +let resolved_children = Rc::new({ let mut __result = Vec::new(); for cr in child_results.clone().iter().cloned() { __result.push(cr.item.clone()); } __result }); +let child_diags = Rc::new({ let mut __result = Vec::new(); for cr in child_results.clone().iter().cloned() { __result.extend((*cr.diagnostics.clone()).iter().cloned()); } __result }); +Rc::new(ItemResult { + item: Rc::new(Node { + name: item.name.clone(), + span: item.span.clone(), + ident_span: item.ident_span.clone(), + children: resolved_children, + params: resolved_params, + inferred: resolved_ret, + return_cardinality: item.return_cardinality.clone(), + uses: resolved_uses, + body: resolved_body, + connective: item.connective.clone(), + transport: resolved_transport, + properties: resolved_props, + type_annotation: resolved_anno, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}), + diagnostics: v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(collision_diags, param_diags), ret_diags), use_diags), body_diags), anno_diags), transport_diags), prop_diags), child_diags), +}) +} }) } diff --git a/src/v2/stage0/src/v2_compiler_infer_service.rs b/src/v2/stage0/src/v2_compiler_infer_service.rs index 8dfabfec682..5049a189788 100644 --- a/src/v2/stage0/src/v2_compiler_infer_service.rs +++ b/src/v2/stage0/src/v2_compiler_infer_service.rs @@ -1,26 +1,20 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.infer_service -pub use crate::std_types::SourceSpan; -use crate::v2_compiler_infer_items::ItemKind::FuncItem; -pub use crate::v2_compiler_infer_items::{inferred_to_outputs, ItemInfo, ItemKind, TypedModule}; -pub use crate::v2_compiler_infer_types::{emit_map_has, nominal_type_ref}; -use crate::v2_rt; -use crate::v2_std_core::Cardinality::Required; -use crate::v2_std_core::Connective::{Conj, NoConnective}; -use crate::v2_std_core::ExprData::{ - ExprCall, ExprFieldAccess, ExprMethodCall, ExprVar, NoExprData, -}; -use crate::v2_std_core::InferredNode::Resolved; -pub use crate::v2_std_core::{ - authored_name_at, expr_call_func_at, expr_var_name_at, field_access_base, - field_access_field_at, method_receiver, no_span, param_node_type_expr, unit_type, Cardinality, - Connective, ExprData, InferredNode, NewlineIndex, Node, -}; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::std_types::{SourceSpan}; +pub use crate::v2_std_core::{Node, Connective, ExprData, Cardinality, InferredNode, NewlineIndex, no_span, unit_type, expr_var_name_at, expr_call_func_at, field_access_field_at, field_access_base, method_receiver, param_node_type_expr, authored_name_at}; +use crate::v2_std_core::Connective::{Conj, NoConnective}; +use crate::v2_std_core::ExprData::{NoExprData, ExprFieldAccess, ExprMethodCall, ExprCall, ExprVar}; +use crate::v2_std_core::Cardinality::{Required}; +use crate::v2_std_core::InferredNode::{Resolved}; +pub use crate::v2_compiler_infer_types::{emit_map_has, nominal_type_ref}; +pub use crate::v2_compiler_infer_items::{ItemInfo, ItemKind, TypedModule, inferred_to_outputs}; +use crate::v2_compiler_infer_items::ItemKind::{FuncItem}; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] pub struct UniqueAccum { @@ -41,165 +35,114 @@ pub struct ServiceMethodResult { pub op_params: Rc>>, } -pub fn is_typed_service_call_receiver( - receiver: &Rc, - source_indices: Rc>>, -) -> bool { +pub fn is_typed_service_call_receiver(receiver: &Rc, source_indices: Rc>>) -> bool { match (*receiver.expr_data.clone()).clone() { - ExprData::ExprFieldAccess { .. } => { - let f = field_access_field_at(receiver.clone(), source_indices); - let b = field_access_base(receiver.clone()); - match (*b.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - match Rc::new(f.chars().map(|c| c as i64).collect::>()) - .first() - .cloned() - { - Some(ch) => ((ch.clone() >= 65) && (ch.clone() <= 90)), - None => false, - } - } - _ => false, - } - } - _ => false, - } + ExprData::ExprFieldAccess { .. } => { + let f = field_access_field_at(receiver.clone(), source_indices); +let b = field_access_base(receiver.clone()); +match (*b.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => match Rc::new(f.chars().map(|c| c as i64).collect::>()).first().cloned() { + Some(ch) => ((ch.clone() >= 65) && (ch.clone() <= 90)), + None => false, +}, + _ => false, +} +}, + _ => false, +} } -pub fn extract_typed_service_name( - receiver: &Rc, - source_indices: &Rc>>, -) -> Option { +pub fn extract_typed_service_name(receiver: &Rc, source_indices: &Rc>>) -> Option { match (*receiver.expr_data.clone()).clone() { - ExprData::ExprFieldAccess { .. } => { - let f = field_access_field_at(receiver.clone(), source_indices.clone()); - let b = field_access_base(receiver.clone()); - match (*b.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let ns = expr_var_name_at(b.clone(), source_indices.clone()); - Some(v2_rt::concat(v2_rt::concat(ns, ".".to_string()), f)) - } - _ => None, - } - } - _ => None, - } + ExprData::ExprFieldAccess { .. } => { + let f = field_access_field_at(receiver.clone(), source_indices.clone()); +let b = field_access_base(receiver.clone()); +match (*b.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let ns = expr_var_name_at(b.clone(), source_indices.clone()); +Some(v2_rt::concat(v2_rt::concat(ns, ".".to_string()), f)) +}, + _ => None, +} +}, + _ => None, +} } -pub fn collect_typed_service_calls( - texpr: Rc, - source_indices: Rc>>, -) -> Rc> { +pub fn collect_typed_service_calls(texpr: Rc, source_indices: Rc>>) -> Rc> { { - let result = collect_typed_service_calls_into( - &texpr, - &Rc::new(UniqueAccum { - seen: v2_rt::rc_empty_map::(), - result: Rc::new(vec![]), - }), - &source_indices, - ); - result.result.clone() - } + let result = collect_typed_service_calls_into(&texpr, &Rc::new(UniqueAccum { + seen: v2_rt::rc_empty_map::(), + result: Rc::new(vec![]), +}), &source_indices); +result.result.clone() +} } -pub fn collect_typed_service_calls_into( - texpr: &Rc, - acc: &Rc, - source_indices: &Rc>>, -) -> Rc { +pub fn collect_typed_service_calls_into(texpr: &Rc, acc: &Rc, source_indices: &Rc>>) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - let this_acc = match (*texpr.expr_data.clone()).clone() { - ExprData::ExprMethodCall { .. } => { + { + let this_acc = match (*texpr.expr_data.clone()).clone() { + ExprData::ExprMethodCall { .. } => { let r = method_receiver(texpr.clone()); - if is_typed_service_call_receiver(&r, source_indices.clone()) { +if is_typed_service_call_receiver(&r, source_indices.clone()) { match extract_typed_service_name(&r, &source_indices) { - Some(service_name) => { - if emit_map_has(acc.seen.clone(), service_name.clone()) { - acc.clone() - } else { - Rc::new(UniqueAccum { - seen: v2_rt::rc_map_insert( - acc.seen.clone(), - service_name.clone(), - true, - ), - result: v2_rt::rc_list_push( - acc.result.clone(), - service_name.clone(), - ), - }) - } - } - None => acc.clone(), - } + Some(service_name) => if emit_map_has(acc.seen.clone(), service_name.clone()) { + acc.clone() + } else { + Rc::new(UniqueAccum { + seen: v2_rt::rc_map_insert(acc.seen.clone(), service_name.clone(), true), + result: v2_rt::rc_list_push(acc.result.clone(), service_name.clone()), +}) + }, + None => acc.clone(), +} } else { acc.clone() } - } - _ => acc.clone(), - }; - let result = texpr.children.clone().iter().cloned().fold( - this_acc.clone(), - |a: Rc, child: Rc| { - collect_typed_service_calls_into(&child, &a, &source_indices) - }, - ); - result +}, + _ => acc.clone(), +}; +let result = texpr.children.clone().iter().cloned().fold(this_acc.clone(), |a: Rc, child: Rc| collect_typed_service_calls_into(&child, &a, &source_indices)); +result +} }) } -pub fn collect_called_func_names_into( - texpr: &Rc, - acc: &Rc, - source_indices: &Rc>>, -) -> Rc { +pub fn collect_called_func_names_into(texpr: &Rc, acc: &Rc, source_indices: &Rc>>) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - let this_acc = match (*texpr.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { + { + let this_acc = match (*texpr.expr_data.clone()).clone() { + ExprData::ExprCall { .. } => { let f = expr_call_func_at(texpr.clone(), source_indices.clone()); - if emit_map_has(acc.seen.clone(), f.clone()) { +if emit_map_has(acc.seen.clone(), f.clone()) { acc.clone() } else { Rc::new(UniqueAccum { - seen: v2_rt::rc_map_insert(acc.seen.clone(), f.clone(), true), - result: v2_rt::rc_list_push(acc.result.clone(), f.clone()), - }) + seen: v2_rt::rc_map_insert(acc.seen.clone(), f.clone(), true), + result: v2_rt::rc_list_push(acc.result.clone(), f.clone()), +}) } - } - _ => acc.clone(), - }; - let result = texpr.children.clone().iter().cloned().fold( - this_acc.clone(), - |a: Rc, child: Rc| { - collect_called_func_names_into(&child, &a, &source_indices) - }, - ); - result +}, + _ => acc.clone(), +}; +let result = texpr.children.clone().iter().cloned().fold(this_acc.clone(), |a: Rc, child: Rc| collect_called_func_names_into(&child, &a, &source_indices)); +result +} }) } -pub fn collect_called_func_names( - texpr: Rc, - source_indices: Rc>>, -) -> Rc> { +pub fn collect_called_func_names(texpr: Rc, source_indices: Rc>>) -> Rc> { { - let result = collect_called_func_names_into( - &texpr, - &Rc::new(UniqueAccum { - seen: v2_rt::rc_empty_map::(), - result: Rc::new(vec![]), - }), - &source_indices, - ); - result.result.clone() - } + let result = collect_called_func_names_into(&texpr, &Rc::new(UniqueAccum { + seen: v2_rt::rc_empty_map::(), + result: Rc::new(vec![]), +}), &source_indices); +result.result.clone() +} } -pub fn expand_transitive_services_once( - modules: Rc>>, - registry: Rc>>, -) -> Rc>> { +pub fn expand_transitive_services_once(modules: Rc>>, registry: Rc>>) -> Rc>> { modules.iter().cloned().fold(registry.clone(), |reg: Rc>>, m: Rc| m.items.clone().iter().cloned().fold(reg, |reg2: Rc>>, item: Rc| { let item_name = authored_name_at(m.type_env.clone().source_indices.clone(), &item); match v2_rt::map_get(®2, item_name.clone()) { @@ -243,172 +186,117 @@ if same_count.clone() { } pub fn total_service_count(registry: Rc>>) -> i64 { - Rc::new(v2_rt::map_values(®istry)) - .iter() - .cloned() - .fold(0, |acc: i64, info: Rc| { - (acc + (info.service_names.clone().len() as i64)) - }) + Rc::new(v2_rt::map_values(®istry)).iter().cloned().fold(0, |acc: i64, info: Rc| (acc + (info.service_names.clone().len() as i64))) } -pub fn expand_transitive_services( - mut modules: Rc>>, - mut registry: Rc>>, - mut remaining_passes: i64, -) -> Rc>> { +pub fn expand_transitive_services(mut modules: Rc>>, mut registry: Rc>>, mut remaining_passes: i64) -> Rc>> { loop { if (remaining_passes.clone() <= 0) { break registry.clone(); - } else { +} else { let before = total_service_count(registry.clone()); - let next = expand_transitive_services_once(modules.clone(), registry.clone()); - let after = total_service_count(next.clone()); - if (before == after) { +let next = expand_transitive_services_once(modules.clone(), registry.clone()); +let after = total_service_count(next.clone()); +if (before == after) { break registry.clone(); - } else { +} else { { let __tco_0 = next.clone(); - let __tco_1 = (remaining_passes - 1); - registry = __tco_0; - remaining_passes = __tco_1; - continue; - } - } - } - } +let __tco_1 = (remaining_passes - 1); +registry = __tco_0; +remaining_passes = __tco_1; +continue; +} +} +} +} } -pub fn check_service_field_access_node( - base_type: &Rc, - field: String, - service_registry: Rc>>>>, - source_indices: Rc>>, -) -> Option> { - if ((base_type.connective.clone() == Connective::NoConnective) - && ((base_type.children.clone().len() as i64) == 0)) - { +pub fn check_service_field_access_node(base_type: &Rc, field: String, service_registry: Rc>>>>, source_indices: Rc>>) -> Option> { + if ((base_type.connective.clone() == Connective::NoConnective) && ((base_type.children.clone().len() as i64) == 0)) { { - let path = v2_rt::concat( - v2_rt::concat( - authored_name_at(source_indices, &base_type), - ".".to_string(), - ), - field, - ); - match v2_rt::map_get(&service_registry, path.clone()) { - Some(_) => Some(nominal_type_ref(&path)), - None => None, - } - } + let path = v2_rt::concat(v2_rt::concat(authored_name_at(source_indices, &base_type), ".".to_string()), field); +match v2_rt::map_get(&service_registry, path.clone()) { + Some(_) => Some(nominal_type_ref(&path)), + None => None, +} +} } else { None } } -pub fn check_service_method_call_node( - receiver_type: &Rc, - method: String, - service_registry: Rc>>>>, - source_indices: Rc>>, -) -> Option> { - if ((receiver_type.connective.clone() == Connective::NoConnective) - && ((receiver_type.children.clone().len() as i64) == 0)) - { - match v2_rt::map_get( - &service_registry, - authored_name_at(source_indices, &receiver_type), - ) { - Some(ops) => { - let matching = Rc::new({ - let mut __result = Vec::new(); - for op in ops.clone().iter().cloned() { - if (op.name.clone().as_str() == method.clone().as_str()) { - __result.push(op); - } - } - __result - }); - match matching.first().cloned() { - Some(op) => { - if ((op.outputs.clone().len() as i64) == 0) { - Some(Rc::new(ServiceMethodResult { - result_type: unit_type(), - op_params: op.params.clone(), - })) - } else { - Some(Rc::new(ServiceMethodResult { - result_type: Rc::new(Node { - name: "".to_string(), - span: no_span(), - ident_span: None, - children: Rc::new({ - let mut __result = Vec::new(); - for f in op.outputs.clone().iter().cloned() { - __result.push(Rc::new(Node { - name: f.name.clone(), - span: f.span.clone(), - ident_span: f.ident_span.clone(), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::Resolved { - node: param_node_type_expr(&f), - })), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - })); - } - __result - }), - connective: Connective::Conj, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }), - op_params: op.params.clone(), - })) - } - } - None => None, - } - } - None => None, - } +pub fn check_service_method_call_node(receiver_type: &Rc, method: String, service_registry: Rc>>>>, source_indices: Rc>>) -> Option> { + if ((receiver_type.connective.clone() == Connective::NoConnective) && ((receiver_type.children.clone().len() as i64) == 0)) { + match v2_rt::map_get(&service_registry, authored_name_at(source_indices, &receiver_type)) { + Some(ops) => { + let matching = Rc::new({ let mut __result = Vec::new(); for op in ops.clone().iter().cloned() { if (op.name.clone().as_str() == method.clone().as_str()) { __result.push(op); } } __result }); +match matching.first().cloned() { + Some(op) => if ((op.outputs.clone().len() as i64) == 0) { + Some(Rc::new(ServiceMethodResult { + result_type: unit_type(), + op_params: op.params.clone(), +})) + } else { + Some(Rc::new(ServiceMethodResult { + result_type: Rc::new(Node { + name: "".to_string(), + span: no_span(), + ident_span: None, + children: Rc::new({ let mut __result = Vec::new(); for f in op.outputs.clone().iter().cloned() { __result.push(Rc::new(Node { + name: f.name.clone(), + span: f.span.clone(), + ident_span: f.ident_span.clone(), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::Resolved { + node: param_node_type_expr(&f), +})), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +})); } __result }), + connective: Connective::Conj, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}), + op_params: op.params.clone(), +})) + }, + None => None, +} +}, + None => None, +} } else { None } } -pub fn service_op_entry( - child: &Rc, - source_indices: &Rc>>, -) -> Rc { +pub fn service_op_entry(child: &Rc, source_indices: &Rc>>) -> Rc { Rc::new(OpEntry { - name: authored_name_at(source_indices.clone(), &child), - outputs: inferred_to_outputs( - &child.inferred.clone(), - child.span.clone(), - source_indices.clone(), - ), - params: child.params.clone(), - }) + name: authored_name_at(source_indices.clone(), &child), + outputs: inferred_to_outputs(&child.inferred.clone(), child.span.clone(), source_indices.clone()), + params: child.params.clone(), +}) } diff --git a/src/v2/stage0/src/v2_compiler_infer_sigs.rs b/src/v2/stage0/src/v2_compiler_infer_sigs.rs index 31d6c47dcbe..5cdd9f3214c 100644 --- a/src/v2/stage0/src/v2_compiler_infer_sigs.rs +++ b/src/v2/stage0/src/v2_compiler_infer_sigs.rs @@ -1,20 +1,17 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.infer_sigs -pub use crate::std_induction::SubValueRelation; -use crate::std_induction::SubValueRelation::*; -pub use crate::v2_compiler_infer_types::emit_map_has; -use crate::v2_rt; -use crate::v2_std_core::CompilerDiagnostic::MissingAnnotation; -use crate::v2_std_core::ExprData::ExprCall; -pub use crate::v2_std_core::{ - authored_name_at, expr_call_func_at, make_error_node, no_span, CompilerDiagnostic, - DeclaredFuncSig, ErrorNode, ExprData, NewlineIndex, Node, -}; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::v2_std_core::{Node, ExprData, expr_call_func_at, ErrorNode, make_error_node, no_span, DeclaredFuncSig, NewlineIndex, authored_name_at, CompilerDiagnostic}; +use crate::v2_std_core::ExprData::{ExprCall}; +use crate::v2_std_core::CompilerDiagnostic::{MissingAnnotation}; +pub use crate::v2_compiler_infer_types::{emit_map_has}; +pub use crate::std_induction::{SubValueRelation}; +use crate::std_induction::SubValueRelation::*; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] pub struct ResolvedFuncSig { @@ -23,8 +20,7 @@ pub struct ResolvedFuncSig { pub inferred: Rc, pub is_async: bool, pub output_provenance: Rc>>>>, - pub variant_provenance: - Rc>>>>>>, + pub variant_provenance: Rc>>>>>>, } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -50,457 +46,191 @@ pub struct CallEdge { pub callee: String, } -pub fn collect_func_call_edges( - items: Rc>>, - local_func_set: Rc>, - source_indices: Rc>>, -) -> Rc>> { - Rc::new({ - let mut __result = Vec::new(); - for item in items.iter().cloned() { - __result.extend( - (*if (((item.params.clone().len() as i64) > 0) && (item.body.clone() != None)) { - collect_calls_in_expr( - &authored_name_at(source_indices.clone(), &item), - &item.body.clone().clone().unwrap(), - &local_func_set, - &source_indices, - ) - } else { - Rc::new(vec![]) - }) - .iter() - .cloned(), - ); - } - __result - }) +pub fn collect_func_call_edges(items: Rc>>, local_func_set: Rc>, source_indices: Rc>>) -> Rc>> { + Rc::new({ let mut __result = Vec::new(); for item in items.iter().cloned() { __result.extend((*if (((item.params.clone().len() as i64) > 0) && (item.body.clone() != None)) { + collect_calls_in_expr(&authored_name_at(source_indices.clone(), &item), &item.body.clone().clone().unwrap(), &local_func_set, &source_indices) + } else { + Rc::new(vec![]) + }).iter().cloned()); } __result }) } -pub fn collect_calls_in_expr( - caller: &String, - texpr: &Rc, - local_func_set: &Rc>, - source_indices: &Rc>>, -) -> Rc>> { +pub fn collect_calls_in_expr(caller: &String, texpr: &Rc, local_func_set: &Rc>, source_indices: &Rc>>) -> Rc>> { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - let this_edges = match (*texpr.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { + { + let this_edges = match (*texpr.expr_data.clone()).clone() { + ExprData::ExprCall { .. } => { let f = expr_call_func_at(texpr.clone(), source_indices.clone()); - if emit_map_has(local_func_set.clone(), f.clone()) { +if emit_map_has(local_func_set.clone(), f.clone()) { Rc::new(vec![Rc::new(CallEdge { - caller: caller.clone(), - callee: f.clone(), - })]) + caller: caller.clone(), + callee: f.clone(), +})]) } else { Rc::new(vec![]) } - } - _ => Rc::new(vec![]), - }; - let child_edges = Rc::new({ - let mut __result = Vec::new(); - for child in texpr.children.clone().iter().cloned() { - __result.extend( - (*collect_calls_in_expr(&caller, &child, &local_func_set, &source_indices)) - .iter() - .cloned(), - ); - } - __result - }); - let result = v2_rt::concat(this_edges, child_edges); - result +}, + _ => Rc::new(vec![]), +}; +let child_edges = Rc::new({ let mut __result = Vec::new(); for child in texpr.children.clone().iter().cloned() { __result.extend((*collect_calls_in_expr(&caller, &child, &local_func_set, &source_indices)).iter().cloned()); } __result }); +let result = v2_rt::concat(this_edges, child_edges); +result +} }) } -pub fn func_reaches_self( - root: String, - current: &String, - call_edges: &Rc>>, - visited: &Rc>, -) -> bool { +pub fn func_reaches_self(root: String, current: &String, call_edges: &Rc>>, visited: &Rc>) -> bool { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { if emit_map_has(visited.clone(), current.clone()) { false } else { { let next_visited = v2_rt::rc_map_insert(visited.clone(), current.clone(), true); - let callees = Rc::new({ - let mut __result = Vec::new(); - for e in Rc::new({ - let mut __result = Vec::new(); - for e in call_edges.clone().iter().cloned() { - if (e.caller.clone().as_str() == current.clone().as_str()) { - __result.push(e); - } - } - __result - }) - .iter() - .cloned() - { - __result.push(e.callee.clone()); - } - __result - }); - { - let mut __found = false; - for c in callees.iter().cloned() { - if if (c.clone().as_str() == root.clone().as_str()) { - true - } else { - func_reaches_self(root.clone(), &c, &call_edges, &next_visited) - } { - __found = true; - break; - } - } - __found - } - } +let callees = Rc::new({ let mut __result = Vec::new(); for e in Rc::new({ let mut __result = Vec::new(); for e in call_edges.clone().iter().cloned() { if (e.caller.clone().as_str() == current.clone().as_str()) { __result.push(e); } } __result }).iter().cloned() { __result.push(e.callee.clone()); } __result }); +{ let mut __found = false; for c in callees.iter().cloned() { if if (c.clone().as_str() == root.clone().as_str()) { + true + } else { + func_reaches_self(root.clone(), &c, &call_edges, &next_visited) + } { __found = true; break; } } __found } +} } }) } pub fn build_name_set(names: Rc>) -> Rc> { - names.iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, name: String| { - v2_rt::rc_map_insert(acc, name.clone(), true) - }, - ) + names.iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, name: String| v2_rt::rc_map_insert(acc, name.clone(), true)) } -pub fn collect_parent_resolved_sigs( - declared_sigs: Rc>>, - local_func_set: Rc>, -) -> Rc>> { - Rc::new(v2_rt::map_values(&declared_sigs)) - .iter() - .cloned() - .fold( - v2_rt::rc_empty_map::>(), - |acc: Rc>>, dsig: Rc| { - if emit_map_has(local_func_set.clone(), dsig.name.clone()) { - acc.clone() - } else { - if (dsig.inferred.clone() != None) { - v2_rt::rc_map_insert( - acc.clone(), - dsig.name.clone(), - declared_to_resolved(&dsig), - ) - } else { - acc.clone() - } - } - }, - ) +pub fn collect_parent_resolved_sigs(declared_sigs: Rc>>, local_func_set: Rc>) -> Rc>> { + Rc::new(v2_rt::map_values(&declared_sigs)).iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, dsig: Rc| if emit_map_has(local_func_set.clone(), dsig.name.clone()) { + acc.clone() + } else { + if (dsig.inferred.clone() != None) { + v2_rt::rc_map_insert(acc.clone(), dsig.name.clone(), declared_to_resolved(&dsig)) + } else { + acc.clone() + } + }) } pub fn declared_to_resolved(dsig: &Rc) -> Rc { Rc::new(ResolvedFuncSig { - name: dsig.name.clone(), - params: dsig.params.clone(), - inferred: dsig.inferred.clone().clone().unwrap(), - is_async: dsig.is_async.clone(), - output_provenance: dsig.output_provenance.clone(), - variant_provenance: dsig.variant_provenance.clone(), - }) + name: dsig.name.clone(), + params: dsig.params.clone(), + inferred: dsig.inferred.clone().clone().unwrap(), + is_async: dsig.is_async.clone(), + output_provenance: dsig.output_provenance.clone(), + variant_provenance: dsig.variant_provenance.clone(), +}) } -pub fn merge_remaining_declared( - declared_sigs: Rc>>, - resolved: Rc>>, -) -> Rc>> { - Rc::new(v2_rt::map_values(&declared_sigs)) - .iter() - .cloned() - .fold( - resolved, - |acc: Rc>>, dsig: Rc| { - if (dsig.inferred.clone() != None) { - v2_rt::rc_map_insert( - acc.clone(), - dsig.name.clone(), - declared_to_resolved(&dsig), - ) - } else { - acc.clone() - } - }, - ) +pub fn merge_remaining_declared(declared_sigs: Rc>>, resolved: Rc>>) -> Rc>> { + Rc::new(v2_rt::map_values(&declared_sigs)).iter().cloned().fold(resolved, |acc: Rc>>, dsig: Rc| if (dsig.inferred.clone() != None) { + v2_rt::rc_map_insert(acc.clone(), dsig.name.clone(), declared_to_resolved(&dsig)) + } else { + acc.clone() + }) } -pub fn topo_resolve_loop( - mut remaining: Rc>, - mut resolved: Rc>>, - mut declared_sigs: Rc>>, - mut call_edges: Rc>>, - mut local_func_set: Rc>, - mut module_name: String, - mut diagnostics: Rc>>, - mut fuel: i64, -) -> Rc { +pub fn topo_resolve_loop(mut remaining: Rc>, mut resolved: Rc>>, mut declared_sigs: Rc>>, mut call_edges: Rc>>, mut local_func_set: Rc>, mut module_name: String, mut diagnostics: Rc>>, mut fuel: i64) -> Rc { loop { if ((remaining.clone().len() as i64) == 0) { { - let all_resolved = Rc::new(v2_rt::map_values(&declared_sigs)) - .iter() - .cloned() - .fold( - resolved.clone(), - |acc: Rc>>, - dsig: Rc| { - if (dsig.inferred.clone() != None) { - v2_rt::rc_map_insert( - acc.clone(), - dsig.name.clone(), - declared_to_resolved(&dsig), - ) - } else { - acc.clone() - } - }, - ); - return Rc::new(ResolveFuncSigsResult { - func_env: Rc::new(ResolvedFuncEnv { - signatures: all_resolved.clone(), - }), - diagnostics: diagnostics.clone(), + let all_resolved = Rc::new(v2_rt::map_values(&declared_sigs)).iter().cloned().fold(resolved.clone(), |acc: Rc>>, dsig: Rc| if (dsig.inferred.clone() != None) { + v2_rt::rc_map_insert(acc.clone(), dsig.name.clone(), declared_to_resolved(&dsig)) + } else { + acc.clone() }); - } +return Rc::new(ResolveFuncSigsResult { + func_env: Rc::new(ResolvedFuncEnv { + signatures: all_resolved.clone(), +}), + diagnostics: diagnostics.clone(), +}) +} } - let ready = Rc::new({ - let mut __result = Vec::new(); - for fn_name in remaining.clone().iter().cloned() { - if { - let local_callees = Rc::new({ - let mut __result = Vec::new(); - for c in Rc::new({ - let mut __result = Vec::new(); - for e in Rc::new({ - let mut __result = Vec::new(); - for e in call_edges.clone().iter().cloned() { - if (e.caller.clone().as_str() == fn_name.clone().as_str()) { - __result.push(e); - } - } - __result - }) - .iter() - .cloned() - { - __result.push(e.callee.clone()); - } - __result - }) - .iter() - .cloned() - { - if emit_map_has(local_func_set.clone(), c.clone()) { - __result.push(c); - } - } - __result - }); - { - let mut __all = true; - for c in local_callees.clone().iter().cloned() { - if !(v2_rt::map_get(&resolved, c.clone()) != None) { - __all = false; - break; - } - } - __all - } - } { - __result.push(fn_name); - } - } - __result - }); - if ((ready.clone().len() as i64) == 0) { +let ready = Rc::new({ let mut __result = Vec::new(); for fn_name in remaining.clone().iter().cloned() { if { + let local_callees = Rc::new({ let mut __result = Vec::new(); for c in Rc::new({ let mut __result = Vec::new(); for e in Rc::new({ let mut __result = Vec::new(); for e in call_edges.clone().iter().cloned() { if (e.caller.clone().as_str() == fn_name.clone().as_str()) { __result.push(e); } } __result }).iter().cloned() { __result.push(e.callee.clone()); } __result }).iter().cloned() { if emit_map_has(local_func_set.clone(), c.clone()) { __result.push(c); } } __result }); +{ let mut __all = true; for c in local_callees.clone().iter().cloned() { if !((v2_rt::map_get(&resolved, c.clone()) != None)) { __all = false; break; } } __all } +} { __result.push(fn_name); } } __result }); +if ((ready.clone().len() as i64) == 0) { { - let cycle_accum = remaining.clone().iter().cloned().fold( + let cycle_accum = remaining.clone().iter().cloned().fold(Rc::new(SigsAccum { + signatures: resolved.clone(), + diagnostics: Rc::new(vec![]), +}), |acc: Rc, fn_name: String| match v2_rt::map_get(&declared_sigs, fn_name.clone()) { + Some(dsig) => if (dsig.inferred.clone() != None) { + Rc::new(SigsAccum { + signatures: v2_rt::rc_map_insert(acc.signatures.clone(), fn_name.clone(), declared_to_resolved(&dsig)), + diagnostics: acc.diagnostics.clone(), +}) + } else { Rc::new(SigsAccum { - signatures: resolved.clone(), - diagnostics: Rc::new(vec![]), - }), - |acc: Rc, fn_name: String| match v2_rt::map_get( - &declared_sigs, - fn_name.clone(), - ) { - Some(dsig) => { - if (dsig.inferred.clone() != None) { - Rc::new(SigsAccum { - signatures: v2_rt::rc_map_insert( - acc.signatures.clone(), - fn_name.clone(), - declared_to_resolved(&dsig), - ), - diagnostics: acc.diagnostics.clone(), - }) - } else { - Rc::new(SigsAccum { - signatures: acc.signatures.clone(), - diagnostics: v2_rt::rc_list_push( - acc.diagnostics.clone(), - make_error_node( - Rc::new(CompilerDiagnostic::MissingAnnotation { - fn_name: fn_name.clone(), - what: "return type (recursive)".to_string(), - span: no_span(), - }), - module_name.clone(), - ), - ), - }) - } - } - None => acc.clone(), - }, - ); - let all_resolved = Rc::new(v2_rt::map_values(&declared_sigs)) - .iter() - .cloned() - .fold( - cycle_accum.signatures.clone(), - |acc: Rc>>, - dsig: Rc| { - if (dsig.inferred.clone() != None) { - v2_rt::rc_map_insert( - acc.clone(), - dsig.name.clone(), - declared_to_resolved(&dsig), - ) - } else { - acc.clone() - } - }, - ); - return Rc::new(ResolveFuncSigsResult { - func_env: Rc::new(ResolvedFuncEnv { - signatures: all_resolved.clone(), - }), - diagnostics: v2_rt::concat( - diagnostics.clone(), - cycle_accum.diagnostics.clone(), - ), + signatures: acc.signatures.clone(), + diagnostics: v2_rt::rc_list_push(acc.diagnostics.clone(), make_error_node(Rc::new(CompilerDiagnostic::MissingAnnotation { + fn_name: fn_name.clone(), + what: "return type (recursive)".to_string(), + span: no_span(), +}), module_name.clone())), +}) + }, + None => acc.clone(), +}); +let all_resolved = Rc::new(v2_rt::map_values(&declared_sigs)).iter().cloned().fold(cycle_accum.signatures.clone(), |acc: Rc>>, dsig: Rc| if (dsig.inferred.clone() != None) { + v2_rt::rc_map_insert(acc.clone(), dsig.name.clone(), declared_to_resolved(&dsig)) + } else { + acc.clone() }); - } +return Rc::new(ResolveFuncSigsResult { + func_env: Rc::new(ResolvedFuncEnv { + signatures: all_resolved.clone(), +}), + diagnostics: v2_rt::concat(diagnostics.clone(), cycle_accum.diagnostics.clone()), +}) +} } - let ready_accum = ready.clone().iter().cloned().fold( +let ready_accum = ready.clone().iter().cloned().fold(Rc::new(SigsAccum { + signatures: resolved.clone(), + diagnostics: diagnostics.clone(), +}), |acc: Rc, fn_name: String| match v2_rt::map_get(&declared_sigs, fn_name.clone()) { + Some(dsig) => if (dsig.inferred.clone() != None) { Rc::new(SigsAccum { - signatures: resolved.clone(), - diagnostics: diagnostics.clone(), - }), - |acc: Rc, fn_name: String| match v2_rt::map_get( - &declared_sigs, - fn_name.clone(), - ) { - Some(dsig) => { - if (dsig.inferred.clone() != None) { - Rc::new(SigsAccum { - signatures: v2_rt::rc_map_insert( - acc.signatures.clone(), - fn_name.clone(), - declared_to_resolved(&dsig), - ), - diagnostics: acc.diagnostics.clone(), - }) - } else { - Rc::new(SigsAccum { - signatures: acc.signatures.clone(), - diagnostics: v2_rt::rc_list_push( - acc.diagnostics.clone(), - make_error_node( - Rc::new(CompilerDiagnostic::MissingAnnotation { - fn_name: fn_name.clone(), - what: "return type".to_string(), - span: no_span(), - }), - module_name.clone(), - ), - ), - }) - } - } - None => acc.clone(), - }, - ); - let ready_set = ready.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, fn_name: String| { - v2_rt::rc_map_insert(acc, fn_name.clone(), true) - }, - ); - let next_remaining = Rc::new({ - let mut __result = Vec::new(); - for fn_name in remaining.clone().iter().cloned() { - if (emit_map_has(ready_set.clone(), fn_name.clone()) == false) { - __result.push(fn_name); - } - } - __result - }); - { + signatures: v2_rt::rc_map_insert(acc.signatures.clone(), fn_name.clone(), declared_to_resolved(&dsig)), + diagnostics: acc.diagnostics.clone(), +}) + } else { + Rc::new(SigsAccum { + signatures: acc.signatures.clone(), + diagnostics: v2_rt::rc_list_push(acc.diagnostics.clone(), make_error_node(Rc::new(CompilerDiagnostic::MissingAnnotation { + fn_name: fn_name.clone(), + what: "return type".to_string(), + span: no_span(), +}), module_name.clone())), +}) + }, + None => acc.clone(), +}); +let ready_set = ready.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, fn_name: String| v2_rt::rc_map_insert(acc, fn_name.clone(), true)); +let next_remaining = Rc::new({ let mut __result = Vec::new(); for fn_name in remaining.clone().iter().cloned() { if (emit_map_has(ready_set.clone(), fn_name.clone()) == false) { __result.push(fn_name); } } __result }); +{ let __tco_0 = next_remaining; - let __tco_1 = ready_accum.signatures.clone(); - let __tco_2 = ready_accum.diagnostics.clone(); - let __tco_3 = (fuel - 1); - remaining = __tco_0; - resolved = __tco_1; - diagnostics = __tco_2; - fuel = __tco_3; - continue; - } - } +let __tco_1 = ready_accum.signatures.clone(); +let __tco_2 = ready_accum.diagnostics.clone(); +let __tco_3 = (fuel - 1); +remaining = __tco_0; +resolved = __tco_1; +diagnostics = __tco_2; +fuel = __tco_3; +continue; +} +} } -pub fn resolve_func_sigs( - declared_sigs: &Rc>>, - items: &Rc>>, - module_name: String, - source_indices: &Rc>>, -) -> Rc { +pub fn resolve_func_sigs(declared_sigs: &Rc>>, items: &Rc>>, module_name: String, source_indices: &Rc>>) -> Rc { { - let local_func_names = Rc::new({ - let mut __result = Vec::new(); - for item in Rc::new({ - let mut __result = Vec::new(); - for item in items.clone().iter().cloned() { - if (((item.params.clone().len() as i64) > 0) && (item.body.clone() != None)) { - __result.push(item); - } - } - __result - }) - .iter() - .cloned() - { - __result.push(authored_name_at(source_indices.clone(), &item)); - } - __result - }); - let local_func_set = build_name_set(local_func_names.clone()); - let call_edges = collect_func_call_edges( - items.clone(), - local_func_set.clone(), - source_indices.clone(), - ); - let parent_resolved = - collect_parent_resolved_sigs(declared_sigs.clone(), local_func_set.clone()); - topo_resolve_loop( - local_func_names.clone(), - parent_resolved, - declared_sigs.clone(), - call_edges, - local_func_set.clone(), - module_name, - Rc::new(vec![]), - (local_func_names.clone().len() as i64), - ) - } + let local_func_names = Rc::new({ let mut __result = Vec::new(); for item in Rc::new({ let mut __result = Vec::new(); for item in items.clone().iter().cloned() { if (((item.params.clone().len() as i64) > 0) && (item.body.clone() != None)) { __result.push(item); } } __result }).iter().cloned() { __result.push(authored_name_at(source_indices.clone(), &item)); } __result }); +let local_func_set = build_name_set(local_func_names.clone()); +let call_edges = collect_func_call_edges(items.clone(), local_func_set.clone(), source_indices.clone()); +let parent_resolved = collect_parent_resolved_sigs(declared_sigs.clone(), local_func_set.clone()); +topo_resolve_loop(local_func_names.clone(), parent_resolved, declared_sigs.clone(), call_edges, local_func_set.clone(), module_name, Rc::new(vec![]), (local_func_names.clone().len() as i64)) +} } diff --git a/src/v2/stage0/src/v2_compiler_infer_types.rs b/src/v2/stage0/src/v2_compiler_infer_types.rs index 139b9825b17..28a9f85640a 100644 --- a/src/v2/stage0/src/v2_compiler_infer_types.rs +++ b/src/v2/stage0/src/v2_compiler_infer_types.rs @@ -1,83 +1,64 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.infer_types -use crate::std_algebra::AlgebraProfile::{ - ApproximateFieldProfile, BooleanAlgebraCollectionProfile, BooleanAlgebraProfile, - FreeMonoidCollectionProfile, FreeMonoidScalarProfile, OrderedRingProfile, - PartialFunctionProfile, -}; -use crate::std_algebra::AlgebraTypeTemplate::{ - AlgebraTypeVariable, ContainerOf, NamedTemplate, OptionalOf, ReceiverElement, ReceiverKey, - ReceiverSelf, ReceiverValue, TupleOf, -}; -use crate::std_algebra::ContainerSource::{Named, SameAsReceiver}; -pub use crate::std_algebra::{ - algebra_templates_for_profile, kernel_algebra_profile, AlgebraFieldTemplate, AlgebraProfile, - AlgebraTypeTemplate, ContainerSource, -}; -pub use crate::std_types::{ - container_expected_arity, container_param_name, is_container_type, SourceSpan, -}; -use crate::v2_rt; -use crate::v2_std_core::AlgebraFieldKind::{ - AlgAdd, AlgCompare, AlgJoin, AlgMeet, AlgMul, AlgQuotient, AlgReciprocal, AlgRemainder, -}; -use crate::v2_std_core::BinOp::{And, Eq, Ge, Gt, Le, Lt, Ne, NullCoalesce, Or}; -use crate::v2_std_core::Cardinality::{CardOptional, Required}; -use crate::v2_std_core::CompilerDiagnostic::InternalError; -use crate::v2_std_core::Connective::{Conj, Disj, NoConnective}; -use crate::v2_std_core::ExprData::{ExprError, ExprLiteral, NoExprData}; -use crate::v2_std_core::ExprErrorKind::{InternalExprError, SemanticExprError}; -use crate::v2_std_core::InferredNode::{CompilerError, Resolved, TypeVariable}; -use crate::v2_std_core::LiteralValue::{LitBool, LitFloat, LitInt, LitNull, LitStr}; -pub use crate::v2_std_core::{ - authored_name_at, bool_type, default_ident_span, error_type, find_child_named, float_type, - has_inferred, int_type, is_compiler_error, is_kernel_type, kernel_span, leaf_node_with_span, - make_error_node, make_expr_error_node, make_expr_node, make_param_node, make_span, no_span, - none_type, param_node_type_expr, string_type, unit_type, with_optional_cardinality, - with_required_cardinality, AlgebraFieldKind, BinOp, Cardinality, CompilerDiagnostic, - Connective, ErrorNode, ExprData, ExprErrorKind, InferredNode, LiteralValue, NewlineIndex, Node, -}; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::std_types::{SourceSpan, is_container_type, container_expected_arity, container_param_name}; +pub use crate::std_algebra::{AlgebraProfile, AlgebraTypeTemplate, ContainerSource, AlgebraFieldTemplate, kernel_algebra_profile, algebra_templates_for_profile}; +use crate::std_algebra::AlgebraProfile::{OrderedRingProfile, ApproximateFieldProfile, BooleanAlgebraProfile, BooleanAlgebraCollectionProfile, FreeMonoidScalarProfile, FreeMonoidCollectionProfile, PartialFunctionProfile}; +use crate::std_algebra::AlgebraTypeTemplate::{ReceiverSelf, ReceiverElement, ReceiverKey, ReceiverValue, NamedTemplate, ContainerOf, OptionalOf, TupleOf, AlgebraTypeVariable}; +use crate::std_algebra::ContainerSource::{SameAsReceiver, Named}; +pub use crate::v2_std_core::{Node, make_param_node, param_node_type_expr, find_child_named, NewlineIndex, Connective, Cardinality, ExprErrorKind, make_expr_node, make_expr_error_node, LiteralValue, is_kernel_type, BinOp, AlgebraFieldKind, InferredNode, has_inferred, is_compiler_error, leaf_node_with_span, no_span, make_span, with_optional_cardinality, with_required_cardinality, unit_type, bool_type, string_type, int_type, float_type, none_type, error_type, default_ident_span, kernel_span, authored_name_at, ErrorNode, make_error_node, ExprData, CompilerDiagnostic}; +use crate::v2_std_core::Connective::{Conj, Disj, NoConnective}; +use crate::v2_std_core::Cardinality::{Required, CardOptional}; +use crate::v2_std_core::ExprData::{NoExprData, ExprLiteral, ExprError}; +use crate::v2_std_core::ExprErrorKind::{SemanticExprError, InternalExprError}; +use crate::v2_std_core::LiteralValue::{LitStr, LitInt, LitFloat, LitBool, LitNull}; +use crate::v2_std_core::BinOp::{Eq, Ne, Lt, Gt, Le, Ge, And, Or, NullCoalesce}; +use crate::v2_std_core::AlgebraFieldKind::{AlgAdd, AlgMul, AlgReciprocal, AlgQuotient, AlgRemainder, AlgCompare, AlgMeet, AlgJoin}; +use crate::v2_std_core::InferredNode::{Resolved, CompilerError, TypeVariable}; +use crate::v2_std_core::CompilerDiagnostic::{InternalError}; pub fn is_type_variable(inferred: Rc) -> bool { match (*inferred).clone() { - InferredNode::TypeVariable { .. } => true, - _ => false, - } + InferredNode::TypeVariable { .. } => true, + _ => false, +} } pub fn type_variable_node(id: String) -> Rc { Rc::new(Node { - name: "".to_string(), - span: make_span(0, 0), - ident_span: None, - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::TypeVariable { id: id })), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }) + name: "".to_string(), + span: make_span(0, 0), + ident_span: None, + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::TypeVariable { + id: id, +})), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}) } pub fn resolved_type(n: Rc) -> Rc { match n.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => rt.clone(), - _ => error_type(), - } + Some(InferredNode::Resolved { node: rt, .. }) => rt.clone(), + _ => error_type(), +} } pub fn child_type_node(ch: &Rc) -> Rc { @@ -90,31 +71,20 @@ pub fn child_type_node(ch: &Rc) -> Rc { pub fn child_type_at(n: Rc, index: i64) -> Option> { match n.children.clone().get(index as usize).cloned() { - Some(ch) => Some(child_type_node(&ch)), - None => None, - } + Some(ch) => Some(child_type_node(&ch)), + None => None, +} } -pub fn node_is_collection( - n: &Rc, - source_indices: Rc>>, -) -> bool { - ((((n.children.clone().len() as i64) > 0) - && (n.connective.clone() == Connective::NoConnective)) - && is_container_type(authored_name_at(source_indices, &n))) +pub fn node_is_collection(n: &Rc, source_indices: Rc>>) -> bool { + ((((n.children.clone().len() as i64) > 0) && (n.connective.clone() == Connective::NoConnective)) && is_container_type(authored_name_at(source_indices, &n))) } -pub fn node_is_keyed_collection( - n: &Rc, - source_indices: Rc>>, -) -> bool { +pub fn node_is_keyed_collection(n: &Rc, source_indices: Rc>>) -> bool { (node_is_collection(&n, source_indices) && ((n.children.clone().len() as i64) == 2)) } -pub fn node_is_element_collection( - n: &Rc, - source_indices: Rc>>, -) -> bool { +pub fn node_is_element_collection(n: &Rc, source_indices: Rc>>) -> bool { (node_is_collection(&n, source_indices) && ((n.children.clone().len() as i64) == 1)) } @@ -134,160 +104,143 @@ pub fn is_unit_like(n: &Rc) -> bool { ((n.connective.clone() == Connective::Conj) && ((n.children.clone().len() as i64) == 0)) } -pub fn is_fully_resolved( - n: &Rc, - source_indices: &Rc>>, -) -> bool { +pub fn is_fully_resolved(n: &Rc, source_indices: &Rc>>) -> bool { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - let self_is_type_var = match n.inferred.clone() { - Some(inf) => is_type_variable(inf.clone()), - None => false, - }; - if self_is_type_var { - false - } else { - { - let under_param = - match container_expected_arity(authored_name_at(source_indices.clone(), &n)) { - Some(expected) => ((n.children.clone().len() as i64) < expected.clone()), - None => false, - }; - if under_param { - false - } else { - { - let mut __all = true; - for ch in n.children.clone().iter().cloned() { - if !(is_fully_resolved(&child_type_node(&ch), &source_indices)) { - __all = false; - break; - } - } - __all + { + let self_is_type_var = match n.inferred.clone() { + Some(inf) => is_type_variable(inf.clone()), + None => false, +}; +if self_is_type_var { + false + } else { + { + let under_param = match container_expected_arity(authored_name_at(source_indices.clone(), &n)) { + Some(expected) => ((n.children.clone().len() as i64) < expected.clone()), + None => false, +}; +if under_param { + false + } else { + { let mut __all = true; for ch in n.children.clone().iter().cloned() { if !(is_fully_resolved(&child_type_node(&ch), &source_indices)) { __all = false; break; } } __all } } - } +} } - } +} }) } pub fn bare_map_node() -> Option> { match container_param_name("Map".to_string(), 0) { - Some(key_id) => match container_param_name("Map".to_string(), 1) { - Some(val_id) => Some(Rc::new(Node { - name: "Map".to_string(), - span: make_span(0, 0), - ident_span: Some(make_span(0, 0)), - children: Rc::new(vec![ - Rc::new(Node { - name: key_id.clone(), - span: make_span(0, 0), - ident_span: Some(make_span(0, 0)), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::Resolved { - node: type_variable_node(key_id.clone()), - })), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }), - Rc::new(Node { - name: val_id.clone(), - span: make_span(0, 0), - ident_span: Some(make_span(0, 0)), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::Resolved { - node: type_variable_node(val_id.clone()), - })), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }), - ]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - })), - None => None, - }, - None => None, - } + Some(key_id) => match container_param_name("Map".to_string(), 1) { + Some(val_id) => Some(Rc::new(Node { + name: "Map".to_string(), + span: make_span(0, 0), + ident_span: Some(make_span(0, 0)), + children: Rc::new(vec![Rc::new(Node { + name: key_id.clone(), + span: make_span(0, 0), + ident_span: Some(make_span(0, 0)), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::Resolved { + node: type_variable_node(key_id.clone()), +})), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}), Rc::new(Node { + name: val_id.clone(), + span: make_span(0, 0), + ident_span: Some(make_span(0, 0)), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::Resolved { + node: type_variable_node(val_id.clone()), +})), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +})]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +})), + None => None, +}, + None => None, +} } pub fn kernel_container_profile_miss_diagnostic(kind_name: String) -> Rc { { let msg = v2_rt::concat("missing kernel container profile: ".to_string(), kind_name); - make_error_node( - Rc::new(CompilerDiagnostic::InternalError { - message: msg, - span: make_span(0, 0), - }), - "v2.compiler.infer_types".to_string(), - ) - } +make_error_node(Rc::new(CompilerDiagnostic::InternalError { + message: msg, + span: make_span(0, 0), +}), "v2.compiler.infer_types".to_string()) +} } pub fn missing_kernel_container_profile_type(kind_name: String) -> Rc { { let msg = v2_rt::concat("missing kernel container profile: ".to_string(), kind_name); - Rc::new(Node { - name: "".to_string(), - span: make_span(0, 0), - ident_span: None, - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::CompilerError { - message: msg.clone(), - span: make_span(0, 0), - })), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::ExprError { - kind: ExprErrorKind::InternalExprError, - message: msg.clone(), - }), - ident: None, - }) - } +Rc::new(Node { + name: "".to_string(), + span: make_span(0, 0), + ident_span: None, + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::CompilerError { + message: msg.clone(), + span: make_span(0, 0), +})), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::ExprError { + kind: ExprErrorKind::InternalExprError, + message: msg.clone(), +}), + ident: None, +}) +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -298,318 +251,302 @@ pub struct KernelTypeBuild { pub fn make_container_type(kind_name: &String, element: Rc) -> Rc { match container_param_name(kind_name.clone(), 0) { - Some(param_name) => Rc::new(KernelTypeBuild { - ty: Rc::new(Node { - name: kind_name.clone(), - span: kernel_span(&kind_name), - ident_span: Some(kernel_span(&kind_name)), - children: Rc::new(vec![Rc::new(Node { - name: param_name.clone(), - span: kernel_span(¶m_name), - ident_span: Some(kernel_span(¶m_name)), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::Resolved { node: element })), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - })]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }), - diagnostics: Rc::new(vec![]), - }), - None => Rc::new(KernelTypeBuild { - ty: missing_kernel_container_profile_type(kind_name.clone()), - diagnostics: Rc::new(vec![kernel_container_profile_miss_diagnostic( - kind_name.clone(), - )]), - }), - } + Some(param_name) => Rc::new(KernelTypeBuild { + ty: Rc::new(Node { + name: kind_name.clone(), + span: kernel_span(&kind_name), + ident_span: Some(kernel_span(&kind_name)), + children: Rc::new(vec![Rc::new(Node { + name: param_name.clone(), + span: kernel_span(¶m_name), + ident_span: Some(kernel_span(¶m_name)), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::Resolved { + node: element, +})), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +})]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}), + diagnostics: Rc::new(vec![]), +}), + None => Rc::new(KernelTypeBuild { + ty: missing_kernel_container_profile_type(kind_name.clone()), + diagnostics: Rc::new(vec![kernel_container_profile_miss_diagnostic(kind_name.clone())]), +}), +} } pub fn make_map_type(key: Rc, value: Rc) -> Rc { match container_param_name("Map".to_string(), 0) { - Some(key_name) => match container_param_name("Map".to_string(), 1) { - Some(val_name) => Rc::new(KernelTypeBuild { - ty: Rc::new(Node { - name: "Map".to_string(), - span: kernel_span(&"Map".to_string()), - ident_span: Some(kernel_span(&"Map".to_string())), - children: Rc::new(vec![ - Rc::new(Node { - name: key_name.clone(), - span: kernel_span(&key_name), - ident_span: Some(kernel_span(&key_name)), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::Resolved { node: key })), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }), - Rc::new(Node { - name: val_name.clone(), - span: kernel_span(&val_name), - ident_span: Some(kernel_span(&val_name)), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::Resolved { node: value })), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }), - ]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }), - diagnostics: Rc::new(vec![]), - }), - None => Rc::new(KernelTypeBuild { - ty: missing_kernel_container_profile_type("Map".to_string()), - diagnostics: Rc::new(vec![kernel_container_profile_miss_diagnostic( - "Map".to_string(), - )]), - }), - }, - None => Rc::new(KernelTypeBuild { - ty: missing_kernel_container_profile_type("Map".to_string()), - diagnostics: Rc::new(vec![kernel_container_profile_miss_diagnostic( - "Map".to_string(), - )]), - }), - } + Some(key_name) => match container_param_name("Map".to_string(), 1) { + Some(val_name) => Rc::new(KernelTypeBuild { + ty: Rc::new(Node { + name: "Map".to_string(), + span: kernel_span(&"Map".to_string()), + ident_span: Some(kernel_span(&"Map".to_string())), + children: Rc::new(vec![Rc::new(Node { + name: key_name.clone(), + span: kernel_span(&key_name), + ident_span: Some(kernel_span(&key_name)), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::Resolved { + node: key, +})), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}), Rc::new(Node { + name: val_name.clone(), + span: kernel_span(&val_name), + ident_span: Some(kernel_span(&val_name)), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::Resolved { + node: value, +})), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +})]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}), + diagnostics: Rc::new(vec![]), +}), + None => Rc::new(KernelTypeBuild { + ty: missing_kernel_container_profile_type("Map".to_string()), + diagnostics: Rc::new(vec![kernel_container_profile_miss_diagnostic("Map".to_string())]), +}), +}, + None => Rc::new(KernelTypeBuild { + ty: missing_kernel_container_profile_type("Map".to_string()), + diagnostics: Rc::new(vec![kernel_container_profile_miss_diagnostic("Map".to_string())]), +}), +} } pub fn make_callable_type(func_params: Rc>>, ret: Rc) -> Rc { Rc::new(Node { - name: "Callable".to_string(), - span: kernel_span(&"Callable".to_string()), - ident_span: Some(kernel_span(&"Callable".to_string())), - children: Rc::new(vec![]), - connective: Connective::Arrow, - params: func_params, - inferred: Some(Rc::new(InferredNode::Resolved { node: ret })), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }) + name: "Callable".to_string(), + span: kernel_span(&"Callable".to_string()), + ident_span: Some(kernel_span(&"Callable".to_string())), + children: Rc::new(vec![]), + connective: Connective::Arrow, + params: func_params, + inferred: Some(Rc::new(InferredNode::Resolved { + node: ret, +})), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}) } pub fn make_tuple_type(first: Rc, second: Rc) -> Rc { Rc::new(Node { - name: "".to_string(), - span: make_span(0, 0), - ident_span: None, - children: Rc::new(vec![ - Rc::new(Node { - name: "first".to_string(), - span: kernel_span(&"first".to_string()), - ident_span: Some(kernel_span(&"first".to_string())), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::Resolved { node: first })), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }), - Rc::new(Node { - name: "second".to_string(), - span: kernel_span(&"second".to_string()), - ident_span: Some(kernel_span(&"second".to_string())), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::Resolved { node: second })), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }), - ]), - connective: Connective::Conj, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }) + name: "".to_string(), + span: make_span(0, 0), + ident_span: None, + children: Rc::new(vec![Rc::new(Node { + name: "first".to_string(), + span: kernel_span(&"first".to_string()), + ident_span: Some(kernel_span(&"first".to_string())), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::Resolved { + node: first, +})), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}), Rc::new(Node { + name: "second".to_string(), + span: kernel_span(&"second".to_string()), + ident_span: Some(kernel_span(&"second".to_string())), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::Resolved { + node: second, +})), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +})]), + connective: Connective::Conj, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}) } pub fn algebra_value_field(name: &String, type_node: Rc) -> Rc { Rc::new(Node { - name: name.clone(), - span: kernel_span(&name), - ident_span: Some(kernel_span(&name)), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::Resolved { node: type_node })), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }) + name: name.clone(), + span: kernel_span(&name), + ident_span: Some(kernel_span(&name)), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::Resolved { + node: type_node, +})), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}) } -pub fn algebra_method_field( - name: &String, - param_types: Rc>>, - return_type: Rc, -) -> Rc { +pub fn algebra_method_field(name: &String, param_types: Rc>>, return_type: Rc) -> Rc { { - let params = Rc::new({ - let mut __result = Vec::new(); - for t in param_types.iter().cloned() { - __result.push(make_param_node( - &"_".to_string(), - t.clone(), - None, - no_span(), - no_span(), - )); - } - __result - }); - let callable = make_callable_type(params, return_type); - Rc::new(Node { - name: name.clone(), - span: kernel_span(&name), - ident_span: Some(kernel_span(&name)), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::Resolved { node: callable })), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }) - } + let params = Rc::new({ let mut __result = Vec::new(); for t in param_types.iter().cloned() { __result.push(make_param_node(&"_".to_string(), t.clone(), None, no_span(), no_span())); } __result }); +let callable = make_callable_type(params, return_type); +Rc::new(Node { + name: name.clone(), + span: kernel_span(&name), + ident_span: Some(kernel_span(&name)), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::Resolved { + node: callable, +})), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}) +} } -pub fn enrich_base_with_fields( - name: String, - base: &Rc, - fields: Rc>>, -) -> Rc { +pub fn enrich_base_with_fields(name: String, base: &Rc, fields: Rc>>) -> Rc { Rc::new(Node { - name: name, - span: base.span.clone(), - ident_span: base.ident_span.clone(), - children: fields, - connective: Connective::Conj, - params: base.params.clone(), - inferred: base.inferred.clone(), - return_cardinality: base.return_cardinality.clone(), - uses: base.uses.clone(), - body: base.body.clone(), - transport: base.transport.clone(), - properties: base.properties.clone(), - type_annotation: base.type_annotation.clone(), - is_self_recursive: base.is_self_recursive.clone(), - has_non_tail_self_call: base.has_non_tail_self_call.clone(), - match_pattern: base.match_pattern.clone(), - expr_data: base.expr_data.clone(), - ident: None, - }) + name: name, + span: base.span.clone(), + ident_span: base.ident_span.clone(), + children: fields, + connective: Connective::Conj, + params: base.params.clone(), + inferred: base.inferred.clone(), + return_cardinality: base.return_cardinality.clone(), + uses: base.uses.clone(), + body: base.body.clone(), + transport: base.transport.clone(), + properties: base.properties.clone(), + type_annotation: base.type_annotation.clone(), + is_self_recursive: base.is_self_recursive.clone(), + has_non_tail_self_call: base.has_non_tail_self_call.clone(), + match_pattern: base.match_pattern.clone(), + expr_data: base.expr_data.clone(), + ident: None, +}) } pub fn placeholder_type_node(name: String) -> Rc { @@ -620,748 +557,410 @@ pub fn nominal_type_ref(name: &String) -> Rc { leaf_node_with_span(&name, &kernel_span(&name)) } -pub fn algebra_child_or_placeholder( - base: Rc, - child_index: i64, - placeholder: String, -) -> Rc { - match Rc::new({ - let mut __result = Vec::new(); - for pair in Rc::new({ - let mut __result = Vec::new(); - for pair in Rc::new( - base.children - .clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - { - if (pair.0.clone() == child_index.clone()) { - __result.push(pair); - } - } - __result - }) - .iter() - .cloned() - { - __result.push(pair.1.clone()); - } - __result - }) - .first() - .cloned() - { - Some(child) => child_type_node(&child), - None => type_variable_node(placeholder), - } +pub fn algebra_child_or_placeholder(base: Rc, child_index: i64, placeholder: String) -> Rc { + match Rc::new({ let mut __result = Vec::new(); for pair in Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(base.children.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { if (pair.0.clone() == child_index.clone()) { __result.push(pair); } } __result }).iter().cloned() { __result.push(pair.1.clone()); } __result }).first().cloned() { + Some(child) => child_type_node(&child), + None => type_variable_node(placeholder), +} } -pub fn instantiate_algebra_type( - template: Rc, - base: &Rc, - source_indices: &Rc>>, -) -> Rc { +pub fn instantiate_algebra_type(template: Rc, base: &Rc, source_indices: &Rc>>) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - let elem = algebra_child_or_placeholder(base.clone(), 0, "T".to_string()); - let key_node = algebra_child_or_placeholder(base.clone(), 0, "K".to_string()); - let val_node = algebra_child_or_placeholder(base.clone(), 1, "V".to_string()); - match (*template).clone() { - AlgebraTypeTemplate::ReceiverSelf => Rc::new(KernelTypeBuild { - ty: base.clone(), - diagnostics: Rc::new(vec![]), - }), - AlgebraTypeTemplate::ReceiverElement => Rc::new(KernelTypeBuild { - ty: elem, - diagnostics: Rc::new(vec![]), - }), - AlgebraTypeTemplate::ReceiverKey => Rc::new(KernelTypeBuild { - ty: key_node, - diagnostics: Rc::new(vec![]), - }), - AlgebraTypeTemplate::ReceiverValue => Rc::new(KernelTypeBuild { - ty: val_node, - diagnostics: Rc::new(vec![]), - }), - AlgebraTypeTemplate::NamedTemplate { name: n, .. } => Rc::new(KernelTypeBuild { - ty: nominal_type_ref(&n), - diagnostics: Rc::new(vec![]), - }), - AlgebraTypeTemplate::AlgebraTypeVariable { id: var_id, .. } => { - Rc::new(KernelTypeBuild { - ty: type_variable_node(var_id.clone()), - diagnostics: Rc::new(vec![]), - }) - } - AlgebraTypeTemplate::ContainerOf { - source: src, - element: inner, - .. - } => { + { + let elem = algebra_child_or_placeholder(base.clone(), 0, "T".to_string()); +let key_node = algebra_child_or_placeholder(base.clone(), 0, "K".to_string()); +let val_node = algebra_child_or_placeholder(base.clone(), 1, "V".to_string()); +match (*template).clone() { + AlgebraTypeTemplate::ReceiverSelf => Rc::new(KernelTypeBuild { + ty: base.clone(), + diagnostics: Rc::new(vec![]), +}), + AlgebraTypeTemplate::ReceiverElement => Rc::new(KernelTypeBuild { + ty: elem, + diagnostics: Rc::new(vec![]), +}), + AlgebraTypeTemplate::ReceiverKey => Rc::new(KernelTypeBuild { + ty: key_node, + diagnostics: Rc::new(vec![]), +}), + AlgebraTypeTemplate::ReceiverValue => Rc::new(KernelTypeBuild { + ty: val_node, + diagnostics: Rc::new(vec![]), +}), + AlgebraTypeTemplate::NamedTemplate { name: n, .. } => Rc::new(KernelTypeBuild { + ty: nominal_type_ref(&n), + diagnostics: Rc::new(vec![]), +}), + AlgebraTypeTemplate::AlgebraTypeVariable { id: var_id, .. } => Rc::new(KernelTypeBuild { + ty: type_variable_node(var_id.clone()), + diagnostics: Rc::new(vec![]), +}), + AlgebraTypeTemplate::ContainerOf { source: src, element: inner, .. } => { let kind_name = match (*src.clone()).clone() { - ContainerSource::SameAsReceiver => { - authored_name_at(source_indices.clone(), &base) - } - ContainerSource::Named { name: n, .. } => n.clone(), - }; - let inner_b = instantiate_algebra_type(inner.clone(), &base, &source_indices); - let built = make_container_type(&kind_name, inner_b.ty.clone()); - Rc::new(KernelTypeBuild { - ty: built.ty.clone(), - diagnostics: v2_rt::concat( - inner_b.diagnostics.clone(), - built.diagnostics.clone(), - ), - }) - } - AlgebraTypeTemplate::OptionalOf { inner, .. } => { + ContainerSource::SameAsReceiver => authored_name_at(source_indices.clone(), &base), + ContainerSource::Named { name: n, .. } => n.clone(), +}; +let inner_b = instantiate_algebra_type(inner.clone(), &base, &source_indices); +let built = make_container_type(&kind_name, inner_b.ty.clone()); +Rc::new(KernelTypeBuild { + ty: built.ty.clone(), + diagnostics: v2_rt::concat(inner_b.diagnostics.clone(), built.diagnostics.clone()), +}) +}, + AlgebraTypeTemplate::OptionalOf { inner, .. } => { let ib = instantiate_algebra_type(inner.clone(), &base, &source_indices); - Rc::new(KernelTypeBuild { - ty: with_optional_cardinality(&ib.ty.clone()), - diagnostics: ib.diagnostics.clone(), - }) - } - AlgebraTypeTemplate::TupleOf { first, second, .. } => { +Rc::new(KernelTypeBuild { + ty: with_optional_cardinality(&ib.ty.clone()), + diagnostics: ib.diagnostics.clone(), +}) +}, + AlgebraTypeTemplate::TupleOf { first, second, .. } => { let fb = instantiate_algebra_type(first.clone(), &base, &source_indices); - let sb = instantiate_algebra_type(second.clone(), &base, &source_indices); - Rc::new(KernelTypeBuild { - ty: make_tuple_type(fb.ty.clone(), sb.ty.clone()), - diagnostics: v2_rt::concat(fb.diagnostics.clone(), sb.diagnostics.clone()), - }) - } - AlgebraTypeTemplate::CallableOf { - params: p, - return_type: r, - .. - } => { - let param_bs = Rc::new({ - let mut __result = Vec::new(); - for tp in p.clone().iter().cloned() { - __result.push(instantiate_algebra_type(tp.clone(), &base, &source_indices)); - } - __result - }); - let param_diags = Rc::new({ - let mut __result = Vec::new(); - for b in param_bs.clone().iter().cloned() { - __result.extend((*b.diagnostics.clone()).iter().cloned()); - } - __result - }); - let param_nodes = Rc::new({ - let mut __result = Vec::new(); - for b in param_bs.clone().iter().cloned() { - __result.push(b.ty.clone()); - } - __result - }); - let rb = instantiate_algebra_type(r.clone(), &base, &source_indices); - Rc::new(KernelTypeBuild { - ty: make_callable_type(param_nodes, rb.ty.clone()), - diagnostics: v2_rt::concat(param_diags, rb.diagnostics.clone()), - }) - } - } +let sb = instantiate_algebra_type(second.clone(), &base, &source_indices); +Rc::new(KernelTypeBuild { + ty: make_tuple_type(fb.ty.clone(), sb.ty.clone()), + diagnostics: v2_rt::concat(fb.diagnostics.clone(), sb.diagnostics.clone()), +}) +}, + AlgebraTypeTemplate::CallableOf { params: p, return_type: r, .. } => { + let param_bs = Rc::new({ let mut __result = Vec::new(); for tp in p.clone().iter().cloned() { __result.push(instantiate_algebra_type(tp.clone(), &base, &source_indices)); } __result }); +let param_diags = Rc::new({ let mut __result = Vec::new(); for b in param_bs.clone().iter().cloned() { __result.extend((*b.diagnostics.clone()).iter().cloned()); } __result }); +let param_nodes = Rc::new({ let mut __result = Vec::new(); for b in param_bs.clone().iter().cloned() { __result.push(b.ty.clone()); } __result }); +let rb = instantiate_algebra_type(r.clone(), &base, &source_indices); +Rc::new(KernelTypeBuild { + ty: make_callable_type(param_nodes, rb.ty.clone()), + diagnostics: v2_rt::concat(param_diags, rb.diagnostics.clone()), +}) +}, +} +} }) } -pub fn instantiate_algebra_field( - template: &Rc, - base: &Rc, - source_indices: &Rc>>, -) -> Rc { +pub fn instantiate_algebra_field(template: &Rc, base: &Rc, source_indices: &Rc>>) -> Rc { { - let param_bs = Rc::new({ - let mut __result = Vec::new(); - for tp in template.param_types.clone().iter().cloned() { - __result.push(instantiate_algebra_type(tp.clone(), &base, &source_indices)); - } - __result - }); - let param_types = Rc::new({ - let mut __result = Vec::new(); - for b in param_bs.clone().iter().cloned() { - __result.push(b.ty.clone()); - } - __result - }); - let param_diags = Rc::new({ - let mut __result = Vec::new(); - for b in param_bs.clone().iter().cloned() { - __result.extend((*b.diagnostics.clone()).iter().cloned()); - } - __result - }); - let return_b = - instantiate_algebra_type(template.return_type.clone(), &base, &source_indices); - let field_ty = if ((param_types.clone().len() as i64) > 0) { - algebra_method_field( - &template.name.clone(), - param_types.clone(), - return_b.ty.clone(), - ) + let param_bs = Rc::new({ let mut __result = Vec::new(); for tp in template.param_types.clone().iter().cloned() { __result.push(instantiate_algebra_type(tp.clone(), &base, &source_indices)); } __result }); +let param_types = Rc::new({ let mut __result = Vec::new(); for b in param_bs.clone().iter().cloned() { __result.push(b.ty.clone()); } __result }); +let param_diags = Rc::new({ let mut __result = Vec::new(); for b in param_bs.clone().iter().cloned() { __result.extend((*b.diagnostics.clone()).iter().cloned()); } __result }); +let return_b = instantiate_algebra_type(template.return_type.clone(), &base, &source_indices); +let field_ty = if ((param_types.clone().len() as i64) > 0) { + algebra_method_field(&template.name.clone(), param_types.clone(), return_b.ty.clone()) } else { algebra_value_field(&template.name.clone(), return_b.ty.clone()) }; - Rc::new(KernelTypeBuild { - ty: field_ty, - diagnostics: v2_rt::concat(param_diags, return_b.diagnostics.clone()), - }) - } +Rc::new(KernelTypeBuild { + ty: field_ty, + diagnostics: v2_rt::concat(param_diags, return_b.diagnostics.clone()), +}) +} } -pub fn enrich_kernel_type( - name: &String, - base: &Rc, - source_indices: Rc>>, -) -> Rc { +pub fn enrich_kernel_type(name: &String, base: &Rc, source_indices: Rc>>) -> Rc { { let profile = v2_rt::map_get(&kernel_algebra_profile(), name.clone()); - match profile { - Some(p) => { - let field_bs = Rc::new({ - let mut __result = Vec::new(); - for template in algebra_templates_for_profile(p.clone()).iter().cloned() { - __result.push(instantiate_algebra_field(&template, &base, &source_indices)); - } - __result - }); - let fields = Rc::new({ - let mut __result = Vec::new(); - for b in field_bs.clone().iter().cloned() { - __result.push(b.ty.clone()); - } - __result - }); - let field_diags = Rc::new({ - let mut __result = Vec::new(); - for b in field_bs.clone().iter().cloned() { - __result.extend((*b.diagnostics.clone()).iter().cloned()); - } - __result - }); - Rc::new(KernelTypeBuild { - ty: enrich_base_with_fields(name.clone(), &base, fields), - diagnostics: field_diags, - }) - } - None => Rc::new(KernelTypeBuild { - ty: base.clone(), - diagnostics: Rc::new(vec![]), - }), - } - } +match profile { + Some(p) => { + let field_bs = Rc::new({ let mut __result = Vec::new(); for template in algebra_templates_for_profile(p.clone()).iter().cloned() { __result.push(instantiate_algebra_field(&template, &base, &source_indices)); } __result }); +let fields = Rc::new({ let mut __result = Vec::new(); for b in field_bs.clone().iter().cloned() { __result.push(b.ty.clone()); } __result }); +let field_diags = Rc::new({ let mut __result = Vec::new(); for b in field_bs.clone().iter().cloned() { __result.extend((*b.diagnostics.clone()).iter().cloned()); } __result }); +Rc::new(KernelTypeBuild { + ty: enrich_base_with_fields(name.clone(), &base, fields), + diagnostics: field_diags, +}) +}, + None => Rc::new(KernelTypeBuild { + ty: base.clone(), + diagnostics: Rc::new(vec![]), +}), +} +} } -pub fn unify_template( - template: Rc, - concrete: &Rc, - receiver: &Rc, - subst: Rc>>, - source_indices: &Rc>>, -) -> Rc>> { - stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || match (*template).clone() { - AlgebraTypeTemplate::AlgebraTypeVariable { id: var_id, .. } => { - if (v2_rt::map_get(&subst, var_id.clone()) != None) { - subst.clone() - } else { - v2_rt::rc_map_insert(subst.clone(), var_id.clone(), concrete.clone()) - } - } - AlgebraTypeTemplate::ReceiverSelf => { +pub fn unify_template(template: Rc, concrete: &Rc, receiver: &Rc, subst: Rc>>, source_indices: &Rc>>) -> Rc>> { + stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { + match (*template).clone() { + AlgebraTypeTemplate::AlgebraTypeVariable { id: var_id, .. } => if (v2_rt::map_get(&subst, var_id.clone()) != None) { + subst.clone() + } else { + v2_rt::rc_map_insert(subst.clone(), var_id.clone(), concrete.clone()) + }, + AlgebraTypeTemplate::ReceiverSelf => { let s1 = match concrete.children.clone().first().cloned() { - Some(k) => { - if (v2_rt::map_get(&subst, "__key__".to_string()) != None) { - subst.clone() - } else { - v2_rt::rc_map_insert( - subst.clone(), - "__key__".to_string(), - child_type_node(&k), - ) - } - } - None => subst.clone(), - }; - match concrete.children.clone().get(1 as usize).cloned() { - Some(v) => { - if (v2_rt::map_get(&s1, "__value__".to_string()) != None) { - s1.clone() - } else { - v2_rt::rc_map_insert( - s1.clone(), - "__value__".to_string(), - child_type_node(&v), - ) - } - } - None => s1.clone(), - } - } - AlgebraTypeTemplate::ReceiverKey => { - if (v2_rt::map_get(&subst, "__key__".to_string()) != None) { - subst.clone() - } else { - v2_rt::rc_map_insert(subst.clone(), "__key__".to_string(), concrete.clone()) - } - } - AlgebraTypeTemplate::ReceiverValue => { - if (v2_rt::map_get(&subst, "__value__".to_string()) != None) { + Some(k) => if (v2_rt::map_get(&subst, "__key__".to_string()) != None) { subst.clone() } else { - v2_rt::rc_map_insert(subst.clone(), "__value__".to_string(), concrete.clone()) - } - } - AlgebraTypeTemplate::ReceiverElement => { - if (v2_rt::map_get(&subst, "__element__".to_string()) != None) { - subst.clone() + v2_rt::rc_map_insert(subst.clone(), "__key__".to_string(), child_type_node(&k)) + }, + None => subst.clone(), +}; +match concrete.children.clone().get(1 as usize).cloned() { + Some(v) => if (v2_rt::map_get(&s1, "__value__".to_string()) != None) { + s1.clone() } else { - v2_rt::rc_map_insert(subst.clone(), "__element__".to_string(), concrete.clone()) - } - } - AlgebraTypeTemplate::CallableOf { - return_type: ret_template, - .. - } => unify_template( - ret_template.clone(), - &concrete, - &receiver, - subst.clone(), - &source_indices, - ), - AlgebraTypeTemplate::ContainerOf { - source: src, - element: elem_template, - .. - } => { + v2_rt::rc_map_insert(s1.clone(), "__value__".to_string(), child_type_node(&v)) + }, + None => s1.clone(), +} +}, + AlgebraTypeTemplate::ReceiverKey => if (v2_rt::map_get(&subst, "__key__".to_string()) != None) { + subst.clone() + } else { + v2_rt::rc_map_insert(subst.clone(), "__key__".to_string(), concrete.clone()) + }, + AlgebraTypeTemplate::ReceiverValue => if (v2_rt::map_get(&subst, "__value__".to_string()) != None) { + subst.clone() + } else { + v2_rt::rc_map_insert(subst.clone(), "__value__".to_string(), concrete.clone()) + }, + AlgebraTypeTemplate::ReceiverElement => if (v2_rt::map_get(&subst, "__element__".to_string()) != None) { + subst.clone() + } else { + v2_rt::rc_map_insert(subst.clone(), "__element__".to_string(), concrete.clone()) + }, + AlgebraTypeTemplate::CallableOf { return_type: ret_template, .. } => unify_template(ret_template.clone(), &concrete, &receiver, subst.clone(), &source_indices), + AlgebraTypeTemplate::ContainerOf { source: src, element: elem_template, .. } => { let expected_name = match (*src.clone()).clone() { - ContainerSource::SameAsReceiver => { - authored_name_at(source_indices.clone(), &receiver) - } - ContainerSource::Named { name: n, .. } => n.clone(), - }; - if (authored_name_at(source_indices.clone(), &concrete).as_str() - != expected_name.as_str()) - { + ContainerSource::SameAsReceiver => authored_name_at(source_indices.clone(), &receiver), + ContainerSource::Named { name: n, .. } => n.clone(), +}; +if (authored_name_at(source_indices.clone(), &concrete).as_str() != expected_name.as_str()) { subst.clone() } else { match concrete.children.clone().first().cloned() { - Some(child) => unify_template( - elem_template.clone(), - &child_type_node(&child), - &receiver, - subst.clone(), - &source_indices, - ), - None => subst.clone(), - } + Some(child) => unify_template(elem_template.clone(), &child_type_node(&child), &receiver, subst.clone(), &source_indices), + None => subst.clone(), +} } - } - AlgebraTypeTemplate::OptionalOf { - inner: inner_template, - .. - } => match concrete.children.clone().first().cloned() { - Some(child) => unify_template( - inner_template.clone(), - &child_type_node(&child), - &receiver, - subst.clone(), - &source_indices, - ), - None => subst.clone(), - }, - AlgebraTypeTemplate::TupleOf { - first: ft, - second: st, - .. - } => { +}, + AlgebraTypeTemplate::OptionalOf { inner: inner_template, .. } => match concrete.children.clone().first().cloned() { + Some(child) => unify_template(inner_template.clone(), &child_type_node(&child), &receiver, subst.clone(), &source_indices), + None => subst.clone(), +}, + AlgebraTypeTemplate::TupleOf { first: ft, second: st, .. } => { let s2 = match concrete.children.clone().first().cloned() { - Some(c) => unify_template( - ft.clone(), - &child_type_node(&c), - &receiver, - subst.clone(), - &source_indices, - ), - None => subst.clone(), - }; - match concrete.children.clone().get(1 as usize).cloned() { - Some(c) => unify_template( - st.clone(), - &child_type_node(&c), - &receiver, - s2, - &source_indices, - ), - None => s2, - } - } - _ => subst.clone(), + Some(c) => unify_template(ft.clone(), &child_type_node(&c), &receiver, subst.clone(), &source_indices), + None => subst.clone(), +}; +match concrete.children.clone().get(1 as usize).cloned() { + Some(c) => unify_template(st.clone(), &child_type_node(&c), &receiver, s2, &source_indices), + None => s2, +} +}, + _ => subst.clone(), +} }) } pub fn is_receiver_self(t: Rc) -> bool { match (*t).clone() { - AlgebraTypeTemplate::ReceiverSelf => true, - _ => false, - } + AlgebraTypeTemplate::ReceiverSelf => true, + _ => false, +} } -pub fn build_type_substitution( - param_templates: &Rc>>, - arg_types: Rc>>, - receiver: Rc, - base_subst: Rc>>, - source_indices: Rc>>, -) -> Rc>> { +pub fn build_type_substitution(param_templates: &Rc>>, arg_types: Rc>>, receiver: Rc, base_subst: Rc>>, source_indices: Rc>>) -> Rc>> { { let first_is_self = match param_templates.clone().first().cloned() { - Some(t) => is_receiver_self(t.clone()), - None => false, - }; - let non_receiver_templates = if first_is_self { - Rc::new( - param_templates - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ) + Some(t) => is_receiver_self(t.clone()), + None => false, +}; +let non_receiver_templates = if first_is_self { + Rc::new(param_templates.clone().iter().cloned().skip(1 as usize).collect::>()) } else { param_templates.clone() }; - let pairs = Rc::new({ - let mut __result = Vec::new(); - for pair in Rc::new( - non_receiver_templates - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - { - if (pair.0.clone() < (arg_types.clone().len() as i64)) { - __result.push(pair); - } - } - __result - }); - pairs.iter().cloned().fold( - base_subst.clone(), - |subst: Rc>>, pair: (i64, Rc)| { - let arg_type = match Rc::new({ - let mut __result = Vec::new(); - for ap in Rc::new({ - let mut __result = Vec::new(); - for ap in Rc::new( - arg_types - .clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - { - if (ap.0.clone() == pair.0.clone()) { - __result.push(ap); - } - } - __result - }) - .iter() - .cloned() - { - __result.push(ap.1.clone()); - } - __result - }) - .first() - .cloned() - { - Some(a) => a.clone(), - None => error_type(), - }; - unify_template(pair.1.clone(), &arg_type, &receiver, subst, &source_indices) - }, - ) - } +let pairs = Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(non_receiver_templates.iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { if (pair.0.clone() < (arg_types.clone().len() as i64)) { __result.push(pair); } } __result }); +pairs.iter().cloned().fold(base_subst.clone(), |subst: Rc>>, pair: (i64, Rc)| { + let arg_type = match Rc::new({ let mut __result = Vec::new(); for ap in Rc::new({ let mut __result = Vec::new(); for ap in Rc::new(arg_types.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { if (ap.0.clone() == pair.0.clone()) { __result.push(ap); } } __result }).iter().cloned() { __result.push(ap.1.clone()); } __result }).first().cloned() { + Some(a) => a.clone(), + None => error_type(), +}; +unify_template(pair.1.clone(), &arg_type, &receiver, subst, &source_indices) +}) +} } -pub fn apply_type_substitution( - template: Rc, - subst: &Rc>>, - receiver: &Rc, - source_indices: &Rc>>, -) -> Rc { - stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || match (*template).clone() { - AlgebraTypeTemplate::AlgebraTypeVariable { id: var_id, .. } => { - match v2_rt::map_get(&subst, var_id.clone()) { - Some(resolved) => Rc::new(KernelTypeBuild { - ty: resolved.clone(), - diagnostics: Rc::new(vec![]), - }), - None => Rc::new(KernelTypeBuild { - ty: type_variable_node(var_id.clone()), - diagnostics: Rc::new(vec![]), - }), - } - } - AlgebraTypeTemplate::ReceiverSelf => { +pub fn apply_type_substitution(template: Rc, subst: &Rc>>, receiver: &Rc, source_indices: &Rc>>) -> Rc { + stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { + match (*template).clone() { + AlgebraTypeTemplate::AlgebraTypeVariable { id: var_id, .. } => match v2_rt::map_get(&subst, var_id.clone()) { + Some(resolved) => Rc::new(KernelTypeBuild { + ty: resolved.clone(), + diagnostics: Rc::new(vec![]), +}), + None => Rc::new(KernelTypeBuild { + ty: type_variable_node(var_id.clone()), + diagnostics: Rc::new(vec![]), +}), +}, + AlgebraTypeTemplate::ReceiverSelf => { let receiver_name_str = authored_name_at(source_indices.clone(), &receiver); - let is_bare = (is_container_type(receiver_name_str.clone()) && { - let mut __all = true; - for ch in receiver.children.clone().iter().cloned() { - if !({ - let inner = child_type_node(&ch); - if (inner.inferred.clone() != None) { - is_type_variable(inner.inferred.clone().clone().unwrap()) - } else { - ((inner.ident_span.clone() == None) - || !is_kernel_type(authored_name_at( - source_indices.clone(), - &inner, - ))) - } - }) { - __all = false; - break; - } +let is_bare = (is_container_type(receiver_name_str.clone()) && { let mut __all = true; for ch in receiver.children.clone().iter().cloned() { if !({ + let inner = child_type_node(&ch); +if (inner.inferred.clone() != None) { + is_type_variable(inner.inferred.clone().clone().unwrap()) + } else { + ((inner.ident_span.clone() == None) || !is_kernel_type(authored_name_at(source_indices.clone(), &inner))) } - __all - }); - if is_bare { +}) { __all = false; break; } } __all }); +if is_bare { { let arity = container_expected_arity(receiver_name_str.clone()); - if (arity.clone() == Some(2)) { +if (arity.clone() == Some(2)) { match v2_rt::map_get(&subst, "__key__".to_string()) { - Some(key) => { - let val = match v2_rt::map_get(&subst, "__value__".to_string()) { - Some(v) => v.clone(), - None => type_variable_node("V".to_string()), - }; - make_map_type(key.clone(), val) - } - None => Rc::new(KernelTypeBuild { - ty: receiver.clone(), - diagnostics: Rc::new(vec![]), - }), - } + Some(key) => { + let val = match v2_rt::map_get(&subst, "__value__".to_string()) { + Some(v) => v.clone(), + None => type_variable_node("V".to_string()), +}; +make_map_type(key.clone(), val) +}, + None => Rc::new(KernelTypeBuild { + ty: receiver.clone(), + diagnostics: Rc::new(vec![]), +}), +} } else { if (arity.clone() == Some(1)) { match v2_rt::map_get(&subst, "__element__".to_string()) { - Some(elem) => make_container_type(&receiver_name_str, elem.clone()), - None => Rc::new(KernelTypeBuild { - ty: receiver.clone(), - diagnostics: Rc::new(vec![]), - }), - } + Some(elem) => make_container_type(&receiver_name_str, elem.clone()), + None => Rc::new(KernelTypeBuild { + ty: receiver.clone(), + diagnostics: Rc::new(vec![]), +}), +} } else { Rc::new(KernelTypeBuild { - ty: receiver.clone(), - diagnostics: Rc::new(vec![]), - }) + ty: receiver.clone(), + diagnostics: Rc::new(vec![]), +}) } } - } +} } else { Rc::new(KernelTypeBuild { - ty: receiver.clone(), - diagnostics: Rc::new(vec![]), - }) + ty: receiver.clone(), + diagnostics: Rc::new(vec![]), +}) } - } - AlgebraTypeTemplate::ReceiverElement => match receiver.children.clone().first().cloned() { - Some(child) => Rc::new(KernelTypeBuild { - ty: child_type_node(&child), - diagnostics: Rc::new(vec![]), - }), - None => match v2_rt::map_get(&subst, "__element__".to_string()) { - Some(elem) => Rc::new(KernelTypeBuild { - ty: elem.clone(), - diagnostics: Rc::new(vec![]), - }), - None => { - let rname = authored_name_at(source_indices.clone(), &receiver); - match container_param_name(rname.clone(), 0) { - Some(n) => Rc::new(KernelTypeBuild { - ty: type_variable_node(n.clone()), - diagnostics: Rc::new(vec![]), - }), - None => Rc::new(KernelTypeBuild { - ty: missing_kernel_container_profile_type(rname.clone()), - diagnostics: Rc::new(vec![kernel_container_profile_miss_diagnostic( - rname.clone(), - )]), - }), - } - } - }, - }, - AlgebraTypeTemplate::ReceiverKey => match receiver.children.clone().first().cloned() { - Some(child) => Rc::new(KernelTypeBuild { - ty: child_type_node(&child), - diagnostics: Rc::new(vec![]), - }), - None => match v2_rt::map_get(&subst, "__key__".to_string()) { - Some(key) => Rc::new(KernelTypeBuild { - ty: key.clone(), - diagnostics: Rc::new(vec![]), - }), - None => { - let rname = authored_name_at(source_indices.clone(), &receiver); - match container_param_name(rname.clone(), 0) { - Some(n) => Rc::new(KernelTypeBuild { - ty: type_variable_node(n.clone()), - diagnostics: Rc::new(vec![]), - }), - None => Rc::new(KernelTypeBuild { - ty: missing_kernel_container_profile_type(rname.clone()), - diagnostics: Rc::new(vec![kernel_container_profile_miss_diagnostic( - rname.clone(), - )]), - }), - } - } - }, - }, - AlgebraTypeTemplate::ReceiverValue => { - match receiver.children.clone().get(1 as usize).cloned() { - Some(child) => Rc::new(KernelTypeBuild { - ty: child_type_node(&child), - diagnostics: Rc::new(vec![]), - }), - None => match v2_rt::map_get(&subst, "__value__".to_string()) { - Some(val) => Rc::new(KernelTypeBuild { - ty: val, - diagnostics: Rc::new(vec![]), - }), - None => { - let rname = authored_name_at(source_indices.clone(), &receiver); - match container_param_name(rname.clone(), 1) { - Some(n) => Rc::new(KernelTypeBuild { - ty: type_variable_node(n.clone()), - diagnostics: Rc::new(vec![]), - }), - None => Rc::new(KernelTypeBuild { - ty: missing_kernel_container_profile_type(rname.clone()), - diagnostics: Rc::new(vec![ - kernel_container_profile_miss_diagnostic(rname.clone()), - ]), - }), - } - } - }, - } - } - AlgebraTypeTemplate::NamedTemplate { name: n, .. } => Rc::new(KernelTypeBuild { - ty: nominal_type_ref(&n), - diagnostics: Rc::new(vec![]), - }), - AlgebraTypeTemplate::ContainerOf { - source: src, - element: inner, - .. - } => { +}, + AlgebraTypeTemplate::ReceiverElement => match receiver.children.clone().first().cloned() { + Some(child) => Rc::new(KernelTypeBuild { + ty: child_type_node(&child), + diagnostics: Rc::new(vec![]), +}), + None => match v2_rt::map_get(&subst, "__element__".to_string()) { + Some(elem) => Rc::new(KernelTypeBuild { + ty: elem.clone(), + diagnostics: Rc::new(vec![]), +}), + None => { + let rname = authored_name_at(source_indices.clone(), &receiver); +match container_param_name(rname.clone(), 0) { + Some(n) => Rc::new(KernelTypeBuild { + ty: type_variable_node(n.clone()), + diagnostics: Rc::new(vec![]), +}), + None => Rc::new(KernelTypeBuild { + ty: missing_kernel_container_profile_type(rname.clone()), + diagnostics: Rc::new(vec![kernel_container_profile_miss_diagnostic(rname.clone())]), +}), +} +}, +}, +}, + AlgebraTypeTemplate::ReceiverKey => match receiver.children.clone().first().cloned() { + Some(child) => Rc::new(KernelTypeBuild { + ty: child_type_node(&child), + diagnostics: Rc::new(vec![]), +}), + None => match v2_rt::map_get(&subst, "__key__".to_string()) { + Some(key) => Rc::new(KernelTypeBuild { + ty: key.clone(), + diagnostics: Rc::new(vec![]), +}), + None => { + let rname = authored_name_at(source_indices.clone(), &receiver); +match container_param_name(rname.clone(), 0) { + Some(n) => Rc::new(KernelTypeBuild { + ty: type_variable_node(n.clone()), + diagnostics: Rc::new(vec![]), +}), + None => Rc::new(KernelTypeBuild { + ty: missing_kernel_container_profile_type(rname.clone()), + diagnostics: Rc::new(vec![kernel_container_profile_miss_diagnostic(rname.clone())]), +}), +} +}, +}, +}, + AlgebraTypeTemplate::ReceiverValue => match receiver.children.clone().get(1 as usize).cloned() { + Some(child) => Rc::new(KernelTypeBuild { + ty: child_type_node(&child), + diagnostics: Rc::new(vec![]), +}), + None => match v2_rt::map_get(&subst, "__value__".to_string()) { + Some(val) => Rc::new(KernelTypeBuild { + ty: val, + diagnostics: Rc::new(vec![]), +}), + None => { + let rname = authored_name_at(source_indices.clone(), &receiver); +match container_param_name(rname.clone(), 1) { + Some(n) => Rc::new(KernelTypeBuild { + ty: type_variable_node(n.clone()), + diagnostics: Rc::new(vec![]), +}), + None => Rc::new(KernelTypeBuild { + ty: missing_kernel_container_profile_type(rname.clone()), + diagnostics: Rc::new(vec![kernel_container_profile_miss_diagnostic(rname.clone())]), +}), +} +}, +}, +}, + AlgebraTypeTemplate::NamedTemplate { name: n, .. } => Rc::new(KernelTypeBuild { + ty: nominal_type_ref(&n), + diagnostics: Rc::new(vec![]), +}), + AlgebraTypeTemplate::ContainerOf { source: src, element: inner, .. } => { let kind_name = match (*src.clone()).clone() { - ContainerSource::SameAsReceiver => { - authored_name_at(source_indices.clone(), &receiver) - } - ContainerSource::Named { name: n, .. } => n.clone(), - }; - let inner_applied = - apply_type_substitution(inner.clone(), &subst, &receiver, &source_indices); - let built = make_container_type(&kind_name, inner_applied.ty.clone()); - Rc::new(KernelTypeBuild { - ty: built.ty.clone(), - diagnostics: v2_rt::concat( - inner_applied.diagnostics.clone(), - built.diagnostics.clone(), - ), - }) - } - AlgebraTypeTemplate::OptionalOf { inner, .. } => { + ContainerSource::SameAsReceiver => authored_name_at(source_indices.clone(), &receiver), + ContainerSource::Named { name: n, .. } => n.clone(), +}; +let inner_applied = apply_type_substitution(inner.clone(), &subst, &receiver, &source_indices); +let built = make_container_type(&kind_name, inner_applied.ty.clone()); +Rc::new(KernelTypeBuild { + ty: built.ty.clone(), + diagnostics: v2_rt::concat(inner_applied.diagnostics.clone(), built.diagnostics.clone()), +}) +}, + AlgebraTypeTemplate::OptionalOf { inner, .. } => { let ib = apply_type_substitution(inner.clone(), &subst, &receiver, &source_indices); - Rc::new(KernelTypeBuild { - ty: with_optional_cardinality(&ib.ty.clone()), - diagnostics: ib.diagnostics.clone(), - }) - } - AlgebraTypeTemplate::TupleOf { - first: ft, - second: st, - .. - } => { +Rc::new(KernelTypeBuild { + ty: with_optional_cardinality(&ib.ty.clone()), + diagnostics: ib.diagnostics.clone(), +}) +}, + AlgebraTypeTemplate::TupleOf { first: ft, second: st, .. } => { let fb = apply_type_substitution(ft.clone(), &subst, &receiver, &source_indices); - let sb = apply_type_substitution(st.clone(), &subst, &receiver, &source_indices); - Rc::new(KernelTypeBuild { - ty: make_tuple_type(fb.ty.clone(), sb.ty.clone()), - diagnostics: v2_rt::concat(fb.diagnostics.clone(), sb.diagnostics.clone()), - }) - } - AlgebraTypeTemplate::CallableOf { - params: p, - return_type: r, - .. - } => { - let param_bs = Rc::new({ - let mut __result = Vec::new(); - for tp in p.clone().iter().cloned() { - __result.push(apply_type_substitution( - tp.clone(), - &subst, - &receiver, - &source_indices, - )); - } - __result - }); - let param_nodes = Rc::new({ - let mut __result = Vec::new(); - for b in param_bs.clone().iter().cloned() { - __result.push(b.ty.clone()); - } - __result - }); - let param_diags = Rc::new({ - let mut __result = Vec::new(); - for b in param_bs.clone().iter().cloned() { - __result.extend((*b.diagnostics.clone()).iter().cloned()); - } - __result - }); - let rb = apply_type_substitution(r.clone(), &subst, &receiver, &source_indices); - Rc::new(KernelTypeBuild { - ty: make_callable_type( - Rc::new({ - let mut __result = Vec::new(); - for pn in param_nodes.iter().cloned() { - __result.push(make_param_node( - &"_".to_string(), - pn.clone(), - None, - no_span(), - no_span(), - )); - } - __result - }), - rb.ty.clone(), - ), - diagnostics: v2_rt::concat(param_diags, rb.diagnostics.clone()), - }) - } +let sb = apply_type_substitution(st.clone(), &subst, &receiver, &source_indices); +Rc::new(KernelTypeBuild { + ty: make_tuple_type(fb.ty.clone(), sb.ty.clone()), + diagnostics: v2_rt::concat(fb.diagnostics.clone(), sb.diagnostics.clone()), +}) +}, + AlgebraTypeTemplate::CallableOf { params: p, return_type: r, .. } => { + let param_bs = Rc::new({ let mut __result = Vec::new(); for tp in p.clone().iter().cloned() { __result.push(apply_type_substitution(tp.clone(), &subst, &receiver, &source_indices)); } __result }); +let param_nodes = Rc::new({ let mut __result = Vec::new(); for b in param_bs.clone().iter().cloned() { __result.push(b.ty.clone()); } __result }); +let param_diags = Rc::new({ let mut __result = Vec::new(); for b in param_bs.clone().iter().cloned() { __result.extend((*b.diagnostics.clone()).iter().cloned()); } __result }); +let rb = apply_type_substitution(r.clone(), &subst, &receiver, &source_indices); +Rc::new(KernelTypeBuild { + ty: make_callable_type(Rc::new({ let mut __result = Vec::new(); for pn in param_nodes.iter().cloned() { __result.push(make_param_node(&"_".to_string(), pn.clone(), None, no_span(), no_span())); } __result }), rb.ty.clone()), + diagnostics: v2_rt::concat(param_diags, rb.diagnostics.clone()), +}) +}, +} }) } @@ -1374,341 +973,255 @@ pub fn template_return_has_variables(template: Rc) -> bool } pub fn has_type_variable(t: Rc) -> bool { - stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || match (*t).clone() { - AlgebraTypeTemplate::AlgebraTypeVariable { .. } => true, - AlgebraTypeTemplate::ContainerOf { element: inner, .. } => has_type_variable(inner.clone()), - AlgebraTypeTemplate::OptionalOf { inner, .. } => has_type_variable(inner.clone()), - AlgebraTypeTemplate::TupleOf { - first: f, - second: s, - .. - } => (has_type_variable(f.clone()) || has_type_variable(s.clone())), - AlgebraTypeTemplate::CallableOf { return_type: r, .. } => has_type_variable(r.clone()), - _ => false, + stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { + match (*t).clone() { + AlgebraTypeTemplate::AlgebraTypeVariable { .. } => true, + AlgebraTypeTemplate::ContainerOf { element: inner, .. } => has_type_variable(inner.clone()), + AlgebraTypeTemplate::OptionalOf { inner, .. } => has_type_variable(inner.clone()), + AlgebraTypeTemplate::TupleOf { first: f, second: s, .. } => (has_type_variable(f.clone()) || has_type_variable(s.clone())), + AlgebraTypeTemplate::CallableOf { return_type: r, .. } => has_type_variable(r.clone()), + _ => false, +} }) } -pub fn resolve_type_variables_from_template( - template: &Rc, - arg_types: Rc>>, - receiver_type: &Rc, - overrides: Rc>>, - source_indices: &Rc>>, -) -> Rc { +pub fn resolve_type_variables_from_template(template: &Rc, arg_types: Rc>>, receiver_type: &Rc, overrides: Rc>>, source_indices: &Rc>>) -> Rc { { - let subst = build_type_substitution( - &template.param_types.clone(), - arg_types, - receiver_type.clone(), - overrides, - source_indices.clone(), - ); - apply_type_substitution( - template.return_type.clone(), - &subst, - &receiver_type, - &source_indices, - ) - } + let subst = build_type_substitution(&template.param_types.clone(), arg_types, receiver_type.clone(), overrides, source_indices.clone()); +apply_type_substitution(template.return_type.clone(), &subst, &receiver_type, &source_indices) +} } pub fn callable_inferred(n: &Rc) -> Rc { { let is_callable = ((n.params.clone().len() as i64) > 0); - if is_callable { +if is_callable { match n.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: ret, .. }) => ret.clone(), - None => error_type(), - _ => error_type(), - } + Some(InferredNode::Resolved { node: ret, .. }) => ret.clone(), + None => error_type(), + _ => error_type(), +} } else { n.clone() } - } +} } pub fn normalize_access_type_node(mut n: Rc) -> Rc { loop { let has_structure = (n.connective.clone() != Connective::NoConnective); - let unwrapped = if ((n.type_annotation.clone() != None) && has_structure) { +let unwrapped = if ((n.type_annotation.clone() != None) && has_structure) { n.children.clone().first().cloned() } else { None }; - match unwrapped { - Some(base) => { - let __tco_0 = base.clone(); - n = __tco_0; - continue; - } - None => { - break n.clone(); - } - } - } +match unwrapped { + Some(base) => { { + let __tco_0 = base.clone(); +n = __tco_0; +continue; +} }, + None => { break n.clone(); }, +} +} } -pub fn node_type_shape( - n: &Rc, - source_indices: &Rc>>, -) -> String { +pub fn node_type_shape(n: &Rc, source_indices: &Rc>>) -> String { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - let __is_leaf = (((n.connective.clone() == Connective::NoConnective) - && ((n.children.clone().len() as i64) == 0)) - && ((n.properties.clone().len() as i64) == 0)); - let n_name = authored_name_at(source_indices.clone(), &n); - if __is_leaf { - { - let __is_named_ref = match n.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - (((((rt.connective.clone() == Connective::NoConnective) - && ((rt.children.clone().len() as i64) == 0)) - && (rt.ident_span.clone() != None)) - && (authored_name_at(source_indices.clone(), &rt).as_str() - != "None".to_string().as_str())) - && (is_kernel_type(authored_name_at(source_indices.clone(), &rt)) - == false)) - } - _ => false, - }; - if __is_named_ref { - v2_rt::concat(v2_rt::concat("Named(".to_string(), n_name), ")".to_string()) - } else { - v2_rt::concat( - v2_rt::concat("Primitive(".to_string(), n_name), - ")".to_string(), - ) - } - } - } else { - { - let is_product = (n.connective.clone() == Connective::Conj); - let is_coproduct = (n.connective.clone() == Connective::Disj); - if is_product { - if (n.ident_span.clone() == None) { - "Product()".to_string() + { + let __is_leaf = (((n.connective.clone() == Connective::NoConnective) && ((n.children.clone().len() as i64) == 0)) && ((n.properties.clone().len() as i64) == 0)); +let n_name = authored_name_at(source_indices.clone(), &n); +if __is_leaf { + { + let __is_named_ref = match n.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => (((((rt.connective.clone() == Connective::NoConnective) && ((rt.children.clone().len() as i64) == 0)) && (rt.ident_span.clone() != None)) && (authored_name_at(source_indices.clone(), &rt).as_str() != "None".to_string().as_str())) && (is_kernel_type(authored_name_at(source_indices.clone(), &rt)) == false)), + _ => false, +}; +if __is_named_ref { + v2_rt::concat(v2_rt::concat("Named(".to_string(), n_name), ")".to_string()) } else { - v2_rt::concat( - v2_rt::concat("Product(".to_string(), n_name), - ")".to_string(), - ) + v2_rt::concat(v2_rt::concat("Primitive(".to_string(), n_name), ")".to_string()) } - } else { - if is_coproduct { +} + } else { + { + let is_product = (n.connective.clone() == Connective::Conj); +let is_coproduct = (n.connective.clone() == Connective::Disj); +if is_product { if (n.ident_span.clone() == None) { - "Coproduct()".to_string() + "Product()".to_string() } else { - v2_rt::concat( - v2_rt::concat("Coproduct(".to_string(), n_name), - ")".to_string(), - ) + v2_rt::concat(v2_rt::concat("Product(".to_string(), n_name), ")".to_string()) } } else { - { - let __is_container = - node_is_element_collection(&n, source_indices.clone()); - let is_optional = - (n.return_cardinality.clone() == Cardinality::CardOptional); - let is_map = node_is_keyed_collection(&n, source_indices.clone()); - if __is_container { - { - let elem_shape = match n.children.clone().first().cloned() { - Some(el) => { - node_type_shape(&child_type_node(&el), &source_indices) - } - None => "?".to_string(), - }; - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("Container(".to_string(), n_name), - ",".to_string(), - ), - elem_shape, - ), - ")".to_string(), - ) - } + if is_coproduct { + if (n.ident_span.clone() == None) { + "Coproduct()".to_string() } else { - if is_optional { + v2_rt::concat(v2_rt::concat("Coproduct(".to_string(), n_name), ")".to_string()) + } + } else { + { + let __is_container = node_is_element_collection(&n, source_indices.clone()); +let is_optional = (n.return_cardinality.clone() == Cardinality::CardOptional); +let is_map = node_is_keyed_collection(&n, source_indices.clone()); +if __is_container { { - let inner_shape = node_type_shape( - &with_required_cardinality(&n), - &source_indices, - ); - v2_rt::concat( - v2_rt::concat("Optional(".to_string(), inner_shape), - ")".to_string(), - ) - } + let elem_shape = match n.children.clone().first().cloned() { + Some(el) => node_type_shape(&child_type_node(&el), &source_indices), + None => "?".to_string(), +}; +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("Container(".to_string(), n_name), ",".to_string()), elem_shape), ")".to_string()) +} } else { - if is_map { - "Map(...)".to_string() + if is_optional { + { + let inner_shape = node_type_shape(&with_required_cardinality(&n), &source_indices); +v2_rt::concat(v2_rt::concat("Optional(".to_string(), inner_shape), ")".to_string()) +} } else { - v2_rt::concat( - v2_rt::concat("Node(".to_string(), n_name), - ")".to_string(), - ) + if is_map { + "Map(...)".to_string() + } else { + v2_rt::concat(v2_rt::concat("Node(".to_string(), n_name), ")".to_string()) + } } } - } +} } } - } +} } - } +} }) } -pub fn node_type_compatible( - mut left: Rc, - mut right: Rc, - mut source_indices: Rc>>, -) -> bool { +pub fn node_type_compatible(mut left: Rc, mut right: Rc, mut source_indices: Rc>>) -> bool { loop { let left_err = if (left.inferred.clone() != None) { is_compiler_error(left.inferred.clone().clone().unwrap()) } else { false }; - let right_err = if (right.inferred.clone() != None) { +let right_err = if (right.inferred.clone() != None) { is_compiler_error(right.inferred.clone().clone().unwrap()) } else { false }; - let left_tv = if (left.inferred.clone() != None) { +let left_tv = if (left.inferred.clone() != None) { is_type_variable(left.inferred.clone().clone().unwrap()) } else { false }; - let right_tv = if (right.inferred.clone() != None) { +let right_tv = if (right.inferred.clone() != None) { is_type_variable(right.inferred.clone().clone().unwrap()) } else { false }; - let left_opt = (left.return_cardinality.clone() == Cardinality::CardOptional); - let right_opt = (right.return_cardinality.clone() == Cardinality::CardOptional); - let right_is_unit = is_unit_like(&right); - let left_is_unit = is_unit_like(&left); - if (left_err || right_err) { +let left_opt = (left.return_cardinality.clone() == Cardinality::CardOptional); +let right_opt = (right.return_cardinality.clone() == Cardinality::CardOptional); +let right_is_unit = is_unit_like(&right); +let left_is_unit = is_unit_like(&left); +if (left_err || right_err) { break true; - } else { +} else { if (left_tv || right_tv) { break true; - } else { +} else { if (left_opt.clone() && right_is_unit) { break true; - } else { +} else { if (left_is_unit && right_opt.clone()) { break true; - } else { - let left_is_container = - node_is_element_collection(&left, source_indices.clone()); - let right_is_container = - node_is_element_collection(&right, source_indices.clone()); - if (left_is_container && right_is_container) { - if (authored_name_at(source_indices.clone(), &left).as_str() - != authored_name_at(source_indices.clone(), &right).as_str()) - { +} else { + let left_is_container = node_is_element_collection(&left, source_indices.clone()); +let right_is_container = node_is_element_collection(&right, source_indices.clone()); +if (left_is_container && right_is_container) { + if (authored_name_at(source_indices.clone(), &left).as_str() != authored_name_at(source_indices.clone(), &right).as_str()) { break false; - } else { +} else { match left.children.clone().first().cloned() { - Some(left_ch) => { - match right.children.clone().first().cloned() { - Some(right_ch) => { - let left_el = child_type_node(&left_ch); - let right_el = child_type_node(&right_ch); - let left_el_is_unit = is_unit_like(&left_el); - let right_el_is_unit = is_unit_like(&right_el); - if (left_el_is_unit || right_el_is_unit) { - break true; - } else { - { - let __tco_0 = left_el.clone(); - let __tco_1 = right_el.clone(); - left = __tco_0; - right = __tco_1; - continue; - } - } - } - None => { - break true; - } - } - } - None => { - break true; - } - } - } - } else { + Some(left_ch) => { match right.children.clone().first().cloned() { + Some(right_ch) => { let left_el = child_type_node(&left_ch); +let right_el = child_type_node(&right_ch); +let left_el_is_unit = is_unit_like(&left_el); +let right_el_is_unit = is_unit_like(&right_el); +if (left_el_is_unit || right_el_is_unit) { + break true; +} else { + { + let __tco_0 = left_el.clone(); +let __tco_1 = right_el.clone(); +left = __tco_0; +right = __tco_1; +continue; +} +} }, + None => { break true; }, +} }, + None => { break true; }, +} +} +} else { if (left_opt.clone() && right_opt.clone()) { let left_inner = with_required_cardinality(&left); - let right_inner = with_required_cardinality(&right); - let left_inner_is_unit = is_unit_like(&left_inner); - let right_inner_is_unit = is_unit_like(&right_inner); - if (left_inner_is_unit || right_inner_is_unit) { +let right_inner = with_required_cardinality(&right); +let left_inner_is_unit = is_unit_like(&left_inner); +let right_inner_is_unit = is_unit_like(&right_inner); +if (left_inner_is_unit || right_inner_is_unit) { break true; - } else { +} else { { let __tco_0 = left_inner.clone(); - let __tco_1 = right_inner.clone(); - left = __tco_0; - right = __tco_1; - continue; - } - } - } else { +let __tco_1 = right_inner.clone(); +left = __tco_0; +right = __tco_1; +continue; +} +} +} else { if (left_opt.clone() || right_opt.clone()) { break false; - } else { - break (authored_name_at(source_indices.clone(), &left) - .as_str() - == authored_name_at(source_indices.clone(), &right) - .as_str()); - } - } - } - } - } - } - } - } +} else { + break (authored_name_at(source_indices.clone(), &left).as_str() == authored_name_at(source_indices.clone(), &right).as_str()); +} +} +} +} +} +} +} +} } -pub fn prefer_specific_type( - left: Rc, - right: Rc, - source_indices: &Rc>>, -) -> Rc { +pub fn prefer_specific_type(left: Rc, right: Rc, source_indices: &Rc>>) -> Rc { { let left_is_container = node_is_element_collection(&left, source_indices.clone()); - let left_is_optional = (left.return_cardinality.clone() == Cardinality::CardOptional); - let left_first_child = left.children.clone().first().cloned(); - let left_norm_name = authored_name_at(source_indices.clone(), &left); - let left_is_unit_inner = if left_is_container.clone() { +let left_is_optional = (left.return_cardinality.clone() == Cardinality::CardOptional); +let left_first_child = left.children.clone().first().cloned(); +let left_norm_name = authored_name_at(source_indices.clone(), &left); +let left_is_unit_inner = if left_is_container.clone() { match left_first_child { - Some(ch) => { - let el = child_type_node(&ch); - let el_is_unit = is_unit_like(&el); - el_is_unit - } - None => false, - } + Some(ch) => { + let el = child_type_node(&ch); +let el_is_unit = is_unit_like(&el); +el_is_unit +}, + None => false, +} } else { if left_is_optional.clone() { { let left_is_unit = is_unit_like(&left); - left_is_unit - } +left_is_unit +} } else { false } }; - let right_is_container = node_is_element_collection(&right, source_indices.clone()); - let right_is_optional = (right.return_cardinality.clone() == Cardinality::CardOptional); - let same_kind = if (left_is_container.clone() && right_is_container) { +let right_is_container = node_is_element_collection(&right, source_indices.clone()); +let right_is_optional = (right.return_cardinality.clone() == Cardinality::CardOptional); +let same_kind = if (left_is_container.clone() && right_is_container) { (left_norm_name.as_str() == authored_name_at(source_indices.clone(), &right).as_str()) } else { if (left_is_optional.clone() && right_is_optional) { @@ -1717,51 +1230,45 @@ pub fn prefer_specific_type( false } }; - if (same_kind && left_is_unit_inner) { +if (same_kind && left_is_unit_inner) { right.clone() } else { - if (is_fully_resolved(&right, &source_indices) - && !is_fully_resolved(&left, &source_indices)) - { + if (is_fully_resolved(&right, &source_indices) && !is_fully_resolved(&left, &source_indices)) { right.clone() } else { left.clone() } } - } +} } -pub fn node_type_equals( - left: &Rc, - right: &Rc, - source_indices: Rc>>, -) -> bool { +pub fn node_type_equals(left: &Rc, right: &Rc, source_indices: Rc>>) -> bool { { let left_err = if (left.inferred.clone() != None) { is_compiler_error(left.inferred.clone().clone().unwrap()) } else { false }; - let right_err = if (right.inferred.clone() != None) { +let right_err = if (right.inferred.clone() != None) { is_compiler_error(right.inferred.clone().clone().unwrap()) } else { false }; - let left_tv = if (left.inferred.clone() != None) { +let left_tv = if (left.inferred.clone() != None) { is_type_variable(left.inferred.clone().clone().unwrap()) } else { false }; - let right_tv = if (right.inferred.clone() != None) { +let right_tv = if (right.inferred.clone() != None) { is_type_variable(right.inferred.clone().clone().unwrap()) } else { false }; - let left_opt = (left.return_cardinality.clone() == Cardinality::CardOptional); - let right_opt = (right.return_cardinality.clone() == Cardinality::CardOptional); - let right_is_unit_eq = is_unit_like(&right); - let left_is_unit_eq = is_unit_like(&left); - if (left_err || right_err) { +let left_opt = (left.return_cardinality.clone() == Cardinality::CardOptional); +let right_opt = (right.return_cardinality.clone() == Cardinality::CardOptional); +let right_is_unit_eq = is_unit_like(&right); +let left_is_unit_eq = is_unit_like(&left); +if (left_err || right_err) { true } else { if (left_tv.clone() && right_tv.clone()) { @@ -1777,11 +1284,7 @@ pub fn node_type_equals( true } else { if (left_opt.clone() && right_opt.clone()) { - node_type_equals_core( - &with_required_cardinality(&left), - &with_required_cardinality(&right), - &source_indices, - ) + node_type_equals_core(&with_required_cardinality(&left), &with_required_cardinality(&right), &source_indices) } else { node_type_equals_core(&left, &right, &source_indices) } @@ -1790,75 +1293,34 @@ pub fn node_type_equals( } } } - } +} } -pub fn node_type_equals_core( - left: &Rc, - right: &Rc, - source_indices: &Rc>>, -) -> bool { +pub fn node_type_equals_core(left: &Rc, right: &Rc, source_indices: &Rc>>) -> bool { { - let left_leaf = (((left.connective.clone() == Connective::NoConnective) - && ((left.children.clone().len() as i64) == 0)) - && ((left.properties.clone().len() as i64) == 0)); - let right_leaf = (((right.connective.clone() == Connective::NoConnective) - && ((right.children.clone().len() as i64) == 0)) - && ((right.properties.clone().len() as i64) == 0)); - let left_struct = (left.connective.clone() != Connective::NoConnective); - let right_struct = (right.connective.clone() != Connective::NoConnective); - let left_name = authored_name_at(source_indices.clone(), &left); - let right_name = authored_name_at(source_indices.clone(), &right); - if (left_leaf.clone() && right_leaf.clone()) { + let left_leaf = (((left.connective.clone() == Connective::NoConnective) && ((left.children.clone().len() as i64) == 0)) && ((left.properties.clone().len() as i64) == 0)); +let right_leaf = (((right.connective.clone() == Connective::NoConnective) && ((right.children.clone().len() as i64) == 0)) && ((right.properties.clone().len() as i64) == 0)); +let left_struct = (left.connective.clone() != Connective::NoConnective); +let right_struct = (right.connective.clone() != Connective::NoConnective); +let left_name = authored_name_at(source_indices.clone(), &left); +let right_name = authored_name_at(source_indices.clone(), &right); +if (left_leaf.clone() && right_leaf.clone()) { (left_name.as_str() == right_name.as_str()) } else { if (left_struct.clone() && right_struct.clone()) { if (left_name.as_str() != right_name.as_str()) { false } else { - if ((left.connective.clone() == Connective::Conj) - != (right.connective.clone() == Connective::Conj)) - { + if ((left.connective.clone() == Connective::Conj) != (right.connective.clone() == Connective::Conj)) { false } else { - if ((left.children.clone().len() as i64) - != (right.children.clone().len() as i64)) - { + if ((left.children.clone().len() as i64) != (right.children.clone().len() as i64)) { false } else { - { - let mut __all = true; - for pair in Rc::new( - left.children - .clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - { - if !(match right - .children - .clone() - .get(pair.0.clone() as usize) - .cloned() - { - Some(right_child) => node_type_equals( - &pair.1.clone(), - &right_child, - source_indices.clone(), - ), - None => false, - }) { - __all = false; - break; - } - } - __all - } + { let mut __all = true; for pair in Rc::new(left.children.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { if !(match right.children.clone().get(pair.0.clone() as usize).cloned() { + Some(right_child) => node_type_equals(&pair.1.clone(), &right_child, source_indices.clone()), + None => false, +}) { __all = false; break; } } __all } } } } @@ -1870,370 +1332,222 @@ pub fn node_type_equals_core( (left_name.as_str() == right_name.as_str()) } else { { - let left_is_container = - node_is_element_collection(&left, source_indices.clone()); - let right_is_container = - node_is_element_collection(&right, source_indices.clone()); - if (left_is_container && right_is_container) { + let left_is_container = node_is_element_collection(&left, source_indices.clone()); +let right_is_container = node_is_element_collection(&right, source_indices.clone()); +if (left_is_container && right_is_container) { if (left_name.as_str() != right_name.as_str()) { false } else { match left.children.clone().first().cloned() { - Some(left_ch) => { - match right.children.clone().first().cloned() { - Some(right_ch) => node_type_equals( - &child_type_node(&left_ch), - &child_type_node(&right_ch), - source_indices.clone(), - ), - None => false, - } - } - None => false, - } + Some(left_ch) => match right.children.clone().first().cloned() { + Some(right_ch) => node_type_equals(&child_type_node(&left_ch), &child_type_node(&right_ch), source_indices.clone()), + None => false, +}, + None => false, +} } } else { { - let both_maps = - (node_is_keyed_collection(&left, source_indices.clone()) - && node_is_keyed_collection( - &right, - source_indices.clone(), - )); - if both_maps { - if (((left.children.clone().len() as i64) == 2) - && ((right.children.clone().len() as i64) == 2)) - { + let both_maps = (node_is_keyed_collection(&left, source_indices.clone()) && node_is_keyed_collection(&right, source_indices.clone())); +if both_maps { + if (((left.children.clone().len() as i64) == 2) && ((right.children.clone().len() as i64) == 2)) { match left.children.clone().first().cloned() { - Some(left_first) => match right - .children - .clone() - .first() - .cloned() - { - Some(right_first) => match left - .children - .clone() - .get(1 as usize) - .cloned() - { - Some(left_second) => match right - .children - .clone() - .get(1 as usize) - .cloned() - { - Some(right_second) => { - (node_type_equals( - &child_type_node(&left_first), - &child_type_node(&right_first), - source_indices.clone(), - ) && node_type_equals( - &child_type_node(&left_second), - &child_type_node(&right_second), - source_indices.clone(), - )) - } - None => false, - }, - None => false, - }, - None => false, - }, - None => false, - } + Some(left_first) => match right.children.clone().first().cloned() { + Some(right_first) => match left.children.clone().get(1 as usize).cloned() { + Some(left_second) => match right.children.clone().get(1 as usize).cloned() { + Some(right_second) => (node_type_equals(&child_type_node(&left_first), &child_type_node(&right_first), source_indices.clone()) && node_type_equals(&child_type_node(&left_second), &child_type_node(&right_second), source_indices.clone())), + None => false, +}, + None => false, +}, + None => false, +}, + None => false, +} } else { false } } else { - if (((left.params.clone().len() as i64) > 0) - && ((right.params.clone().len() as i64) > 0)) - { - if ((left.params.clone().len() as i64) - != (right.params.clone().len() as i64)) - { + if (((left.params.clone().len() as i64) > 0) && ((right.params.clone().len() as i64) > 0)) { + if ((left.params.clone().len() as i64) != (right.params.clone().len() as i64)) { false } else { { - let params_eq = { - let mut __all = true; - for pair in Rc::new( - left.params - .clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - { - if !(match right - .params - .clone() - .get(pair.0.clone() as usize) - .cloned() - { - Some(right_param) => { - node_type_equals( - ¶m_node_type_expr( - &pair.1.clone(), - ), - ¶m_node_type_expr( - &right_param, - ), - source_indices.clone(), - ) - } - None => false, - }) { - __all = false; - break; - } - } - __all - }; - if (params_eq == false) { + let params_eq = { let mut __all = true; for pair in Rc::new(left.params.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { if !(match right.params.clone().get(pair.0.clone() as usize).cloned() { + Some(right_param) => node_type_equals(¶m_node_type_expr(&pair.1.clone()), ¶m_node_type_expr(&right_param), source_indices.clone()), + None => false, +}) { __all = false; break; } } __all }; +if (params_eq == false) { false } else { - match left - .inferred - .clone() - .as_deref() - .cloned() - { - Some(InferredNode::Resolved { - node: left_ret, - .. - }) => match right - .inferred - .clone() - .as_deref() - .cloned() - { - Some(InferredNode::Resolved { - node: right_ret, - .. - }) => node_type_equals( - &left_ret, - &right_ret, - source_indices.clone(), - ), - None => false, - _ => false, - }, - None => { - (right.inferred.clone() == None) - } - _ => false, - } + match left.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: left_ret, .. }) => match right.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: right_ret, .. }) => node_type_equals(&left_ret, &right_ret, source_indices.clone()), + None => false, + _ => false, +}, + None => (right.inferred.clone() == None), + _ => false, +} } - } +} } } else { false } } - } +} } - } +} } } } } - } +} } -pub fn node_type_deps( - n: &Rc, - source_indices: &Rc>>, -) -> Rc> { +pub fn node_type_deps(n: &Rc, source_indices: &Rc>>) -> Rc> { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - let n_is_type_var = if (n.inferred.clone() != None) { - is_type_variable(n.inferred.clone().clone().unwrap()) - } else { - false - }; - if n_is_type_var { - return Rc::new(vec![]); - } - let __is_named_ref = if (n.inferred.clone() == None) { - false - } else { - match n.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - (((((rt.connective.clone() == Connective::NoConnective) - && ((rt.children.clone().len() as i64) == 0)) - && (rt.ident_span.clone() != None)) - && (authored_name_at(source_indices.clone(), &rt).as_str() - != "None".to_string().as_str())) - && (is_kernel_type(authored_name_at(source_indices.clone(), &rt)) == false)) - } - _ => false, - } - }; - let has_structure = (n.connective.clone() != Connective::NoConnective); - let n_name = authored_name_at(source_indices.clone(), &n); - if __is_named_ref { - match n.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - Rc::new(vec![authored_name_at(source_indices.clone(), &rt)]) - } - _ => Rc::new(vec![]), + { + let n_is_type_var = if (n.inferred.clone() != None) { + is_type_variable(n.inferred.clone().clone().unwrap()) + } else { + false + }; +if n_is_type_var { + return Rc::new(vec![]) } - } else { - if has_structure { - Rc::new({ - let mut __result = Vec::new(); - for child in n.children.clone().iter().cloned() { - __result.extend( - (*match child.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - node_type_deps(&rt, &source_indices) - } - _ => { - if (child.inferred.clone() == None) { - node_type_deps(&child, &source_indices) - } else { - Rc::new(vec![]) - } - } - }) - .iter() - .cloned(), - ); - } - __result - }) +let __is_named_ref = if (n.inferred.clone() == None) { + false } else { - if (n.inferred.clone() != None) { - match n.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - node_type_deps(&rt, &source_indices) - } - _ => Rc::new(vec![]), - } + match n.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => (((((rt.connective.clone() == Connective::NoConnective) && ((rt.children.clone().len() as i64) == 0)) && (rt.ident_span.clone() != None)) && (authored_name_at(source_indices.clone(), &rt).as_str() != "None".to_string().as_str())) && (is_kernel_type(authored_name_at(source_indices.clone(), &rt)) == false)), + _ => false, +} + }; +let has_structure = (n.connective.clone() != Connective::NoConnective); +let n_name = authored_name_at(source_indices.clone(), &n); +if __is_named_ref { + match n.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => Rc::new(vec![authored_name_at(source_indices.clone(), &rt)]), + _ => Rc::new(vec![]), +} + } else { + if has_structure { + Rc::new({ let mut __result = Vec::new(); for child in n.children.clone().iter().cloned() { __result.extend((*match child.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => node_type_deps(&rt, &source_indices), + _ => if (child.inferred.clone() == None) { + node_type_deps(&child, &source_indices) + } else { + Rc::new(vec![]) + }, +}).iter().cloned()); } __result }) } else { - if ((n.children.clone().len() as i64) > 0) { - { - let child_deps = Rc::new({ - let mut __result = Vec::new(); - for child in n.children.clone().iter().cloned() { - __result.extend( - (*node_type_deps(&child, &source_indices)).iter().cloned(), - ); - } - __result - }); - if ((n.ident_span.clone() != None) - && (is_kernel_type(n_name.clone()) == false)) + if (n.inferred.clone() != None) { + match n.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => node_type_deps(&rt, &source_indices), + _ => Rc::new(vec![]), +} + } else { + if ((n.children.clone().len() as i64) > 0) { { - v2_rt::concat(Rc::new(vec![n_name.clone()]), child_deps) + let child_deps = Rc::new({ let mut __result = Vec::new(); for child in n.children.clone().iter().cloned() { __result.extend((*node_type_deps(&child, &source_indices)).iter().cloned()); } __result }); +if ((n.ident_span.clone() != None) && (is_kernel_type(n_name.clone()) == false)) { + v2_rt::concat(Rc::new(vec![n_name.clone()]), child_deps) + } else { + child_deps + } +} + } else { + if ((is_kernel_type(n_name.clone()) || (n_name.clone().as_str() == "None".to_string().as_str())) || (n.ident_span.clone() == None)) { + Rc::new(vec![]) } else { - child_deps + Rc::new(vec![n_name.clone()]) } } - } else { - if ((is_kernel_type(n_name.clone()) - || (n_name.clone().as_str() == "None".to_string().as_str())) - || (n.ident_span.clone() == None)) - { - Rc::new(vec![]) - } else { - Rc::new(vec![n_name.clone()]) - } } } } - } +} }) } pub fn infer_literal_node(lit: Rc) -> Rc { match (*lit).clone() { - LiteralValue::LitStr { .. } => string_type(), - LiteralValue::LitInt { .. } => int_type(), - LiteralValue::LitFloat { .. } => float_type(), - LiteralValue::LitBool { .. } => bool_type(), - LiteralValue::LitNull => with_optional_cardinality(&unit_type()), - } + LiteralValue::LitStr { .. } => string_type(), + LiteralValue::LitInt { .. } => int_type(), + LiteralValue::LitFloat { .. } => float_type(), + LiteralValue::LitBool { .. } => bool_type(), + LiteralValue::LitNull => with_optional_cardinality(&unit_type()), +} } -pub fn method_receiver_element_node( - receiver_type: Rc, - source_indices: Rc>>, -) -> Rc { +pub fn method_receiver_element_node(receiver_type: Rc, source_indices: Rc>>) -> Rc { { let normed = normalize_access_type_node(receiver_type.clone()); - let maybe_element = if node_is_keyed_collection(&normed, source_indices) { +let maybe_element = if node_is_keyed_collection(&normed, source_indices) { match normed.children.clone().get(1 as usize).cloned() { - Some(ch) => Some(child_type_node(&ch)), - None => None, - } + Some(ch) => Some(child_type_node(&ch)), + None => None, +} } else { - if ((normed.connective.clone() == Connective::NoConnective) - && ((normed.children.clone().len() as i64) == 1)) - { + if ((normed.connective.clone() == Connective::NoConnective) && ((normed.children.clone().len() as i64) == 1)) { match normed.children.clone().first().cloned() { - Some(ch) => Some(child_type_node(&ch)), - None => None, - } + Some(ch) => Some(child_type_node(&ch)), + None => None, +} } else { None } }; - match maybe_element { - Some(el) => el.clone(), - None => receiver_type.clone(), - } - } +match maybe_element { + Some(el) => el.clone(), + None => receiver_type.clone(), +} +} } pub fn extract_optional_inner_node(n: &Rc) -> Rc { { let is_optional = (n.return_cardinality.clone() == Cardinality::CardOptional); - if is_optional { +if is_optional { with_required_cardinality(&n) } else { n.clone() } - } +} } pub fn algebra_field_kind_name(kind: AlgebraFieldKind) -> String { match kind { - AlgebraFieldKind::AlgAdd => "add".to_string(), - AlgebraFieldKind::AlgMul => "mul".to_string(), - AlgebraFieldKind::AlgReciprocal => "reciprocal".to_string(), - AlgebraFieldKind::AlgQuotient => "quotient".to_string(), - AlgebraFieldKind::AlgRemainder => "remainder".to_string(), - AlgebraFieldKind::AlgCompare => "compare".to_string(), - AlgebraFieldKind::AlgMeet => "meet".to_string(), - AlgebraFieldKind::AlgJoin => "join".to_string(), - } + AlgebraFieldKind::AlgAdd => "add".to_string(), + AlgebraFieldKind::AlgMul => "mul".to_string(), + AlgebraFieldKind::AlgReciprocal => "reciprocal".to_string(), + AlgebraFieldKind::AlgQuotient => "quotient".to_string(), + AlgebraFieldKind::AlgRemainder => "remainder".to_string(), + AlgebraFieldKind::AlgCompare => "compare".to_string(), + AlgebraFieldKind::AlgMeet => "meet".to_string(), + AlgebraFieldKind::AlgJoin => "join".to_string(), +} } pub fn binop_algebra_fields(op: BinOp) -> Rc> { match op { - BinOp::Add => Rc::new(vec![AlgebraFieldKind::AlgAdd]), - BinOp::Sub => Rc::new(vec![AlgebraFieldKind::AlgAdd]), - BinOp::Mul => Rc::new(vec![AlgebraFieldKind::AlgMul]), - BinOp::Div => Rc::new(vec![ - AlgebraFieldKind::AlgReciprocal, - AlgebraFieldKind::AlgQuotient, - ]), - BinOp::Mod => Rc::new(vec![AlgebraFieldKind::AlgRemainder]), - BinOp::Eq => Rc::new(vec![AlgebraFieldKind::AlgCompare]), - BinOp::Ne => Rc::new(vec![AlgebraFieldKind::AlgCompare]), - BinOp::Lt => Rc::new(vec![AlgebraFieldKind::AlgCompare]), - BinOp::Gt => Rc::new(vec![AlgebraFieldKind::AlgCompare]), - BinOp::Le => Rc::new(vec![AlgebraFieldKind::AlgCompare]), - BinOp::Ge => Rc::new(vec![AlgebraFieldKind::AlgCompare]), - BinOp::And => Rc::new(vec![AlgebraFieldKind::AlgMeet]), - BinOp::Or => Rc::new(vec![AlgebraFieldKind::AlgJoin]), - BinOp::NullCoalesce => Rc::new(vec![]), - } + BinOp::Add => Rc::new(vec![AlgebraFieldKind::AlgAdd]), + BinOp::Sub => Rc::new(vec![AlgebraFieldKind::AlgAdd]), + BinOp::Mul => Rc::new(vec![AlgebraFieldKind::AlgMul]), + BinOp::Div => Rc::new(vec![AlgebraFieldKind::AlgReciprocal, AlgebraFieldKind::AlgQuotient]), + BinOp::Mod => Rc::new(vec![AlgebraFieldKind::AlgRemainder]), + BinOp::Eq => Rc::new(vec![AlgebraFieldKind::AlgCompare]), + BinOp::Ne => Rc::new(vec![AlgebraFieldKind::AlgCompare]), + BinOp::Lt => Rc::new(vec![AlgebraFieldKind::AlgCompare]), + BinOp::Gt => Rc::new(vec![AlgebraFieldKind::AlgCompare]), + BinOp::Le => Rc::new(vec![AlgebraFieldKind::AlgCompare]), + BinOp::Ge => Rc::new(vec![AlgebraFieldKind::AlgCompare]), + BinOp::And => Rc::new(vec![AlgebraFieldKind::AlgMeet]), + BinOp::Or => Rc::new(vec![AlgebraFieldKind::AlgJoin]), + BinOp::NullCoalesce => Rc::new(vec![]), +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -2242,43 +1556,23 @@ pub struct AlgebraFieldMatch { pub field_node: Rc, } -pub fn first_matching_algebra_field( - mut n: Rc, - mut candidates: Rc>, - mut source_indices: Rc>>, -) -> Option> { +pub fn first_matching_algebra_field(mut n: Rc, mut candidates: Rc>, mut source_indices: Rc>>) -> Option> { loop { match candidates.clone().first().cloned() { - None => { - break None; - } - Some(kind) => { - match find_child_named( - n.clone(), - algebra_field_kind_name(kind.clone()), - source_indices.clone(), - ) { - Some(f) => { - break Some(Rc::new(AlgebraFieldMatch { - field_kind: kind.clone(), - field_node: f.clone(), - })); - } - None => { - let __tco_0 = Rc::new( - candidates - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ); - candidates = __tco_0; - continue; - } - } - } - } - } + None => { break None; }, + Some(kind) => { match find_child_named(n.clone(), algebra_field_kind_name(kind.clone()), source_indices.clone()) { + Some(f) => { break Some(Rc::new(AlgebraFieldMatch { + field_kind: kind.clone(), + field_node: f.clone(), +})); }, + None => { { + let __tco_0 = Rc::new(candidates.iter().cloned().skip(1 as usize).collect::>()); +candidates = __tco_0; +continue; +} }, +} }, +} +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -2287,132 +1581,113 @@ pub struct BinOpInferred { pub algebra_field: Option, } -pub fn infer_binop_type_node( - op: &BinOp, - left_type: &Rc, - source_indices: Rc>>, -) -> Rc { +pub fn infer_binop_type_node(op: &BinOp, left_type: &Rc, source_indices: Rc>>) -> Rc { match op.clone() { - BinOp::Eq => Rc::new(BinOpInferred { - result_type: bool_type(), - algebra_field: None, - }), - BinOp::Ne => Rc::new(BinOpInferred { - result_type: bool_type(), - algebra_field: None, - }), - BinOp::Lt => Rc::new(BinOpInferred { - result_type: bool_type(), - algebra_field: None, - }), - BinOp::Gt => Rc::new(BinOpInferred { - result_type: bool_type(), - algebra_field: None, - }), - BinOp::Le => Rc::new(BinOpInferred { - result_type: bool_type(), - algebra_field: None, - }), - BinOp::Ge => Rc::new(BinOpInferred { - result_type: bool_type(), - algebra_field: None, - }), - BinOp::And => Rc::new(BinOpInferred { - result_type: bool_type(), - algebra_field: None, - }), - BinOp::Or => Rc::new(BinOpInferred { - result_type: bool_type(), - algebra_field: None, - }), - BinOp::NullCoalesce => Rc::new(BinOpInferred { - result_type: extract_optional_inner_node(&left_type), - algebra_field: None, - }), - _ => { - let candidates = binop_algebra_fields(op.clone()); - let is_product = (left_type.connective.clone() == Connective::Conj); - if is_product { - match first_matching_algebra_field(left_type.clone(), candidates, source_indices) { - Some(m) => match m.field_node.clone().inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - if ((rt.params.clone().len() as i64) > 0) { - match rt.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { - node: return_type, .. - }) => Rc::new(BinOpInferred { - result_type: return_type.clone(), - algebra_field: Some(m.field_kind.clone()), - }), - _ => Rc::new(BinOpInferred { - result_type: left_type.clone(), - algebra_field: Some(m.field_kind.clone()), - }), - } - } else { - Rc::new(BinOpInferred { - result_type: rt.clone(), - algebra_field: Some(m.field_kind.clone()), - }) - } - } - _ => Rc::new(BinOpInferred { - result_type: left_type.clone(), - algebra_field: None, - }), - }, - None => Rc::new(BinOpInferred { - result_type: left_type.clone(), - algebra_field: None, - }), - } + BinOp::Eq => Rc::new(BinOpInferred { + result_type: bool_type(), + algebra_field: None, +}), + BinOp::Ne => Rc::new(BinOpInferred { + result_type: bool_type(), + algebra_field: None, +}), + BinOp::Lt => Rc::new(BinOpInferred { + result_type: bool_type(), + algebra_field: None, +}), + BinOp::Gt => Rc::new(BinOpInferred { + result_type: bool_type(), + algebra_field: None, +}), + BinOp::Le => Rc::new(BinOpInferred { + result_type: bool_type(), + algebra_field: None, +}), + BinOp::Ge => Rc::new(BinOpInferred { + result_type: bool_type(), + algebra_field: None, +}), + BinOp::And => Rc::new(BinOpInferred { + result_type: bool_type(), + algebra_field: None, +}), + BinOp::Or => Rc::new(BinOpInferred { + result_type: bool_type(), + algebra_field: None, +}), + BinOp::NullCoalesce => Rc::new(BinOpInferred { + result_type: extract_optional_inner_node(&left_type), + algebra_field: None, +}), + _ => { + let candidates = binop_algebra_fields(op.clone()); +let is_product = (left_type.connective.clone() == Connective::Conj); +if is_product { + match first_matching_algebra_field(left_type.clone(), candidates, source_indices) { + Some(m) => match m.field_node.clone().inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => if ((rt.params.clone().len() as i64) > 0) { + match rt.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: return_type, .. }) => Rc::new(BinOpInferred { + result_type: return_type.clone(), + algebra_field: Some(m.field_kind.clone()), +}), + _ => Rc::new(BinOpInferred { + result_type: left_type.clone(), + algebra_field: Some(m.field_kind.clone()), +}), +} } else { Rc::new(BinOpInferred { - result_type: left_type.clone(), - algebra_field: None, - }) - } + result_type: rt.clone(), + algebra_field: Some(m.field_kind.clone()), +}) + }, + _ => Rc::new(BinOpInferred { + result_type: left_type.clone(), + algebra_field: None, +}), +}, + None => Rc::new(BinOpInferred { + result_type: left_type.clone(), + algebra_field: None, +}), +} + } else { + Rc::new(BinOpInferred { + result_type: left_type.clone(), + algebra_field: None, +}) } - } +}, +} } -pub fn for_each_element_type_node( - n: Rc, - source_indices: Rc>>, -) -> Rc { +pub fn for_each_element_type_node(n: Rc, source_indices: Rc>>) -> Rc { { let normed = normalize_access_type_node(n); - let is_single_child = ((normed.connective.clone() == Connective::NoConnective) - && ((normed.children.clone().len() as i64) == 1)); - let extracted = if is_single_child { +let is_single_child = ((normed.connective.clone() == Connective::NoConnective) && ((normed.children.clone().len() as i64) == 1)); +let extracted = if is_single_child { match normed.children.clone().first().cloned() { - Some(ch) => Some(child_type_node(&ch)), - None => None, - } + Some(ch) => Some(child_type_node(&ch)), + None => None, +} } else { None }; - match extracted { - Some(el) => el.clone(), - None => { - if ((((normed.connective.clone() == Connective::NoConnective) - && ((normed.children.clone().len() as i64) == 0)) - && ((normed.properties.clone().len() as i64) == 0)) - && (authored_name_at(source_indices, &normed).as_str() - == "String".to_string().as_str())) - { - string_type() - } else { - normed.clone() - } - } - } - } +match extracted { + Some(el) => el.clone(), + None => if ((((normed.connective.clone() == Connective::NoConnective) && ((normed.children.clone().len() as i64) == 0)) && ((normed.properties.clone().len() as i64) == 0)) && (authored_name_at(source_indices, &normed).as_str() == "String".to_string().as_str())) { + string_type() + } else { + normed.clone() + }, +} +} } pub fn emit_map_has(m: Rc>, key: String) -> bool { match v2_rt::map_get(&m, key) { - Some(_) => true, - None => false, - } + Some(_) => true, + None => false, +} } diff --git a/src/v2/stage0/src/v2_compiler_languages.rs b/src/v2/stage0/src/v2_compiler_languages.rs index 5656cb0a11b..13c3f2be93f 100644 --- a/src/v2/stage0/src/v2_compiler_languages.rs +++ b/src/v2/stage0/src/v2_compiler_languages.rs @@ -1,89 +1,47 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.languages -use self::IfValueForm::*; +use std::collections::HashMap; +use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::v2_compiler_artifact::{RenderTarget}; +use crate::v2_compiler_artifact::RenderTarget::{Rust, Python, Go, Dag}; +pub use crate::v2_std_core::{BinOp, LiteralValue}; +use crate::v2_std_core::BinOp::{Add, Sub, Mul, Div, Mod, Eq, Ne, Lt, Gt, Le, Ge, And, Or, NullCoalesce}; +use crate::v2_std_core::LiteralValue::*; +pub use crate::std_syntax::{ItemForm, ItemFormKind, OperatorSpec, SyntaxSpec, AlgebraFieldKind, BodyKind}; +use crate::std_syntax::ItemFormKind::{FuncForm, StructForm, EnumForm, TypeAliasForm, ModuleForm, OtherForm}; +use crate::std_syntax::BodyKind::{ExprBody, BlockBody, TypeBody, ValueBody, NoBody, ServiceBody, ResourceBody}; +use crate::std_syntax::AlgebraFieldKind::*; +pub use crate::extdeps_languages_rust_syntax::{rust_operators, rust_item_forms}; +pub use crate::extdeps_languages_python_syntax::{python_operators, python_item_forms}; +pub use crate::extdeps_languages_go_syntax::{go_operators, go_item_forms}; +pub use crate::extdeps_languages_dag_syntax::{dag_operators}; +pub use crate::extdeps_languages_rust_emit::{rust_keywords, rust_container_templates, rust_reserved, rust_reserved_escape_prefix, rust_struct_derives, rust_struct_derives_copy, rust_enum_derives, rust_enum_derives_copy, rust_serde_tag, rust_serde_rename_template, rust_source_extension, rust_source_dir, rust_visibility, rust_string_types, rust_method_templates, rust_func_keyword, rust_async_prefix, rust_struct_keyword, rust_enum_keyword, rust_type_alias_keyword, rust_param_separator, rust_return_arrow, rust_param_type_sep, rust_module_keyword, rust_import_keyword, rust_import_from_keyword, rust_lambda_template, rust_error_expr_template, rust_list_literal_empty, rust_list_literal_template, rust_null_coalesce_template, rust_error_type_template, rust_type_arg_open, rust_type_arg_close, rust_void_type, rust_tuple_empty, rust_tuple_pair_template, rust_tuple_multi_template, rust_tuple_separator}; +pub use crate::extdeps_languages_python_emit::{python_keywords, python_reserved, python_reserved_escape_suffix, python_derive_attribute, python_default_value, python_source_extension, python_module_init, python_method_templates, python_string_types, python_func_keyword, python_async_prefix, python_struct_keyword, python_enum_keyword, python_type_alias_keyword, python_param_separator, python_return_arrow, python_param_type_sep, python_module_keyword, python_import_keyword, python_import_from_keyword, python_lambda_template, python_error_expr_template, python_list_literal_empty, python_list_literal_template, python_null_coalesce_template, python_error_type_template, python_type_arg_open, python_type_arg_close, python_void_type, python_tuple_empty, python_tuple_pair_template, python_tuple_multi_template, python_tuple_separator}; +pub use crate::extdeps_languages_go_emit::{go_keywords, go_reserved, go_reserved_escape_suffix, go_manifest_file, go_source_extension, go_method_templates, go_string_types, go_func_keyword, go_async_prefix, go_struct_keyword, go_enum_keyword, go_type_alias_keyword, go_param_separator, go_return_arrow, go_param_type_sep, go_module_keyword, go_import_keyword, go_import_from_keyword, go_lambda_template, go_error_expr_template, go_list_literal_empty, go_list_literal_template, go_null_coalesce_template, go_error_type_template, go_type_arg_open, go_type_arg_close, go_void_type, go_tuple_empty, go_tuple_pair_template, go_tuple_multi_template, go_tuple_separator}; +pub use crate::extdeps_languages_dag_emit::{dag_keywords, dag_container_templates, dag_reserved, dag_string_types, dag_func_keyword, dag_async_prefix, dag_struct_keyword, dag_enum_keyword, dag_type_alias_keyword, dag_param_separator, dag_return_arrow, dag_param_type_sep, dag_module_keyword, dag_import_keyword, dag_import_from_keyword, dag_source_extension, dag_lambda_template, dag_error_expr_template, dag_list_literal_empty, dag_list_literal_template, dag_null_coalesce_template, dag_error_type_template, dag_type_arg_open, dag_type_arg_close, dag_void_type, dag_tuple_empty, dag_tuple_pair_template, dag_tuple_multi_template, dag_tuple_separator}; +use self::ReservedWordStrategy::*; +use self::TestNameStyle::*; use self::ImportTrigger::*; -use self::InterpStyle::*; +use self::IfValueForm::*; use self::NamingCase::*; -use self::ReservedWordStrategy::*; +use self::VisibilitySpec::*; use self::ServiceMethodStrategy::*; use self::ServiceReturnStrategy::*; -use self::TestNameStyle::*; -use self::VisibilitySpec::*; -pub use crate::extdeps_languages_dag_emit::{ - dag_async_prefix, dag_container_templates, dag_enum_keyword, dag_error_expr_template, - dag_error_type_template, dag_func_keyword, dag_import_from_keyword, dag_import_keyword, - dag_keywords, dag_lambda_template, dag_list_literal_empty, dag_list_literal_template, - dag_module_keyword, dag_null_coalesce_template, dag_param_separator, dag_param_type_sep, - dag_reserved, dag_return_arrow, dag_source_extension, dag_string_types, dag_struct_keyword, - dag_tuple_empty, dag_tuple_multi_template, dag_tuple_pair_template, dag_tuple_separator, - dag_type_alias_keyword, dag_type_arg_close, dag_type_arg_open, dag_void_type, -}; -pub use crate::extdeps_languages_dag_syntax::dag_operators; -pub use crate::extdeps_languages_go_emit::{ - go_async_prefix, go_enum_keyword, go_error_expr_template, go_error_type_template, - go_func_keyword, go_import_from_keyword, go_import_keyword, go_keywords, go_lambda_template, - go_list_literal_empty, go_list_literal_template, go_manifest_file, go_method_templates, - go_module_keyword, go_null_coalesce_template, go_param_separator, go_param_type_sep, - go_reserved, go_reserved_escape_suffix, go_return_arrow, go_source_extension, go_string_types, - go_struct_keyword, go_tuple_empty, go_tuple_multi_template, go_tuple_pair_template, - go_tuple_separator, go_type_alias_keyword, go_type_arg_close, go_type_arg_open, go_void_type, -}; -pub use crate::extdeps_languages_go_syntax::{go_item_forms, go_operators}; -pub use crate::extdeps_languages_python_emit::{ - python_async_prefix, python_default_value, python_derive_attribute, python_enum_keyword, - python_error_expr_template, python_error_type_template, python_func_keyword, - python_import_from_keyword, python_import_keyword, python_keywords, python_lambda_template, - python_list_literal_empty, python_list_literal_template, python_method_templates, - python_module_init, python_module_keyword, python_null_coalesce_template, - python_param_separator, python_param_type_sep, python_reserved, python_reserved_escape_suffix, - python_return_arrow, python_source_extension, python_string_types, python_struct_keyword, - python_tuple_empty, python_tuple_multi_template, python_tuple_pair_template, - python_tuple_separator, python_type_alias_keyword, python_type_arg_close, python_type_arg_open, - python_void_type, -}; -pub use crate::extdeps_languages_python_syntax::{python_item_forms, python_operators}; -pub use crate::extdeps_languages_rust_emit::{ - rust_async_prefix, rust_container_templates, rust_enum_derives, rust_enum_derives_copy, - rust_enum_keyword, rust_error_expr_template, rust_error_type_template, rust_func_keyword, - rust_import_from_keyword, rust_import_keyword, rust_keywords, rust_lambda_template, - rust_list_literal_empty, rust_list_literal_template, rust_method_templates, - rust_module_keyword, rust_null_coalesce_template, rust_param_separator, rust_param_type_sep, - rust_reserved, rust_reserved_escape_prefix, rust_return_arrow, rust_serde_rename_template, - rust_serde_tag, rust_source_dir, rust_source_extension, rust_string_types, rust_struct_derives, - rust_struct_derives_copy, rust_struct_keyword, rust_tuple_empty, rust_tuple_multi_template, - rust_tuple_pair_template, rust_tuple_separator, rust_type_alias_keyword, rust_type_arg_close, - rust_type_arg_open, rust_visibility, rust_void_type, -}; -pub use crate::extdeps_languages_rust_syntax::{rust_item_forms, rust_operators}; -use crate::std_syntax::AlgebraFieldKind::*; -use crate::std_syntax::BodyKind::{ - BlockBody, ExprBody, NoBody, ResourceBody, ServiceBody, TypeBody, ValueBody, -}; -use crate::std_syntax::ItemFormKind::{ - EnumForm, FuncForm, ModuleForm, OtherForm, StructForm, TypeAliasForm, -}; -pub use crate::std_syntax::{ - AlgebraFieldKind, BodyKind, ItemForm, ItemFormKind, OperatorSpec, SyntaxSpec, -}; -pub use crate::v2_compiler_artifact::RenderTarget; -use crate::v2_compiler_artifact::RenderTarget::{Dag, Go, Python, Rust}; -use crate::v2_rt; -use crate::v2_std_core::BinOp::{ - Add, And, Div, Eq, Ge, Gt, Le, Lt, Mod, Mul, Ne, NullCoalesce, Or, Sub, -}; -use crate::v2_std_core::LiteralValue::*; -pub use crate::v2_std_core::{BinOp, LiteralValue}; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; -use std::collections::HashMap; -use std::rc::Rc; +use self::InterpStyle::*; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum ReservedWordStrategy { - PrefixEscape { prefix: String }, - SuffixEscape { suffix: String }, + PrefixEscape { + prefix: String, + }, + SuffixEscape { + suffix: String, + }, NoEscape, } @@ -133,10 +91,18 @@ pub struct TestConventions { #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum ImportTrigger { - TypeUsageTrigger { type_name: String }, - TraitImplTrigger { trait_name: String }, - DeriveMacroTrigger { macro_name: String }, - ContainerUsageTrigger { container: String }, + TypeUsageTrigger { + type_name: String, + }, + TraitImplTrigger { + trait_name: String, + }, + DeriveMacroTrigger { + macro_name: String, + }, + ContainerUsageTrigger { + container: String, + }, AsyncUsageTrigger, } @@ -245,8 +211,12 @@ pub enum NamingCase { #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum VisibilitySpec { - KeywordVisibility { prefix: String }, - CaseVisibility { export_case: NamingCase }, + KeywordVisibility { + prefix: String, + }, + CaseVisibility { + export_case: NamingCase, + }, } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -262,74 +232,64 @@ pub struct TcoSyntax { #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum ServiceMethodStrategy { - SelfInParams { self_param: String }, - ExternalReceiver { var_name: String }, + SelfInParams { + self_param: String, + }, + ExternalReceiver { + var_name: String, + }, } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum ServiceReturnStrategy { ArrowReturn, - ErrorTupleReturn { error_type: String }, + ErrorTupleReturn { + error_type: String, + }, } impl ServiceReturnStrategy { pub fn error_type(&self) -> String { match self { ServiceReturnStrategy::ArrowReturn => panic!("no error_type on unit variant"), - ServiceReturnStrategy::ErrorTupleReturn { - error_type: __val, .. - } => __val.clone(), + ServiceReturnStrategy::ErrorTupleReturn { error_type: __val, .. } => __val.clone(), } } } pub fn service_self_param(spec: Rc) -> String { match (*spec.service_method.clone()).clone() { - ServiceMethodStrategy::SelfInParams { self_param: sp, .. } => sp.clone(), - ServiceMethodStrategy::ExternalReceiver { .. } => "".to_string(), - } + ServiceMethodStrategy::SelfInParams { self_param: sp, .. } => sp.clone(), + ServiceMethodStrategy::ExternalReceiver { .. } => "".to_string(), +} } pub fn service_receiver_str(spec: Rc, service_name: String) -> String { match (*spec.service_method.clone()).clone() { - ServiceMethodStrategy::SelfInParams { .. } => "".to_string(), - ServiceMethodStrategy::ExternalReceiver { var_name: v, .. } => v2_rt::concat( - v2_rt::concat( - v2_rt::concat(v2_rt::concat("(".to_string(), v.clone()), " *".to_string()), - service_name, - ), - ") ".to_string(), - ), - } + ServiceMethodStrategy::SelfInParams { .. } => "".to_string(), + ServiceMethodStrategy::ExternalReceiver { var_name: v, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("(".to_string(), v.clone()), " *".to_string()), service_name), ") ".to_string()), +} } pub fn service_method_depth(spec: Rc) -> i64 { match (*spec.service_method.clone()).clone() { - ServiceMethodStrategy::SelfInParams { .. } => 1, - ServiceMethodStrategy::ExternalReceiver { .. } => 0, - } + ServiceMethodStrategy::SelfInParams { .. } => 1, + ServiceMethodStrategy::ExternalReceiver { .. } => 0, +} } pub fn service_methods_inside_class(spec: Rc) -> bool { match (*spec.service_method.clone()).clone() { - ServiceMethodStrategy::SelfInParams { .. } => true, - ServiceMethodStrategy::ExternalReceiver { .. } => false, - } + ServiceMethodStrategy::SelfInParams { .. } => true, + ServiceMethodStrategy::ExternalReceiver { .. } => false, +} } pub fn service_return_str(spec: &Rc, ret_type: String) -> String { match (*spec.service_return.clone()).clone() { - ServiceReturnStrategy::ArrowReturn => { - v2_rt::concat(spec.items.clone().return_arrow.clone(), ret_type) - } - ServiceReturnStrategy::ErrorTupleReturn { error_type: et, .. } => v2_rt::concat( - v2_rt::concat( - v2_rt::concat(v2_rt::concat(" (".to_string(), ret_type), ", ".to_string()), - et.clone(), - ), - ")".to_string(), - ), - } + ServiceReturnStrategy::ArrowReturn => v2_rt::concat(spec.items.clone().return_arrow.clone(), ret_type), + ServiceReturnStrategy::ErrorTupleReturn { error_type: et, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" (".to_string(), ret_type), ", ".to_string()), et.clone()), ")".to_string()), +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -349,20 +309,12 @@ pub struct ItemKeywords { pub fn item_keyword_for_kind(forms: Rc>>, kind: ItemFormKind) -> String { { - let matching = Rc::new({ - let mut __result = Vec::new(); - for f in forms.iter().cloned() { - if (f.kind.clone() == kind.clone()) { - __result.push(f); - } - } - __result - }); - match matching.first().cloned() { - Some(f) => f.keyword.clone(), - None => "__MISSING_ITEM_KEYWORD__".to_string(), - } - } + let matching = Rc::new({ let mut __result = Vec::new(); for f in forms.iter().cloned() { if (f.kind.clone() == kind.clone()) { __result.push(f); } } __result }); +match matching.first().cloned() { + Some(f) => f.keyword.clone(), + None => "__MISSING_ITEM_KEYWORD__".to_string(), +} +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -431,15 +383,15 @@ pub struct RecordLitSyntax { #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum InterpStyle { - FormatArgs { placeholder: String }, + FormatArgs { + placeholder: String, + }, InlineExpr, } impl InterpStyle { pub fn placeholder(&self) -> String { match self { - InterpStyle::FormatArgs { - placeholder: __val, .. - } => __val.clone(), + InterpStyle::FormatArgs { placeholder: __val, .. } => __val.clone(), InterpStyle::InlineExpr => panic!("no placeholder on unit variant"), } } @@ -461,838 +413,760 @@ pub struct StringInterpSyntax { pub fn rust_spec() -> Rc { Rc::new(LanguageSpec { - target_name: "rust".to_string(), - reserved_words: Rc::new(ReservedWords { - keywords: rust_reserved(), - strategy: Rc::new(ReservedWordStrategy::PrefixEscape { - prefix: rust_reserved_escape_prefix(), - }), - }), - scaffold: Rc::new(ProjectScaffold { - manifest_file: Some("Cargo.toml".to_string()), - module_init_file: None, - source_file_extension: rust_source_extension(), - source_dir: Some(rust_source_dir()), - }), - serialization: Rc::new(SerializationSpec { - struct_derives: Some(rust_struct_derives()), - struct_derives_copy: Some(rust_struct_derives_copy()), - enum_derives: Some(rust_enum_derives()), - enum_derives_copy: Some(rust_enum_derives_copy()), - tag_attribute: Some(rust_serde_tag()), - rename_attribute_template: Some(rust_serde_rename_template()), - derive_attribute: None, - default_value: None, - }), - test_conventions: Rc::new(TestConventions { - file_prefix: "".to_string(), - file_suffix: "_test".to_string(), - file_dir: Some("tests/".to_string()), - function_prefix: "test_".to_string(), - name_style: TestNameStyle::SnakeCaseTestNames, - async_decorator: Some("#[tokio::test]".to_string()), - }), - visibility: Rc::new(VisibilitySpec::KeywordVisibility { - prefix: rust_visibility(), - }), - sharing: Rc::new(SharingStrategy { - needs_sharing: true, - wrap_template: "Rc<{0}>".to_string(), - clone_value: "{0}.clone()".to_string(), - deref_clone: "(*{0}).clone()".to_string(), - field_clone: "{0}.{1}.clone()".to_string(), - iter_owned: "{0}.iter().cloned()".to_string(), - clone_suffix: ".cloned()".to_string(), - borrow_param_template: "&{0}".to_string(), - borrow_arg_template: "&{0}".to_string(), - }), - indexing: Rc::new(IndexingSemantics { - list_index: "{0}[({1}) as usize].clone()".to_string(), - map_index: "({0}).get(&{1}).cloned()".to_string(), - string_index: "v2_rt::char_at(&{0}, {1})".to_string(), - list_slice: None, - string_slice: Some("v2_rt::substring(&{0}, {1}, {2})".to_string()), - }), - annotations: Rc::new(AnnotationRequirements { - let_binding_inferred: "let {0} = {1};".to_string(), - let_binding_annotated: "let {0}: {1} = {2};".to_string(), - lambda_param_typed: "{0}: {1}".to_string(), - lambda_param_untyped: "{0}".to_string(), - }), - method_templates: Some(rust_method_templates()), - service_fields: Rc::new(ServiceFieldTemplates { - rest_decl: " pub base_url: String,\n".to_string(), - auth_decl: " pub auth_token: String,\n".to_string(), - shell_decl: " pub working_dir: Option,\n".to_string(), - file_decl: " pub base_path: String,\n".to_string(), - rest_ctor: " base_url: \"{0}\".to_string(),\n".to_string(), - auth_ctor: " auth_token: String::new(),\n".to_string(), - shell_ctor: " working_dir: None,\n".to_string(), - file_ctor: " base_path: \".\".to_string(),\n".to_string(), - }), - block_syntax: Rc::new(BlockSyntax { - block_open: " {\n".to_string(), - block_close: "}".to_string(), - else_clause: "} else {\n".to_string(), - match_keyword: "match ".to_string(), - case_keyword: "".to_string(), - arm_separator: ",".to_string(), - stmt_terminator: ";".to_string(), - significant_whitespace: false, - }), - for_each_syntax: Rc::new(ForEachSyntax { - prefix: "for ".to_string(), - separator: " in ".to_string(), - }), - tco: Rc::new(TcoSyntax { - loop_keyword: "loop".to_string(), - break_return: "break".to_string(), - continue_str: "continue;".to_string(), - temp_var_prefix: "__tco_".to_string(), - temp_decl_prefix: "let ".to_string(), - temp_assign_op: " = ".to_string(), - }), - items: Rc::new(ItemKeywords { - func_keyword: item_keyword_for_kind(rust_item_forms(), ItemFormKind::FuncForm), - async_prefix: rust_async_prefix(), - struct_keyword: item_keyword_for_kind(rust_item_forms(), ItemFormKind::StructForm), - enum_keyword: item_keyword_for_kind(rust_item_forms(), ItemFormKind::EnumForm), - type_alias_keyword: item_keyword_for_kind( - rust_item_forms(), - ItemFormKind::TypeAliasForm, - ), - param_separator: rust_param_separator(), - return_arrow: rust_return_arrow(), - param_type_sep: rust_param_type_sep(), - module_keyword: item_keyword_for_kind(rust_item_forms(), ItemFormKind::ModuleForm), - import_keyword: rust_import_keyword(), - import_from_keyword: rust_import_from_keyword(), - }), - expression_semantics: Rc::new(ExpressionSemantics { - if_value_form: IfValueForm::IfExpression, - wildcard_case: None, - variant_pattern: Some(Rc::new(VariantPatternSyntax { - open: " { ".to_string(), - close: " }".to_string(), - binding_sep: ": ".to_string(), - empty_suffix: "".to_string(), - })), - guard_prefix: Some(" if ".to_string()), - empty_return_value: "()".to_string(), - return_suffix: "".to_string(), - suppress_unit_return: false, - }), - lambda_template: rust_lambda_template(), - error_expr_template: rust_error_expr_template(), - list_literal_empty: rust_list_literal_empty(), - list_literal_template: rust_list_literal_template(), - null_coalesce_template: rust_null_coalesce_template(), - error_type_template: rust_error_type_template(), - type_arg_open: rust_type_arg_open(), - type_arg_close: rust_type_arg_close(), - void_type: rust_void_type(), - tuple_syntax: Rc::new(TupleSyntax { - empty: rust_tuple_empty(), - pair_template: rust_tuple_pair_template(), - multi_template: rust_tuple_multi_template(), - separator: rust_tuple_separator(), - first_accessor: ".0".to_string(), - second_accessor: ".1".to_string(), - }), - string_interp: Rc::new(StringInterpSyntax { - style: Rc::new(InterpStyle::FormatArgs { - placeholder: "{}".to_string(), - }), - format_template: "format!(\"{0}\", {1})".to_string(), - plain_template: "\"{0}\".to_string()".to_string(), - escape_pairs: Rc::new(vec![ - Rc::new(EscapePair { - from: "{".to_string(), - to: "{{".to_string(), - }), - Rc::new(EscapePair { - from: "}".to_string(), - to: "}}".to_string(), - }), - ]), - }), - callable_type_template: Some("Rc {return}>".to_string()), - naming_case: NamingCase::SnakeCase, - async_call_prefix: "".to_string(), - bridge_method_prefix: "".to_string(), - bridge_method_case: NamingCase::SnakeCase, - bridge_method_overrides: v2_rt::rc_empty_map::(), - record_lit: Rc::new(RecordLitSyntax { - named_open: " {".to_string(), - named_close: "}".to_string(), - named_empty: " {}".to_string(), - named_field_sep: ": ".to_string(), - named_field_join: ", ".to_string(), - anon_empty: "{}".to_string(), - anon_prefix: "{\n".to_string(), - anon_suffix: "}".to_string(), - anon_field_indent: " ".to_string(), - }), - service_method: Rc::new(ServiceMethodStrategy::SelfInParams { - self_param: "&self".to_string(), - }), - service_return: Rc::new(ServiceReturnStrategy::ArrowReturn), - }) + target_name: "rust".to_string(), + reserved_words: Rc::new(ReservedWords { + keywords: rust_reserved(), + strategy: Rc::new(ReservedWordStrategy::PrefixEscape { + prefix: rust_reserved_escape_prefix(), +}), +}), + scaffold: Rc::new(ProjectScaffold { + manifest_file: Some("Cargo.toml".to_string()), + module_init_file: None, + source_file_extension: rust_source_extension(), + source_dir: Some(rust_source_dir()), +}), + serialization: Rc::new(SerializationSpec { + struct_derives: Some(rust_struct_derives()), + struct_derives_copy: Some(rust_struct_derives_copy()), + enum_derives: Some(rust_enum_derives()), + enum_derives_copy: Some(rust_enum_derives_copy()), + tag_attribute: Some(rust_serde_tag()), + rename_attribute_template: Some(rust_serde_rename_template()), + derive_attribute: None, + default_value: None, +}), + test_conventions: Rc::new(TestConventions { + file_prefix: "".to_string(), + file_suffix: "_test".to_string(), + file_dir: Some("tests/".to_string()), + function_prefix: "test_".to_string(), + name_style: TestNameStyle::SnakeCaseTestNames, + async_decorator: Some("#[tokio::test]".to_string()), +}), + visibility: Rc::new(VisibilitySpec::KeywordVisibility { + prefix: rust_visibility(), +}), + sharing: Rc::new(SharingStrategy { + needs_sharing: true, + wrap_template: "Rc<{0}>".to_string(), + clone_value: "{0}.clone()".to_string(), + deref_clone: "(*{0}).clone()".to_string(), + field_clone: "{0}.{1}.clone()".to_string(), + iter_owned: "{0}.iter().cloned()".to_string(), + clone_suffix: ".cloned()".to_string(), + borrow_param_template: "&{0}".to_string(), + borrow_arg_template: "&{0}".to_string(), +}), + indexing: Rc::new(IndexingSemantics { + list_index: "{0}[({1}) as usize].clone()".to_string(), + map_index: "({0}).get(&{1}).cloned()".to_string(), + string_index: "v2_rt::char_at(&{0}, {1})".to_string(), + list_slice: None, + string_slice: Some("v2_rt::substring(&{0}, {1}, {2})".to_string()), +}), + annotations: Rc::new(AnnotationRequirements { + let_binding_inferred: "let {0} = {1};".to_string(), + let_binding_annotated: "let {0}: {1} = {2};".to_string(), + lambda_param_typed: "{0}: {1}".to_string(), + lambda_param_untyped: "{0}".to_string(), +}), + method_templates: Some(rust_method_templates()), + service_fields: Rc::new(ServiceFieldTemplates { + rest_decl: " pub base_url: String,\n".to_string(), + auth_decl: " pub auth_token: String,\n".to_string(), + shell_decl: " pub working_dir: Option,\n".to_string(), + file_decl: " pub base_path: String,\n".to_string(), + rest_ctor: " base_url: \"{0}\".to_string(),\n".to_string(), + auth_ctor: " auth_token: String::new(),\n".to_string(), + shell_ctor: " working_dir: None,\n".to_string(), + file_ctor: " base_path: \".\".to_string(),\n".to_string(), +}), + block_syntax: Rc::new(BlockSyntax { + block_open: " {\n".to_string(), + block_close: "}".to_string(), + else_clause: "} else {\n".to_string(), + match_keyword: "match ".to_string(), + case_keyword: "".to_string(), + arm_separator: ",".to_string(), + stmt_terminator: ";".to_string(), + significant_whitespace: false, +}), + for_each_syntax: Rc::new(ForEachSyntax { + prefix: "for ".to_string(), + separator: " in ".to_string(), +}), + tco: Rc::new(TcoSyntax { + loop_keyword: "loop".to_string(), + break_return: "break".to_string(), + continue_str: "continue;".to_string(), + temp_var_prefix: "__tco_".to_string(), + temp_decl_prefix: "let ".to_string(), + temp_assign_op: " = ".to_string(), +}), + items: Rc::new(ItemKeywords { + func_keyword: item_keyword_for_kind(rust_item_forms(), ItemFormKind::FuncForm), + async_prefix: rust_async_prefix(), + struct_keyword: item_keyword_for_kind(rust_item_forms(), ItemFormKind::StructForm), + enum_keyword: item_keyword_for_kind(rust_item_forms(), ItemFormKind::EnumForm), + type_alias_keyword: item_keyword_for_kind(rust_item_forms(), ItemFormKind::TypeAliasForm), + param_separator: rust_param_separator(), + return_arrow: rust_return_arrow(), + param_type_sep: rust_param_type_sep(), + module_keyword: item_keyword_for_kind(rust_item_forms(), ItemFormKind::ModuleForm), + import_keyword: rust_import_keyword(), + import_from_keyword: rust_import_from_keyword(), +}), + expression_semantics: Rc::new(ExpressionSemantics { + if_value_form: IfValueForm::IfExpression, + wildcard_case: None, + variant_pattern: Some(Rc::new(VariantPatternSyntax { + open: " { ".to_string(), + close: " }".to_string(), + binding_sep: ": ".to_string(), + empty_suffix: "".to_string(), +})), + guard_prefix: Some(" if ".to_string()), + empty_return_value: "()".to_string(), + return_suffix: "".to_string(), + suppress_unit_return: false, +}), + lambda_template: rust_lambda_template(), + error_expr_template: rust_error_expr_template(), + list_literal_empty: rust_list_literal_empty(), + list_literal_template: rust_list_literal_template(), + null_coalesce_template: rust_null_coalesce_template(), + error_type_template: rust_error_type_template(), + type_arg_open: rust_type_arg_open(), + type_arg_close: rust_type_arg_close(), + void_type: rust_void_type(), + tuple_syntax: Rc::new(TupleSyntax { + empty: rust_tuple_empty(), + pair_template: rust_tuple_pair_template(), + multi_template: rust_tuple_multi_template(), + separator: rust_tuple_separator(), + first_accessor: ".0".to_string(), + second_accessor: ".1".to_string(), +}), + string_interp: Rc::new(StringInterpSyntax { + style: Rc::new(InterpStyle::FormatArgs { + placeholder: "{}".to_string(), +}), + format_template: "format!(\"{0}\", {1})".to_string(), + plain_template: "\"{0}\".to_string()".to_string(), + escape_pairs: Rc::new(vec![Rc::new(EscapePair { + from: "{".to_string(), + to: "{{".to_string(), +}), Rc::new(EscapePair { + from: "}".to_string(), + to: "}}".to_string(), +})]), +}), + callable_type_template: Some("Rc {return}>".to_string()), + naming_case: NamingCase::SnakeCase, + async_call_prefix: "".to_string(), + bridge_method_prefix: "".to_string(), + bridge_method_case: NamingCase::SnakeCase, + bridge_method_overrides: v2_rt::rc_empty_map::(), + record_lit: Rc::new(RecordLitSyntax { + named_open: " {".to_string(), + named_close: "}".to_string(), + named_empty: " {}".to_string(), + named_field_sep: ": ".to_string(), + named_field_join: ", ".to_string(), + anon_empty: "{}".to_string(), + anon_prefix: "{\n".to_string(), + anon_suffix: "}".to_string(), + anon_field_indent: " ".to_string(), +}), + service_method: Rc::new(ServiceMethodStrategy::SelfInParams { + self_param: "&self".to_string(), +}), + service_return: Rc::new(ServiceReturnStrategy::ArrowReturn), +}) } pub fn python_spec() -> Rc { Rc::new(LanguageSpec { - target_name: "python".to_string(), - reserved_words: Rc::new(ReservedWords { - keywords: python_reserved(), - strategy: Rc::new(ReservedWordStrategy::SuffixEscape { - suffix: python_reserved_escape_suffix(), - }), - }), - scaffold: Rc::new(ProjectScaffold { - manifest_file: Some("requirements.txt".to_string()), - module_init_file: Some(python_module_init()), - source_file_extension: python_source_extension(), - source_dir: None, - }), - serialization: Rc::new(SerializationSpec { - struct_derives: None, - struct_derives_copy: None, - enum_derives: None, - enum_derives_copy: None, - tag_attribute: None, - rename_attribute_template: None, - derive_attribute: Some(python_derive_attribute()), - default_value: Some(python_default_value()), - }), - test_conventions: Rc::new(TestConventions { - file_prefix: "test_".to_string(), - file_suffix: "".to_string(), - file_dir: Some("tests/".to_string()), - function_prefix: "test_".to_string(), - name_style: TestNameStyle::SnakeCaseTestNames, - async_decorator: None, - }), - visibility: Rc::new(VisibilitySpec::KeywordVisibility { - prefix: "".to_string(), - }), - sharing: Rc::new(SharingStrategy { - needs_sharing: false, - wrap_template: "{0}".to_string(), - clone_value: "{0}".to_string(), - deref_clone: "{0}".to_string(), - field_clone: "{0}.{1}".to_string(), - iter_owned: "{0}".to_string(), - clone_suffix: "".to_string(), - borrow_param_template: "{0}".to_string(), - borrow_arg_template: "{0}".to_string(), - }), - indexing: Rc::new(IndexingSemantics { - list_index: "{0}[{1}]".to_string(), - map_index: "{0}[{1}]".to_string(), - string_index: "{0}[{1}]".to_string(), - list_slice: Some("{0}[{1}:{2}]".to_string()), - string_slice: Some("{0}[{1}:{2}]".to_string()), - }), - annotations: Rc::new(AnnotationRequirements { - let_binding_inferred: "{0} = {1}".to_string(), - let_binding_annotated: "{0}: {1} = {2}".to_string(), - lambda_param_typed: "{0}: {1}".to_string(), - lambda_param_untyped: "{0}".to_string(), - }), - method_templates: Some(python_method_templates()), - service_fields: Rc::new(ServiceFieldTemplates { - rest_decl: "base_url: str".to_string(), - auth_decl: "auth_token: str".to_string(), - shell_decl: "working_dir: str | None = None".to_string(), - file_decl: "base_path: str".to_string(), - rest_ctor: "self.base_url = base_url".to_string(), - auth_ctor: "self.auth_token = auth_token".to_string(), - shell_ctor: "self.working_dir = working_dir".to_string(), - file_ctor: "self.base_path = base_path".to_string(), - }), - block_syntax: Rc::new(BlockSyntax { - block_open: ":\n".to_string(), - block_close: "".to_string(), - else_clause: "else:\n".to_string(), - match_keyword: "match ".to_string(), - case_keyword: "case ".to_string(), - arm_separator: "\n".to_string(), - stmt_terminator: "".to_string(), - significant_whitespace: true, - }), - for_each_syntax: Rc::new(ForEachSyntax { - prefix: "for ".to_string(), - separator: " in ".to_string(), - }), - tco: Rc::new(TcoSyntax { - loop_keyword: "while True".to_string(), - break_return: "return".to_string(), - continue_str: "continue".to_string(), - temp_var_prefix: "__tco_".to_string(), - temp_decl_prefix: "".to_string(), - temp_assign_op: " = ".to_string(), - }), - items: Rc::new(ItemKeywords { - func_keyword: item_keyword_for_kind(python_item_forms(), ItemFormKind::FuncForm), - async_prefix: python_async_prefix(), - struct_keyword: item_keyword_for_kind(python_item_forms(), ItemFormKind::StructForm), - enum_keyword: item_keyword_for_kind(python_item_forms(), ItemFormKind::EnumForm), - type_alias_keyword: item_keyword_for_kind( - python_item_forms(), - ItemFormKind::TypeAliasForm, - ), - param_separator: python_param_separator(), - return_arrow: python_return_arrow(), - param_type_sep: python_param_type_sep(), - module_keyword: item_keyword_for_kind(python_item_forms(), ItemFormKind::ModuleForm), - import_keyword: python_import_keyword(), - import_from_keyword: python_import_from_keyword(), - }), - expression_semantics: Rc::new(ExpressionSemantics { - if_value_form: IfValueForm::ConditionalTernary, - wildcard_case: None, - variant_pattern: Some(Rc::new(VariantPatternSyntax { - open: "(".to_string(), - close: ")".to_string(), - binding_sep: "=".to_string(), - empty_suffix: "()".to_string(), - })), - guard_prefix: Some(" if ".to_string()), - empty_return_value: "None".to_string(), - return_suffix: "".to_string(), - suppress_unit_return: false, - }), - lambda_template: python_lambda_template(), - error_expr_template: python_error_expr_template(), - list_literal_empty: python_list_literal_empty(), - list_literal_template: python_list_literal_template(), - null_coalesce_template: python_null_coalesce_template(), - error_type_template: python_error_type_template(), - type_arg_open: python_type_arg_open(), - type_arg_close: python_type_arg_close(), - void_type: python_void_type(), - tuple_syntax: Rc::new(TupleSyntax { - empty: python_tuple_empty(), - pair_template: python_tuple_pair_template(), - multi_template: python_tuple_multi_template(), - separator: python_tuple_separator(), - first_accessor: "[0]".to_string(), - second_accessor: "[1]".to_string(), - }), - string_interp: Rc::new(StringInterpSyntax { - style: Rc::new(InterpStyle::InlineExpr), - format_template: "f\"{0}\"".to_string(), - plain_template: "f\"{0}\"".to_string(), - escape_pairs: Rc::new(vec![ - Rc::new(EscapePair { - from: "{".to_string(), - to: "{{".to_string(), - }), - Rc::new(EscapePair { - from: "}".to_string(), - to: "}}".to_string(), - }), - ]), - }), - callable_type_template: None, - naming_case: NamingCase::SnakeCase, - async_call_prefix: "await ".to_string(), - bridge_method_prefix: "".to_string(), - bridge_method_case: NamingCase::SnakeCase, - bridge_method_overrides: v2_rt::rc_map_insert( - v2_rt::rc_empty_map::(), - "with".to_string(), - "with_update".to_string(), - ), - record_lit: Rc::new(RecordLitSyntax { - named_open: "(".to_string(), - named_close: ")".to_string(), - named_empty: "()".to_string(), - named_field_sep: "=".to_string(), - named_field_join: ", ".to_string(), - anon_empty: "{}".to_string(), - anon_prefix: "{\n".to_string(), - anon_suffix: "}".to_string(), - anon_field_indent: " ".to_string(), - }), - service_method: Rc::new(ServiceMethodStrategy::SelfInParams { - self_param: "self".to_string(), - }), - service_return: Rc::new(ServiceReturnStrategy::ArrowReturn), - }) + target_name: "python".to_string(), + reserved_words: Rc::new(ReservedWords { + keywords: python_reserved(), + strategy: Rc::new(ReservedWordStrategy::SuffixEscape { + suffix: python_reserved_escape_suffix(), +}), +}), + scaffold: Rc::new(ProjectScaffold { + manifest_file: Some("requirements.txt".to_string()), + module_init_file: Some(python_module_init()), + source_file_extension: python_source_extension(), + source_dir: None, +}), + serialization: Rc::new(SerializationSpec { + struct_derives: None, + struct_derives_copy: None, + enum_derives: None, + enum_derives_copy: None, + tag_attribute: None, + rename_attribute_template: None, + derive_attribute: Some(python_derive_attribute()), + default_value: Some(python_default_value()), +}), + test_conventions: Rc::new(TestConventions { + file_prefix: "test_".to_string(), + file_suffix: "".to_string(), + file_dir: Some("tests/".to_string()), + function_prefix: "test_".to_string(), + name_style: TestNameStyle::SnakeCaseTestNames, + async_decorator: None, +}), + visibility: Rc::new(VisibilitySpec::KeywordVisibility { + prefix: "".to_string(), +}), + sharing: Rc::new(SharingStrategy { + needs_sharing: false, + wrap_template: "{0}".to_string(), + clone_value: "{0}".to_string(), + deref_clone: "{0}".to_string(), + field_clone: "{0}.{1}".to_string(), + iter_owned: "{0}".to_string(), + clone_suffix: "".to_string(), + borrow_param_template: "{0}".to_string(), + borrow_arg_template: "{0}".to_string(), +}), + indexing: Rc::new(IndexingSemantics { + list_index: "{0}[{1}]".to_string(), + map_index: "{0}[{1}]".to_string(), + string_index: "{0}[{1}]".to_string(), + list_slice: Some("{0}[{1}:{2}]".to_string()), + string_slice: Some("{0}[{1}:{2}]".to_string()), +}), + annotations: Rc::new(AnnotationRequirements { + let_binding_inferred: "{0} = {1}".to_string(), + let_binding_annotated: "{0}: {1} = {2}".to_string(), + lambda_param_typed: "{0}: {1}".to_string(), + lambda_param_untyped: "{0}".to_string(), +}), + method_templates: Some(python_method_templates()), + service_fields: Rc::new(ServiceFieldTemplates { + rest_decl: "base_url: str".to_string(), + auth_decl: "auth_token: str".to_string(), + shell_decl: "working_dir: str | None = None".to_string(), + file_decl: "base_path: str".to_string(), + rest_ctor: "self.base_url = base_url".to_string(), + auth_ctor: "self.auth_token = auth_token".to_string(), + shell_ctor: "self.working_dir = working_dir".to_string(), + file_ctor: "self.base_path = base_path".to_string(), +}), + block_syntax: Rc::new(BlockSyntax { + block_open: ":\n".to_string(), + block_close: "".to_string(), + else_clause: "else:\n".to_string(), + match_keyword: "match ".to_string(), + case_keyword: "case ".to_string(), + arm_separator: "\n".to_string(), + stmt_terminator: "".to_string(), + significant_whitespace: true, +}), + for_each_syntax: Rc::new(ForEachSyntax { + prefix: "for ".to_string(), + separator: " in ".to_string(), +}), + tco: Rc::new(TcoSyntax { + loop_keyword: "while True".to_string(), + break_return: "return".to_string(), + continue_str: "continue".to_string(), + temp_var_prefix: "__tco_".to_string(), + temp_decl_prefix: "".to_string(), + temp_assign_op: " = ".to_string(), +}), + items: Rc::new(ItemKeywords { + func_keyword: item_keyword_for_kind(python_item_forms(), ItemFormKind::FuncForm), + async_prefix: python_async_prefix(), + struct_keyword: item_keyword_for_kind(python_item_forms(), ItemFormKind::StructForm), + enum_keyword: item_keyword_for_kind(python_item_forms(), ItemFormKind::EnumForm), + type_alias_keyword: item_keyword_for_kind(python_item_forms(), ItemFormKind::TypeAliasForm), + param_separator: python_param_separator(), + return_arrow: python_return_arrow(), + param_type_sep: python_param_type_sep(), + module_keyword: item_keyword_for_kind(python_item_forms(), ItemFormKind::ModuleForm), + import_keyword: python_import_keyword(), + import_from_keyword: python_import_from_keyword(), +}), + expression_semantics: Rc::new(ExpressionSemantics { + if_value_form: IfValueForm::ConditionalTernary, + wildcard_case: None, + variant_pattern: Some(Rc::new(VariantPatternSyntax { + open: "(".to_string(), + close: ")".to_string(), + binding_sep: "=".to_string(), + empty_suffix: "()".to_string(), +})), + guard_prefix: Some(" if ".to_string()), + empty_return_value: "None".to_string(), + return_suffix: "".to_string(), + suppress_unit_return: false, +}), + lambda_template: python_lambda_template(), + error_expr_template: python_error_expr_template(), + list_literal_empty: python_list_literal_empty(), + list_literal_template: python_list_literal_template(), + null_coalesce_template: python_null_coalesce_template(), + error_type_template: python_error_type_template(), + type_arg_open: python_type_arg_open(), + type_arg_close: python_type_arg_close(), + void_type: python_void_type(), + tuple_syntax: Rc::new(TupleSyntax { + empty: python_tuple_empty(), + pair_template: python_tuple_pair_template(), + multi_template: python_tuple_multi_template(), + separator: python_tuple_separator(), + first_accessor: "[0]".to_string(), + second_accessor: "[1]".to_string(), +}), + string_interp: Rc::new(StringInterpSyntax { + style: Rc::new(InterpStyle::InlineExpr), + format_template: "f\"{0}\"".to_string(), + plain_template: "f\"{0}\"".to_string(), + escape_pairs: Rc::new(vec![Rc::new(EscapePair { + from: "{".to_string(), + to: "{{".to_string(), +}), Rc::new(EscapePair { + from: "}".to_string(), + to: "}}".to_string(), +})]), +}), + callable_type_template: None, + naming_case: NamingCase::SnakeCase, + async_call_prefix: "await ".to_string(), + bridge_method_prefix: "".to_string(), + bridge_method_case: NamingCase::SnakeCase, + bridge_method_overrides: v2_rt::rc_map_insert(v2_rt::rc_empty_map::(), "with".to_string(), "with_update".to_string()), + record_lit: Rc::new(RecordLitSyntax { + named_open: "(".to_string(), + named_close: ")".to_string(), + named_empty: "()".to_string(), + named_field_sep: "=".to_string(), + named_field_join: ", ".to_string(), + anon_empty: "{}".to_string(), + anon_prefix: "{\n".to_string(), + anon_suffix: "}".to_string(), + anon_field_indent: " ".to_string(), +}), + service_method: Rc::new(ServiceMethodStrategy::SelfInParams { + self_param: "self".to_string(), +}), + service_return: Rc::new(ServiceReturnStrategy::ArrowReturn), +}) } pub fn go_spec() -> Rc { Rc::new(LanguageSpec { - target_name: "go".to_string(), - reserved_words: Rc::new(ReservedWords { - keywords: go_reserved(), - strategy: Rc::new(ReservedWordStrategy::SuffixEscape { - suffix: go_reserved_escape_suffix(), - }), - }), - scaffold: Rc::new(ProjectScaffold { - manifest_file: Some("go.mod".to_string()), - module_init_file: None, - source_file_extension: ".go".to_string(), - source_dir: None, - }), - serialization: Rc::new(SerializationSpec { - struct_derives: None, - struct_derives_copy: None, - enum_derives: None, - enum_derives_copy: None, - tag_attribute: None, - rename_attribute_template: None, - derive_attribute: None, - default_value: None, - }), - test_conventions: Rc::new(TestConventions { - file_prefix: "".to_string(), - file_suffix: "_test".to_string(), - file_dir: None, - function_prefix: "Test".to_string(), - name_style: TestNameStyle::PascalCaseTestNames, - async_decorator: None, - }), - visibility: Rc::new(VisibilitySpec::CaseVisibility { - export_case: NamingCase::PascalCase, - }), - sharing: Rc::new(SharingStrategy { - needs_sharing: false, - wrap_template: "{0}".to_string(), - clone_value: "{0}".to_string(), - deref_clone: "{0}".to_string(), - field_clone: "{0}.{1}".to_string(), - iter_owned: "{0}".to_string(), - clone_suffix: "".to_string(), - borrow_param_template: "{0}".to_string(), - borrow_arg_template: "{0}".to_string(), - }), - indexing: Rc::new(IndexingSemantics { - list_index: "{0}[{1}]".to_string(), - map_index: "{0}[{1}]".to_string(), - string_index: "{0}[{1}]".to_string(), - list_slice: Some("{0}[{1}:{2}]".to_string()), - string_slice: Some("{0}[{1}:{2}]".to_string()), - }), - annotations: Rc::new(AnnotationRequirements { - let_binding_inferred: "{0} := {1}".to_string(), - let_binding_annotated: "var {0} {1} = {2}".to_string(), - lambda_param_typed: "{0} {1}".to_string(), - lambda_param_untyped: "{0} interface{}".to_string(), - }), - method_templates: Some(go_method_templates()), - service_fields: Rc::new(ServiceFieldTemplates { - rest_decl: "\tBaseURL string".to_string(), - auth_decl: "\tAuthToken string".to_string(), - shell_decl: "\tWorkingDir string".to_string(), - file_decl: "\tBasePath string".to_string(), - rest_ctor: "".to_string(), - auth_ctor: "".to_string(), - shell_ctor: "".to_string(), - file_ctor: "".to_string(), - }), - block_syntax: Rc::new(BlockSyntax { - block_open: " {\n".to_string(), - block_close: "}".to_string(), - else_clause: "} else {\n".to_string(), - match_keyword: "switch ".to_string(), - case_keyword: "case ".to_string(), - arm_separator: "\n".to_string(), - stmt_terminator: "".to_string(), - significant_whitespace: false, - }), - for_each_syntax: Rc::new(ForEachSyntax { - prefix: "for _, ".to_string(), - separator: " := range ".to_string(), - }), - tco: Rc::new(TcoSyntax { - loop_keyword: "for".to_string(), - break_return: "return".to_string(), - continue_str: "continue".to_string(), - temp_var_prefix: "tco".to_string(), - temp_decl_prefix: "".to_string(), - temp_assign_op: " := ".to_string(), - }), - items: Rc::new(ItemKeywords { - func_keyword: item_keyword_for_kind(go_item_forms(), ItemFormKind::FuncForm), - async_prefix: go_async_prefix(), - struct_keyword: item_keyword_for_kind(go_item_forms(), ItemFormKind::StructForm), - enum_keyword: item_keyword_for_kind(go_item_forms(), ItemFormKind::EnumForm), - type_alias_keyword: item_keyword_for_kind(go_item_forms(), ItemFormKind::TypeAliasForm), - param_separator: go_param_separator(), - return_arrow: go_return_arrow(), - param_type_sep: go_param_type_sep(), - module_keyword: item_keyword_for_kind(go_item_forms(), ItemFormKind::ModuleForm), - import_keyword: go_import_keyword(), - import_from_keyword: go_import_from_keyword(), - }), - expression_semantics: Rc::new(ExpressionSemantics { - if_value_form: IfValueForm::IfStatement, - wildcard_case: Some("default".to_string()), - variant_pattern: None, - guard_prefix: None, - empty_return_value: "struct{}{}, nil".to_string(), - return_suffix: ", nil".to_string(), - suppress_unit_return: true, - }), - lambda_template: go_lambda_template(), - error_expr_template: go_error_expr_template(), - list_literal_empty: go_list_literal_empty(), - list_literal_template: go_list_literal_template(), - null_coalesce_template: go_null_coalesce_template(), - error_type_template: go_error_type_template(), - type_arg_open: go_type_arg_open(), - type_arg_close: go_type_arg_close(), - void_type: go_void_type(), - tuple_syntax: Rc::new(TupleSyntax { - empty: go_tuple_empty(), - pair_template: go_tuple_pair_template(), - multi_template: go_tuple_multi_template(), - separator: go_tuple_separator(), - first_accessor: ".First".to_string(), - second_accessor: ".Second".to_string(), - }), - string_interp: Rc::new(StringInterpSyntax { - style: Rc::new(InterpStyle::FormatArgs { - placeholder: "%v".to_string(), - }), - format_template: "fmt.Sprintf(\"{0}\", {1})".to_string(), - plain_template: "\"{0}\"".to_string(), - escape_pairs: Rc::new(vec![Rc::new(EscapePair { - from: "%".to_string(), - to: "%%".to_string(), - })]), - }), - callable_type_template: None, - naming_case: NamingCase::CamelCase, - async_call_prefix: "".to_string(), - bridge_method_prefix: "v2rt.".to_string(), - bridge_method_case: NamingCase::PascalCase, - bridge_method_overrides: v2_rt::rc_empty_map::(), - record_lit: Rc::new(RecordLitSyntax { - named_open: "{".to_string(), - named_close: "}".to_string(), - named_empty: "{}".to_string(), - named_field_sep: ": ".to_string(), - named_field_join: ", ".to_string(), - anon_empty: "map[string]interface{}{}".to_string(), - anon_prefix: "map[string]interface{}{\n".to_string(), - anon_suffix: "}".to_string(), - anon_field_indent: "\t".to_string(), - }), - service_method: Rc::new(ServiceMethodStrategy::ExternalReceiver { - var_name: "c".to_string(), - }), - service_return: Rc::new(ServiceReturnStrategy::ErrorTupleReturn { - error_type: "error".to_string(), - }), - }) + target_name: "go".to_string(), + reserved_words: Rc::new(ReservedWords { + keywords: go_reserved(), + strategy: Rc::new(ReservedWordStrategy::SuffixEscape { + suffix: go_reserved_escape_suffix(), +}), +}), + scaffold: Rc::new(ProjectScaffold { + manifest_file: Some("go.mod".to_string()), + module_init_file: None, + source_file_extension: ".go".to_string(), + source_dir: None, +}), + serialization: Rc::new(SerializationSpec { + struct_derives: None, + struct_derives_copy: None, + enum_derives: None, + enum_derives_copy: None, + tag_attribute: None, + rename_attribute_template: None, + derive_attribute: None, + default_value: None, +}), + test_conventions: Rc::new(TestConventions { + file_prefix: "".to_string(), + file_suffix: "_test".to_string(), + file_dir: None, + function_prefix: "Test".to_string(), + name_style: TestNameStyle::PascalCaseTestNames, + async_decorator: None, +}), + visibility: Rc::new(VisibilitySpec::CaseVisibility { + export_case: NamingCase::PascalCase, +}), + sharing: Rc::new(SharingStrategy { + needs_sharing: false, + wrap_template: "{0}".to_string(), + clone_value: "{0}".to_string(), + deref_clone: "{0}".to_string(), + field_clone: "{0}.{1}".to_string(), + iter_owned: "{0}".to_string(), + clone_suffix: "".to_string(), + borrow_param_template: "{0}".to_string(), + borrow_arg_template: "{0}".to_string(), +}), + indexing: Rc::new(IndexingSemantics { + list_index: "{0}[{1}]".to_string(), + map_index: "{0}[{1}]".to_string(), + string_index: "{0}[{1}]".to_string(), + list_slice: Some("{0}[{1}:{2}]".to_string()), + string_slice: Some("{0}[{1}:{2}]".to_string()), +}), + annotations: Rc::new(AnnotationRequirements { + let_binding_inferred: "{0} := {1}".to_string(), + let_binding_annotated: "var {0} {1} = {2}".to_string(), + lambda_param_typed: "{0} {1}".to_string(), + lambda_param_untyped: "{0} interface{}".to_string(), +}), + method_templates: Some(go_method_templates()), + service_fields: Rc::new(ServiceFieldTemplates { + rest_decl: "\tBaseURL string".to_string(), + auth_decl: "\tAuthToken string".to_string(), + shell_decl: "\tWorkingDir string".to_string(), + file_decl: "\tBasePath string".to_string(), + rest_ctor: "".to_string(), + auth_ctor: "".to_string(), + shell_ctor: "".to_string(), + file_ctor: "".to_string(), +}), + block_syntax: Rc::new(BlockSyntax { + block_open: " {\n".to_string(), + block_close: "}".to_string(), + else_clause: "} else {\n".to_string(), + match_keyword: "switch ".to_string(), + case_keyword: "case ".to_string(), + arm_separator: "\n".to_string(), + stmt_terminator: "".to_string(), + significant_whitespace: false, +}), + for_each_syntax: Rc::new(ForEachSyntax { + prefix: "for _, ".to_string(), + separator: " := range ".to_string(), +}), + tco: Rc::new(TcoSyntax { + loop_keyword: "for".to_string(), + break_return: "return".to_string(), + continue_str: "continue".to_string(), + temp_var_prefix: "tco".to_string(), + temp_decl_prefix: "".to_string(), + temp_assign_op: " := ".to_string(), +}), + items: Rc::new(ItemKeywords { + func_keyword: item_keyword_for_kind(go_item_forms(), ItemFormKind::FuncForm), + async_prefix: go_async_prefix(), + struct_keyword: item_keyword_for_kind(go_item_forms(), ItemFormKind::StructForm), + enum_keyword: item_keyword_for_kind(go_item_forms(), ItemFormKind::EnumForm), + type_alias_keyword: item_keyword_for_kind(go_item_forms(), ItemFormKind::TypeAliasForm), + param_separator: go_param_separator(), + return_arrow: go_return_arrow(), + param_type_sep: go_param_type_sep(), + module_keyword: item_keyword_for_kind(go_item_forms(), ItemFormKind::ModuleForm), + import_keyword: go_import_keyword(), + import_from_keyword: go_import_from_keyword(), +}), + expression_semantics: Rc::new(ExpressionSemantics { + if_value_form: IfValueForm::IfStatement, + wildcard_case: Some("default".to_string()), + variant_pattern: None, + guard_prefix: None, + empty_return_value: "struct{}{}, nil".to_string(), + return_suffix: ", nil".to_string(), + suppress_unit_return: true, +}), + lambda_template: go_lambda_template(), + error_expr_template: go_error_expr_template(), + list_literal_empty: go_list_literal_empty(), + list_literal_template: go_list_literal_template(), + null_coalesce_template: go_null_coalesce_template(), + error_type_template: go_error_type_template(), + type_arg_open: go_type_arg_open(), + type_arg_close: go_type_arg_close(), + void_type: go_void_type(), + tuple_syntax: Rc::new(TupleSyntax { + empty: go_tuple_empty(), + pair_template: go_tuple_pair_template(), + multi_template: go_tuple_multi_template(), + separator: go_tuple_separator(), + first_accessor: ".First".to_string(), + second_accessor: ".Second".to_string(), +}), + string_interp: Rc::new(StringInterpSyntax { + style: Rc::new(InterpStyle::FormatArgs { + placeholder: "%v".to_string(), +}), + format_template: "fmt.Sprintf(\"{0}\", {1})".to_string(), + plain_template: "\"{0}\"".to_string(), + escape_pairs: Rc::new(vec![Rc::new(EscapePair { + from: "%".to_string(), + to: "%%".to_string(), +})]), +}), + callable_type_template: None, + naming_case: NamingCase::CamelCase, + async_call_prefix: "".to_string(), + bridge_method_prefix: "v2rt.".to_string(), + bridge_method_case: NamingCase::PascalCase, + bridge_method_overrides: v2_rt::rc_empty_map::(), + record_lit: Rc::new(RecordLitSyntax { + named_open: "{".to_string(), + named_close: "}".to_string(), + named_empty: "{}".to_string(), + named_field_sep: ": ".to_string(), + named_field_join: ", ".to_string(), + anon_empty: "map[string]interface{}{}".to_string(), + anon_prefix: "map[string]interface{}{\n".to_string(), + anon_suffix: "}".to_string(), + anon_field_indent: "\t".to_string(), +}), + service_method: Rc::new(ServiceMethodStrategy::ExternalReceiver { + var_name: "c".to_string(), +}), + service_return: Rc::new(ServiceReturnStrategy::ErrorTupleReturn { + error_type: "error".to_string(), +}), +}) } pub fn dag_spec() -> Rc { Rc::new(LanguageSpec { - target_name: "dag".to_string(), - reserved_words: Rc::new(ReservedWords { - keywords: dag_reserved(), - strategy: Rc::new(ReservedWordStrategy::NoEscape), - }), - scaffold: Rc::new(ProjectScaffold { - manifest_file: None, - module_init_file: None, - source_file_extension: dag_source_extension(), - source_dir: None, - }), - serialization: Rc::new(SerializationSpec { - struct_derives: None, - struct_derives_copy: None, - enum_derives: None, - enum_derives_copy: None, - tag_attribute: None, - rename_attribute_template: None, - derive_attribute: None, - default_value: None, - }), - test_conventions: Rc::new(TestConventions { - file_prefix: "test_".to_string(), - file_suffix: "".to_string(), - file_dir: Some("tests/".to_string()), - function_prefix: "test_".to_string(), - name_style: TestNameStyle::SnakeCaseTestNames, - async_decorator: None, - }), - visibility: Rc::new(VisibilitySpec::KeywordVisibility { - prefix: "".to_string(), - }), - sharing: Rc::new(SharingStrategy { - needs_sharing: true, - wrap_template: "Rc<{0}>".to_string(), - clone_value: "{0}.clone()".to_string(), - deref_clone: "(*{0}).clone()".to_string(), - field_clone: "{0}.{1}.clone()".to_string(), - iter_owned: "{0}.iter().cloned()".to_string(), - clone_suffix: ".cloned()".to_string(), - borrow_param_template: "&{0}".to_string(), - borrow_arg_template: "&{0}".to_string(), - }), - indexing: Rc::new(IndexingSemantics { - list_index: "{0}[({1}) as usize].clone()".to_string(), - map_index: "({0}).get(&{1}).cloned()".to_string(), - string_index: "v2_rt::char_at(&{0}, {1})".to_string(), - list_slice: None, - string_slice: Some("v2_rt::substring(&{0}, {1}, {2})".to_string()), - }), - annotations: Rc::new(AnnotationRequirements { - let_binding_inferred: "let {0} = {1}".to_string(), - let_binding_annotated: "let {0}: {1} = {2}".to_string(), - lambda_param_typed: "{0}: {1}".to_string(), - lambda_param_untyped: "{0}".to_string(), - }), - method_templates: Some(rust_method_templates()), - service_fields: Rc::new(ServiceFieldTemplates { - rest_decl: " pub base_url: String,\n".to_string(), - auth_decl: " pub auth_token: String,\n".to_string(), - shell_decl: " pub working_dir: Option,\n".to_string(), - file_decl: " pub base_path: String,\n".to_string(), - rest_ctor: " base_url: \"{0}\".to_string(),\n".to_string(), - auth_ctor: " auth_token: String::new(),\n".to_string(), - shell_ctor: " working_dir: None,\n".to_string(), - file_ctor: " base_path: \".\".to_string(),\n".to_string(), - }), - block_syntax: Rc::new(BlockSyntax { - block_open: " {\n".to_string(), - block_close: "}".to_string(), - else_clause: "} else {\n".to_string(), - match_keyword: "match ".to_string(), - case_keyword: "".to_string(), - arm_separator: ",".to_string(), - stmt_terminator: ";".to_string(), - significant_whitespace: false, - }), - for_each_syntax: Rc::new(ForEachSyntax { - prefix: "for ".to_string(), - separator: " in ".to_string(), - }), - tco: Rc::new(TcoSyntax { - loop_keyword: "loop".to_string(), - break_return: "break".to_string(), - continue_str: "continue;".to_string(), - temp_var_prefix: "__tco_".to_string(), - temp_decl_prefix: "let ".to_string(), - temp_assign_op: " = ".to_string(), - }), - items: Rc::new(ItemKeywords { - func_keyword: dag_func_keyword(), - async_prefix: dag_async_prefix(), - struct_keyword: dag_struct_keyword(), - enum_keyword: dag_enum_keyword(), - type_alias_keyword: dag_type_alias_keyword(), - param_separator: dag_param_separator(), - return_arrow: dag_return_arrow(), - param_type_sep: dag_param_type_sep(), - module_keyword: dag_module_keyword(), - import_keyword: dag_import_keyword(), - import_from_keyword: dag_import_from_keyword(), - }), - expression_semantics: Rc::new(ExpressionSemantics { - if_value_form: IfValueForm::IfExpression, - wildcard_case: None, - variant_pattern: Some(Rc::new(VariantPatternSyntax { - open: " { ".to_string(), - close: " }".to_string(), - binding_sep: ": ".to_string(), - empty_suffix: "".to_string(), - })), - guard_prefix: Some(" if ".to_string()), - empty_return_value: "()".to_string(), - return_suffix: "".to_string(), - suppress_unit_return: false, - }), - lambda_template: dag_lambda_template(), - error_expr_template: dag_error_expr_template(), - list_literal_empty: dag_list_literal_empty(), - list_literal_template: dag_list_literal_template(), - null_coalesce_template: dag_null_coalesce_template(), - error_type_template: dag_error_type_template(), - type_arg_open: dag_type_arg_open(), - type_arg_close: dag_type_arg_close(), - void_type: dag_void_type(), - tuple_syntax: Rc::new(TupleSyntax { - empty: dag_tuple_empty(), - pair_template: dag_tuple_pair_template(), - multi_template: dag_tuple_multi_template(), - separator: dag_tuple_separator(), - first_accessor: ".0".to_string(), - second_accessor: ".1".to_string(), - }), - string_interp: Rc::new(StringInterpSyntax { - style: Rc::new(InterpStyle::InlineExpr), - format_template: "\"{0}\"".to_string(), - plain_template: "\"{0}\"".to_string(), - escape_pairs: Rc::new(vec![ - Rc::new(EscapePair { - from: "{".to_string(), - to: "\\{".to_string(), - }), - Rc::new(EscapePair { - from: "}".to_string(), - to: "\\}".to_string(), - }), - ]), - }), - callable_type_template: None, - naming_case: NamingCase::AsAuthored, - async_call_prefix: "".to_string(), - bridge_method_prefix: "".to_string(), - bridge_method_case: NamingCase::SnakeCase, - bridge_method_overrides: v2_rt::rc_empty_map::(), - record_lit: Rc::new(RecordLitSyntax { - named_open: " {".to_string(), - named_close: "}".to_string(), - named_empty: " {}".to_string(), - named_field_sep: ": ".to_string(), - named_field_join: ", ".to_string(), - anon_empty: "{}".to_string(), - anon_prefix: "{\n".to_string(), - anon_suffix: "}".to_string(), - anon_field_indent: " ".to_string(), - }), - service_method: Rc::new(ServiceMethodStrategy::SelfInParams { - self_param: "".to_string(), - }), - service_return: Rc::new(ServiceReturnStrategy::ArrowReturn), - }) + target_name: "dag".to_string(), + reserved_words: Rc::new(ReservedWords { + keywords: dag_reserved(), + strategy: Rc::new(ReservedWordStrategy::NoEscape), +}), + scaffold: Rc::new(ProjectScaffold { + manifest_file: None, + module_init_file: None, + source_file_extension: dag_source_extension(), + source_dir: None, +}), + serialization: Rc::new(SerializationSpec { + struct_derives: None, + struct_derives_copy: None, + enum_derives: None, + enum_derives_copy: None, + tag_attribute: None, + rename_attribute_template: None, + derive_attribute: None, + default_value: None, +}), + test_conventions: Rc::new(TestConventions { + file_prefix: "test_".to_string(), + file_suffix: "".to_string(), + file_dir: Some("tests/".to_string()), + function_prefix: "test_".to_string(), + name_style: TestNameStyle::SnakeCaseTestNames, + async_decorator: None, +}), + visibility: Rc::new(VisibilitySpec::KeywordVisibility { + prefix: "".to_string(), +}), + sharing: Rc::new(SharingStrategy { + needs_sharing: true, + wrap_template: "Rc<{0}>".to_string(), + clone_value: "{0}.clone()".to_string(), + deref_clone: "(*{0}).clone()".to_string(), + field_clone: "{0}.{1}.clone()".to_string(), + iter_owned: "{0}.iter().cloned()".to_string(), + clone_suffix: ".cloned()".to_string(), + borrow_param_template: "&{0}".to_string(), + borrow_arg_template: "&{0}".to_string(), +}), + indexing: Rc::new(IndexingSemantics { + list_index: "{0}[({1}) as usize].clone()".to_string(), + map_index: "({0}).get(&{1}).cloned()".to_string(), + string_index: "v2_rt::char_at(&{0}, {1})".to_string(), + list_slice: None, + string_slice: Some("v2_rt::substring(&{0}, {1}, {2})".to_string()), +}), + annotations: Rc::new(AnnotationRequirements { + let_binding_inferred: "let {0} = {1}".to_string(), + let_binding_annotated: "let {0}: {1} = {2}".to_string(), + lambda_param_typed: "{0}: {1}".to_string(), + lambda_param_untyped: "{0}".to_string(), +}), + method_templates: Some(rust_method_templates()), + service_fields: Rc::new(ServiceFieldTemplates { + rest_decl: " pub base_url: String,\n".to_string(), + auth_decl: " pub auth_token: String,\n".to_string(), + shell_decl: " pub working_dir: Option,\n".to_string(), + file_decl: " pub base_path: String,\n".to_string(), + rest_ctor: " base_url: \"{0}\".to_string(),\n".to_string(), + auth_ctor: " auth_token: String::new(),\n".to_string(), + shell_ctor: " working_dir: None,\n".to_string(), + file_ctor: " base_path: \".\".to_string(),\n".to_string(), +}), + block_syntax: Rc::new(BlockSyntax { + block_open: " {\n".to_string(), + block_close: "}".to_string(), + else_clause: "} else {\n".to_string(), + match_keyword: "match ".to_string(), + case_keyword: "".to_string(), + arm_separator: ",".to_string(), + stmt_terminator: ";".to_string(), + significant_whitespace: false, +}), + for_each_syntax: Rc::new(ForEachSyntax { + prefix: "for ".to_string(), + separator: " in ".to_string(), +}), + tco: Rc::new(TcoSyntax { + loop_keyword: "loop".to_string(), + break_return: "break".to_string(), + continue_str: "continue;".to_string(), + temp_var_prefix: "__tco_".to_string(), + temp_decl_prefix: "let ".to_string(), + temp_assign_op: " = ".to_string(), +}), + items: Rc::new(ItemKeywords { + func_keyword: dag_func_keyword(), + async_prefix: dag_async_prefix(), + struct_keyword: dag_struct_keyword(), + enum_keyword: dag_enum_keyword(), + type_alias_keyword: dag_type_alias_keyword(), + param_separator: dag_param_separator(), + return_arrow: dag_return_arrow(), + param_type_sep: dag_param_type_sep(), + module_keyword: dag_module_keyword(), + import_keyword: dag_import_keyword(), + import_from_keyword: dag_import_from_keyword(), +}), + expression_semantics: Rc::new(ExpressionSemantics { + if_value_form: IfValueForm::IfExpression, + wildcard_case: None, + variant_pattern: Some(Rc::new(VariantPatternSyntax { + open: " { ".to_string(), + close: " }".to_string(), + binding_sep: ": ".to_string(), + empty_suffix: "".to_string(), +})), + guard_prefix: Some(" if ".to_string()), + empty_return_value: "()".to_string(), + return_suffix: "".to_string(), + suppress_unit_return: false, +}), + lambda_template: dag_lambda_template(), + error_expr_template: dag_error_expr_template(), + list_literal_empty: dag_list_literal_empty(), + list_literal_template: dag_list_literal_template(), + null_coalesce_template: dag_null_coalesce_template(), + error_type_template: dag_error_type_template(), + type_arg_open: dag_type_arg_open(), + type_arg_close: dag_type_arg_close(), + void_type: dag_void_type(), + tuple_syntax: Rc::new(TupleSyntax { + empty: dag_tuple_empty(), + pair_template: dag_tuple_pair_template(), + multi_template: dag_tuple_multi_template(), + separator: dag_tuple_separator(), + first_accessor: ".0".to_string(), + second_accessor: ".1".to_string(), +}), + string_interp: Rc::new(StringInterpSyntax { + style: Rc::new(InterpStyle::InlineExpr), + format_template: "\"{0}\"".to_string(), + plain_template: "\"{0}\"".to_string(), + escape_pairs: Rc::new(vec![Rc::new(EscapePair { + from: "{".to_string(), + to: "\\{".to_string(), +}), Rc::new(EscapePair { + from: "}".to_string(), + to: "\\}".to_string(), +})]), +}), + callable_type_template: None, + naming_case: NamingCase::AsAuthored, + async_call_prefix: "".to_string(), + bridge_method_prefix: "".to_string(), + bridge_method_case: NamingCase::SnakeCase, + bridge_method_overrides: v2_rt::rc_empty_map::(), + record_lit: Rc::new(RecordLitSyntax { + named_open: " {".to_string(), + named_close: "}".to_string(), + named_empty: " {}".to_string(), + named_field_sep: ": ".to_string(), + named_field_join: ", ".to_string(), + anon_empty: "{}".to_string(), + anon_prefix: "{\n".to_string(), + anon_suffix: "}".to_string(), + anon_field_indent: " ".to_string(), +}), + service_method: Rc::new(ServiceMethodStrategy::SelfInParams { + self_param: "".to_string(), +}), + service_return: Rc::new(ServiceReturnStrategy::ArrowReturn), +}) } pub fn language_spec_for_target(target: RenderTarget) -> Rc { match target { - RenderTarget::Rust => rust_spec(), - RenderTarget::Go => go_spec(), - RenderTarget::Python => python_spec(), - RenderTarget::Dag => dag_spec(), - } + RenderTarget::Rust => rust_spec(), + RenderTarget::Go => go_spec(), + RenderTarget::Python => python_spec(), + RenderTarget::Dag => dag_spec(), +} } pub fn target_keyword(target: RenderTarget, key: String) -> String { match target { - RenderTarget::Rust => match v2_rt::lookup(&rust_keywords(), key.clone()) { - Some(kw) => kw.clone(), - None => key.clone(), - }, - RenderTarget::Go => match v2_rt::lookup(&go_keywords(), key.clone()) { - Some(kw) => kw.clone(), - None => key.clone(), - }, - RenderTarget::Python => match v2_rt::lookup(&python_keywords(), key.clone()) { - Some(kw) => kw.clone(), - None => key.clone(), - }, - RenderTarget::Dag => key.clone(), - } + RenderTarget::Rust => match v2_rt::lookup(&rust_keywords(), key.clone()) { + Some(kw) => kw.clone(), + None => key.clone(), +}, + RenderTarget::Go => match v2_rt::lookup(&go_keywords(), key.clone()) { + Some(kw) => kw.clone(), + None => key.clone(), +}, + RenderTarget::Python => match v2_rt::lookup(&python_keywords(), key.clone()) { + Some(kw) => kw.clone(), + None => key.clone(), +}, + RenderTarget::Dag => key.clone(), +} } pub fn target_operators(target: RenderTarget) -> Rc>> { match target { - RenderTarget::Rust => rust_operators(), - RenderTarget::Python => python_operators(), - RenderTarget::Go => go_operators(), - RenderTarget::Dag => dag_operators(), - } + RenderTarget::Rust => rust_operators(), + RenderTarget::Python => python_operators(), + RenderTarget::Go => go_operators(), + RenderTarget::Dag => dag_operators(), +} } -pub fn binop_symbol( - target: RenderTarget, - op: BinOp, - algebra_field: Option, -) -> Option { +pub fn binop_symbol(target: RenderTarget, op: BinOp, algebra_field: Option) -> Option { { let ops = target_operators(target); - let op_matching = Rc::new({ - let mut __result = Vec::new(); - for spec in ops.iter().cloned() { - if match spec.binop.clone() { - Some(b) => (b.clone() == op.clone()), - None => false, - } { - __result.push(spec); - } - } - __result - }); - let specific = match algebra_field { - Some(af) => Rc::new({ - let mut __result = Vec::new(); - for spec in op_matching.clone().iter().cloned() { - if match spec.algebra_field.clone() { - Some(sf) => (sf.clone() == af.clone()), - _ => false, - } { - __result.push(spec); - } - } - __result - }) - .first() - .cloned(), - None => None, - }; - let result = match specific.clone() { - Some(_) => specific.clone(), - None => Rc::new({ - let mut __result = Vec::new(); - for spec in op_matching.clone().iter().cloned() { - if (spec.algebra_field.clone() == None) { - __result.push(spec); - } - } - __result - }) - .first() - .cloned(), - }; - match result { - Some(spec) => Some(spec.symbol.clone()), - None => None, - } - } +let op_matching = Rc::new({ let mut __result = Vec::new(); for spec in ops.iter().cloned() { if match spec.binop.clone() { + Some(b) => (b.clone() == op.clone()), + None => false, +} { __result.push(spec); } } __result }); +let specific = match algebra_field { + Some(af) => Rc::new({ let mut __result = Vec::new(); for spec in op_matching.clone().iter().cloned() { if match spec.algebra_field.clone() { + Some(sf) => (sf.clone() == af.clone()), + _ => false, +} { __result.push(spec); } } __result }).first().cloned(), + None => None, +}; +let result = match specific.clone() { + Some(_) => specific.clone(), + None => Rc::new({ let mut __result = Vec::new(); for spec in op_matching.clone().iter().cloned() { if (spec.algebra_field.clone() == None) { __result.push(spec); } } __result }).first().cloned(), +}; +match result { + Some(spec) => Some(spec.symbol.clone()), + None => None, +} +} } pub fn is_string_like(target: RenderTarget, name: String) -> bool { match target { - RenderTarget::Rust => { - let mut __found = false; - for t in rust_string_types().iter().cloned() { - if (t.clone().as_str() == name.clone().as_str()) { - __found = true; - break; - } - } - __found - } - RenderTarget::Go => { - let mut __found = false; - for t in go_string_types().iter().cloned() { - if (t.clone().as_str() == name.clone().as_str()) { - __found = true; - break; - } - } - __found - } - RenderTarget::Python => { - let mut __found = false; - for t in python_string_types().iter().cloned() { - if (t.clone().as_str() == name.clone().as_str()) { - __found = true; - break; - } - } - __found - } - RenderTarget::Dag => false, - } + RenderTarget::Rust => { let mut __found = false; for t in rust_string_types().iter().cloned() { if (t.clone().as_str() == name.clone().as_str()) { __found = true; break; } } __found }, + RenderTarget::Go => { let mut __found = false; for t in go_string_types().iter().cloned() { if (t.clone().as_str() == name.clone().as_str()) { __found = true; break; } } __found }, + RenderTarget::Python => { let mut __found = false; for t in python_string_types().iter().cloned() { if (t.clone().as_str() == name.clone().as_str()) { __found = true; break; } } __found }, + RenderTarget::Dag => false, +} } pub fn scaffold_for_target(target: RenderTarget) -> Rc { @@ -1316,14 +1190,12 @@ pub fn sharing_for_target(target: RenderTarget) -> Rc { } pub fn expression_semantics_for_target(target: RenderTarget) -> Rc { - language_spec_for_target(target) - .expression_semantics - .clone() + language_spec_for_target(target).expression_semantics.clone() } pub fn wrap_shared_type(target: RenderTarget, inner: String) -> String { { let tmpl = sharing_for_target(target).wrap_template.clone(); - v2_rt::replace(tmpl, "{0}".to_string(), inner) - } +v2_rt::replace(tmpl, "{0}".to_string(), inner) +} } diff --git a/src/v2/stage0/src/v2_compiler_normalize.rs b/src/v2/stage0/src/v2_compiler_normalize.rs index a3adf7bac7f..165dbb3cf6f 100644 --- a/src/v2/stage0/src/v2_compiler_normalize.rs +++ b/src/v2/stage0/src/v2_compiler_normalize.rs @@ -1,21 +1,18 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.normalize -pub use crate::std_types::container_expected_arity; -pub use crate::v2_compiler_resolve::{ModuleGraph, ResolvedModule}; -use crate::v2_rt; -use crate::v2_std_core::CompilerDiagnostic::ArityMismatch; -use crate::v2_std_core::Connective::NoConnective; -use crate::v2_std_core::ExprData::NoExprData; -use crate::v2_std_core::InferredNode::{CompilerError, Resolved}; -pub use crate::v2_std_core::{ - authored_name_at, make_error_node, module_items, CompilerDiagnostic, Connective, ErrorNode, - ExprData, InferredNode, NewlineIndex, Node, -}; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::v2_std_core::{Node, ErrorNode, NewlineIndex, InferredNode, ExprData, make_error_node, module_items, authored_name_at, Connective, CompilerDiagnostic}; +use crate::v2_std_core::InferredNode::{Resolved, CompilerError}; +use crate::v2_std_core::ExprData::{NoExprData}; +use crate::v2_std_core::Connective::{NoConnective}; +use crate::v2_std_core::CompilerDiagnostic::{ArityMismatch}; +pub use crate::v2_compiler_resolve::{ModuleGraph, ResolvedModule}; +pub use crate::std_types::{container_expected_arity}; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] pub struct NormalizeResult { @@ -23,174 +20,72 @@ pub struct NormalizeResult { pub diagnostics: Rc>>, } -pub fn check_bare_containers( - n: &Rc, - module_name: &String, - source_indices: &Rc>>, -) -> Rc>> { +pub fn check_bare_containers(n: &Rc, module_name: &String, source_indices: &Rc>>) -> Rc>> { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - let has_structure = ((match n.body.clone() { - Some(_) => true, - None => false, - } || ((n.uses.clone().len() as i64) > 0)) - || ((n.properties.clone().len() as i64) > 0)); - let is_expr = match (*n.expr_data.clone()).clone() { - ExprData::NoExprData => false, - _ => true, - }; - let nname = authored_name_at(source_indices.clone(), &n); - let self_diags = if is_expr { - Rc::new(vec![]) - } else { - match container_expected_arity(nname.clone()) { - Some(expected) => { - if (((((n.children.clone().len() as i64) == 0) - && ((n.params.clone().len() as i64) == 0)) - && (n.connective.clone() == Connective::NoConnective)) - && !has_structure) - { - Rc::new(vec![make_error_node( - Rc::new(CompilerDiagnostic::ArityMismatch { - name: nname.clone(), - expected: expected.clone(), - got: 0, - span: n.span.clone(), - }), - module_name.clone(), - )]) - } else { - Rc::new(vec![]) - } - } - None => Rc::new(vec![]), - } - }; - let child_diags = Rc::new({ - let mut __result = Vec::new(); - for c in n.children.clone().iter().cloned() { - __result.extend( - (*check_bare_containers(&c, &module_name, &source_indices)) - .iter() - .cloned(), - ); - } - __result - }); - let param_diags = Rc::new({ - let mut __result = Vec::new(); - for p in n.params.clone().iter().cloned() { - __result.extend( - (*check_bare_containers(&p, &module_name, &source_indices)) - .iter() - .cloned(), - ); - } - __result - }); - let type_ann_diags = match n.type_annotation.clone() { - Some(ta) => check_bare_containers(&ta, &module_name, &source_indices), - None => Rc::new(vec![]), - }; - let body_diags = match n.body.clone() { - Some(b) => check_bare_containers(&b, &module_name, &source_indices), - None => Rc::new(vec![]), - }; - let inferred_diags = if ((n.params.clone().len() as i64) > 0) { - Rc::new(vec![]) - } else { - match n.inferred.clone() { - Some(inf) => match (*inf.clone()).clone() { - InferredNode::Resolved { node: rn, .. } => { - check_bare_containers(&rn, &module_name, &source_indices) - } - _ => Rc::new(vec![]), + { + let has_structure = ((match n.body.clone() { + Some(_) => true, + None => false, +} || ((n.uses.clone().len() as i64) > 0)) || ((n.properties.clone().len() as i64) > 0)); +let is_expr = match (*n.expr_data.clone()).clone() { + ExprData::NoExprData => false, + _ => true, +}; +let nname = authored_name_at(source_indices.clone(), &n); +let self_diags = if is_expr { + Rc::new(vec![]) + } else { + match container_expected_arity(nname.clone()) { + Some(expected) => if (((((n.children.clone().len() as i64) == 0) && ((n.params.clone().len() as i64) == 0)) && (n.connective.clone() == Connective::NoConnective)) && !has_structure) { + Rc::new(vec![make_error_node(Rc::new(CompilerDiagnostic::ArityMismatch { + name: nname.clone(), + expected: expected.clone(), + got: 0, + span: n.span.clone(), +}), module_name.clone())]) + } else { + Rc::new(vec![]) }, - None => Rc::new(vec![]), - } - }; - let uses_diags = Rc::new({ - let mut __result = Vec::new(); - for u in n.uses.clone().iter().cloned() { - __result.extend( - (*check_bare_containers(&u, &module_name, &source_indices)) - .iter() - .cloned(), - ); - } - __result - }); - let prop_diags = Rc::new({ - let mut __result = Vec::new(); - for p in n.properties.clone().iter().cloned() { - __result.extend( - (*check_bare_containers(&p, &module_name, &source_indices)) - .iter() - .cloned(), - ); - } - __result - }); - Rc::new({ - let mut __result = Vec::new(); - for d in Rc::new(vec![ - self_diags, - child_diags, - param_diags, - type_ann_diags, - inferred_diags, - body_diags, - uses_diags, - prop_diags, - ]) - .iter() - .cloned() - { - __result.extend((*d.clone()).iter().cloned()); - } - __result - }) + None => Rc::new(vec![]), +} + }; +let child_diags = Rc::new({ let mut __result = Vec::new(); for c in n.children.clone().iter().cloned() { __result.extend((*check_bare_containers(&c, &module_name, &source_indices)).iter().cloned()); } __result }); +let param_diags = Rc::new({ let mut __result = Vec::new(); for p in n.params.clone().iter().cloned() { __result.extend((*check_bare_containers(&p, &module_name, &source_indices)).iter().cloned()); } __result }); +let type_ann_diags = match n.type_annotation.clone() { + Some(ta) => check_bare_containers(&ta, &module_name, &source_indices), + None => Rc::new(vec![]), +}; +let body_diags = match n.body.clone() { + Some(b) => check_bare_containers(&b, &module_name, &source_indices), + None => Rc::new(vec![]), +}; +let inferred_diags = if ((n.params.clone().len() as i64) > 0) { + Rc::new(vec![]) + } else { + match n.inferred.clone() { + Some(inf) => match (*inf.clone()).clone() { + InferredNode::Resolved { node: rn, .. } => check_bare_containers(&rn, &module_name, &source_indices), + _ => Rc::new(vec![]), +}, + None => Rc::new(vec![]), +} + }; +let uses_diags = Rc::new({ let mut __result = Vec::new(); for u in n.uses.clone().iter().cloned() { __result.extend((*check_bare_containers(&u, &module_name, &source_indices)).iter().cloned()); } __result }); +let prop_diags = Rc::new({ let mut __result = Vec::new(); for p in n.properties.clone().iter().cloned() { __result.extend((*check_bare_containers(&p, &module_name, &source_indices)).iter().cloned()); } __result }); +Rc::new({ let mut __result = Vec::new(); for d in Rc::new(vec![self_diags, child_diags, param_diags, type_ann_diags, inferred_diags, body_diags, uses_diags, prop_diags]).iter().cloned() { __result.extend((*d.clone()).iter().cloned()); } __result }) +} }) } -pub fn normalize_graph( - graph: &Rc, - source_indices: Rc>>, -) -> Rc { +pub fn normalize_graph(graph: &Rc, source_indices: Rc>>) -> Rc { { - let diags = Rc::new({ - let mut __result = Vec::new(); - for m in graph.modules.clone().iter().cloned() { - __result.extend( - (*{ - let items = module_items(m.module.clone()); - Rc::new({ - let mut __result = Vec::new(); - for item in items.clone().iter().cloned() { - __result.extend( - (*check_bare_containers( - &item, - &authored_name_at( - source_indices.clone(), - &m.module.clone(), - ), - &source_indices, - )) - .iter() - .cloned(), - ); - } - __result - }) - }) - .iter() - .cloned(), - ); - } - __result - }); - Rc::new(NormalizeResult { - graph: graph.clone(), - diagnostics: diags, - }) - } + let diags = Rc::new({ let mut __result = Vec::new(); for m in graph.modules.clone().iter().cloned() { __result.extend((*{ + let items = module_items(m.module.clone()); +Rc::new({ let mut __result = Vec::new(); for item in items.clone().iter().cloned() { __result.extend((*check_bare_containers(&item, &authored_name_at(source_indices.clone(), &m.module.clone()), &source_indices)).iter().cloned()); } __result }) +}).iter().cloned()); } __result }); +Rc::new(NormalizeResult { + graph: graph.clone(), + diagnostics: diags, +}) +} } diff --git a/src/v2/stage0/src/v2_compiler_ownership.rs b/src/v2/stage0/src/v2_compiler_ownership.rs index 2abaab65c4d..192be95c9ec 100644 --- a/src/v2/stage0/src/v2_compiler_ownership.rs +++ b/src/v2/stage0/src/v2_compiler_ownership.rs @@ -1,28 +1,19 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.ownership -use self::EdgeKind::*; -use self::OwnershipDecision::*; -pub use crate::v2_compiler_emit::to_string; -use crate::v2_rt; -use crate::v2_std_core::Cardinality::Required; -use crate::v2_std_core::ExprData::{ - ExprBlock, ExprCall, ExprError, ExprFieldAccess, ExprForEach, ExprIf, ExprLambda, ExprLet, - ExprLiteral, ExprMatch, ExprMethodCall, ExprRecordLit, ExprReturn, ExprVar, NoExprData, -}; -use crate::v2_std_core::InferredNode::Resolved; -use crate::v2_std_core::VarBindingKind::{FunctionValueBinding, LocalValueBinding}; -pub use crate::v2_std_core::{ - arg_value, arm_body, authored_name_at, expr_call_func_at, expr_method_name_at, - expr_var_name_at, field_access_base, field_access_field_at, foreach_body, foreach_collection, - if_condition, if_else_branch, if_then_branch, lambda_body, lambda_param_names_at, let_body, - let_value, match_arm_nodes, match_scrutinee, method_arg_nodes, method_receiver, Cardinality, - ExprData, InferredNode, NewlineIndex, Node, VarBindingKind, -}; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::v2_std_core::{Node, ExprData, VarBindingKind, InferredNode, Cardinality, arg_value, arm_body, field_access_base, if_condition, if_then_branch, if_else_branch, let_value, let_body, lambda_body, lambda_param_names_at, match_scrutinee, match_arm_nodes, method_receiver, method_arg_nodes, foreach_collection, foreach_body, expr_var_name_at, expr_call_func_at, expr_method_name_at, field_access_field_at, authored_name_at, NewlineIndex}; +use crate::v2_std_core::ExprData::{NoExprData, ExprError, ExprLiteral, ExprVar, ExprFieldAccess, ExprCall, ExprMethodCall, ExprMatch, ExprIf, ExprLet, ExprBlock, ExprReturn, ExprLambda, ExprForEach, ExprRecordLit}; +use crate::v2_std_core::VarBindingKind::{LocalValueBinding, FunctionValueBinding}; +use crate::v2_std_core::InferredNode::{Resolved}; +use crate::v2_std_core::Cardinality::{Required}; +pub use crate::v2_compiler_emit::{to_string}; +use self::EdgeKind::*; +use self::OwnershipDecision::*; #[derive(Debug, Clone, Copy, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] @@ -48,35 +39,17 @@ pub struct BindingUsage { } pub fn semantic_consumer_count(usage: Rc) -> i64 { - (Rc::new({ - let mut __result = Vec::new(); - for c in usage.consumers.clone().iter().cloned() { - if match c.kind.clone() { - EdgeKind::Consumed => true, - _ => false, - } { - __result.push(c); - } - } - __result - }) - .len() as i64) + (Rc::new({ let mut __result = Vec::new(); for c in usage.consumers.clone().iter().cloned() { if match c.kind.clone() { + EdgeKind::Consumed => true, + _ => false, +} { __result.push(c); } } __result }).len() as i64) } pub fn binding_fan_out(usage: Rc) -> i64 { - (Rc::new({ - let mut __result = Vec::new(); - for c in usage.consumers.clone().iter().cloned() { - if match c.kind.clone() { - EdgeKind::Threaded => false, - _ => true, - } { - __result.push(c); - } - } - __result - }) - .len() as i64) + (Rc::new({ let mut __result = Vec::new(); for c in usage.consumers.clone().iter().cloned() { if match c.kind.clone() { + EdgeKind::Threaded => false, + _ => true, +} { __result.push(c); } } __result }).len() as i64) } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -140,48 +113,41 @@ pub struct UsageAccum { pub fn empty_usage_accum() -> Rc { Rc::new(UsageAccum { - bindings: v2_rt::rc_empty_map::>(), - fold_call_nodes: Rc::new(vec![]), - }) + bindings: v2_rt::rc_empty_map::>(), + fold_call_nodes: Rc::new(vec![]), +}) } -pub fn record_use( - accum: &Rc, - name: &String, - kind: EdgeKind, - site: String, - binding_kind: Option>, - span_start: i64, -) -> Rc { +pub fn record_use(accum: &Rc, name: &String, kind: EdgeKind, site: String, binding_kind: Option>, span_start: i64) -> Rc { { let edge = Rc::new(EdgeClassification { - kind: kind, - site: site, - span_start: span_start, - }); - let existing = match v2_rt::map_get(&accum.bindings.clone(), name.clone()) { - Some(usage) => usage.clone(), - None => Rc::new(BindingUsage { - name: name.clone(), - binding_kind: None, - consumers: Rc::new(vec![]), - }), - }; - let effective_kind = if (existing.binding_kind.clone() != None) { + kind: kind, + site: site, + span_start: span_start, +}); +let existing = match v2_rt::map_get(&accum.bindings.clone(), name.clone()) { + Some(usage) => usage.clone(), + None => Rc::new(BindingUsage { + name: name.clone(), + binding_kind: None, + consumers: Rc::new(vec![]), +}), +}; +let effective_kind = if (existing.binding_kind.clone() != None) { existing.binding_kind.clone() } else { binding_kind }; - let updated = Rc::new(BindingUsage { - name: name.clone(), - binding_kind: effective_kind, - consumers: v2_rt::rc_list_push(existing.consumers.clone(), edge), - }); - Rc::new(UsageAccum { - bindings: v2_rt::rc_map_insert(accum.bindings.clone(), name.clone(), updated), - fold_call_nodes: accum.fold_call_nodes.clone(), - }) - } +let updated = Rc::new(BindingUsage { + name: name.clone(), + binding_kind: effective_kind, + consumers: v2_rt::rc_list_push(existing.consumers.clone(), edge), +}); +Rc::new(UsageAccum { + bindings: v2_rt::rc_map_insert(accum.bindings.clone(), name.clone(), updated), + fold_call_nodes: accum.fold_call_nodes.clone(), +}) +} } pub fn max_usage_by_fan_out(a: Rc, b: Rc) -> Rc { @@ -192,1014 +158,510 @@ pub fn max_usage_by_fan_out(a: Rc, b: Rc) -> Rc>>, - key: &String, - new_val: Rc, -) -> Rc>> { +pub fn map_usage_merge_at(base: &Rc>>, key: &String, new_val: Rc) -> Rc>> { match v2_rt::map_get(&base, key.clone()) { - Some(existing) => v2_rt::rc_map_insert( - base.clone(), - key.clone(), - max_usage_by_fan_out(existing.clone(), new_val), - ), - None => v2_rt::rc_map_insert(base.clone(), key.clone(), new_val), - } + Some(existing) => v2_rt::rc_map_insert(base.clone(), key.clone(), max_usage_by_fan_out(existing.clone(), new_val)), + None => v2_rt::rc_map_insert(base.clone(), key.clone(), new_val), +} } -pub fn merge_branch_usages( - base: &Rc, - branches: &Rc>>, -) -> Rc { +pub fn merge_branch_usages(base: &Rc, branches: &Rc>>) -> Rc { { - let binding_merged = branches.clone().iter().cloned().fold( - base.bindings.clone(), - |merged: Rc>>, branch: Rc| { - Rc::new(v2_rt::map_values(&branch.bindings.clone())) - .iter() - .cloned() - .fold( - merged, - |acc: Rc>>, usage: Rc| { - map_usage_merge_at(&acc, &usage.name.clone(), usage.clone()) - }, - ) - }, - ); - let base_fold_count = (base.fold_call_nodes.clone().len() as i64); - let branch_fold_nodes = Rc::new({ - let mut __result = Vec::new(); - for b in branches.clone().iter().cloned() { - __result.extend( - (*Rc::new( - b.fold_call_nodes - .clone() - .iter() - .cloned() - .skip(base_fold_count.clone() as usize) - .collect::>(), - )) - .iter() - .cloned(), - ); - } - __result - }); - Rc::new(UsageAccum { - bindings: binding_merged, - fold_call_nodes: v2_rt::concat(base.fold_call_nodes.clone(), branch_fold_nodes), - }) - } + let binding_merged = branches.clone().iter().cloned().fold(base.bindings.clone(), |merged: Rc>>, branch: Rc| Rc::new(v2_rt::map_values(&branch.bindings.clone())).iter().cloned().fold(merged, |acc: Rc>>, usage: Rc| map_usage_merge_at(&acc, &usage.name.clone(), usage.clone()))); +let base_fold_count = (base.fold_call_nodes.clone().len() as i64); +let branch_fold_nodes = Rc::new({ let mut __result = Vec::new(); for b in branches.clone().iter().cloned() { __result.extend((*Rc::new(b.fold_call_nodes.clone().iter().cloned().skip(base_fold_count.clone() as usize).collect::>())).iter().cloned()); } __result }); +Rc::new(UsageAccum { + bindings: binding_merged, + fold_call_nodes: v2_rt::concat(base.fold_call_nodes.clone(), branch_fold_nodes), +}) +} } -pub fn walk_expr( - accum: Rc, - texpr: &Rc, - in_tail: bool, - si: &Rc>>, -) -> Rc { +pub fn walk_expr(accum: Rc, texpr: &Rc, in_tail: bool, si: &Rc>>) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*texpr.expr_data.clone()).clone() { - ExprData::ExprVar { - binding_kind: bk, .. - } => { - let n = expr_var_name_at(texpr.clone(), si.clone()); - if in_tail.clone() { - record_use( - &accum, - &n, - EdgeKind::Consumed, - "return".to_string(), - bk.clone(), - texpr.span.clone().start.clone(), - ) - } else { - record_use( - &accum, - &n, - EdgeKind::Read, - "read".to_string(), - bk.clone(), - texpr.span.clone().start.clone(), - ) - } - } - ExprData::ExprLiteral { .. } => accum, - ExprData::ExprFieldAccess { .. } => { - let base_node = field_access_base(texpr.clone()); - match (*base_node.expr_data.clone()).clone() { - ExprData::ExprVar { - binding_kind: bk, .. - } => { - let vn = expr_var_name_at(base_node.clone(), si.clone()); - let f = field_access_field_at(texpr.clone(), si.clone()); - record_use( - &accum, - &vn, - EdgeKind::Projected, - v2_rt::concat(".".to_string(), f), - bk.clone(), - texpr.span.clone().start.clone(), - ) - } - _ => walk_expr(accum, &base_node, false, &si), - } - } - ExprData::ExprCall { .. } => { - let fname = expr_call_func_at(texpr.clone(), si.clone()); - if (fname.as_str() == "fold".to_string().as_str()) { - { - let init_arg = Rc::new({ - let mut __result = Vec::new(); - for a in texpr.children.clone().iter().cloned() { - if (authored_name_at(si.clone(), &a).as_str() - == "init".to_string().as_str()) - { - __result.push(a); - } - } - __result - }) - .first() - .cloned(); - let threaded_accum = match init_arg { - Some(ia) => { - let ia_val = arg_value(&ia); - match (*ia_val.expr_data.clone()).clone() { - ExprData::ExprVar { - binding_kind: bk, .. - } => { - let vn = expr_var_name_at(ia_val.clone(), si.clone()); - record_use( - &accum, - &vn, - EdgeKind::Threaded, - "fold_init".to_string(), - bk.clone(), - ia_val.span.clone().start.clone(), - ) - } - _ => walk_expr(accum, &ia_val, false, &si), - } - } - None => accum, - }; - let non_init = Rc::new({ - let mut __result = Vec::new(); - for a in texpr.children.clone().iter().cloned() { - if (authored_name_at(si.clone(), &a).as_str() - != "init".to_string().as_str()) - { - __result.push(a); - } - } - __result - }); - non_init.iter().cloned().fold( - threaded_accum.clone(), - |acc: Rc, a: Rc| { - walk_expr(acc, &arg_value(&a), false, &si) - }, - ) - } - } else { - texpr.children.clone().iter().cloned().fold( - accum, - |acc: Rc, a: Rc| { - walk_expr(acc, &arg_value(&a), false, &si) - }, - ) - } - } - ExprData::ExprMethodCall { .. } => { - let recv = method_receiver(texpr.clone()); - let mc_args = method_arg_nodes(texpr.clone()); - let mname = expr_method_name_at(texpr.clone(), si.clone()); - if (mname.as_str() == "fold".to_string().as_str()) { - { - let recv_accum = walk_expr(accum, &recv, false, &si); - let init_arg = Rc::new({ - let mut __result = Vec::new(); - for a in mc_args.clone().iter().cloned() { - if (authored_name_at(si.clone(), &a).as_str() - == "init".to_string().as_str()) - { - __result.push(a); - } - } - __result - }) - .first() - .cloned(); - let threaded_accum = match init_arg { - Some(ia) => { - let ia_val = arg_value(&ia); - match (*ia_val.expr_data.clone()).clone() { - ExprData::ExprVar { - binding_kind: bk, .. - } => { - let vn = expr_var_name_at(ia_val.clone(), si.clone()); - record_use( - &recv_accum, - &vn, - EdgeKind::Threaded, - "fold_init".to_string(), - bk.clone(), - ia_val.span.clone().start.clone(), - ) - } - _ => walk_expr(recv_accum, &ia_val, false, &si), - } - } - None => recv_accum, - }; - let non_init = Rc::new({ - let mut __result = Vec::new(); - for a in mc_args.clone().iter().cloned() { - if (authored_name_at(si.clone(), &a).as_str() - != "init".to_string().as_str()) - { - __result.push(a); - } - } - __result - }); - let walked = non_init.iter().cloned().fold( - threaded_accum.clone(), - |acc: Rc, a: Rc| { - walk_expr(acc, &arg_value(&a), false, &si) - }, - ); - Rc::new(UsageAccum { - bindings: walked.bindings.clone(), - fold_call_nodes: v2_rt::rc_list_push( - walked.fold_call_nodes.clone(), - texpr.clone(), - ), - }) - } - } else { - { - let recv_accum = walk_expr(accum, &recv, false, &si); - mc_args.clone().iter().cloned().fold( - recv_accum, - |acc: Rc, a: Rc| { - walk_expr(acc, &arg_value(&a), false, &si) - }, - ) - } - } - } - ExprData::ExprMatch => { - let scrut = match_scrutinee(texpr.clone()); - let arm_nodes = match_arm_nodes(texpr.clone()); - let s_accum = walk_expr(accum, &scrut, false, &si); - let branch_accums = Rc::new({ - let mut __result = Vec::new(); - for arm_node in arm_nodes.iter().cloned() { - __result.push(walk_expr( - s_accum.clone(), - &arm_body(&arm_node), - in_tail.clone(), - &si, - )); - } - __result - }); - merge_branch_usages(&s_accum, &branch_accums) - } - ExprData::ExprIf => { - let c = if_condition(texpr.clone()); - let t = if_then_branch(texpr.clone()); - let c_accum = walk_expr(accum, &c, false, &si); - let t_accum = walk_expr(c_accum.clone(), &t, in_tail.clone(), &si); - let e_accum = match if_else_branch(texpr.clone()) { - Some(eb) => walk_expr(c_accum.clone(), &eb, in_tail.clone(), &si), - None => c_accum.clone(), - }; - merge_branch_usages(&c_accum, &Rc::new(vec![t_accum, e_accum])) - } - ExprData::ExprLet => { - let v = let_value(texpr.clone()); - let v_accum = walk_expr(accum, &v, false, &si); - match let_body(texpr.clone()) { - Some(b) => walk_expr(v_accum, &b, in_tail.clone(), &si), - None => v_accum, - } - } - ExprData::ExprBlock => { - let ss = texpr.children.clone(); - let ss_count = (ss.clone().len() as i64); - if (ss_count.clone() == 0) { - accum - } else { - { - let init_accum = Rc::new({ - let mut __result = Vec::new(); - for p in Rc::new( - ss.clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - { - if (p.0.clone() < (ss_count.clone() - 1)) { - __result.push(p); - } - } - __result - }) - .iter() - .cloned() - .fold( - accum, - |acc: Rc, p: (i64, Rc)| { - walk_expr(acc, &p.1.clone(), false, &si) - }, - ); - match ss.clone().last().cloned() { - Some(last_expr) => { - walk_expr(init_accum, &last_expr, in_tail.clone(), &si) - } - None => init_accum, - } - } - } - } - ExprData::ExprReturn => texpr - .children - .clone() - .iter() - .cloned() - .fold(accum, |acc: Rc, child: Rc| { - walk_expr(acc, &child, true, &si) - }), - ExprData::ExprLambda => { - let body = lambda_body(texpr.clone()); - let inner = walk_expr(empty_usage_accum(), &body, false, &si); - let binding_merged = Rc::new(v2_rt::map_values(&inner.bindings.clone())) - .iter() - .cloned() - .fold(accum, |acc: Rc, usage: Rc| { - let a1 = record_use( - &acc, - &usage.name.clone(), - EdgeKind::Read, - "lambda-capture".to_string(), - None, - 0, - ); - record_use( - &a1, - &usage.name.clone(), - EdgeKind::Read, - "lambda-capture".to_string(), - None, - 0, - ) - }); - Rc::new(UsageAccum { - bindings: binding_merged.bindings.clone(), - fold_call_nodes: v2_rt::concat( - binding_merged.fold_call_nodes.clone(), - inner.fold_call_nodes.clone(), - ), - }) - } - ExprData::ExprForEach => { - let coll = foreach_collection(texpr.clone()); - let coll_accum = walk_expr(accum, &coll, false, &si); - let body = foreach_body(texpr.clone()); - let inner = walk_expr(empty_usage_accum(), &body, false, &si); - let binding_merged = Rc::new(v2_rt::map_values(&inner.bindings.clone())) - .iter() - .cloned() - .fold( - coll_accum.clone(), - |acc: Rc, usage: Rc| { - let a1 = record_use( - &acc, - &usage.name.clone(), - EdgeKind::Read, - "foreach-capture".to_string(), - None, - 0, - ); - record_use( - &a1, - &usage.name.clone(), - EdgeKind::Read, - "foreach-capture".to_string(), - None, - 0, - ) - }, - ); - Rc::new(UsageAccum { - bindings: binding_merged.bindings.clone(), - fold_call_nodes: v2_rt::concat( - binding_merged.fold_call_nodes.clone(), - inner.fold_call_nodes.clone(), - ), - }) - } - _ => texpr - .children - .clone() - .iter() - .cloned() - .fold(accum, |acc: Rc, child: Rc| { - walk_expr(acc, &child, false, &si) - }), - } + ExprData::ExprVar { binding_kind: bk, .. } => { + let n = expr_var_name_at(texpr.clone(), si.clone()); +if in_tail.clone() { + record_use(&accum, &n, EdgeKind::Consumed, "return".to_string(), bk.clone(), texpr.span.clone().start.clone()) + } else { + record_use(&accum, &n, EdgeKind::Read, "read".to_string(), bk.clone(), texpr.span.clone().start.clone()) + } +}, + ExprData::ExprLiteral { .. } => accum, + ExprData::ExprFieldAccess { .. } => { + let base_node = field_access_base(texpr.clone()); +match (*base_node.expr_data.clone()).clone() { + ExprData::ExprVar { binding_kind: bk, .. } => { + let vn = expr_var_name_at(base_node.clone(), si.clone()); +let f = field_access_field_at(texpr.clone(), si.clone()); +record_use(&accum, &vn, EdgeKind::Projected, v2_rt::concat(".".to_string(), f), bk.clone(), texpr.span.clone().start.clone()) +}, + _ => walk_expr(accum, &base_node, false, &si), +} +}, + ExprData::ExprCall { .. } => { + let fname = expr_call_func_at(texpr.clone(), si.clone()); +if (fname.as_str() == "fold".to_string().as_str()) { + { + let init_arg = Rc::new({ let mut __result = Vec::new(); for a in texpr.children.clone().iter().cloned() { if (authored_name_at(si.clone(), &a).as_str() == "init".to_string().as_str()) { __result.push(a); } } __result }).first().cloned(); +let threaded_accum = match init_arg { + Some(ia) => { + let ia_val = arg_value(&ia); +match (*ia_val.expr_data.clone()).clone() { + ExprData::ExprVar { binding_kind: bk, .. } => { + let vn = expr_var_name_at(ia_val.clone(), si.clone()); +record_use(&accum, &vn, EdgeKind::Threaded, "fold_init".to_string(), bk.clone(), ia_val.span.clone().start.clone()) +}, + _ => walk_expr(accum, &ia_val, false, &si), +} +}, + None => accum, +}; +let non_init = Rc::new({ let mut __result = Vec::new(); for a in texpr.children.clone().iter().cloned() { if (authored_name_at(si.clone(), &a).as_str() != "init".to_string().as_str()) { __result.push(a); } } __result }); +non_init.iter().cloned().fold(threaded_accum.clone(), |acc: Rc, a: Rc| walk_expr(acc, &arg_value(&a), false, &si)) +} + } else { + texpr.children.clone().iter().cloned().fold(accum, |acc: Rc, a: Rc| walk_expr(acc, &arg_value(&a), false, &si)) + } +}, + ExprData::ExprMethodCall { .. } => { + let recv = method_receiver(texpr.clone()); +let mc_args = method_arg_nodes(texpr.clone()); +let mname = expr_method_name_at(texpr.clone(), si.clone()); +if (mname.as_str() == "fold".to_string().as_str()) { + { + let recv_accum = walk_expr(accum, &recv, false, &si); +let init_arg = Rc::new({ let mut __result = Vec::new(); for a in mc_args.clone().iter().cloned() { if (authored_name_at(si.clone(), &a).as_str() == "init".to_string().as_str()) { __result.push(a); } } __result }).first().cloned(); +let threaded_accum = match init_arg { + Some(ia) => { + let ia_val = arg_value(&ia); +match (*ia_val.expr_data.clone()).clone() { + ExprData::ExprVar { binding_kind: bk, .. } => { + let vn = expr_var_name_at(ia_val.clone(), si.clone()); +record_use(&recv_accum, &vn, EdgeKind::Threaded, "fold_init".to_string(), bk.clone(), ia_val.span.clone().start.clone()) +}, + _ => walk_expr(recv_accum, &ia_val, false, &si), +} +}, + None => recv_accum, +}; +let non_init = Rc::new({ let mut __result = Vec::new(); for a in mc_args.clone().iter().cloned() { if (authored_name_at(si.clone(), &a).as_str() != "init".to_string().as_str()) { __result.push(a); } } __result }); +let walked = non_init.iter().cloned().fold(threaded_accum.clone(), |acc: Rc, a: Rc| walk_expr(acc, &arg_value(&a), false, &si)); +Rc::new(UsageAccum { + bindings: walked.bindings.clone(), + fold_call_nodes: v2_rt::rc_list_push(walked.fold_call_nodes.clone(), texpr.clone()), +}) +} + } else { + { + let recv_accum = walk_expr(accum, &recv, false, &si); +mc_args.clone().iter().cloned().fold(recv_accum, |acc: Rc, a: Rc| walk_expr(acc, &arg_value(&a), false, &si)) +} + } +}, + ExprData::ExprMatch => { + let scrut = match_scrutinee(texpr.clone()); +let arm_nodes = match_arm_nodes(texpr.clone()); +let s_accum = walk_expr(accum, &scrut, false, &si); +let branch_accums = Rc::new({ let mut __result = Vec::new(); for arm_node in arm_nodes.iter().cloned() { __result.push(walk_expr(s_accum.clone(), &arm_body(&arm_node), in_tail.clone(), &si)); } __result }); +merge_branch_usages(&s_accum, &branch_accums) +}, + ExprData::ExprIf => { + let c = if_condition(texpr.clone()); +let t = if_then_branch(texpr.clone()); +let c_accum = walk_expr(accum, &c, false, &si); +let t_accum = walk_expr(c_accum.clone(), &t, in_tail.clone(), &si); +let e_accum = match if_else_branch(texpr.clone()) { + Some(eb) => walk_expr(c_accum.clone(), &eb, in_tail.clone(), &si), + None => c_accum.clone(), +}; +merge_branch_usages(&c_accum, &Rc::new(vec![t_accum, e_accum])) +}, + ExprData::ExprLet => { + let v = let_value(texpr.clone()); +let v_accum = walk_expr(accum, &v, false, &si); +match let_body(texpr.clone()) { + Some(b) => walk_expr(v_accum, &b, in_tail.clone(), &si), + None => v_accum, +} +}, + ExprData::ExprBlock => { + let ss = texpr.children.clone(); +let ss_count = (ss.clone().len() as i64); +if (ss_count.clone() == 0) { + accum + } else { + { + let init_accum = Rc::new({ let mut __result = Vec::new(); for p in Rc::new(ss.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { if (p.0.clone() < (ss_count.clone() - 1)) { __result.push(p); } } __result }).iter().cloned().fold(accum, |acc: Rc, p: (i64, Rc)| walk_expr(acc, &p.1.clone(), false, &si)); +match ss.clone().last().cloned() { + Some(last_expr) => walk_expr(init_accum, &last_expr, in_tail.clone(), &si), + None => init_accum, +} +} + } +}, + ExprData::ExprReturn => texpr.children.clone().iter().cloned().fold(accum, |acc: Rc, child: Rc| walk_expr(acc, &child, true, &si)), + ExprData::ExprLambda => { + let body = lambda_body(texpr.clone()); +let inner = walk_expr(empty_usage_accum(), &body, false, &si); +let binding_merged = Rc::new(v2_rt::map_values(&inner.bindings.clone())).iter().cloned().fold(accum, |acc: Rc, usage: Rc| { + let a1 = record_use(&acc, &usage.name.clone(), EdgeKind::Read, "lambda-capture".to_string(), None, 0); +record_use(&a1, &usage.name.clone(), EdgeKind::Read, "lambda-capture".to_string(), None, 0) +}); +Rc::new(UsageAccum { + bindings: binding_merged.bindings.clone(), + fold_call_nodes: v2_rt::concat(binding_merged.fold_call_nodes.clone(), inner.fold_call_nodes.clone()), +}) +}, + ExprData::ExprForEach => { + let coll = foreach_collection(texpr.clone()); +let coll_accum = walk_expr(accum, &coll, false, &si); +let body = foreach_body(texpr.clone()); +let inner = walk_expr(empty_usage_accum(), &body, false, &si); +let binding_merged = Rc::new(v2_rt::map_values(&inner.bindings.clone())).iter().cloned().fold(coll_accum.clone(), |acc: Rc, usage: Rc| { + let a1 = record_use(&acc, &usage.name.clone(), EdgeKind::Read, "foreach-capture".to_string(), None, 0); +record_use(&a1, &usage.name.clone(), EdgeKind::Read, "foreach-capture".to_string(), None, 0) +}); +Rc::new(UsageAccum { + bindings: binding_merged.bindings.clone(), + fold_call_nodes: v2_rt::concat(binding_merged.fold_call_nodes.clone(), inner.fold_call_nodes.clone()), +}) +}, + _ => texpr.children.clone().iter().cloned().fold(accum, |acc: Rc, child: Rc| walk_expr(acc, &child, false, &si)), +} }) } pub fn make_decision(usage: &Rc) -> Rc { { let sc = semantic_consumer_count(usage.clone()); - if (sc.clone() == 1) { +if (sc.clone() == 1) { { - let consumed_sites = Rc::new({ - let mut __result = Vec::new(); - for c in usage.consumers.clone().iter().cloned() { - if match c.kind.clone() { - EdgeKind::Consumed => true, - _ => false, - } { - __result.push(c); - } - } - __result - }); - let site = match consumed_sites.first().cloned() { - Some(c) => c.site.clone(), - None => "unknown".to_string(), - }; - Rc::new(OwnershipDecision::SoleOwner { - binding: usage.name.clone(), - site: site, - }) - } + let consumed_sites = Rc::new({ let mut __result = Vec::new(); for c in usage.consumers.clone().iter().cloned() { if match c.kind.clone() { + EdgeKind::Consumed => true, + _ => false, +} { __result.push(c); } } __result }); +let site = match consumed_sites.first().cloned() { + Some(c) => c.site.clone(), + None => "unknown".to_string(), +}; +Rc::new(OwnershipDecision::SoleOwner { + binding: usage.name.clone(), + site: site, +}) +} } else { if (sc.clone() > 1) { { - let sites = Rc::new({ - let mut __result = Vec::new(); - for c in Rc::new({ - let mut __result = Vec::new(); - for c in usage.consumers.clone().iter().cloned() { - if match c.kind.clone() { - EdgeKind::Consumed => true, - _ => false, - } { - __result.push(c); - } - } - __result - }) - .iter() - .cloned() - { - __result.push(c.site.clone()); - } - __result - }); - Rc::new(OwnershipDecision::SharedError { - binding: usage.name.clone(), - consumer_count: sc.clone(), - sites: sites, - }) - } + let sites = Rc::new({ let mut __result = Vec::new(); for c in Rc::new({ let mut __result = Vec::new(); for c in usage.consumers.clone().iter().cloned() { if match c.kind.clone() { + EdgeKind::Consumed => true, + _ => false, +} { __result.push(c); } } __result }).iter().cloned() { __result.push(c.site.clone()); } __result }); +Rc::new(OwnershipDecision::SharedError { + binding: usage.name.clone(), + consumer_count: sc.clone(), + sites: sites, +}) +} } else { Rc::new(OwnershipDecision::Unclassified { - binding: usage.name.clone(), - reason: "no consumers found".to_string(), - }) + binding: usage.name.clone(), + reason: "no consumers found".to_string(), +}) } } - } +} } pub fn is_owned_local(kind: Option>) -> bool { match kind.as_deref().cloned() { - Some(VarBindingKind::LocalValueBinding) => true, - _ => false, - } + Some(VarBindingKind::LocalValueBinding) => true, + _ => false, +} } pub fn build_movable_set(proof: Rc) -> Rc> { - Rc::new({ - let mut __result = Vec::new(); - for usage in Rc::new(v2_rt::map_values(&proof.bindings.clone())) - .iter() - .cloned() - { - if ((binding_fan_out(usage.clone()) == 1) && is_owned_local(usage.binding_kind.clone())) - { - __result.push(usage); - } - } - __result - }) - .iter() - .cloned() - .fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, usage: Rc| { - v2_rt::rc_map_insert(acc, usage.name.clone(), true) - }, - ) + Rc::new({ let mut __result = Vec::new(); for usage in Rc::new(v2_rt::map_values(&proof.bindings.clone())).iter().cloned() { if ((binding_fan_out(usage.clone()) == 1) && is_owned_local(usage.binding_kind.clone())) { __result.push(usage); } } __result }).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, usage: Rc| v2_rt::rc_map_insert(acc, usage.name.clone(), true)) } -pub fn build_read_only_params( - proof: Rc, - param_names: Rc>, -) -> Rc> { - Rc::new({ - let mut __result = Vec::new(); - for usage in Rc::new(v2_rt::map_values(&proof.bindings.clone())) - .iter() - .cloned() - { - if (((v2_rt::map_contains_key(¶m_names, usage.name.clone()) - && is_owned_local(usage.binding_kind.clone())) - && (binding_fan_out(usage.clone()) > 1)) - && { - let mut __all = true; - for c in usage.consumers.clone().iter().cloned() { - if !(match c.kind.clone() { - EdgeKind::Read => true, - EdgeKind::Projected => true, - EdgeKind::Threaded => true, - _ => false, - }) { - __all = false; - break; - } - } - __all - }) - { - __result.push(usage); - } - } - __result - }) - .iter() - .cloned() - .fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, usage: Rc| { - v2_rt::rc_map_insert(acc, usage.name.clone(), true) - }, - ) +pub fn build_read_only_params(proof: Rc, param_names: Rc>) -> Rc> { + Rc::new({ let mut __result = Vec::new(); for usage in Rc::new(v2_rt::map_values(&proof.bindings.clone())).iter().cloned() { if (((v2_rt::map_contains_key(¶m_names, usage.name.clone()) && is_owned_local(usage.binding_kind.clone())) && (binding_fan_out(usage.clone()) > 1)) && { let mut __all = true; for c in usage.consumers.clone().iter().cloned() { if !(match c.kind.clone() { + EdgeKind::Read => true, + EdgeKind::Projected => true, + EdgeKind::Threaded => true, + _ => false, +}) { __all = false; break; } } __all }) { __result.push(usage); } } __result }).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, usage: Rc| v2_rt::rc_map_insert(acc, usage.name.clone(), true)) } -pub fn collect_callable_refs( - texpr: &Rc, - si: &Rc>>, -) -> Rc> { +pub fn collect_callable_refs(texpr: &Rc, si: &Rc>>) -> Rc> { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*texpr.expr_data.clone()).clone() { - ExprData::ExprVar { - binding_kind: bk, .. - } => match bk.clone().as_deref().cloned() { - Some(VarBindingKind::FunctionValueBinding) => { - let n = expr_var_name_at(texpr.clone(), si.clone()); - v2_rt::rc_map_insert(v2_rt::rc_empty_map::(), n, true) - } - _ => v2_rt::rc_empty_map::(), - }, - ExprData::ExprLiteral { .. } => v2_rt::rc_empty_map::(), - ExprData::ExprFieldAccess { .. } => { - collect_callable_refs(&field_access_base(texpr.clone()), &si) - } - ExprData::ExprCall { .. } => texpr.children.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, a: Rc| { - v2_rt::rc_map_merge(acc, collect_callable_refs(&arg_value(&a), &si)) - }, - ), - ExprData::ExprMethodCall { .. } => { - let recv = collect_callable_refs(&method_receiver(texpr.clone()), &si); - method_arg_nodes(texpr.clone()).iter().cloned().fold( - recv.clone(), - |acc: Rc>, a: Rc| { - v2_rt::rc_map_merge(acc, collect_callable_refs(&arg_value(&a), &si)) - }, - ) - } - ExprData::ExprIf => { - let cond = collect_callable_refs(&if_condition(texpr.clone()), &si); - let then_br = collect_callable_refs(&if_then_branch(texpr.clone()), &si); - let else_br = match if_else_branch(texpr.clone()) { - Some(eb) => collect_callable_refs(&eb, &si), - None => v2_rt::rc_empty_map::(), - }; - v2_rt::rc_map_merge(v2_rt::rc_map_merge(cond, then_br), else_br) - } - ExprData::ExprMatch => { - let scrut = collect_callable_refs(&match_scrutinee(texpr.clone()), &si); - match_arm_nodes(texpr.clone()).iter().cloned().fold( - scrut.clone(), - |acc: Rc>, arm: Rc| { - v2_rt::rc_map_merge(acc, collect_callable_refs(&arm_body(&arm), &si)) - }, - ) - } - ExprData::ExprLet => { - let val = collect_callable_refs(&let_value(texpr.clone()), &si); - match let_body(texpr.clone()) { - Some(lb) => v2_rt::rc_map_merge(val, collect_callable_refs(&lb, &si)), - None => val, - } - } - ExprData::ExprBlock => texpr.children.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, child: Rc| { - v2_rt::rc_map_merge(acc, collect_callable_refs(&child, &si)) - }, - ), - ExprData::ExprReturn => match texpr.children.clone().first().cloned() { - Some(child) => collect_callable_refs(&child, &si), - None => v2_rt::rc_empty_map::(), - }, - ExprData::ExprLambda => collect_callable_refs(&lambda_body(texpr.clone()), &si), - ExprData::ExprForEach => { - let col = collect_callable_refs(&foreach_collection(texpr.clone()), &si); - v2_rt::rc_map_merge( - col, - collect_callable_refs(&foreach_body(texpr.clone()), &si), - ) - } - ExprData::ExprRecordLit { .. } => texpr.children.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, field: Rc| { - v2_rt::rc_map_merge(acc, collect_callable_refs(&arg_value(&field), &si)) - }, - ), - _ => v2_rt::rc_empty_map::(), - } + ExprData::ExprVar { binding_kind: bk, .. } => match bk.clone().as_deref().cloned() { + Some(VarBindingKind::FunctionValueBinding) => { + let n = expr_var_name_at(texpr.clone(), si.clone()); +v2_rt::rc_map_insert(v2_rt::rc_empty_map::(), n, true) +}, + _ => v2_rt::rc_empty_map::(), +}, + ExprData::ExprLiteral { .. } => v2_rt::rc_empty_map::(), + ExprData::ExprFieldAccess { .. } => collect_callable_refs(&field_access_base(texpr.clone()), &si), + ExprData::ExprCall { .. } => texpr.children.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, a: Rc| v2_rt::rc_map_merge(acc, collect_callable_refs(&arg_value(&a), &si))), + ExprData::ExprMethodCall { .. } => { + let recv = collect_callable_refs(&method_receiver(texpr.clone()), &si); +method_arg_nodes(texpr.clone()).iter().cloned().fold(recv.clone(), |acc: Rc>, a: Rc| v2_rt::rc_map_merge(acc, collect_callable_refs(&arg_value(&a), &si))) +}, + ExprData::ExprIf => { + let cond = collect_callable_refs(&if_condition(texpr.clone()), &si); +let then_br = collect_callable_refs(&if_then_branch(texpr.clone()), &si); +let else_br = match if_else_branch(texpr.clone()) { + Some(eb) => collect_callable_refs(&eb, &si), + None => v2_rt::rc_empty_map::(), +}; +v2_rt::rc_map_merge(v2_rt::rc_map_merge(cond, then_br), else_br) +}, + ExprData::ExprMatch => { + let scrut = collect_callable_refs(&match_scrutinee(texpr.clone()), &si); +match_arm_nodes(texpr.clone()).iter().cloned().fold(scrut.clone(), |acc: Rc>, arm: Rc| v2_rt::rc_map_merge(acc, collect_callable_refs(&arm_body(&arm), &si))) +}, + ExprData::ExprLet => { + let val = collect_callable_refs(&let_value(texpr.clone()), &si); +match let_body(texpr.clone()) { + Some(lb) => v2_rt::rc_map_merge(val, collect_callable_refs(&lb, &si)), + None => val, +} +}, + ExprData::ExprBlock => texpr.children.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, child: Rc| v2_rt::rc_map_merge(acc, collect_callable_refs(&child, &si))), + ExprData::ExprReturn => match texpr.children.clone().first().cloned() { + Some(child) => collect_callable_refs(&child, &si), + None => v2_rt::rc_empty_map::(), +}, + ExprData::ExprLambda => collect_callable_refs(&lambda_body(texpr.clone()), &si), + ExprData::ExprForEach => { + let col = collect_callable_refs(&foreach_collection(texpr.clone()), &si); +v2_rt::rc_map_merge(col, collect_callable_refs(&foreach_body(texpr.clone()), &si)) +}, + ExprData::ExprRecordLit { .. } => texpr.children.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, field: Rc| v2_rt::rc_map_merge(acc, collect_callable_refs(&arg_value(&field), &si))), + _ => v2_rt::rc_empty_map::(), +} }) } pub fn fold_terminal_expr(mut body: Rc) -> Rc { loop { match (*body.expr_data.clone()).clone() { - ExprData::ExprLet => match let_body(body.clone()) { - Some(inner) => { - let __tco_0 = inner.clone(); - body = __tco_0; - continue; - } - None => { - break body.clone(); - } - }, - ExprData::ExprBlock => match body.children.clone().last().cloned() { - Some(last_child) => { - let __tco_0 = last_child.clone(); - body = __tco_0; - continue; - } - None => { - break body.clone(); - } - }, - _ => { - break body.clone(); - } - } - } + ExprData::ExprLet => { match let_body(body.clone()) { + Some(inner) => { { + let __tco_0 = inner.clone(); +body = __tco_0; +continue; +} }, + None => { break body.clone(); }, +} }, + ExprData::ExprBlock => { match body.children.clone().last().cloned() { + Some(last_child) => { { + let __tco_0 = last_child.clone(); +body = __tco_0; +continue; +} }, + None => { break body.clone(); }, +} }, + _ => { break body.clone(); }, +} +} } pub fn empty_fold_acc_use_summary() -> Rc { Rc::new(FoldAccUseSummary { - whole_acc_uses: 0, - field_moves: Rc::new(vec![]), - nested_acc_refs: false, - }) + whole_acc_uses: 0, + field_moves: Rc::new(vec![]), + nested_acc_refs: false, +}) } -pub fn merge_fold_acc_use_summaries( - left: &Rc, - right: &Rc, -) -> Rc { +pub fn merge_fold_acc_use_summaries(left: &Rc, right: &Rc) -> Rc { Rc::new(FoldAccUseSummary { - whole_acc_uses: (left.whole_acc_uses.clone() + right.whole_acc_uses.clone()), - field_moves: v2_rt::concat(left.field_moves.clone(), right.field_moves.clone()), - nested_acc_refs: (left.nested_acc_refs.clone() || right.nested_acc_refs.clone()), - }) + whole_acc_uses: (left.whole_acc_uses.clone() + right.whole_acc_uses.clone()), + field_moves: v2_rt::concat(left.field_moves.clone(), right.field_moves.clone()), + nested_acc_refs: (left.nested_acc_refs.clone() || right.nested_acc_refs.clone()), +}) } -pub fn summarize_fold_acc_uses( - node: &Rc, - acc_name: &String, - si: &Rc>>, - inside_nested: bool, -) -> Rc { +pub fn summarize_fold_acc_uses(node: &Rc, acc_name: &String, si: &Rc>>, inside_nested: bool) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*node.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - if (expr_var_name_at(node.clone(), si.clone()).as_str() - == acc_name.clone().as_str()) - { - if inside_nested.clone() { - Rc::new(FoldAccUseSummary { - whole_acc_uses: 0, - field_moves: Rc::new(vec![]), - nested_acc_refs: true, - }) - } else { - Rc::new(FoldAccUseSummary { - whole_acc_uses: 1, - field_moves: Rc::new(vec![]), - nested_acc_refs: false, - }) - } - } else { - empty_fold_acc_use_summary() - } - } - ExprData::ExprFieldAccess { .. } => { - let base = field_access_base(node.clone()); - let is_direct = match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - (expr_var_name_at(base.clone(), si.clone()).as_str() - == acc_name.clone().as_str()) - } - _ => false, - }; - if is_direct { - if inside_nested.clone() { - Rc::new(FoldAccUseSummary { - whole_acc_uses: 0, - field_moves: Rc::new(vec![]), - nested_acc_refs: true, - }) - } else { - Rc::new(FoldAccUseSummary { - whole_acc_uses: 0, - field_moves: Rc::new(vec![field_access_field_at( - node.clone(), - si.clone(), - )]), - nested_acc_refs: false, - }) - } - } else { - node.children.clone().iter().cloned().fold( - empty_fold_acc_use_summary(), - |acc: Rc, child: Rc| { - merge_fold_acc_use_summaries( - &acc, - &summarize_fold_acc_uses( - &child, - &acc_name, - &si, - inside_nested.clone(), - ), - ) - }, - ) - } + ExprData::ExprVar { .. } => if (expr_var_name_at(node.clone(), si.clone()).as_str() == acc_name.clone().as_str()) { + if inside_nested.clone() { + Rc::new(FoldAccUseSummary { + whole_acc_uses: 0, + field_moves: Rc::new(vec![]), + nested_acc_refs: true, +}) + } else { + Rc::new(FoldAccUseSummary { + whole_acc_uses: 1, + field_moves: Rc::new(vec![]), + nested_acc_refs: false, +}) } - ExprData::ExprLambda => { - let body_summary = - summarize_fold_acc_uses(&lambda_body(node.clone()), &acc_name, &si, true); - if (((body_summary.whole_acc_uses.clone() > 0) - || ((body_summary.field_moves.clone().len() as i64) > 0)) - || body_summary.nested_acc_refs.clone()) - { + } else { + empty_fold_acc_use_summary() + }, + ExprData::ExprFieldAccess { .. } => { + let base = field_access_base(node.clone()); +let is_direct = match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => (expr_var_name_at(base.clone(), si.clone()).as_str() == acc_name.clone().as_str()), + _ => false, +}; +if is_direct { + if inside_nested.clone() { Rc::new(FoldAccUseSummary { - whole_acc_uses: 0, - field_moves: Rc::new(vec![]), - nested_acc_refs: true, - }) + whole_acc_uses: 0, + field_moves: Rc::new(vec![]), + nested_acc_refs: true, +}) } else { - empty_fold_acc_use_summary() - } - } - ExprData::ExprForEach => { - let coll_summary = summarize_fold_acc_uses( - &foreach_collection(node.clone()), - &acc_name, - &si, - inside_nested.clone(), - ); - let body_summary = - summarize_fold_acc_uses(&foreach_body(node.clone()), &acc_name, &si, true); - let nested_summary = if (((body_summary.whole_acc_uses.clone() > 0) - || ((body_summary.field_moves.clone().len() as i64) > 0)) - || body_summary.nested_acc_refs.clone()) - { Rc::new(FoldAccUseSummary { - whole_acc_uses: 0, - field_moves: Rc::new(vec![]), - nested_acc_refs: true, - }) - } else { - empty_fold_acc_use_summary() - }; - merge_fold_acc_use_summaries(&coll_summary, &nested_summary) - } - _ => node.children.clone().iter().cloned().fold( - empty_fold_acc_use_summary(), - |acc: Rc, child: Rc| { - merge_fold_acc_use_summaries( - &acc, - &summarize_fold_acc_uses(&child, &acc_name, &si, inside_nested.clone()), - ) - }, - ), - } + whole_acc_uses: 0, + field_moves: Rc::new(vec![field_access_field_at(node.clone(), si.clone())]), + nested_acc_refs: false, +}) + } + } else { + node.children.clone().iter().cloned().fold(empty_fold_acc_use_summary(), |acc: Rc, child: Rc| merge_fold_acc_use_summaries(&acc, &summarize_fold_acc_uses(&child, &acc_name, &si, inside_nested.clone()))) + } +}, + ExprData::ExprLambda => { + let body_summary = summarize_fold_acc_uses(&lambda_body(node.clone()), &acc_name, &si, true); +if (((body_summary.whole_acc_uses.clone() > 0) || ((body_summary.field_moves.clone().len() as i64) > 0)) || body_summary.nested_acc_refs.clone()) { + Rc::new(FoldAccUseSummary { + whole_acc_uses: 0, + field_moves: Rc::new(vec![]), + nested_acc_refs: true, +}) + } else { + empty_fold_acc_use_summary() + } +}, + ExprData::ExprForEach => { + let coll_summary = summarize_fold_acc_uses(&foreach_collection(node.clone()), &acc_name, &si, inside_nested.clone()); +let body_summary = summarize_fold_acc_uses(&foreach_body(node.clone()), &acc_name, &si, true); +let nested_summary = if (((body_summary.whole_acc_uses.clone() > 0) || ((body_summary.field_moves.clone().len() as i64) > 0)) || body_summary.nested_acc_refs.clone()) { + Rc::new(FoldAccUseSummary { + whole_acc_uses: 0, + field_moves: Rc::new(vec![]), + nested_acc_refs: true, +}) + } else { + empty_fold_acc_use_summary() + }; +merge_fold_acc_use_summaries(&coll_summary, &nested_summary) +}, + _ => node.children.clone().iter().cloned().fold(empty_fold_acc_use_summary(), |acc: Rc, child: Rc| merge_fold_acc_use_summaries(&acc, &summarize_fold_acc_uses(&child, &acc_name, &si, inside_nested.clone()))), +} }) } -pub fn fold_lambda_acc_use_summary( - lambda_node: &Rc, - acc_name: String, - si: Rc>>, -) -> Rc { +pub fn fold_lambda_acc_use_summary(lambda_node: &Rc, acc_name: String, si: Rc>>) -> Rc { match (*lambda_node.expr_data.clone()).clone() { - ExprData::ExprLambda => { - summarize_fold_acc_uses(&lambda_body(lambda_node.clone()), &acc_name, &si, false) - } - _ => empty_fold_acc_use_summary(), - } + ExprData::ExprLambda => summarize_fold_acc_uses(&lambda_body(lambda_node.clone()), &acc_name, &si, false), + _ => empty_fold_acc_use_summary(), +} } -pub fn fold_body_constructs_acc_struct( - lambda_node: &Rc, - acc_type_name: String, - si: Rc>>, -) -> bool { +pub fn fold_body_constructs_acc_struct(lambda_node: &Rc, acc_type_name: String, si: Rc>>) -> bool { match (*lambda_node.expr_data.clone()).clone() { - ExprData::ExprLambda => { - let body = lambda_body(lambda_node.clone()); - let terminal = fold_terminal_expr(body); - match (*terminal.expr_data.clone()).clone() { - ExprData::ExprRecordLit { .. } => { - (authored_name_at(si, &terminal).as_str() == acc_type_name.as_str()) - } - _ => false, - } - } - _ => false, - } + ExprData::ExprLambda => { + let body = lambda_body(lambda_node.clone()); +let terminal = fold_terminal_expr(body); +match (*terminal.expr_data.clone()).clone() { + ExprData::ExprRecordLit { .. } => (authored_name_at(si, &terminal).as_str() == acc_type_name.as_str()), + _ => false, +} +}, + _ => false, +} } -pub fn fold_body_safe_field_moves( - lambda_node: Rc, - acc_name: String, - si: Rc>>, -) -> bool { +pub fn fold_body_safe_field_moves(lambda_node: Rc, acc_name: String, si: Rc>>) -> bool { { let summary = fold_lambda_acc_use_summary(&lambda_node, acc_name, si); - let deduped = summary.field_moves.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |seen: Rc>, field: String| { - v2_rt::rc_map_insert(seen, field.clone(), true) - }, - ); - ((!summary.nested_acc_refs.clone() && (summary.whole_acc_uses.clone() == 0)) - && ((Rc::new(v2_rt::map_keys(&deduped)).len() as i64) - == (summary.field_moves.clone().len() as i64))) - } +let deduped = summary.field_moves.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |seen: Rc>, field: String| v2_rt::rc_map_insert(seen, field.clone(), true)); +((!summary.nested_acc_refs.clone() && (summary.whole_acc_uses.clone() == 0)) && ((Rc::new(v2_rt::map_keys(&deduped)).len() as i64) == (summary.field_moves.clone().len() as i64))) +} } -pub fn fold_body_consumes_acc_once( - lambda_node: Rc, - acc_name: String, - si: Rc>>, -) -> bool { +pub fn fold_body_consumes_acc_once(lambda_node: Rc, acc_name: String, si: Rc>>) -> bool { { let summary = fold_lambda_acc_use_summary(&lambda_node, acc_name, si); - ((!summary.nested_acc_refs.clone() && (summary.whole_acc_uses.clone() == 1)) - && ((summary.field_moves.clone().len() as i64) == 0)) - } +((!summary.nested_acc_refs.clone() && (summary.whole_acc_uses.clone() == 1)) && ((summary.field_moves.clone().len() as i64) == 0)) +} } -pub fn analyze_single_fold( - method_call: &Rc, - si: &Rc>>, -) -> Rc { +pub fn analyze_single_fold(method_call: &Rc, si: &Rc>>) -> Rc { { let args = method_arg_nodes(method_call.clone()); - let init_arg_node = match args.clone().first().cloned() { - Some(a) => arg_value(&a), - None => method_call.clone(), - }; - let fold_lambda_node = match args.clone().get(1 as usize).cloned() { - Some(a) => arg_value(&a), - None => method_call.clone(), - }; - let acc_param_name = match (*fold_lambda_node.expr_data.clone()).clone() { - ExprData::ExprLambda => { - match lambda_param_names_at(fold_lambda_node.clone(), si.clone()) - .first() - .cloned() - { - Some(n) => n.clone(), - None => "".to_string(), - } - } - _ => "".to_string(), - }; - let acc_type_name = match init_arg_node.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { - node: type_node, .. - }) => authored_name_at(si.clone(), &type_node), - _ => "".to_string(), - }; - let cond_required = match init_arg_node.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { - node: type_node, .. - }) => (type_node.return_cardinality.clone() == Cardinality::Required), - _ => false, - }; - let cond_struct = - fold_body_constructs_acc_struct(&fold_lambda_node, acc_type_name.clone(), si.clone()); - let cond_whole_acc = fold_body_consumes_acc_once( - fold_lambda_node.clone(), - acc_param_name.clone(), - si.clone(), - ); - let cond_safe = fold_body_safe_field_moves( - fold_lambda_node.clone(), - acc_param_name.clone(), - si.clone(), - ); - let eligible = ((cond_required - && (acc_type_name.clone().as_str() != "".to_string().as_str())) - && ((cond_struct.clone() && cond_safe.clone()) || cond_whole_acc.clone())); - Rc::new(FoldAccUnwrapProof { - site_key: (method_call.span.clone().start.clone()).to_string(), - acc_param_name: acc_param_name.clone(), - acc_type_name: acc_type_name.clone(), - body_constructs_acc: cond_struct.clone(), - whole_acc_single_use: cond_whole_acc.clone(), - safe_field_moves: cond_safe.clone(), - eligible: eligible, - }) - } -} - -pub fn analyze_ownership( - func_name: String, - params: Rc>>, - body: Rc, - si: &Rc>>, -) -> Rc { +let init_arg_node = match args.clone().first().cloned() { + Some(a) => arg_value(&a), + None => method_call.clone(), +}; +let fold_lambda_node = match args.clone().get(1 as usize).cloned() { + Some(a) => arg_value(&a), + None => method_call.clone(), +}; +let acc_param_name = match (*fold_lambda_node.expr_data.clone()).clone() { + ExprData::ExprLambda => match lambda_param_names_at(fold_lambda_node.clone(), si.clone()).first().cloned() { + Some(n) => n.clone(), + None => "".to_string(), +}, + _ => "".to_string(), +}; +let acc_type_name = match init_arg_node.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: type_node, .. }) => authored_name_at(si.clone(), &type_node), + _ => "".to_string(), +}; +let cond_required = match init_arg_node.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: type_node, .. }) => (type_node.return_cardinality.clone() == Cardinality::Required), + _ => false, +}; +let cond_struct = fold_body_constructs_acc_struct(&fold_lambda_node, acc_type_name.clone(), si.clone()); +let cond_whole_acc = fold_body_consumes_acc_once(fold_lambda_node.clone(), acc_param_name.clone(), si.clone()); +let cond_safe = fold_body_safe_field_moves(fold_lambda_node.clone(), acc_param_name.clone(), si.clone()); +let eligible = ((cond_required && (acc_type_name.clone().as_str() != "".to_string().as_str())) && ((cond_struct.clone() && cond_safe.clone()) || cond_whole_acc.clone())); +Rc::new(FoldAccUnwrapProof { + site_key: (method_call.span.clone().start.clone()).to_string(), + acc_param_name: acc_param_name.clone(), + acc_type_name: acc_type_name.clone(), + body_constructs_acc: cond_struct.clone(), + whole_acc_single_use: cond_whole_acc.clone(), + safe_field_moves: cond_safe.clone(), + eligible: eligible, +}) +} +} + +pub fn analyze_ownership(func_name: String, params: Rc>>, body: Rc, si: &Rc>>) -> Rc { { - let initial = - params - .iter() - .cloned() - .fold(empty_usage_accum(), |acc: Rc, p: Rc| { - let acc = Rc::try_unwrap(acc).unwrap_or_else(|rc| (*rc).clone()); - { - let p_name = authored_name_at(si.clone(), &p); - Rc::new(UsageAccum { - bindings: v2_rt::rc_map_insert( - acc.bindings, - p_name.clone(), - Rc::new(BindingUsage { - name: p_name.clone(), - binding_kind: None, - consumers: Rc::new(vec![]), - }), - ), - fold_call_nodes: acc.fold_call_nodes, - }) - } - }); - let result = walk_expr(initial, &body, true, &si); - let binding_list = Rc::new(v2_rt::map_values(&result.bindings.clone())); - let decisions = Rc::new({ - let mut __result = Vec::new(); - for usage in binding_list.iter().cloned() { - __result.push(make_decision(&usage)); - } - __result - }); - let fold_proofs = Rc::new({ - let mut __result = Vec::new(); - for n in result.fold_call_nodes.clone().iter().cloned() { - __result.push(analyze_single_fold(&n, &si)); - } - __result - }); - Rc::new(OwnershipProof { - func_name: func_name, - bindings: result.bindings.clone(), - decisions: decisions, - fold_acc_unwrap: fold_proofs, - }) - } + let initial = params.iter().cloned().fold(empty_usage_accum(), |acc: Rc, p: Rc| { let acc = Rc::try_unwrap(acc).unwrap_or_else(|rc| (*rc).clone()); { + let p_name = authored_name_at(si.clone(), &p); +Rc::new(UsageAccum { + bindings: v2_rt::rc_map_insert(acc.bindings, p_name.clone(), Rc::new(BindingUsage { + name: p_name.clone(), + binding_kind: None, + consumers: Rc::new(vec![]), +})), + fold_call_nodes: acc.fold_call_nodes, +}) +} }); +let result = walk_expr(initial, &body, true, &si); +let binding_list = Rc::new(v2_rt::map_values(&result.bindings.clone())); +let decisions = Rc::new({ let mut __result = Vec::new(); for usage in binding_list.iter().cloned() { __result.push(make_decision(&usage)); } __result }); +let fold_proofs = Rc::new({ let mut __result = Vec::new(); for n in result.fold_call_nodes.clone().iter().cloned() { __result.push(analyze_single_fold(&n, &si)); } __result }); +Rc::new(OwnershipProof { + func_name: func_name, + bindings: result.bindings.clone(), + decisions: decisions, + fold_acc_unwrap: fold_proofs, +}) +} } diff --git a/src/v2/stage0/src/v2_compiler_parse.rs b/src/v2/stage0/src/v2_compiler_parse.rs index fc895df9842..6b3c9cbe2b5 100644 --- a/src/v2/stage0/src/v2_compiler_parse.rs +++ b/src/v2/stage0/src/v2_compiler_parse.rs @@ -1,68 +1,35 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.parse +use std::collections::HashMap; +use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::v2_std_core::{module_node, import_node, Node, InferredNode, Connective, is_container_type, Cardinality, make_param_node, param_node_type_expr, param_node_default_value, make_field_node, field_node_name_at, field_node_type_expr, field_node_cardinality, field_node_default_value, field_node_from_key, make_variant_node, variant_node_name_at, variant_node_fields, leaf_node_with_span, ExprData, make_expr_node, make_named_expr_node, make_expr_error_node, expr_var_name_at, field_access_field_at, expr_call_func_at, make_arg_node, arg_name_at, arg_value, make_arm_node, make_field_init_node, make_resource_use_node, make_text_part_node, make_interp_part_node, MatchPattern, make_field_binding_node, field_binding_pattern, LiteralValue, ExprErrorKind, BinOp, UnaryOpKind, StringPart, local_transport_node, rest_transport_node, shell_transport_node, file_transport_node, transport_url_key, transport_path_key, transport_method_key, transport_path_template_key, transport_query_key, transport_body_key, transport_stdin_key, transport_response_format_key, transport_headers_key, service_config_properties, OperationModifier, Token, TokenShape, SourceSpan, make_span, ErrorNode, make_error_node, with_required_cardinality, error_type, is_compiler_error, node_name_span, no_span, NewlineIndex, authored_name_at, InternTable, InternResult, empty_intern_table, intern, pre_intern_tokens, CompilerDiagnostic}; +use crate::v2_std_core::InferredNode::{Resolved, CompilerError, TypeVariable}; +use crate::v2_std_core::Connective::{Conj, Disj, NoConnective, Arrow}; +use crate::v2_std_core::Cardinality::{Required, CardOptional}; +use crate::v2_std_core::ExprData::{NoExprData, ExprLiteral, ExprVar, ExprFieldAccess, ExprCall, ExprMethodCall, ExprMatch, ExprIf, ExprLet, ExprRecordLit, ExprListLit, ExprBinOp, ExprUnaryOp, ExprLambda, ExprStringInterp, ExprBlock, ExprCast, ExprForEach, ExprIndex, ExprSlice, ExprReturn}; +use crate::v2_std_core::MatchPattern::{Bind, LitPattern, VariantPattern, Wildcard}; +use crate::v2_std_core::LiteralValue::{LitStr, LitInt, LitFloat, LitBool, LitNull}; +use crate::v2_std_core::ExprErrorKind::{ParseRecoveryError}; +use crate::v2_std_core::BinOp::{Add, Sub, Mul, Div, Mod, Eq, Ne, Lt, Gt, Le, Ge, And, Or, NullCoalesce}; +use crate::v2_std_core::UnaryOpKind::{Not, Neg}; +use crate::v2_std_core::StringPart::{Text, Interpolation}; +use crate::v2_std_core::OperationModifier::{Idempotent, Readonly, Hermetic}; +use crate::v2_std_core::TokenShape::{ShKeyword, ShLBrace, ShRBrace, ShLParen, ShRParen, ShLBracket, ShRBracket, ShLt, ShGt, ShLe, ShGe, ShFatArrow, ShArrow, ShColon, ShComma, ShDot, ShDotDot, ShEq, ShEqEq, ShNe, ShPlus, ShMinus, ShStar, ShSlash, ShPercent, ShBang, ShAnd, ShOr, ShQuestion, ShNullCoalesce, ShPipe, ShPipeArrow, ShLitStr, ShLitInt, ShLitFloat, ShIdent, ShStrBegin, ShStrMid, ShStrEnd, ShNewline, ShEof, ShUnknown}; +use crate::v2_std_core::CompilerDiagnostic::{ParseError}; +pub use crate::v2_compiler_languages::{ItemForm, ItemFormKind, BodyKind, OperatorSpec, SyntaxSpec}; +use crate::v2_compiler_languages::ItemFormKind::{OtherForm}; +use crate::v2_compiler_languages::BodyKind::{ExprBody, BlockBody, TypeBody, ValueBody, NoBody, ServiceBody, ResourceBody}; +pub use crate::extdeps_languages_dag_syntax::{dag_syntax_spec, dag_non_name_keywords}; use self::AdvanceResult::*; use self::EatResult::*; use self::ExpectedToken::*; -use self::ParserCallIdentity::*; use self::ParserHelperIdentity::*; +use self::ParserCallIdentity::*; use self::ParserResultWitness::*; -pub use crate::extdeps_languages_dag_syntax::{dag_non_name_keywords, dag_syntax_spec}; -use crate::v2_compiler_languages::BodyKind::{ - BlockBody, ExprBody, NoBody, ResourceBody, ServiceBody, TypeBody, ValueBody, -}; -use crate::v2_compiler_languages::ItemFormKind::OtherForm; -pub use crate::v2_compiler_languages::{ - BodyKind, ItemForm, ItemFormKind, OperatorSpec, SyntaxSpec, -}; -use crate::v2_rt; -use crate::v2_std_core::BinOp::{ - Add, And, Div, Eq, Ge, Gt, Le, Lt, Mod, Mul, Ne, NullCoalesce, Or, Sub, -}; -use crate::v2_std_core::Cardinality::{CardOptional, Required}; -use crate::v2_std_core::CompilerDiagnostic::ParseError; -use crate::v2_std_core::Connective::{Arrow, Conj, Disj, NoConnective}; -use crate::v2_std_core::ExprData::{ - ExprBinOp, ExprBlock, ExprCall, ExprCast, ExprFieldAccess, ExprForEach, ExprIf, ExprIndex, - ExprLambda, ExprLet, ExprListLit, ExprLiteral, ExprMatch, ExprMethodCall, ExprRecordLit, - ExprReturn, ExprSlice, ExprStringInterp, ExprUnaryOp, ExprVar, NoExprData, -}; -use crate::v2_std_core::ExprErrorKind::ParseRecoveryError; -use crate::v2_std_core::InferredNode::{CompilerError, Resolved, TypeVariable}; -use crate::v2_std_core::LiteralValue::{LitBool, LitFloat, LitInt, LitNull, LitStr}; -use crate::v2_std_core::MatchPattern::{Bind, LitPattern, VariantPattern, Wildcard}; -use crate::v2_std_core::OperationModifier::{Hermetic, Idempotent, Readonly}; -use crate::v2_std_core::StringPart::{Interpolation, Text}; -use crate::v2_std_core::TokenShape::{ - ShAnd, ShArrow, ShBang, ShColon, ShComma, ShDot, ShDotDot, ShEof, ShEq, ShEqEq, ShFatArrow, - ShGe, ShGt, ShIdent, ShKeyword, ShLBrace, ShLBracket, ShLParen, ShLe, ShLitFloat, ShLitInt, - ShLitStr, ShLt, ShMinus, ShNe, ShNewline, ShNullCoalesce, ShOr, ShPercent, ShPipe, ShPipeArrow, - ShPlus, ShQuestion, ShRBrace, ShRBracket, ShRParen, ShSlash, ShStar, ShStrBegin, ShStrEnd, - ShStrMid, ShUnknown, -}; -use crate::v2_std_core::UnaryOpKind::{Neg, Not}; -pub use crate::v2_std_core::{ - arg_name_at, arg_value, authored_name_at, empty_intern_table, error_type, expr_call_func_at, - expr_var_name_at, field_access_field_at, field_binding_pattern, field_node_cardinality, - field_node_default_value, field_node_from_key, field_node_name_at, field_node_type_expr, - file_transport_node, import_node, intern, is_compiler_error, is_container_type, - leaf_node_with_span, local_transport_node, make_arg_node, make_arm_node, make_error_node, - make_expr_error_node, make_expr_node, make_field_binding_node, make_field_init_node, - make_field_node, make_interp_part_node, make_named_expr_node, make_param_node, - make_resource_use_node, make_span, make_text_part_node, make_variant_node, module_node, - no_span, node_name_span, param_node_default_value, param_node_type_expr, pre_intern_tokens, - rest_transport_node, service_config_properties, shell_transport_node, transport_body_key, - transport_headers_key, transport_method_key, transport_path_key, transport_path_template_key, - transport_query_key, transport_response_format_key, transport_stdin_key, transport_url_key, - variant_node_fields, variant_node_name_at, with_required_cardinality, BinOp, Cardinality, - CompilerDiagnostic, Connective, ErrorNode, ExprData, ExprErrorKind, InferredNode, InternResult, - InternTable, LiteralValue, MatchPattern, NewlineIndex, Node, OperationModifier, SourceSpan, - StringPart, Token, TokenShape, UnaryOpKind, -}; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; -use std::collections::HashMap; -use std::rc::Rc; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] pub struct ParseContext { @@ -317,7 +284,9 @@ pub struct BindingPower { #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum ExpectedToken { - ExpectKeyword { text: String }, + ExpectKeyword { + text: String, + }, ExpectLBrace, ExpectRBrace, ExpectLParen, @@ -675,8 +644,12 @@ pub enum ParserHelperIdentity { #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum ParserCallIdentity { - ParserCallHelper { helper: ParserHelperIdentity }, - ParserCallFunction { name: String }, + ParserCallHelper { + helper: ParserHelperIdentity, + }, + ParserCallFunction { + name: String, + }, } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -685,7 +658,9 @@ pub enum ParserResultWitness { ParserWitnessAdvance, ParserWitnessExpect, ParserWitnessEat, - ParserWitnessCall { callee: Rc }, + ParserWitnessCall { + callee: Rc, + }, ParserWitnessOpaque, } impl ParserResultWitness { @@ -708,482 +683,424 @@ pub struct DescResult { pub fn token_span(tok: Option>) -> Rc { match tok { - Some(t) => t.span.clone(), - None => make_span(0, 0), - } + Some(t) => t.span.clone(), + None => make_span(0, 0), +} } pub fn advance(tokens: &Rc>>) -> Rc { match tokens.clone().first().cloned() { - Some(t) => Rc::new(AdvanceResult::AdvanceOk { - token: t.clone(), - tokens: Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - }), - None => Rc::new(AdvanceResult::AdvanceEof), - } + Some(t) => Rc::new(AdvanceResult::AdvanceOk { + token: t.clone(), + tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), +}), + None => Rc::new(AdvanceResult::AdvanceEof), +} } pub fn parse_error(msg: String, span: Rc) -> Rc { - make_error_node( - Rc::new(CompilerDiagnostic::ParseError { - message: msg, - span: span, - }), - "".to_string(), - ) + make_error_node(Rc::new(CompilerDiagnostic::ParseError { + message: msg, + span: span, +}), "".to_string()) } pub fn has_err(err: Option>) -> bool { match err { - Some(_) => true, - None => false, - } + Some(_) => true, + None => false, +} } pub fn parse_string_literal_value(tokens: &Rc>>) -> Rc { { let tok = tokens.clone().first().cloned(); - match tok.clone() { - Some(t) => match t.shape.clone() { - TokenShape::ShLitStr => Rc::new(StringLitResult { - value: t.text.clone(), - tokens: Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - err: None, - }), - _ => Rc::new(StringLitResult { - value: "".to_string(), - tokens: tokens.clone(), - err: Some(parse_error( - "expected string literal".to_string(), - token_span(tok.clone()), - )), - }), - }, - None => Rc::new(StringLitResult { - value: "".to_string(), - tokens: tokens.clone(), - err: Some(parse_error( - "expected string literal".to_string(), - make_span(0, 0), - )), - }), - } - } +match tok.clone() { + Some(t) => match t.shape.clone() { + TokenShape::ShLitStr => Rc::new(StringLitResult { + value: t.text.clone(), + tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), + err: None, +}), + _ => Rc::new(StringLitResult { + value: "".to_string(), + tokens: tokens.clone(), + err: Some(parse_error("expected string literal".to_string(), token_span(tok.clone()))), +}), +}, + None => Rc::new(StringLitResult { + value: "".to_string(), + tokens: tokens.clone(), + err: Some(parse_error("expected string literal".to_string(), make_span(0, 0))), +}), +} +} } pub fn parse_int_literal_value(tokens: &Rc>>) -> Rc { { let tok = tokens.clone().first().cloned(); - match tok.clone() { - Some(t) => match t.shape.clone() { - TokenShape::ShLitInt => { - let n_opt = v2_rt::parse_int(t.text.clone()); - match n_opt { - Some(n) => Rc::new(IntLitResult { - value: n.clone(), - tokens: Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - err: None, - }), - None => Rc::new(IntLitResult { - value: 0, - tokens: tokens.clone(), - err: Some(parse_error( - v2_rt::concat( - v2_rt::concat( - "internal: ShLitInt token text not parseable as int: '" - .to_string(), - t.text.clone(), - ), - "'".to_string(), - ), - token_span(tok.clone()), - )), - }), - } - } - _ => Rc::new(IntLitResult { - value: 0, - tokens: tokens.clone(), - err: Some(parse_error( - "expected integer literal".to_string(), - token_span(tok.clone()), - )), - }), - }, - None => Rc::new(IntLitResult { - value: 0, - tokens: tokens.clone(), - err: Some(parse_error( - "expected integer literal".to_string(), - make_span(0, 0), - )), - }), - } - } +match tok.clone() { + Some(t) => match t.shape.clone() { + TokenShape::ShLitInt => { + let n_opt = v2_rt::parse_int(t.text.clone()); +match n_opt { + Some(n) => Rc::new(IntLitResult { + value: n.clone(), + tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), + err: None, +}), + None => Rc::new(IntLitResult { + value: 0, + tokens: tokens.clone(), + err: Some(parse_error(v2_rt::concat(v2_rt::concat("internal: ShLitInt token text not parseable as int: '".to_string(), t.text.clone()), "'".to_string()), token_span(tok.clone()))), +}), +} +}, + _ => Rc::new(IntLitResult { + value: 0, + tokens: tokens.clone(), + err: Some(parse_error("expected integer literal".to_string(), token_span(tok.clone()))), +}), +}, + None => Rc::new(IntLitResult { + value: 0, + tokens: tokens.clone(), + err: Some(parse_error("expected integer literal".to_string(), make_span(0, 0))), +}), +} +} } pub fn is_ident_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShIdent => true, - _ => false, - } + TokenShape::ShIdent => true, + _ => false, +} } pub fn is_lit_str_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShLitStr => true, - _ => false, - } + TokenShape::ShLitStr => true, + _ => false, +} } pub fn is_lit_int_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShLitInt => true, - _ => false, - } + TokenShape::ShLitInt => true, + _ => false, +} } pub fn is_lit_float_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShLitFloat => true, - _ => false, - } + TokenShape::ShLitFloat => true, + _ => false, +} } pub fn is_str_begin_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShStrBegin => true, - _ => false, - } + TokenShape::ShStrBegin => true, + _ => false, +} } pub fn is_str_mid_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShStrMid => true, - _ => false, - } + TokenShape::ShStrMid => true, + _ => false, +} } pub fn is_str_end_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShStrEnd => true, - _ => false, - } + TokenShape::ShStrEnd => true, + _ => false, +} } pub fn is_unknown_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShUnknown => true, - _ => false, - } + TokenShape::ShUnknown => true, + _ => false, +} } pub fn is_newline_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShNewline => true, - _ => false, - } + TokenShape::ShNewline => true, + _ => false, +} } pub fn is_eof_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShEof => true, - _ => false, - } + TokenShape::ShEof => true, + _ => false, +} } pub fn is_keyword_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShKeyword => true, - _ => false, - } + TokenShape::ShKeyword => true, + _ => false, +} } pub fn is_lbrace_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShLBrace => true, - _ => false, - } + TokenShape::ShLBrace => true, + _ => false, +} } pub fn is_rbrace_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShRBrace => true, - _ => false, - } + TokenShape::ShRBrace => true, + _ => false, +} } pub fn is_lparen_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShLParen => true, - _ => false, - } + TokenShape::ShLParen => true, + _ => false, +} } pub fn is_rparen_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShRParen => true, - _ => false, - } + TokenShape::ShRParen => true, + _ => false, +} } pub fn is_lbracket_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShLBracket => true, - _ => false, - } + TokenShape::ShLBracket => true, + _ => false, +} } pub fn is_rbracket_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShRBracket => true, - _ => false, - } + TokenShape::ShRBracket => true, + _ => false, +} } pub fn is_lt_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShLt => true, - _ => false, - } + TokenShape::ShLt => true, + _ => false, +} } pub fn is_gt_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShGt => true, - _ => false, - } + TokenShape::ShGt => true, + _ => false, +} } pub fn is_le_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShLe => true, - _ => false, - } + TokenShape::ShLe => true, + _ => false, +} } pub fn is_ge_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShGe => true, - _ => false, - } + TokenShape::ShGe => true, + _ => false, +} } pub fn is_fat_arrow_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShFatArrow => true, - _ => false, - } + TokenShape::ShFatArrow => true, + _ => false, +} } pub fn is_arrow_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShArrow => true, - _ => false, - } + TokenShape::ShArrow => true, + _ => false, +} } pub fn is_colon_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShColon => true, - _ => false, - } + TokenShape::ShColon => true, + _ => false, +} } pub fn is_comma_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShComma => true, - _ => false, - } + TokenShape::ShComma => true, + _ => false, +} } pub fn is_dot_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShDot => true, - _ => false, - } + TokenShape::ShDot => true, + _ => false, +} } pub fn is_dot_dot_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShDotDot => true, - _ => false, - } + TokenShape::ShDotDot => true, + _ => false, +} } pub fn is_eq_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShEq => true, - _ => false, - } + TokenShape::ShEq => true, + _ => false, +} } pub fn is_eq_eq_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShEqEq => true, - _ => false, - } + TokenShape::ShEqEq => true, + _ => false, +} } pub fn is_ne_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShNe => true, - _ => false, - } + TokenShape::ShNe => true, + _ => false, +} } pub fn is_plus_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShPlus => true, - _ => false, - } + TokenShape::ShPlus => true, + _ => false, +} } pub fn is_minus_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShMinus => true, - _ => false, - } + TokenShape::ShMinus => true, + _ => false, +} } pub fn is_star_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShStar => true, - _ => false, - } + TokenShape::ShStar => true, + _ => false, +} } pub fn is_slash_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShSlash => true, - _ => false, - } + TokenShape::ShSlash => true, + _ => false, +} } pub fn is_percent_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShPercent => true, - _ => false, - } + TokenShape::ShPercent => true, + _ => false, +} } pub fn is_bang_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShBang => true, - _ => false, - } + TokenShape::ShBang => true, + _ => false, +} } pub fn is_and_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShAnd => true, - _ => false, - } + TokenShape::ShAnd => true, + _ => false, +} } pub fn is_or_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShOr => true, - _ => false, - } + TokenShape::ShOr => true, + _ => false, +} } pub fn is_question_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShQuestion => true, - _ => false, - } + TokenShape::ShQuestion => true, + _ => false, +} } pub fn is_null_coalesce_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShNullCoalesce => true, - _ => false, - } + TokenShape::ShNullCoalesce => true, + _ => false, +} } pub fn is_pipe_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShPipe => true, - _ => false, - } + TokenShape::ShPipe => true, + _ => false, +} } pub fn is_pipe_arrow_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShPipeArrow => true, - _ => false, - } + TokenShape::ShPipeArrow => true, + _ => false, +} } pub fn tok_is_keyword(tok: Option>, kw: String) -> bool { match tok { - Some(t) => (is_keyword_shape(t.shape.clone()) && (t.text.clone().as_str() == kw.as_str())), - None => false, - } + Some(t) => (is_keyword_shape(t.shape.clone()) && (t.text.clone().as_str() == kw.as_str())), + None => false, +} } pub fn tok_keyword_text(tok: Option>) -> String { match tok { - Some(t) => { - if is_keyword_shape(t.shape.clone()) { - t.text.clone() - } else { - "".to_string() - } - } - None => "".to_string(), - } + Some(t) => if is_keyword_shape(t.shape.clone()) { + t.text.clone() + } else { + "".to_string() + }, + None => "".to_string(), +} } pub fn tok_is_ident(tok: Option>) -> bool { match tok { - Some(t) => is_ident_shape(t.shape.clone()), - None => false, - } + Some(t) => is_ident_shape(t.shape.clone()), + None => false, +} } pub fn tok_is_ident_text(tok: Option>, text: String) -> bool { match tok { - Some(t) => (is_ident_shape(t.shape.clone()) && (t.text.clone().as_str() == text.as_str())), - None => false, - } + Some(t) => (is_ident_shape(t.shape.clone()) && (t.text.clone().as_str() == text.as_str())), + None => false, +} } -pub fn drop_leading_type_modifier( - tokens: &Rc>>, - modifier: String, -) -> Rc>> { +pub fn drop_leading_type_modifier(tokens: &Rc>>, modifier: String) -> Rc>> { if tok_is_ident_text(tokens.clone().first().cloned(), modifier) { - skip_newlines(Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - )) + skip_newlines(Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>())) } else { tokens.clone() } @@ -1195,231 +1112,226 @@ pub fn type_body_tokens_after_modifiers(tokens: Rc>>) -> Rc>) -> bool { match tok { - Some(t) => is_newline_shape(t.shape.clone()), - None => false, - } + Some(t) => is_newline_shape(t.shape.clone()), + None => false, +} } pub fn tok_is_eof(tok: Option>) -> bool { match tok { - Some(t) => is_eof_shape(t.shape.clone()), - None => true, - } + Some(t) => is_eof_shape(t.shape.clone()), + None => true, +} } pub fn tok_is_lit_str(tok: Option>) -> bool { match tok { - Some(t) => is_lit_str_shape(t.shape.clone()), - None => false, - } + Some(t) => is_lit_str_shape(t.shape.clone()), + None => false, +} } pub fn tok_is_lbrace(tok: Option>) -> bool { match tok { - Some(t) => is_lbrace_shape(t.shape.clone()), - None => false, - } + Some(t) => is_lbrace_shape(t.shape.clone()), + None => false, +} } pub fn tok_is_rbrace(tok: Option>) -> bool { match tok { - Some(t) => is_rbrace_shape(t.shape.clone()), - None => false, - } + Some(t) => is_rbrace_shape(t.shape.clone()), + None => false, +} } pub fn tok_is_lparen(tok: Option>) -> bool { match tok { - Some(t) => is_lparen_shape(t.shape.clone()), - None => false, - } + Some(t) => is_lparen_shape(t.shape.clone()), + None => false, +} } pub fn tok_is_rparen(tok: Option>) -> bool { match tok { - Some(t) => is_rparen_shape(t.shape.clone()), - None => false, - } + Some(t) => is_rparen_shape(t.shape.clone()), + None => false, +} } pub fn tok_is_lbracket(tok: Option>) -> bool { match tok { - Some(t) => is_lbracket_shape(t.shape.clone()), - None => false, - } + Some(t) => is_lbracket_shape(t.shape.clone()), + None => false, +} } pub fn tok_is_rbracket(tok: Option>) -> bool { match tok { - Some(t) => is_rbracket_shape(t.shape.clone()), - None => false, - } + Some(t) => is_rbracket_shape(t.shape.clone()), + None => false, +} } pub fn tok_is_colon(tok: Option>) -> bool { match tok { - Some(t) => is_colon_shape(t.shape.clone()), - None => false, - } + Some(t) => is_colon_shape(t.shape.clone()), + None => false, +} } pub fn tok_is_comma(tok: Option>) -> bool { match tok { - Some(t) => is_comma_shape(t.shape.clone()), - None => false, - } + Some(t) => is_comma_shape(t.shape.clone()), + None => false, +} } pub fn tok_is_dot(tok: Option>) -> bool { match tok { - Some(t) => is_dot_shape(t.shape.clone()), - None => false, - } + Some(t) => is_dot_shape(t.shape.clone()), + None => false, +} } pub fn tok_is_dot_dot(tok: Option>) -> bool { match tok { - Some(t) => is_dot_dot_shape(t.shape.clone()), - None => false, - } + Some(t) => is_dot_dot_shape(t.shape.clone()), + None => false, +} } pub fn tok_is_eq(tok: Option>) -> bool { match tok { - Some(t) => is_eq_shape(t.shape.clone()), - None => false, - } + Some(t) => is_eq_shape(t.shape.clone()), + None => false, +} } pub fn tok_is_fat_arrow(tok: Option>) -> bool { match tok { - Some(t) => is_fat_arrow_shape(t.shape.clone()), - None => false, - } + Some(t) => is_fat_arrow_shape(t.shape.clone()), + None => false, +} } pub fn tok_is_arrow(tok: Option>) -> bool { match tok { - Some(t) => is_arrow_shape(t.shape.clone()), - None => false, - } + Some(t) => is_arrow_shape(t.shape.clone()), + None => false, +} } pub fn tok_is_lt(tok: Option>) -> bool { match tok { - Some(t) => is_lt_shape(t.shape.clone()), - None => false, - } + Some(t) => is_lt_shape(t.shape.clone()), + None => false, +} } pub fn tok_is_gt(tok: Option>) -> bool { match tok { - Some(t) => is_gt_shape(t.shape.clone()), - None => false, - } + Some(t) => is_gt_shape(t.shape.clone()), + None => false, +} } pub fn tok_is_pipe(tok: Option>) -> bool { match tok { - Some(t) => is_pipe_shape(t.shape.clone()), - None => false, - } + Some(t) => is_pipe_shape(t.shape.clone()), + None => false, +} } pub fn tok_is_pipe_arrow(tok: Option>) -> bool { match tok { - Some(t) => is_pipe_arrow_shape(t.shape.clone()), - None => false, - } + Some(t) => is_pipe_arrow_shape(t.shape.clone()), + None => false, +} } pub fn tok_is_question(tok: Option>) -> bool { match tok { - Some(t) => is_question_shape(t.shape.clone()), - None => false, - } + Some(t) => is_question_shape(t.shape.clone()), + None => false, +} } pub fn tok_span(tok: Option>) -> Rc { match tok { - Some(t) => t.span.clone(), - None => make_span(0, 0), - } + Some(t) => t.span.clone(), + None => make_span(0, 0), +} } pub fn tok_keyword_to_name(tok: Option>) -> Option { match tok { - Some(t) => { - if is_name_keyword(&t) { - Some(t.text.clone()) - } else { - None - } - } - None => None, - } + Some(t) => if is_name_keyword(&t) { + Some(t.text.clone()) + } else { + None + }, + None => None, +} } pub fn tok_is_keyword_name(tok: Option>) -> bool { match tok_keyword_to_name(tok) { - Some(_) => true, - None => false, - } + Some(_) => true, + None => false, +} } pub fn shape_display_name(shape: TokenShape) -> String { match shape { - TokenShape::ShKeyword => "keyword".to_string(), - TokenShape::ShLBrace => "LBrace".to_string(), - TokenShape::ShRBrace => "RBrace".to_string(), - TokenShape::ShLParen => "LParen".to_string(), - TokenShape::ShRParen => "RParen".to_string(), - TokenShape::ShLBracket => "LBracket".to_string(), - TokenShape::ShRBracket => "RBracket".to_string(), - TokenShape::ShLt => "Lt".to_string(), - TokenShape::ShGt => "Gt".to_string(), - TokenShape::ShLe => "Le".to_string(), - TokenShape::ShGe => "Ge".to_string(), - TokenShape::ShFatArrow => "FatArrow".to_string(), - TokenShape::ShArrow => "Arrow".to_string(), - TokenShape::ShColon => "Colon".to_string(), - TokenShape::ShComma => "Comma".to_string(), - TokenShape::ShDot => "Dot".to_string(), - TokenShape::ShDotDot => "DotDot".to_string(), - TokenShape::ShEq => "Eq".to_string(), - TokenShape::ShEqEq => "EqEq".to_string(), - TokenShape::ShNe => "Ne".to_string(), - TokenShape::ShPlus => "Plus".to_string(), - TokenShape::ShMinus => "Minus".to_string(), - TokenShape::ShStar => "Star".to_string(), - TokenShape::ShSlash => "Slash".to_string(), - TokenShape::ShPercent => "Percent".to_string(), - TokenShape::ShBang => "Bang".to_string(), - TokenShape::ShAnd => "And".to_string(), - TokenShape::ShOr => "Or".to_string(), - TokenShape::ShQuestion => "Question".to_string(), - TokenShape::ShNullCoalesce => "NullCoalesce".to_string(), - TokenShape::ShPipe => "Pipe".to_string(), - TokenShape::ShPipeArrow => "PipeArrow".to_string(), - TokenShape::ShLitStr => "LitStr".to_string(), - TokenShape::ShLitInt => "LitInt".to_string(), - TokenShape::ShLitFloat => "LitFloat".to_string(), - TokenShape::ShIdent => "Ident".to_string(), - TokenShape::ShStrBegin => "StrBegin".to_string(), - TokenShape::ShStrMid => "StrMid".to_string(), - TokenShape::ShStrEnd => "StrEnd".to_string(), - TokenShape::ShNewline => "Newline".to_string(), - TokenShape::ShEof => "Eof".to_string(), - TokenShape::ShUnknown => "Unknown".to_string(), - } + TokenShape::ShKeyword => "keyword".to_string(), + TokenShape::ShLBrace => "LBrace".to_string(), + TokenShape::ShRBrace => "RBrace".to_string(), + TokenShape::ShLParen => "LParen".to_string(), + TokenShape::ShRParen => "RParen".to_string(), + TokenShape::ShLBracket => "LBracket".to_string(), + TokenShape::ShRBracket => "RBracket".to_string(), + TokenShape::ShLt => "Lt".to_string(), + TokenShape::ShGt => "Gt".to_string(), + TokenShape::ShLe => "Le".to_string(), + TokenShape::ShGe => "Ge".to_string(), + TokenShape::ShFatArrow => "FatArrow".to_string(), + TokenShape::ShArrow => "Arrow".to_string(), + TokenShape::ShColon => "Colon".to_string(), + TokenShape::ShComma => "Comma".to_string(), + TokenShape::ShDot => "Dot".to_string(), + TokenShape::ShDotDot => "DotDot".to_string(), + TokenShape::ShEq => "Eq".to_string(), + TokenShape::ShEqEq => "EqEq".to_string(), + TokenShape::ShNe => "Ne".to_string(), + TokenShape::ShPlus => "Plus".to_string(), + TokenShape::ShMinus => "Minus".to_string(), + TokenShape::ShStar => "Star".to_string(), + TokenShape::ShSlash => "Slash".to_string(), + TokenShape::ShPercent => "Percent".to_string(), + TokenShape::ShBang => "Bang".to_string(), + TokenShape::ShAnd => "And".to_string(), + TokenShape::ShOr => "Or".to_string(), + TokenShape::ShQuestion => "Question".to_string(), + TokenShape::ShNullCoalesce => "NullCoalesce".to_string(), + TokenShape::ShPipe => "Pipe".to_string(), + TokenShape::ShPipeArrow => "PipeArrow".to_string(), + TokenShape::ShLitStr => "LitStr".to_string(), + TokenShape::ShLitInt => "LitInt".to_string(), + TokenShape::ShLitFloat => "LitFloat".to_string(), + TokenShape::ShIdent => "Ident".to_string(), + TokenShape::ShStrBegin => "StrBegin".to_string(), + TokenShape::ShStrMid => "StrMid".to_string(), + TokenShape::ShStrEnd => "StrEnd".to_string(), + TokenShape::ShNewline => "Newline".to_string(), + TokenShape::ShEof => "Eof".to_string(), + TokenShape::ShUnknown => "Unknown".to_string(), +} } pub fn token_display_name(token: &Rc) -> String { if is_keyword_shape(token.shape.clone()) { - v2_rt::concat( - "keyword '".to_string(), - v2_rt::concat(token.text.clone(), "'".to_string()), - ) + v2_rt::concat("keyword '".to_string(), v2_rt::concat(token.text.clone(), "'".to_string())) } else { shape_display_name(token.shape.clone()) } @@ -1427,213 +1339,170 @@ pub fn token_display_name(token: &Rc) -> String { pub fn expected_token_name(expected: Rc) -> String { match (*expected).clone() { - ExpectedToken::ExpectKeyword { text: kw, .. } => v2_rt::concat( - "keyword '".to_string(), - v2_rt::concat(kw.clone(), "'".to_string()), - ), - ExpectedToken::ExpectLBrace => "LBrace".to_string(), - ExpectedToken::ExpectRBrace => "RBrace".to_string(), - ExpectedToken::ExpectLParen => "LParen".to_string(), - ExpectedToken::ExpectRParen => "RParen".to_string(), - ExpectedToken::ExpectLBracket => "LBracket".to_string(), - ExpectedToken::ExpectRBracket => "RBracket".to_string(), - ExpectedToken::ExpectLt => "Lt".to_string(), - ExpectedToken::ExpectGt => "Gt".to_string(), - ExpectedToken::ExpectFatArrow => "FatArrow".to_string(), - ExpectedToken::ExpectArrow => "Arrow".to_string(), - ExpectedToken::ExpectColon => "Colon".to_string(), - ExpectedToken::ExpectComma => "Comma".to_string(), - ExpectedToken::ExpectDot => "Dot".to_string(), - ExpectedToken::ExpectEq => "Eq".to_string(), - ExpectedToken::ExpectQuestion => "Question".to_string(), - ExpectedToken::ExpectPipe => "Pipe".to_string(), - } + ExpectedToken::ExpectKeyword { text: kw, .. } => v2_rt::concat("keyword '".to_string(), v2_rt::concat(kw.clone(), "'".to_string())), + ExpectedToken::ExpectLBrace => "LBrace".to_string(), + ExpectedToken::ExpectRBrace => "RBrace".to_string(), + ExpectedToken::ExpectLParen => "LParen".to_string(), + ExpectedToken::ExpectRParen => "RParen".to_string(), + ExpectedToken::ExpectLBracket => "LBracket".to_string(), + ExpectedToken::ExpectRBracket => "RBracket".to_string(), + ExpectedToken::ExpectLt => "Lt".to_string(), + ExpectedToken::ExpectGt => "Gt".to_string(), + ExpectedToken::ExpectFatArrow => "FatArrow".to_string(), + ExpectedToken::ExpectArrow => "Arrow".to_string(), + ExpectedToken::ExpectColon => "Colon".to_string(), + ExpectedToken::ExpectComma => "Comma".to_string(), + ExpectedToken::ExpectDot => "Dot".to_string(), + ExpectedToken::ExpectEq => "Eq".to_string(), + ExpectedToken::ExpectQuestion => "Question".to_string(), + ExpectedToken::ExpectPipe => "Pipe".to_string(), +} } pub fn token_matches_expected(token: &Rc, expected: Rc) -> bool { match (*expected).clone() { - ExpectedToken::ExpectKeyword { text: kw, .. } => { - (is_keyword_shape(token.shape.clone()) - && (token.text.clone().as_str() == kw.clone().as_str())) - } - ExpectedToken::ExpectLBrace => is_lbrace_shape(token.shape.clone()), - ExpectedToken::ExpectRBrace => is_rbrace_shape(token.shape.clone()), - ExpectedToken::ExpectLParen => is_lparen_shape(token.shape.clone()), - ExpectedToken::ExpectRParen => is_rparen_shape(token.shape.clone()), - ExpectedToken::ExpectLBracket => is_lbracket_shape(token.shape.clone()), - ExpectedToken::ExpectRBracket => is_rbracket_shape(token.shape.clone()), - ExpectedToken::ExpectLt => is_lt_shape(token.shape.clone()), - ExpectedToken::ExpectGt => is_gt_shape(token.shape.clone()), - ExpectedToken::ExpectFatArrow => is_fat_arrow_shape(token.shape.clone()), - ExpectedToken::ExpectArrow => is_arrow_shape(token.shape.clone()), - ExpectedToken::ExpectColon => is_colon_shape(token.shape.clone()), - ExpectedToken::ExpectComma => is_comma_shape(token.shape.clone()), - ExpectedToken::ExpectDot => is_dot_shape(token.shape.clone()), - ExpectedToken::ExpectEq => is_eq_shape(token.shape.clone()), - ExpectedToken::ExpectQuestion => is_question_shape(token.shape.clone()), - ExpectedToken::ExpectPipe => is_pipe_shape(token.shape.clone()), - } + ExpectedToken::ExpectKeyword { text: kw, .. } => (is_keyword_shape(token.shape.clone()) && (token.text.clone().as_str() == kw.clone().as_str())), + ExpectedToken::ExpectLBrace => is_lbrace_shape(token.shape.clone()), + ExpectedToken::ExpectRBrace => is_rbrace_shape(token.shape.clone()), + ExpectedToken::ExpectLParen => is_lparen_shape(token.shape.clone()), + ExpectedToken::ExpectRParen => is_rparen_shape(token.shape.clone()), + ExpectedToken::ExpectLBracket => is_lbracket_shape(token.shape.clone()), + ExpectedToken::ExpectRBracket => is_rbracket_shape(token.shape.clone()), + ExpectedToken::ExpectLt => is_lt_shape(token.shape.clone()), + ExpectedToken::ExpectGt => is_gt_shape(token.shape.clone()), + ExpectedToken::ExpectFatArrow => is_fat_arrow_shape(token.shape.clone()), + ExpectedToken::ExpectArrow => is_arrow_shape(token.shape.clone()), + ExpectedToken::ExpectColon => is_colon_shape(token.shape.clone()), + ExpectedToken::ExpectComma => is_comma_shape(token.shape.clone()), + ExpectedToken::ExpectDot => is_dot_shape(token.shape.clone()), + ExpectedToken::ExpectEq => is_eq_shape(token.shape.clone()), + ExpectedToken::ExpectQuestion => is_question_shape(token.shape.clone()), + ExpectedToken::ExpectPipe => is_pipe_shape(token.shape.clone()), +} } pub fn expect(tokens: &Rc>>, expected: &Rc) -> Rc { { let tok = tokens.clone().first().cloned(); - let matches = match tok.clone() { - Some(t) => token_matches_expected(&t, expected.clone()), - None => false, - }; - if matches { +let matches = match tok.clone() { + Some(t) => token_matches_expected(&t, expected.clone()), + None => false, +}; +if matches { Rc::new(TokenResult { - token: tok.clone().unwrap(), - tokens: Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - err: None, - }) + token: tok.clone().unwrap(), + tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), + err: None, +}) } else { { let found = match tok.clone() { - Some(t) => token_display_name(&t), - None => "EOF".to_string(), - }; - let wanted = expected_token_name(expected.clone()); - Rc::new(TokenResult { - token: Rc::new(Token { - text: "".to_string(), - span: make_span(0, 0), - shape: TokenShape::ShEof, - }), - tokens: tokens.clone(), - err: Some(parse_error( - format!("expected {}, found {}", wanted, found), - token_span(tok.clone()), - )), - }) - } + Some(t) => token_display_name(&t), + None => "EOF".to_string(), +}; +let wanted = expected_token_name(expected.clone()); +Rc::new(TokenResult { + token: Rc::new(Token { + text: "".to_string(), + span: make_span(0, 0), + shape: TokenShape::ShEof, +}), + tokens: tokens.clone(), + err: Some(parse_error(format!("expected {}, found {}", wanted, found), token_span(tok.clone()))), +}) +} } - } +} } pub fn expect_ident(tokens: &Rc>>) -> Rc { { let tok = tokens.clone().first().cloned(); - let sh = match tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, - }; - match sh.clone() { - Some(TokenShape::ShIdent) => { - let n = tok.clone().unwrap().text.clone(); - let span = tok.clone().unwrap().span.clone(); - Rc::new(NameResult { - name: n, - span: span, - tokens: Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - err: None, - }) - } - _ => { - let found = match sh.clone() { - Some(shape) => shape_display_name(shape.clone()), - None => "EOF".to_string(), - }; - Rc::new(NameResult { - name: "".to_string(), - span: token_span(tok.clone()), - tokens: tokens.clone(), - err: Some(parse_error( - v2_rt::concat("expected identifier, found ".to_string(), found), - token_span(tok.clone()), - )), - }) - } - } - } +let sh = match tok.clone() { + Some(t) => Some(t.shape.clone()), + None => None, +}; +match sh.clone() { + Some(TokenShape::ShIdent) => { + let n = tok.clone().unwrap().text.clone(); +let span = tok.clone().unwrap().span.clone(); +Rc::new(NameResult { + name: n, + span: span, + tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), + err: None, +}) +}, + _ => { + let found = match sh.clone() { + Some(shape) => shape_display_name(shape.clone()), + None => "EOF".to_string(), +}; +Rc::new(NameResult { + name: "".to_string(), + span: token_span(tok.clone()), + tokens: tokens.clone(), + err: Some(parse_error(v2_rt::concat("expected identifier, found ".to_string(), found), token_span(tok.clone()))), +}) +}, +} +} } pub fn expect_name(tokens: &Rc>>) -> Rc { { let tok = tokens.clone().first().cloned(); - let sh = match tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, - }; - match sh { - Some(TokenShape::ShIdent) => { - let n = tok.clone().unwrap().text.clone(); +let sh = match tok.clone() { + Some(t) => Some(t.shape.clone()), + None => None, +}; +match sh { + Some(TokenShape::ShIdent) => { + let n = tok.clone().unwrap().text.clone(); +let span = tok.clone().unwrap().span.clone(); +Rc::new(NameResult { + name: n, + span: span, + tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), + err: None, +}) +}, + _ => { + let kw_name = tok_keyword_to_name(tok.clone()); +match kw_name { + Some(n) => { let span = tok.clone().unwrap().span.clone(); - Rc::new(NameResult { - name: n, - span: span, - tokens: Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - err: None, - }) - } - _ => { - let kw_name = tok_keyword_to_name(tok.clone()); - match kw_name { - Some(n) => { - let span = tok.clone().unwrap().span.clone(); - Rc::new(NameResult { - name: n, - span: span, - tokens: Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - err: None, - }) - } - None => { - let found = match tok.clone() { - Some(t) => token_display_name(&t), - None => "EOF".to_string(), - }; - Rc::new(NameResult { - name: "".to_string(), - span: token_span(tok.clone()), - tokens: tokens.clone(), - err: Some(parse_error( - v2_rt::concat("expected name, found ".to_string(), found), - token_span(tok.clone()), - )), - }) - } - } - } - } - } +Rc::new(NameResult { + name: n, + span: span, + tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), + err: None, +}) +}, + None => { + let found = match tok.clone() { + Some(t) => token_display_name(&t), + None => "EOF".to_string(), +}; +Rc::new(NameResult { + name: "".to_string(), + span: token_span(tok.clone()), + tokens: tokens.clone(), + err: Some(parse_error(v2_rt::concat("expected name, found ".to_string(), found), token_span(tok.clone()))), +}) +}, +} +}, +} +} } pub fn is_name_keyword(token: &Rc) -> bool { if is_keyword_shape(token.shape.clone()) { match v2_rt::lookup(&dag_non_name_keywords(), token.text.clone()) { - Some(_) => false, - None => true, - } + Some(_) => false, + None => true, +} } else { false } @@ -1642,153 +1511,109 @@ pub fn is_name_keyword(token: &Rc) -> bool { pub fn skip_newlines(mut tokens: Rc>>) -> Rc>> { loop { match tokens.clone().first().cloned() { - Some(t) => { - if is_newline_shape(t.shape.clone()) { - { - let __tco_0 = - Rc::new(tokens.iter().cloned().skip(1 as usize).collect::>()); - tokens = __tco_0; - continue; - } - } else { - break tokens.clone(); - } - } - None => { - break tokens.clone(); - } - } - } + Some(t) => { if is_newline_shape(t.shape.clone()) { + { + let __tco_0 = Rc::new(tokens.iter().cloned().skip(1 as usize).collect::>()); +tokens = __tco_0; +continue; +} +} else { + break tokens.clone(); +} }, + None => { break tokens.clone(); }, +} +} } pub fn is_continuation_shape(shape: &TokenShape) -> bool { - (((is_pipe_arrow_shape(shape.clone()) || is_dot_shape(shape.clone())) - || is_or_shape(shape.clone())) - || is_and_shape(shape.clone())) + (((is_pipe_arrow_shape(shape.clone()) || is_dot_shape(shape.clone())) || is_or_shape(shape.clone())) || is_and_shape(shape.clone())) } pub fn skip_continuation_newlines(tokens: &Rc>>) -> Rc>> { { let tok = tokens.clone().first().cloned(); - let is_continuation = if tok_is_newline(tok) { +let is_continuation = if tok_is_newline(tok) { { let after = skip_newlines(tokens.clone()); - match after.first().cloned() { - Some(next) => is_continuation_shape(&next.shape.clone()), - None => false, - } - } +match after.first().cloned() { + Some(next) => is_continuation_shape(&next.shape.clone()), + None => false, +} +} } else { false }; - if is_continuation { +if is_continuation { skip_newlines(tokens.clone()) } else { tokens.clone() } - } +} } pub fn eat(tokens: &Rc>>, expected: Rc) -> Rc { match tokens.clone().first().cloned() { - Some(t) => { - if token_matches_expected(&t, expected) { - Rc::new(EatResult::EatConsumed { - token: t.clone(), - tokens: Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - }) - } else { - Rc::new(EatResult::EatUnchanged { - tokens: tokens.clone(), - }) - } - } - None => Rc::new(EatResult::EatUnchanged { - tokens: tokens.clone(), - }), - } + Some(t) => if token_matches_expected(&t, expected) { + Rc::new(EatResult::EatConsumed { + token: t.clone(), + tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), +}) + } else { + Rc::new(EatResult::EatUnchanged { + tokens: tokens.clone(), +}) + }, + None => Rc::new(EatResult::EatUnchanged { + tokens: tokens.clone(), +}), +} } -pub fn parser_result_base_var( - expr: &Rc, - source_indices: Rc>>, -) -> Option { +pub fn parser_result_base_var(expr: &Rc, source_indices: Rc>>) -> Option { match (*expr.expr_data.clone()).clone() { - ExprData::ExprFieldAccess { .. } => match expr.children.clone().first().cloned() { - Some(base) => match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => Some(expr_var_name_at(base.clone(), source_indices)), - _ => None, - }, - None => None, - }, - _ => None, - } + ExprData::ExprFieldAccess { .. } => match expr.children.clone().first().cloned() { + Some(base) => match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => Some(expr_var_name_at(base.clone(), source_indices)), + _ => None, +}, + None => None, +}, + _ => None, +} } -pub fn parser_helper_state_arg_expr( - call_node: Rc, - source_indices: Rc>>, -) -> Option> { - Rc::new( - call_node - .children - .clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - .fold(None, |acc: _, pair: (i64, Rc)| { - if (acc.clone() != None) { - acc.clone() - } else { - { - let idx = pair.0.clone(); - let arg_node = pair.1.clone(); - let matches_state = match arg_name_at(arg_node.clone(), source_indices.clone()) { - Some(name) => { - ((name.clone().as_str() == "state".to_string().as_str()) - || (name.clone().as_str() == "tokens".to_string().as_str())) - } - None => (idx.clone() == 0), - }; - if matches_state.clone() { - Some(arg_value(&arg_node)) - } else { - None - } +pub fn parser_helper_state_arg_expr(call_node: Rc, source_indices: Rc>>) -> Option> { + Rc::new(call_node.children.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned().fold(None, |acc: _, pair: (i64, Rc)| if (acc.clone() != None) { + acc.clone() + } else { + { + let idx = pair.0.clone(); +let arg_node = pair.1.clone(); +let matches_state = match arg_name_at(arg_node.clone(), source_indices.clone()) { + Some(name) => ((name.clone().as_str() == "state".to_string().as_str()) || (name.clone().as_str() == "tokens".to_string().as_str())), + None => (idx.clone() == 0), +}; +if matches_state.clone() { + Some(arg_value(&arg_node)) + } else { + None } - } +} }) } -pub fn parser_progress_flag_var( - expr: &Rc, - source_indices: &Rc>>, -) -> Option { +pub fn parser_progress_flag_var(expr: &Rc, source_indices: &Rc>>) -> Option { match (*expr.expr_data.clone()).clone() { - ExprData::ExprFieldAccess { .. } => { - let field = field_access_field_at(expr.clone(), source_indices.clone()); - if ((field.clone().as_str() == "consumed".to_string().as_str()) - || (field.clone().as_str() == "changed".to_string().as_str())) - { - parser_result_base_var(&expr, source_indices.clone()) - } else { - None - } + ExprData::ExprFieldAccess { .. } => { + let field = field_access_field_at(expr.clone(), source_indices.clone()); +if ((field.clone().as_str() == "consumed".to_string().as_str()) || (field.clone().as_str() == "changed".to_string().as_str())) { + parser_result_base_var(&expr, source_indices.clone()) + } else { + None } - _ => None, - } +}, + _ => None, +} } pub fn parser_helper_identity(callee: &String) -> Option { @@ -1807,83 +1632,69 @@ pub fn parser_helper_identity(callee: &String) -> Option { } } -pub fn parser_passthrough_state_expr( - expr: &Rc, - source_indices: &Rc>>, -) -> Option> { +pub fn parser_passthrough_state_expr(expr: &Rc, source_indices: &Rc>>) -> Option> { match (*expr.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { - match parser_helper_identity(&expr_call_func_at(expr.clone(), source_indices.clone())) { - Some(ParserHelperIdentity::ParserHelperSkipNewlines) => { - parser_helper_state_arg_expr(expr.clone(), source_indices.clone()) - } - Some(ParserHelperIdentity::ParserHelperSkipContinuationNewlines) => { - parser_helper_state_arg_expr(expr.clone(), source_indices.clone()) - } - Some(ParserHelperIdentity::ParserHelperWith) => { - match expr.children.clone().first().cloned() { - Some(base_arg) => Some(arg_value(&base_arg)), - None => None, - } - } - None => None, - } - } - _ => None, - } + ExprData::ExprCall { .. } => match parser_helper_identity(&expr_call_func_at(expr.clone(), source_indices.clone())) { + Some(ParserHelperIdentity::ParserHelperSkipNewlines) => parser_helper_state_arg_expr(expr.clone(), source_indices.clone()), + Some(ParserHelperIdentity::ParserHelperSkipContinuationNewlines) => parser_helper_state_arg_expr(expr.clone(), source_indices.clone()), + Some(ParserHelperIdentity::ParserHelperWith) => match expr.children.clone().first().cloned() { + Some(base_arg) => Some(arg_value(&base_arg)), + None => None, +}, + None => None, +}, + _ => None, +} } -pub fn parser_result_witness( - expr: &Rc, - source_indices: Rc>>, -) -> Rc { +pub fn parser_result_witness(expr: &Rc, source_indices: Rc>>) -> Rc { match (*expr.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => match expr_call_func_at(expr.clone(), source_indices) { - ref __s if __s == "advance" => Rc::new(ParserResultWitness::ParserWitnessAdvance), - ref __s if __s == "expect" => Rc::new(ParserResultWitness::ParserWitnessExpect), - ref __s if __s == "eat" => Rc::new(ParserResultWitness::ParserWitnessEat), - callee => match parser_helper_identity(&callee) { - Some(helper) => Rc::new(ParserResultWitness::ParserWitnessCall { - callee: Rc::new(ParserCallIdentity::ParserCallHelper { - helper: helper.clone(), - }), - }), - None => Rc::new(ParserResultWitness::ParserWitnessCall { - callee: Rc::new(ParserCallIdentity::ParserCallFunction { - name: callee.clone(), - }), - }), - }, - }, - _ => Rc::new(ParserResultWitness::ParserWitnessOpaque), - } + ExprData::ExprCall { .. } => match expr_call_func_at(expr.clone(), source_indices) { + ref __s if __s == "advance" => Rc::new(ParserResultWitness::ParserWitnessAdvance), + ref __s if __s == "expect" => Rc::new(ParserResultWitness::ParserWitnessExpect), + ref __s if __s == "eat" => Rc::new(ParserResultWitness::ParserWitnessEat), + callee => match parser_helper_identity(&callee) { + Some(helper) => Rc::new(ParserResultWitness::ParserWitnessCall { + callee: Rc::new(ParserCallIdentity::ParserCallHelper { + helper: helper.clone(), +}), +}), + None => Rc::new(ParserResultWitness::ParserWitnessCall { + callee: Rc::new(ParserCallIdentity::ParserCallFunction { + name: callee.clone(), +}), +}), +}, +}, + _ => Rc::new(ParserResultWitness::ParserWitnessOpaque), +} } pub fn leaf_type_node(name: &String, span: &Rc) -> Rc { Rc::new(Node { - name: name.clone(), - span: span.clone(), - ident_span: if (name.clone().as_str() == "".to_string().as_str()) { - None - } else { - Some(span.clone()) - }, - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }) + name: name.clone(), + span: span.clone(), + ident_span: if (name.clone().as_str() == "".to_string().as_str()) { + None + } else { + Some(span.clone()) + }, + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}) } pub fn is_conj_with_children(n: &Rc) -> bool { @@ -1892,455 +1703,338 @@ pub fn is_conj_with_children(n: &Rc) -> bool { pub fn child_inferred_or_empty(ch: Rc) -> Rc { match ch.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => rt.clone(), - _ => error_type(), - } + Some(InferredNode::Resolved { node: rt, .. }) => rt.clone(), + _ => error_type(), +} } -pub fn node_inferred_to_outputs( - rt: &Rc, - source_indices: Rc>>, -) -> Rc>> { +pub fn node_inferred_to_outputs(rt: &Rc, source_indices: Rc>>) -> Rc>> { if is_conj_with_children(&rt) { { - let all_children_typed = { - let mut __all = true; - for ch in rt.children.clone().iter().cloned() { - if !(match ch.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { .. }) => true, - _ => false, - }) { - __all = false; - break; - } - } - __all - }; - if all_children_typed { - Rc::new({ - let mut __result = Vec::new(); - for ch in rt.children.clone().iter().cloned() { - __result.push(make_field_node( - &authored_name_at(source_indices.clone(), &ch), - child_inferred_or_empty(ch.clone()), - Cardinality::Required, - ch.body.clone(), - None, - ch.span.clone(), - node_name_span(&ch), - )); - } - __result - }) + let all_children_typed = { let mut __all = true; for ch in rt.children.clone().iter().cloned() { if !(match ch.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { .. }) => true, + _ => false, +}) { __all = false; break; } } __all }; +if all_children_typed { + Rc::new({ let mut __result = Vec::new(); for ch in rt.children.clone().iter().cloned() { __result.push(make_field_node(&authored_name_at(source_indices.clone(), &ch), child_inferred_or_empty(ch.clone()), Cardinality::Required, ch.body.clone(), None, ch.span.clone(), node_name_span(&ch))); } __result }) } else { Rc::new(vec![]) } - } +} } else { - Rc::new(vec![make_field_node( - &"value".to_string(), - rt.clone(), - Cardinality::Required, - None, - None, - rt.span.clone(), - no_span(), - )]) + Rc::new(vec![make_field_node(&"value".to_string(), rt.clone(), Cardinality::Required, None, None, rt.span.clone(), no_span())]) } } pub fn parse_dotted_ident(tokens: Rc>>) -> Rc { { let r = expect_name(&tokens); - if has_err(r.err.clone()) { - return r.clone(); +if has_err(r.err.clone()) { + return r.clone() } - parse_dotted_ident_rest(r.tokens.clone(), r.name.clone(), r.span.clone()) - } +parse_dotted_ident_rest(r.tokens.clone(), r.name.clone(), r.span.clone()) +} } -pub fn parse_dotted_ident_rest( - mut tokens: Rc>>, - mut acc: String, - mut span: Rc, -) -> Rc { +pub fn parse_dotted_ident_rest(mut tokens: Rc>>, mut acc: String, mut span: Rc) -> Rc { loop { match (*eat(&tokens, Rc::new(ExpectedToken::ExpectDot))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let r = expect_name(&__ec); - if has_err(r.err.clone()) { - return r.clone(); - } - let extended = Rc::new(SourceSpan { - file: span.file.clone(), - start: span.start.clone(), - end: r.span.clone().end.clone(), - }); - { - let __tco_0 = r.tokens.clone(); - let __tco_1 = - v2_rt::concat(v2_rt::concat(acc, ".".to_string()), r.name.clone()); - let __tco_2 = extended; - tokens = __tco_0; - acc = __tco_1; - span = __tco_2; - continue; - } - } - EatResult::EatUnchanged { tokens: __eu, .. } => { - break Rc::new(NameResult { - name: acc, - span: span.clone(), - tokens: __eu.clone(), - err: None, - }); - } - } - } + EatResult::EatConsumed { tokens: __ec, .. } => { let r = expect_name(&__ec); +if has_err(r.err.clone()) { + return r.clone() + } +let extended = Rc::new(SourceSpan { + file: span.file.clone(), + start: span.start.clone(), + end: r.span.clone().end.clone(), +}); +{ + let __tco_0 = r.tokens.clone(); +let __tco_1 = v2_rt::concat(v2_rt::concat(acc, ".".to_string()), r.name.clone()); +let __tco_2 = extended; +tokens = __tco_0; +acc = __tco_1; +span = __tco_2; +continue; +} }, + EatResult::EatUnchanged { tokens: __eu, .. } => { break Rc::new(NameResult { + name: acc, + span: span.clone(), + tokens: __eu.clone(), + err: None, +}); }, +} +} } -pub fn parse_with_table( - tokens: &Rc>>, - source_indices: Rc>>, - intern_table: Rc, -) -> Rc { +pub fn parse_with_table(tokens: &Rc>>, source_indices: Rc>>, intern_table: Rc) -> Rc { { let pre_interned = pre_intern_tokens(tokens.clone(), intern_table); - let ctx = Rc::new(ParseContext { - source_indices: source_indices, - intern_table: pre_interned, - }); - let r = parse_module(&tokens, &ctx); - if has_err(r.err.clone()) { +let ctx = Rc::new(ParseContext { + source_indices: source_indices, + intern_table: pre_interned, +}); +let r = parse_module(&tokens, &ctx); +if has_err(r.err.clone()) { Rc::new(ParseWithTableResult { - result: Rc::new(ParseResult { - module: None, - error: r.err.clone(), - }), - intern_table: r.ctx.clone().intern_table.clone(), - }) + result: Rc::new(ParseResult { + module: None, + error: r.err.clone(), +}), + intern_table: r.ctx.clone().intern_table.clone(), +}) } else { Rc::new(ParseWithTableResult { - result: Rc::new(ParseResult { - module: Some(r.module.clone()), - error: None, - }), - intern_table: r.ctx.clone().intern_table.clone(), - }) + result: Rc::new(ParseResult { + module: Some(r.module.clone()), + error: None, +}), + intern_table: r.ctx.clone().intern_table.clone(), +}) } - } +} } -pub fn parse( - tokens: Rc>>, - source_indices: Rc>>, -) -> Rc { - parse_with_table(&tokens, source_indices, empty_intern_table()) - .result - .clone() +pub fn parse(tokens: Rc>>, source_indices: Rc>>) -> Rc { + parse_with_table(&tokens, source_indices, empty_intern_table()).result.clone() } pub fn parse_module(tokens: &Rc>>, ctx: &Rc) -> Rc { { let tokens = skip_newlines(tokens.clone()); - let start_span = token_span(tokens.clone().first().cloned()); - let r = expect( - &tokens, - &Rc::new(ExpectedToken::ExpectKeyword { - text: "module".to_string(), - }), - ); - if has_err(r.err.clone()) { +let start_span = token_span(tokens.clone().first().cloned()); +let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { + text: "module".to_string(), +})); +if has_err(r.err.clone()) { return Rc::new(ModuleResult { - module: module_node( - &"".to_string(), - Rc::new(vec![]), - Rc::new(vec![]), - &start_span, - ), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let tokens = r.tokens.clone(); - let r = parse_dotted_ident(tokens.clone()); - if has_err(r.err.clone()) { + module: module_node(&"".to_string(), Rc::new(vec![]), Rc::new(vec![]), &start_span), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let tokens = r.tokens.clone(); +let r = parse_dotted_ident(tokens.clone()); +if has_err(r.err.clone()) { return Rc::new(ModuleResult { - module: module_node( - &"".to_string(), - Rc::new(vec![]), - Rc::new(vec![]), - &start_span, - ), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let mod_name = r.name.clone(); - let mod_name_span = r.span.clone(); - let tokens = skip_newlines(r.tokens.clone()); - let r = parse_imports(tokens.clone(), ctx.clone()); - if has_err(r.err.clone()) { + module: module_node(&"".to_string(), Rc::new(vec![]), Rc::new(vec![]), &start_span), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let mod_name = r.name.clone(); +let mod_name_span = r.span.clone(); +let tokens = skip_newlines(r.tokens.clone()); +let r = parse_imports(tokens.clone(), ctx.clone()); +if has_err(r.err.clone()) { return Rc::new(ModuleResult { - module: module_node( - &"".to_string(), - Rc::new(vec![]), - Rc::new(vec![]), - &start_span, - ), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let imports = r.imports.clone(); - let tokens = r.tokens.clone(); - let ctx = r.ctx.clone(); - let r = parse_items(tokens.clone(), ctx.clone()); - if has_err(r.err.clone()) { + module: module_node(&"".to_string(), Rc::new(vec![]), Rc::new(vec![]), &start_span), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let imports = r.imports.clone(); +let tokens = r.tokens.clone(); +let ctx = r.ctx.clone(); +let r = parse_items(tokens.clone(), ctx.clone()); +if has_err(r.err.clone()) { return Rc::new(ModuleResult { - module: module_node( - &"".to_string(), - Rc::new(vec![]), - Rc::new(vec![]), - &start_span, - ), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let items = r.items.clone(); - let tokens = r.tokens.clone(); - let ctx = r.ctx.clone(); - let mod_ir = intern(&ctx.intern_table.clone(), &mod_name); - let ctx = Rc::new(ParseContext { - intern_table: mod_ir.table.clone(), - ..(*ctx.clone()).clone() - }); - let base_mod = Rc::new(Node { - name: mod_name.clone(), - span: start_span.clone(), - ident_span: Some(mod_name_span), - children: items, - connective: Connective::NoConnective, - params: imports, - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - let r#mod = Rc::new(Node { - ident: Some(mod_ir.id.clone()), - ..(*base_mod).clone() - }); - Rc::new(ModuleResult { - module: r#mod, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }) - } + module: module_node(&"".to_string(), Rc::new(vec![]), Rc::new(vec![]), &start_span), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let items = r.items.clone(); +let tokens = r.tokens.clone(); +let ctx = r.ctx.clone(); +let mod_ir = intern(&ctx.intern_table.clone(), &mod_name); +let ctx = Rc::new(ParseContext { intern_table: mod_ir.table.clone(), ..(*ctx.clone()).clone() }); +let base_mod = Rc::new(Node { + name: mod_name.clone(), + span: start_span.clone(), + ident_span: Some(mod_name_span), + children: items, + connective: Connective::NoConnective, + params: imports, + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +let r#mod = Rc::new(Node { ident: Some(mod_ir.id.clone()), ..(*base_mod).clone() }); +Rc::new(ModuleResult { + module: r#mod, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}) +} } pub fn parse_imports(tokens: Rc>>, ctx: Rc) -> Rc { parse_imports_acc(tokens, ctx, Rc::new(vec![])) } -pub fn parse_imports_acc( - mut tokens: Rc>>, - mut ctx: Rc, - mut acc: Rc>>, -) -> Rc { +pub fn parse_imports_acc(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { loop { tokens = skip_newlines(tokens.clone()); - if tok_is_keyword(tokens.clone().first().cloned(), "import".to_string()) { +if tok_is_keyword(tokens.clone().first().cloned(), "import".to_string()) { let r = parse_import(&tokens, &ctx); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(ImportsResult { - imports: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); + imports: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) } - { +{ let __tco_0 = r.tokens.clone(); - let __tco_1 = r.ctx.clone(); - let __tco_2 = v2_rt::rc_list_push(acc, r.import.clone()); - tokens = __tco_0; - ctx = __tco_1; - acc = __tco_2; - continue; - } - } else { +let __tco_1 = r.ctx.clone(); +let __tco_2 = v2_rt::rc_list_push(acc, r.import.clone()); +tokens = __tco_0; +ctx = __tco_1; +acc = __tco_2; +continue; +} +} else { break Rc::new(ImportsResult { - imports: acc, - tokens: tokens.clone(), - ctx: ctx, - err: None, - }); - } - } + imports: acc, + tokens: tokens.clone(), + ctx: ctx, + err: None, +}); +} +} } pub fn parse_items(tokens: Rc>>, ctx: Rc) -> Rc { parse_items_acc(tokens, ctx, Rc::new(vec![])) } -pub fn parse_items_acc( - mut tokens: Rc>>, - mut ctx: Rc, - mut acc: Rc>>, -) -> Rc { +pub fn parse_items_acc(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { loop { tokens = skip_newlines(tokens.clone()); - if tok_is_eof(tokens.clone().first().cloned()) { +if tok_is_eof(tokens.clone().first().cloned()) { break Rc::new(ItemsResult { - items: acc.clone(), - tokens: tokens.clone(), - ctx: ctx, - err: None, - }); - } else { + items: acc.clone(), + tokens: tokens.clone(), + ctx: ctx, + err: None, +}); +} else { let r = parse_item(&tokens, ctx); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(ItemsResult { - items: acc.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); + items: acc.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) } - { +{ let __tco_0 = r.tokens.clone(); - let __tco_1 = r.ctx.clone(); - let __tco_2 = v2_rt::rc_list_push(acc, r.item.clone()); - tokens = __tco_0; - ctx = __tco_1; - acc = __tco_2; - continue; - } - } - } +let __tco_1 = r.ctx.clone(); +let __tco_2 = v2_rt::rc_list_push(acc, r.item.clone()); +tokens = __tco_0; +ctx = __tco_1; +acc = __tco_2; +continue; +} +} +} } pub fn parse_import(tokens: &Rc>>, ctx: &Rc) -> Rc { { let start_span = token_span(tokens.clone().first().cloned()); - let err_import = import_node( - "".to_string(), - false, - Rc::new(vec![]), - &start_span, - start_span.clone(), - ); - let r = expect( - &tokens, - &Rc::new(ExpectedToken::ExpectKeyword { - text: "import".to_string(), - }), - ); - if has_err(r.err.clone()) { +let err_import = import_node("".to_string(), false, Rc::new(vec![]), &start_span, start_span.clone()); +let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { + text: "import".to_string(), +})); +if has_err(r.err.clone()) { return Rc::new(ImportResult { - import: err_import.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let tokens = r.tokens.clone(); - let r = parse_dotted_ident(tokens.clone()); - if has_err(r.err.clone()) { - return Rc::new(ImportResult { - import: err_import.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let mod_path = r.name.clone(); - let mod_path_span = r.span.clone(); - let tokens = r.tokens.clone(); - match (*eat(&tokens, Rc::new(ExpectedToken::ExpectLBrace))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let r = parse_import_names(__ec.clone(), ctx.clone()); - if has_err(r.err.clone()) { - return Rc::new(ImportResult { - import: err_import.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let names = r.names.clone(); - let tokens = r.tokens.clone(); - let ctx = r.ctx.clone(); - let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); - if has_err(r.err.clone()) { - return Rc::new(ImportResult { - import: err_import.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let tokens = skip_newlines(r.tokens.clone()); - let base_imp = - import_node(mod_path.clone(), false, names, &start_span, mod_path_span); - let imp_ir = intern(&ctx.intern_table.clone(), &mod_path); - let ctx = Rc::new(ParseContext { - intern_table: imp_ir.table.clone(), - ..(*ctx.clone()).clone() - }); - let imp = Rc::new(Node { - ident: Some(imp_ir.id.clone()), - ..(*base_imp).clone() - }); - Rc::new(ImportResult { - import: imp, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }) - } - EatResult::EatUnchanged { tokens: __eu, .. } => { - let tokens = skip_newlines(tokens.clone()); - let base_imp = import_node( - mod_path.clone(), - true, - Rc::new(vec![]), - &start_span, - mod_path_span, - ); - let imp_ir = intern(&ctx.intern_table.clone(), &mod_path); - let ctx = Rc::new(ParseContext { - intern_table: imp_ir.table.clone(), - ..(*ctx.clone()).clone() - }); - let imp = Rc::new(Node { - ident: Some(imp_ir.id.clone()), - ..(*base_imp).clone() - }); - Rc::new(ImportResult { - import: imp, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }) - } + import: err_import.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) } - } +let tokens = r.tokens.clone(); +let r = parse_dotted_ident(tokens.clone()); +if has_err(r.err.clone()) { + return Rc::new(ImportResult { + import: err_import.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let mod_path = r.name.clone(); +let mod_path_span = r.span.clone(); +let tokens = r.tokens.clone(); +match (*eat(&tokens, Rc::new(ExpectedToken::ExpectLBrace))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { + let r = parse_import_names(__ec.clone(), ctx.clone()); +if has_err(r.err.clone()) { + return Rc::new(ImportResult { + import: err_import.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let names = r.names.clone(); +let tokens = r.tokens.clone(); +let ctx = r.ctx.clone(); +let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); +if has_err(r.err.clone()) { + return Rc::new(ImportResult { + import: err_import.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let tokens = skip_newlines(r.tokens.clone()); +let base_imp = import_node(mod_path.clone(), false, names, &start_span, mod_path_span); +let imp_ir = intern(&ctx.intern_table.clone(), &mod_path); +let ctx = Rc::new(ParseContext { intern_table: imp_ir.table.clone(), ..(*ctx.clone()).clone() }); +let imp = Rc::new(Node { ident: Some(imp_ir.id.clone()), ..(*base_imp).clone() }); +Rc::new(ImportResult { + import: imp, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}) +}, + EatResult::EatUnchanged { tokens: __eu, .. } => { + let tokens = skip_newlines(tokens.clone()); +let base_imp = import_node(mod_path.clone(), true, Rc::new(vec![]), &start_span, mod_path_span); +let imp_ir = intern(&ctx.intern_table.clone(), &mod_path); +let ctx = Rc::new(ParseContext { intern_table: imp_ir.table.clone(), ..(*ctx.clone()).clone() }); +let imp = Rc::new(Node { ident: Some(imp_ir.id.clone()), ..(*base_imp).clone() }); +Rc::new(ImportResult { + import: imp, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}) +}, +} +} } pub fn parse_import_names(tokens: Rc>>, ctx: Rc) -> Rc { @@ -2351,72 +2045,60 @@ pub fn parsed_name_leaf(name: String, span: Rc) -> Rc { leaf_node_with_span(&name, &span) } -pub fn parse_import_names_acc( - mut tokens: Rc>>, - mut ctx: Rc, - mut acc: Rc>>, -) -> Rc { +pub fn parse_import_names_acc(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { loop { tokens = skip_newlines(tokens.clone()); - if tok_is_rbrace(tokens.clone().first().cloned()) { +if tok_is_rbrace(tokens.clone().first().cloned()) { break Rc::new(NamesResult { - names: acc, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }); - } else { + names: acc, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}); +} else { let r = parse_dotted_ident(tokens.clone()); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(NamesResult { - names: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let name_node = parsed_name_leaf(r.name.clone(), r.span.clone()); - tokens = skip_newlines(r.tokens.clone()); - let e = eat(&tokens, Rc::new(ExpectedToken::ExpectComma)); - tokens = skip_newlines(match (*e).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), - EatResult::EatUnchanged { .. } => tokens.clone(), - }); - { + names: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let name_node = parsed_name_leaf(r.name.clone(), r.span.clone()); +tokens = skip_newlines(r.tokens.clone()); +let e = eat(&tokens, Rc::new(ExpectedToken::ExpectComma)); +tokens = skip_newlines(match (*e).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), + EatResult::EatUnchanged { .. } => tokens.clone(), +}); +{ let __tco_0 = v2_rt::rc_list_push(acc, name_node); - acc = __tco_0; - continue; - } - } - } +acc = __tco_0; +continue; +} +} +} } pub fn find_item_form(forms: Rc>>, keyword: String) -> Option> { { - let matches = Rc::new({ - let mut __result = Vec::new(); - for f in forms.iter().cloned() { - if (f.keyword.clone().as_str() == keyword.clone().as_str()) { - __result.push(f); - } - } - __result - }); - match (matches.clone().len() as i64) { - 0 => None, - _ => Some(matches.clone().first().cloned().clone().unwrap()), - } - } + let matches = Rc::new({ let mut __result = Vec::new(); for f in forms.iter().cloned() { if (f.keyword.clone().as_str() == keyword.clone().as_str()) { __result.push(f); } } __result }); +match (matches.clone().len() as i64) { + 0 => None, + _ => Some(matches.clone().first().cloned().clone().unwrap()), +} +} } pub fn parse_item(tokens: &Rc>>, ctx: Rc) -> Rc { { let tokens = skip_newlines(tokens.clone()); - let tok = tokens.clone().first().cloned(); - let kw = tok_keyword_text(tok.clone()); - let span = token_span(tok.clone()); - let form = find_item_form(dag_syntax_spec().item_forms.clone(), kw); - match form { +let tok = tokens.clone().first().cloned(); +let kw = tok_keyword_text(tok.clone()); +let span = token_span(tok.clone()); +let form = find_item_form(dag_syntax_spec().item_forms.clone(), kw); +match form { Some(f) => parse_item_by_form(&tokens, &ctx, &f), None => Rc::new(ItemResult { item: Rc::new(Node { @@ -2444,1127 +2126,947 @@ pub fn parse_item(tokens: &Rc>>, ctx: Rc) -> Rc>>, - ctx: &Rc, - form: &Rc, -) -> Rc { +pub fn parse_item_prefix(tokens: &Rc>>, ctx: &Rc, form: &Rc) -> Rc { { let r = expect_ident(&tokens); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(ItemPrefixResult { - name: "".to_string(), - name_span: r.span.clone(), - type_params: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - uses: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let name = r.name.clone(); - let name_span = r.span.clone(); - let tokens = r.tokens.clone(); - let tp_result = if form.has_type_params.clone() { + name: "".to_string(), + name_span: r.span.clone(), + type_params: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + uses: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let name = r.name.clone(); +let name_span = r.span.clone(); +let tokens = r.tokens.clone(); +let tp_result = if form.has_type_params.clone() { parse_optional_type_params(&tokens, ctx.clone()) } else { Rc::new(TypeParamsResult { - params: Rc::new(vec![]), - tokens: tokens.clone(), - ctx: ctx.clone(), - }) + params: Rc::new(vec![]), + tokens: tokens.clone(), + ctx: ctx.clone(), +}) }; - let tokens = tp_result.tokens.clone(); - let ctx = tp_result.ctx.clone(); - let params_result = if form.has_params.clone() { +let tokens = tp_result.tokens.clone(); +let ctx = tp_result.ctx.clone(); +let params_result = if form.has_params.clone() { parse_params(&tokens, &ctx) } else { Rc::new(ParamsResult { - params: Rc::new(vec![]), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }) + params: Rc::new(vec![]), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}) }; - if has_err(params_result.err.clone()) { +if has_err(params_result.err.clone()) { return Rc::new(ItemPrefixResult { - name: name.clone(), - name_span: name_span.clone(), - type_params: tp_result.params.clone(), - params: Rc::new(vec![]), - inferred: None, - uses: Rc::new(vec![]), - tokens: params_result.tokens.clone(), - ctx: params_result.ctx.clone(), - err: params_result.err.clone(), - }); - } - let tokens = params_result.tokens.clone(); - let ctx = params_result.ctx.clone(); - let ret_result = if form.has_return_type.clone() { + name: name.clone(), + name_span: name_span.clone(), + type_params: tp_result.params.clone(), + params: Rc::new(vec![]), + inferred: None, + uses: Rc::new(vec![]), + tokens: params_result.tokens.clone(), + ctx: params_result.ctx.clone(), + err: params_result.err.clone(), +}) + } +let tokens = params_result.tokens.clone(); +let ctx = params_result.ctx.clone(); +let ret_result = if form.has_return_type.clone() { parse_optional_inferred(&tokens, ctx.clone()) } else { Rc::new(OptRetResult { - inferred: None, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }) + inferred: None, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}) }; - if has_err(ret_result.err.clone()) { +if has_err(ret_result.err.clone()) { return Rc::new(ItemPrefixResult { - name: name.clone(), - name_span: name_span.clone(), - type_params: tp_result.params.clone(), - params: params_result.params.clone(), - inferred: None, - uses: Rc::new(vec![]), - tokens: ret_result.tokens.clone(), - ctx: ret_result.ctx.clone(), - err: ret_result.err.clone(), - }); - } - let tokens = ret_result.tokens.clone(); - let ctx = ret_result.ctx.clone(); - let missing_required_ret = (form.return_required.clone() - && match ret_result.inferred.clone() { - Some(_) => false, - None => true, - }); - if missing_required_ret { + name: name.clone(), + name_span: name_span.clone(), + type_params: tp_result.params.clone(), + params: params_result.params.clone(), + inferred: None, + uses: Rc::new(vec![]), + tokens: ret_result.tokens.clone(), + ctx: ret_result.ctx.clone(), + err: ret_result.err.clone(), +}) + } +let tokens = ret_result.tokens.clone(); +let ctx = ret_result.ctx.clone(); +let missing_required_ret = (form.return_required.clone() && match ret_result.inferred.clone() { + Some(_) => false, + None => true, +}); +if missing_required_ret { return Rc::new(ItemPrefixResult { - name: name.clone(), - name_span: name_span.clone(), - type_params: tp_result.params.clone(), - params: params_result.params.clone(), - inferred: None, - uses: Rc::new(vec![]), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: Some(parse_error( - v2_rt::concat( - "expected return type annotation (-> Type) for '".to_string(), - v2_rt::concat( - form.keyword.clone(), - v2_rt::concat(" ".to_string(), name.clone()), - ), - ), - token_span(tokens.clone().first().cloned()), - )), - }); - } - let uses_result = if form.has_uses.clone() { + name: name.clone(), + name_span: name_span.clone(), + type_params: tp_result.params.clone(), + params: params_result.params.clone(), + inferred: None, + uses: Rc::new(vec![]), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: Some(parse_error(v2_rt::concat("expected return type annotation (-> Type) for '".to_string(), v2_rt::concat(form.keyword.clone(), v2_rt::concat(" ".to_string(), name.clone()))), token_span(tokens.clone().first().cloned()))), +}) + } +let uses_result = if form.has_uses.clone() { parse_uses_clause(&skip_newlines(tokens.clone()), ctx.clone()) } else { Rc::new(UsesResult { - uses: Rc::new(vec![]), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }) + uses: Rc::new(vec![]), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}) }; - if has_err(uses_result.err.clone()) { +if has_err(uses_result.err.clone()) { return Rc::new(ItemPrefixResult { - name: name.clone(), - name_span: name_span.clone(), - type_params: tp_result.params.clone(), - params: params_result.params.clone(), - inferred: ret_result.inferred.clone(), - uses: Rc::new(vec![]), - tokens: uses_result.tokens.clone(), - ctx: uses_result.ctx.clone(), - err: uses_result.err.clone(), - }); - } - Rc::new(ItemPrefixResult { - name: name.clone(), - name_span: name_span.clone(), - type_params: tp_result.params.clone(), - params: params_result.params.clone(), - inferred: ret_result.inferred.clone(), - uses: uses_result.uses.clone(), - tokens: uses_result.tokens.clone(), - ctx: uses_result.ctx.clone(), - err: None, - }) - } -} - -pub fn parse_item_by_form( - tokens: &Rc>>, - ctx: &Rc, - form: &Rc, -) -> Rc { + name: name.clone(), + name_span: name_span.clone(), + type_params: tp_result.params.clone(), + params: params_result.params.clone(), + inferred: ret_result.inferred.clone(), + uses: Rc::new(vec![]), + tokens: uses_result.tokens.clone(), + ctx: uses_result.ctx.clone(), + err: uses_result.err.clone(), +}) + } +Rc::new(ItemPrefixResult { + name: name.clone(), + name_span: name_span.clone(), + type_params: tp_result.params.clone(), + params: params_result.params.clone(), + inferred: ret_result.inferred.clone(), + uses: uses_result.uses.clone(), + tokens: uses_result.tokens.clone(), + ctx: uses_result.ctx.clone(), + err: None, +}) +} +} + +pub fn parse_item_by_form(tokens: &Rc>>, ctx: &Rc, form: &Rc) -> Rc { { let start_span = token_span(tokens.clone().first().cloned()); - let dummy = Rc::new(Node { - name: "".to_string(), - span: start_span.clone(), - ident_span: None, - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - let r = expect( - &tokens, - &Rc::new(ExpectedToken::ExpectKeyword { - text: form.keyword.clone(), - }), - ); - if has_err(r.err.clone()) { +let dummy = Rc::new(Node { + name: "".to_string(), + span: start_span.clone(), + ident_span: None, + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { + text: form.keyword.clone(), +})); +if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: dummy.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let tokens = r.tokens.clone(); - match form.body_kind.clone() { - BodyKind::TypeBody => { - let prefix = parse_item_prefix(&tokens, &ctx, &form); - if has_err(prefix.err.clone()) { - return Rc::new(ItemResult { - item: dummy.clone(), - tokens: prefix.tokens.clone(), - ctx: prefix.ctx.clone(), - err: prefix.err.clone(), - }); - } - parse_type_body_from_prefix(&prefix, &start_span) - } - BodyKind::ExprBody => { - let prefix = parse_item_prefix(&tokens, &ctx, &form); - if has_err(prefix.err.clone()) { - return Rc::new(ItemResult { - item: dummy.clone(), - tokens: prefix.tokens.clone(), - ctx: prefix.ctx.clone(), - err: prefix.err.clone(), - }); - } - parse_fn_body_from_prefix(&prefix, &start_span) - } - BodyKind::BlockBody => { - let prefix = parse_item_prefix(&tokens, &ctx, &form); - if has_err(prefix.err.clone()) { - return Rc::new(ItemResult { - item: dummy.clone(), - tokens: prefix.tokens.clone(), - ctx: prefix.ctx.clone(), - err: prefix.err.clone(), - }); - } - parse_block_body_from_prefix(&prefix, &start_span) - } - BodyKind::ServiceBody => parse_service_after_kw(&tokens, &ctx, &start_span), - BodyKind::ResourceBody => parse_resource_after_kw(tokens.clone(), &ctx, &start_span), - BodyKind::ValueBody => parse_data_after_kw(tokens.clone(), &ctx, &start_span), - BodyKind::NoBody => { - let prefix = parse_item_prefix(&tokens, &ctx, &form); - if has_err(prefix.err.clone()) { - return Rc::new(ItemResult { - item: dummy.clone(), - tokens: prefix.tokens.clone(), - ctx: prefix.ctx.clone(), - err: prefix.err.clone(), - }); - } - parse_no_body_from_prefix(&prefix, start_span.clone()) - } - } - } -} - -pub fn field_to_child_node( - field: &Rc, - source_indices: &Rc>>, -) -> Rc { + item: dummy.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let tokens = r.tokens.clone(); +match form.body_kind.clone() { + BodyKind::TypeBody => { + let prefix = parse_item_prefix(&tokens, &ctx, &form); +if has_err(prefix.err.clone()) { + return Rc::new(ItemResult { + item: dummy.clone(), + tokens: prefix.tokens.clone(), + ctx: prefix.ctx.clone(), + err: prefix.err.clone(), +}) + } +parse_type_body_from_prefix(&prefix, &start_span) +}, + BodyKind::ExprBody => { + let prefix = parse_item_prefix(&tokens, &ctx, &form); +if has_err(prefix.err.clone()) { + return Rc::new(ItemResult { + item: dummy.clone(), + tokens: prefix.tokens.clone(), + ctx: prefix.ctx.clone(), + err: prefix.err.clone(), +}) + } +parse_fn_body_from_prefix(&prefix, &start_span) +}, + BodyKind::BlockBody => { + let prefix = parse_item_prefix(&tokens, &ctx, &form); +if has_err(prefix.err.clone()) { + return Rc::new(ItemResult { + item: dummy.clone(), + tokens: prefix.tokens.clone(), + ctx: prefix.ctx.clone(), + err: prefix.err.clone(), +}) + } +parse_block_body_from_prefix(&prefix, &start_span) +}, + BodyKind::ServiceBody => parse_service_after_kw(&tokens, &ctx, &start_span), + BodyKind::ResourceBody => parse_resource_after_kw(tokens.clone(), &ctx, &start_span), + BodyKind::ValueBody => parse_data_after_kw(tokens.clone(), &ctx, &start_span), + BodyKind::NoBody => { + let prefix = parse_item_prefix(&tokens, &ctx, &form); +if has_err(prefix.err.clone()) { + return Rc::new(ItemResult { + item: dummy.clone(), + tokens: prefix.tokens.clone(), + ctx: prefix.ctx.clone(), + err: prefix.err.clone(), +}) + } +parse_no_body_from_prefix(&prefix, start_span.clone()) +}, +} +} +} + +pub fn field_to_child_node(field: &Rc, source_indices: &Rc>>) -> Rc { { let ret_type = field_node_type_expr(&field); - let props = match field_node_from_key(field.clone(), source_indices.clone()) { - Some(key) => Rc::new(vec![make_field_init_node( - &"from_key".to_string(), - make_expr_node( - Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitStr { value: key.clone() }), - }), - Rc::new(vec![]), - None, - field.span.clone(), - ), - field.span.clone(), - no_span(), - )]), - None => Rc::new(vec![]), - }; - Rc::new(Node { - name: field_node_name_at(field.clone(), source_indices.clone()), - span: field.span.clone(), - ident_span: field.ident_span.clone(), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::Resolved { node: ret_type })), - return_cardinality: field_node_cardinality(field.clone()), - uses: Rc::new(vec![]), - body: field_node_default_value(&field), - transport: None, - properties: props, - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }) - } +let props = match field_node_from_key(field.clone(), source_indices.clone()) { + Some(key) => Rc::new(vec![make_field_init_node(&"from_key".to_string(), make_expr_node(Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitStr { + value: key.clone(), +}), +}), Rc::new(vec![]), None, field.span.clone()), field.span.clone(), no_span())]), + None => Rc::new(vec![]), +}; +Rc::new(Node { + name: field_node_name_at(field.clone(), source_indices.clone()), + span: field.span.clone(), + ident_span: field.ident_span.clone(), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::Resolved { + node: ret_type, +})), + return_cardinality: field_node_cardinality(field.clone()), + uses: Rc::new(vec![]), + body: field_node_default_value(&field), + transport: None, + properties: props, + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}) +} } -pub fn variant_to_child_node( - variant: &Rc, - source_indices: &Rc>>, -) -> Rc { +pub fn variant_to_child_node(variant: &Rc, source_indices: &Rc>>) -> Rc { { let fields = variant_node_fields(variant.clone()); - let children = Rc::new({ - let mut __result = Vec::new(); - for f in fields.clone().iter().cloned() { - __result.push(field_to_child_node(&f, &source_indices)); - } - __result - }); - Rc::new(Node { - name: variant_node_name_at(variant.clone(), source_indices.clone()), - span: variant.span.clone(), - ident_span: variant.ident_span.clone(), - children: children, - connective: if ((fields.clone().len() as i64) > 0) { - Connective::Conj - } else { - Connective::NoConnective - }, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }) - } +let children = Rc::new({ let mut __result = Vec::new(); for f in fields.clone().iter().cloned() { __result.push(field_to_child_node(&f, &source_indices)); } __result }); +Rc::new(Node { + name: variant_node_name_at(variant.clone(), source_indices.clone()), + span: variant.span.clone(), + ident_span: variant.ident_span.clone(), + children: children, + connective: if ((fields.clone().len() as i64) > 0) { + Connective::Conj + } else { + Connective::NoConnective + }, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}) +} } -pub fn outputs_to_inferred( - outputs: &Rc>>, - span: Rc, - source_indices: Rc>>, -) -> Option> { +pub fn outputs_to_inferred(outputs: &Rc>>, span: Rc, source_indices: Rc>>) -> Option> { if ((outputs.clone().len() as i64) > 0) { Some(Rc::new(InferredNode::Resolved { - node: Rc::new(Node { - name: "".to_string(), - span: span, - ident_span: None, - children: Rc::new({ - let mut __result = Vec::new(); - for f in outputs.clone().iter().cloned() { - __result.push(field_to_child_node(&f, &source_indices)); - } - __result - }), - connective: Connective::Conj, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }), - })) + node: Rc::new(Node { + name: "".to_string(), + span: span, + ident_span: None, + children: Rc::new({ let mut __result = Vec::new(); for f in outputs.clone().iter().cloned() { __result.push(field_to_child_node(&f, &source_indices)); } __result }), + connective: Connective::Conj, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}), +})) } else { None } } -pub fn make_operation_node( - name: String, - ident_span: Option>, - inputs: Rc>>, - outputs: Rc>>, - response_props: Rc>>, - mock_props: Rc>>, - exit_props: Rc>>, - modifier_props: Rc>>, - transport: Option>, - span: &Rc, - source_indices: &Rc>>, -) -> Rc { +pub fn make_operation_node(name: String, ident_span: Option>, inputs: Rc>>, outputs: Rc>>, response_props: Rc>>, mock_props: Rc>>, exit_props: Rc>>, modifier_props: Rc>>, transport: Option>, span: &Rc, source_indices: &Rc>>) -> Rc { { - let all_props = v2_rt::concat( - v2_rt::concat(v2_rt::concat(modifier_props, response_props), exit_props), - mock_props, - ); - Rc::new(Node { - name: name, - span: span.clone(), - ident_span: ident_span, - children: Rc::new(vec![]), - params: Rc::new({ - let mut __result = Vec::new(); - for f in inputs.iter().cloned() { - __result.push(make_param_node( - &field_node_name_at(f.clone(), source_indices.clone()), - field_node_type_expr(&f), - field_node_default_value(&f), - f.span.clone(), - node_name_span(&f), - )); - } - __result - }), - inferred: outputs_to_inferred(&outputs, span.clone(), source_indices.clone()), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: transport, - properties: all_props, - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }) - } + let all_props = v2_rt::concat(v2_rt::concat(v2_rt::concat(modifier_props, response_props), exit_props), mock_props); +Rc::new(Node { + name: name, + span: span.clone(), + ident_span: ident_span, + children: Rc::new(vec![]), + params: Rc::new({ let mut __result = Vec::new(); for f in inputs.iter().cloned() { __result.push(make_param_node(&field_node_name_at(f.clone(), source_indices.clone()), field_node_type_expr(&f), field_node_default_value(&f), f.span.clone(), node_name_span(&f))); } __result }), + inferred: outputs_to_inferred(&outputs, span.clone(), source_indices.clone()), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: transport, + properties: all_props, + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}) +} } -pub fn make_capability_node( - name: String, - ident_span: Option>, - inputs: Rc>>, - outputs: Rc>>, - span: &Rc, - source_indices: &Rc>>, -) -> Rc { +pub fn make_capability_node(name: String, ident_span: Option>, inputs: Rc>>, outputs: Rc>>, span: &Rc, source_indices: &Rc>>) -> Rc { Rc::new(Node { - name: name, - span: span.clone(), - ident_span: ident_span, - children: Rc::new(vec![]), - params: Rc::new({ - let mut __result = Vec::new(); - for f in inputs.iter().cloned() { - __result.push(make_param_node( - &field_node_name_at(f.clone(), source_indices.clone()), - field_node_type_expr(&f), - field_node_default_value(&f), - f.span.clone(), - node_name_span(&f), - )); - } - __result - }), - inferred: outputs_to_inferred(&outputs, span.clone(), source_indices.clone()), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }) + name: name, + span: span.clone(), + ident_span: ident_span, + children: Rc::new(vec![]), + params: Rc::new({ let mut __result = Vec::new(); for f in inputs.iter().cloned() { __result.push(make_param_node(&field_node_name_at(f.clone(), source_indices.clone()), field_node_type_expr(&f), field_node_default_value(&f), f.span.clone(), node_name_span(&f))); } __result }), + inferred: outputs_to_inferred(&outputs, span.clone(), source_indices.clone()), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}) } pub fn parse_type_def(tokens: &Rc>>, ctx: &Rc) -> Rc { { let start_span = token_span(tokens.clone().first().cloned()); - let dummy = Rc::new(Node { - name: "".to_string(), - span: start_span.clone(), - ident_span: None, - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - let r = expect( - &tokens, - &Rc::new(ExpectedToken::ExpectKeyword { - text: "type".to_string(), - }), - ); - if has_err(r.err.clone()) { +let dummy = Rc::new(Node { + name: "".to_string(), + span: start_span.clone(), + ident_span: None, + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { + text: "type".to_string(), +})); +if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: dummy, - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); + item: dummy, + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) } - parse_type_after_kw(&r.tokens.clone(), &ctx, &start_span) - } +parse_type_after_kw(&r.tokens.clone(), &ctx, &start_span) +} } -pub fn parse_type_after_kw( - tokens: &Rc>>, - ctx: &Rc, - start_span: &Rc, -) -> Rc { +pub fn parse_type_after_kw(tokens: &Rc>>, ctx: &Rc, start_span: &Rc) -> Rc { { let dummy = Rc::new(Node { - name: "".to_string(), - span: start_span.clone(), - ident_span: None, - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - let r = expect_ident(&tokens); - if has_err(r.err.clone()) { + name: "".to_string(), + span: start_span.clone(), + ident_span: None, + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +let r = expect_ident(&tokens); +if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: dummy, - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let name = r.name.clone(); - let name_span = r.span.clone(); - let tokens = r.tokens.clone(); - let type_params_result = parse_optional_type_params(&tokens, ctx.clone()); - let type_params = type_params_result.params.clone(); - let tokens = skip_newlines(type_params_result.tokens.clone()); - let ctx = type_params_result.ctx.clone(); - let tokens = type_body_tokens_after_modifiers(tokens.clone()); - match (*eat(&tokens, Rc::new(ExpectedToken::ExpectLBrace))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let r = parse_field_list(skip_newlines(__ec.clone()), ctx.clone()); - let named_dummy = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: Rc::new(vec![]), - params: type_params.clone(), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - if has_err(r.err.clone()) { - return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let tokens = skip_newlines(r.tokens.clone()); - let ctx = r.ctx.clone(); - let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); - if has_err(r2.err.clone()) { - return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), - }); - } - let type_children = Rc::new({ - let mut __result = Vec::new(); - for f in r.fields.clone().iter().cloned() { - __result.push(field_to_child_node(&f, &ctx.source_indices.clone())); - } - __result - }); - let item = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: type_children, - connective: Connective::Conj, - params: type_params.clone(), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - Rc::new(ItemResult { - item: item, - tokens: skip_newlines(r2.tokens.clone()), - ctx: ctx.clone(), - err: None, - }) - } - EatResult::EatUnchanged { tokens: __eu, .. } => { - match (*eat(&tokens, Rc::new(ExpectedToken::ExpectEq))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let tokens = skip_newlines(__ec.clone()); - parse_type_body_after_eq( - &tokens, - &ctx, - &name, - &name_span, - &start_span, - &type_params, - ) - } - EatResult::EatUnchanged { tokens: __eu, .. } => { - let item = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: type_params.clone(), - inferred: Some(Rc::new(InferredNode::Resolved { - node: leaf_type_node(&name, &name_span), - })), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - Rc::new(ItemResult { - item: item, - tokens: __eu.clone(), - ctx: ctx.clone(), - err: None, - }) - } - } - } - } - } + item: dummy, + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let name = r.name.clone(); +let name_span = r.span.clone(); +let tokens = r.tokens.clone(); +let type_params_result = parse_optional_type_params(&tokens, ctx.clone()); +let type_params = type_params_result.params.clone(); +let tokens = skip_newlines(type_params_result.tokens.clone()); +let ctx = type_params_result.ctx.clone(); +let tokens = type_body_tokens_after_modifiers(tokens.clone()); +match (*eat(&tokens, Rc::new(ExpectedToken::ExpectLBrace))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { + let r = parse_field_list(skip_newlines(__ec.clone()), ctx.clone()); +let named_dummy = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: Rc::new(vec![]), + params: type_params.clone(), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +if has_err(r.err.clone()) { + return Rc::new(ItemResult { + item: named_dummy.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let tokens = skip_newlines(r.tokens.clone()); +let ctx = r.ctx.clone(); +let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); +if has_err(r2.err.clone()) { + return Rc::new(ItemResult { + item: named_dummy.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), +}) + } +let type_children = Rc::new({ let mut __result = Vec::new(); for f in r.fields.clone().iter().cloned() { __result.push(field_to_child_node(&f, &ctx.source_indices.clone())); } __result }); +let item = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: type_children, + connective: Connective::Conj, + params: type_params.clone(), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +Rc::new(ItemResult { + item: item, + tokens: skip_newlines(r2.tokens.clone()), + ctx: ctx.clone(), + err: None, +}) +}, + EatResult::EatUnchanged { tokens: __eu, .. } => match (*eat(&tokens, Rc::new(ExpectedToken::ExpectEq))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { + let tokens = skip_newlines(__ec.clone()); +parse_type_body_after_eq(&tokens, &ctx, &name, &name_span, &start_span, &type_params) +}, + EatResult::EatUnchanged { tokens: __eu, .. } => { + let item = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: type_params.clone(), + inferred: Some(Rc::new(InferredNode::Resolved { + node: leaf_type_node(&name, &name_span), +})), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +Rc::new(ItemResult { + item: item, + tokens: __eu.clone(), + ctx: ctx.clone(), + err: None, +}) +}, +}, +} +} } -pub fn parse_type_body_from_prefix( - prefix: &Rc, - start_span: &Rc, -) -> Rc { +pub fn parse_type_body_from_prefix(prefix: &Rc, start_span: &Rc) -> Rc { { let name = prefix.name.clone(); - let name_span = prefix.name_span.clone(); - let type_params = prefix.type_params.clone(); - let ctx = prefix.ctx.clone(); - let named_dummy = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: Rc::new(vec![]), - params: type_params.clone(), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - let tokens = type_body_tokens_after_modifiers(skip_newlines(prefix.tokens.clone())); - match (*eat(&tokens, Rc::new(ExpectedToken::ExpectLBrace))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let r = parse_field_list(skip_newlines(__ec.clone()), ctx.clone()); - if has_err(r.err.clone()) { - return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let tokens = skip_newlines(r.tokens.clone()); - let ctx = r.ctx.clone(); - let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); - if has_err(r2.err.clone()) { - return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), - }); - } - let type_children = Rc::new({ - let mut __result = Vec::new(); - for f in r.fields.clone().iter().cloned() { - __result.push(field_to_child_node(&f, &ctx.source_indices.clone())); - } - __result - }); - let item = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: type_children, - connective: Connective::Conj, - params: type_params.clone(), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - Rc::new(ItemResult { - item: item, - tokens: skip_newlines(r2.tokens.clone()), - ctx: ctx.clone(), - err: None, - }) - } - EatResult::EatUnchanged { tokens: __eu, .. } => { - match (*eat(&tokens, Rc::new(ExpectedToken::ExpectEq))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let tokens = skip_newlines(__ec.clone()); - parse_type_body_after_eq( - &tokens, - &ctx, - &name, - &name_span, - &start_span, - &type_params, - ) - } - EatResult::EatUnchanged { tokens: __eu, .. } => { - let item = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: type_params.clone(), - inferred: Some(Rc::new(InferredNode::Resolved { - node: leaf_type_node(&name, &name_span), - })), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - Rc::new(ItemResult { - item: item, - tokens: __eu.clone(), - ctx: ctx.clone(), - err: None, - }) - } - } - } - } - } +let name_span = prefix.name_span.clone(); +let type_params = prefix.type_params.clone(); +let ctx = prefix.ctx.clone(); +let named_dummy = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: Rc::new(vec![]), + params: type_params.clone(), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +let tokens = type_body_tokens_after_modifiers(skip_newlines(prefix.tokens.clone())); +match (*eat(&tokens, Rc::new(ExpectedToken::ExpectLBrace))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { + let r = parse_field_list(skip_newlines(__ec.clone()), ctx.clone()); +if has_err(r.err.clone()) { + return Rc::new(ItemResult { + item: named_dummy.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let tokens = skip_newlines(r.tokens.clone()); +let ctx = r.ctx.clone(); +let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); +if has_err(r2.err.clone()) { + return Rc::new(ItemResult { + item: named_dummy.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), +}) + } +let type_children = Rc::new({ let mut __result = Vec::new(); for f in r.fields.clone().iter().cloned() { __result.push(field_to_child_node(&f, &ctx.source_indices.clone())); } __result }); +let item = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: type_children, + connective: Connective::Conj, + params: type_params.clone(), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +Rc::new(ItemResult { + item: item, + tokens: skip_newlines(r2.tokens.clone()), + ctx: ctx.clone(), + err: None, +}) +}, + EatResult::EatUnchanged { tokens: __eu, .. } => match (*eat(&tokens, Rc::new(ExpectedToken::ExpectEq))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { + let tokens = skip_newlines(__ec.clone()); +parse_type_body_after_eq(&tokens, &ctx, &name, &name_span, &start_span, &type_params) +}, + EatResult::EatUnchanged { tokens: __eu, .. } => { + let item = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: type_params.clone(), + inferred: Some(Rc::new(InferredNode::Resolved { + node: leaf_type_node(&name, &name_span), +})), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +Rc::new(ItemResult { + item: item, + tokens: __eu.clone(), + ctx: ctx.clone(), + err: None, +}) +}, +}, +} +} } -pub fn parse_type_body_after_eq( - tokens: &Rc>>, - ctx: &Rc, - name: &String, - name_span: &Rc, - start_span: &Rc, - type_params: &Rc>>, -) -> Rc { +pub fn parse_type_body_after_eq(tokens: &Rc>>, ctx: &Rc, name: &String, name_span: &Rc, start_span: &Rc, type_params: &Rc>>) -> Rc { { let dummy = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: Rc::new(vec![]), - params: type_params.clone(), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - if tok_is_ident(tokens.clone().first().cloned()) { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: Rc::new(vec![]), + params: type_params.clone(), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +if tok_is_ident(tokens.clone().first().cloned()) { { let r = expect_ident(&tokens); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: dummy.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); + item: dummy.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) } - let first_name = r.name.clone(); - let first_name_span = r.span.clone(); - let tokens = skip_newlines(r.tokens.clone()); - if (tok_is_lbrace(tokens.clone().first().cloned()) - || tok_is_pipe(tokens.clone().first().cloned())) - { +let first_name = r.name.clone(); +let first_name_span = r.span.clone(); +let tokens = skip_newlines(r.tokens.clone()); +if (tok_is_lbrace(tokens.clone().first().cloned()) || tok_is_pipe(tokens.clone().first().cloned())) { { - let r = parse_variant_fields( - &tokens, - ctx.clone(), - &first_name, - &first_name_span, - ); - if has_err(r.err.clone()) { + let r = parse_variant_fields(&tokens, ctx.clone(), &first_name, &first_name_span); +if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: dummy.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); + item: dummy.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) } - let first_variant = r.variant.clone(); - let rest = parse_more_variants_acc( - r.tokens.clone(), - r.ctx.clone(), - Rc::new(vec![first_variant]), - ); - if has_err(rest.err.clone()) { +let first_variant = r.variant.clone(); +let rest = parse_more_variants_acc(r.tokens.clone(), r.ctx.clone(), Rc::new(vec![first_variant])); +if has_err(rest.err.clone()) { return Rc::new(ItemResult { - item: dummy.clone(), - tokens: rest.tokens.clone(), - ctx: rest.ctx.clone(), - err: rest.err.clone(), - }); + item: dummy.clone(), + tokens: rest.tokens.clone(), + ctx: rest.ctx.clone(), + err: rest.err.clone(), +}) } - let variants = rest.variants.clone(); - let type_children = Rc::new({ - let mut __result = Vec::new(); - for v in variants.iter().cloned() { - __result - .push(variant_to_child_node(&v, &ctx.source_indices.clone())); - } - __result - }); - let item = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: type_children, - connective: Connective::Disj, - params: type_params.clone(), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - Rc::new(ItemResult { - item: item, - tokens: skip_newlines(rest.tokens.clone()), - ctx: rest.ctx.clone(), - err: None, - }) - } +let variants = rest.variants.clone(); +let type_children = Rc::new({ let mut __result = Vec::new(); for v in variants.iter().cloned() { __result.push(variant_to_child_node(&v, &ctx.source_indices.clone())); } __result }); +let item = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: type_children, + connective: Connective::Disj, + params: type_params.clone(), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +Rc::new(ItemResult { + item: item, + tokens: skip_newlines(rest.tokens.clone()), + ctx: rest.ctx.clone(), + err: None, +}) +} } else { { - let r = finish_type_expr_from_name( - &tokens, - ctx.clone(), - &first_name, - &first_name_span, - ); - if has_err(r.err.clone()) { + let r = finish_type_expr_from_name(&tokens, ctx.clone(), &first_name, &first_name_span); +if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: dummy.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); + item: dummy.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) } - let wr = try_where_clause( - &r.tokens.clone(), - r.ctx.clone(), - &r.type_expr.clone(), - &start_span, - ); - if has_err(wr.err.clone()) { +let wr = try_where_clause(&r.tokens.clone(), r.ctx.clone(), &r.type_expr.clone(), &start_span); +if has_err(wr.err.clone()) { return Rc::new(ItemResult { - item: dummy.clone(), - tokens: wr.tokens.clone(), - ctx: wr.ctx.clone(), - err: wr.err.clone(), - }); + item: dummy.clone(), + tokens: wr.tokens.clone(), + ctx: wr.ctx.clone(), + err: wr.err.clone(), +}) } - let item = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: type_params.clone(), - inferred: Some(Rc::new(InferredNode::Resolved { - node: wr.type_expr.clone(), - })), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - Rc::new(ItemResult { - item: item, - tokens: skip_newlines(wr.tokens.clone()), - ctx: wr.ctx.clone(), - err: None, - }) - } +let item = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: type_params.clone(), + inferred: Some(Rc::new(InferredNode::Resolved { + node: wr.type_expr.clone(), +})), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +Rc::new(ItemResult { + item: item, + tokens: skip_newlines(wr.tokens.clone()), + ctx: wr.ctx.clone(), + err: None, +}) +} } - } +} } else { { let r = parse_type_expr(&tokens, &ctx); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: dummy.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let wr = try_where_clause( - &r.tokens.clone(), - r.ctx.clone(), - &r.type_expr.clone(), - &start_span, - ); - if has_err(wr.err.clone()) { + item: dummy.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let wr = try_where_clause(&r.tokens.clone(), r.ctx.clone(), &r.type_expr.clone(), &start_span); +if has_err(wr.err.clone()) { return Rc::new(ItemResult { - item: dummy.clone(), - tokens: wr.tokens.clone(), - ctx: wr.ctx.clone(), - err: wr.err.clone(), - }); - } - let item = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: type_params.clone(), - inferred: Some(Rc::new(InferredNode::Resolved { - node: wr.type_expr.clone(), - })), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - Rc::new(ItemResult { - item: item, - tokens: skip_newlines(wr.tokens.clone()), - ctx: wr.ctx.clone(), - err: None, - }) - } + item: dummy.clone(), + tokens: wr.tokens.clone(), + ctx: wr.ctx.clone(), + err: wr.err.clone(), +}) + } +let item = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: type_params.clone(), + inferred: Some(Rc::new(InferredNode::Resolved { + node: wr.type_expr.clone(), +})), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +Rc::new(ItemResult { + item: item, + tokens: skip_newlines(wr.tokens.clone()), + ctx: wr.ctx.clone(), + err: None, +}) +} } - } +} } -pub fn try_where_clause( - tokens: &Rc>>, - ctx: Rc, - base_te: &Rc, - start_span: &Rc, -) -> Rc { +pub fn try_where_clause(tokens: &Rc>>, ctx: Rc, base_te: &Rc, start_span: &Rc) -> Rc { if tok_is_keyword(tokens.clone().first().cloned(), "where".to_string()) { match (*advance(&tokens)).clone() { - AdvanceResult::AdvanceOk { tokens: rest, .. } => { - let r = parse_predicates(rest.clone(), ctx); - if has_err(r.err.clone()) { - return Rc::new(TypeResult { - type_expr: base_te.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let predicate_node = Rc::new(Node { - name: "".to_string(), - span: start_span.clone(), - ident_span: None, - children: r.predicates.clone(), - connective: Connective::Conj, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - let refined = Rc::new(Node { - name: "".to_string(), - span: start_span.clone(), - ident_span: None, - children: Rc::new(vec![base_te.clone()]), - connective: Connective::Conj, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: Some(predicate_node), - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - Rc::new(TypeResult { - type_expr: refined, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) - } - AdvanceResult::AdvanceEof => Rc::new(TypeResult { - type_expr: base_te.clone(), - tokens: tokens.clone(), - ctx: ctx, - err: None, - }), - } + AdvanceResult::AdvanceOk { tokens: rest, .. } => { + let r = parse_predicates(rest.clone(), ctx); +if has_err(r.err.clone()) { + return Rc::new(TypeResult { + type_expr: base_te.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let predicate_node = Rc::new(Node { + name: "".to_string(), + span: start_span.clone(), + ident_span: None, + children: r.predicates.clone(), + connective: Connective::Conj, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +let refined = Rc::new(Node { + name: "".to_string(), + span: start_span.clone(), + ident_span: None, + children: Rc::new(vec![base_te.clone()]), + connective: Connective::Conj, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: Some(predicate_node), + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +Rc::new(TypeResult { + type_expr: refined, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +}, + AdvanceResult::AdvanceEof => Rc::new(TypeResult { + type_expr: base_te.clone(), + tokens: tokens.clone(), + ctx: ctx, + err: None, +}), +} } else { Rc::new(TypeResult { - type_expr: base_te.clone(), - tokens: tokens.clone(), - ctx: ctx, - err: None, - }) + type_expr: base_te.clone(), + tokens: tokens.clone(), + ctx: ctx, + err: None, +}) } } @@ -3572,1005 +3074,757 @@ pub fn parse_predicates(tokens: Rc>>, ctx: Rc) -> Rc parse_predicates_acc(tokens, ctx, Rc::new(vec![])) } -pub fn parse_predicates_acc( - mut tokens: Rc>>, - mut ctx: Rc, - mut acc: Rc>>, -) -> Rc { +pub fn parse_predicates_acc(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { loop { let r = parse_single_predicate(&tokens, &ctx); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(PredsResult { - predicates: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - acc = v2_rt::rc_list_push(acc.clone(), r.predicate.clone()); - match (*eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let __tco_0 = skip_newlines(__ec.clone()); - let __tco_1 = r.ctx.clone(); - tokens = __tco_0; - ctx = __tco_1; - continue; - } - EatResult::EatUnchanged { tokens: __eu, .. } => { - break Rc::new(PredsResult { - predicates: acc.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }); - } - } - } -} - -pub fn parse_single_predicate( - tokens: &Rc>>, - ctx: &Rc, -) -> Rc { + predicates: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +acc = v2_rt::rc_list_push(acc.clone(), r.predicate.clone()); +match (*eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { { + let __tco_0 = skip_newlines(__ec.clone()); +let __tco_1 = r.ctx.clone(); +tokens = __tco_0; +ctx = __tco_1; +continue; +} }, + EatResult::EatUnchanged { tokens: __eu, .. } => { break Rc::new(PredsResult { + predicates: acc.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}); }, +} +} +} + +pub fn parse_single_predicate(tokens: &Rc>>, ctx: &Rc) -> Rc { { let zero_span = make_span(0, 0); - let dummy_pred = make_field_init_node( - &"".to_string(), - make_expr_node( - Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitBool { value: false }), - }), - Rc::new(vec![]), - None, - zero_span.clone(), - ), - zero_span.clone(), - zero_span.clone(), - ); - let r = expect_name(&tokens); - if has_err(r.err.clone()) { +let dummy_pred = make_field_init_node(&"".to_string(), make_expr_node(Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitBool { + value: false, +}), +}), Rc::new(vec![]), None, zero_span.clone()), zero_span.clone(), zero_span.clone()); +let r = expect_name(&tokens); +if has_err(r.err.clone()) { return Rc::new(PredResult { - predicate: dummy_pred.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let pred_name = r.name.clone(); - let tokens = r.tokens.clone(); - match (*eat(&tokens, Rc::new(ExpectedToken::ExpectLParen))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let tokens = __ec.clone(); - match pred_name.clone().as_str() { - "pattern" => { - let r2 = parse_string_literal_value(&tokens); - if has_err(r2.err.clone()) { - return Rc::new(PredResult { - predicate: dummy_pred.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), - }); - } - let r3 = expect(&r2.tokens.clone(), &Rc::new(ExpectedToken::ExpectRParen)); - if has_err(r3.err.clone()) { - return Rc::new(PredResult { - predicate: dummy_pred.clone(), - tokens: r3.tokens.clone(), - ctx: ctx.clone(), - err: r3.err.clone(), - }); - } - Rc::new(PredResult { - predicate: make_field_init_node( - &"Pattern".to_string(), - make_expr_node( - Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitStr { - value: r2.value.clone(), - }), - }), - Rc::new(vec![]), - None, - zero_span.clone(), - ), - zero_span.clone(), - zero_span.clone(), - ), - tokens: r3.tokens.clone(), - ctx: ctx.clone(), - err: None, - }) - } - "format" => { - let r2 = expect_ident(&tokens); - if has_err(r2.err.clone()) { - return Rc::new(PredResult { - predicate: dummy_pred.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), - }); - } - let r3 = expect(&r2.tokens.clone(), &Rc::new(ExpectedToken::ExpectRParen)); - if has_err(r3.err.clone()) { - return Rc::new(PredResult { - predicate: dummy_pred.clone(), - tokens: r3.tokens.clone(), - ctx: ctx.clone(), - err: r3.err.clone(), - }); - } - Rc::new(PredResult { - predicate: make_field_init_node( - &"Format".to_string(), - make_expr_node( - Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitStr { - value: r2.name.clone(), - }), - }), - Rc::new(vec![]), - None, - zero_span.clone(), - ), - zero_span.clone(), - zero_span.clone(), - ), - tokens: r3.tokens.clone(), - ctx: ctx.clone(), - err: None, - }) - } - "brand" => { - let r2 = parse_string_literal_value(&tokens); - if has_err(r2.err.clone()) { - return Rc::new(PredResult { - predicate: dummy_pred.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), - }); - } - let r3 = expect(&r2.tokens.clone(), &Rc::new(ExpectedToken::ExpectRParen)); - if has_err(r3.err.clone()) { - return Rc::new(PredResult { - predicate: dummy_pred.clone(), - tokens: r3.tokens.clone(), - ctx: ctx.clone(), - err: r3.err.clone(), - }); - } - Rc::new(PredResult { - predicate: make_field_init_node( - &"Brand".to_string(), - make_expr_node( - Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitStr { - value: r2.value.clone(), - }), - }), - Rc::new(vec![]), - None, - zero_span.clone(), - ), - zero_span.clone(), - zero_span.clone(), - ), - tokens: r3.tokens.clone(), - ctx: ctx.clone(), - err: None, - }) - } - "content" => { - let r2 = expect_ident(&tokens); - if has_err(r2.err.clone()) { - return Rc::new(PredResult { - predicate: dummy_pred.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), - }); - } - let r3 = expect(&r2.tokens.clone(), &Rc::new(ExpectedToken::ExpectRParen)); - if has_err(r3.err.clone()) { - return Rc::new(PredResult { - predicate: dummy_pred.clone(), - tokens: r3.tokens.clone(), - ctx: ctx.clone(), - err: r3.err.clone(), - }); - } - Rc::new(PredResult { - predicate: make_field_init_node( - &"ContentEncoding".to_string(), - make_expr_node( - Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitStr { - value: r2.name.clone(), - }), - }), - Rc::new(vec![]), - None, - zero_span.clone(), - ), - zero_span.clone(), - zero_span.clone(), - ), - tokens: r3.tokens.clone(), - ctx: ctx.clone(), - err: None, - }) - } - "domain" => { - let r2 = expect_ident(&tokens); - if has_err(r2.err.clone()) { - return Rc::new(PredResult { - predicate: dummy_pred.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), - }); - } - let r3 = expect(&r2.tokens.clone(), &Rc::new(ExpectedToken::ExpectRParen)); - if has_err(r3.err.clone()) { - return Rc::new(PredResult { - predicate: dummy_pred.clone(), - tokens: r3.tokens.clone(), - ctx: ctx.clone(), - err: r3.err.clone(), - }); - } - Rc::new(PredResult { - predicate: make_field_init_node( - &"Domain".to_string(), - make_expr_node( - Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitStr { - value: r2.name.clone(), - }), - }), - Rc::new(vec![]), - None, - zero_span.clone(), - ), - zero_span.clone(), - zero_span.clone(), - ), - tokens: r3.tokens.clone(), - ctx: ctx.clone(), - err: None, - }) - } - "range" => { - let r2 = parse_named_int_args(tokens.clone(), ctx.clone()); - if has_err(r2.err.clone()) { - return Rc::new(PredResult { - predicate: dummy_pred.clone(), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), - }); - } - let r3 = expect(&r2.tokens.clone(), &Rc::new(ExpectedToken::ExpectRParen)); - if has_err(r3.err.clone()) { - return Rc::new(PredResult { - predicate: dummy_pred.clone(), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: r3.err.clone(), - }); - } - let min_fields = if (r2.min_val.clone() != None) { - Rc::new(vec![make_field_init_node( - &"min".to_string(), - make_expr_node( - Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitInt { - value: r2.min_val.clone().clone().unwrap(), - }), - }), - Rc::new(vec![]), - None, - zero_span.clone(), - ), - zero_span.clone(), - zero_span.clone(), - )]) - } else { - Rc::new(vec![]) - }; - let max_fields = if (r2.max_val.clone() != None) { - Rc::new(vec![make_field_init_node( - &"max".to_string(), - make_expr_node( - Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitInt { - value: r2.max_val.clone().clone().unwrap(), - }), - }), - Rc::new(vec![]), - None, - zero_span.clone(), - ), - zero_span.clone(), - zero_span.clone(), - )]) - } else { - Rc::new(vec![]) - }; - Rc::new(PredResult { - predicate: make_field_init_node( - &"Range".to_string(), - make_expr_node( - Rc::new(ExprData::ExprRecordLit { parent_enum: None }), - v2_rt::concat(min_fields, max_fields), - None, - zero_span.clone(), - ), - zero_span.clone(), - zero_span.clone(), - ), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: None, - }) - } - _ => Rc::new(PredResult { - predicate: dummy_pred.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: Some(parse_error( - v2_rt::concat( - v2_rt::concat( - "unknown where predicate `".to_string(), - pred_name.clone(), - ), - "`".to_string(), - ), - token_span(tokens.clone().first().cloned()), - )), - }), + predicate: dummy_pred.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let pred_name = r.name.clone(); +let tokens = r.tokens.clone(); +match (*eat(&tokens, Rc::new(ExpectedToken::ExpectLParen))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { + let tokens = __ec.clone(); +match pred_name.clone().as_str() { + "pattern" => { + let r2 = parse_string_literal_value(&tokens); +if has_err(r2.err.clone()) { + return Rc::new(PredResult { + predicate: dummy_pred.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), +}) + } +let r3 = expect(&r2.tokens.clone(), &Rc::new(ExpectedToken::ExpectRParen)); +if has_err(r3.err.clone()) { + return Rc::new(PredResult { + predicate: dummy_pred.clone(), + tokens: r3.tokens.clone(), + ctx: ctx.clone(), + err: r3.err.clone(), +}) } - } - EatResult::EatUnchanged { tokens: __eu, .. } => match pred_name.clone().as_str() { - "non_empty" => Rc::new(PredResult { - predicate: make_field_init_node( - &"NonEmpty".to_string(), - make_expr_node( - Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitBool { value: true }), - }), - Rc::new(vec![]), - None, - zero_span.clone(), - ), - zero_span.clone(), - zero_span.clone(), - ), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }), - _ => Rc::new(PredResult { - predicate: make_field_init_node( - &pred_name, - make_expr_node( - Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitBool { value: true }), - }), - Rc::new(vec![]), - None, - zero_span.clone(), - ), - zero_span.clone(), - zero_span.clone(), - ), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }), - }, - } - } -} - -pub fn parse_named_int_args( - tokens: Rc>>, - ctx: Rc, -) -> Rc { - { - let r = parse_single_named_int(tokens, &ctx); - if has_err(r.err.clone()) { - return Rc::new(RangeArgsResult { - min_val: None, - max_val: None, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - match (*eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let r2 = parse_single_named_int(skip_newlines(__ec.clone()), &r.ctx.clone()); - if has_err(r2.err.clone()) { - return Rc::new(RangeArgsResult { - min_val: None, - max_val: None, - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), - }); +Rc::new(PredResult { + predicate: make_field_init_node(&"Pattern".to_string(), make_expr_node(Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitStr { + value: r2.value.clone(), +}), +}), Rc::new(vec![]), None, zero_span.clone()), zero_span.clone(), zero_span.clone()), + tokens: r3.tokens.clone(), + ctx: ctx.clone(), + err: None, +}) +}, + "format" => { + let r2 = expect_ident(&tokens); +if has_err(r2.err.clone()) { + return Rc::new(PredResult { + predicate: dummy_pred.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), +}) + } +let r3 = expect(&r2.tokens.clone(), &Rc::new(ExpectedToken::ExpectRParen)); +if has_err(r3.err.clone()) { + return Rc::new(PredResult { + predicate: dummy_pred.clone(), + tokens: r3.tokens.clone(), + ctx: ctx.clone(), + err: r3.err.clone(), +}) + } +Rc::new(PredResult { + predicate: make_field_init_node(&"Format".to_string(), make_expr_node(Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitStr { + value: r2.name.clone(), +}), +}), Rc::new(vec![]), None, zero_span.clone()), zero_span.clone(), zero_span.clone()), + tokens: r3.tokens.clone(), + ctx: ctx.clone(), + err: None, +}) +}, + "brand" => { + let r2 = parse_string_literal_value(&tokens); +if has_err(r2.err.clone()) { + return Rc::new(PredResult { + predicate: dummy_pred.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), +}) + } +let r3 = expect(&r2.tokens.clone(), &Rc::new(ExpectedToken::ExpectRParen)); +if has_err(r3.err.clone()) { + return Rc::new(PredResult { + predicate: dummy_pred.clone(), + tokens: r3.tokens.clone(), + ctx: ctx.clone(), + err: r3.err.clone(), +}) + } +Rc::new(PredResult { + predicate: make_field_init_node(&"Brand".to_string(), make_expr_node(Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitStr { + value: r2.value.clone(), +}), +}), Rc::new(vec![]), None, zero_span.clone()), zero_span.clone(), zero_span.clone()), + tokens: r3.tokens.clone(), + ctx: ctx.clone(), + err: None, +}) +}, + "content" => { + let r2 = expect_ident(&tokens); +if has_err(r2.err.clone()) { + return Rc::new(PredResult { + predicate: dummy_pred.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), +}) + } +let r3 = expect(&r2.tokens.clone(), &Rc::new(ExpectedToken::ExpectRParen)); +if has_err(r3.err.clone()) { + return Rc::new(PredResult { + predicate: dummy_pred.clone(), + tokens: r3.tokens.clone(), + ctx: ctx.clone(), + err: r3.err.clone(), +}) + } +Rc::new(PredResult { + predicate: make_field_init_node(&"ContentEncoding".to_string(), make_expr_node(Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitStr { + value: r2.name.clone(), +}), +}), Rc::new(vec![]), None, zero_span.clone()), zero_span.clone(), zero_span.clone()), + tokens: r3.tokens.clone(), + ctx: ctx.clone(), + err: None, +}) +}, + "domain" => { + let r2 = expect_ident(&tokens); +if has_err(r2.err.clone()) { + return Rc::new(PredResult { + predicate: dummy_pred.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), +}) + } +let r3 = expect(&r2.tokens.clone(), &Rc::new(ExpectedToken::ExpectRParen)); +if has_err(r3.err.clone()) { + return Rc::new(PredResult { + predicate: dummy_pred.clone(), + tokens: r3.tokens.clone(), + ctx: ctx.clone(), + err: r3.err.clone(), +}) } - let min_val = if (r.arg_name.clone().as_str() == "min".to_string().as_str()) { - Some(r.arg_value.clone()) +Rc::new(PredResult { + predicate: make_field_init_node(&"Domain".to_string(), make_expr_node(Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitStr { + value: r2.name.clone(), +}), +}), Rc::new(vec![]), None, zero_span.clone()), zero_span.clone(), zero_span.clone()), + tokens: r3.tokens.clone(), + ctx: ctx.clone(), + err: None, +}) +}, + "range" => { + let r2 = parse_named_int_args(tokens.clone(), ctx.clone()); +if has_err(r2.err.clone()) { + return Rc::new(PredResult { + predicate: dummy_pred.clone(), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), +}) + } +let r3 = expect(&r2.tokens.clone(), &Rc::new(ExpectedToken::ExpectRParen)); +if has_err(r3.err.clone()) { + return Rc::new(PredResult { + predicate: dummy_pred.clone(), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: r3.err.clone(), +}) + } +let min_fields = if (r2.min_val.clone() != None) { + Rc::new(vec![make_field_init_node(&"min".to_string(), make_expr_node(Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitInt { + value: r2.min_val.clone().clone().unwrap(), +}), +}), Rc::new(vec![]), None, zero_span.clone()), zero_span.clone(), zero_span.clone())]) } else { - if (r2.arg_name.clone().as_str() == "min".to_string().as_str()) { - Some(r2.arg_value.clone()) - } else { - None - } + Rc::new(vec![]) }; - let max_val = if (r.arg_name.clone().as_str() == "max".to_string().as_str()) { - Some(r.arg_value.clone()) +let max_fields = if (r2.max_val.clone() != None) { + Rc::new(vec![make_field_init_node(&"max".to_string(), make_expr_node(Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitInt { + value: r2.max_val.clone().clone().unwrap(), +}), +}), Rc::new(vec![]), None, zero_span.clone()), zero_span.clone(), zero_span.clone())]) } else { - if (r2.arg_name.clone().as_str() == "max".to_string().as_str()) { - Some(r2.arg_value.clone()) - } else { - None - } + Rc::new(vec![]) }; - Rc::new(RangeArgsResult { - min_val: min_val, - max_val: max_val, - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: None, - }) - } - EatResult::EatUnchanged { tokens: __eu, .. } => { - let min_val = if (r.arg_name.clone().as_str() == "min".to_string().as_str()) { - Some(r.arg_value.clone()) +Rc::new(PredResult { + predicate: make_field_init_node(&"Range".to_string(), make_expr_node(Rc::new(ExprData::ExprRecordLit { + parent_enum: None, +}), v2_rt::concat(min_fields, max_fields), None, zero_span.clone()), zero_span.clone(), zero_span.clone()), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: None, +}) +}, + _ => Rc::new(PredResult { + predicate: dummy_pred.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: Some(parse_error(v2_rt::concat(v2_rt::concat("unknown where predicate `".to_string(), pred_name.clone()), "`".to_string()), token_span(tokens.clone().first().cloned()))), +}), +} +}, + EatResult::EatUnchanged { tokens: __eu, .. } => match pred_name.clone().as_str() { + "non_empty" => Rc::new(PredResult { + predicate: make_field_init_node(&"NonEmpty".to_string(), make_expr_node(Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitBool { + value: true, +}), +}), Rc::new(vec![]), None, zero_span.clone()), zero_span.clone(), zero_span.clone()), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}), + _ => Rc::new(PredResult { + predicate: make_field_init_node(&pred_name, make_expr_node(Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitBool { + value: true, +}), +}), Rc::new(vec![]), None, zero_span.clone()), zero_span.clone(), zero_span.clone()), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}), +}, +} +} +} + +pub fn parse_named_int_args(tokens: Rc>>, ctx: Rc) -> Rc { + { + let r = parse_single_named_int(tokens, &ctx); +if has_err(r.err.clone()) { + return Rc::new(RangeArgsResult { + min_val: None, + max_val: None, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +match (*eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { + let r2 = parse_single_named_int(skip_newlines(__ec.clone()), &r.ctx.clone()); +if has_err(r2.err.clone()) { + return Rc::new(RangeArgsResult { + min_val: None, + max_val: None, + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), +}) + } +let min_val = if (r.arg_name.clone().as_str() == "min".to_string().as_str()) { + Some(r.arg_value.clone()) + } else { + if (r2.arg_name.clone().as_str() == "min".to_string().as_str()) { + Some(r2.arg_value.clone()) } else { None - }; - let max_val = if (r.arg_name.clone().as_str() == "max".to_string().as_str()) { - Some(r.arg_value.clone()) + } + }; +let max_val = if (r.arg_name.clone().as_str() == "max".to_string().as_str()) { + Some(r.arg_value.clone()) + } else { + if (r2.arg_name.clone().as_str() == "max".to_string().as_str()) { + Some(r2.arg_value.clone()) } else { None - }; - Rc::new(RangeArgsResult { - min_val: min_val, - max_val: max_val, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) - } - } - } + } + }; +Rc::new(RangeArgsResult { + min_val: min_val, + max_val: max_val, + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: None, +}) +}, + EatResult::EatUnchanged { tokens: __eu, .. } => { + let min_val = if (r.arg_name.clone().as_str() == "min".to_string().as_str()) { + Some(r.arg_value.clone()) + } else { + None + }; +let max_val = if (r.arg_name.clone().as_str() == "max".to_string().as_str()) { + Some(r.arg_value.clone()) + } else { + None + }; +Rc::new(RangeArgsResult { + min_val: min_val, + max_val: max_val, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +}, +} +} } -pub fn parse_single_named_int( - tokens: Rc>>, - ctx: &Rc, -) -> Rc { +pub fn parse_single_named_int(tokens: Rc>>, ctx: &Rc) -> Rc { { let r = expect_ident(&tokens); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(NamedIntResult { - arg_name: "".to_string(), - arg_value: 0, - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let name = r.name.clone(); - let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); - if has_err(r2.err.clone()) { + arg_name: "".to_string(), + arg_value: 0, + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let name = r.name.clone(); +let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); +if has_err(r2.err.clone()) { return Rc::new(NamedIntResult { - arg_name: name.clone(), - arg_value: 0, - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), - }); - } - let r3 = parse_int_literal_value(&r2.tokens.clone()); - if has_err(r3.err.clone()) { + arg_name: name.clone(), + arg_value: 0, + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), +}) + } +let r3 = parse_int_literal_value(&r2.tokens.clone()); +if has_err(r3.err.clone()) { return Rc::new(NamedIntResult { - arg_name: name.clone(), - arg_value: 0, - tokens: r3.tokens.clone(), - ctx: ctx.clone(), - err: r3.err.clone(), - }); - } - Rc::new(NamedIntResult { - arg_name: name.clone(), - arg_value: r3.value.clone(), - tokens: r3.tokens.clone(), - ctx: ctx.clone(), - err: None, - }) - } + arg_name: name.clone(), + arg_value: 0, + tokens: r3.tokens.clone(), + ctx: ctx.clone(), + err: r3.err.clone(), +}) + } +Rc::new(NamedIntResult { + arg_name: name.clone(), + arg_value: r3.value.clone(), + tokens: r3.tokens.clone(), + ctx: ctx.clone(), + err: None, +}) +} } -pub fn parse_variant_fields( - tokens: &Rc>>, - ctx: Rc, - vname: &String, - vname_span: &Rc, -) -> Rc { +pub fn parse_variant_fields(tokens: &Rc>>, ctx: Rc, vname: &String, vname_span: &Rc) -> Rc { { let start_span = token_span(tokens.clone().first().cloned()); - match (*eat(&tokens, Rc::new(ExpectedToken::ExpectLBrace))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let r = parse_field_list(skip_newlines(__ec.clone()), ctx); - if has_err(r.err.clone()) { - return Rc::new(VariantResult { - variant: make_variant_node( - &vname, - Rc::new(vec![]), - start_span.clone(), - vname_span.clone(), - ), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let tokens = skip_newlines(r.tokens.clone()); - let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); - if has_err(r2.err.clone()) { - return Rc::new(VariantResult { - variant: make_variant_node( - &vname, - Rc::new(vec![]), - start_span.clone(), - vname_span.clone(), - ), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), - }); - } - let v = make_variant_node( - &vname, - r.fields.clone(), - start_span.clone(), - vname_span.clone(), - ); - Rc::new(VariantResult { - variant: v, - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) - } - EatResult::EatUnchanged { tokens: __eu, .. } => { - let v = make_variant_node( - &vname, - Rc::new(vec![]), - vname_span.clone(), - vname_span.clone(), - ); - Rc::new(VariantResult { - variant: v, - tokens: tokens.clone(), - ctx: ctx, - err: None, - }) - } - } - } +match (*eat(&tokens, Rc::new(ExpectedToken::ExpectLBrace))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { + let r = parse_field_list(skip_newlines(__ec.clone()), ctx); +if has_err(r.err.clone()) { + return Rc::new(VariantResult { + variant: make_variant_node(&vname, Rc::new(vec![]), start_span.clone(), vname_span.clone()), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let tokens = skip_newlines(r.tokens.clone()); +let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); +if has_err(r2.err.clone()) { + return Rc::new(VariantResult { + variant: make_variant_node(&vname, Rc::new(vec![]), start_span.clone(), vname_span.clone()), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), +}) + } +let v = make_variant_node(&vname, r.fields.clone(), start_span.clone(), vname_span.clone()); +Rc::new(VariantResult { + variant: v, + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +}, + EatResult::EatUnchanged { tokens: __eu, .. } => { + let v = make_variant_node(&vname, Rc::new(vec![]), vname_span.clone(), vname_span.clone()); +Rc::new(VariantResult { + variant: v, + tokens: tokens.clone(), + ctx: ctx, + err: None, +}) +}, +} +} } -pub fn parse_more_variants( - tokens: Rc>>, - ctx: Rc, -) -> Rc { +pub fn parse_more_variants(tokens: Rc>>, ctx: Rc) -> Rc { parse_more_variants_acc(tokens, ctx, Rc::new(vec![])) } -pub fn parse_more_variants_acc( - mut tokens: Rc>>, - mut ctx: Rc, - mut acc: Rc>>, -) -> Rc { +pub fn parse_more_variants_acc(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { loop { tokens = skip_newlines(tokens.clone()); - match (*eat(&tokens, Rc::new(ExpectedToken::ExpectPipe))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - tokens = skip_newlines(__ec.clone()); - let r = expect_ident(&tokens); - if has_err(r.err.clone()) { - return Rc::new(VariantsResult { - variants: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let r2 = parse_variant_fields( - &r.tokens.clone(), - ctx.clone(), - &r.name.clone(), - &r.span.clone(), - ); - if has_err(r2.err.clone()) { - return Rc::new(VariantsResult { - variants: Rc::new(vec![]), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), - }); - } - { - let __tco_0 = r2.tokens.clone(); - let __tco_1 = r2.ctx.clone(); - let __tco_2 = v2_rt::rc_list_push(acc, r2.variant.clone()); - tokens = __tco_0; - ctx = __tco_1; - acc = __tco_2; - continue; - } - } - EatResult::EatUnchanged { tokens: __eu, .. } => { - break Rc::new(VariantsResult { - variants: acc, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }); - } - } - } +match (*eat(&tokens, Rc::new(ExpectedToken::ExpectPipe))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { tokens = skip_newlines(__ec.clone()); +let r = expect_ident(&tokens); +if has_err(r.err.clone()) { + return Rc::new(VariantsResult { + variants: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let r2 = parse_variant_fields(&r.tokens.clone(), ctx.clone(), &r.name.clone(), &r.span.clone()); +if has_err(r2.err.clone()) { + return Rc::new(VariantsResult { + variants: Rc::new(vec![]), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), +}) + } +{ + let __tco_0 = r2.tokens.clone(); +let __tco_1 = r2.ctx.clone(); +let __tco_2 = v2_rt::rc_list_push(acc, r2.variant.clone()); +tokens = __tco_0; +ctx = __tco_1; +acc = __tco_2; +continue; +} }, + EatResult::EatUnchanged { tokens: __eu, .. } => { break Rc::new(VariantsResult { + variants: acc, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}); }, +} +} +} + +pub fn parse_type_expr(tokens: &Rc>>, ctx: &Rc) -> Rc { + { + let tokens = skip_newlines(tokens.clone()); +let tok = tokens.clone().first().cloned(); +let sh = match tok.clone() { + Some(t) => Some(t.shape.clone()), + None => None, +}; +let span = token_span(tok.clone()); +match sh { + Some(TokenShape::ShLBrace) => { + let r = parse_field_list(skip_newlines(Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>())), ctx.clone()); +if has_err(r.err.clone()) { + return Rc::new(TypeResult { + type_expr: leaf_type_node(&"".to_string(), &span), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let tokens = skip_newlines(r.tokens.clone()); +let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); +if has_err(r2.err.clone()) { + return Rc::new(TypeResult { + type_expr: leaf_type_node(&"".to_string(), &span), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), +}) + } +let te = Rc::new(Node { + name: "".to_string(), + span: span.clone(), + ident_span: None, + children: Rc::new({ let mut __result = Vec::new(); for f in r.fields.clone().iter().cloned() { __result.push(field_to_child_node(&f, &ctx.source_indices.clone())); } __result }), + connective: Connective::Conj, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +Rc::new(TypeResult { + type_expr: te, + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +}, + Some(TokenShape::ShKeyword) => if (tok.clone().unwrap().text.clone().as_str() == "fn".to_string().as_str()) { + parse_callable_type_expr(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), &ctx, &span) + } else { + Rc::new(TypeResult { + type_expr: leaf_type_node(&"".to_string(), &span), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: Some(parse_error("expected type expression".to_string(), span.clone())), +}) + }, + Some(TokenShape::ShIdent) => { + let n = tok.clone().unwrap().text.clone(); +finish_type_expr_from_name(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), ctx.clone(), &n, &span) +}, + _ => Rc::new(TypeResult { + type_expr: leaf_type_node(&"".to_string(), &span), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: Some(parse_error("expected type expression".to_string(), span.clone())), +}), +} } - -pub fn parse_type_expr(tokens: &Rc>>, ctx: &Rc) -> Rc { - { - let tokens = skip_newlines(tokens.clone()); - let tok = tokens.clone().first().cloned(); - let sh = match tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, - }; - let span = token_span(tok.clone()); - match sh { - Some(TokenShape::ShLBrace) => { - let r = parse_field_list( - skip_newlines(Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - )), - ctx.clone(), - ); - if has_err(r.err.clone()) { - return Rc::new(TypeResult { - type_expr: leaf_type_node(&"".to_string(), &span), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let tokens = skip_newlines(r.tokens.clone()); - let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); - if has_err(r2.err.clone()) { - return Rc::new(TypeResult { - type_expr: leaf_type_node(&"".to_string(), &span), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), - }); - } - let te = Rc::new(Node { - name: "".to_string(), - span: span.clone(), - ident_span: None, - children: Rc::new({ - let mut __result = Vec::new(); - for f in r.fields.clone().iter().cloned() { - __result.push(field_to_child_node(&f, &ctx.source_indices.clone())); - } - __result - }), - connective: Connective::Conj, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - Rc::new(TypeResult { - type_expr: te, - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) - } - Some(TokenShape::ShKeyword) => { - if (tok.clone().unwrap().text.clone().as_str() == "fn".to_string().as_str()) { - parse_callable_type_expr( - &Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - &ctx, - &span, - ) - } else { - Rc::new(TypeResult { - type_expr: leaf_type_node(&"".to_string(), &span), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: Some(parse_error( - "expected type expression".to_string(), - span.clone(), - )), - }) - } - } - Some(TokenShape::ShIdent) => { - let n = tok.clone().unwrap().text.clone(); - finish_type_expr_from_name( - &Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - ctx.clone(), - &n, - &span, - ) - } - _ => Rc::new(TypeResult { - type_expr: leaf_type_node(&"".to_string(), &span), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: Some(parse_error( - "expected type expression".to_string(), - span.clone(), - )), - }), - } - } } -pub fn parse_callable_type_expr( - tokens: &Rc>>, - ctx: &Rc, - start_span: &Rc, -) -> Rc { +pub fn parse_callable_type_expr(tokens: &Rc>>, ctx: &Rc, start_span: &Rc) -> Rc { { let dummy_te = leaf_type_node(&"".to_string(), &start_span); - let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectLParen)); - if has_err(r.err.clone()) { +let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectLParen)); +if has_err(r.err.clone()) { return Rc::new(TypeResult { - type_expr: dummy_te.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let tokens = skip_newlines(r.tokens.clone()); - let params_result = if tok_is_rparen(tokens.clone().first().cloned()) { + type_expr: dummy_te.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let tokens = skip_newlines(r.tokens.clone()); +let params_result = if tok_is_rparen(tokens.clone().first().cloned()) { Rc::new(ParamsResult { - params: Rc::new(vec![]), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }) + params: Rc::new(vec![]), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}) } else { parse_callable_param_types(tokens.clone(), ctx.clone(), Rc::new(vec![])) }; - if has_err(params_result.err.clone()) { +if has_err(params_result.err.clone()) { return Rc::new(TypeResult { - type_expr: dummy_te.clone(), - tokens: params_result.tokens.clone(), - ctx: params_result.ctx.clone(), - err: params_result.err.clone(), - }); - } - let tokens = skip_newlines(params_result.tokens.clone()); - let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRParen)); - if has_err(r2.err.clone()) { + type_expr: dummy_te.clone(), + tokens: params_result.tokens.clone(), + ctx: params_result.ctx.clone(), + err: params_result.err.clone(), +}) + } +let tokens = skip_newlines(params_result.tokens.clone()); +let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRParen)); +if has_err(r2.err.clone()) { return Rc::new(TypeResult { - type_expr: dummy_te.clone(), - tokens: r2.tokens.clone(), - ctx: params_result.ctx.clone(), - err: r2.err.clone(), - }); - } - let r3 = expect(&r2.tokens.clone(), &Rc::new(ExpectedToken::ExpectArrow)); - if has_err(r3.err.clone()) { + type_expr: dummy_te.clone(), + tokens: r2.tokens.clone(), + ctx: params_result.ctx.clone(), + err: r2.err.clone(), +}) + } +let r3 = expect(&r2.tokens.clone(), &Rc::new(ExpectedToken::ExpectArrow)); +if has_err(r3.err.clone()) { return Rc::new(TypeResult { - type_expr: dummy_te.clone(), - tokens: r3.tokens.clone(), - ctx: params_result.ctx.clone(), - err: r3.err.clone(), - }); - } - let ret = parse_type_expr(&r3.tokens.clone(), ¶ms_result.ctx.clone()); - if has_err(ret.err.clone()) { + type_expr: dummy_te.clone(), + tokens: r3.tokens.clone(), + ctx: params_result.ctx.clone(), + err: r3.err.clone(), +}) + } +let ret = parse_type_expr(&r3.tokens.clone(), ¶ms_result.ctx.clone()); +if has_err(ret.err.clone()) { return Rc::new(TypeResult { - type_expr: dummy_te.clone(), - tokens: ret.tokens.clone(), - ctx: ret.ctx.clone(), - err: ret.err.clone(), - }); - } - let te = Rc::new(Node { - name: "Callable".to_string(), - span: start_span.clone(), - ident_span: Some(start_span.clone()), - children: Rc::new(vec![]), - connective: Connective::Arrow, - params: params_result.params.clone(), - inferred: Some(Rc::new(InferredNode::Resolved { - node: ret.type_expr.clone(), - })), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - maybe_optional( - &ret.tokens.clone(), - ret.ctx.clone(), - &te, - start_span.clone(), - ) - } + type_expr: dummy_te.clone(), + tokens: ret.tokens.clone(), + ctx: ret.ctx.clone(), + err: ret.err.clone(), +}) + } +let te = Rc::new(Node { + name: "Callable".to_string(), + span: start_span.clone(), + ident_span: Some(start_span.clone()), + children: Rc::new(vec![]), + connective: Connective::Arrow, + params: params_result.params.clone(), + inferred: Some(Rc::new(InferredNode::Resolved { + node: ret.type_expr.clone(), +})), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +maybe_optional(&ret.tokens.clone(), ret.ctx.clone(), &te, start_span.clone()) +} } -pub fn parse_callable_param_types( - mut tokens: Rc>>, - mut ctx: Rc, - mut acc: Rc>>, -) -> Rc { +pub fn parse_callable_param_types(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { loop { let r = parse_type_expr(&tokens, &ctx); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(ParamsResult { - params: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let param = make_param_node( - &"".to_string(), - r.type_expr.clone(), - None, - r.type_expr.clone().span.clone(), - r.type_expr.clone().span.clone(), - ); - acc = v2_rt::rc_list_push(acc.clone(), param); - match (*eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - tokens = skip_newlines(__ec.clone()); - if tok_is_rparen(tokens.clone().first().cloned()) { - break Rc::new(ParamsResult { - params: acc.clone(), - tokens: tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }); - } else { - { - let __tco_0 = r.ctx.clone(); - ctx = __tco_0; - continue; - } - } - } - EatResult::EatUnchanged { tokens: __eu, .. } => { - break Rc::new(ParamsResult { - params: acc.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }); - } - } - } + params: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let param = make_param_node(&"".to_string(), r.type_expr.clone(), None, r.type_expr.clone().span.clone(), r.type_expr.clone().span.clone()); +acc = v2_rt::rc_list_push(acc.clone(), param); +match (*eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { tokens = skip_newlines(__ec.clone()); +if tok_is_rparen(tokens.clone().first().cloned()) { + break Rc::new(ParamsResult { + params: acc.clone(), + tokens: tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}); +} else { + { + let __tco_0 = r.ctx.clone(); +ctx = __tco_0; +continue; +} +} }, + EatResult::EatUnchanged { tokens: __eu, .. } => { break Rc::new(ParamsResult { + params: acc.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}); }, +} +} } -pub fn finish_type_expr_from_name( - tokens: &Rc>>, - ctx: Rc, - type_name: &String, - start_span: &Rc, -) -> Rc { +pub fn finish_type_expr_from_name(tokens: &Rc>>, ctx: Rc, type_name: &String, start_span: &Rc) -> Rc { { let dummy_te = leaf_type_node(&type_name, &start_span); - match (*eat(&tokens, Rc::new(ExpectedToken::ExpectLt))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let r = parse_type_expr(&__ec, &ctx); - if has_err(r.err.clone()) { - return r.clone(); - } - let first_arg = r.type_expr.clone(); - let type_args = - collect_type_args(r.tokens.clone(), r.ctx.clone(), Rc::new(vec![first_arg])); - if has_err(type_args.err.clone()) { - return Rc::new(TypeResult { - type_expr: dummy_te.clone(), - tokens: type_args.tokens.clone(), - ctx: type_args.ctx.clone(), - err: type_args.err.clone(), - }); - } - let r3 = expect(&type_args.tokens.clone(), &Rc::new(ExpectedToken::ExpectGt)); - if has_err(r3.err.clone()) { - return Rc::new(TypeResult { - type_expr: dummy_te.clone(), - tokens: r3.tokens.clone(), - ctx: type_args.ctx.clone(), - err: r3.err.clone(), - }); - } - let te = Rc::new(Node { - name: type_name.clone(), - span: start_span.clone(), - ident_span: Some(start_span.clone()), - children: type_args.args.clone(), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - maybe_optional( - &r3.tokens.clone(), - type_args.ctx.clone(), - &te, - start_span.clone(), - ) - } - EatResult::EatUnchanged { tokens: __eu, .. } => { - let te = leaf_type_node(&type_name, &start_span); - maybe_optional(&tokens, ctx, &te, start_span.clone()) - } - } - } +match (*eat(&tokens, Rc::new(ExpectedToken::ExpectLt))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { + let r = parse_type_expr(&__ec, &ctx); +if has_err(r.err.clone()) { + return r.clone() + } +let first_arg = r.type_expr.clone(); +let type_args = collect_type_args(r.tokens.clone(), r.ctx.clone(), Rc::new(vec![first_arg])); +if has_err(type_args.err.clone()) { + return Rc::new(TypeResult { + type_expr: dummy_te.clone(), + tokens: type_args.tokens.clone(), + ctx: type_args.ctx.clone(), + err: type_args.err.clone(), +}) + } +let r3 = expect(&type_args.tokens.clone(), &Rc::new(ExpectedToken::ExpectGt)); +if has_err(r3.err.clone()) { + return Rc::new(TypeResult { + type_expr: dummy_te.clone(), + tokens: r3.tokens.clone(), + ctx: type_args.ctx.clone(), + err: r3.err.clone(), +}) + } +let te = Rc::new(Node { + name: type_name.clone(), + span: start_span.clone(), + ident_span: Some(start_span.clone()), + children: type_args.args.clone(), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +maybe_optional(&r3.tokens.clone(), type_args.ctx.clone(), &te, start_span.clone()) +}, + EatResult::EatUnchanged { tokens: __eu, .. } => { + let te = leaf_type_node(&type_name, &start_span); +maybe_optional(&tokens, ctx, &te, start_span.clone()) +}, +} +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -4580,72 +3834,54 @@ pub struct TypeParamsResult { pub ctx: Rc, } -pub fn parse_optional_type_params( - tokens: &Rc>>, - ctx: Rc, -) -> Rc { +pub fn parse_optional_type_params(tokens: &Rc>>, ctx: Rc) -> Rc { match (*eat(&tokens, Rc::new(ExpectedToken::ExpectLt))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let params_result = collect_type_param_names(__ec.clone(), ctx, Rc::new(vec![])); - let r = expect( - ¶ms_result.tokens.clone(), - &Rc::new(ExpectedToken::ExpectGt), - ); - Rc::new(TypeParamsResult { - params: params_result.params.clone(), - tokens: r.tokens.clone(), - ctx: params_result.ctx.clone(), - }) - } - EatResult::EatUnchanged { tokens: __eu, .. } => Rc::new(TypeParamsResult { - params: Rc::new(vec![]), - tokens: tokens.clone(), - ctx: ctx, - }), - } + EatResult::EatConsumed { tokens: __ec, .. } => { + let params_result = collect_type_param_names(__ec.clone(), ctx, Rc::new(vec![])); +let r = expect(¶ms_result.tokens.clone(), &Rc::new(ExpectedToken::ExpectGt)); +Rc::new(TypeParamsResult { + params: params_result.params.clone(), + tokens: r.tokens.clone(), + ctx: params_result.ctx.clone(), +}) +}, + EatResult::EatUnchanged { tokens: __eu, .. } => Rc::new(TypeParamsResult { + params: Rc::new(vec![]), + tokens: tokens.clone(), + ctx: ctx, +}), +} } -pub fn collect_type_param_names( - mut tokens: Rc>>, - mut ctx: Rc, - mut params: Rc>>, -) -> Rc { +pub fn collect_type_param_names(mut tokens: Rc>>, mut ctx: Rc, mut params: Rc>>) -> Rc { loop { if tok_is_ident(tokens.clone().first().cloned()) { let r = expect_ident(&tokens); - let span = r.span.clone(); - let param = make_param_node( - &r.name.clone(), - leaf_type_node(&r.name.clone(), &span), - None, - span.clone(), - span.clone(), - ); - let next_params = v2_rt::rc_list_push(params, param); - match (*eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let __tco_0 = __ec.clone(); - let __tco_1 = next_params; - tokens = __tco_0; - params = __tco_1; - continue; - } - EatResult::EatUnchanged { tokens: __eu, .. } => { - break Rc::new(TypeParamsResult { - params: next_params, - tokens: r.tokens.clone(), - ctx: ctx, - }); - } - } - } else { +let span = r.span.clone(); +let param = make_param_node(&r.name.clone(), leaf_type_node(&r.name.clone(), &span), None, span.clone(), span.clone()); +let next_params = v2_rt::rc_list_push(params, param); +match (*eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { { + let __tco_0 = __ec.clone(); +let __tco_1 = next_params; +tokens = __tco_0; +params = __tco_1; +continue; +} }, + EatResult::EatUnchanged { tokens: __eu, .. } => { break Rc::new(TypeParamsResult { + params: next_params, + tokens: r.tokens.clone(), + ctx: ctx, +}); }, +} +} else { break Rc::new(TypeParamsResult { - params: params, - tokens: tokens.clone(), - ctx: ctx, - }); - } - } + params: params, + tokens: tokens.clone(), + ctx: ctx, +}); +} +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -4656,1075 +3892,954 @@ pub struct TypeArgsResult { pub err: Option>, } -pub fn collect_type_args( - mut tokens: Rc>>, - mut ctx: Rc, - mut args: Rc>>, -) -> Rc { +pub fn collect_type_args(mut tokens: Rc>>, mut ctx: Rc, mut args: Rc>>) -> Rc { loop { match (*eat(&tokens, Rc::new(ExpectedToken::ExpectComma))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let r = parse_type_expr(&__ec, &ctx); - if has_err(r.err.clone()) { - return Rc::new(TypeArgsResult { - args: args.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - { - let __tco_0 = r.tokens.clone(); - let __tco_1 = r.ctx.clone(); - let __tco_2 = v2_rt::rc_list_push(args, r.type_expr.clone()); - tokens = __tco_0; - ctx = __tco_1; - args = __tco_2; - continue; - } - } - EatResult::EatUnchanged { tokens: __eu, .. } => { - break Rc::new(TypeArgsResult { - args: args.clone(), - tokens: tokens.clone(), - ctx: ctx, - err: None, - }); - } - } - } + EatResult::EatConsumed { tokens: __ec, .. } => { let r = parse_type_expr(&__ec, &ctx); +if has_err(r.err.clone()) { + return Rc::new(TypeArgsResult { + args: args.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +{ + let __tco_0 = r.tokens.clone(); +let __tco_1 = r.ctx.clone(); +let __tco_2 = v2_rt::rc_list_push(args, r.type_expr.clone()); +tokens = __tco_0; +ctx = __tco_1; +args = __tco_2; +continue; +} }, + EatResult::EatUnchanged { tokens: __eu, .. } => { break Rc::new(TypeArgsResult { + args: args.clone(), + tokens: tokens.clone(), + ctx: ctx, + err: None, +}); }, +} +} } -pub fn maybe_optional( - tokens: &Rc>>, - ctx: Rc, - te: &Rc, - start_span: Rc, -) -> Rc { +pub fn maybe_optional(tokens: &Rc>>, ctx: Rc, te: &Rc, start_span: Rc) -> Rc { match (*eat(&tokens, Rc::new(ExpectedToken::ExpectQuestion))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let ote = Rc::new(Node { - name: te.name.clone(), - span: te.span.clone(), - ident_span: te.ident_span.clone(), - children: te.children.clone(), - connective: te.connective.clone(), - params: te.params.clone(), - inferred: te.inferred.clone(), - return_cardinality: Cardinality::CardOptional, - uses: te.uses.clone(), - body: te.body.clone(), - transport: te.transport.clone(), - properties: te.properties.clone(), - type_annotation: te.type_annotation.clone(), - is_self_recursive: te.is_self_recursive.clone(), - has_non_tail_self_call: te.has_non_tail_self_call.clone(), - match_pattern: te.match_pattern.clone(), - expr_data: te.expr_data.clone(), - ident: None, - }); - Rc::new(TypeResult { - type_expr: ote, - tokens: __ec.clone(), - ctx: ctx, - err: None, - }) - } - EatResult::EatUnchanged { tokens: __eu, .. } => Rc::new(TypeResult { - type_expr: te.clone(), - tokens: tokens.clone(), - ctx: ctx, - err: None, - }), - } + EatResult::EatConsumed { tokens: __ec, .. } => { + let ote = Rc::new(Node { + name: te.name.clone(), + span: te.span.clone(), + ident_span: te.ident_span.clone(), + children: te.children.clone(), + connective: te.connective.clone(), + params: te.params.clone(), + inferred: te.inferred.clone(), + return_cardinality: Cardinality::CardOptional, + uses: te.uses.clone(), + body: te.body.clone(), + transport: te.transport.clone(), + properties: te.properties.clone(), + type_annotation: te.type_annotation.clone(), + is_self_recursive: te.is_self_recursive.clone(), + has_non_tail_self_call: te.has_non_tail_self_call.clone(), + match_pattern: te.match_pattern.clone(), + expr_data: te.expr_data.clone(), + ident: None, +}); +Rc::new(TypeResult { + type_expr: ote, + tokens: __ec.clone(), + ctx: ctx, + err: None, +}) +}, + EatResult::EatUnchanged { tokens: __eu, .. } => Rc::new(TypeResult { + type_expr: te.clone(), + tokens: tokens.clone(), + ctx: ctx, + err: None, +}), +} } pub fn parse_field_list(tokens: Rc>>, ctx: Rc) -> Rc { parse_field_list_acc(tokens, ctx, Rc::new(vec![])) } -pub fn parse_field_list_acc( - mut tokens: Rc>>, - mut ctx: Rc, - mut acc: Rc>>, -) -> Rc { +pub fn parse_field_list_acc(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { loop { tokens = skip_newlines(tokens.clone()); - let tok = tokens.clone().first().cloned(); - if ((tok_is_rbrace(tok.clone()) || tok_is_rparen(tok.clone())) || tok_is_eof(tok.clone())) { +let tok = tokens.clone().first().cloned(); +if ((tok_is_rbrace(tok.clone()) || tok_is_rparen(tok.clone())) || tok_is_eof(tok.clone())) { break Rc::new(FieldsResult { - fields: acc, - tokens: tokens.clone(), - ctx: ctx, - err: None, - }); - } else { + fields: acc, + tokens: tokens.clone(), + ctx: ctx, + err: None, +}); +} else { if (tok_is_ident(tok.clone()) || tok_is_keyword_name(tok.clone())) { let r = parse_field(&tokens, &ctx); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(FieldsResult { - fields: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - tokens = r.tokens.clone(); - let e = eat(&tokens, Rc::new(ExpectedToken::ExpectComma)); - tokens = skip_newlines(match (*e).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), - EatResult::EatUnchanged { .. } => tokens.clone(), - }); - { + fields: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +tokens = r.tokens.clone(); +let e = eat(&tokens, Rc::new(ExpectedToken::ExpectComma)); +tokens = skip_newlines(match (*e).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), + EatResult::EatUnchanged { .. } => tokens.clone(), +}); +{ let __tco_0 = r.ctx.clone(); - let __tco_1 = v2_rt::rc_list_push(acc, r.field.clone()); - ctx = __tco_0; - acc = __tco_1; - continue; - } - } else { +let __tco_1 = v2_rt::rc_list_push(acc, r.field.clone()); +ctx = __tco_0; +acc = __tco_1; +continue; +} +} else { break Rc::new(FieldsResult { - fields: acc, - tokens: tokens.clone(), - ctx: ctx, - err: None, - }); - } - } - } + fields: acc, + tokens: tokens.clone(), + ctx: ctx, + err: None, +}); +} +} +} } pub fn parse_field(tokens: &Rc>>, ctx: &Rc) -> Rc { { let start_span = token_span(tokens.clone().first().cloned()); - let dummy_field = make_field_node( - &"".to_string(), - leaf_type_node(&"".to_string(), &start_span), - Cardinality::Required, - None, - None, - start_span.clone(), - start_span.clone(), - ); - let r = expect_name(&tokens); - if has_err(r.err.clone()) { +let dummy_field = make_field_node(&"".to_string(), leaf_type_node(&"".to_string(), &start_span), Cardinality::Required, None, None, start_span.clone(), start_span.clone()); +let r = expect_name(&tokens); +if has_err(r.err.clone()) { return Rc::new(FieldResult { - field: dummy_field.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let name = r.name.clone(); - let name_span = r.span.clone(); - let tokens = r.tokens.clone(); - let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectColon)); - if has_err(r2.err.clone()) { + field: dummy_field.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let name = r.name.clone(); +let name_span = r.span.clone(); +let tokens = r.tokens.clone(); +let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectColon)); +if has_err(r2.err.clone()) { return Rc::new(FieldResult { - field: dummy_field.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), - }); - } - let r3 = parse_type_expr(&r2.tokens.clone(), &ctx); - if has_err(r3.err.clone()) { + field: dummy_field.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), +}) + } +let r3 = parse_type_expr(&r2.tokens.clone(), &ctx); +if has_err(r3.err.clone()) { return Rc::new(FieldResult { - field: dummy_field.clone(), - tokens: r3.tokens.clone(), - ctx: r3.ctx.clone(), - err: r3.err.clone(), - }); - } - let wr = try_where_clause( - &r3.tokens.clone(), - r3.ctx.clone(), - &r3.type_expr.clone(), - &start_span, - ); - if has_err(wr.err.clone()) { + field: dummy_field.clone(), + tokens: r3.tokens.clone(), + ctx: r3.ctx.clone(), + err: r3.err.clone(), +}) + } +let wr = try_where_clause(&r3.tokens.clone(), r3.ctx.clone(), &r3.type_expr.clone(), &start_span); +if has_err(wr.err.clone()) { return Rc::new(FieldResult { - field: dummy_field.clone(), - tokens: wr.tokens.clone(), - ctx: wr.ctx.clone(), - err: wr.err.clone(), - }); - } - let te = wr.type_expr.clone(); - let tokens = wr.tokens.clone(); - let ctx = wr.ctx.clone(); - let from_r = parse_optional_from_key(&tokens, ctx.clone()); - let from_key = from_r.from_key.clone(); - let tokens = from_r.tokens.clone(); - let ctx = from_r.ctx.clone(); - match (*eat(&tokens, Rc::new(ExpectedToken::ExpectEq))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let r4 = parse_expr(__ec.clone(), ctx.clone()); - if has_err(r4.err.clone()) { - return Rc::new(FieldResult { - field: dummy_field.clone(), - tokens: r4.tokens.clone(), - ctx: r4.ctx.clone(), - err: r4.err.clone(), - }); - } - let f = make_field_node( - &name, - te.clone(), - te.return_cardinality.clone(), - Some(r4.expr.clone()), - from_key, - start_span.clone(), - name_span, - ); - Rc::new(FieldResult { - field: f, - tokens: r4.tokens.clone(), - ctx: r4.ctx.clone(), - err: None, - }) - } - EatResult::EatUnchanged { tokens: __eu, .. } => { - let f = make_field_node( - &name, - te.clone(), - te.return_cardinality.clone(), - None, - from_key, - start_span.clone(), - name_span, - ); - Rc::new(FieldResult { - field: f, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }) - } - } - } + field: dummy_field.clone(), + tokens: wr.tokens.clone(), + ctx: wr.ctx.clone(), + err: wr.err.clone(), +}) + } +let te = wr.type_expr.clone(); +let tokens = wr.tokens.clone(); +let ctx = wr.ctx.clone(); +let from_r = parse_optional_from_key(&tokens, ctx.clone()); +let from_key = from_r.from_key.clone(); +let tokens = from_r.tokens.clone(); +let ctx = from_r.ctx.clone(); +match (*eat(&tokens, Rc::new(ExpectedToken::ExpectEq))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { + let r4 = parse_expr(__ec.clone(), ctx.clone()); +if has_err(r4.err.clone()) { + return Rc::new(FieldResult { + field: dummy_field.clone(), + tokens: r4.tokens.clone(), + ctx: r4.ctx.clone(), + err: r4.err.clone(), +}) + } +let f = make_field_node(&name, te.clone(), te.return_cardinality.clone(), Some(r4.expr.clone()), from_key, start_span.clone(), name_span); +Rc::new(FieldResult { + field: f, + tokens: r4.tokens.clone(), + ctx: r4.ctx.clone(), + err: None, +}) +}, + EatResult::EatUnchanged { tokens: __eu, .. } => { + let f = make_field_node(&name, te.clone(), te.return_cardinality.clone(), None, from_key, start_span.clone(), name_span); +Rc::new(FieldResult { + field: f, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}) +}, +} +} } -pub fn parse_optional_from_key( - tokens: &Rc>>, - ctx: Rc, -) -> Rc { +pub fn parse_optional_from_key(tokens: &Rc>>, ctx: Rc) -> Rc { { let tok = tokens.clone().first().cloned(); - let sh = match tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, - }; - match sh { - Some(TokenShape::ShIdent) => { - if (tok.clone().unwrap().text.clone().as_str() == "from".to_string().as_str()) { - { - let tok2 = tokens.clone().get(1 as usize).cloned(); - let sh2 = match tok2.clone() { - Some(t) => Some(t.shape.clone()), - None => None, - }; - match sh2 { - Some(TokenShape::ShLitStr) => { - let key = tok2.clone().unwrap().text.clone(); - Rc::new(FromKeyResult { - from_key: Some(key), - tokens: Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(2 as usize) - .collect::>(), - ), - ctx: ctx, - err: None, - }) - } - _ => Rc::new(FromKeyResult { - from_key: None, - tokens: tokens.clone(), - ctx: ctx, - err: None, - }), - } - } - } else { - Rc::new(FromKeyResult { - from_key: None, - tokens: tokens.clone(), - ctx: ctx, - err: None, - }) - } - } - _ => Rc::new(FromKeyResult { - from_key: None, - tokens: tokens.clone(), - ctx: ctx, - err: None, - }), - } - } +let sh = match tok.clone() { + Some(t) => Some(t.shape.clone()), + None => None, +}; +match sh { + Some(TokenShape::ShIdent) => if (tok.clone().unwrap().text.clone().as_str() == "from".to_string().as_str()) { + { + let tok2 = tokens.clone().get(1 as usize).cloned(); +let sh2 = match tok2.clone() { + Some(t) => Some(t.shape.clone()), + None => None, +}; +match sh2 { + Some(TokenShape::ShLitStr) => { + let key = tok2.clone().unwrap().text.clone(); +Rc::new(FromKeyResult { + from_key: Some(key), + tokens: Rc::new(tokens.clone().iter().cloned().skip(2 as usize).collect::>()), + ctx: ctx, + err: None, +}) +}, + _ => Rc::new(FromKeyResult { + from_key: None, + tokens: tokens.clone(), + ctx: ctx, + err: None, +}), +} +} + } else { + Rc::new(FromKeyResult { + from_key: None, + tokens: tokens.clone(), + ctx: ctx, + err: None, +}) + }, + _ => Rc::new(FromKeyResult { + from_key: None, + tokens: tokens.clone(), + ctx: ctx, + err: None, +}), +} +} } pub fn parse_fn_def(tokens: &Rc>>, ctx: &Rc) -> Rc { { let start_span = token_span(tokens.clone().first().cloned()); - let dummy = Rc::new(Node { - name: "".to_string(), - span: start_span.clone(), - ident_span: None, - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - let r = expect( - &tokens, - &Rc::new(ExpectedToken::ExpectKeyword { - text: "fn".to_string(), - }), - ); - if has_err(r.err.clone()) { +let dummy = Rc::new(Node { + name: "".to_string(), + span: start_span.clone(), + ident_span: None, + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { + text: "fn".to_string(), +})); +if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: dummy, - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); + item: dummy, + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) } - parse_fn_after_kw(&r.tokens.clone(), &ctx, &start_span) - } +parse_fn_after_kw(&r.tokens.clone(), &ctx, &start_span) +} } -pub fn parse_fn_after_kw( - tokens: &Rc>>, - ctx: &Rc, - start_span: &Rc, -) -> Rc { +pub fn parse_fn_after_kw(tokens: &Rc>>, ctx: &Rc, start_span: &Rc) -> Rc { { let dummy = Rc::new(Node { - name: "".to_string(), - span: start_span.clone(), - ident_span: None, - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - let r = expect_ident(&tokens); - if has_err(r.err.clone()) { + name: "".to_string(), + span: start_span.clone(), + ident_span: None, + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +let r = expect_ident(&tokens); +if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: dummy, - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let name = r.name.clone(); - let name_span = r.span.clone(); - let tokens = r.tokens.clone(); - let named_dummy = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - let r = parse_params(&tokens, &ctx); - if has_err(r.err.clone()) { + item: dummy, + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let name = r.name.clone(); +let name_span = r.span.clone(); +let tokens = r.tokens.clone(); +let named_dummy = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +let r = parse_params(&tokens, &ctx); +if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let params = r.params.clone(); - let tokens = r.tokens.clone(); - let ctx = r.ctx.clone(); - let ret = parse_optional_inferred(&tokens, ctx.clone()); - if has_err(ret.err.clone()) { + item: named_dummy.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let params = r.params.clone(); +let tokens = r.tokens.clone(); +let ctx = r.ctx.clone(); +let ret = parse_optional_inferred(&tokens, ctx.clone()); +if has_err(ret.err.clone()) { return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: ret.tokens.clone(), - ctx: ret.ctx.clone(), - err: ret.err.clone(), - }); - } - let inferred = ret.inferred.clone(); - let tokens = ret.tokens.clone(); - let ctx = ret.ctx.clone(); - let r = parse_block(&skip_newlines(tokens.clone()), &ctx); - if has_err(r.err.clone()) { + item: named_dummy.clone(), + tokens: ret.tokens.clone(), + ctx: ret.ctx.clone(), + err: ret.err.clone(), +}) + } +let inferred = ret.inferred.clone(); +let tokens = ret.tokens.clone(); +let ctx = ret.ctx.clone(); +let r = parse_block(&skip_newlines(tokens.clone()), &ctx); +if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let body = r.expr.clone(); - let item = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: Rc::new(vec![]), - params: params, - inferred: inferred, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: Some(body), - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - Rc::new(ItemResult { - item: item, - tokens: skip_newlines(r.tokens.clone()), - ctx: r.ctx.clone(), - err: None, - }) - } + item: named_dummy.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let body = r.expr.clone(); +let item = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: Rc::new(vec![]), + params: params, + inferred: inferred, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: Some(body), + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +Rc::new(ItemResult { + item: item, + tokens: skip_newlines(r.tokens.clone()), + ctx: r.ctx.clone(), + err: None, +}) +} } -pub fn parse_fn_body_from_prefix( - prefix: &Rc, - start_span: &Rc, -) -> Rc { +pub fn parse_fn_body_from_prefix(prefix: &Rc, start_span: &Rc) -> Rc { { let name = prefix.name.clone(); - let name_span = prefix.name_span.clone(); - let type_params = prefix.type_params.clone(); - let params = prefix.params.clone(); - let inferred = prefix.inferred.clone(); - let ctx = prefix.ctx.clone(); - let all_params = v2_rt::concat(type_params, params); - let named_dummy = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: Rc::new(vec![]), - params: all_params.clone(), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - let r = parse_block(&skip_newlines(prefix.tokens.clone()), &ctx); - if has_err(r.err.clone()) { +let name_span = prefix.name_span.clone(); +let type_params = prefix.type_params.clone(); +let params = prefix.params.clone(); +let inferred = prefix.inferred.clone(); +let ctx = prefix.ctx.clone(); +let all_params = v2_rt::concat(type_params, params); +let named_dummy = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: Rc::new(vec![]), + params: all_params.clone(), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +let r = parse_block(&skip_newlines(prefix.tokens.clone()), &ctx); +if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: named_dummy, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let body = r.expr.clone(); - let item = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: Rc::new(vec![]), - params: all_params.clone(), - inferred: inferred, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: Some(body), - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - Rc::new(ItemResult { - item: item, - tokens: skip_newlines(r.tokens.clone()), - ctx: r.ctx.clone(), - err: None, - }) - } + item: named_dummy, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let body = r.expr.clone(); +let item = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: Rc::new(vec![]), + params: all_params.clone(), + inferred: inferred, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: Some(body), + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +Rc::new(ItemResult { + item: item, + tokens: skip_newlines(r.tokens.clone()), + ctx: r.ctx.clone(), + err: None, +}) +} } pub fn parse_func_def(tokens: &Rc>>, ctx: &Rc) -> Rc { { let start_span = token_span(tokens.clone().first().cloned()); - let dummy = Rc::new(Node { - name: "".to_string(), - span: start_span.clone(), - ident_span: None, - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - let kw = tok_keyword_text(tokens.clone().first().cloned()); - let r = if (kw.clone().as_str() == "func".to_string().as_str()) { - expect( - &tokens, - &Rc::new(ExpectedToken::ExpectKeyword { - text: "func".to_string(), - }), - ) +let dummy = Rc::new(Node { + name: "".to_string(), + span: start_span.clone(), + ident_span: None, + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +let kw = tok_keyword_text(tokens.clone().first().cloned()); +let r = if (kw.clone().as_str() == "func".to_string().as_str()) { + expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { + text: "func".to_string(), +})) } else { if (kw.clone().as_str() == "pattern".to_string().as_str()) { - expect( - &tokens, - &Rc::new(ExpectedToken::ExpectKeyword { - text: "pattern".to_string(), - }), - ) + expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { + text: "pattern".to_string(), +})) } else { if (kw.clone().as_str() == "interface".to_string().as_str()) { - expect( - &tokens, - &Rc::new(ExpectedToken::ExpectKeyword { - text: "interface".to_string(), - }), - ) + expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { + text: "interface".to_string(), +})) } else { - expect( - &tokens, - &Rc::new(ExpectedToken::ExpectKeyword { - text: "func".to_string(), - }), - ) + expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { + text: "func".to_string(), +})) } } }; - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: dummy.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let has_uses = (kw.clone().as_str() == "func".to_string().as_str()); - let form = Rc::new(ItemForm { - kind: ItemFormKind::OtherForm, - keyword: kw.clone(), - has_type_params: false, - has_params: true, - has_return_type: true, - return_required: false, - has_uses: has_uses, - body_kind: BodyKind::BlockBody, - }); - let prefix = parse_item_prefix(&r.tokens.clone(), &ctx, &form); - if has_err(prefix.err.clone()) { + item: dummy.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let has_uses = (kw.clone().as_str() == "func".to_string().as_str()); +let form = Rc::new(ItemForm { + kind: ItemFormKind::OtherForm, + keyword: kw.clone(), + has_type_params: false, + has_params: true, + has_return_type: true, + return_required: false, + has_uses: has_uses, + body_kind: BodyKind::BlockBody, +}); +let prefix = parse_item_prefix(&r.tokens.clone(), &ctx, &form); +if has_err(prefix.err.clone()) { return Rc::new(ItemResult { - item: dummy.clone(), - tokens: prefix.tokens.clone(), - ctx: prefix.ctx.clone(), - err: prefix.err.clone(), - }); + item: dummy.clone(), + tokens: prefix.tokens.clone(), + ctx: prefix.ctx.clone(), + err: prefix.err.clone(), +}) } - parse_block_body_from_prefix(&prefix, &start_span) - } +parse_block_body_from_prefix(&prefix, &start_span) +} } -pub fn parse_block_item_after_kw( - tokens: &Rc>>, - ctx: &Rc, - start_span: &Rc, - form: Rc, -) -> Rc { +pub fn parse_block_item_after_kw(tokens: &Rc>>, ctx: &Rc, start_span: &Rc, form: Rc) -> Rc { { let dummy = Rc::new(Node { - name: "".to_string(), - span: start_span.clone(), - ident_span: None, - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - let r = expect_ident(&tokens); - if has_err(r.err.clone()) { + name: "".to_string(), + span: start_span.clone(), + ident_span: None, + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +let r = expect_ident(&tokens); +if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: dummy, - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let name = r.name.clone(); - let name_span = r.span.clone(); - let tokens = r.tokens.clone(); - let named_dummy = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - let r = parse_params(&tokens, &ctx); - if has_err(r.err.clone()) { + item: dummy, + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let name = r.name.clone(); +let name_span = r.span.clone(); +let tokens = r.tokens.clone(); +let named_dummy = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +let r = parse_params(&tokens, &ctx); +if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let params = r.params.clone(); - let tokens = r.tokens.clone(); - let ctx = r.ctx.clone(); - let ret = parse_optional_inferred(&tokens, ctx.clone()); - if has_err(ret.err.clone()) { + item: named_dummy.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let params = r.params.clone(); +let tokens = r.tokens.clone(); +let ctx = r.ctx.clone(); +let ret = parse_optional_inferred(&tokens, ctx.clone()); +if has_err(ret.err.clone()) { return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: ret.tokens.clone(), - ctx: ret.ctx.clone(), - err: ret.err.clone(), - }); - } - let inferred = ret.inferred.clone(); - let tokens = ret.tokens.clone(); - let ctx = ret.ctx.clone(); - let uses_r = if form.has_uses.clone() { + item: named_dummy.clone(), + tokens: ret.tokens.clone(), + ctx: ret.ctx.clone(), + err: ret.err.clone(), +}) + } +let inferred = ret.inferred.clone(); +let tokens = ret.tokens.clone(); +let ctx = ret.ctx.clone(); +let uses_r = if form.has_uses.clone() { parse_uses_clause(&skip_newlines(tokens.clone()), ctx.clone()) } else { Rc::new(UsesResult { - uses: Rc::new(vec![]), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }) + uses: Rc::new(vec![]), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}) }; - if has_err(uses_r.err.clone()) { +if has_err(uses_r.err.clone()) { return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: uses_r.tokens.clone(), - ctx: uses_r.ctx.clone(), - err: uses_r.err.clone(), - }); - } - let uses = uses_r.uses.clone(); - let tokens = uses_r.tokens.clone(); - let ctx = uses_r.ctx.clone(); - let r = parse_block(&skip_newlines(tokens.clone()), &ctx); - if has_err(r.err.clone()) { + item: named_dummy.clone(), + tokens: uses_r.tokens.clone(), + ctx: uses_r.ctx.clone(), + err: uses_r.err.clone(), +}) + } +let uses = uses_r.uses.clone(); +let tokens = uses_r.tokens.clone(); +let ctx = uses_r.ctx.clone(); +let r = parse_block(&skip_newlines(tokens.clone()), &ctx); +if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let body = r.expr.clone(); - let item = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: Rc::new(vec![]), - params: params, - inferred: inferred, - return_cardinality: Cardinality::Required, - uses: uses, - body: Some(body), - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - Rc::new(ItemResult { - item: item, - tokens: skip_newlines(r.tokens.clone()), - ctx: r.ctx.clone(), - err: None, - }) - } + item: named_dummy.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let body = r.expr.clone(); +let item = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: Rc::new(vec![]), + params: params, + inferred: inferred, + return_cardinality: Cardinality::Required, + uses: uses, + body: Some(body), + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +Rc::new(ItemResult { + item: item, + tokens: skip_newlines(r.tokens.clone()), + ctx: r.ctx.clone(), + err: None, +}) +} } -pub fn parse_block_body_from_prefix( - prefix: &Rc, - start_span: &Rc, -) -> Rc { +pub fn parse_block_body_from_prefix(prefix: &Rc, start_span: &Rc) -> Rc { { let name = prefix.name.clone(); - let name_span = prefix.name_span.clone(); - let params = prefix.params.clone(); - let inferred = prefix.inferred.clone(); - let uses = prefix.uses.clone(); - let ctx = prefix.ctx.clone(); - let named_dummy = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - let r = parse_block(&skip_newlines(prefix.tokens.clone()), &ctx); - if has_err(r.err.clone()) { +let name_span = prefix.name_span.clone(); +let params = prefix.params.clone(); +let inferred = prefix.inferred.clone(); +let uses = prefix.uses.clone(); +let ctx = prefix.ctx.clone(); +let named_dummy = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +let r = parse_block(&skip_newlines(prefix.tokens.clone()), &ctx); +if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: named_dummy, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let body = r.expr.clone(); - let item = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: Rc::new(vec![]), - params: params, - inferred: inferred, - return_cardinality: Cardinality::Required, - uses: uses, - body: Some(body), - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - Rc::new(ItemResult { - item: item, - tokens: skip_newlines(r.tokens.clone()), - ctx: r.ctx.clone(), - err: None, - }) - } + item: named_dummy, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let body = r.expr.clone(); +let item = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: Rc::new(vec![]), + params: params, + inferred: inferred, + return_cardinality: Cardinality::Required, + uses: uses, + body: Some(body), + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +Rc::new(ItemResult { + item: item, + tokens: skip_newlines(r.tokens.clone()), + ctx: r.ctx.clone(), + err: None, +}) +} } -pub fn parse_no_body_from_prefix( - prefix: &Rc, - start_span: Rc, -) -> Rc { +pub fn parse_no_body_from_prefix(prefix: &Rc, start_span: Rc) -> Rc { { let item = Rc::new(Node { - name: prefix.name.clone(), - span: start_span, - ident_span: Some(prefix.name_span.clone()), - children: Rc::new(vec![]), - params: prefix.params.clone(), - inferred: prefix.inferred.clone(), - return_cardinality: Cardinality::Required, - uses: prefix.uses.clone(), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - Rc::new(ItemResult { - item: item, - tokens: prefix.tokens.clone(), - ctx: prefix.ctx.clone(), - err: None, - }) - } + name: prefix.name.clone(), + span: start_span, + ident_span: Some(prefix.name_span.clone()), + children: Rc::new(vec![]), + params: prefix.params.clone(), + inferred: prefix.inferred.clone(), + return_cardinality: Cardinality::Required, + uses: prefix.uses.clone(), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +Rc::new(ItemResult { + item: item, + tokens: prefix.tokens.clone(), + ctx: prefix.ctx.clone(), + err: None, +}) +} } pub fn parse_uses_clause(tokens: &Rc>>, ctx: Rc) -> Rc { { let tokens = skip_newlines(tokens.clone()); - let tok = tokens.clone().first().cloned(); - let is_uses = match tok { - Some(t) => { - (is_ident_shape(t.shape.clone()) - && (t.text.clone().as_str() == "uses".to_string().as_str())) - } - None => false, - }; - if is_uses { +let tok = tokens.clone().first().cloned(); +let is_uses = match tok { + Some(t) => (is_ident_shape(t.shape.clone()) && (t.text.clone().as_str() == "uses".to_string().as_str())), + None => false, +}; +if is_uses { { - let r = parse_uses_list( - Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - ctx, - ); - if has_err(r.err.clone()) { - return r.clone(); + let r = parse_uses_list(Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), ctx); +if has_err(r.err.clone()) { + return r.clone() } - Rc::new(UsesResult { - uses: r.uses.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) - } +Rc::new(UsesResult { + uses: r.uses.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +} } else { Rc::new(UsesResult { - uses: Rc::new(vec![]), - tokens: tokens.clone(), - ctx: ctx, - err: None, - }) + uses: Rc::new(vec![]), + tokens: tokens.clone(), + ctx: ctx, + err: None, +}) } - } +} } pub fn parse_uses_list(tokens: Rc>>, ctx: Rc) -> Rc { parse_uses_list_acc(tokens, ctx, Rc::new(vec![])) } -pub fn parse_uses_list_acc( - mut tokens: Rc>>, - mut ctx: Rc, - mut acc: Rc>>, -) -> Rc { +pub fn parse_uses_list_acc(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { loop { let r = parse_uses_entry(&tokens, &ctx); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(UsesResult { - uses: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - acc = v2_rt::rc_list_push(acc.clone(), r.resource_use.clone()); - match (*eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let __tco_0 = __ec.clone(); - let __tco_1 = r.ctx.clone(); - tokens = __tco_0; - ctx = __tco_1; - continue; - } - EatResult::EatUnchanged { tokens: __eu, .. } => { - break Rc::new(UsesResult { - uses: acc.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }); - } - } - } + uses: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +acc = v2_rt::rc_list_push(acc.clone(), r.resource_use.clone()); +match (*eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { { + let __tco_0 = __ec.clone(); +let __tco_1 = r.ctx.clone(); +tokens = __tco_0; +ctx = __tco_1; +continue; +} }, + EatResult::EatUnchanged { tokens: __eu, .. } => { break Rc::new(UsesResult { + uses: acc.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}); }, +} +} } pub fn parse_uses_entry(tokens: &Rc>>, ctx: &Rc) -> Rc { { let start_span = token_span(tokens.clone().first().cloned()); - let dummy = make_resource_use_node( - &"".to_string(), - leaf_type_node(&"".to_string(), &start_span), - start_span.clone(), - start_span.clone(), - ); - let r = expect_ident(&tokens); - if has_err(r.err.clone()) { +let dummy = make_resource_use_node(&"".to_string(), leaf_type_node(&"".to_string(), &start_span), start_span.clone(), start_span.clone()); +let r = expect_ident(&tokens); +if has_err(r.err.clone()) { return Rc::new(ResUseResult { - resource_use: dummy.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let name = r.name.clone(); - let tokens = r.tokens.clone(); - let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectColon)); - if has_err(r2.err.clone()) { - return Rc::new(ResUseResult { - resource_use: dummy.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), - }); - } - let r3 = parse_type_expr(&r2.tokens.clone(), &ctx); - if has_err(r3.err.clone()) { + resource_use: dummy.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let name = r.name.clone(); +let tokens = r.tokens.clone(); +let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectColon)); +if has_err(r2.err.clone()) { return Rc::new(ResUseResult { - resource_use: dummy.clone(), - tokens: r3.tokens.clone(), - ctx: r3.ctx.clone(), - err: r3.err.clone(), - }); - } - match (*eat(&r3.tokens.clone(), Rc::new(ExpectedToken::ExpectLParen))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let ar = parse_resource_config_args(__ec.clone(), r3.ctx.clone()); - if has_err(ar.err.clone()) { - return Rc::new(ResUseResult { - resource_use: dummy.clone(), - tokens: ar.tokens.clone(), - ctx: ar.ctx.clone(), - err: ar.err.clone(), - }); - } - let r4 = expect(&ar.tokens.clone(), &Rc::new(ExpectedToken::ExpectRParen)); - if has_err(r4.err.clone()) { - return Rc::new(ResUseResult { - resource_use: dummy.clone(), - tokens: r4.tokens.clone(), - ctx: ar.ctx.clone(), - err: r4.err.clone(), - }); - } - let res_node = Rc::new(Node { - name: r3.type_expr.clone().name.clone(), - span: r3.type_expr.clone().span.clone(), - ident_span: r3.type_expr.clone().ident_span.clone(), - children: r3.type_expr.clone().children.clone(), - params: r3.type_expr.clone().params.clone(), - inferred: r3.type_expr.clone().inferred.clone(), - return_cardinality: r3.type_expr.clone().return_cardinality.clone(), - uses: r3.type_expr.clone().uses.clone(), - body: r3.type_expr.clone().body.clone(), - connective: r3.type_expr.clone().connective.clone(), - transport: r3.type_expr.clone().transport.clone(), - properties: ar.fields.clone(), - type_annotation: r3.type_expr.clone().type_annotation.clone(), - is_self_recursive: r3.type_expr.clone().is_self_recursive.clone(), - has_non_tail_self_call: r3.type_expr.clone().has_non_tail_self_call.clone(), - match_pattern: r3.type_expr.clone().match_pattern.clone(), - expr_data: r3.type_expr.clone().expr_data.clone(), - ident: None, - }); - let ru = - make_resource_use_node(&name, res_node, start_span.clone(), r.span.clone()); - Rc::new(ResUseResult { - resource_use: ru, - tokens: r4.tokens.clone(), - ctx: ar.ctx.clone(), - err: None, - }) - } - EatResult::EatUnchanged { tokens: __eu, .. } => { - let ru = make_resource_use_node( - &name, - r3.type_expr.clone(), - start_span.clone(), - r.span.clone(), - ); - Rc::new(ResUseResult { - resource_use: ru, - tokens: r3.tokens.clone(), - ctx: r3.ctx.clone(), - err: None, - }) - } + resource_use: dummy.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), +}) } - } +let r3 = parse_type_expr(&r2.tokens.clone(), &ctx); +if has_err(r3.err.clone()) { + return Rc::new(ResUseResult { + resource_use: dummy.clone(), + tokens: r3.tokens.clone(), + ctx: r3.ctx.clone(), + err: r3.err.clone(), +}) + } +match (*eat(&r3.tokens.clone(), Rc::new(ExpectedToken::ExpectLParen))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { + let ar = parse_resource_config_args(__ec.clone(), r3.ctx.clone()); +if has_err(ar.err.clone()) { + return Rc::new(ResUseResult { + resource_use: dummy.clone(), + tokens: ar.tokens.clone(), + ctx: ar.ctx.clone(), + err: ar.err.clone(), +}) + } +let r4 = expect(&ar.tokens.clone(), &Rc::new(ExpectedToken::ExpectRParen)); +if has_err(r4.err.clone()) { + return Rc::new(ResUseResult { + resource_use: dummy.clone(), + tokens: r4.tokens.clone(), + ctx: ar.ctx.clone(), + err: r4.err.clone(), +}) + } +let res_node = Rc::new(Node { + name: r3.type_expr.clone().name.clone(), + span: r3.type_expr.clone().span.clone(), + ident_span: r3.type_expr.clone().ident_span.clone(), + children: r3.type_expr.clone().children.clone(), + params: r3.type_expr.clone().params.clone(), + inferred: r3.type_expr.clone().inferred.clone(), + return_cardinality: r3.type_expr.clone().return_cardinality.clone(), + uses: r3.type_expr.clone().uses.clone(), + body: r3.type_expr.clone().body.clone(), + connective: r3.type_expr.clone().connective.clone(), + transport: r3.type_expr.clone().transport.clone(), + properties: ar.fields.clone(), + type_annotation: r3.type_expr.clone().type_annotation.clone(), + is_self_recursive: r3.type_expr.clone().is_self_recursive.clone(), + has_non_tail_self_call: r3.type_expr.clone().has_non_tail_self_call.clone(), + match_pattern: r3.type_expr.clone().match_pattern.clone(), + expr_data: r3.type_expr.clone().expr_data.clone(), + ident: None, +}); +let ru = make_resource_use_node(&name, res_node, start_span.clone(), r.span.clone()); +Rc::new(ResUseResult { + resource_use: ru, + tokens: r4.tokens.clone(), + ctx: ar.ctx.clone(), + err: None, +}) +}, + EatResult::EatUnchanged { tokens: __eu, .. } => { + let ru = make_resource_use_node(&name, r3.type_expr.clone(), start_span.clone(), r.span.clone()); +Rc::new(ResUseResult { + resource_use: ru, + tokens: r3.tokens.clone(), + ctx: r3.ctx.clone(), + err: None, +}) +}, +} +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -5735,981 +4850,768 @@ pub struct ResConfigResult { pub err: Option>, } -pub fn parse_resource_config_args( - tokens: Rc>>, - ctx: Rc, -) -> Rc { +pub fn parse_resource_config_args(tokens: Rc>>, ctx: Rc) -> Rc { parse_resource_config_acc(skip_newlines(tokens), ctx, Rc::new(vec![])) } -pub fn parse_resource_config_acc( - mut tokens: Rc>>, - mut ctx: Rc, - mut acc: Rc>>, -) -> Rc { +pub fn parse_resource_config_acc(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { loop { if tok_is_rparen(tokens.clone().first().cloned()) { return Rc::new(ResConfigResult { - fields: acc.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }); + fields: acc.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}) } - let zero_span = make_span(0, 0); - let r = expect_name(&tokens); - if has_err(r.err.clone()) { - return Rc::new(ResConfigResult { - fields: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let field_name = r.name.clone(); - let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); - if has_err(r2.err.clone()) { +let zero_span = make_span(0, 0); +let r = expect_name(&tokens); +if has_err(r.err.clone()) { return Rc::new(ResConfigResult { - fields: Rc::new(vec![]), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), - }); - } - let r3 = parse_expr(r2.tokens.clone(), ctx.clone()); - if has_err(r3.err.clone()) { + fields: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let field_name = r.name.clone(); +let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); +if has_err(r2.err.clone()) { return Rc::new(ResConfigResult { - fields: Rc::new(vec![]), - tokens: r3.tokens.clone(), - ctx: r3.ctx.clone(), - err: r3.err.clone(), - }); - } - let fi = make_field_init_node(&field_name, r3.expr.clone(), zero_span, r.span.clone()); - acc = v2_rt::rc_list_push(acc.clone(), fi); - match (*eat(&r3.tokens.clone(), Rc::new(ExpectedToken::ExpectComma))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let __tco_0 = skip_newlines(__ec.clone()); - let __tco_1 = r3.ctx.clone(); - tokens = __tco_0; - ctx = __tco_1; - continue; - } - EatResult::EatUnchanged { tokens: __eu, .. } => { - break Rc::new(ResConfigResult { - fields: acc.clone(), - tokens: r3.tokens.clone(), - ctx: r3.ctx.clone(), - err: None, - }); - } + fields: Rc::new(vec![]), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), +}) } - } -} - -pub fn parse_optional_inferred( - tokens: &Rc>>, - ctx: Rc, -) -> Rc { +let r3 = parse_expr(r2.tokens.clone(), ctx.clone()); +if has_err(r3.err.clone()) { + return Rc::new(ResConfigResult { + fields: Rc::new(vec![]), + tokens: r3.tokens.clone(), + ctx: r3.ctx.clone(), + err: r3.err.clone(), +}) + } +let fi = make_field_init_node(&field_name, r3.expr.clone(), zero_span, r.span.clone()); +acc = v2_rt::rc_list_push(acc.clone(), fi); +match (*eat(&r3.tokens.clone(), Rc::new(ExpectedToken::ExpectComma))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { { + let __tco_0 = skip_newlines(__ec.clone()); +let __tco_1 = r3.ctx.clone(); +tokens = __tco_0; +ctx = __tco_1; +continue; +} }, + EatResult::EatUnchanged { tokens: __eu, .. } => { break Rc::new(ResConfigResult { + fields: acc.clone(), + tokens: r3.tokens.clone(), + ctx: r3.ctx.clone(), + err: None, +}); }, +} +} +} + +pub fn parse_optional_inferred(tokens: &Rc>>, ctx: Rc) -> Rc { match (*eat(&tokens, Rc::new(ExpectedToken::ExpectArrow))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let r = parse_type_expr(&__ec, &ctx); - if has_err(r.err.clone()) { - return Rc::new(OptRetResult { - inferred: None, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - Rc::new(OptRetResult { - inferred: Some(Rc::new(InferredNode::Resolved { - node: r.type_expr.clone(), - })), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) - } - EatResult::EatUnchanged { tokens: __eu, .. } => Rc::new(OptRetResult { - inferred: None, - tokens: tokens.clone(), - ctx: ctx, - err: None, - }), - } + EatResult::EatConsumed { tokens: __ec, .. } => { + let r = parse_type_expr(&__ec, &ctx); +if has_err(r.err.clone()) { + return Rc::new(OptRetResult { + inferred: None, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +Rc::new(OptRetResult { + inferred: Some(Rc::new(InferredNode::Resolved { + node: r.type_expr.clone(), +})), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +}, + EatResult::EatUnchanged { tokens: __eu, .. } => Rc::new(OptRetResult { + inferred: None, + tokens: tokens.clone(), + ctx: ctx, + err: None, +}), +} } pub fn parse_service_def(tokens: &Rc>>, ctx: &Rc) -> Rc { { let start_span = token_span(tokens.clone().first().cloned()); - let dummy = Rc::new(Node { - name: "".to_string(), - span: start_span.clone(), - ident_span: None, - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - let r = expect( - &tokens, - &Rc::new(ExpectedToken::ExpectKeyword { - text: "service".to_string(), - }), - ); - if has_err(r.err.clone()) { +let dummy = Rc::new(Node { + name: "".to_string(), + span: start_span.clone(), + ident_span: None, + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { + text: "service".to_string(), +})); +if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: dummy, - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); + item: dummy, + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) } - parse_service_after_kw(&r.tokens.clone(), &ctx, &start_span) - } +parse_service_after_kw(&r.tokens.clone(), &ctx, &start_span) +} } -pub fn parse_service_after_kw( - tokens: &Rc>>, - ctx: &Rc, - start_span: &Rc, -) -> Rc { +pub fn parse_service_after_kw(tokens: &Rc>>, ctx: &Rc, start_span: &Rc) -> Rc { { let dummy = Rc::new(Node { - name: "".to_string(), - span: start_span.clone(), - ident_span: None, - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - let r_ns = expect_name(&tokens); - if has_err(r_ns.err.clone()) { + name: "".to_string(), + span: start_span.clone(), + ident_span: None, + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +let r_ns = expect_name(&tokens); +if has_err(r_ns.err.clone()) { return Rc::new(ItemResult { - item: dummy, - tokens: r_ns.tokens.clone(), - ctx: ctx.clone(), - err: r_ns.err.clone(), - }); - } - let namespace_root = r_ns.name.clone(); - let r = parse_dotted_ident_rest( - r_ns.tokens.clone(), - namespace_root.clone(), - r_ns.span.clone(), - ); - let name = r.name.clone(); - let svc_name_span = r.span.clone(); - let named_dummy = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(svc_name_span.clone()), - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - let r = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectLBrace)); - if has_err(r.err.clone()) { + item: dummy, + tokens: r_ns.tokens.clone(), + ctx: ctx.clone(), + err: r_ns.err.clone(), +}) + } +let namespace_root = r_ns.name.clone(); +let r = parse_dotted_ident_rest(r_ns.tokens.clone(), namespace_root.clone(), r_ns.span.clone()); +let name = r.name.clone(); +let svc_name_span = r.span.clone(); +let named_dummy = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(svc_name_span.clone()), + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +let r = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectLBrace)); +if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let tokens = skip_newlines(r.tokens.clone()); - let r = parse_service_body(&tokens, ctx.clone()); - if has_err(r.err.clone()) { + item: named_dummy.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let tokens = skip_newlines(r.tokens.clone()); +let r = parse_service_body(&tokens, ctx.clone()); +if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let tokens = skip_newlines(r.tokens.clone()); - let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); - if has_err(r2.err.clone()) { + item: named_dummy.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let tokens = skip_newlines(r.tokens.clone()); +let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); +if has_err(r2.err.clone()) { return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), - }); - } - let ns_prop = make_field_init_node( - &"namespace_root".to_string(), - make_expr_node( - Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitStr { - value: namespace_root.clone(), - }), - }), - Rc::new(vec![]), - None, - start_span.clone(), - ), - start_span.clone(), - no_span(), - ); - let svc_props = match r.config.clone() { - Some(cfg) => service_config_properties( - cfg.endpoint.clone(), - cfg.auth.clone(), - cfg.auth_input.clone(), - cfg.auth_source.clone(), - cfg.rate_limit.clone(), - cfg.retry.clone(), - ), - None => Rc::new(vec![]), - }; - let item = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(svc_name_span.clone()), - children: r.operations.clone(), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: Some(r.transport.clone()), - properties: v2_rt::concat(Rc::new(vec![ns_prop]), svc_props), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - Rc::new(ItemResult { - item: item, - tokens: skip_newlines(r2.tokens.clone()), - ctx: r.ctx.clone(), - err: None, - }) - } + item: named_dummy.clone(), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), +}) + } +let ns_prop = make_field_init_node(&"namespace_root".to_string(), make_expr_node(Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitStr { + value: namespace_root.clone(), +}), +}), Rc::new(vec![]), None, start_span.clone()), start_span.clone(), no_span()); +let svc_props = match r.config.clone() { + Some(cfg) => service_config_properties(cfg.endpoint.clone(), cfg.auth.clone(), cfg.auth_input.clone(), cfg.auth_source.clone(), cfg.rate_limit.clone(), cfg.retry.clone()), + None => Rc::new(vec![]), +}; +let item = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(svc_name_span.clone()), + children: r.operations.clone(), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: Some(r.transport.clone()), + properties: v2_rt::concat(Rc::new(vec![ns_prop]), svc_props), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +Rc::new(ItemResult { + item: item, + tokens: skip_newlines(r2.tokens.clone()), + ctx: r.ctx.clone(), + err: None, +}) +} } -pub fn parse_service_body( - tokens: &Rc>>, - ctx: Rc, -) -> Rc { - parse_service_entries( - tokens.clone(), - ctx, - None, - local_transport_node(token_span(tokens.clone().first().cloned())), - Rc::new(vec![]), - ) -} - -pub fn parse_service_entries( - mut tokens: Rc>>, - mut ctx: Rc, - mut config: Option>, - mut transport: Rc, - mut operations: Rc>>, -) -> Rc { +pub fn parse_service_body(tokens: &Rc>>, ctx: Rc) -> Rc { + parse_service_entries(tokens.clone(), ctx, None, local_transport_node(token_span(tokens.clone().first().cloned())), Rc::new(vec![])) +} + +pub fn parse_service_entries(mut tokens: Rc>>, mut ctx: Rc, mut config: Option>, mut transport: Rc, mut operations: Rc>>) -> Rc { loop { tokens = skip_newlines(tokens.clone()); - let tok = tokens.clone().first().cloned(); - if (tok_is_rbrace(tok.clone()) || tok_is_eof(tok.clone())) { +let tok = tokens.clone().first().cloned(); +if (tok_is_rbrace(tok.clone()) || tok_is_eof(tok.clone())) { break Rc::new(ServiceBodyResult { - config: config.clone(), - transport: transport.clone(), - operations: operations.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }); - } else { + config: config.clone(), + transport: transport.clone(), + operations: operations.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}); +} else { let sh = match tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, - }; - let span = token_span(tok.clone()); - match sh { - Some(TokenShape::ShIdent) => { - let id = tok.clone().unwrap().text.clone(); - if (id.clone().as_str() == "config".to_string().as_str()) { - let r = expect( - &Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - &Rc::new(ExpectedToken::ExpectLBrace), - ); - if has_err(r.err.clone()) { - return Rc::new(ServiceBodyResult { - config: config.clone(), - transport: transport.clone(), - operations: operations.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let r2 = parse_service_config_block( - skip_newlines(r.tokens.clone()), - ctx.clone(), - ); - if has_err(r2.err.clone()) { - return Rc::new(ServiceBodyResult { - config: config.clone(), - transport: transport.clone(), - operations: operations.clone(), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), - }); - } - tokens = skip_newlines(r2.tokens.clone()); - let r3 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); - if has_err(r3.err.clone()) { - return Rc::new(ServiceBodyResult { - config: config.clone(), - transport: transport.clone(), - operations: operations.clone(), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: r3.err.clone(), - }); - } - { - let __tco_0 = r3.tokens.clone(); - let __tco_1 = r2.ctx.clone(); - let __tco_2 = Some(r2.config.clone()); - tokens = __tco_0; - ctx = __tco_1; - config = __tco_2; - continue; - } - } else { - if (id.clone().as_str() == "transport".to_string().as_str()) { - let r = parse_transport_binding( - &Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - &ctx, - ); - if has_err(r.err.clone()) { - return Rc::new(ServiceBodyResult { - config: config.clone(), - transport: transport.clone(), - operations: operations.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - { - let __tco_0 = r.tokens.clone(); - let __tco_1 = r.ctx.clone(); - let __tco_2 = r.transport.clone(); - tokens = __tco_0; - ctx = __tco_1; - transport = __tco_2; - continue; - } - } else { - break Rc::new(ServiceBodyResult { - config: config.clone(), - transport: transport.clone(), - operations: operations.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: Some(parse_error( - "expected config, transport, or operation in service block" - .to_string(), - span, - )), - }); - } - } - } - Some(TokenShape::ShKeyword) => { - let kw_text = tok.clone().unwrap().text.clone(); - if (kw_text.as_str() == "operation".to_string().as_str()) { - let r = parse_operation_def(&tokens, &ctx); - if has_err(r.err.clone()) { - return Rc::new(ServiceBodyResult { - config: config.clone(), - transport: transport.clone(), - operations: operations.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - { - let __tco_0 = r.tokens.clone(); - let __tco_1 = r.ctx.clone(); - let __tco_2 = v2_rt::rc_list_push(operations, r.operation.clone()); - tokens = __tco_0; - ctx = __tco_1; - operations = __tco_2; - continue; - } - } else { - break Rc::new(ServiceBodyResult { - config: config.clone(), - transport: transport.clone(), - operations: operations.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: Some(parse_error( - "expected config, transport, or operation in service block" - .to_string(), - span, - )), - }); + Some(t) => Some(t.shape.clone()), + None => None, +}; +let span = token_span(tok.clone()); +match sh { + Some(TokenShape::ShIdent) => { let id = tok.clone().unwrap().text.clone(); +if (id.clone().as_str() == "config".to_string().as_str()) { + let r = expect(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), &Rc::new(ExpectedToken::ExpectLBrace)); +if has_err(r.err.clone()) { + return Rc::new(ServiceBodyResult { + config: config.clone(), + transport: transport.clone(), + operations: operations.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let r2 = parse_service_config_block(skip_newlines(r.tokens.clone()), ctx.clone()); +if has_err(r2.err.clone()) { + return Rc::new(ServiceBodyResult { + config: config.clone(), + transport: transport.clone(), + operations: operations.clone(), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), +}) + } +tokens = skip_newlines(r2.tokens.clone()); +let r3 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); +if has_err(r3.err.clone()) { + return Rc::new(ServiceBodyResult { + config: config.clone(), + transport: transport.clone(), + operations: operations.clone(), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: r3.err.clone(), +}) + } +{ + let __tco_0 = r3.tokens.clone(); +let __tco_1 = r2.ctx.clone(); +let __tco_2 = Some(r2.config.clone()); +tokens = __tco_0; +ctx = __tco_1; +config = __tco_2; +continue; +} +} else { + if (id.clone().as_str() == "transport".to_string().as_str()) { + let r = parse_transport_binding(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), &ctx); +if has_err(r.err.clone()) { + return Rc::new(ServiceBodyResult { + config: config.clone(), + transport: transport.clone(), + operations: operations.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) } - } - _ => { +{ + let __tco_0 = r.tokens.clone(); +let __tco_1 = r.ctx.clone(); +let __tco_2 = r.transport.clone(); +tokens = __tco_0; +ctx = __tco_1; +transport = __tco_2; +continue; +} +} else { break Rc::new(ServiceBodyResult { - config: config.clone(), - transport: transport.clone(), - operations: operations.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: Some(parse_error( - "expected config, transport, or operation in service block".to_string(), - span, - )), - }); - } - } - } - } + config: config.clone(), + transport: transport.clone(), + operations: operations.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: Some(parse_error("expected config, transport, or operation in service block".to_string(), span)), +}); +} +} }, + Some(TokenShape::ShKeyword) => { let kw_text = tok.clone().unwrap().text.clone(); +if (kw_text.as_str() == "operation".to_string().as_str()) { + let r = parse_operation_def(&tokens, &ctx); +if has_err(r.err.clone()) { + return Rc::new(ServiceBodyResult { + config: config.clone(), + transport: transport.clone(), + operations: operations.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +{ + let __tco_0 = r.tokens.clone(); +let __tco_1 = r.ctx.clone(); +let __tco_2 = v2_rt::rc_list_push(operations, r.operation.clone()); +tokens = __tco_0; +ctx = __tco_1; +operations = __tco_2; +continue; +} +} else { + break Rc::new(ServiceBodyResult { + config: config.clone(), + transport: transport.clone(), + operations: operations.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: Some(parse_error("expected config, transport, or operation in service block".to_string(), span)), +}); +} }, + _ => { break Rc::new(ServiceBodyResult { + config: config.clone(), + transport: transport.clone(), + operations: operations.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: Some(parse_error("expected config, transport, or operation in service block".to_string(), span)), +}); }, +} +} +} } -pub fn parse_service_config_block( - tokens: Rc>>, - ctx: Rc, -) -> Rc { +pub fn parse_service_config_block(tokens: Rc>>, ctx: Rc) -> Rc { parse_config_fields(tokens, ctx, None, None, None, None, None, None) } -pub fn parse_config_fields( - mut tokens: Rc>>, - mut ctx: Rc, - mut endpoint: Option>, - mut auth: Option>, - mut auth_input: Option>, - mut auth_source: Option>, - mut rate_limit: Option>, - mut retry: Option>, -) -> Rc { +pub fn parse_config_fields(mut tokens: Rc>>, mut ctx: Rc, mut endpoint: Option>, mut auth: Option>, mut auth_input: Option>, mut auth_source: Option>, mut rate_limit: Option>, mut retry: Option>) -> Rc { loop { tokens = skip_newlines(tokens.clone()); - if (tok_is_rbrace(tokens.clone().first().cloned()) - || tok_is_eof(tokens.clone().first().cloned())) - { +if (tok_is_rbrace(tokens.clone().first().cloned()) || tok_is_eof(tokens.clone().first().cloned())) { let cfg = Rc::new(ServiceConfig { - endpoint: match endpoint { - Some(e) => e.clone(), - None => make_expr_node( - Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitStr { - value: "".to_string(), - }), - }), - Rc::new(vec![]), - None, - make_span(0, 0), - ), - }, - auth: auth, - auth_input: auth_input, - auth_source: auth_source, - rate_limit: rate_limit, - retry: retry, - }); - break Rc::new(ConfigResult { - config: cfg, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }); - } else { + endpoint: match endpoint { + Some(e) => e.clone(), + None => make_expr_node(Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitStr { + value: "".to_string(), +}), +}), Rc::new(vec![]), None, make_span(0, 0)), +}, + auth: auth, + auth_input: auth_input, + auth_source: auth_source, + rate_limit: rate_limit, + retry: retry, +}); +break Rc::new(ConfigResult { + config: cfg, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}); +} else { let dummy_cfg = Rc::new(ServiceConfig { - endpoint: make_expr_node( - Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitStr { - value: "".to_string(), - }), - }), - Rc::new(vec![]), - None, - make_span(0, 0), - ), - auth: None, - auth_input: None, - auth_source: None, - rate_limit: None, - retry: None, - }); - let r = expect_ident(&tokens); - if has_err(r.err.clone()) { + endpoint: make_expr_node(Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitStr { + value: "".to_string(), +}), +}), Rc::new(vec![]), None, make_span(0, 0)), + auth: None, + auth_input: None, + auth_source: None, + rate_limit: None, + retry: None, +}); +let r = expect_ident(&tokens); +if has_err(r.err.clone()) { return Rc::new(ConfigResult { - config: dummy_cfg.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); + config: dummy_cfg.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) } - let fname = r.name.clone(); - let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); - if has_err(r2.err.clone()) { +let fname = r.name.clone(); +let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); +if has_err(r2.err.clone()) { return Rc::new(ConfigResult { - config: dummy_cfg.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), - }); + config: dummy_cfg.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), +}) } - let r3 = parse_expr(r2.tokens.clone(), ctx.clone()); - if has_err(r3.err.clone()) { +let r3 = parse_expr(r2.tokens.clone(), ctx.clone()); +if has_err(r3.err.clone()) { return Rc::new(ConfigResult { - config: dummy_cfg.clone(), - tokens: r3.tokens.clone(), - ctx: r3.ctx.clone(), - err: r3.err.clone(), - }); - } - tokens = r3.tokens.clone(); - ctx = r3.ctx.clone(); - let e = eat(&tokens, Rc::new(ExpectedToken::ExpectComma)); - tokens = match (*e.clone()).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), - EatResult::EatUnchanged { .. } => tokens.clone(), - }; - match fname.as_str() { - "endpoint" => { - let __tco_0 = Some(r3.expr.clone()); - endpoint = __tco_0; - continue; - } - "auth" => { - let __tco_0 = Some(r3.expr.clone()); - auth = __tco_0; - continue; - } - "auth_input" => { - let __tco_0 = Some(r3.expr.clone()); - auth_input = __tco_0; - continue; - } - "auth_source" => { - let __tco_0 = Some(r3.expr.clone()); - auth_source = __tco_0; - continue; - } - "rate_limit" => { - let __tco_0 = Some(r3.expr.clone()); - rate_limit = __tco_0; - continue; - } - "retry" => { - let __tco_0 = Some(r3.expr.clone()); - retry = __tco_0; - continue; - } - _ => { - continue; - } - } - } - } + config: dummy_cfg.clone(), + tokens: r3.tokens.clone(), + ctx: r3.ctx.clone(), + err: r3.err.clone(), +}) + } +tokens = r3.tokens.clone(); +ctx = r3.ctx.clone(); +let e = eat(&tokens, Rc::new(ExpectedToken::ExpectComma)); +tokens = match (*e.clone()).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), + EatResult::EatUnchanged { .. } => tokens.clone(), +}; +match fname.as_str() { + "endpoint" => { { + let __tco_0 = Some(r3.expr.clone()); +endpoint = __tco_0; +continue; +} }, + "auth" => { { + let __tco_0 = Some(r3.expr.clone()); +auth = __tco_0; +continue; +} }, + "auth_input" => { { + let __tco_0 = Some(r3.expr.clone()); +auth_input = __tco_0; +continue; +} }, + "auth_source" => { { + let __tco_0 = Some(r3.expr.clone()); +auth_source = __tco_0; +continue; +} }, + "rate_limit" => { { + let __tco_0 = Some(r3.expr.clone()); +rate_limit = __tco_0; +continue; +} }, + "retry" => { { + let __tco_0 = Some(r3.expr.clone()); +retry = __tco_0; +continue; +} }, + _ => { { + continue; +} }, +} +} +} } -pub fn parse_transport_binding( - tokens: &Rc>>, - ctx: &Rc, -) -> Rc { +pub fn parse_transport_binding(tokens: &Rc>>, ctx: &Rc) -> Rc { { let span = token_span(tokens.clone().first().cloned()); - let dummy = local_transport_node(span); - let tok = tokens.clone().first().cloned(); - let tok_text = match tok.clone() { - Some(t) => t.text.clone(), - None => "".to_string(), - }; - let sh = match tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, - }; - match sh { - Some(TokenShape::ShIdent) => { - if (tok_text.clone().as_str() == "rest".to_string().as_str()) { +let dummy = local_transport_node(span); +let tok = tokens.clone().first().cloned(); +let tok_text = match tok.clone() { + Some(t) => t.text.clone(), + None => "".to_string(), +}; +let sh = match tok.clone() { + Some(t) => Some(t.shape.clone()), + None => None, +}; +match sh { + Some(TokenShape::ShIdent) => if (tok_text.clone().as_str() == "rest".to_string().as_str()) { + { + let r = expect(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), &Rc::new(ExpectedToken::ExpectLBrace)); +if has_err(r.err.clone()) { + return Rc::new(TransportResult { + transport: dummy.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let r2 = parse_rest_binding_body(skip_newlines(r.tokens.clone()), ctx.clone()); +if has_err(r2.err.clone()) { + return Rc::new(TransportResult { + transport: r2.transport.clone(), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), +}) + } +let r3 = expect(&skip_newlines(r2.tokens.clone()), &Rc::new(ExpectedToken::ExpectRBrace)); +if has_err(r3.err.clone()) { + return Rc::new(TransportResult { + transport: dummy.clone(), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: r3.err.clone(), +}) + } +Rc::new(TransportResult { + transport: r2.transport.clone(), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: None, +}) +} + } else { + if (tok_text.clone().as_str() == "shell".to_string().as_str()) { + { + let r = expect(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), &Rc::new(ExpectedToken::ExpectLBrace)); +if has_err(r.err.clone()) { + return Rc::new(TransportResult { + transport: dummy.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let r2 = parse_shell_binding_body(skip_newlines(r.tokens.clone()), ctx.clone()); +if has_err(r2.err.clone()) { + return Rc::new(TransportResult { + transport: r2.transport.clone(), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), +}) + } +let r3 = expect(&skip_newlines(r2.tokens.clone()), &Rc::new(ExpectedToken::ExpectRBrace)); +if has_err(r3.err.clone()) { + return Rc::new(TransportResult { + transport: dummy.clone(), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: r3.err.clone(), +}) + } +Rc::new(TransportResult { + transport: r2.transport.clone(), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: None, +}) +} + } else { + if (tok_text.clone().as_str() == "file".to_string().as_str()) { { - let r = expect( - &Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - &Rc::new(ExpectedToken::ExpectLBrace), - ); - if has_err(r.err.clone()) { + let r = expect(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), &Rc::new(ExpectedToken::ExpectLBrace)); +if has_err(r.err.clone()) { return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); + transport: dummy.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) } - let r2 = - parse_rest_binding_body(skip_newlines(r.tokens.clone()), ctx.clone()); - if has_err(r2.err.clone()) { +let r2 = parse_file_binding_body(skip_newlines(r.tokens.clone()), ctx.clone()); +if has_err(r2.err.clone()) { return Rc::new(TransportResult { - transport: r2.transport.clone(), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), - }); + transport: r2.transport.clone(), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), +}) } - let r3 = expect( - &skip_newlines(r2.tokens.clone()), - &Rc::new(ExpectedToken::ExpectRBrace), - ); - if has_err(r3.err.clone()) { +let r3 = expect(&skip_newlines(r2.tokens.clone()), &Rc::new(ExpectedToken::ExpectRBrace)); +if has_err(r3.err.clone()) { return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: r3.err.clone(), - }); + transport: dummy.clone(), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: r3.err.clone(), +}) } - Rc::new(TransportResult { - transport: r2.transport.clone(), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: None, - }) - } +Rc::new(TransportResult { + transport: r2.transport.clone(), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: None, +}) +} } else { - if (tok_text.clone().as_str() == "shell".to_string().as_str()) { - { - let r = expect( - &Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - &Rc::new(ExpectedToken::ExpectLBrace), - ); - if has_err(r.err.clone()) { - return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let r2 = parse_shell_binding_body( - skip_newlines(r.tokens.clone()), - ctx.clone(), - ); - if has_err(r2.err.clone()) { - return Rc::new(TransportResult { - transport: r2.transport.clone(), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), - }); - } - let r3 = expect( - &skip_newlines(r2.tokens.clone()), - &Rc::new(ExpectedToken::ExpectRBrace), - ); - if has_err(r3.err.clone()) { - return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: r3.err.clone(), - }); - } - Rc::new(TransportResult { - transport: r2.transport.clone(), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: None, - }) - } - } else { - if (tok_text.clone().as_str() == "file".to_string().as_str()) { - { - let r = expect( - &Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - &Rc::new(ExpectedToken::ExpectLBrace), - ); - if has_err(r.err.clone()) { - return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let r2 = parse_file_binding_body( - skip_newlines(r.tokens.clone()), - ctx.clone(), - ); - if has_err(r2.err.clone()) { - return Rc::new(TransportResult { - transport: r2.transport.clone(), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), - }); - } - let r3 = expect( - &skip_newlines(r2.tokens.clone()), - &Rc::new(ExpectedToken::ExpectRBrace), - ); - if has_err(r3.err.clone()) { - return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: r3.err.clone(), - }); - } - Rc::new(TransportResult { - transport: r2.transport.clone(), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: None, - }) - } - } else { - Rc::new(TransportResult { - transport: dummy.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }) - } - } + Rc::new(TransportResult { + transport: dummy.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}) } } - _ => Rc::new(TransportResult { - transport: dummy.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }), - } - } + }, + _ => Rc::new(TransportResult { + transport: dummy.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}), +} +} +} + +pub fn parse_rest_binding_body(tokens: Rc>>, ctx: Rc) -> Rc { + parse_rest_fields(tokens, ctx, None, None, None, None, None, None, Rc::new(vec![])) } -pub fn parse_rest_binding_body( - tokens: Rc>>, - ctx: Rc, -) -> Rc { - parse_rest_fields( - tokens, - ctx, - None, - None, - None, - None, - None, - None, - Rc::new(vec![]), - ) -} - -pub fn parse_rest_fields( - mut tokens: Rc>>, - mut ctx: Rc, - mut base_url: Option>, - mut method: Option>, - mut path_template: Option>, - mut query: Option>, - mut request_body: Option>, - mut response_format: Option>, - mut headers: Rc>>, -) -> Rc { +pub fn parse_rest_fields(mut tokens: Rc>>, mut ctx: Rc, mut base_url: Option>, mut method: Option>, mut path_template: Option>, mut query: Option>, mut request_body: Option>, mut response_format: Option>, mut headers: Rc>>) -> Rc { loop { tokens = skip_newlines(tokens.clone()); - let span = token_span(tokens.clone().first().cloned()); - let dummy = local_transport_node(span.clone()); - if (tok_is_rbrace(tokens.clone().first().cloned()) - || tok_is_eof(tokens.clone().first().cloned())) - { +let span = token_span(tokens.clone().first().cloned()); +let dummy = local_transport_node(span.clone()); +if (tok_is_rbrace(tokens.clone().first().cloned()) || tok_is_eof(tokens.clone().first().cloned())) { let bu = match base_url { - Some(e) => e.clone(), - None => make_expr_node( - Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitStr { - value: "".to_string(), - }), - }), - Rc::new(vec![]), - None, - make_span(0, 0), - ), - }; - break Rc::new(TransportResult { - transport: rest_transport_node( - bu, - Rc::new(vec![]), - headers, - method, - path_template, - query, - request_body, - response_format, - span.clone(), - ), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }); - } else { + Some(e) => e.clone(), + None => make_expr_node(Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitStr { + value: "".to_string(), +}), +}), Rc::new(vec![]), None, make_span(0, 0)), +}; +break Rc::new(TransportResult { + transport: rest_transport_node(bu, Rc::new(vec![]), headers, method, path_template, query, request_body, response_format, span.clone()), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}); +} else { let r = expect_ident(&tokens); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); + transport: dummy.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) } - let fname = r.name.clone(); - let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); - if has_err(r2.err.clone()) { +let fname = r.name.clone(); +let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); +if has_err(r2.err.clone()) { return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), - }); + transport: dummy.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), +}) } - let r3 = parse_expr(r2.tokens.clone(), ctx.clone()); - if has_err(r3.err.clone()) { +let r3 = parse_expr(r2.tokens.clone(), ctx.clone()); +if has_err(r3.err.clone()) { return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r3.tokens.clone(), - ctx: r3.ctx.clone(), - err: r3.err.clone(), - }); - } - let e = eat(&r3.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); - tokens = match (*e.clone()).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), - EatResult::EatUnchanged { .. } => r3.tokens.clone(), - }; - ctx = r3.ctx.clone(); - if (fname.clone().as_str() == transport_url_key().as_str()) { + transport: dummy.clone(), + tokens: r3.tokens.clone(), + ctx: r3.ctx.clone(), + err: r3.err.clone(), +}) + } +let e = eat(&r3.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); +tokens = match (*e.clone()).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), + EatResult::EatUnchanged { .. } => r3.tokens.clone(), +}; +ctx = r3.ctx.clone(); +if (fname.clone().as_str() == transport_url_key().as_str()) { { let __tco_0 = Some(r3.expr.clone()); - base_url = __tco_0; - continue; - } - } else { +base_url = __tco_0; +continue; +} +} else { if (fname.clone().as_str() == transport_method_key().as_str()) { { let __tco_0 = Some(r3.expr.clone()); - method = __tco_0; - continue; - } - } else { +method = __tco_0; +continue; +} +} else { if (fname.clone().as_str() == transport_path_template_key().as_str()) { { let __tco_0 = Some(r3.expr.clone()); - path_template = __tco_0; - continue; - } - } else { +path_template = __tco_0; +continue; +} +} else { if (fname.clone().as_str() == transport_query_key().as_str()) { { let __tco_0 = Some(r3.expr.clone()); - query = __tco_0; - continue; - } - } else { +query = __tco_0; +continue; +} +} else { if (fname.clone().as_str() == transport_body_key().as_str()) { { let __tco_0 = Some(r3.expr.clone()); - request_body = __tco_0; - continue; - } - } else { - if (fname.clone().as_str() - == transport_response_format_key().as_str()) - { +request_body = __tco_0; +continue; +} +} else { + if (fname.clone().as_str() == transport_response_format_key().as_str()) { { let __tco_0 = Some(r3.expr.clone()); - response_format = __tco_0; - continue; - } - } else { - if (fname.clone().as_str() == transport_headers_key().as_str()) - { +response_format = __tco_0; +continue; +} +} else { + if (fname.clone().as_str() == transport_headers_key().as_str()) { let h = match (*r3.expr.clone().expr_data.clone()).clone() { ExprData::ExprRecordLit { .. } => r3.expr.clone().children.clone(), _ => return Rc::new(TransportResult { @@ -6722,1048 +5624,812 @@ pub fn parse_rest_fields( }), "".to_string())), }), }; - { +{ let __tco_0 = h; - headers = __tco_0; - continue; - } - } else { +headers = __tco_0; +continue; +} +} else { { continue; - } - } - } - } - } - } - } - } - } - } +} +} +} +} +} +} +} +} +} +} } -pub fn parse_shell_binding_body( - tokens: Rc>>, - ctx: Rc, -) -> Rc { +pub fn parse_shell_binding_body(tokens: Rc>>, ctx: Rc) -> Rc { parse_shell_fields(tokens, ctx, Rc::new(vec![]), None) } -pub fn parse_shell_fields( - mut tokens: Rc>>, - mut ctx: Rc, - mut argv: Rc>>, - mut stdin: Option>, -) -> Rc { +pub fn parse_shell_fields(mut tokens: Rc>>, mut ctx: Rc, mut argv: Rc>>, mut stdin: Option>) -> Rc { loop { tokens = skip_newlines(tokens.clone()); - let span = token_span(tokens.clone().first().cloned()); - let dummy = local_transport_node(span.clone()); - if (tok_is_rbrace(tokens.clone().first().cloned()) - || tok_is_eof(tokens.clone().first().cloned())) - { +let span = token_span(tokens.clone().first().cloned()); +let dummy = local_transport_node(span.clone()); +if (tok_is_rbrace(tokens.clone().first().cloned()) || tok_is_eof(tokens.clone().first().cloned())) { break Rc::new(TransportResult { - transport: shell_transport_node(argv, Rc::new(vec![]), stdin, &span), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }); - } else { + transport: shell_transport_node(argv, Rc::new(vec![]), stdin, &span), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}); +} else { let r = expect_ident(&tokens); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); + transport: dummy.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) } - let fname = r.name.clone(); - let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); - if has_err(r2.err.clone()) { +let fname = r.name.clone(); +let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); +if has_err(r2.err.clone()) { return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), - }); + transport: dummy.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), +}) } - if (fname.clone().as_str() == "argv".to_string().as_str()) { +if (fname.clone().as_str() == "argv".to_string().as_str()) { let r3 = expect(&r2.tokens.clone(), &Rc::new(ExpectedToken::ExpectLBracket)); - if has_err(r3.err.clone()) { +if has_err(r3.err.clone()) { return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r3.tokens.clone(), - ctx: ctx.clone(), - err: r3.err.clone(), - }); + transport: dummy.clone(), + tokens: r3.tokens.clone(), + ctx: ctx.clone(), + err: r3.err.clone(), +}) } - let r4 = parse_expr_list_until( - r3.tokens.clone(), - ctx.clone(), - Rc::new(ExpectedToken::ExpectRBracket), - ); - if has_err(r4.err.clone()) { +let r4 = parse_expr_list_until(r3.tokens.clone(), ctx.clone(), Rc::new(ExpectedToken::ExpectRBracket)); +if has_err(r4.err.clone()) { return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r4.tokens.clone(), - ctx: r4.ctx.clone(), - err: r4.err.clone(), - }); + transport: dummy.clone(), + tokens: r4.tokens.clone(), + ctx: r4.ctx.clone(), + err: r4.err.clone(), +}) } - let r5 = expect(&r4.tokens.clone(), &Rc::new(ExpectedToken::ExpectRBracket)); - if has_err(r5.err.clone()) { +let r5 = expect(&r4.tokens.clone(), &Rc::new(ExpectedToken::ExpectRBracket)); +if has_err(r5.err.clone()) { return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r5.tokens.clone(), - ctx: r4.ctx.clone(), - err: r5.err.clone(), - }); - } - let e = eat(&r5.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); - tokens = match (*e).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), - EatResult::EatUnchanged { .. } => r5.tokens.clone(), - }; - { + transport: dummy.clone(), + tokens: r5.tokens.clone(), + ctx: r4.ctx.clone(), + err: r5.err.clone(), +}) + } +let e = eat(&r5.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); +tokens = match (*e).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), + EatResult::EatUnchanged { .. } => r5.tokens.clone(), +}; +{ let __tco_0 = r4.ctx.clone(); - let __tco_1 = r4.exprs.clone(); - ctx = __tco_0; - argv = __tco_1; - continue; - } - } else { +let __tco_1 = r4.exprs.clone(); +ctx = __tco_0; +argv = __tco_1; +continue; +} +} else { if (fname.clone().as_str() == transport_stdin_key().as_str()) { let r3 = parse_expr(r2.tokens.clone(), ctx.clone()); - if has_err(r3.err.clone()) { +if has_err(r3.err.clone()) { return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r3.tokens.clone(), - ctx: r3.ctx.clone(), - err: r3.err.clone(), - }); + transport: dummy.clone(), + tokens: r3.tokens.clone(), + ctx: r3.ctx.clone(), + err: r3.err.clone(), +}) } - let e = eat(&r3.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); - tokens = match (*e).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), - EatResult::EatUnchanged { .. } => r3.tokens.clone(), - }; - { +let e = eat(&r3.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); +tokens = match (*e).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), + EatResult::EatUnchanged { .. } => r3.tokens.clone(), +}; +{ let __tco_0 = r3.ctx.clone(); - let __tco_1 = Some(r3.expr.clone()); - ctx = __tco_0; - stdin = __tco_1; - continue; - } - } else { +let __tco_1 = Some(r3.expr.clone()); +ctx = __tco_0; +stdin = __tco_1; +continue; +} +} else { let r3 = parse_expr(r2.tokens.clone(), ctx.clone()); - if has_err(r3.err.clone()) { +if has_err(r3.err.clone()) { return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r3.tokens.clone(), - ctx: r3.ctx.clone(), - err: r3.err.clone(), - }); + transport: dummy.clone(), + tokens: r3.tokens.clone(), + ctx: r3.ctx.clone(), + err: r3.err.clone(), +}) } - let e = eat(&r3.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); - tokens = match (*e).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), - EatResult::EatUnchanged { .. } => r3.tokens.clone(), - }; - { +let e = eat(&r3.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); +tokens = match (*e).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), + EatResult::EatUnchanged { .. } => r3.tokens.clone(), +}; +{ let __tco_0 = r3.ctx.clone(); - ctx = __tco_0; - continue; - } - } - } - } - } +ctx = __tco_0; +continue; +} +} +} +} +} } -pub fn parse_file_binding_body( - tokens: Rc>>, - ctx: Rc, -) -> Rc { +pub fn parse_file_binding_body(tokens: Rc>>, ctx: Rc) -> Rc { parse_file_fields(tokens, ctx, None) } -pub fn parse_file_fields( - mut tokens: Rc>>, - mut ctx: Rc, - mut base_path: Option>, -) -> Rc { +pub fn parse_file_fields(mut tokens: Rc>>, mut ctx: Rc, mut base_path: Option>) -> Rc { loop { tokens = skip_newlines(tokens.clone()); - let span = token_span(tokens.clone().first().cloned()); - let dummy = local_transport_node(span.clone()); - if (tok_is_rbrace(tokens.clone().first().cloned()) - || tok_is_eof(tokens.clone().first().cloned())) - { +let span = token_span(tokens.clone().first().cloned()); +let dummy = local_transport_node(span.clone()); +if (tok_is_rbrace(tokens.clone().first().cloned()) || tok_is_eof(tokens.clone().first().cloned())) { let bp = match base_path { - Some(e) => e.clone(), - None => make_expr_node( - Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitStr { - value: "".to_string(), - }), - }), - Rc::new(vec![]), - None, - make_span(0, 0), - ), - }; - break Rc::new(TransportResult { - transport: file_transport_node(bp, span.clone()), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }); - } else { + Some(e) => e.clone(), + None => make_expr_node(Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitStr { + value: "".to_string(), +}), +}), Rc::new(vec![]), None, make_span(0, 0)), +}; +break Rc::new(TransportResult { + transport: file_transport_node(bp, span.clone()), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}); +} else { let r = expect_ident(&tokens); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); + transport: dummy.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) } - let fname = r.name.clone(); - let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); - if has_err(r2.err.clone()) { +let fname = r.name.clone(); +let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); +if has_err(r2.err.clone()) { return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), - }); + transport: dummy.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), +}) } - let r3 = parse_expr(r2.tokens.clone(), ctx.clone()); - if has_err(r3.err.clone()) { +let r3 = parse_expr(r2.tokens.clone(), ctx.clone()); +if has_err(r3.err.clone()) { return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r3.tokens.clone(), - ctx: r3.ctx.clone(), - err: r3.err.clone(), - }); - } - let e = eat(&r3.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); - tokens = match (*e.clone()).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), - EatResult::EatUnchanged { .. } => r3.tokens.clone(), - }; - if ((fname.clone().as_str() == "path".to_string().as_str()) - || (fname.clone().as_str() == transport_path_key().as_str())) - { + transport: dummy.clone(), + tokens: r3.tokens.clone(), + ctx: r3.ctx.clone(), + err: r3.err.clone(), +}) + } +let e = eat(&r3.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); +tokens = match (*e.clone()).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), + EatResult::EatUnchanged { .. } => r3.tokens.clone(), +}; +if ((fname.clone().as_str() == "path".to_string().as_str()) || (fname.clone().as_str() == transport_path_key().as_str())) { { let __tco_0 = r3.ctx.clone(); - let __tco_1 = Some(r3.expr.clone()); - ctx = __tco_0; - base_path = __tco_1; - continue; - } - } else { +let __tco_1 = Some(r3.expr.clone()); +ctx = __tco_0; +base_path = __tco_1; +continue; +} +} else { { let __tco_0 = r3.ctx.clone(); - ctx = __tco_0; - continue; - } - } - } - } +ctx = __tco_0; +continue; +} +} +} +} } pub fn parse_operation_def(tokens: &Rc>>, ctx: &Rc) -> Rc { { let start_span = token_span(tokens.clone().first().cloned()); - let dummy_op = make_operation_node( - "".to_string(), - None, - Rc::new(vec![]), - Rc::new(vec![]), - Rc::new(vec![]), - Rc::new(vec![]), - Rc::new(vec![]), - Rc::new(vec![]), - None, - &start_span, - &ctx.source_indices.clone(), - ); - let r = expect( - &tokens, - &Rc::new(ExpectedToken::ExpectKeyword { - text: "operation".to_string(), - }), - ); - if has_err(r.err.clone()) { +let dummy_op = make_operation_node("".to_string(), None, Rc::new(vec![]), Rc::new(vec![]), Rc::new(vec![]), Rc::new(vec![]), Rc::new(vec![]), Rc::new(vec![]), None, &start_span, &ctx.source_indices.clone()); +let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { + text: "operation".to_string(), +})); +if has_err(r.err.clone()) { return Rc::new(OpResult { - operation: dummy_op.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let r = expect_ident(&r.tokens.clone()); - if has_err(r.err.clone()) { + operation: dummy_op.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let r = expect_ident(&r.tokens.clone()); +if has_err(r.err.clone()) { return Rc::new(OpResult { - operation: dummy_op.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let name = r.name.clone(); - let name_span = r.span.clone(); - let tokens = skip_newlines(r.tokens.clone()); - if tok_is_lbrace(tokens.clone().first().cloned()) { + operation: dummy_op.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let name = r.name.clone(); +let name_span = r.span.clone(); +let tokens = skip_newlines(r.tokens.clone()); +if tok_is_lbrace(tokens.clone().first().cloned()) { parse_operation_v1_body(&tokens, &ctx, name, name_span, &start_span) } else { parse_operation_v2_inline(&tokens, &ctx, name, name_span, &start_span) } - } +} } -pub fn parse_operation_v2_inline( - tokens: &Rc>>, - ctx: &Rc, - name: String, - name_span: Rc, - start_span: &Rc, -) -> Rc { +pub fn parse_operation_v2_inline(tokens: &Rc>>, ctx: &Rc, name: String, name_span: Rc, start_span: &Rc) -> Rc { { - let dummy_op = make_operation_node( - "".to_string(), - None, - Rc::new(vec![]), - Rc::new(vec![]), - Rc::new(vec![]), - Rc::new(vec![]), - Rc::new(vec![]), - Rc::new(vec![]), - None, - &start_span, - &ctx.source_indices.clone(), - ); - let mods_r = parse_operation_modifiers(tokens.clone(), ctx.clone()); - let modifiers = mods_r.modifiers.clone(); - let mod_props = modifiers_to_props(modifiers, start_span.clone()); - let tokens = mods_r.tokens.clone(); - let ctx = mods_r.ctx.clone(); - let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectLParen)); - if has_err(r.err.clone()) { + let dummy_op = make_operation_node("".to_string(), None, Rc::new(vec![]), Rc::new(vec![]), Rc::new(vec![]), Rc::new(vec![]), Rc::new(vec![]), Rc::new(vec![]), None, &start_span, &ctx.source_indices.clone()); +let mods_r = parse_operation_modifiers(tokens.clone(), ctx.clone()); +let modifiers = mods_r.modifiers.clone(); +let mod_props = modifiers_to_props(modifiers, start_span.clone()); +let tokens = mods_r.tokens.clone(); +let ctx = mods_r.ctx.clone(); +let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectLParen)); +if has_err(r.err.clone()) { return Rc::new(OpResult { - operation: dummy_op.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let r = parse_field_list(skip_newlines(r.tokens.clone()), ctx.clone()); - if has_err(r.err.clone()) { + operation: dummy_op.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let r = parse_field_list(skip_newlines(r.tokens.clone()), ctx.clone()); +if has_err(r.err.clone()) { return Rc::new(OpResult { - operation: dummy_op.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let inputs = r.fields.clone(); - let r = expect( - &skip_newlines(r.tokens.clone()), - &Rc::new(ExpectedToken::ExpectRParen), - ); - if has_err(r.err.clone()) { + operation: dummy_op.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let inputs = r.fields.clone(); +let r = expect(&skip_newlines(r.tokens.clone()), &Rc::new(ExpectedToken::ExpectRParen)); +if has_err(r.err.clone()) { return Rc::new(OpResult { - operation: dummy_op.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let tokens = r.tokens.clone(); - let ret = parse_optional_inferred(&tokens, ctx.clone()); - if has_err(ret.err.clone()) { + operation: dummy_op.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let tokens = r.tokens.clone(); +let ret = parse_optional_inferred(&tokens, ctx.clone()); +if has_err(ret.err.clone()) { return Rc::new(OpResult { - operation: dummy_op.clone(), - tokens: ret.tokens.clone(), - ctx: ret.ctx.clone(), - err: ret.err.clone(), - }); - } - let tokens = ret.tokens.clone(); - let ctx = ret.ctx.clone(); - let outputs = match ret.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - node_inferred_to_outputs(&rt, ctx.source_indices.clone()) - } - _ => Rc::new(vec![]), - }; - let tokens = skip_newlines(tokens.clone()); - let resp_r = parse_optional_response_block(&tokens, &ctx); - if has_err(resp_r.err.clone()) { + operation: dummy_op.clone(), + tokens: ret.tokens.clone(), + ctx: ret.ctx.clone(), + err: ret.err.clone(), +}) + } +let tokens = ret.tokens.clone(); +let ctx = ret.ctx.clone(); +let outputs = match ret.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => node_inferred_to_outputs(&rt, ctx.source_indices.clone()), + _ => Rc::new(vec![]), +}; +let tokens = skip_newlines(tokens.clone()); +let resp_r = parse_optional_response_block(&tokens, &ctx); +if has_err(resp_r.err.clone()) { return Rc::new(OpResult { - operation: dummy_op.clone(), - tokens: resp_r.tokens.clone(), - ctx: resp_r.ctx.clone(), - err: resp_r.err.clone(), - }); - } - let tokens = skip_newlines(resp_r.tokens.clone()); - let ctx = resp_r.ctx.clone(); - let mock_r = parse_optional_mock_response_block(&tokens, &ctx); - if has_err(mock_r.err.clone()) { + operation: dummy_op.clone(), + tokens: resp_r.tokens.clone(), + ctx: resp_r.ctx.clone(), + err: resp_r.err.clone(), +}) + } +let tokens = skip_newlines(resp_r.tokens.clone()); +let ctx = resp_r.ctx.clone(); +let mock_r = parse_optional_mock_response_block(&tokens, &ctx); +if has_err(mock_r.err.clone()) { return Rc::new(OpResult { - operation: dummy_op.clone(), - tokens: mock_r.tokens.clone(), - ctx: mock_r.ctx.clone(), - err: mock_r.err.clone(), - }); - } - let tokens = skip_newlines(mock_r.tokens.clone()); - let ctx = mock_r.ctx.clone(); - let op = make_operation_node( - name, - Some(name_span), - inputs, - outputs, - resp_r.responses.clone(), - mock_r.mocks.clone(), - Rc::new(vec![]), - mod_props, - None, - &start_span, - &ctx.source_indices.clone(), - ); - Rc::new(OpResult { - operation: op, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }) - } + operation: dummy_op.clone(), + tokens: mock_r.tokens.clone(), + ctx: mock_r.ctx.clone(), + err: mock_r.err.clone(), +}) + } +let tokens = skip_newlines(mock_r.tokens.clone()); +let ctx = mock_r.ctx.clone(); +let op = make_operation_node(name, Some(name_span), inputs, outputs, resp_r.responses.clone(), mock_r.mocks.clone(), Rc::new(vec![]), mod_props, None, &start_span, &ctx.source_indices.clone()); +Rc::new(OpResult { + operation: op, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}) +} } -pub fn parse_operation_v1_body( - tokens: &Rc>>, - ctx: &Rc, - name: String, - name_span: Rc, - start_span: &Rc, -) -> Rc { +pub fn parse_operation_v1_body(tokens: &Rc>>, ctx: &Rc, name: String, name_span: Rc, start_span: &Rc) -> Rc { { - let dummy_op = make_operation_node( - "".to_string(), - None, - Rc::new(vec![]), - Rc::new(vec![]), - Rc::new(vec![]), - Rc::new(vec![]), - Rc::new(vec![]), - Rc::new(vec![]), - None, - &start_span, - &ctx.source_indices.clone(), - ); - let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectLBrace)); - if has_err(r.err.clone()) { + let dummy_op = make_operation_node("".to_string(), None, Rc::new(vec![]), Rc::new(vec![]), Rc::new(vec![]), Rc::new(vec![]), Rc::new(vec![]), Rc::new(vec![]), None, &start_span, &ctx.source_indices.clone()); +let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectLBrace)); +if has_err(r.err.clone()) { return Rc::new(OpResult { - operation: dummy_op.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let tokens = skip_newlines(r.tokens.clone()); - let r2 = parse_op_body_entries( - tokens.clone(), - ctx.clone(), - Rc::new(vec![]), - Rc::new(vec![]), - Rc::new(vec![]), - None, - Rc::new(vec![]), - Rc::new(vec![]), - Rc::new(vec![]), - ); - if has_err(r2.err.clone()) { + operation: dummy_op.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let tokens = skip_newlines(r.tokens.clone()); +let r2 = parse_op_body_entries(tokens.clone(), ctx.clone(), Rc::new(vec![]), Rc::new(vec![]), Rc::new(vec![]), None, Rc::new(vec![]), Rc::new(vec![]), Rc::new(vec![])); +if has_err(r2.err.clone()) { return Rc::new(OpResult { - operation: dummy_op.clone(), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), - }); - } - let r3 = expect( - &skip_newlines(r2.tokens.clone()), - &Rc::new(ExpectedToken::ExpectRBrace), - ); - if has_err(r3.err.clone()) { + operation: dummy_op.clone(), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), +}) + } +let r3 = expect(&skip_newlines(r2.tokens.clone()), &Rc::new(ExpectedToken::ExpectRBrace)); +if has_err(r3.err.clone()) { return Rc::new(OpResult { - operation: dummy_op.clone(), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: r3.err.clone(), - }); - } - let op = make_operation_node( - name, - Some(name_span), - r2.inputs.clone(), - r2.outputs.clone(), - r2.response_props.clone(), - r2.mock_props.clone(), - r2.exit_props.clone(), - r2.modifier_props.clone(), - r2.transport.clone(), - &start_span, - &ctx.source_indices.clone(), - ); - Rc::new(OpResult { - operation: op, - tokens: skip_newlines(r3.tokens.clone()), - ctx: r2.ctx.clone(), - err: None, - }) - } + operation: dummy_op.clone(), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: r3.err.clone(), +}) + } +let op = make_operation_node(name, Some(name_span), r2.inputs.clone(), r2.outputs.clone(), r2.response_props.clone(), r2.mock_props.clone(), r2.exit_props.clone(), r2.modifier_props.clone(), r2.transport.clone(), &start_span, &ctx.source_indices.clone()); +Rc::new(OpResult { + operation: op, + tokens: skip_newlines(r3.tokens.clone()), + ctx: r2.ctx.clone(), + err: None, +}) +} } -pub fn parse_op_body_entries( - mut tokens: Rc>>, - mut ctx: Rc, - mut inputs: Rc>>, - mut outputs: Rc>>, - mut modifier_props: Rc>>, - mut transport: Option>, - mut exit_props: Rc>>, - mut response_props: Rc>>, - mut mock_props: Rc>>, -) -> Rc { +pub fn parse_op_body_entries(mut tokens: Rc>>, mut ctx: Rc, mut inputs: Rc>>, mut outputs: Rc>>, mut modifier_props: Rc>>, mut transport: Option>, mut exit_props: Rc>>, mut response_props: Rc>>, mut mock_props: Rc>>) -> Rc { loop { tokens = skip_newlines(tokens.clone()); - let tok = tokens.clone().first().cloned(); - let span = token_span(tok.clone()); - let mk_result = Rc::new(OpBodyResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - modifier_props: modifier_props.clone(), - transport: transport.clone(), - exit_props: exit_props.clone(), - response_props: response_props.clone(), - mock_props: mock_props.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }); - if (tok_is_rbrace(tok.clone()) || tok_is_eof(tok.clone())) { +let tok = tokens.clone().first().cloned(); +let span = token_span(tok.clone()); +let mk_result = Rc::new(OpBodyResult { + inputs: inputs.clone(), + outputs: outputs.clone(), + modifier_props: modifier_props.clone(), + transport: transport.clone(), + exit_props: exit_props.clone(), + response_props: response_props.clone(), + mock_props: mock_props.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}); +if (tok_is_rbrace(tok.clone()) || tok_is_eof(tok.clone())) { break mk_result; - } else { +} else { let sh = match tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, - }; - match sh { - Some(TokenShape::ShKeyword) => { - let kw_text = tok.clone().unwrap().text.clone(); - if (kw_text.clone().as_str() == "input".to_string().as_str()) { - let r = expect( - &Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - &Rc::new(ExpectedToken::ExpectLBrace), - ); - if has_err(r.err.clone()) { - return Rc::new(OpBodyResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - modifier_props: modifier_props.clone(), - transport: transport.clone(), - exit_props: exit_props.clone(), - response_props: response_props.clone(), - mock_props: mock_props.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let r2 = parse_field_list(skip_newlines(r.tokens.clone()), ctx.clone()); - if has_err(r2.err.clone()) { - return Rc::new(OpBodyResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - modifier_props: modifier_props.clone(), - transport: transport.clone(), - exit_props: exit_props.clone(), - response_props: response_props.clone(), - mock_props: mock_props.clone(), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), - }); - } - let r3 = expect( - &skip_newlines(r2.tokens.clone()), - &Rc::new(ExpectedToken::ExpectRBrace), - ); - if has_err(r3.err.clone()) { - return Rc::new(OpBodyResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - modifier_props: modifier_props.clone(), - transport: transport.clone(), - exit_props: exit_props.clone(), - response_props: response_props.clone(), - mock_props: mock_props.clone(), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: r3.err.clone(), - }); - } - { - let __tco_0 = r3.tokens.clone(); - let __tco_1 = r2.ctx.clone(); - let __tco_2 = r2.fields.clone(); - tokens = __tco_0; - ctx = __tco_1; - inputs = __tco_2; - continue; - } - } else { - if (kw_text.clone().as_str() == "output".to_string().as_str()) { - let r = expect( - &Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - &Rc::new(ExpectedToken::ExpectLBrace), - ); - if has_err(r.err.clone()) { - return Rc::new(OpBodyResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - modifier_props: modifier_props.clone(), - transport: transport.clone(), - exit_props: exit_props.clone(), - response_props: response_props.clone(), - mock_props: mock_props.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let r2 = parse_field_list(skip_newlines(r.tokens.clone()), ctx.clone()); - if has_err(r2.err.clone()) { - return Rc::new(OpBodyResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - modifier_props: modifier_props.clone(), - transport: transport.clone(), - exit_props: exit_props.clone(), - response_props: response_props.clone(), - mock_props: mock_props.clone(), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), - }); - } - let r3 = expect( - &skip_newlines(r2.tokens.clone()), - &Rc::new(ExpectedToken::ExpectRBrace), - ); - if has_err(r3.err.clone()) { - return Rc::new(OpBodyResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - modifier_props: modifier_props.clone(), - transport: transport.clone(), - exit_props: exit_props.clone(), - response_props: response_props.clone(), - mock_props: mock_props.clone(), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: r3.err.clone(), - }); - } - { - let __tco_0 = r3.tokens.clone(); - let __tco_1 = r2.ctx.clone(); - let __tco_2 = r2.fields.clone(); - tokens = __tco_0; - ctx = __tco_1; - outputs = __tco_2; - continue; - } - } else { - if (kw_text.clone().as_str() == "idempotent".to_string().as_str()) { - let prop = modifier_to_prop("idempotent".to_string(), &span); - { - let __tco_0 = Rc::new( - tokens.iter().cloned().skip(1 as usize).collect::>(), - ); - let __tco_1 = v2_rt::rc_list_push(modifier_props, prop); - tokens = __tco_0; - modifier_props = __tco_1; - continue; - } - } else { - if (kw_text.clone().as_str() == "readonly".to_string().as_str()) { - let prop = modifier_to_prop("readonly".to_string(), &span); - { - let __tco_0 = Rc::new( - tokens - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ); - let __tco_1 = v2_rt::rc_list_push(modifier_props, prop); - tokens = __tco_0; - modifier_props = __tco_1; - continue; - } - } else { - if (kw_text.clone().as_str() == "hermetic".to_string().as_str()) - { - let prop = modifier_to_prop("hermetic".to_string(), &span); - { - let __tco_0 = Rc::new( - tokens - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ); - let __tco_1 = v2_rt::rc_list_push(modifier_props, prop); - tokens = __tco_0; - modifier_props = __tco_1; - continue; - } - } else { - break mk_result; - } - } - } - } + Some(t) => Some(t.shape.clone()), + None => None, +}; +match sh { + Some(TokenShape::ShKeyword) => { let kw_text = tok.clone().unwrap().text.clone(); +if (kw_text.clone().as_str() == "input".to_string().as_str()) { + let r = expect(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), &Rc::new(ExpectedToken::ExpectLBrace)); +if has_err(r.err.clone()) { + return Rc::new(OpBodyResult { + inputs: inputs.clone(), + outputs: outputs.clone(), + modifier_props: modifier_props.clone(), + transport: transport.clone(), + exit_props: exit_props.clone(), + response_props: response_props.clone(), + mock_props: mock_props.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let r2 = parse_field_list(skip_newlines(r.tokens.clone()), ctx.clone()); +if has_err(r2.err.clone()) { + return Rc::new(OpBodyResult { + inputs: inputs.clone(), + outputs: outputs.clone(), + modifier_props: modifier_props.clone(), + transport: transport.clone(), + exit_props: exit_props.clone(), + response_props: response_props.clone(), + mock_props: mock_props.clone(), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), +}) + } +let r3 = expect(&skip_newlines(r2.tokens.clone()), &Rc::new(ExpectedToken::ExpectRBrace)); +if has_err(r3.err.clone()) { + return Rc::new(OpBodyResult { + inputs: inputs.clone(), + outputs: outputs.clone(), + modifier_props: modifier_props.clone(), + transport: transport.clone(), + exit_props: exit_props.clone(), + response_props: response_props.clone(), + mock_props: mock_props.clone(), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: r3.err.clone(), +}) + } +{ + let __tco_0 = r3.tokens.clone(); +let __tco_1 = r2.ctx.clone(); +let __tco_2 = r2.fields.clone(); +tokens = __tco_0; +ctx = __tco_1; +inputs = __tco_2; +continue; +} +} else { + if (kw_text.clone().as_str() == "output".to_string().as_str()) { + let r = expect(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), &Rc::new(ExpectedToken::ExpectLBrace)); +if has_err(r.err.clone()) { + return Rc::new(OpBodyResult { + inputs: inputs.clone(), + outputs: outputs.clone(), + modifier_props: modifier_props.clone(), + transport: transport.clone(), + exit_props: exit_props.clone(), + response_props: response_props.clone(), + mock_props: mock_props.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) } - } - Some(TokenShape::ShIdent) => { - let id = tok.clone().unwrap().text.clone(); - if (id.clone().as_str() == "transport".to_string().as_str()) { - let r = parse_transport_binding( - &Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - &ctx, - ); - if has_err(r.err.clone()) { +let r2 = parse_field_list(skip_newlines(r.tokens.clone()), ctx.clone()); +if has_err(r2.err.clone()) { + return Rc::new(OpBodyResult { + inputs: inputs.clone(), + outputs: outputs.clone(), + modifier_props: modifier_props.clone(), + transport: transport.clone(), + exit_props: exit_props.clone(), + response_props: response_props.clone(), + mock_props: mock_props.clone(), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), +}) + } +let r3 = expect(&skip_newlines(r2.tokens.clone()), &Rc::new(ExpectedToken::ExpectRBrace)); +if has_err(r3.err.clone()) { + return Rc::new(OpBodyResult { + inputs: inputs.clone(), + outputs: outputs.clone(), + modifier_props: modifier_props.clone(), + transport: transport.clone(), + exit_props: exit_props.clone(), + response_props: response_props.clone(), + mock_props: mock_props.clone(), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: r3.err.clone(), +}) + } +{ + let __tco_0 = r3.tokens.clone(); +let __tco_1 = r2.ctx.clone(); +let __tco_2 = r2.fields.clone(); +tokens = __tco_0; +ctx = __tco_1; +outputs = __tco_2; +continue; +} +} else { + if (kw_text.clone().as_str() == "idempotent".to_string().as_str()) { + let prop = modifier_to_prop("idempotent".to_string(), &span); +{ + let __tco_0 = Rc::new(tokens.iter().cloned().skip(1 as usize).collect::>()); +let __tco_1 = v2_rt::rc_list_push(modifier_props, prop); +tokens = __tco_0; +modifier_props = __tco_1; +continue; +} +} else { + if (kw_text.clone().as_str() == "readonly".to_string().as_str()) { + let prop = modifier_to_prop("readonly".to_string(), &span); +{ + let __tco_0 = Rc::new(tokens.iter().cloned().skip(1 as usize).collect::>()); +let __tco_1 = v2_rt::rc_list_push(modifier_props, prop); +tokens = __tco_0; +modifier_props = __tco_1; +continue; +} +} else { + if (kw_text.clone().as_str() == "hermetic".to_string().as_str()) { + let prop = modifier_to_prop("hermetic".to_string(), &span); +{ + let __tco_0 = Rc::new(tokens.iter().cloned().skip(1 as usize).collect::>()); +let __tco_1 = v2_rt::rc_list_push(modifier_props, prop); +tokens = __tco_0; +modifier_props = __tco_1; +continue; +} +} else { + break mk_result; +} +} +} +} +} }, + Some(TokenShape::ShIdent) => { let id = tok.clone().unwrap().text.clone(); +if (id.clone().as_str() == "transport".to_string().as_str()) { + let r = parse_transport_binding(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), &ctx); +if has_err(r.err.clone()) { + return Rc::new(OpBodyResult { + inputs: inputs.clone(), + outputs: outputs.clone(), + modifier_props: modifier_props.clone(), + transport: transport.clone(), + exit_props: exit_props.clone(), + response_props: response_props.clone(), + mock_props: mock_props.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +{ + let __tco_0 = r.tokens.clone(); +let __tco_1 = r.ctx.clone(); +let __tco_2 = Some(r.transport.clone()); +tokens = __tco_0; +ctx = __tco_1; +transport = __tco_2; +continue; +} +} else { + if (id.clone().as_str() == "exit".to_string().as_str()) { + let r = expect(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), &Rc::new(ExpectedToken::ExpectLBrace)); +if has_err(r.err.clone()) { + return Rc::new(OpBodyResult { + inputs: inputs.clone(), + outputs: outputs.clone(), + modifier_props: modifier_props.clone(), + transport: transport.clone(), + exit_props: exit_props.clone(), + response_props: response_props.clone(), + mock_props: mock_props.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let r2 = parse_exit_entries(skip_newlines(r.tokens.clone()), ctx.clone()); +if has_err(r2.err.clone()) { + return Rc::new(OpBodyResult { + inputs: inputs.clone(), + outputs: outputs.clone(), + modifier_props: modifier_props.clone(), + transport: transport.clone(), + exit_props: exit_props.clone(), + response_props: response_props.clone(), + mock_props: mock_props.clone(), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), +}) + } +let r3 = expect(&skip_newlines(r2.tokens.clone()), &Rc::new(ExpectedToken::ExpectRBrace)); +if has_err(r3.err.clone()) { + return Rc::new(OpBodyResult { + inputs: inputs.clone(), + outputs: outputs.clone(), + modifier_props: modifier_props.clone(), + transport: transport.clone(), + exit_props: exit_props.clone(), + response_props: response_props.clone(), + mock_props: mock_props.clone(), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: r3.err.clone(), +}) + } +{ + let __tco_0 = r3.tokens.clone(); +let __tco_1 = r2.ctx.clone(); +let __tco_2 = r2.entries.clone(); +tokens = __tco_0; +ctx = __tco_1; +exit_props = __tco_2; +continue; +} +} else { + if (id.clone().as_str() == "response".to_string().as_str()) { + let r = parse_optional_response_block(&tokens, &ctx); +if has_err(r.err.clone()) { return Rc::new(OpBodyResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - modifier_props: modifier_props.clone(), - transport: transport.clone(), - exit_props: exit_props.clone(), - response_props: response_props.clone(), - mock_props: mock_props.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); + inputs: inputs.clone(), + outputs: outputs.clone(), + modifier_props: modifier_props.clone(), + transport: transport.clone(), + exit_props: exit_props.clone(), + response_props: response_props.clone(), + mock_props: mock_props.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) } - { +{ let __tco_0 = r.tokens.clone(); - let __tco_1 = r.ctx.clone(); - let __tco_2 = Some(r.transport.clone()); - tokens = __tco_0; - ctx = __tco_1; - transport = __tco_2; - continue; - } - } else { - if (id.clone().as_str() == "exit".to_string().as_str()) { - let r = expect( - &Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - &Rc::new(ExpectedToken::ExpectLBrace), - ); - if has_err(r.err.clone()) { - return Rc::new(OpBodyResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - modifier_props: modifier_props.clone(), - transport: transport.clone(), - exit_props: exit_props.clone(), - response_props: response_props.clone(), - mock_props: mock_props.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let r2 = - parse_exit_entries(skip_newlines(r.tokens.clone()), ctx.clone()); - if has_err(r2.err.clone()) { - return Rc::new(OpBodyResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - modifier_props: modifier_props.clone(), - transport: transport.clone(), - exit_props: exit_props.clone(), - response_props: response_props.clone(), - mock_props: mock_props.clone(), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), - }); - } - let r3 = expect( - &skip_newlines(r2.tokens.clone()), - &Rc::new(ExpectedToken::ExpectRBrace), - ); - if has_err(r3.err.clone()) { +let __tco_1 = r.ctx.clone(); +let __tco_2 = r.responses.clone(); +tokens = __tco_0; +ctx = __tco_1; +response_props = __tco_2; +continue; +} +} else { + if (id.clone().as_str() == "mock_response".to_string().as_str()) { + let r = parse_optional_mock_response_block(&tokens, &ctx); +if has_err(r.err.clone()) { return Rc::new(OpBodyResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - modifier_props: modifier_props.clone(), - transport: transport.clone(), - exit_props: exit_props.clone(), - response_props: response_props.clone(), - mock_props: mock_props.clone(), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: r3.err.clone(), - }); - } - { - let __tco_0 = r3.tokens.clone(); - let __tco_1 = r2.ctx.clone(); - let __tco_2 = r2.entries.clone(); - tokens = __tco_0; - ctx = __tco_1; - exit_props = __tco_2; - continue; + inputs: inputs.clone(), + outputs: outputs.clone(), + modifier_props: modifier_props.clone(), + transport: transport.clone(), + exit_props: exit_props.clone(), + response_props: response_props.clone(), + mock_props: mock_props.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) } - } else { - if (id.clone().as_str() == "response".to_string().as_str()) { - let r = parse_optional_response_block(&tokens, &ctx); - if has_err(r.err.clone()) { +{ + let __tco_0 = r.tokens.clone(); +let __tco_1 = r.ctx.clone(); +let __tco_2 = r.mocks.clone(); +tokens = __tco_0; +ctx = __tco_1; +mock_props = __tco_2; +continue; +} +} else { + if peek_is_colon_after_ident(tokens.clone()) { + let r = expect_ident(&tokens); +if has_err(r.err.clone()) { return Rc::new(OpBodyResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - modifier_props: modifier_props.clone(), - transport: transport.clone(), - exit_props: exit_props.clone(), - response_props: response_props.clone(), - mock_props: mock_props.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); + inputs: inputs.clone(), + outputs: outputs.clone(), + modifier_props: modifier_props.clone(), + transport: transport.clone(), + exit_props: exit_props.clone(), + response_props: response_props.clone(), + mock_props: mock_props.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) } - { - let __tco_0 = r.tokens.clone(); - let __tco_1 = r.ctx.clone(); - let __tco_2 = r.responses.clone(); - tokens = __tco_0; - ctx = __tco_1; - response_props = __tco_2; - continue; +let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); +if has_err(r2.err.clone()) { + return Rc::new(OpBodyResult { + inputs: inputs.clone(), + outputs: outputs.clone(), + modifier_props: modifier_props.clone(), + transport: transport.clone(), + exit_props: exit_props.clone(), + response_props: response_props.clone(), + mock_props: mock_props.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), +}) } - } else { - if (id.clone().as_str() == "mock_response".to_string().as_str()) { - let r = parse_optional_mock_response_block(&tokens, &ctx); - if has_err(r.err.clone()) { - return Rc::new(OpBodyResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - modifier_props: modifier_props.clone(), - transport: transport.clone(), - exit_props: exit_props.clone(), - response_props: response_props.clone(), - mock_props: mock_props.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - { - let __tco_0 = r.tokens.clone(); - let __tco_1 = r.ctx.clone(); - let __tco_2 = r.mocks.clone(); - tokens = __tco_0; - ctx = __tco_1; - mock_props = __tco_2; - continue; - } - } else { - if peek_is_colon_after_ident(tokens.clone()) { - let r = expect_ident(&tokens); - if has_err(r.err.clone()) { - return Rc::new(OpBodyResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - modifier_props: modifier_props.clone(), - transport: transport.clone(), - exit_props: exit_props.clone(), - response_props: response_props.clone(), - mock_props: mock_props.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let r2 = expect( - &r.tokens.clone(), - &Rc::new(ExpectedToken::ExpectColon), - ); - if has_err(r2.err.clone()) { - return Rc::new(OpBodyResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - modifier_props: modifier_props.clone(), - transport: transport.clone(), - exit_props: exit_props.clone(), - response_props: response_props.clone(), - mock_props: mock_props.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), - }); - } - let r3 = parse_expr(r2.tokens.clone(), ctx.clone()); - if has_err(r3.err.clone()) { - return Rc::new(OpBodyResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - modifier_props: modifier_props.clone(), - transport: transport.clone(), - exit_props: exit_props.clone(), - response_props: response_props.clone(), - mock_props: mock_props.clone(), - tokens: r3.tokens.clone(), - ctx: r3.ctx.clone(), - err: r3.err.clone(), - }); - } - { - let __tco_0 = skip_newlines(r3.tokens.clone()); - let __tco_1 = r3.ctx.clone(); - tokens = __tco_0; - ctx = __tco_1; - continue; - } - } else { - break Rc::new(OpBodyResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - modifier_props: modifier_props.clone(), - transport: transport.clone(), - exit_props: exit_props.clone(), - response_props: response_props.clone(), - mock_props: mock_props.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: Some(parse_error( - format!( - "unexpected '{}' in operation body", - id.clone() - ), - span, - )), - }); - } +let r3 = parse_expr(r2.tokens.clone(), ctx.clone()); +if has_err(r3.err.clone()) { + return Rc::new(OpBodyResult { + inputs: inputs.clone(), + outputs: outputs.clone(), + modifier_props: modifier_props.clone(), + transport: transport.clone(), + exit_props: exit_props.clone(), + response_props: response_props.clone(), + mock_props: mock_props.clone(), + tokens: r3.tokens.clone(), + ctx: r3.ctx.clone(), + err: r3.err.clone(), +}) } - } - } - } - } - _ => { - break Rc::new(OpBodyResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - modifier_props: modifier_props.clone(), - transport: transport.clone(), - exit_props: exit_props.clone(), - response_props: response_props.clone(), - mock_props: mock_props.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: Some(parse_error( - "unexpected token in operation body".to_string(), - span, - )), - }); - } - } - } - } +{ + let __tco_0 = skip_newlines(r3.tokens.clone()); +let __tco_1 = r3.ctx.clone(); +tokens = __tco_0; +ctx = __tco_1; +continue; +} +} else { + break Rc::new(OpBodyResult { + inputs: inputs.clone(), + outputs: outputs.clone(), + modifier_props: modifier_props.clone(), + transport: transport.clone(), + exit_props: exit_props.clone(), + response_props: response_props.clone(), + mock_props: mock_props.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: Some(parse_error(format!("unexpected '{}' in operation body", id.clone()), span)), +}); +} +} +} +} +} }, + _ => { break Rc::new(OpBodyResult { + inputs: inputs.clone(), + outputs: outputs.clone(), + modifier_props: modifier_props.clone(), + transport: transport.clone(), + exit_props: exit_props.clone(), + response_props: response_props.clone(), + mock_props: mock_props.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: Some(parse_error("unexpected token in operation body".to_string(), span)), +}); }, +} +} +} } pub fn modifier_to_prop(name: String, span: &Rc) -> Rc { - make_field_init_node( - &name, - make_expr_node( - Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitBool { value: true }), - }), - Rc::new(vec![]), - None, - span.clone(), - ), - span.clone(), - span.clone(), - ) -} - -pub fn modifiers_to_props( - modifiers: Rc>, - span: Rc, -) -> Rc>> { - Rc::new({ - let mut __result = Vec::new(); - for m in modifiers.iter().cloned() { - __result.push(match m.clone() { - OperationModifier::Idempotent => modifier_to_prop("idempotent".to_string(), &span), - OperationModifier::Readonly => modifier_to_prop("readonly".to_string(), &span), - OperationModifier::Hermetic => modifier_to_prop("hermetic".to_string(), &span), - }); - } - __result - }) + make_field_init_node(&name, make_expr_node(Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitBool { + value: true, +}), +}), Rc::new(vec![]), None, span.clone()), span.clone(), span.clone()) } -pub fn status_expr_to_str( - expr: &Rc, - source_indices: Rc>>, -) -> String { +pub fn modifiers_to_props(modifiers: Rc>, span: Rc) -> Rc>> { + Rc::new({ let mut __result = Vec::new(); for m in modifiers.iter().cloned() { __result.push(match m.clone() { + OperationModifier::Idempotent => modifier_to_prop("idempotent".to_string(), &span), + OperationModifier::Readonly => modifier_to_prop("readonly".to_string(), &span), + OperationModifier::Hermetic => modifier_to_prop("hermetic".to_string(), &span), +}); } __result }) +} + +pub fn status_expr_to_str(expr: &Rc, source_indices: Rc>>) -> String { match (*expr.expr_data.clone()).clone() { - ExprData::ExprLiteral { value: v, .. } => match (*v.clone()).clone() { - LiteralValue::LitInt { value: n, .. } => int_to_string(n.clone()), - LiteralValue::LitStr { value: s, .. } => s.clone(), - _ => "_".to_string(), - }, - ExprData::ExprVar { .. } => expr_var_name_at(expr.clone(), source_indices), - _ => "_".to_string(), - } + ExprData::ExprLiteral { value: v, .. } => match (*v.clone()).clone() { + LiteralValue::LitInt { value: n, .. } => int_to_string(n.clone()), + LiteralValue::LitStr { value: s, .. } => s.clone(), + _ => "_".to_string(), +}, + ExprData::ExprVar { .. } => expr_var_name_at(expr.clone(), source_indices), + _ => "_".to_string(), +} } pub fn int_to_string(value: i64) -> String { @@ -7772,8 +6438,8 @@ pub fn int_to_string(value: i64) -> String { } else { { let digits = int_to_string_acc(value.clone(), Rc::new(vec![])); - digits.join(&"".to_string()) - } +digits.join(&"".to_string()) +} } } @@ -7781,2828 +6447,2195 @@ pub fn int_to_string_acc(mut value: i64, mut acc: Rc>) -> Rc>(), - ) - .iter() - .cloned() - { - if (p.0.clone() == digit.clone()) { - __result.push(p); - } - } - __result - }) - .first() - .cloned() - { - Some(p) => p.1.clone(), - None => "?".to_string(), - }; - { +let rest = ((value.clone() - digit.clone()) / 10); +let digit_chars = Rc::new(vec!["0".to_string(), "1".to_string(), "2".to_string(), "3".to_string(), "4".to_string(), "5".to_string(), "6".to_string(), "7".to_string(), "8".to_string(), "9".to_string()]); +let ch = match Rc::new({ let mut __result = Vec::new(); for p in Rc::new(digit_chars.iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { if (p.0.clone() == digit.clone()) { __result.push(p); } } __result }).first().cloned() { + Some(p) => p.1.clone(), + None => "?".to_string(), +}; +{ let __tco_0 = rest; - let __tco_1 = v2_rt::concat(Rc::new(vec![ch]), acc); - value = __tco_0; - acc = __tco_1; - continue; - } - } - } +let __tco_1 = v2_rt::concat(Rc::new(vec![ch]), acc); +value = __tco_0; +acc = __tco_1; +continue; +} +} +} } pub fn first_child_or_self(n: Rc) -> Rc { match n.children.clone().first().cloned() { - Some(ch) => ch.clone(), - None => n.clone(), - } + Some(ch) => ch.clone(), + None => n.clone(), +} } pub fn last_child_or_self(n: Rc) -> Rc { match n.children.clone().last().cloned() { - Some(ch) => ch.clone(), - None => n.clone(), - } + Some(ch) => ch.clone(), + None => n.clone(), +} } -pub fn node_to_name_str( - n: &Rc, - source_indices: &Rc>>, -) -> String { +pub fn node_to_name_str(n: &Rc, source_indices: &Rc>>) -> String { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - let is_optional = (n.return_cardinality.clone() == Cardinality::CardOptional); - let effective_n = if is_optional.clone() { - with_required_cardinality(&n) - } else { - n.clone() - }; - let opt_prefix = if is_optional.clone() { - "Optional_".to_string() - } else { - "".to_string() - }; - let effective_name = authored_name_at(source_indices.clone(), &effective_n); - let is_keyed_container = (is_container_type(effective_name.clone()) - && ((effective_n.children.clone().len() as i64) == 2)); - if is_keyed_container { - match effective_n.children.clone().last().cloned() { - Some(ch) => v2_rt::concat( - v2_rt::concat( - v2_rt::concat(opt_prefix, effective_name.clone()), - "_".to_string(), - ), - node_to_name_str(&ch, &source_indices), - ), - None => v2_rt::concat(opt_prefix, effective_name.clone()), - } - } else { - if (effective_n.type_annotation.clone() != None) { - match effective_n.children.clone().first().cloned() { - Some(ch) => v2_rt::concat(opt_prefix, node_to_name_str(&ch, &source_indices)), - None => v2_rt::concat(opt_prefix, effective_name.clone()), - } + { + let is_optional = (n.return_cardinality.clone() == Cardinality::CardOptional); +let effective_n = if is_optional.clone() { + with_required_cardinality(&n) + } else { + n.clone() + }; +let opt_prefix = if is_optional.clone() { + "Optional_".to_string() + } else { + "".to_string() + }; +let effective_name = authored_name_at(source_indices.clone(), &effective_n); +let is_keyed_container = (is_container_type(effective_name.clone()) && ((effective_n.children.clone().len() as i64) == 2)); +if is_keyed_container { + match effective_n.children.clone().last().cloned() { + Some(ch) => v2_rt::concat(v2_rt::concat(v2_rt::concat(opt_prefix, effective_name.clone()), "_".to_string()), node_to_name_str(&ch, &source_indices)), + None => v2_rt::concat(opt_prefix, effective_name.clone()), +} } else { - if is_container_type(effective_name.clone()) { + if (effective_n.type_annotation.clone() != None) { match effective_n.children.clone().first().cloned() { - Some(ch) => v2_rt::concat( - v2_rt::concat(opt_prefix, "List_".to_string()), - node_to_name_str(&ch, &source_indices), - ), - None => v2_rt::concat(opt_prefix, effective_name.clone()), - } + Some(ch) => v2_rt::concat(opt_prefix, node_to_name_str(&ch, &source_indices)), + None => v2_rt::concat(opt_prefix, effective_name.clone()), +} } else { - if (effective_n.ident_span.clone() == None) { - { - let is_conj = (effective_n.connective.clone() == Connective::Conj); - let is_disj = (effective_n.connective.clone() == Connective::Disj); - if is_conj { - v2_rt::concat(opt_prefix, "Record".to_string()) - } else { - if is_disj { - v2_rt::concat(opt_prefix, "Union".to_string()) + if is_container_type(effective_name.clone()) { + match effective_n.children.clone().first().cloned() { + Some(ch) => v2_rt::concat(v2_rt::concat(opt_prefix, "List_".to_string()), node_to_name_str(&ch, &source_indices)), + None => v2_rt::concat(opt_prefix, effective_name.clone()), +} + } else { + if (effective_n.ident_span.clone() == None) { + { + let is_conj = (effective_n.connective.clone() == Connective::Conj); +let is_disj = (effective_n.connective.clone() == Connective::Disj); +if is_conj { + v2_rt::concat(opt_prefix, "Record".to_string()) } else { - v2_rt::concat(opt_prefix, effective_name.clone()) + if is_disj { + v2_rt::concat(opt_prefix, "Union".to_string()) + } else { + v2_rt::concat(opt_prefix, effective_name.clone()) + } } - } +} + } else { + v2_rt::concat(opt_prefix, effective_name.clone()) } - } else { - v2_rt::concat(opt_prefix, effective_name.clone()) } } } - } +} }) } -pub fn parse_exit_entries( - tokens: Rc>>, - ctx: Rc, -) -> Rc { +pub fn parse_exit_entries(tokens: Rc>>, ctx: Rc) -> Rc { parse_exit_entries_acc(tokens, ctx, Rc::new(vec![])) } -pub fn parse_exit_entries_acc( - mut tokens: Rc>>, - mut ctx: Rc, - mut acc: Rc>>, -) -> Rc { +pub fn parse_exit_entries_acc(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { loop { tokens = skip_newlines(tokens.clone()); - if (tok_is_rbrace(tokens.clone().first().cloned()) - || tok_is_eof(tokens.clone().first().cloned())) - { +if (tok_is_rbrace(tokens.clone().first().cloned()) || tok_is_eof(tokens.clone().first().cloned())) { break Rc::new(ExitEntriesResult { - entries: acc, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }); - } else { + entries: acc, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}); +} else { let r = parse_status_pattern(&tokens, &ctx); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(ExitEntriesResult { - entries: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let code = r.expr.clone(); - let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectFatArrow)); - if has_err(r2.err.clone()) { + entries: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let code = r.expr.clone(); +let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectFatArrow)); +if has_err(r2.err.clone()) { return Rc::new(ExitEntriesResult { - entries: Rc::new(vec![]), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), - }); - } - let r3 = parse_type_expr(&r2.tokens.clone(), &r.ctx.clone()); - if has_err(r3.err.clone()) { + entries: Rc::new(vec![]), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), +}) + } +let r3 = parse_type_expr(&r2.tokens.clone(), &r.ctx.clone()); +if has_err(r3.err.clone()) { return Rc::new(ExitEntriesResult { - entries: Rc::new(vec![]), - tokens: r3.tokens.clone(), - ctx: r3.ctx.clone(), - err: r3.err.clone(), - }); - } - let desc_tok = r3.tokens.clone().first().cloned(); - let desc_sh = match desc_tok { - Some(t) => Some(t.shape.clone()), - None => None, - }; - let desc_tokens = match desc_sh { - Some(TokenShape::ShLitStr) => Rc::new( - r3.tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - _ => r3.tokens.clone(), - }; - let code_str = status_expr_to_str(&code, ctx.source_indices.clone()); - let type_name = node_to_name_str(&r3.type_expr.clone(), &ctx.source_indices.clone()); - let prop_name = v2_rt::concat("exit_".to_string(), code_str); - let entry = make_field_init_node( - &prop_name, - make_named_expr_node( - &type_name, - Rc::new(ExprData::ExprVar { binding_kind: None }), - Rc::new(vec![]), - None, - r3.type_expr.clone().span.clone(), - r3.type_expr.clone().span.clone(), - ), - r3.type_expr.clone().span.clone(), - no_span(), - ); - let e = eat(&desc_tokens, Rc::new(ExpectedToken::ExpectComma)); - tokens = skip_newlines(match (*e).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), - EatResult::EatUnchanged { .. } => desc_tokens.clone(), - }); - { + entries: Rc::new(vec![]), + tokens: r3.tokens.clone(), + ctx: r3.ctx.clone(), + err: r3.err.clone(), +}) + } +let desc_tok = r3.tokens.clone().first().cloned(); +let desc_sh = match desc_tok { + Some(t) => Some(t.shape.clone()), + None => None, +}; +let desc_tokens = match desc_sh { + Some(TokenShape::ShLitStr) => Rc::new(r3.tokens.clone().iter().cloned().skip(1 as usize).collect::>()), + _ => r3.tokens.clone(), +}; +let code_str = status_expr_to_str(&code, ctx.source_indices.clone()); +let type_name = node_to_name_str(&r3.type_expr.clone(), &ctx.source_indices.clone()); +let prop_name = v2_rt::concat("exit_".to_string(), code_str); +let entry = make_field_init_node(&prop_name, make_named_expr_node(&type_name, Rc::new(ExprData::ExprVar { + binding_kind: None, +}), Rc::new(vec![]), None, r3.type_expr.clone().span.clone(), r3.type_expr.clone().span.clone()), r3.type_expr.clone().span.clone(), no_span()); +let e = eat(&desc_tokens, Rc::new(ExpectedToken::ExpectComma)); +tokens = skip_newlines(match (*e).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), + EatResult::EatUnchanged { .. } => desc_tokens.clone(), +}); +{ let __tco_0 = r3.ctx.clone(); - let __tco_1 = v2_rt::rc_list_push(acc, entry); - ctx = __tco_0; - acc = __tco_1; - continue; - } - } - } +let __tco_1 = v2_rt::rc_list_push(acc, entry); +ctx = __tco_0; +acc = __tco_1; +continue; +} +} +} } -pub fn parse_operation_modifiers( - tokens: Rc>>, - ctx: Rc, -) -> Rc { +pub fn parse_operation_modifiers(tokens: Rc>>, ctx: Rc) -> Rc { parse_operation_modifiers_acc(tokens, ctx, Rc::new(vec![])) } -pub fn parse_operation_modifiers_acc( - mut tokens: Rc>>, - mut ctx: Rc, - mut acc: Rc>, -) -> Rc { +pub fn parse_operation_modifiers_acc(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>) -> Rc { loop { let kw = tok_keyword_text(tokens.clone().first().cloned()); - if (kw.clone().as_str() == "idempotent".to_string().as_str()) { +if (kw.clone().as_str() == "idempotent".to_string().as_str()) { { let __tco_0 = Rc::new(tokens.iter().cloned().skip(1 as usize).collect::>()); - let __tco_1 = v2_rt::rc_list_push(acc, OperationModifier::Idempotent); - tokens = __tco_0; - acc = __tco_1; - continue; - } - } else { +let __tco_1 = v2_rt::rc_list_push(acc, OperationModifier::Idempotent); +tokens = __tco_0; +acc = __tco_1; +continue; +} +} else { if (kw.clone().as_str() == "readonly".to_string().as_str()) { { - let __tco_0 = - Rc::new(tokens.iter().cloned().skip(1 as usize).collect::>()); - let __tco_1 = v2_rt::rc_list_push(acc, OperationModifier::Readonly); - tokens = __tco_0; - acc = __tco_1; - continue; - } - } else { + let __tco_0 = Rc::new(tokens.iter().cloned().skip(1 as usize).collect::>()); +let __tco_1 = v2_rt::rc_list_push(acc, OperationModifier::Readonly); +tokens = __tco_0; +acc = __tco_1; +continue; +} +} else { if (kw.clone().as_str() == "hermetic".to_string().as_str()) { { - let __tco_0 = - Rc::new(tokens.iter().cloned().skip(1 as usize).collect::>()); - let __tco_1 = v2_rt::rc_list_push(acc, OperationModifier::Hermetic); - tokens = __tco_0; - acc = __tco_1; - continue; - } - } else { + let __tco_0 = Rc::new(tokens.iter().cloned().skip(1 as usize).collect::>()); +let __tco_1 = v2_rt::rc_list_push(acc, OperationModifier::Hermetic); +tokens = __tco_0; +acc = __tco_1; +continue; +} +} else { break Rc::new(ModsResult { - modifiers: acc, - tokens: tokens.clone(), - ctx: ctx, - err: None, - }); - } - } - } - } + modifiers: acc, + tokens: tokens.clone(), + ctx: ctx, + err: None, +}); +} +} +} +} } pub fn parse_status_pattern(tokens: &Rc>>, ctx: &Rc) -> Rc { { let tok = tokens.clone().first().cloned(); - let sh = match tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, - }; - let span = token_span(tok.clone()); - match sh { - Some(TokenShape::ShLitInt) => { - let n_opt = v2_rt::parse_int(tok.clone().unwrap().text.clone()); - let n = match n_opt { - Some(v) => v.clone(), - None => { - return Rc::new(ExprResult { - expr: make_expr_error_node( - ExprErrorKind::InternalExprError, - &v2_rt::concat( - v2_rt::concat( - "internal: ShLitInt token text not parseable as int: '" - .to_string(), - tok.clone().unwrap().text.clone(), - ), - "'".to_string(), - ), - &span, - ), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }) - } - }; - let next_tok = tokens.clone().get(1 as usize).cloned(); - match next_tok { - Some(t) => { - if (is_ident_shape(t.shape.clone()) - && (t.text.clone().as_str() == "xx".to_string().as_str())) - { - Rc::new(ExprResult { - expr: make_expr_node( - Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitStr { - value: format!("{}xx", n), - }), - }), - Rc::new(vec![]), - None, - span.clone(), - ), - tokens: Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(2 as usize) - .collect::>(), - ), - ctx: ctx.clone(), - err: None, - }) - } else { - Rc::new(ExprResult { - expr: make_expr_node( - Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitInt { value: n }), - }), - Rc::new(vec![]), - None, - span.clone(), - ), - tokens: Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - ctx: ctx.clone(), - err: None, - }) - } - } - None => Rc::new(ExprResult { - expr: make_expr_node( - Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitInt { value: n }), - }), - Rc::new(vec![]), - None, - span.clone(), - ), - tokens: Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - ctx: ctx.clone(), - err: None, - }), - } - } - Some(TokenShape::ShIdent) => { - let id = tok.clone().unwrap().text.clone(); +let sh = match tok.clone() { + Some(t) => Some(t.shape.clone()), + None => None, +}; +let span = token_span(tok.clone()); +match sh { + Some(TokenShape::ShLitInt) => { + let n_opt = v2_rt::parse_int(tok.clone().unwrap().text.clone()); +let n = match n_opt { + Some(v) => v.clone(), + None => return Rc::new(ExprResult { + expr: make_expr_error_node(ExprErrorKind::InternalExprError, &v2_rt::concat(v2_rt::concat("internal: ShLitInt token text not parseable as int: '".to_string(), tok.clone().unwrap().text.clone()), "'".to_string()), &span), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}), +}; +let next_tok = tokens.clone().get(1 as usize).cloned(); +match next_tok { + Some(t) => if (is_ident_shape(t.shape.clone()) && (t.text.clone().as_str() == "xx".to_string().as_str())) { Rc::new(ExprResult { - expr: make_expr_node( - Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitStr { value: id }), - }), - Rc::new(vec![]), - None, - span.clone(), - ), - tokens: Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - ctx: ctx.clone(), - err: None, - }) - } - _ => Rc::new(ExprResult { - expr: make_expr_node( - Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitStr { - value: "_".to_string(), - }), - }), - Rc::new(vec![]), - None, - span.clone(), - ), - tokens: Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - ctx: ctx.clone(), - err: None, - }), - } - } + expr: make_expr_node(Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitStr { + value: format!("{}xx", n), +}), +}), Rc::new(vec![]), None, span.clone()), + tokens: Rc::new(tokens.clone().iter().cloned().skip(2 as usize).collect::>()), + ctx: ctx.clone(), + err: None, +}) + } else { + Rc::new(ExprResult { + expr: make_expr_node(Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitInt { + value: n, +}), +}), Rc::new(vec![]), None, span.clone()), + tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), + ctx: ctx.clone(), + err: None, +}) + }, + None => Rc::new(ExprResult { + expr: make_expr_node(Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitInt { + value: n, +}), +}), Rc::new(vec![]), None, span.clone()), + tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), + ctx: ctx.clone(), + err: None, +}), +} +}, + Some(TokenShape::ShIdent) => { + let id = tok.clone().unwrap().text.clone(); +Rc::new(ExprResult { + expr: make_expr_node(Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitStr { + value: id, +}), +}), Rc::new(vec![]), None, span.clone()), + tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), + ctx: ctx.clone(), + err: None, +}) +}, + _ => Rc::new(ExprResult { + expr: make_expr_node(Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitStr { + value: "_".to_string(), +}), +}), Rc::new(vec![]), None, span.clone()), + tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), + ctx: ctx.clone(), + err: None, +}), +} +} } -pub fn parse_optional_response_block( - tokens: &Rc>>, - ctx: &Rc, -) -> Rc { +pub fn parse_optional_response_block(tokens: &Rc>>, ctx: &Rc) -> Rc { { let tok = tokens.clone().first().cloned(); - let is_response = match tok { - Some(t) => { - (is_ident_shape(t.shape.clone()) - && (t.text.clone().as_str() == "response".to_string().as_str())) - } - None => false, - }; - if is_response { +let is_response = match tok { + Some(t) => (is_ident_shape(t.shape.clone()) && (t.text.clone().as_str() == "response".to_string().as_str())), + None => false, +}; +if is_response { { - let r = expect( - &Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - &Rc::new(ExpectedToken::ExpectLBrace), - ); - if has_err(r.err.clone()) { + let r = expect(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), &Rc::new(ExpectedToken::ExpectLBrace)); +if has_err(r.err.clone()) { return Rc::new(ResponsesResult { - responses: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); + responses: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) } - let r2 = parse_response_entries(skip_newlines(r.tokens.clone()), ctx.clone()); - if has_err(r2.err.clone()) { +let r2 = parse_response_entries(skip_newlines(r.tokens.clone()), ctx.clone()); +if has_err(r2.err.clone()) { return Rc::new(ResponsesResult { - responses: Rc::new(vec![]), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), - }); - } - let r3 = expect( - &skip_newlines(r2.tokens.clone()), - &Rc::new(ExpectedToken::ExpectRBrace), - ); - if has_err(r3.err.clone()) { + responses: Rc::new(vec![]), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), +}) + } +let r3 = expect(&skip_newlines(r2.tokens.clone()), &Rc::new(ExpectedToken::ExpectRBrace)); +if has_err(r3.err.clone()) { return Rc::new(ResponsesResult { - responses: Rc::new(vec![]), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: r3.err.clone(), - }); - } - Rc::new(ResponsesResult { - responses: r2.entries.clone(), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: None, - }) - } + responses: Rc::new(vec![]), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: r3.err.clone(), +}) + } +Rc::new(ResponsesResult { + responses: r2.entries.clone(), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: None, +}) +} } else { Rc::new(ResponsesResult { - responses: Rc::new(vec![]), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }) + responses: Rc::new(vec![]), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}) } - } +} } -pub fn parse_response_entries( - tokens: Rc>>, - ctx: Rc, -) -> Rc { +pub fn parse_response_entries(tokens: Rc>>, ctx: Rc) -> Rc { parse_response_entries_acc(tokens, ctx, Rc::new(vec![])) } -pub fn parse_response_entries_acc( - mut tokens: Rc>>, - mut ctx: Rc, - mut acc: Rc>>, -) -> Rc { +pub fn parse_response_entries_acc(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { loop { tokens = skip_newlines(tokens.clone()); - if (tok_is_rbrace(tokens.clone().first().cloned()) - || tok_is_eof(tokens.clone().first().cloned())) - { +if (tok_is_rbrace(tokens.clone().first().cloned()) || tok_is_eof(tokens.clone().first().cloned())) { break Rc::new(RespEntriesResult { - entries: acc, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }); - } else { + entries: acc, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}); +} else { let r = parse_status_pattern(&tokens, &ctx); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(RespEntriesResult { - entries: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let status = r.expr.clone(); - let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectFatArrow)); - if has_err(r2.err.clone()) { + entries: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let status = r.expr.clone(); +let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectFatArrow)); +if has_err(r2.err.clone()) { return Rc::new(RespEntriesResult { - entries: Rc::new(vec![]), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), - }); - } - let r3 = parse_type_expr(&r2.tokens.clone(), &r.ctx.clone()); - if has_err(r3.err.clone()) { + entries: Rc::new(vec![]), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), +}) + } +let r3 = parse_type_expr(&r2.tokens.clone(), &r.ctx.clone()); +if has_err(r3.err.clone()) { return Rc::new(RespEntriesResult { - entries: Rc::new(vec![]), - tokens: r3.tokens.clone(), - ctx: r3.ctx.clone(), - err: r3.err.clone(), - }); - } - let status_str = status_expr_to_str(&status, ctx.source_indices.clone()); - let type_name = node_to_name_str(&r3.type_expr.clone(), &ctx.source_indices.clone()); - let prop_name = v2_rt::concat("response_".to_string(), status_str); - let entry = make_field_init_node( - &prop_name, - make_named_expr_node( - &type_name, - Rc::new(ExprData::ExprVar { binding_kind: None }), - Rc::new(vec![]), - None, - r3.type_expr.clone().span.clone(), - r3.type_expr.clone().span.clone(), - ), - r3.type_expr.clone().span.clone(), - no_span(), - ); - let e = eat(&r3.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); - tokens = skip_newlines(match (*e).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), - EatResult::EatUnchanged { .. } => r3.tokens.clone(), - }); - { + entries: Rc::new(vec![]), + tokens: r3.tokens.clone(), + ctx: r3.ctx.clone(), + err: r3.err.clone(), +}) + } +let status_str = status_expr_to_str(&status, ctx.source_indices.clone()); +let type_name = node_to_name_str(&r3.type_expr.clone(), &ctx.source_indices.clone()); +let prop_name = v2_rt::concat("response_".to_string(), status_str); +let entry = make_field_init_node(&prop_name, make_named_expr_node(&type_name, Rc::new(ExprData::ExprVar { + binding_kind: None, +}), Rc::new(vec![]), None, r3.type_expr.clone().span.clone(), r3.type_expr.clone().span.clone()), r3.type_expr.clone().span.clone(), no_span()); +let e = eat(&r3.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); +tokens = skip_newlines(match (*e).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), + EatResult::EatUnchanged { .. } => r3.tokens.clone(), +}); +{ let __tco_0 = r3.ctx.clone(); - let __tco_1 = v2_rt::rc_list_push(acc, entry); - ctx = __tco_0; - acc = __tco_1; - continue; - } - } - } +let __tco_1 = v2_rt::rc_list_push(acc, entry); +ctx = __tco_0; +acc = __tco_1; +continue; +} +} +} } -pub fn parse_optional_mock_response_block( - tokens: &Rc>>, - ctx: &Rc, -) -> Rc { +pub fn parse_optional_mock_response_block(tokens: &Rc>>, ctx: &Rc) -> Rc { { let tok = tokens.clone().first().cloned(); - let is_mock = match tok { - Some(t) => { - (is_ident_shape(t.shape.clone()) - && (t.text.clone().as_str() == "mock_response".to_string().as_str())) - } - None => false, - }; - if is_mock { +let is_mock = match tok { + Some(t) => (is_ident_shape(t.shape.clone()) && (t.text.clone().as_str() == "mock_response".to_string().as_str())), + None => false, +}; +if is_mock { { - let r = expect( - &Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - &Rc::new(ExpectedToken::ExpectLBrace), - ); - if has_err(r.err.clone()) { + let r = expect(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), &Rc::new(ExpectedToken::ExpectLBrace)); +if has_err(r.err.clone()) { return Rc::new(MocksResult { - mocks: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); + mocks: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) } - let r2 = parse_mock_response_entries(skip_newlines(r.tokens.clone()), ctx.clone()); - if has_err(r2.err.clone()) { +let r2 = parse_mock_response_entries(skip_newlines(r.tokens.clone()), ctx.clone()); +if has_err(r2.err.clone()) { return Rc::new(MocksResult { - mocks: Rc::new(vec![]), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), - }); - } - let r3 = expect( - &skip_newlines(r2.tokens.clone()), - &Rc::new(ExpectedToken::ExpectRBrace), - ); - if has_err(r3.err.clone()) { + mocks: Rc::new(vec![]), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), +}) + } +let r3 = expect(&skip_newlines(r2.tokens.clone()), &Rc::new(ExpectedToken::ExpectRBrace)); +if has_err(r3.err.clone()) { return Rc::new(MocksResult { - mocks: Rc::new(vec![]), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: r3.err.clone(), - }); - } - Rc::new(MocksResult { - mocks: r2.entries.clone(), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: None, - }) - } + mocks: Rc::new(vec![]), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: r3.err.clone(), +}) + } +Rc::new(MocksResult { + mocks: r2.entries.clone(), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: None, +}) +} } else { Rc::new(MocksResult { - mocks: Rc::new(vec![]), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }) + mocks: Rc::new(vec![]), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}) } - } +} } -pub fn parse_mock_response_entries( - tokens: Rc>>, - ctx: Rc, -) -> Rc { +pub fn parse_mock_response_entries(tokens: Rc>>, ctx: Rc) -> Rc { parse_mock_response_entries_acc(tokens, ctx, Rc::new(vec![])) } -pub fn parse_mock_response_entries_acc( - mut tokens: Rc>>, - mut ctx: Rc, - mut acc: Rc>>, -) -> Rc { +pub fn parse_mock_response_entries_acc(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { loop { tokens = skip_newlines(tokens.clone()); - if (tok_is_rbrace(tokens.clone().first().cloned()) - || tok_is_eof(tokens.clone().first().cloned())) - { +if (tok_is_rbrace(tokens.clone().first().cloned()) || tok_is_eof(tokens.clone().first().cloned())) { break Rc::new(MockEntriesResult { - entries: acc, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }); - } else { + entries: acc, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}); +} else { let r = parse_status_pattern(&tokens, &ctx); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(MockEntriesResult { - entries: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let status = r.expr.clone(); - let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectFatArrow)); - if has_err(r2.err.clone()) { + entries: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let status = r.expr.clone(); +let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectFatArrow)); +if has_err(r2.err.clone()) { return Rc::new(MockEntriesResult { - entries: Rc::new(vec![]), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), - }); - } - let r3 = parse_expr(r2.tokens.clone(), r.ctx.clone()); - if has_err(r3.err.clone()) { + entries: Rc::new(vec![]), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), +}) + } +let r3 = parse_expr(r2.tokens.clone(), r.ctx.clone()); +if has_err(r3.err.clone()) { return Rc::new(MockEntriesResult { - entries: Rc::new(vec![]), - tokens: r3.tokens.clone(), - ctx: r3.ctx.clone(), - err: r3.err.clone(), - }); - } - let body = r3.expr.clone(); - let desc_tok = r3.tokens.clone().first().cloned(); - let desc_sh = match desc_tok { - Some(t) => Some(t.shape.clone()), - None => None, - }; - let desc_tokens = match desc_sh { - Some(TokenShape::ShLitStr) => Rc::new( - r3.tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - _ => r3.tokens.clone(), - }; - let status_str = status_expr_to_str(&status, ctx.source_indices.clone()); - let prop_name = v2_rt::concat("mock_".to_string(), status_str); - let entry = make_field_init_node(&prop_name, body, make_span(0, 0), make_span(0, 0)); - let e = eat(&desc_tokens, Rc::new(ExpectedToken::ExpectComma)); - tokens = skip_newlines(match (*e).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), - EatResult::EatUnchanged { .. } => desc_tokens.clone(), - }); - { + entries: Rc::new(vec![]), + tokens: r3.tokens.clone(), + ctx: r3.ctx.clone(), + err: r3.err.clone(), +}) + } +let body = r3.expr.clone(); +let desc_tok = r3.tokens.clone().first().cloned(); +let desc_sh = match desc_tok { + Some(t) => Some(t.shape.clone()), + None => None, +}; +let desc_tokens = match desc_sh { + Some(TokenShape::ShLitStr) => Rc::new(r3.tokens.clone().iter().cloned().skip(1 as usize).collect::>()), + _ => r3.tokens.clone(), +}; +let status_str = status_expr_to_str(&status, ctx.source_indices.clone()); +let prop_name = v2_rt::concat("mock_".to_string(), status_str); +let entry = make_field_init_node(&prop_name, body, make_span(0, 0), make_span(0, 0)); +let e = eat(&desc_tokens, Rc::new(ExpectedToken::ExpectComma)); +tokens = skip_newlines(match (*e).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), + EatResult::EatUnchanged { .. } => desc_tokens.clone(), +}); +{ let __tco_0 = r3.ctx.clone(); - let __tco_1 = v2_rt::rc_list_push(acc, entry); - ctx = __tco_0; - acc = __tco_1; - continue; - } - } - } +let __tco_1 = v2_rt::rc_list_push(acc, entry); +ctx = __tco_0; +acc = __tco_1; +continue; +} +} +} } pub fn parse_resource_def(tokens: &Rc>>, ctx: &Rc) -> Rc { { let start_span = token_span(tokens.clone().first().cloned()); - let dummy = Rc::new(Node { - name: "".to_string(), - span: start_span.clone(), - ident_span: None, - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - let r = expect( - &tokens, - &Rc::new(ExpectedToken::ExpectKeyword { - text: "resource".to_string(), - }), - ); - if has_err(r.err.clone()) { +let dummy = Rc::new(Node { + name: "".to_string(), + span: start_span.clone(), + ident_span: None, + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { + text: "resource".to_string(), +})); +if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: dummy, - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); + item: dummy, + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) } - parse_resource_after_kw(r.tokens.clone(), &ctx, &start_span) - } +parse_resource_after_kw(r.tokens.clone(), &ctx, &start_span) +} } -pub fn parse_resource_after_kw( - tokens: Rc>>, - ctx: &Rc, - start_span: &Rc, -) -> Rc { +pub fn parse_resource_after_kw(tokens: Rc>>, ctx: &Rc, start_span: &Rc) -> Rc { { let dummy = Rc::new(Node { - name: "".to_string(), - span: start_span.clone(), - ident_span: None, - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - let r = expect_ident(&tokens); - if has_err(r.err.clone()) { + name: "".to_string(), + span: start_span.clone(), + ident_span: None, + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +let r = expect_ident(&tokens); +if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: dummy, - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let name = r.name.clone(); - let name_span = r.span.clone(); - let named_dummy = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - let r = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectLBrace)); - if has_err(r.err.clone()) { + item: dummy, + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let name = r.name.clone(); +let name_span = r.span.clone(); +let named_dummy = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +let r = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectLBrace)); +if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let r = parse_resource_entries( - skip_newlines(r.tokens.clone()), - ctx.clone(), - Rc::new(vec![]), - Rc::new(vec![]), - ); - if has_err(r.err.clone()) { + item: named_dummy.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let r = parse_resource_entries(skip_newlines(r.tokens.clone()), ctx.clone(), Rc::new(vec![]), Rc::new(vec![])); +if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let r2 = expect( - &skip_newlines(r.tokens.clone()), - &Rc::new(ExpectedToken::ExpectRBrace), - ); - if has_err(r2.err.clone()) { + item: named_dummy.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let r2 = expect(&skip_newlines(r.tokens.clone()), &Rc::new(ExpectedToken::ExpectRBrace)); +if has_err(r2.err.clone()) { return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), - }); - } - let item = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: r.capabilities.clone(), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: r.properties.clone(), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - Rc::new(ItemResult { - item: item, - tokens: skip_newlines(r2.tokens.clone()), - ctx: r.ctx.clone(), - err: None, - }) - } + item: named_dummy.clone(), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), +}) + } +let item = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: r.capabilities.clone(), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: r.properties.clone(), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +Rc::new(ItemResult { + item: item, + tokens: skip_newlines(r2.tokens.clone()), + ctx: r.ctx.clone(), + err: None, +}) +} } -pub fn parse_resource_entries( - mut tokens: Rc>>, - mut ctx: Rc, - mut properties: Rc>>, - mut capabilities: Rc>>, -) -> Rc { +pub fn parse_resource_entries(mut tokens: Rc>>, mut ctx: Rc, mut properties: Rc>>, mut capabilities: Rc>>) -> Rc { loop { tokens = skip_newlines(tokens.clone()); - let tok = tokens.clone().first().cloned(); - let span = token_span(tok.clone()); - if (tok_is_rbrace(tok.clone()) || tok_is_eof(tok.clone())) { +let tok = tokens.clone().first().cloned(); +let span = token_span(tok.clone()); +if (tok_is_rbrace(tok.clone()) || tok_is_eof(tok.clone())) { break Rc::new(ResPropResult { - properties: properties.clone(), - capabilities: capabilities.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }); - } else { + properties: properties.clone(), + capabilities: capabilities.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}); +} else { let sh = match tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, - }; - match sh { - Some(TokenShape::ShKeyword) => { - let kw_text = tok_keyword_text(tok.clone()); - if (kw_text.clone().as_str() == "capability".to_string().as_str()) { - let r = parse_capability(&tokens, &ctx); - if has_err(r.err.clone()) { - return Rc::new(ResPropResult { - properties: properties.clone(), - capabilities: capabilities.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - { - let __tco_0 = r.tokens.clone(); - let __tco_1 = r.ctx.clone(); - let __tco_2 = v2_rt::rc_list_push(capabilities, r.capability.clone()); - tokens = __tco_0; - ctx = __tco_1; - capabilities = __tco_2; - continue; - } - } else { - if (kw_text.clone().as_str() == "acquire".to_string().as_str()) { - let r = expect( - &Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - &Rc::new(ExpectedToken::ExpectLBrace), - ); - if has_err(r.err.clone()) { - return Rc::new(ResPropResult { - properties: properties.clone(), - capabilities: capabilities.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let r2 = skip_until_rbrace(&skip_newlines(r.tokens.clone())); - let r3 = - expect(&r2.tokens.clone(), &Rc::new(ExpectedToken::ExpectRBrace)); - if has_err(r3.err.clone()) { - return Rc::new(ResPropResult { - properties: properties.clone(), - capabilities: capabilities.clone(), - tokens: r3.tokens.clone(), - ctx: ctx.clone(), - err: r3.err.clone(), - }); - } - { - let __tco_0 = skip_newlines(r3.tokens.clone()); - tokens = __tco_0; - continue; - } - } else { - if (kw_text.clone().as_str() == "release".to_string().as_str()) { - let r = expect( - &Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - &Rc::new(ExpectedToken::ExpectLBrace), - ); - if has_err(r.err.clone()) { - return Rc::new(ResPropResult { - properties: properties.clone(), - capabilities: capabilities.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let r2 = skip_until_rbrace(&skip_newlines(r.tokens.clone())); - let r3 = expect( - &r2.tokens.clone(), - &Rc::new(ExpectedToken::ExpectRBrace), - ); - if has_err(r3.err.clone()) { - return Rc::new(ResPropResult { - properties: properties.clone(), - capabilities: capabilities.clone(), - tokens: r3.tokens.clone(), - ctx: ctx.clone(), - err: r3.err.clone(), - }); - } - { - let __tco_0 = skip_newlines(r3.tokens.clone()); - tokens = __tco_0; - continue; - } - } else { - break Rc::new(ResPropResult { - properties: properties.clone(), - capabilities: capabilities.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: Some(parse_error( - "unexpected keyword in resource block".to_string(), - span, - )), - }); - } - } + Some(t) => Some(t.shape.clone()), + None => None, +}; +match sh { + Some(TokenShape::ShKeyword) => { let kw_text = tok_keyword_text(tok.clone()); +if (kw_text.clone().as_str() == "capability".to_string().as_str()) { + let r = parse_capability(&tokens, &ctx); +if has_err(r.err.clone()) { + return Rc::new(ResPropResult { + properties: properties.clone(), + capabilities: capabilities.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +{ + let __tco_0 = r.tokens.clone(); +let __tco_1 = r.ctx.clone(); +let __tco_2 = v2_rt::rc_list_push(capabilities, r.capability.clone()); +tokens = __tco_0; +ctx = __tco_1; +capabilities = __tco_2; +continue; +} +} else { + if (kw_text.clone().as_str() == "acquire".to_string().as_str()) { + let r = expect(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), &Rc::new(ExpectedToken::ExpectLBrace)); +if has_err(r.err.clone()) { + return Rc::new(ResPropResult { + properties: properties.clone(), + capabilities: capabilities.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) } - } - Some(TokenShape::ShIdent) => { - if peek_is_colon_after_ident(tokens.clone()) { - let r = expect_ident(&tokens); - if has_err(r.err.clone()) { - return Rc::new(ResPropResult { - properties: properties.clone(), - capabilities: capabilities.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let fname = r.name.clone(); - let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); - if has_err(r2.err.clone()) { +let r2 = skip_until_rbrace(&skip_newlines(r.tokens.clone())); +let r3 = expect(&r2.tokens.clone(), &Rc::new(ExpectedToken::ExpectRBrace)); +if has_err(r3.err.clone()) { + return Rc::new(ResPropResult { + properties: properties.clone(), + capabilities: capabilities.clone(), + tokens: r3.tokens.clone(), + ctx: ctx.clone(), + err: r3.err.clone(), +}) + } +{ + let __tco_0 = skip_newlines(r3.tokens.clone()); +tokens = __tco_0; +continue; +} +} else { + if (kw_text.clone().as_str() == "release".to_string().as_str()) { + let r = expect(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), &Rc::new(ExpectedToken::ExpectLBrace)); +if has_err(r.err.clone()) { return Rc::new(ResPropResult { - properties: properties.clone(), - capabilities: capabilities.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), - }); + properties: properties.clone(), + capabilities: capabilities.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) } - let r3 = parse_expr(r2.tokens.clone(), ctx.clone()); - if has_err(r3.err.clone()) { +let r2 = skip_until_rbrace(&skip_newlines(r.tokens.clone())); +let r3 = expect(&r2.tokens.clone(), &Rc::new(ExpectedToken::ExpectRBrace)); +if has_err(r3.err.clone()) { return Rc::new(ResPropResult { - properties: properties.clone(), - capabilities: capabilities.clone(), - tokens: r3.tokens.clone(), - ctx: r3.ctx.clone(), - err: r3.err.clone(), - }); + properties: properties.clone(), + capabilities: capabilities.clone(), + tokens: r3.tokens.clone(), + ctx: ctx.clone(), + err: r3.err.clone(), +}) } - let fi = make_field_init_node( - &fname, - r3.expr.clone(), - make_span(0, 0), - r.span.clone(), - ); - { +{ let __tco_0 = skip_newlines(r3.tokens.clone()); - let __tco_1 = r3.ctx.clone(); - let __tco_2 = v2_rt::rc_list_push(properties, fi); - tokens = __tco_0; - ctx = __tco_1; - properties = __tco_2; - continue; - } - } else { +tokens = __tco_0; +continue; +} +} else { break Rc::new(ResPropResult { - properties: properties.clone(), - capabilities: capabilities.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: Some(parse_error( - "unexpected token in resource block".to_string(), - span, - )), - }); - } - } - _ => { - break Rc::new(ResPropResult { - properties: properties.clone(), - capabilities: capabilities.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: Some(parse_error( - "expected capability, acquire, release, or property in resource block" - .to_string(), - span, - )), - }); - } - } - } - } + properties: properties.clone(), + capabilities: capabilities.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: Some(parse_error("unexpected keyword in resource block".to_string(), span)), +}); +} +} +} }, + Some(TokenShape::ShIdent) => { if peek_is_colon_after_ident(tokens.clone()) { + let r = expect_ident(&tokens); +if has_err(r.err.clone()) { + return Rc::new(ResPropResult { + properties: properties.clone(), + capabilities: capabilities.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let fname = r.name.clone(); +let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); +if has_err(r2.err.clone()) { + return Rc::new(ResPropResult { + properties: properties.clone(), + capabilities: capabilities.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), +}) + } +let r3 = parse_expr(r2.tokens.clone(), ctx.clone()); +if has_err(r3.err.clone()) { + return Rc::new(ResPropResult { + properties: properties.clone(), + capabilities: capabilities.clone(), + tokens: r3.tokens.clone(), + ctx: r3.ctx.clone(), + err: r3.err.clone(), +}) + } +let fi = make_field_init_node(&fname, r3.expr.clone(), make_span(0, 0), r.span.clone()); +{ + let __tco_0 = skip_newlines(r3.tokens.clone()); +let __tco_1 = r3.ctx.clone(); +let __tco_2 = v2_rt::rc_list_push(properties, fi); +tokens = __tco_0; +ctx = __tco_1; +properties = __tco_2; +continue; +} +} else { + break Rc::new(ResPropResult { + properties: properties.clone(), + capabilities: capabilities.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: Some(parse_error("unexpected token in resource block".to_string(), span)), +}); +} }, + _ => { break Rc::new(ResPropResult { + properties: properties.clone(), + capabilities: capabilities.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: Some(parse_error("expected capability, acquire, release, or property in resource block".to_string(), span)), +}); }, +} +} +} } pub fn skip_until_rbrace(tokens: &Rc>>) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - let tokens = skip_newlines(tokens.clone()); - let tok = tokens.clone().first().cloned(); - if (tok_is_rbrace(tok.clone()) || tok_is_eof(tok.clone())) { - Rc::new(UnitResult { - tokens: tokens.clone(), - err: None, - }) - } else { - { - let sh = match tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, - }; - match sh { - Some(TokenShape::ShLBrace) => { - let inner = skip_until_rbrace(&Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - )); - let r = - expect(&inner.tokens.clone(), &Rc::new(ExpectedToken::ExpectRBrace)); - if has_err(r.err.clone()) { + { + let tokens = skip_newlines(tokens.clone()); +let tok = tokens.clone().first().cloned(); +if (tok_is_rbrace(tok.clone()) || tok_is_eof(tok.clone())) { + Rc::new(UnitResult { + tokens: tokens.clone(), + err: None, +}) + } else { + { + let sh = match tok.clone() { + Some(t) => Some(t.shape.clone()), + None => None, +}; +match sh { + Some(TokenShape::ShLBrace) => { + let inner = skip_until_rbrace(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>())); +let r = expect(&inner.tokens.clone(), &Rc::new(ExpectedToken::ExpectRBrace)); +if has_err(r.err.clone()) { return Rc::new(UnitResult { - tokens: r.tokens.clone(), - err: r.err.clone(), - }); + tokens: r.tokens.clone(), + err: r.err.clone(), +}) } - skip_until_rbrace(&r.tokens.clone()) - } - _ => skip_until_rbrace(&Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - )), - } +skip_until_rbrace(&r.tokens.clone()) +}, + _ => skip_until_rbrace(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>())), +} +} } - } +} }) } pub fn parse_capability(tokens: &Rc>>, ctx: &Rc) -> Rc { { let start_span = token_span(tokens.clone().first().cloned()); - let dummy_cap = make_capability_node( - "".to_string(), - None, - Rc::new(vec![]), - Rc::new(vec![]), - &start_span, - &ctx.source_indices.clone(), - ); - let r = expect( - &tokens, - &Rc::new(ExpectedToken::ExpectKeyword { - text: "capability".to_string(), - }), - ); - if has_err(r.err.clone()) { +let dummy_cap = make_capability_node("".to_string(), None, Rc::new(vec![]), Rc::new(vec![]), &start_span, &ctx.source_indices.clone()); +let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { + text: "capability".to_string(), +})); +if has_err(r.err.clone()) { return Rc::new(CapResult { - capability: dummy_cap.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let r = expect_ident(&r.tokens.clone()); - if has_err(r.err.clone()) { + capability: dummy_cap.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let r = expect_ident(&r.tokens.clone()); +if has_err(r.err.clone()) { return Rc::new(CapResult { - capability: dummy_cap.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let name = r.name.clone(); - let name_span = r.span.clone(); - let tokens = r.tokens.clone(); - if tok_is_lbrace(tokens.clone().first().cloned()) { + capability: dummy_cap.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let name = r.name.clone(); +let name_span = r.span.clone(); +let tokens = r.tokens.clone(); +if tok_is_lbrace(tokens.clone().first().cloned()) { { let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectLBrace)); - if has_err(r2.err.clone()) { +if has_err(r2.err.clone()) { return Rc::new(CapResult { - capability: dummy_cap.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), - }); + capability: dummy_cap.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), +}) } - let io = parse_input_output_blocks(skip_newlines(r2.tokens.clone()), ctx.clone()); - if has_err(io.err.clone()) { +let io = parse_input_output_blocks(skip_newlines(r2.tokens.clone()), ctx.clone()); +if has_err(io.err.clone()) { return Rc::new(CapResult { - capability: dummy_cap.clone(), - tokens: io.tokens.clone(), - ctx: io.ctx.clone(), - err: io.err.clone(), - }); - } - let r3 = expect( - &skip_newlines(io.tokens.clone()), - &Rc::new(ExpectedToken::ExpectRBrace), - ); - if has_err(r3.err.clone()) { + capability: dummy_cap.clone(), + tokens: io.tokens.clone(), + ctx: io.ctx.clone(), + err: io.err.clone(), +}) + } +let r3 = expect(&skip_newlines(io.tokens.clone()), &Rc::new(ExpectedToken::ExpectRBrace)); +if has_err(r3.err.clone()) { return Rc::new(CapResult { - capability: dummy_cap.clone(), - tokens: r3.tokens.clone(), - ctx: io.ctx.clone(), - err: r3.err.clone(), - }); - } - let cap = make_capability_node( - name, - Some(name_span), - io.inputs.clone(), - io.outputs.clone(), - &start_span, - &ctx.source_indices.clone(), - ); - Rc::new(CapResult { - capability: cap, - tokens: skip_newlines(r3.tokens.clone()), - ctx: io.ctx.clone(), - err: None, - }) - } + capability: dummy_cap.clone(), + tokens: r3.tokens.clone(), + ctx: io.ctx.clone(), + err: r3.err.clone(), +}) + } +let cap = make_capability_node(name, Some(name_span), io.inputs.clone(), io.outputs.clone(), &start_span, &ctx.source_indices.clone()); +Rc::new(CapResult { + capability: cap, + tokens: skip_newlines(r3.tokens.clone()), + ctx: io.ctx.clone(), + err: None, +}) +} } else { if tok_is_lparen(tokens.clone().first().cloned()) { { let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectLParen)); - if has_err(r2.err.clone()) { +if has_err(r2.err.clone()) { return Rc::new(CapResult { - capability: dummy_cap.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), - }); + capability: dummy_cap.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), +}) } - let r3 = parse_field_list(skip_newlines(r2.tokens.clone()), ctx.clone()); - if has_err(r3.err.clone()) { +let r3 = parse_field_list(skip_newlines(r2.tokens.clone()), ctx.clone()); +if has_err(r3.err.clone()) { return Rc::new(CapResult { - capability: dummy_cap.clone(), - tokens: r3.tokens.clone(), - ctx: r3.ctx.clone(), - err: r3.err.clone(), - }); + capability: dummy_cap.clone(), + tokens: r3.tokens.clone(), + ctx: r3.ctx.clone(), + err: r3.err.clone(), +}) } - let inputs = r3.fields.clone(); - let r4 = expect( - &skip_newlines(r3.tokens.clone()), - &Rc::new(ExpectedToken::ExpectRParen), - ); - if has_err(r4.err.clone()) { +let inputs = r3.fields.clone(); +let r4 = expect(&skip_newlines(r3.tokens.clone()), &Rc::new(ExpectedToken::ExpectRParen)); +if has_err(r4.err.clone()) { return Rc::new(CapResult { - capability: dummy_cap.clone(), - tokens: r4.tokens.clone(), - ctx: r3.ctx.clone(), - err: r4.err.clone(), - }); + capability: dummy_cap.clone(), + tokens: r4.tokens.clone(), + ctx: r3.ctx.clone(), + err: r4.err.clone(), +}) } - let ret = parse_optional_inferred(&r4.tokens.clone(), r3.ctx.clone()); - if has_err(ret.err.clone()) { +let ret = parse_optional_inferred(&r4.tokens.clone(), r3.ctx.clone()); +if has_err(ret.err.clone()) { return Rc::new(CapResult { - capability: dummy_cap.clone(), - tokens: ret.tokens.clone(), - ctx: ret.ctx.clone(), - err: ret.err.clone(), - }); + capability: dummy_cap.clone(), + tokens: ret.tokens.clone(), + ctx: ret.ctx.clone(), + err: ret.err.clone(), +}) } - let outputs = match ret.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - node_inferred_to_outputs(&rt, ret.ctx.clone().source_indices.clone()) - } - _ => Rc::new(vec![]), - }; - let cap = make_capability_node( - name, - Some(name_span), - inputs, - outputs, - &start_span, - &ctx.source_indices.clone(), - ); - Rc::new(CapResult { - capability: cap, - tokens: skip_newlines(ret.tokens.clone()), - ctx: ret.ctx.clone(), - err: None, - }) - } +let outputs = match ret.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => node_inferred_to_outputs(&rt, ret.ctx.clone().source_indices.clone()), + _ => Rc::new(vec![]), +}; +let cap = make_capability_node(name, Some(name_span), inputs, outputs, &start_span, &ctx.source_indices.clone()); +Rc::new(CapResult { + capability: cap, + tokens: skip_newlines(ret.tokens.clone()), + ctx: ret.ctx.clone(), + err: None, +}) +} } else { { - let cap = make_capability_node( - name, - Some(name_span), - Rc::new(vec![]), - Rc::new(vec![]), - &start_span, - &ctx.source_indices.clone(), - ); - Rc::new(CapResult { - capability: cap, - tokens: skip_newlines(tokens.clone()), - ctx: ctx.clone(), - err: None, - }) - } + let cap = make_capability_node(name, Some(name_span), Rc::new(vec![]), Rc::new(vec![]), &start_span, &ctx.source_indices.clone()); +Rc::new(CapResult { + capability: cap, + tokens: skip_newlines(tokens.clone()), + ctx: ctx.clone(), + err: None, +}) +} } } - } +} } -pub fn parse_input_output_blocks( - tokens: Rc>>, - ctx: Rc, -) -> Rc { +pub fn parse_input_output_blocks(tokens: Rc>>, ctx: Rc) -> Rc { parse_io_blocks_acc(tokens, ctx, Rc::new(vec![]), Rc::new(vec![])) } -pub fn parse_io_blocks_acc( - mut tokens: Rc>>, - mut ctx: Rc, - mut inputs: Rc>>, - mut outputs: Rc>>, -) -> Rc { +pub fn parse_io_blocks_acc(mut tokens: Rc>>, mut ctx: Rc, mut inputs: Rc>>, mut outputs: Rc>>) -> Rc { loop { tokens = skip_newlines(tokens.clone()); - if (tok_is_rbrace(tokens.clone().first().cloned()) - || tok_is_eof(tokens.clone().first().cloned())) - { +if (tok_is_rbrace(tokens.clone().first().cloned()) || tok_is_eof(tokens.clone().first().cloned())) { break Rc::new(IOResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }); - } else { + inputs: inputs.clone(), + outputs: outputs.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}); +} else { let kw = tok_keyword_text(tokens.clone().first().cloned()); - if (kw.clone().as_str() == "input".to_string().as_str()) { - let r = expect( - &Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - &Rc::new(ExpectedToken::ExpectLBrace), - ); - if has_err(r.err.clone()) { +if (kw.clone().as_str() == "input".to_string().as_str()) { + let r = expect(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), &Rc::new(ExpectedToken::ExpectLBrace)); +if has_err(r.err.clone()) { return Rc::new(IOResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); + inputs: inputs.clone(), + outputs: outputs.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) } - let r2 = parse_field_list(skip_newlines(r.tokens.clone()), ctx.clone()); - if has_err(r2.err.clone()) { +let r2 = parse_field_list(skip_newlines(r.tokens.clone()), ctx.clone()); +if has_err(r2.err.clone()) { return Rc::new(IOResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), - }); - } - let r3 = expect( - &skip_newlines(r2.tokens.clone()), - &Rc::new(ExpectedToken::ExpectRBrace), - ); - if has_err(r3.err.clone()) { + inputs: inputs.clone(), + outputs: outputs.clone(), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), +}) + } +let r3 = expect(&skip_newlines(r2.tokens.clone()), &Rc::new(ExpectedToken::ExpectRBrace)); +if has_err(r3.err.clone()) { return Rc::new(IOResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: r3.err.clone(), - }); - } - { + inputs: inputs.clone(), + outputs: outputs.clone(), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: r3.err.clone(), +}) + } +{ let __tco_0 = r3.tokens.clone(); - let __tco_1 = r2.ctx.clone(); - let __tco_2 = r2.fields.clone(); - tokens = __tco_0; - ctx = __tco_1; - inputs = __tco_2; - continue; - } - } else { +let __tco_1 = r2.ctx.clone(); +let __tco_2 = r2.fields.clone(); +tokens = __tco_0; +ctx = __tco_1; +inputs = __tco_2; +continue; +} +} else { if (kw.clone().as_str() == "output".to_string().as_str()) { - let r = expect( - &Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - &Rc::new(ExpectedToken::ExpectLBrace), - ); - if has_err(r.err.clone()) { + let r = expect(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), &Rc::new(ExpectedToken::ExpectLBrace)); +if has_err(r.err.clone()) { return Rc::new(IOResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); + inputs: inputs.clone(), + outputs: outputs.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) } - let r2 = parse_field_list(skip_newlines(r.tokens.clone()), ctx.clone()); - if has_err(r2.err.clone()) { +let r2 = parse_field_list(skip_newlines(r.tokens.clone()), ctx.clone()); +if has_err(r2.err.clone()) { return Rc::new(IOResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), - }); + inputs: inputs.clone(), + outputs: outputs.clone(), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), +}) } - let r3 = expect( - &skip_newlines(r2.tokens.clone()), - &Rc::new(ExpectedToken::ExpectRBrace), - ); - if has_err(r3.err.clone()) { +let r3 = expect(&skip_newlines(r2.tokens.clone()), &Rc::new(ExpectedToken::ExpectRBrace)); +if has_err(r3.err.clone()) { return Rc::new(IOResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: r3.err.clone(), - }); + inputs: inputs.clone(), + outputs: outputs.clone(), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: r3.err.clone(), +}) } - { +{ let __tco_0 = r3.tokens.clone(); - let __tco_1 = r2.ctx.clone(); - let __tco_2 = r2.fields.clone(); - tokens = __tco_0; - ctx = __tco_1; - outputs = __tco_2; - continue; - } - } else { +let __tco_1 = r2.ctx.clone(); +let __tco_2 = r2.fields.clone(); +tokens = __tco_0; +ctx = __tco_1; +outputs = __tco_2; +continue; +} +} else { break Rc::new(IOResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }); - } - } - } - } + inputs: inputs.clone(), + outputs: outputs.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}); +} +} +} +} } pub fn parse_data_def(tokens: &Rc>>, ctx: &Rc) -> Rc { { let start_span = token_span(tokens.clone().first().cloned()); - let dummy = Rc::new(Node { - name: "".to_string(), - span: start_span.clone(), - ident_span: None, - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - let r = expect( - &tokens, - &Rc::new(ExpectedToken::ExpectKeyword { - text: "data".to_string(), - }), - ); - if has_err(r.err.clone()) { +let dummy = Rc::new(Node { + name: "".to_string(), + span: start_span.clone(), + ident_span: None, + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { + text: "data".to_string(), +})); +if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: dummy, - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); + item: dummy, + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) } - parse_data_after_kw(r.tokens.clone(), &ctx, &start_span) - } +parse_data_after_kw(r.tokens.clone(), &ctx, &start_span) +} } -pub fn parse_data_after_kw( - tokens: Rc>>, - ctx: &Rc, - start_span: &Rc, -) -> Rc { +pub fn parse_data_after_kw(tokens: Rc>>, ctx: &Rc, start_span: &Rc) -> Rc { { let dummy = Rc::new(Node { - name: "".to_string(), - span: start_span.clone(), - ident_span: None, - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - let r = expect_ident(&tokens); - if has_err(r.err.clone()) { - return Rc::new(ItemResult { - item: dummy, - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let name = r.name.clone(); - let name_span = r.span.clone(); - let named_dummy = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - let r = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); - if has_err(r.err.clone()) { + name: "".to_string(), + span: start_span.clone(), + ident_span: None, + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +let r = expect_ident(&tokens); +if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let r = parse_type_expr(&r.tokens.clone(), &ctx); - if has_err(r.err.clone()) { + item: dummy, + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let name = r.name.clone(); +let name_span = r.span.clone(); +let named_dummy = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +let r = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); +if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let te = r.type_expr.clone(); - let r = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectEq)); - if has_err(r.err.clone()) { + item: named_dummy.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let r = parse_type_expr(&r.tokens.clone(), &ctx); +if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let r = parse_expr(r.tokens.clone(), ctx.clone()); - if has_err(r.err.clone()) { + item: named_dummy.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let te = r.type_expr.clone(); +let r = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectEq)); +if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); + item: named_dummy.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) } - let item = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: Some(r.expr.clone()), - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: Some(te), - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - Rc::new(ItemResult { - item: item, - tokens: skip_newlines(r.tokens.clone()), - ctx: r.ctx.clone(), - err: None, - }) - } +let r = parse_expr(r.tokens.clone(), ctx.clone()); +if has_err(r.err.clone()) { + return Rc::new(ItemResult { + item: named_dummy.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let item = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: Some(r.expr.clone()), + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: Some(te), + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +Rc::new(ItemResult { + item: item, + tokens: skip_newlines(r.tokens.clone()), + ctx: r.ctx.clone(), + err: None, +}) +} } pub fn parse_params(tokens: &Rc>>, ctx: &Rc) -> Rc { { let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectLParen)); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(ParamsResult { - params: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); + params: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) } - let tokens = skip_newlines(r.tokens.clone()); - if tok_is_rparen(tokens.clone().first().cloned()) { +let tokens = skip_newlines(r.tokens.clone()); +if tok_is_rparen(tokens.clone().first().cloned()) { Rc::new(ParamsResult { - params: Rc::new(vec![]), - tokens: Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - ctx: ctx.clone(), - err: None, - }) + params: Rc::new(vec![]), + tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), + ctx: ctx.clone(), + err: None, +}) } else { { let r = parse_param_list(tokens.clone(), ctx.clone()); - if has_err(r.err.clone()) { - return r.clone(); +if has_err(r.err.clone()) { + return r.clone() } - let tokens = skip_newlines(r.tokens.clone()); - let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRParen)); - if has_err(r2.err.clone()) { +let tokens = skip_newlines(r.tokens.clone()); +let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRParen)); +if has_err(r2.err.clone()) { return Rc::new(ParamsResult { - params: Rc::new(vec![]), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), - }); + params: Rc::new(vec![]), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), +}) } - Rc::new(ParamsResult { - params: r.params.clone(), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) - } +Rc::new(ParamsResult { + params: r.params.clone(), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +} } - } +} } pub fn parse_param_list(tokens: Rc>>, ctx: Rc) -> Rc { parse_param_list_acc(tokens, ctx, Rc::new(vec![])) } -pub fn parse_param_list_acc( - mut tokens: Rc>>, - mut ctx: Rc, - mut acc: Rc>>, -) -> Rc { +pub fn parse_param_list_acc(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { loop { let r = parse_param(&tokens, &ctx); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(ParamsResult { - params: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - acc = v2_rt::rc_list_push(acc.clone(), r.param.clone()); - match (*eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - tokens = skip_newlines(__ec.clone()); - if tok_is_rparen(tokens.clone().first().cloned()) { - break Rc::new(ParamsResult { - params: acc.clone(), - tokens: tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }); - } else { - { - let __tco_0 = r.ctx.clone(); - ctx = __tco_0; - continue; - } - } - } - EatResult::EatUnchanged { tokens: __eu, .. } => { - break Rc::new(ParamsResult { - params: acc.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }); - } - } - } + params: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +acc = v2_rt::rc_list_push(acc.clone(), r.param.clone()); +match (*eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { tokens = skip_newlines(__ec.clone()); +if tok_is_rparen(tokens.clone().first().cloned()) { + break Rc::new(ParamsResult { + params: acc.clone(), + tokens: tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}); +} else { + { + let __tco_0 = r.ctx.clone(); +ctx = __tco_0; +continue; +} +} }, + EatResult::EatUnchanged { tokens: __eu, .. } => { break Rc::new(ParamsResult { + params: acc.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}); }, +} +} } pub fn parse_param(tokens: &Rc>>, ctx: &Rc) -> Rc { { let start_span = token_span(tokens.clone().first().cloned()); - let dummy_param = make_param_node( - &"".to_string(), - leaf_type_node(&"".to_string(), &start_span), - None, - start_span.clone(), - start_span.clone(), - ); - let r = expect_name(&tokens); - if has_err(r.err.clone()) { +let dummy_param = make_param_node(&"".to_string(), leaf_type_node(&"".to_string(), &start_span), None, start_span.clone(), start_span.clone()); +let r = expect_name(&tokens); +if has_err(r.err.clone()) { return Rc::new(ParamResult { - param: dummy_param.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let name = r.name.clone(); - let name_span = r.span.clone(); - let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); - if has_err(r2.err.clone()) { + param: dummy_param.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let name = r.name.clone(); +let name_span = r.span.clone(); +let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); +if has_err(r2.err.clone()) { return Rc::new(ParamResult { - param: dummy_param.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), - }); - } - let r3 = parse_type_expr(&r2.tokens.clone(), &ctx); - if has_err(r3.err.clone()) { + param: dummy_param.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), +}) + } +let r3 = parse_type_expr(&r2.tokens.clone(), &ctx); +if has_err(r3.err.clone()) { return Rc::new(ParamResult { - param: dummy_param.clone(), - tokens: r3.tokens.clone(), - ctx: r3.ctx.clone(), - err: r3.err.clone(), - }); - } - let wr = try_where_clause( - &r3.tokens.clone(), - r3.ctx.clone(), - &r3.type_expr.clone(), - &start_span, - ); - if has_err(wr.err.clone()) { + param: dummy_param.clone(), + tokens: r3.tokens.clone(), + ctx: r3.ctx.clone(), + err: r3.err.clone(), +}) + } +let wr = try_where_clause(&r3.tokens.clone(), r3.ctx.clone(), &r3.type_expr.clone(), &start_span); +if has_err(wr.err.clone()) { return Rc::new(ParamResult { - param: dummy_param.clone(), - tokens: wr.tokens.clone(), - ctx: wr.ctx.clone(), - err: wr.err.clone(), - }); - } - let type_expr = wr.type_expr.clone(); - let tokens = wr.tokens.clone(); - let ctx = wr.ctx.clone(); - match (*eat(&tokens, Rc::new(ExpectedToken::ExpectEq))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let r4 = parse_expr(__ec.clone(), ctx.clone()); - if has_err(r4.err.clone()) { - return Rc::new(ParamResult { - param: dummy_param.clone(), - tokens: r4.tokens.clone(), - ctx: r4.ctx.clone(), - err: r4.err.clone(), - }); - } - let p = make_param_node( - &name, - type_expr, - Some(r4.expr.clone()), - start_span.clone(), - name_span, - ); - Rc::new(ParamResult { - param: p, - tokens: r4.tokens.clone(), - ctx: r4.ctx.clone(), - err: None, - }) - } - EatResult::EatUnchanged { tokens: __eu, .. } => { - let p = make_param_node(&name, type_expr, None, start_span.clone(), name_span); - Rc::new(ParamResult { - param: p, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }) - } - } - } + param: dummy_param.clone(), + tokens: wr.tokens.clone(), + ctx: wr.ctx.clone(), + err: wr.err.clone(), +}) + } +let type_expr = wr.type_expr.clone(); +let tokens = wr.tokens.clone(); +let ctx = wr.ctx.clone(); +match (*eat(&tokens, Rc::new(ExpectedToken::ExpectEq))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { + let r4 = parse_expr(__ec.clone(), ctx.clone()); +if has_err(r4.err.clone()) { + return Rc::new(ParamResult { + param: dummy_param.clone(), + tokens: r4.tokens.clone(), + ctx: r4.ctx.clone(), + err: r4.err.clone(), +}) + } +let p = make_param_node(&name, type_expr, Some(r4.expr.clone()), start_span.clone(), name_span); +Rc::new(ParamResult { + param: p, + tokens: r4.tokens.clone(), + ctx: r4.ctx.clone(), + err: None, +}) +}, + EatResult::EatUnchanged { tokens: __eu, .. } => { + let p = make_param_node(&name, type_expr, None, start_span.clone(), name_span); +Rc::new(ParamResult { + param: p, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}) +}, +} +} } pub fn parse_block(tokens: &Rc>>, ctx: &Rc) -> Rc { { let dummy_expr = parse_recovery_placeholder(); - let block_span = token_span(tokens.clone().first().cloned()); - let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectLBrace)); - if has_err(r.err.clone()) { +let block_span = token_span(tokens.clone().first().cloned()); +let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectLBrace)); +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let tokens = skip_newlines(r.tokens.clone()); - let r = parse_stmts(tokens.clone(), ctx.clone()); - if has_err(r.err.clone()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let tokens = skip_newlines(r.tokens.clone()); +let r = parse_stmts(tokens.clone(), ctx.clone()); +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let stmts = r.stmts.clone(); - let tokens = skip_newlines(r.tokens.clone()); - let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); - if has_err(r.err.clone()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let stmts = r.stmts.clone(); +let tokens = skip_newlines(r.tokens.clone()); +let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) } - if ((stmts.clone().len() as i64) == 1) { +if ((stmts.clone().len() as i64) == 1) { Rc::new(ExprResult { - expr: stmts.clone().first().cloned().clone().unwrap(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: None, - }) + expr: stmts.clone().first().cloned().clone().unwrap(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: None, +}) } else { Rc::new(ExprResult { - expr: make_expr_node( - Rc::new(ExprData::ExprBlock), - stmts.clone(), - None, - block_span, - ), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: None, - }) + expr: make_expr_node(Rc::new(ExprData::ExprBlock), stmts.clone(), None, block_span), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: None, +}) } - } +} } pub fn parse_stmts(tokens: Rc>>, ctx: Rc) -> Rc { parse_stmts_acc(tokens, ctx, Rc::new(vec![])) } -pub fn parse_stmts_acc( - mut tokens: Rc>>, - mut ctx: Rc, - mut acc: Rc>>, -) -> Rc { +pub fn parse_stmts_acc(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { loop { tokens = skip_newlines(tokens.clone()); - if (tok_is_rbrace(tokens.clone().first().cloned()) - || tok_is_eof(tokens.clone().first().cloned())) - { +if (tok_is_rbrace(tokens.clone().first().cloned()) || tok_is_eof(tokens.clone().first().cloned())) { break Rc::new(StmtsResult { - stmts: acc.clone(), - tokens: tokens.clone(), - ctx: ctx, - err: None, - }); - } else { + stmts: acc.clone(), + tokens: tokens.clone(), + ctx: ctx, + err: None, +}); +} else { let r = parse_stmt(&tokens, ctx); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(StmtsResult { - stmts: acc.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); + stmts: acc.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) } - { +{ let __tco_0 = r.tokens.clone(); - let __tco_1 = r.ctx.clone(); - let __tco_2 = v2_rt::rc_list_push(acc, r.expr.clone()); - tokens = __tco_0; - ctx = __tco_1; - acc = __tco_2; - continue; - } - } - } +let __tco_1 = r.ctx.clone(); +let __tco_2 = v2_rt::rc_list_push(acc, r.expr.clone()); +tokens = __tco_0; +ctx = __tco_1; +acc = __tco_2; +continue; +} +} +} } pub fn parse_stmt(tokens: &Rc>>, ctx: Rc) -> Rc { { let tok = tokens.clone().first().cloned(); - let sh = match tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, - }; - match sh { - Some(TokenShape::ShKeyword) => { - let kw_text = tok_keyword_text(tok.clone()); - if (kw_text.clone().as_str() == "let".to_string().as_str()) { - parse_let(&tokens, &ctx) +let sh = match tok.clone() { + Some(t) => Some(t.shape.clone()), + None => None, +}; +match sh { + Some(TokenShape::ShKeyword) => { + let kw_text = tok_keyword_text(tok.clone()); +if (kw_text.clone().as_str() == "let".to_string().as_str()) { + parse_let(&tokens, &ctx) + } else { + if (kw_text.clone().as_str() == "return".to_string().as_str()) { + parse_return(&tokens, &ctx) } else { - if (kw_text.clone().as_str() == "return".to_string().as_str()) { - parse_return(&tokens, &ctx) + if peek_is_eq_after_ident(tokens.clone()) { + parse_bare_assignment(&tokens, &ctx) } else { - if peek_is_eq_after_ident(tokens.clone()) { - parse_bare_assignment(&tokens, &ctx) - } else { - parse_expr(tokens.clone(), ctx) - } + parse_expr(tokens.clone(), ctx) } } } - Some(TokenShape::ShIdent) => { - if (peek_text_is(tokens.clone(), "node".to_string()) && peek_is_node_decl(&tokens)) - { - parse_node_decl(&tokens, &ctx) +}, + Some(TokenShape::ShIdent) => if (peek_text_is(tokens.clone(), "node".to_string()) && peek_is_node_decl(&tokens)) { + parse_node_decl(&tokens, &ctx) + } else { + if peek_is_eq_after_ident(tokens.clone()) { + parse_bare_assignment(&tokens, &ctx) + } else { + if is_constraint_bracket_after_ident(&tokens) { + parse_constrained_assignment(&tokens, &ctx) } else { - if peek_is_eq_after_ident(tokens.clone()) { - parse_bare_assignment(&tokens, &ctx) - } else { - if is_constraint_bracket_after_ident(&tokens) { - parse_constrained_assignment(&tokens, &ctx) - } else { - parse_expr(tokens.clone(), ctx) - } - } + parse_expr(tokens.clone(), ctx) } } - _ => parse_expr(tokens.clone(), ctx), - } - } + }, + _ => parse_expr(tokens.clone(), ctx), +} +} } pub fn peek_is_eq_after_ident(tokens: Rc>>) -> bool { match tokens.get(1 as usize).cloned() { - Some(t) => is_eq_shape(t.shape.clone()), - None => false, - } + Some(t) => is_eq_shape(t.shape.clone()), + None => false, +} } pub fn peek_is_node_decl(tokens: &Rc>>) -> bool { { let t1 = tokens.clone().get(1 as usize).cloned(); - let t2 = tokens.clone().get(2 as usize).cloned(); - let name_ok = match t1 { - Some(t) => (is_ident_shape(t.shape.clone()) || is_name_keyword(&t)), - None => false, - }; - let decl_ok = match t2 { - Some(t) => { - ((is_colon_shape(t.shape.clone()) || is_lbracket_shape(t.shape.clone())) - || is_eq_shape(t.shape.clone())) - } - None => false, - }; - (name_ok && decl_ok) - } +let t2 = tokens.clone().get(2 as usize).cloned(); +let name_ok = match t1 { + Some(t) => (is_ident_shape(t.shape.clone()) || is_name_keyword(&t)), + None => false, +}; +let decl_ok = match t2 { + Some(t) => ((is_colon_shape(t.shape.clone()) || is_lbracket_shape(t.shape.clone())) || is_eq_shape(t.shape.clone())), + None => false, +}; +(name_ok && decl_ok) +} } pub fn is_constraint_bracket_after_ident(tokens: &Rc>>) -> bool { match tokens.clone().get(1 as usize).cloned() { - Some(t) => { - (is_lbracket_shape(t.shape.clone()) - && is_constraint_bracket(Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ))) - } - None => false, - } + Some(t) => (is_lbracket_shape(t.shape.clone()) && is_constraint_bracket(Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()))), + None => false, +} } -pub fn parse_constrained_assignment( - tokens: &Rc>>, - ctx: &Rc, -) -> Rc { +pub fn parse_constrained_assignment(tokens: &Rc>>, ctx: &Rc) -> Rc { { let span = token_span(tokens.clone().first().cloned()); - let dummy_expr = parse_recovery_placeholder(); - let r = expect_name(&tokens); - if has_err(r.err.clone()) { +let dummy_expr = parse_recovery_placeholder(); +let r = expect_name(&tokens); +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let name = r.name.clone(); - let name_span = r.span.clone(); - let cr = try_constraint_annotations(&r.tokens.clone(), ctx.clone()); - if has_err(cr.err.clone()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let name = r.name.clone(); +let name_span = r.span.clone(); +let cr = try_constraint_annotations(&r.tokens.clone(), ctx.clone()); +if has_err(cr.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: cr.tokens.clone(), - ctx: cr.ctx.clone(), - err: cr.err.clone(), - }); - } - let r2 = expect(&cr.tokens.clone(), &Rc::new(ExpectedToken::ExpectEq)); - if has_err(r2.err.clone()) { + expr: dummy_expr.clone(), + tokens: cr.tokens.clone(), + ctx: cr.ctx.clone(), + err: cr.err.clone(), +}) + } +let r2 = expect(&cr.tokens.clone(), &Rc::new(ExpectedToken::ExpectEq)); +if has_err(r2.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r2.tokens.clone(), - ctx: cr.ctx.clone(), - err: r2.err.clone(), - }); - } - let r3 = parse_expr(r2.tokens.clone(), cr.ctx.clone()); - if has_err(r3.err.clone()) { - return r3.clone(); - } - let node = make_named_expr_node( - &name, - Rc::new(ExprData::ExprLet), - Rc::new(vec![r3.expr.clone()]), - None, - span, - name_span, - ); - let node = Rc::new(Node { - name: node.name.clone(), - span: node.span.clone(), - ident_span: node.ident_span.clone(), - children: node.children.clone(), - params: node.params.clone(), - inferred: node.inferred.clone(), - return_cardinality: node.return_cardinality.clone(), - uses: node.uses.clone(), - body: node.body.clone(), - connective: node.connective.clone(), - transport: node.transport.clone(), - properties: cr.constraints.clone(), - type_annotation: node.type_annotation.clone(), - is_self_recursive: node.is_self_recursive.clone(), - has_non_tail_self_call: node.has_non_tail_self_call.clone(), - match_pattern: node.match_pattern.clone(), - expr_data: node.expr_data.clone(), - ident: None, - }); - Rc::new(ExprResult { - expr: node.clone(), - tokens: r3.tokens.clone(), - ctx: r3.ctx.clone(), - err: None, - }) - } + expr: dummy_expr.clone(), + tokens: r2.tokens.clone(), + ctx: cr.ctx.clone(), + err: r2.err.clone(), +}) + } +let r3 = parse_expr(r2.tokens.clone(), cr.ctx.clone()); +if has_err(r3.err.clone()) { + return r3.clone() + } +let node = make_named_expr_node(&name, Rc::new(ExprData::ExprLet), Rc::new(vec![r3.expr.clone()]), None, span, name_span); +let node = Rc::new(Node { + name: node.name.clone(), + span: node.span.clone(), + ident_span: node.ident_span.clone(), + children: node.children.clone(), + params: node.params.clone(), + inferred: node.inferred.clone(), + return_cardinality: node.return_cardinality.clone(), + uses: node.uses.clone(), + body: node.body.clone(), + connective: node.connective.clone(), + transport: node.transport.clone(), + properties: cr.constraints.clone(), + type_annotation: node.type_annotation.clone(), + is_self_recursive: node.is_self_recursive.clone(), + has_non_tail_self_call: node.has_non_tail_self_call.clone(), + match_pattern: node.match_pattern.clone(), + expr_data: node.expr_data.clone(), + ident: None, +}); +Rc::new(ExprResult { + expr: node.clone(), + tokens: r3.tokens.clone(), + ctx: r3.ctx.clone(), + err: None, +}) +} } pub fn peek_text_is(tokens: Rc>>, expected: String) -> bool { match tokens.first().cloned() { - Some(t) => { - (is_ident_shape(t.shape.clone()) && (t.text.clone().as_str() == expected.as_str())) - } - None => false, - } + Some(t) => (is_ident_shape(t.shape.clone()) && (t.text.clone().as_str() == expected.as_str())), + None => false, +} } pub fn parse_node_decl(tokens: &Rc>>, ctx: &Rc) -> Rc { { let span = token_span(tokens.clone().first().cloned()); - let dummy_expr = parse_recovery_placeholder(); - let tokens = Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ); - let r = expect_name(&tokens); - if has_err(r.err.clone()) { +let dummy_expr = parse_recovery_placeholder(); +let tokens = Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()); +let r = expect_name(&tokens); +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let name = r.name.clone(); - let name_span = r.span.clone(); - let cr = try_constraint_annotations(&r.tokens.clone(), ctx.clone()); - if has_err(cr.err.clone()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let name = r.name.clone(); +let name_span = r.span.clone(); +let cr = try_constraint_annotations(&r.tokens.clone(), ctx.clone()); +if has_err(cr.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: cr.tokens.clone(), - ctx: cr.ctx.clone(), - err: cr.err.clone(), - }); - } - let e_colon = eat(&cr.tokens.clone(), Rc::new(ExpectedToken::ExpectColon)); - let tokens = match (*e_colon.clone()).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), - EatResult::EatUnchanged { .. } => { - let r2 = expect(&cr.tokens.clone(), &Rc::new(ExpectedToken::ExpectEq)); - if has_err(r2.err.clone()) { - return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r2.tokens.clone(), - ctx: cr.ctx.clone(), - err: r2.err.clone(), - }); - } - r2.tokens.clone() - } - }; - let r3 = parse_expr(tokens.clone(), cr.ctx.clone()); - if has_err(r3.err.clone()) { - return r3.clone(); + expr: dummy_expr.clone(), + tokens: cr.tokens.clone(), + ctx: cr.ctx.clone(), + err: cr.err.clone(), +}) + } +let e_colon = eat(&cr.tokens.clone(), Rc::new(ExpectedToken::ExpectColon)); +let tokens = match (*e_colon.clone()).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), + EatResult::EatUnchanged { .. } => { + let r2 = expect(&cr.tokens.clone(), &Rc::new(ExpectedToken::ExpectEq)); +if has_err(r2.err.clone()) { + return Rc::new(ExprResult { + expr: dummy_expr.clone(), + tokens: r2.tokens.clone(), + ctx: cr.ctx.clone(), + err: r2.err.clone(), +}) + } +r2.tokens.clone() +}, +}; +let r3 = parse_expr(tokens.clone(), cr.ctx.clone()); +if has_err(r3.err.clone()) { + return r3.clone() } - let ret = parse_optional_inferred(&r3.tokens.clone(), r3.ctx.clone()); - if has_err(ret.err.clone()) { +let ret = parse_optional_inferred(&r3.tokens.clone(), r3.ctx.clone()); +if has_err(ret.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: ret.tokens.clone(), - ctx: ret.ctx.clone(), - err: ret.err.clone(), - }); - } - let type_ann = match (*e_colon.clone()).clone() { - EatResult::EatConsumed { .. } => Some(r3.expr.clone()), - EatResult::EatUnchanged { .. } => None, - }; - let node = Rc::new(Node { - name: name, - span: span, - ident_span: Some(name_span), - children: Rc::new(vec![r3.expr.clone()]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: ret.inferred.clone(), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: cr.constraints.clone(), - type_annotation: type_ann, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::ExprLet), - ident: None, - }); - Rc::new(ExprResult { - expr: node, - tokens: ret.tokens.clone(), - ctx: ret.ctx.clone(), - err: None, - }) - } + expr: dummy_expr.clone(), + tokens: ret.tokens.clone(), + ctx: ret.ctx.clone(), + err: ret.err.clone(), +}) + } +let type_ann = match (*e_colon.clone()).clone() { + EatResult::EatConsumed { .. } => Some(r3.expr.clone()), + EatResult::EatUnchanged { .. } => None, +}; +let node = Rc::new(Node { + name: name, + span: span, + ident_span: Some(name_span), + children: Rc::new(vec![r3.expr.clone()]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: ret.inferred.clone(), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: cr.constraints.clone(), + type_annotation: type_ann, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::ExprLet), + ident: None, +}); +Rc::new(ExprResult { + expr: node, + tokens: ret.tokens.clone(), + ctx: ret.ctx.clone(), + err: None, +}) +} } -pub fn parse_bare_assignment( - tokens: &Rc>>, - ctx: &Rc, -) -> Rc { +pub fn parse_bare_assignment(tokens: &Rc>>, ctx: &Rc) -> Rc { { let span = token_span(tokens.clone().first().cloned()); - let dummy_expr = parse_recovery_placeholder(); - let r = expect_name(&tokens); - if has_err(r.err.clone()) { +let dummy_expr = parse_recovery_placeholder(); +let r = expect_name(&tokens); +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let name = r.name.clone(); - let name_span = r.span.clone(); - let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectEq)); - if has_err(r2.err.clone()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let name = r.name.clone(); +let name_span = r.span.clone(); +let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectEq)); +if has_err(r2.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), - }); - } - let r3 = parse_expr(r2.tokens.clone(), ctx.clone()); - if has_err(r3.err.clone()) { - return r3.clone(); - } - let cr = try_constraint_annotations(&r3.tokens.clone(), r3.ctx.clone()); - if has_err(cr.err.clone()) { + expr: dummy_expr.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), +}) + } +let r3 = parse_expr(r2.tokens.clone(), ctx.clone()); +if has_err(r3.err.clone()) { + return r3.clone() + } +let cr = try_constraint_annotations(&r3.tokens.clone(), r3.ctx.clone()); +if has_err(cr.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: cr.tokens.clone(), - ctx: cr.ctx.clone(), - err: cr.err.clone(), - }); - } - let node = make_named_expr_node( - &name, - Rc::new(ExprData::ExprLet), - Rc::new(vec![r3.expr.clone()]), - None, - span, - name_span, - ); - if ((cr.constraints.clone().len() as i64) > 0) { + expr: dummy_expr.clone(), + tokens: cr.tokens.clone(), + ctx: cr.ctx.clone(), + err: cr.err.clone(), +}) + } +let node = make_named_expr_node(&name, Rc::new(ExprData::ExprLet), Rc::new(vec![r3.expr.clone()]), None, span, name_span); +if ((cr.constraints.clone().len() as i64) > 0) { { let node = Rc::new(Node { - name: node.name.clone(), - span: node.span.clone(), - ident_span: node.ident_span.clone(), - children: node.children.clone(), - params: node.params.clone(), - inferred: node.inferred.clone(), - return_cardinality: node.return_cardinality.clone(), - uses: node.uses.clone(), - body: node.body.clone(), - connective: node.connective.clone(), - transport: node.transport.clone(), - properties: cr.constraints.clone(), - type_annotation: node.type_annotation.clone(), - is_self_recursive: node.is_self_recursive.clone(), - has_non_tail_self_call: node.has_non_tail_self_call.clone(), - match_pattern: node.match_pattern.clone(), - expr_data: node.expr_data.clone(), - ident: None, - }); - Rc::new(ExprResult { - expr: node.clone(), - tokens: cr.tokens.clone(), - ctx: cr.ctx.clone(), - err: None, - }) - } + name: node.name.clone(), + span: node.span.clone(), + ident_span: node.ident_span.clone(), + children: node.children.clone(), + params: node.params.clone(), + inferred: node.inferred.clone(), + return_cardinality: node.return_cardinality.clone(), + uses: node.uses.clone(), + body: node.body.clone(), + connective: node.connective.clone(), + transport: node.transport.clone(), + properties: cr.constraints.clone(), + type_annotation: node.type_annotation.clone(), + is_self_recursive: node.is_self_recursive.clone(), + has_non_tail_self_call: node.has_non_tail_self_call.clone(), + match_pattern: node.match_pattern.clone(), + expr_data: node.expr_data.clone(), + ident: None, +}); +Rc::new(ExprResult { + expr: node.clone(), + tokens: cr.tokens.clone(), + ctx: cr.ctx.clone(), + err: None, +}) +} } else { Rc::new(ExprResult { - expr: node.clone(), - tokens: cr.tokens.clone(), - ctx: cr.ctx.clone(), - err: None, - }) + expr: node.clone(), + tokens: cr.tokens.clone(), + ctx: cr.ctx.clone(), + err: None, +}) } - } +} } pub fn parse_expr(tokens: Rc>>, ctx: Rc) -> Rc { parse_expr_bp(tokens, ctx, 0) } -pub fn parse_expr_bp( - tokens: Rc>>, - ctx: Rc, - min_bp: i64, -) -> Rc { +pub fn parse_expr_bp(tokens: Rc>>, ctx: Rc, min_bp: i64) -> Rc { { let r = parse_prefix(&tokens, ctx); - if has_err(r.err.clone()) { - return r.clone(); +if has_err(r.err.clone()) { + return r.clone() } - let lhs = r.expr.clone(); - parse_expr_loop(r.tokens.clone(), r.ctx.clone(), lhs, min_bp) - } +let lhs = r.expr.clone(); +parse_expr_loop(r.tokens.clone(), r.ctx.clone(), lhs, min_bp) +} } -pub fn parse_expr_loop( - mut tokens: Rc>>, - mut ctx: Rc, - mut lhs: Rc, - mut min_bp: i64, -) -> Rc { +pub fn parse_expr_loop(mut tokens: Rc>>, mut ctx: Rc, mut lhs: Rc, mut min_bp: i64) -> Rc { loop { if tok_is_eof(tokens.clone().first().cloned()) { break Rc::new(ExprResult { - expr: lhs.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }); - } else { + expr: lhs.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}); +} else { let loop_span = token_span(tokens.clone().first().cloned()); - tokens = skip_continuation_newlines(&tokens); - let post = try_postfix(&tokens, &ctx, &lhs, min_bp.clone()); - if has_err(post.err.clone()) { +tokens = skip_continuation_newlines(&tokens); +let post = try_postfix(&tokens, &ctx, &lhs, min_bp.clone()); +if has_err(post.err.clone()) { break Rc::new(ExprResult { - expr: lhs.clone(), - tokens: post.tokens.clone(), - ctx: post.ctx.clone(), - err: post.err.clone(), - }); - } else { + expr: lhs.clone(), + tokens: post.tokens.clone(), + ctx: post.ctx.clone(), + err: post.err.clone(), +}); +} else { if post.changed.clone() { { let __tco_0 = post.tokens.clone(); - let __tco_1 = post.ctx.clone(); - let __tco_2 = post.expr.clone(); - tokens = __tco_0; - ctx = __tco_1; - lhs = __tco_2; - continue; - } - } else { +let __tco_1 = post.ctx.clone(); +let __tco_2 = post.expr.clone(); +tokens = __tco_0; +ctx = __tco_1; +lhs = __tco_2; +continue; +} +} else { let bp = infix_bp(tokens.clone()); - match bp { - Some(bps) => { - if (bps.left.clone() < min_bp.clone()) { - break Rc::new(ExprResult { - expr: lhs.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }); - } else { - match (*advance(&tokens)).clone() { - AdvanceResult::AdvanceOk { - token: op_tok, - tokens: rest, - .. - } => { - let op_shape = op_tok.shape.clone(); - if is_dot_shape(op_shape.clone()) { - let r = expect_name(&rest); - if has_err(r.err.clone()) { - return Rc::new(ExprResult { - expr: lhs.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let new_lhs = make_named_expr_node( - &r.name.clone(), - Rc::new(ExprData::ExprFieldAccess { - summary: None, - }), - Rc::new(vec![lhs.clone()]), - None, - loop_span, - r.span.clone(), - ); - { - let __tco_0 = r.tokens.clone(); - let __tco_1 = new_lhs; - tokens = __tco_0; - lhs = __tco_1; - continue; - } - } else { - if is_pipe_arrow_shape(op_shape.clone()) { - let r = parse_pipe_rhs( - &rest, - &ctx, - lhs.clone(), - loop_span, - ); - if has_err(r.err.clone()) { - return Rc::new(ExprResult { - expr: r.expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - { - let __tco_0 = r.tokens.clone(); - let __tco_1 = r.ctx.clone(); - let __tco_2 = r.expr.clone(); - tokens = __tco_0; - ctx = __tco_1; - lhs = __tco_2; - continue; - } - } else { - tokens = skip_newlines(rest.clone()); - let r = parse_expr_bp( - tokens.clone(), - ctx.clone(), - bps.right.clone(), - ); - if has_err(r.err.clone()) { - return Rc::new(ExprResult { - expr: r.expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let binop_opt = find_operator_binop( - dag_syntax_spec().operators.clone(), - op_tok.text.clone(), - ); - match binop_opt { - Some(binop) => { - let new_lhs = make_expr_node( - Rc::new(ExprData::ExprBinOp { - op: binop.clone(), - algebra_field: None, - }), - Rc::new(vec![ - lhs.clone(), - r.expr.clone(), - ]), - None, - loop_span, - ); - { - let __tco_0 = r.tokens.clone(); - let __tco_1 = r.ctx.clone(); - let __tco_2 = new_lhs; - tokens = __tco_0; - ctx = __tco_1; - lhs = __tco_2; - continue; - } - } - None => { - break Rc::new(ExprResult { - expr: lhs.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: Some(parse_error( - v2_rt::concat( - "unknown binary operator: " - .to_string(), - op_tok.text.clone(), - ), - loop_span, - )), - }); - } - } - } - } - } - AdvanceResult::AdvanceEof => { - break Rc::new(ExprResult { - expr: lhs.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }); - } - } +match bp { + Some(bps) => { if (bps.left.clone() < min_bp.clone()) { + break Rc::new(ExprResult { + expr: lhs.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}); +} else { + match (*advance(&tokens)).clone() { + AdvanceResult::AdvanceOk { token: op_tok, tokens: rest, .. } => { let op_shape = op_tok.shape.clone(); +if is_dot_shape(op_shape.clone()) { + let r = expect_name(&rest); +if has_err(r.err.clone()) { + return Rc::new(ExprResult { + expr: lhs.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) } - } - None => { - break Rc::new(ExprResult { - expr: lhs.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }); - } - } - } - } - } - } +let new_lhs = make_named_expr_node(&r.name.clone(), Rc::new(ExprData::ExprFieldAccess { + summary: None, +}), Rc::new(vec![lhs.clone()]), None, loop_span, r.span.clone()); +{ + let __tco_0 = r.tokens.clone(); +let __tco_1 = new_lhs; +tokens = __tco_0; +lhs = __tco_1; +continue; +} +} else { + if is_pipe_arrow_shape(op_shape.clone()) { + let r = parse_pipe_rhs(&rest, &ctx, lhs.clone(), loop_span); +if has_err(r.err.clone()) { + return Rc::new(ExprResult { + expr: r.expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +{ + let __tco_0 = r.tokens.clone(); +let __tco_1 = r.ctx.clone(); +let __tco_2 = r.expr.clone(); +tokens = __tco_0; +ctx = __tco_1; +lhs = __tco_2; +continue; +} +} else { + tokens = skip_newlines(rest.clone()); +let r = parse_expr_bp(tokens.clone(), ctx.clone(), bps.right.clone()); +if has_err(r.err.clone()) { + return Rc::new(ExprResult { + expr: r.expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let binop_opt = find_operator_binop(dag_syntax_spec().operators.clone(), op_tok.text.clone()); +match binop_opt { + Some(binop) => { let new_lhs = make_expr_node(Rc::new(ExprData::ExprBinOp { + op: binop.clone(), + algebra_field: None, +}), Rc::new(vec![lhs.clone(), r.expr.clone()]), None, loop_span); +{ + let __tco_0 = r.tokens.clone(); +let __tco_1 = r.ctx.clone(); +let __tco_2 = new_lhs; +tokens = __tco_0; +ctx = __tco_1; +lhs = __tco_2; +continue; +} }, + None => { break Rc::new(ExprResult { + expr: lhs.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: Some(parse_error(v2_rt::concat("unknown binary operator: ".to_string(), op_tok.text.clone()), loop_span)), +}); }, +} +} +} }, + AdvanceResult::AdvanceEof => { break Rc::new(ExprResult { + expr: lhs.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}); }, +} +} }, + None => { break Rc::new(ExprResult { + expr: lhs.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}); }, +} +} +} +} +} } pub fn find_operator_bp(ops: Rc>>, symbol: String) -> Option { { - let matching = Rc::new({ - let mut __result = Vec::new(); - for op in ops.iter().cloned() { - if (op.symbol.clone().as_str() == symbol.clone().as_str()) { - __result.push(op); - } - } - __result - }); - if ((matching.clone().len() as i64) > 0) { + let matching = Rc::new({ let mut __result = Vec::new(); for op in ops.iter().cloned() { if (op.symbol.clone().as_str() == symbol.clone().as_str()) { __result.push(op); } } __result }); +if ((matching.clone().len() as i64) > 0) { { let op = matching.clone().first().cloned().clone().unwrap(); - Some(BindingPower { - left: op.left_bp.clone(), - right: op.right_bp.clone(), - }) - } +Some(BindingPower { + left: op.left_bp.clone(), + right: op.right_bp.clone(), +}) +} } else { None } - } +} } pub fn infix_bp(tokens: Rc>>) -> Option { match tokens.first().cloned() { - Some(t) => find_operator_bp(dag_syntax_spec().operators.clone(), t.text.clone()), - None => None, - } + Some(t) => find_operator_bp(dag_syntax_spec().operators.clone(), t.text.clone()), + None => None, +} } pub fn find_operator_binop(ops: Rc>>, symbol: String) -> Option { { - let matching = Rc::new({ - let mut __result = Vec::new(); - for op in ops.iter().cloned() { - if (op.symbol.clone().as_str() == symbol.clone().as_str()) { - __result.push(op); - } - } - __result - }); - if ((matching.clone().len() as i64) > 0) { - matching - .clone() - .first() - .cloned() - .clone() - .unwrap() - .binop - .clone() + let matching = Rc::new({ let mut __result = Vec::new(); for op in ops.iter().cloned() { if (op.symbol.clone().as_str() == symbol.clone().as_str()) { __result.push(op); } } __result }); +if ((matching.clone().len() as i64) > 0) { + matching.clone().first().cloned().clone().unwrap().binop.clone() } else { None } - } +} } -pub fn parse_pipe_rhs( - tokens: &Rc>>, - ctx: &Rc, - receiver: Rc, - span: Rc, -) -> Rc { +pub fn parse_pipe_rhs(tokens: &Rc>>, ctx: &Rc, receiver: Rc, span: Rc) -> Rc { { let dummy_expr = parse_recovery_placeholder(); - let r = expect_name(&tokens); - if has_err(r.err.clone()) { +let r = expect_name(&tokens); +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let method = r.name.clone(); - let tokens = skip_newlines(r.tokens.clone()); - if tok_is_lparen(tokens.clone().first().cloned()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let method = r.name.clone(); +let tokens = skip_newlines(r.tokens.clone()); +if tok_is_lparen(tokens.clone().first().cloned()) { { let r2 = parse_call_args(&tokens, &ctx); - if has_err(r2.err.clone()) { +if has_err(r2.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), - }); - } - Rc::new(ExprResult { - expr: make_named_expr_node( - &method, - Rc::new(ExprData::ExprMethodCall { - method_semantics: None, - }), - v2_rt::concat( - Rc::new(vec![receiver]), - Rc::new({ - let mut __result = Vec::new(); - for na in r2.args.clone().iter().cloned() { - __result.push(make_arg_node( - arg_name_at(na.clone(), ctx.source_indices.clone()), - arg_value(&na), - na.span.clone(), - node_name_span(&na), - )); - } - __result - }), - ), - None, - span, - r.span.clone(), - ), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: None, - }) - } + expr: dummy_expr.clone(), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), +}) + } +Rc::new(ExprResult { + expr: make_named_expr_node(&method, Rc::new(ExprData::ExprMethodCall { + method_semantics: None, +}), v2_rt::concat(Rc::new(vec![receiver]), Rc::new({ let mut __result = Vec::new(); for na in r2.args.clone().iter().cloned() { __result.push(make_arg_node(arg_name_at(na.clone(), ctx.source_indices.clone()), arg_value(&na), na.span.clone(), node_name_span(&na))); } __result })), None, span, r.span.clone()), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: None, +}) +} } else { Rc::new(ExprResult { - expr: make_named_expr_node( - &method, - Rc::new(ExprData::ExprMethodCall { - method_semantics: None, - }), - Rc::new(vec![receiver]), - None, - span, - r.span.clone(), - ), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }) + expr: make_named_expr_node(&method, Rc::new(ExprData::ExprMethodCall { + method_semantics: None, +}), Rc::new(vec![receiver]), None, span, r.span.clone()), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}) } - } +} } pub fn parse_prefix(tokens: &Rc>>, ctx: Rc) -> Rc { { let tok = tokens.clone().first().cloned(); - let sh = match tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, - }; - let span = token_span(tok.clone()); - match sh { - Some(TokenShape::ShBang) => { - let r = parse_expr_bp( - Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - ctx, - 12, - ); - if has_err(r.err.clone()) { - return Rc::new(ExprResult { - expr: r.expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - Rc::new(ExprResult { - expr: make_expr_node( - Rc::new(ExprData::ExprUnaryOp { - op: UnaryOpKind::Not, - }), - Rc::new(vec![r.expr.clone()]), - None, - span, - ), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) - } - Some(TokenShape::ShMinus) => { - let r = parse_expr_bp( - Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - ctx, - 12, - ); - if has_err(r.err.clone()) { - return Rc::new(ExprResult { - expr: r.expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - Rc::new(ExprResult { - expr: make_expr_node( - Rc::new(ExprData::ExprUnaryOp { - op: UnaryOpKind::Neg, - }), - Rc::new(vec![r.expr.clone()]), - None, - span, - ), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) - } - _ => parse_primary(&tokens, &ctx), - } - } +let sh = match tok.clone() { + Some(t) => Some(t.shape.clone()), + None => None, +}; +let span = token_span(tok.clone()); +match sh { + Some(TokenShape::ShBang) => { + let r = parse_expr_bp(Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), ctx, 12); +if has_err(r.err.clone()) { + return Rc::new(ExprResult { + expr: r.expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +Rc::new(ExprResult { + expr: make_expr_node(Rc::new(ExprData::ExprUnaryOp { + op: UnaryOpKind::Not, +}), Rc::new(vec![r.expr.clone()]), None, span), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +}, + Some(TokenShape::ShMinus) => { + let r = parse_expr_bp(Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), ctx, 12); +if has_err(r.err.clone()) { + return Rc::new(ExprResult { + expr: r.expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +Rc::new(ExprResult { + expr: make_expr_node(Rc::new(ExprData::ExprUnaryOp { + op: UnaryOpKind::Neg, +}), Rc::new(vec![r.expr.clone()]), None, span), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +}, + _ => parse_primary(&tokens, &ctx), +} +} } pub fn parse_primary(tokens: &Rc>>, ctx: &Rc) -> Rc { { let tok = tokens.clone().first().cloned(); - let sh = match tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, - }; - let span = token_span(tok.clone()); - match sh.clone() { - Some(TokenShape::ShKeyword) => { - let kw_text = tok.clone().unwrap().text.clone(); - let lit_val = - v2_rt::lookup(&dag_syntax_spec().keyword_literals.clone(), kw_text.clone()); - match lit_val { - Some(lv) => Rc::new(ExprResult { - expr: make_expr_node( - Rc::new(ExprData::ExprLiteral { value: lv.clone() }), - Rc::new(vec![]), - None, - span.clone(), - ), - tokens: Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - ctx: ctx.clone(), - err: None, - }), - None => { - if (kw_text.clone().as_str() == "match".to_string().as_str()) { - parse_match(&tokens, &ctx) +let sh = match tok.clone() { + Some(t) => Some(t.shape.clone()), + None => None, +}; +let span = token_span(tok.clone()); +match sh.clone() { + Some(TokenShape::ShKeyword) => { + let kw_text = tok.clone().unwrap().text.clone(); +let lit_val = v2_rt::lookup(&dag_syntax_spec().keyword_literals.clone(), kw_text.clone()); +match lit_val { + Some(lv) => Rc::new(ExprResult { + expr: make_expr_node(Rc::new(ExprData::ExprLiteral { + value: lv.clone(), +}), Rc::new(vec![]), None, span.clone()), + tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), + ctx: ctx.clone(), + err: None, +}), + None => if (kw_text.clone().as_str() == "match".to_string().as_str()) { + parse_match(&tokens, &ctx) + } else { + if (kw_text.clone().as_str() == "if".to_string().as_str()) { + parse_if(&tokens, &ctx) + } else { + if (kw_text.clone().as_str() == "for".to_string().as_str()) { + parse_for(&tokens, &ctx) + } else { + if (kw_text.clone().as_str() == "let".to_string().as_str()) { + parse_let(&tokens, &ctx) } else { - if (kw_text.clone().as_str() == "if".to_string().as_str()) { - parse_if(&tokens, &ctx) + if (kw_text.clone().as_str() == "return".to_string().as_str()) { + parse_return(&tokens, &ctx) } else { - if (kw_text.clone().as_str() == "for".to_string().as_str()) { - parse_for(&tokens, &ctx) + if (kw_text.clone().as_str() == "fn".to_string().as_str()) { + parse_fn_lambda(&tokens, &ctx) } else { - if (kw_text.clone().as_str() == "let".to_string().as_str()) { - parse_let(&tokens, &ctx) - } else { - if (kw_text.clone().as_str() - == "return".to_string().as_str()) - { - parse_return(&tokens, &ctx) - } else { - if (kw_text.clone().as_str() - == "fn".to_string().as_str()) - { - parse_fn_lambda(&tokens, &ctx) - } else { - { - let kw_name = tok_keyword_to_name(tok.clone()); - match kw_name { + { + let kw_name = tok_keyword_to_name(tok.clone()); +match kw_name { Some(n) => parse_ident_expr(&tokens, ctx.clone(), &n), None => Rc::new(ExprResult { expr: parse_recovery_expr(span.clone(), format!("expected expression, found keyword '{}'", kw_text.clone())), @@ -10611,519 +8644,389 @@ pub fn parse_primary(tokens: &Rc>>, ctx: &Rc) -> Rc< err: Some(parse_error(format!("expected expression, found keyword '{}'", kw_text.clone()), span.clone())), }), } - } - } - } - } +} } } } } } - } - Some(TokenShape::ShLitInt) => { - let n_opt = v2_rt::parse_int(tok.clone().unwrap().text.clone()); - let n = match n_opt { - Some(v) => v.clone(), - None => { - return Rc::new(ExprResult { - expr: make_expr_error_node( - ExprErrorKind::InternalExprError, - &v2_rt::concat( - v2_rt::concat( - "internal: ShLitInt token text not parseable as int: '" - .to_string(), - tok.clone().unwrap().text.clone(), - ), - "'".to_string(), - ), - &span, - ), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }) - } - }; - Rc::new(ExprResult { - expr: make_expr_node( - Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitInt { value: n.clone() }), - }), - Rc::new(vec![]), - None, - span.clone(), - ), - tokens: Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - ctx: ctx.clone(), - err: None, - }) - } - Some(TokenShape::ShLitFloat) => { - let f = tok.clone().unwrap().text.clone(); - Rc::new(ExprResult { - expr: make_expr_node( - Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitFloat { value: f }), - }), - Rc::new(vec![]), - None, - span.clone(), - ), - tokens: Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - ctx: ctx.clone(), - err: None, - }) - } - Some(TokenShape::ShLitStr) => { - let s = tok.clone().unwrap().text.clone(); - Rc::new(ExprResult { - expr: make_expr_node( - Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitStr { value: s }), - }), - Rc::new(vec![]), - None, - span.clone(), - ), - tokens: Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - ctx: ctx.clone(), - err: None, - }) - } - Some(TokenShape::ShStrBegin) => parse_string_interp(&tokens, ctx.clone()), - Some(TokenShape::ShIdent) => { - let n = tok.clone().unwrap().text.clone(); - parse_ident_expr(&tokens, ctx.clone(), &n) - } - Some(TokenShape::ShLParen) => parse_paren_expr(&tokens, &ctx), - Some(TokenShape::ShLBracket) => parse_list_literal(&tokens, &ctx), - Some(TokenShape::ShLBrace) => parse_brace_expr(&tokens, ctx.clone()), - _ => { - let tag = match sh.clone() { - Some(shape) => shape_display_name(shape.clone()), - None => "EOF".to_string(), - }; - Rc::new(ExprResult { - expr: parse_recovery_expr( - span.clone(), - format!("expected expression, found {}", tag.clone()), - ), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: Some(parse_error( - format!("expected expression, found {}", tag.clone()), - span.clone(), - )), - }) - } - } - } + }, +} +}, + Some(TokenShape::ShLitInt) => { + let n_opt = v2_rt::parse_int(tok.clone().unwrap().text.clone()); +let n = match n_opt { + Some(v) => v.clone(), + None => return Rc::new(ExprResult { + expr: make_expr_error_node(ExprErrorKind::InternalExprError, &v2_rt::concat(v2_rt::concat("internal: ShLitInt token text not parseable as int: '".to_string(), tok.clone().unwrap().text.clone()), "'".to_string()), &span), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}), +}; +Rc::new(ExprResult { + expr: make_expr_node(Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitInt { + value: n.clone(), +}), +}), Rc::new(vec![]), None, span.clone()), + tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), + ctx: ctx.clone(), + err: None, +}) +}, + Some(TokenShape::ShLitFloat) => { + let f = tok.clone().unwrap().text.clone(); +Rc::new(ExprResult { + expr: make_expr_node(Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitFloat { + value: f, +}), +}), Rc::new(vec![]), None, span.clone()), + tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), + ctx: ctx.clone(), + err: None, +}) +}, + Some(TokenShape::ShLitStr) => { + let s = tok.clone().unwrap().text.clone(); +Rc::new(ExprResult { + expr: make_expr_node(Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitStr { + value: s, +}), +}), Rc::new(vec![]), None, span.clone()), + tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), + ctx: ctx.clone(), + err: None, +}) +}, + Some(TokenShape::ShStrBegin) => parse_string_interp(&tokens, ctx.clone()), + Some(TokenShape::ShIdent) => { + let n = tok.clone().unwrap().text.clone(); +parse_ident_expr(&tokens, ctx.clone(), &n) +}, + Some(TokenShape::ShLParen) => parse_paren_expr(&tokens, &ctx), + Some(TokenShape::ShLBracket) => parse_list_literal(&tokens, &ctx), + Some(TokenShape::ShLBrace) => parse_brace_expr(&tokens, ctx.clone()), + _ => { + let tag = match sh.clone() { + Some(shape) => shape_display_name(shape.clone()), + None => "EOF".to_string(), +}; +Rc::new(ExprResult { + expr: parse_recovery_expr(span.clone(), format!("expected expression, found {}", tag.clone())), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: Some(parse_error(format!("expected expression, found {}", tag.clone()), span.clone())), +}) +}, +} +} } pub fn parse_lambda_body(tokens: &Rc>>, ctx: Rc) -> Rc { { let tokens = skip_newlines(tokens.clone()); - let tok = tokens.clone().first().cloned(); - let is_block = (tok_is_keyword(tok.clone(), "let".to_string()) - || tok_is_keyword(tok.clone(), "return".to_string())); - if is_block { +let tok = tokens.clone().first().cloned(); +let is_block = (tok_is_keyword(tok.clone(), "let".to_string()) || tok_is_keyword(tok.clone(), "return".to_string())); +if is_block { { let r = parse_lambda_stmts(tokens.clone(), ctx, Rc::new(vec![])); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: parse_recovery_placeholder(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let span = token_span(tokens.clone().first().cloned()); - if ((r.stmts.clone().len() as i64) == 1) { + expr: parse_recovery_placeholder(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let span = token_span(tokens.clone().first().cloned()); +if ((r.stmts.clone().len() as i64) == 1) { Rc::new(ExprResult { - expr: r.stmts.clone().first().cloned().clone().unwrap(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) + expr: r.stmts.clone().first().cloned().clone().unwrap(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) } else { Rc::new(ExprResult { - expr: make_expr_node( - Rc::new(ExprData::ExprBlock), - r.stmts.clone(), - None, - span, - ), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) + expr: make_expr_node(Rc::new(ExprData::ExprBlock), r.stmts.clone(), None, span), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) } - } +} } else { parse_expr(tokens.clone(), ctx) } - } +} } -pub fn parse_lambda_stmts( - mut tokens: Rc>>, - mut ctx: Rc, - mut acc: Rc>>, -) -> Rc { +pub fn parse_lambda_stmts(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { loop { tokens = skip_newlines(tokens.clone()); - let tok = tokens.clone().first().cloned(); - if ((tok_is_rparen(tok.clone()) || tok_is_rbrace(tok.clone())) || tok_is_eof(tok.clone())) { +let tok = tokens.clone().first().cloned(); +if ((tok_is_rparen(tok.clone()) || tok_is_rbrace(tok.clone())) || tok_is_eof(tok.clone())) { break Rc::new(StmtsResult { - stmts: acc.clone(), - tokens: tokens.clone(), - ctx: ctx, - err: None, - }); - } else { + stmts: acc.clone(), + tokens: tokens.clone(), + ctx: ctx, + err: None, +}); +} else { let r = parse_stmt(&tokens, ctx); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(StmtsResult { - stmts: acc.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); + stmts: acc.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) } - { +{ let __tco_0 = r.tokens.clone(); - let __tco_1 = r.ctx.clone(); - let __tco_2 = v2_rt::rc_list_push(acc, r.expr.clone()); - tokens = __tco_0; - ctx = __tco_1; - acc = __tco_2; - continue; - } - } - } +let __tco_1 = r.ctx.clone(); +let __tco_2 = v2_rt::rc_list_push(acc, r.expr.clone()); +tokens = __tco_0; +ctx = __tco_1; +acc = __tco_2; +continue; +} +} +} } -pub fn parse_ident_expr( - tokens: &Rc>>, - ctx: Rc, - name: &String, -) -> Rc { +pub fn parse_ident_expr(tokens: &Rc>>, ctx: Rc, name: &String) -> Rc { { let span = token_span(tokens.clone().first().cloned()); - let tokens = Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ); - if tok_is_fat_arrow(tokens.clone().first().cloned()) { +let tokens = Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()); +if tok_is_fat_arrow(tokens.clone().first().cloned()) { { - let r = parse_lambda_body( - &Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - ctx, - ); - if has_err(r.err.clone()) { - return r.clone(); + let r = parse_lambda_body(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), ctx); +if has_err(r.err.clone()) { + return r.clone() } - Rc::new(ExprResult { - expr: make_expr_node( - Rc::new(ExprData::ExprLambda), - v2_rt::concat( - Rc::new(vec![r.expr.clone()]), - Rc::new(vec![parsed_name_leaf(name.clone(), span.clone())]), - ), - None, - span.clone(), - ), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) - } +Rc::new(ExprResult { + expr: make_expr_node(Rc::new(ExprData::ExprLambda), v2_rt::concat(Rc::new(vec![r.expr.clone()]), Rc::new(vec![parsed_name_leaf(name.clone(), span.clone())])), None, span.clone()), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +} } else { - if (is_uppercase_start(name.clone()) && tok_is_lbrace(tokens.clone().first().cloned())) - { + if (is_uppercase_start(name.clone()) && tok_is_lbrace(tokens.clone().first().cloned())) { parse_record_literal(&tokens, &ctx, name.clone(), &span) } else { Rc::new(ExprResult { - expr: make_named_expr_node( - &name, - Rc::new(ExprData::ExprVar { binding_kind: None }), - Rc::new(vec![]), - None, - span.clone(), - span.clone(), - ), - tokens: tokens.clone(), - ctx: ctx, - err: None, - }) + expr: make_named_expr_node(&name, Rc::new(ExprData::ExprVar { + binding_kind: None, +}), Rc::new(vec![]), None, span.clone(), span.clone()), + tokens: tokens.clone(), + ctx: ctx, + err: None, +}) } } - } +} } pub fn is_uppercase_start(name: String) -> bool { { let ch = v2_rt::char_at(&name, 0); - ((ch.clone() >= "A".to_string()) && (ch.clone() <= "Z".to_string())) - } +((ch.clone() >= "A".to_string()) && (ch.clone() <= "Z".to_string())) +} } -pub fn try_postfix( - tokens: &Rc>>, - ctx: &Rc, - lhs: &Rc, - min_bp: i64, -) -> Rc { +pub fn try_postfix(tokens: &Rc>>, ctx: &Rc, lhs: &Rc, min_bp: i64) -> Rc { { let tok = tokens.clone().first().cloned(); - let sh = match tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, - }; - let span = token_span(tok.clone()); - match sh { - Some(TokenShape::ShLParen) => { - if (14 < min_bp) { - Rc::new(PostfixResult { - expr: lhs.clone(), - changed: false, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }) - } else { - { - let r = parse_call_args(&tokens, &ctx); - if has_err(r.err.clone()) { - return Rc::new(PostfixResult { - expr: lhs.clone(), - changed: false, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let call_expr = - make_call_expr(&lhs, r.args.clone(), span, ctx.source_indices.clone()); - Rc::new(PostfixResult { - expr: call_expr, - changed: true, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) +let sh = match tok.clone() { + Some(t) => Some(t.shape.clone()), + None => None, +}; +let span = token_span(tok.clone()); +match sh { + Some(TokenShape::ShLParen) => if (14 < min_bp) { + Rc::new(PostfixResult { + expr: lhs.clone(), + changed: false, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}) + } else { + { + let r = parse_call_args(&tokens, &ctx); +if has_err(r.err.clone()) { + return Rc::new(PostfixResult { + expr: lhs.clone(), + changed: false, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let call_expr = make_call_expr(&lhs, r.args.clone(), span, ctx.source_indices.clone()); +Rc::new(PostfixResult { + expr: call_expr, + changed: true, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +} + }, + Some(TokenShape::ShIdent) => if (tok.clone().unwrap().text.clone().as_str() == "as".to_string().as_str()) { + if (13 < min_bp) { + Rc::new(PostfixResult { + expr: lhs.clone(), + changed: false, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}) + } else { + { + let r = parse_type_expr(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), &ctx); +if has_err(r.err.clone()) { + return Rc::new(PostfixResult { + expr: lhs.clone(), + changed: false, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) } - } +Rc::new(PostfixResult { + expr: make_expr_node(Rc::new(ExprData::ExprCast), Rc::new(vec![lhs.clone(), r.type_expr.clone()]), None, span), + changed: true, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +} } - Some(TokenShape::ShIdent) => { - if (tok.clone().unwrap().text.clone().as_str() == "as".to_string().as_str()) { - if (13 < min_bp) { - Rc::new(PostfixResult { - expr: lhs.clone(), - changed: false, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }) - } else { - { - let r = parse_type_expr( - &Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - &ctx, - ); - if has_err(r.err.clone()) { - return Rc::new(PostfixResult { - expr: lhs.clone(), - changed: false, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - Rc::new(PostfixResult { - expr: make_expr_node( - Rc::new(ExprData::ExprCast), - Rc::new(vec![lhs.clone(), r.type_expr.clone()]), - None, - span, - ), - changed: true, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) - } + } else { + Rc::new(PostfixResult { + expr: lhs.clone(), + changed: false, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}) + }, + Some(TokenShape::ShLBracket) => if (14 < min_bp) { + Rc::new(PostfixResult { + expr: lhs.clone(), + changed: false, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}) + } else { + if is_constraint_bracket(tokens.clone()) { + Rc::new(PostfixResult { + expr: lhs.clone(), + changed: false, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}) + } else { + { + let r = parse_index_or_slice(&tokens, &ctx, lhs.clone(), span); +if has_err(r.err.clone()) { + return Rc::new(PostfixResult { + expr: lhs.clone(), + changed: false, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) } - } else { - Rc::new(PostfixResult { - expr: lhs.clone(), - changed: false, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }) - } +Rc::new(PostfixResult { + expr: r.expr.clone(), + changed: true, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +} } - Some(TokenShape::ShLBracket) => { - if (14 < min_bp) { - Rc::new(PostfixResult { - expr: lhs.clone(), - changed: false, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }) - } else { - if is_constraint_bracket(tokens.clone()) { - Rc::new(PostfixResult { - expr: lhs.clone(), - changed: false, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }) - } else { - { - let r = parse_index_or_slice(&tokens, &ctx, lhs.clone(), span); - if has_err(r.err.clone()) { - return Rc::new(PostfixResult { - expr: lhs.clone(), - changed: false, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - Rc::new(PostfixResult { - expr: r.expr.clone(), - changed: true, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) + }, + Some(TokenShape::ShLBrace) => match (*lhs.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let n = expr_var_name_at(lhs.clone(), ctx.source_indices.clone()); +if (is_uppercase_start(n.clone()) && (14 <= min_bp)) { + Rc::new(PostfixResult { + expr: lhs.clone(), + changed: false, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}) + } else { + if is_uppercase_start(n.clone()) { + { + let r = parse_record_literal(&tokens, &ctx, n.clone(), &lhs.span.clone()); +if has_err(r.err.clone()) { + return Rc::new(PostfixResult { + expr: lhs.clone(), + changed: false, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) } - } +Rc::new(PostfixResult { + expr: r.expr.clone(), + changed: true, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +} + } else { + Rc::new(PostfixResult { + expr: lhs.clone(), + changed: false, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}) } } - Some(TokenShape::ShLBrace) => match (*lhs.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let n = expr_var_name_at(lhs.clone(), ctx.source_indices.clone()); - if (is_uppercase_start(n.clone()) && (14 <= min_bp)) { - Rc::new(PostfixResult { - expr: lhs.clone(), - changed: false, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }) - } else { - if is_uppercase_start(n.clone()) { - { - let r = parse_record_literal( - &tokens, - &ctx, - n.clone(), - &lhs.span.clone(), - ); - if has_err(r.err.clone()) { - return Rc::new(PostfixResult { - expr: lhs.clone(), - changed: false, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - Rc::new(PostfixResult { - expr: r.expr.clone(), - changed: true, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) - } - } else { - Rc::new(PostfixResult { - expr: lhs.clone(), - changed: false, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }) - } - } - } - _ => Rc::new(PostfixResult { - expr: lhs.clone(), - changed: false, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }), - }, - _ => Rc::new(PostfixResult { - expr: lhs.clone(), - changed: false, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }), - } - } +}, + _ => Rc::new(PostfixResult { + expr: lhs.clone(), + changed: false, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}), +}, + _ => Rc::new(PostfixResult { + expr: lhs.clone(), + changed: false, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}), +} +} } pub fn is_constraint_bracket(tokens: Rc>>) -> bool { match tokens.get(1 as usize).cloned() { - Some(t) => { - if is_ident_shape(t.shape.clone()) { - ((t.text.clone().as_str() == "after".to_string().as_str()) - || (t.text.clone().as_str() == "when".to_string().as_str())) - } else { - false - } - } - None => false, - } + Some(t) => if is_ident_shape(t.shape.clone()) { + ((t.text.clone().as_str() == "after".to_string().as_str()) || (t.text.clone().as_str() == "when".to_string().as_str())) + } else { + false + }, + None => false, +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -11134,2964 +9037,2240 @@ pub struct ConstraintsResult { pub err: Option>, } -pub fn parse_constraint_annotations( - tokens: &Rc>>, - ctx: Rc, -) -> Rc { +pub fn parse_constraint_annotations(tokens: &Rc>>, ctx: Rc) -> Rc { match (*eat(&tokens, Rc::new(ExpectedToken::ExpectLBracket))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let r = parse_constraint_list(__ec.clone(), ctx, Rc::new(vec![])); - if has_err(r.err.clone()) { - return r.clone(); - } - let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectRBracket)); - if has_err(r2.err.clone()) { - return Rc::new(ConstraintsResult { - constraints: Rc::new(vec![]), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), - }); - } - Rc::new(ConstraintsResult { - constraints: r.constraints.clone(), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) - } - EatResult::EatUnchanged { tokens: __eu, .. } => Rc::new(ConstraintsResult { - constraints: Rc::new(vec![]), - tokens: tokens.clone(), - ctx: ctx, - err: None, - }), - } + EatResult::EatConsumed { tokens: __ec, .. } => { + let r = parse_constraint_list(__ec.clone(), ctx, Rc::new(vec![])); +if has_err(r.err.clone()) { + return r.clone() + } +let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectRBracket)); +if has_err(r2.err.clone()) { + return Rc::new(ConstraintsResult { + constraints: Rc::new(vec![]), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), +}) + } +Rc::new(ConstraintsResult { + constraints: r.constraints.clone(), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +}, + EatResult::EatUnchanged { tokens: __eu, .. } => Rc::new(ConstraintsResult { + constraints: Rc::new(vec![]), + tokens: tokens.clone(), + ctx: ctx, + err: None, +}), +} } -pub fn parse_constraint_list( - mut tokens: Rc>>, - mut ctx: Rc, - mut acc: Rc>>, -) -> Rc { +pub fn parse_constraint_list(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { loop { tokens = skip_newlines(tokens.clone()); - let tok = tokens.clone().first().cloned(); - let is_constraint_kw = match tok.clone() { - Some(t) => { - (is_ident_shape(t.shape.clone()) - && ((t.text.clone().as_str() == "after".to_string().as_str()) - || (t.text.clone().as_str() == "when".to_string().as_str()))) - } - None => false, - }; - if !is_constraint_kw { - return Rc::new(ConstraintsResult { - constraints: acc.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }); - } - let kw_name = tok.clone().unwrap().text.clone(); - let r = parse_expr( - Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - ctx.clone(), - ); - if has_err(r.err.clone()) { +let tok = tokens.clone().first().cloned(); +let is_constraint_kw = match tok.clone() { + Some(t) => (is_ident_shape(t.shape.clone()) && ((t.text.clone().as_str() == "after".to_string().as_str()) || (t.text.clone().as_str() == "when".to_string().as_str()))), + None => false, +}; +if !is_constraint_kw { return Rc::new(ConstraintsResult { - constraints: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let fi = make_field_init_node(&kw_name, r.expr.clone(), make_span(0, 0), make_span(0, 0)); - acc = v2_rt::rc_list_push(acc.clone(), fi); - match (*eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let __tco_0 = __ec.clone(); - let __tco_1 = r.ctx.clone(); - tokens = __tco_0; - ctx = __tco_1; - continue; - } - EatResult::EatUnchanged { tokens: __eu, .. } => { - break Rc::new(ConstraintsResult { - constraints: acc.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }); - } + constraints: acc.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}) } - } -} - -pub fn try_constraint_annotations( - tokens: &Rc>>, - ctx: Rc, -) -> Rc { +let kw_name = tok.clone().unwrap().text.clone(); +let r = parse_expr(Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), ctx.clone()); +if has_err(r.err.clone()) { + return Rc::new(ConstraintsResult { + constraints: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let fi = make_field_init_node(&kw_name, r.expr.clone(), make_span(0, 0), make_span(0, 0)); +acc = v2_rt::rc_list_push(acc.clone(), fi); +match (*eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { { + let __tco_0 = __ec.clone(); +let __tco_1 = r.ctx.clone(); +tokens = __tco_0; +ctx = __tco_1; +continue; +} }, + EatResult::EatUnchanged { tokens: __eu, .. } => { break Rc::new(ConstraintsResult { + constraints: acc.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}); }, +} +} +} + +pub fn try_constraint_annotations(tokens: &Rc>>, ctx: Rc) -> Rc { if is_constraint_bracket(tokens.clone()) { parse_constraint_annotations(&tokens, ctx) } else { Rc::new(ConstraintsResult { - constraints: Rc::new(vec![]), - tokens: tokens.clone(), - ctx: ctx, - err: None, - }) + constraints: Rc::new(vec![]), + tokens: tokens.clone(), + ctx: ctx, + err: None, +}) } } -pub fn make_call_expr( - lhs: &Rc, - args: Rc>>, - span: Rc, - source_indices: Rc>>, -) -> Rc { +pub fn make_call_expr(lhs: &Rc, args: Rc>>, span: Rc, source_indices: Rc>>) -> Rc { match (*lhs.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => make_named_expr_node( - &expr_var_name_at(lhs.clone(), source_indices), - Rc::new(ExprData::ExprCall { - call_semantics: None, - descent_evidence: None, - }), - args, - None, - lhs.span.clone(), - node_name_span(&lhs), - ), - ExprData::ExprFieldAccess { .. } => make_named_expr_node( - &field_access_field_at(lhs.clone(), source_indices), - Rc::new(ExprData::ExprMethodCall { - method_semantics: None, - }), - v2_rt::concat( - Rc::new(vec![lhs.children.clone().first().cloned().clone().unwrap()]), - args, - ), - None, - lhs.span.clone(), - node_name_span(&lhs), - ), - _ => make_named_expr_node( - &"".to_string(), - Rc::new(ExprData::ExprCall { - call_semantics: None, - descent_evidence: None, - }), - args, - None, - lhs.span.clone(), - no_span(), - ), - } + ExprData::ExprVar { .. } => make_named_expr_node(&expr_var_name_at(lhs.clone(), source_indices), Rc::new(ExprData::ExprCall { + call_semantics: None, + descent_evidence: None, +}), args, None, lhs.span.clone(), node_name_span(&lhs)), + ExprData::ExprFieldAccess { .. } => make_named_expr_node(&field_access_field_at(lhs.clone(), source_indices), Rc::new(ExprData::ExprMethodCall { + method_semantics: None, +}), v2_rt::concat(Rc::new(vec![lhs.children.clone().first().cloned().clone().unwrap()]), args), None, lhs.span.clone(), node_name_span(&lhs)), + _ => make_named_expr_node(&"".to_string(), Rc::new(ExprData::ExprCall { + call_semantics: None, + descent_evidence: None, +}), args, None, lhs.span.clone(), no_span()), +} } -pub fn parse_index_or_slice( - tokens: &Rc>>, - ctx: &Rc, - base: Rc, - span: Rc, -) -> Rc { +pub fn parse_index_or_slice(tokens: &Rc>>, ctx: &Rc, base: Rc, span: Rc) -> Rc { { let dummy_expr = parse_recovery_placeholder(); - let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectLBracket)); - if has_err(r.err.clone()) { +let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectLBracket)); +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let r = parse_expr(r.tokens.clone(), ctx.clone()); - if has_err(r.err.clone()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let r = parse_expr(r.tokens.clone(), ctx.clone()); +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: r.expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let first_expr = r.expr.clone(); - let tokens = r.tokens.clone(); - let ctx = r.ctx.clone(); - if tok_is_dot_dot(tokens.clone().first().cloned()) { + expr: r.expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let first_expr = r.expr.clone(); +let tokens = r.tokens.clone(); +let ctx = r.ctx.clone(); +if tok_is_dot_dot(tokens.clone().first().cloned()) { { - let r = parse_expr( - Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - ctx.clone(), - ); - if has_err(r.err.clone()) { + let r = parse_expr(Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), ctx.clone()); +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: r.expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let end_expr = r.expr.clone(); - let r = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectRBracket)); - if has_err(r.err.clone()) { + expr: r.expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let end_expr = r.expr.clone(); +let r = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectRBracket)); +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) } - Rc::new(ExprResult { - expr: make_expr_node( - Rc::new(ExprData::ExprSlice), - Rc::new(vec![base, first_expr, end_expr]), - None, - span, - ), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: None, - }) - } +Rc::new(ExprResult { + expr: make_expr_node(Rc::new(ExprData::ExprSlice), Rc::new(vec![base, first_expr, end_expr]), None, span), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: None, +}) +} } else { { let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBracket)); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) } - Rc::new(ExprResult { - expr: make_expr_node( - Rc::new(ExprData::ExprIndex), - Rc::new(vec![base, first_expr]), - None, - span, - ), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: None, - }) - } +Rc::new(ExprResult { + expr: make_expr_node(Rc::new(ExprData::ExprIndex), Rc::new(vec![base, first_expr]), None, span), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: None, +}) +} } - } +} } pub fn parse_call_args(tokens: &Rc>>, ctx: &Rc) -> Rc { { let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectLParen)); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(ArgsResult { - args: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); + args: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) } - let tokens = skip_newlines(r.tokens.clone()); - if tok_is_rparen(tokens.clone().first().cloned()) { +let tokens = skip_newlines(r.tokens.clone()); +if tok_is_rparen(tokens.clone().first().cloned()) { Rc::new(ArgsResult { - args: Rc::new(vec![]), - tokens: Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - ctx: ctx.clone(), - err: None, - }) + args: Rc::new(vec![]), + tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), + ctx: ctx.clone(), + err: None, +}) } else { { let r = parse_arg_list(tokens.clone(), ctx.clone()); - if has_err(r.err.clone()) { - return r.clone(); +if has_err(r.err.clone()) { + return r.clone() } - let tokens = skip_newlines(r.tokens.clone()); - let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRParen)); - if has_err(r2.err.clone()) { +let tokens = skip_newlines(r.tokens.clone()); +let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRParen)); +if has_err(r2.err.clone()) { return Rc::new(ArgsResult { - args: Rc::new(vec![]), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), - }); + args: Rc::new(vec![]), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), +}) } - Rc::new(ArgsResult { - args: r.args.clone(), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) - } +Rc::new(ArgsResult { + args: r.args.clone(), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +} } - } +} } pub fn parse_arg_list(tokens: Rc>>, ctx: Rc) -> Rc { parse_arg_list_acc(tokens, ctx, Rc::new(vec![])) } -pub fn parse_arg_list_acc( - mut tokens: Rc>>, - mut ctx: Rc, - mut acc: Rc>>, -) -> Rc { +pub fn parse_arg_list_acc(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { loop { tokens = skip_newlines(tokens.clone()); - let r = parse_single_arg(&tokens, ctx); - if has_err(r.err.clone()) { +let r = parse_single_arg(&tokens, ctx); +if has_err(r.err.clone()) { return Rc::new(ArgsResult { - args: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - acc = v2_rt::rc_list_push(acc.clone(), r.arg.clone()); - match (*eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - tokens = skip_newlines(__ec.clone()); - if tok_is_rparen(tokens.clone().first().cloned()) { - break Rc::new(ArgsResult { - args: acc.clone(), - tokens: tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }); - } else { - { - let __tco_0 = r.ctx.clone(); - ctx = __tco_0; - continue; - } - } - } - EatResult::EatUnchanged { tokens: __eu, .. } => { - break Rc::new(ArgsResult { - args: acc.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }); - } - } - } + args: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +acc = v2_rt::rc_list_push(acc.clone(), r.arg.clone()); +match (*eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { tokens = skip_newlines(__ec.clone()); +if tok_is_rparen(tokens.clone().first().cloned()) { + break Rc::new(ArgsResult { + args: acc.clone(), + tokens: tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}); +} else { + { + let __tco_0 = r.ctx.clone(); +ctx = __tco_0; +continue; +} +} }, + EatResult::EatUnchanged { tokens: __eu, .. } => { break Rc::new(ArgsResult { + args: acc.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}); }, +} +} } pub fn parse_single_arg(tokens: &Rc>>, ctx: Rc) -> Rc { { let span = token_span(tokens.clone().first().cloned()); - let dummy_arg = make_arg_node( - None, - parse_recovery_placeholder(), - span.clone(), - span.clone(), - ); - let tok = tokens.clone().first().cloned(); - let is_name_token = (tok_is_ident(tok.clone()) || tok_is_keyword_name(tok.clone())); - if is_name_token { +let dummy_arg = make_arg_node(None, parse_recovery_placeholder(), span.clone(), span.clone()); +let tok = tokens.clone().first().cloned(); +let is_name_token = (tok_is_ident(tok.clone()) || tok_is_keyword_name(tok.clone())); +if is_name_token { { let name_r = expect_name(&tokens); - if has_err(name_r.err.clone()) { +if has_err(name_r.err.clone()) { { let r = parse_expr(tokens.clone(), ctx); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(ArgResult { - arg: dummy_arg, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); + arg: dummy_arg, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) } - let arg = make_arg_node(None, r.expr.clone(), span.clone(), span.clone()); - Rc::new(ArgResult { - arg: arg, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) - } +let arg = make_arg_node(None, r.expr.clone(), span.clone(), span.clone()); +Rc::new(ArgResult { + arg: arg, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +} } else { if tok_is_colon(name_r.tokens.clone().first().cloned()) { { - let r = parse_expr( - Rc::new( - name_r - .tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - ctx, - ); - if has_err(r.err.clone()) { + let r = parse_expr(Rc::new(name_r.tokens.clone().iter().cloned().skip(1 as usize).collect::>()), ctx); +if has_err(r.err.clone()) { return Rc::new(ArgResult { - arg: dummy_arg, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); + arg: dummy_arg, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) } - let arg = make_arg_node( - Some(name_r.name.clone()), - r.expr.clone(), - span.clone(), - name_r.span.clone(), - ); - Rc::new(ArgResult { - arg: arg, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) - } +let arg = make_arg_node(Some(name_r.name.clone()), r.expr.clone(), span.clone(), name_r.span.clone()); +Rc::new(ArgResult { + arg: arg, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +} } else { { let r = parse_expr(tokens.clone(), ctx); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(ArgResult { - arg: dummy_arg, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); + arg: dummy_arg, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) } - let arg = - make_arg_node(None, r.expr.clone(), span.clone(), span.clone()); - Rc::new(ArgResult { - arg: arg, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) - } +let arg = make_arg_node(None, r.expr.clone(), span.clone(), span.clone()); +Rc::new(ArgResult { + arg: arg, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +} } } - } +} } else { { let r = parse_expr(tokens.clone(), ctx); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(ArgResult { - arg: dummy_arg, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); + arg: dummy_arg, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) } - let arg = make_arg_node(None, r.expr.clone(), span.clone(), span.clone()); - Rc::new(ArgResult { - arg: arg, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) - } +let arg = make_arg_node(None, r.expr.clone(), span.clone(), span.clone()); +Rc::new(ArgResult { + arg: arg, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +} } - } +} } pub fn parse_match(tokens: &Rc>>, ctx: &Rc) -> Rc { { let span = token_span(tokens.clone().first().cloned()); - let dummy_expr = parse_recovery_placeholder(); - let r = expect( - &tokens, - &Rc::new(ExpectedToken::ExpectKeyword { - text: "match".to_string(), - }), - ); - if has_err(r.err.clone()) { +let dummy_expr = parse_recovery_placeholder(); +let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { + text: "match".to_string(), +})); +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let r = parse_expr_no_brace(r.tokens.clone(), ctx.clone()); - if has_err(r.err.clone()) { - return r.clone(); - } - let scrutinee = r.expr.clone(); - let r = expect( - &skip_newlines(r.tokens.clone()), - &Rc::new(ExpectedToken::ExpectLBrace), - ); - if has_err(r.err.clone()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let r = parse_expr_no_brace(r.tokens.clone(), ctx.clone()); +if has_err(r.err.clone()) { + return r.clone() + } +let scrutinee = r.expr.clone(); +let r = expect(&skip_newlines(r.tokens.clone()), &Rc::new(ExpectedToken::ExpectLBrace)); +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let r = parse_match_arms(skip_newlines(r.tokens.clone()), ctx.clone()); - if has_err(r.err.clone()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let r = parse_match_arms(skip_newlines(r.tokens.clone()), ctx.clone()); +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let arms = r.arms.clone(); - let r = expect( - &skip_newlines(r.tokens.clone()), - &Rc::new(ExpectedToken::ExpectRBrace), - ); - if has_err(r.err.clone()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let arms = r.arms.clone(); +let r = expect(&skip_newlines(r.tokens.clone()), &Rc::new(ExpectedToken::ExpectRBrace)); +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - Rc::new(ExprResult { - expr: make_expr_node( - Rc::new(ExprData::ExprMatch), - v2_rt::concat(Rc::new(vec![scrutinee]), arms), - None, - span, - ), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: None, - }) - } + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +Rc::new(ExprResult { + expr: make_expr_node(Rc::new(ExprData::ExprMatch), v2_rt::concat(Rc::new(vec![scrutinee]), arms), None, span), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: None, +}) +} } pub fn parse_expr_no_brace(tokens: Rc>>, ctx: Rc) -> Rc { parse_expr_bp_no_brace(tokens, ctx, 0) } -pub fn parse_expr_bp_no_brace( - tokens: Rc>>, - ctx: Rc, - min_bp: i64, -) -> Rc { +pub fn parse_expr_bp_no_brace(tokens: Rc>>, ctx: Rc, min_bp: i64) -> Rc { { let r = parse_prefix(&tokens, ctx); - if has_err(r.err.clone()) { - return r.clone(); +if has_err(r.err.clone()) { + return r.clone() } - let lhs = r.expr.clone(); - parse_expr_loop_no_brace(r.tokens.clone(), r.ctx.clone(), lhs, min_bp) - } +let lhs = r.expr.clone(); +parse_expr_loop_no_brace(r.tokens.clone(), r.ctx.clone(), lhs, min_bp) +} } -pub fn parse_expr_loop_no_brace( - mut tokens: Rc>>, - mut ctx: Rc, - mut lhs: Rc, - mut min_bp: i64, -) -> Rc { +pub fn parse_expr_loop_no_brace(mut tokens: Rc>>, mut ctx: Rc, mut lhs: Rc, mut min_bp: i64) -> Rc { loop { let tok = tokens.clone().first().cloned(); - if (tok_is_eof(tok.clone()) || tok_is_lbrace(tok.clone())) { +if (tok_is_eof(tok.clone()) || tok_is_lbrace(tok.clone())) { break Rc::new(ExprResult { - expr: lhs.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }); - } else { + expr: lhs.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}); +} else { let loop_span = token_span(tok.clone()); - tokens = skip_continuation_newlines(&tokens); - if (tok_is_lparen(tokens.clone().first().cloned()) && (14 >= min_bp.clone())) { +tokens = skip_continuation_newlines(&tokens); +if (tok_is_lparen(tokens.clone().first().cloned()) && (14 >= min_bp.clone())) { let r = parse_call_args(&tokens, &ctx); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: lhs.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let span = token_span(tokens.clone().first().cloned()); - let new_lhs = - make_call_expr(&lhs, r.args.clone(), span, ctx.source_indices.clone()); - { + expr: lhs.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let span = token_span(tokens.clone().first().cloned()); +let new_lhs = make_call_expr(&lhs, r.args.clone(), span, ctx.source_indices.clone()); +{ let __tco_0 = r.tokens.clone(); - let __tco_1 = r.ctx.clone(); - let __tco_2 = new_lhs; - tokens = __tco_0; - ctx = __tco_1; - lhs = __tco_2; - continue; - } - } else { +let __tco_1 = r.ctx.clone(); +let __tco_2 = new_lhs; +tokens = __tco_0; +ctx = __tco_1; +lhs = __tco_2; +continue; +} +} else { if (tok_is_lbracket(tokens.clone().first().cloned()) && (14 >= min_bp.clone())) { let span = token_span(tokens.clone().first().cloned()); - let r = parse_index_or_slice(&tokens, &ctx, lhs.clone(), span); - if has_err(r.err.clone()) { +let r = parse_index_or_slice(&tokens, &ctx, lhs.clone(), span); +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: r.expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); + expr: r.expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) } - { +{ let __tco_0 = r.tokens.clone(); - let __tco_1 = r.ctx.clone(); - let __tco_2 = r.expr.clone(); - tokens = __tco_0; - ctx = __tco_1; - lhs = __tco_2; - continue; - } - } else { +let __tco_1 = r.ctx.clone(); +let __tco_2 = r.expr.clone(); +tokens = __tco_0; +ctx = __tco_1; +lhs = __tco_2; +continue; +} +} else { let bp = infix_bp(tokens.clone()); - match bp { - Some(bps) => { - if (bps.left.clone() < min_bp.clone()) { - break Rc::new(ExprResult { - expr: lhs.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }); - } else { - match (*advance(&tokens)).clone() { - AdvanceResult::AdvanceOk { - token: op_tok, - tokens: rest, - .. - } => { - let op_shape = op_tok.shape.clone(); - if is_dot_shape(op_shape.clone()) { - let r = expect_name(&rest); - if has_err(r.err.clone()) { - return Rc::new(ExprResult { - expr: lhs.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let new_lhs = make_named_expr_node( - &r.name.clone(), - Rc::new(ExprData::ExprFieldAccess { - summary: None, - }), - Rc::new(vec![lhs.clone()]), - None, - loop_span, - r.span.clone(), - ); - { - let __tco_0 = r.tokens.clone(); - let __tco_1 = new_lhs; - tokens = __tco_0; - lhs = __tco_1; - continue; - } - } else { - if is_pipe_arrow_shape(op_shape.clone()) { - let r = parse_pipe_rhs( - &rest, - &ctx, - lhs.clone(), - loop_span, - ); - if has_err(r.err.clone()) { - return Rc::new(ExprResult { - expr: r.expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - { - let __tco_0 = r.tokens.clone(); - let __tco_1 = r.ctx.clone(); - let __tco_2 = r.expr.clone(); - tokens = __tco_0; - ctx = __tco_1; - lhs = __tco_2; - continue; - } - } else { - tokens = skip_newlines(rest.clone()); - let r = parse_expr_bp_no_brace( - tokens.clone(), - ctx.clone(), - bps.right.clone(), - ); - if has_err(r.err.clone()) { - return Rc::new(ExprResult { - expr: r.expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let binop_opt = find_operator_binop( - dag_syntax_spec().operators.clone(), - op_tok.text.clone(), - ); - match binop_opt { - Some(binop) => { - let new_lhs = make_expr_node( - Rc::new(ExprData::ExprBinOp { - op: binop.clone(), - algebra_field: None, - }), - Rc::new(vec![ - lhs.clone(), - r.expr.clone(), - ]), - None, - loop_span, - ); - { - let __tco_0 = r.tokens.clone(); - let __tco_1 = r.ctx.clone(); - let __tco_2 = new_lhs; - tokens = __tco_0; - ctx = __tco_1; - lhs = __tco_2; - continue; - } - } - None => { - break Rc::new(ExprResult { - expr: lhs.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: Some(parse_error( - v2_rt::concat( - "unknown binary operator: " - .to_string(), - op_tok.text.clone(), - ), - loop_span, - )), - }); - } - } - } - } - } - AdvanceResult::AdvanceEof => { - break Rc::new(ExprResult { - expr: lhs.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }); - } - } +match bp { + Some(bps) => { if (bps.left.clone() < min_bp.clone()) { + break Rc::new(ExprResult { + expr: lhs.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}); +} else { + match (*advance(&tokens)).clone() { + AdvanceResult::AdvanceOk { token: op_tok, tokens: rest, .. } => { let op_shape = op_tok.shape.clone(); +if is_dot_shape(op_shape.clone()) { + let r = expect_name(&rest); +if has_err(r.err.clone()) { + return Rc::new(ExprResult { + expr: lhs.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) } - } - None => { - break Rc::new(ExprResult { - expr: lhs.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }); - } - } - } - } - } - } +let new_lhs = make_named_expr_node(&r.name.clone(), Rc::new(ExprData::ExprFieldAccess { + summary: None, +}), Rc::new(vec![lhs.clone()]), None, loop_span, r.span.clone()); +{ + let __tco_0 = r.tokens.clone(); +let __tco_1 = new_lhs; +tokens = __tco_0; +lhs = __tco_1; +continue; +} +} else { + if is_pipe_arrow_shape(op_shape.clone()) { + let r = parse_pipe_rhs(&rest, &ctx, lhs.clone(), loop_span); +if has_err(r.err.clone()) { + return Rc::new(ExprResult { + expr: r.expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +{ + let __tco_0 = r.tokens.clone(); +let __tco_1 = r.ctx.clone(); +let __tco_2 = r.expr.clone(); +tokens = __tco_0; +ctx = __tco_1; +lhs = __tco_2; +continue; +} +} else { + tokens = skip_newlines(rest.clone()); +let r = parse_expr_bp_no_brace(tokens.clone(), ctx.clone(), bps.right.clone()); +if has_err(r.err.clone()) { + return Rc::new(ExprResult { + expr: r.expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let binop_opt = find_operator_binop(dag_syntax_spec().operators.clone(), op_tok.text.clone()); +match binop_opt { + Some(binop) => { let new_lhs = make_expr_node(Rc::new(ExprData::ExprBinOp { + op: binop.clone(), + algebra_field: None, +}), Rc::new(vec![lhs.clone(), r.expr.clone()]), None, loop_span); +{ + let __tco_0 = r.tokens.clone(); +let __tco_1 = r.ctx.clone(); +let __tco_2 = new_lhs; +tokens = __tco_0; +ctx = __tco_1; +lhs = __tco_2; +continue; +} }, + None => { break Rc::new(ExprResult { + expr: lhs.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: Some(parse_error(v2_rt::concat("unknown binary operator: ".to_string(), op_tok.text.clone()), loop_span)), +}); }, +} +} +} }, + AdvanceResult::AdvanceEof => { break Rc::new(ExprResult { + expr: lhs.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}); }, +} +} }, + None => { break Rc::new(ExprResult { + expr: lhs.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}); }, +} +} +} +} +} } pub fn parse_match_arms(tokens: Rc>>, ctx: Rc) -> Rc { parse_match_arms_acc(tokens, ctx, Rc::new(vec![])) } -pub fn parse_match_arms_acc( - mut tokens: Rc>>, - mut ctx: Rc, - mut acc: Rc>>, -) -> Rc { +pub fn parse_match_arms_acc(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { loop { tokens = skip_newlines(tokens.clone()); - if (tok_is_rbrace(tokens.clone().first().cloned()) - || tok_is_eof(tokens.clone().first().cloned())) - { +if (tok_is_rbrace(tokens.clone().first().cloned()) || tok_is_eof(tokens.clone().first().cloned())) { break Rc::new(ArmsResult { - arms: acc.clone(), - tokens: tokens.clone(), - ctx: ctx, - err: None, - }); - } else { + arms: acc.clone(), + tokens: tokens.clone(), + ctx: ctx, + err: None, +}); +} else { let r = parse_match_arm(&tokens, &ctx); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(ArmsResult { - arms: acc.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let e = eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); - tokens = skip_newlines(match (*e).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), - EatResult::EatUnchanged { .. } => r.tokens.clone(), - }); - { + arms: acc.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let e = eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); +tokens = skip_newlines(match (*e).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), + EatResult::EatUnchanged { .. } => r.tokens.clone(), +}); +{ let __tco_0 = r.ctx.clone(); - let __tco_1 = v2_rt::rc_list_push(acc, r.arm.clone()); - ctx = __tco_0; - acc = __tco_1; - continue; - } - } - } +let __tco_1 = v2_rt::rc_list_push(acc, r.arm.clone()); +ctx = __tco_0; +acc = __tco_1; +continue; +} +} +} } pub fn parse_match_arm(tokens: &Rc>>, ctx: &Rc) -> Rc { { let arm_span = token_span(tokens.clone().first().cloned()); - let dummy_arm = make_arm_node( - Rc::new(MatchPattern::Wildcard), - None, - parse_recovery_placeholder(), - make_span(0, 0), - ); - let r = parse_pattern(&tokens, &ctx); - if has_err(r.err.clone()) { +let dummy_arm = make_arm_node(Rc::new(MatchPattern::Wildcard), None, parse_recovery_placeholder(), make_span(0, 0)); +let r = parse_pattern(&tokens, &ctx); +if has_err(r.err.clone()) { return Rc::new(ArmResult { - arm: dummy_arm.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let pat = r.pattern.clone(); - let tokens = r.tokens.clone(); - let ctx = r.ctx.clone(); - let guard_r = parse_optional_guard(&tokens, ctx.clone()); - if has_err(guard_r.err.clone()) { + arm: dummy_arm.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let pat = r.pattern.clone(); +let tokens = r.tokens.clone(); +let ctx = r.ctx.clone(); +let guard_r = parse_optional_guard(&tokens, ctx.clone()); +if has_err(guard_r.err.clone()) { return Rc::new(ArmResult { - arm: dummy_arm.clone(), - tokens: guard_r.tokens.clone(), - ctx: guard_r.ctx.clone(), - err: guard_r.err.clone(), - }); - } - let guard = guard_r.guard.clone(); - let tokens = guard_r.tokens.clone(); - let ctx = guard_r.ctx.clone(); - let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectFatArrow)); - if has_err(r.err.clone()) { + arm: dummy_arm.clone(), + tokens: guard_r.tokens.clone(), + ctx: guard_r.ctx.clone(), + err: guard_r.err.clone(), +}) + } +let guard = guard_r.guard.clone(); +let tokens = guard_r.tokens.clone(); +let ctx = guard_r.ctx.clone(); +let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectFatArrow)); +if has_err(r.err.clone()) { return Rc::new(ArmResult { - arm: dummy_arm.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let tokens = skip_newlines(r.tokens.clone()); - let r = if tok_is_lbrace(tokens.clone().first().cloned()) { + arm: dummy_arm.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let tokens = skip_newlines(r.tokens.clone()); +let r = if tok_is_lbrace(tokens.clone().first().cloned()) { parse_block(&tokens, &ctx) } else { parse_match_arm_body(&tokens, ctx.clone()) }; - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(ArmResult { - arm: dummy_arm.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let arm = make_arm_node(pat, guard, r.expr.clone(), arm_span); - Rc::new(ArmResult { - arm: arm, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) - } + arm: dummy_arm.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let arm = make_arm_node(pat, guard, r.expr.clone(), arm_span); +Rc::new(ArmResult { + arm: arm, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +} } pub fn parse_match_arm_body(tokens: &Rc>>, ctx: Rc) -> Rc { { let tok = tokens.clone().first().cloned(); - let is_block = (tok_is_keyword(tok.clone(), "let".to_string()) - || tok_is_keyword(tok.clone(), "return".to_string())); - if is_block { +let is_block = (tok_is_keyword(tok.clone(), "let".to_string()) || tok_is_keyword(tok.clone(), "return".to_string())); +if is_block { { let r = parse_match_arm_stmts(tokens.clone(), ctx, Rc::new(vec![])); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: parse_recovery_placeholder(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let span = token_span(tokens.clone().first().cloned()); - if ((r.stmts.clone().len() as i64) == 1) { + expr: parse_recovery_placeholder(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let span = token_span(tokens.clone().first().cloned()); +if ((r.stmts.clone().len() as i64) == 1) { Rc::new(ExprResult { - expr: r.stmts.clone().first().cloned().clone().unwrap(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) + expr: r.stmts.clone().first().cloned().clone().unwrap(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) } else { Rc::new(ExprResult { - expr: make_expr_node( - Rc::new(ExprData::ExprBlock), - r.stmts.clone(), - None, - span, - ), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) + expr: make_expr_node(Rc::new(ExprData::ExprBlock), r.stmts.clone(), None, span), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) } - } +} } else { parse_expr(tokens.clone(), ctx) } - } +} } -pub fn parse_match_arm_stmts( - mut tokens: Rc>>, - mut ctx: Rc, - mut acc: Rc>>, -) -> Rc { +pub fn parse_match_arm_stmts(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { loop { tokens = skip_newlines(tokens.clone()); - if (tok_is_rbrace(tokens.clone().first().cloned()) - || tok_is_eof(tokens.clone().first().cloned())) - { +if (tok_is_rbrace(tokens.clone().first().cloned()) || tok_is_eof(tokens.clone().first().cloned())) { break Rc::new(StmtsResult { - stmts: acc.clone(), - tokens: tokens.clone(), - ctx: ctx, - err: None, - }); - } else { + stmts: acc.clone(), + tokens: tokens.clone(), + ctx: ctx, + err: None, +}); +} else { if looks_like_arm_start(&tokens) { break Rc::new(StmtsResult { - stmts: acc.clone(), - tokens: tokens.clone(), - ctx: ctx, - err: None, - }); - } else { + stmts: acc.clone(), + tokens: tokens.clone(), + ctx: ctx, + err: None, +}); +} else { let r = parse_stmt(&tokens, ctx); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(StmtsResult { - stmts: acc.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); + stmts: acc.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) } - { +{ let __tco_0 = r.tokens.clone(); - let __tco_1 = r.ctx.clone(); - let __tco_2 = v2_rt::rc_list_push(acc, r.expr.clone()); - tokens = __tco_0; - ctx = __tco_1; - acc = __tco_2; - continue; - } - } - } - } +let __tco_1 = r.ctx.clone(); +let __tco_2 = v2_rt::rc_list_push(acc, r.expr.clone()); +tokens = __tco_0; +ctx = __tco_1; +acc = __tco_2; +continue; +} +} +} +} } pub fn looks_like_arm_start(tokens: &Rc>>) -> bool { { let tok = tokens.clone().first().cloned(); - let sh = match tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, - }; - match sh { - Some(TokenShape::ShIdent) => { - let n = tok.clone().unwrap().text.clone(); - if (n.clone().as_str() == "_".to_string().as_str()) { - peek_is_fat_arrow_at(tokens.clone(), 1) - } else { - if is_uppercase_start(n.clone()) { - if peek_is_fat_arrow_at(tokens.clone(), 1) { - true +let sh = match tok.clone() { + Some(t) => Some(t.shape.clone()), + None => None, +}; +match sh { + Some(TokenShape::ShIdent) => { + let n = tok.clone().unwrap().text.clone(); +if (n.clone().as_str() == "_".to_string().as_str()) { + peek_is_fat_arrow_at(tokens.clone(), 1) + } else { + if is_uppercase_start(n.clone()) { + if peek_is_fat_arrow_at(tokens.clone(), 1) { + true + } else { + if peek_is_expected_at(tokens.clone(), 1, Rc::new(ExpectedToken::ExpectLBrace)) { + scan_for_fat_arrow_after_braces(Rc::new(tokens.clone().iter().cloned().skip(2 as usize).collect::>()), 1) } else { - if peek_is_expected_at( - tokens.clone(), - 1, - Rc::new(ExpectedToken::ExpectLBrace), - ) { - scan_for_fat_arrow_after_braces( - Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(2 as usize) - .collect::>(), - ), - 1, - ) - } else { - false - } + false } - } else { - false } + } else { + false } } - _ => false, - } - } +}, + _ => false, +} +} } pub fn peek_is_fat_arrow_at(tokens: Rc>>, offset: i64) -> bool { match tokens.get(offset as usize).cloned() { - Some(t) => is_fat_arrow_shape(t.shape.clone()), - None => false, - } + Some(t) => is_fat_arrow_shape(t.shape.clone()), + None => false, +} } -pub fn peek_is_expected_at( - tokens: Rc>>, - offset: i64, - expected: Rc, -) -> bool { +pub fn peek_is_expected_at(tokens: Rc>>, offset: i64, expected: Rc) -> bool { match tokens.get(offset as usize).cloned() { - Some(t) => token_matches_expected(&t, expected), - None => false, - } + Some(t) => token_matches_expected(&t, expected), + None => false, +} } pub fn scan_for_fat_arrow_after_braces(mut remaining: Rc>>, mut depth: i64) -> bool { loop { if (depth.clone() <= 0) { match remaining.clone().first().cloned() { - Some(t) => { - break is_fat_arrow_shape(t.shape.clone()); - } - None => { - break false; - } - } - } else { + Some(t) => { break is_fat_arrow_shape(t.shape.clone()); }, + None => { break false; }, +} +} else { match remaining.clone().first().cloned() { - Some(t) => { - if is_lbrace_shape(t.shape.clone()) { - { - let __tco_0 = Rc::new( - remaining - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ); - let __tco_1 = (depth + 1); - remaining = __tco_0; - depth = __tco_1; - continue; - } - } else { - if is_rbrace_shape(t.shape.clone()) { - { - let __tco_0 = Rc::new( - remaining - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ); - let __tco_1 = (depth - 1); - remaining = __tco_0; - depth = __tco_1; - continue; - } - } else { - { - let __tco_0 = Rc::new( - remaining - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ); - remaining = __tco_0; - continue; - } - } - } - } - None => { - break false; - } - } - } - } + Some(t) => { if is_lbrace_shape(t.shape.clone()) { + { + let __tco_0 = Rc::new(remaining.iter().cloned().skip(1 as usize).collect::>()); +let __tco_1 = (depth + 1); +remaining = __tco_0; +depth = __tco_1; +continue; +} +} else { + if is_rbrace_shape(t.shape.clone()) { + { + let __tco_0 = Rc::new(remaining.iter().cloned().skip(1 as usize).collect::>()); +let __tco_1 = (depth - 1); +remaining = __tco_0; +depth = __tco_1; +continue; +} +} else { + { + let __tco_0 = Rc::new(remaining.iter().cloned().skip(1 as usize).collect::>()); +remaining = __tco_0; +continue; +} +} +} }, + None => { break false; }, +} +} +} } pub fn parse_optional_guard(tokens: &Rc>>, ctx: Rc) -> Rc { if tok_is_keyword(tokens.clone().first().cloned(), "if".to_string()) { { - let r = parse_expr( - Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - ctx, - ); - if has_err(r.err.clone()) { + let r = parse_expr(Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), ctx); +if has_err(r.err.clone()) { return Rc::new(GuardResult { - guard: None, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - Rc::new(GuardResult { - guard: Some(r.expr.clone()), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) - } + guard: None, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +Rc::new(GuardResult { + guard: Some(r.expr.clone()), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +} } else { Rc::new(GuardResult { - guard: None, - tokens: tokens.clone(), - ctx: ctx, - err: None, - }) + guard: None, + tokens: tokens.clone(), + ctx: ctx, + err: None, +}) } } pub fn parse_pattern(tokens: &Rc>>, ctx: &Rc) -> Rc { { let tok = tokens.clone().first().cloned(); - let sh = match tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, - }; - let span = token_span(tok.clone()); - match sh { - Some(TokenShape::ShIdent) => { - let n = tok.clone().unwrap().text.clone(); - if (n.clone().as_str() == "_".to_string().as_str()) { - Rc::new(PatternResult { - pattern: Rc::new(MatchPattern::Wildcard), - tokens: Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - ctx: ctx.clone(), - err: None, - }) - } else { - if is_uppercase_start(n.clone()) { - parse_variant_pattern( - &Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - ctx.clone(), - n.clone(), - ) - } else { - Rc::new(PatternResult { - pattern: Rc::new(MatchPattern::Bind { name: n.clone() }), - tokens: Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - ctx: ctx.clone(), - err: None, - }) - } - } - } - Some(TokenShape::ShKeyword) => { - let kw_text = tok.clone().unwrap().text.clone(); - let lit_val = v2_rt::lookup(&dag_syntax_spec().keyword_literals.clone(), kw_text); - match lit_val { - Some(lv) => Rc::new(PatternResult { - pattern: Rc::new(MatchPattern::LitPattern { value: lv.clone() }), - tokens: Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - ctx: ctx.clone(), - err: None, - }), - None => Rc::new(PatternResult { - pattern: Rc::new(MatchPattern::Wildcard), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }), - } - } - Some(TokenShape::ShLitInt) => { - let n_opt = v2_rt::parse_int(tok.clone().unwrap().text.clone()); - let n = match n_opt { - Some(v) => v.clone(), - None => { - return Rc::new(PatternResult { - pattern: Rc::new(MatchPattern::Wildcard), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: Some(parse_error( - v2_rt::concat( - v2_rt::concat( - "internal: ShLitInt token text not parseable as int: '" - .to_string(), - tok.clone().unwrap().text.clone(), - ), - "'".to_string(), - ), - span, - )), - }) - } - }; - Rc::new(PatternResult { - pattern: Rc::new(MatchPattern::LitPattern { - value: Rc::new(LiteralValue::LitInt { value: n.clone() }), - }), - tokens: Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - ctx: ctx.clone(), - err: None, - }) - } - Some(TokenShape::ShLitStr) => { - let s = tok.clone().unwrap().text.clone(); +let sh = match tok.clone() { + Some(t) => Some(t.shape.clone()), + None => None, +}; +let span = token_span(tok.clone()); +match sh { + Some(TokenShape::ShIdent) => { + let n = tok.clone().unwrap().text.clone(); +if (n.clone().as_str() == "_".to_string().as_str()) { Rc::new(PatternResult { - pattern: Rc::new(MatchPattern::LitPattern { - value: Rc::new(LiteralValue::LitStr { value: s }), - }), - tokens: Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - ctx: ctx.clone(), - err: None, - }) - } - _ => Rc::new(PatternResult { - pattern: Rc::new(MatchPattern::Wildcard), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }), - } - } + pattern: Rc::new(MatchPattern::Wildcard), + tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), + ctx: ctx.clone(), + err: None, +}) + } else { + if is_uppercase_start(n.clone()) { + parse_variant_pattern(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), ctx.clone(), n.clone()) + } else { + Rc::new(PatternResult { + pattern: Rc::new(MatchPattern::Bind { + name: n.clone(), +}), + tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), + ctx: ctx.clone(), + err: None, +}) + } + } +}, + Some(TokenShape::ShKeyword) => { + let kw_text = tok.clone().unwrap().text.clone(); +let lit_val = v2_rt::lookup(&dag_syntax_spec().keyword_literals.clone(), kw_text); +match lit_val { + Some(lv) => Rc::new(PatternResult { + pattern: Rc::new(MatchPattern::LitPattern { + value: lv.clone(), +}), + tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), + ctx: ctx.clone(), + err: None, +}), + None => Rc::new(PatternResult { + pattern: Rc::new(MatchPattern::Wildcard), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}), +} +}, + Some(TokenShape::ShLitInt) => { + let n_opt = v2_rt::parse_int(tok.clone().unwrap().text.clone()); +let n = match n_opt { + Some(v) => v.clone(), + None => return Rc::new(PatternResult { + pattern: Rc::new(MatchPattern::Wildcard), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: Some(parse_error(v2_rt::concat(v2_rt::concat("internal: ShLitInt token text not parseable as int: '".to_string(), tok.clone().unwrap().text.clone()), "'".to_string()), span)), +}), +}; +Rc::new(PatternResult { + pattern: Rc::new(MatchPattern::LitPattern { + value: Rc::new(LiteralValue::LitInt { + value: n.clone(), +}), +}), + tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), + ctx: ctx.clone(), + err: None, +}) +}, + Some(TokenShape::ShLitStr) => { + let s = tok.clone().unwrap().text.clone(); +Rc::new(PatternResult { + pattern: Rc::new(MatchPattern::LitPattern { + value: Rc::new(LiteralValue::LitStr { + value: s, +}), +}), + tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), + ctx: ctx.clone(), + err: None, +}) +}, + _ => Rc::new(PatternResult { + pattern: Rc::new(MatchPattern::Wildcard), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}), +} +} } -pub fn parse_variant_pattern( - tokens: &Rc>>, - ctx: Rc, - name: String, -) -> Rc { +pub fn parse_variant_pattern(tokens: &Rc>>, ctx: Rc, name: String) -> Rc { { let span = token_span(tokens.clone().first().cloned()); - if tok_is_lbrace(tokens.clone().first().cloned()) { +if tok_is_lbrace(tokens.clone().first().cloned()) { { - let r = parse_variant_bindings_brace( - skip_newlines(Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - )), - ctx, - ); - if has_err(r.err.clone()) { + let r = parse_variant_bindings_brace(skip_newlines(Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>())), ctx); +if has_err(r.err.clone()) { return Rc::new(PatternResult { - pattern: Rc::new(MatchPattern::Wildcard), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let r2 = expect( - &skip_newlines(r.tokens.clone()), - &Rc::new(ExpectedToken::ExpectRBrace), - ); - if has_err(r2.err.clone()) { + pattern: Rc::new(MatchPattern::Wildcard), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let r2 = expect(&skip_newlines(r.tokens.clone()), &Rc::new(ExpectedToken::ExpectRBrace)); +if has_err(r2.err.clone()) { return Rc::new(PatternResult { - pattern: Rc::new(MatchPattern::Wildcard), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), - }); - } - Rc::new(PatternResult { - pattern: Rc::new(MatchPattern::VariantPattern { - name: name, - parent_enum: None, - field_bindings: r.field_bindings.clone(), - }), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) - } + pattern: Rc::new(MatchPattern::Wildcard), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), +}) + } +Rc::new(PatternResult { + pattern: Rc::new(MatchPattern::VariantPattern { + name: name, + parent_enum: None, + field_bindings: r.field_bindings.clone(), +}), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +} } else { if tok_is_lparen(tokens.clone().first().cloned()) { { - let r = parse_pattern( - &Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - &ctx, - ); - if has_err(r.err.clone()) { + let r = parse_pattern(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), &ctx); +if has_err(r.err.clone()) { return Rc::new(PatternResult { - pattern: Rc::new(MatchPattern::Wildcard), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); + pattern: Rc::new(MatchPattern::Wildcard), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) } - let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectRParen)); - if has_err(r2.err.clone()) { +let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectRParen)); +if has_err(r2.err.clone()) { return Rc::new(PatternResult { - pattern: Rc::new(MatchPattern::Wildcard), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), - }); + pattern: Rc::new(MatchPattern::Wildcard), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), +}) } - let fb = make_field_binding_node( - &"0".to_string(), - r.pattern.clone(), - span.clone(), - span.clone(), - ); - Rc::new(PatternResult { - pattern: Rc::new(MatchPattern::VariantPattern { - name: name, - parent_enum: None, - field_bindings: Rc::new(vec![fb]), - }), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) - } +let fb = make_field_binding_node(&"0".to_string(), r.pattern.clone(), span.clone(), span.clone()); +Rc::new(PatternResult { + pattern: Rc::new(MatchPattern::VariantPattern { + name: name, + parent_enum: None, + field_bindings: Rc::new(vec![fb]), +}), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +} } else { Rc::new(PatternResult { - pattern: Rc::new(MatchPattern::VariantPattern { - name: name, - parent_enum: None, - field_bindings: Rc::new(vec![]), - }), - tokens: tokens.clone(), - ctx: ctx, - err: None, - }) + pattern: Rc::new(MatchPattern::VariantPattern { + name: name, + parent_enum: None, + field_bindings: Rc::new(vec![]), +}), + tokens: tokens.clone(), + ctx: ctx, + err: None, +}) } } - } +} } -pub fn parse_variant_bindings_brace( - tokens: Rc>>, - ctx: Rc, -) -> Rc { +pub fn parse_variant_bindings_brace(tokens: Rc>>, ctx: Rc) -> Rc { parse_variant_bindings_brace_acc(tokens, ctx, Rc::new(vec![])) } -pub fn parse_variant_bindings_brace_acc( - mut tokens: Rc>>, - mut ctx: Rc, - mut acc: Rc>>, -) -> Rc { +pub fn parse_variant_bindings_brace_acc(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { loop { tokens = skip_newlines(tokens.clone()); - if (tok_is_rbrace(tokens.clone().first().cloned()) - || tok_is_eof(tokens.clone().first().cloned())) - { +if (tok_is_rbrace(tokens.clone().first().cloned()) || tok_is_eof(tokens.clone().first().cloned())) { break Rc::new(BindingsResult { - field_bindings: acc, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }); - } else { + field_bindings: acc, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}); +} else { let bind_span = token_span(tokens.clone().first().cloned()); - let r = expect_name(&tokens); - if has_err(r.err.clone()) { +let r = expect_name(&tokens); +if has_err(r.err.clone()) { return Rc::new(BindingsResult { - field_bindings: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let field_name = r.name.clone(); - let field_name_span = r.span.clone(); - tokens = r.tokens.clone(); - match (*eat(&tokens, Rc::new(ExpectedToken::ExpectColon))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let r2 = parse_pattern(&__ec, &ctx); - if has_err(r2.err.clone()) { - return Rc::new(BindingsResult { - field_bindings: Rc::new(vec![]), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), - }); - } - let e2 = eat(&r2.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); - tokens = skip_newlines(match (*e2).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), - EatResult::EatUnchanged { .. } => r2.tokens.clone(), - }); - let fb = make_field_binding_node( - &field_name, - r2.pattern.clone(), - bind_span, - field_name_span, - ); - { - let __tco_0 = r2.ctx.clone(); - let __tco_1 = v2_rt::rc_list_push(acc, fb); - ctx = __tco_0; - acc = __tco_1; - continue; - } - } - EatResult::EatUnchanged { tokens: __eu, .. } => { - let e2 = eat(&tokens, Rc::new(ExpectedToken::ExpectComma)); - tokens = skip_newlines(match (*e2).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), - EatResult::EatUnchanged { .. } => tokens.clone(), - }); - let fb = make_field_binding_node( - &field_name, - Rc::new(MatchPattern::Bind { - name: field_name.clone(), - }), - bind_span, - field_name_span, - ); - { - let __tco_0 = v2_rt::rc_list_push(acc, fb); - acc = __tco_0; - continue; - } - } - } - } - } + field_bindings: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let field_name = r.name.clone(); +let field_name_span = r.span.clone(); +tokens = r.tokens.clone(); +match (*eat(&tokens, Rc::new(ExpectedToken::ExpectColon))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { let r2 = parse_pattern(&__ec, &ctx); +if has_err(r2.err.clone()) { + return Rc::new(BindingsResult { + field_bindings: Rc::new(vec![]), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), +}) + } +let e2 = eat(&r2.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); +tokens = skip_newlines(match (*e2).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), + EatResult::EatUnchanged { .. } => r2.tokens.clone(), +}); +let fb = make_field_binding_node(&field_name, r2.pattern.clone(), bind_span, field_name_span); +{ + let __tco_0 = r2.ctx.clone(); +let __tco_1 = v2_rt::rc_list_push(acc, fb); +ctx = __tco_0; +acc = __tco_1; +continue; +} }, + EatResult::EatUnchanged { tokens: __eu, .. } => { let e2 = eat(&tokens, Rc::new(ExpectedToken::ExpectComma)); +tokens = skip_newlines(match (*e2).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), + EatResult::EatUnchanged { .. } => tokens.clone(), +}); +let fb = make_field_binding_node(&field_name, Rc::new(MatchPattern::Bind { + name: field_name.clone(), +}), bind_span, field_name_span); +{ + let __tco_0 = v2_rt::rc_list_push(acc, fb); +acc = __tco_0; +continue; +} }, +} +} +} } pub fn parse_if(tokens: &Rc>>, ctx: &Rc) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - let span = token_span(tokens.clone().first().cloned()); - let dummy_expr = parse_recovery_placeholder(); - let r = expect( - &tokens, - &Rc::new(ExpectedToken::ExpectKeyword { - text: "if".to_string(), - }), - ); - if has_err(r.err.clone()) { - return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let r = parse_expr_no_brace(r.tokens.clone(), ctx.clone()); - if has_err(r.err.clone()) { - return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let condition = r.expr.clone(); - let r = parse_block(&skip_newlines(r.tokens.clone()), &r.ctx.clone()); - if has_err(r.err.clone()) { - return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let then_branch = r.expr.clone(); - let tokens = skip_newlines(r.tokens.clone()); - let ctx = r.ctx.clone(); - match (*eat( - &tokens, - Rc::new(ExpectedToken::ExpectKeyword { - text: "else".to_string(), - }), - )) - .clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { + let span = token_span(tokens.clone().first().cloned()); +let dummy_expr = parse_recovery_placeholder(); +let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { + text: "if".to_string(), +})); +if has_err(r.err.clone()) { + return Rc::new(ExprResult { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let r = parse_expr_no_brace(r.tokens.clone(), ctx.clone()); +if has_err(r.err.clone()) { + return Rc::new(ExprResult { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let condition = r.expr.clone(); +let r = parse_block(&skip_newlines(r.tokens.clone()), &r.ctx.clone()); +if has_err(r.err.clone()) { + return Rc::new(ExprResult { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let then_branch = r.expr.clone(); +let tokens = skip_newlines(r.tokens.clone()); +let ctx = r.ctx.clone(); +match (*eat(&tokens, Rc::new(ExpectedToken::ExpectKeyword { + text: "else".to_string(), +}))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { let tokens = skip_newlines(__ec.clone()); - if tok_is_keyword(tokens.clone().first().cloned(), "if".to_string()) { +if tok_is_keyword(tokens.clone().first().cloned(), "if".to_string()) { { let r2 = parse_if(&tokens, &ctx); - if has_err(r2.err.clone()) { +if has_err(r2.err.clone()) { return Rc::new(ExprResult { - expr: r2.expr.clone(), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), - }); + expr: r2.expr.clone(), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), +}) } - Rc::new(ExprResult { - expr: make_expr_node( - Rc::new(ExprData::ExprIf), - Rc::new(vec![condition, then_branch, r2.expr.clone()]), - None, - span, - ), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: None, - }) - } +Rc::new(ExprResult { + expr: make_expr_node(Rc::new(ExprData::ExprIf), Rc::new(vec![condition, then_branch, r2.expr.clone()]), None, span), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: None, +}) +} } else { { let r2 = parse_block(&tokens, &ctx); - if has_err(r2.err.clone()) { +if has_err(r2.err.clone()) { return Rc::new(ExprResult { - expr: r2.expr.clone(), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), - }); + expr: r2.expr.clone(), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), +}) } - Rc::new(ExprResult { - expr: make_expr_node( - Rc::new(ExprData::ExprIf), - Rc::new(vec![condition, then_branch, r2.expr.clone()]), - None, - span, - ), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: None, - }) - } +Rc::new(ExprResult { + expr: make_expr_node(Rc::new(ExprData::ExprIf), Rc::new(vec![condition, then_branch, r2.expr.clone()]), None, span), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: None, +}) +} } - } - EatResult::EatUnchanged { tokens: __eu, .. } => Rc::new(ExprResult { - expr: make_expr_node( - Rc::new(ExprData::ExprIf), - Rc::new(vec![condition, then_branch]), - None, - span, - ), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }), - } +}, + EatResult::EatUnchanged { tokens: __eu, .. } => Rc::new(ExprResult { + expr: make_expr_node(Rc::new(ExprData::ExprIf), Rc::new(vec![condition, then_branch]), None, span), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}), +} +} }) } pub fn parse_let(tokens: &Rc>>, ctx: &Rc) -> Rc { { let span = token_span(tokens.clone().first().cloned()); - let dummy_expr = parse_recovery_placeholder(); - let r = expect( - &tokens, - &Rc::new(ExpectedToken::ExpectKeyword { - text: "let".to_string(), - }), - ); - if has_err(r.err.clone()) { +let dummy_expr = parse_recovery_placeholder(); +let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { + text: "let".to_string(), +})); +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let r = expect_name(&r.tokens.clone()); - if has_err(r.err.clone()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let r = expect_name(&r.tokens.clone()); +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let name = r.name.clone(); - let name_span = r.span.clone(); - let r = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectEq)); - if has_err(r.err.clone()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let name = r.name.clone(); +let name_span = r.span.clone(); +let r = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectEq)); +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let r = parse_expr(r.tokens.clone(), ctx.clone()); - if has_err(r.err.clone()) { - return r.clone(); - } - Rc::new(ExprResult { - expr: make_named_expr_node( - &name, - Rc::new(ExprData::ExprLet), - Rc::new(vec![r.expr.clone()]), - None, - span, - name_span, - ), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) - } + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let r = parse_expr(r.tokens.clone(), ctx.clone()); +if has_err(r.err.clone()) { + return r.clone() + } +Rc::new(ExprResult { + expr: make_named_expr_node(&name, Rc::new(ExprData::ExprLet), Rc::new(vec![r.expr.clone()]), None, span, name_span), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +} } pub fn parse_return(tokens: &Rc>>, ctx: &Rc) -> Rc { { let span = token_span(tokens.clone().first().cloned()); - let dummy_expr = parse_recovery_placeholder(); - let r = expect( - &tokens, - &Rc::new(ExpectedToken::ExpectKeyword { - text: "return".to_string(), - }), - ); - if has_err(r.err.clone()) { +let dummy_expr = parse_recovery_placeholder(); +let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { + text: "return".to_string(), +})); +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr, - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let r = parse_expr(r.tokens.clone(), ctx.clone()); - if has_err(r.err.clone()) { - return r.clone(); - } - Rc::new(ExprResult { - expr: make_expr_node( - Rc::new(ExprData::ExprReturn), - Rc::new(vec![r.expr.clone()]), - None, - span, - ), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) - } + expr: dummy_expr, + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let r = parse_expr(r.tokens.clone(), ctx.clone()); +if has_err(r.err.clone()) { + return r.clone() + } +Rc::new(ExprResult { + expr: make_expr_node(Rc::new(ExprData::ExprReturn), Rc::new(vec![r.expr.clone()]), None, span), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +} } pub fn parse_for(tokens: &Rc>>, ctx: &Rc) -> Rc { { let span = token_span(tokens.clone().first().cloned()); - let dummy_expr = parse_recovery_placeholder(); - let r = expect( - &tokens, - &Rc::new(ExpectedToken::ExpectKeyword { - text: "for".to_string(), - }), - ); - if has_err(r.err.clone()) { +let dummy_expr = parse_recovery_placeholder(); +let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { + text: "for".to_string(), +})); +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let r = expect_name(&r.tokens.clone()); - if has_err(r.err.clone()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let r = expect_name(&r.tokens.clone()); +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let var_name = r.name.clone(); - let var_name_span = r.span.clone(); - let r = expect( - &r.tokens.clone(), - &Rc::new(ExpectedToken::ExpectKeyword { - text: "in".to_string(), - }), - ); - if has_err(r.err.clone()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let var_name = r.name.clone(); +let var_name_span = r.span.clone(); +let r = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectKeyword { + text: "in".to_string(), +})); +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let r = parse_expr_no_brace(r.tokens.clone(), ctx.clone()); - if has_err(r.err.clone()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let r = parse_expr_no_brace(r.tokens.clone(), ctx.clone()); +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: r.expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let collection = r.expr.clone(); - let r = parse_block(&skip_newlines(r.tokens.clone()), &r.ctx.clone()); - if has_err(r.err.clone()) { + expr: r.expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let collection = r.expr.clone(); +let r = parse_block(&skip_newlines(r.tokens.clone()), &r.ctx.clone()); +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: r.expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let body = r.expr.clone(); - let for_expr = make_named_expr_node( - &var_name, - Rc::new(ExprData::ExprForEach), - Rc::new(vec![collection, body]), - None, - span, - var_name_span, - ); - Rc::new(ExprResult { - expr: for_expr, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) - } + expr: r.expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let body = r.expr.clone(); +let for_expr = make_named_expr_node(&var_name, Rc::new(ExprData::ExprForEach), Rc::new(vec![collection, body]), None, span, var_name_span); +Rc::new(ExprResult { + expr: for_expr, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +} } -pub fn parse_record_literal( - tokens: &Rc>>, - ctx: &Rc, - name: String, - span: &Rc, -) -> Rc { +pub fn parse_record_literal(tokens: &Rc>>, ctx: &Rc, name: String, span: &Rc) -> Rc { { let dummy_expr = parse_recovery_placeholder(); - let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectLBrace)); - if has_err(r.err.clone()) { +let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectLBrace)); +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let tokens = skip_newlines(r.tokens.clone()); - let r = parse_field_init_list(tokens.clone(), ctx.clone()); - if has_err(r.err.clone()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let tokens = skip_newlines(r.tokens.clone()); +let r = parse_field_init_list(tokens.clone(), ctx.clone()); +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let tokens = skip_newlines(r.tokens.clone()); - let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); - if has_err(r2.err.clone()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let tokens = skip_newlines(r.tokens.clone()); +let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); +if has_err(r2.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), - }); - } - Rc::new(ExprResult { - expr: make_named_expr_node( - &name, - Rc::new(ExprData::ExprRecordLit { parent_enum: None }), - r.fields.clone(), - None, - span.clone(), - span.clone(), - ), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) - } + expr: dummy_expr.clone(), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), +}) + } +Rc::new(ExprResult { + expr: make_named_expr_node(&name, Rc::new(ExprData::ExprRecordLit { + parent_enum: None, +}), r.fields.clone(), None, span.clone(), span.clone()), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +} } -pub fn parse_field_init_list( - tokens: Rc>>, - ctx: Rc, -) -> Rc { +pub fn parse_field_init_list(tokens: Rc>>, ctx: Rc) -> Rc { parse_field_init_list_acc(tokens, ctx, Rc::new(vec![])) } -pub fn parse_field_init_list_acc( - mut tokens: Rc>>, - mut ctx: Rc, - mut acc: Rc>>, -) -> Rc { +pub fn parse_field_init_list_acc(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { loop { tokens = skip_newlines(tokens.clone()); - if (tok_is_rbrace(tokens.clone().first().cloned()) - || tok_is_eof(tokens.clone().first().cloned())) - { +if (tok_is_rbrace(tokens.clone().first().cloned()) || tok_is_eof(tokens.clone().first().cloned())) { break Rc::new(FieldInitsResult { - fields: acc, - tokens: tokens.clone(), - ctx: ctx, - err: None, - }); - } else { + fields: acc, + tokens: tokens.clone(), + ctx: ctx, + err: None, +}); +} else { let r = parse_field_init(&tokens, &ctx); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(FieldInitsResult { - fields: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let e = eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); - tokens = skip_newlines(match (*e).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), - EatResult::EatUnchanged { .. } => r.tokens.clone(), - }); - { + fields: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let e = eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); +tokens = skip_newlines(match (*e).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), + EatResult::EatUnchanged { .. } => r.tokens.clone(), +}); +{ let __tco_0 = r.ctx.clone(); - let __tco_1 = v2_rt::rc_list_push(acc, r.field.clone()); - ctx = __tco_0; - acc = __tco_1; - continue; - } - } - } +let __tco_1 = v2_rt::rc_list_push(acc, r.field.clone()); +ctx = __tco_0; +acc = __tco_1; +continue; +} +} +} } -pub fn parse_field_init( - tokens: &Rc>>, - ctx: &Rc, -) -> Rc { +pub fn parse_field_init(tokens: &Rc>>, ctx: &Rc) -> Rc { { let zero_span = make_span(0, 0); - let span = token_span(tokens.clone().first().cloned()); - let dummy_fi = make_field_init_node( - &"".to_string(), - parse_recovery_placeholder(), - zero_span.clone(), - zero_span.clone(), - ); - let tok = tokens.clone().first().cloned(); - if (tok_is_ident(tok.clone()) || tok_is_keyword_name(tok.clone())) { +let span = token_span(tokens.clone().first().cloned()); +let dummy_fi = make_field_init_node(&"".to_string(), parse_recovery_placeholder(), zero_span.clone(), zero_span.clone()); +let tok = tokens.clone().first().cloned(); +if (tok_is_ident(tok.clone()) || tok_is_keyword_name(tok.clone())) { { let name_r = expect_name(&tokens); - if has_err(name_r.err.clone()) { +if has_err(name_r.err.clone()) { return Rc::new(FieldInitResult { - field: dummy_fi.clone(), - tokens: name_r.tokens.clone(), - ctx: ctx.clone(), - err: name_r.err.clone(), - }); + field: dummy_fi.clone(), + tokens: name_r.tokens.clone(), + ctx: ctx.clone(), + err: name_r.err.clone(), +}) } - let n = name_r.name.clone(); - if tok_is_colon(name_r.tokens.clone().first().cloned()) { +let n = name_r.name.clone(); +if tok_is_colon(name_r.tokens.clone().first().cloned()) { { - let r = parse_expr( - Rc::new( - name_r - .tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - ctx.clone(), - ); - if has_err(r.err.clone()) { + let r = parse_expr(Rc::new(name_r.tokens.clone().iter().cloned().skip(1 as usize).collect::>()), ctx.clone()); +if has_err(r.err.clone()) { return Rc::new(FieldInitResult { - field: dummy_fi.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); + field: dummy_fi.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) } - let fi = make_field_init_node( - &n, - r.expr.clone(), - span.clone(), - name_r.span.clone(), - ); - Rc::new(FieldInitResult { - field: fi, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) - } +let fi = make_field_init_node(&n, r.expr.clone(), span.clone(), name_r.span.clone()); +Rc::new(FieldInitResult { + field: fi, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +} } else { { - let fi = make_field_init_node( - &n, - make_named_expr_node( - &n, - Rc::new(ExprData::ExprVar { binding_kind: None }), - Rc::new(vec![]), - None, - span.clone(), - name_r.span.clone(), - ), - span.clone(), - name_r.span.clone(), - ); - Rc::new(FieldInitResult { - field: fi, - tokens: name_r.tokens.clone(), - ctx: ctx.clone(), - err: None, - }) - } + let fi = make_field_init_node(&n, make_named_expr_node(&n, Rc::new(ExprData::ExprVar { + binding_kind: None, +}), Rc::new(vec![]), None, span.clone(), name_r.span.clone()), span.clone(), name_r.span.clone()); +Rc::new(FieldInitResult { + field: fi, + tokens: name_r.tokens.clone(), + ctx: ctx.clone(), + err: None, +}) +} } - } +} } else { if (tok_is_lit_str(tok.clone()) && peek_is_colon_after_ident(tokens.clone())) { { let str_name = match tok.clone() { - Some(t) => t.text.clone(), - None => "_".to_string(), - }; - let r = parse_expr( - Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(2 as usize) - .collect::>(), - ), - ctx.clone(), - ); - if has_err(r.err.clone()) { + Some(t) => t.text.clone(), + None => "_".to_string(), +}; +let r = parse_expr(Rc::new(tokens.clone().iter().cloned().skip(2 as usize).collect::>()), ctx.clone()); +if has_err(r.err.clone()) { return Rc::new(FieldInitResult { - field: dummy_fi.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); + field: dummy_fi.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) } - let fi = - make_field_init_node(&str_name, r.expr.clone(), span.clone(), no_span()); - Rc::new(FieldInitResult { - field: fi, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) - } +let fi = make_field_init_node(&str_name, r.expr.clone(), span.clone(), no_span()); +Rc::new(FieldInitResult { + field: fi, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +} } else { { let r = parse_expr(tokens.clone(), ctx.clone()); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(FieldInitResult { - field: dummy_fi.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); + field: dummy_fi.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) } - let fi = make_field_init_node( - &"_".to_string(), - r.expr.clone(), - span.clone(), - no_span(), - ); - Rc::new(FieldInitResult { - field: fi, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) - } +let fi = make_field_init_node(&"_".to_string(), r.expr.clone(), span.clone(), no_span()); +Rc::new(FieldInitResult { + field: fi, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +} } } - } +} } pub fn parse_list_literal(tokens: &Rc>>, ctx: &Rc) -> Rc { { let span = token_span(tokens.clone().first().cloned()); - let dummy_expr = parse_recovery_placeholder(); - let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectLBracket)); - if has_err(r.err.clone()) { +let dummy_expr = parse_recovery_placeholder(); +let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectLBracket)); +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); - } - let r = parse_expr_list_until( - skip_newlines(r.tokens.clone()), - ctx.clone(), - Rc::new(ExpectedToken::ExpectRBracket), - ); - if has_err(r.err.clone()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) + } +let r = parse_expr_list_until(skip_newlines(r.tokens.clone()), ctx.clone(), Rc::new(ExpectedToken::ExpectRBracket)); +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let r2 = expect( - &skip_newlines(r.tokens.clone()), - &Rc::new(ExpectedToken::ExpectRBracket), - ); - if has_err(r2.err.clone()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let r2 = expect(&skip_newlines(r.tokens.clone()), &Rc::new(ExpectedToken::ExpectRBracket)); +if has_err(r2.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), - }); - } - Rc::new(ExprResult { - expr: make_expr_node(Rc::new(ExprData::ExprListLit), r.exprs.clone(), None, span), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) - } + expr: dummy_expr.clone(), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), +}) + } +Rc::new(ExprResult { + expr: make_expr_node(Rc::new(ExprData::ExprListLit), r.exprs.clone(), None, span), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +} } -pub fn parse_expr_list_until( - tokens: Rc>>, - ctx: Rc, - end_expected: Rc, -) -> Rc { +pub fn parse_expr_list_until(tokens: Rc>>, ctx: Rc, end_expected: Rc) -> Rc { parse_expr_list_until_acc(tokens, ctx, end_expected, Rc::new(vec![])) } -pub fn parse_expr_list_until_acc( - mut tokens: Rc>>, - mut ctx: Rc, - mut end_expected: Rc, - mut acc: Rc>>, -) -> Rc { +pub fn parse_expr_list_until_acc(mut tokens: Rc>>, mut ctx: Rc, mut end_expected: Rc, mut acc: Rc>>) -> Rc { loop { tokens = skip_newlines(tokens.clone()); - let at_end_tag = match tokens.clone().first().cloned() { - Some(t) => token_matches_expected(&t, end_expected.clone()), - None => false, - }; - if (at_end_tag || tok_is_eof(tokens.clone().first().cloned())) { +let at_end_tag = match tokens.clone().first().cloned() { + Some(t) => token_matches_expected(&t, end_expected.clone()), + None => false, +}; +if (at_end_tag || tok_is_eof(tokens.clone().first().cloned())) { break Rc::new(ExprsResult { - exprs: acc, - tokens: tokens.clone(), - ctx: ctx, - err: None, - }); - } else { + exprs: acc, + tokens: tokens.clone(), + ctx: ctx, + err: None, +}); +} else { let r = parse_expr(tokens.clone(), ctx); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(ExprsResult { - exprs: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let e = eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); - tokens = skip_newlines(match (*e).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), - EatResult::EatUnchanged { .. } => r.tokens.clone(), - }); - { + exprs: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let e = eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); +tokens = skip_newlines(match (*e).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), + EatResult::EatUnchanged { .. } => r.tokens.clone(), +}); +{ let __tco_0 = r.ctx.clone(); - let __tco_1 = v2_rt::rc_list_push(acc, r.expr.clone()); - ctx = __tco_0; - acc = __tco_1; - continue; - } - } - } +let __tco_1 = v2_rt::rc_list_push(acc, r.expr.clone()); +ctx = __tco_0; +acc = __tco_1; +continue; +} +} +} } pub fn parse_paren_expr(tokens: &Rc>>, ctx: &Rc) -> Rc { { let span = token_span(tokens.clone().first().cloned()); - let dummy_expr = parse_recovery_placeholder(); - let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectLParen)); - if has_err(r.err.clone()) { +let dummy_expr = parse_recovery_placeholder(); +let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectLParen)); +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), - }); + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), +}) } - let tokens = skip_newlines(r.tokens.clone()); - if tok_is_rparen(tokens.clone().first().cloned()) { +let tokens = skip_newlines(r.tokens.clone()); +if tok_is_rparen(tokens.clone().first().cloned()) { Rc::new(ExprResult { - expr: make_expr_node( - Rc::new(ExprData::ExprRecordLit { parent_enum: None }), - Rc::new(vec![]), - None, - span, - ), - tokens: Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - ctx: ctx.clone(), - err: None, - }) + expr: make_expr_node(Rc::new(ExprData::ExprRecordLit { + parent_enum: None, +}), Rc::new(vec![]), None, span), + tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), + ctx: ctx.clone(), + err: None, +}) } else { { let lambda_r = try_lambda_params(&tokens, &ctx); - if lambda_r.is_lambda.clone() { +if lambda_r.is_lambda.clone() { { let r = parse_lambda_body(&lambda_r.tokens.clone(), lambda_r.ctx.clone()); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: r.expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); + expr: r.expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) } - Rc::new(ExprResult { - expr: make_expr_node( - Rc::new(ExprData::ExprLambda), - v2_rt::concat( - Rc::new(vec![r.expr.clone()]), - Rc::new({ - let mut __result = Vec::new(); - for p in lambda_r.params.clone().iter().cloned() { - __result.push(parsed_name_leaf( - p.name.clone(), - p.span.clone(), - )); - } - __result - }), - ), - None, - span, - ), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) - } +Rc::new(ExprResult { + expr: make_expr_node(Rc::new(ExprData::ExprLambda), v2_rt::concat(Rc::new(vec![r.expr.clone()]), Rc::new({ let mut __result = Vec::new(); for p in lambda_r.params.clone().iter().cloned() { __result.push(parsed_name_leaf(p.name.clone(), p.span.clone())); } __result })), None, span), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +} } else { { let r = parse_expr(lambda_r.tokens.clone(), lambda_r.ctx.clone()); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: r.expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); + expr: r.expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) } - let tokens = skip_newlines(r.tokens.clone()); - let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRParen)); - if has_err(r2.err.clone()) { +let tokens = skip_newlines(r.tokens.clone()); +let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRParen)); +if has_err(r2.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), - }); + expr: dummy_expr.clone(), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), +}) } - Rc::new(ExprResult { - expr: r.expr.clone(), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) - } +Rc::new(ExprResult { + expr: r.expr.clone(), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +} } - } +} } - } +} } pub fn parse_fn_lambda(tokens: &Rc>>, ctx: &Rc) -> Rc { { let span = token_span(tokens.clone().first().cloned()); - let dummy = parse_recovery_placeholder(); - let r1 = expect( - &tokens, - &Rc::new(ExpectedToken::ExpectKeyword { - text: "fn".to_string(), - }), - ); - if has_err(r1.err.clone()) { +let dummy = parse_recovery_placeholder(); +let r1 = expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { + text: "fn".to_string(), +})); +if has_err(r1.err.clone()) { return Rc::new(ExprResult { - expr: dummy.clone(), - tokens: r1.tokens.clone(), - ctx: ctx.clone(), - err: r1.err.clone(), - }); - } - let r2 = expect(&r1.tokens.clone(), &Rc::new(ExpectedToken::ExpectLParen)); - if has_err(r2.err.clone()) { + expr: dummy.clone(), + tokens: r1.tokens.clone(), + ctx: ctx.clone(), + err: r1.err.clone(), +}) + } +let r2 = expect(&r1.tokens.clone(), &Rc::new(ExpectedToken::ExpectLParen)); +if has_err(r2.err.clone()) { return Rc::new(ExprResult { - expr: dummy.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), - }); - } - let params_r = collect_fn_lambda_params(r2.tokens.clone(), ctx.clone(), Rc::new(vec![])); - let r3 = expect( - ¶ms_r.tokens.clone(), - &Rc::new(ExpectedToken::ExpectRParen), - ); - if has_err(r3.err.clone()) { + expr: dummy.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), +}) + } +let params_r = collect_fn_lambda_params(r2.tokens.clone(), ctx.clone(), Rc::new(vec![])); +let r3 = expect(¶ms_r.tokens.clone(), &Rc::new(ExpectedToken::ExpectRParen)); +if has_err(r3.err.clone()) { return Rc::new(ExprResult { - expr: dummy.clone(), - tokens: r3.tokens.clone(), - ctx: params_r.ctx.clone(), - err: r3.err.clone(), - }); - } - let tokens = skip_newlines(r3.tokens.clone()); - let body_r = parse_brace_expr(&tokens, params_r.ctx.clone()); - if has_err(body_r.err.clone()) { - return body_r.clone(); - } - Rc::new(ExprResult { - expr: make_expr_node( - Rc::new(ExprData::ExprLambda), - v2_rt::concat( - Rc::new(vec![body_r.expr.clone()]), - Rc::new({ - let mut __result = Vec::new(); - for p in params_r.params.clone().iter().cloned() { - __result.push(parsed_name_leaf(p.name.clone(), p.span.clone())); - } - __result - }), - ), - None, - span, - ), - tokens: body_r.tokens.clone(), - ctx: body_r.ctx.clone(), - err: None, - }) - } + expr: dummy.clone(), + tokens: r3.tokens.clone(), + ctx: params_r.ctx.clone(), + err: r3.err.clone(), +}) + } +let tokens = skip_newlines(r3.tokens.clone()); +let body_r = parse_brace_expr(&tokens, params_r.ctx.clone()); +if has_err(body_r.err.clone()) { + return body_r.clone() + } +Rc::new(ExprResult { + expr: make_expr_node(Rc::new(ExprData::ExprLambda), v2_rt::concat(Rc::new(vec![body_r.expr.clone()]), Rc::new({ let mut __result = Vec::new(); for p in params_r.params.clone().iter().cloned() { __result.push(parsed_name_leaf(p.name.clone(), p.span.clone())); } __result })), None, span), + tokens: body_r.tokens.clone(), + ctx: body_r.ctx.clone(), + err: None, +}) +} } -pub fn collect_fn_lambda_params( - mut tokens: Rc>>, - mut ctx: Rc, - mut acc: Rc>>, -) -> Rc { +pub fn collect_fn_lambda_params(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { loop { tokens = skip_newlines(tokens.clone()); - if tok_is_rparen(tokens.clone().first().cloned()) { +if tok_is_rparen(tokens.clone().first().cloned()) { break Rc::new(IdentCollectResult { - success: true, - params: acc, - tokens: tokens.clone(), - ctx: ctx, - err: None, - }); - } else { + success: true, + params: acc, + tokens: tokens.clone(), + ctx: ctx, + err: None, +}); +} else { let name_r = expect_ident(&tokens); - if has_err(name_r.err.clone()) { +if has_err(name_r.err.clone()) { break Rc::new(IdentCollectResult { - success: false, - params: acc, - tokens: name_r.tokens.clone(), - ctx: ctx, - err: name_r.err.clone(), - }); - } else { + success: false, + params: acc, + tokens: name_r.tokens.clone(), + ctx: ctx, + err: name_r.err.clone(), +}); +} else { tokens = skip_newlines(name_r.tokens.clone()); - if tok_is_comma(tokens.clone().first().cloned()) { +if tok_is_comma(tokens.clone().first().cloned()) { { - let __tco_0 = - Rc::new(tokens.iter().cloned().skip(1 as usize).collect::>()); - let __tco_1 = v2_rt::rc_list_push( - acc, - Rc::new(ParserParam { - name: name_r.name.clone(), - span: name_r.span.clone(), - }), - ); - tokens = __tco_0; - acc = __tco_1; - continue; - } - } else { + let __tco_0 = Rc::new(tokens.iter().cloned().skip(1 as usize).collect::>()); +let __tco_1 = v2_rt::rc_list_push(acc, Rc::new(ParserParam { + name: name_r.name.clone(), + span: name_r.span.clone(), +})); +tokens = __tco_0; +acc = __tco_1; +continue; +} +} else { break Rc::new(IdentCollectResult { - success: true, - params: v2_rt::rc_list_push( - acc, - Rc::new(ParserParam { - name: name_r.name.clone(), - span: name_r.span.clone(), - }), - ), - tokens: tokens.clone(), - ctx: ctx, - err: None, - }); - } - } - } - } + success: true, + params: v2_rt::rc_list_push(acc, Rc::new(ParserParam { + name: name_r.name.clone(), + span: name_r.span.clone(), +})), + tokens: tokens.clone(), + ctx: ctx, + err: None, +}); +} +} +} +} } -pub fn try_lambda_params( - tokens: &Rc>>, - ctx: &Rc, -) -> Rc { +pub fn try_lambda_params(tokens: &Rc>>, ctx: &Rc) -> Rc { { let r = collect_lambda_idents(tokens.clone(), ctx.clone(), Rc::new(vec![])); - if (r.success.clone() && ((r.params.clone().len() as i64) >= 2)) { +if (r.success.clone() && ((r.params.clone().len() as i64) >= 2)) { if tok_is_rparen(r.tokens.clone().first().cloned()) { { - let after_rparen = Rc::new( - r.tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ); - if tok_is_fat_arrow(after_rparen.clone().first().cloned()) { + let after_rparen = Rc::new(r.tokens.clone().iter().cloned().skip(1 as usize).collect::>()); +if tok_is_fat_arrow(after_rparen.clone().first().cloned()) { Rc::new(LambdaCheckResult { - is_lambda: true, - params: r.params.clone(), - tokens: Rc::new( - after_rparen - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - ctx: r.ctx.clone(), - err: None, - }) + is_lambda: true, + params: r.params.clone(), + tokens: Rc::new(after_rparen.clone().iter().cloned().skip(1 as usize).collect::>()), + ctx: r.ctx.clone(), + err: None, +}) } else { Rc::new(LambdaCheckResult { - is_lambda: false, - params: Rc::new(vec![]), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }) + is_lambda: false, + params: Rc::new(vec![]), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}) } - } +} } else { Rc::new(LambdaCheckResult { - is_lambda: false, - params: Rc::new(vec![]), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }) + is_lambda: false, + params: Rc::new(vec![]), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}) } } else { Rc::new(LambdaCheckResult { - is_lambda: false, - params: Rc::new(vec![]), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }) + is_lambda: false, + params: Rc::new(vec![]), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}) } - } +} } -pub fn collect_lambda_idents( - mut tokens: Rc>>, - mut ctx: Rc, - mut acc: Rc>>, -) -> Rc { +pub fn collect_lambda_idents(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { loop { if tok_is_ident(tokens.clone().first().cloned()) { let tok = tokens.clone().first().cloned(); - let param = Rc::new(ParserParam { - name: tok.clone().unwrap().text.clone(), - span: tok.clone().unwrap().span.clone(), - }); - let new_acc = v2_rt::rc_list_push(acc, param); - match (*eat( - &Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - Rc::new(ExpectedToken::ExpectComma), - )) - .clone() - { - EatResult::EatConsumed { tokens: __ec, .. } => { - let __tco_0 = __ec.clone(); - let __tco_1 = new_acc; - tokens = __tco_0; - acc = __tco_1; - continue; - } - EatResult::EatUnchanged { tokens: __eu, .. } => { - break Rc::new(IdentCollectResult { - success: true, - params: new_acc, - tokens: Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - ctx: ctx, - err: None, - }); - } - } - } else { +let param = Rc::new(ParserParam { + name: tok.clone().unwrap().text.clone(), + span: tok.clone().unwrap().span.clone(), +}); +let new_acc = v2_rt::rc_list_push(acc, param); +match (*eat(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), Rc::new(ExpectedToken::ExpectComma))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { { + let __tco_0 = __ec.clone(); +let __tco_1 = new_acc; +tokens = __tco_0; +acc = __tco_1; +continue; +} }, + EatResult::EatUnchanged { tokens: __eu, .. } => { break Rc::new(IdentCollectResult { + success: true, + params: new_acc, + tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), + ctx: ctx, + err: None, +}); }, +} +} else { break Rc::new(IdentCollectResult { - success: false, - params: acc, - tokens: tokens.clone(), - ctx: ctx, - err: None, - }); - } - } + success: false, + params: acc, + tokens: tokens.clone(), + ctx: ctx, + err: None, +}); +} +} } pub fn parse_string_interp(tokens: &Rc>>, ctx: Rc) -> Rc { { let tok = tokens.clone().first().cloned(); - let span = token_span(tok.clone()); - let sh = match tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, - }; - match sh { - Some(TokenShape::ShStrBegin) => { - let prefix = tok.clone().unwrap().text.clone(); - let parts_init = if (v2_rt::string_length(&prefix) > 0) { - Rc::new(vec![Rc::new(StringPart::Text { - value: prefix.clone(), - })]) - } else { - Rc::new(vec![]) - }; - parse_interp_parts( - Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - ctx, - parts_init, - span.clone(), - ) - } - _ => Rc::new(ExprResult { - expr: parse_recovery_expr( - span.clone(), - "expected string interpolation".to_string(), - ), - tokens: tokens.clone(), - ctx: ctx, - err: Some(parse_error( - "expected string interpolation".to_string(), - span.clone(), - )), - }), - } - } +let span = token_span(tok.clone()); +let sh = match tok.clone() { + Some(t) => Some(t.shape.clone()), + None => None, +}; +match sh { + Some(TokenShape::ShStrBegin) => { + let prefix = tok.clone().unwrap().text.clone(); +let parts_init = if (v2_rt::string_length(&prefix) > 0) { + Rc::new(vec![Rc::new(StringPart::Text { + value: prefix.clone(), +})]) + } else { + Rc::new(vec![]) + }; +parse_interp_parts(Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), ctx, parts_init, span.clone()) +}, + _ => Rc::new(ExprResult { + expr: parse_recovery_expr(span.clone(), "expected string interpolation".to_string()), + tokens: tokens.clone(), + ctx: ctx, + err: Some(parse_error("expected string interpolation".to_string(), span.clone())), +}), +} +} } -pub fn parse_interp_parts( - mut tokens: Rc>>, - mut ctx: Rc, - mut parts: Rc>>, - mut span: Rc, -) -> Rc { +pub fn parse_interp_parts(mut tokens: Rc>>, mut ctx: Rc, mut parts: Rc>>, mut span: Rc) -> Rc { loop { let r = parse_expr(tokens.clone(), ctx.clone()); - if has_err(r.err.clone()) { - return r.clone(); - } - let new_parts = v2_rt::rc_list_push( - parts, - Rc::new(StringPart::Interpolation { - expr: r.expr.clone(), - }), - ); - tokens = r.tokens.clone(); - ctx = r.ctx.clone(); - let interp_tok = tokens.clone().first().cloned(); - let interp_sh = match interp_tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, +if has_err(r.err.clone()) { + return r.clone() + } +let new_parts = v2_rt::rc_list_push(parts, Rc::new(StringPart::Interpolation { + expr: r.expr.clone(), +})); +tokens = r.tokens.clone(); +ctx = r.ctx.clone(); +let interp_tok = tokens.clone().first().cloned(); +let interp_sh = match interp_tok.clone() { + Some(t) => Some(t.shape.clone()), + None => None, +}; +match interp_sh { + Some(TokenShape::ShStrMid) => { let mid = interp_tok.clone().unwrap().text.clone(); +let mid_parts = if (v2_rt::string_length(&mid) > 0) { + v2_rt::rc_list_push(new_parts, Rc::new(StringPart::Text { + value: mid.clone(), +})) + } else { + new_parts }; - match interp_sh { - Some(TokenShape::ShStrMid) => { - let mid = interp_tok.clone().unwrap().text.clone(); - let mid_parts = if (v2_rt::string_length(&mid) > 0) { - v2_rt::rc_list_push(new_parts, Rc::new(StringPart::Text { value: mid.clone() })) - } else { - new_parts - }; - { - let __tco_0 = - Rc::new(tokens.iter().cloned().skip(1 as usize).collect::>()); - let __tco_1 = mid_parts; - tokens = __tco_0; - parts = __tco_1; - continue; - } - } - Some(TokenShape::ShStrEnd) => { - let suffix = interp_tok.clone().unwrap().text.clone(); - let final_parts = if (v2_rt::string_length(&suffix) > 0) { - v2_rt::rc_list_push( - new_parts, - Rc::new(StringPart::Text { - value: suffix.clone(), - }), - ) - } else { - new_parts - }; - break Rc::new(ExprResult { - expr: make_expr_node( - Rc::new(ExprData::ExprStringInterp), - Rc::new({ - let mut __result = Vec::new(); - for p in final_parts.iter().cloned() { - __result.push(match (*p.clone()).clone() { - StringPart::Text { value: v, .. } => { - make_text_part_node(v.clone(), span.clone()) - } - StringPart::Interpolation { expr: e, .. } => { - make_interp_part_node(e.clone(), span.clone()) - } - }); - } - __result - }), - None, - span.clone(), - ), - tokens: Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - ctx: ctx.clone(), - err: None, - }); - } - _ => { - break Rc::new(ExprResult { - expr: make_expr_node( - Rc::new(ExprData::ExprStringInterp), - Rc::new({ - let mut __result = Vec::new(); - for p in new_parts.iter().cloned() { - __result.push(match (*p.clone()).clone() { - StringPart::Text { value: v, .. } => { - make_text_part_node(v.clone(), span.clone()) - } - StringPart::Interpolation { expr: e, .. } => { - make_interp_part_node(e.clone(), span.clone()) - } - }); - } - __result - }), - None, - span.clone(), - ), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, - }); - } - } - } +{ + let __tco_0 = Rc::new(tokens.iter().cloned().skip(1 as usize).collect::>()); +let __tco_1 = mid_parts; +tokens = __tco_0; +parts = __tco_1; +continue; +} }, + Some(TokenShape::ShStrEnd) => { let suffix = interp_tok.clone().unwrap().text.clone(); +let final_parts = if (v2_rt::string_length(&suffix) > 0) { + v2_rt::rc_list_push(new_parts, Rc::new(StringPart::Text { + value: suffix.clone(), +})) + } else { + new_parts + }; +break Rc::new(ExprResult { + expr: make_expr_node(Rc::new(ExprData::ExprStringInterp), Rc::new({ let mut __result = Vec::new(); for p in final_parts.iter().cloned() { __result.push(match (*p.clone()).clone() { + StringPart::Text { value: v, .. } => make_text_part_node(v.clone(), span.clone()), + StringPart::Interpolation { expr: e, .. } => make_interp_part_node(e.clone(), span.clone()), +}); } __result }), None, span.clone()), + tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), + ctx: ctx.clone(), + err: None, +}); }, + _ => { break Rc::new(ExprResult { + expr: make_expr_node(Rc::new(ExprData::ExprStringInterp), Rc::new({ let mut __result = Vec::new(); for p in new_parts.iter().cloned() { __result.push(match (*p.clone()).clone() { + StringPart::Text { value: v, .. } => make_text_part_node(v.clone(), span.clone()), + StringPart::Interpolation { expr: e, .. } => make_interp_part_node(e.clone(), span.clone()), +}); } __result }), None, span.clone()), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, +}); }, +} +} } pub fn parse_brace_expr(tokens: &Rc>>, ctx: Rc) -> Rc { { let span = token_span(tokens.clone().first().cloned()); - let dummy_expr = parse_recovery_placeholder(); - let tokens = skip_newlines(Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - )); - let tok = tokens.clone().first().cloned(); - if tok_is_rbrace(tok.clone()) { +let dummy_expr = parse_recovery_placeholder(); +let tokens = skip_newlines(Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>())); +let tok = tokens.clone().first().cloned(); +if tok_is_rbrace(tok.clone()) { Rc::new(ExprResult { - expr: make_expr_node( - Rc::new(ExprData::ExprRecordLit { parent_enum: None }), - Rc::new(vec![]), - None, - span, - ), - tokens: Rc::new( - tokens - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ), - ctx: ctx, - err: None, - }) + expr: make_expr_node(Rc::new(ExprData::ExprRecordLit { + parent_enum: None, +}), Rc::new(vec![]), None, span), + tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), + ctx: ctx, + err: None, +}) } else { { let sh = match tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, - }; - match sh { - Some(TokenShape::ShKeyword) => { - let brace_kw = tok_keyword_text(tok.clone()); - if ((brace_kw.clone().as_str() == "let".to_string().as_str()) - || (brace_kw.clone().as_str() == "return".to_string().as_str())) + Some(t) => Some(t.shape.clone()), + None => None, +}; +match sh { + Some(TokenShape::ShKeyword) => { + let brace_kw = tok_keyword_text(tok.clone()); +if ((brace_kw.clone().as_str() == "let".to_string().as_str()) || (brace_kw.clone().as_str() == "return".to_string().as_str())) { { + let r = parse_stmts(tokens.clone(), ctx); +if has_err(r.err.clone()) { + return Rc::new(ExprResult { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let tokens = skip_newlines(r.tokens.clone()); +let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); +if has_err(r2.err.clone()) { + return Rc::new(ExprResult { + expr: dummy_expr.clone(), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), +}) + } +if ((r.stmts.clone().len() as i64) == 1) { + Rc::new(ExprResult { + expr: r.stmts.clone().first().cloned().clone().unwrap(), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) + } else { + Rc::new(ExprResult { + expr: make_expr_node(Rc::new(ExprData::ExprBlock), r.stmts.clone(), None, span), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) + } +} + } else { + if (tok_is_keyword_name(tok.clone()) && peek_is_colon_after_ident(tokens.clone())) { { - let r = parse_stmts(tokens.clone(), ctx); - if has_err(r.err.clone()) { + let r = parse_field_init_list(tokens.clone(), ctx); +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) } - let tokens = skip_newlines(r.tokens.clone()); - let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); - if has_err(r2.err.clone()) { +let tokens = skip_newlines(r.tokens.clone()); +let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); +if has_err(r2.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), - }); - } - if ((r.stmts.clone().len() as i64) == 1) { - Rc::new(ExprResult { - expr: r.stmts.clone().first().cloned().clone().unwrap(), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) - } else { - Rc::new(ExprResult { - expr: make_expr_node( - Rc::new(ExprData::ExprBlock), - r.stmts.clone(), - None, - span, - ), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) + expr: dummy_expr.clone(), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), +}) } - } +Rc::new(ExprResult { + expr: make_expr_node(Rc::new(ExprData::ExprRecordLit { + parent_enum: None, +}), r.fields.clone(), None, span), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +} } else { - if (tok_is_keyword_name(tok.clone()) - && peek_is_colon_after_ident(tokens.clone())) { - { - let r = parse_field_init_list(tokens.clone(), ctx); - if has_err(r.err.clone()) { - return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let tokens = skip_newlines(r.tokens.clone()); - let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); - if has_err(r2.err.clone()) { - return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), - }); - } - Rc::new(ExprResult { - expr: make_expr_node( - Rc::new(ExprData::ExprRecordLit { parent_enum: None }), - r.fields.clone(), - None, - span, - ), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) + let r = parse_expr(tokens.clone(), ctx); +if has_err(r.err.clone()) { + return Rc::new(ExprResult { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) } - } else { - { - let r = parse_expr(tokens.clone(), ctx); - if has_err(r.err.clone()) { - return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let tokens = skip_newlines(r.tokens.clone()); - let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); - if has_err(r2.err.clone()) { - return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), - }); - } - Rc::new(ExprResult { - expr: r.expr.clone(), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) +let tokens = skip_newlines(r.tokens.clone()); +let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); +if has_err(r2.err.clone()) { + return Rc::new(ExprResult { + expr: dummy_expr.clone(), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), +}) } - } +Rc::new(ExprResult { + expr: r.expr.clone(), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +} } } - _ => { - let ident_or_keyword = - (tok_is_ident(tok.clone()) || tok_is_keyword_name(tok.clone())); - if (ident_or_keyword && peek_is_colon_after_ident(tokens.clone())) { +}, + _ => { + let ident_or_keyword = (tok_is_ident(tok.clone()) || tok_is_keyword_name(tok.clone())); +if (ident_or_keyword && peek_is_colon_after_ident(tokens.clone())) { + { + let r = parse_field_init_list(tokens.clone(), ctx); +if has_err(r.err.clone()) { + return Rc::new(ExprResult { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) + } +let tokens = skip_newlines(r.tokens.clone()); +let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); +if has_err(r2.err.clone()) { + return Rc::new(ExprResult { + expr: dummy_expr.clone(), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), +}) + } +Rc::new(ExprResult { + expr: make_expr_node(Rc::new(ExprData::ExprRecordLit { + parent_enum: None, +}), r.fields.clone(), None, span), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +} + } else { + if (tok_is_lit_str(tok.clone()) && peek_is_colon_after_ident(tokens.clone())) { { let r = parse_field_init_list(tokens.clone(), ctx); - if has_err(r.err.clone()) { +if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) } - let tokens = skip_newlines(r.tokens.clone()); - let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); - if has_err(r2.err.clone()) { +let tokens = skip_newlines(r.tokens.clone()); +let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); +if has_err(r2.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), - }); + expr: dummy_expr.clone(), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), +}) } - Rc::new(ExprResult { - expr: make_expr_node( - Rc::new(ExprData::ExprRecordLit { parent_enum: None }), - r.fields.clone(), - None, - span, - ), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) - } +Rc::new(ExprResult { + expr: make_expr_node(Rc::new(ExprData::ExprRecordLit { + parent_enum: None, +}), r.fields.clone(), None, span), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) +} } else { - if (tok_is_lit_str(tok.clone()) - && peek_is_colon_after_ident(tokens.clone())) { - { - let r = parse_field_init_list(tokens.clone(), ctx); - if has_err(r.err.clone()) { - return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let tokens = skip_newlines(r.tokens.clone()); - let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); - if has_err(r2.err.clone()) { - return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), - }); - } - Rc::new(ExprResult { - expr: make_expr_node( - Rc::new(ExprData::ExprRecordLit { parent_enum: None }), - r.fields.clone(), - None, - span, - ), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) + let r = parse_stmts(tokens.clone(), ctx); +if has_err(r.err.clone()) { + return Rc::new(ExprResult { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), +}) } - } else { - { - let r = parse_stmts(tokens.clone(), ctx); - if has_err(r.err.clone()) { - return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), - }); - } - let tokens = skip_newlines(r.tokens.clone()); - let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); - if has_err(r2.err.clone()) { - return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), - }); - } - if ((r.stmts.clone().len() as i64) == 1) { - Rc::new(ExprResult { - expr: r.stmts.clone().first().cloned().clone().unwrap(), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) - } else { - Rc::new(ExprResult { - expr: make_expr_node( - Rc::new(ExprData::ExprBlock), - r.stmts.clone(), - None, - span, - ), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: None, - }) - } +let tokens = skip_newlines(r.tokens.clone()); +let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); +if has_err(r2.err.clone()) { + return Rc::new(ExprResult { + expr: dummy_expr.clone(), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), +}) } - } +if ((r.stmts.clone().len() as i64) == 1) { + Rc::new(ExprResult { + expr: r.stmts.clone().first().cloned().clone().unwrap(), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) + } else { + Rc::new(ExprResult { + expr: make_expr_node(Rc::new(ExprData::ExprBlock), r.stmts.clone(), None, span), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: None, +}) + } +} } } - } - } +}, +} +} } - } +} } pub fn peek_is_colon_after_ident(tokens: Rc>>) -> bool { match tokens.get(1 as usize).cloned() { - Some(t) => is_colon_shape(t.shape.clone()), - None => false, - } + Some(t) => is_colon_shape(t.shape.clone()), + None => false, +} } diff --git a/src/v2/stage0/src/v2_compiler_resolve.rs b/src/v2/stage0/src/v2_compiler_resolve.rs index be03f94ffd6..6544945bd40 100644 --- a/src/v2/stage0/src/v2_compiler_resolve.rs +++ b/src/v2/stage0/src/v2_compiler_resolve.rs @@ -1,21 +1,15 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.resolve -pub use crate::std_types::kernel_type_set; -use crate::v2_rt; -use crate::v2_std_core::CompilerDiagnostic::{ - CircularDependency, DuplicateModule, MissingExport, UnresolvedImport, -}; -use crate::v2_std_core::Connective::{Conj, Disj, NoConnective}; -pub use crate::v2_std_core::{ - authored_name_at, import_is_all, import_node, import_specific_names_at, make_error_node, - module_imports, module_items, module_node, no_span, CompilerDiagnostic, Connective, ErrorNode, - NewlineIndex, Node, -}; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::std_types::{kernel_type_set}; +pub use crate::v2_std_core::{Node, Connective, ErrorNode, make_error_node, no_span, module_node, import_node, import_is_all, import_specific_names_at, module_imports, module_items, NewlineIndex, authored_name_at, CompilerDiagnostic}; +use crate::v2_std_core::Connective::{Conj, Disj, NoConnective}; +use crate::v2_std_core::CompilerDiagnostic::{UnresolvedImport, MissingExport, DuplicateModule, CircularDependency}; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] pub struct ModuleGraph { @@ -52,130 +46,56 @@ pub struct ResolveAccum { pub fn map_has(m: Rc>, key: String) -> bool { match v2_rt::map_get(&m, key) { - Some(_) => true, - None => false, - } + Some(_) => true, + None => false, +} } -pub fn resolve_modules( - modules: &Rc>>, - source_indices: &Rc>>, -) -> Rc { +pub fn resolve_modules(modules: &Rc>>, source_indices: &Rc>>) -> Rc { { let dup_diags = check_duplicate_modules(modules.clone(), source_indices.clone()); - let module_index = modules.clone().iter().cloned().fold( - v2_rt::rc_empty_map::>(), - |acc: Rc>>, m: Rc| { - v2_rt::rc_map_insert(acc, authored_name_at(source_indices.clone(), &m), m.clone()) - }, - ); - let export_sets = modules.clone().iter().cloned().fold( - v2_rt::rc_empty_map::>>(), - |acc: Rc>>>, m: Rc| { - let exported = get_exported_names(&m, source_indices.clone()); - let exported_set = exported.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |inner_acc: Rc>, name: String| { - v2_rt::rc_map_insert(inner_acc, name.clone(), true) - }, - ); - v2_rt::rc_map_insert( - acc, - authored_name_at(source_indices.clone(), &m), - exported_set.clone(), - ) - }, - ); - let resolve_accum = modules.clone().iter().cloned().fold( - Rc::new(ResolveAccum { - imports_by_name: v2_rt::rc_empty_map::>>>(), - diagnostics: Rc::new(vec![]), - }), - |acc: Rc, m: Rc| { - let acc = Rc::try_unwrap(acc).unwrap_or_else(|rc| (*rc).clone()); - { - let result = resolve_module_imports( - &m, - module_index.clone(), - export_sets.clone(), - source_indices.clone(), - ); - Rc::new(ResolveAccum { - imports_by_name: v2_rt::rc_map_insert( - acc.imports_by_name, - authored_name_at(source_indices.clone(), &m), - result.resolved_imports.clone(), - ), - diagnostics: v2_rt::concat(acc.diagnostics, result.diagnostics.clone()), - }) - } - }, - ); - let imports_by_name = resolve_accum.imports_by_name.clone(); - let import_diags = resolve_accum.diagnostics.clone(); - let topo_result = topological_sort(&modules, source_indices.clone()); - let topo_diags = match topo_result.cycle_error.clone() { - Some(diag) => Rc::new(vec![diag.clone()]), - None => Rc::new(vec![]), - }; - let sorted_names = topo_result.sorted.clone(); - let sorted_order_map = Rc::new( - sorted_names - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - .fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, pair: (i64, String)| { - v2_rt::rc_map_insert(acc, pair.1.clone(), pair.0.clone()) - }, - ); - let acyclic_resolved = Rc::new({ - let mut __result = Vec::new(); - for m in modules.clone().iter().cloned() { - __result.extend( - (*match v2_rt::map_get( - &sorted_order_map, - authored_name_at(source_indices.clone(), &m), - ) { - Some(order) => match v2_rt::map_get( - &imports_by_name, - authored_name_at(source_indices.clone(), &m), - ) { - Some(imps) => Rc::new(vec![Rc::new(ResolvedModule { - module: m.clone(), - resolved_imports: imps.clone(), - dep_order: order.clone(), - })]), - None => Rc::new(vec![]), - }, - None => Rc::new(vec![]), - }) - .iter() - .cloned(), - ); - } - __result - }); - let sorted_resolved = Rc::new({ - let mut __sorted: Vec<_> = acyclic_resolved.iter().cloned().collect(); - __sorted.sort_by(|a: &Rc, b: &Rc| { - let __ka = (|m: Rc| m.dep_order.clone())(a.clone()); - let __kb = (|m: Rc| m.dep_order.clone())(b.clone()); - __ka.partial_cmp(&__kb).unwrap_or(std::cmp::Ordering::Equal) - }); - __sorted - }); - Rc::new(ModuleGraph { - modules: sorted_resolved, - diagnostics: v2_rt::concat(v2_rt::concat(dup_diags, import_diags), topo_diags), - }) - } +let module_index = modules.clone().iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, m: Rc| v2_rt::rc_map_insert(acc, authored_name_at(source_indices.clone(), &m), m.clone())); +let export_sets = modules.clone().iter().cloned().fold(v2_rt::rc_empty_map::>>(), |acc: Rc>>>, m: Rc| { + let exported = get_exported_names(&m, source_indices.clone()); +let exported_set = exported.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |inner_acc: Rc>, name: String| v2_rt::rc_map_insert(inner_acc, name.clone(), true)); +v2_rt::rc_map_insert(acc, authored_name_at(source_indices.clone(), &m), exported_set.clone()) +}); +let resolve_accum = modules.clone().iter().cloned().fold(Rc::new(ResolveAccum { + imports_by_name: v2_rt::rc_empty_map::>>>(), + diagnostics: Rc::new(vec![]), +}), |acc: Rc, m: Rc| { let acc = Rc::try_unwrap(acc).unwrap_or_else(|rc| (*rc).clone()); { + let result = resolve_module_imports(&m, module_index.clone(), export_sets.clone(), source_indices.clone()); +Rc::new(ResolveAccum { + imports_by_name: v2_rt::rc_map_insert(acc.imports_by_name, authored_name_at(source_indices.clone(), &m), result.resolved_imports.clone()), + diagnostics: v2_rt::concat(acc.diagnostics, result.diagnostics.clone()), +}) +} }); +let imports_by_name = resolve_accum.imports_by_name.clone(); +let import_diags = resolve_accum.diagnostics.clone(); +let topo_result = topological_sort(&modules, source_indices.clone()); +let topo_diags = match topo_result.cycle_error.clone() { + Some(diag) => Rc::new(vec![diag.clone()]), + None => Rc::new(vec![]), +}; +let sorted_names = topo_result.sorted.clone(); +let sorted_order_map = Rc::new(sorted_names.iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, pair: (i64, String)| v2_rt::rc_map_insert(acc, pair.1.clone(), pair.0.clone())); +let acyclic_resolved = Rc::new({ let mut __result = Vec::new(); for m in modules.clone().iter().cloned() { __result.extend((*match v2_rt::map_get(&sorted_order_map, authored_name_at(source_indices.clone(), &m)) { + Some(order) => match v2_rt::map_get(&imports_by_name, authored_name_at(source_indices.clone(), &m)) { + Some(imps) => Rc::new(vec![Rc::new(ResolvedModule { + module: m.clone(), + resolved_imports: imps.clone(), + dep_order: order.clone(), +})]), + None => Rc::new(vec![]), +}, + None => Rc::new(vec![]), +}).iter().cloned()); } __result }); +let sorted_resolved = Rc::new({ let mut __sorted: Vec<_> = acyclic_resolved.iter().cloned().collect(); __sorted.sort_by(|a: &Rc, b: &Rc| { let __ka = (|m: Rc| m.dep_order.clone())(a.clone()); let __kb = (|m: Rc| m.dep_order.clone())(b.clone()); __ka.partial_cmp(&__kb).unwrap_or(std::cmp::Ordering::Equal) }); __sorted }); +Rc::new(ModuleGraph { + modules: sorted_resolved, + diagnostics: v2_rt::concat(v2_rt::concat(dup_diags, import_diags), topo_diags), +}) +} } pub fn find_module(module_index: Rc>>, path: String) -> Option> { @@ -188,58 +108,16 @@ pub struct ModuleResolveResult { pub diagnostics: Rc>>, } -pub fn resolve_module_imports( - module: &Rc, - module_index: Rc>>, - export_sets: Rc>>>, - source_indices: Rc>>, -) -> Rc { +pub fn resolve_module_imports(module: &Rc, module_index: Rc>>, export_sets: Rc>>>, source_indices: Rc>>) -> Rc { { - let results = Rc::new({ - let mut __result = Vec::new(); - for imp in module_imports(module.clone()).iter().cloned() { - __result.push(resolve_import( - &imp, - module_index.clone(), - &authored_name_at(source_indices.clone(), &module), - export_sets.clone(), - &source_indices, - )); - } - __result - }); - let resolved = Rc::new({ - let mut __result = Vec::new(); - for r in Rc::new({ - let mut __result = Vec::new(); - for r in results.clone().iter().cloned() { - if ((r.resolved.clone().target_module.clone() != None) - && ((r.diagnostics.clone().len() as i64) == 0)) - { - __result.push(r); - } - } - __result - }) - .iter() - .cloned() - { - __result.push(r.resolved.clone()); - } - __result - }); - let diags = Rc::new({ - let mut __result = Vec::new(); - for r in results.clone().iter().cloned() { - __result.extend((*r.diagnostics.clone()).iter().cloned()); - } - __result - }); - Rc::new(ModuleResolveResult { - resolved_imports: resolved, - diagnostics: diags, - }) - } + let results = Rc::new({ let mut __result = Vec::new(); for imp in module_imports(module.clone()).iter().cloned() { __result.push(resolve_import(&imp, module_index.clone(), &authored_name_at(source_indices.clone(), &module), export_sets.clone(), &source_indices)); } __result }); +let resolved = Rc::new({ let mut __result = Vec::new(); for r in Rc::new({ let mut __result = Vec::new(); for r in results.clone().iter().cloned() { if ((r.resolved.clone().target_module.clone() != None) && ((r.diagnostics.clone().len() as i64) == 0)) { __result.push(r); } } __result }).iter().cloned() { __result.push(r.resolved.clone()); } __result }); +let diags = Rc::new({ let mut __result = Vec::new(); for r in results.clone().iter().cloned() { __result.extend((*r.diagnostics.clone()).iter().cloned()); } __result }); +Rc::new(ModuleResolveResult { + resolved_imports: resolved, + diagnostics: diags, +}) +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -248,165 +126,82 @@ pub struct ImportResolveResult { pub diagnostics: Rc>>, } -pub fn resolve_import( - import: &Rc, - module_index: Rc>>, - importing_module: &String, - export_sets: Rc>>>, - source_indices: &Rc>>, -) -> Rc { +pub fn resolve_import(import: &Rc, module_index: Rc>>, importing_module: &String, export_sets: Rc>>>, source_indices: &Rc>>) -> Rc { { let import_path = authored_name_at(source_indices.clone(), &import); - let target = find_module(module_index, import_path.clone()); - match target { - None => { - let diag = make_error_node( - Rc::new(CompilerDiagnostic::UnresolvedImport { - module_path: import_path.clone(), - importing_module: importing_module.clone(), - span: import.span.clone(), - }), - importing_module.clone(), - ); - Rc::new(ImportResolveResult { - resolved: Rc::new(ResolvedImport { - module_path: import_path.clone(), - is_all: import_is_all(import.clone()), - specific_names: import_specific_names_at( - import.clone(), - source_indices.clone(), - ), - target_module: None, - }), - diagnostics: Rc::new(vec![diag]), - }) - } - Some(target_mod) => { - let exported_set = match v2_rt::map_get(&export_sets, import_path.clone()) { - Some(set) => set.clone(), - None => v2_rt::rc_empty_map::(), - }; - let name_diags = if import_is_all(import.clone()) { - Rc::new(vec![]) - } else { - Rc::new({ - let mut __result = Vec::new(); - for child in Rc::new({ - let mut __result = Vec::new(); - for child in import.children.clone().iter().cloned() { - if (v2_rt::map_has( - &exported_set, - authored_name_at(source_indices.clone(), &child), - ) == false) - { - __result.push(child); - } - } - __result - }) - .iter() - .cloned() - { - __result.push(make_error_node( - Rc::new(CompilerDiagnostic::MissingExport { - name: authored_name_at(source_indices.clone(), &child), - module_path: import_path.clone(), - importing_module: importing_module.clone(), - span: child.span.clone(), - }), - importing_module.clone(), - )); - } - __result - }) - }; - Rc::new(ImportResolveResult { - resolved: Rc::new(ResolvedImport { - module_path: import_path.clone(), - is_all: import_is_all(import.clone()), - specific_names: import_specific_names_at( - import.clone(), - source_indices.clone(), - ), - target_module: Some(target_mod.clone()), - }), - diagnostics: name_diags, - }) - } - } - } +let target = find_module(module_index, import_path.clone()); +match target { + None => { + let diag = make_error_node(Rc::new(CompilerDiagnostic::UnresolvedImport { + module_path: import_path.clone(), + importing_module: importing_module.clone(), + span: import.span.clone(), +}), importing_module.clone()); +Rc::new(ImportResolveResult { + resolved: Rc::new(ResolvedImport { + module_path: import_path.clone(), + is_all: import_is_all(import.clone()), + specific_names: import_specific_names_at(import.clone(), source_indices.clone()), + target_module: None, +}), + diagnostics: Rc::new(vec![diag]), +}) +}, + Some(target_mod) => { + let exported_set = match v2_rt::map_get(&export_sets, import_path.clone()) { + Some(set) => set.clone(), + None => v2_rt::rc_empty_map::(), +}; +let name_diags = if import_is_all(import.clone()) { + Rc::new(vec![]) + } else { + Rc::new({ let mut __result = Vec::new(); for child in Rc::new({ let mut __result = Vec::new(); for child in import.children.clone().iter().cloned() { if (v2_rt::map_has(&exported_set, authored_name_at(source_indices.clone(), &child)) == false) { __result.push(child); } } __result }).iter().cloned() { __result.push(make_error_node(Rc::new(CompilerDiagnostic::MissingExport { + name: authored_name_at(source_indices.clone(), &child), + module_path: import_path.clone(), + importing_module: importing_module.clone(), + span: child.span.clone(), +}), importing_module.clone())); } __result }) + }; +Rc::new(ImportResolveResult { + resolved: Rc::new(ResolvedImport { + module_path: import_path.clone(), + is_all: import_is_all(import.clone()), + specific_names: import_specific_names_at(import.clone(), source_indices.clone()), + target_module: Some(target_mod.clone()), +}), + diagnostics: name_diags, +}) +}, +} +} } -pub fn get_exported_names( - module: &Rc, - source_indices: Rc>>, -) -> Rc> { +pub fn get_exported_names(module: &Rc, source_indices: Rc>>) -> Rc> { { - let item_names = Rc::new({ - let mut __result = Vec::new(); - for item in module_items(module.clone()).iter().cloned() { - __result.push(get_item_name(item.clone(), source_indices.clone())); - } - __result - }); - let variant_names = Rc::new({ - let mut __result = Vec::new(); - for item in module_items(module.clone()).iter().cloned() { - __result.extend( - (*get_variant_names(&item, source_indices.clone())) - .iter() - .cloned(), - ); - } - __result - }); - let imported_names = Rc::new({ - let mut __result = Vec::new(); - for imp in module_imports(module.clone()).iter().cloned() { - __result.extend( - (*if import_is_all(imp.clone()) { - Rc::new(vec![]) - } else { - import_specific_names_at(imp.clone(), source_indices.clone()) - }) - .iter() - .cloned(), - ); - } - __result - }); - v2_rt::concat( - v2_rt::concat(v2_rt::concat(item_names, variant_names), imported_names), - Rc::new(v2_rt::map_keys(&kernel_type_set())), - ) - } + let item_names = Rc::new({ let mut __result = Vec::new(); for item in module_items(module.clone()).iter().cloned() { __result.push(get_item_name(item.clone(), source_indices.clone())); } __result }); +let variant_names = Rc::new({ let mut __result = Vec::new(); for item in module_items(module.clone()).iter().cloned() { __result.extend((*get_variant_names(&item, source_indices.clone())).iter().cloned()); } __result }); +let imported_names = Rc::new({ let mut __result = Vec::new(); for imp in module_imports(module.clone()).iter().cloned() { __result.extend((*if import_is_all(imp.clone()) { + Rc::new(vec![]) + } else { + import_specific_names_at(imp.clone(), source_indices.clone()) + }).iter().cloned()); } __result }); +v2_rt::concat(v2_rt::concat(v2_rt::concat(item_names, variant_names), imported_names), Rc::new(v2_rt::map_keys(&kernel_type_set()))) +} } -pub fn get_item_name( - item: Rc, - source_indices: Rc>>, -) -> String { +pub fn get_item_name(item: Rc, source_indices: Rc>>) -> String { authored_name_at(source_indices, &item) } -pub fn get_variant_names( - item: &Rc, - source_indices: Rc>>, -) -> Rc> { +pub fn get_variant_names(item: &Rc, source_indices: Rc>>) -> Rc> { { let is_coproduct = (item.connective.clone() == Connective::Disj); - if is_coproduct { - Rc::new({ - let mut __result = Vec::new(); - for c in item.children.clone().iter().cloned() { - __result.push(authored_name_at(source_indices.clone(), &c)); - } - __result - }) +if is_coproduct { + Rc::new({ let mut __result = Vec::new(); for c in item.children.clone().iter().cloned() { __result.push(authored_name_at(source_indices.clone(), &c)); } __result }) } else { Rc::new(vec![]) } - } +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -415,47 +210,31 @@ pub struct DuplicateCheckState { pub diagnostics: Rc>>, } -pub fn check_duplicate_modules( - modules: Rc>>, - source_indices: Rc>>, -) -> Rc>> { +pub fn check_duplicate_modules(modules: Rc>>, source_indices: Rc>>) -> Rc>> { { - let result = modules.iter().cloned().fold( - Rc::new(DuplicateCheckState { - seen_names: v2_rt::rc_empty_map::(), - diagnostics: Rc::new(vec![]), - }), - |state: Rc, m: Rc| { - let m_name = authored_name_at(source_indices.clone(), &m); - let is_dup = v2_rt::map_has(&state.seen_names.clone(), m_name.clone()); - if is_dup.clone() { - Rc::new(DuplicateCheckState { - seen_names: state.seen_names.clone(), - diagnostics: v2_rt::concat( - state.diagnostics.clone(), - Rc::new(vec![make_error_node( - Rc::new(CompilerDiagnostic::DuplicateModule { - name: m_name.clone(), - span: m.span.clone(), - }), - m_name.clone(), - )]), - ), - }) - } else { - Rc::new(DuplicateCheckState { - seen_names: v2_rt::rc_map_insert( - state.seen_names.clone(), - m_name.clone(), - true, - ), - diagnostics: state.diagnostics.clone(), - }) - } - }, - ); - result.diagnostics.clone() - } + let result = modules.iter().cloned().fold(Rc::new(DuplicateCheckState { + seen_names: v2_rt::rc_empty_map::(), + diagnostics: Rc::new(vec![]), +}), |state: Rc, m: Rc| { + let m_name = authored_name_at(source_indices.clone(), &m); +let is_dup = v2_rt::map_has(&state.seen_names.clone(), m_name.clone()); +if is_dup.clone() { + Rc::new(DuplicateCheckState { + seen_names: state.seen_names.clone(), + diagnostics: v2_rt::concat(state.diagnostics.clone(), Rc::new(vec![make_error_node(Rc::new(CompilerDiagnostic::DuplicateModule { + name: m_name.clone(), + span: m.span.clone(), +}), m_name.clone())])), +}) + } else { + Rc::new(DuplicateCheckState { + seen_names: v2_rt::rc_map_insert(state.seen_names.clone(), m_name.clone(), true), + diagnostics: state.diagnostics.clone(), +}) + } +}); +result.diagnostics.clone() +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -464,22 +243,14 @@ pub struct TopoResult { pub cycle_error: Option>, } -pub fn adjacency_add_edge( - adjacency: &Rc>>>, - from_module: &String, - to_module: String, -) -> Rc>>> { +pub fn adjacency_add_edge(adjacency: &Rc>>>, from_module: &String, to_module: String) -> Rc>>> { { let existing = match v2_rt::map_get(&adjacency, from_module.clone()) { - Some(lst) => lst.clone(), - None => Rc::new(vec![]), - }; - v2_rt::rc_map_insert( - adjacency.clone(), - from_module.clone(), - v2_rt::rc_list_push(existing, to_module), - ) - } + Some(lst) => lst.clone(), + None => Rc::new(vec![]), +}; +v2_rt::rc_map_insert(adjacency.clone(), from_module.clone(), v2_rt::rc_list_push(existing, to_module)) +} } pub fn topo_sort_key(name: String) -> String { @@ -490,201 +261,67 @@ pub fn topo_sort_key(name: String) -> String { } } -pub fn topological_sort( - modules: &Rc>>, - source_indices: Rc>>, -) -> Rc { +pub fn topological_sort(modules: &Rc>>, source_indices: Rc>>) -> Rc { { - let module_names = Rc::new({ - let mut __result = Vec::new(); - for m in modules.clone().iter().cloned() { - __result.push(authored_name_at(source_indices.clone(), &m)); - } - __result - }); - let has_std_types = { - let mut __found = false; - for name in module_names.clone().iter().cloned() { - if (name.clone().as_str() == "std.types".to_string().as_str()) { - __found = true; - break; - } - } - __found - }; - let explicit_edges = Rc::new({ - let mut __result = Vec::new(); - for m in modules.clone().iter().cloned() { - __result.extend( - (*Rc::new({ - let mut __result = Vec::new(); - for imp in module_imports(m.clone()).iter().cloned() { - __result.push(Rc::new(DepEdge { - from_module: authored_name_at(source_indices.clone(), &imp), - to_module: authored_name_at(source_indices.clone(), &m), - })); - } - __result - })) - .iter() - .cloned(), - ); - } - __result - }); - let implicit_std_types_edges = if has_std_types.clone() { - Rc::new({ - let mut __result = Vec::new(); - for m in modules.clone().iter().cloned() { - __result.extend( - (*{ - let m_name = authored_name_at(source_indices.clone(), &m); - let imports_std_types = { - let mut __found = false; - for imp in module_imports(m.clone()).iter().cloned() { - if (authored_name_at(source_indices.clone(), &imp).as_str() - == "std.types".to_string().as_str()) - { - __found = true; - break; - } - } - __found - }; - if ((((m_name.clone().as_str() != "std.types".to_string().as_str()) - && (m_name.clone().as_str() - != "std.algebra".to_string().as_str())) - && (m_name.clone().as_str() - != "std.error_primitives".to_string().as_str())) - && (imports_std_types.clone() == false)) - { - Rc::new(vec![Rc::new(DepEdge { - from_module: "std.types".to_string(), - to_module: m_name.clone(), - })]) - } else { - Rc::new(vec![]) - } - }) - .iter() - .cloned(), - ); + let module_names = Rc::new({ let mut __result = Vec::new(); for m in modules.clone().iter().cloned() { __result.push(authored_name_at(source_indices.clone(), &m)); } __result }); +let has_std_types = { let mut __found = false; for name in module_names.clone().iter().cloned() { if (name.clone().as_str() == "std.types".to_string().as_str()) { __found = true; break; } } __found }; +let explicit_edges = Rc::new({ let mut __result = Vec::new(); for m in modules.clone().iter().cloned() { __result.extend((*Rc::new({ let mut __result = Vec::new(); for imp in module_imports(m.clone()).iter().cloned() { __result.push(Rc::new(DepEdge { + from_module: authored_name_at(source_indices.clone(), &imp), + to_module: authored_name_at(source_indices.clone(), &m), +})); } __result })).iter().cloned()); } __result }); +let implicit_std_types_edges = if has_std_types.clone() { + Rc::new({ let mut __result = Vec::new(); for m in modules.clone().iter().cloned() { __result.extend((*{ + let m_name = authored_name_at(source_indices.clone(), &m); +let imports_std_types = { let mut __found = false; for imp in module_imports(m.clone()).iter().cloned() { if (authored_name_at(source_indices.clone(), &imp).as_str() == "std.types".to_string().as_str()) { __found = true; break; } } __found }; +if ((((m_name.clone().as_str() != "std.types".to_string().as_str()) && (m_name.clone().as_str() != "std.algebra".to_string().as_str())) && (m_name.clone().as_str() != "std.error_primitives".to_string().as_str())) && (imports_std_types.clone() == false)) { + Rc::new(vec![Rc::new(DepEdge { + from_module: "std.types".to_string(), + to_module: m_name.clone(), +})]) + } else { + Rc::new(vec![]) } - __result - }) +}).iter().cloned()); } __result }) } else { Rc::new(vec![]) }; - let adjacency = v2_rt::concat(explicit_edges, implicit_std_types_edges) - .iter() - .cloned() - .fold( - v2_rt::rc_empty_map::>>(), - |acc: Rc>>>, edge: Rc| { - adjacency_add_edge(&acc, &edge.from_module.clone(), edge.to_module.clone()) - }, - ); - let in_degree_map = modules.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, m: Rc| { - let m_name = authored_name_at(source_indices.clone(), &m); - let imports_std_types = { - let mut __found = false; - for imp in module_imports(m.clone()).iter().cloned() { - if (authored_name_at(source_indices.clone(), &imp).as_str() - == "std.types".to_string().as_str()) - { - __found = true; - break; - } - } - __found - }; - let implicit_std_types_in_degree = if ((((has_std_types.clone() - && (m_name.clone().as_str() != "std.types".to_string().as_str())) - && (m_name.clone().as_str() != "std.algebra".to_string().as_str())) - && (m_name.clone().as_str() != "std.error_primitives".to_string().as_str())) - && (imports_std_types.clone() == false)) - { - 1 - } else { - 0 - }; - v2_rt::rc_map_insert( - acc, - m_name.clone(), - ((module_imports(m.clone()).len() as i64) - + implicit_std_types_in_degree.clone()), - ) - }, - ); - let initial_queue = Rc::new({ - let mut __sorted: Vec<_> = Rc::new({ - let mut __result = Vec::new(); - for name in module_names.clone().iter().cloned() { - if match v2_rt::map_get(&in_degree_map, name.clone()) { - Some(0) => true, - _ => false, - } { - __result.push(name); - } - } - __result - }) - .iter() - .cloned() - .collect(); - __sorted.sort_by(|a: &String, b: &String| { - let __ka = (|name: String| topo_sort_key(name.clone()))(a.clone()); - let __kb = (|name: String| topo_sort_key(name.clone()))(b.clone()); - __ka.partial_cmp(&__kb).unwrap_or(std::cmp::Ordering::Equal) - }); - __sorted - }); - let module_count = (modules.clone().len() as i64); - let result = kahn_drain( - initial_queue, - Rc::new(vec![]), - in_degree_map.clone(), - adjacency, - module_count.clone(), - ); - if ((result.sorted.clone().len() as i64) == module_count.clone()) { +let adjacency = v2_rt::concat(explicit_edges, implicit_std_types_edges).iter().cloned().fold(v2_rt::rc_empty_map::>>(), |acc: Rc>>>, edge: Rc| adjacency_add_edge(&acc, &edge.from_module.clone(), edge.to_module.clone())); +let in_degree_map = modules.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, m: Rc| { + let m_name = authored_name_at(source_indices.clone(), &m); +let imports_std_types = { let mut __found = false; for imp in module_imports(m.clone()).iter().cloned() { if (authored_name_at(source_indices.clone(), &imp).as_str() == "std.types".to_string().as_str()) { __found = true; break; } } __found }; +let implicit_std_types_in_degree = if ((((has_std_types.clone() && (m_name.clone().as_str() != "std.types".to_string().as_str())) && (m_name.clone().as_str() != "std.algebra".to_string().as_str())) && (m_name.clone().as_str() != "std.error_primitives".to_string().as_str())) && (imports_std_types.clone() == false)) { + 1 + } else { + 0 + }; +v2_rt::rc_map_insert(acc, m_name.clone(), ((module_imports(m.clone()).len() as i64) + implicit_std_types_in_degree.clone())) +}); +let initial_queue = Rc::new({ let mut __sorted: Vec<_> = Rc::new({ let mut __result = Vec::new(); for name in module_names.clone().iter().cloned() { if match v2_rt::map_get(&in_degree_map, name.clone()) { + Some(0) => true, + _ => false, +} { __result.push(name); } } __result }).iter().cloned().collect(); __sorted.sort_by(|a: &String, b: &String| { let __ka = (|name: String| topo_sort_key(name.clone()))(a.clone()); let __kb = (|name: String| topo_sort_key(name.clone()))(b.clone()); __ka.partial_cmp(&__kb).unwrap_or(std::cmp::Ordering::Equal) }); __sorted }); +let module_count = (modules.clone().len() as i64); +let result = kahn_drain(initial_queue, Rc::new(vec![]), in_degree_map.clone(), adjacency, module_count.clone()); +if ((result.sorted.clone().len() as i64) == module_count.clone()) { Rc::new(TopoResult { - sorted: result.sorted.clone(), - cycle_error: None, - }) + sorted: result.sorted.clone(), + cycle_error: None, +}) } else { { - let sorted_set = result.sorted.clone().iter().cloned().fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, name: String| { - v2_rt::rc_map_insert(acc, name.clone(), true) - }, - ); - let cycle_members = Rc::new({ - let mut __result = Vec::new(); - for name in module_names.clone().iter().cloned() { - if (v2_rt::map_has(&sorted_set, name.clone()) == false) { - __result.push(name); - } - } - __result - }); - let cycle_desc = cycle_members.clone().join(&" -> ".to_string()); - Rc::new(TopoResult { - sorted: result.sorted.clone(), - cycle_error: Some(make_error_node( - Rc::new(CompilerDiagnostic::CircularDependency { - modules: cycle_members.clone(), - span: no_span(), - }), - "".to_string(), - )), - }) - } + let sorted_set = result.sorted.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, name: String| v2_rt::rc_map_insert(acc, name.clone(), true)); +let cycle_members = Rc::new({ let mut __result = Vec::new(); for name in module_names.clone().iter().cloned() { if (v2_rt::map_has(&sorted_set, name.clone()) == false) { __result.push(name); } } __result }); +let cycle_desc = cycle_members.clone().join(&" -> ".to_string()); +Rc::new(TopoResult { + sorted: result.sorted.clone(), + cycle_error: Some(make_error_node(Rc::new(CompilerDiagnostic::CircularDependency { + modules: cycle_members.clone(), + span: no_span(), +}), "".to_string())), +}) +} } - } +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -693,112 +330,53 @@ pub struct KahnDrainState { pub in_degree_map: Rc>, } -pub fn kahn_drain( - mut queue: Rc>, - mut sorted: Rc>, - mut in_degree_map: Rc>, - mut adjacency: Rc>>>, - mut fuel: i64, -) -> Rc { +pub fn kahn_drain(mut queue: Rc>, mut sorted: Rc>, mut in_degree_map: Rc>, mut adjacency: Rc>>>, mut fuel: i64) -> Rc { loop { if ((queue.clone().len() as i64) == 0) { return Rc::new(KahnDrainState { - sorted: sorted.clone(), - in_degree_map: in_degree_map.clone(), - }); + sorted: sorted.clone(), + in_degree_map: in_degree_map.clone(), +}) } - let batch_result = queue.clone().iter().cloned().fold( - Rc::new(KahnDrainState { - sorted: sorted.clone(), - in_degree_map: in_degree_map.clone(), - }), - |state: Rc, node: String| { - let state = Rc::try_unwrap(state).unwrap_or_else(|rc| (*rc).clone()); - { - let new_sorted = v2_rt::rc_list_push(state.sorted, node.clone()); - let neighbors = match v2_rt::map_get(&adjacency, node.clone()) { - Some(ns) => ns.clone(), - None => Rc::new(vec![]), - }; - let new_degrees = neighbors.clone().iter().cloned().fold( - state.in_degree_map, - |deg_map: Rc>, neighbor: String| { - let current = match v2_rt::map_get(°_map, neighbor.clone()) { - Some(d) => d.clone(), - None => 0, - }; - v2_rt::rc_map_insert( - deg_map.clone(), - neighbor.clone(), - (current.clone() - 1), - ) - }, - ); - Rc::new(KahnDrainState { - sorted: new_sorted.clone(), - in_degree_map: new_degrees.clone(), - }) - } - }, - ); - let new_zero_set = Rc::new({ - let mut __result = Vec::new(); - for neighbor in Rc::new({ - let mut __result = Vec::new(); - for node in queue.clone().iter().cloned() { - __result.extend( - (*match v2_rt::map_get(&adjacency, node.clone()) { - Some(ns) => ns.clone(), - None => Rc::new(vec![]), - }) - .iter() - .cloned(), - ); - } - __result - }) - .iter() - .cloned() - { - if match v2_rt::map_get(&batch_result.in_degree_map.clone(), neighbor.clone()) { - Some(0) => true, - _ => false, - } { - __result.push(neighbor); - } - } - __result - }) - .iter() - .cloned() - .fold( - v2_rt::rc_empty_map::(), - |acc: Rc>, name: String| { - v2_rt::rc_map_insert(acc, name.clone(), true) - }, - ); - let new_zero = Rc::new({ - let mut __sorted: Vec<_> = Rc::new(v2_rt::map_keys(&new_zero_set)) - .iter() - .cloned() - .collect(); - __sorted.sort_by(|a: &String, b: &String| { - let __ka = (|name: String| name.clone())(a.clone()); - let __kb = (|name: String| name.clone())(b.clone()); - __ka.partial_cmp(&__kb).unwrap_or(std::cmp::Ordering::Equal) - }); - __sorted - }); - { +let batch_result = queue.clone().iter().cloned().fold(Rc::new(KahnDrainState { + sorted: sorted.clone(), + in_degree_map: in_degree_map.clone(), +}), |state: Rc, node: String| { let state = Rc::try_unwrap(state).unwrap_or_else(|rc| (*rc).clone()); { + let new_sorted = v2_rt::rc_list_push(state.sorted, node.clone()); +let neighbors = match v2_rt::map_get(&adjacency, node.clone()) { + Some(ns) => ns.clone(), + None => Rc::new(vec![]), +}; +let new_degrees = neighbors.clone().iter().cloned().fold(state.in_degree_map, |deg_map: Rc>, neighbor: String| { + let current = match v2_rt::map_get(°_map, neighbor.clone()) { + Some(d) => d.clone(), + None => 0, +}; +v2_rt::rc_map_insert(deg_map.clone(), neighbor.clone(), (current.clone() - 1)) +}); +Rc::new(KahnDrainState { + sorted: new_sorted.clone(), + in_degree_map: new_degrees.clone(), +}) +} }); +let new_zero_set = Rc::new({ let mut __result = Vec::new(); for neighbor in Rc::new({ let mut __result = Vec::new(); for node in queue.clone().iter().cloned() { __result.extend((*match v2_rt::map_get(&adjacency, node.clone()) { + Some(ns) => ns.clone(), + None => Rc::new(vec![]), +}).iter().cloned()); } __result }).iter().cloned() { if match v2_rt::map_get(&batch_result.in_degree_map.clone(), neighbor.clone()) { + Some(0) => true, + _ => false, +} { __result.push(neighbor); } } __result }).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, name: String| v2_rt::rc_map_insert(acc, name.clone(), true)); +let new_zero = Rc::new({ let mut __sorted: Vec<_> = Rc::new(v2_rt::map_keys(&new_zero_set)).iter().cloned().collect(); __sorted.sort_by(|a: &String, b: &String| { let __ka = (|name: String| name.clone())(a.clone()); let __kb = (|name: String| name.clone())(b.clone()); __ka.partial_cmp(&__kb).unwrap_or(std::cmp::Ordering::Equal) }); __sorted }); +{ let __tco_0 = new_zero; - let __tco_1 = batch_result.sorted.clone(); - let __tco_2 = batch_result.in_degree_map.clone(); - let __tco_3 = (fuel - 1); - queue = __tco_0; - sorted = __tco_1; - in_degree_map = __tco_2; - fuel = __tco_3; - continue; - } - } +let __tco_1 = batch_result.sorted.clone(); +let __tco_2 = batch_result.in_degree_map.clone(); +let __tco_3 = (fuel - 1); +queue = __tco_0; +sorted = __tco_1; +in_degree_map = __tco_2; +fuel = __tco_3; +continue; +} +} } diff --git a/src/v2/stage0/src/v2_compiler_runtime_rust.rs b/src/v2/stage0/src/v2_compiler_runtime_rust.rs index 5c7fbc9d8fd..7b659e92b96 100644 --- a/src/v2/stage0/src/v2_compiler_runtime_rust.rs +++ b/src/v2/stage0/src/v2_compiler_runtime_rust.rs @@ -1,26 +1,14 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.runtime_rust -use crate::v2_rt; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; pub fn rt_header() -> String { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "//! Runtime shims for v2 compiler intrinsic operations.\n".to_string(), - "//! Generated by the v2 compiler -- do not edit.\n\n".to_string(), - ), - "#![allow(unused_variables, dead_code)]\n\n".to_string(), - ), - "use std::collections::HashMap;\n".to_string(), - ), - "use std::rc::Rc;\n\n".to_string(), - ) + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("//! Runtime shims for v2 compiler intrinsic operations.\n".to_string(), "//! Generated by the v2 compiler -- do not edit.\n\n".to_string()), "#![allow(unused_variables, dead_code)]\n\n".to_string()), "use std::collections::HashMap;\n".to_string()), "use std::rc::Rc;\n\n".to_string()) } pub fn rt_concat_trait() -> String { @@ -40,23 +28,7 @@ pub fn rt_scanner_ops() -> String { } pub fn rt_unicode_ops() -> String { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "pub fn code_point(c: String) -> i64 {\n".to_string(), - " c.chars().next().map(|ch| ch as i64).unwrap_or(0)\n".to_string(), - ), - "}\n\n".to_string(), - ), - "pub fn from_code_point(cp: i64) -> String {\n".to_string(), - ), - " char::from_u32(cp as u32).map(|c| c.to_string()).unwrap_or_default()\n" - .to_string(), - ), - "}\n\n".to_string(), - ) + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("pub fn code_point(c: String) -> i64 {\n".to_string(), " c.chars().next().map(|ch| ch as i64).unwrap_or(0)\n".to_string()), "}\n\n".to_string()), "pub fn from_code_point(cp: i64) -> String {\n".to_string()), " char::from_u32(cp as u32).map(|c| c.to_string()).unwrap_or_default()\n".to_string()), "}\n\n".to_string()) } pub fn rt_rc_container_ops() -> String { @@ -64,53 +36,9 @@ pub fn rt_rc_container_ops() -> String { } pub fn rt_filesystem() -> String { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - "#[derive(Debug, Clone)]\n".to_string(), - "pub struct FilesystemReadResult {\n".to_string(), - ), - " pub content: String,\n".to_string(), - ), - "}\n\n".to_string(), - ), - "pub fn filesystem_read(path: String) -> FilesystemReadResult {\n" - .to_string(), - ), - " let content = std::fs::read_to_string(&path)\n".to_string(), - ), - " .unwrap_or_else(|e| panic!(\"failed to read {}: {}\", path, e));\n" - .to_string(), - ), - " FilesystemReadResult { content }\n".to_string(), - ), - "}\n".to_string(), - ) + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("#[derive(Debug, Clone)]\n".to_string(), "pub struct FilesystemReadResult {\n".to_string()), " pub content: String,\n".to_string()), "}\n\n".to_string()), "pub fn filesystem_read(path: String) -> FilesystemReadResult {\n".to_string()), " let content = std::fs::read_to_string(&path)\n".to_string()), " .unwrap_or_else(|e| panic!(\"failed to read {}: {}\", path, e));\n".to_string()), " FilesystemReadResult { content }\n".to_string()), "}\n".to_string()) } pub fn rust_runtime_source() -> String { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(rt_header(), rt_concat_trait()), - rt_string_ops(), - ), - rt_collection_ops(), - ), - rt_rc_container_ops(), - ), - rt_scanner_ops(), - ), - rt_unicode_ops(), - ), - rt_filesystem(), - ) + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(rt_header(), rt_concat_trait()), rt_string_ops()), rt_collection_ops()), rt_rc_container_ops()), rt_scanner_ops()), rt_unicode_ops()), rt_filesystem()) } diff --git a/src/v2/stage0/src/v2_compiler_tokenize.rs b/src/v2/stage0/src/v2_compiler_tokenize.rs index 843451120d1..74bb7d656f5 100644 --- a/src/v2/stage0/src/v2_compiler_tokenize.rs +++ b/src/v2/stage0/src/v2_compiler_tokenize.rs @@ -1,28 +1,22 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.tokenize -use self::StringScanResult::*; -pub use crate::extdeps_languages_dag_syntax::dag_keyword_set; -pub use crate::std_types::SourceSpan; -use crate::v2_rt; -use crate::v2_std_core::TokenShape::{ - ShAnd, ShArrow, ShBang, ShColon, ShComma, ShDot, ShDotDot, ShEof, ShEq, ShEqEq, ShFatArrow, - ShGe, ShGt, ShIdent, ShKeyword, ShLBrace, ShLBracket, ShLParen, ShLe, ShLitFloat, ShLitInt, - ShLitStr, ShLt, ShMinus, ShNe, ShNewline, ShNullCoalesce, ShOr, ShPercent, ShPipe, ShPipeArrow, - ShPlus, ShQuestion, ShRBrace, ShRBracket, ShRParen, ShSlash, ShStar, ShStrBegin, ShStrEnd, - ShStrMid, ShUnknown, -}; -pub use crate::v2_std_core::{make_file_span, Token, TokenShape}; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::std_types::{SourceSpan}; +pub use crate::v2_std_core::{make_file_span, Token, TokenShape}; +use crate::v2_std_core::TokenShape::{ShKeyword, ShLBrace, ShRBrace, ShLParen, ShRParen, ShLBracket, ShRBracket, ShLt, ShGt, ShLe, ShGe, ShFatArrow, ShArrow, ShColon, ShComma, ShDot, ShDotDot, ShEq, ShEqEq, ShNe, ShPlus, ShMinus, ShStar, ShSlash, ShPercent, ShBang, ShAnd, ShOr, ShQuestion, ShNullCoalesce, ShPipe, ShPipeArrow, ShLitStr, ShLitInt, ShLitFloat, ShIdent, ShStrBegin, ShStrMid, ShStrEnd, ShNewline, ShEof, ShUnknown}; +pub use crate::extdeps_languages_dag_syntax::{dag_keyword_set}; +use self::StringScanResult::*; pub fn is_keyword_text(text: String) -> bool { match v2_rt::lookup(&dag_keyword_set(), text) { - Some(_) => true, - None => false, - } + Some(_) => true, + None => false, +} } pub fn single_punct() -> Rc> { @@ -75,10 +69,10 @@ pub struct SourceRef { pub fn make_token(text: String, span: Rc, shape: TokenShape) -> Rc { Rc::new(Token { - text: text, - span: span, - shape: shape, - }) + text: text, + span: span, + shape: shape, +}) } pub fn source_char(source: Rc, pos: i64) -> String { @@ -93,520 +87,316 @@ pub fn source_substring(source: Rc, start: i64, end: i64) -> String { v2_rt::chars_to_string(&source.source_chars.clone(), start, end) } -pub fn source_scan_while( - mut source: Rc, - mut start: i64, - mut pred: impl Fn(String) -> bool + Clone, -) -> i64 { +pub fn source_scan_while(mut source: Rc, mut start: i64, mut pred: impl Fn(String) -> bool + Clone) -> i64 { loop { if (start.clone() >= source_len(source.clone())) { break source_len(source.clone()); - } else { - if pred(v2_rt::from_code_point( - source.source_chars.clone()[(start.clone()) as usize].clone(), - )) { +} else { + if pred(v2_rt::from_code_point(source.source_chars.clone()[(start.clone()) as usize].clone())) { { let __tco_0 = (start + 1); - start = __tco_0; - continue; - } - } else { +start = __tco_0; +continue; +} +} else { break start.clone(); - } - } - } +} +} +} } pub fn source_skip_ws(mut source: Rc, mut start: i64) -> i64 { loop { if (start.clone() >= source_len(source.clone())) { break start.clone(); - } else { +} else { let ch = source.source_chars.clone()[(start.clone()) as usize].clone(); - if ((ch.clone() == v2_rt::code_point(" ".to_string())) - || (ch.clone() == v2_rt::code_point("\t".to_string()))) - { +if ((ch.clone() == v2_rt::code_point(" ".to_string())) || (ch.clone() == v2_rt::code_point("\t".to_string()))) { { let __tco_0 = (start + 1); - start = __tco_0; - continue; - } - } else { +start = __tco_0; +continue; +} +} else { break start.clone(); - } - } - } +} +} +} } pub fn source_scan_to_eol(mut source: Rc, mut start: i64) -> i64 { loop { if (start.clone() >= source_len(source.clone())) { break source_len(source.clone()); - } else { - if (source.source_chars.clone()[(start.clone()) as usize].clone() - == v2_rt::code_point("\n".to_string())) - { +} else { + if (source.source_chars.clone()[(start.clone()) as usize].clone() == v2_rt::code_point("\n".to_string())) { break start.clone(); - } else { +} else { { let __tco_0 = (start + 1); - start = __tco_0; - continue; - } - } - } - } +start = __tco_0; +continue; +} +} +} +} } pub fn tokenize(source: &String, file: String) -> Rc>> { { let c = Rc::new(source.clone().chars().map(|c| c as i64).collect::>()); - let src = Rc::new(SourceRef { - file: file, - text: source.clone(), - source_chars: c, - }); - let initial = Rc::new(TokPos { - pos: 0, - interp_depth: Rc::new(vec![]), - }); - let final_state = tokenize_loop( - src.clone(), - Rc::new(vec![]), - initial, - (source_len(src.clone()) + 1), - ); - let eof_span = make_file_span( - src.file.clone(), - final_state.pos.clone(), - final_state.pos.clone(), - ); - v2_rt::rc_list_push( - final_state.tokens.clone(), - make_token("".to_string(), eof_span, TokenShape::ShEof), - ) - } +let src = Rc::new(SourceRef { + file: file, + text: source.clone(), + source_chars: c, +}); +let initial = Rc::new(TokPos { + pos: 0, + interp_depth: Rc::new(vec![]), +}); +let final_state = tokenize_loop(src.clone(), Rc::new(vec![]), initial, (source_len(src.clone()) + 1)); +let eof_span = make_file_span(src.file.clone(), final_state.pos.clone(), final_state.pos.clone()); +v2_rt::rc_list_push(final_state.tokens.clone(), make_token("".to_string(), eof_span, TokenShape::ShEof)) +} } pub fn scan_next_token(source: &Rc, pos: &Rc) -> Rc { { let ch = source_char(source.clone(), pos.pos.clone()); - if (ch.clone().as_str() == "\n".to_string().as_str()) { +if (ch.clone().as_str() == "\n".to_string().as_str()) { return Rc::new(ScanResult { - pos: (pos.pos.clone() + 1), - token: make_token( - "\n".to_string(), - make_file_span(source.file.clone(), pos.pos.clone(), (pos.pos.clone() + 1)), - TokenShape::ShNewline, - ), - interp_depth: pos.interp_depth.clone(), - }); + pos: (pos.pos.clone() + 1), + token: make_token("\n".to_string(), make_file_span(source.file.clone(), pos.pos.clone(), (pos.pos.clone() + 1)), TokenShape::ShNewline), + interp_depth: pos.interp_depth.clone(), +}) } - if ((ch.clone().as_str() == "}".to_string().as_str()) - && ((pos.interp_depth.clone().len() as i64) > 0)) - { +if ((ch.clone().as_str() == "}".to_string().as_str()) && ((pos.interp_depth.clone().len() as i64) > 0)) { { let top = pos.interp_depth.clone().last().cloned().clone().unwrap(); - if (top.clone() == 0) { +if (top.clone() == 0) { { let popped = drop_last(&pos.interp_depth.clone()); - let cont_pos = Rc::new(TokPos { - pos: (pos.pos.clone() + 1), - interp_depth: popped, - }); - return scan_str_cont(&source, &cont_pos, pos.pos.clone()); - } +let cont_pos = Rc::new(TokPos { + pos: (pos.pos.clone() + 1), + interp_depth: popped, +}); +return scan_str_cont(&source, &cont_pos, pos.pos.clone()) +} } else { return Rc::new(ScanResult { - pos: (pos.pos.clone() + 1), - token: make_token( - "}".to_string(), - make_file_span( - source.file.clone(), - pos.pos.clone(), - (pos.pos.clone() + 1), - ), - TokenShape::ShRBrace, - ), - interp_depth: replace_last(pos.interp_depth.clone(), (top.clone() - 1)), - }); + pos: (pos.pos.clone() + 1), + token: make_token("}".to_string(), make_file_span(source.file.clone(), pos.pos.clone(), (pos.pos.clone() + 1)), TokenShape::ShRBrace), + interp_depth: replace_last(pos.interp_depth.clone(), (top.clone() - 1)), +}) } - } +} } - scan_token(&source, &pos, &ch) - } +scan_token(&source, &pos, &ch) +} } -pub fn tokenize_loop( - mut source: Rc, - mut tokens: Rc>>, - mut pos: Rc, - mut fuel: i64, -) -> Rc { +pub fn tokenize_loop(mut source: Rc, mut tokens: Rc>>, mut pos: Rc, mut fuel: i64) -> Rc { loop { let s = skip_spaces_and_comments(source.clone(), pos, fuel.clone()); - if (s.pos.clone() >= source_len(source.clone())) { +if (s.pos.clone() >= source_len(source.clone())) { return Rc::new(TokenizerState { - pos: s.pos.clone(), - tokens: tokens.clone(), - interp_depth: s.interp_depth.clone(), - }); + pos: s.pos.clone(), + tokens: tokens.clone(), + interp_depth: s.interp_depth.clone(), +}) } - let result = scan_next_token(&source, &s); - { +let result = scan_next_token(&source, &s); +{ let __tco_0 = v2_rt::rc_list_push(tokens, result.token.clone()); - let __tco_1 = Rc::new(TokPos { - pos: result.pos.clone(), - interp_depth: result.interp_depth.clone(), - }); - let __tco_2 = (fuel - 1); - tokens = __tco_0; - pos = __tco_1; - fuel = __tco_2; - continue; - } - } +let __tco_1 = Rc::new(TokPos { + pos: result.pos.clone(), + interp_depth: result.interp_depth.clone(), +}); +let __tco_2 = (fuel - 1); +tokens = __tco_0; +pos = __tco_1; +fuel = __tco_2; +continue; +} +} } pub fn scan_token(source: &Rc, pos: &Rc, ch: &String) -> Rc { { if (ch.clone().as_str() == "\"".to_string().as_str()) { - return scan_string(&source, &pos); + return scan_string(&source, &pos) } - if is_digit(ch.clone()) { - return scan_number(&source, &pos); +if is_digit(ch.clone()) { + return scan_number(&source, &pos) } - if is_ident_start(&ch) { - return scan_ident(&source, &pos); +if is_ident_start(&ch) { + return scan_ident(&source, &pos) } - let next_ch = if ((pos.pos.clone() + 1) < source_len(source.clone())) { +let next_ch = if ((pos.pos.clone() + 1) < source_len(source.clone())) { source_char(source.clone(), (pos.pos.clone() + 1)) } else { "".to_string() }; - if ((ch.clone().as_str() == "=".to_string().as_str()) - && (next_ch.clone().as_str() == ">".to_string().as_str())) - { - return emit( - &pos, - TokenShape::ShFatArrow, - "=>".to_string(), - 2, - source.file.clone(), - ); +if ((ch.clone().as_str() == "=".to_string().as_str()) && (next_ch.clone().as_str() == ">".to_string().as_str())) { + return emit(&pos, TokenShape::ShFatArrow, "=>".to_string(), 2, source.file.clone()) } - if ((ch.clone().as_str() == "-".to_string().as_str()) - && (next_ch.clone().as_str() == ">".to_string().as_str())) - { - return emit( - &pos, - TokenShape::ShArrow, - "->".to_string(), - 2, - source.file.clone(), - ); +if ((ch.clone().as_str() == "-".to_string().as_str()) && (next_ch.clone().as_str() == ">".to_string().as_str())) { + return emit(&pos, TokenShape::ShArrow, "->".to_string(), 2, source.file.clone()) } - if ((ch.clone().as_str() == "=".to_string().as_str()) - && (next_ch.clone().as_str() == "=".to_string().as_str())) - { - return emit( - &pos, - TokenShape::ShEqEq, - "==".to_string(), - 2, - source.file.clone(), - ); +if ((ch.clone().as_str() == "=".to_string().as_str()) && (next_ch.clone().as_str() == "=".to_string().as_str())) { + return emit(&pos, TokenShape::ShEqEq, "==".to_string(), 2, source.file.clone()) } - if ((ch.clone().as_str() == "!".to_string().as_str()) - && (next_ch.clone().as_str() == "=".to_string().as_str())) - { - return emit( - &pos, - TokenShape::ShNe, - "!=".to_string(), - 2, - source.file.clone(), - ); +if ((ch.clone().as_str() == "!".to_string().as_str()) && (next_ch.clone().as_str() == "=".to_string().as_str())) { + return emit(&pos, TokenShape::ShNe, "!=".to_string(), 2, source.file.clone()) } - if ((ch.clone().as_str() == "<".to_string().as_str()) - && (next_ch.clone().as_str() == "=".to_string().as_str())) - { - return emit( - &pos, - TokenShape::ShLe, - "<=".to_string(), - 2, - source.file.clone(), - ); +if ((ch.clone().as_str() == "<".to_string().as_str()) && (next_ch.clone().as_str() == "=".to_string().as_str())) { + return emit(&pos, TokenShape::ShLe, "<=".to_string(), 2, source.file.clone()) } - if ((ch.clone().as_str() == ">".to_string().as_str()) - && (next_ch.clone().as_str() == "=".to_string().as_str())) - { - return emit( - &pos, - TokenShape::ShGe, - ">=".to_string(), - 2, - source.file.clone(), - ); +if ((ch.clone().as_str() == ">".to_string().as_str()) && (next_ch.clone().as_str() == "=".to_string().as_str())) { + return emit(&pos, TokenShape::ShGe, ">=".to_string(), 2, source.file.clone()) } - if ((ch.clone().as_str() == "&".to_string().as_str()) - && (next_ch.clone().as_str() == "&".to_string().as_str())) - { - return emit( - &pos, - TokenShape::ShAnd, - "&&".to_string(), - 2, - source.file.clone(), - ); +if ((ch.clone().as_str() == "&".to_string().as_str()) && (next_ch.clone().as_str() == "&".to_string().as_str())) { + return emit(&pos, TokenShape::ShAnd, "&&".to_string(), 2, source.file.clone()) } - if ((ch.clone().as_str() == "|".to_string().as_str()) - && (next_ch.clone().as_str() == "|".to_string().as_str())) - { - return emit( - &pos, - TokenShape::ShOr, - "||".to_string(), - 2, - source.file.clone(), - ); +if ((ch.clone().as_str() == "|".to_string().as_str()) && (next_ch.clone().as_str() == "|".to_string().as_str())) { + return emit(&pos, TokenShape::ShOr, "||".to_string(), 2, source.file.clone()) } - if ((ch.clone().as_str() == "|".to_string().as_str()) - && (next_ch.clone().as_str() == ">".to_string().as_str())) - { - return emit( - &pos, - TokenShape::ShPipeArrow, - "|>".to_string(), - 2, - source.file.clone(), - ); +if ((ch.clone().as_str() == "|".to_string().as_str()) && (next_ch.clone().as_str() == ">".to_string().as_str())) { + return emit(&pos, TokenShape::ShPipeArrow, "|>".to_string(), 2, source.file.clone()) } - if (ch.clone().as_str() == "|".to_string().as_str()) { - return emit( - &pos, - TokenShape::ShPipe, - "|".to_string(), - 1, - source.file.clone(), - ); +if (ch.clone().as_str() == "|".to_string().as_str()) { + return emit(&pos, TokenShape::ShPipe, "|".to_string(), 1, source.file.clone()) } - if ((ch.clone().as_str() == "?".to_string().as_str()) - && (next_ch.clone().as_str() == "?".to_string().as_str())) - { - return emit( - &pos, - TokenShape::ShNullCoalesce, - "??".to_string(), - 2, - source.file.clone(), - ); +if ((ch.clone().as_str() == "?".to_string().as_str()) && (next_ch.clone().as_str() == "?".to_string().as_str())) { + return emit(&pos, TokenShape::ShNullCoalesce, "??".to_string(), 2, source.file.clone()) } - if ((ch.clone().as_str() == ".".to_string().as_str()) - && (next_ch.clone().as_str() == ".".to_string().as_str())) - { - return emit( - &pos, - TokenShape::ShDotDot, - "..".to_string(), - 2, - source.file.clone(), - ); +if ((ch.clone().as_str() == ".".to_string().as_str()) && (next_ch.clone().as_str() == ".".to_string().as_str())) { + return emit(&pos, TokenShape::ShDotDot, "..".to_string(), 2, source.file.clone()) } - if (ch.clone().as_str() == "=".to_string().as_str()) { - return emit( - &pos, - TokenShape::ShEq, - "=".to_string(), - 1, - source.file.clone(), - ); +if (ch.clone().as_str() == "=".to_string().as_str()) { + return emit(&pos, TokenShape::ShEq, "=".to_string(), 1, source.file.clone()) } - if (ch.clone().as_str() == "<".to_string().as_str()) { - return emit( - &pos, - TokenShape::ShLt, - "<".to_string(), - 1, - source.file.clone(), - ); +if (ch.clone().as_str() == "<".to_string().as_str()) { + return emit(&pos, TokenShape::ShLt, "<".to_string(), 1, source.file.clone()) } - if (ch.clone().as_str() == ">".to_string().as_str()) { - return emit( - &pos, - TokenShape::ShGt, - ">".to_string(), - 1, - source.file.clone(), - ); +if (ch.clone().as_str() == ">".to_string().as_str()) { + return emit(&pos, TokenShape::ShGt, ">".to_string(), 1, source.file.clone()) } - if (ch.clone().as_str() == "-".to_string().as_str()) { - return emit( - &pos, - TokenShape::ShMinus, - "-".to_string(), - 1, - source.file.clone(), - ); +if (ch.clone().as_str() == "-".to_string().as_str()) { + return emit(&pos, TokenShape::ShMinus, "-".to_string(), 1, source.file.clone()) } - if (ch.clone().as_str() == "!".to_string().as_str()) { - return emit( - &pos, - TokenShape::ShBang, - "!".to_string(), - 1, - source.file.clone(), - ); +if (ch.clone().as_str() == "!".to_string().as_str()) { + return emit(&pos, TokenShape::ShBang, "!".to_string(), 1, source.file.clone()) } - if (ch.clone().as_str() == "?".to_string().as_str()) { - return emit( - &pos, - TokenShape::ShQuestion, - "?".to_string(), - 1, - source.file.clone(), - ); +if (ch.clone().as_str() == "?".to_string().as_str()) { + return emit(&pos, TokenShape::ShQuestion, "?".to_string(), 1, source.file.clone()) } - if (ch.clone().as_str() == "{".to_string().as_str()) { +if (ch.clone().as_str() == "{".to_string().as_str()) { { let new_depth = if ((pos.interp_depth.clone().len() as i64) > 0) { - replace_last( - pos.interp_depth.clone(), - (pos.interp_depth.clone().last().cloned().clone().unwrap() + 1), - ) + replace_last(pos.interp_depth.clone(), (pos.interp_depth.clone().last().cloned().clone().unwrap() + 1)) } else { pos.interp_depth.clone() }; - let tok = make_token( - "{".to_string(), - make_file_span(source.file.clone(), pos.pos.clone(), (pos.pos.clone() + 1)), - TokenShape::ShLBrace, - ); - return Rc::new(ScanResult { - pos: (pos.pos.clone() + 1), - token: tok.clone(), - interp_depth: new_depth, - }); - } +let tok = make_token("{".to_string(), make_file_span(source.file.clone(), pos.pos.clone(), (pos.pos.clone() + 1)), TokenShape::ShLBrace); +return Rc::new(ScanResult { + pos: (pos.pos.clone() + 1), + token: tok.clone(), + interp_depth: new_depth, +}) +} } - if (ch.clone().as_str() == "}".to_string().as_str()) { +if (ch.clone().as_str() == "}".to_string().as_str()) { { - let tok = make_token( - "}".to_string(), - make_file_span(source.file.clone(), pos.pos.clone(), (pos.pos.clone() + 1)), - TokenShape::ShRBrace, - ); - return Rc::new(ScanResult { - pos: (pos.pos.clone() + 1), - token: tok.clone(), - interp_depth: pos.interp_depth.clone(), - }); - } - } - match v2_rt::lookup(&single_punct(), ch.clone()) { - Some(sh) => emit(&pos, sh.clone(), ch.clone(), 1, source.file.clone()), - None => emit( - &pos, - TokenShape::ShUnknown, - ch.clone(), - 1, - source.file.clone(), - ), + let tok = make_token("}".to_string(), make_file_span(source.file.clone(), pos.pos.clone(), (pos.pos.clone() + 1)), TokenShape::ShRBrace); +return Rc::new(ScanResult { + pos: (pos.pos.clone() + 1), + token: tok.clone(), + interp_depth: pos.interp_depth.clone(), +}) +} } - } +match v2_rt::lookup(&single_punct(), ch.clone()) { + Some(sh) => emit(&pos, sh.clone(), ch.clone(), 1, source.file.clone()), + None => emit(&pos, TokenShape::ShUnknown, ch.clone(), 1, source.file.clone()), +} +} } -pub fn emit( - pos: &Rc, - shape: TokenShape, - text: String, - len: i64, - file: String, -) -> Rc { +pub fn emit(pos: &Rc, shape: TokenShape, text: String, len: i64, file: String) -> Rc { { - let token = make_token( - text, - make_file_span(file, pos.pos.clone(), (pos.pos.clone() + len.clone())), - shape, - ); - Rc::new(ScanResult { - pos: (pos.pos.clone() + len.clone()), - token: token, - interp_depth: pos.interp_depth.clone(), - }) - } + let token = make_token(text, make_file_span(file, pos.pos.clone(), (pos.pos.clone() + len.clone())), shape); +Rc::new(ScanResult { + pos: (pos.pos.clone() + len.clone()), + token: token, + interp_depth: pos.interp_depth.clone(), +}) +} } pub fn scan_ident(source: &Rc, pos: &Rc) -> Rc { { let end = source_scan_while(source.clone(), pos.pos.clone(), is_ident_char); - let text = source_substring(source.clone(), pos.pos.clone(), end.clone()); - let shape = if is_keyword_text(text.clone()) { +let text = source_substring(source.clone(), pos.pos.clone(), end.clone()); +let shape = if is_keyword_text(text.clone()) { TokenShape::ShKeyword } else { TokenShape::ShIdent }; - let token = make_token( - text.clone(), - make_file_span(source.file.clone(), pos.pos.clone(), end.clone()), - shape, - ); - Rc::new(ScanResult { - pos: end.clone(), - token: token, - interp_depth: pos.interp_depth.clone(), - }) - } +let token = make_token(text.clone(), make_file_span(source.file.clone(), pos.pos.clone(), end.clone()), shape); +Rc::new(ScanResult { + pos: end.clone(), + token: token, + interp_depth: pos.interp_depth.clone(), +}) +} } pub fn scan_number(source: &Rc, pos: &Rc) -> Rc { { let int_end = source_scan_while(source.clone(), pos.pos.clone(), is_digit); - if ((((int_end.clone() + 1) < source_len(source.clone())) - && (source_char(source.clone(), int_end.clone()).as_str() == ".".to_string().as_str())) - && is_digit(source_char(source.clone(), (int_end.clone() + 1)))) - { +if ((((int_end.clone() + 1) < source_len(source.clone())) && (source_char(source.clone(), int_end.clone()).as_str() == ".".to_string().as_str())) && is_digit(source_char(source.clone(), (int_end.clone() + 1)))) { { let frac_end = source_scan_while(source.clone(), (int_end.clone() + 1), is_digit); - let text = source_substring(source.clone(), pos.pos.clone(), frac_end.clone()); - let token = make_token( - text.clone(), - make_file_span(source.file.clone(), pos.pos.clone(), frac_end.clone()), - TokenShape::ShLitFloat, - ); - return Rc::new(ScanResult { - pos: frac_end.clone(), - token: token.clone(), - interp_depth: pos.interp_depth.clone(), - }); - } - } - let text = source_substring(source.clone(), pos.pos.clone(), int_end.clone()); - let parsed = v2_rt::parse_int(text.clone()); - let shape = match parsed { - Some(_) => TokenShape::ShLitInt, - None => TokenShape::ShUnknown, - }; - let token = make_token( - text.clone(), - make_file_span(source.file.clone(), pos.pos.clone(), int_end.clone()), - shape, - ); - Rc::new(ScanResult { - pos: int_end.clone(), - token: token.clone(), - interp_depth: pos.interp_depth.clone(), - }) - } +let text = source_substring(source.clone(), pos.pos.clone(), frac_end.clone()); +let token = make_token(text.clone(), make_file_span(source.file.clone(), pos.pos.clone(), frac_end.clone()), TokenShape::ShLitFloat); +return Rc::new(ScanResult { + pos: frac_end.clone(), + token: token.clone(), + interp_depth: pos.interp_depth.clone(), +}) +} + } +let text = source_substring(source.clone(), pos.pos.clone(), int_end.clone()); +let parsed = v2_rt::parse_int(text.clone()); +let shape = match parsed { + Some(_) => TokenShape::ShLitInt, + None => TokenShape::ShUnknown, +}; +let token = make_token(text.clone(), make_file_span(source.file.clone(), pos.pos.clone(), int_end.clone()), shape); +Rc::new(ScanResult { + pos: int_end.clone(), + token: token.clone(), + interp_depth: pos.interp_depth.clone(), +}) +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum StringScanResult { - ClosedString { content: String, end_pos: i64 }, - InterpolationStart { content: String, end_pos: i64 }, - UnterminatedString { content: String, end_pos: i64 }, + ClosedString { + content: String, + end_pos: i64, + }, + InterpolationStart { + content: String, + end_pos: i64, + }, + UnterminatedString { + content: String, + end_pos: i64, + }, } impl StringScanResult { pub fn content(&self) -> String { @@ -628,179 +418,135 @@ impl StringScanResult { pub fn scan_string(source: &Rc, pos: &Rc) -> Rc { { let span_start = pos.pos.clone(); - let body_start = (pos.pos.clone() + 1); - let result = scan_string_body(source.clone(), body_start, Rc::new(vec![])); - match (*result).clone() { - StringScanResult::ClosedString { - content, end_pos, .. - } => { - let processed = process_escapes(content.clone()); - let token = make_token( - processed, - make_file_span(source.file.clone(), span_start, (end_pos.clone() + 1)), - TokenShape::ShLitStr, - ); - Rc::new(ScanResult { - pos: (end_pos.clone() + 1), - token: token, - interp_depth: pos.interp_depth.clone(), - }) - } - StringScanResult::InterpolationStart { - content, end_pos, .. - } => { - let processed = process_escapes(content.clone()); - let token = make_token( - processed, - make_file_span(source.file.clone(), span_start, (end_pos.clone() + 1)), - TokenShape::ShStrBegin, - ); - Rc::new(ScanResult { - pos: (end_pos.clone() + 1), - token: token, - interp_depth: Rc::new(v2_rt::append(pos.interp_depth.clone(), 0)), - }) - } - StringScanResult::UnterminatedString { - content, end_pos, .. - } => { - let processed = process_escapes(content.clone()); - let token = make_token( - processed, - make_file_span(source.file.clone(), span_start, end_pos.clone()), - TokenShape::ShUnknown, - ); - Rc::new(ScanResult { - pos: end_pos.clone(), - token: token, - interp_depth: pos.interp_depth.clone(), - }) - } - } - } +let body_start = (pos.pos.clone() + 1); +let result = scan_string_body(source.clone(), body_start, Rc::new(vec![])); +match (*result).clone() { + StringScanResult::ClosedString { content, end_pos, .. } => { + let processed = process_escapes(content.clone()); +let token = make_token(processed, make_file_span(source.file.clone(), span_start, (end_pos.clone() + 1)), TokenShape::ShLitStr); +Rc::new(ScanResult { + pos: (end_pos.clone() + 1), + token: token, + interp_depth: pos.interp_depth.clone(), +}) +}, + StringScanResult::InterpolationStart { content, end_pos, .. } => { + let processed = process_escapes(content.clone()); +let token = make_token(processed, make_file_span(source.file.clone(), span_start, (end_pos.clone() + 1)), TokenShape::ShStrBegin); +Rc::new(ScanResult { + pos: (end_pos.clone() + 1), + token: token, + interp_depth: Rc::new(v2_rt::append(pos.interp_depth.clone(), 0)), +}) +}, + StringScanResult::UnterminatedString { content, end_pos, .. } => { + let processed = process_escapes(content.clone()); +let token = make_token(processed, make_file_span(source.file.clone(), span_start, end_pos.clone()), TokenShape::ShUnknown); +Rc::new(ScanResult { + pos: end_pos.clone(), + token: token, + interp_depth: pos.interp_depth.clone(), +}) +}, +} +} } pub fn scan_str_cont(source: &Rc, pos: &Rc, span_start: i64) -> Rc { { let result = scan_string_body(source.clone(), pos.pos.clone(), Rc::new(vec![])); - match (*result).clone() { - StringScanResult::ClosedString { - content, end_pos, .. - } => { - let processed = process_escapes(content.clone()); - let token = make_token( - processed, - make_file_span(source.file.clone(), span_start, (end_pos.clone() + 1)), - TokenShape::ShStrEnd, - ); - Rc::new(ScanResult { - pos: (end_pos.clone() + 1), - token: token, - interp_depth: pos.interp_depth.clone(), - }) - } - StringScanResult::InterpolationStart { - content, end_pos, .. - } => { - let processed = process_escapes(content.clone()); - let token = make_token( - processed, - make_file_span(source.file.clone(), span_start, (end_pos.clone() + 1)), - TokenShape::ShStrMid, - ); - Rc::new(ScanResult { - pos: (end_pos.clone() + 1), - token: token, - interp_depth: Rc::new(v2_rt::append(pos.interp_depth.clone(), 0)), - }) - } - StringScanResult::UnterminatedString { - content, end_pos, .. - } => { - let processed = process_escapes(content.clone()); - let token = make_token( - processed, - make_file_span(source.file.clone(), span_start, end_pos.clone()), - TokenShape::ShUnknown, - ); - Rc::new(ScanResult { - pos: end_pos.clone(), - token: token, - interp_depth: pos.interp_depth.clone(), - }) - } - } - } -} - -pub fn scan_string_body( - mut source: Rc, - mut pos: i64, - mut acc: Rc>, -) -> Rc { +match (*result).clone() { + StringScanResult::ClosedString { content, end_pos, .. } => { + let processed = process_escapes(content.clone()); +let token = make_token(processed, make_file_span(source.file.clone(), span_start, (end_pos.clone() + 1)), TokenShape::ShStrEnd); +Rc::new(ScanResult { + pos: (end_pos.clone() + 1), + token: token, + interp_depth: pos.interp_depth.clone(), +}) +}, + StringScanResult::InterpolationStart { content, end_pos, .. } => { + let processed = process_escapes(content.clone()); +let token = make_token(processed, make_file_span(source.file.clone(), span_start, (end_pos.clone() + 1)), TokenShape::ShStrMid); +Rc::new(ScanResult { + pos: (end_pos.clone() + 1), + token: token, + interp_depth: Rc::new(v2_rt::append(pos.interp_depth.clone(), 0)), +}) +}, + StringScanResult::UnterminatedString { content, end_pos, .. } => { + let processed = process_escapes(content.clone()); +let token = make_token(processed, make_file_span(source.file.clone(), span_start, end_pos.clone()), TokenShape::ShUnknown); +Rc::new(ScanResult { + pos: end_pos.clone(), + token: token, + interp_depth: pos.interp_depth.clone(), +}) +}, +} +} +} + +pub fn scan_string_body(mut source: Rc, mut pos: i64, mut acc: Rc>) -> Rc { loop { if (pos.clone() >= source_len(source.clone())) { break Rc::new(StringScanResult::UnterminatedString { - content: acc.join(&"".to_string()), - end_pos: pos.clone(), - }); - } else { + content: acc.join(&"".to_string()), + end_pos: pos.clone(), +}); +} else { let ch = source_char(source.clone(), pos.clone()); - if (ch.clone().as_str() == "\"".to_string().as_str()) { +if (ch.clone().as_str() == "\"".to_string().as_str()) { break Rc::new(StringScanResult::ClosedString { - content: acc.join(&"".to_string()), - end_pos: pos.clone(), - }); - } else { + content: acc.join(&"".to_string()), + end_pos: pos.clone(), +}); +} else { if (ch.clone().as_str() == "\\".to_string().as_str()) { if ((pos.clone() + 1) < source_len(source.clone())) { let escaped = source_char(source.clone(), (pos.clone() + 1)); - { +{ let __tco_0 = (pos + 2); - let __tco_1 = v2_rt::rc_list_push( - v2_rt::rc_list_push(acc, "\\".to_string()), - escaped, - ); - pos = __tco_0; - acc = __tco_1; - continue; - } - } else { +let __tco_1 = v2_rt::rc_list_push(v2_rt::rc_list_push(acc, "\\".to_string()), escaped); +pos = __tco_0; +acc = __tco_1; +continue; +} +} else { break Rc::new(StringScanResult::UnterminatedString { - content: v2_rt::rc_list_push(acc, "\\".to_string()) - .join(&"".to_string()), - end_pos: (pos.clone() + 1), - }); - } - } else { + content: v2_rt::rc_list_push(acc, "\\".to_string()).join(&"".to_string()), + end_pos: (pos.clone() + 1), +}); +} +} else { if (ch.clone().as_str() == "{".to_string().as_str()) { if should_start_interpolation(&source, pos.clone()) { break Rc::new(StringScanResult::InterpolationStart { - content: acc.join(&"".to_string()), - end_pos: pos.clone(), - }); - } else { + content: acc.join(&"".to_string()), + end_pos: pos.clone(), +}); +} else { { let __tco_0 = (pos + 1); - let __tco_1 = v2_rt::rc_list_push(acc, "{".to_string()); - pos = __tco_0; - acc = __tco_1; - continue; - } - } - } else { +let __tco_1 = v2_rt::rc_list_push(acc, "{".to_string()); +pos = __tco_0; +acc = __tco_1; +continue; +} +} +} else { { let __tco_0 = (pos + 1); - let __tco_1 = v2_rt::rc_list_push(acc, ch.clone()); - pos = __tco_0; - acc = __tco_1; - continue; - } - } - } - } - } - } +let __tco_1 = v2_rt::rc_list_push(acc, ch.clone()); +pos = __tco_0; +acc = __tco_1; +continue; +} +} +} +} +} +} } pub fn should_start_interpolation(source: &Rc, pos: i64) -> bool { @@ -809,10 +555,8 @@ pub fn should_start_interpolation(source: &Rc, pos: i64) -> bool { } else { { let next = source_char(source.clone(), (pos.clone() + 1)); - (((is_ident_start(&next) || (next.clone().as_str() == "(".to_string().as_str())) - || (next.clone().as_str() == "!".to_string().as_str())) - || (next.clone().as_str() == "-".to_string().as_str())) - } +(((is_ident_start(&next) || (next.clone().as_str() == "(".to_string().as_str())) || (next.clone().as_str() == "!".to_string().as_str())) || (next.clone().as_str() == "-".to_string().as_str())) +} } } @@ -824,13 +568,11 @@ pub fn process_escapes_loop(mut source: String, mut pos: i64, mut acc: Rc= v2_rt::string_length(&source)) { break acc.join(&"".to_string()); - } else { +} else { let ch = v2_rt::char_at(&source, pos.clone()); - if ((ch.clone().as_str() == "\\".to_string().as_str()) - && ((pos.clone() + 1) < v2_rt::string_length(&source))) - { +if ((ch.clone().as_str() == "\\".to_string().as_str()) && ((pos.clone() + 1) < v2_rt::string_length(&source))) { let next = v2_rt::char_at(&source, (pos.clone() + 1)); - let resolved = if (next.clone().as_str() == "\"".to_string().as_str()) { +let resolved = if (next.clone().as_str() == "\"".to_string().as_str()) { "\"".to_string() } else { if (next.clone().as_str() == "\\".to_string().as_str()) { @@ -855,85 +597,61 @@ pub fn process_escapes_loop(mut source: String, mut pos: i64, mut acc: Rc>) -> Rc> { { let len = (stack.clone().len() as i64); - Rc::new( - stack - .clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - .fold(Rc::new(vec![]), |result: Rc>, pair: (i64, i64)| { - if (pair.0.clone() < (len.clone() - 1)) { - Rc::new(v2_rt::append(result.clone(), pair.1.clone())) - } else { - result.clone() - } +Rc::new(stack.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned().fold(Rc::new(vec![]), |result: Rc>, pair: (i64, i64)| if (pair.0.clone() < (len.clone() - 1)) { + Rc::new(v2_rt::append(result.clone(), pair.1.clone())) + } else { + result.clone() }) - } +} } pub fn replace_last(stack: Rc>, value: i64) -> Rc> { { let prefix = drop_last(&stack); - Rc::new(v2_rt::append(prefix, value)) - } +Rc::new(v2_rt::append(prefix, value)) +} } -pub fn skip_spaces_and_comments( - mut source: Rc, - mut pos: Rc, - mut fuel: i64, -) -> Rc { +pub fn skip_spaces_and_comments(mut source: Rc, mut pos: Rc, mut fuel: i64) -> Rc { loop { let p = source_skip_ws(source.clone(), pos.pos.clone()); - if ((((p.clone() + 1) < source_len(source.clone())) - && (source_char(source.clone(), p.clone()).as_str() == "/".to_string().as_str())) - && (source_char(source.clone(), (p.clone() + 1)).as_str() == "/".to_string().as_str())) - { +if ((((p.clone() + 1) < source_len(source.clone())) && (source_char(source.clone(), p.clone()).as_str() == "/".to_string().as_str())) && (source_char(source.clone(), (p.clone() + 1)).as_str() == "/".to_string().as_str())) { { let eol = source_scan_to_eol(source.clone(), p.clone()); - return skip_spaces_and_comments( - source.clone(), - Rc::new(TokPos { - pos: eol, - interp_depth: pos.interp_depth.clone(), - }), - (fuel - 1), - ); - } +return skip_spaces_and_comments(source.clone(), Rc::new(TokPos { + pos: eol, + interp_depth: pos.interp_depth.clone(), +}), (fuel - 1)) +} } - break Rc::new(TokPos { - pos: p.clone(), - interp_depth: pos.interp_depth.clone(), - }); - } +break Rc::new(TokPos { + pos: p.clone(), + interp_depth: pos.interp_depth.clone(), +}); +} } pub fn is_digit(ch: String) -> bool { @@ -941,9 +659,7 @@ pub fn is_digit(ch: String) -> bool { } pub fn is_ident_start(ch: &String) -> bool { - ((((ch.clone() >= "a".to_string()) && (ch.clone() <= "z".to_string())) - || ((ch.clone() >= "A".to_string()) && (ch.clone() <= "Z".to_string()))) - || (ch.clone().as_str() == "_".to_string().as_str())) + ((((ch.clone() >= "a".to_string()) && (ch.clone() <= "z".to_string())) || ((ch.clone() >= "A".to_string()) && (ch.clone() <= "Z".to_string()))) || (ch.clone().as_str() == "_".to_string().as_str())) } pub fn is_ident_char(ch: String) -> bool { diff --git a/src/v2/stage0/src/v2_compiler_trace.rs b/src/v2/stage0/src/v2_compiler_trace.rs index 33e848a24bd..5fe94ef6c4b 100644 --- a/src/v2/stage0/src/v2_compiler_trace.rs +++ b/src/v2/stage0/src/v2_compiler_trace.rs @@ -1,14 +1,14 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.trace -use self::TraceEvent::*; -use self::TraceFilter::*; -use crate::v2_rt; -pub use crate::v2_std_core::SourceSpan; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; use std::collections::HashMap; use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::v2_std_core::{SourceSpan}; +use self::TraceEvent::*; +use self::TraceFilter::*; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] pub struct SpanMapping { @@ -67,193 +67,103 @@ pub struct Trace { pub fn empty_trace() -> Rc { Rc::new(Trace { - events: Rc::new(vec![]), - stack: Rc::new(vec![]), - }) + events: Rc::new(vec![]), + stack: Rc::new(vec![]), +}) } pub fn trace_push_event(trace: &Rc, event: Rc) -> Rc { Rc::new(Trace { - events: v2_rt::rc_list_push(trace.events.clone(), event), - stack: trace.stack.clone(), - }) + events: v2_rt::rc_list_push(trace.events.clone(), event), + stack: trace.stack.clone(), +}) } pub fn trace_push_frame(trace: &Rc, frame: Rc) -> Rc { Rc::new(Trace { - events: trace.events.clone(), - stack: v2_rt::rc_list_push(trace.stack.clone(), frame), - }) + events: trace.events.clone(), + stack: v2_rt::rc_list_push(trace.stack.clone(), frame), +}) } pub fn trace_pop_frame(trace: &Rc) -> Rc { { let n = (trace.stack.clone().len() as i64); - if (n.clone() <= 1) { +if (n.clone() <= 1) { Rc::new(Trace { - events: trace.events.clone(), - stack: Rc::new(vec![]), - }) + events: trace.events.clone(), + stack: Rc::new(vec![]), +}) } else { Rc::new(Trace { - events: trace.events.clone(), - stack: Rc::new( - trace - .stack - .clone() - .iter() - .cloned() - .take((n.clone() - 1) as usize) - .collect::>(), - ), - }) + events: trace.events.clone(), + stack: Rc::new(trace.stack.clone().iter().cloned().take((n.clone() - 1) as usize).collect::>()), +}) } - } +} } pub fn event_span(event: Rc) -> Rc { match (*event).clone() { - TraceEvent::TraceEnter { span: s, .. } => s.clone(), - TraceEvent::TraceExit { span: s, .. } => s.clone(), - TraceEvent::TraceError { span: s, .. } => s.clone(), - } + TraceEvent::TraceEnter { span: s, .. } => s.clone(), + TraceEvent::TraceExit { span: s, .. } => s.clone(), + TraceEvent::TraceError { span: s, .. } => s.clone(), +} } pub fn event_node_id(event: Rc) -> String { match (*event).clone() { - TraceEvent::TraceEnter { node_id: id, .. } => id.clone(), - TraceEvent::TraceExit { node_id: id, .. } => id.clone(), - TraceEvent::TraceError { node_id: id, .. } => id.clone(), - } + TraceEvent::TraceEnter { node_id: id, .. } => id.clone(), + TraceEvent::TraceExit { node_id: id, .. } => id.clone(), + TraceEvent::TraceError { node_id: id, .. } => id.clone(), +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum TraceFilter { - FilterByFunc { func_name: String }, - FilterBySpan { start: i64, end: i64 }, + FilterByFunc { + func_name: String, + }, + FilterBySpan { + start: i64, + end: i64, + }, FilterErrors, } pub fn event_matches_span(event: Rc, filter_start: i64, filter_end: i64) -> bool { { let sp = event_span(event); - ((sp.start.clone() >= filter_start) && (sp.start.clone() < filter_end)) - } +((sp.start.clone() >= filter_start) && (sp.start.clone() < filter_end)) +} } pub fn replay_trace(trace: Rc, filter: Rc) -> Rc>> { match (*filter).clone() { - TraceFilter::FilterByFunc { - func_name: name, .. - } => Rc::new({ - let mut __result = Vec::new(); - for e in trace.events.clone().iter().cloned() { - if (event_node_id(e.clone()).as_str() == name.clone().as_str()) { - __result.push(e); - } - } - __result - }), - TraceFilter::FilterBySpan { - start: s, end: e, .. - } => Rc::new({ - let mut __result = Vec::new(); - for ev in trace.events.clone().iter().cloned() { - if event_matches_span(ev.clone(), s.clone(), e.clone()) { - __result.push(ev); - } - } - __result - }), - TraceFilter::FilterErrors => Rc::new({ - let mut __result = Vec::new(); - for e in trace.events.clone().iter().cloned() { - if match (*e.clone()).clone() { - TraceEvent::TraceError { .. } => true, - _ => false, - } { - __result.push(e); - } - } - __result - }), - } + TraceFilter::FilterByFunc { func_name: name, .. } => Rc::new({ let mut __result = Vec::new(); for e in trace.events.clone().iter().cloned() { if (event_node_id(e.clone()).as_str() == name.clone().as_str()) { __result.push(e); } } __result }), + TraceFilter::FilterBySpan { start: s, end: e, .. } => Rc::new({ let mut __result = Vec::new(); for ev in trace.events.clone().iter().cloned() { if event_matches_span(ev.clone(), s.clone(), e.clone()) { __result.push(ev); } } __result }), + TraceFilter::FilterErrors => Rc::new({ let mut __result = Vec::new(); for e in trace.events.clone().iter().cloned() { if match (*e.clone()).clone() { + TraceEvent::TraceError { .. } => true, + _ => false, +} { __result.push(e); } } __result }), +} } pub fn format_span(sp: &Rc) -> String { - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("[".to_string(), (sp.start.clone()).to_string()), - "..".to_string(), - ), - (sp.end.clone()).to_string(), - ), - ")".to_string(), - ) + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("[".to_string(), (sp.start.clone()).to_string()), "..".to_string()), (sp.end.clone()).to_string()), ")".to_string()) } pub fn format_trace_event(event: Rc) -> String { match (*event).clone() { - TraceEvent::TraceEnter { - node_id: id, - span: sp, - .. - } => v2_rt::concat( - v2_rt::concat( - v2_rt::concat("> ".to_string(), id.clone()), - " at ".to_string(), - ), - format_span(&sp), - ), - TraceEvent::TraceExit { - node_id: id, - span: sp, - output: out, - .. - } => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("< ".to_string(), id.clone()), - " at ".to_string(), - ), - format_span(&sp), - ), - ": ".to_string(), - ), - out.clone(), - ), - TraceEvent::TraceError { - node_id: id, - span: sp, - message: msg, - .. - } => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("! ".to_string(), id.clone()), - " at ".to_string(), - ), - format_span(&sp), - ), - ": ".to_string(), - ), - msg.clone(), - ), - } + TraceEvent::TraceEnter { node_id: id, span: sp, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat("> ".to_string(), id.clone()), " at ".to_string()), format_span(&sp)), + TraceEvent::TraceExit { node_id: id, span: sp, output: out, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("< ".to_string(), id.clone()), " at ".to_string()), format_span(&sp)), ": ".to_string()), out.clone()), + TraceEvent::TraceError { node_id: id, span: sp, message: msg, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("! ".to_string(), id.clone()), " at ".to_string()), format_span(&sp)), ": ".to_string()), msg.clone()), +} } pub fn format_trace(trace: Rc) -> Rc> { - Rc::new({ - let mut __result = Vec::new(); - for e in trace.events.clone().iter().cloned() { - __result.push(format_trace_event(e.clone())); - } - __result - }) + Rc::new({ let mut __result = Vec::new(); for e in trace.events.clone().iter().cloned() { __result.push(format_trace_event(e.clone())); } __result }) } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -264,17 +174,13 @@ pub struct ReproCase { pub trace: Option>, } -pub fn capture_repro( - func_name: String, - inputs: Rc>, - trace: Rc, -) -> Rc { +pub fn capture_repro(func_name: String, inputs: Rc>, trace: Rc) -> Rc { Rc::new(ReproCase { - func_name: func_name, - inputs: inputs, - expected_output: None, - trace: Some(trace), - }) + func_name: func_name, + inputs: inputs, + expected_output: None, + trace: Some(trace), +}) } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -284,16 +190,5 @@ pub struct SourceMap { } pub fn remap_location(source_map: Rc, generated_line: i64) -> Option> { - Rc::new({ - let mut __result = Vec::new(); - for m in source_map.mappings.clone().iter().cloned() { - if (m.generated_line.clone() <= generated_line.clone()) { - __result.push(m); - } - } - __result - }) - .last() - .cloned() - .map(|m| m.source_span.clone()) + Rc::new({ let mut __result = Vec::new(); for m in source_map.mappings.clone().iter().cloned() { if (m.generated_line.clone() <= generated_line.clone()) { __result.push(m); } } __result }).last().cloned().map(|m| m.source_span.clone()) } diff --git a/src/v2/stage0/src/v2_rt.rs b/src/v2/stage0/src/v2_rt.rs index ffaae8d00d3..8e6da305b01 100644 --- a/src/v2/stage0/src/v2_rt.rs +++ b/src/v2/stage0/src/v2_rt.rs @@ -11,84 +11,52 @@ pub trait V2Concat { } impl V2Concat for String { - fn v2_concat(mut self, other: String) -> String { - self.push_str(&other); - self - } + fn v2_concat(mut self, other: String) -> String { self.push_str(&other); self } } impl V2Concat for Vec { - fn v2_concat(mut self, other: Vec) -> Vec { - self.extend(other); - self - } + fn v2_concat(mut self, other: Vec) -> Vec { self.extend(other); self } } -pub fn concat(a: T, b: T) -> T { - a.v2_concat(b) -} +pub fn concat(a: T, b: T) -> T { a.v2_concat(b) } pub fn char_at(s: &str, pos: i64) -> String { let pos = pos.max(0) as usize; if s.is_ascii() { let bytes = s.as_bytes(); - if pos >= bytes.len() { - return String::new(); - } + if pos >= bytes.len() { return String::new(); } return String::from(bytes[pos] as char); } - s.chars() - .nth(pos) - .map(|ch| ch.to_string()) - .unwrap_or_default() + s.chars().nth(pos).map(|ch| ch.to_string()).unwrap_or_default() } pub fn string_length(s: &str) -> i64 { - if s.is_ascii() { - s.len() as i64 - } else { - s.chars().count() as i64 - } + if s.is_ascii() { s.len() as i64 } else { s.chars().count() as i64 } } pub fn substring(s: &str, start: i64, end: i64) -> String { let start = start.max(0) as usize; let end = end.max(0) as usize; - if end <= start { - return String::new(); - } + if end <= start { return String::new(); } if s.is_ascii() { let len = s.len(); - if start >= len { - return String::new(); - } + if start >= len { return String::new(); } return s[start..end.min(len)].to_string(); } - s.chars() - .skip(start) - .take(end.saturating_sub(start)) - .collect() + s.chars().skip(start).take(end.saturating_sub(start)).collect() } pub fn string_contains(s: &str, sub: String) -> bool { s.contains(&*sub) } -pub fn contains(s: String, sub: String) -> bool { - string_contains(&s, sub) -} +pub fn contains(s: String, sub: String) -> bool { string_contains(&s, sub) } -pub fn count(items: Rc>) -> i64 { - items.len() as i64 -} +pub fn count(items: Rc>) -> i64 { items.len() as i64 } -pub fn str_eq(a: String, b: String) -> bool { - a == b -} +pub fn str_eq(a: String, b: String) -> bool { a == b } -pub fn to_string(value: i64) -> String { - value.to_string() -} +pub fn to_string(value: i64) -> String { value.to_string() } pub fn clamp(val: i64, min_val: i64, max_val: i64) -> i64 { val.clamp(min_val, max_val) @@ -100,58 +68,31 @@ pub fn lookup(table: &HashMap, key: String) -> Option { pub fn index_by String>(list: Vec, key_fn: F) -> HashMap { let mut map = HashMap::new(); - for item in list { - let key = key_fn(&item); - map.insert(key, item); - } + for item in list { let key = key_fn(&item); map.insert(key, item); } map } -pub fn empty_map() -> HashMap { - HashMap::new() -} +pub fn empty_map() -> HashMap { HashMap::new() } -pub fn map_insert( - mut map: HashMap, - key: K, - value: V, -) -> HashMap { - map.insert(key, value); - map +pub fn map_insert(mut map: HashMap, key: K, value: V) -> HashMap { + map.insert(key, value); map } -pub fn map_merge( - mut base: HashMap, - overlay: HashMap, -) -> HashMap { - base.extend(overlay); - base +pub fn map_merge(mut base: HashMap, overlay: HashMap) -> HashMap { + base.extend(overlay); base } -pub fn map_get( - m: &HashMap, - key: K, -) -> Option { +pub fn map_get(m: &HashMap, key: K) -> Option { m.get(&key).cloned() } -pub fn map_keys(m: &HashMap) -> Vec { - m.keys().cloned().collect() -} +pub fn map_keys(m: &HashMap) -> Vec { m.keys().cloned().collect() } -pub fn map_values(m: &HashMap) -> Vec { - m.values().cloned().collect() -} +pub fn map_values(m: &HashMap) -> Vec { m.values().cloned().collect() } -pub fn list_concat(mut a: Vec, b: Vec) -> Vec { - a.extend(b); - a -} +pub fn list_concat(mut a: Vec, b: Vec) -> Vec { a.extend(b); a } -pub fn list_push(mut list: Vec, item: T) -> Vec { - list.push(item); - list -} +pub fn list_push(mut list: Vec, item: T) -> Vec { list.push(item); list } pub fn append(list: Rc>, item: T) -> Vec { let mut v = (*list).clone(); @@ -169,9 +110,7 @@ pub fn chars_to_string(chars: &Rc>, start: i64, end: i64) -> String { .collect() } -pub fn parse_int(s: String) -> Option { - s.parse::().ok() -} +pub fn parse_int(s: String) -> Option { s.parse::().ok() } pub fn map_contains_key(m: &HashMap, key: K) -> bool { m.contains_key(&key) @@ -182,9 +121,7 @@ pub fn map_has(m: &HashMap, key: K) } pub fn reverse(list: Rc>) -> Rc> { - let mut v = (*list).clone(); - v.reverse(); - Rc::new(v) + let mut v = (*list).clone(); v.reverse(); Rc::new(v) } pub fn replace(s: String, from: String, to: String) -> String { @@ -209,20 +146,13 @@ pub fn rc_list_concat(a: Rc>, b: Rc>) -> Rc> { result } -pub fn rc_map_insert( - map: Rc>, - key: K, - value: V, -) -> Rc> { +pub fn rc_map_insert(map: Rc>, key: K, value: V) -> Rc> { let mut m = map; Rc::make_mut(&mut m).insert(key, value); m } -pub fn rc_map_merge( - base: Rc>, - overlay: Rc>, -) -> Rc> { +pub fn rc_map_merge(base: Rc>, overlay: Rc>) -> Rc> { let mut result = base; let inner = Rc::make_mut(&mut result); for (k, v) in overlay.iter() { @@ -231,21 +161,14 @@ pub fn rc_map_merge( result } -pub fn rc_index_by String>( - list: Rc>, - key_fn: F, -) -> Rc> { +pub fn rc_index_by String>(list: Rc>, key_fn: F) -> Rc> { Rc::new(list.iter().map(|v| (key_fn(v), v.clone())).collect()) } -pub fn rc_empty_map() -> Rc> { - Rc::new(HashMap::new()) -} +pub fn rc_empty_map() -> Rc> { Rc::new(HashMap::new()) } impl V2Concat for Rc> { - fn v2_concat(self, other: Rc>) -> Rc> { - rc_list_concat(self, other) - } + fn v2_concat(self, other: Rc>) -> Rc> { rc_list_concat(self, other) } } pub fn scan_while(s: &str, start: i64, pred: impl Fn(String) -> bool) -> i64 { @@ -253,20 +176,14 @@ pub fn scan_while(s: &str, start: i64, pred: impl Fn(String) -> bool) -> i64 { if s.is_ascii() { let bytes = s.as_bytes(); let mut pos = start.min(bytes.len()); - while pos < bytes.len() && pred(String::from(bytes[pos] as char)) { - pos += 1; - } + while pos < bytes.len() && pred(String::from(bytes[pos] as char)) { pos += 1; } return pos as i64; } let char_len = s.chars().count(); let start = start.min(char_len); let mut pos = start; for ch in s.chars().skip(start) { - if pred(ch.to_string()) { - pos += 1; - } else { - break; - } + if pred(ch.to_string()) { pos += 1; } else { break; } } pos as i64 } @@ -276,20 +193,14 @@ pub fn skip_horizontal_ws(s: &str, start: i64) -> i64 { if s.is_ascii() { let bytes = s.as_bytes(); let mut pos = start.min(bytes.len()); - while pos < bytes.len() && (bytes[pos] == b' ' || bytes[pos] == b'\t') { - pos += 1; - } + while pos < bytes.len() && (bytes[pos] == b' ' || bytes[pos] == b'\t') { pos += 1; } return pos as i64; } let char_len = s.chars().count(); let start = start.min(char_len); let mut pos = start; for ch in s.chars().skip(start) { - if ch == ' ' || ch == '\t' { - pos += 1; - } else { - break; - } + if ch == ' ' || ch == '\t' { pos += 1; } else { break; } } pos as i64 } @@ -299,20 +210,14 @@ pub fn scan_to_eol(s: &str, start: i64) -> i64 { if s.is_ascii() { let bytes = s.as_bytes(); let start = start.min(bytes.len()); - for i in start..bytes.len() { - if bytes[i] == b'\n' { - return i as i64; - } - } + for i in start..bytes.len() { if bytes[i] == b'\n' { return i as i64; } } return bytes.len() as i64; } let char_len = s.chars().count(); let start = start.min(char_len); let mut pos = start; for ch in s.chars().skip(start) { - if ch == '\n' { - return pos as i64; - } + if ch == '\n' { return pos as i64; } pos += 1; } pos as i64 @@ -324,13 +229,9 @@ pub fn scan_string_end(s: &str, start: i64) -> i64 { let bytes = s.as_bytes(); let mut pos = start.min(bytes.len()); while pos < bytes.len() { - if bytes[pos] == b'\\' { - pos += 2; - } else if bytes[pos] == b'\"' { - return (pos + 1) as i64; - } else { - pos += 1; - } + if bytes[pos] == b'\\' { pos += 2; } + else if bytes[pos] == b'\"' { return (pos + 1) as i64; } + else { pos += 1; } } return bytes.len() as i64; } @@ -359,9 +260,7 @@ pub fn code_point(c: String) -> i64 { } pub fn from_code_point(cp: i64) -> String { - char::from_u32(cp as u32) - .map(|c| c.to_string()) - .unwrap_or_default() + char::from_u32(cp as u32).map(|c| c.to_string()).unwrap_or_default() } #[derive(Debug, Clone)] @@ -370,7 +269,7 @@ pub struct FilesystemReadResult { } pub fn filesystem_read(path: String) -> FilesystemReadResult { - let content = - std::fs::read_to_string(&path).unwrap_or_else(|e| panic!("failed to read {}: {}", path, e)); + let content = std::fs::read_to_string(&path) + .unwrap_or_else(|e| panic!("failed to read {}: {}", path, e)); FilesystemReadResult { content } } diff --git a/src/v2/stage0/src/v2_std_core.rs b/src/v2/stage0/src/v2_std_core.rs index 800cac37ccc..edbf24b96d4 100644 --- a/src/v2/stage0/src/v2_std_core.rs +++ b/src/v2/stage0/src/v2_std_core.rs @@ -1,46 +1,39 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.std.core -use self::CallSemantics::*; -use self::Cardinality::*; -use self::CompilerDiagnostic::*; +use std::collections::HashMap; +use std::rc::Rc; +use crate::v2_rt; +use crate::NonEmptyVec; +use crate::NonEmptyBTreeSet; +pub use crate::std_types::{FilePath, NonEmptyStr, SourceSpan, kernel_type_set, is_kernel_type, container_type_arity, is_container_type, container_expected_arity}; +pub use crate::std_syntax::{BinOp, LiteralValue, AlgebraFieldKind}; +use crate::std_syntax::BinOp::{Add, Sub, Mul, Div, Mod, Eq, Ne, Lt, Gt, Le, Ge, And, Or, NullCoalesce}; +use crate::std_syntax::LiteralValue::{LitStr, LitInt, LitFloat, LitBool, LitNull}; +use crate::std_syntax::AlgebraFieldKind::{AlgAdd, AlgMul, AlgReciprocal, AlgQuotient, AlgRemainder, AlgCompare, AlgMeet, AlgJoin}; +pub use crate::std_algebra::{CollectionSizeEffect, CostShape, AlgebraFieldTemplate}; +use crate::std_algebra::CollectionSizeEffect::*; +use crate::std_algebra::CostShape::*; +pub use crate::std_induction::{SubValueRelation}; +use crate::std_induction::SubValueRelation::*; +use self::TokenShape::*; use self::Connective::*; -use self::ExprData::*; -use self::ExprErrorKind::*; +use self::Cardinality::*; use self::FieldAccessStyle::*; use self::FieldValueShape::*; -use self::FunctionSizeEffect::*; use self::InferredNode::*; -use self::MatchPattern::*; +use self::VarBindingKind::*; +use self::CallSemantics::*; use self::MethodSemantics::*; -use self::NodeFieldRole::*; -use self::OperationModifier::*; -use self::StringPart::*; -use self::TokenShape::*; +use self::ExprErrorKind::*; +use self::ExprData::*; +use self::MatchPattern::*; use self::UnaryOpKind::*; -use self::VarBindingKind::*; -use crate::std_algebra::CollectionSizeEffect::*; -use crate::std_algebra::CostShape::*; -pub use crate::std_algebra::{AlgebraFieldTemplate, CollectionSizeEffect, CostShape}; -pub use crate::std_induction::SubValueRelation; -use crate::std_induction::SubValueRelation::*; -use crate::std_syntax::AlgebraFieldKind::{ - AlgAdd, AlgCompare, AlgJoin, AlgMeet, AlgMul, AlgQuotient, AlgReciprocal, AlgRemainder, -}; -use crate::std_syntax::BinOp::{ - Add, And, Div, Eq, Ge, Gt, Le, Lt, Mod, Mul, Ne, NullCoalesce, Or, Sub, -}; -use crate::std_syntax::LiteralValue::{LitBool, LitFloat, LitInt, LitNull, LitStr}; -pub use crate::std_syntax::{AlgebraFieldKind, BinOp, LiteralValue}; -pub use crate::std_types::{ - container_expected_arity, container_type_arity, is_container_type, is_kernel_type, - kernel_type_set, FilePath, NonEmptyStr, SourceSpan, -}; -use crate::v2_rt; -use crate::NonEmptyBTreeSet; -use crate::NonEmptyVec; -use std::collections::HashMap; -use std::rc::Rc; +use self::StringPart::*; +use self::OperationModifier::*; +use self::CompilerDiagnostic::*; +use self::NodeFieldRole::*; +use self::FunctionSizeEffect::*; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] pub struct Token { @@ -152,18 +145,18 @@ pub enum InferredNode { pub fn inferred_to_node(inferred: Rc) -> Option> { match (*inferred).clone() { - InferredNode::Resolved { node: n, .. } => Some(n.clone()), - InferredNode::CompilerError { .. } => None, - InferredNode::TypeVariable { .. } => None, - } + InferredNode::Resolved { node: n, .. } => Some(n.clone()), + InferredNode::CompilerError { .. } => None, + InferredNode::TypeVariable { .. } => None, +} } pub fn is_compiler_error(inferred: Rc) -> bool { match (*inferred).clone() { - InferredNode::Resolved { .. } => false, - InferredNode::CompilerError { .. } => true, - InferredNode::TypeVariable { .. } => false, - } + InferredNode::Resolved { .. } => false, + InferredNode::CompilerError { .. } => true, + InferredNode::TypeVariable { .. } => false, +} } pub fn has_inferred(n: Rc) -> bool { @@ -175,7 +168,9 @@ pub fn has_inferred(n: Rc) -> bool { pub enum VarBindingKind { LocalValueBinding, FunctionValueBinding, - VariantValueBinding { parent_enum: String }, + VariantValueBinding { + parent_enum: String, + }, MatchBoundBinding, } impl VarBindingKind { @@ -183,9 +178,7 @@ impl VarBindingKind { match self { VarBindingKind::LocalValueBinding => panic!("no parent_enum on unit variant"), VarBindingKind::FunctionValueBinding => panic!("no parent_enum on unit variant"), - VarBindingKind::VariantValueBinding { - parent_enum: __val, .. - } => __val.clone(), + VarBindingKind::VariantValueBinding { parent_enum: __val, .. } => __val.clone(), VarBindingKind::MatchBoundBinding => panic!("no parent_enum on unit variant"), } } @@ -298,8 +291,12 @@ pub enum UnaryOpKind { #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum StringPart { - Text { value: String }, - Interpolation { expr: Rc }, + Text { + value: String, + }, + Interpolation { + expr: Rc, + }, } #[derive(Debug, Clone, Copy, PartialEq, serde::Serialize, serde::Deserialize)] @@ -440,208 +437,44 @@ pub struct ErrorDAG { pub fn diagnostic_to_span(d: Rc) -> Rc { match (*d).clone() { - CompilerDiagnostic::UnresolvedImport { span: s, .. } => s.clone(), - CompilerDiagnostic::MissingExport { span: s, .. } => s.clone(), - CompilerDiagnostic::UnresolvedType { span: s, .. } => s.clone(), - CompilerDiagnostic::TypeMismatch { span: s, .. } => s.clone(), - CompilerDiagnostic::ArityMismatch { span: s, .. } => s.clone(), - CompilerDiagnostic::VariantNotFound { span: s, .. } => s.clone(), - CompilerDiagnostic::FieldNotFound { span: s, .. } => s.clone(), - CompilerDiagnostic::NonExhaustiveMatch { span: s, .. } => s.clone(), - CompilerDiagnostic::CircularDependency { span: s, .. } => s.clone(), - CompilerDiagnostic::DuplicateModule { span: s, .. } => s.clone(), - CompilerDiagnostic::MissingAnnotation { span: s, .. } => s.clone(), - CompilerDiagnostic::ParseError { span: s, .. } => s.clone(), - CompilerDiagnostic::InternalError { span: s, .. } => s.clone(), - CompilerDiagnostic::ComplexityUnknown { span: s, .. } => s.clone(), - CompilerDiagnostic::OwnershipViolation { span: s, .. } => s.clone(), - CompilerDiagnostic::VariantCollision { span: s, .. } => s.clone(), - } + CompilerDiagnostic::UnresolvedImport { span: s, .. } => s.clone(), + CompilerDiagnostic::MissingExport { span: s, .. } => s.clone(), + CompilerDiagnostic::UnresolvedType { span: s, .. } => s.clone(), + CompilerDiagnostic::TypeMismatch { span: s, .. } => s.clone(), + CompilerDiagnostic::ArityMismatch { span: s, .. } => s.clone(), + CompilerDiagnostic::VariantNotFound { span: s, .. } => s.clone(), + CompilerDiagnostic::FieldNotFound { span: s, .. } => s.clone(), + CompilerDiagnostic::NonExhaustiveMatch { span: s, .. } => s.clone(), + CompilerDiagnostic::CircularDependency { span: s, .. } => s.clone(), + CompilerDiagnostic::DuplicateModule { span: s, .. } => s.clone(), + CompilerDiagnostic::MissingAnnotation { span: s, .. } => s.clone(), + CompilerDiagnostic::ParseError { span: s, .. } => s.clone(), + CompilerDiagnostic::InternalError { span: s, .. } => s.clone(), + CompilerDiagnostic::ComplexityUnknown { span: s, .. } => s.clone(), + CompilerDiagnostic::OwnershipViolation { span: s, .. } => s.clone(), + CompilerDiagnostic::VariantCollision { span: s, .. } => s.clone(), +} } pub fn diagnostic_to_message(d: Rc) -> String { match (*d).clone() { - CompilerDiagnostic::UnresolvedImport { - module_path: m, - importing_module: i, - .. - } => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("unresolved import: module '".to_string(), m.clone()), - "' not found (imported by '".to_string(), - ), - i.clone(), - ), - "')".to_string(), - ), - CompilerDiagnostic::MissingExport { - name: n, - module_path: m, - importing_module: i, - .. - } => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("name '".to_string(), n.clone()), - "' not found in module '".to_string(), - ), - m.clone(), - ), - "' (imported by '".to_string(), - ), - i.clone(), - ), - "')".to_string(), - ), - CompilerDiagnostic::UnresolvedType { name: n, .. } => v2_rt::concat( - v2_rt::concat("unresolved type '".to_string(), n.clone()), - "'".to_string(), - ), - CompilerDiagnostic::TypeMismatch { - expected: e, - got: g, - .. - } => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("type mismatch: expected '".to_string(), e.clone()), - "', got '".to_string(), - ), - g.clone(), - ), - "'".to_string(), - ), - CompilerDiagnostic::ArityMismatch { - name: n, - expected: e, - got: g, - .. - } => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("type ".to_string(), n.clone()), - " expects ".to_string(), - ), - (e.clone()).to_string(), - ), - " type arguments, got ".to_string(), - ), - (g.clone()).to_string(), - ), - CompilerDiagnostic::VariantNotFound { - variant: v, - type_name: t, - .. - } => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("variant '".to_string(), v.clone()), - "' not found in type '".to_string(), - ), - t.clone(), - ), - "'".to_string(), - ), - CompilerDiagnostic::FieldNotFound { - field: f, - type_name: t, - .. - } => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("field '".to_string(), f.clone()), - "' not found in type '".to_string(), - ), - t.clone(), - ), - "'".to_string(), - ), - CompilerDiagnostic::NonExhaustiveMatch { missing: ms, .. } => v2_rt::concat( - "non-exhaustive match: missing variant(s) ".to_string(), - ms.clone().join(&", ".to_string()), - ), - CompilerDiagnostic::CircularDependency { modules: ms, .. } => v2_rt::concat( - "circular dependency detected: ".to_string(), - ms.clone().join(&" -> ".to_string()), - ), - CompilerDiagnostic::DuplicateModule { name: n, .. } => v2_rt::concat( - v2_rt::concat("duplicate module declaration: '".to_string(), n.clone()), - "'".to_string(), - ), - CompilerDiagnostic::MissingAnnotation { - fn_name: f, - what: w, - .. - } => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("function '".to_string(), f.clone()), - "' requires ".to_string(), - ), - w.clone(), - ), - " annotation".to_string(), - ), - CompilerDiagnostic::ParseError { message: m, .. } => m.clone(), - CompilerDiagnostic::InternalError { message: m, .. } => m.clone(), - CompilerDiagnostic::ComplexityUnknown { - func_name: f, - reason: r, - .. - } => v2_rt::concat( - v2_rt::concat( - v2_rt::concat("complexity: ".to_string(), f.clone()), - ": ".to_string(), - ), - r.clone(), - ), - CompilerDiagnostic::OwnershipViolation { - binding: b, - fn_name: f, - consumers: c, - .. - } => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("ownership: binding '".to_string(), b.clone()), - "' in '".to_string(), - ), - f.clone(), - ), - "' has ".to_string(), - ), - (c.clone()).to_string(), - ), - " consumers".to_string(), - ), - CompilerDiagnostic::VariantCollision { - variant: v, - enum1: e1, - enum2: e2, - .. - } => v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat("variant '".to_string(), v.clone()), - "' appears in both '".to_string(), - ), - e1.clone(), - ), - "' and '".to_string(), - ), - e2.clone(), - ), - "'".to_string(), - ), - } + CompilerDiagnostic::UnresolvedImport { module_path: m, importing_module: i, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("unresolved import: module '".to_string(), m.clone()), "' not found (imported by '".to_string()), i.clone()), "')".to_string()), + CompilerDiagnostic::MissingExport { name: n, module_path: m, importing_module: i, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("name '".to_string(), n.clone()), "' not found in module '".to_string()), m.clone()), "' (imported by '".to_string()), i.clone()), "')".to_string()), + CompilerDiagnostic::UnresolvedType { name: n, .. } => v2_rt::concat(v2_rt::concat("unresolved type '".to_string(), n.clone()), "'".to_string()), + CompilerDiagnostic::TypeMismatch { expected: e, got: g, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("type mismatch: expected '".to_string(), e.clone()), "', got '".to_string()), g.clone()), "'".to_string()), + CompilerDiagnostic::ArityMismatch { name: n, expected: e, got: g, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("type ".to_string(), n.clone()), " expects ".to_string()), (e.clone()).to_string()), " type arguments, got ".to_string()), (g.clone()).to_string()), + CompilerDiagnostic::VariantNotFound { variant: v, type_name: t, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("variant '".to_string(), v.clone()), "' not found in type '".to_string()), t.clone()), "'".to_string()), + CompilerDiagnostic::FieldNotFound { field: f, type_name: t, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("field '".to_string(), f.clone()), "' not found in type '".to_string()), t.clone()), "'".to_string()), + CompilerDiagnostic::NonExhaustiveMatch { missing: ms, .. } => v2_rt::concat("non-exhaustive match: missing variant(s) ".to_string(), ms.clone().join(&", ".to_string())), + CompilerDiagnostic::CircularDependency { modules: ms, .. } => v2_rt::concat("circular dependency detected: ".to_string(), ms.clone().join(&" -> ".to_string())), + CompilerDiagnostic::DuplicateModule { name: n, .. } => v2_rt::concat(v2_rt::concat("duplicate module declaration: '".to_string(), n.clone()), "'".to_string()), + CompilerDiagnostic::MissingAnnotation { fn_name: f, what: w, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("function '".to_string(), f.clone()), "' requires ".to_string()), w.clone()), " annotation".to_string()), + CompilerDiagnostic::ParseError { message: m, .. } => m.clone(), + CompilerDiagnostic::InternalError { message: m, .. } => m.clone(), + CompilerDiagnostic::ComplexityUnknown { func_name: f, reason: r, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat("complexity: ".to_string(), f.clone()), ": ".to_string()), r.clone()), + CompilerDiagnostic::OwnershipViolation { binding: b, fn_name: f, consumers: c, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("ownership: binding '".to_string(), b.clone()), "' in '".to_string()), f.clone()), "' has ".to_string()), (c.clone()).to_string()), " consumers".to_string()), + CompilerDiagnostic::VariantCollision { variant: v, enum1: e1, enum2: e2, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("variant '".to_string(), v.clone()), "' appears in both '".to_string()), e1.clone()), "' and '".to_string()), e2.clone()), "'".to_string()), +} } pub fn is_error_diagnostic(d: Rc) -> bool { @@ -650,16 +483,16 @@ pub fn is_error_diagnostic(d: Rc) -> bool { pub fn is_interpreter_blocking_diagnostic(d: Rc) -> bool { match (*d).clone() { - CompilerDiagnostic::ComplexityUnknown { .. } => false, - _ => true, - } + CompilerDiagnostic::ComplexityUnknown { .. } => false, + _ => true, +} } pub fn make_error_node(diagnostic: Rc, module_name: String) -> Rc { Rc::new(ErrorNode { - diagnostic: diagnostic, - module_name: module_name, - }) + diagnostic: diagnostic, + module_name: module_name, +}) } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -669,8 +502,7 @@ pub struct DeclaredFuncSig { pub inferred: Option>, pub is_async: bool, pub output_provenance: Rc>>>>, - pub variant_provenance: - Rc>>>>>>, + pub variant_provenance: Rc>>>>>>, } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -710,464 +542,359 @@ pub fn default_ident_span(name: String, span: Rc) -> Option) -> Rc { match n.ident_span.clone() { - Some(s) => s.clone(), - None => n.span.clone(), - } + Some(s) => s.clone(), + None => n.span.clone(), } - -pub fn make_expr_node( - expr_data: Rc, - children: Rc>>, - inferred: Option>, - span: Rc, -) -> Rc { - Rc::new(Node { - name: "".to_string(), - span: span, - ident_span: None, - children: children, - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: inferred, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: expr_data, - ident: None, - }) } -pub fn make_named_expr_node( - name: &String, - expr_data: Rc, - children: Rc>>, - inferred: Option>, - span: Rc, - name_span: Rc, -) -> Rc { +pub fn make_expr_node(expr_data: Rc, children: Rc>>, inferred: Option>, span: Rc) -> Rc { Rc::new(Node { - name: name.clone(), - span: span, - ident_span: default_ident_span(name.clone(), name_span), - children: children, - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: inferred, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: expr_data, - ident: None, - }) -} - -pub fn make_expr_error_node( - kind: ExprErrorKind, - message: &String, - span: &Rc, -) -> Rc { + name: "".to_string(), + span: span, + ident_span: None, + children: children, + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: inferred, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: expr_data, + ident: None, +}) +} + +pub fn make_named_expr_node(name: &String, expr_data: Rc, children: Rc>>, inferred: Option>, span: Rc, name_span: Rc) -> Rc { Rc::new(Node { - name: "".to_string(), - span: span.clone(), - ident_span: None, - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::CompilerError { - message: message.clone(), - span: span.clone(), - })), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::ExprError { - kind: kind, - message: message.clone(), - }), - ident: None, - }) -} - -pub fn make_arg_node( - name: Option, - value: Rc, - span: Rc, - name_span: Rc, -) -> Rc { + name: name.clone(), + span: span, + ident_span: default_ident_span(name.clone(), name_span), + children: children, + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: inferred, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: expr_data, + ident: None, +}) +} + +pub fn make_expr_error_node(kind: ExprErrorKind, message: &String, span: &Rc) -> Rc { + Rc::new(Node { + name: "".to_string(), + span: span.clone(), + ident_span: None, + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::CompilerError { + message: message.clone(), + span: span.clone(), +})), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::ExprError { + kind: kind, + message: message.clone(), +}), + ident: None, +}) +} + +pub fn make_arg_node(name: Option, value: Rc, span: Rc, name_span: Rc) -> Rc { { let arg_name = match name { - Some(n) => n.clone(), - None => "".to_string(), - }; - Rc::new(Node { - name: arg_name.clone(), - span: span, - ident_span: default_ident_span(arg_name.clone(), name_span), - children: Rc::new(vec![value]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }) - } -} - -pub fn make_arm_node( - pattern: Rc, - guard: Option>, - body: Rc, - span: Rc, -) -> Rc { + Some(n) => n.clone(), + None => "".to_string(), +}; +Rc::new(Node { + name: arg_name.clone(), + span: span, + ident_span: default_ident_span(arg_name.clone(), name_span), + children: Rc::new(vec![value]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}) +} +} + +pub fn make_arm_node(pattern: Rc, guard: Option>, body: Rc, span: Rc) -> Rc { { let children = match guard { - Some(g) => Rc::new(vec![g.clone(), body]), - None => Rc::new(vec![body]), - }; - Rc::new(Node { - name: "".to_string(), - span: span, - ident_span: None, - children: children, - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: Some(pattern), - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }) - } -} - -pub fn make_resource_use_node( - name: &String, - resource: Rc, - span: Rc, - name_span: Rc, -) -> Rc { + Some(g) => Rc::new(vec![g.clone(), body]), + None => Rc::new(vec![body]), +}; +Rc::new(Node { + name: "".to_string(), + span: span, + ident_span: None, + children: children, + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: Some(pattern), + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}) +} +} + +pub fn make_resource_use_node(name: &String, resource: Rc, span: Rc, name_span: Rc) -> Rc { Rc::new(Node { - name: name.clone(), - span: span, - ident_span: default_ident_span(name.clone(), name_span), - children: Rc::new(vec![resource]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }) -} - -pub fn resource_use_name_at( - n: Rc, - source_indices: Rc>>, -) -> String { + name: name.clone(), + span: span, + ident_span: default_ident_span(name.clone(), name_span), + children: Rc::new(vec![resource]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}) +} + +pub fn resource_use_name_at(n: Rc, source_indices: Rc>>) -> String { authored_name_at(source_indices, &n) } pub fn resource_use_resource(n: &Rc) -> Rc { match n.children.clone().first().cloned() { - Some(v) => v.clone(), - None => make_expr_error_node( - ExprErrorKind::InternalExprError, - &"malformed resource-use: missing resource".to_string(), - &n.span.clone(), - ), - } + Some(v) => v.clone(), + None => make_expr_error_node(ExprErrorKind::InternalExprError, &"malformed resource-use: missing resource".to_string(), &n.span.clone()), } - -pub fn make_field_init_node( - name: &String, - value: Rc, - span: Rc, - name_span: Rc, -) -> Rc { - Rc::new(Node { - name: name.clone(), - span: span, - ident_span: default_ident_span(name.clone(), name_span), - children: Rc::new(vec![value]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }) } -pub fn make_field_binding_node( - field_name: &String, - binding: Rc, - span: Rc, - name_span: Rc, -) -> Rc { +pub fn make_field_init_node(name: &String, value: Rc, span: Rc, name_span: Rc) -> Rc { Rc::new(Node { - name: field_name.clone(), - span: span, - ident_span: default_ident_span(field_name.clone(), name_span), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: Some(binding), - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }) -} - -pub fn field_binding_name_at( - n: Rc, - source_indices: Rc>>, -) -> String { + name: name.clone(), + span: span, + ident_span: default_ident_span(name.clone(), name_span), + children: Rc::new(vec![value]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}) +} + +pub fn make_field_binding_node(field_name: &String, binding: Rc, span: Rc, name_span: Rc) -> Rc { + Rc::new(Node { + name: field_name.clone(), + span: span, + ident_span: default_ident_span(field_name.clone(), name_span), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: Some(binding), + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}) +} + +pub fn field_binding_name_at(n: Rc, source_indices: Rc>>) -> String { authored_name_at(source_indices, &n) } pub fn field_binding_pattern(n: Rc) -> Rc { match n.match_pattern.clone() { - Some(p) => p.clone(), - None => Rc::new(MatchPattern::Wildcard), - } + Some(p) => p.clone(), + None => Rc::new(MatchPattern::Wildcard), +} } pub fn make_text_part_node(text: String, span: Rc) -> Rc { Rc::new(Node { - name: "".to_string(), - span: span, - ident_span: None, - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitStr { value: text }), - }), - ident: None, - }) + name: "".to_string(), + span: span, + ident_span: None, + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitStr { + value: text, +}), +}), + ident: None, +}) } pub fn make_interp_part_node(expr: Rc, span: Rc) -> Rc { Rc::new(Node { - name: "".to_string(), - span: span, - ident_span: None, - children: Rc::new(vec![expr]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }) -} - -pub fn make_param_node( - name: &String, - type_expr: Rc, - default_value: Option>, - span: Rc, - name_span: Rc, -) -> Rc { + name: "".to_string(), + span: span, + ident_span: None, + children: Rc::new(vec![expr]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}) +} + +pub fn make_param_node(name: &String, type_expr: Rc, default_value: Option>, span: Rc, name_span: Rc) -> Rc { { let children = match default_value { - Some(dv) => Rc::new(vec![type_expr, dv.clone()]), - None => Rc::new(vec![type_expr]), - }; - Rc::new(Node { - name: name.clone(), - span: span, - ident_span: default_ident_span(name.clone(), name_span), - children: children, - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }) - } -} - -pub fn param_node_name_at( - n: Rc, - source_indices: Rc>>, -) -> String { + Some(dv) => Rc::new(vec![type_expr, dv.clone()]), + None => Rc::new(vec![type_expr]), +}; +Rc::new(Node { + name: name.clone(), + span: span, + ident_span: default_ident_span(name.clone(), name_span), + children: children, + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}) +} +} + +pub fn param_node_name_at(n: Rc, source_indices: Rc>>) -> String { authored_name_at(source_indices, &n) } -pub fn generic_param_name_at( - n: Rc, - source_indices: Rc>>, -) -> String { +pub fn generic_param_name_at(n: Rc, source_indices: Rc>>) -> String { authored_name_at(source_indices, &n) } -pub fn authored_name_at( - source_indices: Rc>>, - node: &Rc, -) -> String { +pub fn authored_name_at(source_indices: Rc>>, node: &Rc) -> String { match node.ident_span.clone() { - Some(span) => match v2_rt::map_get(&source_indices, span.file.clone()) { - Some(index) => { - let text = source_text_at(index.clone(), &span); - if (text.clone().as_str() == "".to_string().as_str()) { - "".to_string() - } else { - text.clone() - } - } - None => { - if ((v2_rt::string_length(&span.file.clone()) > 8) - && (v2_rt::substring(&span.file.clone(), 0, 8).as_str() - == " "".to_string(), - } + Some(span) => match v2_rt::map_get(&source_indices, span.file.clone()) { + Some(index) => { + let text = source_text_at(index.clone(), &span); +if (text.clone().as_str() == "".to_string().as_str()) { + "".to_string() + } else { + text.clone() + } +}, + None => if ((v2_rt::string_length(&span.file.clone()) > 8) && (v2_rt::substring(&span.file.clone(), 0, 8).as_str() == " "".to_string(), +} } -pub fn find_child_named( - n: Rc, - name: String, - source_indices: Rc>>, -) -> Option> { - match Rc::new({ - let mut __result = Vec::new(); - for c in n.children.clone().iter().cloned() { - if (authored_name_at(source_indices.clone(), &c).as_str() == name.clone().as_str()) { - __result.push(c); - } - } - __result - }) - .first() - .cloned() - { - Some(ch) => Some(ch.clone()), - None => None, - } +pub fn find_child_named(n: Rc, name: String, source_indices: Rc>>) -> Option> { + match Rc::new({ let mut __result = Vec::new(); for c in n.children.clone().iter().cloned() { if (authored_name_at(source_indices.clone(), &c).as_str() == name.clone().as_str()) { __result.push(c); } } __result }).first().cloned() { + Some(ch) => Some(ch.clone()), + None => None, +} } -pub fn has_child_named( - n: Rc, - name: String, - source_indices: Rc>>, -) -> bool { - { - let mut __found = false; - for c in n.children.clone().iter().cloned() { - if (authored_name_at(source_indices.clone(), &c).as_str() == name.clone().as_str()) { - __found = true; - break; - } - } - __found - } +pub fn has_child_named(n: Rc, name: String, source_indices: Rc>>) -> bool { + { let mut __found = false; for c in n.children.clone().iter().cloned() { if (authored_name_at(source_indices.clone(), &c).as_str() == name.clone().as_str()) { __found = true; break; } } __found } } pub fn param_node_type_expr(n: &Rc) -> Rc { match n.children.clone().first().cloned() { - Some(v) => v.clone(), - None => make_expr_error_node( - ExprErrorKind::InternalExprError, - &"malformed param: missing type_expr".to_string(), - &n.span.clone(), - ), - } + Some(v) => v.clone(), + None => make_expr_error_node(ExprErrorKind::InternalExprError, &"malformed param: missing type_expr".to_string(), &n.span.clone()), +} } pub fn param_node_default_value(n: &Rc) -> Option> { @@ -1182,82 +909,67 @@ pub fn param_node_span(n: Rc) -> Rc { n.span.clone() } -pub fn make_field_node( - name: &String, - type_expr: Rc, - cardinality: Cardinality, - default_value: Option>, - from_key: Option, - span: Rc, - name_span: Rc, -) -> Rc { +pub fn make_field_node(name: &String, type_expr: Rc, cardinality: Cardinality, default_value: Option>, from_key: Option, span: Rc, name_span: Rc) -> Rc { { let children = match default_value { - Some(dv) => Rc::new(vec![type_expr, dv.clone()]), - None => Rc::new(vec![type_expr]), - }; - let props = match from_key { - Some(fk) => Rc::new(vec![Rc::new(Node { - name: fk.clone(), - span: make_span(0, 0), - ident_span: default_ident_span(fk.clone(), make_span(0, 0)), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - })]), - None => Rc::new(vec![]), - }; - Rc::new(Node { - name: name.clone(), - span: span, - ident_span: default_ident_span(name.clone(), name_span), - children: children, - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: cardinality, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: props, - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }) - } -} - -pub fn field_node_name_at( - n: Rc, - source_indices: Rc>>, -) -> String { + Some(dv) => Rc::new(vec![type_expr, dv.clone()]), + None => Rc::new(vec![type_expr]), +}; +let props = match from_key { + Some(fk) => Rc::new(vec![Rc::new(Node { + name: fk.clone(), + span: make_span(0, 0), + ident_span: default_ident_span(fk.clone(), make_span(0, 0)), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +})]), + None => Rc::new(vec![]), +}; +Rc::new(Node { + name: name.clone(), + span: span, + ident_span: default_ident_span(name.clone(), name_span), + children: children, + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: cardinality, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: props, + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}) +} +} + +pub fn field_node_name_at(n: Rc, source_indices: Rc>>) -> String { authored_name_at(source_indices, &n) } pub fn field_node_type_expr(n: &Rc) -> Rc { match n.children.clone().first().cloned() { - Some(v) => v.clone(), - None => make_expr_error_node( - ExprErrorKind::InternalExprError, - &"malformed field: missing type_expr".to_string(), - &n.span.clone(), - ), - } + Some(v) => v.clone(), + None => make_expr_error_node(ExprErrorKind::InternalExprError, &"malformed field: missing type_expr".to_string(), &n.span.clone()), +} } pub fn field_node_cardinality(n: Rc) -> Cardinality { @@ -1272,52 +984,41 @@ pub fn field_node_default_value(n: &Rc) -> Option> { } } -pub fn field_node_from_key( - n: Rc, - source_indices: Rc>>, -) -> Option { +pub fn field_node_from_key(n: Rc, source_indices: Rc>>) -> Option { match n.properties.clone().first().cloned() { - Some(p) => Some(authored_name_at(source_indices, &p)), - None => None, - } + Some(p) => Some(authored_name_at(source_indices, &p)), + None => None, +} } pub fn field_node_span(n: Rc) -> Rc { n.span.clone() } -pub fn make_variant_node( - name: &String, - fields: Rc>>, - span: Rc, - name_span: Rc, -) -> Rc { +pub fn make_variant_node(name: &String, fields: Rc>>, span: Rc, name_span: Rc) -> Rc { Rc::new(Node { - name: name.clone(), - span: span, - ident_span: default_ident_span(name.clone(), name_span), - children: fields, - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }) -} - -pub fn variant_node_name_at( - n: Rc, - source_indices: Rc>>, -) -> String { + name: name.clone(), + span: span, + ident_span: default_ident_span(name.clone(), name_span), + children: fields, + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}) +} + +pub fn variant_node_name_at(n: Rc, source_indices: Rc>>) -> String { authored_name_at(source_indices, &n) } @@ -1358,49 +1059,7 @@ pub fn wrapper_child_roles() -> Rc>>>> { } pub fn is_child_accessor_in_model(name: String) -> bool { - ({ - let mut __found = false; - for roles in Rc::new(v2_rt::map_values(&expr_child_roles())) - .iter() - .cloned() - { - if { - let mut __found = false; - for r in roles.clone().iter().cloned() { - if (r.accessor.clone().as_str() == name.clone().as_str()) { - __found = true; - break; - } - } - __found - } { - __found = true; - break; - } - } - __found - } || { - let mut __found = false; - for roles in Rc::new(v2_rt::map_values(&wrapper_child_roles())) - .iter() - .cloned() - { - if { - let mut __found = false; - for r in roles.clone().iter().cloned() { - if (r.accessor.clone().as_str() == name.clone().as_str()) { - __found = true; - break; - } - } - __found - } { - __found = true; - break; - } - } - __found - }) + ({ let mut __found = false; for roles in Rc::new(v2_rt::map_values(&expr_child_roles())).iter().cloned() { if { let mut __found = false; for r in roles.clone().iter().cloned() { if (r.accessor.clone().as_str() == name.clone().as_str()) { __found = true; break; } } __found } { __found = true; break; } } __found } || { let mut __found = false; for roles in Rc::new(v2_rt::map_values(&wrapper_child_roles())).iter().cloned() { if { let mut __found = false; for r in roles.clone().iter().cloned() { if (r.accessor.clone().as_str() == name.clone().as_str()) { __found = true; break; } } __found } { __found = true; break; } } __found }) } pub fn child_roles_for_variant(variant_name: String) -> Option>>> { @@ -1432,17 +1091,17 @@ pub fn node_field_roles() -> Rc> { pub fn is_children_list_field(field_name: String) -> bool { match v2_rt::lookup(&node_field_roles(), field_name) { - Some(NodeFieldRole::ChildrenListField) => true, - _ => false, - } + Some(NodeFieldRole::ChildrenListField) => true, + _ => false, +} } pub fn is_sub_value_field(field_name: String) -> bool { match v2_rt::lookup(&node_field_roles(), field_name) { - Some(NodeFieldRole::SubValueField) => true, - Some(NodeFieldRole::ChildrenListField) => true, - _ => false, - } + Some(NodeFieldRole::SubValueField) => true, + Some(NodeFieldRole::ChildrenListField) => true, + _ => false, +} } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -1450,111 +1109,91 @@ pub fn is_sub_value_field(field_name: String) -> bool { pub enum FunctionSizeEffect { TreeSizePreserving, TreeSizeReducing, - PropertyContraction { domain_size: i64 }, + PropertyContraction { + domain_size: i64, + }, } impl FunctionSizeEffect { pub fn domain_size(&self) -> i64 { match self { FunctionSizeEffect::TreeSizePreserving => panic!("no domain_size on unit variant"), FunctionSizeEffect::TreeSizeReducing => panic!("no domain_size on unit variant"), - FunctionSizeEffect::PropertyContraction { - domain_size: __val, .. - } => __val.clone(), + FunctionSizeEffect::PropertyContraction { domain_size: __val, .. } => __val.clone(), } } } pub fn function_size_effects() -> Rc>> { thread_local! { - static CACHED: Rc>> = { - let mut __m = HashMap::new(); - __m.insert("with_required_cardinality".to_string(), Rc::new(FunctionSizeEffect::PropertyContraction { - domain_size: 2, - })); - __m.insert("resolved_type".to_string(), Rc::new(FunctionSizeEffect::TreeSizeReducing)); - __m.insert("param_node_type_expr".to_string(), Rc::new(FunctionSizeEffect::TreeSizeReducing)); - __m.insert("field_binding_pattern".to_string(), Rc::new(FunctionSizeEffect::TreeSizeReducing)); - __m.insert("wrapper_inner_arg".to_string(), Rc::new(FunctionSizeEffect::TreeSizeReducing)); - __m.insert("extractor_inner_arg".to_string(), Rc::new(FunctionSizeEffect::TreeSizeReducing)); - __m.insert("child_type_node".to_string(), Rc::new(FunctionSizeEffect::TreeSizeReducing)); - Rc::new(__m) - }; - } + static CACHED: Rc>> = { + let mut __m = HashMap::new(); + __m.insert("with_required_cardinality".to_string(), Rc::new(FunctionSizeEffect::PropertyContraction { + domain_size: 2, +})); + __m.insert("resolved_type".to_string(), Rc::new(FunctionSizeEffect::TreeSizeReducing)); + __m.insert("param_node_type_expr".to_string(), Rc::new(FunctionSizeEffect::TreeSizeReducing)); + __m.insert("field_binding_pattern".to_string(), Rc::new(FunctionSizeEffect::TreeSizeReducing)); + __m.insert("wrapper_inner_arg".to_string(), Rc::new(FunctionSizeEffect::TreeSizeReducing)); + __m.insert("extractor_inner_arg".to_string(), Rc::new(FunctionSizeEffect::TreeSizeReducing)); + __m.insert("child_type_node".to_string(), Rc::new(FunctionSizeEffect::TreeSizeReducing)); + Rc::new(__m) + }; + } CACHED.with(|c| c.clone()) } pub fn is_tree_size_preserving(func_name: String) -> bool { - match v2_rt::lookup(&function_size_effects(), func_name) - .as_deref() - .cloned() - { - Some(FunctionSizeEffect::TreeSizePreserving) => true, - Some(FunctionSizeEffect::PropertyContraction { .. }) => true, - _ => false, - } + match v2_rt::lookup(&function_size_effects(), func_name).as_deref().cloned() { + Some(FunctionSizeEffect::TreeSizePreserving) => true, + Some(FunctionSizeEffect::PropertyContraction { .. }) => true, + _ => false, +} } pub fn is_tree_size_reducing(func_name: String) -> bool { - match v2_rt::lookup(&function_size_effects(), func_name) - .as_deref() - .cloned() - { - Some(FunctionSizeEffect::TreeSizeReducing) => true, - _ => false, - } + match v2_rt::lookup(&function_size_effects(), func_name).as_deref().cloned() { + Some(FunctionSizeEffect::TreeSizeReducing) => true, + _ => false, +} } pub fn is_property_contraction(func_name: String) -> bool { - match v2_rt::lookup(&function_size_effects(), func_name) - .as_deref() - .cloned() - { - Some(FunctionSizeEffect::PropertyContraction { .. }) => true, - _ => false, - } + match v2_rt::lookup(&function_size_effects(), func_name).as_deref().cloned() { + Some(FunctionSizeEffect::PropertyContraction { .. }) => true, + _ => false, +} } pub fn expr_child_at(texpr: &Rc, index: i64, role: String) -> Rc { match texpr.children.clone().get(index as usize).cloned() { - Some(v) => v.clone(), - None => make_expr_error_node( - ExprErrorKind::InternalExprError, - &v2_rt::concat("malformed node: missing ".to_string(), role), - &texpr.span.clone(), - ), - } + Some(v) => v.clone(), + None => make_expr_error_node(ExprErrorKind::InternalExprError, &v2_rt::concat("malformed node: missing ".to_string(), role), &texpr.span.clone()), +} } -pub fn arg_name_at( - n: Rc, - source_indices: Rc>>, -) -> Option { +pub fn arg_name_at(n: Rc, source_indices: Rc>>) -> Option { { let name = authored_name_at(source_indices, &n); - if (name.clone().as_str() == "".to_string().as_str()) { +if (name.clone().as_str() == "".to_string().as_str()) { None } else { Some(name.clone()) } - } +} } pub fn arg_value(n: &Rc) -> Rc { match n.children.clone().first().cloned() { - Some(v) => v.clone(), - None => make_expr_error_node( - ExprErrorKind::InternalExprError, - &"malformed arg: missing value".to_string(), - &n.span.clone(), - ), - } + Some(v) => v.clone(), + None => make_expr_error_node(ExprErrorKind::InternalExprError, &"malformed arg: missing value".to_string(), &n.span.clone()), +} } pub fn arm_pattern(n: Rc) -> Rc { match n.match_pattern.clone() { - Some(p) => p.clone(), - None => Rc::new(MatchPattern::Wildcard), - } + Some(p) => p.clone(), + None => Rc::new(MatchPattern::Wildcard), +} } pub fn arm_guard(n: &Rc) -> Option> { @@ -1567,31 +1206,20 @@ pub fn arm_guard(n: &Rc) -> Option> { pub fn arm_body(n: &Rc) -> Rc { match n.children.clone().last().cloned() { - Some(v) => v.clone(), - None => make_expr_error_node( - ExprErrorKind::InternalExprError, - &"malformed arm: missing body".to_string(), - &n.span.clone(), - ), - } + Some(v) => v.clone(), + None => make_expr_error_node(ExprErrorKind::InternalExprError, &"malformed arm: missing body".to_string(), &n.span.clone()), +} } -pub fn field_init_node_name_at( - n: Rc, - source_indices: Rc>>, -) -> String { +pub fn field_init_node_name_at(n: Rc, source_indices: Rc>>) -> String { authored_name_at(source_indices, &n) } pub fn field_init_node_value(n: &Rc) -> Rc { match n.children.clone().first().cloned() { - Some(v) => v.clone(), - None => make_expr_error_node( - ExprErrorKind::InternalExprError, - &"malformed field-init: missing value".to_string(), - &n.span.clone(), - ), - } + Some(v) => v.clone(), + None => make_expr_error_node(ExprErrorKind::InternalExprError, &"malformed field-init: missing value".to_string(), &n.span.clone()), +} } pub fn if_condition(texpr: Rc) -> Rc { @@ -1611,15 +1239,7 @@ pub fn match_scrutinee(texpr: Rc) -> Rc { } pub fn match_arm_nodes(texpr: Rc) -> Rc>> { - Rc::new( - texpr - .children - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ) + Rc::new(texpr.children.clone().iter().cloned().skip(1 as usize).collect::>()) } pub fn binop_left(texpr: Rc) -> Rc { @@ -1634,10 +1254,7 @@ pub fn unaryop_operand(texpr: Rc) -> Rc { expr_child_at(&texpr, 0, "unaryop operand".to_string()) } -pub fn expr_var_name_at( - texpr: Rc, - source_indices: Rc>>, -) -> String { +pub fn expr_var_name_at(texpr: Rc, source_indices: Rc>>) -> String { authored_name_at(source_indices, &texpr) } @@ -1645,35 +1262,26 @@ pub fn field_access_base(texpr: Rc) -> Rc { expr_child_at(&texpr, 0, "field access base".to_string()) } -pub fn field_access_field_at( - texpr: Rc, - source_indices: Rc>>, -) -> String { +pub fn field_access_field_at(texpr: Rc, source_indices: Rc>>) -> String { authored_name_at(source_indices, &texpr) } pub fn expr_field_access_summary(texpr: Rc) -> Option> { match (*texpr.expr_data.clone()).clone() { - ExprData::ExprFieldAccess { summary: s, .. } => s.clone(), - _ => None, - } + ExprData::ExprFieldAccess { summary: s, .. } => s.clone(), + _ => None, +} } -pub fn expr_call_func_at( - texpr: Rc, - source_indices: Rc>>, -) -> String { +pub fn expr_call_func_at(texpr: Rc, source_indices: Rc>>) -> String { authored_name_at(source_indices, &texpr) } pub fn expr_call_descent_evidence(texpr: Rc) -> Option>>> { match (*texpr.expr_data.clone()).clone() { - ExprData::ExprCall { - descent_evidence: de, - .. - } => de.clone(), - _ => None, - } + ExprData::ExprCall { descent_evidence: de, .. } => de.clone(), + _ => None, +} } pub fn method_receiver(texpr: Rc) -> Rc { @@ -1681,60 +1289,26 @@ pub fn method_receiver(texpr: Rc) -> Rc { } pub fn method_arg_nodes(texpr: Rc) -> Rc>> { - Rc::new( - texpr - .children - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ) -} - -pub fn expr_method_name_at( - texpr: Rc, - source_indices: Rc>>, -) -> String { + Rc::new(texpr.children.clone().iter().cloned().skip(1 as usize).collect::>()) +} + +pub fn expr_method_name_at(texpr: Rc, source_indices: Rc>>) -> String { authored_name_at(source_indices, &texpr) } pub fn expr_method_call_semantics(texpr: Rc) -> Option> { match (*texpr.expr_data.clone()).clone() { - ExprData::ExprMethodCall { - method_semantics: ms, - .. - } => ms.clone(), - _ => None, - } + ExprData::ExprMethodCall { method_semantics: ms, .. } => ms.clone(), + _ => None, +} } pub fn lambda_body(texpr: Rc) -> Rc { expr_child_at(&texpr, 0, "lambda body".to_string()) } -pub fn lambda_param_names_at( - texpr: Rc, - source_indices: Rc>>, -) -> Rc> { - Rc::new({ - let mut __result = Vec::new(); - for n in Rc::new( - texpr - .children - .clone() - .iter() - .cloned() - .skip(1 as usize) - .collect::>(), - ) - .iter() - .cloned() - { - __result.push(authored_name_at(source_indices.clone(), &n)); - } - __result - }) +pub fn lambda_param_names_at(texpr: Rc, source_indices: Rc>>) -> Rc> { + Rc::new({ let mut __result = Vec::new(); for n in Rc::new(texpr.children.clone().iter().cloned().skip(1 as usize).collect::>()).iter().cloned() { __result.push(authored_name_at(source_indices.clone(), &n)); } __result }) } pub fn let_value(texpr: Rc) -> Rc { @@ -1745,10 +1319,7 @@ pub fn let_body(texpr: Rc) -> Option> { texpr.children.clone().get(1 as usize).cloned() } -pub fn let_binding_name_at( - texpr: Rc, - source_indices: Rc>>, -) -> String { +pub fn let_binding_name_at(texpr: Rc, source_indices: Rc>>) -> String { authored_name_at(source_indices, &texpr) } @@ -1768,10 +1339,7 @@ pub fn foreach_body(texpr: Rc) -> Rc { expr_child_at(&texpr, 1, "foreach body".to_string()) } -pub fn foreach_variable_at( - texpr: Rc, - source_indices: Rc>>, -) -> String { +pub fn foreach_variable_at(texpr: Rc, source_indices: Rc>>) -> String { authored_name_at(source_indices, &texpr) } @@ -1803,18 +1371,15 @@ pub fn block_stmts(texpr: Rc) -> Rc>> { texpr.children.clone() } -pub fn record_lit_type_name_at( - texpr: Rc, - source_indices: Rc>>, -) -> Option { +pub fn record_lit_type_name_at(texpr: Rc, source_indices: Rc>>) -> Option { { let name = authored_name_at(source_indices, &texpr); - if (name.clone().as_str() == "".to_string().as_str()) { +if (name.clone().as_str() == "".to_string().as_str()) { None } else { Some(name.clone()) } - } +} } pub fn transport_url_key() -> String { @@ -1925,245 +1490,138 @@ pub fn transport_headers_key() -> String { CACHED.with(|c| c.clone()) } -pub fn make_transport_node( - properties: Rc>>, - children: Rc>>, - body: Option>, - span: Rc, -) -> Rc { +pub fn make_transport_node(properties: Rc>>, children: Rc>>, body: Option>, span: Rc) -> Rc { Rc::new(Node { - name: "".to_string(), - span: span, - ident_span: None, - children: children, - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: body, - transport: None, - properties: properties, - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }) + name: "".to_string(), + span: span, + ident_span: None, + children: children, + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: body, + transport: None, + properties: properties, + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}) } pub fn local_transport_node(span: Rc) -> Rc { make_transport_node(Rc::new(vec![]), Rc::new(vec![]), None, span) } -pub fn rest_transport_node( - base_url: Rc, - auth_props: Rc>>, - headers: Rc>>, - method: Option>, - path: Option>, - query: Option>, - request_body: Option>, - response_format: Option>, - span: Rc, -) -> Rc { +pub fn rest_transport_node(base_url: Rc, auth_props: Rc>>, headers: Rc>>, method: Option>, path: Option>, query: Option>, request_body: Option>, response_format: Option>, span: Rc) -> Rc { { let zero_span = make_span(0, 0); - let url_field = make_field_init_node( - &transport_url_key(), - base_url, - zero_span.clone(), - zero_span.clone(), - ); - let method_props = match method { - Some(m) => Rc::new(vec![make_field_init_node( - &transport_method_key(), - m.clone(), - zero_span.clone(), - zero_span.clone(), - )]), - None => Rc::new(vec![]), - }; - let path_props = match path { - Some(p) => Rc::new(vec![make_field_init_node( - &transport_path_template_key(), - p.clone(), - zero_span.clone(), - zero_span.clone(), - )]), - None => Rc::new(vec![]), - }; - let query_props = match query { - Some(q) => Rc::new(vec![make_field_init_node( - &transport_query_key(), - q.clone(), - zero_span.clone(), - zero_span.clone(), - )]), - None => Rc::new(vec![]), - }; - let body_props = match request_body { - Some(b) => Rc::new(vec![make_field_init_node( - &transport_body_key(), - b.clone(), - zero_span.clone(), - zero_span.clone(), - )]), - None => Rc::new(vec![]), - }; - let rf_props = match response_format { - Some(rf) => Rc::new(vec![make_field_init_node( - &transport_response_format_key(), - rf.clone(), - zero_span.clone(), - zero_span.clone(), - )]), - None => Rc::new(vec![]), - }; - let props = v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(Rc::new(vec![url_field]), method_props), - path_props, - ), - query_props, - ), - body_props, - ), - rf_props, - ), - auth_props, - ), - headers, - ); - make_transport_node(props, Rc::new(vec![]), None, span) - } +let url_field = make_field_init_node(&transport_url_key(), base_url, zero_span.clone(), zero_span.clone()); +let method_props = match method { + Some(m) => Rc::new(vec![make_field_init_node(&transport_method_key(), m.clone(), zero_span.clone(), zero_span.clone())]), + None => Rc::new(vec![]), +}; +let path_props = match path { + Some(p) => Rc::new(vec![make_field_init_node(&transport_path_template_key(), p.clone(), zero_span.clone(), zero_span.clone())]), + None => Rc::new(vec![]), +}; +let query_props = match query { + Some(q) => Rc::new(vec![make_field_init_node(&transport_query_key(), q.clone(), zero_span.clone(), zero_span.clone())]), + None => Rc::new(vec![]), +}; +let body_props = match request_body { + Some(b) => Rc::new(vec![make_field_init_node(&transport_body_key(), b.clone(), zero_span.clone(), zero_span.clone())]), + None => Rc::new(vec![]), +}; +let rf_props = match response_format { + Some(rf) => Rc::new(vec![make_field_init_node(&transport_response_format_key(), rf.clone(), zero_span.clone(), zero_span.clone())]), + None => Rc::new(vec![]), +}; +let props = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(Rc::new(vec![url_field]), method_props), path_props), query_props), body_props), rf_props), auth_props), headers); +make_transport_node(props, Rc::new(vec![]), None, span) +} } -pub fn shell_transport_node( - argv: Rc>>, - env: Rc>>, - stdin: Option>, - span: &Rc, -) -> Rc { +pub fn shell_transport_node(argv: Rc>>, env: Rc>>, stdin: Option>, span: &Rc) -> Rc { { let shell_marker = Rc::new(Node { - name: "".to_string(), - span: span.clone(), - ident_span: None, - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }); - let zero_span = make_span(0, 0); - let stdin_props = match stdin { - Some(s) => Rc::new(vec![make_field_init_node( - &transport_stdin_key(), - s.clone(), - zero_span.clone(), - zero_span.clone(), - )]), - None => Rc::new(vec![]), - }; - let all_props = v2_rt::concat(env, stdin_props); - Rc::new(Node { - name: "".to_string(), - span: span.clone(), - ident_span: None, - children: argv, - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: Some(shell_marker), - transport: None, - properties: all_props, - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }) - } + name: "".to_string(), + span: span.clone(), + ident_span: None, + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}); +let zero_span = make_span(0, 0); +let stdin_props = match stdin { + Some(s) => Rc::new(vec![make_field_init_node(&transport_stdin_key(), s.clone(), zero_span.clone(), zero_span.clone())]), + None => Rc::new(vec![]), +}; +let all_props = v2_rt::concat(env, stdin_props); +Rc::new(Node { + name: "".to_string(), + span: span.clone(), + ident_span: None, + children: argv, + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: Some(shell_marker), + transport: None, + properties: all_props, + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}) +} } pub fn file_transport_node(base_path: Rc, span: Rc) -> Rc { { - let path_field = make_field_init_node( - &transport_path_key(), - base_path, - make_span(0, 0), - make_span(0, 0), - ); - make_transport_node(Rc::new(vec![path_field]), Rc::new(vec![]), None, span) - } + let path_field = make_field_init_node(&transport_path_key(), base_path, make_span(0, 0), make_span(0, 0)); +make_transport_node(Rc::new(vec![path_field]), Rc::new(vec![]), None, span) +} } -pub fn find_property( - props: Rc>>, - prop_name: String, - source_indices: Rc>>, -) -> Option> { - match Rc::new({ - let mut __result = Vec::new(); - for p in props.iter().cloned() { - if (field_init_node_name_at(p.clone(), source_indices.clone()).as_str() - == prop_name.clone().as_str()) - { - __result.push(p); - } - } - __result - }) - .first() - .cloned() - { - Some(fi) => Some(field_init_node_value(&fi)), - None => None, - } +pub fn find_property(props: Rc>>, prop_name: String, source_indices: Rc>>) -> Option> { + match Rc::new({ let mut __result = Vec::new(); for p in props.iter().cloned() { if (field_init_node_name_at(p.clone(), source_indices.clone()).as_str() == prop_name.clone().as_str()) { __result.push(p); } } __result }).first().cloned() { + Some(fi) => Some(field_init_node_value(&fi)), + None => None, +} } -pub fn find_property_string( - props: Rc>>, - prop_name: String, - source_indices: Rc>>, -) -> Option { +pub fn find_property_string(props: Rc>>, prop_name: String, source_indices: Rc>>) -> Option { match find_property(props, prop_name, source_indices) { - Some(n) => match (*n.expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { - let LiteralValue::LitStr { value: s, .. } = value.as_ref() else { - unreachable!() - }; - Some(s.clone()) - } - _ => None, - }, - None => None, - } + Some(n) => match (*n.expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitStr { value: s, .. } = value.as_ref() else { unreachable!() }; Some(s.clone()) }, + _ => None, +}, + None => None, +} } -pub fn transport_base_path( - t: Rc, - source_indices: Rc>>, -) -> Option> { +pub fn transport_base_path(t: Rc, source_indices: Rc>>) -> Option> { find_property(t.properties.clone(), transport_path_key(), source_indices) } @@ -2171,10 +1629,7 @@ pub fn transport_has_argv(t: Rc) -> bool { ((t.children.clone().len() as i64) > 0) } -pub fn is_rest_transport( - t: Rc, - source_indices: Rc>>, -) -> bool { +pub fn is_rest_transport(t: Rc, source_indices: Rc>>) -> bool { (transport_base_url(t, source_indices) != None) } @@ -2182,28 +1637,18 @@ pub fn is_shell_transport(t: Rc) -> bool { (t.body.clone() != None) } -pub fn is_file_transport( - t: Rc, - source_indices: Rc>>, -) -> bool { +pub fn is_file_transport(t: Rc, source_indices: Rc>>) -> bool { (transport_base_path(t, source_indices) != None) } -pub fn is_local_transport( - t: &Rc, - source_indices: &Rc>>, -) -> bool { - ((!is_rest_transport(t.clone(), source_indices.clone()) && !is_shell_transport(t.clone())) - && !is_file_transport(t.clone(), source_indices.clone())) +pub fn is_local_transport(t: &Rc, source_indices: &Rc>>) -> bool { + ((!is_rest_transport(t.clone(), source_indices.clone()) && !is_shell_transport(t.clone())) && !is_file_transport(t.clone(), source_indices.clone())) } -pub fn field_init_operation_modifier( - field_init: Rc, - source_indices: Rc>>, -) -> Option { +pub fn field_init_operation_modifier(field_init: Rc, source_indices: Rc>>) -> Option { { let fi_name = field_init_node_name_at(field_init, source_indices); - if (fi_name.clone().as_str() == "idempotent".to_string().as_str()) { +if (fi_name.clone().as_str() == "idempotent".to_string().as_str()) { Some(OperationModifier::Idempotent) } else { if (fi_name.clone().as_str() == "readonly".to_string().as_str()) { @@ -2216,700 +1661,304 @@ pub fn field_init_operation_modifier( } } } - } +} } pub fn operation_modifier_name(modifier: OperationModifier) -> String { match modifier { - OperationModifier::Idempotent => "idempotent".to_string(), - OperationModifier::Readonly => "readonly".to_string(), - OperationModifier::Hermetic => "hermetic".to_string(), - } + OperationModifier::Idempotent => "idempotent".to_string(), + OperationModifier::Readonly => "readonly".to_string(), + OperationModifier::Hermetic => "hermetic".to_string(), +} } -pub fn transport_base_url( - t: Rc, - source_indices: Rc>>, -) -> Option> { +pub fn transport_base_url(t: Rc, source_indices: Rc>>) -> Option> { find_property(t.properties.clone(), transport_url_key(), source_indices) } -pub fn transport_auth_token( - t: Rc, - source_indices: Rc>>, -) -> Option> { - find_property( - t.properties.clone(), - transport_auth_token_key(), - source_indices, - ) -} - -pub fn transport_auth_header_name( - t: Rc, - source_indices: Rc>>, -) -> Option { - find_property_string( - t.properties.clone(), - transport_auth_header_key(), - source_indices, - ) -} - -pub fn transport_has_auth( - t: Rc, - source_indices: Rc>>, -) -> bool { - match find_property( - t.properties.clone(), - transport_auth_token_key(), - source_indices, - ) { - Some(_) => true, - None => false, - } +pub fn transport_auth_token(t: Rc, source_indices: Rc>>) -> Option> { + find_property(t.properties.clone(), transport_auth_token_key(), source_indices) +} + +pub fn transport_auth_header_name(t: Rc, source_indices: Rc>>) -> Option { + find_property_string(t.properties.clone(), transport_auth_header_key(), source_indices) +} + +pub fn transport_has_auth(t: Rc, source_indices: Rc>>) -> bool { + match find_property(t.properties.clone(), transport_auth_token_key(), source_indices) { + Some(_) => true, + None => false, +} } -pub fn transport_method( - t: Rc, - source_indices: Rc>>, -) -> Option> { +pub fn transport_method(t: Rc, source_indices: Rc>>) -> Option> { find_property(t.properties.clone(), transport_method_key(), source_indices) } -pub fn transport_path_template( - t: Rc, - source_indices: Rc>>, -) -> Option> { - find_property( - t.properties.clone(), - transport_path_template_key(), - source_indices, - ) +pub fn transport_path_template(t: Rc, source_indices: Rc>>) -> Option> { + find_property(t.properties.clone(), transport_path_template_key(), source_indices) } -pub fn transport_query( - t: Rc, - source_indices: Rc>>, -) -> Option> { +pub fn transport_query(t: Rc, source_indices: Rc>>) -> Option> { find_property(t.properties.clone(), transport_query_key(), source_indices) } -pub fn transport_request_body( - t: Rc, - source_indices: Rc>>, -) -> Option> { +pub fn transport_request_body(t: Rc, source_indices: Rc>>) -> Option> { find_property(t.properties.clone(), transport_body_key(), source_indices) } -pub fn transport_stdin( - t: Rc, - source_indices: Rc>>, -) -> Option> { +pub fn transport_stdin(t: Rc, source_indices: Rc>>) -> Option> { find_property(t.properties.clone(), transport_stdin_key(), source_indices) } -pub fn transport_response_format( - t: Rc, - source_indices: Rc>>, -) -> Option> { - find_property( - t.properties.clone(), - transport_response_format_key(), - source_indices, - ) +pub fn transport_response_format(t: Rc, source_indices: Rc>>) -> Option> { + find_property(t.properties.clone(), transport_response_format_key(), source_indices) } pub fn is_config_reserved_key(name: &String) -> bool { - ((((((((((((name.clone().as_str() == transport_url_key().as_str()) - || (name.clone().as_str() == transport_path_key().as_str())) - || (name.clone().as_str() == transport_auth_scheme_key().as_str())) - || (name.clone().as_str() == transport_auth_header_key().as_str())) - || (name.clone().as_str() == transport_auth_token_key().as_str())) - || (name.clone().as_str() == transport_method_key().as_str())) - || (name.clone().as_str() == transport_path_template_key().as_str())) - || (name.clone().as_str() == transport_query_key().as_str())) - || (name.clone().as_str() == transport_body_key().as_str())) - || (name.clone().as_str() == transport_stdin_key().as_str())) - || (name.clone().as_str() == transport_response_format_key().as_str())) - || (name.clone().as_str() == transport_headers_key().as_str())) -} - -pub fn transport_headers( - t: Rc, - source_indices: Rc>>, -) -> Rc>> { - Rc::new({ - let mut __result = Vec::new(); - for p in t.properties.clone().iter().cloned() { - if !is_config_reserved_key(&field_init_node_name_at(p.clone(), source_indices.clone())) - { - __result.push(p); - } - } - __result - }) + ((((((((((((name.clone().as_str() == transport_url_key().as_str()) || (name.clone().as_str() == transport_path_key().as_str())) || (name.clone().as_str() == transport_auth_scheme_key().as_str())) || (name.clone().as_str() == transport_auth_header_key().as_str())) || (name.clone().as_str() == transport_auth_token_key().as_str())) || (name.clone().as_str() == transport_method_key().as_str())) || (name.clone().as_str() == transport_path_template_key().as_str())) || (name.clone().as_str() == transport_query_key().as_str())) || (name.clone().as_str() == transport_body_key().as_str())) || (name.clone().as_str() == transport_stdin_key().as_str())) || (name.clone().as_str() == transport_response_format_key().as_str())) || (name.clone().as_str() == transport_headers_key().as_str())) } -pub fn transport_env( - t: Rc, - source_indices: Rc>>, -) -> Rc>> { - Rc::new({ - let mut __result = Vec::new(); - for p in t.properties.clone().iter().cloned() { - if !is_config_reserved_key(&field_init_node_name_at(p.clone(), source_indices.clone())) - { - __result.push(p); - } - } - __result - }) +pub fn transport_headers(t: Rc, source_indices: Rc>>) -> Rc>> { + Rc::new({ let mut __result = Vec::new(); for p in t.properties.clone().iter().cloned() { if !is_config_reserved_key(&field_init_node_name_at(p.clone(), source_indices.clone())) { __result.push(p); } } __result }) } -pub fn map_children(node: &Rc, transform: impl Fn(Rc) -> Rc + Clone) -> Rc { - Rc::new(Node { - name: node.name.clone(), - ident: node.ident.clone(), - span: node.span.clone(), - ident_span: node.ident_span.clone(), - children: Rc::new({ - let mut __result = Vec::new(); - for child in node.children.clone().iter().cloned() { - __result.push(transform(child.clone())); - } - __result - }), - connective: node.connective.clone(), - params: node.params.clone(), - inferred: node.inferred.clone(), - return_cardinality: node.return_cardinality.clone(), - uses: node.uses.clone(), - body: node.body.clone(), - transport: node.transport.clone(), - properties: node.properties.clone(), - type_annotation: node.type_annotation.clone(), - is_self_recursive: node.is_self_recursive.clone(), - has_non_tail_self_call: node.has_non_tail_self_call.clone(), - match_pattern: node.match_pattern.clone(), - expr_data: node.expr_data.clone(), - }) +pub fn transport_env(t: Rc, source_indices: Rc>>) -> Rc>> { + Rc::new({ let mut __result = Vec::new(); for p in t.properties.clone().iter().cloned() { if !is_config_reserved_key(&field_init_node_name_at(p.clone(), source_indices.clone())) { __result.push(p); } } __result }) } -pub fn expr_has_self_call( - texpr: &Rc, - fn_name: &String, - source_indices: &Rc>>, -) -> bool { +pub fn map_children(node: &Rc, transform: impl Fn(Rc) -> Rc + Clone) -> Rc { + Rc::new(Node { + name: node.name.clone(), + ident: node.ident.clone(), + span: node.span.clone(), + ident_span: node.ident_span.clone(), + children: Rc::new({ let mut __result = Vec::new(); for child in node.children.clone().iter().cloned() { __result.push(transform(child.clone())); } __result }), + connective: node.connective.clone(), + params: node.params.clone(), + inferred: node.inferred.clone(), + return_cardinality: node.return_cardinality.clone(), + uses: node.uses.clone(), + body: node.body.clone(), + transport: node.transport.clone(), + properties: node.properties.clone(), + type_annotation: node.type_annotation.clone(), + is_self_recursive: node.is_self_recursive.clone(), + has_non_tail_self_call: node.has_non_tail_self_call.clone(), + match_pattern: node.match_pattern.clone(), + expr_data: node.expr_data.clone(), +}) +} + +pub fn expr_has_self_call(texpr: &Rc, fn_name: &String, source_indices: &Rc>>) -> bool { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*texpr.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { - if (expr_call_func_at(texpr.clone(), source_indices.clone()).as_str() - == fn_name.clone().as_str()) - { - true - } else { - { - let mut __found = false; - for child in texpr.children.clone().iter().cloned() { - if expr_has_self_call(&child, &fn_name, &source_indices) { - __found = true; - break; - } - } - __found - } - } - } - _ => { - let mut __found = false; - for child in texpr.children.clone().iter().cloned() { - if expr_has_self_call(&child, &fn_name, &source_indices) { - __found = true; - break; - } - } - __found - } - } + ExprData::ExprCall { .. } => if (expr_call_func_at(texpr.clone(), source_indices.clone()).as_str() == fn_name.clone().as_str()) { + true + } else { + { let mut __found = false; for child in texpr.children.clone().iter().cloned() { if expr_has_self_call(&child, &fn_name, &source_indices) { __found = true; break; } } __found } + }, + _ => { let mut __found = false; for child in texpr.children.clone().iter().cloned() { if expr_has_self_call(&child, &fn_name, &source_indices) { __found = true; break; } } __found }, +} }) } -pub fn expr_has_non_tail_self_call( - texpr: &Rc, - fn_name: &String, - in_tail: bool, - source_indices: &Rc>>, -) -> bool { +pub fn expr_has_non_tail_self_call(texpr: &Rc, fn_name: &String, in_tail: bool, source_indices: &Rc>>) -> bool { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*texpr.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { - if (expr_call_func_at(texpr.clone(), source_indices.clone()).as_str() - == fn_name.clone().as_str()) - { - if (in_tail.clone() == false) { - true - } else { - { - let mut __found = false; - for child in texpr.children.clone().iter().cloned() { - if expr_has_non_tail_self_call( - &child, - &fn_name, - false, - &source_indices, - ) { - __found = true; - break; - } - } - __found - } - } - } else { - { - let mut __found = false; - for child in texpr.children.clone().iter().cloned() { - if expr_has_non_tail_self_call(&child, &fn_name, false, &source_indices) - { - __found = true; - break; - } - } - __found - } - } - } - ExprData::ExprError { .. } => false, - ExprData::ExprVar { .. } => false, - ExprData::ExprLiteral { .. } => false, - ExprData::ExprFieldAccess { .. } => { - let mut __found = false; - for child in texpr.children.clone().iter().cloned() { - if expr_has_non_tail_self_call(&child, &fn_name, false, &source_indices) { - __found = true; - break; - } - } - __found - } - ExprData::ExprMethodCall { .. } => { - let mut __found = false; - for child in texpr.children.clone().iter().cloned() { - if expr_has_non_tail_self_call(&child, &fn_name, false, &source_indices) { - __found = true; - break; - } - } - __found - } - ExprData::ExprIf => { - let cond_bad = expr_has_non_tail_self_call( - &if_condition(texpr.clone()), - &fn_name, - false, - &source_indices, - ); - let then_bad = expr_has_non_tail_self_call( - &if_then_branch(texpr.clone()), - &fn_name, - in_tail.clone(), - &source_indices, - ); - let else_bad = match if_else_branch(texpr.clone()) { - Some(e) => { - expr_has_non_tail_self_call(&e, &fn_name, in_tail.clone(), &source_indices) - } - None => false, - }; - ((cond_bad || then_bad) || else_bad) - } - ExprData::ExprMatch => { - let scrut_bad = expr_has_non_tail_self_call( - &match_scrutinee(texpr.clone()), - &fn_name, - false, - &source_indices, - ); - let arms_bad = { - let mut __found = false; - for arm_node in match_arm_nodes(texpr.clone()).iter().cloned() { - if expr_has_non_tail_self_call( - &arm_body(&arm_node), - &fn_name, - in_tail.clone(), - &source_indices, - ) { - __found = true; - break; - } - } - __found - }; - (scrut_bad || arms_bad) - } - ExprData::ExprLet => { - let val_bad = expr_has_non_tail_self_call( - &let_value(texpr.clone()), - &fn_name, - false, - &source_indices, - ); - let body_bad = match let_body(texpr.clone()) { - Some(b) => { - expr_has_non_tail_self_call(&b, &fn_name, in_tail.clone(), &source_indices) - } - None => false, - }; - (val_bad || body_bad) - } - ExprData::ExprBlock => { - let ss = texpr.children.clone(); - let ss_count = (ss.clone().len() as i64); - if (ss_count.clone() == 0) { - false - } else { - { - let init_bad = { - let mut __found = false; - for p in Rc::new({ - let mut __result = Vec::new(); - for p in Rc::new( - ss.clone() - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - { - if (p.0.clone() < (ss_count.clone() - 1)) { - __result.push(p); - } - } - __result - }) - .iter() - .cloned() - { - if expr_has_non_tail_self_call( - &p.1.clone(), - &fn_name, - false, - &source_indices, - ) { - __found = true; - break; - } - } - __found - }; - let last_bad = match ss.clone().last().cloned() { - Some(last_expr) => expr_has_non_tail_self_call( - &last_expr, - &fn_name, - in_tail.clone(), - &source_indices, - ), - None => false, - }; - (init_bad || last_bad) - } - } - } - ExprData::ExprReturn => { - let mut __found = false; - for child in texpr.children.clone().iter().cloned() { - if expr_has_non_tail_self_call(&child, &fn_name, true, &source_indices) { - __found = true; - break; - } - } - __found - } - ExprData::NoExprData => { - let mut __found = false; - for child in texpr.children.clone().iter().cloned() { - if expr_has_non_tail_self_call( - &child, - &fn_name, - in_tail.clone(), - &source_indices, - ) { - __found = true; - break; - } - } - __found + ExprData::ExprCall { .. } => if (expr_call_func_at(texpr.clone(), source_indices.clone()).as_str() == fn_name.clone().as_str()) { + if (in_tail.clone() == false) { + true + } else { + { let mut __found = false; for child in texpr.children.clone().iter().cloned() { if expr_has_non_tail_self_call(&child, &fn_name, false, &source_indices) { __found = true; break; } } __found } } - _ => { - let mut __found = false; - for child in texpr.children.clone().iter().cloned() { - if expr_has_non_tail_self_call(&child, &fn_name, false, &source_indices) { - __found = true; - break; - } - } - __found + } else { + { let mut __found = false; for child in texpr.children.clone().iter().cloned() { if expr_has_non_tail_self_call(&child, &fn_name, false, &source_indices) { __found = true; break; } } __found } + }, + ExprData::ExprError { .. } => false, + ExprData::ExprVar { .. } => false, + ExprData::ExprLiteral { .. } => false, + ExprData::ExprFieldAccess { .. } => { let mut __found = false; for child in texpr.children.clone().iter().cloned() { if expr_has_non_tail_self_call(&child, &fn_name, false, &source_indices) { __found = true; break; } } __found }, + ExprData::ExprMethodCall { .. } => { let mut __found = false; for child in texpr.children.clone().iter().cloned() { if expr_has_non_tail_self_call(&child, &fn_name, false, &source_indices) { __found = true; break; } } __found }, + ExprData::ExprIf => { + let cond_bad = expr_has_non_tail_self_call(&if_condition(texpr.clone()), &fn_name, false, &source_indices); +let then_bad = expr_has_non_tail_self_call(&if_then_branch(texpr.clone()), &fn_name, in_tail.clone(), &source_indices); +let else_bad = match if_else_branch(texpr.clone()) { + Some(e) => expr_has_non_tail_self_call(&e, &fn_name, in_tail.clone(), &source_indices), + None => false, +}; +((cond_bad || then_bad) || else_bad) +}, + ExprData::ExprMatch => { + let scrut_bad = expr_has_non_tail_self_call(&match_scrutinee(texpr.clone()), &fn_name, false, &source_indices); +let arms_bad = { let mut __found = false; for arm_node in match_arm_nodes(texpr.clone()).iter().cloned() { if expr_has_non_tail_self_call(&arm_body(&arm_node), &fn_name, in_tail.clone(), &source_indices) { __found = true; break; } } __found }; +(scrut_bad || arms_bad) +}, + ExprData::ExprLet => { + let val_bad = expr_has_non_tail_self_call(&let_value(texpr.clone()), &fn_name, false, &source_indices); +let body_bad = match let_body(texpr.clone()) { + Some(b) => expr_has_non_tail_self_call(&b, &fn_name, in_tail.clone(), &source_indices), + None => false, +}; +(val_bad || body_bad) +}, + ExprData::ExprBlock => { + let ss = texpr.children.clone(); +let ss_count = (ss.clone().len() as i64); +if (ss_count.clone() == 0) { + false + } else { + { + let init_bad = { let mut __found = false; for p in Rc::new({ let mut __result = Vec::new(); for p in Rc::new(ss.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { if (p.0.clone() < (ss_count.clone() - 1)) { __result.push(p); } } __result }).iter().cloned() { if expr_has_non_tail_self_call(&p.1.clone(), &fn_name, false, &source_indices) { __found = true; break; } } __found }; +let last_bad = match ss.clone().last().cloned() { + Some(last_expr) => expr_has_non_tail_self_call(&last_expr, &fn_name, in_tail.clone(), &source_indices), + None => false, +}; +(init_bad || last_bad) +} } - } +}, + ExprData::ExprReturn => { let mut __found = false; for child in texpr.children.clone().iter().cloned() { if expr_has_non_tail_self_call(&child, &fn_name, true, &source_indices) { __found = true; break; } } __found }, + ExprData::NoExprData => { let mut __found = false; for child in texpr.children.clone().iter().cloned() { if expr_has_non_tail_self_call(&child, &fn_name, in_tail.clone(), &source_indices) { __found = true; break; } } __found }, + _ => { let mut __found = false; for child in texpr.children.clone().iter().cloned() { if expr_has_non_tail_self_call(&child, &fn_name, false, &source_indices) { __found = true; break; } } __found }, +} }) } -pub fn service_config_properties( - endpoint: Rc, - auth: Option>, - auth_input: Option>, - auth_source: Option>, - rate_limit: Option>, - retry: Option>, -) -> Rc>> { +pub fn service_config_properties(endpoint: Rc, auth: Option>, auth_input: Option>, auth_source: Option>, rate_limit: Option>, retry: Option>) -> Rc>> { { let zero_span = make_span(0, 0); - let ep_prop = Rc::new(vec![make_field_init_node( - &"svc_endpoint".to_string(), - endpoint, - zero_span.clone(), - zero_span.clone(), - )]); - let auth_prop = match auth { - Some(a) => Rc::new(vec![make_field_init_node( - &"svc_auth".to_string(), - a.clone(), - zero_span.clone(), - zero_span.clone(), - )]), - None => Rc::new(vec![]), - }; - let auth_input_prop = match auth_input { - Some(ai) => Rc::new(vec![make_field_init_node( - &"svc_auth_input".to_string(), - ai.clone(), - zero_span.clone(), - zero_span.clone(), - )]), - None => Rc::new(vec![]), - }; - let auth_source_prop = match auth_source { - Some(src) => Rc::new(vec![make_field_init_node( - &"svc_auth_source".to_string(), - src.clone(), - zero_span.clone(), - zero_span.clone(), - )]), - None => Rc::new(vec![]), - }; - let rate_prop = match rate_limit { - Some(r) => Rc::new(vec![make_field_init_node( - &"svc_rate_limit".to_string(), - r.clone(), - zero_span.clone(), - zero_span.clone(), - )]), - None => Rc::new(vec![]), - }; - let retry_prop = match retry { - Some(r) => Rc::new(vec![make_field_init_node( - &"svc_retry".to_string(), - r.clone(), - zero_span.clone(), - zero_span.clone(), - )]), - None => Rc::new(vec![]), - }; - v2_rt::concat( - v2_rt::concat( - v2_rt::concat( - v2_rt::concat(v2_rt::concat(ep_prop, auth_prop), auth_input_prop), - auth_source_prop, - ), - rate_prop, - ), - retry_prop, - ) - } +let ep_prop = Rc::new(vec![make_field_init_node(&"svc_endpoint".to_string(), endpoint, zero_span.clone(), zero_span.clone())]); +let auth_prop = match auth { + Some(a) => Rc::new(vec![make_field_init_node(&"svc_auth".to_string(), a.clone(), zero_span.clone(), zero_span.clone())]), + None => Rc::new(vec![]), +}; +let auth_input_prop = match auth_input { + Some(ai) => Rc::new(vec![make_field_init_node(&"svc_auth_input".to_string(), ai.clone(), zero_span.clone(), zero_span.clone())]), + None => Rc::new(vec![]), +}; +let auth_source_prop = match auth_source { + Some(src) => Rc::new(vec![make_field_init_node(&"svc_auth_source".to_string(), src.clone(), zero_span.clone(), zero_span.clone())]), + None => Rc::new(vec![]), +}; +let rate_prop = match rate_limit { + Some(r) => Rc::new(vec![make_field_init_node(&"svc_rate_limit".to_string(), r.clone(), zero_span.clone(), zero_span.clone())]), + None => Rc::new(vec![]), +}; +let retry_prop = match retry { + Some(r) => Rc::new(vec![make_field_init_node(&"svc_retry".to_string(), r.clone(), zero_span.clone(), zero_span.clone())]), + None => Rc::new(vec![]), +}; +v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(ep_prop, auth_prop), auth_input_prop), auth_source_prop), rate_prop), retry_prop) +} } -pub fn has_service_config( - n: Rc, - source_indices: Rc>>, -) -> bool { - { - let mut __found = false; - for p in n.properties.clone().iter().cloned() { - if (field_init_node_name_at(p.clone(), source_indices.clone()).as_str() - == "svc_endpoint".to_string().as_str()) - { - __found = true; - break; - } - } - __found - } +pub fn has_service_config(n: Rc, source_indices: Rc>>) -> bool { + { let mut __found = false; for p in n.properties.clone().iter().cloned() { if (field_init_node_name_at(p.clone(), source_indices.clone()).as_str() == "svc_endpoint".to_string().as_str()) { __found = true; break; } } __found } } -pub fn service_config_endpoint( - n: Rc, - source_indices: Rc>>, -) -> Option> { - find_property( - n.properties.clone(), - "svc_endpoint".to_string(), - source_indices, - ) +pub fn service_config_endpoint(n: Rc, source_indices: Rc>>) -> Option> { + find_property(n.properties.clone(), "svc_endpoint".to_string(), source_indices) } -pub fn service_config_auth( - n: Rc, - source_indices: Rc>>, -) -> Option> { +pub fn service_config_auth(n: Rc, source_indices: Rc>>) -> Option> { find_property(n.properties.clone(), "svc_auth".to_string(), source_indices) } -pub fn service_config_rate_limit( - n: Rc, - source_indices: Rc>>, -) -> Option> { - find_property( - n.properties.clone(), - "svc_rate_limit".to_string(), - source_indices, - ) -} - -pub fn service_config_retry( - n: Rc, - source_indices: Rc>>, -) -> Option> { - find_property( - n.properties.clone(), - "svc_retry".to_string(), - source_indices, - ) -} - -pub fn service_config_auth_input( - n: Rc, - source_indices: Rc>>, -) -> Option> { - find_property( - n.properties.clone(), - "svc_auth_input".to_string(), - source_indices, - ) -} - -pub fn service_config_auth_source( - n: Rc, - source_indices: Rc>>, -) -> Option> { - find_property( - n.properties.clone(), - "svc_auth_source".to_string(), - source_indices, - ) -} - -pub fn module_node( - name: &String, - imports: Rc>>, - items: Rc>>, - span: &Rc, -) -> Rc { - Rc::new(Node { - name: name.clone(), - span: span.clone(), - ident_span: default_ident_span(name.clone(), span.clone()), - children: items, - connective: Connective::NoConnective, - params: imports, - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }) +pub fn service_config_rate_limit(n: Rc, source_indices: Rc>>) -> Option> { + find_property(n.properties.clone(), "svc_rate_limit".to_string(), source_indices) +} + +pub fn service_config_retry(n: Rc, source_indices: Rc>>) -> Option> { + find_property(n.properties.clone(), "svc_retry".to_string(), source_indices) +} + +pub fn service_config_auth_input(n: Rc, source_indices: Rc>>) -> Option> { + find_property(n.properties.clone(), "svc_auth_input".to_string(), source_indices) +} + +pub fn service_config_auth_source(n: Rc, source_indices: Rc>>) -> Option> { + find_property(n.properties.clone(), "svc_auth_source".to_string(), source_indices) } -pub fn import_node( - module_path: String, - is_all: bool, - specific_names: Rc>>, - span: &Rc, - name_span: Rc, -) -> Rc { +pub fn module_node(name: &String, imports: Rc>>, items: Rc>>, span: &Rc) -> Rc { + Rc::new(Node { + name: name.clone(), + span: span.clone(), + ident_span: default_ident_span(name.clone(), span.clone()), + children: items, + connective: Connective::NoConnective, + params: imports, + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}) +} + +pub fn import_node(module_path: String, is_all: bool, specific_names: Rc>>, span: &Rc, name_span: Rc) -> Rc { { let wildcard_marker = if is_all { Some(Rc::new(Node { - name: "".to_string(), - span: span.clone(), - ident_span: None, - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - })) + name: "".to_string(), + span: span.clone(), + ident_span: None, + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +})) } else { None }; - Rc::new(Node { - name: module_path, - span: span.clone(), - ident_span: Some(name_span), - children: specific_names, - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: wildcard_marker, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }) - } +Rc::new(Node { + name: module_path, + span: span.clone(), + ident_span: Some(name_span), + children: specific_names, + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: wildcard_marker, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}) +} } pub fn import_is_all(n: Rc) -> bool { (n.body.clone() != None) } -pub fn import_specific_names_at( - n: Rc, - source_indices: Rc>>, -) -> Rc> { - Rc::new({ - let mut __result = Vec::new(); - for c in n.children.clone().iter().cloned() { - __result.push(authored_name_at(source_indices.clone(), &c)); - } - __result - }) +pub fn import_specific_names_at(n: Rc, source_indices: Rc>>) -> Rc> { + Rc::new({ let mut __result = Vec::new(); for c in n.children.clone().iter().cloned() { __result.push(authored_name_at(source_indices.clone(), &c)); } __result }) } pub fn module_imports(n: Rc) -> Rc>> { @@ -2922,203 +1971,200 @@ pub fn module_items(n: Rc) -> Rc>> { pub fn leaf_node_with_span(name: &String, span: &Rc) -> Rc { Rc::new(Node { - name: name.clone(), - span: span.clone(), - ident_span: default_ident_span(name.clone(), span.clone()), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }) + name: name.clone(), + span: span.clone(), + ident_span: default_ident_span(name.clone(), span.clone()), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}) } pub fn kernel_span(name: &String) -> Rc { Rc::new(SourceSpan { - file: v2_rt::concat( - v2_rt::concat("".to_string(), - ), - start: 0, - end: v2_rt::string_length(&name), - }) + file: v2_rt::concat(v2_rt::concat("".to_string()), + start: 0, + end: v2_rt::string_length(&name), +}) } pub fn unit_type() -> Rc { thread_local! { - static CACHED: Rc = { - Rc::new(Node { - name: "Unit".to_string(), - span: kernel_span(&"Unit".to_string()), - ident_span: Some(kernel_span(&"Unit".to_string())), - children: Rc::new(vec![]), - connective: Connective::Conj, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }) - }; - } + static CACHED: Rc = { + Rc::new(Node { + name: "Unit".to_string(), + span: kernel_span(&"Unit".to_string()), + ident_span: Some(kernel_span(&"Unit".to_string())), + children: Rc::new(vec![]), + connective: Connective::Conj, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}) + }; + } CACHED.with(|c| c.clone()) } pub fn bool_type() -> Rc { thread_local! { - static CACHED: Rc = { - Rc::new(Node { - name: "Bool".to_string(), - span: kernel_span(&"Bool".to_string()), - ident_span: Some(kernel_span(&"Bool".to_string())), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }) - }; - } + static CACHED: Rc = { + Rc::new(Node { + name: "Bool".to_string(), + span: kernel_span(&"Bool".to_string()), + ident_span: Some(kernel_span(&"Bool".to_string())), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}) + }; + } CACHED.with(|c| c.clone()) } pub fn string_type() -> Rc { thread_local! { - static CACHED: Rc = { - Rc::new(Node { - name: "String".to_string(), - span: kernel_span(&"String".to_string()), - ident_span: Some(kernel_span(&"String".to_string())), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }) - }; - } + static CACHED: Rc = { + Rc::new(Node { + name: "String".to_string(), + span: kernel_span(&"String".to_string()), + ident_span: Some(kernel_span(&"String".to_string())), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}) + }; + } CACHED.with(|c| c.clone()) } pub fn int_type() -> Rc { thread_local! { - static CACHED: Rc = { - Rc::new(Node { - name: "Int".to_string(), - span: kernel_span(&"Int".to_string()), - ident_span: Some(kernel_span(&"Int".to_string())), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }) - }; - } + static CACHED: Rc = { + Rc::new(Node { + name: "Int".to_string(), + span: kernel_span(&"Int".to_string()), + ident_span: Some(kernel_span(&"Int".to_string())), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}) + }; + } CACHED.with(|c| c.clone()) } pub fn float_type() -> Rc { thread_local! { - static CACHED: Rc = { - Rc::new(Node { - name: "Float".to_string(), - span: kernel_span(&"Float".to_string()), - ident_span: Some(kernel_span(&"Float".to_string())), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }) - }; - } + static CACHED: Rc = { + Rc::new(Node { + name: "Float".to_string(), + span: kernel_span(&"Float".to_string()), + ident_span: Some(kernel_span(&"Float".to_string())), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}) + }; + } CACHED.with(|c| c.clone()) } pub fn none_type() -> Rc { thread_local! { - static CACHED: Rc = { - Rc::new(Node { - name: "None".to_string(), - span: kernel_span(&"None".to_string()), - ident_span: Some(kernel_span(&"None".to_string())), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, - }) - }; - } + static CACHED: Rc = { + Rc::new(Node { + name: "None".to_string(), + span: kernel_span(&"None".to_string()), + ident_span: Some(kernel_span(&"None".to_string())), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, +}) + }; + } CACHED.with(|c| c.clone()) } @@ -3133,52 +2179,52 @@ pub fn tuple_type_name() -> String { pub fn error_type() -> Rc { thread_local! { - static CACHED: Rc = { - Rc::new(Node { - name: "".to_string(), - span: make_span(0, 0), - ident_span: None, - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::CompilerError { - message: "unresolved type".to_string(), - span: make_span(0, 0), - })), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::ExprError { - kind: ExprErrorKind::SemanticExprError, - message: "unresolved type".to_string(), - }), - ident: None, - }) - }; - } + static CACHED: Rc = { + Rc::new(Node { + name: "".to_string(), + span: make_span(0, 0), + ident_span: None, + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::CompilerError { + message: "unresolved type".to_string(), + span: make_span(0, 0), +})), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::ExprError { + kind: ExprErrorKind::SemanticExprError, + message: "unresolved type".to_string(), +}), + ident: None, +}) + }; + } CACHED.with(|c| c.clone()) } pub fn make_span(start: i64, end: i64) -> Rc { Rc::new(SourceSpan { - file: "".to_string(), - start: start, - end: end, - }) + file: "".to_string(), + start: start, + end: end, +}) } pub fn make_file_span(file: String, start: i64, end: i64) -> Rc { Rc::new(SourceSpan { - file: file, - start: start, - end: end, - }) + file: file, + start: start, + end: end, +}) } pub fn no_span() -> Rc { @@ -3201,29 +2247,17 @@ pub struct NewlineIndex { pub fn build_newline_index(file: String, source: &String) -> Rc { { let char_codes = Rc::new(source.clone().chars().map(|c| c as i64).collect::>()); - let offsets = Rc::new( - char_codes - .iter() - .cloned() - .enumerate() - .map(|(i, v)| (i as i64, v)) - .collect::>(), - ) - .iter() - .cloned() - .fold(Rc::new(vec![]), |acc: _, pair: (i64, i64)| { - if (pair.1.clone() == 10) { - v2_rt::rc_list_push(acc.clone(), pair.0.clone()) - } else { - acc.clone() - } +let offsets = Rc::new(char_codes.iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned().fold(Rc::new(vec![]), |acc: _, pair: (i64, i64)| if (pair.1.clone() == 10) { + v2_rt::rc_list_push(acc.clone(), pair.0.clone()) + } else { + acc.clone() }); - Rc::new(NewlineIndex { - file: file, - offsets: offsets, - source: source.clone(), - }) - } +Rc::new(NewlineIndex { + file: file, + offsets: offsets, + source: source.clone(), +}) +} } pub fn byte_to_line_col(index: &Rc, offset: i64) -> LineCol { @@ -3233,65 +2267,40 @@ pub fn byte_to_line_col(index: &Rc, offset: i64) -> LineCol { } else { offset.clone() }; - let line = ((Rc::new({ - let mut __result = Vec::new(); - for o in index.offsets.clone().iter().cloned() { - if (o.clone() < clamped.clone()) { - __result.push(o); - } - } - __result - }) - .len() as i64) - + 1); - let line_start = if (line.clone() <= 1) { +let line = ((Rc::new({ let mut __result = Vec::new(); for o in index.offsets.clone().iter().cloned() { if (o.clone() < clamped.clone()) { __result.push(o); } } __result }).len() as i64) + 1); +let line_start = if (line.clone() <= 1) { 0 } else { - match index - .offsets - .clone() - .get((line.clone() - 2) as usize) - .cloned() - { - Some(o) => (o.clone() + 1), - None => 0, - } + match index.offsets.clone().get((line.clone() - 2) as usize).cloned() { + Some(o) => (o.clone() + 1), + None => 0, +} }; - let col = ((clamped.clone() - line_start) + 1); - LineCol { - line: line.clone(), - col: col, - } - } +let col = ((clamped.clone() - line_start) + 1); +LineCol { + line: line.clone(), + col: col, +} +} } pub fn source_line_at(index: &Rc, line: i64) -> String { { let src_len = v2_rt::string_length(&index.source.clone()); - let line_start = if (line.clone() <= 1) { +let line_start = if (line.clone() <= 1) { 0 } else { - match index - .offsets - .clone() - .get((line.clone() - 2) as usize) - .cloned() - { - Some(o) => (o.clone() + 1), - None => src_len.clone(), - } - }; - let line_end = match index - .offsets - .clone() - .get((line.clone() - 1) as usize) - .cloned() - { - Some(o) => o.clone(), - None => src_len.clone(), + match index.offsets.clone().get((line.clone() - 2) as usize).cloned() { + Some(o) => (o.clone() + 1), + None => src_len.clone(), +} }; - v2_rt::substring(&index.source.clone(), line_start, line_end) - } +let line_end = match index.offsets.clone().get((line.clone() - 1) as usize).cloned() { + Some(o) => o.clone(), + None => src_len.clone(), +}; +v2_rt::substring(&index.source.clone(), line_start, line_end) +} } pub fn source_text_at(index: Rc, span: &Rc) -> String { @@ -3313,135 +2322,119 @@ pub struct InternResult { pub fn empty_intern_table() -> Rc { Rc::new(InternTable { - strings: Rc::new(vec!["".to_string()]), - index: v2_rt::rc_map_insert(v2_rt::rc_empty_map::(), "".to_string(), 0), - next_id: 1, - }) + strings: Rc::new(vec!["".to_string()]), + index: v2_rt::rc_map_insert(v2_rt::rc_empty_map::(), "".to_string(), 0), + next_id: 1, +}) } pub fn intern(table: &Rc, s: &String) -> Rc { match v2_rt::map_get(&table.index.clone(), s.clone()) { - Some(id) => Rc::new(InternResult { - table: table.clone(), - id: id.clone(), - }), - None => { - let id = table.next_id.clone(); - Rc::new(InternResult { - table: Rc::new(InternTable { - strings: v2_rt::rc_list_push(table.strings.clone(), s.clone()), - index: v2_rt::rc_map_insert(table.index.clone(), s.clone(), id.clone()), - next_id: (id.clone() + 1), - }), - id: id.clone(), - }) - } - } + Some(id) => Rc::new(InternResult { + table: table.clone(), + id: id.clone(), +}), + None => { + let id = table.next_id.clone(); +Rc::new(InternResult { + table: Rc::new(InternTable { + strings: v2_rt::rc_list_push(table.strings.clone(), s.clone()), + index: v2_rt::rc_map_insert(table.index.clone(), s.clone(), id.clone()), + next_id: (id.clone() + 1), +}), + id: id.clone(), +}) +}, +} } pub fn intern_str(table: Rc, id: i64) -> String { match table.strings.clone().get(id as usize).cloned() { - Some(s) => s.clone(), - None => "".to_string(), - } + Some(s) => s.clone(), + None => "".to_string(), +} } pub fn intern_find(table: Rc, s: String) -> Option { match v2_rt::map_get(&table.index.clone(), s) { - Some(id) => Some(id.clone()), - None => None, - } + Some(id) => Some(id.clone()), + None => None, +} } pub fn intern_find_or_empty(table: Rc, s: String) -> i64 { match v2_rt::map_get(&table.index.clone(), s) { - Some(id) => id.clone(), - None => 0, - } + Some(id) => id.clone(), + None => 0, +} } pub fn merge_intern_tables(tables: Rc>>) -> Rc { - tables.iter().cloned().fold( - empty_intern_table(), - |merged: Rc, t: Rc| { - t.strings - .clone() - .iter() - .cloned() - .fold(merged, |m: Rc, s: String| { - if (s.clone().as_str() == "".to_string().as_str()) { - m.clone() - } else { - intern(&m, &s).table.clone() - } - }) - }, - ) + tables.iter().cloned().fold(empty_intern_table(), |merged: Rc, t: Rc| t.strings.clone().iter().cloned().fold(merged, |m: Rc, s: String| if (s.clone().as_str() == "".to_string().as_str()) { + m.clone() + } else { + intern(&m, &s).table.clone() + })) } pub fn is_internable_token(shape: TokenShape) -> bool { match shape { - TokenShape::ShIdent => true, - TokenShape::ShKeyword => true, - _ => false, - } + TokenShape::ShIdent => true, + TokenShape::ShKeyword => true, + _ => false, +} } pub fn pre_intern_tokens(tokens: Rc>>, table: Rc) -> Rc { - tokens - .iter() - .cloned() - .fold(table, |t: Rc, tok: Rc| { - if is_internable_token(tok.shape.clone()) { - intern(&t, &tok.text.clone()).table.clone() - } else { - t.clone() - } - }) + tokens.iter().cloned().fold(table, |t: Rc, tok: Rc| if is_internable_token(tok.shape.clone()) { + intern(&t, &tok.text.clone()).table.clone() + } else { + t.clone() + }) } pub fn with_optional_cardinality(n: &Rc) -> Rc { Rc::new(Node { - name: n.name.clone(), - ident: n.ident.clone(), - span: n.span.clone(), - ident_span: n.ident_span.clone(), - children: n.children.clone(), - connective: n.connective.clone(), - params: n.params.clone(), - inferred: n.inferred.clone(), - return_cardinality: Cardinality::CardOptional, - uses: n.uses.clone(), - body: n.body.clone(), - transport: n.transport.clone(), - properties: n.properties.clone(), - type_annotation: n.type_annotation.clone(), - is_self_recursive: n.is_self_recursive.clone(), - has_non_tail_self_call: n.has_non_tail_self_call.clone(), - match_pattern: n.match_pattern.clone(), - expr_data: n.expr_data.clone(), - }) + name: n.name.clone(), + ident: n.ident.clone(), + span: n.span.clone(), + ident_span: n.ident_span.clone(), + children: n.children.clone(), + connective: n.connective.clone(), + params: n.params.clone(), + inferred: n.inferred.clone(), + return_cardinality: Cardinality::CardOptional, + uses: n.uses.clone(), + body: n.body.clone(), + transport: n.transport.clone(), + properties: n.properties.clone(), + type_annotation: n.type_annotation.clone(), + is_self_recursive: n.is_self_recursive.clone(), + has_non_tail_self_call: n.has_non_tail_self_call.clone(), + match_pattern: n.match_pattern.clone(), + expr_data: n.expr_data.clone(), +}) } pub fn with_required_cardinality(n: &Rc) -> Rc { Rc::new(Node { - name: n.name.clone(), - ident: n.ident.clone(), - span: n.span.clone(), - ident_span: n.ident_span.clone(), - children: n.children.clone(), - connective: n.connective.clone(), - params: n.params.clone(), - inferred: n.inferred.clone(), - return_cardinality: Cardinality::Required, - uses: n.uses.clone(), - body: n.body.clone(), - transport: n.transport.clone(), - properties: n.properties.clone(), - type_annotation: n.type_annotation.clone(), - is_self_recursive: n.is_self_recursive.clone(), - has_non_tail_self_call: n.has_non_tail_self_call.clone(), - match_pattern: n.match_pattern.clone(), - expr_data: n.expr_data.clone(), - }) + name: n.name.clone(), + ident: n.ident.clone(), + span: n.span.clone(), + ident_span: n.ident_span.clone(), + children: n.children.clone(), + connective: n.connective.clone(), + params: n.params.clone(), + inferred: n.inferred.clone(), + return_cardinality: Cardinality::Required, + uses: n.uses.clone(), + body: n.body.clone(), + transport: n.transport.clone(), + properties: n.properties.clone(), + type_annotation: n.type_annotation.clone(), + is_self_recursive: n.is_self_recursive.clone(), + has_non_tail_self_call: n.has_non_tail_self_call.clone(), + match_pattern: n.match_pattern.clone(), + expr_data: n.expr_data.clone(), +}) } From ff05d2cb6e7c8addc6e57fdda1fb1efbd2e30645 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Wed, 29 Apr 2026 21:44:47 -0400 Subject: [PATCH 12/12] chore: apply cargo fmt --- src/v2/stage0/src/compiler_tests.rs | 598 +- .../stage0/src/extdeps_languages_dag_emit.rs | 6 +- .../src/extdeps_languages_dag_syntax.rs | 420 +- .../stage0/src/extdeps_languages_dag_types.rs | 8 +- .../stage0/src/extdeps_languages_go_emit.rs | 6 +- .../stage0/src/extdeps_languages_go_syntax.rs | 280 +- .../stage0/src/extdeps_languages_go_types.rs | 12 +- .../src/extdeps_languages_python_emit.rs | 6 +- .../src/extdeps_languages_python_syntax.rs | 296 +- .../src/extdeps_languages_python_types.rs | 10 +- .../stage0/src/extdeps_languages_rust_emit.rs | 98 +- .../src/extdeps_languages_rust_syntax.rs | 406 +- .../src/extdeps_languages_rust_types.rs | 20 +- src/v2/stage0/src/lib.rs | 80 +- src/v2/stage0/src/main.rs | 86 +- src/v2/stage0/src/std_algebra.rs | 1923 +- src/v2/stage0/src/std_coercion.rs | 32 +- src/v2/stage0/src/std_computation.rs | 279 +- src/v2/stage0/src/std_effects.rs | 295 +- src/v2/stage0/src/std_error_primitives.rs | 18 +- src/v2/stage0/src/std_graph.rs | 293 +- src/v2/stage0/src/std_http_path.rs | 335 +- src/v2/stage0/src/std_induction.rs | 1127 +- src/v2/stage0/src/std_iteration.rs | 8 +- src/v2/stage0/src/std_node.rs | 182 +- src/v2/stage0/src/std_syntax.rs | 86 +- src/v2/stage0/src/std_termination.rs | 191 +- src/v2/stage0/src/std_types.rs | 119 +- src/v2/stage0/src/v2_compiler_artifact.rs | 55 +- src/v2/stage0/src/v2_compiler_coercion.rs | 440 +- src/v2/stage0/src/v2_compiler_compile.rs | 2537 +- .../src/v2_compiler_compiler_tests_rust.rs | 231 +- src/v2/stage0/src/v2_compiler_complexity.rs | 12331 +++++++--- .../src/v2_compiler_effect_derivation.rs | 53 +- src/v2/stage0/src/v2_compiler_emit.rs | 6860 ++++-- src/v2/stage0/src/v2_compiler_emit_go.rs | 1829 +- src/v2/stage0/src/v2_compiler_emit_python.rs | 1581 +- src/v2/stage0/src/v2_compiler_emit_rust.rs | 17038 +++++++++---- src/v2/stage0/src/v2_compiler_infer.rs | 16030 +++++++----- src/v2/stage0/src/v2_compiler_infer_access.rs | 266 +- src/v2/stage0/src/v2_compiler_infer_cycle.rs | 368 +- .../stage0/src/v2_compiler_infer_emit_info.rs | 699 +- src/v2/stage0/src/v2_compiler_infer_env.rs | 279 +- src/v2/stage0/src/v2_compiler_infer_items.rs | 180 +- src/v2/stage0/src/v2_compiler_infer_lookup.rs | 735 +- src/v2/stage0/src/v2_compiler_infer_method.rs | 185 +- .../stage0/src/v2_compiler_infer_patterns.rs | 484 +- .../stage0/src/v2_compiler_infer_resolve.rs | 3834 +-- .../stage0/src/v2_compiler_infer_service.rs | 472 +- src/v2/stage0/src/v2_compiler_infer_sigs.rs | 572 +- src/v2/stage0/src/v2_compiler_infer_types.rs | 3175 ++- src/v2/stage0/src/v2_compiler_languages.rs | 1750 +- src/v2/stage0/src/v2_compiler_normalize.rs | 249 +- src/v2/stage0/src/v2_compiler_ownership.rs | 1490 +- src/v2/stage0/src/v2_compiler_parse.rs | 20089 +++++++++------- src/v2/stage0/src/v2_compiler_resolve.rs | 920 +- src/v2/stage0/src/v2_compiler_runtime_rust.rs | 86 +- src/v2/stage0/src/v2_compiler_tokenize.rs | 1000 +- src/v2/stage0/src/v2_compiler_trace.rs | 225 +- src/v2/stage0/src/v2_rt.rs | 187 +- src/v2/stage0/src/v2_std_core.rs | 3419 ++- 61 files changed, 71261 insertions(+), 35608 deletions(-) diff --git a/src/v2/stage0/src/compiler_tests.rs b/src/v2/stage0/src/compiler_tests.rs index 5b1482a6d38..090fdc8a468 100644 --- a/src/v2/stage0/src/compiler_tests.rs +++ b/src/v2/stage0/src/compiler_tests.rs @@ -1,7 +1,7 @@ #[cfg(test)] mod compiler_tests { - use std::collections::HashMap; use crate::v2_compiler_tokenize::tokenize; + use std::collections::HashMap; /// Find workspace root by walking up from the current directory looking for Cargo.toml + dsl/ fn workspace_root() -> std::path::PathBuf { @@ -92,9 +92,11 @@ mod compiler_tests { crate::v2_std_core::diagnostic_to_message(err.diagnostic.clone()) ); } - parsed.result.module.clone().unwrap_or_else(|| { - panic!("{} produced no module while building source closure", path) - }) + parsed + .result + .module + .clone() + .unwrap_or_else(|| panic!("{} produced no module while building source closure", path)) } fn module_path_from_source(path: &str, content: &str) -> String { @@ -109,9 +111,7 @@ mod compiler_tests { .collect() } - fn build_source_index( - roots: &[&str], - ) -> HashMap { + fn build_source_index(roots: &[&str]) -> HashMap { let mut index = HashMap::new(); for root in roots { for (path, content) in discover_dag_files(root) { @@ -119,9 +119,7 @@ mod compiler_tests { if let Some((existing, _)) = index.get(&module_path) { panic!( "duplicate module path '{}': declared in both {} and {}", - module_path, - existing, - path + module_path, existing, path ); } index.insert(module_path, (path, content)); @@ -135,7 +133,8 @@ mod compiler_tests { roots: &[&str], ) -> Vec> { let index = build_source_index(roots); - let mut seen = HashMap::>::new(); + let mut seen = + HashMap::>::new(); let mut queue = Vec::new(); for (path, content) in entry_pairs { @@ -215,7 +214,10 @@ mod compiler_tests { #[test] fn tokenize_produces_tokens() { - let tokens = tokenize(&"fn foo() -> Int { 42 }".to_string(), "test.dag".to_string()); + let tokens = tokenize( + &"fn foo() -> Int { 42 }".to_string(), + "test.dag".to_string(), + ); assert!( !tokens.is_empty(), "tokenize should produce at least one token" @@ -267,7 +269,10 @@ mod compiler_tests { &"module test\ntype Foo { x: Int }\n".to_string(), "test.dag".to_string(), ); - let result = crate::v2_compiler_parse::parse(tokens, std::rc::Rc::new(std::collections::HashMap::new())); + let result = crate::v2_compiler_parse::parse( + tokens, + std::rc::Rc::new(std::collections::HashMap::new()), + ); assert!( result.module.is_some(), "valid module should parse successfully" @@ -294,7 +299,10 @@ mod compiler_tests { last.shape ); - let result = crate::v2_compiler_parse::parse(tokens, std::rc::Rc::new(std::collections::HashMap::new())); + let result = crate::v2_compiler_parse::parse( + tokens, + std::rc::Rc::new(std::collections::HashMap::new()), + ); assert!( result.module.is_some(), @@ -371,7 +379,10 @@ mod compiler_tests { "{} should end with Eof", file ); - let result = crate::v2_compiler_parse::parse(tokens, std::rc::Rc::new(std::collections::HashMap::new())); + let result = crate::v2_compiler_parse::parse( + tokens, + std::rc::Rc::new(std::collections::HashMap::new()), + ); assert!( result.module.is_some(), "{} should parse successfully, error: {:?}", @@ -642,81 +653,201 @@ mod compiler_tests { #[test] fn coercion_rust_checkpoint_resolves_primitives() { use crate::v2_compiler_coercion::*; - assert_eq!(coerce_primitive_type(RenderTarget::Rust, "Int".into()), "i64"); - assert_eq!(coerce_primitive_type(RenderTarget::Rust, "Float".into()), "f64"); - assert_eq!(coerce_primitive_type(RenderTarget::Rust, "Bool".into()), "bool"); - assert_eq!(coerce_primitive_type(RenderTarget::Rust, "Unit".into()), "()"); - assert_eq!(coerce_primitive_type(RenderTarget::Rust, "String".into()), "String"); - assert_eq!(coerce_primitive_type(RenderTarget::Rust, "Bytes".into()), "Vec"); - assert_eq!(coerce_primitive_type(RenderTarget::Rust, "Secret".into()), "String"); - assert_eq!(coerce_primitive_type(RenderTarget::Rust, "Json".into()), "serde_json::Value"); + assert_eq!( + coerce_primitive_type(RenderTarget::Rust, "Int".into()), + "i64" + ); + assert_eq!( + coerce_primitive_type(RenderTarget::Rust, "Float".into()), + "f64" + ); + assert_eq!( + coerce_primitive_type(RenderTarget::Rust, "Bool".into()), + "bool" + ); + assert_eq!( + coerce_primitive_type(RenderTarget::Rust, "Unit".into()), + "()" + ); + assert_eq!( + coerce_primitive_type(RenderTarget::Rust, "String".into()), + "String" + ); + assert_eq!( + coerce_primitive_type(RenderTarget::Rust, "Bytes".into()), + "Vec" + ); + assert_eq!( + coerce_primitive_type(RenderTarget::Rust, "Secret".into()), + "String" + ); + assert_eq!( + coerce_primitive_type(RenderTarget::Rust, "Json".into()), + "serde_json::Value" + ); } - #[test] fn coercion_python_checkpoint_resolves_primitives() { use crate::v2_compiler_coercion::*; - assert_eq!(coerce_primitive_type(RenderTarget::Python, "Int".into()), "int"); - assert_eq!(coerce_primitive_type(RenderTarget::Python, "Float".into()), "float"); - assert_eq!(coerce_primitive_type(RenderTarget::Python, "Bool".into()), "bool"); - assert_eq!(coerce_primitive_type(RenderTarget::Python, "Unit".into()), "None"); - assert_eq!(coerce_primitive_type(RenderTarget::Python, "String".into()), "str"); - assert_eq!(coerce_primitive_type(RenderTarget::Python, "Bytes".into()), "bytes"); - assert_eq!(coerce_primitive_type(RenderTarget::Python, "Secret".into()), "str"); - assert_eq!(coerce_primitive_type(RenderTarget::Python, "Json".into()), "dict"); + assert_eq!( + coerce_primitive_type(RenderTarget::Python, "Int".into()), + "int" + ); + assert_eq!( + coerce_primitive_type(RenderTarget::Python, "Float".into()), + "float" + ); + assert_eq!( + coerce_primitive_type(RenderTarget::Python, "Bool".into()), + "bool" + ); + assert_eq!( + coerce_primitive_type(RenderTarget::Python, "Unit".into()), + "None" + ); + assert_eq!( + coerce_primitive_type(RenderTarget::Python, "String".into()), + "str" + ); + assert_eq!( + coerce_primitive_type(RenderTarget::Python, "Bytes".into()), + "bytes" + ); + assert_eq!( + coerce_primitive_type(RenderTarget::Python, "Secret".into()), + "str" + ); + assert_eq!( + coerce_primitive_type(RenderTarget::Python, "Json".into()), + "dict" + ); } - #[test] fn coercion_go_checkpoint_resolves_primitives() { use crate::v2_compiler_coercion::*; - assert_eq!(coerce_primitive_type(RenderTarget::Go, "Int".into()), "int64"); - assert_eq!(coerce_primitive_type(RenderTarget::Go, "Float".into()), "float64"); - assert_eq!(coerce_primitive_type(RenderTarget::Go, "Bool".into()), "bool"); - assert_eq!(coerce_primitive_type(RenderTarget::Go, "Unit".into()), "struct{}"); - assert_eq!(coerce_primitive_type(RenderTarget::Go, "String".into()), "string"); - assert_eq!(coerce_primitive_type(RenderTarget::Go, "Bytes".into()), "[]byte"); - assert_eq!(coerce_primitive_type(RenderTarget::Go, "Secret".into()), "string"); - assert_eq!(coerce_primitive_type(RenderTarget::Go, "Json".into()), "interface{}"); + assert_eq!( + coerce_primitive_type(RenderTarget::Go, "Int".into()), + "int64" + ); + assert_eq!( + coerce_primitive_type(RenderTarget::Go, "Float".into()), + "float64" + ); + assert_eq!( + coerce_primitive_type(RenderTarget::Go, "Bool".into()), + "bool" + ); + assert_eq!( + coerce_primitive_type(RenderTarget::Go, "Unit".into()), + "struct{}" + ); + assert_eq!( + coerce_primitive_type(RenderTarget::Go, "String".into()), + "string" + ); + assert_eq!( + coerce_primitive_type(RenderTarget::Go, "Bytes".into()), + "[]byte" + ); + assert_eq!( + coerce_primitive_type(RenderTarget::Go, "Secret".into()), + "string" + ); + assert_eq!( + coerce_primitive_type(RenderTarget::Go, "Json".into()), + "interface{}" + ); } - #[test] fn coercion_rust_inhabitant_resolves_containers() { use crate::v2_compiler_coercion::*; - assert_eq!(coerce_container_template(RenderTarget::Rust, "BooleanAlgebra".into()), Some("std::collections::BTreeSet<{0}>".to_string())); - assert_eq!(coerce_container_template(RenderTarget::Rust, "FreeMonoid".into()), Some("Vec<{0}>".to_string())); - assert_eq!(coerce_container_template(RenderTarget::Rust, "List".into()), Some("Vec<{0}>".to_string())); - assert_eq!(coerce_container_template(RenderTarget::Rust, "Map".into()), Some("HashMap<{0}, {1}>".to_string())); - assert_eq!(coerce_container_template(RenderTarget::Rust, "PartialFunction".into()), Some("HashMap<{0}, {1}>".to_string())); - assert_eq!(coerce_container_template(RenderTarget::Rust, "Set".into()), Some("std::collections::BTreeSet<{0}>".to_string())); + assert_eq!( + coerce_container_template(RenderTarget::Rust, "BooleanAlgebra".into()), + Some("std::collections::BTreeSet<{0}>".to_string()) + ); + assert_eq!( + coerce_container_template(RenderTarget::Rust, "FreeMonoid".into()), + Some("Vec<{0}>".to_string()) + ); + assert_eq!( + coerce_container_template(RenderTarget::Rust, "List".into()), + Some("Vec<{0}>".to_string()) + ); + assert_eq!( + coerce_container_template(RenderTarget::Rust, "Map".into()), + Some("HashMap<{0}, {1}>".to_string()) + ); + assert_eq!( + coerce_container_template(RenderTarget::Rust, "PartialFunction".into()), + Some("HashMap<{0}, {1}>".to_string()) + ); + assert_eq!( + coerce_container_template(RenderTarget::Rust, "Set".into()), + Some("std::collections::BTreeSet<{0}>".to_string()) + ); } - #[test] fn coercion_python_inhabitant_resolves_containers() { use crate::v2_compiler_coercion::*; - assert_eq!(coerce_container_template(RenderTarget::Python, "BooleanAlgebra".into()), Some("set[{0}]".to_string())); - assert_eq!(coerce_container_template(RenderTarget::Python, "FreeMonoid".into()), Some("list[{0}]".to_string())); - assert_eq!(coerce_container_template(RenderTarget::Python, "List".into()), Some("list[{0}]".to_string())); - assert_eq!(coerce_container_template(RenderTarget::Python, "Map".into()), Some("dict[{0}, {1}]".to_string())); - assert_eq!(coerce_container_template(RenderTarget::Python, "PartialFunction".into()), Some("dict[{0}, {1}]".to_string())); - assert_eq!(coerce_container_template(RenderTarget::Python, "Set".into()), Some("set[{0}]".to_string())); + assert_eq!( + coerce_container_template(RenderTarget::Python, "BooleanAlgebra".into()), + Some("set[{0}]".to_string()) + ); + assert_eq!( + coerce_container_template(RenderTarget::Python, "FreeMonoid".into()), + Some("list[{0}]".to_string()) + ); + assert_eq!( + coerce_container_template(RenderTarget::Python, "List".into()), + Some("list[{0}]".to_string()) + ); + assert_eq!( + coerce_container_template(RenderTarget::Python, "Map".into()), + Some("dict[{0}, {1}]".to_string()) + ); + assert_eq!( + coerce_container_template(RenderTarget::Python, "PartialFunction".into()), + Some("dict[{0}, {1}]".to_string()) + ); + assert_eq!( + coerce_container_template(RenderTarget::Python, "Set".into()), + Some("set[{0}]".to_string()) + ); } - #[test] fn coercion_go_inhabitant_resolves_containers() { use crate::v2_compiler_coercion::*; - assert_eq!(coerce_container_template(RenderTarget::Go, "BooleanAlgebra".into()), Some("map[{0}]struct{}".to_string())); - assert_eq!(coerce_container_template(RenderTarget::Go, "FreeMonoid".into()), Some("[]{0}".to_string())); - assert_eq!(coerce_container_template(RenderTarget::Go, "List".into()), Some("[]{0}".to_string())); - assert_eq!(coerce_container_template(RenderTarget::Go, "Map".into()), Some("map[{0}]{1}".to_string())); - assert_eq!(coerce_container_template(RenderTarget::Go, "PartialFunction".into()), Some("map[{0}]{1}".to_string())); - assert_eq!(coerce_container_template(RenderTarget::Go, "Set".into()), Some("map[{0}]struct{}".to_string())); + assert_eq!( + coerce_container_template(RenderTarget::Go, "BooleanAlgebra".into()), + Some("map[{0}]struct{}".to_string()) + ); + assert_eq!( + coerce_container_template(RenderTarget::Go, "FreeMonoid".into()), + Some("[]{0}".to_string()) + ); + assert_eq!( + coerce_container_template(RenderTarget::Go, "List".into()), + Some("[]{0}".to_string()) + ); + assert_eq!( + coerce_container_template(RenderTarget::Go, "Map".into()), + Some("map[{0}]{1}".to_string()) + ); + assert_eq!( + coerce_container_template(RenderTarget::Go, "PartialFunction".into()), + Some("map[{0}]{1}".to_string()) + ); + assert_eq!( + coerce_container_template(RenderTarget::Go, "Set".into()), + Some("map[{0}]struct{}".to_string()) + ); } - #[test] fn coercion_is_copy_from_checkpoint() { use crate::v2_compiler_coercion::*; @@ -730,19 +861,45 @@ mod compiler_tests { assert_eq!(is_copy(RenderTarget::Rust, "Json".into()), Some(false)); } - #[test] fn coercion_template_application() { use crate::v2_compiler_coercion::*; - assert_eq!(apply_inhabitant_template1("Vec<{0}>".into(), "i64".into()), "Vec"); - assert_eq!(apply_inhabitant_template1("std::collections::BTreeSet<{0}>".into(), "i64".into()), "std::collections::BTreeSet"); - assert_eq!(apply_inhabitant_template2("HashMap<{0}, {1}>".into(), "String".into(), "i64".into()), "HashMap"); - assert_eq!(apply_inhabitant_template1("list[{0}]".into(), "int".into()), "list[int]"); - assert_eq!(apply_inhabitant_template1("set[{0}]".into(), "int".into()), "set[int]"); - assert_eq!(apply_inhabitant_template2("dict[{0}, {1}]".into(), "str".into(), "int".into()), "dict[str, int]"); - assert_eq!(apply_inhabitant_template1("[]{0}".into(), "int64".into()), "[]int64"); - assert_eq!(apply_inhabitant_template1("map[{0}]struct{}".into(), "int64".into()), "map[int64]struct{}"); - assert_eq!(apply_inhabitant_template2("map[{0}]{1}".into(), "string".into(), "int64".into()), "map[string]int64"); + assert_eq!( + apply_inhabitant_template1("Vec<{0}>".into(), "i64".into()), + "Vec" + ); + assert_eq!( + apply_inhabitant_template1("std::collections::BTreeSet<{0}>".into(), "i64".into()), + "std::collections::BTreeSet" + ); + assert_eq!( + apply_inhabitant_template2("HashMap<{0}, {1}>".into(), "String".into(), "i64".into()), + "HashMap" + ); + assert_eq!( + apply_inhabitant_template1("list[{0}]".into(), "int".into()), + "list[int]" + ); + assert_eq!( + apply_inhabitant_template1("set[{0}]".into(), "int".into()), + "set[int]" + ); + assert_eq!( + apply_inhabitant_template2("dict[{0}, {1}]".into(), "str".into(), "int".into()), + "dict[str, int]" + ); + assert_eq!( + apply_inhabitant_template1("[]{0}".into(), "int64".into()), + "[]int64" + ); + assert_eq!( + apply_inhabitant_template1("map[{0}]struct{}".into(), "int64".into()), + "map[int64]struct{}" + ); + assert_eq!( + apply_inhabitant_template2("map[{0}]{1}".into(), "string".into(), "int64".into()), + "map[string]int64" + ); } /// Return current process RSS in bytes (macOS via mach_task_basic_info). @@ -855,7 +1012,10 @@ mod compiler_tests { let parsed = crate::v2_compiler_parse::parse_with_table( tokens, crate::v2_rt::rc_map_insert( - crate::v2_rt::rc_empty_map::>(), + crate::v2_rt::rc_empty_map::< + String, + std::rc::Rc, + >(), si.file.clone(), si.clone(), ), @@ -869,7 +1029,9 @@ mod compiler_tests { " parse {:>40}: {:>8.2?} (ok={})", sources[i].path, elapsed, ok ); - let m = result.module.clone() + let m = result + .module + .clone() .unwrap_or_else(|| panic!("parse failed for source {}", sources[i].path)); modules.push(m); } @@ -878,10 +1040,25 @@ mod compiler_tests { let t_stage = Instant::now(); let resolve_si = sources.iter().fold( - crate::v2_rt::rc_empty_map::>(), - |acc, s| crate::v2_rt::rc_map_insert(acc, s.path.clone(), crate::v2_std_core::build_newline_index(s.path.clone(), &s.content.clone())), + crate::v2_rt::rc_empty_map::< + String, + std::rc::Rc, + >(), + |acc, s| { + crate::v2_rt::rc_map_insert( + acc, + s.path.clone(), + crate::v2_std_core::build_newline_index( + s.path.clone(), + &s.content.clone(), + ), + ) + }, + ); + let graph = crate::v2_compiler_resolve::resolve_modules( + &std::rc::Rc::new(modules), + &resolve_si, ); - let graph = crate::v2_compiler_resolve::resolve_modules(&std::rc::Rc::new(modules), &resolve_si); let resolve_total = t_stage.elapsed(); let errors: Vec<_> = graph .diagnostics @@ -968,7 +1145,10 @@ mod compiler_tests { let parsed = crate::v2_compiler_parse::parse_with_table( tokens, crate::v2_rt::rc_map_insert( - crate::v2_rt::rc_empty_map::>(), + crate::v2_rt::rc_empty_map::< + String, + std::rc::Rc, + >(), si.file.clone(), si.clone(), ), @@ -985,7 +1165,9 @@ mod compiler_tests { " parse {:>40}: {:>8.2?} (ok={})", sources[i].path, elapsed, ok ); - let m = result.module.clone() + let m = result + .module + .clone() .unwrap_or_else(|| panic!("parse failed for source {}", sources[i].path)); modules.push(m); } @@ -1000,10 +1182,25 @@ mod compiler_tests { let t_stage = Instant::now(); let resolve_si = sources.iter().fold( - crate::v2_rt::rc_empty_map::>(), - |acc, s| crate::v2_rt::rc_map_insert(acc, s.path.clone(), crate::v2_std_core::build_newline_index(s.path.clone(), &s.content.clone())), + crate::v2_rt::rc_empty_map::< + String, + std::rc::Rc, + >(), + |acc, s| { + crate::v2_rt::rc_map_insert( + acc, + s.path.clone(), + crate::v2_std_core::build_newline_index( + s.path.clone(), + &s.content.clone(), + ), + ) + }, + ); + let graph = crate::v2_compiler_resolve::resolve_modules( + &std::rc::Rc::new(modules), + &resolve_si, ); - let graph = crate::v2_compiler_resolve::resolve_modules(&std::rc::Rc::new(modules), &resolve_si); let resolve_total = t_stage.elapsed(); let phase3_diags: usize = graph .diagnostics @@ -1032,7 +1229,11 @@ mod compiler_tests { acc }, ); - let typed = crate::v2_compiler_infer::reconcile(graph, std::rc::Rc::new(source_indices), intern_table_p.clone()); + let typed = crate::v2_compiler_infer::reconcile( + graph, + std::rc::Rc::new(source_indices), + intern_table_p.clone(), + ); let reconcile_total = t_stage.elapsed(); let phase4_diags: usize = typed .diagnostics @@ -1108,14 +1309,18 @@ mod compiler_tests { let source_count = sources.len(); let total_chars: usize = sources.iter().map(|s| s.content.len()).sum(); - eprintln!("\n=== FULL PIPELINE PROFILE ({} sources, {} chars) ===\n", source_count, total_chars); + eprintln!( + "\n=== FULL PIPELINE PROFILE ({} sources, {} chars) ===\n", + source_count, total_chars + ); // 1a. Tokenize + parse let t = Instant::now(); let mut token_lists = Vec::new(); for source in &sources { let tokens = crate::v2_compiler_tokenize::tokenize( - &source.content.clone(), source.path.clone(), + &source.content.clone(), + source.path.clone(), ); token_lists.push(tokens); } @@ -1132,7 +1337,10 @@ mod compiler_tests { let parsed = crate::v2_compiler_parse::parse_with_table( tokens, crate::v2_rt::rc_map_insert( - crate::v2_rt::rc_empty_map::>(), + crate::v2_rt::rc_empty_map::< + String, + std::rc::Rc, + >(), si.file.clone(), si.clone(), ), @@ -1140,7 +1348,9 @@ mod compiler_tests { ); let result = parsed.result.clone(); intern_table_fp = parsed.intern_table.clone(); - let m = result.module.clone() + let m = result + .module + .clone() .unwrap_or_else(|| panic!("parse failed for source {}", sources[i].path)); modules.push(m); } @@ -1148,91 +1358,200 @@ mod compiler_tests { // 1b. Resolve let t = Instant::now(); let resolve_si = sources.iter().fold( - crate::v2_rt::rc_empty_map::>(), - |acc, s| crate::v2_rt::rc_map_insert(acc, s.path.clone(), crate::v2_std_core::build_newline_index(s.path.clone(), &s.content.clone())), + crate::v2_rt::rc_empty_map::< + String, + std::rc::Rc, + >(), + |acc, s| { + crate::v2_rt::rc_map_insert( + acc, + s.path.clone(), + crate::v2_std_core::build_newline_index( + s.path.clone(), + &s.content.clone(), + ), + ) + }, + ); + let graph = crate::v2_compiler_resolve::resolve_modules( + &std::rc::Rc::new(modules), + &resolve_si, ); - let graph = crate::v2_compiler_resolve::resolve_modules(&std::rc::Rc::new(modules), &resolve_si); let resolve_elapsed = t.elapsed(); - let resolve_errors: usize = graph.diagnostics.iter() + let resolve_errors: usize = graph + .diagnostics + .iter() .filter(|d| crate::v2_std_core::is_error_diagnostic(d.diagnostic.clone())) .count(); // 1c. Newline indices let t = Instant::now(); - let newline_indices: Vec<_> = sources.iter().map(|s| { - crate::v2_std_core::build_newline_index(s.path.clone(), &s.content.clone()) - }).collect(); + let newline_indices: Vec<_> = sources + .iter() + .map(|s| { + crate::v2_std_core::build_newline_index(s.path.clone(), &s.content.clone()) + }) + .collect(); let newline_elapsed = t.elapsed(); - let frontend_elapsed = tokenize_elapsed + parse_elapsed + resolve_elapsed + newline_elapsed; + let frontend_elapsed = + tokenize_elapsed + parse_elapsed + resolve_elapsed + newline_elapsed; eprintln!(" Tokenize: {:>8.2?}", tokenize_elapsed); eprintln!(" Parse: {:>8.2?}", parse_elapsed); - eprintln!(" Resolve: {:>8.2?} ({} resolve errors)", resolve_elapsed, resolve_errors); + eprintln!( + " Resolve: {:>8.2?} ({} resolve errors)", + resolve_elapsed, resolve_errors + ); eprintln!(" Newline indices: {:>8.2?}", newline_elapsed); eprintln!(" Frontend total: {:>8.2?}", frontend_elapsed); // 2. Normalize let t = Instant::now(); let source_indices = newline_indices.iter().cloned().fold( - crate::v2_rt::rc_empty_map::>(), - |acc, index| crate::v2_rt::rc_map_insert(acc, index.file.clone(), index.clone()), + crate::v2_rt::rc_empty_map::< + String, + std::rc::Rc, + >(), + |acc, index| { + crate::v2_rt::rc_map_insert(acc, index.file.clone(), index.clone()) + }, ); - let norm = crate::v2_compiler_normalize::normalize_graph(&graph, source_indices.clone()); + let norm = + crate::v2_compiler_normalize::normalize_graph(&graph, source_indices.clone()); let normalize_elapsed = t.elapsed(); - eprintln!(" Normalize: {:>8.2?}", normalize_elapsed); + eprintln!( + " Normalize: {:>8.2?}", + normalize_elapsed + ); // 3. Reconcile let t = Instant::now(); - let typed = crate::v2_compiler_infer::reconcile(norm.graph.clone(), source_indices.clone(), intern_table_fp.clone()); + let typed = crate::v2_compiler_infer::reconcile( + norm.graph.clone(), + source_indices.clone(), + intern_table_fp.clone(), + ); let reconcile_elapsed = t.elapsed(); - let type_errors: usize = typed.diagnostics.iter() + let type_errors: usize = typed + .diagnostics + .iter() .filter(|d| crate::v2_std_core::is_error_diagnostic(d.diagnostic.clone())) .count(); - eprintln!(" Reconcile: {:>8.2?} ({} type errors)", reconcile_elapsed, type_errors); + eprintln!( + " Reconcile: {:>8.2?} ({} type errors)", + reconcile_elapsed, type_errors + ); // 4. Complexity let t = Instant::now(); let func_entries = crate::v2_compiler_compile::extract_func_entries(typed.clone()); let func_count = func_entries.len(); - let recursion_ctx = crate::v2_compiler_compile::build_recursion_context(typed.clone()); + let recursion_ctx = + crate::v2_compiler_compile::build_recursion_context(typed.clone()); let complexity = crate::v2_compiler_complexity::build_complexity_report( - &func_entries, recursion_ctx, source_indices.clone(), + &func_entries, + recursion_ctx, + source_indices.clone(), ); let complexity_elapsed = t.elapsed(); - let cx_diags = crate::v2_compiler_compile::complexity_diagnostics(complexity.clone()); - eprintln!(" Complexity: {:>8.2?} ({} funcs, {} diagnostics)", complexity_elapsed, func_count, cx_diags.len()); + let cx_diags = + crate::v2_compiler_compile::complexity_diagnostics(complexity.clone()); + eprintln!( + " Complexity: {:>8.2?} ({} funcs, {} diagnostics)", + complexity_elapsed, + func_count, + cx_diags.len() + ); // 5. Ownership let t = Instant::now(); let ownership = crate::v2_compiler_compile::extract_ownership_proofs(typed.clone()); let ownership_elapsed = t.elapsed(); - let own_diags = crate::v2_compiler_compile::ownership_diagnostics(ownership.clone()); - eprintln!(" Ownership: {:>8.2?} ({} proofs, {} diagnostics)", ownership_elapsed, ownership.len(), own_diags.len()); + let own_diags = + crate::v2_compiler_compile::ownership_diagnostics(ownership.clone()); + eprintln!( + " Ownership: {:>8.2?} ({} proofs, {} diagnostics)", + ownership_elapsed, + ownership.len(), + own_diags.len() + ); // 6. Emit let artifact_plan = crate::v2_compiler_compile::default_artifact_plan( - std::rc::Rc::new(typed.modules.iter().map(|m| m.module.clone().name.clone()).collect()), + std::rc::Rc::new( + typed + .modules + .iter() + .map(|m| m.module.clone().name.clone()) + .collect(), + ), crate::v2_compiler_artifact::RenderTarget::Rust, ); let t = Instant::now(); - let emit_result = crate::v2_compiler_compile::emit_from_artifact_plan(typed.clone(), &artifact_plan); + let emit_result = crate::v2_compiler_compile::emit_from_artifact_plan( + typed.clone(), + &artifact_plan, + ); let emit_elapsed = t.elapsed(); let emitted_files = emit_result.files.len(); let emitted_bytes: usize = emit_result.files.iter().map(|f| f.content.len()).sum(); - eprintln!(" Emit: {:>8.2?} ({} files, {} bytes)", emit_elapsed, emitted_files, emitted_bytes); + eprintln!( + " Emit: {:>8.2?} ({} files, {} bytes)", + emit_elapsed, emitted_files, emitted_bytes + ); - let total = frontend_elapsed + normalize_elapsed + reconcile_elapsed - + complexity_elapsed + ownership_elapsed + emit_elapsed; + let total = frontend_elapsed + + normalize_elapsed + + reconcile_elapsed + + complexity_elapsed + + ownership_elapsed + + emit_elapsed; eprintln!("\n=== SUMMARY ==="); - eprintln!(" Tokenize: {:>8.2?} ({:.0}%)", tokenize_elapsed, tokenize_elapsed.as_secs_f64() / total.as_secs_f64() * 100.0); - eprintln!(" Parse: {:>8.2?} ({:.0}%)", parse_elapsed, parse_elapsed.as_secs_f64() / total.as_secs_f64() * 100.0); - eprintln!(" Resolve: {:>8.2?} ({:.0}%)", resolve_elapsed, resolve_elapsed.as_secs_f64() / total.as_secs_f64() * 100.0); - eprintln!(" Newline: {:>8.2?} ({:.0}%)", newline_elapsed, newline_elapsed.as_secs_f64() / total.as_secs_f64() * 100.0); - eprintln!(" Normalize: {:>8.2?} ({:.0}%)", normalize_elapsed, normalize_elapsed.as_secs_f64() / total.as_secs_f64() * 100.0); - eprintln!(" Reconcile: {:>8.2?} ({:.0}%)", reconcile_elapsed, reconcile_elapsed.as_secs_f64() / total.as_secs_f64() * 100.0); - eprintln!(" Complexity: {:>8.2?} ({:.0}%)", complexity_elapsed, complexity_elapsed.as_secs_f64() / total.as_secs_f64() * 100.0); - eprintln!(" Ownership: {:>8.2?} ({:.0}%)", ownership_elapsed, ownership_elapsed.as_secs_f64() / total.as_secs_f64() * 100.0); - eprintln!(" Emit: {:>8.2?} ({:.0}%)", emit_elapsed, emit_elapsed.as_secs_f64() / total.as_secs_f64() * 100.0); + eprintln!( + " Tokenize: {:>8.2?} ({:.0}%)", + tokenize_elapsed, + tokenize_elapsed.as_secs_f64() / total.as_secs_f64() * 100.0 + ); + eprintln!( + " Parse: {:>8.2?} ({:.0}%)", + parse_elapsed, + parse_elapsed.as_secs_f64() / total.as_secs_f64() * 100.0 + ); + eprintln!( + " Resolve: {:>8.2?} ({:.0}%)", + resolve_elapsed, + resolve_elapsed.as_secs_f64() / total.as_secs_f64() * 100.0 + ); + eprintln!( + " Newline: {:>8.2?} ({:.0}%)", + newline_elapsed, + newline_elapsed.as_secs_f64() / total.as_secs_f64() * 100.0 + ); + eprintln!( + " Normalize: {:>8.2?} ({:.0}%)", + normalize_elapsed, + normalize_elapsed.as_secs_f64() / total.as_secs_f64() * 100.0 + ); + eprintln!( + " Reconcile: {:>8.2?} ({:.0}%)", + reconcile_elapsed, + reconcile_elapsed.as_secs_f64() / total.as_secs_f64() * 100.0 + ); + eprintln!( + " Complexity: {:>8.2?} ({:.0}%)", + complexity_elapsed, + complexity_elapsed.as_secs_f64() / total.as_secs_f64() * 100.0 + ); + eprintln!( + " Ownership: {:>8.2?} ({:.0}%)", + ownership_elapsed, + ownership_elapsed.as_secs_f64() / total.as_secs_f64() * 100.0 + ); + eprintln!( + " Emit: {:>8.2?} ({:.0}%)", + emit_elapsed, + emit_elapsed.as_secs_f64() / total.as_secs_f64() * 100.0 + ); eprintln!(" TOTAL: {:>8.2?}", total); }) .expect("failed to spawn thread") @@ -1271,7 +1590,10 @@ mod compiler_tests { let parsed = crate::v2_compiler_parse::parse_with_table( &tokens, crate::v2_rt::rc_map_insert( - crate::v2_rt::rc_empty_map::>(), + crate::v2_rt::rc_empty_map::< + String, + std::rc::Rc, + >(), si.file.clone(), si.clone(), ), @@ -1279,15 +1601,32 @@ mod compiler_tests { ); let result = parsed.result.clone(); intern_table = parsed.intern_table.clone(); - let m = result.module.clone() + let m = result + .module + .clone() .unwrap_or_else(|| panic!("parse failed for source {}", source.path)); modules.push(m); } let resolve_si = sources.iter().fold( - crate::v2_rt::rc_empty_map::>(), - |acc, s| crate::v2_rt::rc_map_insert(acc, s.path.clone(), crate::v2_std_core::build_newline_index(s.path.clone(), &s.content.clone())), + crate::v2_rt::rc_empty_map::< + String, + std::rc::Rc, + >(), + |acc, s| { + crate::v2_rt::rc_map_insert( + acc, + s.path.clone(), + crate::v2_std_core::build_newline_index( + s.path.clone(), + &s.content.clone(), + ), + ) + }, + ); + let graph = crate::v2_compiler_resolve::resolve_modules( + &std::rc::Rc::new(modules), + &resolve_si, ); - let graph = crate::v2_compiler_resolve::resolve_modules(&std::rc::Rc::new(modules), &resolve_si); let setup_time = t0.elapsed(); let rss_baseline = get_rss_bytes(); eprintln!( @@ -1438,5 +1777,4 @@ mod compiler_tests { .join(); result.expect("profile_reconcile_per_module panicked"); } - } diff --git a/src/v2/stage0/src/extdeps_languages_dag_emit.rs b/src/v2/stage0/src/extdeps_languages_dag_emit.rs index 1e1559de24c..557109d0c3b 100644 --- a/src/v2/stage0/src/extdeps_languages_dag_emit.rs +++ b/src/v2/stage0/src/extdeps_languages_dag_emit.rs @@ -1,11 +1,11 @@ // Generated by v2 compiler -- do not edit. // Source module: extdeps.languages.dag.emit -use std::collections::HashMap; -use std::rc::Rc; use crate::v2_rt; -use crate::NonEmptyVec; use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; pub fn dag_keywords() -> Rc> { thread_local! { diff --git a/src/v2/stage0/src/extdeps_languages_dag_syntax.rs b/src/v2/stage0/src/extdeps_languages_dag_syntax.rs index 9bdadf5e36a..54fbe29d936 100644 --- a/src/v2/stage0/src/extdeps_languages_dag_syntax.rs +++ b/src/v2/stage0/src/extdeps_languages_dag_syntax.rs @@ -1,113 +1,121 @@ // Generated by v2 compiler -- do not edit. // Source module: extdeps.languages.dag.syntax -use std::collections::HashMap; -use std::rc::Rc; +use crate::std_syntax::BinOp::{ + Add, And, Div, Eq, Ge, Gt, Le, Lt, Mod, Mul, Ne, NullCoalesce, Or, Sub, +}; +use crate::std_syntax::BodyKind::{ + BlockBody, ExprBody, NoBody, ResourceBody, ServiceBody, TypeBody, ValueBody, +}; +use crate::std_syntax::ItemFormKind::{ + EnumForm, FuncForm, ModuleForm, OtherForm, StructForm, TypeAliasForm, +}; +use crate::std_syntax::LiteralValue::{LitBool, LitNull}; +pub use crate::std_syntax::{ + BinOp, BodyKind, ItemForm, ItemFormKind, LiteralValue, OperatorSpec, SyntaxSpec, +}; use crate::v2_rt; -use crate::NonEmptyVec; use crate::NonEmptyBTreeSet; -pub use crate::std_syntax::{ItemForm, ItemFormKind, BodyKind, OperatorSpec, SyntaxSpec, BinOp, LiteralValue}; -use crate::std_syntax::ItemFormKind::{FuncForm, StructForm, EnumForm, TypeAliasForm, ModuleForm, OtherForm}; -use crate::std_syntax::BodyKind::{ExprBody, BlockBody, TypeBody, ValueBody, NoBody, ServiceBody, ResourceBody}; -use crate::std_syntax::BinOp::{Add, Sub, Mul, Div, Mod, Eq, Ne, Lt, Gt, Le, Ge, And, Or, NullCoalesce}; -use crate::std_syntax::LiteralValue::{LitBool, LitNull}; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; pub fn dag_item_forms() -> Rc>> { thread_local! { - static CACHED: Rc>> = { - Rc::new(vec![Rc::new(ItemForm { - kind: ItemFormKind::TypeAliasForm, - keyword: "type".to_string(), - has_type_params: true, - has_params: false, - has_return_type: false, - return_required: false, - has_uses: false, - body_kind: BodyKind::TypeBody, -}), Rc::new(ItemForm { - kind: ItemFormKind::FuncForm, - keyword: "fn".to_string(), - has_type_params: true, - has_params: true, - has_return_type: true, - return_required: true, - has_uses: false, - body_kind: BodyKind::ExprBody, -}), Rc::new(ItemForm { - kind: ItemFormKind::FuncForm, - keyword: "func".to_string(), - has_type_params: false, - has_params: true, - has_return_type: true, - return_required: false, - has_uses: true, - body_kind: BodyKind::BlockBody, -}), Rc::new(ItemForm { - kind: ItemFormKind::OtherForm, - keyword: "service".to_string(), - has_type_params: false, - has_params: false, - has_return_type: false, - return_required: false, - has_uses: false, - body_kind: BodyKind::ServiceBody, -}), Rc::new(ItemForm { - kind: ItemFormKind::OtherForm, - keyword: "resource".to_string(), - has_type_params: false, - has_params: false, - has_return_type: false, - return_required: false, - has_uses: false, - body_kind: BodyKind::ResourceBody, -}), Rc::new(ItemForm { - kind: ItemFormKind::OtherForm, - keyword: "data".to_string(), - has_type_params: false, - has_params: false, - has_return_type: false, - return_required: false, - has_uses: false, - body_kind: BodyKind::ValueBody, -}), Rc::new(ItemForm { - kind: ItemFormKind::OtherForm, - keyword: "pattern".to_string(), - has_type_params: false, - has_params: true, - has_return_type: true, - return_required: false, - has_uses: true, - body_kind: BodyKind::BlockBody, -}), Rc::new(ItemForm { - kind: ItemFormKind::OtherForm, - keyword: "interface".to_string(), - has_type_params: false, - has_params: true, - has_return_type: true, - return_required: false, - has_uses: false, - body_kind: BodyKind::BlockBody, -})]) - }; - } + static CACHED: Rc>> = { + Rc::new(vec![Rc::new(ItemForm { + kind: ItemFormKind::TypeAliasForm, + keyword: "type".to_string(), + has_type_params: true, + has_params: false, + has_return_type: false, + return_required: false, + has_uses: false, + body_kind: BodyKind::TypeBody, + }), Rc::new(ItemForm { + kind: ItemFormKind::FuncForm, + keyword: "fn".to_string(), + has_type_params: true, + has_params: true, + has_return_type: true, + return_required: true, + has_uses: false, + body_kind: BodyKind::ExprBody, + }), Rc::new(ItemForm { + kind: ItemFormKind::FuncForm, + keyword: "func".to_string(), + has_type_params: false, + has_params: true, + has_return_type: true, + return_required: false, + has_uses: true, + body_kind: BodyKind::BlockBody, + }), Rc::new(ItemForm { + kind: ItemFormKind::OtherForm, + keyword: "service".to_string(), + has_type_params: false, + has_params: false, + has_return_type: false, + return_required: false, + has_uses: false, + body_kind: BodyKind::ServiceBody, + }), Rc::new(ItemForm { + kind: ItemFormKind::OtherForm, + keyword: "resource".to_string(), + has_type_params: false, + has_params: false, + has_return_type: false, + return_required: false, + has_uses: false, + body_kind: BodyKind::ResourceBody, + }), Rc::new(ItemForm { + kind: ItemFormKind::OtherForm, + keyword: "data".to_string(), + has_type_params: false, + has_params: false, + has_return_type: false, + return_required: false, + has_uses: false, + body_kind: BodyKind::ValueBody, + }), Rc::new(ItemForm { + kind: ItemFormKind::OtherForm, + keyword: "pattern".to_string(), + has_type_params: false, + has_params: true, + has_return_type: true, + return_required: false, + has_uses: true, + body_kind: BodyKind::BlockBody, + }), Rc::new(ItemForm { + kind: ItemFormKind::OtherForm, + keyword: "interface".to_string(), + has_type_params: false, + has_params: true, + has_return_type: true, + return_required: false, + has_uses: false, + body_kind: BodyKind::BlockBody, + })]) + }; + } CACHED.with(|c| c.clone()) } pub fn dag_keyword_literals() -> Rc>> { thread_local! { - static CACHED: Rc>> = { - let mut __m = HashMap::new(); - __m.insert("true".to_string(), Rc::new(LiteralValue::LitBool { - value: true, -})); - __m.insert("false".to_string(), Rc::new(LiteralValue::LitBool { - value: false, -})); - __m.insert("none".to_string(), Rc::new(LiteralValue::LitNull)); - __m.insert("null".to_string(), Rc::new(LiteralValue::LitNull)); - Rc::new(__m) - }; - } + static CACHED: Rc>> = { + let mut __m = HashMap::new(); + __m.insert("true".to_string(), Rc::new(LiteralValue::LitBool { + value: true, + })); + __m.insert("false".to_string(), Rc::new(LiteralValue::LitBool { + value: false, + })); + __m.insert("none".to_string(), Rc::new(LiteralValue::LitNull)); + __m.insert("null".to_string(), Rc::new(LiteralValue::LitNull)); + Rc::new(__m) + }; + } CACHED.with(|c| c.clone()) } @@ -174,119 +182,119 @@ pub fn dag_non_name_keywords() -> Rc> { pub fn dag_operators() -> Rc>> { thread_local! { - static CACHED: Rc>> = { - Rc::new(vec![Rc::new(OperatorSpec { - symbol: "??".to_string(), - left_bp: 3, - right_bp: 4, - binop: Some(BinOp::NullCoalesce), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "||".to_string(), - left_bp: 5, - right_bp: 6, - binop: Some(BinOp::Or), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "&&".to_string(), - left_bp: 7, - right_bp: 8, - binop: Some(BinOp::And), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "==".to_string(), - left_bp: 9, - right_bp: 10, - binop: Some(BinOp::Eq), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "!=".to_string(), - left_bp: 9, - right_bp: 10, - binop: Some(BinOp::Ne), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "<".to_string(), - left_bp: 11, - right_bp: 12, - binop: Some(BinOp::Lt), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: ">".to_string(), - left_bp: 11, - right_bp: 12, - binop: Some(BinOp::Gt), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "<=".to_string(), - left_bp: 11, - right_bp: 12, - binop: Some(BinOp::Le), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: ">=".to_string(), - left_bp: 11, - right_bp: 12, - binop: Some(BinOp::Ge), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "+".to_string(), - left_bp: 13, - right_bp: 14, - binop: Some(BinOp::Add), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "-".to_string(), - left_bp: 13, - right_bp: 14, - binop: Some(BinOp::Sub), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "*".to_string(), - left_bp: 15, - right_bp: 16, - binop: Some(BinOp::Mul), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "/".to_string(), - left_bp: 15, - right_bp: 16, - binop: Some(BinOp::Div), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "%".to_string(), - left_bp: 15, - right_bp: 16, - binop: Some(BinOp::Mod), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "|>".to_string(), - left_bp: 17, - right_bp: 18, - binop: None, - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: ".".to_string(), - left_bp: 19, - right_bp: 20, - binop: None, - algebra_field: None, -})]) - }; - } + static CACHED: Rc>> = { + Rc::new(vec![Rc::new(OperatorSpec { + symbol: "??".to_string(), + left_bp: 3, + right_bp: 4, + binop: Some(BinOp::NullCoalesce), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "||".to_string(), + left_bp: 5, + right_bp: 6, + binop: Some(BinOp::Or), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "&&".to_string(), + left_bp: 7, + right_bp: 8, + binop: Some(BinOp::And), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "==".to_string(), + left_bp: 9, + right_bp: 10, + binop: Some(BinOp::Eq), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "!=".to_string(), + left_bp: 9, + right_bp: 10, + binop: Some(BinOp::Ne), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "<".to_string(), + left_bp: 11, + right_bp: 12, + binop: Some(BinOp::Lt), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: ">".to_string(), + left_bp: 11, + right_bp: 12, + binop: Some(BinOp::Gt), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "<=".to_string(), + left_bp: 11, + right_bp: 12, + binop: Some(BinOp::Le), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: ">=".to_string(), + left_bp: 11, + right_bp: 12, + binop: Some(BinOp::Ge), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "+".to_string(), + left_bp: 13, + right_bp: 14, + binop: Some(BinOp::Add), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "-".to_string(), + left_bp: 13, + right_bp: 14, + binop: Some(BinOp::Sub), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "*".to_string(), + left_bp: 15, + right_bp: 16, + binop: Some(BinOp::Mul), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "/".to_string(), + left_bp: 15, + right_bp: 16, + binop: Some(BinOp::Div), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "%".to_string(), + left_bp: 15, + right_bp: 16, + binop: Some(BinOp::Mod), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "|>".to_string(), + left_bp: 17, + right_bp: 18, + binop: None, + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: ".".to_string(), + left_bp: 19, + right_bp: 20, + binop: None, + algebra_field: None, + })]) + }; + } CACHED.with(|c| c.clone()) } pub fn dag_syntax_spec() -> Rc { thread_local! { - static CACHED: Rc = { - Rc::new(SyntaxSpec { - item_forms: dag_item_forms(), - operators: dag_operators(), - keyword_literals: dag_keyword_literals(), - keyword_set: dag_keyword_set(), -}) - }; - } + static CACHED: Rc = { + Rc::new(SyntaxSpec { + item_forms: dag_item_forms(), + operators: dag_operators(), + keyword_literals: dag_keyword_literals(), + keyword_set: dag_keyword_set(), + }) + }; + } CACHED.with(|c| c.clone()) } diff --git a/src/v2/stage0/src/extdeps_languages_dag_types.rs b/src/v2/stage0/src/extdeps_languages_dag_types.rs index c95c45171d0..747e7726ac8 100644 --- a/src/v2/stage0/src/extdeps_languages_dag_types.rs +++ b/src/v2/stage0/src/extdeps_languages_dag_types.rs @@ -1,12 +1,12 @@ // Generated by v2 compiler -- do not edit. // Source module: extdeps.languages.dag.types -use std::collections::HashMap; -use std::rc::Rc; +pub use crate::std_coercion::TypeCheckpoint; use crate::v2_rt; -use crate::NonEmptyVec; use crate::NonEmptyBTreeSet; -pub use crate::std_coercion::{TypeCheckpoint}; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; pub fn dag_type_checkpoints() -> Rc>> { thread_local! { diff --git a/src/v2/stage0/src/extdeps_languages_go_emit.rs b/src/v2/stage0/src/extdeps_languages_go_emit.rs index a6ddd844b04..c6ad3e3c756 100644 --- a/src/v2/stage0/src/extdeps_languages_go_emit.rs +++ b/src/v2/stage0/src/extdeps_languages_go_emit.rs @@ -1,11 +1,11 @@ // Generated by v2 compiler -- do not edit. // Source module: extdeps.languages.go.emit -use std::collections::HashMap; -use std::rc::Rc; use crate::v2_rt; -use crate::NonEmptyVec; use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; pub fn go_keywords() -> Rc> { thread_local! { diff --git a/src/v2/stage0/src/extdeps_languages_go_syntax.rs b/src/v2/stage0/src/extdeps_languages_go_syntax.rs index ea0c113871a..a488a4b3987 100644 --- a/src/v2/stage0/src/extdeps_languages_go_syntax.rs +++ b/src/v2/stage0/src/extdeps_languages_go_syntax.rs @@ -1,153 +1,157 @@ // Generated by v2 compiler -- do not edit. // Source module: extdeps.languages.go.syntax -use std::collections::HashMap; -use std::rc::Rc; +use crate::std_syntax::BinOp::{ + Add, And, Div, Eq, Ge, Gt, Le, Lt, Mod, Mul, Ne, NullCoalesce, Or, Sub, +}; +use crate::std_syntax::BodyKind::{BlockBody, NoBody, TypeBody}; +use crate::std_syntax::ItemFormKind::{ + EnumForm, FuncForm, ModuleForm, OtherForm, StructForm, TypeAliasForm, +}; +pub use crate::std_syntax::{BinOp, BodyKind, ItemForm, ItemFormKind, OperatorSpec}; use crate::v2_rt; -use crate::NonEmptyVec; use crate::NonEmptyBTreeSet; -pub use crate::std_syntax::{ItemForm, ItemFormKind, BodyKind, OperatorSpec, BinOp}; -use crate::std_syntax::ItemFormKind::{FuncForm, StructForm, EnumForm, TypeAliasForm, ModuleForm, OtherForm}; -use crate::std_syntax::BodyKind::{BlockBody, TypeBody, NoBody}; -use crate::std_syntax::BinOp::{Add, Sub, Mul, Div, Mod, Eq, Ne, Lt, Gt, Le, Ge, And, Or, NullCoalesce}; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; pub fn go_item_forms() -> Rc>> { thread_local! { - static CACHED: Rc>> = { - Rc::new(vec![Rc::new(ItemForm { - kind: ItemFormKind::FuncForm, - keyword: "func".to_string(), - has_type_params: false, - has_params: true, - has_return_type: true, - return_required: false, - has_uses: false, - body_kind: BodyKind::BlockBody, -}), Rc::new(ItemForm { - kind: ItemFormKind::StructForm, - keyword: "struct".to_string(), - has_type_params: false, - has_params: false, - has_return_type: false, - return_required: false, - has_uses: false, - body_kind: BodyKind::TypeBody, -}), Rc::new(ItemForm { - kind: ItemFormKind::EnumForm, - keyword: "type".to_string(), - has_type_params: false, - has_params: false, - has_return_type: false, - return_required: false, - has_uses: false, - body_kind: BodyKind::NoBody, -}), Rc::new(ItemForm { - kind: ItemFormKind::TypeAliasForm, - keyword: "type".to_string(), - has_type_params: false, - has_params: false, - has_return_type: false, - return_required: false, - has_uses: false, - body_kind: BodyKind::NoBody, -}), Rc::new(ItemForm { - kind: ItemFormKind::ModuleForm, - keyword: "package".to_string(), - has_type_params: false, - has_params: false, - has_return_type: false, - return_required: false, - has_uses: false, - body_kind: BodyKind::NoBody, -})]) - }; - } + static CACHED: Rc>> = { + Rc::new(vec![Rc::new(ItemForm { + kind: ItemFormKind::FuncForm, + keyword: "func".to_string(), + has_type_params: false, + has_params: true, + has_return_type: true, + return_required: false, + has_uses: false, + body_kind: BodyKind::BlockBody, + }), Rc::new(ItemForm { + kind: ItemFormKind::StructForm, + keyword: "struct".to_string(), + has_type_params: false, + has_params: false, + has_return_type: false, + return_required: false, + has_uses: false, + body_kind: BodyKind::TypeBody, + }), Rc::new(ItemForm { + kind: ItemFormKind::EnumForm, + keyword: "type".to_string(), + has_type_params: false, + has_params: false, + has_return_type: false, + return_required: false, + has_uses: false, + body_kind: BodyKind::NoBody, + }), Rc::new(ItemForm { + kind: ItemFormKind::TypeAliasForm, + keyword: "type".to_string(), + has_type_params: false, + has_params: false, + has_return_type: false, + return_required: false, + has_uses: false, + body_kind: BodyKind::NoBody, + }), Rc::new(ItemForm { + kind: ItemFormKind::ModuleForm, + keyword: "package".to_string(), + has_type_params: false, + has_params: false, + has_return_type: false, + return_required: false, + has_uses: false, + body_kind: BodyKind::NoBody, + })]) + }; + } CACHED.with(|c| c.clone()) } pub fn go_operators() -> Rc>> { thread_local! { - static CACHED: Rc>> = { - Rc::new(vec![Rc::new(OperatorSpec { - symbol: "||".to_string(), - left_bp: 5, - right_bp: 6, - binop: Some(BinOp::Or), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "&&".to_string(), - left_bp: 7, - right_bp: 8, - binop: Some(BinOp::And), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "==".to_string(), - left_bp: 9, - right_bp: 10, - binop: Some(BinOp::Eq), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "!=".to_string(), - left_bp: 9, - right_bp: 10, - binop: Some(BinOp::Ne), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "<".to_string(), - left_bp: 11, - right_bp: 12, - binop: Some(BinOp::Lt), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: ">".to_string(), - left_bp: 11, - right_bp: 12, - binop: Some(BinOp::Gt), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "<=".to_string(), - left_bp: 11, - right_bp: 12, - binop: Some(BinOp::Le), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: ">=".to_string(), - left_bp: 11, - right_bp: 12, - binop: Some(BinOp::Ge), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "+".to_string(), - left_bp: 13, - right_bp: 14, - binop: Some(BinOp::Add), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "-".to_string(), - left_bp: 13, - right_bp: 14, - binop: Some(BinOp::Sub), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "*".to_string(), - left_bp: 15, - right_bp: 16, - binop: Some(BinOp::Mul), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "/".to_string(), - left_bp: 15, - right_bp: 16, - binop: Some(BinOp::Div), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "%".to_string(), - left_bp: 15, - right_bp: 16, - binop: Some(BinOp::Mod), - algebra_field: None, -})]) - }; - } + static CACHED: Rc>> = { + Rc::new(vec![Rc::new(OperatorSpec { + symbol: "||".to_string(), + left_bp: 5, + right_bp: 6, + binop: Some(BinOp::Or), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "&&".to_string(), + left_bp: 7, + right_bp: 8, + binop: Some(BinOp::And), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "==".to_string(), + left_bp: 9, + right_bp: 10, + binop: Some(BinOp::Eq), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "!=".to_string(), + left_bp: 9, + right_bp: 10, + binop: Some(BinOp::Ne), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "<".to_string(), + left_bp: 11, + right_bp: 12, + binop: Some(BinOp::Lt), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: ">".to_string(), + left_bp: 11, + right_bp: 12, + binop: Some(BinOp::Gt), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "<=".to_string(), + left_bp: 11, + right_bp: 12, + binop: Some(BinOp::Le), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: ">=".to_string(), + left_bp: 11, + right_bp: 12, + binop: Some(BinOp::Ge), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "+".to_string(), + left_bp: 13, + right_bp: 14, + binop: Some(BinOp::Add), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "-".to_string(), + left_bp: 13, + right_bp: 14, + binop: Some(BinOp::Sub), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "*".to_string(), + left_bp: 15, + right_bp: 16, + binop: Some(BinOp::Mul), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "/".to_string(), + left_bp: 15, + right_bp: 16, + binop: Some(BinOp::Div), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "%".to_string(), + left_bp: 15, + right_bp: 16, + binop: Some(BinOp::Mod), + algebra_field: None, + })]) + }; + } CACHED.with(|c| c.clone()) } diff --git a/src/v2/stage0/src/extdeps_languages_go_types.rs b/src/v2/stage0/src/extdeps_languages_go_types.rs index 71c584f3f82..f76a6e48558 100644 --- a/src/v2/stage0/src/extdeps_languages_go_types.rs +++ b/src/v2/stage0/src/extdeps_languages_go_types.rs @@ -1,12 +1,12 @@ // Generated by v2 compiler -- do not edit. // Source module: extdeps.languages.go.types -use std::collections::HashMap; -use std::rc::Rc; +pub use crate::std_coercion::{CallableRepr, CastSyntax, InhabitantDecl, TypeCheckpoint}; use crate::v2_rt; -use crate::NonEmptyVec; use crate::NonEmptyBTreeSet; -pub use crate::std_coercion::{TypeCheckpoint, InhabitantDecl, CallableRepr, CastSyntax}; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; pub fn go_type_checkpoints() -> Rc>> { thread_local! { @@ -74,7 +74,9 @@ pub fn nil_literal() -> String { CACHED.with(|c| c.clone()) } -pub fn visibility_by_case() -> bool { true } +pub fn visibility_by_case() -> bool { + true +} pub fn embedded_field_syntax() -> String { thread_local! { diff --git a/src/v2/stage0/src/extdeps_languages_python_emit.rs b/src/v2/stage0/src/extdeps_languages_python_emit.rs index be02c40f3e0..67bdcccec21 100644 --- a/src/v2/stage0/src/extdeps_languages_python_emit.rs +++ b/src/v2/stage0/src/extdeps_languages_python_emit.rs @@ -1,11 +1,11 @@ // Generated by v2 compiler -- do not edit. // Source module: extdeps.languages.python.emit -use std::collections::HashMap; -use std::rc::Rc; use crate::v2_rt; -use crate::NonEmptyVec; use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; pub fn python_keywords() -> Rc> { thread_local! { diff --git a/src/v2/stage0/src/extdeps_languages_python_syntax.rs b/src/v2/stage0/src/extdeps_languages_python_syntax.rs index f70c8c577e9..6fdeb0197c0 100644 --- a/src/v2/stage0/src/extdeps_languages_python_syntax.rs +++ b/src/v2/stage0/src/extdeps_languages_python_syntax.rs @@ -1,160 +1,166 @@ // Generated by v2 compiler -- do not edit. // Source module: extdeps.languages.python.syntax -use std::collections::HashMap; -use std::rc::Rc; +use crate::std_syntax::AlgebraFieldKind::{AlgQuotient, AlgReciprocal}; +use crate::std_syntax::BinOp::{ + Add, And, Div, Eq, Ge, Gt, Le, Lt, Mod, Mul, Ne, NullCoalesce, Or, Sub, +}; +use crate::std_syntax::BodyKind::{BlockBody, NoBody, TypeBody}; +use crate::std_syntax::ItemFormKind::{ + EnumForm, FuncForm, ModuleForm, OtherForm, StructForm, TypeAliasForm, +}; +pub use crate::std_syntax::{ + AlgebraFieldKind, BinOp, BodyKind, ItemForm, ItemFormKind, OperatorSpec, +}; use crate::v2_rt; -use crate::NonEmptyVec; use crate::NonEmptyBTreeSet; -pub use crate::std_syntax::{ItemForm, ItemFormKind, BodyKind, OperatorSpec, BinOp, AlgebraFieldKind}; -use crate::std_syntax::ItemFormKind::{FuncForm, StructForm, EnumForm, TypeAliasForm, ModuleForm, OtherForm}; -use crate::std_syntax::BodyKind::{BlockBody, TypeBody, NoBody}; -use crate::std_syntax::BinOp::{Add, Sub, Mul, Div, Mod, Eq, Ne, Lt, Gt, Le, Ge, And, Or, NullCoalesce}; -use crate::std_syntax::AlgebraFieldKind::{AlgReciprocal, AlgQuotient}; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; pub fn python_item_forms() -> Rc>> { thread_local! { - static CACHED: Rc>> = { - Rc::new(vec![Rc::new(ItemForm { - kind: ItemFormKind::FuncForm, - keyword: "def".to_string(), - has_type_params: false, - has_params: true, - has_return_type: true, - return_required: false, - has_uses: false, - body_kind: BodyKind::BlockBody, -}), Rc::new(ItemForm { - kind: ItemFormKind::StructForm, - keyword: "class".to_string(), - has_type_params: false, - has_params: false, - has_return_type: false, - return_required: false, - has_uses: false, - body_kind: BodyKind::BlockBody, -}), Rc::new(ItemForm { - kind: ItemFormKind::EnumForm, - keyword: "class".to_string(), - has_type_params: false, - has_params: false, - has_return_type: false, - return_required: false, - has_uses: false, - body_kind: BodyKind::BlockBody, -}), Rc::new(ItemForm { - kind: ItemFormKind::TypeAliasForm, - keyword: "".to_string(), - has_type_params: false, - has_params: false, - has_return_type: false, - return_required: false, - has_uses: false, - body_kind: BodyKind::NoBody, -}), Rc::new(ItemForm { - kind: ItemFormKind::ModuleForm, - keyword: "".to_string(), - has_type_params: false, - has_params: false, - has_return_type: false, - return_required: false, - has_uses: false, - body_kind: BodyKind::NoBody, -})]) - }; - } + static CACHED: Rc>> = { + Rc::new(vec![Rc::new(ItemForm { + kind: ItemFormKind::FuncForm, + keyword: "def".to_string(), + has_type_params: false, + has_params: true, + has_return_type: true, + return_required: false, + has_uses: false, + body_kind: BodyKind::BlockBody, + }), Rc::new(ItemForm { + kind: ItemFormKind::StructForm, + keyword: "class".to_string(), + has_type_params: false, + has_params: false, + has_return_type: false, + return_required: false, + has_uses: false, + body_kind: BodyKind::BlockBody, + }), Rc::new(ItemForm { + kind: ItemFormKind::EnumForm, + keyword: "class".to_string(), + has_type_params: false, + has_params: false, + has_return_type: false, + return_required: false, + has_uses: false, + body_kind: BodyKind::BlockBody, + }), Rc::new(ItemForm { + kind: ItemFormKind::TypeAliasForm, + keyword: "".to_string(), + has_type_params: false, + has_params: false, + has_return_type: false, + return_required: false, + has_uses: false, + body_kind: BodyKind::NoBody, + }), Rc::new(ItemForm { + kind: ItemFormKind::ModuleForm, + keyword: "".to_string(), + has_type_params: false, + has_params: false, + has_return_type: false, + return_required: false, + has_uses: false, + body_kind: BodyKind::NoBody, + })]) + }; + } CACHED.with(|c| c.clone()) } pub fn python_operators() -> Rc>> { thread_local! { - static CACHED: Rc>> = { - Rc::new(vec![Rc::new(OperatorSpec { - symbol: "or".to_string(), - left_bp: 5, - right_bp: 6, - binop: Some(BinOp::Or), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "and".to_string(), - left_bp: 7, - right_bp: 8, - binop: Some(BinOp::And), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "==".to_string(), - left_bp: 9, - right_bp: 10, - binop: Some(BinOp::Eq), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "!=".to_string(), - left_bp: 9, - right_bp: 10, - binop: Some(BinOp::Ne), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "<".to_string(), - left_bp: 11, - right_bp: 12, - binop: Some(BinOp::Lt), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: ">".to_string(), - left_bp: 11, - right_bp: 12, - binop: Some(BinOp::Gt), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "<=".to_string(), - left_bp: 11, - right_bp: 12, - binop: Some(BinOp::Le), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: ">=".to_string(), - left_bp: 11, - right_bp: 12, - binop: Some(BinOp::Ge), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "+".to_string(), - left_bp: 13, - right_bp: 14, - binop: Some(BinOp::Add), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "-".to_string(), - left_bp: 13, - right_bp: 14, - binop: Some(BinOp::Sub), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "*".to_string(), - left_bp: 15, - right_bp: 16, - binop: Some(BinOp::Mul), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "/".to_string(), - left_bp: 15, - right_bp: 16, - binop: Some(BinOp::Div), - algebra_field: Some(AlgebraFieldKind::AlgReciprocal), -}), Rc::new(OperatorSpec { - symbol: "//".to_string(), - left_bp: 15, - right_bp: 16, - binop: Some(BinOp::Div), - algebra_field: Some(AlgebraFieldKind::AlgQuotient), -}), Rc::new(OperatorSpec { - symbol: "%".to_string(), - left_bp: 15, - right_bp: 16, - binop: Some(BinOp::Mod), - algebra_field: None, -})]) - }; - } + static CACHED: Rc>> = { + Rc::new(vec![Rc::new(OperatorSpec { + symbol: "or".to_string(), + left_bp: 5, + right_bp: 6, + binop: Some(BinOp::Or), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "and".to_string(), + left_bp: 7, + right_bp: 8, + binop: Some(BinOp::And), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "==".to_string(), + left_bp: 9, + right_bp: 10, + binop: Some(BinOp::Eq), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "!=".to_string(), + left_bp: 9, + right_bp: 10, + binop: Some(BinOp::Ne), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "<".to_string(), + left_bp: 11, + right_bp: 12, + binop: Some(BinOp::Lt), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: ">".to_string(), + left_bp: 11, + right_bp: 12, + binop: Some(BinOp::Gt), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "<=".to_string(), + left_bp: 11, + right_bp: 12, + binop: Some(BinOp::Le), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: ">=".to_string(), + left_bp: 11, + right_bp: 12, + binop: Some(BinOp::Ge), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "+".to_string(), + left_bp: 13, + right_bp: 14, + binop: Some(BinOp::Add), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "-".to_string(), + left_bp: 13, + right_bp: 14, + binop: Some(BinOp::Sub), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "*".to_string(), + left_bp: 15, + right_bp: 16, + binop: Some(BinOp::Mul), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "/".to_string(), + left_bp: 15, + right_bp: 16, + binop: Some(BinOp::Div), + algebra_field: Some(AlgebraFieldKind::AlgReciprocal), + }), Rc::new(OperatorSpec { + symbol: "//".to_string(), + left_bp: 15, + right_bp: 16, + binop: Some(BinOp::Div), + algebra_field: Some(AlgebraFieldKind::AlgQuotient), + }), Rc::new(OperatorSpec { + symbol: "%".to_string(), + left_bp: 15, + right_bp: 16, + binop: Some(BinOp::Mod), + algebra_field: None, + })]) + }; + } CACHED.with(|c| c.clone()) } diff --git a/src/v2/stage0/src/extdeps_languages_python_types.rs b/src/v2/stage0/src/extdeps_languages_python_types.rs index 3d5b6ca151f..c770af67413 100644 --- a/src/v2/stage0/src/extdeps_languages_python_types.rs +++ b/src/v2/stage0/src/extdeps_languages_python_types.rs @@ -1,13 +1,13 @@ // Generated by v2 compiler -- do not edit. // Source module: extdeps.languages.python.types -use std::collections::HashMap; -use std::rc::Rc; +use self::PythonTypeKind::*; +pub use crate::std_coercion::{CallableRepr, CastSyntax, InhabitantDecl, TypeCheckpoint}; use crate::v2_rt; -use crate::NonEmptyVec; use crate::NonEmptyBTreeSet; -pub use crate::std_coercion::{TypeCheckpoint, InhabitantDecl, CallableRepr, CastSyntax}; -use self::PythonTypeKind::*; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; pub fn python_type_checkpoints() -> Rc>> { thread_local! { diff --git a/src/v2/stage0/src/extdeps_languages_rust_emit.rs b/src/v2/stage0/src/extdeps_languages_rust_emit.rs index 6e28fab40d4..5e4c2f0bd8a 100644 --- a/src/v2/stage0/src/extdeps_languages_rust_emit.rs +++ b/src/v2/stage0/src/extdeps_languages_rust_emit.rs @@ -1,11 +1,11 @@ // Generated by v2 compiler -- do not edit. // Source module: extdeps.languages.rust.emit -use std::collections::HashMap; -use std::rc::Rc; use crate::v2_rt; -use crate::NonEmptyVec; use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; pub fn rust_keywords() -> Rc> { thread_local! { @@ -59,11 +59,32 @@ pub fn rust_simple_method_specs() -> Rc>> { } pub fn rust_method_templates() -> Rc> { - rust_simple_method_specs().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, spec: Rc| v2_rt::rc_map_insert(acc, spec.method_name.clone(), spec.template.clone())) + rust_simple_method_specs().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, spec: Rc| { + v2_rt::rc_map_insert(acc, spec.method_name.clone(), spec.template.clone()) + }, + ) } pub fn rust_method_wraps_result() -> Rc> { - Rc::new({ let mut __result = Vec::new(); for s in rust_simple_method_specs().iter().cloned() { if s.wraps_result.clone() { __result.push(s); } } __result }).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, spec: Rc| v2_rt::rc_map_insert(acc, spec.method_name.clone(), true)) + Rc::new({ + let mut __result = Vec::new(); + for s in rust_simple_method_specs().iter().cloned() { + if s.wraps_result.clone() { + __result.push(s); + } + } + __result + }) + .iter() + .cloned() + .fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, spec: Rc| { + v2_rt::rc_map_insert(acc, spec.method_name.clone(), true) + }, + ) } pub fn rust_reserved() -> Rc> { @@ -409,19 +430,72 @@ pub fn rt_function_registry() -> Rc>> { } pub fn rt_functions() -> Rc> { - rt_function_registry().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, entry: Rc| v2_rt::rc_map_insert(acc, entry.name.clone(), true)) + rt_function_registry().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, entry: Rc| { + v2_rt::rc_map_insert(acc, entry.name.clone(), true) + }, + ) } pub fn rt_ref_map_functions() -> Rc> { - Rc::new({ let mut __result = Vec::new(); for f in rt_function_registry().iter().cloned() { if f.passes_by_ref.clone() { __result.push(f); } } __result }).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, entry: Rc| v2_rt::rc_map_insert(acc, entry.name.clone(), true)) + Rc::new({ + let mut __result = Vec::new(); + for f in rt_function_registry().iter().cloned() { + if f.passes_by_ref.clone() { + __result.push(f); + } + } + __result + }) + .iter() + .cloned() + .fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, entry: Rc| { + v2_rt::rc_map_insert(acc, entry.name.clone(), true) + }, + ) } pub fn rt_wraps_result() -> Rc> { - Rc::new({ let mut __result = Vec::new(); for f in rt_function_registry().iter().cloned() { if f.wraps_result.clone() { __result.push(f); } } __result }).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, entry: Rc| v2_rt::rc_map_insert(acc, entry.name.clone(), true)) + Rc::new({ + let mut __result = Vec::new(); + for f in rt_function_registry().iter().cloned() { + if f.wraps_result.clone() { + __result.push(f); + } + } + __result + }) + .iter() + .cloned() + .fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, entry: Rc| { + v2_rt::rc_map_insert(acc, entry.name.clone(), true) + }, + ) } pub fn rt_bridge_function_names() -> Rc> { - Rc::new({ let mut __result = Vec::new(); for f in rt_function_registry().iter().cloned() { if (f.name.clone().as_str() != f.bridge_name.clone().as_str()) { __result.push(f); } } __result }).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, entry: Rc| v2_rt::rc_map_insert(acc, entry.name.clone(), entry.bridge_name.clone())) + Rc::new({ + let mut __result = Vec::new(); + for f in rt_function_registry().iter().cloned() { + if (f.name.clone().as_str() != f.bridge_name.clone().as_str()) { + __result.push(f); + } + } + __result + }) + .iter() + .cloned() + .fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, entry: Rc| { + v2_rt::rc_map_insert(acc, entry.name.clone(), entry.bridge_name.clone()) + }, + ) } pub fn is_rt_function(name: String) -> bool { @@ -430,9 +504,9 @@ pub fn is_rt_function(name: String) -> bool { pub fn rt_bridge_name(name: String) -> String { match v2_rt::map_get(&rt_bridge_function_names(), name.clone()) { - Some(bridge) => bridge.clone(), - None => name.clone(), -} + Some(bridge) => bridge.clone(), + None => name.clone(), + } } pub fn rt_passes_by_ref(name: String) -> bool { diff --git a/src/v2/stage0/src/extdeps_languages_rust_syntax.rs b/src/v2/stage0/src/extdeps_languages_rust_syntax.rs index 7ee94af98c8..41e62fe19b4 100644 --- a/src/v2/stage0/src/extdeps_languages_rust_syntax.rs +++ b/src/v2/stage0/src/extdeps_languages_rust_syntax.rs @@ -1,120 +1,124 @@ // Generated by v2 compiler -- do not edit. // Source module: extdeps.languages.rust.syntax -use std::collections::HashMap; -use std::rc::Rc; +use crate::std_syntax::BinOp::{Add, And, Div, Eq, Ge, Gt, Le, Lt, Mod, Mul, Ne, Or, Sub}; +use crate::std_syntax::BodyKind::{BlockBody, ExprBody, NoBody, TypeBody}; +use crate::std_syntax::ItemFormKind::{ + EnumForm, FuncForm, ModuleForm, OtherForm, StructForm, TypeAliasForm, +}; +use crate::std_syntax::LiteralValue::LitBool; +pub use crate::std_syntax::{ + BinOp, BodyKind, ItemForm, ItemFormKind, LiteralValue, OperatorSpec, SyntaxSpec, +}; use crate::v2_rt; -use crate::NonEmptyVec; use crate::NonEmptyBTreeSet; -pub use crate::std_syntax::{ItemForm, ItemFormKind, BodyKind, OperatorSpec, SyntaxSpec, BinOp, LiteralValue}; -use crate::std_syntax::ItemFormKind::{FuncForm, StructForm, EnumForm, TypeAliasForm, ModuleForm, OtherForm}; -use crate::std_syntax::BodyKind::{ExprBody, BlockBody, TypeBody, NoBody}; -use crate::std_syntax::BinOp::{Add, Sub, Mul, Div, Mod, Eq, Ne, Lt, Gt, Le, Ge, And, Or}; -use crate::std_syntax::LiteralValue::{LitBool}; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; pub fn rust_item_forms() -> Rc>> { thread_local! { - static CACHED: Rc>> = { - Rc::new(vec![Rc::new(ItemForm { - kind: ItemFormKind::FuncForm, - keyword: "fn".to_string(), - has_type_params: true, - has_params: true, - has_return_type: true, - return_required: false, - has_uses: false, - body_kind: BodyKind::BlockBody, -}), Rc::new(ItemForm { - kind: ItemFormKind::StructForm, - keyword: "struct".to_string(), - has_type_params: true, - has_params: false, - has_return_type: false, - return_required: false, - has_uses: false, - body_kind: BodyKind::TypeBody, -}), Rc::new(ItemForm { - kind: ItemFormKind::EnumForm, - keyword: "enum".to_string(), - has_type_params: true, - has_params: false, - has_return_type: false, - return_required: false, - has_uses: false, - body_kind: BodyKind::TypeBody, -}), Rc::new(ItemForm { - kind: ItemFormKind::TypeAliasForm, - keyword: "type".to_string(), - has_type_params: true, - has_params: false, - has_return_type: false, - return_required: false, - has_uses: false, - body_kind: BodyKind::NoBody, -}), Rc::new(ItemForm { - kind: ItemFormKind::OtherForm, - keyword: "trait".to_string(), - has_type_params: true, - has_params: false, - has_return_type: false, - return_required: false, - has_uses: false, - body_kind: BodyKind::BlockBody, -}), Rc::new(ItemForm { - kind: ItemFormKind::OtherForm, - keyword: "impl".to_string(), - has_type_params: true, - has_params: false, - has_return_type: false, - return_required: false, - has_uses: false, - body_kind: BodyKind::BlockBody, -}), Rc::new(ItemForm { - kind: ItemFormKind::OtherForm, - keyword: "const".to_string(), - has_type_params: false, - has_params: false, - has_return_type: true, - return_required: true, - has_uses: false, - body_kind: BodyKind::ExprBody, -}), Rc::new(ItemForm { - kind: ItemFormKind::OtherForm, - keyword: "static".to_string(), - has_type_params: false, - has_params: false, - has_return_type: true, - return_required: true, - has_uses: false, - body_kind: BodyKind::ExprBody, -}), Rc::new(ItemForm { - kind: ItemFormKind::ModuleForm, - keyword: "mod".to_string(), - has_type_params: false, - has_params: false, - has_return_type: false, - return_required: false, - has_uses: false, - body_kind: BodyKind::BlockBody, -})]) - }; - } + static CACHED: Rc>> = { + Rc::new(vec![Rc::new(ItemForm { + kind: ItemFormKind::FuncForm, + keyword: "fn".to_string(), + has_type_params: true, + has_params: true, + has_return_type: true, + return_required: false, + has_uses: false, + body_kind: BodyKind::BlockBody, + }), Rc::new(ItemForm { + kind: ItemFormKind::StructForm, + keyword: "struct".to_string(), + has_type_params: true, + has_params: false, + has_return_type: false, + return_required: false, + has_uses: false, + body_kind: BodyKind::TypeBody, + }), Rc::new(ItemForm { + kind: ItemFormKind::EnumForm, + keyword: "enum".to_string(), + has_type_params: true, + has_params: false, + has_return_type: false, + return_required: false, + has_uses: false, + body_kind: BodyKind::TypeBody, + }), Rc::new(ItemForm { + kind: ItemFormKind::TypeAliasForm, + keyword: "type".to_string(), + has_type_params: true, + has_params: false, + has_return_type: false, + return_required: false, + has_uses: false, + body_kind: BodyKind::NoBody, + }), Rc::new(ItemForm { + kind: ItemFormKind::OtherForm, + keyword: "trait".to_string(), + has_type_params: true, + has_params: false, + has_return_type: false, + return_required: false, + has_uses: false, + body_kind: BodyKind::BlockBody, + }), Rc::new(ItemForm { + kind: ItemFormKind::OtherForm, + keyword: "impl".to_string(), + has_type_params: true, + has_params: false, + has_return_type: false, + return_required: false, + has_uses: false, + body_kind: BodyKind::BlockBody, + }), Rc::new(ItemForm { + kind: ItemFormKind::OtherForm, + keyword: "const".to_string(), + has_type_params: false, + has_params: false, + has_return_type: true, + return_required: true, + has_uses: false, + body_kind: BodyKind::ExprBody, + }), Rc::new(ItemForm { + kind: ItemFormKind::OtherForm, + keyword: "static".to_string(), + has_type_params: false, + has_params: false, + has_return_type: true, + return_required: true, + has_uses: false, + body_kind: BodyKind::ExprBody, + }), Rc::new(ItemForm { + kind: ItemFormKind::ModuleForm, + keyword: "mod".to_string(), + has_type_params: false, + has_params: false, + has_return_type: false, + return_required: false, + has_uses: false, + body_kind: BodyKind::BlockBody, + })]) + }; + } CACHED.with(|c| c.clone()) } pub fn rust_keyword_literals() -> Rc>> { thread_local! { - static CACHED: Rc>> = { - let mut __m = HashMap::new(); - __m.insert("true".to_string(), Rc::new(LiteralValue::LitBool { - value: true, -})); - __m.insert("false".to_string(), Rc::new(LiteralValue::LitBool { - value: false, -})); - Rc::new(__m) - }; - } + static CACHED: Rc>> = { + let mut __m = HashMap::new(); + __m.insert("true".to_string(), Rc::new(LiteralValue::LitBool { + value: true, + })); + __m.insert("false".to_string(), Rc::new(LiteralValue::LitBool { + value: false, + })); + Rc::new(__m) + }; + } CACHED.with(|c| c.clone()) } @@ -167,107 +171,107 @@ pub fn rust_keyword_set() -> Rc> { pub fn rust_operators() -> Rc>> { thread_local! { - static CACHED: Rc>> = { - Rc::new(vec![Rc::new(OperatorSpec { - symbol: "||".to_string(), - left_bp: 5, - right_bp: 6, - binop: Some(BinOp::Or), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "&&".to_string(), - left_bp: 7, - right_bp: 8, - binop: Some(BinOp::And), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "==".to_string(), - left_bp: 9, - right_bp: 10, - binop: Some(BinOp::Eq), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "!=".to_string(), - left_bp: 9, - right_bp: 10, - binop: Some(BinOp::Ne), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "<".to_string(), - left_bp: 11, - right_bp: 12, - binop: Some(BinOp::Lt), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: ">".to_string(), - left_bp: 11, - right_bp: 12, - binop: Some(BinOp::Gt), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "<=".to_string(), - left_bp: 11, - right_bp: 12, - binop: Some(BinOp::Le), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: ">=".to_string(), - left_bp: 11, - right_bp: 12, - binop: Some(BinOp::Ge), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "+".to_string(), - left_bp: 13, - right_bp: 14, - binop: Some(BinOp::Add), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "-".to_string(), - left_bp: 13, - right_bp: 14, - binop: Some(BinOp::Sub), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "*".to_string(), - left_bp: 15, - right_bp: 16, - binop: Some(BinOp::Mul), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "/".to_string(), - left_bp: 15, - right_bp: 16, - binop: Some(BinOp::Div), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: "%".to_string(), - left_bp: 15, - right_bp: 16, - binop: Some(BinOp::Mod), - algebra_field: None, -}), Rc::new(OperatorSpec { - symbol: ".".to_string(), - left_bp: 19, - right_bp: 20, - binop: None, - algebra_field: None, -})]) - }; - } + static CACHED: Rc>> = { + Rc::new(vec![Rc::new(OperatorSpec { + symbol: "||".to_string(), + left_bp: 5, + right_bp: 6, + binop: Some(BinOp::Or), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "&&".to_string(), + left_bp: 7, + right_bp: 8, + binop: Some(BinOp::And), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "==".to_string(), + left_bp: 9, + right_bp: 10, + binop: Some(BinOp::Eq), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "!=".to_string(), + left_bp: 9, + right_bp: 10, + binop: Some(BinOp::Ne), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "<".to_string(), + left_bp: 11, + right_bp: 12, + binop: Some(BinOp::Lt), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: ">".to_string(), + left_bp: 11, + right_bp: 12, + binop: Some(BinOp::Gt), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "<=".to_string(), + left_bp: 11, + right_bp: 12, + binop: Some(BinOp::Le), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: ">=".to_string(), + left_bp: 11, + right_bp: 12, + binop: Some(BinOp::Ge), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "+".to_string(), + left_bp: 13, + right_bp: 14, + binop: Some(BinOp::Add), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "-".to_string(), + left_bp: 13, + right_bp: 14, + binop: Some(BinOp::Sub), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "*".to_string(), + left_bp: 15, + right_bp: 16, + binop: Some(BinOp::Mul), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "/".to_string(), + left_bp: 15, + right_bp: 16, + binop: Some(BinOp::Div), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: "%".to_string(), + left_bp: 15, + right_bp: 16, + binop: Some(BinOp::Mod), + algebra_field: None, + }), Rc::new(OperatorSpec { + symbol: ".".to_string(), + left_bp: 19, + right_bp: 20, + binop: None, + algebra_field: None, + })]) + }; + } CACHED.with(|c| c.clone()) } pub fn rust_syntax_spec() -> Rc { thread_local! { - static CACHED: Rc = { - Rc::new(SyntaxSpec { - item_forms: rust_item_forms(), - operators: rust_operators(), - keyword_literals: rust_keyword_literals(), - keyword_set: rust_keyword_set(), -}) - }; - } + static CACHED: Rc = { + Rc::new(SyntaxSpec { + item_forms: rust_item_forms(), + operators: rust_operators(), + keyword_literals: rust_keyword_literals(), + keyword_set: rust_keyword_set(), + }) + }; + } CACHED.with(|c| c.clone()) } diff --git a/src/v2/stage0/src/extdeps_languages_rust_types.rs b/src/v2/stage0/src/extdeps_languages_rust_types.rs index ff74f611836..dfc86341d78 100644 --- a/src/v2/stage0/src/extdeps_languages_rust_types.rs +++ b/src/v2/stage0/src/extdeps_languages_rust_types.rs @@ -1,14 +1,14 @@ // Generated by v2 compiler -- do not edit. // Source module: extdeps.languages.rust.types -use std::collections::HashMap; -use std::rc::Rc; -use crate::v2_rt; -use crate::NonEmptyVec; -use crate::NonEmptyBTreeSet; -pub use crate::std_coercion::{TypeCheckpoint, InhabitantDecl, CallableRepr, CastSyntax, CastRule}; use self::OwnershipKind::*; use self::SmartPointerKind::*; +pub use crate::std_coercion::{CallableRepr, CastRule, CastSyntax, InhabitantDecl, TypeCheckpoint}; +use crate::v2_rt; +use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; pub fn rust_type_checkpoints() -> Rc>> { thread_local! { @@ -76,9 +76,13 @@ pub enum OwnershipKind { RawPtr, } -pub fn pass_copy_by_value() -> bool { true } +pub fn pass_copy_by_value() -> bool { + true +} -pub fn pass_non_copy_by_ref() -> bool { true } +pub fn pass_non_copy_by_ref() -> bool { + true +} pub fn ref_prefix() -> String { thread_local! { diff --git a/src/v2/stage0/src/lib.rs b/src/v2/stage0/src/lib.rs index 972a2b1a8b9..3c028a3e16b 100644 --- a/src/v2/stage0/src/lib.rs +++ b/src/v2/stage0/src/lib.rs @@ -1,68 +1,78 @@ // Generated by v2 compiler -- do not edit. -#![allow(unused_imports, unused_variables, unused_mut, unused_parens, dead_code, unreachable_patterns, non_shorthand_field_patterns, suspicious_double_ref_op, clippy::all)] +#![allow( + unused_imports, + unused_variables, + unused_mut, + unused_parens, + dead_code, + unreachable_patterns, + non_shorthand_field_patterns, + suspicious_double_ref_op, + clippy::all +)] -pub mod std_error_primitives; -pub mod std_algebra; -pub mod std_types; +pub mod cli_run; pub mod extdeps_languages_dag_emit; -pub mod extdeps_languages_go_emit; -pub mod extdeps_languages_python_emit; -pub mod extdeps_languages_rust_emit; -pub mod std_coercion; -pub mod std_http_path; -pub mod std_iteration; -pub mod std_syntax; -pub mod std_termination; -pub mod v2_compiler_runtime_rust; pub mod extdeps_languages_dag_syntax; pub mod extdeps_languages_dag_types; +pub mod extdeps_languages_go_emit; pub mod extdeps_languages_go_syntax; pub mod extdeps_languages_go_types; +pub mod extdeps_languages_python_emit; pub mod extdeps_languages_python_syntax; pub mod extdeps_languages_python_types; +pub mod extdeps_languages_rust_emit; pub mod extdeps_languages_rust_syntax; pub mod extdeps_languages_rust_types; +pub mod rest_transport_facts; +pub mod std_algebra; +pub mod std_coercion; pub mod std_computation; pub mod std_effects; +pub mod std_error_primitives; pub mod std_graph; +pub mod std_http_path; pub mod std_induction; -pub mod v2_compiler_effect_derivation; +pub mod std_iteration; pub mod std_node; -pub mod v2_std_core; +pub mod std_syntax; +pub mod std_termination; +pub mod std_types; pub mod v2_compiler_artifact; -pub mod v2_compiler_infer_env; -pub mod v2_compiler_infer_types; -pub mod v2_compiler_resolve; -pub mod v2_compiler_tokenize; -pub mod v2_compiler_trace; pub mod v2_compiler_coercion; +pub mod v2_compiler_compile; +pub mod v2_compiler_compiler_tests_rust; +pub mod v2_compiler_complexity; +pub mod v2_compiler_effect_derivation; +pub mod v2_compiler_emit; +pub mod v2_compiler_emit_go; +pub mod v2_compiler_emit_python; +pub mod v2_compiler_emit_rust; +pub mod v2_compiler_infer; pub mod v2_compiler_infer_access; pub mod v2_compiler_infer_cycle; pub mod v2_compiler_infer_emit_info; +pub mod v2_compiler_infer_env; +pub mod v2_compiler_infer_items; +pub mod v2_compiler_infer_lookup; pub mod v2_compiler_infer_method; pub mod v2_compiler_infer_patterns; pub mod v2_compiler_infer_resolve; +pub mod v2_compiler_infer_service; pub mod v2_compiler_infer_sigs; +pub mod v2_compiler_infer_types; pub mod v2_compiler_languages; pub mod v2_compiler_normalize; -pub mod v2_compiler_compiler_tests_rust; -pub mod v2_compiler_infer_items; -pub mod v2_compiler_parse; -pub mod v2_compiler_infer_service; -pub mod v2_compiler_infer_lookup; -pub mod v2_compiler_infer; -pub mod v2_compiler_emit; -pub mod v2_compiler_complexity; -pub mod v2_compiler_emit_go; -pub mod v2_compiler_emit_python; pub mod v2_compiler_ownership; -pub mod v2_compiler_emit_rust; -pub mod v2_compiler_compile; -pub mod v2_rt; +pub mod v2_compiler_parse; +pub mod v2_compiler_resolve; +pub mod v2_compiler_runtime_rust; +pub mod v2_compiler_tokenize; +pub mod v2_compiler_trace; pub mod v2_interpreter; -pub mod cli_run; -pub mod rest_transport_facts; +pub mod v2_rt; +pub mod v2_std_core; #[derive(Debug, Clone, PartialEq)] pub struct NonEmptyVec(Vec); diff --git a/src/v2/stage0/src/main.rs b/src/v2/stage0/src/main.rs index ec899eedd43..229429e5f0d 100644 --- a/src/v2/stage0/src/main.rs +++ b/src/v2/stage0/src/main.rs @@ -6,15 +6,14 @@ use clap::{Parser, Subcommand}; use std::collections::HashMap; use std::rc::Rc; +use v2_compiler::cli_run; +use v2_compiler::v2_compiler_artifact; use v2_compiler::v2_compiler_compile; use v2_compiler::v2_compiler_compile::PipelineResult; -use v2_compiler::v2_compiler_artifact; use v2_compiler::v2_std_core::{ - diagnostic_to_message, diagnostic_to_span, - byte_to_line_col, source_line_at, NewlineIndex, - CompilerDiagnostic, + byte_to_line_col, diagnostic_to_message, diagnostic_to_span, source_line_at, + CompilerDiagnostic, NewlineIndex, }; -use v2_compiler::cli_run; #[derive(Parser)] #[command(name = "v2-compiled", about = "Generated CLI from DAG compiler")] @@ -43,7 +42,7 @@ enum Commands { #[arg(long, default_value = "rust")] target: String, }, -/// Execute a .dag program directly (interpreter) + /// Execute a .dag program directly (interpreter) Run { /// Source root directories (searched recursively for .dag files) #[arg(long = "source-root")] @@ -118,8 +117,10 @@ fn build_module_index(source_roots: &[String]) -> HashMap { + let _result = match cli.command { + Commands::Compile { + source_roots, + source_dir, + output_dir, + target, + } => { let render_target = match target.as_str() { "rust" => v2_compiler_artifact::RenderTarget::Rust, "python" => v2_compiler_artifact::RenderTarget::Python, "go" => v2_compiler_artifact::RenderTarget::Go, "dag" => v2_compiler_artifact::RenderTarget::Dag, other => { - eprintln!("unknown target: {}. supported: rust, python, go, dag", other); + eprintln!( + "unknown target: {}. supported: rust, python, go, dag", + other + ); std::process::exit(1); } }; @@ -183,7 +195,11 @@ let _result = match cli.command { let sources = if !source_roots.is_empty() { // FF-9: Import-driven resolution from source roots let index = build_module_index(&source_roots); - eprintln!("indexed {} modules from {} source roots", index.len(), source_roots.len()); + eprintln!( + "indexed {} modules from {} source roots", + index.len(), + source_roots.len() + ); // Entry modules: all .dag files in the FIRST source root. // Additional roots are dependency pools resolved via imports. @@ -221,9 +237,11 @@ let _result = match cli.command { resolved.push(Rc::new(v2_compiler_compile::SourceFile { path, content })); } } - eprintln!("resolved {} sources (transitive import closure)", resolved.len()); + eprintln!( + "resolved {} sources (transitive import closure)", + resolved.len() + ); resolved - } else if let Some(dir) = source_dir { // Legacy: flat directory scan (backward compatibility) let mut dag_paths = Vec::new(); @@ -238,9 +256,13 @@ let _result = match cli.command { content, })); } - eprintln!("compiling {} .dag files from {} (target: {})", sources.len(), dir, target); + eprintln!( + "compiling {} .dag files from {} (target: {})", + sources.len(), + dir, + target + ); sources - } else { eprintln!("error: provide --source-root or --source-dir"); std::process::exit(1); @@ -258,12 +280,18 @@ let _result = match cli.command { std::fs::write(&out_path, &*file.content) .unwrap_or_else(|e| panic!("failed to write {}: {}", file.path, e)); } - eprintln!("compiled: {} files emitted, {} diagnostics", - result.files.len(), result.diagnostics.len()); + eprintln!( + "compiled: {} files emitted, {} diagnostics", + result.files.len(), + result.diagnostics.len() + ); render_diagnostics(&result); // Complexity violations are non-blocking (analyzer limitations). let hard_errors = result.diagnostics.iter().any(|d| { - !matches!(*d.diagnostic.clone(), CompilerDiagnostic::ComplexityUnknown { .. }) + !matches!( + *d.diagnostic.clone(), + CompilerDiagnostic::ComplexityUnknown { .. } + ) }); if hard_errors { std::process::exit(1); @@ -272,11 +300,14 @@ let _result = match cli.command { eprintln!("error: no files emitted"); std::process::exit(1); } - }, + } - Commands::Run { source_roots, function } => { + Commands::Run { + source_roots, + function, + } => { cli_run::handle_run(source_roots, function); - }, + } }; } @@ -342,7 +373,10 @@ fn render_one_diagnostic( indent, " ".repeat(gutter_width), " ".repeat(col_offset), - "^".repeat(std::cmp::min(span_len, line_text.len().saturating_sub(col_offset))) + "^".repeat(std::cmp::min( + span_len, + line_text.len().saturating_sub(col_offset) + )) ); } } diff --git a/src/v2/stage0/src/std_algebra.rs b/src/v2/stage0/src/std_algebra.rs index b22a860893a..2b686c1e1aa 100644 --- a/src/v2/stage0/src/std_algebra.rs +++ b/src/v2/stage0/src/std_algebra.rs @@ -1,20 +1,20 @@ // Generated by v2 compiler -- do not edit. // Source module: std.algebra -use std::collections::HashMap; -use std::rc::Rc; -use crate::v2_rt; -use crate::NonEmptyVec; -use crate::NonEmptyBTreeSet; -pub use crate::std_error_primitives::{DivError, Result}; -use crate::std_error_primitives::DivError::*; -use crate::std_error_primitives::Result::*; -use self::Ordering::*; use self::AlgebraProfile::*; -use self::ContainerSource::*; use self::AlgebraTypeTemplate::*; use self::CollectionSizeEffect::*; +use self::ContainerSource::*; use self::CostShape::*; +use self::Ordering::*; +use crate::std_error_primitives::DivError::*; +use crate::std_error_primitives::Result::*; +pub use crate::std_error_primitives::{DivError, Result}; +use crate::v2_rt; +use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; #[derive(Clone)] pub struct Magma { @@ -183,9 +183,7 @@ pub enum AlgebraProfile { #[serde(tag = "_variant")] pub enum ContainerSource { SameAsReceiver, - Named { - name: String, - }, + Named { name: String }, } impl ContainerSource { pub fn name(&self) -> String { @@ -271,852 +269,1107 @@ pub fn kernel_algebra_profile() -> Rc> { } pub fn ordered_ring_templates() -> Rc>> { - Rc::new(vec![Rc::new(AlgebraFieldTemplate { - name: "add".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "zero".to_string(), - param_types: Rc::new(vec![]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "negate".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "mul".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "one".to_string(), - param_types: Rc::new(vec![]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "compare".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Ordering".to_string(), -}), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "clamp".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: Some(CostShape::ShapeConstant), - callback_element_position: None, -})]) + Rc::new(vec![ + Rc::new(AlgebraFieldTemplate { + name: "add".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + ]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "zero".to_string(), + param_types: Rc::new(vec![]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "negate".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "mul".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + ]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "one".to_string(), + param_types: Rc::new(vec![]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "compare".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + ]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Ordering".to_string(), + }), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "clamp".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + ]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: Some(CostShape::ShapeConstant), + callback_element_position: None, + }), + ]) } pub fn approximate_field_templates() -> Rc>> { - Rc::new(vec![Rc::new(AlgebraFieldTemplate { - name: "add".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "zero".to_string(), - param_types: Rc::new(vec![]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "negate".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "mul".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "one".to_string(), - param_types: Rc::new(vec![]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "reciprocal".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "compare".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Ordering".to_string(), -}), - size_effect: None, - cost_shape: None, - callback_element_position: None, -})]) + Rc::new(vec![ + Rc::new(AlgebraFieldTemplate { + name: "add".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + ]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "zero".to_string(), + param_types: Rc::new(vec![]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "negate".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "mul".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + ]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "one".to_string(), + param_types: Rc::new(vec![]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "reciprocal".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "compare".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + ]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Ordering".to_string(), + }), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + ]) } pub fn boolean_algebra_templates() -> Rc>> { - Rc::new(vec![Rc::new(AlgebraFieldTemplate { - name: "meet".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "join".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "complement".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "top".to_string(), - param_types: Rc::new(vec![]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "bottom".to_string(), - param_types: Rc::new(vec![]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, -})]) + Rc::new(vec![ + Rc::new(AlgebraFieldTemplate { + name: "meet".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + ]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "join".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + ]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "complement".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "top".to_string(), + param_types: Rc::new(vec![]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "bottom".to_string(), + param_types: Rc::new(vec![]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + ]) } pub fn boolean_algebra_collection_templates() -> Rc>> { - Rc::new(vec![Rc::new(AlgebraFieldTemplate { - name: "union".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "intersect".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "diff".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "member".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverElement)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), -}), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "contains".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverElement)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), -}), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "filter".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::CallableOf { - params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), -}), -})]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: Some(CollectionSizeEffect::IdentityEffect), - cost_shape: Some(CostShape::ShapeIterateBody), - callback_element_position: Some(0), -}), Rc::new(AlgebraFieldTemplate { - name: "map".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::CallableOf { - params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), - return_type: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { - id: "MappedElement".to_string(), -}), -})]), - return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { - source: Rc::new(ContainerSource::SameAsReceiver), - element: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { - id: "MappedElement".to_string(), -}), -}), - size_effect: None, - cost_shape: Some(CostShape::ShapeIterateBody), - callback_element_position: Some(0), -}), Rc::new(AlgebraFieldTemplate { - name: "flat_map".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::CallableOf { - params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), - return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { - source: Rc::new(ContainerSource::SameAsReceiver), - element: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { - id: "MappedElement".to_string(), -}), -}), -})]), - return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { - source: Rc::new(ContainerSource::SameAsReceiver), - element: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { - id: "MappedElement".to_string(), -}), -}), - size_effect: None, - cost_shape: Some(CostShape::ShapeIterateBody), - callback_element_position: Some(0), -}), Rc::new(AlgebraFieldTemplate { - name: "fold".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { - id: "FoldAccumulator".to_string(), -}), Rc::new(AlgebraTypeTemplate::CallableOf { - params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { - id: "FoldAccumulator".to_string(), -}), Rc::new(AlgebraTypeTemplate::ReceiverElement)]), - return_type: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { - id: "FoldAccumulator".to_string(), -}), -})]), - return_type: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { - id: "FoldAccumulator".to_string(), -}), - size_effect: None, - cost_shape: Some(CostShape::ShapeIterateBody), - callback_element_position: Some(1), -}), Rc::new(AlgebraFieldTemplate { - name: "any".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::CallableOf { - params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), -}), -})]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), -}), - size_effect: None, - cost_shape: Some(CostShape::ShapeIterateBody), - callback_element_position: Some(0), -}), Rc::new(AlgebraFieldTemplate { - name: "all".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::CallableOf { - params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), -}), -})]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), -}), - size_effect: None, - cost_shape: Some(CostShape::ShapeIterateBody), - callback_element_position: Some(0), -}), Rc::new(AlgebraFieldTemplate { - name: "count".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Int".to_string(), -}), - size_effect: None, - cost_shape: Some(CostShape::ShapeLinearScan), - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "length".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Int".to_string(), -}), - size_effect: None, - cost_shape: Some(CostShape::ShapeLinearScan), - callback_element_position: None, -})]) + Rc::new(vec![ + Rc::new(AlgebraFieldTemplate { + name: "union".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + ]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "intersect".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + ]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "diff".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + ]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "member".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::ReceiverElement), + ]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), + }), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "contains".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::ReceiverElement), + ]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), + }), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "filter".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::CallableOf { + params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), + }), + }), + ]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: Some(CollectionSizeEffect::IdentityEffect), + cost_shape: Some(CostShape::ShapeIterateBody), + callback_element_position: Some(0), + }), + Rc::new(AlgebraFieldTemplate { + name: "map".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::CallableOf { + params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), + return_type: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { + id: "MappedElement".to_string(), + }), + }), + ]), + return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { + source: Rc::new(ContainerSource::SameAsReceiver), + element: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { + id: "MappedElement".to_string(), + }), + }), + size_effect: None, + cost_shape: Some(CostShape::ShapeIterateBody), + callback_element_position: Some(0), + }), + Rc::new(AlgebraFieldTemplate { + name: "flat_map".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::CallableOf { + params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), + return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { + source: Rc::new(ContainerSource::SameAsReceiver), + element: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { + id: "MappedElement".to_string(), + }), + }), + }), + ]), + return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { + source: Rc::new(ContainerSource::SameAsReceiver), + element: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { + id: "MappedElement".to_string(), + }), + }), + size_effect: None, + cost_shape: Some(CostShape::ShapeIterateBody), + callback_element_position: Some(0), + }), + Rc::new(AlgebraFieldTemplate { + name: "fold".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { + id: "FoldAccumulator".to_string(), + }), + Rc::new(AlgebraTypeTemplate::CallableOf { + params: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { + id: "FoldAccumulator".to_string(), + }), + Rc::new(AlgebraTypeTemplate::ReceiverElement), + ]), + return_type: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { + id: "FoldAccumulator".to_string(), + }), + }), + ]), + return_type: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { + id: "FoldAccumulator".to_string(), + }), + size_effect: None, + cost_shape: Some(CostShape::ShapeIterateBody), + callback_element_position: Some(1), + }), + Rc::new(AlgebraFieldTemplate { + name: "any".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::CallableOf { + params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), + }), + }), + ]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), + }), + size_effect: None, + cost_shape: Some(CostShape::ShapeIterateBody), + callback_element_position: Some(0), + }), + Rc::new(AlgebraFieldTemplate { + name: "all".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::CallableOf { + params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), + }), + }), + ]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), + }), + size_effect: None, + cost_shape: Some(CostShape::ShapeIterateBody), + callback_element_position: Some(0), + }), + Rc::new(AlgebraFieldTemplate { + name: "count".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Int".to_string(), + }), + size_effect: None, + cost_shape: Some(CostShape::ShapeLinearScan), + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "length".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Int".to_string(), + }), + size_effect: None, + cost_shape: Some(CostShape::ShapeLinearScan), + callback_element_position: None, + }), + ]) } pub fn free_monoid_scalar_templates() -> Rc>> { - Rc::new(vec![Rc::new(AlgebraFieldTemplate { - name: "concat".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "empty".to_string(), - param_types: Rc::new(vec![]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "length".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Int".to_string(), -}), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "chars".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { - source: Rc::new(ContainerSource::Named { - name: "List".to_string(), -}), - element: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Int".to_string(), -}), -}), - size_effect: None, - cost_shape: Some(CostShape::ShapeLinearScan), - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "split".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { - source: Rc::new(ContainerSource::Named { - name: "List".to_string(), -}), - element: Rc::new(AlgebraTypeTemplate::ReceiverSelf), -}), - size_effect: None, - cost_shape: Some(CostShape::ShapeLinearScan), - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "join".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ContainerOf { - source: Rc::new(ContainerSource::Named { - name: "List".to_string(), -}), - element: Rc::new(AlgebraTypeTemplate::ReceiverSelf), -}), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "contains".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), -}), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "starts_with".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), -}), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "ends_with".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), -}), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "trim".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "to_lower".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "to_upper".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "replace".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "substring".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Int".to_string(), -}), Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Int".to_string(), -})]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "to_int".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Int".to_string(), -}), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "to_string".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "reverse".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, -})]) + Rc::new(vec![ + Rc::new(AlgebraFieldTemplate { + name: "concat".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + ]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "empty".to_string(), + param_types: Rc::new(vec![]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "length".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Int".to_string(), + }), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "chars".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { + source: Rc::new(ContainerSource::Named { + name: "List".to_string(), + }), + element: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Int".to_string(), + }), + }), + size_effect: None, + cost_shape: Some(CostShape::ShapeLinearScan), + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "split".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + ]), + return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { + source: Rc::new(ContainerSource::Named { + name: "List".to_string(), + }), + element: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + }), + size_effect: None, + cost_shape: Some(CostShape::ShapeLinearScan), + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "join".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ContainerOf { + source: Rc::new(ContainerSource::Named { + name: "List".to_string(), + }), + element: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + }), + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + ]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "contains".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + ]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), + }), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "starts_with".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + ]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), + }), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "ends_with".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + ]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), + }), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "trim".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "to_lower".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "to_upper".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "replace".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + ]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "substring".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Int".to_string(), + }), + Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Int".to_string(), + }), + ]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "to_int".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Int".to_string(), + }), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "to_string".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "reverse".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + ]) } pub fn free_monoid_collection_templates() -> Rc>> { - Rc::new(vec![Rc::new(AlgebraFieldTemplate { - name: "map".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::CallableOf { - params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), - return_type: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { - id: "MappedElement".to_string(), -}), -})]), - return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { - source: Rc::new(ContainerSource::SameAsReceiver), - element: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { - id: "MappedElement".to_string(), -}), -}), - size_effect: None, - cost_shape: Some(CostShape::ShapeIterateBody), - callback_element_position: Some(0), -}), Rc::new(AlgebraFieldTemplate { - name: "filter".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::CallableOf { - params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), -}), -})]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: Some(CollectionSizeEffect::IdentityEffect), - cost_shape: Some(CostShape::ShapeIterateBody), - callback_element_position: Some(0), -}), Rc::new(AlgebraFieldTemplate { - name: "flat_map".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::CallableOf { - params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), - return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { - source: Rc::new(ContainerSource::SameAsReceiver), - element: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { - id: "MappedElement".to_string(), -}), -}), -})]), - return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { - source: Rc::new(ContainerSource::SameAsReceiver), - element: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { - id: "MappedElement".to_string(), -}), -}), - size_effect: None, - cost_shape: Some(CostShape::ShapeIterateBody), - callback_element_position: Some(0), -}), Rc::new(AlgebraFieldTemplate { - name: "fold".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { - id: "FoldAccumulator".to_string(), -}), Rc::new(AlgebraTypeTemplate::CallableOf { - params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { - id: "FoldAccumulator".to_string(), -}), Rc::new(AlgebraTypeTemplate::ReceiverElement)]), - return_type: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { - id: "FoldAccumulator".to_string(), -}), -})]), - return_type: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { - id: "FoldAccumulator".to_string(), -}), - size_effect: None, - cost_shape: Some(CostShape::ShapeIterateBody), - callback_element_position: Some(1), -}), Rc::new(AlgebraFieldTemplate { - name: "any".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::CallableOf { - params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), -}), -})]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), -}), - size_effect: None, - cost_shape: Some(CostShape::ShapeIterateBody), - callback_element_position: Some(0), -}), Rc::new(AlgebraFieldTemplate { - name: "all".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::CallableOf { - params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), -}), -})]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), -}), - size_effect: None, - cost_shape: Some(CostShape::ShapeIterateBody), - callback_element_position: Some(0), -}), Rc::new(AlgebraFieldTemplate { - name: "count".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Int".to_string(), -}), - size_effect: None, - cost_shape: Some(CostShape::ShapeLinearScan), - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "first".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::OptionalOf { - inner: Rc::new(AlgebraTypeTemplate::ReceiverElement), -}), - size_effect: Some(CollectionSizeEffect::ProjectionEffect), - cost_shape: Some(CostShape::ShapeLinearScan), - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "last".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::OptionalOf { - inner: Rc::new(AlgebraTypeTemplate::ReceiverElement), -}), - size_effect: Some(CollectionSizeEffect::ProjectionEffect), - cost_shape: Some(CostShape::ShapeLinearScan), - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "skip".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Int".to_string(), -})]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: Some(CollectionSizeEffect::ShrinkEffect), - cost_shape: Some(CostShape::ShapeIterateBody), - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "take".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Int".to_string(), -})]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: Some(CostShape::ShapeIterateBody), - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "sort_by".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: Some(CollectionSizeEffect::IdentityEffect), - cost_shape: Some(CostShape::ShapeSortBody), - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "append".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverElement)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: Some(CostShape::ShapeConstant), - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "contains".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverElement)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), -}), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "enumerate".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { - source: Rc::new(ContainerSource::SameAsReceiver), - element: Rc::new(AlgebraTypeTemplate::TupleOf { - first: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Int".to_string(), -}), - second: Rc::new(AlgebraTypeTemplate::ReceiverElement), -}), -}), - size_effect: Some(CollectionSizeEffect::IdentityEffect), - cost_shape: Some(CostShape::ShapeIterateBody), - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "reverse".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: Some(CollectionSizeEffect::IdentityEffect), - cost_shape: Some(CostShape::ShapeLinearScan), - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "join".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "String".to_string(), -})]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "String".to_string(), -}), - size_effect: None, - cost_shape: Some(CostShape::ShapeLinearScan), - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "concat".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: Some(CostShape::ShapeLinearScan), - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "list_push".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverElement)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "length".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Int".to_string(), -}), - size_effect: None, - cost_shape: Some(CostShape::ShapeLinearScan), - callback_element_position: None, -})]) + Rc::new(vec![ + Rc::new(AlgebraFieldTemplate { + name: "map".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::CallableOf { + params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), + return_type: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { + id: "MappedElement".to_string(), + }), + }), + ]), + return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { + source: Rc::new(ContainerSource::SameAsReceiver), + element: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { + id: "MappedElement".to_string(), + }), + }), + size_effect: None, + cost_shape: Some(CostShape::ShapeIterateBody), + callback_element_position: Some(0), + }), + Rc::new(AlgebraFieldTemplate { + name: "filter".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::CallableOf { + params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), + }), + }), + ]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: Some(CollectionSizeEffect::IdentityEffect), + cost_shape: Some(CostShape::ShapeIterateBody), + callback_element_position: Some(0), + }), + Rc::new(AlgebraFieldTemplate { + name: "flat_map".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::CallableOf { + params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), + return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { + source: Rc::new(ContainerSource::SameAsReceiver), + element: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { + id: "MappedElement".to_string(), + }), + }), + }), + ]), + return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { + source: Rc::new(ContainerSource::SameAsReceiver), + element: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { + id: "MappedElement".to_string(), + }), + }), + size_effect: None, + cost_shape: Some(CostShape::ShapeIterateBody), + callback_element_position: Some(0), + }), + Rc::new(AlgebraFieldTemplate { + name: "fold".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { + id: "FoldAccumulator".to_string(), + }), + Rc::new(AlgebraTypeTemplate::CallableOf { + params: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { + id: "FoldAccumulator".to_string(), + }), + Rc::new(AlgebraTypeTemplate::ReceiverElement), + ]), + return_type: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { + id: "FoldAccumulator".to_string(), + }), + }), + ]), + return_type: Rc::new(AlgebraTypeTemplate::AlgebraTypeVariable { + id: "FoldAccumulator".to_string(), + }), + size_effect: None, + cost_shape: Some(CostShape::ShapeIterateBody), + callback_element_position: Some(1), + }), + Rc::new(AlgebraFieldTemplate { + name: "any".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::CallableOf { + params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), + }), + }), + ]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), + }), + size_effect: None, + cost_shape: Some(CostShape::ShapeIterateBody), + callback_element_position: Some(0), + }), + Rc::new(AlgebraFieldTemplate { + name: "all".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::CallableOf { + params: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverElement)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), + }), + }), + ]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), + }), + size_effect: None, + cost_shape: Some(CostShape::ShapeIterateBody), + callback_element_position: Some(0), + }), + Rc::new(AlgebraFieldTemplate { + name: "count".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Int".to_string(), + }), + size_effect: None, + cost_shape: Some(CostShape::ShapeLinearScan), + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "first".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::OptionalOf { + inner: Rc::new(AlgebraTypeTemplate::ReceiverElement), + }), + size_effect: Some(CollectionSizeEffect::ProjectionEffect), + cost_shape: Some(CostShape::ShapeLinearScan), + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "last".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::OptionalOf { + inner: Rc::new(AlgebraTypeTemplate::ReceiverElement), + }), + size_effect: Some(CollectionSizeEffect::ProjectionEffect), + cost_shape: Some(CostShape::ShapeLinearScan), + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "skip".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Int".to_string(), + }), + ]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: Some(CollectionSizeEffect::ShrinkEffect), + cost_shape: Some(CostShape::ShapeIterateBody), + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "take".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Int".to_string(), + }), + ]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: Some(CostShape::ShapeIterateBody), + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "sort_by".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: Some(CollectionSizeEffect::IdentityEffect), + cost_shape: Some(CostShape::ShapeSortBody), + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "append".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::ReceiverElement), + ]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: Some(CostShape::ShapeConstant), + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "contains".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::ReceiverElement), + ]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), + }), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "enumerate".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { + source: Rc::new(ContainerSource::SameAsReceiver), + element: Rc::new(AlgebraTypeTemplate::TupleOf { + first: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Int".to_string(), + }), + second: Rc::new(AlgebraTypeTemplate::ReceiverElement), + }), + }), + size_effect: Some(CollectionSizeEffect::IdentityEffect), + cost_shape: Some(CostShape::ShapeIterateBody), + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "reverse".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: Some(CollectionSizeEffect::IdentityEffect), + cost_shape: Some(CostShape::ShapeLinearScan), + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "join".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "String".to_string(), + }), + ]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "String".to_string(), + }), + size_effect: None, + cost_shape: Some(CostShape::ShapeLinearScan), + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "concat".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + ]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: Some(CostShape::ShapeLinearScan), + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "list_push".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::ReceiverElement), + ]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "length".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Int".to_string(), + }), + size_effect: None, + cost_shape: Some(CostShape::ShapeLinearScan), + callback_element_position: None, + }), + ]) } pub fn partial_function_templates() -> Rc>> { - Rc::new(vec![Rc::new(AlgebraFieldTemplate { - name: "get".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverKey)]), - return_type: Rc::new(AlgebraTypeTemplate::OptionalOf { - inner: Rc::new(AlgebraTypeTemplate::ReceiverValue), -}), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "map_get".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverKey)]), - return_type: Rc::new(AlgebraTypeTemplate::OptionalOf { - inner: Rc::new(AlgebraTypeTemplate::ReceiverValue), -}), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "lookup".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverKey)]), - return_type: Rc::new(AlgebraTypeTemplate::OptionalOf { - inner: Rc::new(AlgebraTypeTemplate::ReceiverValue), -}), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "map_insert".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverKey), Rc::new(AlgebraTypeTemplate::ReceiverValue)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "map_merge".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "has".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverKey)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), -}), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "map_has".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverKey)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), -}), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "map_contains_key".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverKey)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), -}), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "keys".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { - source: Rc::new(ContainerSource::Named { - name: "List".to_string(), -}), - element: Rc::new(AlgebraTypeTemplate::ReceiverKey), -}), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "map_keys".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { - source: Rc::new(ContainerSource::Named { - name: "List".to_string(), -}), - element: Rc::new(AlgebraTypeTemplate::ReceiverKey), -}), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "values".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { - source: Rc::new(ContainerSource::Named { - name: "List".to_string(), -}), - element: Rc::new(AlgebraTypeTemplate::ReceiverValue), -}), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "map_values".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { - source: Rc::new(ContainerSource::Named { - name: "List".to_string(), -}), - element: Rc::new(AlgebraTypeTemplate::ReceiverValue), -}), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "with".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverKey), Rc::new(AlgebraTypeTemplate::ReceiverValue)]), - return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "contains".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf), Rc::new(AlgebraTypeTemplate::ReceiverKey)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Bool".to_string(), -}), - size_effect: None, - cost_shape: None, - callback_element_position: None, -}), Rc::new(AlgebraFieldTemplate { - name: "length".to_string(), - param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), - return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { - name: "Int".to_string(), -}), - size_effect: None, - cost_shape: None, - callback_element_position: None, -})]) + Rc::new(vec![ + Rc::new(AlgebraFieldTemplate { + name: "get".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::ReceiverKey), + ]), + return_type: Rc::new(AlgebraTypeTemplate::OptionalOf { + inner: Rc::new(AlgebraTypeTemplate::ReceiverValue), + }), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "map_get".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::ReceiverKey), + ]), + return_type: Rc::new(AlgebraTypeTemplate::OptionalOf { + inner: Rc::new(AlgebraTypeTemplate::ReceiverValue), + }), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "lookup".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::ReceiverKey), + ]), + return_type: Rc::new(AlgebraTypeTemplate::OptionalOf { + inner: Rc::new(AlgebraTypeTemplate::ReceiverValue), + }), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "map_insert".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::ReceiverKey), + Rc::new(AlgebraTypeTemplate::ReceiverValue), + ]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "map_merge".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + ]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "has".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::ReceiverKey), + ]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), + }), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "map_has".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::ReceiverKey), + ]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), + }), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "map_contains_key".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::ReceiverKey), + ]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), + }), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "keys".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { + source: Rc::new(ContainerSource::Named { + name: "List".to_string(), + }), + element: Rc::new(AlgebraTypeTemplate::ReceiverKey), + }), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "map_keys".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { + source: Rc::new(ContainerSource::Named { + name: "List".to_string(), + }), + element: Rc::new(AlgebraTypeTemplate::ReceiverKey), + }), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "values".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { + source: Rc::new(ContainerSource::Named { + name: "List".to_string(), + }), + element: Rc::new(AlgebraTypeTemplate::ReceiverValue), + }), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "map_values".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::ContainerOf { + source: Rc::new(ContainerSource::Named { + name: "List".to_string(), + }), + element: Rc::new(AlgebraTypeTemplate::ReceiverValue), + }), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "with".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::ReceiverKey), + Rc::new(AlgebraTypeTemplate::ReceiverValue), + ]), + return_type: Rc::new(AlgebraTypeTemplate::ReceiverSelf), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "contains".to_string(), + param_types: Rc::new(vec![ + Rc::new(AlgebraTypeTemplate::ReceiverSelf), + Rc::new(AlgebraTypeTemplate::ReceiverKey), + ]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Bool".to_string(), + }), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + Rc::new(AlgebraFieldTemplate { + name: "length".to_string(), + param_types: Rc::new(vec![Rc::new(AlgebraTypeTemplate::ReceiverSelf)]), + return_type: Rc::new(AlgebraTypeTemplate::NamedTemplate { + name: "Int".to_string(), + }), + size_effect: None, + cost_shape: None, + callback_element_position: None, + }), + ]) } pub fn algebra_templates_for_profile(profile: AlgebraProfile) -> Rc>> { match profile { - AlgebraProfile::OrderedRingProfile => ordered_ring_templates(), - AlgebraProfile::ApproximateFieldProfile => approximate_field_templates(), - AlgebraProfile::BooleanAlgebraProfile => boolean_algebra_templates(), - AlgebraProfile::BooleanAlgebraCollectionProfile => boolean_algebra_collection_templates(), - AlgebraProfile::FreeMonoidScalarProfile => free_monoid_scalar_templates(), - AlgebraProfile::FreeMonoidCollectionProfile => free_monoid_collection_templates(), - AlgebraProfile::PartialFunctionProfile => partial_function_templates(), -} + AlgebraProfile::OrderedRingProfile => ordered_ring_templates(), + AlgebraProfile::ApproximateFieldProfile => approximate_field_templates(), + AlgebraProfile::BooleanAlgebraProfile => boolean_algebra_templates(), + AlgebraProfile::BooleanAlgebraCollectionProfile => boolean_algebra_collection_templates(), + AlgebraProfile::FreeMonoidScalarProfile => free_monoid_scalar_templates(), + AlgebraProfile::FreeMonoidCollectionProfile => free_monoid_collection_templates(), + AlgebraProfile::PartialFunctionProfile => partial_function_templates(), + } } pub fn algebra_type_param_names(profile: AlgebraProfile) -> Rc> { match profile { - AlgebraProfile::OrderedRingProfile => Rc::new(vec![]), - AlgebraProfile::ApproximateFieldProfile => Rc::new(vec![]), - AlgebraProfile::BooleanAlgebraProfile => Rc::new(vec![]), - AlgebraProfile::BooleanAlgebraCollectionProfile => Rc::new(vec!["T".to_string()]), - AlgebraProfile::FreeMonoidScalarProfile => Rc::new(vec![]), - AlgebraProfile::FreeMonoidCollectionProfile => Rc::new(vec!["T".to_string()]), - AlgebraProfile::PartialFunctionProfile => Rc::new(vec!["K".to_string(), "V".to_string()]), -} + AlgebraProfile::OrderedRingProfile => Rc::new(vec![]), + AlgebraProfile::ApproximateFieldProfile => Rc::new(vec![]), + AlgebraProfile::BooleanAlgebraProfile => Rc::new(vec![]), + AlgebraProfile::BooleanAlgebraCollectionProfile => Rc::new(vec!["T".to_string()]), + AlgebraProfile::FreeMonoidScalarProfile => Rc::new(vec![]), + AlgebraProfile::FreeMonoidCollectionProfile => Rc::new(vec!["T".to_string()]), + AlgebraProfile::PartialFunctionProfile => Rc::new(vec!["K".to_string(), "V".to_string()]), + } } diff --git a/src/v2/stage0/src/std_coercion.rs b/src/v2/stage0/src/std_coercion.rs index 37e8e60fe56..84ed2736a2a 100644 --- a/src/v2/stage0/src/std_coercion.rs +++ b/src/v2/stage0/src/std_coercion.rs @@ -1,11 +1,11 @@ // Generated by v2 compiler -- do not edit. // Source module: std.coercion -use std::collections::HashMap; -use std::rc::Rc; use crate::v2_rt; -use crate::NonEmptyVec; use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] pub struct TypeCheckpoint { @@ -57,9 +57,31 @@ pub fn dag_cast_rules() -> Rc>> { } pub fn dag_can_cast(source_type: String, target_type: String) -> bool { - { let mut __found = false; for r in dag_cast_rules().iter().cloned() { if ((r.from_type.clone().as_str() == source_type.clone().as_str()) && (r.to_type.clone().as_str() == target_type.clone().as_str())) { __found = true; break; } } __found } + { + let mut __found = false; + for r in dag_cast_rules().iter().cloned() { + if ((r.from_type.clone().as_str() == source_type.clone().as_str()) + && (r.to_type.clone().as_str() == target_type.clone().as_str())) + { + __found = true; + break; + } + } + __found + } } pub fn is_dag_cast_domain_type(name: String) -> bool { - { let mut __found = false; for r in dag_cast_rules().iter().cloned() { if ((r.from_type.clone().as_str() == name.clone().as_str()) || (r.to_type.clone().as_str() == name.clone().as_str())) { __found = true; break; } } __found } + { + let mut __found = false; + for r in dag_cast_rules().iter().cloned() { + if ((r.from_type.clone().as_str() == name.clone().as_str()) + || (r.to_type.clone().as_str() == name.clone().as_str())) + { + __found = true; + break; + } + } + __found + } } diff --git a/src/v2/stage0/src/std_computation.rs b/src/v2/stage0/src/std_computation.rs index 2d0cc8bfc46..8d80b44bedd 100644 --- a/src/v2/stage0/src/std_computation.rs +++ b/src/v2/stage0/src/std_computation.rs @@ -1,61 +1,53 @@ // Generated by v2 compiler -- do not edit. // Source module: std.computation -use std::collections::HashMap; -use std::rc::Rc; -use crate::v2_rt; -use crate::NonEmptyVec; -use crate::NonEmptyBTreeSet; -pub use crate::std_termination::{DescentEvidence, RankingDimension, PositiveDescentAmount, ProportionalDivisor}; -use crate::std_termination::DescentEvidence::{DescentUnknown}; -use crate::std_termination::PositiveDescentAmount::{OneStep, AdditionalStep}; -use crate::std_termination::ProportionalDivisor::{DivideByTwo, StrictlyLarger}; -use crate::std_termination::RankingDimension::*; -pub use crate::std_algebra::{AlgebraProfile, kernel_algebra_profile}; -use crate::std_algebra::AlgebraProfile::{OrderedRingProfile, ApproximateFieldProfile, BooleanAlgebraProfile, BooleanAlgebraCollectionProfile, FreeMonoidScalarProfile, FreeMonoidCollectionProfile, PartialFunctionProfile}; -use self::SizeBound::*; use self::CallPattern::*; -use self::ShrinkFactor::*; -use self::IterationPrimitive::*; use self::IterationDimension::*; +use self::IterationPrimitive::*; +use self::ShrinkFactor::*; +use self::SizeBound::*; +use crate::std_algebra::AlgebraProfile::{ + ApproximateFieldProfile, BooleanAlgebraCollectionProfile, BooleanAlgebraProfile, + FreeMonoidCollectionProfile, FreeMonoidScalarProfile, OrderedRingProfile, + PartialFunctionProfile, +}; +pub use crate::std_algebra::{kernel_algebra_profile, AlgebraProfile}; +use crate::std_termination::DescentEvidence::DescentUnknown; +use crate::std_termination::PositiveDescentAmount::{AdditionalStep, OneStep}; +use crate::std_termination::ProportionalDivisor::{DivideByTwo, StrictlyLarger}; +use crate::std_termination::RankingDimension::*; +pub use crate::std_termination::{ + DescentEvidence, PositiveDescentAmount, ProportionalDivisor, RankingDimension, +}; +use crate::v2_rt; +use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum SizeBound { - CollectionSize { - param: String, - }, - ParserStreamSize { - witness: String, - }, - WorklistDrainSize { - element: String, - }, - TreeSize { - param: String, - }, - ArithmeticParam { - param: String, - }, + CollectionSize { param: String }, + ParserStreamSize { witness: String }, + WorklistDrainSize { element: String }, + TreeSize { param: String }, + ArithmeticParam { param: String }, ExplicitCountZero, - ExplicitCountPositive { - steps: Rc, - }, + ExplicitCountPositive { steps: Rc }, Forever, } pub fn tree_size_bound(param: String) -> Rc { - Rc::new(SizeBound::TreeSize { - param: param, -}) + Rc::new(SizeBound::TreeSize { param: param }) } pub fn positive_descent_count(steps: Rc) -> i64 { - stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - match (*steps).clone() { - PositiveDescentAmount::OneStep => 1, - PositiveDescentAmount::AdditionalStep { previous: p, .. } => (1 + positive_descent_count(p.clone())), -} + stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || match (*steps).clone() { + PositiveDescentAmount::OneStep => 1, + PositiveDescentAmount::AdditionalStep { previous: p, .. } => { + (1 + positive_descent_count(p.clone())) + } }) } @@ -93,12 +85,8 @@ pub enum CallPattern { #[serde(tag = "_variant")] pub enum ShrinkFactor { UnitShrink, - ConstantShrink { - steps: Rc, - }, - ProportionalShrink { - divisor: Rc, - }, + ConstantShrink { steps: Rc }, + ProportionalShrink { divisor: Rc }, } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -119,97 +107,94 @@ pub enum IterationPrimitive { pub fn lower_call_pattern(pattern: Rc) -> Rc { match (*pattern).clone() { - CallPattern::ChildAccessorCall { accessor: a, .. } => Rc::new(LoweringTarget { - primitive: IterationPrimitive::Descend, - bound: Rc::new(SizeBound::TreeSize { - param: a.clone(), -}), - evidence: DescentEvidence::Strict, - factor: None, -}), - CallPattern::CollectionShrinkCall { amount: p, collection: c, .. } => Rc::new(LoweringTarget { - primitive: IterationPrimitive::Fold, - bound: Rc::new(SizeBound::CollectionSize { - param: c.clone(), -}), - evidence: DescentEvidence::Strict, - factor: Some(Rc::new(ShrinkFactor::ConstantShrink { - steps: p.clone(), -})), -}), - CallPattern::ArithmeticSubtractCall { steps: p, ring_param: r, .. } => Rc::new(LoweringTarget { - primitive: IterationPrimitive::Repeat, - bound: Rc::new(SizeBound::ArithmeticParam { - param: r.clone(), -}), - evidence: DescentEvidence::Strict, - factor: Some(Rc::new(ShrinkFactor::ConstantShrink { - steps: p.clone(), -})), -}), - CallPattern::ArithmeticDivideCall { divisor: d, ring_param: r, .. } => Rc::new(LoweringTarget { - primitive: IterationPrimitive::Repeat, - bound: Rc::new(SizeBound::ArithmeticParam { - param: r.clone(), -}), - evidence: DescentEvidence::Strict, - factor: Some(Rc::new(ShrinkFactor::ProportionalShrink { - divisor: d.clone(), -})), -}), - CallPattern::ParserAdvanceCall { witness: w, .. } => Rc::new(LoweringTarget { - primitive: IterationPrimitive::Fold, - bound: Rc::new(SizeBound::ParserStreamSize { - witness: w.clone(), -}), - evidence: DescentEvidence::Strict, - factor: None, -}), - CallPattern::WorklistDrainCall { element: e, .. } => Rc::new(LoweringTarget { - primitive: IterationPrimitive::Fold, - bound: Rc::new(SizeBound::WorklistDrainSize { - element: e.clone(), -}), - evidence: DescentEvidence::Strict, - factor: None, -}), - CallPattern::FoldBodyCall { outer_collection: oc, .. } => Rc::new(LoweringTarget { - primitive: IterationPrimitive::Fold, - bound: Rc::new(SizeBound::CollectionSize { - param: oc.clone(), -}), - evidence: DescentEvidence::NonIncreasing, - factor: None, -}), - CallPattern::SameArgumentCall => Rc::new(LoweringTarget { - primitive: IterationPrimitive::Repeat, - bound: Rc::new(SizeBound::Forever), - evidence: DescentEvidence::NonIncreasing, - factor: None, -}), -} + CallPattern::ChildAccessorCall { accessor: a, .. } => Rc::new(LoweringTarget { + primitive: IterationPrimitive::Descend, + bound: Rc::new(SizeBound::TreeSize { param: a.clone() }), + evidence: DescentEvidence::Strict, + factor: None, + }), + CallPattern::CollectionShrinkCall { + amount: p, + collection: c, + .. + } => Rc::new(LoweringTarget { + primitive: IterationPrimitive::Fold, + bound: Rc::new(SizeBound::CollectionSize { param: c.clone() }), + evidence: DescentEvidence::Strict, + factor: Some(Rc::new(ShrinkFactor::ConstantShrink { steps: p.clone() })), + }), + CallPattern::ArithmeticSubtractCall { + steps: p, + ring_param: r, + .. + } => Rc::new(LoweringTarget { + primitive: IterationPrimitive::Repeat, + bound: Rc::new(SizeBound::ArithmeticParam { param: r.clone() }), + evidence: DescentEvidence::Strict, + factor: Some(Rc::new(ShrinkFactor::ConstantShrink { steps: p.clone() })), + }), + CallPattern::ArithmeticDivideCall { + divisor: d, + ring_param: r, + .. + } => Rc::new(LoweringTarget { + primitive: IterationPrimitive::Repeat, + bound: Rc::new(SizeBound::ArithmeticParam { param: r.clone() }), + evidence: DescentEvidence::Strict, + factor: Some(Rc::new(ShrinkFactor::ProportionalShrink { + divisor: d.clone(), + })), + }), + CallPattern::ParserAdvanceCall { witness: w, .. } => Rc::new(LoweringTarget { + primitive: IterationPrimitive::Fold, + bound: Rc::new(SizeBound::ParserStreamSize { witness: w.clone() }), + evidence: DescentEvidence::Strict, + factor: None, + }), + CallPattern::WorklistDrainCall { element: e, .. } => Rc::new(LoweringTarget { + primitive: IterationPrimitive::Fold, + bound: Rc::new(SizeBound::WorklistDrainSize { element: e.clone() }), + evidence: DescentEvidence::Strict, + factor: None, + }), + CallPattern::FoldBodyCall { + outer_collection: oc, + .. + } => Rc::new(LoweringTarget { + primitive: IterationPrimitive::Fold, + bound: Rc::new(SizeBound::CollectionSize { param: oc.clone() }), + evidence: DescentEvidence::NonIncreasing, + factor: None, + }), + CallPattern::SameArgumentCall => Rc::new(LoweringTarget { + primitive: IterationPrimitive::Repeat, + bound: Rc::new(SizeBound::Forever), + evidence: DescentEvidence::NonIncreasing, + factor: None, + }), + } } pub fn size_bound_param(bound: Rc) -> Option { match (*bound).clone() { - SizeBound::TreeSize { param: p, .. } => Some(p.clone()), - SizeBound::CollectionSize { param: p, .. } => Some(p.clone()), - SizeBound::ParserStreamSize { witness: w, .. } => Some(w.clone()), - SizeBound::WorklistDrainSize { element: e, .. } => Some(e.clone()), - SizeBound::ArithmeticParam { param: p, .. } => Some(p.clone()), - SizeBound::ExplicitCountZero => None, - SizeBound::ExplicitCountPositive { .. } => None, - SizeBound::Forever => None, -} + SizeBound::TreeSize { param: p, .. } => Some(p.clone()), + SizeBound::CollectionSize { param: p, .. } => Some(p.clone()), + SizeBound::ParserStreamSize { witness: w, .. } => Some(w.clone()), + SizeBound::WorklistDrainSize { element: e, .. } => Some(e.clone()), + SizeBound::ArithmeticParam { param: p, .. } => Some(p.clone()), + SizeBound::ExplicitCountZero => None, + SizeBound::ExplicitCountPositive { .. } => None, + SizeBound::Forever => None, + } } pub fn is_constant_bound(bound: Rc) -> bool { match (*bound).clone() { - SizeBound::ExplicitCountZero => true, - SizeBound::ExplicitCountPositive { .. } => true, - SizeBound::Forever => true, - _ => false, -} + SizeBound::ExplicitCountZero => true, + SizeBound::ExplicitCountPositive { .. } => true, + SizeBound::Forever => true, + _ => false, + } } pub fn forever_iteration_bound() -> i64 { @@ -218,11 +203,13 @@ pub fn forever_iteration_bound() -> i64 { pub fn constant_bound_value(bound: Rc) -> Option { match (*bound).clone() { - SizeBound::ExplicitCountZero => Some(0), - SizeBound::ExplicitCountPositive { steps: s, .. } => Some(positive_descent_count(s.clone())), - SizeBound::Forever => Some(forever_iteration_bound()), - _ => None, -} + SizeBound::ExplicitCountZero => Some(0), + SizeBound::ExplicitCountPositive { steps: s, .. } => { + Some(positive_descent_count(s.clone())) + } + SizeBound::Forever => Some(forever_iteration_bound()), + _ => None, + } } #[derive(Debug, Clone, Copy, PartialEq, serde::Serialize, serde::Deserialize)] @@ -235,14 +222,14 @@ pub enum IterationDimension { pub fn algebra_profile_to_dimension(profile: AlgebraProfile) -> Option { match profile { - AlgebraProfile::FreeMonoidCollectionProfile => Some(IterationDimension::CollectionFold), - AlgebraProfile::FreeMonoidScalarProfile => Some(IterationDimension::CollectionFold), - AlgebraProfile::BooleanAlgebraCollectionProfile => Some(IterationDimension::CollectionFold), - AlgebraProfile::PartialFunctionProfile => Some(IterationDimension::CollectionFold), - AlgebraProfile::OrderedRingProfile => Some(IterationDimension::ArithmeticRepeat), - AlgebraProfile::ApproximateFieldProfile => Some(IterationDimension::ArithmeticRepeat), - AlgebraProfile::BooleanAlgebraProfile => None, -} + AlgebraProfile::FreeMonoidCollectionProfile => Some(IterationDimension::CollectionFold), + AlgebraProfile::FreeMonoidScalarProfile => Some(IterationDimension::CollectionFold), + AlgebraProfile::BooleanAlgebraCollectionProfile => Some(IterationDimension::CollectionFold), + AlgebraProfile::PartialFunctionProfile => Some(IterationDimension::CollectionFold), + AlgebraProfile::OrderedRingProfile => Some(IterationDimension::ArithmeticRepeat), + AlgebraProfile::ApproximateFieldProfile => Some(IterationDimension::ArithmeticRepeat), + AlgebraProfile::BooleanAlgebraProfile => None, + } } pub fn type_iteration_dimension(type_name: &String) -> Option { @@ -250,8 +237,8 @@ pub fn type_iteration_dimension(type_name: &String) -> Option algebra_profile_to_dimension(p.clone()), - None => None, -} + Some(p) => algebra_profile_to_dimension(p.clone()), + None => None, + } } } diff --git a/src/v2/stage0/src/std_effects.rs b/src/v2/stage0/src/std_effects.rs index bac6fa5a39c..e31b9a4a939 100644 --- a/src/v2/stage0/src/std_effects.rs +++ b/src/v2/stage0/src/std_effects.rs @@ -1,31 +1,29 @@ // Generated by v2 compiler -- do not edit. // Source module: std.effects -use std::collections::HashMap; -use std::rc::Rc; -use crate::v2_rt; -use crate::NonEmptyVec; -use crate::NonEmptyBTreeSet; -pub use crate::std_types::{HttpMethod}; -use crate::std_types::HttpMethod::{GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS}; -pub use crate::std_http_path::{PathTemplate, PathTemplateParseResult, parse_path_template, has_path_params, last_path_param}; -use crate::std_http_path::PathTemplateParseResult::{ParsedPathTemplate, MalformedPathTemplate}; +use self::DeriveOpEffectResult::*; use self::EffectShape::*; -use self::KeySource::*; use self::IdempotencyEvidence::*; -use self::DeriveOpEffectResult::*; +use self::KeySource::*; use self::ModifierAgreement::*; +use crate::std_http_path::PathTemplateParseResult::{MalformedPathTemplate, ParsedPathTemplate}; +pub use crate::std_http_path::{ + has_path_params, last_path_param, parse_path_template, PathTemplate, PathTemplateParseResult, +}; +pub use crate::std_types::HttpMethod; +use crate::std_types::HttpMethod::{DELETE, GET, HEAD, OPTIONS, PATCH, POST, PUT}; +use crate::v2_rt; +use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum EffectShape { ReadEffect, - UpsertEffect { - key_source: Rc, - }, - DeleteEffect { - key_source: Rc, - }, + UpsertEffect { key_source: Rc }, + DeleteEffect { key_source: Rc }, CreateEffect, AppendEffect, } @@ -33,8 +31,12 @@ impl EffectShape { pub fn key_source(&self) -> Rc { match self { EffectShape::ReadEffect => panic!("no key_source on unit variant"), - EffectShape::UpsertEffect { key_source: __val, .. } => __val.clone(), - EffectShape::DeleteEffect { key_source: __val, .. } => __val.clone(), + EffectShape::UpsertEffect { + key_source: __val, .. + } => __val.clone(), + EffectShape::DeleteEffect { + key_source: __val, .. + } => __val.clone(), EffectShape::CreateEffect => panic!("no key_source on unit variant"), EffectShape::AppendEffect => panic!("no key_source on unit variant"), } @@ -44,15 +46,9 @@ impl EffectShape { #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum KeySource { - PathParam { - param: String, - }, - InputField { - field: String, - }, - CompositeKey { - fields: Rc>, - }, + PathParam { param: String }, + InputField { field: String }, + CompositeKey { fields: Rc> }, } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -79,12 +75,12 @@ impl IdempotencyEvidence { pub fn is_idempotent_effect(shape: Rc) -> bool { match (*shape).clone() { - EffectShape::ReadEffect => true, - EffectShape::UpsertEffect { .. } => true, - EffectShape::DeleteEffect { .. } => true, - EffectShape::CreateEffect => false, - EffectShape::AppendEffect => false, -} + EffectShape::ReadEffect => true, + EffectShape::UpsertEffect { .. } => true, + EffectShape::DeleteEffect { .. } => true, + EffectShape::CreateEffect => false, + EffectShape::AppendEffect => false, + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -103,21 +99,29 @@ pub struct OperationEffect { pub fn compose_effects(effects: &Rc>>) -> Rc { { - let non_idempotent = Rc::new({ let mut __result = Vec::new(); for e in effects.clone().iter().cloned() { if match (*e.evidence.clone()).clone() { - IdempotencyEvidence::NonIdempotent { .. } => true, - _ => false, -} { __result.push(e); } } __result }); -let breaker = non_idempotent.clone().first().cloned(); -let breaker_name = match breaker { - Some(op) => Some(op.operation_name.clone()), - None => None, -}; -Rc::new(ComposedEffect { - operations: effects.clone(), - idempotent: ((non_idempotent.clone().len() as i64) == 0), - breaking_operation: breaker_name, -}) -} + let non_idempotent = Rc::new({ + let mut __result = Vec::new(); + for e in effects.clone().iter().cloned() { + if match (*e.evidence.clone()).clone() { + IdempotencyEvidence::NonIdempotent { .. } => true, + _ => false, + } { + __result.push(e); + } + } + __result + }); + let breaker = non_idempotent.clone().first().cloned(); + let breaker_name = match breaker { + Some(op) => Some(op.operation_name.clone()), + None => None, + }; + Rc::new(ComposedEffect { + operations: effects.clone(), + idempotent: ((non_idempotent.clone().len() as i64) == 0), + breaking_operation: breaker_name, + }) + } } pub fn parse_http_method(raw: &String) -> Option { @@ -181,76 +185,75 @@ pub enum DeriveOpEffectResult { pub fn derive_effect_shape(method: HttpMethod, path: Rc) -> Rc { match method { - HttpMethod::GET => Rc::new(EffectShape::ReadEffect), - HttpMethod::HEAD => Rc::new(EffectShape::ReadEffect), - HttpMethod::OPTIONS => Rc::new(EffectShape::ReadEffect), - HttpMethod::POST => Rc::new(EffectShape::CreateEffect), - HttpMethod::DELETE => match last_path_param(path) { - Some(p) => Rc::new(EffectShape::DeleteEffect { - key_source: Rc::new(KeySource::PathParam { - param: p.clone(), -}), -}), - None => Rc::new(EffectShape::CreateEffect), -}, - HttpMethod::PUT => match last_path_param(path) { - Some(p) => Rc::new(EffectShape::UpsertEffect { - key_source: Rc::new(KeySource::PathParam { - param: p.clone(), -}), -}), - None => Rc::new(EffectShape::CreateEffect), -}, - HttpMethod::PATCH => match last_path_param(path) { - Some(p) => Rc::new(EffectShape::UpsertEffect { - key_source: Rc::new(KeySource::PathParam { - param: p.clone(), -}), -}), - None => Rc::new(EffectShape::CreateEffect), -}, -} + HttpMethod::GET => Rc::new(EffectShape::ReadEffect), + HttpMethod::HEAD => Rc::new(EffectShape::ReadEffect), + HttpMethod::OPTIONS => Rc::new(EffectShape::ReadEffect), + HttpMethod::POST => Rc::new(EffectShape::CreateEffect), + HttpMethod::DELETE => match last_path_param(path) { + Some(p) => Rc::new(EffectShape::DeleteEffect { + key_source: Rc::new(KeySource::PathParam { param: p.clone() }), + }), + None => Rc::new(EffectShape::CreateEffect), + }, + HttpMethod::PUT => match last_path_param(path) { + Some(p) => Rc::new(EffectShape::UpsertEffect { + key_source: Rc::new(KeySource::PathParam { param: p.clone() }), + }), + None => Rc::new(EffectShape::CreateEffect), + }, + HttpMethod::PATCH => match last_path_param(path) { + Some(p) => Rc::new(EffectShape::UpsertEffect { + key_source: Rc::new(KeySource::PathParam { param: p.clone() }), + }), + None => Rc::new(EffectShape::CreateEffect), + }, + } } -pub fn derive_op_effect(operation_name: String, method_str: &String, path_str: String) -> Rc { +pub fn derive_op_effect( + operation_name: String, + method_str: &String, + path_str: String, +) -> Rc { match parse_http_method(&method_str) { - None => Rc::new(DeriveOpEffectResult::UnknownHttpMethodInput { - operation_name: operation_name, - method_str: method_str.clone(), -}), - Some(method) => match (*parse_path_template(&path_str)).clone() { - PathTemplateParseResult::ParsedPathTemplate { template: path, .. } => { - let shape = derive_effect_shape(method.clone(), path.clone()); -Rc::new(DeriveOpEffectResult::DerivedEffect { - effect: Rc::new(DerivedOpEffect { - operation_name: operation_name, - method: method.clone(), - path_template: path.clone(), - shape: shape, -}), -}) -}, - PathTemplateParseResult::MalformedPathTemplate { raw: raw_path, segment, reason, .. } => Rc::new(DeriveOpEffectResult::MalformedPathInput { - operation_name: operation_name, - method: method.clone(), - raw_path: raw_path.clone(), - segment: segment.clone(), - reason: reason.clone(), -}), -}, -} + None => Rc::new(DeriveOpEffectResult::UnknownHttpMethodInput { + operation_name: operation_name, + method_str: method_str.clone(), + }), + Some(method) => match (*parse_path_template(&path_str)).clone() { + PathTemplateParseResult::ParsedPathTemplate { template: path, .. } => { + let shape = derive_effect_shape(method.clone(), path.clone()); + Rc::new(DeriveOpEffectResult::DerivedEffect { + effect: Rc::new(DerivedOpEffect { + operation_name: operation_name, + method: method.clone(), + path_template: path.clone(), + shape: shape, + }), + }) + } + PathTemplateParseResult::MalformedPathTemplate { + raw: raw_path, + segment, + reason, + .. + } => Rc::new(DeriveOpEffectResult::MalformedPathInput { + operation_name: operation_name, + method: method.clone(), + raw_path: raw_path.clone(), + segment: segment.clone(), + reason: reason.clone(), + }), + }, + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum ModifierAgreement { Agrees, - Disagrees { - reason: String, - }, - DerivationUnknown { - reason: String, - }, + Disagrees { reason: String }, + DerivationUnknown { reason: String }, } impl ModifierAgreement { pub fn reason(&self) -> String { @@ -271,10 +274,14 @@ pub struct ModifierCheck { pub agreement: Rc, } -pub fn check_modifier_vs_derivation(op: &Rc, declared_idempotent: &bool, declared_readonly: &bool) -> Rc { +pub fn check_modifier_vs_derivation( + op: &Rc, + declared_idempotent: &bool, + declared_readonly: &bool, +) -> Rc { { let derived_idempotent = is_idempotent_effect(op.shape.clone()); -let agreement = if (declared_idempotent.clone() && derived_idempotent.clone()) { + let agreement = if (declared_idempotent.clone() && derived_idempotent.clone()) { Rc::new(ModifierAgreement::Agrees) } else { if (declared_idempotent.clone() && !derived_idempotent.clone()) { @@ -289,26 +296,27 @@ let agreement = if (declared_idempotent.clone() && derived_idempotent.clone()) { } else { if (!declared_idempotent.clone() && declared_readonly.clone()) { match op.method.clone() { - HttpMethod::GET => Rc::new(ModifierAgreement::Agrees), - HttpMethod::HEAD => Rc::new(ModifierAgreement::Agrees), - HttpMethod::OPTIONS => Rc::new(ModifierAgreement::Agrees), - _ => Rc::new(ModifierAgreement::Disagrees { - reason: "readonly declared but method is not GET/HEAD/OPTIONS".to_string(), -}), -} + HttpMethod::GET => Rc::new(ModifierAgreement::Agrees), + HttpMethod::HEAD => Rc::new(ModifierAgreement::Agrees), + HttpMethod::OPTIONS => Rc::new(ModifierAgreement::Agrees), + _ => Rc::new(ModifierAgreement::Disagrees { + reason: "readonly declared but method is not GET/HEAD/OPTIONS" + .to_string(), + }), + } } else { Rc::new(ModifierAgreement::Agrees) } } }; -Rc::new(ModifierCheck { - operation_name: op.operation_name.clone(), - declared_idempotent: declared_idempotent.clone(), - declared_readonly: declared_readonly.clone(), - derived_shape: op.shape.clone(), - agreement: agreement, -}) -} + Rc::new(ModifierCheck { + operation_name: op.operation_name.clone(), + declared_idempotent: declared_idempotent.clone(), + declared_readonly: declared_readonly.clone(), + derived_shape: op.shape.clone(), + agreement: agreement, + }) + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -319,13 +327,32 @@ pub struct IdempotencyTestObligation { pub witness_required: bool, } -pub fn generate_idempotency_obligations(ops: Rc>>) -> Rc>> { - Rc::new({ let mut __result = Vec::new(); for o in Rc::new({ let mut __result = Vec::new(); for o in ops.iter().cloned() { if is_idempotent_effect(o.shape.clone()) { __result.push(o); } } __result }).iter().cloned() { __result.push(Rc::new(IdempotencyTestObligation { - operation_name: o.operation_name.clone(), - effect_shape: o.shape.clone(), - claim: "f(f(x)) == f(x)".to_string(), - witness_required: true, -})); } __result }) +pub fn generate_idempotency_obligations( + ops: Rc>>, +) -> Rc>> { + Rc::new({ + let mut __result = Vec::new(); + for o in Rc::new({ + let mut __result = Vec::new(); + for o in ops.iter().cloned() { + if is_idempotent_effect(o.shape.clone()) { + __result.push(o); + } + } + __result + }) + .iter() + .cloned() + { + __result.push(Rc::new(IdempotencyTestObligation { + operation_name: o.operation_name.clone(), + effect_shape: o.shape.clone(), + claim: "f(f(x)) == f(x)".to_string(), + witness_required: true, + })); + } + __result + }) } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] diff --git a/src/v2/stage0/src/std_error_primitives.rs b/src/v2/stage0/src/std_error_primitives.rs index 52d156a47f2..a3fc3d2d54b 100644 --- a/src/v2/stage0/src/std_error_primitives.rs +++ b/src/v2/stage0/src/std_error_primitives.rs @@ -3,23 +3,19 @@ #![allow(non_camel_case_types)] -use std::collections::HashMap; -use std::rc::Rc; +use self::DivError::*; +use self::Result::*; use crate::v2_rt; -use crate::NonEmptyVec; use crate::NonEmptyBTreeSet; -use self::Result::*; -use self::DivError::*; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum Result { - Ok { - value: Box, - }, - Err { - value: Box, - }, + Ok { value: Box }, + Err { value: Box }, } #[derive(Debug, Clone, Copy, PartialEq, serde::Serialize, serde::Deserialize)] diff --git a/src/v2/stage0/src/std_graph.rs b/src/v2/stage0/src/std_graph.rs index cfcaeb9aab9..44199c2545f 100644 --- a/src/v2/stage0/src/std_graph.rs +++ b/src/v2/stage0/src/std_graph.rs @@ -1,13 +1,13 @@ // Generated by v2 compiler -- do not edit. // Source module: std.graph -use std::collections::HashMap; -use std::rc::Rc; +use crate::std_termination::DescentEvidence::{DescentUnknown, NonIncreasing, Strict}; +pub use crate::std_termination::{DescentEvidence, ProofEdge, TerminationProof}; use crate::v2_rt; -use crate::NonEmptyVec; use crate::NonEmptyBTreeSet; -pub use crate::std_termination::{ProofEdge, DescentEvidence, TerminationProof}; -use crate::std_termination::DescentEvidence::{Strict, NonIncreasing, DescentUnknown}; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] pub struct CallGraph { @@ -38,135 +38,240 @@ pub fn set_has(m: Rc>, key: String) -> bool { } pub fn seed_adjacency_map(names: Rc>) -> Rc>>> { - names.iter().cloned().fold(v2_rt::rc_empty_map::>>(), |acc: Rc>>>, name: String| v2_rt::rc_map_insert(acc, name.clone(), Rc::new(vec![]))) + names.iter().cloned().fold( + v2_rt::rc_empty_map::>>(), + |acc: Rc>>>, name: String| { + v2_rt::rc_map_insert(acc, name.clone(), Rc::new(vec![])) + }, + ) } -pub fn build_call_graph_from_proof_edges(names: &Rc>, edges: Rc>>) -> Rc { +pub fn build_call_graph_from_proof_edges( + names: &Rc>, + edges: Rc>>, +) -> Rc { { let initial_forward = seed_adjacency_map(names.clone()); -let initial_reverse = seed_adjacency_map(names.clone()); -Rc::new({ let mut __result = Vec::new(); for e in edges.iter().cloned() { if (e.caller.clone().as_str() != e.callee.clone().as_str()) { __result.push(e); } } __result }).iter().cloned().fold(Rc::new(CallGraph { - forward: initial_forward, - reverse: initial_reverse, -}), |acc: Rc, edge: Rc| { - let forward_neighbors = match v2_rt::map_get(&acc.forward.clone(), edge.caller.clone()) { - Some(ns) => v2_rt::concat(ns.clone(), Rc::new(vec![edge.callee.clone()])), - None => Rc::new(vec![edge.callee.clone()]), -}; -let reverse_neighbors = match v2_rt::map_get(&acc.reverse.clone(), edge.callee.clone()) { - Some(ns) => v2_rt::concat(ns.clone(), Rc::new(vec![edge.caller.clone()])), - None => Rc::new(vec![edge.caller.clone()]), -}; -Rc::new(CallGraph { - forward: v2_rt::rc_map_insert(acc.forward.clone(), edge.caller.clone(), forward_neighbors.clone()), - reverse: v2_rt::rc_map_insert(acc.reverse.clone(), edge.callee.clone(), reverse_neighbors.clone()), -}) -}) -} + let initial_reverse = seed_adjacency_map(names.clone()); + Rc::new({ + let mut __result = Vec::new(); + for e in edges.iter().cloned() { + if (e.caller.clone().as_str() != e.callee.clone().as_str()) { + __result.push(e); + } + } + __result + }) + .iter() + .cloned() + .fold( + Rc::new(CallGraph { + forward: initial_forward, + reverse: initial_reverse, + }), + |acc: Rc, edge: Rc| { + let forward_neighbors = + match v2_rt::map_get(&acc.forward.clone(), edge.caller.clone()) { + Some(ns) => v2_rt::concat(ns.clone(), Rc::new(vec![edge.callee.clone()])), + None => Rc::new(vec![edge.callee.clone()]), + }; + let reverse_neighbors = + match v2_rt::map_get(&acc.reverse.clone(), edge.callee.clone()) { + Some(ns) => v2_rt::concat(ns.clone(), Rc::new(vec![edge.caller.clone()])), + None => Rc::new(vec![edge.caller.clone()]), + }; + Rc::new(CallGraph { + forward: v2_rt::rc_map_insert( + acc.forward.clone(), + edge.caller.clone(), + forward_neighbors.clone(), + ), + reverse: v2_rt::rc_map_insert( + acc.reverse.clone(), + edge.callee.clone(), + reverse_neighbors.clone(), + ), + }) + }, + ) + } } -pub fn dfs_finish_order(node: &String, adjacency: &Rc>>>, acc: &Rc) -> Rc { +pub fn dfs_finish_order( + node: &String, + adjacency: &Rc>>>, + acc: &Rc, +) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { if set_has(acc.visited.clone(), node.clone()) { acc.clone() } else { { let next_visited = v2_rt::rc_map_insert(acc.visited.clone(), node.clone(), true); -let neighbors = match v2_rt::map_get(&adjacency, node.clone()) { - Some(ns) => ns.clone(), - None => Rc::new(vec![]), -}; -let explored = neighbors.iter().cloned().fold(Rc::new(DfsFinishAcc { - visited: next_visited, - order: acc.order.clone(), -}), |inner: Rc, neighbor: String| dfs_finish_order(&neighbor, &adjacency, &inner)); -Rc::new(DfsFinishAcc { - visited: explored.visited.clone(), - order: v2_rt::rc_list_push(explored.order.clone(), node.clone()), -}) -} + let neighbors = match v2_rt::map_get(&adjacency, node.clone()) { + Some(ns) => ns.clone(), + None => Rc::new(vec![]), + }; + let explored = neighbors.iter().cloned().fold( + Rc::new(DfsFinishAcc { + visited: next_visited, + order: acc.order.clone(), + }), + |inner: Rc, neighbor: String| { + dfs_finish_order(&neighbor, &adjacency, &inner) + }, + ); + Rc::new(DfsFinishAcc { + visited: explored.visited.clone(), + order: v2_rt::rc_list_push(explored.order.clone(), node.clone()), + }) + } } }) } -pub fn dfs_collect_component(node: &String, adjacency: &Rc>>>, acc: &Rc) -> Rc { +pub fn dfs_collect_component( + node: &String, + adjacency: &Rc>>>, + acc: &Rc, +) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { if set_has(acc.visited.clone(), node.clone()) { acc.clone() } else { { let next_visited = v2_rt::rc_map_insert(acc.visited.clone(), node.clone(), true); -let next_members = v2_rt::rc_list_push(acc.members.clone(), node.clone()); -let neighbors = match v2_rt::map_get(&adjacency, node.clone()) { - Some(ns) => ns.clone(), - None => Rc::new(vec![]), -}; -neighbors.iter().cloned().fold(Rc::new(SccComponentAcc { - visited: next_visited, - members: next_members, -}), |inner: Rc, neighbor: String| dfs_collect_component(&neighbor, &adjacency, &inner)) -} + let next_members = v2_rt::rc_list_push(acc.members.clone(), node.clone()); + let neighbors = match v2_rt::map_get(&adjacency, node.clone()) { + Some(ns) => ns.clone(), + None => Rc::new(vec![]), + }; + neighbors.iter().cloned().fold( + Rc::new(SccComponentAcc { + visited: next_visited, + members: next_members, + }), + |inner: Rc, neighbor: String| { + dfs_collect_component(&neighbor, &adjacency, &inner) + }, + ) + } } }) } pub fn graph_has_multi_node_scc(names: Rc>, graph: Rc) -> bool { { - let finish = names.iter().cloned().fold(Rc::new(DfsFinishAcc { - visited: v2_rt::rc_empty_map::(), - order: Rc::new(vec![]), -}), |acc: Rc, name: String| dfs_finish_order(&name, &graph.forward.clone(), &acc)); -let result = v2_rt::reverse(finish.order.clone()).iter().cloned().fold(Rc::new(SccCycleAcc { - visited: v2_rt::rc_empty_map::(), - has_cycle: false, -}), |acc: Rc, name: String| if (acc.has_cycle.clone() || set_has(acc.visited.clone(), name.clone())) { - acc.clone() - } else { - { - let component = dfs_collect_component(&name, &graph.reverse.clone(), &Rc::new(SccComponentAcc { - visited: acc.visited.clone(), - members: Rc::new(vec![]), -})); -Rc::new(SccCycleAcc { - visited: component.visited.clone(), - has_cycle: ((component.members.clone().len() as i64) > 1), -}) -} - }); -result.has_cycle.clone() -} + let finish = names.iter().cloned().fold( + Rc::new(DfsFinishAcc { + visited: v2_rt::rc_empty_map::(), + order: Rc::new(vec![]), + }), + |acc: Rc, name: String| { + dfs_finish_order(&name, &graph.forward.clone(), &acc) + }, + ); + let result = v2_rt::reverse(finish.order.clone()).iter().cloned().fold( + Rc::new(SccCycleAcc { + visited: v2_rt::rc_empty_map::(), + has_cycle: false, + }), + |acc: Rc, name: String| { + if (acc.has_cycle.clone() || set_has(acc.visited.clone(), name.clone())) { + acc.clone() + } else { + { + let component = dfs_collect_component( + &name, + &graph.reverse.clone(), + &Rc::new(SccComponentAcc { + visited: acc.visited.clone(), + members: Rc::new(vec![]), + }), + ); + Rc::new(SccCycleAcc { + visited: component.visited.clone(), + has_cycle: ((component.members.clone().len() as i64) > 1), + }) + } + } + }, + ); + result.has_cycle.clone() + } } pub fn is_lexicographic_descent(mut evidence: Rc>) -> bool { loop { match evidence.clone().first().cloned() { - None => { break false; }, - Some(e) => { match e.clone() { - DescentEvidence::Strict => { break true; }, - DescentEvidence::NonIncreasing => { { - let __tco_0 = Rc::new(evidence.iter().cloned().skip(1 as usize).collect::>()); -evidence = __tco_0; -continue; -} }, - DescentEvidence::DescentUnknown => { break false; }, -} }, -} -} + None => { + break false; + } + Some(e) => match e.clone() { + DescentEvidence::Strict => { + break true; + } + DescentEvidence::NonIncreasing => { + let __tco_0 = Rc::new( + evidence + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ); + evidence = __tco_0; + continue; + } + DescentEvidence::DescentUnknown => { + break false; + } + }, + } + } } pub fn is_valid_proof(proof: Rc, edges: &Rc>>) -> bool { { let expected_dims = (proof.dimensions.clone().len() as i64); -let non_descending = Rc::new({ let mut __result = Vec::new(); for e in edges.clone().iter().cloned() { if (((e.evidence.clone().len() as i64) != expected_dims.clone()) || (is_lexicographic_descent(e.evidence.clone()) == false)) { __result.push(e); } } __result }); -let has_self_cycle = { let mut __found = false; for e in non_descending.clone().iter().cloned() { if (e.caller.clone().as_str() == e.callee.clone().as_str()) { __found = true; break; } } __found }; -if has_self_cycle { + let non_descending = Rc::new({ + let mut __result = Vec::new(); + for e in edges.clone().iter().cloned() { + if (((e.evidence.clone().len() as i64) != expected_dims.clone()) + || (is_lexicographic_descent(e.evidence.clone()) == false)) + { + __result.push(e); + } + } + __result + }); + let has_self_cycle = { + let mut __found = false; + for e in non_descending.clone().iter().cloned() { + if (e.caller.clone().as_str() == e.callee.clone().as_str()) { + __found = true; + break; + } + } + __found + }; + if has_self_cycle { false } else { { - let members = Rc::new({ let mut __result = Vec::new(); for e in edges.clone().iter().cloned() { __result.extend((*Rc::new(vec![e.caller.clone(), e.callee.clone()])).iter().cloned()); } __result }); -let nd_graph = build_call_graph_from_proof_edges(&members, non_descending.clone()); -(graph_has_multi_node_scc(members.clone(), nd_graph) == false) -} + let members = Rc::new({ + let mut __result = Vec::new(); + for e in edges.clone().iter().cloned() { + __result.extend( + (*Rc::new(vec![e.caller.clone(), e.callee.clone()])) + .iter() + .cloned(), + ); + } + __result + }); + let nd_graph = build_call_graph_from_proof_edges(&members, non_descending.clone()); + (graph_has_multi_node_scc(members.clone(), nd_graph) == false) + } } -} + } } diff --git a/src/v2/stage0/src/std_http_path.rs b/src/v2/stage0/src/std_http_path.rs index 273e30ca225..c67a8d74b5f 100644 --- a/src/v2/stage0/src/std_http_path.rs +++ b/src/v2/stage0/src/std_http_path.rs @@ -1,24 +1,20 @@ // Generated by v2 compiler -- do not edit. // Source module: std.http_path -use std::collections::HashMap; -use std::rc::Rc; -use crate::v2_rt; -use crate::NonEmptyVec; -use crate::NonEmptyBTreeSet; -use self::UrlPathToken::*; use self::PathSegmentTokensResult::*; use self::PathTemplateParseResult::*; +use self::UrlPathToken::*; +use crate::v2_rt; +use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum UrlPathToken { - LiteralToken { - text: String, - }, - ParamToken { - name: String, - }, + LiteralToken { text: String }, + ParamToken { name: String }, } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -29,13 +25,8 @@ pub struct PathTemplate { #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum PathSegmentTokensResult { - ParsedSegmentTokens { - tokens: Rc>>, - }, - MalformedPathSegment { - segment: String, - reason: String, - }, + ParsedSegmentTokens { tokens: Rc>> }, + MalformedPathSegment { segment: String, reason: String }, } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -53,150 +44,242 @@ pub enum PathTemplateParseResult { pub fn parse_path_template(raw: &String) -> Rc { { - let path_only = match Rc::new(raw.clone().split(&"?".to_string()).map(|s| s.to_string()).collect::>()).first().cloned() { - Some(p) => p.clone(), - None => raw.clone(), -}; -let segments = Rc::new({ let mut __result = Vec::new(); for s in Rc::new(path_only.split(&"/".to_string()).map(|s| s.to_string()).collect::>()).iter().cloned() { if (s.clone().as_str() != "".to_string().as_str()) { __result.push(s); } } __result }); -match segments.clone().first().cloned() { - None => Rc::new(PathTemplateParseResult::ParsedPathTemplate { - template: Rc::new(PathTemplate { - tokens: Rc::new(vec![]), -}), -}), - Some(first_seg) => match (*parse_segment_tokens(&first_seg)).clone() { - PathSegmentTokensResult::MalformedPathSegment { segment: s, reason: r, .. } => Rc::new(PathTemplateParseResult::MalformedPathTemplate { - raw: raw.clone(), - segment: s.clone(), - reason: r.clone(), -}), - PathSegmentTokensResult::ParsedSegmentTokens { tokens: first_tokens, .. } => { - let parsed = Rc::new(segments.clone().iter().cloned().skip(1 as usize).collect::>()).iter().cloned().fold(Rc::new(PathTemplateParseResult::ParsedPathTemplate { - template: Rc::new(PathTemplate { - tokens: first_tokens.clone(), -}), -}), |acc: Rc, seg: String| match (*acc.clone()).clone() { - PathTemplateParseResult::MalformedPathTemplate { .. } => acc.clone(), - PathTemplateParseResult::ParsedPathTemplate { template: path, .. } => match (*parse_segment_tokens(&seg)).clone() { - PathSegmentTokensResult::MalformedPathSegment { segment: s, reason: r, .. } => Rc::new(PathTemplateParseResult::MalformedPathTemplate { - raw: raw.clone(), - segment: s.clone(), - reason: r.clone(), -}), - PathSegmentTokensResult::ParsedSegmentTokens { tokens: seg_tokens, .. } => Rc::new(PathTemplateParseResult::ParsedPathTemplate { - template: Rc::new(PathTemplate { - tokens: v2_rt::concat(path.tokens.clone(), seg_tokens.clone()), -}), -}), -}, -}); -parsed -}, -}, -} -} + let path_only = match Rc::new( + raw.clone() + .split(&"?".to_string()) + .map(|s| s.to_string()) + .collect::>(), + ) + .first() + .cloned() + { + Some(p) => p.clone(), + None => raw.clone(), + }; + let segments = Rc::new({ + let mut __result = Vec::new(); + for s in Rc::new( + path_only + .split(&"/".to_string()) + .map(|s| s.to_string()) + .collect::>(), + ) + .iter() + .cloned() + { + if (s.clone().as_str() != "".to_string().as_str()) { + __result.push(s); + } + } + __result + }); + match segments.clone().first().cloned() { + None => Rc::new(PathTemplateParseResult::ParsedPathTemplate { + template: Rc::new(PathTemplate { + tokens: Rc::new(vec![]), + }), + }), + Some(first_seg) => match (*parse_segment_tokens(&first_seg)).clone() { + PathSegmentTokensResult::MalformedPathSegment { + segment: s, + reason: r, + .. + } => Rc::new(PathTemplateParseResult::MalformedPathTemplate { + raw: raw.clone(), + segment: s.clone(), + reason: r.clone(), + }), + PathSegmentTokensResult::ParsedSegmentTokens { + tokens: first_tokens, + .. + } => { + let parsed = Rc::new( + segments + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ) + .iter() + .cloned() + .fold( + Rc::new(PathTemplateParseResult::ParsedPathTemplate { + template: Rc::new(PathTemplate { + tokens: first_tokens.clone(), + }), + }), + |acc: Rc, seg: String| match (*acc.clone()).clone() + { + PathTemplateParseResult::MalformedPathTemplate { .. } => acc.clone(), + PathTemplateParseResult::ParsedPathTemplate { + template: path, .. + } => match (*parse_segment_tokens(&seg)).clone() { + PathSegmentTokensResult::MalformedPathSegment { + segment: s, + reason: r, + .. + } => Rc::new(PathTemplateParseResult::MalformedPathTemplate { + raw: raw.clone(), + segment: s.clone(), + reason: r.clone(), + }), + PathSegmentTokensResult::ParsedSegmentTokens { + tokens: seg_tokens, + .. + } => Rc::new(PathTemplateParseResult::ParsedPathTemplate { + template: Rc::new(PathTemplate { + tokens: v2_rt::concat( + path.tokens.clone(), + seg_tokens.clone(), + ), + }), + }), + }, + }, + ); + parsed + } + }, + } + } } pub fn parse_segment_tokens(seg: &String) -> Rc { if !v2_rt::contains(seg.clone(), "{".to_string()) { if v2_rt::contains(seg.clone(), "}".to_string()) { Rc::new(PathSegmentTokensResult::MalformedPathSegment { - segment: seg.clone(), - reason: "stray closing brace".to_string(), -}) + segment: seg.clone(), + reason: "stray closing brace".to_string(), + }) } else { Rc::new(PathSegmentTokensResult::ParsedSegmentTokens { - tokens: Rc::new(vec![Rc::new(UrlPathToken::LiteralToken { - text: seg.clone(), -})]), -}) + tokens: Rc::new(vec![Rc::new(UrlPathToken::LiteralToken { + text: seg.clone(), + })]), + }) } } else { { - let before_and_rest = Rc::new(seg.clone().split(&"{".to_string()).map(|s| s.to_string()).collect::>()); -if ((before_and_rest.clone().len() as i64) != 2) { + let before_and_rest = Rc::new( + seg.clone() + .split(&"{".to_string()) + .map(|s| s.to_string()) + .collect::>(), + ); + if ((before_and_rest.clone().len() as i64) != 2) { return Rc::new(PathSegmentTokensResult::MalformedPathSegment { - segment: seg.clone(), - reason: "multiple opening braces in one segment".to_string(), -}) + segment: seg.clone(), + reason: "multiple opening braces in one segment".to_string(), + }); } -let prefix = match before_and_rest.clone().first().cloned() { - Some(p) => p.clone(), - None => "".to_string(), -}; -let after_open = match before_and_rest.clone().get(1 as usize).cloned() { - Some(r) => r.clone(), - None => "".to_string(), -}; -let name_and_suffix = Rc::new(after_open.split(&"}".to_string()).map(|s| s.to_string()).collect::>()); -if (v2_rt::contains(prefix.clone(), "}".to_string()) || ((name_and_suffix.clone().len() as i64) != 2)) { + let prefix = match before_and_rest.clone().first().cloned() { + Some(p) => p.clone(), + None => "".to_string(), + }; + let after_open = match before_and_rest.clone().get(1 as usize).cloned() { + Some(r) => r.clone(), + None => "".to_string(), + }; + let name_and_suffix = Rc::new( + after_open + .split(&"}".to_string()) + .map(|s| s.to_string()) + .collect::>(), + ); + if (v2_rt::contains(prefix.clone(), "}".to_string()) + || ((name_and_suffix.clone().len() as i64) != 2)) + { return Rc::new(PathSegmentTokensResult::MalformedPathSegment { - segment: seg.clone(), - reason: "missing closing brace or extra closing brace".to_string(), -}) + segment: seg.clone(), + reason: "missing closing brace or extra closing brace".to_string(), + }); } -let param_name = match name_and_suffix.clone().first().cloned() { - Some(p) => p.clone(), - None => "".to_string(), -}; -let suffix = match name_and_suffix.clone().get(1 as usize).cloned() { - Some(s) => s.clone(), - None => "".to_string(), -}; -let prefix_tokens = if (prefix.clone().as_str() != "".to_string().as_str()) { + let param_name = match name_and_suffix.clone().first().cloned() { + Some(p) => p.clone(), + None => "".to_string(), + }; + let suffix = match name_and_suffix.clone().get(1 as usize).cloned() { + Some(s) => s.clone(), + None => "".to_string(), + }; + let prefix_tokens = if (prefix.clone().as_str() != "".to_string().as_str()) { Rc::new(vec![Rc::new(UrlPathToken::LiteralToken { - text: prefix.clone(), -})]) + text: prefix.clone(), + })]) } else { Rc::new(vec![]) }; -let param_tokens = if (param_name.clone().as_str() != "".to_string().as_str()) { + let param_tokens = if (param_name.clone().as_str() != "".to_string().as_str()) { Rc::new(vec![Rc::new(UrlPathToken::ParamToken { - name: param_name.clone(), -})]) + name: param_name.clone(), + })]) } else { Rc::new(vec![]) }; -let suffix_tokens = if (suffix.clone().as_str() != "".to_string().as_str()) { + let suffix_tokens = if (suffix.clone().as_str() != "".to_string().as_str()) { Rc::new(vec![Rc::new(UrlPathToken::LiteralToken { - text: suffix.clone(), -})]) + text: suffix.clone(), + })]) } else { Rc::new(vec![]) }; -if (((param_name.clone().as_str() == "".to_string().as_str()) || v2_rt::contains(suffix.clone(), "{".to_string())) || v2_rt::contains(suffix.clone(), "}".to_string())) { + if (((param_name.clone().as_str() == "".to_string().as_str()) + || v2_rt::contains(suffix.clone(), "{".to_string())) + || v2_rt::contains(suffix.clone(), "}".to_string())) + { Rc::new(PathSegmentTokensResult::MalformedPathSegment { - segment: seg.clone(), - reason: "invalid parameter segment structure".to_string(), -}) + segment: seg.clone(), + reason: "invalid parameter segment structure".to_string(), + }) } else { Rc::new(PathSegmentTokensResult::ParsedSegmentTokens { - tokens: v2_rt::concat(v2_rt::concat(prefix_tokens, param_tokens), suffix_tokens), -}) + tokens: v2_rt::concat( + v2_rt::concat(prefix_tokens, param_tokens), + suffix_tokens, + ), + }) } -} + } } } pub fn has_path_params(template: Rc) -> bool { - { let mut __found = false; for t in template.tokens.clone().iter().cloned() { if match (*t.clone()).clone() { - UrlPathToken::ParamToken { .. } => true, - UrlPathToken::LiteralToken { .. } => false, -} { __found = true; break; } } __found } + { + let mut __found = false; + for t in template.tokens.clone().iter().cloned() { + if match (*t.clone()).clone() { + UrlPathToken::ParamToken { .. } => true, + UrlPathToken::LiteralToken { .. } => false, + } { + __found = true; + break; + } + } + __found + } } pub fn last_path_param(template: Rc) -> Option { { - let params = Rc::new({ let mut __result = Vec::new(); for t in template.tokens.clone().iter().cloned() { if match (*t.clone()).clone() { - UrlPathToken::ParamToken { .. } => true, - UrlPathToken::LiteralToken { .. } => false, -} { __result.push(t); } } __result }); -match params.last().cloned() { - Some(tok) => match (*tok.clone()).clone() { - UrlPathToken::ParamToken { name: n, .. } => Some(n.clone()), - UrlPathToken::LiteralToken { .. } => None, -}, - None => None, -} -} + let params = Rc::new({ + let mut __result = Vec::new(); + for t in template.tokens.clone().iter().cloned() { + if match (*t.clone()).clone() { + UrlPathToken::ParamToken { .. } => true, + UrlPathToken::LiteralToken { .. } => false, + } { + __result.push(t); + } + } + __result + }); + match params.last().cloned() { + Some(tok) => match (*tok.clone()).clone() { + UrlPathToken::ParamToken { name: n, .. } => Some(n.clone()), + UrlPathToken::LiteralToken { .. } => None, + }, + None => None, + } + } } diff --git a/src/v2/stage0/src/std_induction.rs b/src/v2/stage0/src/std_induction.rs index 6e274f3f855..b5fab6085e5 100644 --- a/src/v2/stage0/src/std_induction.rs +++ b/src/v2/stage0/src/std_induction.rs @@ -1,26 +1,35 @@ // Generated by v2 compiler -- do not edit. // Source module: std.induction -use std::collections::HashMap; -use std::rc::Rc; -use crate::v2_rt; -use crate::NonEmptyVec; -use crate::NonEmptyBTreeSet; -pub use crate::std_termination::{DescentEvidence, RankingDimension, PositiveDescentAmount, ProportionalDivisor, proportional_divisor_to_int, positive_descent_amount_from_positive_int, proportional_divisor_from_int_at_least_two, peano_literal_materialization_cap}; -use crate::std_termination::DescentEvidence::{Strict, NonIncreasing, DescentUnknown}; -use crate::std_termination::RankingDimension::{TreeSize}; -use crate::std_termination::PositiveDescentAmount::{OneStep, AdditionalStep}; -use crate::std_termination::ProportionalDivisor::{DivideByTwo, StrictlyLarger}; -pub use crate::std_computation::{CallPattern, LoweringTarget, IterationPrimitive, ShrinkFactor, tree_size_bound, positive_descent_count, SizeBound}; -use crate::std_computation::CallPattern::{ChildAccessorCall, FoldBodyCall, SameArgumentCall, ArithmeticSubtractCall, ArithmeticDivideCall}; -use crate::std_computation::IterationPrimitive::{Descend, Fold, Repeat}; -use crate::std_computation::ShrinkFactor::{UnitShrink, ConstantShrink, ProportionalShrink}; -use crate::std_computation::SizeBound::{CollectionSize, ArithmeticParam, Forever}; -use self::RecursionShape::*; -use self::SubValueRelation::*; -use self::PolynomialExponent::*; use self::AtomicCost::*; use self::CostBound::*; +use self::PolynomialExponent::*; +use self::RecursionShape::*; +use self::SubValueRelation::*; +use crate::std_computation::CallPattern::{ + ArithmeticDivideCall, ArithmeticSubtractCall, ChildAccessorCall, FoldBodyCall, SameArgumentCall, +}; +use crate::std_computation::IterationPrimitive::{Descend, Fold, Repeat}; +use crate::std_computation::ShrinkFactor::{ConstantShrink, ProportionalShrink, UnitShrink}; +use crate::std_computation::SizeBound::{ArithmeticParam, CollectionSize, Forever}; +pub use crate::std_computation::{ + positive_descent_count, tree_size_bound, CallPattern, IterationPrimitive, LoweringTarget, + ShrinkFactor, SizeBound, +}; +use crate::std_termination::DescentEvidence::{DescentUnknown, NonIncreasing, Strict}; +use crate::std_termination::PositiveDescentAmount::{AdditionalStep, OneStep}; +use crate::std_termination::ProportionalDivisor::{DivideByTwo, StrictlyLarger}; +use crate::std_termination::RankingDimension::TreeSize; +pub use crate::std_termination::{ + peano_literal_materialization_cap, positive_descent_amount_from_positive_int, + proportional_divisor_from_int_at_least_two, proportional_divisor_to_int, DescentEvidence, + PositiveDescentAmount, ProportionalDivisor, RankingDimension, +}; +use crate::v2_rt; +use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; #[derive(Debug, Clone, Copy, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] @@ -43,37 +52,42 @@ pub struct InductiveField { pub fn recursion_shape_eq(a: RecursionShape, b: RecursionShape) -> bool { match a { - RecursionShape::DirectRecursion => match b { - RecursionShape::DirectRecursion => true, - _ => false, -}, - RecursionShape::ListRecursion => match b { - RecursionShape::ListRecursion => true, - _ => false, -}, - RecursionShape::OptionalRecursion => match b { - RecursionShape::OptionalRecursion => true, - _ => false, -}, - RecursionShape::SetRecursion => match b { - RecursionShape::SetRecursion => true, - _ => false, -}, - RecursionShape::MapValueRecursion => match b { - RecursionShape::MapValueRecursion => true, - _ => false, -}, -} + RecursionShape::DirectRecursion => match b { + RecursionShape::DirectRecursion => true, + _ => false, + }, + RecursionShape::ListRecursion => match b { + RecursionShape::ListRecursion => true, + _ => false, + }, + RecursionShape::OptionalRecursion => match b { + RecursionShape::OptionalRecursion => true, + _ => false, + }, + RecursionShape::SetRecursion => match b { + RecursionShape::SetRecursion => true, + _ => false, + }, + RecursionShape::MapValueRecursion => match b { + RecursionShape::MapValueRecursion => true, + _ => false, + }, + } } pub fn inductive_field_eq(a: &Rc, b: &Rc) -> bool { - (((((a.type_name.clone().as_str() == b.type_name.clone().as_str()) && (a.variant_name.clone().as_str() == b.variant_name.clone().as_str())) && (a.field_name.clone().as_str() == b.field_name.clone().as_str())) && recursion_shape_eq(a.shape.clone(), b.shape.clone())) && (a.element_type.clone().as_str() == b.element_type.clone().as_str())) + (((((a.type_name.clone().as_str() == b.type_name.clone().as_str()) + && (a.variant_name.clone().as_str() == b.variant_name.clone().as_str())) + && (a.field_name.clone().as_str() == b.field_name.clone().as_str())) + && recursion_shape_eq(a.shape.clone(), b.shape.clone())) + && (a.element_type.clone().as_str() == b.element_type.clone().as_str())) } -pub fn inductive_field_to_dimension(field: Rc, param: String) -> Rc { - Rc::new(RankingDimension::TreeSize { - param: param, -}) +pub fn inductive_field_to_dimension( + field: Rc, + param: String, +) -> Rc { + Rc::new(RankingDimension::TreeSize { param: param }) } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -96,256 +110,344 @@ pub enum SubValueRelation { pub fn sub_value_to_evidence(relation: Rc) -> DescentEvidence { match (*relation).clone() { - SubValueRelation::StrictSubValue { factor: f, .. } => match (*f.clone()).clone() { - ShrinkFactor::UnitShrink => DescentEvidence::Strict, - ShrinkFactor::ConstantShrink { .. } => DescentEvidence::Strict, - ShrinkFactor::ProportionalShrink { .. } => DescentEvidence::Strict, -}, - SubValueRelation::IteratedSubValue { .. } => DescentEvidence::Strict, - SubValueRelation::ArithmeticDescent { factor: f, .. } => match (*f.clone()).clone() { - ShrinkFactor::UnitShrink => DescentEvidence::Strict, - ShrinkFactor::ConstantShrink { .. } => DescentEvidence::Strict, - ShrinkFactor::ProportionalShrink { .. } => DescentEvidence::Strict, -}, - SubValueRelation::PreservedValue => DescentEvidence::NonIncreasing, - SubValueRelation::SubValueUnknown => DescentEvidence::DescentUnknown, -} + SubValueRelation::StrictSubValue { factor: f, .. } => match (*f.clone()).clone() { + ShrinkFactor::UnitShrink => DescentEvidence::Strict, + ShrinkFactor::ConstantShrink { .. } => DescentEvidence::Strict, + ShrinkFactor::ProportionalShrink { .. } => DescentEvidence::Strict, + }, + SubValueRelation::IteratedSubValue { .. } => DescentEvidence::Strict, + SubValueRelation::ArithmeticDescent { factor: f, .. } => match (*f.clone()).clone() { + ShrinkFactor::UnitShrink => DescentEvidence::Strict, + ShrinkFactor::ConstantShrink { .. } => DescentEvidence::Strict, + ShrinkFactor::ProportionalShrink { .. } => DescentEvidence::Strict, + }, + SubValueRelation::PreservedValue => DescentEvidence::NonIncreasing, + SubValueRelation::SubValueUnknown => DescentEvidence::DescentUnknown, + } } pub fn shrink_factor_eq(a: Rc, b: Rc) -> bool { match (*a).clone() { - ShrinkFactor::UnitShrink => match (*b).clone() { - ShrinkFactor::UnitShrink => true, - _ => false, -}, - ShrinkFactor::ConstantShrink { steps: sa, .. } => match (*b).clone() { - ShrinkFactor::ConstantShrink { steps: sb, .. } => (positive_descent_count(sa.clone()) == positive_descent_count(sb.clone())), - _ => false, -}, - ShrinkFactor::ProportionalShrink { divisor: da, .. } => match (*b).clone() { - ShrinkFactor::ProportionalShrink { divisor: db, .. } => (proportional_divisor_to_int(da.clone()) == proportional_divisor_to_int(db.clone())), - _ => false, -}, -} + ShrinkFactor::UnitShrink => match (*b).clone() { + ShrinkFactor::UnitShrink => true, + _ => false, + }, + ShrinkFactor::ConstantShrink { steps: sa, .. } => match (*b).clone() { + ShrinkFactor::ConstantShrink { steps: sb, .. } => { + (positive_descent_count(sa.clone()) == positive_descent_count(sb.clone())) + } + _ => false, + }, + ShrinkFactor::ProportionalShrink { divisor: da, .. } => match (*b).clone() { + ShrinkFactor::ProportionalShrink { divisor: db, .. } => { + (proportional_divisor_to_int(da.clone()) == proportional_divisor_to_int(db.clone())) + } + _ => false, + }, + } } pub fn meet_sub_value(a: Rc, b: Rc) -> Rc { match (*a.clone()).clone() { - SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), - SubValueRelation::PreservedValue => match (*b).clone() { - SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), - _ => Rc::new(SubValueRelation::PreservedValue), -}, - SubValueRelation::StrictSubValue { field: fa, factor: fac_a, .. } => match (*b).clone() { - SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), - SubValueRelation::PreservedValue => Rc::new(SubValueRelation::PreservedValue), - SubValueRelation::StrictSubValue { field: fb, factor: fac_b, .. } => if inductive_field_eq(&fa, &fb) { - if shrink_factor_eq(fac_a.clone(), fac_b.clone()) { - Rc::new(SubValueRelation::StrictSubValue { - field: fa.clone(), - factor: fac_a.clone(), -}) - } else { - Rc::new(SubValueRelation::SubValueUnknown) - } - } else { - Rc::new(SubValueRelation::SubValueUnknown) - }, - _ => Rc::new(SubValueRelation::SubValueUnknown), -}, - SubValueRelation::IteratedSubValue { field: fa, .. } => match (*b).clone() { - SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), - SubValueRelation::PreservedValue => Rc::new(SubValueRelation::PreservedValue), - SubValueRelation::IteratedSubValue { field: fb, .. } => if inductive_field_eq(&fa, &fb) { - a.clone() - } else { - Rc::new(SubValueRelation::SubValueUnknown) - }, - _ => Rc::new(SubValueRelation::SubValueUnknown), -}, - SubValueRelation::ArithmeticDescent { param: pa, factor: fac_a, .. } => match (*b).clone() { - SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), - SubValueRelation::PreservedValue => Rc::new(SubValueRelation::PreservedValue), - SubValueRelation::ArithmeticDescent { param: pb, factor: fac_b, .. } => if (pa.clone().as_str() == pb.clone().as_str()) { - if shrink_factor_eq(fac_a.clone(), fac_b.clone()) { - Rc::new(SubValueRelation::ArithmeticDescent { - param: pa.clone(), - factor: fac_a.clone(), -}) - } else { - Rc::new(SubValueRelation::SubValueUnknown) - } - } else { - Rc::new(SubValueRelation::SubValueUnknown) - }, - _ => Rc::new(SubValueRelation::SubValueUnknown), -}, -} + SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), + SubValueRelation::PreservedValue => match (*b).clone() { + SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), + _ => Rc::new(SubValueRelation::PreservedValue), + }, + SubValueRelation::StrictSubValue { + field: fa, + factor: fac_a, + .. + } => match (*b).clone() { + SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), + SubValueRelation::PreservedValue => Rc::new(SubValueRelation::PreservedValue), + SubValueRelation::StrictSubValue { + field: fb, + factor: fac_b, + .. + } => { + if inductive_field_eq(&fa, &fb) { + if shrink_factor_eq(fac_a.clone(), fac_b.clone()) { + Rc::new(SubValueRelation::StrictSubValue { + field: fa.clone(), + factor: fac_a.clone(), + }) + } else { + Rc::new(SubValueRelation::SubValueUnknown) + } + } else { + Rc::new(SubValueRelation::SubValueUnknown) + } + } + _ => Rc::new(SubValueRelation::SubValueUnknown), + }, + SubValueRelation::IteratedSubValue { field: fa, .. } => match (*b).clone() { + SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), + SubValueRelation::PreservedValue => Rc::new(SubValueRelation::PreservedValue), + SubValueRelation::IteratedSubValue { field: fb, .. } => { + if inductive_field_eq(&fa, &fb) { + a.clone() + } else { + Rc::new(SubValueRelation::SubValueUnknown) + } + } + _ => Rc::new(SubValueRelation::SubValueUnknown), + }, + SubValueRelation::ArithmeticDescent { + param: pa, + factor: fac_a, + .. + } => match (*b).clone() { + SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), + SubValueRelation::PreservedValue => Rc::new(SubValueRelation::PreservedValue), + SubValueRelation::ArithmeticDescent { + param: pb, + factor: fac_b, + .. + } => { + if (pa.clone().as_str() == pb.clone().as_str()) { + if shrink_factor_eq(fac_a.clone(), fac_b.clone()) { + Rc::new(SubValueRelation::ArithmeticDescent { + param: pa.clone(), + factor: fac_a.clone(), + }) + } else { + Rc::new(SubValueRelation::SubValueUnknown) + } + } else { + Rc::new(SubValueRelation::SubValueUnknown) + } + } + _ => Rc::new(SubValueRelation::SubValueUnknown), + }, + } } pub fn join_sub_value(a: Rc, b: Rc) -> Rc { match (*a.clone()).clone() { - SubValueRelation::SubValueUnknown => b.clone(), - SubValueRelation::PreservedValue => match (*b.clone()).clone() { - SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::PreservedValue), - _ => b.clone(), -}, - SubValueRelation::StrictSubValue { field: fa, factor: fac_a, .. } => match (*b.clone()).clone() { - SubValueRelation::SubValueUnknown => a.clone(), - SubValueRelation::PreservedValue => a.clone(), - SubValueRelation::StrictSubValue { field: fb, factor: fac_b, .. } => if inductive_field_eq(&fa, &fb) { - if shrink_factor_eq(fac_a.clone(), fac_b.clone()) { - Rc::new(SubValueRelation::StrictSubValue { - field: fa.clone(), - factor: fac_a.clone(), -}) - } else { - Rc::new(SubValueRelation::SubValueUnknown) - } - } else { - Rc::new(SubValueRelation::SubValueUnknown) - }, - _ => Rc::new(SubValueRelation::SubValueUnknown), -}, - SubValueRelation::IteratedSubValue { field: fa, .. } => match (*b.clone()).clone() { - SubValueRelation::SubValueUnknown => a.clone(), - SubValueRelation::PreservedValue => a.clone(), - SubValueRelation::IteratedSubValue { field: fb, .. } => if inductive_field_eq(&fa, &fb) { - a.clone() - } else { - Rc::new(SubValueRelation::SubValueUnknown) - }, - _ => Rc::new(SubValueRelation::SubValueUnknown), -}, - SubValueRelation::ArithmeticDescent { param: pa, factor: fac_a, .. } => match (*b.clone()).clone() { - SubValueRelation::SubValueUnknown => a.clone(), - SubValueRelation::PreservedValue => a.clone(), - SubValueRelation::ArithmeticDescent { param: pb, factor: fac_b, .. } => if (pa.clone().as_str() == pb.clone().as_str()) { - if shrink_factor_eq(fac_a.clone(), fac_b.clone()) { - Rc::new(SubValueRelation::ArithmeticDescent { - param: pa.clone(), - factor: fac_a.clone(), -}) - } else { - Rc::new(SubValueRelation::SubValueUnknown) - } - } else { - Rc::new(SubValueRelation::SubValueUnknown) - }, - _ => Rc::new(SubValueRelation::SubValueUnknown), -}, -} + SubValueRelation::SubValueUnknown => b.clone(), + SubValueRelation::PreservedValue => match (*b.clone()).clone() { + SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::PreservedValue), + _ => b.clone(), + }, + SubValueRelation::StrictSubValue { + field: fa, + factor: fac_a, + .. + } => match (*b.clone()).clone() { + SubValueRelation::SubValueUnknown => a.clone(), + SubValueRelation::PreservedValue => a.clone(), + SubValueRelation::StrictSubValue { + field: fb, + factor: fac_b, + .. + } => { + if inductive_field_eq(&fa, &fb) { + if shrink_factor_eq(fac_a.clone(), fac_b.clone()) { + Rc::new(SubValueRelation::StrictSubValue { + field: fa.clone(), + factor: fac_a.clone(), + }) + } else { + Rc::new(SubValueRelation::SubValueUnknown) + } + } else { + Rc::new(SubValueRelation::SubValueUnknown) + } + } + _ => Rc::new(SubValueRelation::SubValueUnknown), + }, + SubValueRelation::IteratedSubValue { field: fa, .. } => match (*b.clone()).clone() { + SubValueRelation::SubValueUnknown => a.clone(), + SubValueRelation::PreservedValue => a.clone(), + SubValueRelation::IteratedSubValue { field: fb, .. } => { + if inductive_field_eq(&fa, &fb) { + a.clone() + } else { + Rc::new(SubValueRelation::SubValueUnknown) + } + } + _ => Rc::new(SubValueRelation::SubValueUnknown), + }, + SubValueRelation::ArithmeticDescent { + param: pa, + factor: fac_a, + .. + } => match (*b.clone()).clone() { + SubValueRelation::SubValueUnknown => a.clone(), + SubValueRelation::PreservedValue => a.clone(), + SubValueRelation::ArithmeticDescent { + param: pb, + factor: fac_b, + .. + } => { + if (pa.clone().as_str() == pb.clone().as_str()) { + if shrink_factor_eq(fac_a.clone(), fac_b.clone()) { + Rc::new(SubValueRelation::ArithmeticDescent { + param: pa.clone(), + factor: fac_a.clone(), + }) + } else { + Rc::new(SubValueRelation::SubValueUnknown) + } + } else { + Rc::new(SubValueRelation::SubValueUnknown) + } + } + _ => Rc::new(SubValueRelation::SubValueUnknown), + }, + } } -pub fn compose_sub_value(base: Rc, field: Rc) -> Rc { +pub fn compose_sub_value( + base: Rc, + field: Rc, +) -> Rc { match (*base).clone() { - SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), - _ => Rc::new(SubValueRelation::StrictSubValue { - field: field, - factor: Rc::new(ShrinkFactor::UnitShrink), -}), -} + SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), + _ => Rc::new(SubValueRelation::StrictSubValue { + field: field, + factor: Rc::new(ShrinkFactor::UnitShrink), + }), + } } -pub fn compose_sub_value_relations(arg_rel: Rc, callee_rel: Rc) -> Rc { +pub fn compose_sub_value_relations( + arg_rel: Rc, + callee_rel: Rc, +) -> Rc { match (*callee_rel.clone()).clone() { - SubValueRelation::PreservedValue => arg_rel, - SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), - SubValueRelation::StrictSubValue { .. } => match (*arg_rel).clone() { - SubValueRelation::PreservedValue => callee_rel.clone(), - SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), - SubValueRelation::StrictSubValue { field: f, .. } => Rc::new(SubValueRelation::StrictSubValue { - field: f.clone(), - factor: Rc::new(ShrinkFactor::UnitShrink), -}), - SubValueRelation::IteratedSubValue { field: f, .. } => Rc::new(SubValueRelation::StrictSubValue { - field: f.clone(), - factor: Rc::new(ShrinkFactor::UnitShrink), -}), - SubValueRelation::ArithmeticDescent { .. } => Rc::new(SubValueRelation::SubValueUnknown), -}, - SubValueRelation::IteratedSubValue { .. } => match (*arg_rel).clone() { - SubValueRelation::PreservedValue => callee_rel.clone(), - SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), - SubValueRelation::StrictSubValue { field: f, .. } => Rc::new(SubValueRelation::StrictSubValue { - field: f.clone(), - factor: Rc::new(ShrinkFactor::UnitShrink), -}), - SubValueRelation::IteratedSubValue { field: f, .. } => Rc::new(SubValueRelation::StrictSubValue { - field: f.clone(), - factor: Rc::new(ShrinkFactor::UnitShrink), -}), - SubValueRelation::ArithmeticDescent { .. } => Rc::new(SubValueRelation::SubValueUnknown), -}, - SubValueRelation::ArithmeticDescent { param: p, factor: f, .. } => match (*arg_rel).clone() { - SubValueRelation::PreservedValue => Rc::new(SubValueRelation::ArithmeticDescent { - param: p.clone(), - factor: f.clone(), -}), - _ => Rc::new(SubValueRelation::SubValueUnknown), -}, -} + SubValueRelation::PreservedValue => arg_rel, + SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), + SubValueRelation::StrictSubValue { .. } => match (*arg_rel).clone() { + SubValueRelation::PreservedValue => callee_rel.clone(), + SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), + SubValueRelation::StrictSubValue { field: f, .. } => { + Rc::new(SubValueRelation::StrictSubValue { + field: f.clone(), + factor: Rc::new(ShrinkFactor::UnitShrink), + }) + } + SubValueRelation::IteratedSubValue { field: f, .. } => { + Rc::new(SubValueRelation::StrictSubValue { + field: f.clone(), + factor: Rc::new(ShrinkFactor::UnitShrink), + }) + } + SubValueRelation::ArithmeticDescent { .. } => { + Rc::new(SubValueRelation::SubValueUnknown) + } + }, + SubValueRelation::IteratedSubValue { .. } => match (*arg_rel).clone() { + SubValueRelation::PreservedValue => callee_rel.clone(), + SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), + SubValueRelation::StrictSubValue { field: f, .. } => { + Rc::new(SubValueRelation::StrictSubValue { + field: f.clone(), + factor: Rc::new(ShrinkFactor::UnitShrink), + }) + } + SubValueRelation::IteratedSubValue { field: f, .. } => { + Rc::new(SubValueRelation::StrictSubValue { + field: f.clone(), + factor: Rc::new(ShrinkFactor::UnitShrink), + }) + } + SubValueRelation::ArithmeticDescent { .. } => { + Rc::new(SubValueRelation::SubValueUnknown) + } + }, + SubValueRelation::ArithmeticDescent { + param: p, + factor: f, + .. + } => match (*arg_rel).clone() { + SubValueRelation::PreservedValue => Rc::new(SubValueRelation::ArithmeticDescent { + param: p.clone(), + factor: f.clone(), + }), + _ => Rc::new(SubValueRelation::SubValueUnknown), + }, + } } pub fn sub_value_to_call_pattern(relation: Rc) -> Option> { match (*relation).clone() { - SubValueRelation::StrictSubValue { field: f, .. } => Some(Rc::new(CallPattern::ChildAccessorCall { - accessor: f.field_name.clone(), -})), - SubValueRelation::IteratedSubValue { field: f, .. } => Some(Rc::new(CallPattern::ChildAccessorCall { - accessor: f.field_name.clone(), -})), - SubValueRelation::ArithmeticDescent { param: p, factor: f, .. } => match (*f.clone()).clone() { - ShrinkFactor::ConstantShrink { steps, .. } => Some(Rc::new(CallPattern::ArithmeticSubtractCall { - steps: steps.clone(), - ring_param: p.clone(), -})), - ShrinkFactor::ProportionalShrink { divisor: d, .. } => Some(Rc::new(CallPattern::ArithmeticDivideCall { - divisor: d.clone(), - ring_param: p.clone(), -})), - ShrinkFactor::UnitShrink => Some(Rc::new(CallPattern::ArithmeticSubtractCall { - steps: Rc::new(PositiveDescentAmount::OneStep), - ring_param: p.clone(), -})), -}, - SubValueRelation::PreservedValue => Some(Rc::new(CallPattern::SameArgumentCall)), - SubValueRelation::SubValueUnknown => None, -} + SubValueRelation::StrictSubValue { field: f, .. } => { + Some(Rc::new(CallPattern::ChildAccessorCall { + accessor: f.field_name.clone(), + })) + } + SubValueRelation::IteratedSubValue { field: f, .. } => { + Some(Rc::new(CallPattern::ChildAccessorCall { + accessor: f.field_name.clone(), + })) + } + SubValueRelation::ArithmeticDescent { + param: p, + factor: f, + .. + } => match (*f.clone()).clone() { + ShrinkFactor::ConstantShrink { steps, .. } => { + Some(Rc::new(CallPattern::ArithmeticSubtractCall { + steps: steps.clone(), + ring_param: p.clone(), + })) + } + ShrinkFactor::ProportionalShrink { divisor: d, .. } => { + Some(Rc::new(CallPattern::ArithmeticDivideCall { + divisor: d.clone(), + ring_param: p.clone(), + })) + } + ShrinkFactor::UnitShrink => Some(Rc::new(CallPattern::ArithmeticSubtractCall { + steps: Rc::new(PositiveDescentAmount::OneStep), + ring_param: p.clone(), + })), + }, + SubValueRelation::PreservedValue => Some(Rc::new(CallPattern::SameArgumentCall)), + SubValueRelation::SubValueUnknown => None, + } } pub fn sub_value_to_lowering_target(relation: Rc) -> Option> { match (*relation).clone() { - SubValueRelation::StrictSubValue { field: f, factor: fac, .. } => Some(Rc::new(LoweringTarget { - primitive: IterationPrimitive::Descend, - bound: tree_size_bound(f.field_name.clone()), - evidence: DescentEvidence::Strict, - factor: Some(fac.clone()), -})), - SubValueRelation::IteratedSubValue { field: f, .. } => Some(Rc::new(LoweringTarget { - primitive: IterationPrimitive::Fold, - bound: Rc::new(SizeBound::CollectionSize { - param: f.field_name.clone(), -}), - evidence: DescentEvidence::Strict, - factor: None, -})), - SubValueRelation::ArithmeticDescent { param: p, factor: fac, .. } => Some(Rc::new(LoweringTarget { - primitive: IterationPrimitive::Repeat, - bound: Rc::new(SizeBound::ArithmeticParam { - param: p.clone(), -}), - evidence: DescentEvidence::Strict, - factor: Some(fac.clone()), -})), - SubValueRelation::PreservedValue => Some(Rc::new(LoweringTarget { - primitive: IterationPrimitive::Repeat, - bound: Rc::new(SizeBound::Forever), - evidence: DescentEvidence::NonIncreasing, - factor: None, -})), - SubValueRelation::SubValueUnknown => None, -} + SubValueRelation::StrictSubValue { + field: f, + factor: fac, + .. + } => Some(Rc::new(LoweringTarget { + primitive: IterationPrimitive::Descend, + bound: tree_size_bound(f.field_name.clone()), + evidence: DescentEvidence::Strict, + factor: Some(fac.clone()), + })), + SubValueRelation::IteratedSubValue { field: f, .. } => Some(Rc::new(LoweringTarget { + primitive: IterationPrimitive::Fold, + bound: Rc::new(SizeBound::CollectionSize { + param: f.field_name.clone(), + }), + evidence: DescentEvidence::Strict, + factor: None, + })), + SubValueRelation::ArithmeticDescent { + param: p, + factor: fac, + .. + } => Some(Rc::new(LoweringTarget { + primitive: IterationPrimitive::Repeat, + bound: Rc::new(SizeBound::ArithmeticParam { param: p.clone() }), + evidence: DescentEvidence::Strict, + factor: Some(fac.clone()), + })), + SubValueRelation::PreservedValue => Some(Rc::new(LoweringTarget { + primitive: IterationPrimitive::Repeat, + bound: Rc::new(SizeBound::Forever), + evidence: DescentEvidence::NonIncreasing, + factor: None, + })), + SubValueRelation::SubValueUnknown => None, + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -367,8 +469,8 @@ pub enum PolynomialExponent { pub fn poly_exp_degree_one() -> Rc { Rc::new(PolynomialExponent::IntegerExpPos { - degree: Rc::new(PositiveDescentAmount::OneStep), -}) + degree: Rc::new(PositiveDescentAmount::OneStep), + }) } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -413,23 +515,23 @@ pub enum CostBound { pub fn sum_bound(terms: &Rc>>) -> Rc { match terms.clone().first().cloned() { - None => Rc::new(CostBound::ErrorBound), - Some(_) => Rc::new(CostBound::SumBound { - terms: terms.clone(), -}), -} + None => Rc::new(CostBound::ErrorBound), + Some(_) => Rc::new(CostBound::SumBound { + terms: terms.clone(), + }), + } } pub fn cost_bound_is_sum_bound(b: Rc) -> bool { match (*b).clone() { - CostBound::SumBound { .. } => true, - CostBound::ConstantBound => false, - CostBound::AtomicBound { .. } => false, - CostBound::ProductBound { .. } => false, - CostBound::SumOfProductsBound { .. } => false, - CostBound::ForeverBound => false, - CostBound::ErrorBound => false, -} + CostBound::SumBound { .. } => true, + CostBound::ConstantBound => false, + CostBound::AtomicBound { .. } => false, + CostBound::ProductBound { .. } => false, + CostBound::SumOfProductsBound { .. } => false, + CostBound::ForeverBound => false, + CostBound::ErrorBound => false, + } } pub fn cost_constant() -> Rc { @@ -438,11 +540,11 @@ pub fn cost_constant() -> Rc { pub fn cost_linear(param: String) -> Rc { Rc::new(CostBound::AtomicBound { - cost: Rc::new(AtomicCost::PolyCost { - param: param, - exponent: poly_exp_degree_one(), -}), -}) + cost: Rc::new(AtomicCost::PolyCost { + param: param, + exponent: poly_exp_degree_one(), + }), + }) } pub fn cost_poly(param: String, degree: i64) -> Rc { @@ -451,23 +553,23 @@ pub fn cost_poly(param: String, degree: i64) -> Rc { } else { if (degree.clone() == 0) { Rc::new(CostBound::AtomicBound { - cost: Rc::new(AtomicCost::PolyCost { - param: param, - exponent: Rc::new(PolynomialExponent::IntegerExpZero), -}), -}) + cost: Rc::new(AtomicCost::PolyCost { + param: param, + exponent: Rc::new(PolynomialExponent::IntegerExpZero), + }), + }) } else { match positive_descent_amount_from_positive_int(degree.clone()) { - Some(deg) => Rc::new(CostBound::AtomicBound { - cost: Rc::new(AtomicCost::PolyCost { - param: param, - exponent: Rc::new(PolynomialExponent::IntegerExpPos { - degree: deg.clone(), -}), -}), -}), - None => Rc::new(CostBound::ErrorBound), -} + Some(deg) => Rc::new(CostBound::AtomicBound { + cost: Rc::new(AtomicCost::PolyCost { + param: param, + exponent: Rc::new(PolynomialExponent::IntegerExpPos { + degree: deg.clone(), + }), + }), + }), + None => Rc::new(CostBound::ErrorBound), + } } } } @@ -477,17 +579,17 @@ pub fn cost_root(param: String, k: i64) -> Rc { Rc::new(CostBound::ErrorBound) } else { match positive_descent_amount_from_positive_int(k.clone()) { - Some(rw) => Rc::new(CostBound::AtomicBound { - cost: Rc::new(AtomicCost::PolyCost { - param: param, - exponent: Rc::new(PolynomialExponent::FractionExp { - numerator: Rc::new(PositiveDescentAmount::OneStep), - root: rw.clone(), -}), -}), -}), - None => Rc::new(CostBound::ErrorBound), -} + Some(rw) => Rc::new(CostBound::AtomicBound { + cost: Rc::new(AtomicCost::PolyCost { + param: param, + exponent: Rc::new(PolynomialExponent::FractionExp { + numerator: Rc::new(PositiveDescentAmount::OneStep), + root: rw.clone(), + }), + }), + }), + None => Rc::new(CostBound::ErrorBound), + } } } @@ -501,33 +603,37 @@ pub fn cost_cbrt(param: String) -> Rc { pub fn cost_log(param: String) -> Rc { Rc::new(CostBound::AtomicBound { - cost: Rc::new(AtomicCost::LogCost { - param: param, -}), -}) + cost: Rc::new(AtomicCost::LogCost { param: param }), + }) } pub fn cost_nlogn(param: &String) -> Rc { Rc::new(CostBound::ProductBound { - factors: Rc::new(vec![Rc::new(AtomicCost::PolyCost { - param: param.clone(), - exponent: poly_exp_degree_one(), -}), Rc::new(AtomicCost::LogCost { - param: param.clone(), -})]), -}) + factors: Rc::new(vec![ + Rc::new(AtomicCost::PolyCost { + param: param.clone(), + exponent: poly_exp_degree_one(), + }), + Rc::new(AtomicCost::LogCost { + param: param.clone(), + }), + ]), + }) } pub fn cost_graph_linear(v_param: String, e_param: String) -> Rc { Rc::new(CostBound::SumOfProductsBound { - terms: Rc::new(vec![Rc::new(vec![Rc::new(AtomicCost::PolyCost { - param: v_param, - exponent: poly_exp_degree_one(), -})]), Rc::new(vec![Rc::new(AtomicCost::PolyCost { - param: e_param, - exponent: poly_exp_degree_one(), -})])]), -}) + terms: Rc::new(vec![ + Rc::new(vec![Rc::new(AtomicCost::PolyCost { + param: v_param, + exponent: poly_exp_degree_one(), + })]), + Rc::new(vec![Rc::new(AtomicCost::PolyCost { + param: e_param, + exponent: poly_exp_degree_one(), + })]), + ]), + }) } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -619,41 +725,46 @@ pub fn bounded_int_pow_exponent(k: i64) -> Option { } pub fn int_pow_bounded(base: i64, exp: i64) -> Option { - stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - match bounded_int_pow_exponent(exp.clone()) { - None => None, - Some(e) => if (e.clone() == 0) { - Some(1) - } else { - if (base.clone() == 0) { - Some(0) - } else { - if (base.clone() == 1) { + stacker::maybe_grow( + 512 * 1024, + 2 * 1024 * 1024, + || match bounded_int_pow_exponent(exp.clone()) { + None => None, + Some(e) => { + if (e.clone() == 0) { Some(1) } else { - if (base.clone() == (0 - 1)) { - { - let half = (e.clone() / 2); -if ((half.clone() + half.clone()) == e.clone()) { - Some(1) + if (base.clone() == 0) { + Some(0) + } else { + if (base.clone() == 1) { + Some(1) + } else { + if (base.clone() == (0 - 1)) { + { + let half = (e.clone() / 2); + if ((half.clone() + half.clone()) == e.clone()) { + Some(1) + } else { + Some((0 - 1)) + } + } } else { - Some((0 - 1)) + match int_pow_bounded(base.clone(), (exp.clone() - 1)) { + Some(prev) => match int_mul_checked(base.clone(), prev.clone()) + { + Some(prod) => Some(prod.clone()), + None => None, + }, + None => None, + } } -} - } else { - match int_pow_bounded(base.clone(), (exp.clone() - 1)) { - Some(prev) => match int_mul_checked(base.clone(), prev.clone()) { - Some(prod) => Some(prod.clone()), - None => None, -}, - None => None, -} + } } } } }, -} - }) + ) } pub fn ceil_log(base: i64, argument: i64) -> Option { @@ -668,82 +779,97 @@ pub fn ceil_log_iter(mut base: i64, mut argument: i64, mut k: i64, mut power: i6 loop { if (power.clone() >= argument.clone()) { break Some(k); -} else { + } else { match int_mul_checked(power.clone(), base.clone()) { - None => { break None; }, - Some(next_power) => { match int_add_checked(k, 1) { - None => { break None; }, - Some(k1) => { { - let __tco_0 = k1.clone(); -let __tco_1 = next_power.clone(); -k = __tco_0; -power = __tco_1; -continue; -} }, -} }, -} -} -} + None => { + break None; + } + Some(next_power) => match int_add_checked(k, 1) { + None => { + break None; + } + Some(k1) => { + let __tco_0 = k1.clone(); + let __tco_1 = next_power.clone(); + k = __tco_0; + power = __tco_1; + continue; + } + }, + } + } + } } pub fn master_theorem(form: &Rc) -> Rc { { let a = form.branches.clone(); -let b = form.divisor.clone(); -let d = form.work_exponent.clone(); -let n = form.param.clone(); -if ((a.clone() < 1) || (b.clone() < 2)) { + let b = form.divisor.clone(); + let d = form.work_exponent.clone(); + let n = form.param.clone(); + if ((a.clone() < 1) || (b.clone() < 2)) { Rc::new(CostBound::ErrorBound) } else { match bounded_int_pow_exponent(d) { - None => Rc::new(CostBound::ErrorBound), - Some(d_ok) => match int_pow_bounded(b.clone(), d_ok.clone()) { - None => Rc::new(CostBound::ErrorBound), - Some(b_to_d) => if (a.clone() < b_to_d.clone()) { - match d_ok.clone() { - 0 => Rc::new(CostBound::ConstantBound), - _ => cost_poly(n.clone(), d_ok.clone()), -} - } else { - if (a.clone() == b_to_d.clone()) { - match d_ok.clone() { - 0 => cost_log(n.clone()), - _ => match positive_descent_amount_from_positive_int(d_ok.clone()) { - Some(deg) => Rc::new(CostBound::ProductBound { - factors: Rc::new(vec![Rc::new(AtomicCost::PolyCost { - param: n.clone(), - exponent: Rc::new(PolynomialExponent::IntegerExpPos { - degree: deg.clone(), -}), -}), Rc::new(AtomicCost::LogCost { - param: n.clone(), -})]), -}), - None => Rc::new(CostBound::ErrorBound), -}, -} - } else { - match proportional_divisor_from_int_at_least_two(b.clone()) { - Some(base_w) => match positive_descent_amount_from_positive_int(a.clone()) { - Some(arg_w) => Rc::new(CostBound::AtomicBound { - cost: Rc::new(AtomicCost::PolyCost { - param: n.clone(), - exponent: Rc::new(PolynomialExponent::LogBasedExp { - base: base_w.clone(), - argument: arg_w.clone(), -}), -}), -}), - None => Rc::new(CostBound::ErrorBound), -}, - None => Rc::new(CostBound::ErrorBound), -} - } - }, -}, -} + None => Rc::new(CostBound::ErrorBound), + Some(d_ok) => match int_pow_bounded(b.clone(), d_ok.clone()) { + None => Rc::new(CostBound::ErrorBound), + Some(b_to_d) => { + if (a.clone() < b_to_d.clone()) { + match d_ok.clone() { + 0 => Rc::new(CostBound::ConstantBound), + _ => cost_poly(n.clone(), d_ok.clone()), + } + } else { + if (a.clone() == b_to_d.clone()) { + match d_ok.clone() { + 0 => cost_log(n.clone()), + _ => match positive_descent_amount_from_positive_int( + d_ok.clone(), + ) { + Some(deg) => Rc::new(CostBound::ProductBound { + factors: Rc::new(vec![ + Rc::new(AtomicCost::PolyCost { + param: n.clone(), + exponent: Rc::new( + PolynomialExponent::IntegerExpPos { + degree: deg.clone(), + }, + ), + }), + Rc::new(AtomicCost::LogCost { param: n.clone() }), + ]), + }), + None => Rc::new(CostBound::ErrorBound), + }, + } + } else { + match proportional_divisor_from_int_at_least_two(b.clone()) { + Some(base_w) => { + match positive_descent_amount_from_positive_int(a.clone()) { + Some(arg_w) => Rc::new(CostBound::AtomicBound { + cost: Rc::new(AtomicCost::PolyCost { + param: n.clone(), + exponent: Rc::new( + PolynomialExponent::LogBasedExp { + base: base_w.clone(), + argument: arg_w.clone(), + }, + ), + }), + }), + None => Rc::new(CostBound::ErrorBound), + } + } + None => Rc::new(CostBound::ErrorBound), + } + } + } + } + }, + } } -} + } } pub fn catamorphism_bound(param: String, nesting_depth: i64) -> Rc { @@ -758,31 +884,42 @@ pub fn catamorphism_bound(param: String, nesting_depth: i64) -> Rc { } } -pub fn derive_bound(param: String, branches: i64, factor: Rc, work_exponent: i64) -> Rc { +pub fn derive_bound( + param: String, + branches: i64, + factor: Rc, + work_exponent: i64, +) -> Rc { if (branches.clone() < 1) { Rc::new(CostBound::ErrorBound) } else { match bounded_int_pow_exponent(work_exponent.clone()) { - None => Rc::new(CostBound::ErrorBound), - Some(_) => match (*factor).clone() { - ShrinkFactor::UnitShrink => if (branches.clone() <= 1) { - cost_linear(param) - } else { - Rc::new(CostBound::ForeverBound) - }, - ShrinkFactor::ConstantShrink { .. } => if (branches.clone() <= 1) { - cost_linear(param) - } else { - Rc::new(CostBound::ForeverBound) - }, - ShrinkFactor::ProportionalShrink { divisor: d, .. } => master_theorem(&Rc::new(RecurrenceForm { - param: param, - branches: branches.clone(), - divisor: proportional_divisor_to_int(d.clone()), - work_exponent: work_exponent.clone(), -})), -}, -} + None => Rc::new(CostBound::ErrorBound), + Some(_) => match (*factor).clone() { + ShrinkFactor::UnitShrink => { + if (branches.clone() <= 1) { + cost_linear(param) + } else { + Rc::new(CostBound::ForeverBound) + } + } + ShrinkFactor::ConstantShrink { .. } => { + if (branches.clone() <= 1) { + cost_linear(param) + } else { + Rc::new(CostBound::ForeverBound) + } + } + ShrinkFactor::ProportionalShrink { divisor: d, .. } => { + master_theorem(&Rc::new(RecurrenceForm { + param: param, + branches: branches.clone(), + divisor: proportional_divisor_to_int(d.clone()), + work_exponent: work_exponent.clone(), + })) + } + }, + } } } @@ -799,27 +936,47 @@ pub fn linear_scan_bound() -> Rc { } pub fn binary_search_bound() -> Rc { - derive_bound("xs".to_string(), 1, Rc::new(ShrinkFactor::ProportionalShrink { - divisor: Rc::new(ProportionalDivisor::DivideByTwo), -}), 0) + derive_bound( + "xs".to_string(), + 1, + Rc::new(ShrinkFactor::ProportionalShrink { + divisor: Rc::new(ProportionalDivisor::DivideByTwo), + }), + 0, + ) } pub fn mergesort_bound() -> Rc { - derive_bound("xs".to_string(), 2, Rc::new(ShrinkFactor::ProportionalShrink { - divisor: Rc::new(ProportionalDivisor::DivideByTwo), -}), 1) + derive_bound( + "xs".to_string(), + 2, + Rc::new(ShrinkFactor::ProportionalShrink { + divisor: Rc::new(ProportionalDivisor::DivideByTwo), + }), + 1, + ) } pub fn karatsuba_bound() -> Rc { - derive_bound("digits".to_string(), 3, Rc::new(ShrinkFactor::ProportionalShrink { - divisor: Rc::new(ProportionalDivisor::DivideByTwo), -}), 1) + derive_bound( + "digits".to_string(), + 3, + Rc::new(ShrinkFactor::ProportionalShrink { + divisor: Rc::new(ProportionalDivisor::DivideByTwo), + }), + 1, + ) } pub fn strassen_bound() -> Rc { - derive_bound("n".to_string(), 7, Rc::new(ShrinkFactor::ProportionalShrink { - divisor: Rc::new(ProportionalDivisor::DivideByTwo), -}), 2) + derive_bound( + "n".to_string(), + 7, + Rc::new(ShrinkFactor::ProportionalShrink { + divisor: Rc::new(ProportionalDivisor::DivideByTwo), + }), + 2, + ) } pub fn trial_division_bound() -> Rc { @@ -840,30 +997,42 @@ pub fn bfs_dfs_bound() -> Rc { pub fn dijkstra_bound() -> Rc { Rc::new(CostBound::SumOfProductsBound { - terms: Rc::new(vec![Rc::new(vec![Rc::new(AtomicCost::PolyCost { - param: "V".to_string(), - exponent: poly_exp_degree_one(), -}), Rc::new(AtomicCost::LogCost { - param: "V".to_string(), -})]), Rc::new(vec![Rc::new(AtomicCost::PolyCost { - param: "E".to_string(), - exponent: poly_exp_degree_one(), -}), Rc::new(AtomicCost::LogCost { - param: "V".to_string(), -})])]), -}) + terms: Rc::new(vec![ + Rc::new(vec![ + Rc::new(AtomicCost::PolyCost { + param: "V".to_string(), + exponent: poly_exp_degree_one(), + }), + Rc::new(AtomicCost::LogCost { + param: "V".to_string(), + }), + ]), + Rc::new(vec![ + Rc::new(AtomicCost::PolyCost { + param: "E".to_string(), + exponent: poly_exp_degree_one(), + }), + Rc::new(AtomicCost::LogCost { + param: "V".to_string(), + }), + ]), + ]), + }) } pub fn bellman_ford_bound() -> Rc { Rc::new(CostBound::ProductBound { - factors: Rc::new(vec![Rc::new(AtomicCost::PolyCost { - param: "V".to_string(), - exponent: poly_exp_degree_one(), -}), Rc::new(AtomicCost::PolyCost { - param: "E".to_string(), - exponent: poly_exp_degree_one(), -})]), -}) + factors: Rc::new(vec![ + Rc::new(AtomicCost::PolyCost { + param: "V".to_string(), + exponent: poly_exp_degree_one(), + }), + Rc::new(AtomicCost::PolyCost { + param: "E".to_string(), + exponent: poly_exp_degree_one(), + }), + ]), + }) } pub fn floyd_warshall_bound() -> Rc { diff --git a/src/v2/stage0/src/std_iteration.rs b/src/v2/stage0/src/std_iteration.rs index 044b21e8651..306aae0c49b 100644 --- a/src/v2/stage0/src/std_iteration.rs +++ b/src/v2/stage0/src/std_iteration.rs @@ -1,10 +1,8 @@ // Generated by v2 compiler -- do not edit. // Source module: std.iteration -use std::collections::HashMap; -use std::rc::Rc; use crate::v2_rt; -use crate::NonEmptyVec; use crate::NonEmptyBTreeSet; - - +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; diff --git a/src/v2/stage0/src/std_node.rs b/src/v2/stage0/src/std_node.rs index b388294735d..7837270511c 100644 --- a/src/v2/stage0/src/std_node.rs +++ b/src/v2/stage0/src/std_node.rs @@ -1,98 +1,100 @@ // Generated by v2 compiler -- do not edit. // Source module: std.node -use std::collections::HashMap; -use std::rc::Rc; +use crate::std_induction::RecursionShape::{ + DirectRecursion, ListRecursion, MapValueRecursion, OptionalRecursion, SetRecursion, +}; +pub use crate::std_induction::{InductiveField, RecursionShape}; use crate::v2_rt; -use crate::NonEmptyVec; use crate::NonEmptyBTreeSet; -pub use crate::std_induction::{InductiveField, RecursionShape}; -use crate::std_induction::RecursionShape::{DirectRecursion, ListRecursion, OptionalRecursion, SetRecursion, MapValueRecursion}; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; pub fn compiler_inductive_fields() -> Rc>> { thread_local! { - static CACHED: Rc>> = { - Rc::new(vec![Rc::new(InductiveField { - type_name: "Node".to_string(), - variant_name: "".to_string(), - field_name: "children".to_string(), - shape: RecursionShape::ListRecursion, - element_type: "Node".to_string(), -}), Rc::new(InductiveField { - type_name: "Node".to_string(), - variant_name: "".to_string(), - field_name: "params".to_string(), - shape: RecursionShape::ListRecursion, - element_type: "Node".to_string(), -}), Rc::new(InductiveField { - type_name: "Node".to_string(), - variant_name: "".to_string(), - field_name: "uses".to_string(), - shape: RecursionShape::ListRecursion, - element_type: "Node".to_string(), -}), Rc::new(InductiveField { - type_name: "Node".to_string(), - variant_name: "".to_string(), - field_name: "properties".to_string(), - shape: RecursionShape::ListRecursion, - element_type: "Node".to_string(), -}), Rc::new(InductiveField { - type_name: "Node".to_string(), - variant_name: "".to_string(), - field_name: "body".to_string(), - shape: RecursionShape::OptionalRecursion, - element_type: "Node".to_string(), -}), Rc::new(InductiveField { - type_name: "Node".to_string(), - variant_name: "".to_string(), - field_name: "transport".to_string(), - shape: RecursionShape::OptionalRecursion, - element_type: "Node".to_string(), -}), Rc::new(InductiveField { - type_name: "Node".to_string(), - variant_name: "".to_string(), - field_name: "type_annotation".to_string(), - shape: RecursionShape::OptionalRecursion, - element_type: "Node".to_string(), -}), Rc::new(InductiveField { - type_name: "Node".to_string(), - variant_name: "".to_string(), - field_name: "inferred".to_string(), - shape: RecursionShape::OptionalRecursion, - element_type: "InferredNode".to_string(), -}), Rc::new(InductiveField { - type_name: "InferredNode".to_string(), - variant_name: "Resolved".to_string(), - field_name: "node".to_string(), - shape: RecursionShape::DirectRecursion, - element_type: "Node".to_string(), -}), Rc::new(InductiveField { - type_name: "MatchPattern".to_string(), - variant_name: "VariantPattern".to_string(), - field_name: "field_bindings".to_string(), - shape: RecursionShape::ListRecursion, - element_type: "Node".to_string(), -}), Rc::new(InductiveField { - type_name: "MethodSemantics".to_string(), - variant_name: "AlgebraMethodSemantics".to_string(), - field_name: "method_def".to_string(), - shape: RecursionShape::DirectRecursion, - element_type: "Node".to_string(), -}), Rc::new(InductiveField { - type_name: "MethodSemantics".to_string(), - variant_name: "AlgebraMethodSemantics".to_string(), - field_name: "fold_accumulator_type".to_string(), - shape: RecursionShape::OptionalRecursion, - element_type: "Node".to_string(), -}), Rc::new(InductiveField { - type_name: "MethodSemantics".to_string(), - variant_name: "ServiceMethodSemantics".to_string(), - field_name: "op_params".to_string(), - shape: RecursionShape::ListRecursion, - element_type: "Node".to_string(), -})]) - }; - } + static CACHED: Rc>> = { + Rc::new(vec![Rc::new(InductiveField { + type_name: "Node".to_string(), + variant_name: "".to_string(), + field_name: "children".to_string(), + shape: RecursionShape::ListRecursion, + element_type: "Node".to_string(), + }), Rc::new(InductiveField { + type_name: "Node".to_string(), + variant_name: "".to_string(), + field_name: "params".to_string(), + shape: RecursionShape::ListRecursion, + element_type: "Node".to_string(), + }), Rc::new(InductiveField { + type_name: "Node".to_string(), + variant_name: "".to_string(), + field_name: "uses".to_string(), + shape: RecursionShape::ListRecursion, + element_type: "Node".to_string(), + }), Rc::new(InductiveField { + type_name: "Node".to_string(), + variant_name: "".to_string(), + field_name: "properties".to_string(), + shape: RecursionShape::ListRecursion, + element_type: "Node".to_string(), + }), Rc::new(InductiveField { + type_name: "Node".to_string(), + variant_name: "".to_string(), + field_name: "body".to_string(), + shape: RecursionShape::OptionalRecursion, + element_type: "Node".to_string(), + }), Rc::new(InductiveField { + type_name: "Node".to_string(), + variant_name: "".to_string(), + field_name: "transport".to_string(), + shape: RecursionShape::OptionalRecursion, + element_type: "Node".to_string(), + }), Rc::new(InductiveField { + type_name: "Node".to_string(), + variant_name: "".to_string(), + field_name: "type_annotation".to_string(), + shape: RecursionShape::OptionalRecursion, + element_type: "Node".to_string(), + }), Rc::new(InductiveField { + type_name: "Node".to_string(), + variant_name: "".to_string(), + field_name: "inferred".to_string(), + shape: RecursionShape::OptionalRecursion, + element_type: "InferredNode".to_string(), + }), Rc::new(InductiveField { + type_name: "InferredNode".to_string(), + variant_name: "Resolved".to_string(), + field_name: "node".to_string(), + shape: RecursionShape::DirectRecursion, + element_type: "Node".to_string(), + }), Rc::new(InductiveField { + type_name: "MatchPattern".to_string(), + variant_name: "VariantPattern".to_string(), + field_name: "field_bindings".to_string(), + shape: RecursionShape::ListRecursion, + element_type: "Node".to_string(), + }), Rc::new(InductiveField { + type_name: "MethodSemantics".to_string(), + variant_name: "AlgebraMethodSemantics".to_string(), + field_name: "method_def".to_string(), + shape: RecursionShape::DirectRecursion, + element_type: "Node".to_string(), + }), Rc::new(InductiveField { + type_name: "MethodSemantics".to_string(), + variant_name: "AlgebraMethodSemantics".to_string(), + field_name: "fold_accumulator_type".to_string(), + shape: RecursionShape::OptionalRecursion, + element_type: "Node".to_string(), + }), Rc::new(InductiveField { + type_name: "MethodSemantics".to_string(), + variant_name: "ServiceMethodSemantics".to_string(), + field_name: "op_params".to_string(), + shape: RecursionShape::ListRecursion, + element_type: "Node".to_string(), + })]) + }; + } CACHED.with(|c| c.clone()) } @@ -112,7 +114,7 @@ pub fn compiler_recursive_types() -> Rc> { pub fn is_compiler_recursive_type(name: String) -> bool { match v2_rt::map_get(&compiler_recursive_types(), name) { - Some(_) => true, - None => false, -} + Some(_) => true, + None => false, + } } diff --git a/src/v2/stage0/src/std_syntax.rs b/src/v2/stage0/src/std_syntax.rs index 80c4dd8193d..3f1dc19b430 100644 --- a/src/v2/stage0/src/std_syntax.rs +++ b/src/v2/stage0/src/std_syntax.rs @@ -1,16 +1,16 @@ // Generated by v2 compiler -- do not edit. // Source module: std.syntax -use std::collections::HashMap; -use std::rc::Rc; -use crate::v2_rt; -use crate::NonEmptyVec; -use crate::NonEmptyBTreeSet; +use self::AlgebraFieldKind::*; use self::BinOp::*; -use self::LiteralValue::*; use self::BodyKind::*; use self::ItemFormKind::*; -use self::AlgebraFieldKind::*; +use self::LiteralValue::*; +use crate::v2_rt; +use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; #[derive(Debug, Clone, Copy, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] @@ -34,18 +34,10 @@ pub enum BinOp { #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum LiteralValue { - LitStr { - value: String, - }, - LitInt { - value: i64, - }, - LitFloat { - value: String, - }, - LitBool { - value: bool, - }, + LitStr { value: String }, + LitInt { value: i64 }, + LitFloat { value: String }, + LitBool { value: bool }, LitNull, } @@ -105,34 +97,34 @@ pub struct AlgebraFieldEntry { pub fn algebra_field_entries() -> Rc>> { thread_local! { - static CACHED: Rc>> = { - Rc::new(vec![Rc::new(AlgebraFieldEntry { - kind: AlgebraFieldKind::AlgAdd, - field_name: "add".to_string(), -}), Rc::new(AlgebraFieldEntry { - kind: AlgebraFieldKind::AlgMul, - field_name: "mul".to_string(), -}), Rc::new(AlgebraFieldEntry { - kind: AlgebraFieldKind::AlgReciprocal, - field_name: "reciprocal".to_string(), -}), Rc::new(AlgebraFieldEntry { - kind: AlgebraFieldKind::AlgQuotient, - field_name: "quotient".to_string(), -}), Rc::new(AlgebraFieldEntry { - kind: AlgebraFieldKind::AlgRemainder, - field_name: "remainder".to_string(), -}), Rc::new(AlgebraFieldEntry { - kind: AlgebraFieldKind::AlgCompare, - field_name: "compare".to_string(), -}), Rc::new(AlgebraFieldEntry { - kind: AlgebraFieldKind::AlgMeet, - field_name: "meet".to_string(), -}), Rc::new(AlgebraFieldEntry { - kind: AlgebraFieldKind::AlgJoin, - field_name: "join".to_string(), -})]) - }; - } + static CACHED: Rc>> = { + Rc::new(vec![Rc::new(AlgebraFieldEntry { + kind: AlgebraFieldKind::AlgAdd, + field_name: "add".to_string(), + }), Rc::new(AlgebraFieldEntry { + kind: AlgebraFieldKind::AlgMul, + field_name: "mul".to_string(), + }), Rc::new(AlgebraFieldEntry { + kind: AlgebraFieldKind::AlgReciprocal, + field_name: "reciprocal".to_string(), + }), Rc::new(AlgebraFieldEntry { + kind: AlgebraFieldKind::AlgQuotient, + field_name: "quotient".to_string(), + }), Rc::new(AlgebraFieldEntry { + kind: AlgebraFieldKind::AlgRemainder, + field_name: "remainder".to_string(), + }), Rc::new(AlgebraFieldEntry { + kind: AlgebraFieldKind::AlgCompare, + field_name: "compare".to_string(), + }), Rc::new(AlgebraFieldEntry { + kind: AlgebraFieldKind::AlgMeet, + field_name: "meet".to_string(), + }), Rc::new(AlgebraFieldEntry { + kind: AlgebraFieldKind::AlgJoin, + field_name: "join".to_string(), + })]) + }; + } CACHED.with(|c| c.clone()) } diff --git a/src/v2/stage0/src/std_termination.rs b/src/v2/stage0/src/std_termination.rs index da94f5f3798..79bf0c81769 100644 --- a/src/v2/stage0/src/std_termination.rs +++ b/src/v2/stage0/src/std_termination.rs @@ -1,18 +1,18 @@ // Generated by v2 compiler -- do not edit. // Source module: std.termination -use std::collections::HashMap; -use std::rc::Rc; -use crate::v2_rt; -use crate::NonEmptyVec; -use crate::NonEmptyBTreeSet; -pub use crate::std_algebra::{Ordering}; -use crate::std_algebra::Ordering::*; use self::DescentEvidence::*; -use self::RankingDimension::*; +use self::DescentSource::*; use self::PositiveDescentAmount::*; use self::ProportionalDivisor::*; -use self::DescentSource::*; +use self::RankingDimension::*; +pub use crate::std_algebra::Ordering; +use crate::std_algebra::Ordering::*; +use crate::v2_rt; +use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; #[derive(Debug, Clone, Copy, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] @@ -24,82 +24,83 @@ pub enum DescentEvidence { pub fn evidence_rank(e: DescentEvidence) -> i64 { match e { - DescentEvidence::Strict => 2, - DescentEvidence::NonIncreasing => 1, - DescentEvidence::DescentUnknown => 0, -} + DescentEvidence::Strict => 2, + DescentEvidence::NonIncreasing => 1, + DescentEvidence::DescentUnknown => 0, + } } pub fn merge_evidence(a: DescentEvidence, b: DescentEvidence) -> DescentEvidence { match a { - DescentEvidence::Strict => match b { - DescentEvidence::Strict => DescentEvidence::Strict, - DescentEvidence::NonIncreasing => DescentEvidence::NonIncreasing, - _ => DescentEvidence::DescentUnknown, -}, - DescentEvidence::NonIncreasing => match b { - DescentEvidence::Strict => DescentEvidence::NonIncreasing, - DescentEvidence::NonIncreasing => DescentEvidence::NonIncreasing, - _ => DescentEvidence::DescentUnknown, -}, - _ => DescentEvidence::DescentUnknown, -} + DescentEvidence::Strict => match b { + DescentEvidence::Strict => DescentEvidence::Strict, + DescentEvidence::NonIncreasing => DescentEvidence::NonIncreasing, + _ => DescentEvidence::DescentUnknown, + }, + DescentEvidence::NonIncreasing => match b { + DescentEvidence::Strict => DescentEvidence::NonIncreasing, + DescentEvidence::NonIncreasing => DescentEvidence::NonIncreasing, + _ => DescentEvidence::DescentUnknown, + }, + _ => DescentEvidence::DescentUnknown, + } } pub fn join_evidence(a: DescentEvidence, b: DescentEvidence) -> DescentEvidence { match a { - DescentEvidence::DescentUnknown => b, - DescentEvidence::NonIncreasing => match b { - DescentEvidence::Strict => DescentEvidence::Strict, - _ => DescentEvidence::NonIncreasing, -}, - DescentEvidence::Strict => DescentEvidence::Strict, -} + DescentEvidence::DescentUnknown => b, + DescentEvidence::NonIncreasing => match b { + DescentEvidence::Strict => DescentEvidence::Strict, + _ => DescentEvidence::NonIncreasing, + }, + DescentEvidence::Strict => DescentEvidence::Strict, + } } pub fn promote_to_strict(evidence: DescentEvidence) -> DescentEvidence { match evidence { - DescentEvidence::NonIncreasing => DescentEvidence::NonIncreasing, - DescentEvidence::Strict => DescentEvidence::Strict, - _ => DescentEvidence::DescentUnknown, -} + DescentEvidence::NonIncreasing => DescentEvidence::NonIncreasing, + DescentEvidence::Strict => DescentEvidence::Strict, + _ => DescentEvidence::DescentUnknown, + } } -pub fn optional_evidence_meet(a: Option, b: Option) -> Option { +pub fn optional_evidence_meet( + a: Option, + b: Option, +) -> Option { match a.clone() { - None => b, - Some(va) => match b { - None => a.clone(), - Some(vb) => Some(merge_evidence(va.clone(), vb.clone())), -}, -} + None => b, + Some(va) => match b { + None => a.clone(), + Some(vb) => Some(merge_evidence(va.clone(), vb.clone())), + }, + } } -pub fn map_evidence_merge_at(base: &Rc>, key: &String, new_val: DescentEvidence) -> Rc> { +pub fn map_evidence_merge_at( + base: &Rc>, + key: &String, + new_val: DescentEvidence, +) -> Rc> { match v2_rt::map_get(&base, key.clone()) { - Some(existing) => v2_rt::rc_map_insert(base.clone(), key.clone(), merge_evidence(existing.clone(), new_val)), - None => v2_rt::rc_map_insert(base.clone(), key.clone(), new_val), -} + Some(existing) => v2_rt::rc_map_insert( + base.clone(), + key.clone(), + merge_evidence(existing.clone(), new_val), + ), + None => v2_rt::rc_map_insert(base.clone(), key.clone(), new_val), + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum RankingDimension { - TreeSize { - param: String, - }, - ListLength { - param: String, - }, - ArithmeticValue { - param: String, - }, - TokenPosition { - param: String, - }, - SetCardinality { - param: String, - }, + TreeSize { param: String }, + ListLength { param: String }, + ArithmeticValue { param: String }, + TokenPosition { param: String }, + SetCardinality { param: String }, } impl RankingDimension { pub fn param(&self) -> String { @@ -117,15 +118,15 @@ impl RankingDimension { #[serde(tag = "_variant")] pub enum PositiveDescentAmount { OneStep, - AdditionalStep { - previous: Rc, - }, + AdditionalStep { previous: Rc }, } impl PositiveDescentAmount { pub fn previous(&self) -> Rc { match self { PositiveDescentAmount::OneStep => panic!("no previous on unit variant"), - PositiveDescentAmount::AdditionalStep { previous: __val, .. } => __val.clone(), + PositiveDescentAmount::AdditionalStep { + previous: __val, .. + } => __val.clone(), } } } @@ -134,9 +135,7 @@ impl PositiveDescentAmount { #[serde(tag = "_variant")] pub enum ProportionalDivisor { DivideByTwo, - StrictlyLarger { - inner: Rc, - }, + StrictlyLarger { inner: Rc }, } impl ProportionalDivisor { pub fn inner(&self) -> Rc { @@ -148,11 +147,11 @@ impl ProportionalDivisor { } pub fn proportional_divisor_to_int(d: Rc) -> i64 { - stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - match (*d).clone() { - ProportionalDivisor::DivideByTwo => 2, - ProportionalDivisor::StrictlyLarger { inner: p, .. } => (1 + proportional_divisor_to_int(p.clone())), -} + stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || match (*d).clone() { + ProportionalDivisor::DivideByTwo => 2, + ProportionalDivisor::StrictlyLarger { inner: p, .. } => { + (1 + proportional_divisor_to_int(p.clone())) + } }) } @@ -172,11 +171,11 @@ pub fn positive_descent_amount_from_positive_int(k: i64) -> Option Some(Rc::new(PositiveDescentAmount::AdditionalStep { - previous: prev.clone(), -})), - None => None, -} + Some(prev) => Some(Rc::new(PositiveDescentAmount::AdditionalStep { + previous: prev.clone(), + })), + None => None, + } } } } @@ -195,11 +194,11 @@ pub fn proportional_divisor_from_int_at_least_two(k: i64) -> Option Some(Rc::new(ProportionalDivisor::StrictlyLarger { - inner: prev.clone(), -})), - None => None, -} + Some(prev) => Some(Rc::new(ProportionalDivisor::StrictlyLarger { + inner: prev.clone(), + })), + None => None, + } } } } @@ -209,24 +208,12 @@ pub fn proportional_divisor_from_int_at_least_two(k: i64) -> Option, - }, - ArithmeticSubtractDescent { - steps: Rc, - }, - ArithmeticDivideDescent { - divisor: Rc, - }, - ParserAdvance { - witness: String, - }, - SetRemoval { - element: String, - }, + ChildAccessor { accessor: String }, + ListShrink { amount: Rc }, + ArithmeticSubtractDescent { steps: Rc }, + ArithmeticDivideDescent { divisor: Rc }, + ParserAdvance { witness: String }, + SetRemoval { element: String }, FoldIteration, } diff --git a/src/v2/stage0/src/std_types.rs b/src/v2/stage0/src/std_types.rs index a80d4ad6e37..6a2e4dea177 100644 --- a/src/v2/stage0/src/std_types.rs +++ b/src/v2/stage0/src/std_types.rs @@ -1,28 +1,30 @@ // Generated by v2 compiler -- do not edit. // Source module: std.types -use std::collections::HashMap; -use std::rc::Rc; -use crate::v2_rt; -use crate::NonEmptyVec; -use crate::NonEmptyBTreeSet; -pub use crate::std_algebra::{BooleanAlgebra, FreeMonoid, PartialFunction, kernel_algebra_profile, algebra_type_param_names}; +use self::AbiEnv::*; +use self::Arch::*; +use self::AuthScheme::*; use self::Bool::*; -use self::Platform::*; -use self::TopologyNodeKind::*; +use self::CodegenBackend::*; +use self::CredentialFlow::*; use self::DocSourceKind::*; +use self::EntryKind::*; +use self::ExecutionEnv::*; use self::FermiDepth::*; -use self::CredentialFlow::*; -use self::Arch::*; -use self::Vendor::*; +use self::HttpMethod::*; use self::Os::*; -use self::AbiEnv::*; -use self::ExecutionEnv::*; -use self::EntryKind::*; +use self::Platform::*; use self::SymlinkTarget::*; -use self::HttpMethod::*; -use self::AuthScheme::*; -use self::CodegenBackend::*; +use self::TopologyNodeKind::*; +use self::Vendor::*; +pub use crate::std_algebra::{ + algebra_type_param_names, kernel_algebra_profile, BooleanAlgebra, FreeMonoid, PartialFunction, +}; +use crate::v2_rt; +use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; pub fn kernel_type_set() -> Rc> { thread_local! { @@ -44,9 +46,9 @@ pub fn kernel_type_set() -> Rc> { pub fn is_kernel_type(name: String) -> bool { match v2_rt::map_get(&kernel_type_set(), name) { - Some(_) => true, - None => false, -} + Some(_) => true, + None => false, + } } pub fn container_type_arity() -> Rc> { @@ -64,9 +66,9 @@ pub fn container_type_arity() -> Rc> { pub fn is_container_type(name: String) -> bool { match container_expected_arity(name) { - Some(_) => true, - None => false, -} + Some(_) => true, + None => false, + } } pub fn container_expected_arity(name: String) -> Option { @@ -75,19 +77,49 @@ pub fn container_expected_arity(name: String) -> Option { pub fn container_param_names_for(kind_name: String) -> Rc> { match v2_rt::map_get(&kernel_algebra_profile(), kind_name) { - Some(p) => algebra_type_param_names(p.clone()), - None => Rc::new(vec![]), -} + Some(p) => algebra_type_param_names(p.clone()), + None => Rc::new(vec![]), + } } pub fn container_param_name(kind_name: String, index: i64) -> Option { { let names = container_param_names_for(kind_name); -match Rc::new({ let mut __result = Vec::new(); for pair in Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(names.iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { if (pair.0.clone() == index.clone()) { __result.push(pair); } } __result }).iter().cloned() { __result.push(pair.1.clone()); } __result }).first().cloned() { - Some(name) => Some(name.clone()), - None => None, -} -} + match Rc::new({ + let mut __result = Vec::new(); + for pair in Rc::new({ + let mut __result = Vec::new(); + for pair in Rc::new( + names + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + { + if (pair.0.clone() == index.clone()) { + __result.push(pair); + } + } + __result + }) + .iter() + .cloned() + { + __result.push(pair.1.clone()); + } + __result + }) + .first() + .cloned() + { + Some(name) => Some(name.clone()), + None => None, + } + } } pub fn ordered_element_collections() -> Rc> { @@ -132,7 +164,14 @@ pub fn container_template_algebra(name: String) -> Option { } pub fn canonical_container_names() -> Rc> { - Rc::new(vec!["BooleanAlgebra".to_string(), "FreeMonoid".to_string(), "List".to_string(), "Map".to_string(), "PartialFunction".to_string(), "Set".to_string()]) + Rc::new(vec![ + "BooleanAlgebra".to_string(), + "FreeMonoid".to_string(), + "List".to_string(), + "Map".to_string(), + "PartialFunction".to_string(), + "Set".to_string(), + ]) } #[derive(Debug, Clone, Copy, PartialEq, serde::Serialize, serde::Deserialize)] @@ -142,20 +181,12 @@ pub enum Bool { False, } - - pub type Json = serde_json::Value; pub type Bytes = Vec; pub type Char = i64; - - - - - - pub type CommitSha = String; pub type Sha256 = String; @@ -417,12 +448,8 @@ pub enum HttpMethod { #[serde(tag = "_variant")] pub enum AuthScheme { Bearer, - Header { - name: String, - }, - Basic { - username: String, - }, + Header { name: String }, + Basic { username: String }, ApiKey, } diff --git a/src/v2/stage0/src/v2_compiler_artifact.rs b/src/v2/stage0/src/v2_compiler_artifact.rs index 75e6b639642..d2e80ac7366 100644 --- a/src/v2/stage0/src/v2_compiler_artifact.rs +++ b/src/v2/stage0/src/v2_compiler_artifact.rs @@ -1,16 +1,16 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.artifact -use std::collections::HashMap; -use std::rc::Rc; -use crate::v2_rt; -use crate::NonEmptyVec; -use crate::NonEmptyBTreeSet; -pub use crate::v2_std_core::{TextFile}; -use self::RenderTarget::*; use self::ArtifactKind::*; use self::BoundaryKind::*; use self::PartitionRule::*; +use self::RenderTarget::*; +use crate::v2_rt; +pub use crate::v2_std_core::TextFile; +use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; #[derive(Debug, Clone, Copy, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] @@ -66,25 +66,27 @@ pub struct ArtifactPlan { #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum PartitionRule { - Explicit { - artifacts: Rc>>, - }, + Explicit { artifacts: Rc>> }, } impl PartitionRule { pub fn artifacts(&self) -> Rc>> { match self { - PartitionRule::Explicit { artifacts: __val, .. } => __val.clone(), + PartitionRule::Explicit { + artifacts: __val, .. + } => __val.clone(), } } } pub fn plan_artifacts(rule: Rc) -> Rc { match (*rule).clone() { - PartitionRule::Explicit { artifacts: arts, .. } => Rc::new(ArtifactPlan { - artifacts: arts.clone(), - boundaries: Rc::new(vec![]), -}), -} + PartitionRule::Explicit { + artifacts: arts, .. + } => Rc::new(ArtifactPlan { + artifacts: arts.clone(), + boundaries: Rc::new(vec![]), + }), + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -93,14 +95,17 @@ pub struct ArtifactOutput { pub files: Rc>>, } -pub fn default_artifact_plan(root_modules: Rc>, target: RenderTarget) -> Rc { +pub fn default_artifact_plan( + root_modules: Rc>, + target: RenderTarget, +) -> Rc { plan_artifacts(Rc::new(PartitionRule::Explicit { - artifacts: Rc::new(vec![Rc::new(Artifact { - name: "default".to_string(), - kind: ArtifactKind::ServiceBinary, - target: target, - entry_modules: root_modules, - dependencies: Rc::new(vec![]), -})]), -})) + artifacts: Rc::new(vec![Rc::new(Artifact { + name: "default".to_string(), + kind: ArtifactKind::ServiceBinary, + target: target, + entry_modules: root_modules, + dependencies: Rc::new(vec![]), + })]), + })) } diff --git a/src/v2/stage0/src/v2_compiler_coercion.rs b/src/v2/stage0/src/v2_compiler_coercion.rs index e145655eaf9..c803d00b647 100644 --- a/src/v2/stage0/src/v2_compiler_coercion.rs +++ b/src/v2/stage0/src/v2_compiler_coercion.rs @@ -1,131 +1,174 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.coercion -use std::collections::HashMap; -use std::rc::Rc; +use self::CoercionAssertion::*; +pub use crate::extdeps_languages_dag_types::dag_type_checkpoints; +pub use crate::extdeps_languages_go_types::{ + go_algebra_inhabitants, go_callable, go_cast_syntax, go_optional_template, go_type_checkpoints, +}; +pub use crate::extdeps_languages_python_types::{ + python_algebra_inhabitants, python_callable, python_cast_syntax, python_optional_template, + python_type_checkpoints, +}; +pub use crate::extdeps_languages_rust_types::{ + rust_algebra_inhabitants, rust_callable, rust_cast_syntax, rust_optional_template, + rust_type_checkpoints, +}; +pub use crate::std_coercion::{CallableRepr, CastSyntax, InhabitantDecl, TypeCheckpoint}; +pub use crate::std_types::{canonical_container_names, container_template_algebra}; +pub use crate::v2_compiler_artifact::RenderTarget; +use crate::v2_compiler_artifact::RenderTarget::{Dag, Go, Python, Rust}; use crate::v2_rt; -use crate::NonEmptyVec; use crate::NonEmptyBTreeSet; -pub use crate::v2_compiler_artifact::{RenderTarget}; -use crate::v2_compiler_artifact::RenderTarget::{Rust, Python, Go, Dag}; -pub use crate::std_coercion::{TypeCheckpoint, InhabitantDecl, CallableRepr, CastSyntax}; -pub use crate::std_types::{container_template_algebra, canonical_container_names}; -pub use crate::extdeps_languages_rust_types::{rust_type_checkpoints, rust_algebra_inhabitants, rust_callable, rust_optional_template, rust_cast_syntax}; -pub use crate::extdeps_languages_python_types::{python_type_checkpoints, python_algebra_inhabitants, python_callable, python_optional_template, python_cast_syntax}; -pub use crate::extdeps_languages_go_types::{go_type_checkpoints, go_algebra_inhabitants, go_callable, go_optional_template, go_cast_syntax}; -pub use crate::extdeps_languages_dag_types::{dag_type_checkpoints}; -use self::CoercionAssertion::*; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; pub fn target_checkpoints(target: RenderTarget) -> Rc>> { match target { - RenderTarget::Rust => rust_type_checkpoints(), - RenderTarget::Python => python_type_checkpoints(), - RenderTarget::Go => go_type_checkpoints(), - RenderTarget::Dag => dag_type_checkpoints(), -} + RenderTarget::Rust => rust_type_checkpoints(), + RenderTarget::Python => python_type_checkpoints(), + RenderTarget::Go => go_type_checkpoints(), + RenderTarget::Dag => dag_type_checkpoints(), + } } pub fn target_inhabitants(target: RenderTarget) -> Rc>> { match target { - RenderTarget::Rust => rust_algebra_inhabitants(), - RenderTarget::Python => python_algebra_inhabitants(), - RenderTarget::Go => go_algebra_inhabitants(), - RenderTarget::Dag => Rc::new(vec![]), -} + RenderTarget::Rust => rust_algebra_inhabitants(), + RenderTarget::Python => python_algebra_inhabitants(), + RenderTarget::Go => go_algebra_inhabitants(), + RenderTarget::Dag => Rc::new(vec![]), + } } pub fn target_callable(target: RenderTarget) -> Rc { match target { - RenderTarget::Rust => rust_callable(), - RenderTarget::Python => python_callable(), - RenderTarget::Go => go_callable(), - RenderTarget::Dag => Rc::new(CallableRepr { - template: "fn({params}) -> {return}".to_string(), - param_separator: ", ".to_string(), - return_separator: " -> ".to_string(), - import_path: None, -}), -} + RenderTarget::Rust => rust_callable(), + RenderTarget::Python => python_callable(), + RenderTarget::Go => go_callable(), + RenderTarget::Dag => Rc::new(CallableRepr { + template: "fn({params}) -> {return}".to_string(), + param_separator: ", ".to_string(), + return_separator: " -> ".to_string(), + import_path: None, + }), + } } pub fn target_optional_template(target: RenderTarget) -> String { match target { - RenderTarget::Rust => rust_optional_template(), - RenderTarget::Python => python_optional_template(), - RenderTarget::Go => go_optional_template(), - RenderTarget::Dag => "{0}?".to_string(), -} + RenderTarget::Rust => rust_optional_template(), + RenderTarget::Python => python_optional_template(), + RenderTarget::Go => go_optional_template(), + RenderTarget::Dag => "{0}?".to_string(), + } } pub fn target_cast_syntax(target: RenderTarget) -> Option> { match target { - RenderTarget::Rust => Some(rust_cast_syntax()), - RenderTarget::Python => Some(python_cast_syntax()), - RenderTarget::Go => Some(go_cast_syntax()), - RenderTarget::Dag => None, -} + RenderTarget::Rust => Some(rust_cast_syntax()), + RenderTarget::Python => Some(python_cast_syntax()), + RenderTarget::Go => Some(go_cast_syntax()), + RenderTarget::Dag => None, + } } pub fn can_cast(target: RenderTarget, source_type: String, target_type: String) -> bool { match target_cast_syntax(target) { - Some(syntax) => { let mut __found = false; for r in syntax.cast_rules.clone().iter().cloned() { if ((r.from_type.clone().as_str() == source_type.clone().as_str()) && (r.to_type.clone().as_str() == target_type.clone().as_str())) { __found = true; break; } } __found }, - None => false, -} + Some(syntax) => { + let mut __found = false; + for r in syntax.cast_rules.clone().iter().cloned() { + if ((r.from_type.clone().as_str() == source_type.clone().as_str()) + && (r.to_type.clone().as_str() == target_type.clone().as_str())) + { + __found = true; + break; + } + } + __found + } + None => false, + } } pub fn render_cast(expr_str: String, type_str: String, target: RenderTarget) -> String { { let syntax = match target_cast_syntax(target) { - Some(s) => s.clone(), - None => Rc::new(CastSyntax { - template: "{expr}".to_string(), - cast_rules: Rc::new(vec![]), -}), -}; -v2_rt::replace(v2_rt::replace(syntax.template.clone(), "{expr}".to_string(), expr_str), "{type}".to_string(), type_str) -} + Some(s) => s.clone(), + None => Rc::new(CastSyntax { + template: "{expr}".to_string(), + cast_rules: Rc::new(vec![]), + }), + }; + v2_rt::replace( + v2_rt::replace(syntax.template.clone(), "{expr}".to_string(), expr_str), + "{type}".to_string(), + type_str, + ) + } } pub fn lookup_checkpoint(target: RenderTarget, dag_name: String) -> Option> { - Rc::new({ let mut __result = Vec::new(); for cp in target_checkpoints(target).iter().cloned() { if (cp.dag_name.clone().as_str() == dag_name.clone().as_str()) { __result.push(cp); } } __result }).first().cloned() + Rc::new({ + let mut __result = Vec::new(); + for cp in target_checkpoints(target).iter().cloned() { + if (cp.dag_name.clone().as_str() == dag_name.clone().as_str()) { + __result.push(cp); + } + } + __result + }) + .first() + .cloned() } pub fn coerce_primitive_type(target: RenderTarget, dag_name: String) -> String { match lookup_checkpoint(target, dag_name.clone()) { - Some(cp) => cp.target_type.clone(), - None => dag_name.clone(), -} + Some(cp) => cp.target_type.clone(), + None => dag_name.clone(), + } } pub fn is_copy(target: RenderTarget, dag_name: String) -> Option { match lookup_checkpoint(target, dag_name) { - Some(cp) => cp.is_copy.clone(), - None => None, -} + Some(cp) => cp.is_copy.clone(), + None => None, + } } pub fn literal_suffix(target: RenderTarget, dag_name: String) -> Option { match lookup_checkpoint(target, dag_name) { - Some(cp) => match cp.literal_suffix.clone() { - Some(s) => Some(s.clone()), - None => Some("".to_string()), -}, - None => None, -} + Some(cp) => match cp.literal_suffix.clone() { + Some(s) => Some(s.clone()), + None => Some("".to_string()), + }, + None => None, + } } pub fn lookup_inhabitant(target: RenderTarget, algebra: String) -> Option> { - Rc::new({ let mut __result = Vec::new(); for inh in target_inhabitants(target).iter().cloned() { if (inh.algebra.clone().as_str() == algebra.clone().as_str()) { __result.push(inh); } } __result }).first().cloned() + Rc::new({ + let mut __result = Vec::new(); + for inh in target_inhabitants(target).iter().cloned() { + if (inh.algebra.clone().as_str() == algebra.clone().as_str()) { + __result.push(inh); + } + } + __result + }) + .first() + .cloned() } pub fn coerce_container_template(target: RenderTarget, container_name: String) -> Option { match container_template_algebra(container_name) { - Some(algebra) => match lookup_inhabitant(target, algebra.clone()) { - Some(inh) => Some(inh.template.clone()), - None => None, -}, - None => None, -} + Some(algebra) => match lookup_inhabitant(target, algebra.clone()) { + Some(inh) => Some(inh.template.clone()), + None => None, + }, + None => None, + } } pub fn apply_inhabitant_template1(template: String, inner: String) -> String { @@ -133,7 +176,11 @@ pub fn apply_inhabitant_template1(template: String, inner: String) -> String { } pub fn apply_inhabitant_template2(template: String, first: String, second: String) -> String { - v2_rt::replace(v2_rt::replace(template, "{0}".to_string(), first), "{1}".to_string(), second) + v2_rt::replace( + v2_rt::replace(template, "{0}".to_string(), first), + "{1}".to_string(), + second, + ) } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -169,30 +216,39 @@ pub struct CoercionTestEntry { pub fn target_label(target: RenderTarget) -> String { match target { - RenderTarget::Rust => "rust".to_string(), - RenderTarget::Python => "python".to_string(), - RenderTarget::Go => "go".to_string(), - RenderTarget::Dag => "dag".to_string(), -} + RenderTarget::Rust => "rust".to_string(), + RenderTarget::Python => "python".to_string(), + RenderTarget::Go => "go".to_string(), + RenderTarget::Dag => "dag".to_string(), + } } pub fn checkpoint_tests(target: &RenderTarget) -> Rc>> { { let label = target_label(target.clone()); -let cps = target_checkpoints(target.clone()); -if ((cps.clone().len() as i64) == 0) { + let cps = target_checkpoints(target.clone()); + if ((cps.clone().len() as i64) == 0) { Rc::new(vec![]) } else { Rc::new(vec![Rc::new(CoercionTestEntry { - test_name: v2_rt::concat(v2_rt::concat("coercion_".to_string(), label), "_checkpoint_resolves_primitives".to_string()), - assertions: Rc::new({ let mut __result = Vec::new(); for cp in cps.clone().iter().cloned() { __result.push(Rc::new(CoercionAssertion::CheckpointAssertion { - target: target.clone(), - dag_name: cp.dag_name.clone(), - expected_type: cp.target_type.clone(), -})); } __result }), -})]) + test_name: v2_rt::concat( + v2_rt::concat("coercion_".to_string(), label), + "_checkpoint_resolves_primitives".to_string(), + ), + assertions: Rc::new({ + let mut __result = Vec::new(); + for cp in cps.clone().iter().cloned() { + __result.push(Rc::new(CoercionAssertion::CheckpointAssertion { + target: target.clone(), + dag_name: cp.dag_name.clone(), + expected_type: cp.target_type.clone(), + })); + } + __result + }), + })]) } -} + } } pub fn inhabitant_test_names() -> Rc> { @@ -202,89 +258,173 @@ pub fn inhabitant_test_names() -> Rc> { pub fn inhabitant_tests(target: &RenderTarget) -> Rc>> { { let label = target_label(target.clone()); -let assertions = Rc::new({ let mut __result = Vec::new(); for name in inhabitant_test_names().iter().cloned() { __result.extend((*match coerce_container_template(target.clone(), name.clone()) { - Some(tmpl) => Rc::new(vec![Rc::new(CoercionAssertion::ContainerAssertion { - target: target.clone(), - container_name: name.clone(), - expected_template: tmpl.clone(), -})]), - None => Rc::new(vec![]), -}).iter().cloned()); } __result }); -if ((assertions.clone().len() as i64) == 0) { + let assertions = Rc::new({ + let mut __result = Vec::new(); + for name in inhabitant_test_names().iter().cloned() { + __result.extend( + (*match coerce_container_template(target.clone(), name.clone()) { + Some(tmpl) => { + Rc::new(vec![Rc::new(CoercionAssertion::ContainerAssertion { + target: target.clone(), + container_name: name.clone(), + expected_template: tmpl.clone(), + })]) + } + None => Rc::new(vec![]), + }) + .iter() + .cloned(), + ); + } + __result + }); + if ((assertions.clone().len() as i64) == 0) { Rc::new(vec![]) } else { Rc::new(vec![Rc::new(CoercionTestEntry { - test_name: v2_rt::concat(v2_rt::concat("coercion_".to_string(), label), "_inhabitant_resolves_containers".to_string()), - assertions: assertions.clone(), -})]) + test_name: v2_rt::concat( + v2_rt::concat("coercion_".to_string(), label), + "_inhabitant_resolves_containers".to_string(), + ), + assertions: assertions.clone(), + })]) } -} + } } pub fn copy_tests() -> Rc>> { { let cps = target_checkpoints(RenderTarget::Rust); -let copy_assertions = Rc::new({ let mut __result = Vec::new(); for cp in cps.iter().cloned() { __result.extend((*match cp.is_copy.clone() { - Some(v) => Rc::new(vec![Rc::new(CoercionAssertion::CopyAssertion { - target: RenderTarget::Rust, - dag_name: cp.dag_name.clone(), - expected_copy: v.clone(), -})]), - None => Rc::new(vec![]), -}).iter().cloned()); } __result }); -if ((copy_assertions.clone().len() as i64) == 0) { + let copy_assertions = Rc::new({ + let mut __result = Vec::new(); + for cp in cps.iter().cloned() { + __result.extend( + (*match cp.is_copy.clone() { + Some(v) => Rc::new(vec![Rc::new(CoercionAssertion::CopyAssertion { + target: RenderTarget::Rust, + dag_name: cp.dag_name.clone(), + expected_copy: v.clone(), + })]), + None => Rc::new(vec![]), + }) + .iter() + .cloned(), + ); + } + __result + }); + if ((copy_assertions.clone().len() as i64) == 0) { Rc::new(vec![]) } else { Rc::new(vec![Rc::new(CoercionTestEntry { - test_name: "coercion_is_copy_from_checkpoint".to_string(), - assertions: copy_assertions.clone(), -})]) + test_name: "coercion_is_copy_from_checkpoint".to_string(), + assertions: copy_assertions.clone(), + })]) } -} + } } pub fn template_application_tests() -> Rc>> { { - let targets = Rc::new(vec![RenderTarget::Rust, RenderTarget::Python, RenderTarget::Go]); -let assertions = Rc::new({ let mut __result = Vec::new(); for t in targets.iter().cloned() { __result.extend((*{ - let inhs = target_inhabitants(t.clone()); -let int_target = coerce_primitive_type(t.clone(), "Int".to_string()); -let str_target = coerce_primitive_type(t.clone(), "String".to_string()); -Rc::new({ let mut __result = Vec::new(); for inh in inhs.clone().iter().cloned() { __result.extend((*if (inh.arity.clone() == 1) { - { - let expected = apply_inhabitant_template1(inh.template.clone(), int_target.clone()); -Rc::new(vec![Rc::new(CoercionAssertion::TemplateAssertion { - template: inh.template.clone(), - args: Rc::new(vec![int_target.clone()]), - expected: expected.clone(), -})]) -} - } else { - if (inh.arity.clone() == 2) { - { - let expected = apply_inhabitant_template2(inh.template.clone(), str_target.clone(), int_target.clone()); -Rc::new(vec![Rc::new(CoercionAssertion::TemplateAssertion { - template: inh.template.clone(), - args: Rc::new(vec![str_target.clone(), int_target.clone()]), - expected: expected.clone(), -})]) -} - } else { - Rc::new(vec![]) - } - }).iter().cloned()); } __result }) -}).iter().cloned()); } __result }); -if ((assertions.clone().len() as i64) == 0) { + let targets = Rc::new(vec![ + RenderTarget::Rust, + RenderTarget::Python, + RenderTarget::Go, + ]); + let assertions = Rc::new({ + let mut __result = Vec::new(); + for t in targets.iter().cloned() { + __result.extend( + (*{ + let inhs = target_inhabitants(t.clone()); + let int_target = coerce_primitive_type(t.clone(), "Int".to_string()); + let str_target = coerce_primitive_type(t.clone(), "String".to_string()); + Rc::new({ + let mut __result = Vec::new(); + for inh in inhs.clone().iter().cloned() { + __result.extend( + (*if (inh.arity.clone() == 1) { + { + let expected = apply_inhabitant_template1( + inh.template.clone(), + int_target.clone(), + ); + Rc::new(vec![Rc::new( + CoercionAssertion::TemplateAssertion { + template: inh.template.clone(), + args: Rc::new(vec![int_target.clone()]), + expected: expected.clone(), + }, + )]) + } + } else { + if (inh.arity.clone() == 2) { + { + let expected = apply_inhabitant_template2( + inh.template.clone(), + str_target.clone(), + int_target.clone(), + ); + Rc::new(vec![Rc::new( + CoercionAssertion::TemplateAssertion { + template: inh.template.clone(), + args: Rc::new(vec![ + str_target.clone(), + int_target.clone(), + ]), + expected: expected.clone(), + }, + )]) + } + } else { + Rc::new(vec![]) + } + }) + .iter() + .cloned(), + ); + } + __result + }) + }) + .iter() + .cloned(), + ); + } + __result + }); + if ((assertions.clone().len() as i64) == 0) { Rc::new(vec![]) } else { Rc::new(vec![Rc::new(CoercionTestEntry { - test_name: "coercion_template_application".to_string(), - assertions: assertions.clone(), -})]) + test_name: "coercion_template_application".to_string(), + assertions: assertions.clone(), + })]) } -} + } } pub fn extract_coercion_tests() -> Rc>> { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(checkpoint_tests(&RenderTarget::Rust), checkpoint_tests(&RenderTarget::Python)), checkpoint_tests(&RenderTarget::Go)), inhabitant_tests(&RenderTarget::Rust)), inhabitant_tests(&RenderTarget::Python)), inhabitant_tests(&RenderTarget::Go)), copy_tests()), template_application_tests()) + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + checkpoint_tests(&RenderTarget::Rust), + checkpoint_tests(&RenderTarget::Python), + ), + checkpoint_tests(&RenderTarget::Go), + ), + inhabitant_tests(&RenderTarget::Rust), + ), + inhabitant_tests(&RenderTarget::Python), + ), + inhabitant_tests(&RenderTarget::Go), + ), + copy_tests(), + ), + template_application_tests(), + ) } diff --git a/src/v2/stage0/src/v2_compiler_compile.rs b/src/v2/stage0/src/v2_compiler_compile.rs index d563415770e..667fde627bc 100644 --- a/src/v2/stage0/src/v2_compiler_compile.rs +++ b/src/v2/stage0/src/v2_compiler_compile.rs @@ -1,51 +1,76 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.compile -use std::collections::HashMap; -use std::rc::Rc; +use crate::std_induction::RecursionShape::{ + DirectRecursion, ListRecursion, MapValueRecursion, OptionalRecursion, SetRecursion, +}; +use crate::std_induction::ShrinkFactor::{ConstantShrink, ProportionalShrink, UnitShrink}; +use crate::std_induction::SubValueRelation::{ + IteratedSubValue, PreservedValue, StrictSubValue, SubValueUnknown, +}; +pub use crate::std_induction::{InductiveField, RecursionShape, ShrinkFactor, SubValueRelation}; +use crate::std_termination::PositiveDescentAmount::{AdditionalStep, OneStep}; +use crate::std_termination::ProportionalDivisor::{DivideByTwo, StrictlyLarger}; +pub use crate::std_termination::{PositiveDescentAmount, ProportionalDivisor}; +use crate::v2_compiler_artifact::RenderTarget::Dag; +pub use crate::v2_compiler_artifact::{ + default_artifact_plan, Artifact, ArtifactPlan, RenderTarget, +}; +pub use crate::v2_compiler_complexity::{ + build_complexity_report, empty_complexity_report, ComplexityReport, ComplexityViolation, + FuncEntry, RecursionContext, +}; +pub use crate::v2_compiler_emit::{escape_json_string, EmitResult}; +pub use crate::v2_compiler_emit_go::emit_go; +pub use crate::v2_compiler_emit_python::emit_python; +pub use crate::v2_compiler_emit_rust::emit_rust; +pub use crate::v2_compiler_infer::reconcile; +pub use crate::v2_compiler_infer_items::{ResolvedGraph, TypedModule}; +pub use crate::v2_compiler_infer_types::algebra_field_kind_name; +pub use crate::v2_compiler_normalize::{normalize_graph, NormalizeResult}; +use crate::v2_compiler_ownership::OwnershipDecision::SharedError; +pub use crate::v2_compiler_ownership::{analyze_ownership, OwnershipDecision, OwnershipProof}; +pub use crate::v2_compiler_parse::{parse_with_table, ParseResult}; +pub use crate::v2_compiler_resolve::{resolve_modules, ModuleGraph}; +pub use crate::v2_compiler_tokenize::tokenize; use crate::v2_rt; -use crate::NonEmptyVec; -use crate::NonEmptyBTreeSet; -pub use crate::v2_std_core::{CompileResult, TextFile, SourceSpan, authored_name_at, ErrorNode, CompilerDiagnostic, is_error_diagnostic, diagnostic_to_message, diagnostic_to_span, make_error_node, no_span, Connective, Cardinality, resource_use_name_at, resource_use_resource, param_node_name_at, param_node_type_expr, param_node_default_value, param_node_span, field_node_name_at, field_node_type_expr, field_node_cardinality, field_node_default_value, field_node_from_key, field_node_span, module_imports, module_items, import_is_all, import_specific_names_at, FieldAccessStyle, FieldValueShape, FieldSummary, InferredNode, VarBindingKind, CallSemantics, MethodSemantics, ExprErrorKind, ExprData, MatchPattern, field_binding_name_at, field_binding_pattern, arg_name_at, arg_value, arm_pattern, arm_guard, arm_body, field_init_node_name_at, field_init_node_value, LiteralValue, BinOp, UnaryOpKind, StringPart, Node, Token, NewlineIndex, build_newline_index, field_access_field_at, expr_call_func_at, lambda_param_names_at, record_lit_type_name_at, foreach_variable_at, expr_method_name_at, InternTable, InternResult, empty_intern_table, intern}; -use crate::v2_std_core::CompilerDiagnostic::{InternalError, OwnershipViolation}; -use crate::v2_std_core::Connective::{NoConnective, Arrow}; -use crate::v2_std_core::InferredNode::{Resolved, CompilerError, TypeVariable}; -use crate::v2_std_core::MethodSemantics::{PlainMethodSemantics, AlgebraMethodSemantics, ServiceMethodSemantics}; +use crate::v2_std_core::BinOp::*; +use crate::v2_std_core::CallSemantics::*; use crate::v2_std_core::Cardinality::*; +use crate::v2_std_core::CompilerDiagnostic::{InternalError, OwnershipViolation}; +use crate::v2_std_core::Connective::{Arrow, NoConnective}; +use crate::v2_std_core::ExprData::*; +use crate::v2_std_core::ExprErrorKind::*; use crate::v2_std_core::FieldAccessStyle::*; use crate::v2_std_core::FieldValueShape::*; -use crate::v2_std_core::VarBindingKind::*; -use crate::v2_std_core::CallSemantics::*; -use crate::v2_std_core::ExprErrorKind::*; -use crate::v2_std_core::ExprData::*; -use crate::v2_std_core::MatchPattern::*; +use crate::v2_std_core::InferredNode::{CompilerError, Resolved, TypeVariable}; use crate::v2_std_core::LiteralValue::*; -use crate::v2_std_core::BinOp::*; -use crate::v2_std_core::UnaryOpKind::*; +use crate::v2_std_core::MatchPattern::*; +use crate::v2_std_core::MethodSemantics::{ + AlgebraMethodSemantics, PlainMethodSemantics, ServiceMethodSemantics, +}; use crate::v2_std_core::StringPart::*; -pub use crate::v2_compiler_tokenize::{tokenize}; -pub use crate::v2_compiler_parse::{parse_with_table, ParseResult}; -pub use crate::v2_compiler_resolve::{resolve_modules, ModuleGraph}; -pub use crate::v2_compiler_normalize::{normalize_graph, NormalizeResult}; -pub use crate::v2_compiler_infer_items::{ResolvedGraph, TypedModule}; -pub use crate::v2_compiler_infer::{reconcile}; -pub use crate::v2_compiler_infer_types::{algebra_field_kind_name}; -pub use crate::v2_compiler_emit::{EmitResult, escape_json_string}; -pub use crate::v2_compiler_emit_rust::{emit_rust}; -pub use crate::v2_compiler_emit_python::{emit_python}; -pub use crate::v2_compiler_emit_go::{emit_go}; -pub use crate::v2_compiler_complexity::{ComplexityReport, ComplexityViolation, FuncEntry, RecursionContext, build_complexity_report, empty_complexity_report}; -pub use crate::std_induction::{SubValueRelation, InductiveField, ShrinkFactor, RecursionShape}; -use crate::std_induction::SubValueRelation::{StrictSubValue, IteratedSubValue, PreservedValue, SubValueUnknown}; -use crate::std_induction::ShrinkFactor::{UnitShrink, ConstantShrink, ProportionalShrink}; -use crate::std_induction::RecursionShape::{DirectRecursion, ListRecursion, OptionalRecursion, SetRecursion, MapValueRecursion}; -pub use crate::std_termination::{PositiveDescentAmount, ProportionalDivisor}; -use crate::std_termination::PositiveDescentAmount::{OneStep, AdditionalStep}; -use crate::std_termination::ProportionalDivisor::{DivideByTwo, StrictlyLarger}; -pub use crate::v2_compiler_ownership::{OwnershipProof, OwnershipDecision, analyze_ownership}; -use crate::v2_compiler_ownership::OwnershipDecision::{SharedError}; -pub use crate::v2_compiler_artifact::{ArtifactPlan, Artifact, RenderTarget, default_artifact_plan}; -use crate::v2_compiler_artifact::RenderTarget::{Dag}; +use crate::v2_std_core::UnaryOpKind::*; +use crate::v2_std_core::VarBindingKind::*; +pub use crate::v2_std_core::{ + arg_name_at, arg_value, arm_body, arm_guard, arm_pattern, authored_name_at, + build_newline_index, diagnostic_to_message, diagnostic_to_span, empty_intern_table, + expr_call_func_at, expr_method_name_at, field_access_field_at, field_binding_name_at, + field_binding_pattern, field_init_node_name_at, field_init_node_value, field_node_cardinality, + field_node_default_value, field_node_from_key, field_node_name_at, field_node_span, + field_node_type_expr, foreach_variable_at, import_is_all, import_specific_names_at, intern, + is_error_diagnostic, lambda_param_names_at, make_error_node, module_imports, module_items, + no_span, param_node_default_value, param_node_name_at, param_node_span, param_node_type_expr, + record_lit_type_name_at, resource_use_name_at, resource_use_resource, BinOp, CallSemantics, + Cardinality, CompileResult, CompilerDiagnostic, Connective, ErrorNode, ExprData, ExprErrorKind, + FieldAccessStyle, FieldSummary, FieldValueShape, InferredNode, InternResult, InternTable, + LiteralValue, MatchPattern, MethodSemantics, NewlineIndex, Node, SourceSpan, StringPart, + TextFile, Token, UnaryOpKind, VarBindingKind, +}; +use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] pub struct SourceFile { @@ -79,13 +104,64 @@ pub struct FrontendAccum { } pub fn extract_func_entries(typed: Rc) -> Rc>> { - Rc::new({ let mut __result = Vec::new(); for m in Rc::new({ let mut __result = Vec::new(); for m in typed.modules.clone().iter().cloned() { if { let mut __found = false; for item in m.items.clone().iter().cloned() { if (item.body.clone() != None) { __found = true; break; } } __found } { __result.push(m); } } __result }).iter().cloned() { __result.extend((*Rc::new({ let mut __result = Vec::new(); for item in Rc::new({ let mut __result = Vec::new(); for item in m.items.clone().iter().cloned() { if (item.body.clone() != None) { __result.push(item); } } __result }).iter().cloned() { __result.push(Rc::new(FuncEntry { - name: authored_name_at(m.type_env.clone().source_indices.clone(), &item), - body: item.body.clone().clone().unwrap(), - params: item.params.clone(), - span: item.span.clone(), - is_tail_recursive: (item.is_self_recursive.clone() && (item.has_non_tail_self_call.clone() == false)), -})); } __result })).iter().cloned()); } __result }) + Rc::new({ + let mut __result = Vec::new(); + for m in Rc::new({ + let mut __result = Vec::new(); + for m in typed.modules.clone().iter().cloned() { + if { + let mut __found = false; + for item in m.items.clone().iter().cloned() { + if (item.body.clone() != None) { + __found = true; + break; + } + } + __found + } { + __result.push(m); + } + } + __result + }) + .iter() + .cloned() + { + __result.extend( + (*Rc::new({ + let mut __result = Vec::new(); + for item in Rc::new({ + let mut __result = Vec::new(); + for item in m.items.clone().iter().cloned() { + if (item.body.clone() != None) { + __result.push(item); + } + } + __result + }) + .iter() + .cloned() + { + __result.push(Rc::new(FuncEntry { + name: authored_name_at( + m.type_env.clone().source_indices.clone(), + &item, + ), + body: item.body.clone().clone().unwrap(), + params: item.params.clone(), + span: item.span.clone(), + is_tail_recursive: (item.is_self_recursive.clone() + && (item.has_non_tail_self_call.clone() == false)), + })); + } + __result + })) + .iter() + .cloned(), + ); + } + __result + }) } pub fn build_recursion_context(typed: Rc) -> RecursionContext { @@ -93,86 +169,190 @@ pub fn build_recursion_context(typed: Rc) -> RecursionContext { } pub fn extract_ownership_proofs(typed: Rc) -> Rc>> { - Rc::new({ let mut __result = Vec::new(); for m in Rc::new({ let mut __result = Vec::new(); for m in typed.modules.clone().iter().cloned() { if { let mut __found = false; for item in m.items.clone().iter().cloned() { if (item.body.clone() != None) { __found = true; break; } } __found } { __result.push(m); } } __result }).iter().cloned() { __result.extend((*Rc::new({ let mut __result = Vec::new(); for item in Rc::new({ let mut __result = Vec::new(); for item in m.items.clone().iter().cloned() { if (item.body.clone() != None) { __result.push(item); } } __result }).iter().cloned() { __result.push(analyze_ownership(authored_name_at(m.type_env.clone().source_indices.clone(), &item), item.params.clone(), item.body.clone().clone().unwrap(), &m.type_env.clone().source_indices.clone())); } __result })).iter().cloned()); } __result }) + Rc::new({ + let mut __result = Vec::new(); + for m in Rc::new({ + let mut __result = Vec::new(); + for m in typed.modules.clone().iter().cloned() { + if { + let mut __found = false; + for item in m.items.clone().iter().cloned() { + if (item.body.clone() != None) { + __found = true; + break; + } + } + __found + } { + __result.push(m); + } + } + __result + }) + .iter() + .cloned() + { + __result.extend( + (*Rc::new({ + let mut __result = Vec::new(); + for item in Rc::new({ + let mut __result = Vec::new(); + for item in m.items.clone().iter().cloned() { + if (item.body.clone() != None) { + __result.push(item); + } + } + __result + }) + .iter() + .cloned() + { + __result.push(analyze_ownership( + authored_name_at(m.type_env.clone().source_indices.clone(), &item), + item.params.clone(), + item.body.clone().clone().unwrap(), + &m.type_env.clone().source_indices.clone(), + )); + } + __result + })) + .iter() + .cloned(), + ); + } + __result + }) } pub fn ownership_diagnostics(proofs: Rc>>) -> Rc>> { - Rc::new({ let mut __result = Vec::new(); for proof in proofs.iter().cloned() { __result.extend((*Rc::new({ let mut __result = Vec::new(); for decision in proof.decisions.clone().iter().cloned() { __result.extend((*match (*decision.clone()).clone() { - OwnershipDecision::SharedError { binding, consumer_count: count, sites, .. } => Rc::new(vec![make_error_node(Rc::new(CompilerDiagnostic::OwnershipViolation { - binding: binding.clone(), - fn_name: proof.func_name.clone(), - consumers: count.clone(), - span: no_span(), -}), proof.func_name.clone())]), - _ => Rc::new(vec![]), -}).iter().cloned()); } __result })).iter().cloned()); } __result }) + Rc::new({ + let mut __result = Vec::new(); + for proof in proofs.iter().cloned() { + __result.extend( + (*Rc::new({ + let mut __result = Vec::new(); + for decision in proof.decisions.clone().iter().cloned() { + __result.extend( + (*match (*decision.clone()).clone() { + OwnershipDecision::SharedError { + binding, + consumer_count: count, + sites, + .. + } => Rc::new(vec![make_error_node( + Rc::new(CompilerDiagnostic::OwnershipViolation { + binding: binding.clone(), + fn_name: proof.func_name.clone(), + consumers: count.clone(), + span: no_span(), + }), + proof.func_name.clone(), + )]), + _ => Rc::new(vec![]), + }) + .iter() + .cloned(), + ); + } + __result + })) + .iter() + .cloned(), + ); + } + __result + }) } pub fn complexity_diagnostics(complexity: Rc) -> Rc>> { - Rc::new({ let mut __result = Vec::new(); for v in complexity.violations.clone().iter().cloned() { __result.push(make_error_node(Rc::new(CompilerDiagnostic::ComplexityUnknown { - func_name: v.func_name.clone(), - reason: v.reason.clone(), - span: v.span.clone(), -}), v.func_name.clone())); } __result }) + Rc::new({ + let mut __result = Vec::new(); + for v in complexity.violations.clone().iter().cloned() { + __result.push(make_error_node( + Rc::new(CompilerDiagnostic::ComplexityUnknown { + func_name: v.func_name.clone(), + reason: v.reason.clone(), + span: v.span.clone(), + }), + v.func_name.clone(), + )); + } + __result + }) } pub fn empty_artifact_plan() -> Rc { Rc::new(ArtifactPlan { - artifacts: Rc::new(vec![]), - boundaries: Rc::new(vec![]), -}) + artifacts: Rc::new(vec![]), + boundaries: Rc::new(vec![]), + }) } pub fn compile_bundle_error(message: String) -> Rc { - make_error_node(Rc::new(CompilerDiagnostic::InternalError { - message: message, - span: no_span(), -}), "".to_string()) + make_error_node( + Rc::new(CompilerDiagnostic::InternalError { + message: message, + span: no_span(), + }), + "".to_string(), + ) } pub fn emit_artifact(typed: Rc, artifact: Rc) -> Rc { match artifact.target.clone() { - RenderTarget::Rust => emit_rust(&typed), - RenderTarget::Python => emit_python(&typed), - RenderTarget::Go => emit_go(&typed), - RenderTarget::Dag => emit_dag_artifact(&typed), -} + RenderTarget::Rust => emit_rust(&typed), + RenderTarget::Python => emit_python(&typed), + RenderTarget::Go => emit_go(&typed), + RenderTarget::Dag => emit_dag_artifact(&typed), + } } pub fn json_quote(s: String) -> String { - v2_rt::concat(v2_rt::concat("\"".to_string(), escape_json_string(s)), "\"".to_string()) + v2_rt::concat( + v2_rt::concat("\"".to_string(), escape_json_string(s)), + "\"".to_string(), + ) } pub fn json_list(items: Rc>) -> String { - v2_rt::concat(v2_rt::concat("[".to_string(), items.join(&", ".to_string())), "]".to_string()) + v2_rt::concat( + v2_rt::concat("[".to_string(), items.join(&", ".to_string())), + "]".to_string(), + ) } pub fn json_optional_string(value: Option) -> String { match value { - Some(inner) => json_quote(inner.clone()), - None => "null".to_string(), -} + Some(inner) => json_quote(inner.clone()), + None => "null".to_string(), + } } -pub fn json_optional_node(value: Option>, source_indices: Rc>>) -> String { +pub fn json_optional_node( + value: Option>, + source_indices: Rc>>, +) -> String { match value { - Some(inner) => serialize_node(&inner, &source_indices), - None => "null".to_string(), -} + Some(inner) => serialize_node(&inner, &source_indices), + None => "null".to_string(), + } } -pub fn json_optional_inferred_node(value: Option>, source_indices: Rc>>) -> String { +pub fn json_optional_inferred_node( + value: Option>, + source_indices: Rc>>, +) -> String { match value { - Some(inner) => serialize_inferred_node(inner.clone(), source_indices), - None => "null".to_string(), -} + Some(inner) => serialize_inferred_node(inner.clone(), source_indices), + None => "null".to_string(), + } } pub fn json_optional_span(value: Option>) -> String { match value { - Some(inner) => serialize_span(&inner), - None => "null".to_string(), -} + Some(inner) => serialize_span(&inner), + None => "null".to_string(), + } } pub fn json_bool(value: bool) -> String { @@ -185,306 +365,1197 @@ pub fn json_bool(value: bool) -> String { pub fn connective_name(value: Connective) -> String { match value { - Connective::Conj => "Conj".to_string(), - Connective::Disj => "Disj".to_string(), - Connective::NoConnective => "NoConnective".to_string(), - Connective::Arrow => "Arrow".to_string(), -} + Connective::Conj => "Conj".to_string(), + Connective::Disj => "Disj".to_string(), + Connective::NoConnective => "NoConnective".to_string(), + Connective::Arrow => "Arrow".to_string(), + } } pub fn cardinality_name(value: Cardinality) -> String { match value { - Cardinality::Required => "Required".to_string(), - Cardinality::CardOptional => "CardOptional".to_string(), -} + Cardinality::Required => "Required".to_string(), + Cardinality::CardOptional => "CardOptional".to_string(), + } } pub fn field_access_style_name(value: FieldAccessStyle) -> String { match value { - FieldAccessStyle::StoredField => "StoredField".to_string(), - FieldAccessStyle::EnumAccessor => "EnumAccessor".to_string(), - FieldAccessStyle::OptionalUnwrap => "OptionalUnwrap".to_string(), - FieldAccessStyle::TupleFirst => "TupleFirst".to_string(), - FieldAccessStyle::TupleSecond => "TupleSecond".to_string(), -} + FieldAccessStyle::StoredField => "StoredField".to_string(), + FieldAccessStyle::EnumAccessor => "EnumAccessor".to_string(), + FieldAccessStyle::OptionalUnwrap => "OptionalUnwrap".to_string(), + FieldAccessStyle::TupleFirst => "TupleFirst".to_string(), + FieldAccessStyle::TupleSecond => "TupleSecond".to_string(), + } } pub fn field_value_shape_name(value: FieldValueShape) -> String { match value { - FieldValueShape::PlainValue => "PlainValue".to_string(), - FieldValueShape::OptionalValue => "OptionalValue".to_string(), -} + FieldValueShape::PlainValue => "PlainValue".to_string(), + FieldValueShape::OptionalValue => "OptionalValue".to_string(), + } } pub fn var_binding_kind_name(value: Rc) -> String { match (*value).clone() { - VarBindingKind::LocalValueBinding => "LocalValueBinding".to_string(), - VarBindingKind::FunctionValueBinding => "FunctionValueBinding".to_string(), - VarBindingKind::VariantValueBinding { .. } => "VariantValueBinding".to_string(), - VarBindingKind::MatchBoundBinding => "MatchBoundBinding".to_string(), -} + VarBindingKind::LocalValueBinding => "LocalValueBinding".to_string(), + VarBindingKind::FunctionValueBinding => "FunctionValueBinding".to_string(), + VarBindingKind::VariantValueBinding { .. } => "VariantValueBinding".to_string(), + VarBindingKind::MatchBoundBinding => "MatchBoundBinding".to_string(), + } } pub fn call_semantics_name(value: CallSemantics) -> String { match value { - CallSemantics::PlainCallSemantics => "PlainCallSemantics".to_string(), - CallSemantics::LookupCallSemantics => "LookupCallSemantics".to_string(), -} + CallSemantics::PlainCallSemantics => "PlainCallSemantics".to_string(), + CallSemantics::LookupCallSemantics => "LookupCallSemantics".to_string(), + } } pub fn expr_error_kind_name(value: ExprErrorKind) -> String { match value { - ExprErrorKind::ParseRecoveryError => "ParseRecoveryError".to_string(), - ExprErrorKind::SemanticExprError => "SemanticExprError".to_string(), - ExprErrorKind::InternalExprError => "InternalExprError".to_string(), -} + ExprErrorKind::ParseRecoveryError => "ParseRecoveryError".to_string(), + ExprErrorKind::SemanticExprError => "SemanticExprError".to_string(), + ExprErrorKind::InternalExprError => "InternalExprError".to_string(), + } } pub fn bin_op_name(value: BinOp) -> String { match value { - BinOp::Add => "Add".to_string(), - BinOp::Sub => "Sub".to_string(), - BinOp::Mul => "Mul".to_string(), - BinOp::Div => "Div".to_string(), - BinOp::Mod => "Mod".to_string(), - BinOp::Eq => "Eq".to_string(), - BinOp::Ne => "Ne".to_string(), - BinOp::Lt => "Lt".to_string(), - BinOp::Gt => "Gt".to_string(), - BinOp::Le => "Le".to_string(), - BinOp::Ge => "Ge".to_string(), - BinOp::And => "And".to_string(), - BinOp::Or => "Or".to_string(), - BinOp::NullCoalesce => "NullCoalesce".to_string(), -} + BinOp::Add => "Add".to_string(), + BinOp::Sub => "Sub".to_string(), + BinOp::Mul => "Mul".to_string(), + BinOp::Div => "Div".to_string(), + BinOp::Mod => "Mod".to_string(), + BinOp::Eq => "Eq".to_string(), + BinOp::Ne => "Ne".to_string(), + BinOp::Lt => "Lt".to_string(), + BinOp::Gt => "Gt".to_string(), + BinOp::Le => "Le".to_string(), + BinOp::Ge => "Ge".to_string(), + BinOp::And => "And".to_string(), + BinOp::Or => "Or".to_string(), + BinOp::NullCoalesce => "NullCoalesce".to_string(), + } } pub fn unary_op_name(value: UnaryOpKind) -> String { match value { - UnaryOpKind::Not => "Not".to_string(), - UnaryOpKind::Neg => "Neg".to_string(), -} + UnaryOpKind::Not => "Not".to_string(), + UnaryOpKind::Neg => "Neg".to_string(), + } } pub fn serialize_span(span: &Rc) -> String { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"start\": ".to_string(), (span.start.clone()).to_string()), ", \"end\": ".to_string()), (span.end.clone()).to_string()), "}".to_string()) -} - -pub fn serialize_import_node(imp: &Rc, source_indices: &Rc>>) -> String { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("{\"start\": ".to_string(), (span.start.clone()).to_string()), + ", \"end\": ".to_string(), + ), + (span.end.clone()).to_string(), + ), + "}".to_string(), + ) +} + +pub fn serialize_import_node( + imp: &Rc, + source_indices: &Rc>>, +) -> String { { let names_json = if import_is_all(imp.clone()) { "{\"kind\": \"ImportAll\"}".to_string() } else { - v2_rt::concat(v2_rt::concat("{\"kind\": \"ImportSpecific\", \"names\": ".to_string(), json_list(Rc::new({ let mut __result = Vec::new(); for v in import_specific_names_at(imp.clone(), source_indices.clone()).iter().cloned() { __result.push(json_quote(v.clone())); } __result }))), "}".to_string()) + v2_rt::concat( + v2_rt::concat( + "{\"kind\": \"ImportSpecific\", \"names\": ".to_string(), + json_list(Rc::new({ + let mut __result = Vec::new(); + for v in import_specific_names_at(imp.clone(), source_indices.clone()) + .iter() + .cloned() + { + __result.push(json_quote(v.clone())); + } + __result + })), + ), + "}".to_string(), + ) }; -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"module_path\": ".to_string(), json_quote(authored_name_at(source_indices.clone(), &imp))), ", \"names\": ".to_string()), names_json), ", \"span\": ".to_string()), serialize_span(&imp.span.clone())), "}".to_string()) -} + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"module_path\": ".to_string(), + json_quote(authored_name_at(source_indices.clone(), &imp)), + ), + ", \"names\": ".to_string(), + ), + names_json, + ), + ", \"span\": ".to_string(), + ), + serialize_span(&imp.span.clone()), + ), + "}".to_string(), + ) + } } pub fn serialize_field_summary(summary: &Rc) -> String { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"access_style\": ".to_string(), json_quote(field_access_style_name(summary.access_style.clone()))), ", \"value_shape\": ".to_string()), json_quote(field_value_shape_name(summary.value_shape.clone()))), "}".to_string()) + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"access_style\": ".to_string(), + json_quote(field_access_style_name(summary.access_style.clone())), + ), + ", \"value_shape\": ".to_string(), + ), + json_quote(field_value_shape_name(summary.value_shape.clone())), + ), + "}".to_string(), + ) } pub fn serialize_literal(value: Rc) -> String { match (*value).clone() { - LiteralValue::LitStr { value: inner, .. } => v2_rt::concat(v2_rt::concat("{\"kind\": \"LitStr\", \"value\": ".to_string(), json_quote(inner.clone())), "}".to_string()), - LiteralValue::LitInt { value: inner, .. } => v2_rt::concat(v2_rt::concat("{\"kind\": \"LitInt\", \"value\": ".to_string(), (inner.clone()).to_string()), "}".to_string()), - LiteralValue::LitFloat { value: inner, .. } => v2_rt::concat(v2_rt::concat("{\"kind\": \"LitFloat\", \"value\": ".to_string(), json_quote(inner.clone())), "}".to_string()), - LiteralValue::LitBool { value: inner, .. } => v2_rt::concat(v2_rt::concat("{\"kind\": \"LitBool\", \"value\": ".to_string(), json_bool(inner.clone())), "}".to_string()), - LiteralValue::LitNull => "{\"kind\": \"LitNull\"}".to_string(), -} -} - -pub fn serialize_field_binding(binding: &Rc, source_indices: &Rc>>) -> String { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"field_name\": ".to_string(), json_quote(field_binding_name_at(binding.clone(), source_indices.clone()))), ", \"binding\": ".to_string()), serialize_match_pattern(field_binding_pattern(binding.clone()), source_indices.clone())), "}".to_string()) + LiteralValue::LitStr { value: inner, .. } => v2_rt::concat( + v2_rt::concat( + "{\"kind\": \"LitStr\", \"value\": ".to_string(), + json_quote(inner.clone()), + ), + "}".to_string(), + ), + LiteralValue::LitInt { value: inner, .. } => v2_rt::concat( + v2_rt::concat( + "{\"kind\": \"LitInt\", \"value\": ".to_string(), + (inner.clone()).to_string(), + ), + "}".to_string(), + ), + LiteralValue::LitFloat { value: inner, .. } => v2_rt::concat( + v2_rt::concat( + "{\"kind\": \"LitFloat\", \"value\": ".to_string(), + json_quote(inner.clone()), + ), + "}".to_string(), + ), + LiteralValue::LitBool { value: inner, .. } => v2_rt::concat( + v2_rt::concat( + "{\"kind\": \"LitBool\", \"value\": ".to_string(), + json_bool(inner.clone()), + ), + "}".to_string(), + ), + LiteralValue::LitNull => "{\"kind\": \"LitNull\"}".to_string(), + } } -pub fn serialize_match_pattern(pattern: Rc, source_indices: Rc>>) -> String { +pub fn serialize_field_binding( + binding: &Rc, + source_indices: &Rc>>, +) -> String { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"field_name\": ".to_string(), + json_quote(field_binding_name_at( + binding.clone(), + source_indices.clone(), + )), + ), + ", \"binding\": ".to_string(), + ), + serialize_match_pattern( + field_binding_pattern(binding.clone()), + source_indices.clone(), + ), + ), + "}".to_string(), + ) +} + +pub fn serialize_match_pattern( + pattern: Rc, + source_indices: Rc>>, +) -> String { match (*pattern).clone() { - MatchPattern::Bind { name: inner, .. } => v2_rt::concat(v2_rt::concat("{\"kind\": \"Bind\", \"name\": ".to_string(), json_quote(inner.clone())), "}".to_string()), - MatchPattern::LitPattern { value: inner, .. } => v2_rt::concat(v2_rt::concat("{\"kind\": \"LitPattern\", \"value\": ".to_string(), serialize_literal(inner.clone())), "}".to_string()), - MatchPattern::VariantPattern { name: inner, parent_enum, field_bindings, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"VariantPattern\", \"name\": ".to_string(), json_quote(inner.clone())), ", \"parent_enum\": ".to_string()), json_optional_string(parent_enum.clone())), ", \"field_bindings\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for fb in field_bindings.clone().iter().cloned() { __result.push(serialize_field_binding(&fb, &source_indices)); } __result }))), "}".to_string()), - MatchPattern::Wildcard => "{\"kind\": \"Wildcard\"}".to_string(), -} -} - -pub fn serialize_named_arg(arg: &Rc, source_indices: &Rc>>) -> String { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"name\": ".to_string(), json_optional_string(arg_name_at(arg.clone(), source_indices.clone()))), ", \"value\": ".to_string()), serialize_node(&arg_value(&arg), &source_indices)), "}".to_string()) -} - -pub fn serialize_match_arm(arm: &Rc, source_indices: &Rc>>) -> String { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"pattern\": ".to_string(), serialize_match_pattern(arm_pattern(arm.clone()), source_indices.clone())), ", \"guard\": ".to_string()), json_optional_node(arm_guard(&arm), source_indices.clone())), ", \"body\": ".to_string()), serialize_node(&arm_body(&arm), &source_indices)), "}".to_string()) -} - -pub fn serialize_field_init(field_init: &Rc, source_indices: &Rc>>) -> String { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"name\": ".to_string(), json_quote(field_init_node_name_at(field_init.clone(), source_indices.clone()))), ", \"value\": ".to_string()), serialize_node(&field_init_node_value(&field_init), &source_indices)), "}".to_string()) + MatchPattern::Bind { name: inner, .. } => v2_rt::concat( + v2_rt::concat( + "{\"kind\": \"Bind\", \"name\": ".to_string(), + json_quote(inner.clone()), + ), + "}".to_string(), + ), + MatchPattern::LitPattern { value: inner, .. } => v2_rt::concat( + v2_rt::concat( + "{\"kind\": \"LitPattern\", \"value\": ".to_string(), + serialize_literal(inner.clone()), + ), + "}".to_string(), + ), + MatchPattern::VariantPattern { + name: inner, + parent_enum, + field_bindings, + .. + } => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"kind\": \"VariantPattern\", \"name\": ".to_string(), + json_quote(inner.clone()), + ), + ", \"parent_enum\": ".to_string(), + ), + json_optional_string(parent_enum.clone()), + ), + ", \"field_bindings\": ".to_string(), + ), + json_list(Rc::new({ + let mut __result = Vec::new(); + for fb in field_bindings.clone().iter().cloned() { + __result.push(serialize_field_binding(&fb, &source_indices)); + } + __result + })), + ), + "}".to_string(), + ), + MatchPattern::Wildcard => "{\"kind\": \"Wildcard\"}".to_string(), + } } -pub fn serialize_string_part(part: Rc, source_indices: Rc>>) -> String { +pub fn serialize_named_arg( + arg: &Rc, + source_indices: &Rc>>, +) -> String { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"name\": ".to_string(), + json_optional_string(arg_name_at(arg.clone(), source_indices.clone())), + ), + ", \"value\": ".to_string(), + ), + serialize_node(&arg_value(&arg), &source_indices), + ), + "}".to_string(), + ) +} + +pub fn serialize_match_arm( + arm: &Rc, + source_indices: &Rc>>, +) -> String { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"pattern\": ".to_string(), + serialize_match_pattern( + arm_pattern(arm.clone()), + source_indices.clone(), + ), + ), + ", \"guard\": ".to_string(), + ), + json_optional_node(arm_guard(&arm), source_indices.clone()), + ), + ", \"body\": ".to_string(), + ), + serialize_node(&arm_body(&arm), &source_indices), + ), + "}".to_string(), + ) +} + +pub fn serialize_field_init( + field_init: &Rc, + source_indices: &Rc>>, +) -> String { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"name\": ".to_string(), + json_quote(field_init_node_name_at( + field_init.clone(), + source_indices.clone(), + )), + ), + ", \"value\": ".to_string(), + ), + serialize_node(&field_init_node_value(&field_init), &source_indices), + ), + "}".to_string(), + ) +} + +pub fn serialize_string_part( + part: Rc, + source_indices: Rc>>, +) -> String { match (*part).clone() { - StringPart::Text { value: inner, .. } => v2_rt::concat(v2_rt::concat("{\"kind\": \"Text\", \"value\": ".to_string(), json_quote(inner.clone())), "}".to_string()), - StringPart::Interpolation { expr: inner, .. } => v2_rt::concat(v2_rt::concat("{\"kind\": \"Interpolation\", \"expr\": ".to_string(), serialize_node(&inner, &source_indices)), "}".to_string()), -} + StringPart::Text { value: inner, .. } => v2_rt::concat( + v2_rt::concat( + "{\"kind\": \"Text\", \"value\": ".to_string(), + json_quote(inner.clone()), + ), + "}".to_string(), + ), + StringPart::Interpolation { expr: inner, .. } => v2_rt::concat( + v2_rt::concat( + "{\"kind\": \"Interpolation\", \"expr\": ".to_string(), + serialize_node(&inner, &source_indices), + ), + "}".to_string(), + ), + } } pub fn serialize_call_semantics(value: Option) -> String { match value { - Some(inner) => v2_rt::concat(v2_rt::concat("{\"kind\": ".to_string(), json_quote(call_semantics_name(inner.clone()))), "}".to_string()), - None => "null".to_string(), -} + Some(inner) => v2_rt::concat( + v2_rt::concat( + "{\"kind\": ".to_string(), + json_quote(call_semantics_name(inner.clone())), + ), + "}".to_string(), + ), + None => "null".to_string(), + } } -pub fn serialize_method_semantics(value: Option>, source_indices: &Rc>>) -> String { +pub fn serialize_method_semantics( + value: Option>, + source_indices: &Rc>>, +) -> String { match value.as_deref().cloned() { - Some(MethodSemantics::PlainMethodSemantics) => "{\"kind\": \"PlainMethodSemantics\"}".to_string(), - Some(MethodSemantics::AlgebraMethodSemantics { method_def, fold_accumulator_type, .. }) => { - let mn = authored_name_at(source_indices.clone(), &method_def); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"AlgebraMethodSemantics\", \"method_name\": ".to_string(), json_quote(mn)), ", \"fold_accumulator_type\": ".to_string()), json_optional_node(fold_accumulator_type.clone(), source_indices.clone())), "}".to_string()) -}, - Some(MethodSemantics::ServiceMethodSemantics { service_name, op_params, .. }) => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ServiceMethodSemantics\", \"service_name\": ".to_string(), json_quote(service_name.clone())), ", \"op_params\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for p in op_params.clone().iter().cloned() { __result.push(serialize_param(&p, &source_indices)); } __result }))), "}".to_string()), - None => "null".to_string(), -} + Some(MethodSemantics::PlainMethodSemantics) => { + "{\"kind\": \"PlainMethodSemantics\"}".to_string() + } + Some(MethodSemantics::AlgebraMethodSemantics { + method_def, + fold_accumulator_type, + .. + }) => { + let mn = authored_name_at(source_indices.clone(), &method_def); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"kind\": \"AlgebraMethodSemantics\", \"method_name\": ".to_string(), + json_quote(mn), + ), + ", \"fold_accumulator_type\": ".to_string(), + ), + json_optional_node(fold_accumulator_type.clone(), source_indices.clone()), + ), + "}".to_string(), + ) + } + Some(MethodSemantics::ServiceMethodSemantics { + service_name, + op_params, + .. + }) => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"kind\": \"ServiceMethodSemantics\", \"service_name\": ".to_string(), + json_quote(service_name.clone()), + ), + ", \"op_params\": ".to_string(), + ), + json_list(Rc::new({ + let mut __result = Vec::new(); + for p in op_params.clone().iter().cloned() { + __result.push(serialize_param(&p, &source_indices)); + } + __result + })), + ), + "}".to_string(), + ), + None => "null".to_string(), + } } pub fn serialize_recursion_shape(shape: RecursionShape) -> String { match shape { - RecursionShape::DirectRecursion => "{\"_variant\": \"DirectRecursion\"}".to_string(), - RecursionShape::ListRecursion => "{\"_variant\": \"ListRecursion\"}".to_string(), - RecursionShape::OptionalRecursion => "{\"_variant\": \"OptionalRecursion\"}".to_string(), - RecursionShape::SetRecursion => "{\"_variant\": \"SetRecursion\"}".to_string(), - RecursionShape::MapValueRecursion => "{\"_variant\": \"MapValueRecursion\"}".to_string(), -} + RecursionShape::DirectRecursion => "{\"_variant\": \"DirectRecursion\"}".to_string(), + RecursionShape::ListRecursion => "{\"_variant\": \"ListRecursion\"}".to_string(), + RecursionShape::OptionalRecursion => "{\"_variant\": \"OptionalRecursion\"}".to_string(), + RecursionShape::SetRecursion => "{\"_variant\": \"SetRecursion\"}".to_string(), + RecursionShape::MapValueRecursion => "{\"_variant\": \"MapValueRecursion\"}".to_string(), + } } pub fn serialize_inductive_field(field: &Rc) -> String { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"type_name\": ".to_string(), json_quote(field.type_name.clone())), ", \"variant_name\": ".to_string()), json_quote(field.variant_name.clone())), ", \"field_name\": ".to_string()), json_quote(field.field_name.clone())), ", \"shape\": ".to_string()), serialize_recursion_shape(field.shape.clone())), "}".to_string()) + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"type_name\": ".to_string(), + json_quote(field.type_name.clone()), + ), + ", \"variant_name\": ".to_string(), + ), + json_quote(field.variant_name.clone()), + ), + ", \"field_name\": ".to_string(), + ), + json_quote(field.field_name.clone()), + ), + ", \"shape\": ".to_string(), + ), + serialize_recursion_shape(field.shape.clone()), + ), + "}".to_string(), + ) } pub fn serialize_positive_descent_amount(steps: Rc) -> String { - stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - match (*steps).clone() { - PositiveDescentAmount::OneStep => "{\"_variant\": \"OneStep\"}".to_string(), - PositiveDescentAmount::AdditionalStep { previous: p, .. } => v2_rt::concat(v2_rt::concat("{\"_variant\": \"AdditionalStep\", \"previous\": ".to_string(), serialize_positive_descent_amount(p.clone())), "}".to_string()), -} + stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || match (*steps).clone() { + PositiveDescentAmount::OneStep => "{\"_variant\": \"OneStep\"}".to_string(), + PositiveDescentAmount::AdditionalStep { previous: p, .. } => v2_rt::concat( + v2_rt::concat( + "{\"_variant\": \"AdditionalStep\", \"previous\": ".to_string(), + serialize_positive_descent_amount(p.clone()), + ), + "}".to_string(), + ), }) } pub fn serialize_proportional_divisor(d: Rc) -> String { - stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - match (*d).clone() { - ProportionalDivisor::DivideByTwo => "{\"_variant\": \"DivideByTwo\"}".to_string(), - ProportionalDivisor::StrictlyLarger { inner: i, .. } => v2_rt::concat(v2_rt::concat("{\"_variant\": \"StrictlyLarger\", \"inner\": ".to_string(), serialize_proportional_divisor(i.clone())), "}".to_string()), -} + stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || match (*d).clone() { + ProportionalDivisor::DivideByTwo => "{\"_variant\": \"DivideByTwo\"}".to_string(), + ProportionalDivisor::StrictlyLarger { inner: i, .. } => v2_rt::concat( + v2_rt::concat( + "{\"_variant\": \"StrictlyLarger\", \"inner\": ".to_string(), + serialize_proportional_divisor(i.clone()), + ), + "}".to_string(), + ), }) } pub fn serialize_shrink_factor(factor: Rc) -> String { match (*factor).clone() { - ShrinkFactor::UnitShrink => "{\"_variant\": \"UnitShrink\"}".to_string(), - ShrinkFactor::ConstantShrink { steps: s, .. } => v2_rt::concat(v2_rt::concat("{\"_variant\": \"ConstantShrink\", \"steps\": ".to_string(), serialize_positive_descent_amount(s.clone())), "}".to_string()), - ShrinkFactor::ProportionalShrink { divisor: d, .. } => v2_rt::concat(v2_rt::concat("{\"_variant\": \"ProportionalShrink\", \"divisor\": ".to_string(), serialize_proportional_divisor(d.clone())), "}".to_string()), -} + ShrinkFactor::UnitShrink => "{\"_variant\": \"UnitShrink\"}".to_string(), + ShrinkFactor::ConstantShrink { steps: s, .. } => v2_rt::concat( + v2_rt::concat( + "{\"_variant\": \"ConstantShrink\", \"steps\": ".to_string(), + serialize_positive_descent_amount(s.clone()), + ), + "}".to_string(), + ), + ShrinkFactor::ProportionalShrink { divisor: d, .. } => v2_rt::concat( + v2_rt::concat( + "{\"_variant\": \"ProportionalShrink\", \"divisor\": ".to_string(), + serialize_proportional_divisor(d.clone()), + ), + "}".to_string(), + ), + } } pub fn serialize_sub_value_relation(rel: Rc) -> String { match (*rel).clone() { - SubValueRelation::StrictSubValue { field: f, factor: fac, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"_variant\": \"StrictSubValue\", \"field\": ".to_string(), serialize_inductive_field(&f)), ", \"factor\": ".to_string()), serialize_shrink_factor(fac.clone())), "}".to_string()), - SubValueRelation::IteratedSubValue { field: f, .. } => v2_rt::concat(v2_rt::concat("{\"_variant\": \"IteratedSubValue\", \"field\": ".to_string(), serialize_inductive_field(&f)), "}".to_string()), - SubValueRelation::ArithmeticDescent { param: p, factor: fac, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"_variant\": \"ArithmeticDescent\", \"param\": ".to_string(), json_quote(p.clone())), ", \"factor\": ".to_string()), serialize_shrink_factor(fac.clone())), "}".to_string()), - SubValueRelation::PreservedValue => "{\"_variant\": \"PreservedValue\"}".to_string(), - SubValueRelation::SubValueUnknown => "{\"_variant\": \"SubValueUnknown\"}".to_string(), -} + SubValueRelation::StrictSubValue { + field: f, + factor: fac, + .. + } => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"_variant\": \"StrictSubValue\", \"field\": ".to_string(), + serialize_inductive_field(&f), + ), + ", \"factor\": ".to_string(), + ), + serialize_shrink_factor(fac.clone()), + ), + "}".to_string(), + ), + SubValueRelation::IteratedSubValue { field: f, .. } => v2_rt::concat( + v2_rt::concat( + "{\"_variant\": \"IteratedSubValue\", \"field\": ".to_string(), + serialize_inductive_field(&f), + ), + "}".to_string(), + ), + SubValueRelation::ArithmeticDescent { + param: p, + factor: fac, + .. + } => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"_variant\": \"ArithmeticDescent\", \"param\": ".to_string(), + json_quote(p.clone()), + ), + ", \"factor\": ".to_string(), + ), + serialize_shrink_factor(fac.clone()), + ), + "}".to_string(), + ), + SubValueRelation::PreservedValue => "{\"_variant\": \"PreservedValue\"}".to_string(), + SubValueRelation::SubValueUnknown => "{\"_variant\": \"SubValueUnknown\"}".to_string(), + } } pub fn serialize_descent_evidence(de: Option>>>) -> String { match de { - Some(evidence) => json_list(Rc::new({ let mut __result = Vec::new(); for rel in evidence.clone().iter().cloned() { __result.push(serialize_sub_value_relation(rel.clone())); } __result })), - None => "null".to_string(), -} + Some(evidence) => json_list(Rc::new({ + let mut __result = Vec::new(); + for rel in evidence.clone().iter().cloned() { + __result.push(serialize_sub_value_relation(rel.clone())); + } + __result + })), + None => "null".to_string(), + } } -pub fn serialize_expr_data(expr_node: &Rc, source_indices: &Rc>>) -> String { +pub fn serialize_expr_data( + expr_node: &Rc, + source_indices: &Rc>>, +) -> String { { let ch = expr_node.children.clone(); -let name = authored_name_at(source_indices.clone(), &expr_node); -match (*expr_node.expr_data.clone()).clone() { - ExprData::NoExprData => "{\"kind\": \"NoExprData\"}".to_string(), - ExprData::ExprLiteral { value, .. } => v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprLiteral\", \"value\": ".to_string(), serialize_literal(value.clone())), "}".to_string()), - ExprData::ExprError { kind, message, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprError\", \"error_kind\": ".to_string(), json_quote(expr_error_kind_name(kind.clone()))), ", \"message\": ".to_string()), json_quote(message.clone())), "}".to_string()), - ExprData::ExprVar { binding_kind, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprVar\", \"name\": ".to_string(), json_quote(name)), ", \"binding_kind\": ".to_string()), match binding_kind.clone() { - Some(inner) => v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": ".to_string(), json_quote(var_binding_kind_name(inner.clone()))), match (*inner.clone()).clone() { - VarBindingKind::VariantValueBinding { parent_enum, .. } => v2_rt::concat(", \"parent_enum\": ".to_string(), json_quote(parent_enum.clone())), - _ => "".to_string(), -}), "}".to_string()), - None => "null".to_string(), -}), "}".to_string()), - ExprData::ExprFieldAccess { summary, .. } => { - let field = field_access_field_at(expr_node.clone(), source_indices.clone()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprFieldAccess\", \"field\": ".to_string(), json_quote(field)), ", \"summary\": ".to_string()), match summary.clone() { - Some(inner) => serialize_field_summary(&inner), - None => "null".to_string(), -}), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for c in ch.iter().cloned() { __result.push(serialize_node(&c, &source_indices)); } __result }))), "}".to_string()) -}, - ExprData::ExprCall { call_semantics, descent_evidence: de, .. } => { - let func = expr_call_func_at(expr_node.clone(), source_indices.clone()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprCall\", \"func\": ".to_string(), json_quote(func)), ", \"call_semantics\": ".to_string()), serialize_call_semantics(call_semantics.clone())), ", \"descent_evidence\": ".to_string()), serialize_descent_evidence(de.clone())), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for c in ch.iter().cloned() { __result.push(serialize_node(&c, &source_indices)); } __result }))), "}".to_string()) -}, - ExprData::ExprMethodCall { method_semantics, .. } => { - let method = expr_method_name_at(expr_node.clone(), source_indices.clone()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprMethodCall\", \"method\": ".to_string(), json_quote(method)), ", \"method_semantics\": ".to_string()), serialize_method_semantics(method_semantics.clone(), &source_indices)), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for c in ch.iter().cloned() { __result.push(serialize_node(&c, &source_indices)); } __result }))), "}".to_string()) -}, - ExprData::ExprBinOp { op, algebra_field: af, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprBinOp\", \"op\": ".to_string(), json_quote(bin_op_name(op.clone()))), ", \"algebra_field\": ".to_string()), match af.clone() { - Some(f) => json_quote(algebra_field_kind_name(f.clone())), - None => "null".to_string(), -}), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for c in ch.iter().cloned() { __result.push(serialize_node(&c, &source_indices)); } __result }))), "}".to_string()), - ExprData::ExprUnaryOp { op, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprUnaryOp\", \"op\": ".to_string(), json_quote(unary_op_name(op.clone()))), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for c in ch.iter().cloned() { __result.push(serialize_node(&c, &source_indices)); } __result }))), "}".to_string()), - ExprData::ExprLambda => { - let params = lambda_param_names_at(expr_node.clone(), source_indices.clone()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprLambda\", \"params\": ".to_string(), json_list(Rc::new({ let mut __result = Vec::new(); for p in params.iter().cloned() { __result.push(json_quote(p.clone())); } __result }))), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for c in ch.iter().cloned() { __result.push(serialize_node(&c, &source_indices)); } __result }))), "}".to_string()) -}, - ExprData::ExprLet => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprLet\", \"name\": ".to_string(), json_quote(name)), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for c in ch.iter().cloned() { __result.push(serialize_node(&c, &source_indices)); } __result }))), "}".to_string()), - ExprData::ExprRecordLit { parent_enum, .. } => { - let type_name = record_lit_type_name_at(expr_node.clone(), source_indices.clone()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprRecordLit\", \"type_name\": ".to_string(), json_optional_string(type_name)), ", \"parent_enum\": ".to_string()), json_optional_string(parent_enum.clone())), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for c in ch.iter().cloned() { __result.push(serialize_node(&c, &source_indices)); } __result }))), "}".to_string()) -}, - ExprData::ExprForEach => { - let variable = foreach_variable_at(expr_node.clone(), source_indices.clone()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprForEach\", \"variable\": ".to_string(), json_quote(variable)), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for c in ch.iter().cloned() { __result.push(serialize_node(&c, &source_indices)); } __result }))), "}".to_string()) -}, - ExprData::ExprMatch => v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprMatch\"".to_string(), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for c in ch.iter().cloned() { __result.push(serialize_node(&c, &source_indices)); } __result }))), "}".to_string()), - ExprData::ExprIf => v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprIf\"".to_string(), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for c in ch.iter().cloned() { __result.push(serialize_node(&c, &source_indices)); } __result }))), "}".to_string()), - ExprData::ExprListLit => v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprListLit\"".to_string(), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for c in ch.iter().cloned() { __result.push(serialize_node(&c, &source_indices)); } __result }))), "}".to_string()), - ExprData::ExprStringInterp => v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprStringInterp\"".to_string(), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for c in ch.iter().cloned() { __result.push(serialize_node(&c, &source_indices)); } __result }))), "}".to_string()), - ExprData::ExprBlock => v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprBlock\"".to_string(), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for c in ch.iter().cloned() { __result.push(serialize_node(&c, &source_indices)); } __result }))), "}".to_string()), - ExprData::ExprCast => v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprCast\"".to_string(), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for c in ch.iter().cloned() { __result.push(serialize_node(&c, &source_indices)); } __result }))), "}".to_string()), - ExprData::ExprIndex => v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprIndex\"".to_string(), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for c in ch.iter().cloned() { __result.push(serialize_node(&c, &source_indices)); } __result }))), "}".to_string()), - ExprData::ExprSlice => v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprSlice\"".to_string(), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for c in ch.iter().cloned() { __result.push(serialize_node(&c, &source_indices)); } __result }))), "}".to_string()), - ExprData::ExprReturn => v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"ExprReturn\"".to_string(), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for c in ch.iter().cloned() { __result.push(serialize_node(&c, &source_indices)); } __result }))), "}".to_string()), -} -} -} - -pub fn serialize_inferred_node(inferred: Rc, source_indices: Rc>>) -> String { - match (*inferred).clone() { - InferredNode::Resolved { node, .. } => v2_rt::concat(v2_rt::concat("{\"kind\": \"Resolved\", \"node\": ".to_string(), serialize_node(&node, &source_indices)), "}".to_string()), - InferredNode::CompilerError { message, span, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"kind\": \"CompilerError\", \"message\": ".to_string(), json_quote(message.clone())), ", \"span\": ".to_string()), serialize_span(&span)), "}".to_string()), - InferredNode::TypeVariable { id, .. } => v2_rt::concat(v2_rt::concat("{\"kind\": \"TypeVariable\", \"id\": ".to_string(), json_quote(id.clone())), "}".to_string()), -} -} - -pub fn serialize_resource_use(resource_use: &Rc, source_indices: &Rc>>) -> String { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"name\": ".to_string(), json_quote(resource_use_name_at(resource_use.clone(), source_indices.clone()))), ", \"resource\": ".to_string()), serialize_node(&resource_use_resource(&resource_use), &source_indices)), ", \"span\": ".to_string()), serialize_span(&resource_use.span.clone())), "}".to_string()) -} - -pub fn serialize_field(field: &Rc, source_indices: &Rc>>) -> String { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"name\": ".to_string(), json_quote(field_node_name_at(field.clone(), source_indices.clone()))), ", \"type_expr\": ".to_string()), serialize_node(&field_node_type_expr(&field), &source_indices)), ", \"cardinality\": ".to_string()), json_quote(cardinality_name(field_node_cardinality(field.clone())))), ", \"default_value\": ".to_string()), json_optional_node(field_node_default_value(&field), source_indices.clone())), ", \"from_key\": ".to_string()), json_optional_string(field_node_from_key(field.clone(), source_indices.clone()))), ", \"span\": ".to_string()), serialize_span(&field_node_span(field.clone()))), "}".to_string()) + let name = authored_name_at(source_indices.clone(), &expr_node); + match (*expr_node.expr_data.clone()).clone() { + ExprData::NoExprData => "{\"kind\": \"NoExprData\"}".to_string(), + ExprData::ExprLiteral { value, .. } => v2_rt::concat( + v2_rt::concat( + "{\"kind\": \"ExprLiteral\", \"value\": ".to_string(), + serialize_literal(value.clone()), + ), + "}".to_string(), + ), + ExprData::ExprError { kind, message, .. } => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"kind\": \"ExprError\", \"error_kind\": ".to_string(), + json_quote(expr_error_kind_name(kind.clone())), + ), + ", \"message\": ".to_string(), + ), + json_quote(message.clone()), + ), + "}".to_string(), + ), + ExprData::ExprVar { binding_kind, .. } => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"kind\": \"ExprVar\", \"name\": ".to_string(), + json_quote(name), + ), + ", \"binding_kind\": ".to_string(), + ), + match binding_kind.clone() { + Some(inner) => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"kind\": ".to_string(), + json_quote(var_binding_kind_name(inner.clone())), + ), + match (*inner.clone()).clone() { + VarBindingKind::VariantValueBinding { parent_enum, .. } => { + v2_rt::concat( + ", \"parent_enum\": ".to_string(), + json_quote(parent_enum.clone()), + ) + } + _ => "".to_string(), + }, + ), + "}".to_string(), + ), + None => "null".to_string(), + }, + ), + "}".to_string(), + ), + ExprData::ExprFieldAccess { summary, .. } => { + let field = field_access_field_at(expr_node.clone(), source_indices.clone()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"kind\": \"ExprFieldAccess\", \"field\": ".to_string(), + json_quote(field), + ), + ", \"summary\": ".to_string(), + ), + match summary.clone() { + Some(inner) => serialize_field_summary(&inner), + None => "null".to_string(), + }, + ), + ", \"children\": ".to_string(), + ), + json_list(Rc::new({ + let mut __result = Vec::new(); + for c in ch.iter().cloned() { + __result.push(serialize_node(&c, &source_indices)); + } + __result + })), + ), + "}".to_string(), + ) + } + ExprData::ExprCall { + call_semantics, + descent_evidence: de, + .. + } => { + let func = expr_call_func_at(expr_node.clone(), source_indices.clone()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"kind\": \"ExprCall\", \"func\": ".to_string(), + json_quote(func), + ), + ", \"call_semantics\": ".to_string(), + ), + serialize_call_semantics(call_semantics.clone()), + ), + ", \"descent_evidence\": ".to_string(), + ), + serialize_descent_evidence(de.clone()), + ), + ", \"children\": ".to_string(), + ), + json_list(Rc::new({ + let mut __result = Vec::new(); + for c in ch.iter().cloned() { + __result.push(serialize_node(&c, &source_indices)); + } + __result + })), + ), + "}".to_string(), + ) + } + ExprData::ExprMethodCall { + method_semantics, .. + } => { + let method = expr_method_name_at(expr_node.clone(), source_indices.clone()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"kind\": \"ExprMethodCall\", \"method\": ".to_string(), + json_quote(method), + ), + ", \"method_semantics\": ".to_string(), + ), + serialize_method_semantics( + method_semantics.clone(), + &source_indices, + ), + ), + ", \"children\": ".to_string(), + ), + json_list(Rc::new({ + let mut __result = Vec::new(); + for c in ch.iter().cloned() { + __result.push(serialize_node(&c, &source_indices)); + } + __result + })), + ), + "}".to_string(), + ) + } + ExprData::ExprBinOp { + op, + algebra_field: af, + .. + } => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"kind\": \"ExprBinOp\", \"op\": ".to_string(), + json_quote(bin_op_name(op.clone())), + ), + ", \"algebra_field\": ".to_string(), + ), + match af.clone() { + Some(f) => json_quote(algebra_field_kind_name(f.clone())), + None => "null".to_string(), + }, + ), + ", \"children\": ".to_string(), + ), + json_list(Rc::new({ + let mut __result = Vec::new(); + for c in ch.iter().cloned() { + __result.push(serialize_node(&c, &source_indices)); + } + __result + })), + ), + "}".to_string(), + ), + ExprData::ExprUnaryOp { op, .. } => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"kind\": \"ExprUnaryOp\", \"op\": ".to_string(), + json_quote(unary_op_name(op.clone())), + ), + ", \"children\": ".to_string(), + ), + json_list(Rc::new({ + let mut __result = Vec::new(); + for c in ch.iter().cloned() { + __result.push(serialize_node(&c, &source_indices)); + } + __result + })), + ), + "}".to_string(), + ), + ExprData::ExprLambda => { + let params = lambda_param_names_at(expr_node.clone(), source_indices.clone()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"kind\": \"ExprLambda\", \"params\": ".to_string(), + json_list(Rc::new({ + let mut __result = Vec::new(); + for p in params.iter().cloned() { + __result.push(json_quote(p.clone())); + } + __result + })), + ), + ", \"children\": ".to_string(), + ), + json_list(Rc::new({ + let mut __result = Vec::new(); + for c in ch.iter().cloned() { + __result.push(serialize_node(&c, &source_indices)); + } + __result + })), + ), + "}".to_string(), + ) + } + ExprData::ExprLet => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"kind\": \"ExprLet\", \"name\": ".to_string(), + json_quote(name), + ), + ", \"children\": ".to_string(), + ), + json_list(Rc::new({ + let mut __result = Vec::new(); + for c in ch.iter().cloned() { + __result.push(serialize_node(&c, &source_indices)); + } + __result + })), + ), + "}".to_string(), + ), + ExprData::ExprRecordLit { parent_enum, .. } => { + let type_name = record_lit_type_name_at(expr_node.clone(), source_indices.clone()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"kind\": \"ExprRecordLit\", \"type_name\": ".to_string(), + json_optional_string(type_name), + ), + ", \"parent_enum\": ".to_string(), + ), + json_optional_string(parent_enum.clone()), + ), + ", \"children\": ".to_string(), + ), + json_list(Rc::new({ + let mut __result = Vec::new(); + for c in ch.iter().cloned() { + __result.push(serialize_node(&c, &source_indices)); + } + __result + })), + ), + "}".to_string(), + ) + } + ExprData::ExprForEach => { + let variable = foreach_variable_at(expr_node.clone(), source_indices.clone()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"kind\": \"ExprForEach\", \"variable\": ".to_string(), + json_quote(variable), + ), + ", \"children\": ".to_string(), + ), + json_list(Rc::new({ + let mut __result = Vec::new(); + for c in ch.iter().cloned() { + __result.push(serialize_node(&c, &source_indices)); + } + __result + })), + ), + "}".to_string(), + ) + } + ExprData::ExprMatch => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"kind\": \"ExprMatch\"".to_string(), + ", \"children\": ".to_string(), + ), + json_list(Rc::new({ + let mut __result = Vec::new(); + for c in ch.iter().cloned() { + __result.push(serialize_node(&c, &source_indices)); + } + __result + })), + ), + "}".to_string(), + ), + ExprData::ExprIf => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"kind\": \"ExprIf\"".to_string(), + ", \"children\": ".to_string(), + ), + json_list(Rc::new({ + let mut __result = Vec::new(); + for c in ch.iter().cloned() { + __result.push(serialize_node(&c, &source_indices)); + } + __result + })), + ), + "}".to_string(), + ), + ExprData::ExprListLit => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"kind\": \"ExprListLit\"".to_string(), + ", \"children\": ".to_string(), + ), + json_list(Rc::new({ + let mut __result = Vec::new(); + for c in ch.iter().cloned() { + __result.push(serialize_node(&c, &source_indices)); + } + __result + })), + ), + "}".to_string(), + ), + ExprData::ExprStringInterp => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"kind\": \"ExprStringInterp\"".to_string(), + ", \"children\": ".to_string(), + ), + json_list(Rc::new({ + let mut __result = Vec::new(); + for c in ch.iter().cloned() { + __result.push(serialize_node(&c, &source_indices)); + } + __result + })), + ), + "}".to_string(), + ), + ExprData::ExprBlock => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"kind\": \"ExprBlock\"".to_string(), + ", \"children\": ".to_string(), + ), + json_list(Rc::new({ + let mut __result = Vec::new(); + for c in ch.iter().cloned() { + __result.push(serialize_node(&c, &source_indices)); + } + __result + })), + ), + "}".to_string(), + ), + ExprData::ExprCast => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"kind\": \"ExprCast\"".to_string(), + ", \"children\": ".to_string(), + ), + json_list(Rc::new({ + let mut __result = Vec::new(); + for c in ch.iter().cloned() { + __result.push(serialize_node(&c, &source_indices)); + } + __result + })), + ), + "}".to_string(), + ), + ExprData::ExprIndex => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"kind\": \"ExprIndex\"".to_string(), + ", \"children\": ".to_string(), + ), + json_list(Rc::new({ + let mut __result = Vec::new(); + for c in ch.iter().cloned() { + __result.push(serialize_node(&c, &source_indices)); + } + __result + })), + ), + "}".to_string(), + ), + ExprData::ExprSlice => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"kind\": \"ExprSlice\"".to_string(), + ", \"children\": ".to_string(), + ), + json_list(Rc::new({ + let mut __result = Vec::new(); + for c in ch.iter().cloned() { + __result.push(serialize_node(&c, &source_indices)); + } + __result + })), + ), + "}".to_string(), + ), + ExprData::ExprReturn => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"kind\": \"ExprReturn\"".to_string(), + ", \"children\": ".to_string(), + ), + json_list(Rc::new({ + let mut __result = Vec::new(); + for c in ch.iter().cloned() { + __result.push(serialize_node(&c, &source_indices)); + } + __result + })), + ), + "}".to_string(), + ), + } + } } -pub fn serialize_param(param: &Rc, source_indices: &Rc>>) -> String { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"name\": ".to_string(), json_quote(param_node_name_at(param.clone(), source_indices.clone()))), ", \"type_expr\": ".to_string()), serialize_node(¶m_node_type_expr(¶m), &source_indices)), ", \"default_value\": ".to_string()), json_optional_node(param_node_default_value(¶m), source_indices.clone())), ", \"span\": ".to_string()), serialize_span(¶m_node_span(param.clone()))), "}".to_string()) +pub fn serialize_inferred_node( + inferred: Rc, + source_indices: Rc>>, +) -> String { + match (*inferred).clone() { + InferredNode::Resolved { node, .. } => v2_rt::concat( + v2_rt::concat( + "{\"kind\": \"Resolved\", \"node\": ".to_string(), + serialize_node(&node, &source_indices), + ), + "}".to_string(), + ), + InferredNode::CompilerError { message, span, .. } => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"kind\": \"CompilerError\", \"message\": ".to_string(), + json_quote(message.clone()), + ), + ", \"span\": ".to_string(), + ), + serialize_span(&span), + ), + "}".to_string(), + ), + InferredNode::TypeVariable { id, .. } => v2_rt::concat( + v2_rt::concat( + "{\"kind\": \"TypeVariable\", \"id\": ".to_string(), + json_quote(id.clone()), + ), + "}".to_string(), + ), + } } -pub fn serialize_node(node: &Rc, source_indices: &Rc>>) -> String { +pub fn serialize_resource_use( + resource_use: &Rc, + source_indices: &Rc>>, +) -> String { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"name\": ".to_string(), + json_quote(resource_use_name_at( + resource_use.clone(), + source_indices.clone(), + )), + ), + ", \"resource\": ".to_string(), + ), + serialize_node(&resource_use_resource(&resource_use), &source_indices), + ), + ", \"span\": ".to_string(), + ), + serialize_span(&resource_use.span.clone()), + ), + "}".to_string(), + ) +} + +pub fn serialize_field( + field: &Rc, + source_indices: &Rc>>, +) -> String { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"name\": ".to_string(), + json_quote(field_node_name_at( + field.clone(), + source_indices.clone(), + )), + ), + ", \"type_expr\": ".to_string(), + ), + serialize_node( + &field_node_type_expr(&field), + &source_indices, + ), + ), + ", \"cardinality\": ".to_string(), + ), + json_quote(cardinality_name(field_node_cardinality( + field.clone(), + ))), + ), + ", \"default_value\": ".to_string(), + ), + json_optional_node( + field_node_default_value(&field), + source_indices.clone(), + ), + ), + ", \"from_key\": ".to_string(), + ), + json_optional_string(field_node_from_key( + field.clone(), + source_indices.clone(), + )), + ), + ", \"span\": ".to_string(), + ), + serialize_span(&field_node_span(field.clone())), + ), + "}".to_string(), + ) +} + +pub fn serialize_param( + param: &Rc, + source_indices: &Rc>>, +) -> String { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"name\": ".to_string(), + json_quote(param_node_name_at( + param.clone(), + source_indices.clone(), + )), + ), + ", \"type_expr\": ".to_string(), + ), + serialize_node(¶m_node_type_expr(¶m), &source_indices), + ), + ", \"default_value\": ".to_string(), + ), + json_optional_node(param_node_default_value(¶m), source_indices.clone()), + ), + ", \"span\": ".to_string(), + ), + serialize_span(¶m_node_span(param.clone())), + ), + "}".to_string(), + ) +} + +pub fn serialize_node( + node: &Rc, + source_indices: &Rc>>, +) -> String { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"name\": ".to_string(), json_quote(authored_name_at(source_indices.clone(), &node))), ", \"span\": ".to_string()), serialize_span(&node.span.clone())), ", \"ident_span\": ".to_string()), json_optional_span(node.ident_span.clone())), ", \"children\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for child in node.children.clone().iter().cloned() { __result.push(serialize_node(&child, &source_indices)); } __result }))), ", \"connective\": ".to_string()), match node.connective.clone() { Connective::Conj => json_quote(connective_name(Connective::Conj)), @@ -495,234 +1566,546 @@ pub fn serialize_node(node: &Rc, source_indices: &Rc, source_indices: &Rc>>) -> String { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"name\": ".to_string(), json_quote(authored_name_at(source_indices.clone(), &module))), ", \"imports\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for imp in module_imports(module.clone()).iter().cloned() { __result.push(serialize_import_node(&imp, &source_indices)); } __result }))), ", \"span\": ".to_string()), serialize_span(&module.span.clone())), "}".to_string()) +pub fn serialize_module( + module: &Rc, + source_indices: &Rc>>, +) -> String { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"name\": ".to_string(), + json_quote(authored_name_at(source_indices.clone(), &module)), + ), + ", \"imports\": ".to_string(), + ), + json_list(Rc::new({ + let mut __result = Vec::new(); + for imp in module_imports(module.clone()).iter().cloned() { + __result.push(serialize_import_node(&imp, &source_indices)); + } + __result + })), + ), + ", \"span\": ".to_string(), + ), + serialize_span(&module.span.clone()), + ), + "}".to_string(), + ) } pub fn serialize_typed_module(module: &Rc) -> String { { let si = module.type_env.clone().source_indices.clone(); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"module\": ".to_string(), serialize_module(&module.module.clone(), &si)), ", \"items\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for item in module.items.clone().iter().cloned() { __result.push(serialize_node(&item, &si)); } __result }))), ", \"item_registry_keys\": ".to_string()), json_list(Rc::new({ let mut __result = Vec::new(); for k in Rc::new(v2_rt::map_keys(&module.item_registry.clone())).iter().cloned() { __result.push(json_quote(k.clone())); } __result }))), "}".to_string()) -} + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"module\": ".to_string(), + serialize_module(&module.module.clone(), &si), + ), + ", \"items\": ".to_string(), + ), + json_list(Rc::new({ + let mut __result = Vec::new(); + for item in module.items.clone().iter().cloned() { + __result.push(serialize_node(&item, &si)); + } + __result + })), + ), + ", \"item_registry_keys\": ".to_string(), + ), + json_list(Rc::new({ + let mut __result = Vec::new(); + for k in Rc::new(v2_rt::map_keys(&module.item_registry.clone())) + .iter() + .cloned() + { + __result.push(json_quote(k.clone())); + } + __result + })), + ), + "}".to_string(), + ) + } } pub fn serialize_diagnostic(diagnostic: &Rc) -> String { { let severity = "error".to_string(); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\"severity\": ".to_string(), json_quote(severity)), ", \"message\": ".to_string()), json_quote(diagnostic_to_message(diagnostic.diagnostic.clone()))), ", \"span\": ".to_string()), serialize_span(&diagnostic_to_span(diagnostic.diagnostic.clone()))), ", \"module_name\": ".to_string()), json_optional_string(Some(diagnostic.module_name.clone()))), ", \"category\": ".to_string()), "null".to_string()), "}".to_string()) -} + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\"severity\": ".to_string(), + json_quote(severity), + ), + ", \"message\": ".to_string(), + ), + json_quote(diagnostic_to_message( + diagnostic.diagnostic.clone(), + )), + ), + ", \"span\": ".to_string(), + ), + serialize_span(&diagnostic_to_span(diagnostic.diagnostic.clone())), + ), + ", \"module_name\": ".to_string(), + ), + json_optional_string(Some(diagnostic.module_name.clone())), + ), + ", \"category\": ".to_string(), + ), + "null".to_string(), + ), + "}".to_string(), + ) + } } pub fn emit_dag_artifact(typed: &Rc) -> Rc { { - let modules_json = Rc::new({ let mut __result = Vec::new(); for m in typed.modules.clone().iter().cloned() { __result.push(serialize_typed_module(&m)); } __result }).join(&", ".to_string()); -let diagnostics_json = Rc::new({ let mut __result = Vec::new(); for d in typed.diagnostics.clone().iter().cloned() { __result.push(serialize_diagnostic(&d)); } __result }).join(&", ".to_string()); -let item_registry_json = Rc::new({ let mut __result = Vec::new(); for k in Rc::new(v2_rt::map_keys(&typed.item_registry.clone())).iter().cloned() { __result.push(json_quote(k.clone())); } __result }).join(&", ".to_string()); -let json = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\n \"version\": \"0.1.0\",\n \"modules\": [".to_string(), modules_json), "],\n \"item_registry_keys\": [".to_string()), item_registry_json), "],\n \"diagnostics\": [".to_string()), diagnostics_json), "],\n \"files\": []\n}".to_string()); -Rc::new(EmitResult { - files: Rc::new(vec![Rc::new(TextFile { - path: "dag-artifact.json".to_string(), - content: json, -})]), - diagnostics: Rc::new(vec![]), -}) -} + let modules_json = Rc::new({ + let mut __result = Vec::new(); + for m in typed.modules.clone().iter().cloned() { + __result.push(serialize_typed_module(&m)); + } + __result + }) + .join(&", ".to_string()); + let diagnostics_json = Rc::new({ + let mut __result = Vec::new(); + for d in typed.diagnostics.clone().iter().cloned() { + __result.push(serialize_diagnostic(&d)); + } + __result + }) + .join(&", ".to_string()); + let item_registry_json = Rc::new({ + let mut __result = Vec::new(); + for k in Rc::new(v2_rt::map_keys(&typed.item_registry.clone())) + .iter() + .cloned() + { + __result.push(json_quote(k.clone())); + } + __result + }) + .join(&", ".to_string()); + let json = v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "{\n \"version\": \"0.1.0\",\n \"modules\": [".to_string(), + modules_json, + ), + "],\n \"item_registry_keys\": [".to_string(), + ), + item_registry_json, + ), + "],\n \"diagnostics\": [".to_string(), + ), + diagnostics_json, + ), + "],\n \"files\": []\n}".to_string(), + ); + Rc::new(EmitResult { + files: Rc::new(vec![Rc::new(TextFile { + path: "dag-artifact.json".to_string(), + content: json, + })]), + diagnostics: Rc::new(vec![]), + }) + } } pub fn boundary_ref_error(names: Rc>, ref_name: &String) -> Rc>> { - if { let mut __found = false; for n in names.iter().cloned() { if (n.clone().as_str() == ref_name.clone().as_str()) { __found = true; break; } } __found } { + if { + let mut __found = false; + for n in names.iter().cloned() { + if (n.clone().as_str() == ref_name.clone().as_str()) { + __found = true; + break; + } + } + __found + } { Rc::new(vec![]) } else { - Rc::new(vec![compile_bundle_error(v2_rt::concat(v2_rt::concat("boundary references unknown artifact '".to_string(), ref_name.clone()), "'".to_string()))]) + Rc::new(vec![compile_bundle_error(v2_rt::concat( + v2_rt::concat( + "boundary references unknown artifact '".to_string(), + ref_name.clone(), + ), + "'".to_string(), + ))]) } } pub fn validate_boundaries(plan: &Rc) -> Rc>> { { - let names = Rc::new({ let mut __result = Vec::new(); for a in plan.artifacts.clone().iter().cloned() { __result.push(a.name.clone()); } __result }); -Rc::new({ let mut __result = Vec::new(); for b in plan.boundaries.clone().iter().cloned() { __result.extend((*v2_rt::concat(boundary_ref_error(names.clone(), &b.from_artifact.clone()), boundary_ref_error(names.clone(), &b.to_artifact.clone()))).iter().cloned()); } __result }) -} + let names = Rc::new({ + let mut __result = Vec::new(); + for a in plan.artifacts.clone().iter().cloned() { + __result.push(a.name.clone()); + } + __result + }); + Rc::new({ + let mut __result = Vec::new(); + for b in plan.boundaries.clone().iter().cloned() { + __result.extend( + (*v2_rt::concat( + boundary_ref_error(names.clone(), &b.from_artifact.clone()), + boundary_ref_error(names.clone(), &b.to_artifact.clone()), + )) + .iter() + .cloned(), + ); + } + __result + }) + } } -pub fn emit_from_artifact_plan(typed: Rc, artifact_plan: &Rc) -> Rc { +pub fn emit_from_artifact_plan( + typed: Rc, + artifact_plan: &Rc, +) -> Rc { { if ((artifact_plan.artifacts.clone().len() as i64) == 0) { return Rc::new(EmitResult { - files: Rc::new(vec![]), - diagnostics: Rc::new(vec![compile_bundle_error("compile_sources planned no artifacts".to_string())]), -}) + files: Rc::new(vec![]), + diagnostics: Rc::new(vec![compile_bundle_error( + "compile_sources planned no artifacts".to_string(), + )]), + }); } -let boundary_diags = validate_boundaries(&artifact_plan); -if ((boundary_diags.clone().len() as i64) > 0) { + let boundary_diags = validate_boundaries(&artifact_plan); + if ((boundary_diags.clone().len() as i64) > 0) { return Rc::new(EmitResult { - files: Rc::new(vec![]), - diagnostics: boundary_diags.clone(), -}) + files: Rc::new(vec![]), + diagnostics: boundary_diags.clone(), + }); } -let results = Rc::new({ let mut __result = Vec::new(); for artifact in artifact_plan.artifacts.clone().iter().cloned() { __result.push(emit_artifact(typed.clone(), artifact.clone())); } __result }); -let all_files = Rc::new({ let mut __result = Vec::new(); for r in results.clone().iter().cloned() { __result.extend((*r.files.clone()).iter().cloned()); } __result }); -let all_diags = Rc::new({ let mut __result = Vec::new(); for r in results.clone().iter().cloned() { __result.extend((*r.diagnostics.clone()).iter().cloned()); } __result }); -Rc::new(EmitResult { - files: all_files, - diagnostics: all_diags, -}) -} + let results = Rc::new({ + let mut __result = Vec::new(); + for artifact in artifact_plan.artifacts.clone().iter().cloned() { + __result.push(emit_artifact(typed.clone(), artifact.clone())); + } + __result + }); + let all_files = Rc::new({ + let mut __result = Vec::new(); + for r in results.clone().iter().cloned() { + __result.extend((*r.files.clone()).iter().cloned()); + } + __result + }); + let all_diags = Rc::new({ + let mut __result = Vec::new(); + for r in results.clone().iter().cloned() { + __result.extend((*r.diagnostics.clone()).iter().cloned()); + } + __result + }); + Rc::new(EmitResult { + files: all_files, + diagnostics: all_diags, + }) + } } pub fn collect_diagnostics(parse_results: Rc>>) -> Rc>> { - parse_results.iter().cloned().fold(Rc::new(vec![]), |acc: Rc>>, pr: Rc| match pr.error.clone() { - Some(diag) => v2_rt::rc_list_push(acc.clone(), diag.clone()), - None => acc.clone(), -}) + parse_results.iter().cloned().fold( + Rc::new(vec![]), + |acc: Rc>>, pr: Rc| match pr.error.clone() { + Some(diag) => v2_rt::rc_list_push(acc.clone(), diag.clone()), + None => acc.clone(), + }, + ) } pub fn front_end_sources(sources: Rc>>) -> Rc { { - let acc = sources.iter().cloned().fold(Rc::new(FrontendAccum { - parse_results: Rc::new(vec![]), - newline_indices: Rc::new(vec![]), - intern_table: empty_intern_table(), -}), |acc: Rc, s: Rc| { let acc = Rc::try_unwrap(acc).unwrap_or_else(|rc| (*rc).clone()); { - let tokens = tokenize(&s.content.clone(), s.path.clone()); -let si = build_newline_index(s.path.clone(), &s.content.clone()); -let parsed = parse_with_table(&tokens, v2_rt::rc_map_insert(v2_rt::rc_empty_map::>(), si.file.clone(), si.clone()), acc.intern_table); -let pr = parsed.result.clone(); -Rc::new(FrontendAccum { - parse_results: v2_rt::rc_list_push(acc.parse_results, pr.clone()), - newline_indices: v2_rt::rc_list_push(acc.newline_indices, si.clone()), - intern_table: parsed.intern_table.clone(), -}) -} }); -let parse_results = acc.parse_results.clone(); -let newline_indices = acc.newline_indices.clone(); -let intern_table = acc.intern_table.clone(); -let parse_diagnostics = collect_diagnostics(parse_results.clone()); -let has_parse_errors = { let mut __found = false; for p in parse_results.clone().iter().cloned() { if (p.error.clone() != None) { __found = true; break; } } __found }; -if has_parse_errors { + let acc = sources.iter().cloned().fold( + Rc::new(FrontendAccum { + parse_results: Rc::new(vec![]), + newline_indices: Rc::new(vec![]), + intern_table: empty_intern_table(), + }), + |acc: Rc, s: Rc| { + let acc = Rc::try_unwrap(acc).unwrap_or_else(|rc| (*rc).clone()); + { + let tokens = tokenize(&s.content.clone(), s.path.clone()); + let si = build_newline_index(s.path.clone(), &s.content.clone()); + let parsed = parse_with_table( + &tokens, + v2_rt::rc_map_insert( + v2_rt::rc_empty_map::>(), + si.file.clone(), + si.clone(), + ), + acc.intern_table, + ); + let pr = parsed.result.clone(); + Rc::new(FrontendAccum { + parse_results: v2_rt::rc_list_push(acc.parse_results, pr.clone()), + newline_indices: v2_rt::rc_list_push(acc.newline_indices, si.clone()), + intern_table: parsed.intern_table.clone(), + }) + } + }, + ); + let parse_results = acc.parse_results.clone(); + let newline_indices = acc.newline_indices.clone(); + let intern_table = acc.intern_table.clone(); + let parse_diagnostics = collect_diagnostics(parse_results.clone()); + let has_parse_errors = { + let mut __found = false; + for p in parse_results.clone().iter().cloned() { + if (p.error.clone() != None) { + __found = true; + break; + } + } + __found + }; + if has_parse_errors { Rc::new(FrontendResult { - graph: None, - diagnostics: parse_diagnostics, - newline_indices: newline_indices.clone(), - intern_table: intern_table, -}) + graph: None, + diagnostics: parse_diagnostics, + newline_indices: newline_indices.clone(), + intern_table: intern_table, + }) } else { { - let modules = Rc::new({ let mut __result = Vec::new(); for p in parse_results.clone().iter().cloned() { __result.push(p.module.clone().clone().unwrap()); } __result }); -let source_indices = newline_indices.clone().iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, si: Rc| v2_rt::rc_map_insert(acc, si.file.clone(), si.clone())); -let graph = resolve_modules(&modules, &source_indices); -Rc::new(FrontendResult { - graph: Some(graph.clone()), - diagnostics: v2_rt::concat(parse_diagnostics, graph.diagnostics.clone()), - newline_indices: newline_indices.clone(), - intern_table: intern_table, -}) -} + let modules = Rc::new({ + let mut __result = Vec::new(); + for p in parse_results.clone().iter().cloned() { + __result.push(p.module.clone().clone().unwrap()); + } + __result + }); + let source_indices = newline_indices.clone().iter().cloned().fold( + v2_rt::rc_empty_map::>(), + |acc: Rc>>, si: Rc| { + v2_rt::rc_map_insert(acc, si.file.clone(), si.clone()) + }, + ); + let graph = resolve_modules(&modules, &source_indices); + Rc::new(FrontendResult { + graph: Some(graph.clone()), + diagnostics: v2_rt::concat(parse_diagnostics, graph.diagnostics.clone()), + newline_indices: newline_indices.clone(), + intern_table: intern_table, + }) + } } -} + } } pub fn resolve_sources(sources: Rc>>) -> Rc { { let frontend = front_end_sources(sources); -Rc::new(CompileResult { - files: Rc::new(vec![]), - diagnostics: frontend.diagnostics.clone(), -}) -} + Rc::new(CompileResult { + files: Rc::new(vec![]), + diagnostics: frontend.diagnostics.clone(), + }) + } } -pub fn compile_sources(sources: Rc>>, target: RenderTarget) -> Rc { +pub fn compile_sources( + sources: Rc>>, + target: RenderTarget, +) -> Rc { { let frontend = front_end_sources(sources); -let newline_indices = frontend.newline_indices.clone(); -match frontend.graph.clone() { - None => Rc::new(PipelineResult { - files: Rc::new(vec![]), - diagnostics: frontend.diagnostics.clone(), - complexity: empty_complexity_report(), - ownership: Rc::new(vec![]), - artifact_plan: empty_artifact_plan(), - newline_indices: newline_indices.clone(), -}), - Some(graph) => { - let graph_diags = graph.diagnostics.clone(); -let resolve_errors = Rc::new({ let mut __result = Vec::new(); for d in graph_diags.iter().cloned() { if is_error_diagnostic(d.diagnostic.clone()) { __result.push(d); } } __result }); -if ((resolve_errors.len() as i64) > 0) { - return Rc::new(PipelineResult { - files: Rc::new(vec![]), - diagnostics: frontend.diagnostics.clone(), - complexity: empty_complexity_report(), - ownership: Rc::new(vec![]), - artifact_plan: empty_artifact_plan(), - newline_indices: newline_indices.clone(), -}) - } -let source_indices = newline_indices.clone().iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, index: Rc| v2_rt::rc_map_insert(acc, index.file.clone(), index.clone())); -let norm = normalize_graph(&graph, source_indices.clone()); -let norm_diags = norm.diagnostics.clone(); -let norm_errors = Rc::new({ let mut __result = Vec::new(); for d in norm_diags.clone().iter().cloned() { if is_error_diagnostic(d.diagnostic.clone()) { __result.push(d); } } __result }); -if ((norm_errors.len() as i64) > 0) { - return Rc::new(PipelineResult { - files: Rc::new(vec![]), - diagnostics: v2_rt::concat(frontend.diagnostics.clone(), norm_diags.clone()), - complexity: empty_complexity_report(), - ownership: Rc::new(vec![]), - artifact_plan: empty_artifact_plan(), - newline_indices: newline_indices.clone(), -}) - } -let typed = reconcile(norm.graph.clone(), source_indices.clone(), frontend.intern_table.clone()); -let typed_diags = typed.diagnostics.clone(); -let func_entries = extract_func_entries(typed.clone()); -let recursion_ctx = build_recursion_context(typed.clone()); -let complexity = build_complexity_report(&func_entries, recursion_ctx, source_indices.clone()); -let complexity_diags = complexity_diagnostics(complexity.clone()); -let all_diags = v2_rt::concat(typed_diags.clone(), complexity_diags); -let type_errors = Rc::new({ let mut __result = Vec::new(); for d in typed_diags.clone().iter().cloned() { if is_error_diagnostic(d.diagnostic.clone()) { __result.push(d); } } __result }); -if ((type_errors.len() as i64) > 0) { - return Rc::new(PipelineResult { - files: Rc::new(vec![]), - diagnostics: v2_rt::concat(v2_rt::concat(frontend.diagnostics.clone(), norm_diags.clone()), all_diags.clone()), - complexity: complexity.clone(), - ownership: Rc::new(vec![]), - artifact_plan: empty_artifact_plan(), - newline_indices: newline_indices.clone(), -}) + let newline_indices = frontend.newline_indices.clone(); + match frontend.graph.clone() { + None => Rc::new(PipelineResult { + files: Rc::new(vec![]), + diagnostics: frontend.diagnostics.clone(), + complexity: empty_complexity_report(), + ownership: Rc::new(vec![]), + artifact_plan: empty_artifact_plan(), + newline_indices: newline_indices.clone(), + }), + Some(graph) => { + let graph_diags = graph.diagnostics.clone(); + let resolve_errors = Rc::new({ + let mut __result = Vec::new(); + for d in graph_diags.iter().cloned() { + if is_error_diagnostic(d.diagnostic.clone()) { + __result.push(d); + } + } + __result + }); + if ((resolve_errors.len() as i64) > 0) { + return Rc::new(PipelineResult { + files: Rc::new(vec![]), + diagnostics: frontend.diagnostics.clone(), + complexity: empty_complexity_report(), + ownership: Rc::new(vec![]), + artifact_plan: empty_artifact_plan(), + newline_indices: newline_indices.clone(), + }); + } + let source_indices = newline_indices.clone().iter().cloned().fold( + v2_rt::rc_empty_map::>(), + |acc: Rc>>, index: Rc| { + v2_rt::rc_map_insert(acc, index.file.clone(), index.clone()) + }, + ); + let norm = normalize_graph(&graph, source_indices.clone()); + let norm_diags = norm.diagnostics.clone(); + let norm_errors = Rc::new({ + let mut __result = Vec::new(); + for d in norm_diags.clone().iter().cloned() { + if is_error_diagnostic(d.diagnostic.clone()) { + __result.push(d); + } + } + __result + }); + if ((norm_errors.len() as i64) > 0) { + return Rc::new(PipelineResult { + files: Rc::new(vec![]), + diagnostics: v2_rt::concat( + frontend.diagnostics.clone(), + norm_diags.clone(), + ), + complexity: empty_complexity_report(), + ownership: Rc::new(vec![]), + artifact_plan: empty_artifact_plan(), + newline_indices: newline_indices.clone(), + }); + } + let typed = reconcile( + norm.graph.clone(), + source_indices.clone(), + frontend.intern_table.clone(), + ); + let typed_diags = typed.diagnostics.clone(); + let func_entries = extract_func_entries(typed.clone()); + let recursion_ctx = build_recursion_context(typed.clone()); + let complexity = + build_complexity_report(&func_entries, recursion_ctx, source_indices.clone()); + let complexity_diags = complexity_diagnostics(complexity.clone()); + let all_diags = v2_rt::concat(typed_diags.clone(), complexity_diags); + let type_errors = Rc::new({ + let mut __result = Vec::new(); + for d in typed_diags.clone().iter().cloned() { + if is_error_diagnostic(d.diagnostic.clone()) { + __result.push(d); + } + } + __result + }); + if ((type_errors.len() as i64) > 0) { + return Rc::new(PipelineResult { + files: Rc::new(vec![]), + diagnostics: v2_rt::concat( + v2_rt::concat(frontend.diagnostics.clone(), norm_diags.clone()), + all_diags.clone(), + ), + complexity: complexity.clone(), + ownership: Rc::new(vec![]), + artifact_plan: empty_artifact_plan(), + newline_indices: newline_indices.clone(), + }); + } + let ownership = extract_ownership_proofs(typed.clone()); + let ownership_diags = ownership_diagnostics(ownership.clone()); + let ownership_errors = Rc::new({ + let mut __result = Vec::new(); + for d in ownership_diags.clone().iter().cloned() { + if is_error_diagnostic(d.diagnostic.clone()) { + __result.push(d); + } + } + __result + }); + if ((ownership_errors.len() as i64) > 0) { + return Rc::new(PipelineResult { + files: Rc::new(vec![]), + diagnostics: v2_rt::concat( + v2_rt::concat( + v2_rt::concat(frontend.diagnostics.clone(), norm_diags.clone()), + all_diags.clone(), + ), + ownership_diags.clone(), + ), + complexity: complexity.clone(), + ownership: ownership.clone(), + artifact_plan: empty_artifact_plan(), + newline_indices: newline_indices.clone(), + }); + } + let artifact_plan = default_artifact_plan( + Rc::new({ + let mut __result = Vec::new(); + for m in typed.modules.clone().iter().cloned() { + __result + .push(authored_name_at(source_indices.clone(), &m.module.clone())); + } + __result + }), + target, + ); + let emit_result = emit_from_artifact_plan(typed.clone(), &artifact_plan); + let emit_files = emit_result.files.clone(); + let emit_diags = emit_result.diagnostics.clone(); + let emit_errors = Rc::new({ + let mut __result = Vec::new(); + for d in emit_diags.clone().iter().cloned() { + if is_error_diagnostic(d.diagnostic.clone()) { + __result.push(d); + } + } + __result + }); + let final_files = if ((emit_errors.len() as i64) > 0) { + Rc::new(vec![]) + } else { + emit_files + }; + Rc::new(PipelineResult { + files: final_files, + diagnostics: v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(frontend.diagnostics.clone(), norm_diags.clone()), + all_diags.clone(), + ), + ownership_diags.clone(), + ), + emit_diags.clone(), + ), + complexity: complexity.clone(), + ownership: ownership.clone(), + artifact_plan: artifact_plan.clone(), + newline_indices: newline_indices.clone(), + }) } -let ownership = extract_ownership_proofs(typed.clone()); -let ownership_diags = ownership_diagnostics(ownership.clone()); -let ownership_errors = Rc::new({ let mut __result = Vec::new(); for d in ownership_diags.clone().iter().cloned() { if is_error_diagnostic(d.diagnostic.clone()) { __result.push(d); } } __result }); -if ((ownership_errors.len() as i64) > 0) { - return Rc::new(PipelineResult { - files: Rc::new(vec![]), - diagnostics: v2_rt::concat(v2_rt::concat(v2_rt::concat(frontend.diagnostics.clone(), norm_diags.clone()), all_diags.clone()), ownership_diags.clone()), - complexity: complexity.clone(), - ownership: ownership.clone(), - artifact_plan: empty_artifact_plan(), - newline_indices: newline_indices.clone(), -}) - } -let artifact_plan = default_artifact_plan(Rc::new({ let mut __result = Vec::new(); for m in typed.modules.clone().iter().cloned() { __result.push(authored_name_at(source_indices.clone(), &m.module.clone())); } __result }), target); -let emit_result = emit_from_artifact_plan(typed.clone(), &artifact_plan); -let emit_files = emit_result.files.clone(); -let emit_diags = emit_result.diagnostics.clone(); -let emit_errors = Rc::new({ let mut __result = Vec::new(); for d in emit_diags.clone().iter().cloned() { if is_error_diagnostic(d.diagnostic.clone()) { __result.push(d); } } __result }); -let final_files = if ((emit_errors.len() as i64) > 0) { - Rc::new(vec![]) - } else { - emit_files - }; -Rc::new(PipelineResult { - files: final_files, - diagnostics: v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(frontend.diagnostics.clone(), norm_diags.clone()), all_diags.clone()), ownership_diags.clone()), emit_diags.clone()), - complexity: complexity.clone(), - ownership: ownership.clone(), - artifact_plan: artifact_plan.clone(), - newline_indices: newline_indices.clone(), -}) -}, -} -} + } + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -738,83 +2121,143 @@ pub struct ResolvedPipelineResult { pub fn compile_to_resolved(sources: Rc>>) -> Rc { { let frontend = front_end_sources(sources); -let newline_indices = frontend.newline_indices.clone(); -match frontend.graph.clone() { - None => Rc::new(ResolvedPipelineResult { - graph: None, - diagnostics: frontend.diagnostics.clone(), - source_indices: v2_rt::rc_empty_map::>(), - complexity: empty_complexity_report(), - ownership: Rc::new(vec![]), - newline_indices: newline_indices.clone(), -}), - Some(graph) => { - let graph_diags = graph.diagnostics.clone(); -let resolve_errors = Rc::new({ let mut __result = Vec::new(); for d in graph_diags.iter().cloned() { if is_error_diagnostic(d.diagnostic.clone()) { __result.push(d); } } __result }); -if ((resolve_errors.len() as i64) > 0) { - return Rc::new(ResolvedPipelineResult { - graph: None, - diagnostics: frontend.diagnostics.clone(), - source_indices: v2_rt::rc_empty_map::>(), - complexity: empty_complexity_report(), - ownership: Rc::new(vec![]), - newline_indices: newline_indices.clone(), -}) - } -let source_indices = newline_indices.clone().iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, index: Rc| v2_rt::rc_map_insert(acc, index.file.clone(), index.clone())); -let norm = normalize_graph(&graph, source_indices.clone()); -let norm_diags = norm.diagnostics.clone(); -let norm_errors = Rc::new({ let mut __result = Vec::new(); for d in norm_diags.clone().iter().cloned() { if is_error_diagnostic(d.diagnostic.clone()) { __result.push(d); } } __result }); -if ((norm_errors.len() as i64) > 0) { - return Rc::new(ResolvedPipelineResult { - graph: None, - diagnostics: v2_rt::concat(frontend.diagnostics.clone(), norm_diags.clone()), - source_indices: source_indices.clone(), - complexity: empty_complexity_report(), - ownership: Rc::new(vec![]), - newline_indices: newline_indices.clone(), -}) - } -let typed = reconcile(norm.graph.clone(), source_indices.clone(), frontend.intern_table.clone()); -let typed_diags = typed.diagnostics.clone(); -let func_entries = extract_func_entries(typed.clone()); -let recursion_ctx = build_recursion_context(typed.clone()); -let complexity = build_complexity_report(&func_entries, recursion_ctx, source_indices.clone()); -let complexity_diags = complexity_diagnostics(complexity.clone()); -let all_diags = v2_rt::concat(typed_diags.clone(), complexity_diags); -let type_errors = Rc::new({ let mut __result = Vec::new(); for d in typed_diags.clone().iter().cloned() { if is_error_diagnostic(d.diagnostic.clone()) { __result.push(d); } } __result }); -if ((type_errors.len() as i64) > 0) { - return Rc::new(ResolvedPipelineResult { - graph: None, - diagnostics: v2_rt::concat(v2_rt::concat(frontend.diagnostics.clone(), norm_diags.clone()), all_diags.clone()), - source_indices: source_indices.clone(), - complexity: complexity.clone(), - ownership: Rc::new(vec![]), - newline_indices: newline_indices.clone(), -}) + let newline_indices = frontend.newline_indices.clone(); + match frontend.graph.clone() { + None => Rc::new(ResolvedPipelineResult { + graph: None, + diagnostics: frontend.diagnostics.clone(), + source_indices: v2_rt::rc_empty_map::>(), + complexity: empty_complexity_report(), + ownership: Rc::new(vec![]), + newline_indices: newline_indices.clone(), + }), + Some(graph) => { + let graph_diags = graph.diagnostics.clone(); + let resolve_errors = Rc::new({ + let mut __result = Vec::new(); + for d in graph_diags.iter().cloned() { + if is_error_diagnostic(d.diagnostic.clone()) { + __result.push(d); + } + } + __result + }); + if ((resolve_errors.len() as i64) > 0) { + return Rc::new(ResolvedPipelineResult { + graph: None, + diagnostics: frontend.diagnostics.clone(), + source_indices: v2_rt::rc_empty_map::>(), + complexity: empty_complexity_report(), + ownership: Rc::new(vec![]), + newline_indices: newline_indices.clone(), + }); + } + let source_indices = newline_indices.clone().iter().cloned().fold( + v2_rt::rc_empty_map::>(), + |acc: Rc>>, index: Rc| { + v2_rt::rc_map_insert(acc, index.file.clone(), index.clone()) + }, + ); + let norm = normalize_graph(&graph, source_indices.clone()); + let norm_diags = norm.diagnostics.clone(); + let norm_errors = Rc::new({ + let mut __result = Vec::new(); + for d in norm_diags.clone().iter().cloned() { + if is_error_diagnostic(d.diagnostic.clone()) { + __result.push(d); + } + } + __result + }); + if ((norm_errors.len() as i64) > 0) { + return Rc::new(ResolvedPipelineResult { + graph: None, + diagnostics: v2_rt::concat( + frontend.diagnostics.clone(), + norm_diags.clone(), + ), + source_indices: source_indices.clone(), + complexity: empty_complexity_report(), + ownership: Rc::new(vec![]), + newline_indices: newline_indices.clone(), + }); + } + let typed = reconcile( + norm.graph.clone(), + source_indices.clone(), + frontend.intern_table.clone(), + ); + let typed_diags = typed.diagnostics.clone(); + let func_entries = extract_func_entries(typed.clone()); + let recursion_ctx = build_recursion_context(typed.clone()); + let complexity = + build_complexity_report(&func_entries, recursion_ctx, source_indices.clone()); + let complexity_diags = complexity_diagnostics(complexity.clone()); + let all_diags = v2_rt::concat(typed_diags.clone(), complexity_diags); + let type_errors = Rc::new({ + let mut __result = Vec::new(); + for d in typed_diags.clone().iter().cloned() { + if is_error_diagnostic(d.diagnostic.clone()) { + __result.push(d); + } + } + __result + }); + if ((type_errors.len() as i64) > 0) { + return Rc::new(ResolvedPipelineResult { + graph: None, + diagnostics: v2_rt::concat( + v2_rt::concat(frontend.diagnostics.clone(), norm_diags.clone()), + all_diags.clone(), + ), + source_indices: source_indices.clone(), + complexity: complexity.clone(), + ownership: Rc::new(vec![]), + newline_indices: newline_indices.clone(), + }); + } + let ownership = extract_ownership_proofs(typed.clone()); + let ownership_diags = ownership_diagnostics(ownership.clone()); + let ownership_errors = Rc::new({ + let mut __result = Vec::new(); + for d in ownership_diags.clone().iter().cloned() { + if is_error_diagnostic(d.diagnostic.clone()) { + __result.push(d); + } + } + __result + }); + if ((ownership_errors.len() as i64) > 0) { + return Rc::new(ResolvedPipelineResult { + graph: None, + diagnostics: v2_rt::concat( + v2_rt::concat( + v2_rt::concat(frontend.diagnostics.clone(), norm_diags.clone()), + all_diags.clone(), + ), + ownership_diags.clone(), + ), + source_indices: source_indices.clone(), + complexity: complexity.clone(), + ownership: ownership.clone(), + newline_indices: newline_indices.clone(), + }); + } + Rc::new(ResolvedPipelineResult { + graph: Some(typed.clone()), + diagnostics: v2_rt::concat( + v2_rt::concat( + v2_rt::concat(frontend.diagnostics.clone(), norm_diags.clone()), + all_diags.clone(), + ), + ownership_diags.clone(), + ), + source_indices: source_indices.clone(), + complexity: complexity.clone(), + ownership: ownership.clone(), + newline_indices: newline_indices.clone(), + }) } -let ownership = extract_ownership_proofs(typed.clone()); -let ownership_diags = ownership_diagnostics(ownership.clone()); -let ownership_errors = Rc::new({ let mut __result = Vec::new(); for d in ownership_diags.clone().iter().cloned() { if is_error_diagnostic(d.diagnostic.clone()) { __result.push(d); } } __result }); -if ((ownership_errors.len() as i64) > 0) { - return Rc::new(ResolvedPipelineResult { - graph: None, - diagnostics: v2_rt::concat(v2_rt::concat(v2_rt::concat(frontend.diagnostics.clone(), norm_diags.clone()), all_diags.clone()), ownership_diags.clone()), - source_indices: source_indices.clone(), - complexity: complexity.clone(), - ownership: ownership.clone(), - newline_indices: newline_indices.clone(), -}) - } -Rc::new(ResolvedPipelineResult { - graph: Some(typed.clone()), - diagnostics: v2_rt::concat(v2_rt::concat(v2_rt::concat(frontend.diagnostics.clone(), norm_diags.clone()), all_diags.clone()), ownership_diags.clone()), - source_indices: source_indices.clone(), - complexity: complexity.clone(), - ownership: ownership.clone(), - newline_indices: newline_indices.clone(), -}) -}, -} -} + } + } } diff --git a/src/v2/stage0/src/v2_compiler_compiler_tests_rust.rs b/src/v2/stage0/src/v2_compiler_compiler_tests_rust.rs index 664d4b467fa..1f2d41a19e1 100644 --- a/src/v2/stage0/src/v2_compiler_compiler_tests_rust.rs +++ b/src/v2/stage0/src/v2_compiler_compiler_tests_rust.rs @@ -1,18 +1,31 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.compiler_tests_rust -use std::collections::HashMap; -use std::rc::Rc; +pub use crate::v2_compiler_artifact::RenderTarget; +use crate::v2_compiler_artifact::RenderTarget::{Go, Python, Rust}; +use crate::v2_compiler_coercion::CoercionAssertion::{ + CheckpointAssertion, ContainerAssertion, CopyAssertion, TemplateAssertion, +}; +pub use crate::v2_compiler_coercion::{ + extract_coercion_tests, CoercionAssertion, CoercionTestEntry, +}; use crate::v2_rt; -use crate::NonEmptyVec; use crate::NonEmptyBTreeSet; -pub use crate::v2_compiler_artifact::{RenderTarget}; -use crate::v2_compiler_artifact::RenderTarget::{Rust, Python, Go}; -pub use crate::v2_compiler_coercion::{extract_coercion_tests, CoercionTestEntry, CoercionAssertion}; -use crate::v2_compiler_coercion::CoercionAssertion::{CheckpointAssertion, ContainerAssertion, CopyAssertion, TemplateAssertion}; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; pub fn ct_module_header() -> String { - v2_rt::concat(v2_rt::concat(v2_rt::concat("#[cfg(test)]\n".to_string(), "mod compiler_tests {\n".to_string()), " use std::collections::HashMap;\n".to_string()), " use crate::v2_compiler_tokenize::tokenize;\n\n".to_string()) + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "#[cfg(test)]\n".to_string(), + "mod compiler_tests {\n".to_string(), + ), + " use std::collections::HashMap;\n".to_string(), + ), + " use crate::v2_compiler_tokenize::tokenize;\n\n".to_string(), + ) } pub fn ct_workspace_helpers() -> String { @@ -74,67 +87,189 @@ pub fn ct_type_size_test() -> String { pub fn ct_coercion_tests() -> String { { let entries = extract_coercion_tests(); -let test_fns = Rc::new({ let mut __result = Vec::new(); for e in entries.iter().cloned() { __result.push(render_coercion_test_rust(&e)); } __result }); -v2_rt::concat(v2_rt::concat(v2_rt::concat(" // =========================================================================\n".to_string(), " // Coercion registry tests (auto-generated from data declarations)\n".to_string()), " // =========================================================================\n\n".to_string()), test_fns.join(&"\n".to_string())) -} + let test_fns = Rc::new({ + let mut __result = Vec::new(); + for e in entries.iter().cloned() { + __result.push(render_coercion_test_rust(&e)); + } + __result + }); + v2_rt::concat(v2_rt::concat(v2_rt::concat(" // =========================================================================\n".to_string(), " // Coercion registry tests (auto-generated from data declarations)\n".to_string()), " // =========================================================================\n\n".to_string()), test_fns.join(&"\n".to_string())) + } } pub fn render_target_rust_enum(target: RenderTarget) -> String { match target { - RenderTarget::Rust => "RenderTarget::Rust".to_string(), - RenderTarget::Python => "RenderTarget::Python".to_string(), - RenderTarget::Go => "RenderTarget::Go".to_string(), - RenderTarget::Dag => "RenderTarget::Dag".to_string(), -} + RenderTarget::Rust => "RenderTarget::Rust".to_string(), + RenderTarget::Python => "RenderTarget::Python".to_string(), + RenderTarget::Go => "RenderTarget::Go".to_string(), + RenderTarget::Dag => "RenderTarget::Dag".to_string(), + } } pub fn render_coercion_test_rust(entry: &Rc) -> String { { - let assertions = Rc::new({ let mut __result = Vec::new(); for a in entry.assertions.clone().iter().cloned() { __result.push(render_coercion_assertion_rust(a.clone())); } __result }); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" #[test]\n".to_string(), " fn ".to_string()), entry.test_name.clone()), "() {\n".to_string()), " use crate::v2_compiler_coercion::*;\n".to_string()), assertions.join(&"".to_string())), " }\n\n".to_string()) -} + let assertions = Rc::new({ + let mut __result = Vec::new(); + for a in entry.assertions.clone().iter().cloned() { + __result.push(render_coercion_assertion_rust(a.clone())); + } + __result + }); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(" #[test]\n".to_string(), " fn ".to_string()), + entry.test_name.clone(), + ), + "() {\n".to_string(), + ), + " use crate::v2_compiler_coercion::*;\n".to_string(), + ), + assertions.join(&"".to_string()), + ), + " }\n\n".to_string(), + ) + } } pub fn first_or_empty(items: Rc>) -> String { match items.first().cloned() { - Some(v) => v.clone(), - None => "".to_string(), -} + Some(v) => v.clone(), + None => "".to_string(), + } } pub fn second_or_empty(items: Rc>) -> String { match items.get(1 as usize).cloned() { - Some(v) => v.clone(), - None => "".to_string(), -} + Some(v) => v.clone(), + None => "".to_string(), + } } pub fn render_coercion_assertion_rust(a: Rc) -> String { match (*a).clone() { - CoercionAssertion::CheckpointAssertion { target: t, dag_name: name, expected_type: expected, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" assert_eq!(coerce_primitive_type(".to_string(), render_target_rust_enum(t.clone())), ", \"".to_string()), name.clone()), "\".into()), \"".to_string()), expected.clone()), "\");\n".to_string()), - CoercionAssertion::ContainerAssertion { target: t, container_name: name, expected_template: expected, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" assert_eq!(coerce_container_template(".to_string(), render_target_rust_enum(t.clone())), ", \"".to_string()), name.clone()), "\".into()), Some(\"".to_string()), expected.clone()), "\".to_string()));\n".to_string()), - CoercionAssertion::CopyAssertion { target: t, dag_name: name, expected_copy: expected, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" assert_eq!(is_copy(".to_string(), render_target_rust_enum(t.clone())), ", \"".to_string()), name.clone()), "\".into()), Some(".to_string()), if expected.clone() { - "true".to_string() - } else { - "false".to_string() - }), "));\n".to_string()), - CoercionAssertion::TemplateAssertion { template: tmpl, args: arg_list, expected, .. } => if ((arg_list.clone().len() as i64) == 1) { - { - let arg0 = first_or_empty(arg_list.clone()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" assert_eq!(apply_inhabitant_template1(\"".to_string(), tmpl.clone()), "\".into(), \"".to_string()), arg0), "\".into()), \"".to_string()), expected.clone()), "\");\n".to_string()) -} - } else { - if ((arg_list.clone().len() as i64) == 2) { - { - let arg0 = first_or_empty(arg_list.clone()); -let arg1 = second_or_empty(arg_list.clone()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" assert_eq!(apply_inhabitant_template2(\"".to_string(), tmpl.clone()), "\".into(), \"".to_string()), arg0), "\".into(), \"".to_string()), arg1), "\".into()), \"".to_string()), expected.clone()), "\");\n".to_string()) -} - } else { - "".to_string() + CoercionAssertion::CheckpointAssertion { + target: t, + dag_name: name, + expected_type: expected, + .. + } => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + " assert_eq!(coerce_primitive_type(".to_string(), + render_target_rust_enum(t.clone()), + ), + ", \"".to_string(), + ), + name.clone(), + ), + "\".into()), \"".to_string(), + ), + expected.clone(), + ), + "\");\n".to_string(), + ), + CoercionAssertion::ContainerAssertion { + target: t, + container_name: name, + expected_template: expected, + .. + } => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + " assert_eq!(coerce_container_template(".to_string(), + render_target_rust_enum(t.clone()), + ), + ", \"".to_string(), + ), + name.clone(), + ), + "\".into()), Some(\"".to_string(), + ), + expected.clone(), + ), + "\".to_string()));\n".to_string(), + ), + CoercionAssertion::CopyAssertion { + target: t, + dag_name: name, + expected_copy: expected, + .. + } => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + " assert_eq!(is_copy(".to_string(), + render_target_rust_enum(t.clone()), + ), + ", \"".to_string(), + ), + name.clone(), + ), + "\".into()), Some(".to_string(), + ), + if expected.clone() { + "true".to_string() + } else { + "false".to_string() + }, + ), + "));\n".to_string(), + ), + CoercionAssertion::TemplateAssertion { + template: tmpl, + args: arg_list, + expected, + .. + } => { + if ((arg_list.clone().len() as i64) == 1) { + { + let arg0 = first_or_empty(arg_list.clone()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + " assert_eq!(apply_inhabitant_template1(\"" + .to_string(), + tmpl.clone(), + ), + "\".into(), \"".to_string(), + ), + arg0, + ), + "\".into()), \"".to_string(), + ), + expected.clone(), + ), + "\");\n".to_string(), + ) + } + } else { + if ((arg_list.clone().len() as i64) == 2) { + { + let arg0 = first_or_empty(arg_list.clone()); + let arg1 = second_or_empty(arg_list.clone()); + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" assert_eq!(apply_inhabitant_template2(\"".to_string(), tmpl.clone()), "\".into(), \"".to_string()), arg0), "\".into(), \"".to_string()), arg1), "\".into()), \"".to_string()), expected.clone()), "\");\n".to_string()) + } + } else { + "".to_string() + } + } } - }, -} + } } pub fn ct_profile_helpers() -> String { diff --git a/src/v2/stage0/src/v2_compiler_complexity.rs b/src/v2/stage0/src/v2_compiler_complexity.rs index 725f0c52d46..c1e41046c5d 100644 --- a/src/v2/stage0/src/v2_compiler_complexity.rs +++ b/src/v2/stage0/src/v2_compiler_complexity.rs @@ -1,45 +1,93 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.complexity -use std::collections::HashMap; -use std::rc::Rc; -use crate::v2_rt; -use crate::NonEmptyVec; -use crate::NonEmptyBTreeSet; -pub use crate::std_types::{SourceSpan}; -pub use crate::v2_compiler_emit::{to_string}; -pub use crate::v2_compiler_parse::{ParserResultWitness, parser_progress_flag_var, parser_passthrough_state_expr, parser_result_witness, ParserCallIdentity}; -use crate::v2_compiler_parse::ParserResultWitness::{ParserWitnessAdvance, ParserWitnessExpect, ParserWitnessEat, ParserWitnessCall, ParserWitnessOpaque}; -use crate::v2_compiler_parse::ParserCallIdentity::{ParserCallHelper, ParserCallFunction}; -pub use crate::std_termination::{DescentEvidence, RankingDimension, DescentSource, TerminationProof, ProofEdge, merge_evidence, join_evidence, evidence_rank, optional_evidence_meet, map_evidence_merge_at, PositiveDescentAmount}; -use crate::std_termination::DescentEvidence::{Strict, NonIncreasing, DescentUnknown}; -use crate::std_termination::RankingDimension::{TreeSize, ListLength, ArithmeticValue, TokenPosition, SetCardinality}; -use crate::std_termination::DescentSource::{ChildAccessor, ListShrink, ArithmeticSubtractDescent, ArithmeticDivideDescent, ParserAdvance, SetRemoval, FoldIteration}; -use crate::std_termination::PositiveDescentAmount::{OneStep}; -pub use crate::std_computation::{CallPattern, LoweringTarget, lower_call_pattern, size_bound_param, IterationDimension, type_iteration_dimension}; -use crate::std_computation::CallPattern::{ChildAccessorCall, CollectionShrinkCall, ArithmeticSubtractCall, ParserAdvanceCall, WorklistDrainCall, FoldBodyCall, SameArgumentCall}; -use crate::std_computation::IterationDimension::{TreeDescent, CollectionFold, ArithmeticRepeat}; -pub use crate::std_induction::{SubValueRelation, ShrinkFactor, CostBound, AtomicCost, PolynomialExponent, sub_value_to_evidence, sub_value_to_call_pattern, sub_value_to_lowering_target, catamorphism_bound, derive_bound}; -use crate::std_induction::SubValueRelation::{StrictSubValue, IteratedSubValue, ArithmeticDescent, PreservedValue, SubValueUnknown}; -use crate::std_induction::ShrinkFactor::{UnitShrink, ConstantShrink, ProportionalShrink}; -use crate::std_induction::CostBound::{ConstantBound, AtomicBound, ForeverBound, ErrorBound}; -use crate::std_induction::AtomicCost::{PolyCost}; -use crate::std_induction::PolynomialExponent::*; -pub use crate::v2_std_core::{Node, NewlineIndex, ExprData, BinOp, MatchPattern, field_init_node_name_at, field_init_node_value, arg_name_at, arg_value, arm_body, arm_guard, arm_pattern, MethodSemantics, binop_left, binop_right, field_binding_pattern, foreach_collection, foreach_body, if_condition, if_then_branch, if_else_branch, let_value, let_body, let_binding_name_at, match_scrutinee, match_arm_nodes, method_receiver, method_arg_nodes, param_node_name_at, param_node_type_expr, return_value, expr_call_func_at, expr_var_name_at, field_access_base, field_access_field_at, LiteralValue, is_child_accessor_in_model, lambda_param_names_at, lambda_body, is_children_list_field, is_sub_value_field, is_tree_size_preserving, is_tree_size_reducing, authored_name_at}; -use crate::v2_std_core::ExprData::{ExprLiteral, ExprError, ExprVar, ExprFieldAccess, ExprCall, ExprMethodCall, ExprBinOp, ExprUnaryOp, ExprMatch, ExprIf, ExprLet, ExprRecordLit, ExprBlock, ExprForEach, ExprReturn, ExprLambda}; -use crate::v2_std_core::BinOp::{Sub, Div}; -use crate::v2_std_core::MatchPattern::{Bind, VariantPattern}; -use crate::v2_std_core::MethodSemantics::{AlgebraMethodSemantics, PlainMethodSemantics, ServiceMethodSemantics}; -use crate::v2_std_core::LiteralValue::{LitNull, LitInt}; -pub use crate::v2_compiler_infer_types::{resolved_type, node_is_collection}; -pub use crate::std_algebra::{CollectionSizeEffect, CostShape}; -use crate::std_algebra::CollectionSizeEffect::{ShrinkEffect, ProjectionEffect, IdentityEffect}; -use crate::std_algebra::CostShape::{ShapeConstant, ShapeLinearScan, ShapeIterateBody, ShapeSortBody}; -pub use crate::std_graph::{CallGraph, DfsFinishAcc, SccComponentAcc, SccCycleAcc, seed_adjacency_map, build_call_graph_from_proof_edges, dfs_finish_order, dfs_collect_component, graph_has_multi_node_scc, is_lexicographic_descent, is_valid_proof}; -use self::SizeExpr::*; -use self::CostExpr::*; use self::Certainty::*; +use self::CostExpr::*; use self::ParserResultSource::*; +use self::SizeExpr::*; +use crate::std_algebra::CollectionSizeEffect::{IdentityEffect, ProjectionEffect, ShrinkEffect}; +use crate::std_algebra::CostShape::{ + ShapeConstant, ShapeIterateBody, ShapeLinearScan, ShapeSortBody, +}; +pub use crate::std_algebra::{CollectionSizeEffect, CostShape}; +use crate::std_computation::CallPattern::{ + ArithmeticSubtractCall, ChildAccessorCall, CollectionShrinkCall, FoldBodyCall, + ParserAdvanceCall, SameArgumentCall, WorklistDrainCall, +}; +use crate::std_computation::IterationDimension::{ArithmeticRepeat, CollectionFold, TreeDescent}; +pub use crate::std_computation::{ + lower_call_pattern, size_bound_param, type_iteration_dimension, CallPattern, + IterationDimension, LoweringTarget, +}; +pub use crate::std_graph::{ + build_call_graph_from_proof_edges, dfs_collect_component, dfs_finish_order, + graph_has_multi_node_scc, is_lexicographic_descent, is_valid_proof, seed_adjacency_map, + CallGraph, DfsFinishAcc, SccComponentAcc, SccCycleAcc, +}; +use crate::std_induction::AtomicCost::PolyCost; +use crate::std_induction::CostBound::{AtomicBound, ConstantBound, ErrorBound, ForeverBound}; +use crate::std_induction::PolynomialExponent::*; +use crate::std_induction::ShrinkFactor::{ConstantShrink, ProportionalShrink, UnitShrink}; +use crate::std_induction::SubValueRelation::{ + ArithmeticDescent, IteratedSubValue, PreservedValue, StrictSubValue, SubValueUnknown, +}; +pub use crate::std_induction::{ + catamorphism_bound, derive_bound, sub_value_to_call_pattern, sub_value_to_evidence, + sub_value_to_lowering_target, AtomicCost, CostBound, PolynomialExponent, ShrinkFactor, + SubValueRelation, +}; +use crate::std_termination::DescentEvidence::{DescentUnknown, NonIncreasing, Strict}; +use crate::std_termination::DescentSource::{ + ArithmeticDivideDescent, ArithmeticSubtractDescent, ChildAccessor, FoldIteration, ListShrink, + ParserAdvance, SetRemoval, +}; +use crate::std_termination::PositiveDescentAmount::OneStep; +use crate::std_termination::RankingDimension::{ + ArithmeticValue, ListLength, SetCardinality, TokenPosition, TreeSize, +}; +pub use crate::std_termination::{ + evidence_rank, join_evidence, map_evidence_merge_at, merge_evidence, optional_evidence_meet, + DescentEvidence, DescentSource, PositiveDescentAmount, ProofEdge, RankingDimension, + TerminationProof, +}; +pub use crate::std_types::SourceSpan; +pub use crate::v2_compiler_emit::to_string; +pub use crate::v2_compiler_infer_types::{node_is_collection, resolved_type}; +use crate::v2_compiler_parse::ParserCallIdentity::{ParserCallFunction, ParserCallHelper}; +use crate::v2_compiler_parse::ParserResultWitness::{ + ParserWitnessAdvance, ParserWitnessCall, ParserWitnessEat, ParserWitnessExpect, + ParserWitnessOpaque, +}; +pub use crate::v2_compiler_parse::{ + parser_passthrough_state_expr, parser_progress_flag_var, parser_result_witness, + ParserCallIdentity, ParserResultWitness, +}; +use crate::v2_rt; +use crate::v2_std_core::BinOp::{Div, Sub}; +use crate::v2_std_core::ExprData::{ + ExprBinOp, ExprBlock, ExprCall, ExprError, ExprFieldAccess, ExprForEach, ExprIf, ExprLambda, + ExprLet, ExprLiteral, ExprMatch, ExprMethodCall, ExprRecordLit, ExprReturn, ExprUnaryOp, + ExprVar, +}; +use crate::v2_std_core::LiteralValue::{LitInt, LitNull}; +use crate::v2_std_core::MatchPattern::{Bind, VariantPattern}; +use crate::v2_std_core::MethodSemantics::{ + AlgebraMethodSemantics, PlainMethodSemantics, ServiceMethodSemantics, +}; +pub use crate::v2_std_core::{ + arg_name_at, arg_value, arm_body, arm_guard, arm_pattern, authored_name_at, binop_left, + binop_right, expr_call_func_at, expr_var_name_at, field_access_base, field_access_field_at, + field_binding_pattern, field_init_node_name_at, field_init_node_value, foreach_body, + foreach_collection, if_condition, if_else_branch, if_then_branch, is_child_accessor_in_model, + is_children_list_field, is_sub_value_field, is_tree_size_preserving, is_tree_size_reducing, + lambda_body, lambda_param_names_at, let_binding_name_at, let_body, let_value, match_arm_nodes, + match_scrutinee, method_arg_nodes, method_receiver, param_node_name_at, param_node_type_expr, + return_value, BinOp, ExprData, LiteralValue, MatchPattern, MethodSemantics, NewlineIndex, Node, +}; +use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] @@ -120,31 +168,38 @@ pub struct CostInternTable { pub fn empty_intern_table() -> Rc { Rc::new(CostInternTable { - summaries: v2_rt::rc_empty_map::>(), -}) + summaries: v2_rt::rc_empty_map::>(), + }) } -pub fn cache_summary(table: Rc, func_name: String, summary: Rc) -> Rc { +pub fn cache_summary( + table: Rc, + func_name: String, + summary: Rc, +) -> Rc { Rc::new(CostInternTable { - summaries: v2_rt::rc_map_insert(table.summaries.clone(), func_name, summary), -}) + summaries: v2_rt::rc_map_insert(table.summaries.clone(), func_name, summary), + }) } -pub fn lookup_summary(table: Rc, func_name: String) -> Option> { +pub fn lookup_summary( + table: Rc, + func_name: String, +) -> Option> { v2_rt::map_get(&table.summaries.clone(), func_name) } pub fn evict_summary(table: Rc, func_name: String) -> Rc { - cache_summary(table, func_name, Rc::new(ComplexitySummary { - work: Rc::new(CostExpr::CostConst { - value: 0, -}), - span: Rc::new(CostExpr::CostConst { - value: 0, -}), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Proven, -})) + cache_summary( + table, + func_name, + Rc::new(ComplexitySummary { + work: Rc::new(CostExpr::CostConst { value: 0 }), + span: Rc::new(CostExpr::CostConst { value: 0 }), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Proven, + }), + ) } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -253,39 +308,56 @@ pub struct SccEdgeBlockAcc { pub fn is_algebra_iteration_method(method_semantics: Option>) -> bool { match method_semantics.as_deref().cloned() { - Some(MethodSemantics::AlgebraMethodSemantics { .. }) => true, - _ => false, -} + Some(MethodSemantics::AlgebraMethodSemantics { .. }) => true, + _ => false, + } } -pub fn method_size_effect(method_semantics: Option>) -> Option { +pub fn method_size_effect( + method_semantics: Option>, +) -> Option { match method_semantics.as_deref().cloned() { - Some(MethodSemantics::AlgebraMethodSemantics { size_effect: se, .. }) => se.clone(), - _ => None, -} + Some(MethodSemantics::AlgebraMethodSemantics { + size_effect: se, .. + }) => se.clone(), + _ => None, + } } -pub fn method_callback_element_position(method_semantics: Option>) -> Option { +pub fn method_callback_element_position( + method_semantics: Option>, +) -> Option { match method_semantics.as_deref().cloned() { - Some(MethodSemantics::AlgebraMethodSemantics { algebra_template: at, .. }) => match at.clone() { - Some(template) => template.callback_element_position.clone(), - None => None, -}, - _ => None, -} + Some(MethodSemantics::AlgebraMethodSemantics { + algebra_template: at, + .. + }) => match at.clone() { + Some(template) => template.callback_element_position.clone(), + None => None, + }, + _ => None, + } } -pub fn iteration_element_name(method_semantics: Option>, lambda: Rc, si: Rc>>) -> Option { +pub fn iteration_element_name( + method_semantics: Option>, + lambda: Rc, + si: Rc>>, +) -> Option { { let params = lambda_param_names_at(lambda, si); -match method_callback_element_position(method_semantics) { - Some(pos) => params.get(pos.clone() as usize).cloned(), - None => None, -} -} + match method_callback_element_position(method_semantics) { + Some(pos) => params.get(pos.clone() as usize).cloned(), + None => None, + } + } } -pub fn proof_has_non_descending_cycle(proof: Rc, members: Rc>, edges: Rc>>) -> bool { +pub fn proof_has_non_descending_cycle( + proof: Rc, + members: Rc>, + edges: Rc>>, +) -> bool { (is_valid_proof(proof, &edges) == false) } @@ -295,482 +367,1163 @@ pub fn set_has(m: Rc>, key: String) -> bool { pub fn strict_after_parser_witness(input: DescentEvidence) -> DescentEvidence { match input { - DescentEvidence::DescentUnknown => DescentEvidence::DescentUnknown, - _ => DescentEvidence::Strict, -} + DescentEvidence::DescentUnknown => DescentEvidence::DescentUnknown, + _ => DescentEvidence::Strict, + } } pub fn empty_parser_progress_env() -> Rc { Rc::new(ParserProgressEnv { - state_aliases: v2_rt::rc_empty_map::(), - result_sources: v2_rt::rc_empty_map::>(), -}) + state_aliases: v2_rt::rc_empty_map::(), + result_sources: v2_rt::rc_empty_map::>(), + }) } -pub fn parser_state_param(params: Rc>>, si: Rc>>) -> Option> { - Rc::new(params.iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned().fold(None, |acc: _, pair: (i64, Rc)| if (acc.clone() != None) { - acc.clone() - } else { - { - let idx = pair.0.clone(); -let param = pair.1.clone(); -if (authored_name_at(si.clone(), ¶m_node_type_expr(¶m)).as_str() == "ParserState".to_string().as_str()) { - Some(Rc::new(ParserStateParam { - name: param_node_name_at(param.clone(), si.clone()), - index: idx.clone(), -})) - } else { - None +pub fn parser_state_param( + params: Rc>>, + si: Rc>>, +) -> Option> { + Rc::new( + params + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + .fold(None, |acc: _, pair: (i64, Rc)| { + if (acc.clone() != None) { + acc.clone() + } else { + { + let idx = pair.0.clone(); + let param = pair.1.clone(); + if (authored_name_at(si.clone(), ¶m_node_type_expr(¶m)).as_str() + == "ParserState".to_string().as_str()) + { + Some(Rc::new(ParserStateParam { + name: param_node_name_at(param.clone(), si.clone()), + index: idx.clone(), + })) + } else { + None + } } -} + } }) } -pub fn parser_state_base_var(expr: &Rc, si: Rc>>) -> Option { +pub fn parser_state_base_var( + expr: &Rc, + si: Rc>>, +) -> Option { match (*expr.expr_data.clone()).clone() { - ExprData::ExprFieldAccess { .. } => match expr.children.clone().first().cloned() { - Some(base) => match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => Some(expr_var_name_at(base.clone(), si)), - _ => None, -}, - None => None, -}, - _ => None, -} + ExprData::ExprFieldAccess { .. } => match expr.children.clone().first().cloned() { + Some(base) => match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => Some(expr_var_name_at(base.clone(), si)), + _ => None, + }, + None => None, + }, + _ => None, + } } -pub fn parser_result_state_progress(source: Rc, parser_always_advancing: Rc>, consumed_true_set: Rc>, result_name: String) -> DescentEvidence { +pub fn parser_result_state_progress( + source: Rc, + parser_always_advancing: Rc>, + consumed_true_set: Rc>, + result_name: String, +) -> DescentEvidence { match (*source).clone() { - ParserResultSource::ParserResultAdvance { input, .. } => strict_after_parser_witness(input.clone()), - ParserResultSource::ParserResultExpect { input, .. } => strict_after_parser_witness(input.clone()), - ParserResultSource::ParserResultEat { input, .. } => if set_has(consumed_true_set, result_name) { - strict_after_parser_witness(input.clone()) - } else { - input.clone() - }, - ParserResultSource::ParserResultCall { input, callee, .. } => if (set_has(consumed_true_set, result_name) || set_has(parser_always_advancing, callee.clone())) { - strict_after_parser_witness(input.clone()) - } else { - input.clone() - }, - ParserResultSource::ParserResultDirectState { input: p, .. } => p.clone(), - ParserResultSource::ParserResultOpaque => DescentEvidence::DescentUnknown, -} -} - -pub fn parser_state_arg_expr(call_node: Rc, state_param: Rc, si: Rc>>) -> Option> { - Rc::new(call_node.children.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned().fold(None, |acc: _, pair: (i64, Rc)| if (acc.clone() != None) { - acc.clone() - } else { - { - let idx = pair.0.clone(); -let arg_node = pair.1.clone(); -let matches_state = if (arg_name_at(arg_node.clone(), si.clone()).as_deref() != Some("".to_string().as_str())) { - (arg_name_at(arg_node.clone(), si.clone()).as_deref() == Some(state_param.name.clone().as_str())) + ParserResultSource::ParserResultAdvance { input, .. } => { + strict_after_parser_witness(input.clone()) + } + ParserResultSource::ParserResultExpect { input, .. } => { + strict_after_parser_witness(input.clone()) + } + ParserResultSource::ParserResultEat { input, .. } => { + if set_has(consumed_true_set, result_name) { + strict_after_parser_witness(input.clone()) } else { - (idx.clone() == state_param.index.clone()) - }; -if matches_state.clone() { - Some(arg_value(&arg_node)) + input.clone() + } + } + ParserResultSource::ParserResultCall { input, callee, .. } => { + if (set_has(consumed_true_set, result_name) + || set_has(parser_always_advancing, callee.clone())) + { + strict_after_parser_witness(input.clone()) } else { - None + input.clone() } + } + ParserResultSource::ParserResultDirectState { input: p, .. } => p.clone(), + ParserResultSource::ParserResultOpaque => DescentEvidence::DescentUnknown, + } } + +pub fn parser_state_arg_expr( + call_node: Rc, + state_param: Rc, + si: Rc>>, +) -> Option> { + Rc::new( + call_node + .children + .clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + .fold(None, |acc: _, pair: (i64, Rc)| { + if (acc.clone() != None) { + acc.clone() + } else { + { + let idx = pair.0.clone(); + let arg_node = pair.1.clone(); + let matches_state = if (arg_name_at(arg_node.clone(), si.clone()).as_deref() + != Some("".to_string().as_str())) + { + (arg_name_at(arg_node.clone(), si.clone()).as_deref() + == Some(state_param.name.clone().as_str())) + } else { + (idx.clone() == state_param.index.clone()) + }; + if matches_state.clone() { + Some(arg_value(&arg_node)) + } else { + None + } + } + } }) } -pub fn parser_state_expr_progress(expr: &Rc, state_param: &Rc, env: &Rc, parser_always_advancing: &Rc>, consumed_true_set: &Rc>, si: &Rc>>) -> DescentEvidence { +pub fn parser_state_expr_progress( + expr: &Rc, + state_param: &Rc, + env: &Rc, + parser_always_advancing: &Rc>, + consumed_true_set: &Rc>, + si: &Rc>>, +) -> DescentEvidence { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*expr.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let name = expr_var_name_at(expr.clone(), si.clone()); -if (name.clone().as_str() == state_param.name.clone().as_str()) { - DescentEvidence::NonIncreasing - } else { - match v2_rt::map_get(&env.state_aliases.clone(), name.clone()) { - Some(progress) => progress.clone(), - None => DescentEvidence::DescentUnknown, -} + ExprData::ExprVar { .. } => { + let name = expr_var_name_at(expr.clone(), si.clone()); + if (name.clone().as_str() == state_param.name.clone().as_str()) { + DescentEvidence::NonIncreasing + } else { + match v2_rt::map_get(&env.state_aliases.clone(), name.clone()) { + Some(progress) => progress.clone(), + None => DescentEvidence::DescentUnknown, + } + } } -}, - ExprData::ExprFieldAccess { .. } => if (field_access_field_at(expr.clone(), si.clone()).as_str() == "state".to_string().as_str()) { - match parser_state_base_var(&expr, si.clone()) { - Some(result_name) => match v2_rt::map_get(&env.result_sources.clone(), result_name.clone()) { - Some(source) => parser_result_state_progress(source.clone(), parser_always_advancing.clone(), consumed_true_set.clone(), result_name.clone()), - None => DescentEvidence::DescentUnknown, -}, - None => DescentEvidence::DescentUnknown, -} - } else { - DescentEvidence::DescentUnknown - }, - ExprData::ExprCall { .. } => match parser_passthrough_state_expr(&expr, &si) { - Some(state_expr) => parser_state_expr_progress(&state_expr, &state_param, &env, &parser_always_advancing, &consumed_true_set, &si), - None => DescentEvidence::DescentUnknown, -}, - ExprData::ExprIf => { - let cond = if_condition(expr.clone()); -let then_consumed = match parser_progress_flag_var(&cond, &si) { - Some(name) => v2_rt::rc_map_insert(consumed_true_set.clone(), name.clone(), true), - None => consumed_true_set.clone(), -}; -let then_progress = parser_state_expr_progress(&if_then_branch(expr.clone()), &state_param, &env, &parser_always_advancing, &then_consumed, &si); -let else_progress = match if_else_branch(expr.clone()) { - Some(eb) => parser_state_expr_progress(&eb, &state_param, &env, &parser_always_advancing, &consumed_true_set, &si), - None => DescentEvidence::DescentUnknown, -}; -merge_evidence(then_progress, else_progress) -}, - ExprData::ExprLet => { - let next_env = parser_env_with_binding(&let_binding_name_at(expr.clone(), si.clone()), &let_value(expr.clone()), &env, &state_param, &parser_always_advancing, &consumed_true_set, &si); -match let_body(expr.clone()) { - Some(body) => parser_state_expr_progress(&body, &state_param, &next_env, &parser_always_advancing, &consumed_true_set, &si), - None => DescentEvidence::DescentUnknown, -} -}, - ExprData::ExprMatch => { - let arm_progresses = Rc::new({ let mut __result = Vec::new(); for arm_node in match_arm_nodes(expr.clone()).iter().cloned() { __result.push(parser_state_expr_progress(&arm_body(&arm_node), &state_param, &env, &parser_always_advancing, &consumed_true_set, &si)); } __result }); -match arm_progresses.clone().first().cloned() { - Some(initial) => arm_progresses.clone().iter().cloned().fold(initial.clone(), |acc: DescentEvidence, p: DescentEvidence| merge_evidence(acc, p.clone())), - None => DescentEvidence::DescentUnknown, -} -}, - ExprData::ExprBlock => parser_block_state_progress(&expr.children.clone(), &state_param, env.clone(), &parser_always_advancing, &consumed_true_set, &si), - _ => DescentEvidence::DescentUnknown, -} + ExprData::ExprFieldAccess { .. } => { + if (field_access_field_at(expr.clone(), si.clone()).as_str() + == "state".to_string().as_str()) + { + match parser_state_base_var(&expr, si.clone()) { + Some(result_name) => { + match v2_rt::map_get(&env.result_sources.clone(), result_name.clone()) { + Some(source) => parser_result_state_progress( + source.clone(), + parser_always_advancing.clone(), + consumed_true_set.clone(), + result_name.clone(), + ), + None => DescentEvidence::DescentUnknown, + } + } + None => DescentEvidence::DescentUnknown, + } + } else { + DescentEvidence::DescentUnknown + } + } + ExprData::ExprCall { .. } => match parser_passthrough_state_expr(&expr, &si) { + Some(state_expr) => parser_state_expr_progress( + &state_expr, + &state_param, + &env, + &parser_always_advancing, + &consumed_true_set, + &si, + ), + None => DescentEvidence::DescentUnknown, + }, + ExprData::ExprIf => { + let cond = if_condition(expr.clone()); + let then_consumed = match parser_progress_flag_var(&cond, &si) { + Some(name) => { + v2_rt::rc_map_insert(consumed_true_set.clone(), name.clone(), true) + } + None => consumed_true_set.clone(), + }; + let then_progress = parser_state_expr_progress( + &if_then_branch(expr.clone()), + &state_param, + &env, + &parser_always_advancing, + &then_consumed, + &si, + ); + let else_progress = match if_else_branch(expr.clone()) { + Some(eb) => parser_state_expr_progress( + &eb, + &state_param, + &env, + &parser_always_advancing, + &consumed_true_set, + &si, + ), + None => DescentEvidence::DescentUnknown, + }; + merge_evidence(then_progress, else_progress) + } + ExprData::ExprLet => { + let next_env = parser_env_with_binding( + &let_binding_name_at(expr.clone(), si.clone()), + &let_value(expr.clone()), + &env, + &state_param, + &parser_always_advancing, + &consumed_true_set, + &si, + ); + match let_body(expr.clone()) { + Some(body) => parser_state_expr_progress( + &body, + &state_param, + &next_env, + &parser_always_advancing, + &consumed_true_set, + &si, + ), + None => DescentEvidence::DescentUnknown, + } + } + ExprData::ExprMatch => { + let arm_progresses = Rc::new({ + let mut __result = Vec::new(); + for arm_node in match_arm_nodes(expr.clone()).iter().cloned() { + __result.push(parser_state_expr_progress( + &arm_body(&arm_node), + &state_param, + &env, + &parser_always_advancing, + &consumed_true_set, + &si, + )); + } + __result + }); + match arm_progresses.clone().first().cloned() { + Some(initial) => arm_progresses.clone().iter().cloned().fold( + initial.clone(), + |acc: DescentEvidence, p: DescentEvidence| merge_evidence(acc, p.clone()), + ), + None => DescentEvidence::DescentUnknown, + } + } + ExprData::ExprBlock => parser_block_state_progress( + &expr.children.clone(), + &state_param, + env.clone(), + &parser_always_advancing, + &consumed_true_set, + &si, + ), + _ => DescentEvidence::DescentUnknown, + } }) } -pub fn parser_block_state_progress(stmts: &Rc>>, state_param: &Rc, env: Rc, parser_always_advancing: &Rc>, consumed_true_set: &Rc>, si: &Rc>>) -> DescentEvidence { +pub fn parser_block_state_progress( + stmts: &Rc>>, + state_param: &Rc, + env: Rc, + parser_always_advancing: &Rc>, + consumed_true_set: &Rc>, + si: &Rc>>, +) -> DescentEvidence { match stmts.clone().last().cloned() { - None => DescentEvidence::DescentUnknown, - Some(last_stmt) => { - let leading = Rc::new(stmts.clone().iter().cloned().take(((stmts.clone().len() as i64) - 1) as usize).collect::>()); -let final_env = leading.iter().cloned().fold(env.clone(), |acc_env: Rc, stmt: Rc| match (*stmt.expr_data.clone()).clone() { - ExprData::ExprLet => match let_body(stmt.clone()) { - None => parser_env_with_binding(&let_binding_name_at(stmt.clone(), si.clone()), &let_value(stmt.clone()), &acc_env, &state_param, &parser_always_advancing, &consumed_true_set, &si), - Some(_) => acc_env.clone(), -}, - _ => acc_env.clone(), -}); -parser_state_expr_progress(&last_stmt, &state_param, &final_env, &parser_always_advancing, &consumed_true_set, &si) -}, -} + None => DescentEvidence::DescentUnknown, + Some(last_stmt) => { + let leading = Rc::new( + stmts + .clone() + .iter() + .cloned() + .take(((stmts.clone().len() as i64) - 1) as usize) + .collect::>(), + ); + let final_env = leading.iter().cloned().fold( + env.clone(), + |acc_env: Rc, stmt: Rc| match (*stmt.expr_data.clone()) + .clone() + { + ExprData::ExprLet => match let_body(stmt.clone()) { + None => parser_env_with_binding( + &let_binding_name_at(stmt.clone(), si.clone()), + &let_value(stmt.clone()), + &acc_env, + &state_param, + &parser_always_advancing, + &consumed_true_set, + &si, + ), + Some(_) => acc_env.clone(), + }, + _ => acc_env.clone(), + }, + ); + parser_state_expr_progress( + &last_stmt, + &state_param, + &final_env, + &parser_always_advancing, + &consumed_true_set, + &si, + ) + } + } } -pub fn parser_result_source_for_expr(expr: &Rc, state_param: &Rc, env: Rc, parser_always_advancing: Rc>, consumed_true_set: Rc>, si: &Rc>>) -> Rc { +pub fn parser_result_source_for_expr( + expr: &Rc, + state_param: &Rc, + env: Rc, + parser_always_advancing: Rc>, + consumed_true_set: Rc>, + si: &Rc>>, +) -> Rc { match (*expr.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { - let input_progress = match parser_state_arg_expr(expr.clone(), state_param.clone(), si.clone()) { - Some(state_expr) => parser_state_expr_progress(&state_expr, &state_param, &env, &parser_always_advancing, &consumed_true_set, &si), - None => DescentEvidence::DescentUnknown, -}; -match (*parser_result_witness(&expr, si.clone())).clone() { - ParserResultWitness::ParserWitnessAdvance => Rc::new(ParserResultSource::ParserResultAdvance { - input: input_progress.clone(), -}), - ParserResultWitness::ParserWitnessExpect => Rc::new(ParserResultSource::ParserResultExpect { - input: input_progress.clone(), -}), - ParserResultWitness::ParserWitnessEat => Rc::new(ParserResultSource::ParserResultEat { - input: input_progress.clone(), -}), - ParserResultWitness::ParserWitnessCall { callee, .. } => match (*callee.clone()).clone() { - ParserCallIdentity::ParserCallHelper { .. } => Rc::new(ParserResultSource::ParserResultOpaque), - ParserCallIdentity::ParserCallFunction { name, .. } => match input_progress.clone() { - DescentEvidence::DescentUnknown => Rc::new(ParserResultSource::ParserResultOpaque), - _ => Rc::new(ParserResultSource::ParserResultCall { - input: input_progress.clone(), - callee: name.clone(), -}), -}, -}, - ParserResultWitness::ParserWitnessOpaque => Rc::new(ParserResultSource::ParserResultOpaque), -} -}, - _ => { - let progress = parser_success_progress(&expr, &state_param, &env, &parser_always_advancing, &consumed_true_set, &si); -match progress.clone() { - DescentEvidence::DescentUnknown => Rc::new(ParserResultSource::ParserResultOpaque), - _ => Rc::new(ParserResultSource::ParserResultDirectState { - input: progress.clone(), -}), -} -}, -} + ExprData::ExprCall { .. } => { + let input_progress = + match parser_state_arg_expr(expr.clone(), state_param.clone(), si.clone()) { + Some(state_expr) => parser_state_expr_progress( + &state_expr, + &state_param, + &env, + &parser_always_advancing, + &consumed_true_set, + &si, + ), + None => DescentEvidence::DescentUnknown, + }; + match (*parser_result_witness(&expr, si.clone())).clone() { + ParserResultWitness::ParserWitnessAdvance => { + Rc::new(ParserResultSource::ParserResultAdvance { + input: input_progress.clone(), + }) + } + ParserResultWitness::ParserWitnessExpect => { + Rc::new(ParserResultSource::ParserResultExpect { + input: input_progress.clone(), + }) + } + ParserResultWitness::ParserWitnessEat => { + Rc::new(ParserResultSource::ParserResultEat { + input: input_progress.clone(), + }) + } + ParserResultWitness::ParserWitnessCall { callee, .. } => { + match (*callee.clone()).clone() { + ParserCallIdentity::ParserCallHelper { .. } => { + Rc::new(ParserResultSource::ParserResultOpaque) + } + ParserCallIdentity::ParserCallFunction { name, .. } => { + match input_progress.clone() { + DescentEvidence::DescentUnknown => { + Rc::new(ParserResultSource::ParserResultOpaque) + } + _ => Rc::new(ParserResultSource::ParserResultCall { + input: input_progress.clone(), + callee: name.clone(), + }), + } + } + } + } + ParserResultWitness::ParserWitnessOpaque => { + Rc::new(ParserResultSource::ParserResultOpaque) + } + } + } + _ => { + let progress = parser_success_progress( + &expr, + &state_param, + &env, + &parser_always_advancing, + &consumed_true_set, + &si, + ); + match progress.clone() { + DescentEvidence::DescentUnknown => Rc::new(ParserResultSource::ParserResultOpaque), + _ => Rc::new(ParserResultSource::ParserResultDirectState { + input: progress.clone(), + }), + } + } + } } -pub fn parser_env_with_binding(name: &String, value_expr: &Rc, env: &Rc, state_param: &Rc, parser_always_advancing: &Rc>, consumed_true_set: &Rc>, si: &Rc>>) -> Rc { +pub fn parser_env_with_binding( + name: &String, + value_expr: &Rc, + env: &Rc, + state_param: &Rc, + parser_always_advancing: &Rc>, + consumed_true_set: &Rc>, + si: &Rc>>, +) -> Rc { { - let state_progress = parser_state_expr_progress(&value_expr, &state_param, &env, &parser_always_advancing, &consumed_true_set, &si); -let result_source = parser_result_source_for_expr(&value_expr, &state_param, env.clone(), parser_always_advancing.clone(), consumed_true_set.clone(), &si); -Rc::new(ParserProgressEnv { - state_aliases: v2_rt::rc_map_insert(env.state_aliases.clone(), name.clone(), state_progress), - result_sources: v2_rt::rc_map_insert(env.result_sources.clone(), name.clone(), result_source), -}) -} + let state_progress = parser_state_expr_progress( + &value_expr, + &state_param, + &env, + &parser_always_advancing, + &consumed_true_set, + &si, + ); + let result_source = parser_result_source_for_expr( + &value_expr, + &state_param, + env.clone(), + parser_always_advancing.clone(), + consumed_true_set.clone(), + &si, + ); + Rc::new(ParserProgressEnv { + state_aliases: v2_rt::rc_map_insert( + env.state_aliases.clone(), + name.clone(), + state_progress, + ), + result_sources: v2_rt::rc_map_insert( + env.result_sources.clone(), + name.clone(), + result_source, + ), + }) + } } -pub fn parser_call_edge_progress(call_node: &Rc, state_param: &Rc, env: Rc, parser_always_advancing: &Rc>, consumed_true_set: Rc>, si: &Rc>>) -> DescentEvidence { +pub fn parser_call_edge_progress( + call_node: &Rc, + state_param: &Rc, + env: Rc, + parser_always_advancing: &Rc>, + consumed_true_set: Rc>, + si: &Rc>>, +) -> DescentEvidence { match parser_state_arg_expr(call_node.clone(), state_param.clone(), si.clone()) { - Some(state_expr) => { - let input_progress = parser_state_expr_progress(&state_expr, &state_param, &env, &parser_always_advancing, &consumed_true_set, &si); -if set_has(parser_always_advancing.clone(), expr_call_func_at(call_node.clone(), si.clone())) { - strict_after_parser_witness(input_progress) - } else { - input_progress + Some(state_expr) => { + let input_progress = parser_state_expr_progress( + &state_expr, + &state_param, + &env, + &parser_always_advancing, + &consumed_true_set, + &si, + ); + if set_has( + parser_always_advancing.clone(), + expr_call_func_at(call_node.clone(), si.clone()), + ) { + strict_after_parser_witness(input_progress) + } else { + input_progress + } } -}, - None => DescentEvidence::DescentUnknown, -} + None => DescentEvidence::DescentUnknown, + } } -pub fn collect_parser_progress_block_edges(caller: String, stmts: Rc>>, state_param: Rc, scc_name_set: Rc>, env: Rc, parser_always_advancing: Rc>, consumed_true_set: Rc>, si: Rc>>) -> Rc>> { +pub fn collect_parser_progress_block_edges( + caller: String, + stmts: Rc>>, + state_param: Rc, + scc_name_set: Rc>, + env: Rc, + parser_always_advancing: Rc>, + consumed_true_set: Rc>, + si: Rc>>, +) -> Rc>> { { - let acc = stmts.iter().cloned().fold(Rc::new(ParserProgressAcc { - edges: Rc::new(vec![]), - env: env, -}), |acc: Rc, stmt: Rc| match (*stmt.expr_data.clone()).clone() { - ExprData::ExprLet => match let_body(stmt.clone()) { - None => { - let value_expr = let_value(stmt.clone()); -let value_edges = collect_parser_progress_edges(&caller, &value_expr, &state_param, &scc_name_set, &acc.env.clone(), &parser_always_advancing, &consumed_true_set, &si); -let next_env = parser_env_with_binding(&let_binding_name_at(stmt.clone(), si.clone()), &value_expr, &acc.env.clone(), &state_param, &parser_always_advancing, &consumed_true_set, &si); -Rc::new(ParserProgressAcc { - edges: v2_rt::concat(acc.edges.clone(), value_edges.clone()), - env: next_env.clone(), -}) -}, - Some(_) => { - let stmt_edges = collect_parser_progress_edges(&caller, &stmt, &state_param, &scc_name_set, &acc.env.clone(), &parser_always_advancing, &consumed_true_set, &si); -Rc::new(ParserProgressAcc { - edges: v2_rt::concat(acc.edges.clone(), stmt_edges.clone()), - env: acc.env.clone(), -}) -}, -}, - _ => { - let stmt_edges = collect_parser_progress_edges(&caller, &stmt, &state_param, &scc_name_set, &acc.env.clone(), &parser_always_advancing, &consumed_true_set, &si); -Rc::new(ParserProgressAcc { - edges: v2_rt::concat(acc.edges.clone(), stmt_edges.clone()), - env: acc.env.clone(), -}) -}, -}); -acc.edges.clone() -} + let acc = stmts.iter().cloned().fold( + Rc::new(ParserProgressAcc { + edges: Rc::new(vec![]), + env: env, + }), + |acc: Rc, stmt: Rc| match (*stmt.expr_data.clone()).clone() { + ExprData::ExprLet => match let_body(stmt.clone()) { + None => { + let value_expr = let_value(stmt.clone()); + let value_edges = collect_parser_progress_edges( + &caller, + &value_expr, + &state_param, + &scc_name_set, + &acc.env.clone(), + &parser_always_advancing, + &consumed_true_set, + &si, + ); + let next_env = parser_env_with_binding( + &let_binding_name_at(stmt.clone(), si.clone()), + &value_expr, + &acc.env.clone(), + &state_param, + &parser_always_advancing, + &consumed_true_set, + &si, + ); + Rc::new(ParserProgressAcc { + edges: v2_rt::concat(acc.edges.clone(), value_edges.clone()), + env: next_env.clone(), + }) + } + Some(_) => { + let stmt_edges = collect_parser_progress_edges( + &caller, + &stmt, + &state_param, + &scc_name_set, + &acc.env.clone(), + &parser_always_advancing, + &consumed_true_set, + &si, + ); + Rc::new(ParserProgressAcc { + edges: v2_rt::concat(acc.edges.clone(), stmt_edges.clone()), + env: acc.env.clone(), + }) + } + }, + _ => { + let stmt_edges = collect_parser_progress_edges( + &caller, + &stmt, + &state_param, + &scc_name_set, + &acc.env.clone(), + &parser_always_advancing, + &consumed_true_set, + &si, + ); + Rc::new(ParserProgressAcc { + edges: v2_rt::concat(acc.edges.clone(), stmt_edges.clone()), + env: acc.env.clone(), + }) + } + }, + ); + acc.edges.clone() + } } -pub fn collect_parser_progress_edges(caller: &String, body: &Rc, state_param: &Rc, scc_name_set: &Rc>, env: &Rc, parser_always_advancing: &Rc>, consumed_true_set: &Rc>, si: &Rc>>) -> Rc>> { +pub fn collect_parser_progress_edges( + caller: &String, + body: &Rc, + state_param: &Rc, + scc_name_set: &Rc>, + env: &Rc, + parser_always_advancing: &Rc>, + consumed_true_set: &Rc>, + si: &Rc>>, +) -> Rc>> { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*body.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { - let own_edges = if set_has(scc_name_set.clone(), expr_call_func_at(body.clone(), si.clone())) { - Rc::new(vec![Rc::new(ParserProgressEdge { - caller: caller.clone(), - callee: expr_call_func_at(body.clone(), si.clone()), - progress: parser_call_edge_progress(&body, &state_param, env.clone(), &parser_always_advancing, consumed_true_set.clone(), &si), -})]) - } else { - Rc::new(vec![]) - }; -let child_edges = Rc::new({ let mut __result = Vec::new(); for child in body.children.clone().iter().cloned() { __result.extend((*collect_parser_progress_edges(&caller, &child, &state_param, &scc_name_set, &env, &parser_always_advancing, &consumed_true_set, &si)).iter().cloned()); } __result }); -v2_rt::concat(own_edges, child_edges) -}, - ExprData::ExprIf => { - let cond = if_condition(body.clone()); -let cond_edges = collect_parser_progress_edges(&caller, &cond, &state_param, &scc_name_set, &env, &parser_always_advancing, &consumed_true_set, &si); -let then_consumed = match parser_progress_flag_var(&cond, &si) { - Some(name) => v2_rt::rc_map_insert(consumed_true_set.clone(), name.clone(), true), - None => consumed_true_set.clone(), -}; -let then_edges = collect_parser_progress_edges(&caller, &if_then_branch(body.clone()), &state_param, &scc_name_set, &env, &parser_always_advancing, &then_consumed, &si); -let else_edges = match if_else_branch(body.clone()) { - Some(eb) => collect_parser_progress_edges(&caller, &eb, &state_param, &scc_name_set, &env, &parser_always_advancing, &consumed_true_set, &si), - None => Rc::new(vec![]), -}; -v2_rt::concat(v2_rt::concat(cond_edges, then_edges), else_edges) -}, - ExprData::ExprLet => { - let value_expr = let_value(body.clone()); -let value_edges = collect_parser_progress_edges(&caller, &value_expr, &state_param, &scc_name_set, &env, &parser_always_advancing, &consumed_true_set, &si); -let next_env = parser_env_with_binding(&let_binding_name_at(body.clone(), si.clone()), &value_expr, &env, &state_param, &parser_always_advancing, &consumed_true_set, &si); -let body_edges = match let_body(body.clone()) { - Some(b) => collect_parser_progress_edges(&caller, &b, &state_param, &scc_name_set, &next_env, &parser_always_advancing, &consumed_true_set, &si), - None => Rc::new(vec![]), -}; -v2_rt::concat(value_edges, body_edges) -}, - ExprData::ExprBlock => collect_parser_progress_block_edges(caller.clone(), body.children.clone(), state_param.clone(), scc_name_set.clone(), env.clone(), parser_always_advancing.clone(), consumed_true_set.clone(), si.clone()), - ExprData::ExprMatch => { - let scrut_edges = collect_parser_progress_edges(&caller, &match_scrutinee(body.clone()), &state_param, &scc_name_set, &env, &parser_always_advancing, &consumed_true_set, &si); -let arm_edges = Rc::new({ let mut __result = Vec::new(); for arm_node in match_arm_nodes(body.clone()).iter().cloned() { __result.extend((*collect_parser_progress_edges(&caller, &arm_body(&arm_node), &state_param, &scc_name_set, &env, &parser_always_advancing, &consumed_true_set, &si)).iter().cloned()); } __result }); -v2_rt::concat(scrut_edges, arm_edges) -}, - _ => Rc::new({ let mut __result = Vec::new(); for child in body.children.clone().iter().cloned() { __result.extend((*collect_parser_progress_edges(&caller, &child, &state_param, &scc_name_set, &env, &parser_always_advancing, &consumed_true_set, &si)).iter().cloned()); } __result }), -} + ExprData::ExprCall { .. } => { + let own_edges = if set_has( + scc_name_set.clone(), + expr_call_func_at(body.clone(), si.clone()), + ) { + Rc::new(vec![Rc::new(ParserProgressEdge { + caller: caller.clone(), + callee: expr_call_func_at(body.clone(), si.clone()), + progress: parser_call_edge_progress( + &body, + &state_param, + env.clone(), + &parser_always_advancing, + consumed_true_set.clone(), + &si, + ), + })]) + } else { + Rc::new(vec![]) + }; + let child_edges = Rc::new({ + let mut __result = Vec::new(); + for child in body.children.clone().iter().cloned() { + __result.extend( + (*collect_parser_progress_edges( + &caller, + &child, + &state_param, + &scc_name_set, + &env, + &parser_always_advancing, + &consumed_true_set, + &si, + )) + .iter() + .cloned(), + ); + } + __result + }); + v2_rt::concat(own_edges, child_edges) + } + ExprData::ExprIf => { + let cond = if_condition(body.clone()); + let cond_edges = collect_parser_progress_edges( + &caller, + &cond, + &state_param, + &scc_name_set, + &env, + &parser_always_advancing, + &consumed_true_set, + &si, + ); + let then_consumed = match parser_progress_flag_var(&cond, &si) { + Some(name) => { + v2_rt::rc_map_insert(consumed_true_set.clone(), name.clone(), true) + } + None => consumed_true_set.clone(), + }; + let then_edges = collect_parser_progress_edges( + &caller, + &if_then_branch(body.clone()), + &state_param, + &scc_name_set, + &env, + &parser_always_advancing, + &then_consumed, + &si, + ); + let else_edges = match if_else_branch(body.clone()) { + Some(eb) => collect_parser_progress_edges( + &caller, + &eb, + &state_param, + &scc_name_set, + &env, + &parser_always_advancing, + &consumed_true_set, + &si, + ), + None => Rc::new(vec![]), + }; + v2_rt::concat(v2_rt::concat(cond_edges, then_edges), else_edges) + } + ExprData::ExprLet => { + let value_expr = let_value(body.clone()); + let value_edges = collect_parser_progress_edges( + &caller, + &value_expr, + &state_param, + &scc_name_set, + &env, + &parser_always_advancing, + &consumed_true_set, + &si, + ); + let next_env = parser_env_with_binding( + &let_binding_name_at(body.clone(), si.clone()), + &value_expr, + &env, + &state_param, + &parser_always_advancing, + &consumed_true_set, + &si, + ); + let body_edges = match let_body(body.clone()) { + Some(b) => collect_parser_progress_edges( + &caller, + &b, + &state_param, + &scc_name_set, + &next_env, + &parser_always_advancing, + &consumed_true_set, + &si, + ), + None => Rc::new(vec![]), + }; + v2_rt::concat(value_edges, body_edges) + } + ExprData::ExprBlock => collect_parser_progress_block_edges( + caller.clone(), + body.children.clone(), + state_param.clone(), + scc_name_set.clone(), + env.clone(), + parser_always_advancing.clone(), + consumed_true_set.clone(), + si.clone(), + ), + ExprData::ExprMatch => { + let scrut_edges = collect_parser_progress_edges( + &caller, + &match_scrutinee(body.clone()), + &state_param, + &scc_name_set, + &env, + &parser_always_advancing, + &consumed_true_set, + &si, + ); + let arm_edges = Rc::new({ + let mut __result = Vec::new(); + for arm_node in match_arm_nodes(body.clone()).iter().cloned() { + __result.extend( + (*collect_parser_progress_edges( + &caller, + &arm_body(&arm_node), + &state_param, + &scc_name_set, + &env, + &parser_always_advancing, + &consumed_true_set, + &si, + )) + .iter() + .cloned(), + ); + } + __result + }); + v2_rt::concat(scrut_edges, arm_edges) + } + _ => Rc::new({ + let mut __result = Vec::new(); + for child in body.children.clone().iter().cloned() { + __result.extend( + (*collect_parser_progress_edges( + &caller, + &child, + &state_param, + &scc_name_set, + &env, + &parser_always_advancing, + &consumed_true_set, + &si, + )) + .iter() + .cloned(), + ); + } + __result + }), + } }) } -pub fn parser_record_field_value(expr: Rc, field_name: String, si: Rc>>) -> Option> { - Rc::new({ let mut __result = Vec::new(); for child in Rc::new({ let mut __result = Vec::new(); for child in expr.children.clone().iter().cloned() { if (field_init_node_name_at(child.clone(), si.clone()).as_str() == field_name.clone().as_str()) { __result.push(child); } } __result }).iter().cloned() { __result.push(field_init_node_value(&child)); } __result }).first().cloned() +pub fn parser_record_field_value( + expr: Rc, + field_name: String, + si: Rc>>, +) -> Option> { + Rc::new({ + let mut __result = Vec::new(); + for child in Rc::new({ + let mut __result = Vec::new(); + for child in expr.children.clone().iter().cloned() { + if (field_init_node_name_at(child.clone(), si.clone()).as_str() + == field_name.clone().as_str()) + { + __result.push(child); + } + } + __result + }) + .iter() + .cloned() + { + __result.push(field_init_node_value(&child)); + } + __result + }) + .first() + .cloned() } pub fn parser_expr_is_none(expr: Rc) -> bool { match (*expr.expr_data.clone()).clone() { - ExprData::ExprLiteral { value: v, .. } => match (*v.clone()).clone() { - LiteralValue::LitNull => true, - _ => false, -}, - _ => false, -} + ExprData::ExprLiteral { value: v, .. } => match (*v.clone()).clone() { + LiteralValue::LitNull => true, + _ => false, + }, + _ => false, + } } -pub fn parser_success_progress(expr: &Rc, state_param: &Rc, env: &Rc, parser_always_advancing: &Rc>, consumed_true_set: &Rc>, si: &Rc>>) -> DescentEvidence { +pub fn parser_success_progress( + expr: &Rc, + state_param: &Rc, + env: &Rc, + parser_always_advancing: &Rc>, + consumed_true_set: &Rc>, + si: &Rc>>, +) -> DescentEvidence { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*expr.expr_data.clone()).clone() { - ExprData::ExprReturn => parser_success_progress(&return_value(expr.clone()), &state_param, &env, &parser_always_advancing, &consumed_true_set, &si), - ExprData::ExprVar { .. } => match v2_rt::map_get(&env.result_sources.clone(), expr_var_name_at(expr.clone(), si.clone())) { - Some(source) => parser_result_state_progress(source.clone(), parser_always_advancing.clone(), consumed_true_set.clone(), expr_var_name_at(expr.clone(), si.clone())), - None => DescentEvidence::DescentUnknown, -}, - ExprData::ExprCall { .. } => parser_result_state_progress(parser_result_source_for_expr(&expr, &state_param, env.clone(), parser_always_advancing.clone(), consumed_true_set.clone(), &si), parser_always_advancing.clone(), consumed_true_set.clone(), "".to_string()), - ExprData::ExprRecordLit { .. } => match parser_record_field_value(expr.clone(), "err".to_string(), si.clone()) { - Some(err_expr) => if parser_expr_is_none(err_expr.clone()) { - match parser_record_field_value(expr.clone(), "state".to_string(), si.clone()) { - Some(state_expr) => parser_state_expr_progress(&state_expr, &state_param, &env, &parser_always_advancing, &consumed_true_set, &si), - None => DescentEvidence::DescentUnknown, -} - } else { - DescentEvidence::DescentUnknown - }, - None => DescentEvidence::DescentUnknown, -}, - ExprData::ExprIf => { - let cond = if_condition(expr.clone()); -let then_consumed = match parser_progress_flag_var(&cond, &si) { - Some(name) => v2_rt::rc_map_insert(consumed_true_set.clone(), name.clone(), true), - None => consumed_true_set.clone(), -}; -let then_progress = parser_success_progress(&if_then_branch(expr.clone()), &state_param, &env, &parser_always_advancing, &then_consumed, &si); -let else_progress = match if_else_branch(expr.clone()) { - Some(eb) => parser_success_progress(&eb, &state_param, &env, &parser_always_advancing, &consumed_true_set, &si), - None => DescentEvidence::DescentUnknown, -}; -merge_evidence(then_progress, else_progress) -}, - ExprData::ExprLet => { - let next_env = parser_env_with_binding(&let_binding_name_at(expr.clone(), si.clone()), &let_value(expr.clone()), &env, &state_param, &parser_always_advancing, &consumed_true_set, &si); -match let_body(expr.clone()) { - Some(body) => parser_success_progress(&body, &state_param, &next_env, &parser_always_advancing, &consumed_true_set, &si), - None => DescentEvidence::DescentUnknown, -} -}, - ExprData::ExprBlock => { - let prefix = v2_rt::reverse(Rc::new(v2_rt::reverse(expr.children.clone()).iter().cloned().skip(1 as usize).collect::>())); -let acc = prefix.iter().cloned().fold(Rc::new(ParserProgressAcc { - edges: Rc::new(vec![]), - env: env.clone(), -}), |acc: Rc, stmt: Rc| match (*stmt.expr_data.clone()).clone() { - ExprData::ExprLet => match let_body(stmt.clone()) { - None => { - let next_env = parser_env_with_binding(&let_binding_name_at(stmt.clone(), si.clone()), &let_value(stmt.clone()), &acc.env.clone(), &state_param, &parser_always_advancing, &consumed_true_set, &si); -Rc::new(ParserProgressAcc { - edges: acc.edges.clone(), - env: next_env.clone(), -}) -}, - Some(_) => acc.clone(), -}, - _ => acc.clone(), -}); -match expr.children.clone().last().cloned() { - Some(last_stmt) => parser_success_progress(&last_stmt, &state_param, &acc.env.clone(), &parser_always_advancing, &consumed_true_set, &si), - None => DescentEvidence::DescentUnknown, -} -}, - _ => DescentEvidence::DescentUnknown, -} + ExprData::ExprReturn => parser_success_progress( + &return_value(expr.clone()), + &state_param, + &env, + &parser_always_advancing, + &consumed_true_set, + &si, + ), + ExprData::ExprVar { .. } => match v2_rt::map_get( + &env.result_sources.clone(), + expr_var_name_at(expr.clone(), si.clone()), + ) { + Some(source) => parser_result_state_progress( + source.clone(), + parser_always_advancing.clone(), + consumed_true_set.clone(), + expr_var_name_at(expr.clone(), si.clone()), + ), + None => DescentEvidence::DescentUnknown, + }, + ExprData::ExprCall { .. } => parser_result_state_progress( + parser_result_source_for_expr( + &expr, + &state_param, + env.clone(), + parser_always_advancing.clone(), + consumed_true_set.clone(), + &si, + ), + parser_always_advancing.clone(), + consumed_true_set.clone(), + "".to_string(), + ), + ExprData::ExprRecordLit { .. } => { + match parser_record_field_value(expr.clone(), "err".to_string(), si.clone()) { + Some(err_expr) => { + if parser_expr_is_none(err_expr.clone()) { + match parser_record_field_value( + expr.clone(), + "state".to_string(), + si.clone(), + ) { + Some(state_expr) => parser_state_expr_progress( + &state_expr, + &state_param, + &env, + &parser_always_advancing, + &consumed_true_set, + &si, + ), + None => DescentEvidence::DescentUnknown, + } + } else { + DescentEvidence::DescentUnknown + } + } + None => DescentEvidence::DescentUnknown, + } + } + ExprData::ExprIf => { + let cond = if_condition(expr.clone()); + let then_consumed = match parser_progress_flag_var(&cond, &si) { + Some(name) => { + v2_rt::rc_map_insert(consumed_true_set.clone(), name.clone(), true) + } + None => consumed_true_set.clone(), + }; + let then_progress = parser_success_progress( + &if_then_branch(expr.clone()), + &state_param, + &env, + &parser_always_advancing, + &then_consumed, + &si, + ); + let else_progress = match if_else_branch(expr.clone()) { + Some(eb) => parser_success_progress( + &eb, + &state_param, + &env, + &parser_always_advancing, + &consumed_true_set, + &si, + ), + None => DescentEvidence::DescentUnknown, + }; + merge_evidence(then_progress, else_progress) + } + ExprData::ExprLet => { + let next_env = parser_env_with_binding( + &let_binding_name_at(expr.clone(), si.clone()), + &let_value(expr.clone()), + &env, + &state_param, + &parser_always_advancing, + &consumed_true_set, + &si, + ); + match let_body(expr.clone()) { + Some(body) => parser_success_progress( + &body, + &state_param, + &next_env, + &parser_always_advancing, + &consumed_true_set, + &si, + ), + None => DescentEvidence::DescentUnknown, + } + } + ExprData::ExprBlock => { + let prefix = v2_rt::reverse(Rc::new( + v2_rt::reverse(expr.children.clone()) + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + )); + let acc = prefix.iter().cloned().fold( + Rc::new(ParserProgressAcc { + edges: Rc::new(vec![]), + env: env.clone(), + }), + |acc: Rc, stmt: Rc| match (*stmt.expr_data.clone()) + .clone() + { + ExprData::ExprLet => match let_body(stmt.clone()) { + None => { + let next_env = parser_env_with_binding( + &let_binding_name_at(stmt.clone(), si.clone()), + &let_value(stmt.clone()), + &acc.env.clone(), + &state_param, + &parser_always_advancing, + &consumed_true_set, + &si, + ); + Rc::new(ParserProgressAcc { + edges: acc.edges.clone(), + env: next_env.clone(), + }) + } + Some(_) => acc.clone(), + }, + _ => acc.clone(), + }, + ); + match expr.children.clone().last().cloned() { + Some(last_stmt) => parser_success_progress( + &last_stmt, + &state_param, + &acc.env.clone(), + &parser_always_advancing, + &consumed_true_set, + &si, + ), + None => DescentEvidence::DescentUnknown, + } + } + _ => DescentEvidence::DescentUnknown, + } }) } -pub fn parser_member_is_always_advancing(entry: &Rc, parser_name_set: Rc>, proven: &Rc>, si: &Rc>>) -> bool { +pub fn parser_member_is_always_advancing( + entry: &Rc, + parser_name_set: Rc>, + proven: &Rc>, + si: &Rc>>, +) -> bool { match parser_state_param(entry.params.clone(), si.clone()) { - Some(state_param) => { - let edges = collect_parser_progress_edges(&entry.name.clone(), &entry.body.clone(), &state_param, &parser_name_set, &empty_parser_progress_env(), &proven, &v2_rt::rc_empty_map::(), &si); -({ let mut __all = true; for edge in edges.iter().cloned() { if !(((edge.progress.clone() == DescentEvidence::Strict) || ((edge.progress.clone() == DescentEvidence::NonIncreasing) && set_has(proven.clone(), edge.callee.clone())))) { __all = false; break; } } __all } && (parser_success_progress(&entry.body.clone(), &state_param, &empty_parser_progress_env(), &proven, &v2_rt::rc_empty_map::(), &si) == DescentEvidence::Strict)) -}, - None => false, -} + Some(state_param) => { + let edges = collect_parser_progress_edges( + &entry.name.clone(), + &entry.body.clone(), + &state_param, + &parser_name_set, + &empty_parser_progress_env(), + &proven, + &v2_rt::rc_empty_map::(), + &si, + ); + ({ + let mut __all = true; + for edge in edges.iter().cloned() { + if !((edge.progress.clone() == DescentEvidence::Strict) + || ((edge.progress.clone() == DescentEvidence::NonIncreasing) + && set_has(proven.clone(), edge.callee.clone()))) + { + __all = false; + break; + } + } + __all + } && (parser_success_progress( + &entry.body.clone(), + &state_param, + &empty_parser_progress_env(), + &proven, + &v2_rt::rc_empty_map::(), + &si, + ) == DescentEvidence::Strict)) + } + None => false, + } } -pub fn infer_parser_always_advancing_members_worklist(mut queue: Rc>, mut func_index: Rc>>, mut parser_name_set: Rc>, mut reverse_graph: Rc>>>, mut proven: Rc>, mut si: Rc>>) -> Rc> { +pub fn infer_parser_always_advancing_members_worklist( + mut queue: Rc>, + mut func_index: Rc>>, + mut parser_name_set: Rc>, + mut reverse_graph: Rc>>>, + mut proven: Rc>, + mut si: Rc>>, +) -> Rc> { loop { match queue.clone().first().cloned() { - Some(name) => { let rest = Rc::new(queue.clone().iter().cloned().skip(1 as usize).collect::>()); -if set_has(proven.clone(), name.clone()) { - { - let __tco_0 = rest; -queue = __tco_0; -continue; -} -} else { - match v2_rt::map_get(&func_index, name.clone()) { - Some(entry) => { if parser_member_is_always_advancing(&entry, parser_name_set.clone(), &proven, &si) { - let callers = match v2_rt::map_get(&reverse_graph, name.clone()) { - Some(members) => members.clone(), - None => Rc::new(vec![]), -}; -{ - let __tco_0 = deduplicate(v2_rt::concat(rest, callers)); -let __tco_1 = v2_rt::rc_map_insert(proven, name.clone(), true); -queue = __tco_0; -proven = __tco_1; -continue; -} -} else { - { - let __tco_0 = rest; -queue = __tco_0; -continue; -} -} }, - None => { { - let __tco_0 = rest; -queue = __tco_0; -continue; -} }, -} -} }, - None => { break proven.clone(); }, -} -} + Some(name) => { + let rest = Rc::new( + queue + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ); + if set_has(proven.clone(), name.clone()) { + { + let __tco_0 = rest; + queue = __tco_0; + continue; + } + } else { + match v2_rt::map_get(&func_index, name.clone()) { + Some(entry) => { + if parser_member_is_always_advancing( + &entry, + parser_name_set.clone(), + &proven, + &si, + ) { + let callers = match v2_rt::map_get(&reverse_graph, name.clone()) { + Some(members) => members.clone(), + None => Rc::new(vec![]), + }; + { + let __tco_0 = deduplicate(v2_rt::concat(rest, callers)); + let __tco_1 = v2_rt::rc_map_insert(proven, name.clone(), true); + queue = __tco_0; + proven = __tco_1; + continue; + } + } else { + { + let __tco_0 = rest; + queue = __tco_0; + continue; + } + } + } + None => { + let __tco_0 = rest; + queue = __tco_0; + continue; + } + } + } + } + None => { + break proven.clone(); + } + } + } } -pub fn infer_parser_always_advancing_members(members: &Rc>, func_index: &Rc>>, si: &Rc>>) -> Rc> { +pub fn infer_parser_always_advancing_members( + members: &Rc>, + func_index: &Rc>>, + si: &Rc>>, +) -> Rc> { { - let parser_name_set = members.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, name: String| v2_rt::rc_map_insert(acc, name.clone(), true)); -let parser_entries = Rc::new({ let mut __result = Vec::new(); for name in members.clone().iter().cloned() { __result.extend((*match v2_rt::map_get(&func_index, name.clone()) { - Some(entry) => Rc::new(vec![entry.clone()]), - None => Rc::new(vec![]), -}).iter().cloned()); } __result }); -let reverse_graph = build_call_graph(&parser_entries, si.clone()).reverse.clone(); -infer_parser_always_advancing_members_worklist(members.clone(), func_index.clone(), parser_name_set, reverse_graph, v2_rt::rc_empty_map::(), si.clone()) -} + let parser_name_set = members.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, name: String| { + v2_rt::rc_map_insert(acc, name.clone(), true) + }, + ); + let parser_entries = Rc::new({ + let mut __result = Vec::new(); + for name in members.clone().iter().cloned() { + __result.extend( + (*match v2_rt::map_get(&func_index, name.clone()) { + Some(entry) => Rc::new(vec![entry.clone()]), + None => Rc::new(vec![]), + }) + .iter() + .cloned(), + ); + } + __result + }); + let reverse_graph = build_call_graph(&parser_entries, si.clone()) + .reverse + .clone(); + infer_parser_always_advancing_members_worklist( + members.clone(), + func_index.clone(), + parser_name_set, + reverse_graph, + v2_rt::rc_empty_map::(), + si.clone(), + ) + } } -pub fn parser_function_names(func_index: &Rc>>, si: Rc>>) -> Rc> { - Rc::new({ let mut __result = Vec::new(); for name in Rc::new(v2_rt::map_keys(&func_index)).iter().cloned() { if match v2_rt::map_get(&func_index, name.clone()) { - Some(entry) => (parser_state_param(entry.params.clone(), si.clone()) != None), - None => false, -} { __result.push(name); } } __result }) +pub fn parser_function_names( + func_index: &Rc>>, + si: Rc>>, +) -> Rc> { + Rc::new({ + let mut __result = Vec::new(); + for name in Rc::new(v2_rt::map_keys(&func_index)).iter().cloned() { + if match v2_rt::map_get(&func_index, name.clone()) { + Some(entry) => (parser_state_param(entry.params.clone(), si.clone()) != None), + None => false, + } { + __result.push(name); + } + } + __result + }) } -pub fn infer_all_parser_always_advancing(func_index: &Rc>>, si: &Rc>>) -> Rc> { +pub fn infer_all_parser_always_advancing( + func_index: &Rc>>, + si: &Rc>>, +) -> Rc> { { let members = parser_function_names(&func_index, si.clone()); -infer_parser_always_advancing_members(&members, &func_index, &si) -} + infer_parser_always_advancing_members(&members, &func_index, &si) + } } pub fn seed_string_map(key: String, value: String) -> Rc> { @@ -785,598 +1538,1256 @@ pub fn seed_cost_map(key: String, value: Rc) -> Rc>(), key, value) } -pub fn seed_func_entry_map(key: String, value: Rc) -> Rc>> { +pub fn seed_func_entry_map( + key: String, + value: Rc, +) -> Rc>> { v2_rt::rc_map_insert(v2_rt::rc_empty_map::>(), key, value) } -pub fn build_call_graph_from_parser_edges(names: &Rc>, edges: Rc>>) -> Rc { +pub fn build_call_graph_from_parser_edges( + names: &Rc>, + edges: Rc>>, +) -> Rc { { let initial_forward = seed_adjacency_map(names.clone()); -let initial_reverse = seed_adjacency_map(names.clone()); -edges.iter().cloned().fold(Rc::new(CallGraph { - forward: initial_forward, - reverse: initial_reverse, -}), |acc: Rc, edge: Rc| { - let forward_neighbors = match v2_rt::map_get(&acc.forward.clone(), edge.caller.clone()) { - Some(ns) => ns.clone(), - None => Rc::new(vec![]), -}; -let reverse_neighbors = match v2_rt::map_get(&acc.reverse.clone(), edge.callee.clone()) { - Some(ns) => ns.clone(), - None => Rc::new(vec![]), -}; -Rc::new(CallGraph { - forward: v2_rt::rc_map_insert(acc.forward.clone(), edge.caller.clone(), v2_rt::rc_list_push(forward_neighbors.clone(), edge.callee.clone())), - reverse: v2_rt::rc_map_insert(acc.reverse.clone(), edge.callee.clone(), v2_rt::rc_list_push(reverse_neighbors.clone(), edge.caller.clone())), -}) -}) -} + let initial_reverse = seed_adjacency_map(names.clone()); + edges.iter().cloned().fold( + Rc::new(CallGraph { + forward: initial_forward, + reverse: initial_reverse, + }), + |acc: Rc, edge: Rc| { + let forward_neighbors = + match v2_rt::map_get(&acc.forward.clone(), edge.caller.clone()) { + Some(ns) => ns.clone(), + None => Rc::new(vec![]), + }; + let reverse_neighbors = + match v2_rt::map_get(&acc.reverse.clone(), edge.callee.clone()) { + Some(ns) => ns.clone(), + None => Rc::new(vec![]), + }; + Rc::new(CallGraph { + forward: v2_rt::rc_map_insert( + acc.forward.clone(), + edge.caller.clone(), + v2_rt::rc_list_push(forward_neighbors.clone(), edge.callee.clone()), + ), + reverse: v2_rt::rc_map_insert( + acc.reverse.clone(), + edge.callee.clone(), + v2_rt::rc_list_push(reverse_neighbors.clone(), edge.caller.clone()), + ), + }) + }, + ) + } } -pub fn same_progress_subgraph_has_cycle(members: &Rc>, edges: Rc>>) -> bool { +pub fn same_progress_subgraph_has_cycle( + members: &Rc>, + edges: Rc>>, +) -> bool { { - let same_edges = Rc::new({ let mut __result = Vec::new(); for edge in edges.iter().cloned() { if (edge.progress.clone() == DescentEvidence::NonIncreasing) { __result.push(edge); } } __result }); -let has_self_cycle = { let mut __found = false; for edge in same_edges.clone().iter().cloned() { if (edge.caller.clone().as_str() == edge.callee.clone().as_str()) { __found = true; break; } } __found }; -if has_self_cycle { + let same_edges = Rc::new({ + let mut __result = Vec::new(); + for edge in edges.iter().cloned() { + if (edge.progress.clone() == DescentEvidence::NonIncreasing) { + __result.push(edge); + } + } + __result + }); + let has_self_cycle = { + let mut __found = false; + for edge in same_edges.clone().iter().cloned() { + if (edge.caller.clone().as_str() == edge.callee.clone().as_str()) { + __found = true; + break; + } + } + __found + }; + if has_self_cycle { true } else { { - let same_cross_edges = Rc::new({ let mut __result = Vec::new(); for edge in same_edges.clone().iter().cloned() { if (edge.caller.clone().as_str() != edge.callee.clone().as_str()) { __result.push(edge); } } __result }); -let graph = build_call_graph_from_parser_edges(&members, same_cross_edges); -graph_has_multi_node_scc(members.clone(), graph) -} + let same_cross_edges = Rc::new({ + let mut __result = Vec::new(); + for edge in same_edges.clone().iter().cloned() { + if (edge.caller.clone().as_str() != edge.callee.clone().as_str()) { + __result.push(edge); + } + } + __result + }); + let graph = build_call_graph_from_parser_edges(&members, same_cross_edges); + graph_has_multi_node_scc(members.clone(), graph) + } } -} + } } -pub fn collect_parser_edges_for_scc(members: &Rc>, func_index: &Rc>>, scc_name_set: Rc>, si: &Rc>>) -> Rc>> { +pub fn collect_parser_edges_for_scc( + members: &Rc>, + func_index: &Rc>>, + scc_name_set: Rc>, + si: &Rc>>, +) -> Rc>> { { - let all_have_state = { let mut __all = true; for name in members.clone().iter().cloned() { if !(match v2_rt::map_get(&func_index, name.clone()) { - Some(entry) => (parser_state_param(entry.params.clone(), si.clone()) != None), - None => false, -}) { __all = false; break; } } __all }; -if (all_have_state == false) { + let all_have_state = { + let mut __all = true; + for name in members.clone().iter().cloned() { + if !(match v2_rt::map_get(&func_index, name.clone()) { + Some(entry) => (parser_state_param(entry.params.clone(), si.clone()) != None), + None => false, + }) { + __all = false; + break; + } + } + __all + }; + if (all_have_state == false) { Rc::new(vec![]) } else { { - let proven = infer_parser_always_advancing_members(&parser_function_names(&func_index, si.clone()), &func_index, &si); -let parser_always_advancing = proven; -Rc::new({ let mut __result = Vec::new(); for name in members.clone().iter().cloned() { __result.extend((*match v2_rt::map_get(&func_index, name.clone()) { - Some(entry) => match parser_state_param(entry.params.clone(), si.clone()) { - Some(state_param) => collect_parser_progress_edges(&name, &entry.body.clone(), &state_param, &scc_name_set, &empty_parser_progress_env(), &parser_always_advancing, &v2_rt::rc_empty_map::(), &si), - None => Rc::new(vec![]), -}, - None => Rc::new(vec![]), -}).iter().cloned()); } __result }) -} + let proven = infer_parser_always_advancing_members( + &parser_function_names(&func_index, si.clone()), + &func_index, + &si, + ); + let parser_always_advancing = proven; + Rc::new({ + let mut __result = Vec::new(); + for name in members.clone().iter().cloned() { + __result.extend( + (*match v2_rt::map_get(&func_index, name.clone()) { + Some(entry) => { + match parser_state_param(entry.params.clone(), si.clone()) { + Some(state_param) => collect_parser_progress_edges( + &name, + &entry.body.clone(), + &state_param, + &scc_name_set, + &empty_parser_progress_env(), + &parser_always_advancing, + &v2_rt::rc_empty_map::(), + &si, + ), + None => Rc::new(vec![]), + } + } + None => Rc::new(vec![]), + }) + .iter() + .cloned(), + ); + } + __result + }) + } } -} + } } -pub fn classify_parser_scc_recursion_pattern(members: &Rc>, func_index: Rc>>, si: Rc>>) -> Option> { +pub fn classify_parser_scc_recursion_pattern( + members: &Rc>, + func_index: Rc>>, + si: Rc>>, +) -> Option> { { - let scc_name_set = members.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, name: String| v2_rt::rc_map_insert(acc, name.clone(), true)); -let edges = collect_parser_edges_for_scc(&members, &func_index, scc_name_set, &si); -if ((edges.clone().len() as i64) == 0) { + let scc_name_set = members.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, name: String| { + v2_rt::rc_map_insert(acc, name.clone(), true) + }, + ); + let edges = collect_parser_edges_for_scc(&members, &func_index, scc_name_set, &si); + if ((edges.clone().len() as i64) == 0) { None } else { { - let all_known = { let mut __all = true; for edge in edges.clone().iter().cloned() { if !((edge.progress.clone() != DescentEvidence::DescentUnknown)) { __all = false; break; } } __all }; -if (all_known && (same_progress_subgraph_has_cycle(&members, edges.clone()) == false)) { - Some(lower_call_pattern(Rc::new(CallPattern::ParserAdvanceCall { - witness: "parser_state".to_string(), -}))) + let all_known = { + let mut __all = true; + for edge in edges.clone().iter().cloned() { + if !(edge.progress.clone() != DescentEvidence::DescentUnknown) { + __all = false; + break; + } + } + __all + }; + if (all_known + && (same_progress_subgraph_has_cycle(&members, edges.clone()) == false)) + { + Some(lower_call_pattern(Rc::new( + CallPattern::ParserAdvanceCall { + witness: "parser_state".to_string(), + }, + ))) } else { None } -} + } } -} + } } -pub fn count_self_calls(body: &Rc, func_name: &String, si: &Rc>>) -> i64 { +pub fn count_self_calls( + body: &Rc, + func_name: &String, + si: &Rc>>, +) -> i64 { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - { - let own = match (*body.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { + let own = match (*body.expr_data.clone()).clone() { + ExprData::ExprCall { .. } => { let f = expr_call_func_at(body.clone(), si.clone()); -if (f.as_str() == func_name.clone().as_str()) { + if (f.as_str() == func_name.clone().as_str()) { 1 } else { 0 } -}, - _ => 0, -}; -let from_children = body.children.clone().iter().cloned().fold(0, |acc: i64, child: Rc| (acc + count_self_calls(&child, &func_name, &si))); -(own + from_children) -} + } + _ => 0, + }; + let from_children = body + .children + .clone() + .iter() + .cloned() + .fold(0, |acc: i64, child: Rc| { + (acc + count_self_calls(&child, &func_name, &si)) + }); + (own + from_children) }) } -pub fn max_path_self_calls(body: Rc, func_name: String, si: Rc>>) -> i64 { +pub fn max_path_self_calls( + body: Rc, + func_name: String, + si: Rc>>, +) -> i64 { max_path_self_calls_with_cont(&body, &func_name, 0, &si) } -pub fn max_path_self_calls_with_cont(body: &Rc, func_name: &String, continue_calls: i64, si: &Rc>>) -> i64 { +pub fn max_path_self_calls_with_cont( + body: &Rc, + func_name: &String, + continue_calls: i64, + si: &Rc>>, +) -> i64 { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*body.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { - let f = expr_call_func_at(body.clone(), si.clone()); -let own = if (f.as_str() == func_name.clone().as_str()) { - 1 - } else { - 0 - }; -let arg_calls = body.children.clone().iter().cloned().fold(0, |acc: i64, child: Rc| { - let val = arg_value(&child); -match (*val.expr_data.clone()).clone() { - ExprData::ExprLambda => (acc.clone() + max_path_self_calls_with_cont(&lambda_body(val.clone()), &func_name, 0, &si)), - _ => (acc.clone() + max_path_self_calls_with_cont(&val, &func_name, 0, &si)), -} -}); -((own + arg_calls) + continue_calls.clone()) -}, - ExprData::ExprMatch => { - let scrut_calls = max_path_self_calls_with_cont(&match_scrutinee(body.clone()), &func_name, 0, &si); -let max_arm = match_arm_nodes(body.clone()).iter().cloned().fold(continue_calls.clone(), |acc: i64, arm_node: Rc| { - let arm_calls = max_path_self_calls_with_cont(&arm_body(&arm_node), &func_name, continue_calls.clone(), &si); -if (arm_calls.clone() > acc.clone()) { - arm_calls.clone() + ExprData::ExprCall { .. } => { + let f = expr_call_func_at(body.clone(), si.clone()); + let own = if (f.as_str() == func_name.clone().as_str()) { + 1 } else { - acc.clone() - } -}); -(scrut_calls + max_arm) -}, - ExprData::ExprIf => { - let cond_calls = max_path_self_calls_with_cont(&if_condition(body.clone()), &func_name, 0, &si); -let then_calls = max_path_self_calls_with_cont(&if_then_branch(body.clone()), &func_name, continue_calls.clone(), &si); -let else_calls = match if_else_branch(body.clone()) { - Some(eb) => max_path_self_calls_with_cont(&eb, &func_name, continue_calls.clone(), &si), - None => continue_calls.clone(), -}; -let branch_max = if (then_calls.clone() > else_calls.clone()) { - then_calls.clone() - } else { - else_calls.clone() - }; -(cond_calls + branch_max) -}, - ExprData::ExprForEach => (max_path_self_calls_with_cont(&foreach_collection(body.clone()), &func_name, 0, &si) + continue_calls.clone()), - ExprData::ExprLet => { - let val_calls = max_path_self_calls_with_cont(&let_value(body.clone()), &func_name, 0, &si); -let body_calls = match let_body(body.clone()) { - Some(b) => max_path_self_calls_with_cont(&b, &func_name, continue_calls.clone(), &si), - None => continue_calls.clone(), -}; -(val_calls + body_calls) -}, - ExprData::ExprBlock => v2_rt::reverse(body.children.clone()).iter().cloned().fold(continue_calls.clone(), |acc: i64, stmt: Rc| max_path_self_calls_with_cont(&stmt, &func_name, acc, &si)), - ExprData::ExprMethodCall { .. } => { - let recv_calls = max_path_self_calls_with_cont(&method_receiver(body.clone()), &func_name, 0, &si); -let arg_calls = method_arg_nodes(body.clone()).iter().cloned().fold(0, |acc: i64, arg_node: Rc| { - let val = arg_value(&arg_node); -match (*val.expr_data.clone()).clone() { - ExprData::ExprLambda => (acc.clone() + max_path_self_calls_with_cont(&lambda_body(val.clone()), &func_name, 0, &si)), - _ => (acc.clone() + max_path_self_calls_with_cont(&val, &func_name, 0, &si)), -} -}); -((recv_calls + arg_calls) + continue_calls.clone()) -}, - ExprData::ExprReturn => max_path_self_calls_with_cont(&return_value(body.clone()), &func_name, 0, &si), - _ => (body.children.clone().iter().cloned().fold(0, |acc: i64, child: Rc| (acc + max_path_self_calls_with_cont(&child, &func_name, 0, &si))) + continue_calls.clone()), -} + 0 + }; + let arg_calls = + body.children + .clone() + .iter() + .cloned() + .fold(0, |acc: i64, child: Rc| { + let val = arg_value(&child); + match (*val.expr_data.clone()).clone() { + ExprData::ExprLambda => { + (acc.clone() + + max_path_self_calls_with_cont( + &lambda_body(val.clone()), + &func_name, + 0, + &si, + )) + } + _ => { + (acc.clone() + + max_path_self_calls_with_cont(&val, &func_name, 0, &si)) + } + } + }); + ((own + arg_calls) + continue_calls.clone()) + } + ExprData::ExprMatch => { + let scrut_calls = max_path_self_calls_with_cont( + &match_scrutinee(body.clone()), + &func_name, + 0, + &si, + ); + let max_arm = match_arm_nodes(body.clone()).iter().cloned().fold( + continue_calls.clone(), + |acc: i64, arm_node: Rc| { + let arm_calls = max_path_self_calls_with_cont( + &arm_body(&arm_node), + &func_name, + continue_calls.clone(), + &si, + ); + if (arm_calls.clone() > acc.clone()) { + arm_calls.clone() + } else { + acc.clone() + } + }, + ); + (scrut_calls + max_arm) + } + ExprData::ExprIf => { + let cond_calls = + max_path_self_calls_with_cont(&if_condition(body.clone()), &func_name, 0, &si); + let then_calls = max_path_self_calls_with_cont( + &if_then_branch(body.clone()), + &func_name, + continue_calls.clone(), + &si, + ); + let else_calls = match if_else_branch(body.clone()) { + Some(eb) => { + max_path_self_calls_with_cont(&eb, &func_name, continue_calls.clone(), &si) + } + None => continue_calls.clone(), + }; + let branch_max = if (then_calls.clone() > else_calls.clone()) { + then_calls.clone() + } else { + else_calls.clone() + }; + (cond_calls + branch_max) + } + ExprData::ExprForEach => { + (max_path_self_calls_with_cont( + &foreach_collection(body.clone()), + &func_name, + 0, + &si, + ) + continue_calls.clone()) + } + ExprData::ExprLet => { + let val_calls = + max_path_self_calls_with_cont(&let_value(body.clone()), &func_name, 0, &si); + let body_calls = match let_body(body.clone()) { + Some(b) => { + max_path_self_calls_with_cont(&b, &func_name, continue_calls.clone(), &si) + } + None => continue_calls.clone(), + }; + (val_calls + body_calls) + } + ExprData::ExprBlock => v2_rt::reverse(body.children.clone()).iter().cloned().fold( + continue_calls.clone(), + |acc: i64, stmt: Rc| { + max_path_self_calls_with_cont(&stmt, &func_name, acc, &si) + }, + ), + ExprData::ExprMethodCall { .. } => { + let recv_calls = max_path_self_calls_with_cont( + &method_receiver(body.clone()), + &func_name, + 0, + &si, + ); + let arg_calls = method_arg_nodes(body.clone()).iter().cloned().fold( + 0, + |acc: i64, arg_node: Rc| { + let val = arg_value(&arg_node); + match (*val.expr_data.clone()).clone() { + ExprData::ExprLambda => { + (acc.clone() + + max_path_self_calls_with_cont( + &lambda_body(val.clone()), + &func_name, + 0, + &si, + )) + } + _ => { + (acc.clone() + + max_path_self_calls_with_cont(&val, &func_name, 0, &si)) + } + } + }, + ); + ((recv_calls + arg_calls) + continue_calls.clone()) + } + ExprData::ExprReturn => { + max_path_self_calls_with_cont(&return_value(body.clone()), &func_name, 0, &si) + } + _ => { + (body + .children + .clone() + .iter() + .cloned() + .fold(0, |acc: i64, child: Rc| { + (acc + max_path_self_calls_with_cont(&child, &func_name, 0, &si)) + }) + + continue_calls.clone()) + } + } }) } -pub fn max_path_self_calls_block(stmts: Rc>>, func_name: String, continue_calls: i64, si: Rc>>) -> i64 { - v2_rt::reverse(stmts).iter().cloned().fold(continue_calls.clone(), |acc: i64, stmt: Rc| max_path_self_calls_with_cont(&stmt, &func_name, acc, &si)) -} - -pub fn count_target_calls(body: &Rc, target_set: &Rc>, si: &Rc>>) -> i64 { +pub fn max_path_self_calls_block( + stmts: Rc>>, + func_name: String, + continue_calls: i64, + si: Rc>>, +) -> i64 { + v2_rt::reverse(stmts) + .iter() + .cloned() + .fold(continue_calls.clone(), |acc: i64, stmt: Rc| { + max_path_self_calls_with_cont(&stmt, &func_name, acc, &si) + }) +} + +pub fn count_target_calls( + body: &Rc, + target_set: &Rc>, + si: &Rc>>, +) -> i64 { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - { - let own = match (*body.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { + let own = match (*body.expr_data.clone()).clone() { + ExprData::ExprCall { .. } => { let f = expr_call_func_at(body.clone(), si.clone()); -if set_has(target_set.clone(), f) { + if set_has(target_set.clone(), f) { 1 } else { 0 } -}, - _ => 0, -}; -let from_children = body.children.clone().iter().cloned().fold(0, |acc: i64, child: Rc| (acc + count_target_calls(&child, &target_set, &si))); -(own + from_children) -} + } + _ => 0, + }; + let from_children = body + .children + .clone() + .iter() + .cloned() + .fold(0, |acc: i64, child: Rc| { + (acc + count_target_calls(&child, &target_set, &si)) + }); + (own + from_children) }) } -pub fn max_path_target_calls(body: Rc, target_set: Rc>, si: Rc>>) -> i64 { +pub fn max_path_target_calls( + body: Rc, + target_set: Rc>, + si: Rc>>, +) -> i64 { max_path_target_calls_with_cont(&body, &target_set, 0, &si) } -pub fn max_path_target_calls_with_cont(body: &Rc, target_set: &Rc>, continue_calls: i64, si: &Rc>>) -> i64 { +pub fn max_path_target_calls_with_cont( + body: &Rc, + target_set: &Rc>, + continue_calls: i64, + si: &Rc>>, +) -> i64 { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*body.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { - let f = expr_call_func_at(body.clone(), si.clone()); -let own = if set_has(target_set.clone(), f) { - 1 - } else { - 0 - }; -let arg_calls = body.children.clone().iter().cloned().fold(0, |acc: i64, child: Rc| (acc + max_path_target_calls_with_cont(&arg_value(&child), &target_set, 0, &si))); -((own + arg_calls) + continue_calls.clone()) -}, - ExprData::ExprMatch => { - let scrut_calls = max_path_target_calls_with_cont(&match_scrutinee(body.clone()), &target_set, 0, &si); -let max_arm = match_arm_nodes(body.clone()).iter().cloned().fold(continue_calls.clone(), |acc: i64, arm_node: Rc| { - let arm_calls = max_path_target_calls_with_cont(&arm_body(&arm_node), &target_set, continue_calls.clone(), &si); -if (arm_calls.clone() > acc.clone()) { - arm_calls.clone() + ExprData::ExprCall { .. } => { + let f = expr_call_func_at(body.clone(), si.clone()); + let own = if set_has(target_set.clone(), f) { 1 } else { 0 }; + let arg_calls = + body.children + .clone() + .iter() + .cloned() + .fold(0, |acc: i64, child: Rc| { + (acc + max_path_target_calls_with_cont( + &arg_value(&child), + &target_set, + 0, + &si, + )) + }); + ((own + arg_calls) + continue_calls.clone()) + } + ExprData::ExprMatch => { + let scrut_calls = max_path_target_calls_with_cont( + &match_scrutinee(body.clone()), + &target_set, + 0, + &si, + ); + let max_arm = match_arm_nodes(body.clone()).iter().cloned().fold( + continue_calls.clone(), + |acc: i64, arm_node: Rc| { + let arm_calls = max_path_target_calls_with_cont( + &arm_body(&arm_node), + &target_set, + continue_calls.clone(), + &si, + ); + if (arm_calls.clone() > acc.clone()) { + arm_calls.clone() + } else { + acc.clone() + } + }, + ); + (scrut_calls + max_arm) + } + ExprData::ExprIf => { + let cond_calls = max_path_target_calls_with_cont( + &if_condition(body.clone()), + &target_set, + 0, + &si, + ); + let then_calls = max_path_target_calls_with_cont( + &if_then_branch(body.clone()), + &target_set, + continue_calls.clone(), + &si, + ); + let else_calls = match if_else_branch(body.clone()) { + Some(eb) => max_path_target_calls_with_cont( + &eb, + &target_set, + continue_calls.clone(), + &si, + ), + None => continue_calls.clone(), + }; + let branch_max = if (then_calls.clone() > else_calls.clone()) { + then_calls.clone() } else { - acc.clone() - } -}); -(scrut_calls + max_arm) -}, - ExprData::ExprIf => { - let cond_calls = max_path_target_calls_with_cont(&if_condition(body.clone()), &target_set, 0, &si); -let then_calls = max_path_target_calls_with_cont(&if_then_branch(body.clone()), &target_set, continue_calls.clone(), &si); -let else_calls = match if_else_branch(body.clone()) { - Some(eb) => max_path_target_calls_with_cont(&eb, &target_set, continue_calls.clone(), &si), - None => continue_calls.clone(), -}; -let branch_max = if (then_calls.clone() > else_calls.clone()) { - then_calls.clone() - } else { - else_calls.clone() - }; -(cond_calls + branch_max) -}, - ExprData::ExprForEach => (max_path_target_calls_with_cont(&foreach_collection(body.clone()), &target_set, 0, &si) + continue_calls.clone()), - ExprData::ExprLet => { - let val_calls = max_path_target_calls_with_cont(&let_value(body.clone()), &target_set, 0, &si); -let body_calls = match let_body(body.clone()) { - Some(b) => max_path_target_calls_with_cont(&b, &target_set, continue_calls.clone(), &si), - None => continue_calls.clone(), -}; -(val_calls + body_calls) -}, - ExprData::ExprBlock => v2_rt::reverse(body.children.clone()).iter().cloned().fold(continue_calls.clone(), |acc: i64, stmt: Rc| max_path_target_calls_with_cont(&stmt, &target_set, acc, &si)), - ExprData::ExprMethodCall { .. } => { - let recv_calls = max_path_target_calls_with_cont(&method_receiver(body.clone()), &target_set, 0, &si); -let arg_calls = method_arg_nodes(body.clone()).iter().cloned().fold(0, |acc: i64, arg_node: Rc| { - let val = arg_value(&arg_node); -match (*val.expr_data.clone()).clone() { - ExprData::ExprLambda => (acc.clone() + max_path_target_calls_with_cont(&lambda_body(val.clone()), &target_set, 0, &si)), - _ => (acc.clone() + max_path_target_calls_with_cont(&val, &target_set, 0, &si)), -} -}); -((recv_calls + arg_calls) + continue_calls.clone()) -}, - ExprData::ExprReturn => max_path_target_calls_with_cont(&return_value(body.clone()), &target_set, 0, &si), - _ => body.children.clone().iter().cloned().fold(continue_calls.clone(), |acc: i64, child: Rc| (acc + max_path_target_calls_with_cont(&child, &target_set, 0, &si))), -} + else_calls.clone() + }; + (cond_calls + branch_max) + } + ExprData::ExprForEach => { + (max_path_target_calls_with_cont( + &foreach_collection(body.clone()), + &target_set, + 0, + &si, + ) + continue_calls.clone()) + } + ExprData::ExprLet => { + let val_calls = + max_path_target_calls_with_cont(&let_value(body.clone()), &target_set, 0, &si); + let body_calls = match let_body(body.clone()) { + Some(b) => max_path_target_calls_with_cont( + &b, + &target_set, + continue_calls.clone(), + &si, + ), + None => continue_calls.clone(), + }; + (val_calls + body_calls) + } + ExprData::ExprBlock => v2_rt::reverse(body.children.clone()).iter().cloned().fold( + continue_calls.clone(), + |acc: i64, stmt: Rc| { + max_path_target_calls_with_cont(&stmt, &target_set, acc, &si) + }, + ), + ExprData::ExprMethodCall { .. } => { + let recv_calls = max_path_target_calls_with_cont( + &method_receiver(body.clone()), + &target_set, + 0, + &si, + ); + let arg_calls = method_arg_nodes(body.clone()).iter().cloned().fold( + 0, + |acc: i64, arg_node: Rc| { + let val = arg_value(&arg_node); + match (*val.expr_data.clone()).clone() { + ExprData::ExprLambda => { + (acc.clone() + + max_path_target_calls_with_cont( + &lambda_body(val.clone()), + &target_set, + 0, + &si, + )) + } + _ => { + (acc.clone() + + max_path_target_calls_with_cont(&val, &target_set, 0, &si)) + } + } + }, + ); + ((recv_calls + arg_calls) + continue_calls.clone()) + } + ExprData::ExprReturn => { + max_path_target_calls_with_cont(&return_value(body.clone()), &target_set, 0, &si) + } + _ => body.children.clone().iter().cloned().fold( + continue_calls.clone(), + |acc: i64, child: Rc| { + (acc + max_path_target_calls_with_cont(&child, &target_set, 0, &si)) + }, + ), + } }) } -pub fn build_scc_measure_params(members: Rc>, func_index: Rc>>, si: Rc>>) -> Rc>>> { - members.iter().cloned().fold(v2_rt::rc_empty_map::>>(), |acc: Rc>>>, name: String| match v2_rt::map_get(&func_index, name.clone()) { - Some(entry) => v2_rt::rc_map_insert(acc.clone(), name.clone(), recursive_measure_param_names(&entry.body.clone(), &entry.params.clone(), &si)), - None => acc.clone(), -}) +pub fn build_scc_measure_params( + members: Rc>, + func_index: Rc>>, + si: Rc>>, +) -> Rc>>> { + members.iter().cloned().fold( + v2_rt::rc_empty_map::>>(), + |acc: Rc>>>, name: String| match v2_rt::map_get( + &func_index, + name.clone(), + ) { + Some(entry) => v2_rt::rc_map_insert( + acc.clone(), + name.clone(), + recursive_measure_param_names(&entry.body.clone(), &entry.params.clone(), &si), + ), + None => acc.clone(), + }, + ) } -pub fn target_call_has_arithmetic_descent(call_node: &Rc, target_set: &Rc>, func_index: Rc>>, scc_measure_params: Rc>>>, si: &Rc>>) -> bool { +pub fn target_call_has_arithmetic_descent( + call_node: &Rc, + target_set: &Rc>, + func_index: Rc>>, + scc_measure_params: Rc>>>, + si: &Rc>>, +) -> bool { { let callee = expr_call_func_at(call_node.clone(), si.clone()); -if (set_has(target_set.clone(), callee.clone()) == false) { + if (set_has(target_set.clone(), callee.clone()) == false) { true } else { match v2_rt::map_get(&func_index, callee.clone()) { - Some(callee_entry) => { - let callee_measure_params = match v2_rt::map_get(&scc_measure_params, callee.clone()) { - Some(params) => params.clone(), - None => v2_rt::rc_empty_map::(), -}; -{ let mut __found = false; for pair in Rc::new(call_node.children.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { if { - let arg_expr = arg_value(&pair.1.clone()); -(((max_path_target_calls(arg_expr.clone(), target_set.clone(), si.clone()) == 0) && is_descending_expr(&arg_expr)) && match recursive_param_name_for_arg(pair.0.clone(), pair.1.clone(), callee_entry.params.clone(), &si) { - Some(param_name) => (v2_rt::map_get(&callee_measure_params, param_name.clone()) != None), - None => false, -}) -} { __found = true; break; } } __found } -}, - None => false, -} + Some(callee_entry) => { + let callee_measure_params = + match v2_rt::map_get(&scc_measure_params, callee.clone()) { + Some(params) => params.clone(), + None => v2_rt::rc_empty_map::(), + }; + { + let mut __found = false; + for pair in Rc::new( + call_node + .children + .clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + { + if { + let arg_expr = arg_value(&pair.1.clone()); + (((max_path_target_calls( + arg_expr.clone(), + target_set.clone(), + si.clone(), + ) == 0) + && is_descending_expr(&arg_expr)) + && match recursive_param_name_for_arg( + pair.0.clone(), + pair.1.clone(), + callee_entry.params.clone(), + &si, + ) { + Some(param_name) => { + (v2_rt::map_get( + &callee_measure_params, + param_name.clone(), + ) != None) + } + None => false, + }) + } { + __found = true; + break; + } + } + __found + } + } + None => false, + } } -} + } } -pub fn scc_calls_have_arithmetic_descent(body: &Rc, target_set: &Rc>, func_index: &Rc>>, scc_measure_params: &Rc>>>, si: &Rc>>) -> bool { +pub fn scc_calls_have_arithmetic_descent( + body: &Rc, + target_set: &Rc>, + func_index: &Rc>>, + scc_measure_params: &Rc>>>, + si: &Rc>>, +) -> bool { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*body.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => (target_call_has_arithmetic_descent(&body, &target_set, func_index.clone(), scc_measure_params.clone(), &si) && { let mut __all = true; for child in body.children.clone().iter().cloned() { if !(scc_calls_have_arithmetic_descent(&child, &target_set, &func_index, &scc_measure_params, &si)) { __all = false; break; } } __all }), - _ => { let mut __all = true; for child in body.children.clone().iter().cloned() { if !(scc_calls_have_arithmetic_descent(&child, &target_set, &func_index, &scc_measure_params, &si)) { __all = false; break; } } __all }, -} - }) -} - -pub fn descending_name_set_without_key(names: &Rc>, key: String) -> Rc> { - Rc::new(v2_rt::map_keys(&names)).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, name: String| if (name.clone().as_str() == key.clone().as_str()) { - acc.clone() - } else { - match v2_rt::map_get(&names, name.clone()) { - Some(source) => v2_rt::rc_map_insert(acc.clone(), name.clone(), source.clone()), - None => acc.clone(), -} + ExprData::ExprCall { .. } => { + (target_call_has_arithmetic_descent( + &body, + &target_set, + func_index.clone(), + scc_measure_params.clone(), + &si, + ) && { + let mut __all = true; + for child in body.children.clone().iter().cloned() { + if !(scc_calls_have_arithmetic_descent( + &child, + &target_set, + &func_index, + &scc_measure_params, + &si, + )) { + __all = false; + break; + } + } + __all + }) + } + _ => { + let mut __all = true; + for child in body.children.clone().iter().cloned() { + if !(scc_calls_have_arithmetic_descent( + &child, + &target_set, + &func_index, + &scc_measure_params, + &si, + )) { + __all = false; + break; + } + } + __all + } + } }) } -pub fn expr_descending_witness_source(mut expr: Rc, mut descending_witness_names: Rc>, mut si: Rc>>) -> Option { +pub fn descending_name_set_without_key( + names: &Rc>, + key: String, +) -> Rc> { + Rc::new(v2_rt::map_keys(&names)).iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, name: String| { + if (name.clone().as_str() == key.clone().as_str()) { + acc.clone() + } else { + match v2_rt::map_get(&names, name.clone()) { + Some(source) => v2_rt::rc_map_insert(acc.clone(), name.clone(), source.clone()), + None => acc.clone(), + } + } + }, + ) +} + +pub fn expr_descending_witness_source( + mut expr: Rc, + mut descending_witness_names: Rc>, + mut si: Rc>>, +) -> Option { loop { match (*expr.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { break v2_rt::map_get(&descending_witness_names, expr_var_name_at(expr.clone(), si)); }, - ExprData::ExprBinOp { op, .. } => { match op.clone() { - BinOp::Sub => { { - let __tco_0 = binop_left(expr); -expr = __tco_0; -continue; -} }, - BinOp::Div => { { - let __tco_0 = binop_left(expr); -expr = __tco_0; -continue; -} }, - _ => { break None; }, -} }, - _ => { break None; }, -} -} -} - -pub fn condition_param_names(expr: &Rc, param_set: Rc>, si: Rc>>) -> Rc> { + ExprData::ExprVar { .. } => { + break v2_rt::map_get( + &descending_witness_names, + expr_var_name_at(expr.clone(), si), + ); + } + ExprData::ExprBinOp { op, .. } => match op.clone() { + BinOp::Sub => { + let __tco_0 = binop_left(expr); + expr = __tco_0; + continue; + } + BinOp::Div => { + let __tco_0 = binop_left(expr); + expr = __tco_0; + continue; + } + _ => { + break None; + } + }, + _ => { + break None; + } + } + } +} + +pub fn condition_param_names( + expr: &Rc, + param_set: Rc>, + si: Rc>>, +) -> Rc> { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*expr.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let name = expr_var_name_at(expr.clone(), si.clone()); -match v2_rt::map_get(¶m_set, name.clone()) { - Some(_) => seed_string_map(name.clone(), name.clone()), - None => v2_rt::rc_empty_map::(), -} -}, - _ => expr.children.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, child: Rc| v2_rt::rc_map_merge(acc, condition_param_names(&child, param_set.clone(), si.clone()))), -} + ExprData::ExprVar { .. } => { + let name = expr_var_name_at(expr.clone(), si.clone()); + match v2_rt::map_get(¶m_set, name.clone()) { + Some(_) => seed_string_map(name.clone(), name.clone()), + None => v2_rt::rc_empty_map::(), + } + } + _ => expr.children.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, child: Rc| { + v2_rt::rc_map_merge( + acc, + condition_param_names(&child, param_set.clone(), si.clone()), + ) + }, + ), + } }) } -pub fn recursive_measure_param_names(body: &Rc, params: &Rc>>, si: &Rc>>) -> Rc> { +pub fn recursive_measure_param_names( + body: &Rc, + params: &Rc>>, + si: &Rc>>, +) -> Rc> { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - { - let param_set = params.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, param: Rc| v2_rt::rc_map_insert(acc, param_node_name_at(param.clone(), si.clone()), param_node_name_at(param.clone(), si.clone()))); -match (*body.expr_data.clone()).clone() { - ExprData::ExprIf => { - let then_names = recursive_measure_param_names(&if_then_branch(body.clone()), ¶ms, &si); -let else_names = match if_else_branch(body.clone()) { - Some(eb) => recursive_measure_param_names(&eb, ¶ms, &si), - None => v2_rt::rc_empty_map::(), -}; -v2_rt::rc_map_merge(v2_rt::rc_map_merge(condition_param_names(&if_condition(body.clone()), param_set, si.clone()), then_names), else_names) -}, - ExprData::ExprMatch => { - let scrut_names = condition_param_names(&match_scrutinee(body.clone()), param_set, si.clone()); -let arm_names = match_arm_nodes(body.clone()).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, arm_node: Rc| v2_rt::rc_map_merge(acc, recursive_measure_param_names(&arm_body(&arm_node), ¶ms, &si))); -v2_rt::rc_map_merge(scrut_names, arm_names) -}, - ExprData::ExprLet => match let_body(body.clone()) { - Some(b) => recursive_measure_param_names(&b, ¶ms, &si), - None => v2_rt::rc_empty_map::(), -}, - ExprData::ExprBlock => body.children.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, stmt: Rc| v2_rt::rc_map_merge(acc, recursive_measure_param_names(&stmt, ¶ms, &si))), - _ => body.children.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, child: Rc| v2_rt::rc_map_merge(acc, recursive_measure_param_names(&child, ¶ms, &si))), -} -} + let param_set = params.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, param: Rc| { + v2_rt::rc_map_insert( + acc, + param_node_name_at(param.clone(), si.clone()), + param_node_name_at(param.clone(), si.clone()), + ) + }, + ); + match (*body.expr_data.clone()).clone() { + ExprData::ExprIf => { + let then_names = + recursive_measure_param_names(&if_then_branch(body.clone()), ¶ms, &si); + let else_names = match if_else_branch(body.clone()) { + Some(eb) => recursive_measure_param_names(&eb, ¶ms, &si), + None => v2_rt::rc_empty_map::(), + }; + v2_rt::rc_map_merge( + v2_rt::rc_map_merge( + condition_param_names(&if_condition(body.clone()), param_set, si.clone()), + then_names, + ), + else_names, + ) + } + ExprData::ExprMatch => { + let scrut_names = + condition_param_names(&match_scrutinee(body.clone()), param_set, si.clone()); + let arm_names = match_arm_nodes(body.clone()).iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, arm_node: Rc| { + v2_rt::rc_map_merge( + acc, + recursive_measure_param_names(&arm_body(&arm_node), ¶ms, &si), + ) + }, + ); + v2_rt::rc_map_merge(scrut_names, arm_names) + } + ExprData::ExprLet => match let_body(body.clone()) { + Some(b) => recursive_measure_param_names(&b, ¶ms, &si), + None => v2_rt::rc_empty_map::(), + }, + ExprData::ExprBlock => body.children.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, stmt: Rc| { + v2_rt::rc_map_merge(acc, recursive_measure_param_names(&stmt, ¶ms, &si)) + }, + ), + _ => body.children.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, child: Rc| { + v2_rt::rc_map_merge(acc, recursive_measure_param_names(&child, ¶ms, &si)) + }, + ), + } }) } -pub fn recursive_param_name_for_arg(idx: i64, arg_node: Rc, params: Rc>>, si: &Rc>>) -> Option { +pub fn recursive_param_name_for_arg( + idx: i64, + arg_node: Rc, + params: Rc>>, + si: &Rc>>, +) -> Option { match arg_name_at(arg_node, si.clone()) { - Some(name) => Some(name.clone()), - None => Rc::new({ let mut __result = Vec::new(); for pair in Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(params.iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { if (pair.0.clone() == idx.clone()) { __result.push(pair); } } __result }).iter().cloned() { __result.push(param_node_name_at(pair.1.clone(), si.clone())); } __result }).first().cloned(), -} + Some(name) => Some(name.clone()), + None => Rc::new({ + let mut __result = Vec::new(); + for pair in Rc::new({ + let mut __result = Vec::new(); + for pair in Rc::new( + params + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + { + if (pair.0.clone() == idx.clone()) { + __result.push(pair); + } + } + __result + }) + .iter() + .cloned() + { + __result.push(param_node_name_at(pair.1.clone(), si.clone())); + } + __result + }) + .first() + .cloned(), + } } pub fn is_descending_expr(expr: &Rc) -> bool { match (*expr.expr_data.clone()).clone() { - ExprData::ExprBinOp { op, .. } => match op.clone() { - BinOp::Sub => match (*binop_left(expr.clone()).expr_data.clone()).clone() { - ExprData::ExprVar { .. } => true, - _ => false, -}, - BinOp::Div => match (*binop_left(expr.clone()).expr_data.clone()).clone() { - ExprData::ExprVar { .. } => true, - _ => false, -}, - _ => false, -}, - _ => false, -} + ExprData::ExprBinOp { op, .. } => match op.clone() { + BinOp::Sub => match (*binop_left(expr.clone()).expr_data.clone()).clone() { + ExprData::ExprVar { .. } => true, + _ => false, + }, + BinOp::Div => match (*binop_left(expr.clone()).expr_data.clone()).clone() { + ExprData::ExprVar { .. } => true, + _ => false, + }, + _ => false, + }, + _ => false, + } } -pub fn has_arithmetic_descent(body: &Rc, func_name: &String, si: &Rc>>) -> bool { +pub fn has_arithmetic_descent( + body: &Rc, + func_name: &String, + si: &Rc>>, +) -> bool { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*body.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { - let own_ok = if (expr_call_func_at(body.clone(), si.clone()).as_str() == func_name.clone().as_str()) { - { let mut __found = false; for arg_node in body.children.clone().iter().cloned() { if is_descending_expr(&arg_value(&arg_node)) { __found = true; break; } } __found } - } else { - false - }; -if own_ok { - true - } else { - { let mut __found = false; for c in body.children.clone().iter().cloned() { if has_arithmetic_descent(&c, &func_name, &si) { __found = true; break; } } __found } + ExprData::ExprCall { .. } => { + let own_ok = if (expr_call_func_at(body.clone(), si.clone()).as_str() + == func_name.clone().as_str()) + { + { + let mut __found = false; + for arg_node in body.children.clone().iter().cloned() { + if is_descending_expr(&arg_value(&arg_node)) { + __found = true; + break; + } + } + __found + } + } else { + false + }; + if own_ok { + true + } else { + { + let mut __found = false; + for c in body.children.clone().iter().cloned() { + if has_arithmetic_descent(&c, &func_name, &si) { + __found = true; + break; + } + } + __found + } + } } -}, - _ => { let mut __found = false; for c in body.children.clone().iter().cloned() { if has_arithmetic_descent(&c, &func_name, &si) { __found = true; break; } } __found }, -} + _ => { + let mut __found = false; + for c in body.children.clone().iter().cloned() { + if has_arithmetic_descent(&c, &func_name, &si) { + __found = true; + break; + } + } + __found + } + } }) } -pub fn is_accessor_of_param(expr: &Rc, param_name: String, vars: Rc>, si: &Rc>>) -> bool { +pub fn is_accessor_of_param( + expr: &Rc, + param_name: String, + vars: Rc>, + si: &Rc>>, +) -> bool { match (*expr.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { - let callee = expr_call_func_at(expr.clone(), si.clone()); -(is_child_accessor_in_model(callee) && { let mut __found = false; for arg_node in expr.children.clone().iter().cloned() { if match (*arg_value(&arg_node).expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let vname = expr_var_name_at(arg_value(&arg_node), si.clone()); -((vname.clone().as_str() == param_name.clone().as_str()) || set_has(vars.clone(), vname.clone())) -}, - _ => false, -} { __found = true; break; } } __found }) -}, - _ => false, -} + ExprData::ExprCall { .. } => { + let callee = expr_call_func_at(expr.clone(), si.clone()); + (is_child_accessor_in_model(callee) && { + let mut __found = false; + for arg_node in expr.children.clone().iter().cloned() { + if match (*arg_value(&arg_node).expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let vname = expr_var_name_at(arg_value(&arg_node), si.clone()); + ((vname.clone().as_str() == param_name.clone().as_str()) + || set_has(vars.clone(), vname.clone())) + } + _ => false, + } { + __found = true; + break; + } + } + __found + }) + } + _ => false, + } } -pub fn is_children_of_param(mut expr: Rc, mut param_name: String, mut vars: Rc>, mut si: Rc>>) -> bool { +pub fn is_children_of_param( + mut expr: Rc, + mut param_name: String, + mut vars: Rc>, + mut si: Rc>>, +) -> bool { loop { match (*expr.expr_data.clone()).clone() { - ExprData::ExprFieldAccess { .. } => { let base = field_access_base(expr.clone()); -let field = field_access_field_at(expr.clone(), si.clone()); -break (is_children_list_field(field) && match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => (expr_var_name_at(base.clone(), si.clone()).as_str() == param_name.as_str()), - _ => false, -}); }, - ExprData::ExprVar { .. } => { break set_has(vars, expr_var_name_at(expr.clone(), si.clone())); }, - ExprData::ExprMethodCall { method_semantics: ms, .. } => { match method_size_effect(ms.clone()) { - Some(CollectionSizeEffect::ShrinkEffect) => { { - let __tco_0 = method_receiver(expr); -expr = __tco_0; -continue; -} }, - _ => { break false; }, -} }, - _ => { break false; }, -} -} + ExprData::ExprFieldAccess { .. } => { + let base = field_access_base(expr.clone()); + let field = field_access_field_at(expr.clone(), si.clone()); + break (is_children_list_field(field) + && match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + (expr_var_name_at(base.clone(), si.clone()).as_str() + == param_name.as_str()) + } + _ => false, + }); + } + ExprData::ExprVar { .. } => { + break set_has(vars, expr_var_name_at(expr.clone(), si.clone())); + } + ExprData::ExprMethodCall { + method_semantics: ms, + .. + } => match method_size_effect(ms.clone()) { + Some(CollectionSizeEffect::ShrinkEffect) => { + let __tco_0 = method_receiver(expr); + expr = __tco_0; + continue; + } + _ => { + break false; + } + }, + _ => { + break false; + } + } + } } -pub fn is_structural_children(expr: &Rc, param_name: &String, vars: &Rc>, si: &Rc>>) -> bool { +pub fn is_structural_children( + expr: &Rc, + param_name: &String, + vars: &Rc>, + si: &Rc>>, +) -> bool { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - (is_children_of_param(expr.clone(), param_name.clone(), vars.clone(), si.clone()) || match (*expr.expr_data.clone()).clone() { - ExprData::ExprFieldAccess { .. } => { - let base = field_access_base(expr.clone()); -let field = field_access_field_at(expr.clone(), si.clone()); -(is_children_list_field(field) && match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => set_has(vars.clone(), expr_var_name_at(base.clone(), si.clone())), - _ => false, -}) -}, - ExprData::ExprMethodCall { method_semantics: ms, .. } => match method_size_effect(ms.clone()) { - Some(CollectionSizeEffect::ShrinkEffect) => is_structural_children(&method_receiver(expr.clone()), ¶m_name, &vars, &si), - Some(CollectionSizeEffect::IdentityEffect) => is_structural_children(&method_receiver(expr.clone()), ¶m_name, &vars, &si), - _ => false, -}, - _ => false, -}) + (is_children_of_param(expr.clone(), param_name.clone(), vars.clone(), si.clone()) + || match (*expr.expr_data.clone()).clone() { + ExprData::ExprFieldAccess { .. } => { + let base = field_access_base(expr.clone()); + let field = field_access_field_at(expr.clone(), si.clone()); + (is_children_list_field(field) + && match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + set_has(vars.clone(), expr_var_name_at(base.clone(), si.clone())) + } + _ => false, + }) + } + ExprData::ExprMethodCall { + method_semantics: ms, + .. + } => match method_size_effect(ms.clone()) { + Some(CollectionSizeEffect::ShrinkEffect) => is_structural_children( + &method_receiver(expr.clone()), + ¶m_name, + &vars, + &si, + ), + Some(CollectionSizeEffect::IdentityEffect) => is_structural_children( + &method_receiver(expr.clone()), + ¶m_name, + &vars, + &si, + ), + _ => false, + }, + _ => false, + }) }) } -pub fn is_child_descent_expr(expr: &Rc, param_name: &String, vars: &Rc>, si: &Rc>>) -> bool { +pub fn is_child_descent_expr( + expr: &Rc, + param_name: &String, + vars: &Rc>, + si: &Rc>>, +) -> bool { if is_accessor_of_param(&expr, param_name.clone(), vars.clone(), &si) { true } else { match (*expr.expr_data.clone()).clone() { - ExprData::ExprMethodCall { method_semantics: ms, .. } => match method_size_effect(ms.clone()) { - Some(CollectionSizeEffect::ProjectionEffect) => is_children_of_param(method_receiver(expr.clone()), param_name.clone(), vars.clone(), si.clone()), - _ => false, -}, - _ => false, -} + ExprData::ExprMethodCall { + method_semantics: ms, + .. + } => match method_size_effect(ms.clone()) { + Some(CollectionSizeEffect::ProjectionEffect) => is_children_of_param( + method_receiver(expr.clone()), + param_name.clone(), + vars.clone(), + si.clone(), + ), + _ => false, + }, + _ => false, + } } } -pub fn is_tree_size_preserving_wrapper(expr: &Rc, si: Rc>>) -> bool { +pub fn is_tree_size_preserving_wrapper( + expr: &Rc, + si: Rc>>, +) -> bool { match (*expr.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { - let callee = expr_call_func_at(expr.clone(), si); -is_tree_size_preserving(callee) -}, - _ => false, -} + ExprData::ExprCall { .. } => { + let callee = expr_call_func_at(expr.clone(), si); + is_tree_size_preserving(callee) + } + _ => false, + } } pub fn wrapper_inner_arg(expr: Rc) -> Rc { match expr.children.clone().first().cloned() { - Some(arg_node) => arg_value(&arg_node), - None => expr.clone(), -} + Some(arg_node) => arg_value(&arg_node), + None => expr.clone(), + } } pub fn is_sub_value_extractor(expr: &Rc, si: Rc>>) -> bool { match (*expr.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { - let callee = expr_call_func_at(expr.clone(), si); -is_tree_size_reducing(callee) -}, - _ => false, -} + ExprData::ExprCall { .. } => { + let callee = expr_call_func_at(expr.clone(), si); + is_tree_size_reducing(callee) + } + _ => false, + } } pub fn extractor_inner_arg(expr: Rc) -> Rc { match expr.children.clone().first().cloned() { - Some(arg_node) => arg_value(&arg_node), - None => expr.clone(), -} + Some(arg_node) => arg_value(&arg_node), + None => expr.clone(), + } } -pub fn is_list_shrink_expr(expr: &Rc, param_name: String, si: Rc>>) -> bool { +pub fn is_list_shrink_expr( + expr: &Rc, + param_name: String, + si: Rc>>, +) -> bool { match (*expr.expr_data.clone()).clone() { - ExprData::ExprMethodCall { method_semantics: ms, .. } => { - let is_shrink = match method_size_effect(ms.clone()) { - Some(CollectionSizeEffect::ShrinkEffect) => true, - _ => false, -}; -((is_shrink && match (*method_receiver(expr.clone()).expr_data.clone()).clone() { - ExprData::ExprVar { .. } => (expr_var_name_at(method_receiver(expr.clone()), si).as_str() == param_name.as_str()), - _ => false, -}) && match method_arg_nodes(expr.clone()).first().cloned() { - Some(arg_node) => match (*arg_value(&arg_node).expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitInt { value: n, .. } = value.as_ref() else { unreachable!() }; (n.clone() > 0) }, - _ => false, -}, - None => false, -}) -}, - _ => false, -} + ExprData::ExprMethodCall { + method_semantics: ms, + .. + } => { + let is_shrink = match method_size_effect(ms.clone()) { + Some(CollectionSizeEffect::ShrinkEffect) => true, + _ => false, + }; + ((is_shrink + && match (*method_receiver(expr.clone()).expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + (expr_var_name_at(method_receiver(expr.clone()), si).as_str() + == param_name.as_str()) + } + _ => false, + }) + && match method_arg_nodes(expr.clone()).first().cloned() { + Some(arg_node) => match (*arg_value(&arg_node).expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { + let LiteralValue::LitInt { value: n, .. } = value.as_ref() else { + unreachable!() + }; + (n.clone() > 0) + } + _ => false, + }, + None => false, + }) + } + _ => false, + } } pub fn is_generalized_shrink(expr: &Rc, si: Rc>>) -> bool { match (*expr.expr_data.clone()).clone() { - ExprData::ExprMethodCall { method_semantics: ms, .. } => { - let is_shrink = match method_size_effect(ms.clone()) { - Some(CollectionSizeEffect::ShrinkEffect) => true, - _ => false, -}; -(is_shrink && match method_arg_nodes(expr.clone()).first().cloned() { - Some(arg_node) => match (*arg_value(&arg_node).expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitInt { value: n, .. } = value.as_ref() else { unreachable!() }; (n.clone() > 0) }, - _ => false, -}, - None => false, -}) -}, - _ => false, -} + ExprData::ExprMethodCall { + method_semantics: ms, + .. + } => { + let is_shrink = match method_size_effect(ms.clone()) { + Some(CollectionSizeEffect::ShrinkEffect) => true, + _ => false, + }; + (is_shrink + && match method_arg_nodes(expr.clone()).first().cloned() { + Some(arg_node) => match (*arg_value(&arg_node).expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { + let LiteralValue::LitInt { value: n, .. } = value.as_ref() else { + unreachable!() + }; + (n.clone() > 0) + } + _ => false, + }, + None => false, + }) + } + _ => false, + } } -pub fn list_passthrough_inner(expr: Rc, si: Rc>>) -> Option> { +pub fn list_passthrough_inner( + expr: Rc, + si: Rc>>, +) -> Option> { parser_passthrough_state_expr(&expr, &si) } @@ -1384,1370 +2795,2789 @@ pub fn is_list_passthrough_call(expr: Rc, si: Rc, si: Rc>>) -> Option> { +pub fn list_passthrough_inner_arg( + expr: Rc, + si: Rc>>, +) -> Option> { list_passthrough_inner(expr, si) } -pub fn is_tokens_consuming_call(expr: &Rc, param_name: String, vars: Rc>, si: &Rc>>) -> bool { +pub fn is_tokens_consuming_call( + expr: &Rc, + param_name: String, + vars: Rc>, + si: &Rc>>, +) -> bool { match (*expr.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => match consuming_tokens_arg(expr.clone(), si.clone()) { - Some(tokens_arg) => is_tokens_input_expr(tokens_arg.clone(), param_name, vars, si.clone()), - None => false, -}, - _ => false, -} + ExprData::ExprCall { .. } => match consuming_tokens_arg(expr.clone(), si.clone()) { + Some(tokens_arg) => { + is_tokens_input_expr(tokens_arg.clone(), param_name, vars, si.clone()) + } + None => false, + }, + _ => false, + } } -pub fn consuming_tokens_arg(expr: Rc, si: Rc>>) -> Option> { - expr.children.clone().iter().cloned().fold(None, |acc: _, child: Rc| match acc.clone() { - Some(_) => acc.clone(), - None => match arg_name_at(child.clone(), si.clone()) { - Some(name) => if (name.clone().as_str() == "tokens".to_string().as_str()) { - Some(arg_value(&child)) - } else { - None - }, - None => None, -}, -}) +pub fn consuming_tokens_arg( + expr: Rc, + si: Rc>>, +) -> Option> { + expr.children + .clone() + .iter() + .cloned() + .fold(None, |acc: _, child: Rc| match acc.clone() { + Some(_) => acc.clone(), + None => match arg_name_at(child.clone(), si.clone()) { + Some(name) => { + if (name.clone().as_str() == "tokens".to_string().as_str()) { + Some(arg_value(&child)) + } else { + None + } + } + None => None, + }, + }) } -pub fn is_tokens_input_expr(mut expr: Rc, mut param_name: String, mut vars: Rc>, mut si: Rc>>) -> bool { +pub fn is_tokens_input_expr( + mut expr: Rc, + mut param_name: String, + mut vars: Rc>, + mut si: Rc>>, +) -> bool { loop { match (*expr.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { let vname = expr_var_name_at(expr.clone(), si.clone()); -break ((vname.clone().as_str() == param_name.clone().as_str()) || set_has(vars, vname.clone())); }, - ExprData::ExprFieldAccess { .. } => { let field = field_access_field_at(expr.clone(), si.clone()); -if (field.as_str() == param_name.clone().as_str()) { - break true; -} else { - let base = field_access_base(expr.clone()); -match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { let bname = expr_var_name_at(base.clone(), si.clone()); -break ((bname.clone().as_str() == param_name.clone().as_str()) || set_has(vars, bname.clone())); }, - _ => { break false; }, -} -} }, - ExprData::ExprMethodCall { method_semantics: ms, .. } => { match method_size_effect(ms.clone()) { - Some(CollectionSizeEffect::ShrinkEffect) => { { - let __tco_0 = method_receiver(expr); -expr = __tco_0; -continue; -} }, - _ => { break false; }, -} }, - ExprData::ExprCall { .. } => { if is_list_passthrough_call(expr.clone(), si.clone()) { - match list_passthrough_inner_arg(expr.clone(), si.clone()) { - Some(inner) => { { - let __tco_0 = inner.clone(); -expr = __tco_0; -continue; -} }, - None => { break false; }, -} -} else { - match consuming_tokens_arg(expr.clone(), si.clone()) { - Some(tokens_arg) => { { - let __tco_0 = tokens_arg.clone(); -expr = __tco_0; -continue; -} }, - None => { break false; }, -} -} }, - _ => { break false; }, -} -} -} - -pub fn is_descent_arg(expr: &Rc, param_name: &String, descent_vars: Rc>, check_child: bool, check_list: bool, si: &Rc>>) -> bool { - match (*expr.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let vname = expr_var_name_at(expr.clone(), si.clone()); -set_has(descent_vars, vname) -}, - _ => ((check_child && is_child_descent_expr(&expr, ¶m_name, &descent_vars, &si)) || (check_list && is_list_shrink_expr(&expr, param_name.clone(), si.clone()))), + ExprData::ExprVar { .. } => { + let vname = expr_var_name_at(expr.clone(), si.clone()); + break ((vname.clone().as_str() == param_name.clone().as_str()) + || set_has(vars, vname.clone())); + } + ExprData::ExprFieldAccess { .. } => { + let field = field_access_field_at(expr.clone(), si.clone()); + if (field.as_str() == param_name.clone().as_str()) { + break true; + } else { + let base = field_access_base(expr.clone()); + match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let bname = expr_var_name_at(base.clone(), si.clone()); + break ((bname.clone().as_str() == param_name.clone().as_str()) + || set_has(vars, bname.clone())); + } + _ => { + break false; + } + } + } + } + ExprData::ExprMethodCall { + method_semantics: ms, + .. + } => match method_size_effect(ms.clone()) { + Some(CollectionSizeEffect::ShrinkEffect) => { + let __tco_0 = method_receiver(expr); + expr = __tco_0; + continue; + } + _ => { + break false; + } + }, + ExprData::ExprCall { .. } => { + if is_list_passthrough_call(expr.clone(), si.clone()) { + match list_passthrough_inner_arg(expr.clone(), si.clone()) { + Some(inner) => { + let __tco_0 = inner.clone(); + expr = __tco_0; + continue; + } + None => { + break false; + } + } + } else { + match consuming_tokens_arg(expr.clone(), si.clone()) { + Some(tokens_arg) => { + let __tco_0 = tokens_arg.clone(); + expr = __tco_0; + continue; + } + None => { + break false; + } + } + } + } + _ => { + break false; + } + } + } } + +pub fn is_descent_arg( + expr: &Rc, + param_name: &String, + descent_vars: Rc>, + check_child: bool, + check_list: bool, + si: &Rc>>, +) -> bool { + match (*expr.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let vname = expr_var_name_at(expr.clone(), si.clone()); + set_has(descent_vars, vname) + } + _ => { + ((check_child && is_child_descent_expr(&expr, ¶m_name, &descent_vars, &si)) + || (check_list && is_list_shrink_expr(&expr, param_name.clone(), si.clone()))) + } + } } -pub fn expr_contains_descent(expr: &Rc, param_name: &String, vars: &Rc>, check_child: bool, check_list: bool, si: &Rc>>) -> bool { +pub fn expr_contains_descent( + expr: &Rc, + param_name: &String, + vars: &Rc>, + check_child: bool, + check_list: bool, + si: &Rc>>, +) -> bool { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - if ((check_child.clone() && is_child_descent_expr(&expr, ¶m_name, &vars, &si)) || (check_list.clone() && is_list_shrink_expr(&expr, param_name.clone(), si.clone()))) { + if ((check_child.clone() && is_child_descent_expr(&expr, ¶m_name, &vars, &si)) + || (check_list.clone() && is_list_shrink_expr(&expr, param_name.clone(), si.clone()))) + { true } else { match (*expr.expr_data.clone()).clone() { - ExprData::ExprIf => (expr_contains_descent(&if_then_branch(expr.clone()), ¶m_name, &vars, check_child.clone(), check_list.clone(), &si) && match if_else_branch(expr.clone()) { - Some(eb) => expr_contains_descent(&eb, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si), - None => false, -}), - ExprData::ExprBlock => match expr.children.clone().last().cloned() { - Some(last_stmt) => expr_contains_descent(&last_stmt, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si), - None => false, -}, - ExprData::ExprVar { .. } => set_has(vars.clone(), expr_var_name_at(expr.clone(), si.clone())), - ExprData::ExprFieldAccess { .. } => { - let field = field_access_field_at(expr.clone(), si.clone()); -let base = field_access_base(expr.clone()); -(is_sub_value_field(field) && match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let bname = expr_var_name_at(base.clone(), si.clone()); -((bname.clone().as_str() == param_name.clone().as_str()) || set_has(vars.clone(), bname.clone())) -}, - _ => false, -}) -}, - ExprData::ExprMethodCall { method_semantics: ms, .. } => { - let receiver = method_receiver(expr.clone()); -match method_size_effect(ms.clone()) { - Some(CollectionSizeEffect::ShrinkEffect) => expr_contains_descent(&receiver, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si), - Some(CollectionSizeEffect::ProjectionEffect) => expr_contains_descent(&receiver, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si), - Some(CollectionSizeEffect::IdentityEffect) => expr_contains_descent(&receiver, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si), - None => false, -} -}, - _ => false, -} + ExprData::ExprIf => { + (expr_contains_descent( + &if_then_branch(expr.clone()), + ¶m_name, + &vars, + check_child.clone(), + check_list.clone(), + &si, + ) && match if_else_branch(expr.clone()) { + Some(eb) => expr_contains_descent( + &eb, + ¶m_name, + &vars, + check_child.clone(), + check_list.clone(), + &si, + ), + None => false, + }) + } + ExprData::ExprBlock => match expr.children.clone().last().cloned() { + Some(last_stmt) => expr_contains_descent( + &last_stmt, + ¶m_name, + &vars, + check_child.clone(), + check_list.clone(), + &si, + ), + None => false, + }, + ExprData::ExprVar { .. } => { + set_has(vars.clone(), expr_var_name_at(expr.clone(), si.clone())) + } + ExprData::ExprFieldAccess { .. } => { + let field = field_access_field_at(expr.clone(), si.clone()); + let base = field_access_base(expr.clone()); + (is_sub_value_field(field) + && match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let bname = expr_var_name_at(base.clone(), si.clone()); + ((bname.clone().as_str() == param_name.clone().as_str()) + || set_has(vars.clone(), bname.clone())) + } + _ => false, + }) + } + ExprData::ExprMethodCall { + method_semantics: ms, + .. + } => { + let receiver = method_receiver(expr.clone()); + match method_size_effect(ms.clone()) { + Some(CollectionSizeEffect::ShrinkEffect) => expr_contains_descent( + &receiver, + ¶m_name, + &vars, + check_child.clone(), + check_list.clone(), + &si, + ), + Some(CollectionSizeEffect::ProjectionEffect) => expr_contains_descent( + &receiver, + ¶m_name, + &vars, + check_child.clone(), + check_list.clone(), + &si, + ), + Some(CollectionSizeEffect::IdentityEffect) => expr_contains_descent( + &receiver, + ¶m_name, + &vars, + check_child.clone(), + check_list.clone(), + &si, + ), + None => false, + } + } + _ => false, + } } }) } -pub fn collect_field_binding_names(fb: Rc, vars: Rc>) -> Rc> { - stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - match (*field_binding_pattern(fb)).clone() { - MatchPattern::Bind { name: binding_name, .. } => v2_rt::rc_map_insert(vars, binding_name.clone(), true), - MatchPattern::VariantPattern { field_bindings: nested, .. } => nested.clone().iter().cloned().fold(vars, |inner: Rc>, nested_fb: Rc| collect_field_binding_names(nested_fb.clone(), inner)), - _ => vars, +pub fn collect_field_binding_names( + fb: Rc, + vars: Rc>, +) -> Rc> { + stacker::maybe_grow( + 512 * 1024, + 2 * 1024 * 1024, + || match (*field_binding_pattern(fb)).clone() { + MatchPattern::Bind { + name: binding_name, .. + } => v2_rt::rc_map_insert(vars, binding_name.clone(), true), + MatchPattern::VariantPattern { + field_bindings: nested, + .. + } => nested.clone().iter().cloned().fold( + vars, + |inner: Rc>, nested_fb: Rc| { + collect_field_binding_names(nested_fb.clone(), inner) + }, + ), + _ => vars, + }, + ) } - }) + +pub fn is_if_option_descent( + val: &Rc, + param_name: String, + vars: Rc>, + check_child: bool, + check_list: bool, + si: &Rc>>, +) -> bool { + match (*val.expr_data.clone()).clone() { + ExprData::ExprIf => { + let then_branch = if_then_branch(val.clone()); + let then_has_descent = expr_contains_descent( + &then_branch, + ¶m_name, + &vars, + check_child, + check_list, + &si, + ); + let else_is_none = match if_else_branch(val.clone()) { + Some(eb) => match (*eb.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + (expr_var_name_at(eb.clone(), si.clone()).as_str() + == "none".to_string().as_str()) + } + ExprData::ExprLiteral { value: v, .. } => match (*v.clone()).clone() { + LiteralValue::LitNull => true, + _ => false, + }, + _ => false, + }, + None => true, + }; + (then_has_descent && else_is_none) + } + _ => false, + } } -pub fn is_if_option_descent(val: &Rc, param_name: String, vars: Rc>, check_child: bool, check_list: bool, si: &Rc>>) -> bool { +pub fn is_match_option_descent( + val: &Rc, + param_name: &String, + vars: Rc>, + check_child: bool, + check_list: bool, + si: &Rc>>, +) -> bool { match (*val.expr_data.clone()).clone() { - ExprData::ExprIf => { - let then_branch = if_then_branch(val.clone()); -let then_has_descent = expr_contains_descent(&then_branch, ¶m_name, &vars, check_child, check_list, &si); -let else_is_none = match if_else_branch(val.clone()) { - Some(eb) => match (*eb.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => (expr_var_name_at(eb.clone(), si.clone()).as_str() == "none".to_string().as_str()), - ExprData::ExprLiteral { value: v, .. } => match (*v.clone()).clone() { - LiteralValue::LitNull => true, - _ => false, -}, - _ => false, -}, - None => true, -}; -(then_has_descent && else_is_none) -}, - _ => false, -} -} - -pub fn is_match_option_descent(val: &Rc, param_name: &String, vars: Rc>, check_child: bool, check_list: bool, si: &Rc>>) -> bool { - match (*val.expr_data.clone()).clone() { - ExprData::ExprMatch => { - let scrut = match_scrutinee(val.clone()); -let scrut_has_descent = expr_contains_descent(&scrut, ¶m_name, &vars, check_child, check_list, &si); -if scrut_has_descent { - { - let has_extraction = { let mut __found = false; for arm_node in match_arm_nodes(val.clone()).iter().cloned() { if match (*arm_pattern(arm_node.clone())).clone() { - MatchPattern::VariantPattern { field_bindings: bindings, .. } => { - let binding_names = bindings.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, fb: Rc| collect_field_binding_names(fb.clone(), acc)); -let arm_b = arm_body(&arm_node); -match (*arm_b.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => set_has(binding_names.clone(), expr_var_name_at(arm_b.clone(), si.clone())), - _ => false, -} -}, - _ => false, -} { __found = true; break; } } __found }; -let all_safe = { let mut __all = true; for arm_node in match_arm_nodes(val.clone()).iter().cloned() { if !({ - let arm_b = arm_body(&arm_node); -match (*arm_b.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => (expr_var_name_at(arm_b.clone(), si.clone()).as_str() != param_name.clone().as_str()), - _ => true, -} -}) { __all = false; break; } } __all }; -(has_extraction && all_safe) -} - } else { - false + ExprData::ExprMatch => { + let scrut = match_scrutinee(val.clone()); + let scrut_has_descent = + expr_contains_descent(&scrut, ¶m_name, &vars, check_child, check_list, &si); + if scrut_has_descent { + { + let has_extraction = { + let mut __found = false; + for arm_node in match_arm_nodes(val.clone()).iter().cloned() { + if match (*arm_pattern(arm_node.clone())).clone() { + MatchPattern::VariantPattern { + field_bindings: bindings, + .. + } => { + let binding_names = bindings.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, fb: Rc| { + collect_field_binding_names(fb.clone(), acc) + }, + ); + let arm_b = arm_body(&arm_node); + match (*arm_b.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => set_has( + binding_names.clone(), + expr_var_name_at(arm_b.clone(), si.clone()), + ), + _ => false, + } + } + _ => false, + } { + __found = true; + break; + } + } + __found + }; + let all_safe = { + let mut __all = true; + for arm_node in match_arm_nodes(val.clone()).iter().cloned() { + if !({ + let arm_b = arm_body(&arm_node); + match (*arm_b.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + (expr_var_name_at(arm_b.clone(), si.clone()).as_str() + != param_name.clone().as_str()) + } + _ => true, + } + }) { + __all = false; + break; + } + } + __all + }; + (has_extraction && all_safe) + } + } else { + false + } } -}, - _ => false, -} + _ => false, + } } -pub fn collect_descent_vars(body: &Rc, param_name: &String, vars: &Rc>, check_child: bool, check_list: bool, si: &Rc>>) -> Rc> { +pub fn collect_descent_vars( + body: &Rc, + param_name: &String, + vars: &Rc>, + check_child: bool, + check_list: bool, + si: &Rc>>, +) -> Rc> { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*body.expr_data.clone()).clone() { - ExprData::ExprLet => { - let val = let_value(body.clone()); -let is_direct_descent = ((check_child.clone() && is_child_descent_expr(&val, ¶m_name, &vars, &si)) || (check_list.clone() && is_list_shrink_expr(&val, param_name.clone(), si.clone()))); -let is_descent_var = match (*val.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => set_has(vars.clone(), expr_var_name_at(val.clone(), si.clone())), - _ => false, -}; -let is_option_descent = is_if_option_descent(&val, param_name.clone(), vars.clone(), check_child.clone(), check_list.clone(), &si); -let is_match_descent = is_match_option_descent(&val, ¶m_name, vars.clone(), check_child.clone(), check_list.clone(), &si); -let is_wrapped_descent = if is_tree_size_preserving_wrapper(&val, si.clone()) { - { - let inner = wrapper_inner_arg(val.clone()); -let inner_is_descent = ((check_child.clone() && is_child_descent_expr(&inner, ¶m_name, &vars, &si)) || (check_list.clone() && is_list_shrink_expr(&inner, param_name.clone(), si.clone()))); -let inner_is_var = match (*inner.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => set_has(vars.clone(), expr_var_name_at(inner.clone(), si.clone())), - _ => false, -}; -(inner_is_descent.clone() || inner_is_var.clone()) -} - } else { - false - }; -let is_extraction_descent = if is_sub_value_extractor(&val, si.clone()) { - { - let inner = extractor_inner_arg(val.clone()); -let inner_is_descent = ((check_child.clone() && is_child_descent_expr(&inner, ¶m_name, &vars, &si)) || (check_list.clone() && is_list_shrink_expr(&inner, param_name.clone(), si.clone()))); -let inner_is_var = match (*inner.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => set_has(vars.clone(), expr_var_name_at(inner.clone(), si.clone())), - _ => false, -}; -let inner_is_param = match (*inner.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => (expr_var_name_at(inner.clone(), si.clone()).as_str() == param_name.clone().as_str()), - _ => false, -}; -((inner_is_descent.clone() || inner_is_var.clone()) || inner_is_param) -} - } else { - false - }; -let is_children_list = match (*val.expr_data.clone()).clone() { - ExprData::ExprFieldAccess { .. } => { - let base = field_access_base(val.clone()); -let field = field_access_field_at(val.clone(), si.clone()); -(is_children_list_field(field) && match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let bname = expr_var_name_at(base.clone(), si.clone()); -((bname.clone().as_str() == param_name.clone().as_str()) || set_has(vars.clone(), bname.clone())) -}, - _ => false, -}) -}, - _ => false, -}; -let is_passthrough_descent = if is_list_passthrough_call(val.clone(), si.clone()) { - match list_passthrough_inner_arg(val.clone(), si.clone()) { - Some(inner) => (((check_child.clone() && is_child_descent_expr(&inner, ¶m_name, &vars, &si)) || (check_list.clone() && is_list_shrink_expr(&inner, param_name.clone(), si.clone()))) || match (*inner.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => set_has(vars.clone(), expr_var_name_at(inner.clone(), si.clone())), - _ => false, -}), - None => false, -} - } else { - false - }; -let is_consuming_helper = (check_list.clone() && is_tokens_consuming_call(&val, param_name.clone(), vars.clone(), &si)); -let val_is_descent = ((((((((is_direct_descent || is_descent_var) || is_option_descent) || is_match_descent) || is_wrapped_descent) || is_extraction_descent) || is_children_list) || is_passthrough_descent) || is_consuming_helper); -let next_vars = if val_is_descent { - v2_rt::rc_map_insert(vars.clone(), let_binding_name_at(body.clone(), si.clone()), true) - } else { - vars.clone() - }; -match let_body(body.clone()) { - Some(b) => collect_descent_vars(&b, ¶m_name, &next_vars, check_child.clone(), check_list.clone(), &si), - None => next_vars, -} -}, - ExprData::ExprMatch => { - let scrut = match_scrutinee(body.clone()); -let scrut_is_descent = expr_contains_descent(&scrut, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si); -let scrut_is_param = match (*scrut.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let sname = expr_var_name_at(scrut.clone(), si.clone()); -((sname.clone().as_str() == param_name.clone().as_str()) || set_has(vars.clone(), sname.clone())) -}, - _ => false, -}; -let with_patterns = if (scrut_is_descent.clone() || scrut_is_param) { - match_arm_nodes(body.clone()).iter().cloned().fold(vars.clone(), |acc: Rc>, arm_node: Rc| match (*arm_pattern(arm_node.clone())).clone() { - MatchPattern::VariantPattern { field_bindings: bindings, .. } => bindings.clone().iter().cloned().fold(acc.clone(), |inner: Rc>, fb: Rc| collect_field_binding_names(fb.clone(), inner)), - MatchPattern::Bind { name: binding_name, .. } => if scrut_is_descent.clone() { - v2_rt::rc_map_insert(acc.clone(), binding_name.clone(), true) + ExprData::ExprLet => { + let val = let_value(body.clone()); + let is_direct_descent = ((check_child.clone() + && is_child_descent_expr(&val, ¶m_name, &vars, &si)) + || (check_list.clone() + && is_list_shrink_expr(&val, param_name.clone(), si.clone()))); + let is_descent_var = match (*val.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + set_has(vars.clone(), expr_var_name_at(val.clone(), si.clone())) + } + _ => false, + }; + let is_option_descent = is_if_option_descent( + &val, + param_name.clone(), + vars.clone(), + check_child.clone(), + check_list.clone(), + &si, + ); + let is_match_descent = is_match_option_descent( + &val, + ¶m_name, + vars.clone(), + check_child.clone(), + check_list.clone(), + &si, + ); + let is_wrapped_descent = if is_tree_size_preserving_wrapper(&val, si.clone()) { + { + let inner = wrapper_inner_arg(val.clone()); + let inner_is_descent = ((check_child.clone() + && is_child_descent_expr(&inner, ¶m_name, &vars, &si)) + || (check_list.clone() + && is_list_shrink_expr(&inner, param_name.clone(), si.clone()))); + let inner_is_var = match (*inner.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + set_has(vars.clone(), expr_var_name_at(inner.clone(), si.clone())) + } + _ => false, + }; + (inner_is_descent.clone() || inner_is_var.clone()) + } } else { - acc.clone() + false + }; + let is_extraction_descent = if is_sub_value_extractor(&val, si.clone()) { + { + let inner = extractor_inner_arg(val.clone()); + let inner_is_descent = ((check_child.clone() + && is_child_descent_expr(&inner, ¶m_name, &vars, &si)) + || (check_list.clone() + && is_list_shrink_expr(&inner, param_name.clone(), si.clone()))); + let inner_is_var = match (*inner.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + set_has(vars.clone(), expr_var_name_at(inner.clone(), si.clone())) + } + _ => false, + }; + let inner_is_param = match (*inner.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + (expr_var_name_at(inner.clone(), si.clone()).as_str() + == param_name.clone().as_str()) + } + _ => false, + }; + ((inner_is_descent.clone() || inner_is_var.clone()) || inner_is_param) + } + } else { + false + }; + let is_children_list = match (*val.expr_data.clone()).clone() { + ExprData::ExprFieldAccess { .. } => { + let base = field_access_base(val.clone()); + let field = field_access_field_at(val.clone(), si.clone()); + (is_children_list_field(field) + && match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let bname = expr_var_name_at(base.clone(), si.clone()); + ((bname.clone().as_str() == param_name.clone().as_str()) + || set_has(vars.clone(), bname.clone())) + } + _ => false, + }) + } + _ => false, + }; + let is_passthrough_descent = if is_list_passthrough_call(val.clone(), si.clone()) { + match list_passthrough_inner_arg(val.clone(), si.clone()) { + Some(inner) => { + (((check_child.clone() + && is_child_descent_expr(&inner, ¶m_name, &vars, &si)) + || (check_list.clone() + && is_list_shrink_expr( + &inner, + param_name.clone(), + si.clone(), + ))) + || match (*inner.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => set_has( + vars.clone(), + expr_var_name_at(inner.clone(), si.clone()), + ), + _ => false, + }) + } + None => false, + } + } else { + false + }; + let is_consuming_helper = (check_list.clone() + && is_tokens_consuming_call(&val, param_name.clone(), vars.clone(), &si)); + let val_is_descent = ((((((((is_direct_descent || is_descent_var) + || is_option_descent) + || is_match_descent) + || is_wrapped_descent) + || is_extraction_descent) + || is_children_list) + || is_passthrough_descent) + || is_consuming_helper); + let next_vars = if val_is_descent { + v2_rt::rc_map_insert( + vars.clone(), + let_binding_name_at(body.clone(), si.clone()), + true, + ) + } else { + vars.clone() + }; + match let_body(body.clone()) { + Some(b) => collect_descent_vars( + &b, + ¶m_name, + &next_vars, + check_child.clone(), + check_list.clone(), + &si, + ), + None => next_vars, + } + } + ExprData::ExprMatch => { + let scrut = match_scrutinee(body.clone()); + let scrut_is_descent = expr_contains_descent( + &scrut, + ¶m_name, + &vars, + check_child.clone(), + check_list.clone(), + &si, + ); + let scrut_is_param = match (*scrut.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let sname = expr_var_name_at(scrut.clone(), si.clone()); + ((sname.clone().as_str() == param_name.clone().as_str()) + || set_has(vars.clone(), sname.clone())) + } + _ => false, + }; + let with_patterns = if (scrut_is_descent.clone() || scrut_is_param) { + match_arm_nodes(body.clone()).iter().cloned().fold( + vars.clone(), + |acc: Rc>, arm_node: Rc| match (*arm_pattern( + arm_node.clone(), + )) + .clone() + { + MatchPattern::VariantPattern { + field_bindings: bindings, + .. + } => bindings.clone().iter().cloned().fold( + acc.clone(), + |inner: Rc>, fb: Rc| { + collect_field_binding_names(fb.clone(), inner) + }, + ), + MatchPattern::Bind { + name: binding_name, .. + } => { + if scrut_is_descent.clone() { + v2_rt::rc_map_insert(acc.clone(), binding_name.clone(), true) + } else { + acc.clone() + } + } + _ => acc.clone(), + }, + ) + } else { + vars.clone() + }; + match_arm_nodes(body.clone()).iter().cloned().fold( + with_patterns.clone(), + |acc: Rc>, arm_node: Rc| { + let arm_result = collect_descent_vars( + &arm_body(&arm_node), + ¶m_name, + &with_patterns, + check_child.clone(), + check_list.clone(), + &si, + ); + v2_rt::rc_map_merge(acc, arm_result.clone()) + }, + ) + } + ExprData::ExprIf => { + let then_vars = collect_descent_vars( + &if_then_branch(body.clone()), + ¶m_name, + &vars, + check_child.clone(), + check_list.clone(), + &si, + ); + let else_vars = match if_else_branch(body.clone()) { + Some(eb) => collect_descent_vars( + &eb, + ¶m_name, + &vars, + check_child.clone(), + check_list.clone(), + &si, + ), + None => vars.clone(), + }; + v2_rt::rc_map_merge(then_vars, else_vars) + } + ExprData::ExprBlock => body.children.clone().iter().cloned().fold( + vars.clone(), + |acc: Rc>, stmt: Rc| { + collect_descent_vars( + &stmt, + ¶m_name, + &acc, + check_child.clone(), + check_list.clone(), + &si, + ) }, - _ => acc.clone(), -}) - } else { - vars.clone() - }; -match_arm_nodes(body.clone()).iter().cloned().fold(with_patterns.clone(), |acc: Rc>, arm_node: Rc| { - let arm_result = collect_descent_vars(&arm_body(&arm_node), ¶m_name, &with_patterns, check_child.clone(), check_list.clone(), &si); -v2_rt::rc_map_merge(acc, arm_result.clone()) -}) -}, - ExprData::ExprIf => { - let then_vars = collect_descent_vars(&if_then_branch(body.clone()), ¶m_name, &vars, check_child.clone(), check_list.clone(), &si); -let else_vars = match if_else_branch(body.clone()) { - Some(eb) => collect_descent_vars(&eb, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si), - None => vars.clone(), -}; -v2_rt::rc_map_merge(then_vars, else_vars) -}, - ExprData::ExprBlock => body.children.clone().iter().cloned().fold(vars.clone(), |acc: Rc>, stmt: Rc| collect_descent_vars(&stmt, ¶m_name, &acc, check_child.clone(), check_list.clone(), &si)), - ExprData::ExprReturn => match body.children.clone().first().cloned() { - Some(inner) => collect_descent_vars(&inner, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si), - None => vars.clone(), -}, - _ => vars.clone(), -} + ), + ExprData::ExprReturn => match body.children.clone().first().cloned() { + Some(inner) => collect_descent_vars( + &inner, + ¶m_name, + &vars, + check_child.clone(), + check_list.clone(), + &si, + ), + None => vars.clone(), + }, + _ => vars.clone(), + } }) } -pub fn all_self_calls_descend(body: Rc, func_name: String, param_name: String, check_child: bool, check_list: bool, si: Rc>>) -> bool { - all_self_calls_descend_inc(&body, &func_name, ¶m_name, &v2_rt::rc_empty_map::(), check_child, check_list, &si) -} - -pub fn all_self_calls_descend_inc(body: &Rc, func_name: &String, param_name: &String, vars: &Rc>, check_child: bool, check_list: bool, si: &Rc>>) -> bool { +pub fn all_self_calls_descend( + body: Rc, + func_name: String, + param_name: String, + check_child: bool, + check_list: bool, + si: Rc>>, +) -> bool { + all_self_calls_descend_inc( + &body, + &func_name, + ¶m_name, + &v2_rt::rc_empty_map::(), + check_child, + check_list, + &si, + ) +} + +pub fn all_self_calls_descend_inc( + body: &Rc, + func_name: &String, + param_name: &String, + vars: &Rc>, + check_child: bool, + check_list: bool, + si: &Rc>>, +) -> bool { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*body.expr_data.clone()).clone() { - ExprData::ExprLambda => true, - ExprData::ExprLet => { - let val = let_value(body.clone()); -let val_ok = all_self_calls_descend_inc(&val, &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si); -let is_direct = ((check_child.clone() && is_child_descent_expr(&val, ¶m_name, &vars, &si)) || (check_list.clone() && is_list_shrink_expr(&val, param_name.clone(), si.clone()))); -let is_var = match (*val.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => set_has(vars.clone(), expr_var_name_at(val.clone(), si.clone())), - _ => false, -}; -let is_option = is_if_option_descent(&val, param_name.clone(), vars.clone(), check_child.clone(), check_list.clone(), &si); -let is_children_list = match (*val.expr_data.clone()).clone() { - ExprData::ExprFieldAccess { .. } => { - let base = field_access_base(val.clone()); -let field = field_access_field_at(val.clone(), si.clone()); -(is_children_list_field(field) && match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let bname = expr_var_name_at(base.clone(), si.clone()); -((bname.clone().as_str() == param_name.clone().as_str()) || set_has(vars.clone(), bname.clone())) -}, - _ => false, -}) -}, - _ => false, -}; -let next_vars = if (((is_direct || is_var) || is_option) || is_children_list) { - v2_rt::rc_map_insert(vars.clone(), let_binding_name_at(body.clone(), si.clone()), true) - } else { - vars.clone() - }; -let body_ok = match let_body(body.clone()) { - Some(b) => all_self_calls_descend_inc(&b, &func_name, ¶m_name, &next_vars, check_child.clone(), check_list.clone(), &si), - None => true, -}; -(val_ok && body_ok) -}, - ExprData::ExprMatch => { - let scrut = match_scrutinee(body.clone()); -let scrut_ok = all_self_calls_descend_inc(&scrut, &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si); -let scrut_is_descent = expr_contains_descent(&scrut, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si); -let scrut_is_param = match (*scrut.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let sname = expr_var_name_at(scrut.clone(), si.clone()); -((sname.clone().as_str() == param_name.clone().as_str()) || set_has(vars.clone(), sname.clone())) -}, - _ => false, -}; -let arms_ok = { let mut __all = true; for arm_node in match_arm_nodes(body.clone()).iter().cloned() { if !({ - let arm_vars = if (scrut_is_descent.clone() || scrut_is_param.clone()) { - match (*arm_pattern(arm_node.clone())).clone() { - MatchPattern::VariantPattern { field_bindings: bindings, .. } => bindings.clone().iter().cloned().fold(vars.clone(), |inner: Rc>, fb: Rc| collect_field_binding_names(fb.clone(), inner)), - MatchPattern::Bind { name: binding_name, .. } => if scrut_is_descent.clone() { - v2_rt::rc_map_insert(vars.clone(), binding_name.clone(), true) - } else { - vars.clone() - }, - _ => vars.clone(), -} + ExprData::ExprLambda => true, + ExprData::ExprLet => { + let val = let_value(body.clone()); + let val_ok = all_self_calls_descend_inc( + &val, + &func_name, + ¶m_name, + &vars, + check_child.clone(), + check_list.clone(), + &si, + ); + let is_direct = ((check_child.clone() + && is_child_descent_expr(&val, ¶m_name, &vars, &si)) + || (check_list.clone() + && is_list_shrink_expr(&val, param_name.clone(), si.clone()))); + let is_var = match (*val.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + set_has(vars.clone(), expr_var_name_at(val.clone(), si.clone())) + } + _ => false, + }; + let is_option = is_if_option_descent( + &val, + param_name.clone(), + vars.clone(), + check_child.clone(), + check_list.clone(), + &si, + ); + let is_children_list = match (*val.expr_data.clone()).clone() { + ExprData::ExprFieldAccess { .. } => { + let base = field_access_base(val.clone()); + let field = field_access_field_at(val.clone(), si.clone()); + (is_children_list_field(field) + && match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let bname = expr_var_name_at(base.clone(), si.clone()); + ((bname.clone().as_str() == param_name.clone().as_str()) + || set_has(vars.clone(), bname.clone())) + } + _ => false, + }) + } + _ => false, + }; + let next_vars = if (((is_direct || is_var) || is_option) || is_children_list) { + v2_rt::rc_map_insert( + vars.clone(), + let_binding_name_at(body.clone(), si.clone()), + true, + ) } else { vars.clone() }; -all_self_calls_descend_inc(&arm_body(&arm_node), &func_name, ¶m_name, &arm_vars, check_child.clone(), check_list.clone(), &si) -}) { __all = false; break; } } __all }; -(scrut_ok && arms_ok) -}, - ExprData::ExprIf => { - let cond_ok = all_self_calls_descend_inc(&if_condition(body.clone()), &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si); -let then_ok = all_self_calls_descend_inc(&if_then_branch(body.clone()), &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si); -let else_ok = match if_else_branch(body.clone()) { - Some(eb) => all_self_calls_descend_inc(&eb, &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si), - None => true, -}; -((cond_ok && then_ok) && else_ok) -}, - ExprData::ExprBlock => { - let result = body.children.clone().iter().cloned().fold(Rc::new(DescentCheckAcc { - ok: true, - vars: vars.clone(), -}), |acc: Rc, stmt: Rc| if (acc.ok.clone() == false) { - acc.clone() - } else { - { - let stmt_ok = all_self_calls_descend_inc(&stmt, &func_name, ¶m_name, &acc.vars.clone(), check_child.clone(), check_list.clone(), &si); -let next_vars = collect_descent_vars(&stmt, ¶m_name, &acc.vars.clone(), check_child.clone(), check_list.clone(), &si); -Rc::new(DescentCheckAcc { - ok: stmt_ok.clone(), - vars: next_vars.clone(), -}) -} - }); -result.ok.clone() -}, - ExprData::ExprCall { .. } => { - let callee = expr_call_func_at(body.clone(), si.clone()); -let own_ok = if (callee.as_str() == func_name.clone().as_str()) { - { let mut __found = false; for arg_node in body.children.clone().iter().cloned() { if { - let targets_param = (arg_name_at(arg_node.clone(), si.clone()).as_deref() == Some(param_name.clone()).as_deref()); -if (targets_param.clone() == false) { - false - } else { - is_descent_arg(&arg_value(&arg_node), ¶m_name, vars.clone(), check_child.clone(), check_list.clone(), &si) + let body_ok = match let_body(body.clone()) { + Some(b) => all_self_calls_descend_inc( + &b, + &func_name, + ¶m_name, + &next_vars, + check_child.clone(), + check_list.clone(), + &si, + ), + None => true, + }; + (val_ok && body_ok) + } + ExprData::ExprMatch => { + let scrut = match_scrutinee(body.clone()); + let scrut_ok = all_self_calls_descend_inc( + &scrut, + &func_name, + ¶m_name, + &vars, + check_child.clone(), + check_list.clone(), + &si, + ); + let scrut_is_descent = expr_contains_descent( + &scrut, + ¶m_name, + &vars, + check_child.clone(), + check_list.clone(), + &si, + ); + let scrut_is_param = match (*scrut.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let sname = expr_var_name_at(scrut.clone(), si.clone()); + ((sname.clone().as_str() == param_name.clone().as_str()) + || set_has(vars.clone(), sname.clone())) } -} { __found = true; break; } } __found } - } else { - true - }; -(own_ok && { let mut __all = true; for child in body.children.clone().iter().cloned() { if !(all_self_calls_descend_inc(&child, &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si)) { __all = false; break; } } __all }) -}, - ExprData::ExprMethodCall { method_semantics: ms, .. } => { - let receiver = method_receiver(body.clone()); -let is_iter = is_algebra_iteration_method(ms.clone()); -let is_struct = is_structural_children(&receiver, ¶m_name, &vars, &si); -if (is_iter && is_struct) { - { - let recv_ok = all_self_calls_descend_inc(&receiver, &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si); -let args_ok = { let mut __all = true; for arg_node in method_arg_nodes(body.clone()).iter().cloned() { if !({ - let arg_val = arg_value(&arg_node); -match (*arg_val.expr_data.clone()).clone() { - ExprData::ExprLambda => match iteration_element_name(ms.clone(), arg_val.clone(), si.clone()) { - Some(iter_name) => { - let ext_vars = v2_rt::rc_map_insert(vars.clone(), iter_name.clone(), true); -all_self_calls_descend_inc(&lambda_body(arg_val.clone()), &func_name, ¶m_name, &ext_vars, check_child.clone(), check_list.clone(), &si) -}, - None => true, -}, - _ => all_self_calls_descend_inc(&arg_val, &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si), -} -}) { __all = false; break; } } __all }; -(recv_ok && args_ok) -} - } else { - { let mut __all = true; for child in body.children.clone().iter().cloned() { if !(all_self_calls_descend_inc(&child, &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si)) { __all = false; break; } } __all } + _ => false, + }; + let arms_ok = { + let mut __all = true; + for arm_node in match_arm_nodes(body.clone()).iter().cloned() { + if !({ + let arm_vars = if (scrut_is_descent.clone() || scrut_is_param.clone()) { + match (*arm_pattern(arm_node.clone())).clone() { + MatchPattern::VariantPattern { + field_bindings: bindings, + .. + } => bindings.clone().iter().cloned().fold( + vars.clone(), + |inner: Rc>, fb: Rc| { + collect_field_binding_names(fb.clone(), inner) + }, + ), + MatchPattern::Bind { + name: binding_name, .. + } => { + if scrut_is_descent.clone() { + v2_rt::rc_map_insert( + vars.clone(), + binding_name.clone(), + true, + ) + } else { + vars.clone() + } + } + _ => vars.clone(), + } + } else { + vars.clone() + }; + all_self_calls_descend_inc( + &arm_body(&arm_node), + &func_name, + ¶m_name, + &arm_vars, + check_child.clone(), + check_list.clone(), + &si, + ) + }) { + __all = false; + break; + } + } + __all + }; + (scrut_ok && arms_ok) } -}, - _ => { let mut __all = true; for child in body.children.clone().iter().cloned() { if !(all_self_calls_descend_inc(&child, &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si)) { __all = false; break; } } __all }, -} + ExprData::ExprIf => { + let cond_ok = all_self_calls_descend_inc( + &if_condition(body.clone()), + &func_name, + ¶m_name, + &vars, + check_child.clone(), + check_list.clone(), + &si, + ); + let then_ok = all_self_calls_descend_inc( + &if_then_branch(body.clone()), + &func_name, + ¶m_name, + &vars, + check_child.clone(), + check_list.clone(), + &si, + ); + let else_ok = match if_else_branch(body.clone()) { + Some(eb) => all_self_calls_descend_inc( + &eb, + &func_name, + ¶m_name, + &vars, + check_child.clone(), + check_list.clone(), + &si, + ), + None => true, + }; + ((cond_ok && then_ok) && else_ok) + } + ExprData::ExprBlock => { + let result = body.children.clone().iter().cloned().fold( + Rc::new(DescentCheckAcc { + ok: true, + vars: vars.clone(), + }), + |acc: Rc, stmt: Rc| { + if (acc.ok.clone() == false) { + acc.clone() + } else { + { + let stmt_ok = all_self_calls_descend_inc( + &stmt, + &func_name, + ¶m_name, + &acc.vars.clone(), + check_child.clone(), + check_list.clone(), + &si, + ); + let next_vars = collect_descent_vars( + &stmt, + ¶m_name, + &acc.vars.clone(), + check_child.clone(), + check_list.clone(), + &si, + ); + Rc::new(DescentCheckAcc { + ok: stmt_ok.clone(), + vars: next_vars.clone(), + }) + } + } + }, + ); + result.ok.clone() + } + ExprData::ExprCall { .. } => { + let callee = expr_call_func_at(body.clone(), si.clone()); + let own_ok = if (callee.as_str() == func_name.clone().as_str()) { + { + let mut __found = false; + for arg_node in body.children.clone().iter().cloned() { + if { + let targets_param = (arg_name_at(arg_node.clone(), si.clone()) + .as_deref() + == Some(param_name.clone()).as_deref()); + if (targets_param.clone() == false) { + false + } else { + is_descent_arg( + &arg_value(&arg_node), + ¶m_name, + vars.clone(), + check_child.clone(), + check_list.clone(), + &si, + ) + } + } { + __found = true; + break; + } + } + __found + } + } else { + true + }; + (own_ok && { + let mut __all = true; + for child in body.children.clone().iter().cloned() { + if !(all_self_calls_descend_inc( + &child, + &func_name, + ¶m_name, + &vars, + check_child.clone(), + check_list.clone(), + &si, + )) { + __all = false; + break; + } + } + __all + }) + } + ExprData::ExprMethodCall { + method_semantics: ms, + .. + } => { + let receiver = method_receiver(body.clone()); + let is_iter = is_algebra_iteration_method(ms.clone()); + let is_struct = is_structural_children(&receiver, ¶m_name, &vars, &si); + if (is_iter && is_struct) { + { + let recv_ok = all_self_calls_descend_inc( + &receiver, + &func_name, + ¶m_name, + &vars, + check_child.clone(), + check_list.clone(), + &si, + ); + let args_ok = { + let mut __all = true; + for arg_node in method_arg_nodes(body.clone()).iter().cloned() { + if !({ + let arg_val = arg_value(&arg_node); + match (*arg_val.expr_data.clone()).clone() { + ExprData::ExprLambda => match iteration_element_name( + ms.clone(), + arg_val.clone(), + si.clone(), + ) { + Some(iter_name) => { + let ext_vars = v2_rt::rc_map_insert( + vars.clone(), + iter_name.clone(), + true, + ); + all_self_calls_descend_inc( + &lambda_body(arg_val.clone()), + &func_name, + ¶m_name, + &ext_vars, + check_child.clone(), + check_list.clone(), + &si, + ) + } + None => true, + }, + _ => all_self_calls_descend_inc( + &arg_val, + &func_name, + ¶m_name, + &vars, + check_child.clone(), + check_list.clone(), + &si, + ), + } + }) { + __all = false; + break; + } + } + __all + }; + (recv_ok && args_ok) + } + } else { + { + let mut __all = true; + for child in body.children.clone().iter().cloned() { + if !(all_self_calls_descend_inc( + &child, + &func_name, + ¶m_name, + &vars, + check_child.clone(), + check_list.clone(), + &si, + )) { + __all = false; + break; + } + } + __all + } + } + } + _ => { + let mut __all = true; + for child in body.children.clone().iter().cloned() { + if !(all_self_calls_descend_inc( + &child, + &func_name, + ¶m_name, + &vars, + check_child.clone(), + check_list.clone(), + &si, + )) { + __all = false; + break; + } + } + __all + } + } }) } pub fn unwrap_to_match(mut body: Rc) -> Option> { loop { match (*body.expr_data.clone()).clone() { - ExprData::ExprMatch => { break Some(body.clone()); }, - ExprData::ExprLet => { match let_body(body.clone()) { - Some(b) => { { - let __tco_0 = b.clone(); -body = __tco_0; -continue; -} }, - None => { break None; }, -} }, - ExprData::ExprBlock => { match body.children.clone().last().cloned() { - Some(last_stmt) => { { - let __tco_0 = last_stmt.clone(); -body = __tco_0; -continue; -} }, - None => { break None; }, -} }, - _ => { break None; }, -} -} -} - -pub fn matches_on_sub_value_field(body: Rc, param_name: String, si: &Rc>>) -> bool { - match unwrap_to_match(body) { - Some(m) => { - let scrut = match_scrutinee(m.clone()); -match (*scrut.expr_data.clone()).clone() { - ExprData::ExprFieldAccess { .. } => { - let base = field_access_base(scrut.clone()); -let field = field_access_field_at(scrut.clone(), si.clone()); -(is_sub_value_field(field) && match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => (expr_var_name_at(base.clone(), si.clone()).as_str() == param_name.as_str()), - _ => false, -}) -}, - _ => false, -} -}, - None => false, + ExprData::ExprMatch => { + break Some(body.clone()); + } + ExprData::ExprLet => match let_body(body.clone()) { + Some(b) => { + let __tco_0 = b.clone(); + body = __tco_0; + continue; + } + None => { + break None; + } + }, + ExprData::ExprBlock => match body.children.clone().last().cloned() { + Some(last_stmt) => { + let __tco_0 = last_stmt.clone(); + body = __tco_0; + continue; + } + None => { + break None; + } + }, + _ => { + break None; + } + } + } } + +pub fn matches_on_sub_value_field( + body: Rc, + param_name: String, + si: &Rc>>, +) -> bool { + match unwrap_to_match(body) { + Some(m) => { + let scrut = match_scrutinee(m.clone()); + match (*scrut.expr_data.clone()).clone() { + ExprData::ExprFieldAccess { .. } => { + let base = field_access_base(scrut.clone()); + let field = field_access_field_at(scrut.clone(), si.clone()); + (is_sub_value_field(field) + && match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + (expr_var_name_at(base.clone(), si.clone()).as_str() + == param_name.as_str()) + } + _ => false, + }) + } + _ => false, + } + } + None => false, + } } -pub fn is_container_child_descent(body: Rc, func_name: String, params: Rc>>, si: Rc>>) -> bool { - { let mut __found = false; for p in params.iter().cloned() { if { - let pname = param_node_name_at(p.clone(), si.clone()); -(matches_on_sub_value_field(body.clone(), pname.clone(), &si) && all_self_calls_descend(body.clone(), func_name.clone(), pname.clone(), true, false, si.clone())) -} { __found = true; break; } } __found } +pub fn is_container_child_descent( + body: Rc, + func_name: String, + params: Rc>>, + si: Rc>>, +) -> bool { + { + let mut __found = false; + for p in params.iter().cloned() { + if { + let pname = param_node_name_at(p.clone(), si.clone()); + (matches_on_sub_value_field(body.clone(), pname.clone(), &si) + && all_self_calls_descend( + body.clone(), + func_name.clone(), + pname.clone(), + true, + false, + si.clone(), + )) + } { + __found = true; + break; + } + } + __found + } } -pub fn is_list_shrinkage_descent(body: Rc, func_name: String, params: Rc>>, si: Rc>>) -> bool { - { let mut __found = false; for p in params.iter().cloned() { if { - let pname = param_node_name_at(p.clone(), si.clone()); -all_self_calls_descend(body.clone(), func_name.clone(), pname.clone(), false, true, si.clone()) -} { __found = true; break; } } __found } +pub fn is_list_shrinkage_descent( + body: Rc, + func_name: String, + params: Rc>>, + si: Rc>>, +) -> bool { + { + let mut __found = false; + for p in params.iter().cloned() { + if { + let pname = param_node_name_at(p.clone(), si.clone()); + all_self_calls_descend( + body.clone(), + func_name.clone(), + pname.clone(), + false, + true, + si.clone(), + ) + } { + __found = true; + break; + } + } + __found + } } -pub fn is_arithmetic_descent_expr(expr: &Rc, param_name: String, si: Rc>>) -> bool { +pub fn is_arithmetic_descent_expr( + expr: &Rc, + param_name: String, + si: Rc>>, +) -> bool { match (*expr.expr_data.clone()).clone() { - ExprData::ExprBinOp { op: BinOp::Sub, .. } => { - let left = binop_left(expr.clone()); -let right = binop_right(expr.clone()); -match (*left.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => ((expr_var_name_at(left.clone(), si).as_str() == param_name.as_str()) && match (*right.expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitInt { value: n, .. } = value.as_ref() else { unreachable!() }; (n.clone() > 0) }, - _ => false, -}), - _ => false, -} -}, - _ => false, -} + ExprData::ExprBinOp { op: BinOp::Sub, .. } => { + let left = binop_left(expr.clone()); + let right = binop_right(expr.clone()); + match (*left.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + ((expr_var_name_at(left.clone(), si).as_str() == param_name.as_str()) + && match (*right.expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { + let LiteralValue::LitInt { value: n, .. } = value.as_ref() else { + unreachable!() + }; + (n.clone() > 0) + } + _ => false, + }) + } + _ => false, + } + } + _ => false, + } } -pub fn classify_self_call_evidence(arg_expr: &Rc, param_name: &String, descent_vars: &Rc>, check_child: bool, check_list: bool, si: &Rc>>) -> DescentEvidence { +pub fn classify_self_call_evidence( + arg_expr: &Rc, + param_name: &String, + descent_vars: &Rc>, + check_child: bool, + check_list: bool, + si: &Rc>>, +) -> DescentEvidence { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - if (check_child.clone() && is_child_descent_expr(&arg_expr, ¶m_name, &descent_vars, &si)) { + if (check_child.clone() + && is_child_descent_expr(&arg_expr, ¶m_name, &descent_vars, &si)) + { DescentEvidence::Strict } else { - if (check_list.clone() && is_list_shrink_expr(&arg_expr, param_name.clone(), si.clone())) { + if (check_list.clone() + && is_list_shrink_expr(&arg_expr, param_name.clone(), si.clone())) + { DescentEvidence::Strict } else { - if (((check_child.clone() == false) && (check_list.clone() == false)) && is_arithmetic_descent_expr(&arg_expr, param_name.clone(), si.clone())) { + if (((check_child.clone() == false) && (check_list.clone() == false)) + && is_arithmetic_descent_expr(&arg_expr, param_name.clone(), si.clone())) + { DescentEvidence::Strict } else { match (*arg_expr.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let vname = expr_var_name_at(arg_expr.clone(), si.clone()); -if set_has(descent_vars.clone(), vname.clone()) { - DescentEvidence::Strict - } else { - if (vname.clone().as_str() == param_name.clone().as_str()) { - DescentEvidence::NonIncreasing + ExprData::ExprVar { .. } => { + let vname = expr_var_name_at(arg_expr.clone(), si.clone()); + if set_has(descent_vars.clone(), vname.clone()) { + DescentEvidence::Strict } else { - DescentEvidence::DescentUnknown + if (vname.clone().as_str() == param_name.clone().as_str()) { + DescentEvidence::NonIncreasing + } else { + DescentEvidence::DescentUnknown + } } } -}, - ExprData::ExprCall { .. } => if is_tree_size_preserving_wrapper(&arg_expr, si.clone()) { - classify_self_call_evidence(&wrapper_inner_arg(arg_expr.clone()), ¶m_name, &descent_vars, check_child.clone(), check_list.clone(), &si) - } else { - if is_sub_value_extractor(&arg_expr, si.clone()) { - { - let inner_ev = classify_self_call_evidence(&extractor_inner_arg(arg_expr.clone()), ¶m_name, &descent_vars, check_child.clone(), check_list.clone(), &si); -match inner_ev.clone() { - DescentEvidence::NonIncreasing => DescentEvidence::Strict, - _ => inner_ev.clone(), -} -} - } else { - if is_list_passthrough_call(arg_expr.clone(), si.clone()) { - match list_passthrough_inner_arg(arg_expr.clone(), si.clone()) { - Some(inner) => classify_self_call_evidence(&inner, ¶m_name, &descent_vars, check_child.clone(), check_list.clone(), &si), - None => DescentEvidence::DescentUnknown, -} + ExprData::ExprCall { .. } => { + if is_tree_size_preserving_wrapper(&arg_expr, si.clone()) { + classify_self_call_evidence( + &wrapper_inner_arg(arg_expr.clone()), + ¶m_name, + &descent_vars, + check_child.clone(), + check_list.clone(), + &si, + ) } else { - DescentEvidence::DescentUnknown + if is_sub_value_extractor(&arg_expr, si.clone()) { + { + let inner_ev = classify_self_call_evidence( + &extractor_inner_arg(arg_expr.clone()), + ¶m_name, + &descent_vars, + check_child.clone(), + check_list.clone(), + &si, + ); + match inner_ev.clone() { + DescentEvidence::NonIncreasing => { + DescentEvidence::Strict + } + _ => inner_ev.clone(), + } + } + } else { + if is_list_passthrough_call(arg_expr.clone(), si.clone()) { + match list_passthrough_inner_arg( + arg_expr.clone(), + si.clone(), + ) { + Some(inner) => classify_self_call_evidence( + &inner, + ¶m_name, + &descent_vars, + check_child.clone(), + check_list.clone(), + &si, + ), + None => DescentEvidence::DescentUnknown, + } + } else { + DescentEvidence::DescentUnknown + } + } } } - }, - ExprData::ExprFieldAccess { .. } => { - let base = field_access_base(arg_expr.clone()); -match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let bname = expr_var_name_at(base.clone(), si.clone()); -if (set_has(descent_vars.clone(), bname.clone()) || (bname.clone().as_str() == param_name.clone().as_str())) { - DescentEvidence::Strict - } else { - { - let field = field_access_field_at(arg_expr.clone(), si.clone()); -if (field.as_str() == param_name.clone().as_str()) { - DescentEvidence::NonIncreasing + ExprData::ExprFieldAccess { .. } => { + let base = field_access_base(arg_expr.clone()); + match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let bname = expr_var_name_at(base.clone(), si.clone()); + if (set_has(descent_vars.clone(), bname.clone()) + || (bname.clone().as_str() == param_name.clone().as_str())) + { + DescentEvidence::Strict } else { - DescentEvidence::DescentUnknown + { + let field = + field_access_field_at(arg_expr.clone(), si.clone()); + if (field.as_str() == param_name.clone().as_str()) { + DescentEvidence::NonIncreasing + } else { + DescentEvidence::DescentUnknown + } + } } -} + } + _ => DescentEvidence::DescentUnknown, } -}, - _ => DescentEvidence::DescentUnknown, -} -}, - ExprData::ExprMethodCall { method_semantics: ms, .. } => if is_generalized_shrink(&arg_expr, si.clone()) { - { - let recv = method_receiver(arg_expr.clone()); -let recv_ev = classify_self_call_evidence(&recv, ¶m_name, &descent_vars, check_child.clone(), check_list.clone(), &si); -match recv_ev { - DescentEvidence::Strict => DescentEvidence::Strict, - DescentEvidence::NonIncreasing => DescentEvidence::Strict, - DescentEvidence::DescentUnknown => DescentEvidence::DescentUnknown, -} -} - } else { - DescentEvidence::DescentUnknown - }, - _ => DescentEvidence::DescentUnknown, -} + } + ExprData::ExprMethodCall { + method_semantics: ms, + .. + } => { + if is_generalized_shrink(&arg_expr, si.clone()) { + { + let recv = method_receiver(arg_expr.clone()); + let recv_ev = classify_self_call_evidence( + &recv, + ¶m_name, + &descent_vars, + check_child.clone(), + check_list.clone(), + &si, + ); + match recv_ev { + DescentEvidence::Strict => DescentEvidence::Strict, + DescentEvidence::NonIncreasing => DescentEvidence::Strict, + DescentEvidence::DescentUnknown => { + DescentEvidence::DescentUnknown + } + } + } + } else { + DescentEvidence::DescentUnknown + } + } + _ => DescentEvidence::DescentUnknown, + } } } } }) } -pub fn try_dimension_for_param(body: Rc, func_name: String, param_name: String, check_child: bool, check_list: bool, si: Rc>>) -> Option { - collect_evidence_incremental(&body, &func_name, ¶m_name, &v2_rt::rc_empty_map::(), check_child, check_list, false, &si) -} - -pub fn try_branching_dimension_for_param(body: Rc, func_name: String, param_name: String, check_child: bool, check_list: bool, si: Rc>>) -> Option { - collect_evidence_incremental(&body, &func_name, ¶m_name, &v2_rt::rc_empty_map::(), check_child, check_list, true, &si) -} - -pub fn merge_optional_evidence(a: Option, b: Option) -> Option { +pub fn try_dimension_for_param( + body: Rc, + func_name: String, + param_name: String, + check_child: bool, + check_list: bool, + si: Rc>>, +) -> Option { + collect_evidence_incremental( + &body, + &func_name, + ¶m_name, + &v2_rt::rc_empty_map::(), + check_child, + check_list, + false, + &si, + ) +} + +pub fn try_branching_dimension_for_param( + body: Rc, + func_name: String, + param_name: String, + check_child: bool, + check_list: bool, + si: Rc>>, +) -> Option { + collect_evidence_incremental( + &body, + &func_name, + ¶m_name, + &v2_rt::rc_empty_map::(), + check_child, + check_list, + true, + &si, + ) +} + +pub fn merge_optional_evidence( + a: Option, + b: Option, +) -> Option { optional_evidence_meet(a, b) } -pub fn collect_evidence_incremental(body: &Rc, func_name: &String, param_name: &String, vars: &Rc>, check_child: bool, check_list: bool, branching_only: bool, si: &Rc>>) -> Option { +pub fn collect_evidence_incremental( + body: &Rc, + func_name: &String, + param_name: &String, + vars: &Rc>, + check_child: bool, + check_list: bool, + branching_only: bool, + si: &Rc>>, +) -> Option { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - match (*body.expr_data.clone()).clone() { - ExprData::ExprLambda => None, - ExprData::ExprLet => { - let val = let_value(body.clone()); -let val_ev = collect_evidence_incremental(&val, &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), branching_only.clone(), &si); -let is_direct = ((check_child.clone() && is_child_descent_expr(&val, ¶m_name, &vars, &si)) || (check_list.clone() && is_list_shrink_expr(&val, param_name.clone(), si.clone()))); -let is_var = match (*val.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => set_has(vars.clone(), expr_var_name_at(val.clone(), si.clone())), - _ => false, -}; -let is_option = is_if_option_descent(&val, param_name.clone(), vars.clone(), check_child.clone(), check_list.clone(), &si); -let is_match_descent = is_match_option_descent(&val, ¶m_name, vars.clone(), check_child.clone(), check_list.clone(), &si); -let is_wrapped = if is_tree_size_preserving_wrapper(&val, si.clone()) { - { - let inner = wrapper_inner_arg(val.clone()); -let inner_d = ((check_child.clone() && is_child_descent_expr(&inner, ¶m_name, &vars, &si)) || (check_list.clone() && is_list_shrink_expr(&inner, param_name.clone(), si.clone()))); -let inner_v = match (*inner.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => set_has(vars.clone(), expr_var_name_at(inner.clone(), si.clone())), - _ => false, -}; -(inner_d.clone() || inner_v.clone()) -} - } else { - false - }; -let is_extraction = if is_sub_value_extractor(&val, si.clone()) { - { - let inner = extractor_inner_arg(val.clone()); -let inner_d = ((check_child.clone() && is_child_descent_expr(&inner, ¶m_name, &vars, &si)) || (check_list.clone() && is_list_shrink_expr(&inner, param_name.clone(), si.clone()))); -let inner_v = match (*inner.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => set_has(vars.clone(), expr_var_name_at(inner.clone(), si.clone())), - _ => false, -}; -let inner_p = match (*inner.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => (expr_var_name_at(inner.clone(), si.clone()).as_str() == param_name.clone().as_str()), - _ => false, -}; -((inner_d.clone() || inner_v.clone()) || inner_p) -} - } else { - false - }; -let is_children_list = match (*val.expr_data.clone()).clone() { - ExprData::ExprFieldAccess { .. } => { - let base = field_access_base(val.clone()); -let field = field_access_field_at(val.clone(), si.clone()); -(is_children_list_field(field) && match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let bname = expr_var_name_at(base.clone(), si.clone()); -((bname.clone().as_str() == param_name.clone().as_str()) || set_has(vars.clone(), bname.clone())) -}, - _ => false, -}) -}, - _ => false, -}; -let is_passthrough = if is_list_passthrough_call(val.clone(), si.clone()) { - match list_passthrough_inner_arg(val.clone(), si.clone()) { - Some(inner) => (((check_child.clone() && is_child_descent_expr(&inner, ¶m_name, &vars, &si)) || (check_list.clone() && is_list_shrink_expr(&inner, param_name.clone(), si.clone()))) || match (*inner.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => set_has(vars.clone(), expr_var_name_at(inner.clone(), si.clone())), - _ => false, -}), - None => false, -} - } else { - false - }; -let is_consuming_helper = (check_list.clone() && is_tokens_consuming_call(&val, param_name.clone(), vars.clone(), &si)); -let next_vars = if ((((((((is_direct || is_var) || is_option) || is_match_descent) || is_wrapped) || is_extraction) || is_children_list) || is_passthrough) || is_consuming_helper) { - v2_rt::rc_map_insert(vars.clone(), let_binding_name_at(body.clone(), si.clone()), true) - } else { - vars.clone() - }; -let body_ev = match let_body(body.clone()) { - Some(b) => collect_evidence_incremental(&b, &func_name, ¶m_name, &next_vars, check_child.clone(), check_list.clone(), branching_only.clone(), &si), - None => None, -}; -merge_optional_evidence(val_ev, body_ev) -}, - ExprData::ExprMatch => { - let scrut = match_scrutinee(body.clone()); -let scrut_ev = collect_evidence_incremental(&scrut, &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), branching_only.clone(), &si); -let scrut_is_descent = expr_contains_descent(&scrut, ¶m_name, &vars, check_child.clone(), check_list.clone(), &si); -let scrut_is_param = match (*scrut.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let sname = expr_var_name_at(scrut.clone(), si.clone()); -((sname.clone().as_str() == param_name.clone().as_str()) || set_has(vars.clone(), sname.clone())) -}, - _ => false, -}; -let arms_ev = match_arm_nodes(body.clone()).iter().cloned().fold(None, |acc: _, arm_node: Rc| { - let is_base_case = if branching_only.clone() { - (max_path_self_calls(arm_body(&arm_node), func_name.clone(), si.clone()) == 0) + match (*body.expr_data.clone()).clone() { + ExprData::ExprLambda => None, + ExprData::ExprLet => { + let val = let_value(body.clone()); + let val_ev = collect_evidence_incremental( + &val, + &func_name, + ¶m_name, + &vars, + check_child.clone(), + check_list.clone(), + branching_only.clone(), + &si, + ); + let is_direct = ((check_child.clone() + && is_child_descent_expr(&val, ¶m_name, &vars, &si)) + || (check_list.clone() + && is_list_shrink_expr(&val, param_name.clone(), si.clone()))); + let is_var = match (*val.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + set_has(vars.clone(), expr_var_name_at(val.clone(), si.clone())) + } + _ => false, + }; + let is_option = is_if_option_descent( + &val, + param_name.clone(), + vars.clone(), + check_child.clone(), + check_list.clone(), + &si, + ); + let is_match_descent = is_match_option_descent( + &val, + ¶m_name, + vars.clone(), + check_child.clone(), + check_list.clone(), + &si, + ); + let is_wrapped = if is_tree_size_preserving_wrapper(&val, si.clone()) { + { + let inner = wrapper_inner_arg(val.clone()); + let inner_d = ((check_child.clone() + && is_child_descent_expr(&inner, ¶m_name, &vars, &si)) + || (check_list.clone() + && is_list_shrink_expr(&inner, param_name.clone(), si.clone()))); + let inner_v = match (*inner.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + set_has(vars.clone(), expr_var_name_at(inner.clone(), si.clone())) + } + _ => false, + }; + (inner_d.clone() || inner_v.clone()) + } } else { false }; -if is_base_case.clone() { - acc.clone() - } else { + let is_extraction = if is_sub_value_extractor(&val, si.clone()) { { - let arm_vars = if (scrut_is_descent.clone() || scrut_is_param.clone()) { - match (*arm_pattern(arm_node.clone())).clone() { - MatchPattern::VariantPattern { field_bindings: bindings, .. } => bindings.clone().iter().cloned().fold(vars.clone(), |inner: Rc>, fb: Rc| collect_field_binding_names(fb.clone(), inner)), - MatchPattern::Bind { name: binding_name, .. } => if scrut_is_descent.clone() { - v2_rt::rc_map_insert(vars.clone(), binding_name.clone(), true) - } else { - vars.clone() - }, - _ => vars.clone(), -} - } else { - vars.clone() + let inner = extractor_inner_arg(val.clone()); + let inner_d = ((check_child.clone() + && is_child_descent_expr(&inner, ¶m_name, &vars, &si)) + || (check_list.clone() + && is_list_shrink_expr(&inner, param_name.clone(), si.clone()))); + let inner_v = match (*inner.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + set_has(vars.clone(), expr_var_name_at(inner.clone(), si.clone())) + } + _ => false, }; -let arm_ev = collect_evidence_incremental(&arm_body(&arm_node), &func_name, ¶m_name, &arm_vars, check_child.clone(), check_list.clone(), branching_only.clone(), &si); -merge_optional_evidence(acc.clone(), arm_ev.clone()) -} - } -}); -merge_optional_evidence(scrut_ev, arms_ev) -}, - ExprData::ExprIf => { - let cond_ev = collect_evidence_incremental(&if_condition(body.clone()), &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), branching_only.clone(), &si); -let then_branch = if_then_branch(body.clone()); -let else_opt = if_else_branch(body.clone()); -let then_path = if branching_only.clone() { - max_path_self_calls(then_branch.clone(), func_name.clone(), si.clone()) - } else { - 0 - }; -let else_path = if branching_only.clone() { - match else_opt.clone() { - Some(eb) => max_path_self_calls(eb.clone(), func_name.clone(), si.clone()), - None => 0, -} - } else { - 0 - }; -let then_ev = if (branching_only.clone() && (then_path == 0)) { - None - } else { - collect_evidence_incremental(&then_branch, &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), branching_only.clone(), &si) - }; -let else_ev = if (branching_only.clone() && (else_path == 0)) { - None - } else { - match else_opt.clone() { - Some(eb) => collect_evidence_incremental(&eb, &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), branching_only.clone(), &si), - None => None, -} - }; -merge_optional_evidence(cond_ev, merge_optional_evidence(then_ev, else_ev)) -}, - ExprData::ExprCall { .. } => { - let callee = expr_call_func_at(body.clone(), si.clone()); -let own_evidence = if (callee.as_str() == func_name.clone().as_str()) { + let inner_p = match (*inner.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + (expr_var_name_at(inner.clone(), si.clone()).as_str() + == param_name.clone().as_str()) + } + _ => false, + }; + ((inner_d.clone() || inner_v.clone()) || inner_p) + } + } else { + false + }; + let is_children_list = match (*val.expr_data.clone()).clone() { + ExprData::ExprFieldAccess { .. } => { + let base = field_access_base(val.clone()); + let field = field_access_field_at(val.clone(), si.clone()); + (is_children_list_field(field) + && match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let bname = expr_var_name_at(base.clone(), si.clone()); + ((bname.clone().as_str() == param_name.clone().as_str()) + || set_has(vars.clone(), bname.clone())) + } + _ => false, + }) + } + _ => false, + }; + let is_passthrough = if is_list_passthrough_call(val.clone(), si.clone()) { + match list_passthrough_inner_arg(val.clone(), si.clone()) { + Some(inner) => { + (((check_child.clone() + && is_child_descent_expr(&inner, ¶m_name, &vars, &si)) + || (check_list.clone() + && is_list_shrink_expr( + &inner, + param_name.clone(), + si.clone(), + ))) + || match (*inner.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => set_has( + vars.clone(), + expr_var_name_at(inner.clone(), si.clone()), + ), + _ => false, + }) + } + None => false, + } + } else { + false + }; + let is_consuming_helper = (check_list.clone() + && is_tokens_consuming_call(&val, param_name.clone(), vars.clone(), &si)); + let next_vars = if ((((((((is_direct || is_var) || is_option) + || is_match_descent) + || is_wrapped) + || is_extraction) + || is_children_list) + || is_passthrough) + || is_consuming_helper) { - let arg_evidence = body.children.clone().iter().cloned().fold(DescentEvidence::DescentUnknown, |acc: DescentEvidence, arg_node: Rc| { - let aname = arg_name_at(arg_node.clone(), si.clone()); -if (aname.clone().as_deref() == Some(param_name.clone()).as_deref()) { - classify_self_call_evidence(&arg_value(&arg_node), ¶m_name, &vars, check_child.clone(), check_list.clone(), &si) + v2_rt::rc_map_insert( + vars.clone(), + let_binding_name_at(body.clone(), si.clone()), + true, + ) + } else { + vars.clone() + }; + let body_ev = match let_body(body.clone()) { + Some(b) => collect_evidence_incremental( + &b, + &func_name, + ¶m_name, + &next_vars, + check_child.clone(), + check_list.clone(), + branching_only.clone(), + &si, + ), + None => None, + }; + merge_optional_evidence(val_ev, body_ev) + } + ExprData::ExprMatch => { + let scrut = match_scrutinee(body.clone()); + let scrut_ev = collect_evidence_incremental( + &scrut, + &func_name, + ¶m_name, + &vars, + check_child.clone(), + check_list.clone(), + branching_only.clone(), + &si, + ); + let scrut_is_descent = expr_contains_descent( + &scrut, + ¶m_name, + &vars, + check_child.clone(), + check_list.clone(), + &si, + ); + let scrut_is_param = match (*scrut.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let sname = expr_var_name_at(scrut.clone(), si.clone()); + ((sname.clone().as_str() == param_name.clone().as_str()) + || set_has(vars.clone(), sname.clone())) + } + _ => false, + }; + let arms_ev = match_arm_nodes(body.clone()).iter().cloned().fold( + None, + |acc: _, arm_node: Rc| { + let is_base_case = if branching_only.clone() { + (max_path_self_calls( + arm_body(&arm_node), + func_name.clone(), + si.clone(), + ) == 0) + } else { + false + }; + if is_base_case.clone() { + acc.clone() } else { - acc + { + let arm_vars = + if (scrut_is_descent.clone() || scrut_is_param.clone()) { + match (*arm_pattern(arm_node.clone())).clone() { + MatchPattern::VariantPattern { + field_bindings: bindings, + .. + } => bindings.clone().iter().cloned().fold( + vars.clone(), + |inner: Rc>, fb: Rc| { + collect_field_binding_names(fb.clone(), inner) + }, + ), + MatchPattern::Bind { + name: binding_name, .. + } => { + if scrut_is_descent.clone() { + v2_rt::rc_map_insert( + vars.clone(), + binding_name.clone(), + true, + ) + } else { + vars.clone() + } + } + _ => vars.clone(), + } + } else { + vars.clone() + }; + let arm_ev = collect_evidence_incremental( + &arm_body(&arm_node), + &func_name, + ¶m_name, + &arm_vars, + check_child.clone(), + check_list.clone(), + branching_only.clone(), + &si, + ); + merge_optional_evidence(acc.clone(), arm_ev.clone()) + } } -}); -Some(arg_evidence) -} - } else { - None - }; -let child_evidence = body.children.clone().iter().cloned().fold(None, |acc: _, child: Rc| { - let ce = collect_evidence_incremental(&child, &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), branching_only.clone(), &si); -merge_optional_evidence(acc.clone(), ce.clone()) -}); -merge_optional_evidence(own_evidence, child_evidence) -}, - ExprData::ExprBlock => { - let result = body.children.clone().iter().cloned().fold(Rc::new(EvidenceBlockAcc { - evidence: None, - vars: vars.clone(), -}), |acc: Rc, stmt: Rc| { - let stmt_ev = collect_evidence_incremental(&stmt, &func_name, ¶m_name, &acc.vars.clone(), check_child.clone(), check_list.clone(), branching_only.clone(), &si); -let next_vars = collect_descent_vars(&stmt, ¶m_name, &acc.vars.clone(), check_child.clone(), check_list.clone(), &si); -Rc::new(EvidenceBlockAcc { - evidence: merge_optional_evidence(acc.evidence.clone(), stmt_ev.clone()), - vars: next_vars.clone(), -}) -}); -result.evidence.clone() -}, - ExprData::ExprMethodCall { method_semantics: ms, .. } => { - let receiver = method_receiver(body.clone()); -let is_iter = is_algebra_iteration_method(ms.clone()); -let is_struct = is_structural_children(&receiver, ¶m_name, &vars, &si); -if (is_iter && is_struct) { - { - let recv_ev = collect_evidence_incremental(&receiver, &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), branching_only.clone(), &si); -let args_ev = method_arg_nodes(body.clone()).iter().cloned().fold(None, |acc: _, arg_node: Rc| { - let arg_val = arg_value(&arg_node); -let ev = match (*arg_val.expr_data.clone()).clone() { - ExprData::ExprLambda => match iteration_element_name(ms.clone(), arg_val.clone(), si.clone()) { - Some(iter_name) => { - let ext_vars = v2_rt::rc_map_insert(vars.clone(), iter_name.clone(), true); -collect_evidence_incremental(&lambda_body(arg_val.clone()), &func_name, ¶m_name, &ext_vars, check_child.clone(), check_list.clone(), branching_only.clone(), &si) -}, - None => None, -}, - _ => collect_evidence_incremental(&arg_val, &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), branching_only.clone(), &si), -}; -merge_optional_evidence(acc.clone(), ev.clone()) -}); -merge_optional_evidence(recv_ev, args_ev) -} - } else { - body.children.clone().iter().cloned().fold(None, |acc: _, child: Rc| { - let ce = collect_evidence_incremental(&child, &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), branching_only.clone(), &si); -merge_optional_evidence(acc.clone(), ce.clone()) -}) + }, + ); + merge_optional_evidence(scrut_ev, arms_ev) } -}, - _ => body.children.clone().iter().cloned().fold(None, |acc: _, child: Rc| { - let ce = collect_evidence_incremental(&child, &func_name, ¶m_name, &vars, check_child.clone(), check_list.clone(), branching_only.clone(), &si); -merge_optional_evidence(acc.clone(), ce.clone()) -}), -} + ExprData::ExprIf => { + let cond_ev = collect_evidence_incremental( + &if_condition(body.clone()), + &func_name, + ¶m_name, + &vars, + check_child.clone(), + check_list.clone(), + branching_only.clone(), + &si, + ); + let then_branch = if_then_branch(body.clone()); + let else_opt = if_else_branch(body.clone()); + let then_path = if branching_only.clone() { + max_path_self_calls(then_branch.clone(), func_name.clone(), si.clone()) + } else { + 0 + }; + let else_path = if branching_only.clone() { + match else_opt.clone() { + Some(eb) => max_path_self_calls(eb.clone(), func_name.clone(), si.clone()), + None => 0, + } + } else { + 0 + }; + let then_ev = if (branching_only.clone() && (then_path == 0)) { + None + } else { + collect_evidence_incremental( + &then_branch, + &func_name, + ¶m_name, + &vars, + check_child.clone(), + check_list.clone(), + branching_only.clone(), + &si, + ) + }; + let else_ev = if (branching_only.clone() && (else_path == 0)) { + None + } else { + match else_opt.clone() { + Some(eb) => collect_evidence_incremental( + &eb, + &func_name, + ¶m_name, + &vars, + check_child.clone(), + check_list.clone(), + branching_only.clone(), + &si, + ), + None => None, + } + }; + merge_optional_evidence(cond_ev, merge_optional_evidence(then_ev, else_ev)) + } + ExprData::ExprCall { .. } => { + let callee = expr_call_func_at(body.clone(), si.clone()); + let own_evidence = if (callee.as_str() == func_name.clone().as_str()) { + { + let arg_evidence = body.children.clone().iter().cloned().fold( + DescentEvidence::DescentUnknown, + |acc: DescentEvidence, arg_node: Rc| { + let aname = arg_name_at(arg_node.clone(), si.clone()); + if (aname.clone().as_deref() == Some(param_name.clone()).as_deref()) + { + classify_self_call_evidence( + &arg_value(&arg_node), + ¶m_name, + &vars, + check_child.clone(), + check_list.clone(), + &si, + ) + } else { + acc + } + }, + ); + Some(arg_evidence) + } + } else { + None + }; + let child_evidence = + body.children + .clone() + .iter() + .cloned() + .fold(None, |acc: _, child: Rc| { + let ce = collect_evidence_incremental( + &child, + &func_name, + ¶m_name, + &vars, + check_child.clone(), + check_list.clone(), + branching_only.clone(), + &si, + ); + merge_optional_evidence(acc.clone(), ce.clone()) + }); + merge_optional_evidence(own_evidence, child_evidence) + } + ExprData::ExprBlock => { + let result = body.children.clone().iter().cloned().fold( + Rc::new(EvidenceBlockAcc { + evidence: None, + vars: vars.clone(), + }), + |acc: Rc, stmt: Rc| { + let stmt_ev = collect_evidence_incremental( + &stmt, + &func_name, + ¶m_name, + &acc.vars.clone(), + check_child.clone(), + check_list.clone(), + branching_only.clone(), + &si, + ); + let next_vars = collect_descent_vars( + &stmt, + ¶m_name, + &acc.vars.clone(), + check_child.clone(), + check_list.clone(), + &si, + ); + Rc::new(EvidenceBlockAcc { + evidence: merge_optional_evidence( + acc.evidence.clone(), + stmt_ev.clone(), + ), + vars: next_vars.clone(), + }) + }, + ); + result.evidence.clone() + } + ExprData::ExprMethodCall { + method_semantics: ms, + .. + } => { + let receiver = method_receiver(body.clone()); + let is_iter = is_algebra_iteration_method(ms.clone()); + let is_struct = is_structural_children(&receiver, ¶m_name, &vars, &si); + if (is_iter && is_struct) { + { + let recv_ev = collect_evidence_incremental( + &receiver, + &func_name, + ¶m_name, + &vars, + check_child.clone(), + check_list.clone(), + branching_only.clone(), + &si, + ); + let args_ev = method_arg_nodes(body.clone()).iter().cloned().fold( + None, + |acc: _, arg_node: Rc| { + let arg_val = arg_value(&arg_node); + let ev = match (*arg_val.expr_data.clone()).clone() { + ExprData::ExprLambda => match iteration_element_name( + ms.clone(), + arg_val.clone(), + si.clone(), + ) { + Some(iter_name) => { + let ext_vars = v2_rt::rc_map_insert( + vars.clone(), + iter_name.clone(), + true, + ); + collect_evidence_incremental( + &lambda_body(arg_val.clone()), + &func_name, + ¶m_name, + &ext_vars, + check_child.clone(), + check_list.clone(), + branching_only.clone(), + &si, + ) + } + None => None, + }, + _ => collect_evidence_incremental( + &arg_val, + &func_name, + ¶m_name, + &vars, + check_child.clone(), + check_list.clone(), + branching_only.clone(), + &si, + ), + }; + merge_optional_evidence(acc.clone(), ev.clone()) + }, + ); + merge_optional_evidence(recv_ev, args_ev) + } + } else { + body.children + .clone() + .iter() + .cloned() + .fold(None, |acc: _, child: Rc| { + let ce = collect_evidence_incremental( + &child, + &func_name, + ¶m_name, + &vars, + check_child.clone(), + check_list.clone(), + branching_only.clone(), + &si, + ); + merge_optional_evidence(acc.clone(), ce.clone()) + }) + } + } + _ => body + .children + .clone() + .iter() + .cloned() + .fold(None, |acc: _, child: Rc| { + let ce = collect_evidence_incremental( + &child, + &func_name, + ¶m_name, + &vars, + check_child.clone(), + check_list.clone(), + branching_only.clone(), + &si, + ); + merge_optional_evidence(acc.clone(), ce.clone()) + }), + } }) } -pub fn try_type_directed_dimension(body: Rc, func_name: String, param_name: &String, dim: IterationDimension, si: Rc>>) -> Option> { +pub fn try_type_directed_dimension( + body: Rc, + func_name: String, + param_name: &String, + dim: IterationDimension, + si: Rc>>, +) -> Option> { match dim { - IterationDimension::TreeDescent => match try_dimension_for_param(body, func_name, param_name.clone(), true, false, si) { - Some(DescentEvidence::Strict) => Some(Rc::new(TerminationProof { - dimensions: Rc::new(vec![Rc::new(RankingDimension::TreeSize { - param: param_name.clone(), -})]), -})), - _ => None, -}, - IterationDimension::CollectionFold => match try_dimension_for_param(body, func_name, param_name.clone(), false, true, si) { - Some(DescentEvidence::Strict) => Some(Rc::new(TerminationProof { - dimensions: Rc::new(vec![Rc::new(RankingDimension::ListLength { - param: param_name.clone(), -})]), -})), - _ => None, -}, - IterationDimension::ArithmeticRepeat => match try_dimension_for_param(body, func_name, param_name.clone(), false, false, si) { - Some(DescentEvidence::Strict) => Some(Rc::new(TerminationProof { - dimensions: Rc::new(vec![Rc::new(RankingDimension::ArithmeticValue { - param: param_name.clone(), -})]), -})), - _ => None, -}, -} + IterationDimension::TreeDescent => { + match try_dimension_for_param(body, func_name, param_name.clone(), true, false, si) { + Some(DescentEvidence::Strict) => Some(Rc::new(TerminationProof { + dimensions: Rc::new(vec![Rc::new(RankingDimension::TreeSize { + param: param_name.clone(), + })]), + })), + _ => None, + } + } + IterationDimension::CollectionFold => { + match try_dimension_for_param(body, func_name, param_name.clone(), false, true, si) { + Some(DescentEvidence::Strict) => Some(Rc::new(TerminationProof { + dimensions: Rc::new(vec![Rc::new(RankingDimension::ListLength { + param: param_name.clone(), + })]), + })), + _ => None, + } + } + IterationDimension::ArithmeticRepeat => { + match try_dimension_for_param(body, func_name, param_name.clone(), false, false, si) { + Some(DescentEvidence::Strict) => Some(Rc::new(TerminationProof { + dimensions: Rc::new(vec![Rc::new(RankingDimension::ArithmeticValue { + param: param_name.clone(), + })]), + })), + _ => None, + } + } + } } -pub fn construct_termination_proof(func_name: &String, body: &Rc, params: &Rc>>, parser_always_advancing: Rc>, si: &Rc>>) -> Option> { +pub fn construct_termination_proof( + func_name: &String, + body: &Rc, + params: &Rc>>, + parser_always_advancing: Rc>, + si: &Rc>>, +) -> Option> { { - let structural_proof = params.clone().iter().cloned().fold(None, |best: _, p: Rc| match best.clone() { - Some(_) => best.clone(), - None => { - let pname = param_node_name_at(p.clone(), si.clone()); -let type_name = authored_name_at(si.clone(), ¶m_node_type_expr(&p)); -match type_iteration_dimension(&type_name) { - Some(dim) => try_type_directed_dimension(body.clone(), func_name.clone(), &pname, dim.clone(), si.clone()), - None => { - let tree_evidence = try_dimension_for_param(body.clone(), func_name.clone(), pname.clone(), true, false, si.clone()); -match tree_evidence.clone() { - Some(DescentEvidence::Strict) => Some(Rc::new(TerminationProof { - dimensions: Rc::new(vec![Rc::new(RankingDimension::TreeSize { - param: pname.clone(), -})]), -})), - _ => { - let list_evidence = try_dimension_for_param(body.clone(), func_name.clone(), pname.clone(), false, true, si.clone()); -match list_evidence.clone() { - Some(DescentEvidence::Strict) => Some(Rc::new(TerminationProof { - dimensions: Rc::new(vec![Rc::new(RankingDimension::ListLength { - param: pname.clone(), -})]), -})), - _ => { - let arith_evidence = try_dimension_for_param(body.clone(), func_name.clone(), pname.clone(), false, false, si.clone()); -match arith_evidence.clone() { - Some(DescentEvidence::Strict) => Some(Rc::new(TerminationProof { - dimensions: Rc::new(vec![Rc::new(RankingDimension::ArithmeticValue { - param: pname.clone(), -})]), -})), - _ => None, -} -}, -} -}, -} -}, -} -}, -}); -let single_dim_proof = match structural_proof.clone() { - Some(_) => structural_proof.clone(), - None => match parser_state_param(params.clone(), si.clone()) { - Some(state_param) => { - let self_set = seed_bool_map(func_name.clone()); -let edges = collect_parser_progress_edges(&func_name, &body, &state_param, &self_set, &empty_parser_progress_env(), &parser_always_advancing, &v2_rt::rc_empty_map::(), &si); -if (((edges.clone().len() as i64) > 0) && { let mut __all = true; for edge in edges.clone().iter().cloned() { if !((edge.progress.clone() == DescentEvidence::Strict)) { __all = false; break; } } __all }) { - Some(Rc::new(TerminationProof { - dimensions: Rc::new(vec![Rc::new(RankingDimension::TokenPosition { - param: state_param.name.clone(), -})]), -})) - } else { - None + let structural_proof = params + .clone() + .iter() + .cloned() + .fold(None, |best: _, p: Rc| match best.clone() { + Some(_) => best.clone(), + None => { + let pname = param_node_name_at(p.clone(), si.clone()); + let type_name = authored_name_at(si.clone(), ¶m_node_type_expr(&p)); + match type_iteration_dimension(&type_name) { + Some(dim) => try_type_directed_dimension( + body.clone(), + func_name.clone(), + &pname, + dim.clone(), + si.clone(), + ), + None => { + let tree_evidence = try_dimension_for_param( + body.clone(), + func_name.clone(), + pname.clone(), + true, + false, + si.clone(), + ); + match tree_evidence.clone() { + Some(DescentEvidence::Strict) => Some(Rc::new(TerminationProof { + dimensions: Rc::new(vec![Rc::new( + RankingDimension::TreeSize { + param: pname.clone(), + }, + )]), + })), + _ => { + let list_evidence = try_dimension_for_param( + body.clone(), + func_name.clone(), + pname.clone(), + false, + true, + si.clone(), + ); + match list_evidence.clone() { + Some(DescentEvidence::Strict) => { + Some(Rc::new(TerminationProof { + dimensions: Rc::new(vec![Rc::new( + RankingDimension::ListLength { + param: pname.clone(), + }, + )]), + })) + } + _ => { + let arith_evidence = try_dimension_for_param( + body.clone(), + func_name.clone(), + pname.clone(), + false, + false, + si.clone(), + ); + match arith_evidence.clone() { + Some(DescentEvidence::Strict) => { + Some(Rc::new(TerminationProof { + dimensions: Rc::new(vec![Rc::new( + RankingDimension::ArithmeticValue { + param: pname.clone(), + }, + )]), + })) + } + _ => None, + } + } + } + } + } + } + } + } + }); + let single_dim_proof = match structural_proof.clone() { + Some(_) => structural_proof.clone(), + None => match parser_state_param(params.clone(), si.clone()) { + Some(state_param) => { + let self_set = seed_bool_map(func_name.clone()); + let edges = collect_parser_progress_edges( + &func_name, + &body, + &state_param, + &self_set, + &empty_parser_progress_env(), + &parser_always_advancing, + &v2_rt::rc_empty_map::(), + &si, + ); + if (((edges.clone().len() as i64) > 0) && { + let mut __all = true; + for edge in edges.clone().iter().cloned() { + if !(edge.progress.clone() == DescentEvidence::Strict) { + __all = false; + break; + } + } + __all + }) { + Some(Rc::new(TerminationProof { + dimensions: Rc::new(vec![Rc::new(RankingDimension::TokenPosition { + param: state_param.name.clone(), + })]), + })) + } else { + None + } + } + None => None, + }, + }; + match single_dim_proof.clone() { + Some(_) => single_dim_proof.clone(), + None => { + let self_set = seed_bool_map(func_name.clone()); + let func_entry = Rc::new(FuncEntry { + name: func_name.clone(), + body: body.clone(), + params: params.clone(), + span: body.span.clone(), + is_tail_recursive: false, + }); + let func_index = seed_func_entry_map(func_name.clone(), func_entry); + construct_scc_termination_proof( + &Rc::new(vec![func_name.clone()]), + &func_index, + &self_set, + &si, + ) } -}, - None => None, -}, -}; -match single_dim_proof.clone() { - Some(_) => single_dim_proof.clone(), - None => { - let self_set = seed_bool_map(func_name.clone()); -let func_entry = Rc::new(FuncEntry { - name: func_name.clone(), - body: body.clone(), - params: params.clone(), - span: body.span.clone(), - is_tail_recursive: false, -}); -let func_index = seed_func_entry_map(func_name.clone(), func_entry); -construct_scc_termination_proof(&Rc::new(vec![func_name.clone()]), &func_index, &self_set, &si) -}, -} -} + } + } } -pub fn construct_branching_termination_proof(func_name: String, body: Rc, params: Rc>>, si: Rc>>) -> Option> { - params.iter().cloned().fold(None, |best: _, p: Rc| match best.clone() { - Some(_) => best.clone(), - None => { - let pname = param_node_name_at(p.clone(), si.clone()); -let type_name = authored_name_at(si.clone(), ¶m_node_type_expr(&p)); -match type_iteration_dimension(&type_name) { - Some(IterationDimension::TreeDescent) => match try_branching_dimension_for_param(body.clone(), func_name.clone(), pname.clone(), true, false, si.clone()) { - Some(DescentEvidence::Strict) => Some(Rc::new(TerminationProof { - dimensions: Rc::new(vec![Rc::new(RankingDimension::TreeSize { - param: pname.clone(), -})]), -})), - _ => None, -}, - Some(IterationDimension::CollectionFold) => match try_branching_dimension_for_param(body.clone(), func_name.clone(), pname.clone(), false, true, si.clone()) { - Some(DescentEvidence::Strict) => Some(Rc::new(TerminationProof { - dimensions: Rc::new(vec![Rc::new(RankingDimension::ListLength { - param: pname.clone(), -})]), -})), - _ => None, -}, - Some(IterationDimension::ArithmeticRepeat) => None, - None => { - let tree_ev = try_branching_dimension_for_param(body.clone(), func_name.clone(), pname.clone(), true, false, si.clone()); -match tree_ev.clone() { - Some(DescentEvidence::Strict) => Some(Rc::new(TerminationProof { - dimensions: Rc::new(vec![Rc::new(RankingDimension::TreeSize { - param: pname.clone(), -})]), -})), - _ => { - let list_ev = try_branching_dimension_for_param(body.clone(), func_name.clone(), pname.clone(), false, true, si.clone()); -match list_ev.clone() { - Some(DescentEvidence::Strict) => Some(Rc::new(TerminationProof { - dimensions: Rc::new(vec![Rc::new(RankingDimension::ListLength { - param: pname.clone(), -})]), -})), - _ => None, -} -}, -} -}, -} -}, -}) +pub fn construct_branching_termination_proof( + func_name: String, + body: Rc, + params: Rc>>, + si: Rc>>, +) -> Option> { + params + .iter() + .cloned() + .fold(None, |best: _, p: Rc| match best.clone() { + Some(_) => best.clone(), + None => { + let pname = param_node_name_at(p.clone(), si.clone()); + let type_name = authored_name_at(si.clone(), ¶m_node_type_expr(&p)); + match type_iteration_dimension(&type_name) { + Some(IterationDimension::TreeDescent) => { + match try_branching_dimension_for_param( + body.clone(), + func_name.clone(), + pname.clone(), + true, + false, + si.clone(), + ) { + Some(DescentEvidence::Strict) => Some(Rc::new(TerminationProof { + dimensions: Rc::new(vec![Rc::new(RankingDimension::TreeSize { + param: pname.clone(), + })]), + })), + _ => None, + } + } + Some(IterationDimension::CollectionFold) => { + match try_branching_dimension_for_param( + body.clone(), + func_name.clone(), + pname.clone(), + false, + true, + si.clone(), + ) { + Some(DescentEvidence::Strict) => Some(Rc::new(TerminationProof { + dimensions: Rc::new(vec![Rc::new(RankingDimension::ListLength { + param: pname.clone(), + })]), + })), + _ => None, + } + } + Some(IterationDimension::ArithmeticRepeat) => None, + None => { + let tree_ev = try_branching_dimension_for_param( + body.clone(), + func_name.clone(), + pname.clone(), + true, + false, + si.clone(), + ); + match tree_ev.clone() { + Some(DescentEvidence::Strict) => Some(Rc::new(TerminationProof { + dimensions: Rc::new(vec![Rc::new(RankingDimension::TreeSize { + param: pname.clone(), + })]), + })), + _ => { + let list_ev = try_branching_dimension_for_param( + body.clone(), + func_name.clone(), + pname.clone(), + false, + true, + si.clone(), + ); + match list_ev.clone() { + Some(DescentEvidence::Strict) => { + Some(Rc::new(TerminationProof { + dimensions: Rc::new(vec![Rc::new( + RankingDimension::ListLength { + param: pname.clone(), + }, + )]), + })) + } + _ => None, + } + } + } + } + } + } + }) } pub fn proof_to_call_pattern(proof: Rc) -> Rc { match proof.dimensions.clone().first().cloned() { - Some(dim) => match (*dim.clone()).clone() { - RankingDimension::TreeSize { param: p, .. } => Rc::new(CallPattern::ChildAccessorCall { - accessor: p.clone(), -}), - RankingDimension::ListLength { param: p, .. } => Rc::new(CallPattern::CollectionShrinkCall { - amount: Rc::new(PositiveDescentAmount::OneStep), - collection: p.clone(), -}), - RankingDimension::ArithmeticValue { param: p, .. } => Rc::new(CallPattern::ArithmeticSubtractCall { - steps: Rc::new(PositiveDescentAmount::OneStep), - ring_param: p.clone(), -}), - RankingDimension::TokenPosition { param: p, .. } => Rc::new(CallPattern::ParserAdvanceCall { - witness: p.clone(), -}), - RankingDimension::SetCardinality { param: p, .. } => Rc::new(CallPattern::WorklistDrainCall { - element: p.clone(), -}), -}, - None => Rc::new(CallPattern::SameArgumentCall), -} + Some(dim) => match (*dim.clone()).clone() { + RankingDimension::TreeSize { param: p, .. } => { + Rc::new(CallPattern::ChildAccessorCall { + accessor: p.clone(), + }) + } + RankingDimension::ListLength { param: p, .. } => { + Rc::new(CallPattern::CollectionShrinkCall { + amount: Rc::new(PositiveDescentAmount::OneStep), + collection: p.clone(), + }) + } + RankingDimension::ArithmeticValue { param: p, .. } => { + Rc::new(CallPattern::ArithmeticSubtractCall { + steps: Rc::new(PositiveDescentAmount::OneStep), + ring_param: p.clone(), + }) + } + RankingDimension::TokenPosition { param: p, .. } => { + Rc::new(CallPattern::ParserAdvanceCall { witness: p.clone() }) + } + RankingDimension::SetCardinality { param: p, .. } => { + Rc::new(CallPattern::WorklistDrainCall { element: p.clone() }) + } + }, + None => Rc::new(CallPattern::SameArgumentCall), + } } -pub fn classify_recursion_pattern(func_name: &String, body: &Rc, params: &Rc>>, parser_always_advancing: Rc>, si: &Rc>>) -> Rc { +pub fn classify_recursion_pattern( + func_name: &String, + body: &Rc, + params: &Rc>>, + parser_always_advancing: Rc>, + si: &Rc>>, +) -> Rc { { let path_calls = max_path_self_calls(body.clone(), func_name.clone(), si.clone()); -if (path_calls.clone() == 0) { + if (path_calls.clone() == 0) { { let outer = match params.clone().first().cloned() { - Some(p0) => param_node_name_at(p0.clone(), si.clone()), - None => "_fold_body".to_string(), -}; -lower_call_pattern(Rc::new(CallPattern::FoldBodyCall { - outer_collection: outer, -})) -} + Some(p0) => param_node_name_at(p0.clone(), si.clone()), + None => "_fold_body".to_string(), + }; + lower_call_pattern(Rc::new(CallPattern::FoldBodyCall { + outer_collection: outer, + })) + } } else { { - let all_evidence = collect_self_call_evidence(body.clone(), func_name.clone(), si.clone()); -let has_evidence = ((all_evidence.clone().len() as i64) > 0); -let all_structural = (has_evidence && { let mut __all = true; for call_ev in all_evidence.clone().iter().cloned() { if !({ let mut __found = false; for rel in call_ev.clone().iter().cloned() { if match (*rel.clone()).clone() { - SubValueRelation::StrictSubValue { .. } => true, - SubValueRelation::IteratedSubValue { .. } => true, - SubValueRelation::ArithmeticDescent { .. } => true, - _ => false, -} { __found = true; break; } } __found }) { __all = false; break; } } __all }); -if all_structural { + let all_evidence = + collect_self_call_evidence(body.clone(), func_name.clone(), si.clone()); + let has_evidence = ((all_evidence.clone().len() as i64) > 0); + let all_structural = (has_evidence && { + let mut __all = true; + for call_ev in all_evidence.clone().iter().cloned() { + if !({ + let mut __found = false; + for rel in call_ev.clone().iter().cloned() { + if match (*rel.clone()).clone() { + SubValueRelation::StrictSubValue { .. } => true, + SubValueRelation::IteratedSubValue { .. } => true, + SubValueRelation::ArithmeticDescent { .. } => true, + _ => false, + } { + __found = true; + break; + } + } + __found + }) { + __all = false; + break; + } + } + __all + }); + if all_structural { { - let all_calls_arithmetic_only = { let mut __all = true; for call_ev in all_evidence.clone().iter().cloned() { if !({ - let has_tree = { let mut __found = false; for rel in call_ev.clone().iter().cloned() { if match (*rel.clone()).clone() { - SubValueRelation::StrictSubValue { .. } => true, - SubValueRelation::IteratedSubValue { .. } => true, - _ => false, -} { __found = true; break; } } __found }; -let has_arith = { let mut __found = false; for rel in call_ev.clone().iter().cloned() { if match (*rel.clone()).clone() { - SubValueRelation::ArithmeticDescent { .. } => true, - _ => false, -} { __found = true; break; } } __found }; -(has_arith.clone() && !has_tree.clone()) -}) { __all = false; break; } } __all }; -let first_call = if all_calls_arithmetic_only { - Rc::new({ let mut __result = Vec::new(); for call_ev in all_evidence.clone().iter().cloned() { __result.extend((*Rc::new({ let mut __result = Vec::new(); for rel in call_ev.clone().iter().cloned() { if match (*rel.clone()).clone() { - SubValueRelation::ArithmeticDescent { .. } => true, - _ => false, -} { __result.push(rel); } } __result })).iter().cloned()); } __result }).first().cloned() + let all_calls_arithmetic_only = { + let mut __all = true; + for call_ev in all_evidence.clone().iter().cloned() { + if !({ + let has_tree = { + let mut __found = false; + for rel in call_ev.clone().iter().cloned() { + if match (*rel.clone()).clone() { + SubValueRelation::StrictSubValue { .. } => true, + SubValueRelation::IteratedSubValue { .. } => true, + _ => false, + } { + __found = true; + break; + } + } + __found + }; + let has_arith = { + let mut __found = false; + for rel in call_ev.clone().iter().cloned() { + if match (*rel.clone()).clone() { + SubValueRelation::ArithmeticDescent { .. } => true, + _ => false, + } { + __found = true; + break; + } + } + __found + }; + (has_arith.clone() && !has_tree.clone()) + }) { + __all = false; + break; + } + } + __all + }; + let first_call = if all_calls_arithmetic_only { + Rc::new({ + let mut __result = Vec::new(); + for call_ev in all_evidence.clone().iter().cloned() { + __result.extend( + (*Rc::new({ + let mut __result = Vec::new(); + for rel in call_ev.clone().iter().cloned() { + if match (*rel.clone()).clone() { + SubValueRelation::ArithmeticDescent { + .. + } => true, + _ => false, + } { + __result.push(rel); + } + } + __result + })) + .iter() + .cloned(), + ); + } + __result + }) + .first() + .cloned() } else { { - let tree_rels = Rc::new({ let mut __result = Vec::new(); for call_ev in all_evidence.clone().iter().cloned() { __result.extend((*Rc::new({ let mut __result = Vec::new(); for rel in call_ev.clone().iter().cloned() { if match (*rel.clone()).clone() { + let tree_rels = + Rc::new({ + let mut __result = Vec::new(); + for call_ev in all_evidence.clone().iter().cloned() { + __result.extend( + (*Rc::new({ + let mut __result = Vec::new(); + for rel in call_ev.clone().iter().cloned() { + if match (*rel.clone()).clone() { SubValueRelation::StrictSubValue { .. } => true, SubValueRelation::IteratedSubValue { .. } => true, _ => false, -} { __result.push(rel); } } __result })).iter().cloned()); } __result }); -match tree_rels.clone().first().cloned() { - Some(_) => tree_rels.clone().first().cloned(), - None => Rc::new({ let mut __result = Vec::new(); for call_ev in all_evidence.clone().iter().cloned() { __result.extend((*Rc::new({ let mut __result = Vec::new(); for rel in call_ev.clone().iter().cloned() { if match (*rel.clone()).clone() { +} { __result.push(rel); } + } + __result + })) + .iter() + .cloned(), + ); + } + __result + }); + match tree_rels.clone().first().cloned() { + Some(_) => tree_rels.clone().first().cloned(), + None => Rc::new({ + let mut __result = Vec::new(); + for call_ev in all_evidence.clone().iter().cloned() { + __result.extend( + (*Rc::new({ + let mut __result = Vec::new(); + for rel in call_ev.clone().iter().cloned() { + if match (*rel.clone()).clone() { SubValueRelation::ArithmeticDescent { .. } => true, _ => false, -} { __result.push(rel); } } __result })).iter().cloned()); } __result }).first().cloned(), -} -} +} { __result.push(rel); } + } + __result + })) + .iter() + .cloned(), + ); + } + __result + }) + .first() + .cloned(), + } + } }; -let is_arithmetic_branching = match first_call.clone() { - Some(rel) => match (*rel.clone()).clone() { - SubValueRelation::ArithmeticDescent { .. } => (path_calls.clone() > 1), - _ => false, -}, - None => false, -}; -if is_arithmetic_branching { + let is_arithmetic_branching = match first_call.clone() { + Some(rel) => match (*rel.clone()).clone() { + SubValueRelation::ArithmeticDescent { .. } => { + (path_calls.clone() > 1) + } + _ => false, + }, + None => false, + }; + if is_arithmetic_branching { lower_call_pattern(Rc::new(CallPattern::SameArgumentCall)) } else { match first_call.clone() { - Some(rel) => match sub_value_to_lowering_target(rel.clone()) { - Some(target) => target.clone(), - None => lower_call_pattern(Rc::new(CallPattern::SameArgumentCall)), -}, - None => lower_call_pattern(Rc::new(CallPattern::SameArgumentCall)), -} + Some(rel) => match sub_value_to_lowering_target(rel.clone()) { + Some(target) => target.clone(), + None => { + lower_call_pattern(Rc::new(CallPattern::SameArgumentCall)) + } + }, + None => lower_call_pattern(Rc::new(CallPattern::SameArgumentCall)), + } } -} + } } else { { - let proof = construct_termination_proof(&func_name, &body, ¶ms, parser_always_advancing, &si); -let proof_safe_for_branching = match proof.clone() { - Some(p) => if ((p.dimensions.clone().len() as i64) == 0) { - false - } else { - { let mut __all = true; for dim in p.dimensions.clone().iter().cloned() { if !(match (*dim.clone()).clone() { - RankingDimension::TreeSize { .. } => true, - RankingDimension::ListLength { .. } => true, - _ => false, -}) { __all = false; break; } } __all } - }, - None => false, -}; -let branching_proof = if ((path_calls.clone() > 1) && !proof_safe_for_branching.clone()) { - construct_branching_termination_proof(func_name.clone(), body.clone(), params.clone(), si.clone()) - } else { - None - }; -let branching_proof_safe = match branching_proof.clone() { - Some(bp) => if ((bp.dimensions.clone().len() as i64) == 0) { - false - } else { - { let mut __all = true; for dim in bp.dimensions.clone().iter().cloned() { if !(match (*dim.clone()).clone() { - RankingDimension::TreeSize { .. } => true, - RankingDimension::ListLength { .. } => true, - _ => false, -}) { __all = false; break; } } __all } - }, - None => false, -}; -match proof.clone() { - Some(p) => if ((path_calls.clone() == 1) || proof_safe_for_branching.clone()) { - lower_call_pattern(proof_to_call_pattern(p.clone())) - } else { - if branching_proof_safe { - match branching_proof.clone() { - Some(bp) => lower_call_pattern(proof_to_call_pattern(bp.clone())), - None => lower_call_pattern(Rc::new(CallPattern::SameArgumentCall)), -} - } else { - lower_call_pattern(Rc::new(CallPattern::SameArgumentCall)) + let proof = construct_termination_proof( + &func_name, + &body, + ¶ms, + parser_always_advancing, + &si, + ); + let proof_safe_for_branching = match proof.clone() { + Some(p) => { + if ((p.dimensions.clone().len() as i64) == 0) { + false + } else { + { + let mut __all = true; + for dim in p.dimensions.clone().iter().cloned() { + if !(match (*dim.clone()).clone() { + RankingDimension::TreeSize { .. } => true, + RankingDimension::ListLength { .. } => true, + _ => false, + }) { + __all = false; + break; + } + } + __all + } + } } - }, - None => if (path_calls.clone() > 1) { - match branching_proof.clone() { - Some(bp) => if branching_proof_safe { - lower_call_pattern(proof_to_call_pattern(bp.clone())) + None => false, + }; + let branching_proof = + if ((path_calls.clone() > 1) && !proof_safe_for_branching.clone()) { + construct_branching_termination_proof( + func_name.clone(), + body.clone(), + params.clone(), + si.clone(), + ) } else { - lower_call_pattern(Rc::new(CallPattern::SameArgumentCall)) - }, - None => lower_call_pattern(Rc::new(CallPattern::SameArgumentCall)), -} - } else { - lower_call_pattern(Rc::new(CallPattern::SameArgumentCall)) - }, -} -} + None + }; + let branching_proof_safe = match branching_proof.clone() { + Some(bp) => { + if ((bp.dimensions.clone().len() as i64) == 0) { + false + } else { + { + let mut __all = true; + for dim in bp.dimensions.clone().iter().cloned() { + if !(match (*dim.clone()).clone() { + RankingDimension::TreeSize { .. } => true, + RankingDimension::ListLength { .. } => true, + _ => false, + }) { + __all = false; + break; + } + } + __all + } + } + } + None => false, + }; + match proof.clone() { + Some(p) => { + if ((path_calls.clone() == 1) || proof_safe_for_branching.clone()) { + lower_call_pattern(proof_to_call_pattern(p.clone())) + } else { + if branching_proof_safe { + match branching_proof.clone() { + Some(bp) => lower_call_pattern(proof_to_call_pattern( + bp.clone(), + )), + None => lower_call_pattern(Rc::new( + CallPattern::SameArgumentCall, + )), + } + } else { + lower_call_pattern(Rc::new(CallPattern::SameArgumentCall)) + } + } + } + None => { + if (path_calls.clone() > 1) { + match branching_proof.clone() { + Some(bp) => { + if branching_proof_safe { + lower_call_pattern(proof_to_call_pattern( + bp.clone(), + )) + } else { + lower_call_pattern(Rc::new( + CallPattern::SameArgumentCall, + )) + } + } + None => lower_call_pattern(Rc::new( + CallPattern::SameArgumentCall, + )), + } + } else { + lower_call_pattern(Rc::new(CallPattern::SameArgumentCall)) + } + } + } + } } -} + } } -} + } } -pub fn bounded_recursive_cost(target: Rc, per_iter: Rc, func_name: String) -> Rc { +pub fn bounded_recursive_cost( + target: Rc, + per_iter: Rc, + func_name: String, +) -> Rc { { let p = size_bound_param(target.bound.clone()); -match p { - Some(v) => { - let var = v2_rt::concat("n_".to_string(), v.clone()); -Rc::new(CostExpr::CostSum { - binder: var.clone(), - upper: Rc::new(SizeExpr::SizeVar { - name: var.clone(), -}), - body: simplify_cost(per_iter), -}) -}, - None => Rc::new(CostExpr::CostUnknown { - reason: v2_rt::concat("same-argument recursion in ".to_string(), func_name), -}), -} -} + match p { + Some(v) => { + let var = v2_rt::concat("n_".to_string(), v.clone()); + Rc::new(CostExpr::CostSum { + binder: var.clone(), + upper: Rc::new(SizeExpr::SizeVar { name: var.clone() }), + body: simplify_cost(per_iter), + }) + } + None => Rc::new(CostExpr::CostUnknown { + reason: v2_rt::concat("same-argument recursion in ".to_string(), func_name), + }), + } + } } -pub fn bounded_scc_cost(target: Rc, per_iter: Rc, members: Rc>) -> Rc { +pub fn bounded_scc_cost( + target: Rc, + per_iter: Rc, + members: Rc>, +) -> Rc { { let p = size_bound_param(target.bound.clone()); -match p { - Some(v) => { - let var = v2_rt::concat("n_".to_string(), v.clone()); -Rc::new(CostExpr::CostSum { - binder: var.clone(), - upper: Rc::new(SizeExpr::SizeVar { - name: var.clone(), -}), - body: simplify_cost(per_iter), -}) -}, - None => Rc::new(CostExpr::CostUnknown { - reason: v2_rt::concat("same-argument mutual recursion in ".to_string(), match members.first().cloned() { - Some(n) => n.clone(), - None => "scc".to_string(), -}), -}), -} -} + match p { + Some(v) => { + let var = v2_rt::concat("n_".to_string(), v.clone()); + Rc::new(CostExpr::CostSum { + binder: var.clone(), + upper: Rc::new(SizeExpr::SizeVar { name: var.clone() }), + body: simplify_cost(per_iter), + }) + } + None => Rc::new(CostExpr::CostUnknown { + reason: v2_rt::concat( + "same-argument mutual recursion in ".to_string(), + match members.first().cloned() { + Some(n) => n.clone(), + None => "scc".to_string(), + }, + ), + }), + } + } } pub fn is_unknown_cost(expr: Rc) -> bool { - stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - match (*expr).clone() { - CostExpr::CostUnknown { .. } => true, - CostExpr::CostAdd { left: l, right: r, .. } => (is_unknown_cost(l.clone()) || is_unknown_cost(r.clone())), - CostExpr::CostMul { left: l, right: r, .. } => (is_unknown_cost(l.clone()) || is_unknown_cost(r.clone())), - CostExpr::CostMax { left: l, right: r, .. } => (is_unknown_cost(l.clone()) || is_unknown_cost(r.clone())), - CostExpr::CostSum { body: bd, .. } => is_unknown_cost(bd.clone()), - _ => false, -} + stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || match (*expr).clone() { + CostExpr::CostUnknown { .. } => true, + CostExpr::CostAdd { + left: l, right: r, .. + } => (is_unknown_cost(l.clone()) || is_unknown_cost(r.clone())), + CostExpr::CostMul { + left: l, right: r, .. + } => (is_unknown_cost(l.clone()) || is_unknown_cost(r.clone())), + CostExpr::CostMax { + left: l, right: r, .. + } => (is_unknown_cost(l.clone()) || is_unknown_cost(r.clone())), + CostExpr::CostSum { body: bd, .. } => is_unknown_cost(bd.clone()), + _ => false, }) } pub fn extract_unknown_reason(mut expr: Rc) -> String { loop { match (*expr).clone() { - CostExpr::CostUnknown { reason: r, .. } => { break r.clone(); }, - CostExpr::CostAdd { left: l, right: r, .. } => { if is_unknown_cost(l.clone()) { - { - let __tco_0 = l.clone(); -expr = __tco_0; -continue; -} -} else { - { - let __tco_0 = r.clone(); -expr = __tco_0; -continue; -} -} }, - CostExpr::CostMul { left: l, right: r, .. } => { if is_unknown_cost(l.clone()) { - { - let __tco_0 = l.clone(); -expr = __tco_0; -continue; -} -} else { - { - let __tco_0 = r.clone(); -expr = __tco_0; -continue; -} -} }, - CostExpr::CostMax { left: l, right: r, .. } => { if is_unknown_cost(l.clone()) { - { - let __tco_0 = l.clone(); -expr = __tco_0; -continue; -} -} else { - { - let __tco_0 = r.clone(); -expr = __tco_0; -continue; -} -} }, - CostExpr::CostSum { body: bd, .. } => { { - let __tco_0 = bd.clone(); -expr = __tco_0; -continue; -} }, - _ => { break "unknown".to_string(); }, -} -} + CostExpr::CostUnknown { reason: r, .. } => { + break r.clone(); + } + CostExpr::CostAdd { + left: l, right: r, .. + } => { + if is_unknown_cost(l.clone()) { + { + let __tco_0 = l.clone(); + expr = __tco_0; + continue; + } + } else { + { + let __tco_0 = r.clone(); + expr = __tco_0; + continue; + } + } + } + CostExpr::CostMul { + left: l, right: r, .. + } => { + if is_unknown_cost(l.clone()) { + { + let __tco_0 = l.clone(); + expr = __tco_0; + continue; + } + } else { + { + let __tco_0 = r.clone(); + expr = __tco_0; + continue; + } + } + } + CostExpr::CostMax { + left: l, right: r, .. + } => { + if is_unknown_cost(l.clone()) { + { + let __tco_0 = l.clone(); + expr = __tco_0; + continue; + } + } else { + { + let __tco_0 = r.clone(); + expr = __tco_0; + continue; + } + } + } + CostExpr::CostSum { body: bd, .. } => { + let __tco_0 = bd.clone(); + expr = __tco_0; + continue; + } + _ => { + break "unknown".to_string(); + } + } + } } -pub fn collect_local_call_edges_in_expr(caller: &String, body: &Rc, local_func_set: &Rc>, si: &Rc>>) -> Rc>> { +pub fn collect_local_call_edges_in_expr( + caller: &String, + body: &Rc, + local_func_set: &Rc>, + si: &Rc>>, +) -> Rc>> { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - { - let this_edges = match (*body.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { + let this_edges = match (*body.expr_data.clone()).clone() { + ExprData::ExprCall { .. } => { let callee = expr_call_func_at(body.clone(), si.clone()); -if set_has(local_func_set.clone(), callee.clone()) { + if set_has(local_func_set.clone(), callee.clone()) { Rc::new(vec![Rc::new(CallEdge { - caller: caller.clone(), - callee: callee.clone(), -})]) + caller: caller.clone(), + callee: callee.clone(), + })]) } else { Rc::new(vec![]) } -}, - _ => Rc::new(vec![]), -}; -let child_edges = Rc::new({ let mut __result = Vec::new(); for child in body.children.clone().iter().cloned() { __result.extend((*collect_local_call_edges_in_expr(&caller, &child, &local_func_set, &si)).iter().cloned()); } __result }); -v2_rt::concat(this_edges, child_edges) -} + } + _ => Rc::new(vec![]), + }; + let child_edges = Rc::new({ + let mut __result = Vec::new(); + for child in body.children.clone().iter().cloned() { + __result.extend( + (*collect_local_call_edges_in_expr(&caller, &child, &local_func_set, &si)) + .iter() + .cloned(), + ); + } + __result + }); + v2_rt::concat(this_edges, child_edges) }) } -pub fn build_call_graph(func_entries: &Rc>>, si: Rc>>) -> Rc { +pub fn build_call_graph( + func_entries: &Rc>>, + si: Rc>>, +) -> Rc { { - let names = Rc::new({ let mut __result = Vec::new(); for entry in func_entries.clone().iter().cloned() { __result.push(entry.name.clone()); } __result }); -let local_func_set = names.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, name: String| v2_rt::rc_map_insert(acc, name.clone(), true)); -let edges = Rc::new({ let mut __result = Vec::new(); for entry in func_entries.clone().iter().cloned() { __result.extend((*collect_local_call_edges_in_expr(&entry.name.clone(), &entry.body.clone(), &local_func_set, &si)).iter().cloned()); } __result }); -let initial_forward = seed_adjacency_map(names.clone()); -let initial_reverse = seed_adjacency_map(names.clone()); -edges.iter().cloned().fold(Rc::new(CallGraph { - forward: initial_forward, - reverse: initial_reverse, -}), |acc: Rc, edge: Rc| { - let forward_neighbors = match v2_rt::map_get(&acc.forward.clone(), edge.caller.clone()) { - Some(ns) => ns.clone(), - None => Rc::new(vec![]), -}; -let reverse_neighbors = match v2_rt::map_get(&acc.reverse.clone(), edge.callee.clone()) { - Some(ns) => ns.clone(), - None => Rc::new(vec![]), -}; -Rc::new(CallGraph { - forward: v2_rt::rc_map_insert(acc.forward.clone(), edge.caller.clone(), v2_rt::rc_list_push(forward_neighbors.clone(), edge.callee.clone())), - reverse: v2_rt::rc_map_insert(acc.reverse.clone(), edge.callee.clone(), v2_rt::rc_list_push(reverse_neighbors.clone(), edge.caller.clone())), -}) -}) -} + let names = Rc::new({ + let mut __result = Vec::new(); + for entry in func_entries.clone().iter().cloned() { + __result.push(entry.name.clone()); + } + __result + }); + let local_func_set = names.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, name: String| { + v2_rt::rc_map_insert(acc, name.clone(), true) + }, + ); + let edges = Rc::new({ + let mut __result = Vec::new(); + for entry in func_entries.clone().iter().cloned() { + __result.extend( + (*collect_local_call_edges_in_expr( + &entry.name.clone(), + &entry.body.clone(), + &local_func_set, + &si, + )) + .iter() + .cloned(), + ); + } + __result + }); + let initial_forward = seed_adjacency_map(names.clone()); + let initial_reverse = seed_adjacency_map(names.clone()); + edges.iter().cloned().fold( + Rc::new(CallGraph { + forward: initial_forward, + reverse: initial_reverse, + }), + |acc: Rc, edge: Rc| { + let forward_neighbors = + match v2_rt::map_get(&acc.forward.clone(), edge.caller.clone()) { + Some(ns) => ns.clone(), + None => Rc::new(vec![]), + }; + let reverse_neighbors = + match v2_rt::map_get(&acc.reverse.clone(), edge.callee.clone()) { + Some(ns) => ns.clone(), + None => Rc::new(vec![]), + }; + Rc::new(CallGraph { + forward: v2_rt::rc_map_insert( + acc.forward.clone(), + edge.caller.clone(), + v2_rt::rc_list_push(forward_neighbors.clone(), edge.callee.clone()), + ), + reverse: v2_rt::rc_map_insert( + acc.reverse.clone(), + edge.callee.clone(), + v2_rt::rc_list_push(reverse_neighbors.clone(), edge.caller.clone()), + ), + }) + }, + ) + } } pub fn scc_label(members: Rc>) -> String { match members.first().cloned() { - Some(name) => name.clone(), - None => "scc".to_string(), -} + Some(name) => name.clone(), + None => "scc".to_string(), + } } -pub fn classify_scc_call_progress(arg_expr: &Rc, param_name: &String, descent_vars: &Rc>, si: &Rc>>) -> DescentEvidence { +pub fn classify_scc_call_progress( + arg_expr: &Rc, + param_name: &String, + descent_vars: &Rc>, + si: &Rc>>, +) -> DescentEvidence { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { if is_child_descent_expr(&arg_expr, ¶m_name, &descent_vars, &si) { DescentEvidence::Strict @@ -2756,314 +5586,715 @@ pub fn classify_scc_call_progress(arg_expr: &Rc, param_name: &String, desc DescentEvidence::Strict } else { match (*arg_expr.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let vname = expr_var_name_at(arg_expr.clone(), si.clone()); -if set_has(descent_vars.clone(), vname.clone()) { - DescentEvidence::Strict - } else { - if (vname.clone().as_str() == param_name.clone().as_str()) { - DescentEvidence::NonIncreasing + ExprData::ExprVar { .. } => { + let vname = expr_var_name_at(arg_expr.clone(), si.clone()); + if set_has(descent_vars.clone(), vname.clone()) { + DescentEvidence::Strict } else { - DescentEvidence::DescentUnknown + if (vname.clone().as_str() == param_name.clone().as_str()) { + DescentEvidence::NonIncreasing + } else { + DescentEvidence::DescentUnknown + } } } -}, - ExprData::ExprCall { .. } => if is_tree_size_preserving_wrapper(&arg_expr, si.clone()) { - classify_scc_call_progress(&wrapper_inner_arg(arg_expr.clone()), ¶m_name, &descent_vars, &si) - } else { - if is_sub_value_extractor(&arg_expr, si.clone()) { - { - let inner_progress = classify_scc_call_progress(&extractor_inner_arg(arg_expr.clone()), ¶m_name, &descent_vars, &si); -match inner_progress.clone() { - DescentEvidence::NonIncreasing => DescentEvidence::Strict, - _ => inner_progress.clone(), -} -} - } else { - if is_list_passthrough_call(arg_expr.clone(), si.clone()) { - match list_passthrough_inner_arg(arg_expr.clone(), si.clone()) { - Some(inner) => classify_scc_call_progress(&inner, ¶m_name, &descent_vars, &si), - None => DescentEvidence::DescentUnknown, -} + ExprData::ExprCall { .. } => { + if is_tree_size_preserving_wrapper(&arg_expr, si.clone()) { + classify_scc_call_progress( + &wrapper_inner_arg(arg_expr.clone()), + ¶m_name, + &descent_vars, + &si, + ) } else { - DescentEvidence::DescentUnknown + if is_sub_value_extractor(&arg_expr, si.clone()) { + { + let inner_progress = classify_scc_call_progress( + &extractor_inner_arg(arg_expr.clone()), + ¶m_name, + &descent_vars, + &si, + ); + match inner_progress.clone() { + DescentEvidence::NonIncreasing => DescentEvidence::Strict, + _ => inner_progress.clone(), + } + } + } else { + if is_list_passthrough_call(arg_expr.clone(), si.clone()) { + match list_passthrough_inner_arg(arg_expr.clone(), si.clone()) { + Some(inner) => classify_scc_call_progress( + &inner, + ¶m_name, + &descent_vars, + &si, + ), + None => DescentEvidence::DescentUnknown, + } + } else { + DescentEvidence::DescentUnknown + } + } } } - }, - ExprData::ExprFieldAccess { .. } => { - let base = field_access_base(arg_expr.clone()); -match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let bname = expr_var_name_at(base.clone(), si.clone()); -if (set_has(descent_vars.clone(), bname.clone()) || (bname.clone().as_str() == param_name.clone().as_str())) { - DescentEvidence::Strict - } else { - { - let field = field_access_field_at(arg_expr.clone(), si.clone()); -if (field.as_str() == param_name.clone().as_str()) { - DescentEvidence::NonIncreasing + ExprData::ExprFieldAccess { .. } => { + let base = field_access_base(arg_expr.clone()); + match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let bname = expr_var_name_at(base.clone(), si.clone()); + if (set_has(descent_vars.clone(), bname.clone()) + || (bname.clone().as_str() == param_name.clone().as_str())) + { + DescentEvidence::Strict } else { - DescentEvidence::DescentUnknown + { + let field = + field_access_field_at(arg_expr.clone(), si.clone()); + if (field.as_str() == param_name.clone().as_str()) { + DescentEvidence::NonIncreasing + } else { + DescentEvidence::DescentUnknown + } + } } -} + } + _ => DescentEvidence::DescentUnknown, } -}, - _ => DescentEvidence::DescentUnknown, -} -}, - ExprData::ExprMethodCall { method_semantics: ms, .. } => if is_generalized_shrink(&arg_expr, si.clone()) { - { - let recv = method_receiver(arg_expr.clone()); -let recv_progress = classify_scc_call_progress(&recv, ¶m_name, &descent_vars, &si); -match recv_progress { - DescentEvidence::Strict => DescentEvidence::Strict, - DescentEvidence::NonIncreasing => DescentEvidence::Strict, - DescentEvidence::DescentUnknown => DescentEvidence::DescentUnknown, -} -} - } else { - DescentEvidence::DescentUnknown - }, - _ => DescentEvidence::DescentUnknown, -} + } + ExprData::ExprMethodCall { + method_semantics: ms, + .. + } => { + if is_generalized_shrink(&arg_expr, si.clone()) { + { + let recv = method_receiver(arg_expr.clone()); + let recv_progress = classify_scc_call_progress( + &recv, + ¶m_name, + &descent_vars, + &si, + ); + match recv_progress { + DescentEvidence::Strict => DescentEvidence::Strict, + DescentEvidence::NonIncreasing => DescentEvidence::Strict, + DescentEvidence::DescentUnknown => { + DescentEvidence::DescentUnknown + } + } + } + } else { + DescentEvidence::DescentUnknown + } + } + _ => DescentEvidence::DescentUnknown, + } } } }) } -pub fn collect_scc_child_edges(body: &Rc, caller: &String, param_name: &String, descent_vars: &Rc>, target_set: &Rc>, check_child: bool, check_list: bool, scc_measure_params: &Rc>>>, si: &Rc>>) -> Rc>> { +pub fn collect_scc_child_edges( + body: &Rc, + caller: &String, + param_name: &String, + descent_vars: &Rc>, + target_set: &Rc>, + check_child: bool, + check_list: bool, + scc_measure_params: &Rc>>>, + si: &Rc>>, +) -> Rc>> { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*body.expr_data.clone()).clone() { - ExprData::ExprLambda => Rc::new(vec![]), - ExprData::ExprCall { .. } => { - let callee = expr_call_func_at(body.clone(), si.clone()); -let own_edges = if set_has(target_set.clone(), callee.clone()) { - { - let callee_params = match v2_rt::map_get(&scc_measure_params, callee.clone()) { - Some(p) => p.clone(), - None => v2_rt::rc_empty_map::(), -}; -let progress = body.children.clone().iter().cloned().fold(DescentEvidence::DescentUnknown, |acc: DescentEvidence, arg_node: Rc| { - let targets_measure = match arg_name_at(arg_node.clone(), si.clone()) { - Some(aname) => (v2_rt::map_get(&callee_params, aname.clone()) != None), - None => false, -}; -if targets_measure.clone() { - { - let arg_progress = classify_scc_call_progress(&arg_value(&arg_node), ¶m_name, &descent_vars, &si); -match arg_progress.clone() { - DescentEvidence::Strict => DescentEvidence::Strict, - DescentEvidence::NonIncreasing => match acc.clone() { - DescentEvidence::Strict => acc.clone(), - _ => DescentEvidence::NonIncreasing, -}, - DescentEvidence::DescentUnknown => acc.clone(), -} -} - } else { - acc.clone() + ExprData::ExprLambda => Rc::new(vec![]), + ExprData::ExprCall { .. } => { + let callee = expr_call_func_at(body.clone(), si.clone()); + let own_edges = if set_has(target_set.clone(), callee.clone()) { + { + let callee_params = + match v2_rt::map_get(&scc_measure_params, callee.clone()) { + Some(p) => p.clone(), + None => v2_rt::rc_empty_map::(), + }; + let progress = body.children.clone().iter().cloned().fold( + DescentEvidence::DescentUnknown, + |acc: DescentEvidence, arg_node: Rc| { + let targets_measure = + match arg_name_at(arg_node.clone(), si.clone()) { + Some(aname) => { + (v2_rt::map_get(&callee_params, aname.clone()) != None) + } + None => false, + }; + if targets_measure.clone() { + { + let arg_progress = classify_scc_call_progress( + &arg_value(&arg_node), + ¶m_name, + &descent_vars, + &si, + ); + match arg_progress.clone() { + DescentEvidence::Strict => DescentEvidence::Strict, + DescentEvidence::NonIncreasing => match acc.clone() { + DescentEvidence::Strict => acc.clone(), + _ => DescentEvidence::NonIncreasing, + }, + DescentEvidence::DescentUnknown => acc.clone(), + } + } + } else { + acc.clone() + } + }, + ); + Rc::new(vec![Rc::new(ParserProgressEdge { + caller: caller.clone(), + callee: callee.clone(), + progress: progress, + })]) + } + } else { + Rc::new(vec![]) + }; + let child_edges = Rc::new({ + let mut __result = Vec::new(); + for child in body.children.clone().iter().cloned() { + __result.extend( + (*collect_scc_child_edges( + &child, + &caller, + ¶m_name, + &descent_vars, + &target_set, + check_child.clone(), + check_list.clone(), + &scc_measure_params, + &si, + )) + .iter() + .cloned(), + ); + } + __result + }); + v2_rt::concat(own_edges, child_edges) + } + ExprData::ExprMethodCall { + method_semantics: ms, + .. + } => { + let receiver = method_receiver(body.clone()); + let is_iter = is_algebra_iteration_method(ms.clone()); + let is_struct = is_structural_children(&receiver, ¶m_name, &descent_vars, &si); + if (is_iter && is_struct) { + { + let recv_edges = collect_scc_child_edges( + &receiver, + &caller, + ¶m_name, + &descent_vars, + &target_set, + check_child.clone(), + check_list.clone(), + &scc_measure_params, + &si, + ); + let args_edges = Rc::new({ + let mut __result = Vec::new(); + for arg_node in method_arg_nodes(body.clone()).iter().cloned() { + __result.extend( + (*{ + let arg_val = arg_value(&arg_node); + match (*arg_val.expr_data.clone()).clone() { + ExprData::ExprLambda => match iteration_element_name( + ms.clone(), + arg_val.clone(), + si.clone(), + ) { + Some(iter_name) => { + let ext_vars = v2_rt::rc_map_insert( + descent_vars.clone(), + iter_name.clone(), + true, + ); + collect_scc_child_edges( + &lambda_body(arg_val.clone()), + &caller, + ¶m_name, + &ext_vars, + &target_set, + check_child.clone(), + check_list.clone(), + &scc_measure_params, + &si, + ) + } + None => Rc::new(vec![]), + }, + _ => collect_scc_child_edges( + &arg_val, + &caller, + ¶m_name, + &descent_vars, + &target_set, + check_child.clone(), + check_list.clone(), + &scc_measure_params, + &si, + ), + } + }) + .iter() + .cloned(), + ); + } + __result + }); + v2_rt::concat(recv_edges, args_edges) + } + } else { + Rc::new({ + let mut __result = Vec::new(); + for child in body.children.clone().iter().cloned() { + __result.extend( + (*collect_scc_child_edges( + &child, + &caller, + ¶m_name, + &descent_vars, + &target_set, + check_child.clone(), + check_list.clone(), + &scc_measure_params, + &si, + )) + .iter() + .cloned(), + ); } -}); -Rc::new(vec![Rc::new(ParserProgressEdge { - caller: caller.clone(), - callee: callee.clone(), - progress: progress, -})]) -} - } else { - Rc::new(vec![]) - }; -let child_edges = Rc::new({ let mut __result = Vec::new(); for child in body.children.clone().iter().cloned() { __result.extend((*collect_scc_child_edges(&child, &caller, ¶m_name, &descent_vars, &target_set, check_child.clone(), check_list.clone(), &scc_measure_params, &si)).iter().cloned()); } __result }); -v2_rt::concat(own_edges, child_edges) -}, - ExprData::ExprMethodCall { method_semantics: ms, .. } => { - let receiver = method_receiver(body.clone()); -let is_iter = is_algebra_iteration_method(ms.clone()); -let is_struct = is_structural_children(&receiver, ¶m_name, &descent_vars, &si); -if (is_iter && is_struct) { - { - let recv_edges = collect_scc_child_edges(&receiver, &caller, ¶m_name, &descent_vars, &target_set, check_child.clone(), check_list.clone(), &scc_measure_params, &si); -let args_edges = Rc::new({ let mut __result = Vec::new(); for arg_node in method_arg_nodes(body.clone()).iter().cloned() { __result.extend((*{ - let arg_val = arg_value(&arg_node); -match (*arg_val.expr_data.clone()).clone() { - ExprData::ExprLambda => match iteration_element_name(ms.clone(), arg_val.clone(), si.clone()) { - Some(iter_name) => { - let ext_vars = v2_rt::rc_map_insert(descent_vars.clone(), iter_name.clone(), true); -collect_scc_child_edges(&lambda_body(arg_val.clone()), &caller, ¶m_name, &ext_vars, &target_set, check_child.clone(), check_list.clone(), &scc_measure_params, &si) -}, - None => Rc::new(vec![]), -}, - _ => collect_scc_child_edges(&arg_val, &caller, ¶m_name, &descent_vars, &target_set, check_child.clone(), check_list.clone(), &scc_measure_params, &si), -} -}).iter().cloned()); } __result }); -v2_rt::concat(recv_edges, args_edges) -} - } else { - Rc::new({ let mut __result = Vec::new(); for child in body.children.clone().iter().cloned() { __result.extend((*collect_scc_child_edges(&child, &caller, ¶m_name, &descent_vars, &target_set, check_child.clone(), check_list.clone(), &scc_measure_params, &si)).iter().cloned()); } __result }) + __result + }) + } } -}, - ExprData::ExprLet => { - let val = let_value(body.clone()); -let val_edges = collect_scc_child_edges(&val, &caller, ¶m_name, &descent_vars, &target_set, check_child.clone(), check_list.clone(), &scc_measure_params, &si); -let is_direct = ((check_child.clone() && is_child_descent_expr(&val, ¶m_name, &descent_vars, &si)) || (check_list.clone() && is_list_shrink_expr(&val, param_name.clone(), si.clone()))); -let is_var = match (*val.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => set_has(descent_vars.clone(), expr_var_name_at(val.clone(), si.clone())), - _ => false, -}; -let is_option = is_if_option_descent(&val, param_name.clone(), descent_vars.clone(), check_child.clone(), check_list.clone(), &si); -let is_match_descent = is_match_option_descent(&val, ¶m_name, descent_vars.clone(), check_child.clone(), check_list.clone(), &si); -let is_wrapped = if is_tree_size_preserving_wrapper(&val, si.clone()) { - { - let inner = wrapper_inner_arg(val.clone()); -let inner_d = ((check_child.clone() && is_child_descent_expr(&inner, ¶m_name, &descent_vars, &si)) || (check_list.clone() && is_list_shrink_expr(&inner, param_name.clone(), si.clone()))); -let inner_v = match (*inner.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => set_has(descent_vars.clone(), expr_var_name_at(inner.clone(), si.clone())), - _ => false, -}; -(inner_d.clone() || inner_v.clone()) -} - } else { - false - }; -let is_extraction = if is_sub_value_extractor(&val, si.clone()) { + ExprData::ExprLet => { + let val = let_value(body.clone()); + let val_edges = collect_scc_child_edges( + &val, + &caller, + ¶m_name, + &descent_vars, + &target_set, + check_child.clone(), + check_list.clone(), + &scc_measure_params, + &si, + ); + let is_direct = ((check_child.clone() + && is_child_descent_expr(&val, ¶m_name, &descent_vars, &si)) + || (check_list.clone() + && is_list_shrink_expr(&val, param_name.clone(), si.clone()))); + let is_var = match (*val.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => set_has( + descent_vars.clone(), + expr_var_name_at(val.clone(), si.clone()), + ), + _ => false, + }; + let is_option = is_if_option_descent( + &val, + param_name.clone(), + descent_vars.clone(), + check_child.clone(), + check_list.clone(), + &si, + ); + let is_match_descent = is_match_option_descent( + &val, + ¶m_name, + descent_vars.clone(), + check_child.clone(), + check_list.clone(), + &si, + ); + let is_wrapped = if is_tree_size_preserving_wrapper(&val, si.clone()) { + { + let inner = wrapper_inner_arg(val.clone()); + let inner_d = ((check_child.clone() + && is_child_descent_expr(&inner, ¶m_name, &descent_vars, &si)) + || (check_list.clone() + && is_list_shrink_expr(&inner, param_name.clone(), si.clone()))); + let inner_v = match (*inner.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => set_has( + descent_vars.clone(), + expr_var_name_at(inner.clone(), si.clone()), + ), + _ => false, + }; + (inner_d.clone() || inner_v.clone()) + } + } else { + false + }; + let is_extraction = if is_sub_value_extractor(&val, si.clone()) { + { + let inner = extractor_inner_arg(val.clone()); + let inner_d = ((check_child.clone() + && is_child_descent_expr(&inner, ¶m_name, &descent_vars, &si)) + || (check_list.clone() + && is_list_shrink_expr(&inner, param_name.clone(), si.clone()))); + let inner_v = match (*inner.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => set_has( + descent_vars.clone(), + expr_var_name_at(inner.clone(), si.clone()), + ), + _ => false, + }; + let inner_p = match (*inner.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + (expr_var_name_at(inner.clone(), si.clone()).as_str() + == param_name.clone().as_str()) + } + _ => false, + }; + ((inner_d.clone() || inner_v.clone()) || inner_p) + } + } else { + false + }; + let is_children_list = match (*val.expr_data.clone()).clone() { + ExprData::ExprFieldAccess { .. } => { + let base = field_access_base(val.clone()); + let field = field_access_field_at(val.clone(), si.clone()); + (is_children_list_field(field) + && match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let bname = expr_var_name_at(base.clone(), si.clone()); + ((bname.clone().as_str() == param_name.clone().as_str()) + || set_has(descent_vars.clone(), bname.clone())) + } + _ => false, + }) + } + _ => false, + }; + let is_passthrough = if is_list_passthrough_call(val.clone(), si.clone()) { + match list_passthrough_inner_arg(val.clone(), si.clone()) { + Some(inner) => { + (((check_child.clone() + && is_child_descent_expr(&inner, ¶m_name, &descent_vars, &si)) + || (check_list.clone() + && is_list_shrink_expr( + &inner, + param_name.clone(), + si.clone(), + ))) + || match (*inner.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => set_has( + descent_vars.clone(), + expr_var_name_at(inner.clone(), si.clone()), + ), + _ => false, + }) + } + None => false, + } + } else { + false + }; + let is_consuming_helper = (check_list.clone() + && is_tokens_consuming_call( + &val, + param_name.clone(), + descent_vars.clone(), + &si, + )); + let next_vars = if ((((((((is_direct || is_var) || is_option) + || is_match_descent) + || is_wrapped) + || is_extraction) + || is_children_list) + || is_passthrough) + || is_consuming_helper) { - let inner = extractor_inner_arg(val.clone()); -let inner_d = ((check_child.clone() && is_child_descent_expr(&inner, ¶m_name, &descent_vars, &si)) || (check_list.clone() && is_list_shrink_expr(&inner, param_name.clone(), si.clone()))); -let inner_v = match (*inner.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => set_has(descent_vars.clone(), expr_var_name_at(inner.clone(), si.clone())), - _ => false, -}; -let inner_p = match (*inner.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => (expr_var_name_at(inner.clone(), si.clone()).as_str() == param_name.clone().as_str()), - _ => false, -}; -((inner_d.clone() || inner_v.clone()) || inner_p) -} - } else { - false - }; -let is_children_list = match (*val.expr_data.clone()).clone() { - ExprData::ExprFieldAccess { .. } => { - let base = field_access_base(val.clone()); -let field = field_access_field_at(val.clone(), si.clone()); -(is_children_list_field(field) && match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let bname = expr_var_name_at(base.clone(), si.clone()); -((bname.clone().as_str() == param_name.clone().as_str()) || set_has(descent_vars.clone(), bname.clone())) -}, - _ => false, -}) -}, - _ => false, -}; -let is_passthrough = if is_list_passthrough_call(val.clone(), si.clone()) { - match list_passthrough_inner_arg(val.clone(), si.clone()) { - Some(inner) => (((check_child.clone() && is_child_descent_expr(&inner, ¶m_name, &descent_vars, &si)) || (check_list.clone() && is_list_shrink_expr(&inner, param_name.clone(), si.clone()))) || match (*inner.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => set_has(descent_vars.clone(), expr_var_name_at(inner.clone(), si.clone())), - _ => false, -}), - None => false, -} - } else { - false - }; -let is_consuming_helper = (check_list.clone() && is_tokens_consuming_call(&val, param_name.clone(), descent_vars.clone(), &si)); -let next_vars = if ((((((((is_direct || is_var) || is_option) || is_match_descent) || is_wrapped) || is_extraction) || is_children_list) || is_passthrough) || is_consuming_helper) { - v2_rt::rc_map_insert(descent_vars.clone(), let_binding_name_at(body.clone(), si.clone()), true) - } else { - descent_vars.clone() - }; -let body_edges = match let_body(body.clone()) { - Some(b) => collect_scc_child_edges(&b, &caller, ¶m_name, &next_vars, &target_set, check_child.clone(), check_list.clone(), &scc_measure_params, &si), - None => Rc::new(vec![]), -}; -v2_rt::concat(val_edges, body_edges) -}, - ExprData::ExprMatch => { - let scrut = match_scrutinee(body.clone()); -let scrut_edges = collect_scc_child_edges(&scrut, &caller, ¶m_name, &descent_vars, &target_set, check_child.clone(), check_list.clone(), &scc_measure_params, &si); -let arms_edges = Rc::new({ let mut __result = Vec::new(); for arm_node in match_arm_nodes(body.clone()).iter().cloned() { __result.extend((*collect_scc_child_edges(&arm_body(&arm_node), &caller, ¶m_name, &descent_vars, &target_set, check_child.clone(), check_list.clone(), &scc_measure_params, &si)).iter().cloned()); } __result }); -v2_rt::concat(scrut_edges, arms_edges) -}, - ExprData::ExprBlock => { - let result = body.children.clone().iter().cloned().fold(Rc::new(SccEdgeBlockAcc { - edges: Rc::new(vec![]), - vars: descent_vars.clone(), -}), |acc: Rc, stmt: Rc| { - let stmt_edges = collect_scc_child_edges(&stmt, &caller, ¶m_name, &acc.vars.clone(), &target_set, check_child.clone(), check_list.clone(), &scc_measure_params, &si); -let next_vars = collect_descent_vars(&stmt, ¶m_name, &acc.vars.clone(), check_child.clone(), check_list.clone(), &si); -Rc::new(SccEdgeBlockAcc { - edges: v2_rt::concat(acc.edges.clone(), stmt_edges.clone()), - vars: next_vars.clone(), -}) -}); -result.edges.clone() -}, - ExprData::ExprIf => { - let cond_edges = collect_scc_child_edges(&if_condition(body.clone()), &caller, ¶m_name, &descent_vars, &target_set, check_child.clone(), check_list.clone(), &scc_measure_params, &si); -let then_branch = if_then_branch(body.clone()); -let else_opt = if_else_branch(body.clone()); -let then_edges = collect_scc_child_edges(&then_branch, &caller, ¶m_name, &descent_vars, &target_set, check_child.clone(), check_list.clone(), &scc_measure_params, &si); -let else_edges = match else_opt { - Some(eb) => collect_scc_child_edges(&eb, &caller, ¶m_name, &descent_vars, &target_set, check_child.clone(), check_list.clone(), &scc_measure_params, &si), - None => Rc::new(vec![]), -}; -v2_rt::concat(cond_edges, v2_rt::concat(then_edges, else_edges)) -}, - _ => Rc::new({ let mut __result = Vec::new(); for child in body.children.clone().iter().cloned() { __result.extend((*collect_scc_child_edges(&child, &caller, ¶m_name, &descent_vars, &target_set, check_child.clone(), check_list.clone(), &scc_measure_params, &si)).iter().cloned()); } __result }), -} + v2_rt::rc_map_insert( + descent_vars.clone(), + let_binding_name_at(body.clone(), si.clone()), + true, + ) + } else { + descent_vars.clone() + }; + let body_edges = match let_body(body.clone()) { + Some(b) => collect_scc_child_edges( + &b, + &caller, + ¶m_name, + &next_vars, + &target_set, + check_child.clone(), + check_list.clone(), + &scc_measure_params, + &si, + ), + None => Rc::new(vec![]), + }; + v2_rt::concat(val_edges, body_edges) + } + ExprData::ExprMatch => { + let scrut = match_scrutinee(body.clone()); + let scrut_edges = collect_scc_child_edges( + &scrut, + &caller, + ¶m_name, + &descent_vars, + &target_set, + check_child.clone(), + check_list.clone(), + &scc_measure_params, + &si, + ); + let arms_edges = Rc::new({ + let mut __result = Vec::new(); + for arm_node in match_arm_nodes(body.clone()).iter().cloned() { + __result.extend( + (*collect_scc_child_edges( + &arm_body(&arm_node), + &caller, + ¶m_name, + &descent_vars, + &target_set, + check_child.clone(), + check_list.clone(), + &scc_measure_params, + &si, + )) + .iter() + .cloned(), + ); + } + __result + }); + v2_rt::concat(scrut_edges, arms_edges) + } + ExprData::ExprBlock => { + let result = body.children.clone().iter().cloned().fold( + Rc::new(SccEdgeBlockAcc { + edges: Rc::new(vec![]), + vars: descent_vars.clone(), + }), + |acc: Rc, stmt: Rc| { + let stmt_edges = collect_scc_child_edges( + &stmt, + &caller, + ¶m_name, + &acc.vars.clone(), + &target_set, + check_child.clone(), + check_list.clone(), + &scc_measure_params, + &si, + ); + let next_vars = collect_descent_vars( + &stmt, + ¶m_name, + &acc.vars.clone(), + check_child.clone(), + check_list.clone(), + &si, + ); + Rc::new(SccEdgeBlockAcc { + edges: v2_rt::concat(acc.edges.clone(), stmt_edges.clone()), + vars: next_vars.clone(), + }) + }, + ); + result.edges.clone() + } + ExprData::ExprIf => { + let cond_edges = collect_scc_child_edges( + &if_condition(body.clone()), + &caller, + ¶m_name, + &descent_vars, + &target_set, + check_child.clone(), + check_list.clone(), + &scc_measure_params, + &si, + ); + let then_branch = if_then_branch(body.clone()); + let else_opt = if_else_branch(body.clone()); + let then_edges = collect_scc_child_edges( + &then_branch, + &caller, + ¶m_name, + &descent_vars, + &target_set, + check_child.clone(), + check_list.clone(), + &scc_measure_params, + &si, + ); + let else_edges = match else_opt { + Some(eb) => collect_scc_child_edges( + &eb, + &caller, + ¶m_name, + &descent_vars, + &target_set, + check_child.clone(), + check_list.clone(), + &scc_measure_params, + &si, + ), + None => Rc::new(vec![]), + }; + v2_rt::concat(cond_edges, v2_rt::concat(then_edges, else_edges)) + } + _ => Rc::new({ + let mut __result = Vec::new(); + for child in body.children.clone().iter().cloned() { + __result.extend( + (*collect_scc_child_edges( + &child, + &caller, + ¶m_name, + &descent_vars, + &target_set, + check_child.clone(), + check_list.clone(), + &scc_measure_params, + &si, + )) + .iter() + .cloned(), + ); + } + __result + }), + } }) } -pub fn is_scc_container_child_descent(members: &Rc>, func_index: &Rc>>, scc_name_set: Rc>, si: &Rc>>) -> bool { +pub fn is_scc_container_child_descent( + members: &Rc>, + func_index: &Rc>>, + scc_name_set: Rc>, + si: &Rc>>, +) -> bool { { - let measure_params = build_scc_measure_params(members.clone(), func_index.clone(), si.clone()); -let edges = Rc::new({ let mut __result = Vec::new(); for name in members.clone().iter().cloned() { __result.extend((*match v2_rt::map_get(&func_index, name.clone()) { - Some(entry) => { - let best_edges = entry.params.clone().iter().cloned().fold(Rc::new(vec![]), |best: _, p: Rc| { - let pname = param_node_name_at(p.clone(), si.clone()); -let descent_vars = collect_descent_vars(&entry.body.clone(), &pname, &v2_rt::rc_empty_map::(), true, true, &si); -let param_edges = collect_scc_child_edges(&entry.body.clone(), &name, &pname, &descent_vars, &scc_name_set, true, true, &measure_params, &si); -let unknown_count = count_unknown_progress_edges(param_edges.clone()); -let best_unknown = count_unknown_progress_edges(best.clone()); -if (((best.clone().len() as i64) == 0) || (unknown_count.clone() < best_unknown.clone())) { - param_edges.clone() - } else { - best.clone() - } -}); -best_edges.clone() -}, - None => Rc::new(vec![]), -}).iter().cloned()); } __result }); -let unknown_edge_count = count_unknown_progress_edges(edges.clone()); -(((unknown_edge_count == 0) && ((edges.clone().len() as i64) > 0)) && (same_progress_subgraph_has_cycle(&members, edges.clone()) == false)) -} + let measure_params = + build_scc_measure_params(members.clone(), func_index.clone(), si.clone()); + let edges = Rc::new({ + let mut __result = Vec::new(); + for name in members.clone().iter().cloned() { + __result.extend( + (*match v2_rt::map_get(&func_index, name.clone()) { + Some(entry) => { + let best_edges = entry.params.clone().iter().cloned().fold( + Rc::new(vec![]), + |best: _, p: Rc| { + let pname = param_node_name_at(p.clone(), si.clone()); + let descent_vars = collect_descent_vars( + &entry.body.clone(), + &pname, + &v2_rt::rc_empty_map::(), + true, + true, + &si, + ); + let param_edges = collect_scc_child_edges( + &entry.body.clone(), + &name, + &pname, + &descent_vars, + &scc_name_set, + true, + true, + &measure_params, + &si, + ); + let unknown_count = + count_unknown_progress_edges(param_edges.clone()); + let best_unknown = count_unknown_progress_edges(best.clone()); + if (((best.clone().len() as i64) == 0) + || (unknown_count.clone() < best_unknown.clone())) + { + param_edges.clone() + } else { + best.clone() + } + }, + ); + best_edges.clone() + } + None => Rc::new(vec![]), + }) + .iter() + .cloned(), + ); + } + __result + }); + let unknown_edge_count = count_unknown_progress_edges(edges.clone()); + (((unknown_edge_count == 0) && ((edges.clone().len() as i64) > 0)) + && (same_progress_subgraph_has_cycle(&members, edges.clone()) == false)) + } } pub fn progress_edge_to_proof_edge(pe: &Rc) -> Rc { Rc::new(ProofEdge { - caller: pe.caller.clone(), - callee: pe.callee.clone(), - evidence: Rc::new(vec![pe.progress.clone()]), -}) + caller: pe.caller.clone(), + callee: pe.callee.clone(), + evidence: Rc::new(vec![pe.progress.clone()]), + }) } pub fn count_unknown_progress_edges(edges: Rc>>) -> i64 { - (Rc::new({ let mut __result = Vec::new(); for e in edges.iter().cloned() { if (e.progress.clone() == DescentEvidence::DescentUnknown) { __result.push(e); } } __result }).len() as i64) + (Rc::new({ + let mut __result = Vec::new(); + for e in edges.iter().cloned() { + if (e.progress.clone() == DescentEvidence::DescentUnknown) { + __result.push(e); + } + } + __result + }) + .len() as i64) } pub fn count_unknown_proof_edges(edges: Rc>>) -> i64 { - (Rc::new({ let mut __result = Vec::new(); for e in edges.iter().cloned() { if match e.evidence.clone().first().cloned() { - Some(DescentEvidence::DescentUnknown) => true, - _ => false, -} { __result.push(e); } } __result }).len() as i64) + (Rc::new({ + let mut __result = Vec::new(); + for e in edges.iter().cloned() { + if match e.evidence.clone().first().cloned() { + Some(DescentEvidence::DescentUnknown) => true, + _ => false, + } { + __result.push(e); + } + } + __result + }) + .len() as i64) } -pub fn collect_scc_proof_edges_for_dim(members: &Rc>, func_index: &Rc>>, scc_name_set: Rc>, check_child: bool, check_list: bool, si: &Rc>>) -> Rc>> { +pub fn collect_scc_proof_edges_for_dim( + members: &Rc>, + func_index: &Rc>>, + scc_name_set: Rc>, + check_child: bool, + check_list: bool, + si: &Rc>>, +) -> Rc>> { { - let measure_params = build_scc_measure_params(members.clone(), func_index.clone(), si.clone()); -Rc::new({ let mut __result = Vec::new(); for name in members.clone().iter().cloned() { __result.extend((*match v2_rt::map_get(&func_index, name.clone()) { + let measure_params = + build_scc_measure_params(members.clone(), func_index.clone(), si.clone()); + Rc::new({ + let mut __result = Vec::new(); + for name in members.clone().iter().cloned() { + __result.extend((*match v2_rt::map_get(&func_index, name.clone()) { Some(entry) => { let best_map = entry.params.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |best: Rc>, p: Rc| { let pname = param_node_name_at(p.clone(), si.clone()); @@ -3085,22 +6316,40 @@ Rc::new(ProofEdge { }); } __result }) }, None => Rc::new(vec![]), -}).iter().cloned()); } __result }) -} +}).iter().cloned()); + } + __result + }) + } } -pub fn merge_edge_evidence(acc_map: Rc>, pe: &Rc) -> Rc> { +pub fn merge_edge_evidence( + acc_map: Rc>, + pe: &Rc, +) -> Rc> { map_evidence_merge_at(&acc_map, &pe.callee.clone(), pe.progress.clone()) } pub fn count_known_in_edge_map(m: &Rc>) -> i64 { - (Rc::new({ let mut __result = Vec::new(); for k in Rc::new(v2_rt::map_keys(&m)).iter().cloned() { if match v2_rt::map_get(&m, k.clone()) { - Some(DescentEvidence::DescentUnknown) => false, - _ => true, -} { __result.push(k); } } __result }).len() as i64) + (Rc::new({ + let mut __result = Vec::new(); + for k in Rc::new(v2_rt::map_keys(&m)).iter().cloned() { + if match v2_rt::map_get(&m, k.clone()) { + Some(DescentEvidence::DescentUnknown) => false, + _ => true, + } { + __result.push(k); + } + } + __result + }) + .len() as i64) } -pub fn pick_best_param_edges(current: Rc>, candidate: Rc>) -> Rc> { +pub fn pick_best_param_edges( + current: Rc>, + candidate: Rc>, +) -> Rc> { if (count_known_in_edge_map(&candidate) > count_known_in_edge_map(¤t)) { candidate.clone() } else { @@ -3108,10 +6357,19 @@ pub fn pick_best_param_edges(current: Rc>, cand } } -pub fn collect_scc_independent_dim_edges(members: &Rc>, func_index: &Rc>>, scc_name_set: Rc>, si: &Rc>>) -> Rc>> { +pub fn collect_scc_independent_dim_edges( + members: &Rc>, + func_index: &Rc>>, + scc_name_set: Rc>, + si: &Rc>>, +) -> Rc>> { { - let measure_params = build_scc_measure_params(members.clone(), func_index.clone(), si.clone()); -Rc::new({ let mut __result = Vec::new(); for name in members.clone().iter().cloned() { __result.extend((*match v2_rt::map_get(&func_index, name.clone()) { + let measure_params = + build_scc_measure_params(members.clone(), func_index.clone(), si.clone()); + Rc::new({ + let mut __result = Vec::new(); + for name in members.clone().iter().cloned() { + __result.extend((*match v2_rt::map_get(&func_index, name.clone()) { Some(entry) => { let tree_edge_map = entry.params.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |best_map: Rc>, p: Rc| { let pname = param_node_name_at(p.clone(), si.clone()); @@ -3146,26 +6404,50 @@ Rc::new(ProofEdge { }); } __result }) }, None => Rc::new(vec![]), -}).iter().cloned()); } __result }) -} +}).iter().cloned()); + } + __result + }) + } } -pub fn collect_scc_parser_proof_edges(members: Rc>, func_index: Rc>>, scc_name_set: Rc>, si: Rc>>) -> Rc>> { +pub fn collect_scc_parser_proof_edges( + members: Rc>, + func_index: Rc>>, + scc_name_set: Rc>, + si: Rc>>, +) -> Rc>> { { let edges = collect_parser_edges_for_scc(&members, &func_index, scc_name_set, &si); -Rc::new({ let mut __result = Vec::new(); for pe in edges.iter().cloned() { __result.push(progress_edge_to_proof_edge(&pe)); } __result }) -} + Rc::new({ + let mut __result = Vec::new(); + for pe in edges.iter().cloned() { + __result.push(progress_edge_to_proof_edge(&pe)); + } + __result + }) + } } -pub fn collect_scc_tree_parser_dim_edges(members: &Rc>, func_index: &Rc>>, scc_name_set: &Rc>, si: &Rc>>) -> Rc>> { +pub fn collect_scc_tree_parser_dim_edges( + members: &Rc>, + func_index: &Rc>>, + scc_name_set: &Rc>, + si: &Rc>>, +) -> Rc>> { { - let all_parser_edges = collect_parser_edges_for_scc(&members, &func_index, scc_name_set.clone(), &si); -if ((all_parser_edges.clone().len() as i64) == 0) { + let all_parser_edges = + collect_parser_edges_for_scc(&members, &func_index, scc_name_set.clone(), &si); + if ((all_parser_edges.clone().len() as i64) == 0) { Rc::new(vec![]) } else { { - let measure_params = build_scc_measure_params(members.clone(), func_index.clone(), si.clone()); -Rc::new({ let mut __result = Vec::new(); for name in members.clone().iter().cloned() { __result.extend((*match v2_rt::map_get(&func_index, name.clone()) { + let measure_params = + build_scc_measure_params(members.clone(), func_index.clone(), si.clone()); + Rc::new({ + let mut __result = Vec::new(); + for name in members.clone().iter().cloned() { + __result.extend((*match v2_rt::map_get(&func_index, name.clone()) { Some(entry) => { let tree_edge_map = entry.params.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |best_map: Rc>, p: Rc| { let pname = param_node_name_at(p.clone(), si.clone()); @@ -3195,16 +6477,28 @@ Rc::new(ProofEdge { }); } __result }) }, None => Rc::new(vec![]), -}).iter().cloned()); } __result }) -} +}).iter().cloned()); + } + __result + }) + } } -} + } } -pub fn collect_scc_cx_l2_tree_edges(members: &Rc>, func_index: &Rc>>, scc_name_set: Rc>, si: &Rc>>) -> Rc>> { +pub fn collect_scc_cx_l2_tree_edges( + members: &Rc>, + func_index: &Rc>>, + scc_name_set: Rc>, + si: &Rc>>, +) -> Rc>> { { - let measure_params = build_scc_measure_params(members.clone(), func_index.clone(), si.clone()); -Rc::new({ let mut __result = Vec::new(); for name in members.clone().iter().cloned() { __result.extend((*match v2_rt::map_get(&func_index, name.clone()) { + let measure_params = + build_scc_measure_params(members.clone(), func_index.clone(), si.clone()); + Rc::new({ + let mut __result = Vec::new(); + for name in members.clone().iter().cloned() { + __result.extend((*match v2_rt::map_get(&func_index, name.clone()) { Some(entry) => { let self_evidence = collect_self_call_evidence(entry.body.clone(), name.clone(), si.clone()); let self_has_calls = ((self_evidence.clone().len() as i64) > 0); @@ -3278,301 +6572,562 @@ Rc::new(vec![Rc::new(ProofEdge { v2_rt::concat(self_edge.clone(), cross_edges.clone()) }, None => Rc::new(vec![]), -}).iter().cloned()); } __result }) -} +}).iter().cloned()); + } + __result + }) + } } -pub fn scc_descending_param(members: Rc>, func_index: Rc>>, si: Rc>>) -> String { - members.iter().cloned().fold("".to_string(), |found: String, name: String| if (found.clone().as_str() != "".to_string().as_str()) { - found.clone() - } else { - match v2_rt::map_get(&func_index, name.clone()) { - Some(entry) => { - let evidence = collect_self_call_evidence(entry.body.clone(), name.clone(), si.clone()); -match evidence.clone().first().cloned() { - Some(call_ev) => call_ev.clone().iter().cloned().fold("".to_string(), |p: String, rel: Rc| if (p.clone().as_str() != "".to_string().as_str()) { - p.clone() +pub fn scc_descending_param( + members: Rc>, + func_index: Rc>>, + si: Rc>>, +) -> String { + members + .iter() + .cloned() + .fold("".to_string(), |found: String, name: String| { + if (found.clone().as_str() != "".to_string().as_str()) { + found.clone() } else { - match (*rel.clone()).clone() { - SubValueRelation::StrictSubValue { field: f, .. } => f.element_type.clone(), - SubValueRelation::IteratedSubValue { field: f, .. } => f.element_type.clone(), - SubValueRelation::ArithmeticDescent { param: ap, .. } => ap.clone(), - _ => "".to_string(), -} - }), - None => "".to_string(), -} -}, - None => "".to_string(), -} - }) + match v2_rt::map_get(&func_index, name.clone()) { + Some(entry) => { + let evidence = collect_self_call_evidence( + entry.body.clone(), + name.clone(), + si.clone(), + ); + match evidence.clone().first().cloned() { + Some(call_ev) => call_ev.clone().iter().cloned().fold( + "".to_string(), + |p: String, rel: Rc| { + if (p.clone().as_str() != "".to_string().as_str()) { + p.clone() + } else { + match (*rel.clone()).clone() { + SubValueRelation::StrictSubValue { + field: f, .. + } => f.element_type.clone(), + SubValueRelation::IteratedSubValue { + field: f, .. + } => f.element_type.clone(), + SubValueRelation::ArithmeticDescent { + param: ap, + .. + } => ap.clone(), + _ => "".to_string(), + } + } + }, + ), + None => "".to_string(), + } + } + None => "".to_string(), + } + } + }) } -pub fn construct_scc_termination_proof(members: &Rc>, func_index: &Rc>>, scc_name_set: &Rc>, si: &Rc>>) -> Option> { +pub fn construct_scc_termination_proof( + members: &Rc>, + func_index: &Rc>>, + scc_name_set: &Rc>, + si: &Rc>>, +) -> Option> { { - let cx_l2_edges = collect_scc_cx_l2_tree_edges(&members, &func_index, scc_name_set.clone(), &si); -let cx_l2_all_known = { let mut __all = true; for e in cx_l2_edges.clone().iter().cloned() { if !(match e.evidence.clone().first().cloned() { - Some(DescentEvidence::DescentUnknown) => false, - _ => true, -}) { __all = false; break; } } __all }; -let cx_l2_param = scc_descending_param(members.clone(), func_index.clone(), si.clone()); -let cx_l2_proof = Rc::new(TerminationProof { - dimensions: Rc::new(vec![Rc::new(RankingDimension::TreeSize { - param: if (cx_l2_param.clone().as_str() != "".to_string().as_str()) { - cx_l2_param.clone() - } else { - "scc".to_string() - }, -})]), -}); -if ((cx_l2_all_known && ((cx_l2_edges.clone().len() as i64) > 0)) && (proof_has_non_descending_cycle(cx_l2_proof.clone(), members.clone(), cx_l2_edges.clone()) == false)) { + let cx_l2_edges = + collect_scc_cx_l2_tree_edges(&members, &func_index, scc_name_set.clone(), &si); + let cx_l2_all_known = { + let mut __all = true; + for e in cx_l2_edges.clone().iter().cloned() { + if !(match e.evidence.clone().first().cloned() { + Some(DescentEvidence::DescentUnknown) => false, + _ => true, + }) { + __all = false; + break; + } + } + __all + }; + let cx_l2_param = scc_descending_param(members.clone(), func_index.clone(), si.clone()); + let cx_l2_proof = Rc::new(TerminationProof { + dimensions: Rc::new(vec![Rc::new(RankingDimension::TreeSize { + param: if (cx_l2_param.clone().as_str() != "".to_string().as_str()) { + cx_l2_param.clone() + } else { + "scc".to_string() + }, + })]), + }); + if ((cx_l2_all_known && ((cx_l2_edges.clone().len() as i64) > 0)) + && (proof_has_non_descending_cycle( + cx_l2_proof.clone(), + members.clone(), + cx_l2_edges.clone(), + ) == false)) + { Some(cx_l2_proof.clone()) } else { { - let tree_edges = collect_scc_proof_edges_for_dim(&members, &func_index, scc_name_set.clone(), true, false, &si); -let tree_all_known = { let mut __all = true; for e in tree_edges.clone().iter().cloned() { if !(match e.evidence.clone().first().cloned() { - Some(DescentEvidence::DescentUnknown) => false, - _ => true, -}) { __all = false; break; } } __all }; -let tree_proof = Rc::new(TerminationProof { - dimensions: Rc::new(vec![Rc::new(RankingDimension::TreeSize { - param: "scc".to_string(), -})]), -}); -if ((tree_all_known && ((tree_edges.clone().len() as i64) > 0)) && (proof_has_non_descending_cycle(tree_proof.clone(), members.clone(), tree_edges.clone()) == false)) { + let tree_edges = collect_scc_proof_edges_for_dim( + &members, + &func_index, + scc_name_set.clone(), + true, + false, + &si, + ); + let tree_all_known = { + let mut __all = true; + for e in tree_edges.clone().iter().cloned() { + if !(match e.evidence.clone().first().cloned() { + Some(DescentEvidence::DescentUnknown) => false, + _ => true, + }) { + __all = false; + break; + } + } + __all + }; + let tree_proof = Rc::new(TerminationProof { + dimensions: Rc::new(vec![Rc::new(RankingDimension::TreeSize { + param: "scc".to_string(), + })]), + }); + if ((tree_all_known && ((tree_edges.clone().len() as i64) > 0)) + && (proof_has_non_descending_cycle( + tree_proof.clone(), + members.clone(), + tree_edges.clone(), + ) == false)) + { Some(tree_proof.clone()) } else { { - let list_edges = collect_scc_proof_edges_for_dim(&members, &func_index, scc_name_set.clone(), false, true, &si); -let list_all_known = { let mut __all = true; for e in list_edges.clone().iter().cloned() { if !(match e.evidence.clone().first().cloned() { - Some(DescentEvidence::DescentUnknown) => false, - _ => true, -}) { __all = false; break; } } __all }; -let list_proof = Rc::new(TerminationProof { - dimensions: Rc::new(vec![Rc::new(RankingDimension::ListLength { - param: "scc".to_string(), -})]), -}); -if ((list_all_known && ((list_edges.clone().len() as i64) > 0)) && (proof_has_non_descending_cycle(list_proof.clone(), members.clone(), list_edges.clone()) == false)) { + let list_edges = collect_scc_proof_edges_for_dim( + &members, + &func_index, + scc_name_set.clone(), + false, + true, + &si, + ); + let list_all_known = { + let mut __all = true; + for e in list_edges.clone().iter().cloned() { + if !(match e.evidence.clone().first().cloned() { + Some(DescentEvidence::DescentUnknown) => false, + _ => true, + }) { + __all = false; + break; + } + } + __all + }; + let list_proof = Rc::new(TerminationProof { + dimensions: Rc::new(vec![Rc::new(RankingDimension::ListLength { + param: "scc".to_string(), + })]), + }); + if ((list_all_known && ((list_edges.clone().len() as i64) > 0)) + && (proof_has_non_descending_cycle( + list_proof.clone(), + members.clone(), + list_edges.clone(), + ) == false)) + { Some(list_proof.clone()) } else { { - let parser_edges = collect_scc_parser_proof_edges(members.clone(), func_index.clone(), scc_name_set.clone(), si.clone()); -let parser_all_known = { let mut __all = true; for e in parser_edges.clone().iter().cloned() { if !(match e.evidence.clone().first().cloned() { - Some(DescentEvidence::DescentUnknown) => false, - _ => true, -}) { __all = false; break; } } __all }; -let parser_proof = Rc::new(TerminationProof { - dimensions: Rc::new(vec![Rc::new(RankingDimension::TokenPosition { - param: "scc".to_string(), -})]), -}); -if ((parser_all_known && ((parser_edges.clone().len() as i64) > 0)) && (proof_has_non_descending_cycle(parser_proof.clone(), members.clone(), parser_edges.clone()) == false)) { + let parser_edges = collect_scc_parser_proof_edges( + members.clone(), + func_index.clone(), + scc_name_set.clone(), + si.clone(), + ); + let parser_all_known = { + let mut __all = true; + for e in parser_edges.clone().iter().cloned() { + if !(match e.evidence.clone().first().cloned() { + Some(DescentEvidence::DescentUnknown) => false, + _ => true, + }) { + __all = false; + break; + } + } + __all + }; + let parser_proof = Rc::new(TerminationProof { + dimensions: Rc::new(vec![Rc::new( + RankingDimension::TokenPosition { + param: "scc".to_string(), + }, + )]), + }); + if ((parser_all_known && ((parser_edges.clone().len() as i64) > 0)) + && (proof_has_non_descending_cycle( + parser_proof.clone(), + members.clone(), + parser_edges.clone(), + ) == false)) + { Some(parser_proof.clone()) } else { { - let lex_edges = collect_scc_independent_dim_edges(&members, &func_index, scc_name_set.clone(), &si); -let lex_all_known = { let mut __all = true; for e in lex_edges.clone().iter().cloned() { if !(match e.evidence.clone().first().cloned() { - Some(ev) => match ev.clone() { - DescentEvidence::DescentUnknown => false, - _ => true, -}, - None => false, -}) { __all = false; break; } } __all }; -let lex_proof = Rc::new(TerminationProof { - dimensions: Rc::new(vec![Rc::new(RankingDimension::TreeSize { - param: "scc".to_string(), -}), Rc::new(RankingDimension::ListLength { - param: "scc".to_string(), -})]), -}); -if ((lex_all_known && ((lex_edges.clone().len() as i64) > 0)) && (proof_has_non_descending_cycle(lex_proof.clone(), members.clone(), lex_edges.clone()) == false)) { + let lex_edges = collect_scc_independent_dim_edges( + &members, + &func_index, + scc_name_set.clone(), + &si, + ); + let lex_all_known = { + let mut __all = true; + for e in lex_edges.clone().iter().cloned() { + if !(match e.evidence.clone().first().cloned() { + Some(ev) => match ev.clone() { + DescentEvidence::DescentUnknown => false, + _ => true, + }, + None => false, + }) { + __all = false; + break; + } + } + __all + }; + let lex_proof = Rc::new(TerminationProof { + dimensions: Rc::new(vec![ + Rc::new(RankingDimension::TreeSize { + param: "scc".to_string(), + }), + Rc::new(RankingDimension::ListLength { + param: "scc".to_string(), + }), + ]), + }); + if ((lex_all_known + && ((lex_edges.clone().len() as i64) > 0)) + && (proof_has_non_descending_cycle( + lex_proof.clone(), + members.clone(), + lex_edges.clone(), + ) == false)) + { Some(lex_proof.clone()) } else { { - let tree_parser_edges = collect_scc_tree_parser_dim_edges(&members, &func_index, &scc_name_set, &si); -let tp_all_known = { let mut __all = true; for e in tree_parser_edges.clone().iter().cloned() { if !(match e.evidence.clone().first().cloned() { - Some(ev) => match ev.clone() { - DescentEvidence::DescentUnknown => false, - _ => true, -}, - None => false, -}) { __all = false; break; } } __all }; -let tp_proof = Rc::new(TerminationProof { - dimensions: Rc::new(vec![Rc::new(RankingDimension::TreeSize { - param: "scc".to_string(), -}), Rc::new(RankingDimension::TokenPosition { - param: "scc".to_string(), -})]), -}); -if ((tp_all_known && ((tree_parser_edges.clone().len() as i64) > 0)) && (proof_has_non_descending_cycle(tp_proof.clone(), members.clone(), tree_parser_edges.clone()) == false)) { + let tree_parser_edges = + collect_scc_tree_parser_dim_edges( + &members, + &func_index, + &scc_name_set, + &si, + ); + let tp_all_known = { + let mut __all = true; + for e in + tree_parser_edges.clone().iter().cloned() + { + if !(match e + .evidence + .clone() + .first() + .cloned() + { + Some(ev) => match ev.clone() { + DescentEvidence::DescentUnknown => { + false + } + _ => true, + }, + None => false, + }) { + __all = false; + break; + } + } + __all + }; + let tp_proof = Rc::new(TerminationProof { + dimensions: Rc::new(vec![ + Rc::new(RankingDimension::TreeSize { + param: "scc".to_string(), + }), + Rc::new(RankingDimension::TokenPosition { + param: "scc".to_string(), + }), + ]), + }); + if ((tp_all_known + && ((tree_parser_edges.clone().len() as i64) + > 0)) + && (proof_has_non_descending_cycle( + tp_proof.clone(), + members.clone(), + tree_parser_edges.clone(), + ) == false)) + { Some(tp_proof.clone()) } else { None } -} + } } -} + } } -} + } } -} + } } -} + } } -} + } } -pub fn classify_scc_recursion_pattern(members: &Rc>, func_index: &Rc>>, si: &Rc>>) -> Rc { +pub fn classify_scc_recursion_pattern( + members: &Rc>, + func_index: &Rc>>, + si: &Rc>>, +) -> Rc { { - let scc_name_set = members.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, name: String| v2_rt::rc_map_insert(acc, name.clone(), true)); -let proof = construct_scc_termination_proof(&members, &func_index, &scc_name_set, &si); -match proof { - Some(p) => lower_call_pattern(proof_to_call_pattern(p.clone())), - None => { - let scc_measure_params = build_scc_measure_params(members.clone(), func_index.clone(), si.clone()); -match classify_parser_scc_recursion_pattern(&members, func_index.clone(), si.clone()) { - Some(parser_target) => parser_target.clone(), - None => { - let all_arithmetic = { let mut __all = true; for name in members.clone().iter().cloned() { if !(match v2_rt::map_get(&func_index, name.clone()) { - Some(entry) => ((max_path_target_calls(entry.body.clone(), scc_name_set.clone(), si.clone()) <= 1) && scc_calls_have_arithmetic_descent(&entry.body.clone(), &scc_name_set, &func_index, &scc_measure_params, &si)), - None => false, -}) { __all = false; break; } } __all }; -if all_arithmetic { - { - let ring_param = match members.clone().first().cloned() { - Some(m0) => match v2_rt::map_get(&scc_measure_params, m0.clone()) { - Some(pmap) => match Rc::new(v2_rt::map_keys(&pmap)).first().cloned() { - Some(k) => k.clone(), - None => "_scc_arithmetic".to_string(), -}, - None => "_scc_arithmetic".to_string(), -}, - None => "_scc_arithmetic".to_string(), -}; -lower_call_pattern(Rc::new(CallPattern::ArithmeticSubtractCall { - steps: Rc::new(PositiveDescentAmount::OneStep), - ring_param: ring_param, -})) -} - } else { - lower_call_pattern(Rc::new(CallPattern::SameArgumentCall)) + let scc_name_set = members.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, name: String| { + v2_rt::rc_map_insert(acc, name.clone(), true) + }, + ); + let proof = construct_scc_termination_proof(&members, &func_index, &scc_name_set, &si); + match proof { + Some(p) => lower_call_pattern(proof_to_call_pattern(p.clone())), + None => { + let scc_measure_params = + build_scc_measure_params(members.clone(), func_index.clone(), si.clone()); + match classify_parser_scc_recursion_pattern( + &members, + func_index.clone(), + si.clone(), + ) { + Some(parser_target) => parser_target.clone(), + None => { + let all_arithmetic = { + let mut __all = true; + for name in members.clone().iter().cloned() { + if !(match v2_rt::map_get(&func_index, name.clone()) { + Some(entry) => { + ((max_path_target_calls( + entry.body.clone(), + scc_name_set.clone(), + si.clone(), + ) <= 1) + && scc_calls_have_arithmetic_descent( + &entry.body.clone(), + &scc_name_set, + &func_index, + &scc_measure_params, + &si, + )) + } + None => false, + }) { + __all = false; + break; + } + } + __all + }; + if all_arithmetic { + { + let ring_param = match members.clone().first().cloned() { + Some(m0) => { + match v2_rt::map_get(&scc_measure_params, m0.clone()) { + Some(pmap) => match Rc::new(v2_rt::map_keys(&pmap)) + .first() + .cloned() + { + Some(k) => k.clone(), + None => "_scc_arithmetic".to_string(), + }, + None => "_scc_arithmetic".to_string(), + } + } + None => "_scc_arithmetic".to_string(), + }; + lower_call_pattern(Rc::new(CallPattern::ArithmeticSubtractCall { + steps: Rc::new(PositiveDescentAmount::OneStep), + ring_param: ring_param, + })) + } + } else { + lower_call_pattern(Rc::new(CallPattern::SameArgumentCall)) + } + } } -}, -} -}, -} -} + } + } + } } -pub fn build_scc_index(func_entries: &Rc>>, func_index: Rc>>, si: &Rc>>) -> Rc { +pub fn build_scc_index( + func_entries: &Rc>>, + func_index: Rc>>, + si: &Rc>>, +) -> Rc { { - let names = Rc::new({ let mut __result = Vec::new(); for entry in func_entries.clone().iter().cloned() { __result.push(entry.name.clone()); } __result }); -let graph = build_call_graph(&func_entries, si.clone()); -let finish = names.clone().iter().cloned().fold(Rc::new(DfsFinishAcc { - visited: v2_rt::rc_empty_map::(), - order: Rc::new(vec![]), -}), |acc: Rc, name: String| dfs_finish_order(&name, &graph.forward.clone(), &acc)); -let topo_order = v2_rt::reverse(finish.order.clone()); -let result = topo_order.clone().iter().cloned().fold(Rc::new(SccBuildAcc { - assigned: v2_rt::rc_empty_map::(), - index: v2_rt::rc_empty_map::>(), -}), |acc: Rc, name: String| if set_has(acc.assigned.clone(), name.clone()) { - acc.clone() - } else { - { - let component = dfs_collect_component(&name, &graph.reverse.clone(), &Rc::new(SccComponentAcc { - visited: acc.assigned.clone(), - members: Rc::new(vec![]), -})); -let member_set = component.members.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |inner: Rc>, member: String| v2_rt::rc_map_insert(inner, member.clone(), true)); -let members = Rc::new({ let mut __result = Vec::new(); for member in names.clone().iter().cloned() { if set_has(member_set.clone(), member.clone()) { __result.push(member); } } __result }); -let next_assigned = component.visited.clone(); -if ((members.clone().len() as i64) > 1) { - { - let info = Rc::new(SccInfo { - members: members.clone(), - member_set: member_set.clone(), - pattern: classify_scc_recursion_pattern(&members, &func_index, &si), -}); -let next_index = members.clone().iter().cloned().fold(acc.index.clone(), |inner: Rc>>, member: String| v2_rt::rc_map_insert(inner, member.clone(), info.clone())); -Rc::new(SccBuildAcc { - assigned: next_assigned.clone(), - index: next_index.clone(), -}) -} + let names = Rc::new({ + let mut __result = Vec::new(); + for entry in func_entries.clone().iter().cloned() { + __result.push(entry.name.clone()); + } + __result + }); + let graph = build_call_graph(&func_entries, si.clone()); + let finish = names.clone().iter().cloned().fold( + Rc::new(DfsFinishAcc { + visited: v2_rt::rc_empty_map::(), + order: Rc::new(vec![]), + }), + |acc: Rc, name: String| { + dfs_finish_order(&name, &graph.forward.clone(), &acc) + }, + ); + let topo_order = v2_rt::reverse(finish.order.clone()); + let result = topo_order.clone().iter().cloned().fold( + Rc::new(SccBuildAcc { + assigned: v2_rt::rc_empty_map::(), + index: v2_rt::rc_empty_map::>(), + }), + |acc: Rc, name: String| { + if set_has(acc.assigned.clone(), name.clone()) { + acc.clone() } else { - Rc::new(SccBuildAcc { - assigned: next_assigned.clone(), - index: acc.index.clone(), -}) + { + let component = dfs_collect_component( + &name, + &graph.reverse.clone(), + &Rc::new(SccComponentAcc { + visited: acc.assigned.clone(), + members: Rc::new(vec![]), + }), + ); + let member_set = component.members.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |inner: Rc>, member: String| { + v2_rt::rc_map_insert(inner, member.clone(), true) + }, + ); + let members = Rc::new({ + let mut __result = Vec::new(); + for member in names.clone().iter().cloned() { + if set_has(member_set.clone(), member.clone()) { + __result.push(member); + } + } + __result + }); + let next_assigned = component.visited.clone(); + if ((members.clone().len() as i64) > 1) { + { + let info = Rc::new(SccInfo { + members: members.clone(), + member_set: member_set.clone(), + pattern: classify_scc_recursion_pattern( + &members, + &func_index, + &si, + ), + }); + let next_index = members.clone().iter().cloned().fold( + acc.index.clone(), + |inner: Rc>>, member: String| { + v2_rt::rc_map_insert(inner, member.clone(), info.clone()) + }, + ); + Rc::new(SccBuildAcc { + assigned: next_assigned.clone(), + index: next_index.clone(), + }) + } + } else { + Rc::new(SccBuildAcc { + assigned: next_assigned.clone(), + index: acc.index.clone(), + }) + } + } } -} - }); -Rc::new(SccResult { - index: result.index.clone(), - topo_order: topo_order.clone(), - processing_order: finish.order.clone(), - call_graph: graph.clone(), -}) -} + }, + ); + Rc::new(SccResult { + index: result.index.clone(), + topo_order: topo_order.clone(), + processing_order: finish.order.clone(), + call_graph: graph.clone(), + }) + } } pub fn cost_seq(a: Rc, b: &Rc) -> Rc { match (*a.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => b.clone(), - _ => match (*b.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => a.clone(), - _ => Rc::new(CostExpr::CostAdd { - left: a.clone(), - right: b.clone(), -}), -}, -} + CostExpr::CostConst { value: 0, .. } => b.clone(), + _ => match (*b.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => a.clone(), + _ => Rc::new(CostExpr::CostAdd { + left: a.clone(), + right: b.clone(), + }), + }, + } } pub fn cost_par(a: Rc, b: &Rc) -> Rc { match (*a.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => b.clone(), - _ => match (*b.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => a.clone(), - _ => Rc::new(CostExpr::CostMax { - left: a.clone(), - right: b.clone(), -}), -}, -} + CostExpr::CostConst { value: 0, .. } => b.clone(), + _ => match (*b.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => a.clone(), + _ => Rc::new(CostExpr::CostMax { + left: a.clone(), + right: b.clone(), + }), + }, + } } pub fn cost_loop(binder: String, iterations: Rc, body: &Rc) -> Rc { match (*body.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => Rc::new(CostExpr::CostConst { - value: 0, -}), - _ => Rc::new(CostExpr::CostSum { - binder: binder, - upper: iterations, - body: body.clone(), -}), -} + CostExpr::CostConst { value: 0, .. } => Rc::new(CostExpr::CostConst { value: 0 }), + _ => Rc::new(CostExpr::CostSum { + binder: binder, + upper: iterations, + body: body.clone(), + }), + } } pub fn cost_conditional(condition: Rc, branches: Rc>>) -> Rc { { - let max_branch = branches.iter().cloned().fold(Rc::new(CostExpr::CostConst { - value: 0, -}), |acc: Rc, b: Rc| cost_par(acc, &b)); -cost_seq(condition, &max_branch) -} + let max_branch = branches.iter().cloned().fold( + Rc::new(CostExpr::CostConst { value: 0 }), + |acc: Rc, b: Rc| cost_par(acc, &b), + ); + cost_seq(condition, &max_branch) + } } pub fn collection_output(binder: String, size: Rc) -> Rc>> { { - let result = seed_cost_map("result".to_string(), cost_loop(binder, size, &Rc::new(CostExpr::CostConst { - value: 1, -}))); -result -} + let result = seed_cost_map( + "result".to_string(), + cost_loop(binder, size, &Rc::new(CostExpr::CostConst { value: 1 })), + ); + result + } } pub fn scalar_output() -> Rc>> { @@ -3584,194 +7139,305 @@ pub fn method_preserves_collection_size(method_semantics: &Option match se.clone() { - Some(CollectionSizeEffect::ShrinkEffect) => true, - Some(CollectionSizeEffect::IdentityEffect) => true, - _ => false, -}, - _ => false, -} + MethodSemantics::AlgebraMethodSemantics { + size_effect: se, .. + } => match se.clone() { + Some(CollectionSizeEffect::ShrinkEffect) => true, + Some(CollectionSizeEffect::IdentityEffect) => true, + _ => false, + }, + _ => false, + } } } -pub fn receiver_size_var(mut recv: Rc, mut si: Rc>>) -> Rc { +pub fn receiver_size_var( + mut recv: Rc, + mut si: Rc>>, +) -> Rc { loop { match (*recv.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { break Rc::new(SizeExpr::SizeLen { - collection: expr_var_name_at(recv.clone(), si), -}); }, - ExprData::ExprFieldAccess { .. } => { break Rc::new(SizeExpr::SizeLen { - collection: field_access_field_at(recv.clone(), si), -}); }, - ExprData::ExprMethodCall { method_semantics, .. } => { let inner_recv = match recv.children.clone().first().cloned() { - Some(r) => r.clone(), - None => recv.clone(), -}; -if method_preserves_collection_size(&method_semantics) { - { - let __tco_0 = inner_recv; -recv = __tco_0; -continue; -} -} else { - break Rc::new(SizeExpr::SizeLen { - collection: "__expr".to_string(), -}); -} }, - _ => { break Rc::new(SizeExpr::SizeLen { - collection: "__expr".to_string(), -}); }, -} -} + ExprData::ExprVar { .. } => { + break Rc::new(SizeExpr::SizeLen { + collection: expr_var_name_at(recv.clone(), si), + }); + } + ExprData::ExprFieldAccess { .. } => { + break Rc::new(SizeExpr::SizeLen { + collection: field_access_field_at(recv.clone(), si), + }); + } + ExprData::ExprMethodCall { + method_semantics, .. + } => { + let inner_recv = match recv.children.clone().first().cloned() { + Some(r) => r.clone(), + None => recv.clone(), + }; + if method_preserves_collection_size(&method_semantics) { + { + let __tco_0 = inner_recv; + recv = __tco_0; + continue; + } + } else { + break Rc::new(SizeExpr::SizeLen { + collection: "__expr".to_string(), + }); + } + } + _ => { + break Rc::new(SizeExpr::SizeLen { + collection: "__expr".to_string(), + }); + } + } + } } pub fn size_binder_name(size: Rc) -> String { match (*size).clone() { - SizeExpr::SizeLen { collection: c, .. } => v2_rt::concat("_".to_string(), c.clone()), - SizeExpr::SizeVar { name: n, .. } => n.clone(), - _ => "_i".to_string(), -} + SizeExpr::SizeLen { collection: c, .. } => v2_rt::concat("_".to_string(), c.clone()), + SizeExpr::SizeVar { name: n, .. } => n.clone(), + _ => "_i".to_string(), + } } -pub fn resolve_lambda_arg(mc_arg_nodes: &Rc>>, si: Rc>>) -> Option> { +pub fn resolve_lambda_arg( + mc_arg_nodes: &Rc>>, + si: Rc>>, +) -> Option> { { - let f_arg = Rc::new({ let mut __result = Vec::new(); for a in mc_arg_nodes.clone().iter().cloned() { if (authored_name_at(si.clone(), &a).as_str() == "f".to_string().as_str()) { __result.push(a); } } __result }).first().cloned(); -match f_arg { - Some(fa) => Some(arg_value(&fa)), - None => Rc::new({ let mut __result = Vec::new(); for a in mc_arg_nodes.clone().iter().cloned() { __result.push(arg_value(&a)); } __result }).first().cloned(), -} -} + let f_arg = Rc::new({ + let mut __result = Vec::new(); + for a in mc_arg_nodes.clone().iter().cloned() { + if (authored_name_at(si.clone(), &a).as_str() == "f".to_string().as_str()) { + __result.push(a); + } + } + __result + }) + .first() + .cloned(); + match f_arg { + Some(fa) => Some(arg_value(&fa)), + None => Rc::new({ + let mut __result = Vec::new(); + for a in mc_arg_nodes.clone().iter().cloned() { + __result.push(arg_value(&a)); + } + __result + }) + .first() + .cloned(), + } + } } -pub fn resolve_callback_cost(lambda_arg: Option>, recv_r: Rc, func_index: &Rc>>, scc_index: Rc>>, parser_always_advancing: Rc>, recursion_ctx: RecursionContext, si: &Rc>>) -> Rc { +pub fn resolve_callback_cost( + lambda_arg: Option>, + recv_r: Rc, + func_index: &Rc>>, + scc_index: Rc>>, + parser_always_advancing: Rc>, + recursion_ctx: RecursionContext, + si: &Rc>>, +) -> Rc { match lambda_arg { - Some(la) => match (*la.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let fn_ref = expr_var_name_at(la.clone(), si.clone()); -match v2_rt::map_get(&func_index, fn_ref.clone()) { - Some(_) => get_or_compute_summary(&fn_ref, &func_index, &scc_index, &recv_r.table.clone(), parser_always_advancing, recursion_ctx, si.clone()), - None => cost_of_expr(&la, &func_index, &scc_index, recv_r.table.clone(), &parser_always_advancing, &recursion_ctx, &si), + Some(la) => match (*la.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let fn_ref = expr_var_name_at(la.clone(), si.clone()); + match v2_rt::map_get(&func_index, fn_ref.clone()) { + Some(_) => get_or_compute_summary( + &fn_ref, + &func_index, + &scc_index, + &recv_r.table.clone(), + parser_always_advancing, + recursion_ctx, + si.clone(), + ), + None => cost_of_expr( + &la, + &func_index, + &scc_index, + recv_r.table.clone(), + &parser_always_advancing, + &recursion_ctx, + &si, + ), + } + } + _ => cost_of_expr( + &la, + &func_index, + &scc_index, + recv_r.table.clone(), + &parser_always_advancing, + &recursion_ctx, + &si, + ), + }, + None => Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: Rc::new(CostExpr::CostConst { value: 1 }), + span: Rc::new(CostExpr::CostConst { value: 1 }), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Conservative, + }), + table: recv_r.table.clone(), + }), + } } -}, - _ => cost_of_expr(&la, &func_index, &scc_index, recv_r.table.clone(), &parser_always_advancing, &recursion_ctx, &si), -}, - None => Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: Rc::new(CostExpr::CostConst { - value: 1, -}), - span: Rc::new(CostExpr::CostConst { - value: 1, -}), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Conservative, -}), - table: recv_r.table.clone(), -}), -} -} - -pub fn cost_of_method_by_shape(shape: CostShape, produces_collection: bool, recv_r: &Rc, mc_args: Rc>>, size: &Rc, binder: &String, func_index: Rc>>, scc_index: Rc>>, parser_always_advancing: Rc>, recursion_ctx: RecursionContext, si: &Rc>>) -> Rc { + +pub fn cost_of_method_by_shape( + shape: CostShape, + produces_collection: bool, + recv_r: &Rc, + mc_args: Rc>>, + size: &Rc, + binder: &String, + func_index: Rc>>, + scc_index: Rc>>, + parser_always_advancing: Rc>, + recursion_ctx: RecursionContext, + si: &Rc>>, +) -> Rc { match shape { - CostShape::ShapeIterateBody => { - let lambda_arg = resolve_lambda_arg(&mc_args, si.clone()); -let body_result = resolve_callback_cost(lambda_arg, recv_r.clone(), &func_index, scc_index, parser_always_advancing, recursion_ctx, &si); -let loop_work = cost_loop(binder.clone(), size.clone(), &body_result.summary.clone().work.clone()); -let os = if (produces_collection == false) { - body_result.summary.clone().output_size.clone() - } else { - { - let r = seed_cost_map("result".to_string(), cost_loop(binder.clone(), size.clone(), &Rc::new(CostExpr::CostConst { - value: 1, -}))); -r -} - }; -Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: cost_seq(recv_r.summary.clone().work.clone(), &loop_work), - span: cost_seq(recv_r.summary.clone().span.clone(), &loop_work), - output_size: os, - certainty: body_result.summary.clone().certainty.clone(), -}), - table: body_result.table.clone(), -}) -}, - CostShape::ShapeSortBody => { - let lambda_arg = resolve_lambda_arg(&mc_args, si.clone()); -let key_result = match lambda_arg { - Some(la) => cost_of_expr(&la, &func_index, &scc_index, recv_r.table.clone(), &parser_always_advancing, &recursion_ctx, &si), - None => Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: Rc::new(CostExpr::CostConst { - value: 1, -}), - span: Rc::new(CostExpr::CostConst { - value: 1, -}), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Proven, -}), - table: recv_r.table.clone(), -}), -}; -let log_factor = Rc::new(CostExpr::CostLog { - base: 2, - argument: size.clone(), -}); -let per_comparison = key_result.summary.clone().work.clone(); -let sort_work = Rc::new(CostExpr::CostMul { - left: cost_loop(binder.clone(), size.clone(), &per_comparison), - right: log_factor, -}); -let sort_os = seed_cost_map("result".to_string(), cost_loop(binder.clone(), size.clone(), &Rc::new(CostExpr::CostConst { - value: 1, -}))); -Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: cost_seq(recv_r.summary.clone().work.clone(), &sort_work), - span: cost_seq(recv_r.summary.clone().span.clone(), &sort_work), - output_size: sort_os, - certainty: key_result.summary.clone().certainty.clone(), -}), - table: key_result.table.clone(), -}) -}, - CostShape::ShapeLinearScan => { - let loop_work = cost_loop(binder.clone(), size.clone(), &Rc::new(CostExpr::CostConst { - value: 1, -})); -let scan_os = if produces_collection { - seed_cost_map("result".to_string(), cost_loop(binder.clone(), size.clone(), &Rc::new(CostExpr::CostConst { - value: 1, -}))) - } else { - v2_rt::rc_empty_map::>() - }; -Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: cost_seq(recv_r.summary.clone().work.clone(), &loop_work), - span: cost_seq(recv_r.summary.clone().span.clone(), &loop_work), - output_size: scan_os, - certainty: recv_r.summary.clone().certainty.clone(), -}), - table: recv_r.table.clone(), -}) -}, - CostShape::ShapeConstant => Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: cost_seq(recv_r.summary.clone().work.clone(), &Rc::new(CostExpr::CostConst { - value: 1, -})), - span: cost_seq(recv_r.summary.clone().span.clone(), &Rc::new(CostExpr::CostConst { - value: 1, -})), - output_size: v2_rt::rc_empty_map::>(), - certainty: recv_r.summary.clone().certainty.clone(), -}), - table: recv_r.table.clone(), -}), -} + CostShape::ShapeIterateBody => { + let lambda_arg = resolve_lambda_arg(&mc_args, si.clone()); + let body_result = resolve_callback_cost( + lambda_arg, + recv_r.clone(), + &func_index, + scc_index, + parser_always_advancing, + recursion_ctx, + &si, + ); + let loop_work = cost_loop( + binder.clone(), + size.clone(), + &body_result.summary.clone().work.clone(), + ); + let os = if (produces_collection == false) { + body_result.summary.clone().output_size.clone() + } else { + { + let r = seed_cost_map( + "result".to_string(), + cost_loop( + binder.clone(), + size.clone(), + &Rc::new(CostExpr::CostConst { value: 1 }), + ), + ); + r + } + }; + Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: cost_seq(recv_r.summary.clone().work.clone(), &loop_work), + span: cost_seq(recv_r.summary.clone().span.clone(), &loop_work), + output_size: os, + certainty: body_result.summary.clone().certainty.clone(), + }), + table: body_result.table.clone(), + }) + } + CostShape::ShapeSortBody => { + let lambda_arg = resolve_lambda_arg(&mc_args, si.clone()); + let key_result = match lambda_arg { + Some(la) => cost_of_expr( + &la, + &func_index, + &scc_index, + recv_r.table.clone(), + &parser_always_advancing, + &recursion_ctx, + &si, + ), + None => Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: Rc::new(CostExpr::CostConst { value: 1 }), + span: Rc::new(CostExpr::CostConst { value: 1 }), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Proven, + }), + table: recv_r.table.clone(), + }), + }; + let log_factor = Rc::new(CostExpr::CostLog { + base: 2, + argument: size.clone(), + }); + let per_comparison = key_result.summary.clone().work.clone(); + let sort_work = Rc::new(CostExpr::CostMul { + left: cost_loop(binder.clone(), size.clone(), &per_comparison), + right: log_factor, + }); + let sort_os = seed_cost_map( + "result".to_string(), + cost_loop( + binder.clone(), + size.clone(), + &Rc::new(CostExpr::CostConst { value: 1 }), + ), + ); + Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: cost_seq(recv_r.summary.clone().work.clone(), &sort_work), + span: cost_seq(recv_r.summary.clone().span.clone(), &sort_work), + output_size: sort_os, + certainty: key_result.summary.clone().certainty.clone(), + }), + table: key_result.table.clone(), + }) + } + CostShape::ShapeLinearScan => { + let loop_work = cost_loop( + binder.clone(), + size.clone(), + &Rc::new(CostExpr::CostConst { value: 1 }), + ); + let scan_os = if produces_collection { + seed_cost_map( + "result".to_string(), + cost_loop( + binder.clone(), + size.clone(), + &Rc::new(CostExpr::CostConst { value: 1 }), + ), + ) + } else { + v2_rt::rc_empty_map::>() + }; + Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: cost_seq(recv_r.summary.clone().work.clone(), &loop_work), + span: cost_seq(recv_r.summary.clone().span.clone(), &loop_work), + output_size: scan_os, + certainty: recv_r.summary.clone().certainty.clone(), + }), + table: recv_r.table.clone(), + }) + } + CostShape::ShapeConstant => Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: cost_seq( + recv_r.summary.clone().work.clone(), + &Rc::new(CostExpr::CostConst { value: 1 }), + ), + span: cost_seq( + recv_r.summary.clone().span.clone(), + &Rc::new(CostExpr::CostConst { value: 1 }), + ), + output_size: v2_rt::rc_empty_map::>(), + certainty: recv_r.summary.clone().certainty.clone(), + }), + table: recv_r.table.clone(), + }), + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -3799,283 +7465,413 @@ pub struct ComplexityReport { pub fn empty_complexity_report() -> Rc { Rc::new(ComplexityReport { - function_classes: v2_rt::rc_empty_map::(), - violations: Rc::new(vec![]), - structural_bounds: Rc::new(vec![]), -}) + function_classes: v2_rt::rc_empty_map::(), + violations: Rc::new(vec![]), + structural_bounds: Rc::new(vec![]), + }) } pub fn simplify_cost(expr: Rc) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*expr.clone()).clone() { - CostExpr::CostConst { .. } => expr.clone(), - CostExpr::CostAdd { left: l, right: r, .. } => { - let sl = simplify_cost(l.clone()); -let sr = simplify_cost(r.clone()); -let simplified = match (*sl.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => sr.clone(), - CostExpr::CostConst { value: a, .. } => match (*sr.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => sl.clone(), - CostExpr::CostConst { value: b, .. } => Rc::new(CostExpr::CostConst { - value: (a.clone() + b.clone()), -}), - _ => Rc::new(CostExpr::CostAdd { - left: sl.clone(), - right: sr.clone(), -}), -}, - _ => match (*sr.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => sl.clone(), - _ => Rc::new(CostExpr::CostAdd { - left: sl.clone(), - right: sr.clone(), -}), -}, -}; -simplified -}, - CostExpr::CostMul { left: l, right: r, .. } => { - let sl = simplify_cost(l.clone()); -let sr = simplify_cost(r.clone()); -let simplified = match (*sl.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => Rc::new(CostExpr::CostConst { - value: 0, -}), - CostExpr::CostConst { value: 1, .. } => sr.clone(), - _ => match (*sr.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => Rc::new(CostExpr::CostConst { - value: 0, -}), - CostExpr::CostConst { value: 1, .. } => sl.clone(), - _ => Rc::new(CostExpr::CostMul { - left: sl.clone(), - right: sr.clone(), -}), -}, -}; -simplified -}, - CostExpr::CostMax { left: l, right: r, .. } => { - let sl = simplify_cost(l.clone()); -let sr = simplify_cost(r.clone()); -let simplified = match (*sl.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => sr.clone(), - CostExpr::CostConst { value: a, .. } => match (*sr.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => sl.clone(), - CostExpr::CostConst { value: b, .. } => if (a.clone() > b.clone()) { - sl.clone() - } else { - sr.clone() - }, - _ => Rc::new(CostExpr::CostMax { - left: sl.clone(), - right: sr.clone(), -}), -}, - _ => match (*sr.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => sl.clone(), - _ => Rc::new(CostExpr::CostMax { - left: sl.clone(), - right: sr.clone(), -}), -}, -}; -simplified -}, - CostExpr::CostSum { binder: b, upper: u, body: bd, .. } => { - let sbd = simplify_cost(bd.clone()); -match (*sbd.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => Rc::new(CostExpr::CostConst { - value: 0, -}), - _ => Rc::new(CostExpr::CostSum { - binder: b.clone(), - upper: u.clone(), - body: sbd.clone(), -}), -} -}, - CostExpr::CostLog { base: b, argument: a, .. } => Rc::new(CostExpr::CostLog { - base: b.clone(), - argument: a.clone(), -}), - CostExpr::CostExtern { .. } => expr.clone(), - CostExpr::CostUnknown { .. } => expr.clone(), -} + CostExpr::CostConst { .. } => expr.clone(), + CostExpr::CostAdd { + left: l, right: r, .. + } => { + let sl = simplify_cost(l.clone()); + let sr = simplify_cost(r.clone()); + let simplified = match (*sl.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => sr.clone(), + CostExpr::CostConst { value: a, .. } => match (*sr.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => sl.clone(), + CostExpr::CostConst { value: b, .. } => Rc::new(CostExpr::CostConst { + value: (a.clone() + b.clone()), + }), + _ => Rc::new(CostExpr::CostAdd { + left: sl.clone(), + right: sr.clone(), + }), + }, + _ => match (*sr.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => sl.clone(), + _ => Rc::new(CostExpr::CostAdd { + left: sl.clone(), + right: sr.clone(), + }), + }, + }; + simplified + } + CostExpr::CostMul { + left: l, right: r, .. + } => { + let sl = simplify_cost(l.clone()); + let sr = simplify_cost(r.clone()); + let simplified = match (*sl.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => { + Rc::new(CostExpr::CostConst { value: 0 }) + } + CostExpr::CostConst { value: 1, .. } => sr.clone(), + _ => match (*sr.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => { + Rc::new(CostExpr::CostConst { value: 0 }) + } + CostExpr::CostConst { value: 1, .. } => sl.clone(), + _ => Rc::new(CostExpr::CostMul { + left: sl.clone(), + right: sr.clone(), + }), + }, + }; + simplified + } + CostExpr::CostMax { + left: l, right: r, .. + } => { + let sl = simplify_cost(l.clone()); + let sr = simplify_cost(r.clone()); + let simplified = match (*sl.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => sr.clone(), + CostExpr::CostConst { value: a, .. } => match (*sr.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => sl.clone(), + CostExpr::CostConst { value: b, .. } => { + if (a.clone() > b.clone()) { + sl.clone() + } else { + sr.clone() + } + } + _ => Rc::new(CostExpr::CostMax { + left: sl.clone(), + right: sr.clone(), + }), + }, + _ => match (*sr.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => sl.clone(), + _ => Rc::new(CostExpr::CostMax { + left: sl.clone(), + right: sr.clone(), + }), + }, + }; + simplified + } + CostExpr::CostSum { + binder: b, + upper: u, + body: bd, + .. + } => { + let sbd = simplify_cost(bd.clone()); + match (*sbd.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => { + Rc::new(CostExpr::CostConst { value: 0 }) + } + _ => Rc::new(CostExpr::CostSum { + binder: b.clone(), + upper: u.clone(), + body: sbd.clone(), + }), + } + } + CostExpr::CostLog { + base: b, + argument: a, + .. + } => Rc::new(CostExpr::CostLog { + base: b.clone(), + argument: a.clone(), + }), + CostExpr::CostExtern { .. } => expr.clone(), + CostExpr::CostUnknown { .. } => expr.clone(), + } }) } pub fn format_size(size: Rc) -> String { - stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - match (*size).clone() { - SizeExpr::SizeLen { collection: c, .. } => v2_rt::concat(v2_rt::concat("|".to_string(), c.clone()), "|".to_string()), - SizeExpr::SizeVar { name: n, .. } => n.clone(), - SizeExpr::SizeConst { value: v, .. } => (v.clone()).to_string(), - SizeExpr::SizeAdd { left: l, right: r, .. } => v2_rt::concat(v2_rt::concat(format_size(l.clone()), " + ".to_string()), format_size(r.clone())), - SizeExpr::SizeMax { left: l, right: r, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("max(".to_string(), format_size(l.clone())), ", ".to_string()), format_size(r.clone())), ")".to_string()), -} + stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || match (*size).clone() { + SizeExpr::SizeLen { collection: c, .. } => { + v2_rt::concat(v2_rt::concat("|".to_string(), c.clone()), "|".to_string()) + } + SizeExpr::SizeVar { name: n, .. } => n.clone(), + SizeExpr::SizeConst { value: v, .. } => (v.clone()).to_string(), + SizeExpr::SizeAdd { + left: l, right: r, .. + } => v2_rt::concat( + v2_rt::concat(format_size(l.clone()), " + ".to_string()), + format_size(r.clone()), + ), + SizeExpr::SizeMax { + left: l, right: r, .. + } => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("max(".to_string(), format_size(l.clone())), + ", ".to_string(), + ), + format_size(r.clone()), + ), + ")".to_string(), + ), }) } pub fn normalize_asymptotic(expr: Rc) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*expr.clone()).clone() { - CostExpr::CostConst { value: v, .. } => if (v.clone() <= 0) { - Rc::new(CostExpr::CostConst { - value: 0, -}) - } else { - Rc::new(CostExpr::CostConst { - value: 1, -}) - }, - CostExpr::CostAdd { left: l, right: r, .. } => { - let nl = normalize_asymptotic(l.clone()); -let nr = normalize_asymptotic(r.clone()); -if (nl.clone() == nr.clone()) { - nl.clone() - } else { - match (*nl.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => nr.clone(), - CostExpr::CostConst { .. } => match (*nr.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => nl.clone(), - CostExpr::CostConst { .. } => Rc::new(CostExpr::CostConst { - value: 1, -}), - _ => nr.clone(), -}, - _ => match (*nr.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => nl.clone(), - CostExpr::CostConst { .. } => nl.clone(), - _ => Rc::new(CostExpr::CostAdd { - left: nl.clone(), - right: nr.clone(), -}), -}, -} + CostExpr::CostConst { value: v, .. } => { + if (v.clone() <= 0) { + Rc::new(CostExpr::CostConst { value: 0 }) + } else { + Rc::new(CostExpr::CostConst { value: 1 }) + } } -}, - CostExpr::CostMax { left: l, right: r, .. } => { - let nl = normalize_asymptotic(l.clone()); -let nr = normalize_asymptotic(r.clone()); -if (nl.clone() == nr.clone()) { - nl.clone() - } else { + CostExpr::CostAdd { + left: l, right: r, .. + } => { + let nl = normalize_asymptotic(l.clone()); + let nr = normalize_asymptotic(r.clone()); + if (nl.clone() == nr.clone()) { + nl.clone() + } else { + match (*nl.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => nr.clone(), + CostExpr::CostConst { .. } => match (*nr.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => nl.clone(), + CostExpr::CostConst { .. } => Rc::new(CostExpr::CostConst { value: 1 }), + _ => nr.clone(), + }, + _ => match (*nr.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => nl.clone(), + CostExpr::CostConst { .. } => nl.clone(), + _ => Rc::new(CostExpr::CostAdd { + left: nl.clone(), + right: nr.clone(), + }), + }, + } + } + } + CostExpr::CostMax { + left: l, right: r, .. + } => { + let nl = normalize_asymptotic(l.clone()); + let nr = normalize_asymptotic(r.clone()); + if (nl.clone() == nr.clone()) { + nl.clone() + } else { + match (*nl.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => nr.clone(), + CostExpr::CostConst { .. } => match (*nr.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => nl.clone(), + CostExpr::CostConst { .. } => Rc::new(CostExpr::CostConst { value: 1 }), + _ => nr.clone(), + }, + _ => match (*nr.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => nl.clone(), + CostExpr::CostConst { .. } => nl.clone(), + _ => Rc::new(CostExpr::CostMax { + left: nl.clone(), + right: nr.clone(), + }), + }, + } + } + } + CostExpr::CostMul { + left: l, right: r, .. + } => { + let nl = normalize_asymptotic(l.clone()); + let nr = normalize_asymptotic(r.clone()); match (*nl.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => nr.clone(), - CostExpr::CostConst { .. } => match (*nr.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => nl.clone(), - CostExpr::CostConst { .. } => Rc::new(CostExpr::CostConst { - value: 1, -}), - _ => nr.clone(), -}, - _ => match (*nr.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => nl.clone(), - CostExpr::CostConst { .. } => nl.clone(), - _ => Rc::new(CostExpr::CostMax { - left: nl.clone(), - right: nr.clone(), -}), -}, -} + CostExpr::CostConst { value: 0, .. } => { + Rc::new(CostExpr::CostConst { value: 0 }) + } + CostExpr::CostConst { .. } => nr.clone(), + _ => match (*nr.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => { + Rc::new(CostExpr::CostConst { value: 0 }) + } + CostExpr::CostConst { .. } => nl.clone(), + _ => Rc::new(CostExpr::CostMul { + left: nl.clone(), + right: nr.clone(), + }), + }, + } } -}, - CostExpr::CostMul { left: l, right: r, .. } => { - let nl = normalize_asymptotic(l.clone()); -let nr = normalize_asymptotic(r.clone()); -match (*nl.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => Rc::new(CostExpr::CostConst { - value: 0, -}), - CostExpr::CostConst { .. } => nr.clone(), - _ => match (*nr.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => Rc::new(CostExpr::CostConst { - value: 0, -}), - CostExpr::CostConst { .. } => nl.clone(), - _ => Rc::new(CostExpr::CostMul { - left: nl.clone(), - right: nr.clone(), -}), -}, -} -}, - CostExpr::CostSum { binder: b, upper: u, body: bd, .. } => { - let nbd = normalize_asymptotic(bd.clone()); -match (*nbd.clone()).clone() { - CostExpr::CostConst { value: 0, .. } => Rc::new(CostExpr::CostConst { - value: 0, -}), - _ => match (*u.clone()).clone() { - SizeExpr::SizeConst { .. } => nbd.clone(), - _ => Rc::new(CostExpr::CostSum { - binder: b.clone(), - upper: u.clone(), - body: nbd.clone(), -}), -}, -} -}, - CostExpr::CostLog { base: b, argument: a, .. } => Rc::new(CostExpr::CostLog { - base: b.clone(), - argument: a.clone(), -}), - CostExpr::CostExtern { .. } => expr.clone(), - CostExpr::CostUnknown { .. } => expr.clone(), -} + CostExpr::CostSum { + binder: b, + upper: u, + body: bd, + .. + } => { + let nbd = normalize_asymptotic(bd.clone()); + match (*nbd.clone()).clone() { + CostExpr::CostConst { value: 0, .. } => { + Rc::new(CostExpr::CostConst { value: 0 }) + } + _ => match (*u.clone()).clone() { + SizeExpr::SizeConst { .. } => nbd.clone(), + _ => Rc::new(CostExpr::CostSum { + binder: b.clone(), + upper: u.clone(), + body: nbd.clone(), + }), + }, + } + } + CostExpr::CostLog { + base: b, + argument: a, + .. + } => Rc::new(CostExpr::CostLog { + base: b.clone(), + argument: a.clone(), + }), + CostExpr::CostExtern { .. } => expr.clone(), + CostExpr::CostUnknown { .. } => expr.clone(), + } }) } pub fn format_cost_class(expr: Rc) -> String { match (*expr).clone() { - CostExpr::CostConst { .. } => "O(1)".to_string(), - CostExpr::CostExtern { name: n, .. } => v2_rt::concat(v2_rt::concat("O(extern(".to_string(), n.clone()), "))".to_string()), - CostExpr::CostUnknown { .. } => "O(?)".to_string(), - CostExpr::CostSum { upper: u, body: bd, .. } => match (*bd.clone()).clone() { - CostExpr::CostConst { .. } => v2_rt::concat(v2_rt::concat("O(".to_string(), format_size(u.clone())), ")".to_string()), - _ => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("O(".to_string(), format_size(u.clone())), " * ".to_string()), format_cost_inner(bd.clone())), ")".to_string()), -}, - CostExpr::CostAdd { left: l, right: r, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("O(".to_string(), format_cost_inner(l.clone())), " + ".to_string()), format_cost_inner(r.clone())), ")".to_string()), - CostExpr::CostMul { left: l, right: r, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("O(".to_string(), parenthesize_additive_cost(&l)), " * ".to_string()), parenthesize_additive_cost(&r)), ")".to_string()), - CostExpr::CostMax { left: l, right: r, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("O(max(".to_string(), format_cost_inner(l.clone())), ", ".to_string()), format_cost_inner(r.clone())), "))".to_string()), - CostExpr::CostLog { argument: a, .. } => v2_rt::concat(v2_rt::concat("O(log ".to_string(), format_size(a.clone())), ")".to_string()), -} + CostExpr::CostConst { .. } => "O(1)".to_string(), + CostExpr::CostExtern { name: n, .. } => v2_rt::concat( + v2_rt::concat("O(extern(".to_string(), n.clone()), + "))".to_string(), + ), + CostExpr::CostUnknown { .. } => "O(?)".to_string(), + CostExpr::CostSum { + upper: u, body: bd, .. + } => match (*bd.clone()).clone() { + CostExpr::CostConst { .. } => v2_rt::concat( + v2_rt::concat("O(".to_string(), format_size(u.clone())), + ")".to_string(), + ), + _ => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("O(".to_string(), format_size(u.clone())), + " * ".to_string(), + ), + format_cost_inner(bd.clone()), + ), + ")".to_string(), + ), + }, + CostExpr::CostAdd { + left: l, right: r, .. + } => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("O(".to_string(), format_cost_inner(l.clone())), + " + ".to_string(), + ), + format_cost_inner(r.clone()), + ), + ")".to_string(), + ), + CostExpr::CostMul { + left: l, right: r, .. + } => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("O(".to_string(), parenthesize_additive_cost(&l)), + " * ".to_string(), + ), + parenthesize_additive_cost(&r), + ), + ")".to_string(), + ), + CostExpr::CostMax { + left: l, right: r, .. + } => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("O(max(".to_string(), format_cost_inner(l.clone())), + ", ".to_string(), + ), + format_cost_inner(r.clone()), + ), + "))".to_string(), + ), + CostExpr::CostLog { argument: a, .. } => v2_rt::concat( + v2_rt::concat("O(log ".to_string(), format_size(a.clone())), + ")".to_string(), + ), + } } pub fn format_cost_inner(expr: Rc) -> String { - stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - match (*expr).clone() { - CostExpr::CostConst { .. } => "1".to_string(), - CostExpr::CostSum { upper: u, body: bd, .. } => match (*bd.clone()).clone() { - CostExpr::CostConst { .. } => format_size(u.clone()), - _ => v2_rt::concat(v2_rt::concat(format_size(u.clone()), " * ".to_string()), format_cost_inner(bd.clone())), -}, - CostExpr::CostAdd { left: l, right: r, .. } => v2_rt::concat(v2_rt::concat(format_cost_inner(l.clone()), " + ".to_string()), format_cost_inner(r.clone())), - CostExpr::CostMul { left: l, right: r, .. } => { + stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || match (*expr).clone() { + CostExpr::CostConst { .. } => "1".to_string(), + CostExpr::CostSum { + upper: u, body: bd, .. + } => match (*bd.clone()).clone() { + CostExpr::CostConst { .. } => format_size(u.clone()), + _ => v2_rt::concat( + v2_rt::concat(format_size(u.clone()), " * ".to_string()), + format_cost_inner(bd.clone()), + ), + }, + CostExpr::CostAdd { + left: l, right: r, .. + } => v2_rt::concat( + v2_rt::concat(format_cost_inner(l.clone()), " + ".to_string()), + format_cost_inner(r.clone()), + ), + CostExpr::CostMul { + left: l, right: r, .. + } => { let left_str = match (*l.clone()).clone() { - CostExpr::CostAdd { .. } => v2_rt::concat(v2_rt::concat("(".to_string(), format_cost_inner(l.clone())), ")".to_string()), - _ => format_cost_inner(l.clone()), -}; -let right_str = match (*r.clone()).clone() { - CostExpr::CostAdd { .. } => v2_rt::concat(v2_rt::concat("(".to_string(), format_cost_inner(r.clone())), ")".to_string()), - _ => format_cost_inner(r.clone()), -}; -v2_rt::concat(v2_rt::concat(left_str, " * ".to_string()), right_str) -}, - CostExpr::CostMax { left: l, right: r, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("max(".to_string(), format_cost_inner(l.clone())), ", ".to_string()), format_cost_inner(r.clone())), ")".to_string()), - CostExpr::CostLog { argument: a, .. } => v2_rt::concat("log ".to_string(), format_size(a.clone())), - CostExpr::CostExtern { name: n, .. } => v2_rt::concat(v2_rt::concat("extern(".to_string(), n.clone()), ")".to_string()), - CostExpr::CostUnknown { .. } => "?".to_string(), -} + CostExpr::CostAdd { .. } => v2_rt::concat( + v2_rt::concat("(".to_string(), format_cost_inner(l.clone())), + ")".to_string(), + ), + _ => format_cost_inner(l.clone()), + }; + let right_str = match (*r.clone()).clone() { + CostExpr::CostAdd { .. } => v2_rt::concat( + v2_rt::concat("(".to_string(), format_cost_inner(r.clone())), + ")".to_string(), + ), + _ => format_cost_inner(r.clone()), + }; + v2_rt::concat(v2_rt::concat(left_str, " * ".to_string()), right_str) + } + CostExpr::CostMax { + left: l, right: r, .. + } => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("max(".to_string(), format_cost_inner(l.clone())), + ", ".to_string(), + ), + format_cost_inner(r.clone()), + ), + ")".to_string(), + ), + CostExpr::CostLog { argument: a, .. } => { + v2_rt::concat("log ".to_string(), format_size(a.clone())) + } + CostExpr::CostExtern { name: n, .. } => v2_rt::concat( + v2_rt::concat("extern(".to_string(), n.clone()), + ")".to_string(), + ), + CostExpr::CostUnknown { .. } => "?".to_string(), }) } pub fn parenthesize_additive_cost(expr: &Rc) -> String { match (*expr.clone()).clone() { - CostExpr::CostAdd { .. } => v2_rt::concat(v2_rt::concat("(".to_string(), format_cost_inner(expr.clone())), ")".to_string()), - _ => format_cost_inner(expr.clone()), -} + CostExpr::CostAdd { .. } => v2_rt::concat( + v2_rt::concat("(".to_string(), format_cost_inner(expr.clone())), + ")".to_string(), + ), + _ => format_cost_inner(expr.clone()), + } } pub fn short_var_name(index: i64) -> String { @@ -4109,7 +7905,10 @@ pub fn short_var_name(index: i64) -> String { if (index.clone() == 9) { "w".to_string() } else { - v2_rt::concat("x".to_string(), (index.clone()).to_string()) + v2_rt::concat( + "x".to_string(), + (index.clone()).to_string(), + ) } } } @@ -4131,146 +7930,214 @@ pub struct Legend { pub fn build_legend(size_names: Rc>) -> Rc { { let unique = deduplicate(size_names); -if ((unique.clone().len() as i64) == 0) { + if ((unique.clone().len() as i64) == 0) { Rc::new(Legend { - substitution: v2_rt::rc_empty_map::(), - suffix: "".to_string(), -}) + substitution: v2_rt::rc_empty_map::(), + suffix: "".to_string(), + }) } else { if ((unique.clone().len() as i64) == 1) { match unique.clone().first().cloned() { - Some(name) => Rc::new(Legend { - substitution: v2_rt::rc_map_insert(v2_rt::rc_empty_map::(), name.clone(), "n".to_string()), - suffix: "".to_string(), -}), - None => Rc::new(Legend { - substitution: v2_rt::rc_empty_map::(), - suffix: "".to_string(), -}), -} + Some(name) => Rc::new(Legend { + substitution: v2_rt::rc_map_insert( + v2_rt::rc_empty_map::(), + name.clone(), + "n".to_string(), + ), + suffix: "".to_string(), + }), + None => Rc::new(Legend { + substitution: v2_rt::rc_empty_map::(), + suffix: "".to_string(), + }), + } } else { { - let indexed = unique.clone().iter().cloned().fold(Rc::new(Legend { - substitution: v2_rt::rc_empty_map::(), - suffix: "".to_string(), -}), |acc: Rc, name: String| { - let idx = (Rc::new(v2_rt::map_keys(&acc.substitution.clone())).len() as i64); -let short = short_var_name(idx.clone()); -Rc::new(Legend { - substitution: v2_rt::rc_map_insert(acc.substitution.clone(), name.clone(), short.clone()), - suffix: if (acc.suffix.clone().as_str() == "".to_string().as_str()) { - v2_rt::concat(v2_rt::concat(v2_rt::concat(" where ".to_string(), short.clone()), " = ".to_string()), name.clone()) - } else { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(acc.suffix.clone(), ", ".to_string()), short.clone()), " = ".to_string()), name.clone()) + let indexed = unique.clone().iter().cloned().fold( + Rc::new(Legend { + substitution: v2_rt::rc_empty_map::(), + suffix: "".to_string(), + }), + |acc: Rc, name: String| { + let idx = + (Rc::new(v2_rt::map_keys(&acc.substitution.clone())).len() as i64); + let short = short_var_name(idx.clone()); + Rc::new(Legend { + substitution: v2_rt::rc_map_insert( + acc.substitution.clone(), + name.clone(), + short.clone(), + ), + suffix: if (acc.suffix.clone().as_str() == "".to_string().as_str()) + { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(" where ".to_string(), short.clone()), + " = ".to_string(), + ), + name.clone(), + ) + } else { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(acc.suffix.clone(), ", ".to_string()), + short.clone(), + ), + " = ".to_string(), + ), + name.clone(), + ) + }, + }) }, -}) -}); -indexed -} + ); + indexed + } } } -} + } } pub fn substitute_size(size: Rc, legend: &Rc>) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*size.clone()).clone() { - SizeExpr::SizeLen { collection: c, .. } => match v2_rt::map_get(&legend, c.clone()) { - Some(short) => Rc::new(SizeExpr::SizeVar { - name: short.clone(), -}), - None => size.clone(), -}, - SizeExpr::SizeVar { name: n, .. } => match v2_rt::map_get(&legend, n.clone()) { - Some(short) => Rc::new(SizeExpr::SizeVar { - name: short.clone(), -}), - None => size.clone(), -}, - SizeExpr::SizeAdd { left: l, right: r, .. } => Rc::new(SizeExpr::SizeAdd { - left: substitute_size(l.clone(), &legend), - right: substitute_size(r.clone(), &legend), -}), - SizeExpr::SizeMax { left: l, right: r, .. } => Rc::new(SizeExpr::SizeMax { - left: substitute_size(l.clone(), &legend), - right: substitute_size(r.clone(), &legend), -}), - SizeExpr::SizeConst { .. } => size.clone(), -} + SizeExpr::SizeLen { collection: c, .. } => match v2_rt::map_get(&legend, c.clone()) { + Some(short) => Rc::new(SizeExpr::SizeVar { + name: short.clone(), + }), + None => size.clone(), + }, + SizeExpr::SizeVar { name: n, .. } => match v2_rt::map_get(&legend, n.clone()) { + Some(short) => Rc::new(SizeExpr::SizeVar { + name: short.clone(), + }), + None => size.clone(), + }, + SizeExpr::SizeAdd { + left: l, right: r, .. + } => Rc::new(SizeExpr::SizeAdd { + left: substitute_size(l.clone(), &legend), + right: substitute_size(r.clone(), &legend), + }), + SizeExpr::SizeMax { + left: l, right: r, .. + } => Rc::new(SizeExpr::SizeMax { + left: substitute_size(l.clone(), &legend), + right: substitute_size(r.clone(), &legend), + }), + SizeExpr::SizeConst { .. } => size.clone(), + } }) } pub fn substitute_cost(expr: Rc, legend: &Rc>) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*expr.clone()).clone() { - CostExpr::CostConst { .. } => expr.clone(), - CostExpr::CostAdd { left: l, right: r, .. } => Rc::new(CostExpr::CostAdd { - left: substitute_cost(l.clone(), &legend), - right: substitute_cost(r.clone(), &legend), -}), - CostExpr::CostMul { left: l, right: r, .. } => Rc::new(CostExpr::CostMul { - left: substitute_cost(l.clone(), &legend), - right: substitute_cost(r.clone(), &legend), -}), - CostExpr::CostMax { left: l, right: r, .. } => Rc::new(CostExpr::CostMax { - left: substitute_cost(l.clone(), &legend), - right: substitute_cost(r.clone(), &legend), -}), - CostExpr::CostSum { binder: b, upper: u, body: bd, .. } => Rc::new(CostExpr::CostSum { - binder: b.clone(), - upper: substitute_size(u.clone(), &legend), - body: substitute_cost(bd.clone(), &legend), -}), - CostExpr::CostLog { base: b, argument: a, .. } => Rc::new(CostExpr::CostLog { - base: b.clone(), - argument: substitute_size(a.clone(), &legend), -}), - CostExpr::CostExtern { .. } => expr.clone(), - CostExpr::CostUnknown { .. } => expr.clone(), -} + CostExpr::CostConst { .. } => expr.clone(), + CostExpr::CostAdd { + left: l, right: r, .. + } => Rc::new(CostExpr::CostAdd { + left: substitute_cost(l.clone(), &legend), + right: substitute_cost(r.clone(), &legend), + }), + CostExpr::CostMul { + left: l, right: r, .. + } => Rc::new(CostExpr::CostMul { + left: substitute_cost(l.clone(), &legend), + right: substitute_cost(r.clone(), &legend), + }), + CostExpr::CostMax { + left: l, right: r, .. + } => Rc::new(CostExpr::CostMax { + left: substitute_cost(l.clone(), &legend), + right: substitute_cost(r.clone(), &legend), + }), + CostExpr::CostSum { + binder: b, + upper: u, + body: bd, + .. + } => Rc::new(CostExpr::CostSum { + binder: b.clone(), + upper: substitute_size(u.clone(), &legend), + body: substitute_cost(bd.clone(), &legend), + }), + CostExpr::CostLog { + base: b, + argument: a, + .. + } => Rc::new(CostExpr::CostLog { + base: b.clone(), + argument: substitute_size(a.clone(), &legend), + }), + CostExpr::CostExtern { .. } => expr.clone(), + CostExpr::CostUnknown { .. } => expr.clone(), + } }) } pub fn classify_complexity(expr: Rc) -> String { { let normalized = normalize_asymptotic(simplify_cost(expr)); -let size_names = collect_size_vars(normalized.clone()); -let legend = build_legend(size_names); -let substituted = substitute_cost(normalized.clone(), &legend.substitution.clone()); -v2_rt::concat(format_cost_class(substituted), legend.suffix.clone()) -} + let size_names = collect_size_vars(normalized.clone()); + let legend = build_legend(size_names); + let substituted = substitute_cost(normalized.clone(), &legend.substitution.clone()); + v2_rt::concat(format_cost_class(substituted), legend.suffix.clone()) + } } pub fn collect_size_vars_from_size(size: Rc) -> Rc> { - stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - match (*size).clone() { - SizeExpr::SizeLen { collection: c, .. } => if (c.clone().as_str() == "__expr".to_string().as_str()) { - Rc::new(vec![]) - } else { - Rc::new(vec![c.clone()]) - }, - SizeExpr::SizeVar { name: n, .. } => if (n.clone().as_str() == "__k".to_string().as_str()) { - Rc::new(vec![]) - } else { - Rc::new(vec![n.clone()]) - }, - SizeExpr::SizeAdd { left: l, right: r, .. } => v2_rt::concat(collect_size_vars_from_size(l.clone()), collect_size_vars_from_size(r.clone())), - SizeExpr::SizeMax { left: l, right: r, .. } => v2_rt::concat(collect_size_vars_from_size(l.clone()), collect_size_vars_from_size(r.clone())), - _ => Rc::new(vec![]), -} + stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || match (*size).clone() { + SizeExpr::SizeLen { collection: c, .. } => { + if (c.clone().as_str() == "__expr".to_string().as_str()) { + Rc::new(vec![]) + } else { + Rc::new(vec![c.clone()]) + } + } + SizeExpr::SizeVar { name: n, .. } => { + if (n.clone().as_str() == "__k".to_string().as_str()) { + Rc::new(vec![]) + } else { + Rc::new(vec![n.clone()]) + } + } + SizeExpr::SizeAdd { + left: l, right: r, .. + } => v2_rt::concat( + collect_size_vars_from_size(l.clone()), + collect_size_vars_from_size(r.clone()), + ), + SizeExpr::SizeMax { + left: l, right: r, .. + } => v2_rt::concat( + collect_size_vars_from_size(l.clone()), + collect_size_vars_from_size(r.clone()), + ), + _ => Rc::new(vec![]), }) } pub fn collect_size_vars(expr: Rc) -> Rc> { - stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - match (*expr).clone() { - CostExpr::CostSum { upper: u, body: bd, .. } => v2_rt::concat(collect_size_vars_from_size(u.clone()), collect_size_vars(bd.clone())), - CostExpr::CostAdd { left: l, right: r, .. } => v2_rt::concat(collect_size_vars(l.clone()), collect_size_vars(r.clone())), - CostExpr::CostMul { left: l, right: r, .. } => v2_rt::concat(collect_size_vars(l.clone()), collect_size_vars(r.clone())), - CostExpr::CostMax { left: l, right: r, .. } => v2_rt::concat(collect_size_vars(l.clone()), collect_size_vars(r.clone())), - CostExpr::CostLog { argument: a, .. } => collect_size_vars_from_size(a.clone()), - _ => Rc::new(vec![]), -} + stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || match (*expr).clone() { + CostExpr::CostSum { + upper: u, body: bd, .. + } => v2_rt::concat( + collect_size_vars_from_size(u.clone()), + collect_size_vars(bd.clone()), + ), + CostExpr::CostAdd { + left: l, right: r, .. + } => v2_rt::concat(collect_size_vars(l.clone()), collect_size_vars(r.clone())), + CostExpr::CostMul { + left: l, right: r, .. + } => v2_rt::concat(collect_size_vars(l.clone()), collect_size_vars(r.clone())), + CostExpr::CostMax { + left: l, right: r, .. + } => v2_rt::concat(collect_size_vars(l.clone()), collect_size_vars(r.clone())), + CostExpr::CostLog { argument: a, .. } => collect_size_vars_from_size(a.clone()), + _ => Rc::new(vec![]), }) } @@ -4282,18 +8149,24 @@ pub struct DeduplicateAcc { pub fn deduplicate(items: Rc>) -> Rc> { { - let result = items.iter().cloned().fold(Rc::new(DeduplicateAcc { - seen: v2_rt::rc_empty_map::(), - out: Rc::new(vec![]), -}), |acc: Rc, item: String| match v2_rt::map_get(&acc.seen.clone(), item.clone()) { - Some(_) => acc.clone(), - None => Rc::new(DeduplicateAcc { - seen: v2_rt::rc_map_insert(acc.seen.clone(), item.clone(), true), - out: v2_rt::rc_list_push(acc.out.clone(), item.clone()), -}), -}); -result.out.clone() -} + let result = items.iter().cloned().fold( + Rc::new(DeduplicateAcc { + seen: v2_rt::rc_empty_map::(), + out: Rc::new(vec![]), + }), + |acc: Rc, item: String| match v2_rt::map_get( + &acc.seen.clone(), + item.clone(), + ) { + Some(_) => acc.clone(), + None => Rc::new(DeduplicateAcc { + seen: v2_rt::rc_map_insert(acc.seen.clone(), item.clone(), true), + out: v2_rt::rc_list_push(acc.out.clone(), item.clone()), + }), + }, + ); + result.out.clone() + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -4329,385 +8202,623 @@ pub struct MatchCostAccum { pub branch_costs: Rc>>, } -pub fn cost_of_expr(texpr: &Rc, func_index: &Rc>>, scc_index: &Rc>>, table: Rc, parser_always_advancing: &Rc>, recursion_ctx: &RecursionContext, si: &Rc>>) -> Rc { +pub fn cost_of_expr( + texpr: &Rc, + func_index: &Rc>>, + scc_index: &Rc>>, + table: Rc, + parser_always_advancing: &Rc>, + recursion_ctx: &RecursionContext, + si: &Rc>>, +) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*texpr.expr_data.clone()).clone() { - ExprData::ExprLiteral { .. } => Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: Rc::new(CostExpr::CostConst { - value: 1, -}), - span: Rc::new(CostExpr::CostConst { - value: 1, -}), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Proven, -}), - table: table, -}), - ExprData::ExprError { .. } => Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: Rc::new(CostExpr::CostConst { - value: 0, -}), - span: Rc::new(CostExpr::CostConst { - value: 0, -}), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Proven, -}), - table: table, -}), - ExprData::ExprVar { .. } => Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: Rc::new(CostExpr::CostConst { - value: 1, -}), - span: Rc::new(CostExpr::CostConst { - value: 1, -}), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Proven, -}), - table: table, -}), - ExprData::ExprBinOp { .. } => { - let l = binop_left(texpr.clone()); -let r = binop_right(texpr.clone()); -let lr = cost_of_expr(&l, &func_index, &scc_index, table, &parser_always_advancing, &recursion_ctx, &si); -let rr = cost_of_expr(&r, &func_index, &scc_index, lr.table.clone(), &parser_always_advancing, &recursion_ctx, &si); -Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: cost_seq(lr.summary.clone().work.clone(), &cost_seq(Rc::new(CostExpr::CostConst { - value: 1, -}), &rr.summary.clone().work.clone())), - span: cost_seq(lr.summary.clone().span.clone(), &cost_seq(Rc::new(CostExpr::CostConst { - value: 1, -}), &rr.summary.clone().span.clone())), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Proven, -}), - table: rr.table.clone(), -}) -}, - ExprData::ExprCall { .. } => { - let fname = expr_call_func_at(texpr.clone(), si.clone()); -let callee_result = match v2_rt::map_get(&func_index, fname.clone()) { - Some(entry) => get_or_compute_summary(&fname, &func_index, &scc_index, &table, parser_always_advancing.clone(), recursion_ctx.clone(), si.clone()), - None => Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: Rc::new(CostExpr::CostConst { - value: 1, -}), - span: Rc::new(CostExpr::CostConst { - value: 1, -}), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Proven, -}), - table: table, -}), -}; -let args_result = texpr.children.clone().iter().cloned().fold(Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: Rc::new(CostExpr::CostConst { - value: 0, -}), - span: Rc::new(CostExpr::CostConst { - value: 0, -}), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Proven, -}), - table: callee_result.table.clone(), -}), |acc: Rc, a: Rc| { - let ar = cost_of_expr(&arg_value(&a), &func_index, &scc_index, acc.table.clone(), &parser_always_advancing, &recursion_ctx, &si); -Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: cost_seq(acc.summary.clone().work.clone(), &ar.summary.clone().work.clone()), - span: cost_seq(acc.summary.clone().span.clone(), &ar.summary.clone().span.clone()), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Proven, -}), - table: ar.table.clone(), -}) -}); -Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: cost_seq(args_result.summary.clone().work.clone(), &callee_result.summary.clone().work.clone()), - span: cost_seq(args_result.summary.clone().span.clone(), &callee_result.summary.clone().span.clone()), - output_size: callee_result.summary.clone().output_size.clone(), - certainty: callee_result.summary.clone().certainty.clone(), -}), - table: args_result.table.clone(), -}) -}, - ExprData::ExprMethodCall { method_semantics: ms, .. } => { - let recv = method_receiver(texpr.clone()); -let mc_args = method_arg_nodes(texpr.clone()); -let recv_r = cost_of_expr(&recv, &func_index, &scc_index, table, &parser_always_advancing, &recursion_ctx, &si); -let size = receiver_size_var(recv.clone(), si.clone()); -let binder = size_binder_name(size.clone()); -let method_cost_result = if (ms.clone() == None) { - None - } else { - match (*ms.clone().unwrap()).clone() { - MethodSemantics::AlgebraMethodSemantics { method_def: md, cost_shape: cs, .. } => { - let pc = node_is_collection(&resolved_type(texpr.clone()), si.clone()); -match cs.clone() { - Some(shape) => Some(cost_of_method_by_shape(shape.clone(), pc, &recv_r, mc_args.clone(), &size, &binder, func_index.clone(), scc_index.clone(), parser_always_advancing.clone(), recursion_ctx.clone(), &si)), - None => Some(Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: cost_seq(recv_r.summary.clone().work.clone(), &Rc::new(CostExpr::CostConst { - value: 1, -})), - span: cost_seq(recv_r.summary.clone().span.clone(), &Rc::new(CostExpr::CostConst { - value: 1, -})), - output_size: v2_rt::rc_empty_map::>(), - certainty: recv_r.summary.clone().certainty.clone(), -}), - table: recv_r.table.clone(), -})), -} -}, - _ => None, -} - }; -match method_cost_result { - Some(result) => result.clone(), - _ => { - let args_result = mc_args.clone().iter().cloned().fold(Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: Rc::new(CostExpr::CostConst { - value: 0, -}), - span: Rc::new(CostExpr::CostConst { - value: 0, -}), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Proven, -}), - table: recv_r.table.clone(), -}), |acc: Rc, a: Rc| { - let ar = cost_of_expr(&arg_value(&a), &func_index, &scc_index, acc.table.clone(), &parser_always_advancing, &recursion_ctx, &si); -Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: cost_seq(acc.summary.clone().work.clone(), &ar.summary.clone().work.clone()), - span: cost_seq(acc.summary.clone().span.clone(), &ar.summary.clone().span.clone()), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Proven, -}), - table: ar.table.clone(), -}) -}); -Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: cost_seq(recv_r.summary.clone().work.clone(), &cost_seq(Rc::new(CostExpr::CostConst { - value: 1, -}), &args_result.summary.clone().work.clone())), - span: cost_seq(recv_r.summary.clone().span.clone(), &cost_seq(Rc::new(CostExpr::CostConst { - value: 1, -}), &args_result.summary.clone().span.clone())), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Proven, -}), - table: args_result.table.clone(), -}) -}, -} -}, - ExprData::ExprMatch => { - let scrut = match_scrutinee(texpr.clone()); -let arm_nodes = match_arm_nodes(texpr.clone()); -let s_r = cost_of_expr(&scrut, &func_index, &scc_index, table, &parser_always_advancing, &recursion_ctx, &si); -let arms_accum = arm_nodes.iter().cloned().fold(Rc::new(MatchCostAccum { - result: Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: Rc::new(CostExpr::CostConst { - value: 0, -}), - span: Rc::new(CostExpr::CostConst { - value: 0, -}), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Proven, -}), - table: s_r.table.clone(), -}), - branch_costs: Rc::new(vec![]), -}), |acc: Rc, arm_node: Rc| { - let ar = cost_of_expr(&arm_body(&arm_node), &func_index, &scc_index, acc.result.clone().table.clone(), &parser_always_advancing, &recursion_ctx, &si); -Rc::new(MatchCostAccum { - result: Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: cost_par(acc.result.clone().summary.clone().work.clone(), &ar.summary.clone().work.clone()), - span: cost_par(acc.result.clone().summary.clone().span.clone(), &ar.summary.clone().span.clone()), - output_size: ar.summary.clone().output_size.clone(), - certainty: ar.summary.clone().certainty.clone(), -}), - table: ar.table.clone(), -}), - branch_costs: v2_rt::concat(acc.branch_costs.clone(), Rc::new(vec![ar.summary.clone().work.clone()])), -}) -}); -Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: cost_conditional(s_r.summary.clone().work.clone(), arms_accum.branch_costs.clone()), - span: cost_conditional(s_r.summary.clone().span.clone(), Rc::new(vec![arms_accum.result.clone().summary.clone().span.clone()])), - output_size: arms_accum.result.clone().summary.clone().output_size.clone(), - certainty: arms_accum.result.clone().summary.clone().certainty.clone(), -}), - table: arms_accum.result.clone().table.clone(), -}) -}, - ExprData::ExprIf => { - let c = if_condition(texpr.clone()); -let t = if_then_branch(texpr.clone()); -let c_r = cost_of_expr(&c, &func_index, &scc_index, table, &parser_always_advancing, &recursion_ctx, &si); -let t_r = cost_of_expr(&t, &func_index, &scc_index, c_r.table.clone(), &parser_always_advancing, &recursion_ctx, &si); -let e_result = match if_else_branch(texpr.clone()) { - Some(eb) => { - let er = cost_of_expr(&eb, &func_index, &scc_index, t_r.table.clone(), &parser_always_advancing, &recursion_ctx, &si); -Rc::new(SummaryResult { - summary: er.summary.clone(), - table: er.table.clone(), -}) -}, - None => Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: Rc::new(CostExpr::CostConst { - value: 0, -}), - span: Rc::new(CostExpr::CostConst { - value: 0, -}), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Proven, -}), - table: t_r.table.clone(), -}), -}; -Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: cost_conditional(c_r.summary.clone().work.clone(), Rc::new(vec![t_r.summary.clone().work.clone(), e_result.summary.clone().work.clone()])), - span: cost_conditional(c_r.summary.clone().span.clone(), Rc::new(vec![t_r.summary.clone().span.clone(), e_result.summary.clone().span.clone()])), - output_size: t_r.summary.clone().output_size.clone(), - certainty: Certainty::Proven, -}), - table: e_result.table.clone(), -}) -}, - ExprData::ExprLet => { - let v = let_value(texpr.clone()); -let v_r = cost_of_expr(&v, &func_index, &scc_index, table, &parser_always_advancing, &recursion_ctx, &si); -match let_body(texpr.clone()) { - Some(b) => { - let b_r = cost_of_expr(&b, &func_index, &scc_index, v_r.table.clone(), &parser_always_advancing, &recursion_ctx, &si); -Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: cost_seq(v_r.summary.clone().work.clone(), &b_r.summary.clone().work.clone()), - span: cost_seq(v_r.summary.clone().span.clone(), &b_r.summary.clone().span.clone()), - output_size: b_r.summary.clone().output_size.clone(), - certainty: b_r.summary.clone().certainty.clone(), -}), - table: b_r.table.clone(), -}) -}, - None => v_r.clone(), -} -}, - ExprData::ExprBlock => texpr.children.clone().iter().cloned().fold(Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: Rc::new(CostExpr::CostConst { - value: 0, -}), - span: Rc::new(CostExpr::CostConst { - value: 0, -}), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Proven, -}), - table: table, -}), |acc: Rc, s: Rc| { - let sr = cost_of_expr(&s, &func_index, &scc_index, acc.table.clone(), &parser_always_advancing, &recursion_ctx, &si); -Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: cost_seq(acc.summary.clone().work.clone(), &sr.summary.clone().work.clone()), - span: cost_seq(acc.summary.clone().span.clone(), &sr.summary.clone().span.clone()), - output_size: sr.summary.clone().output_size.clone(), - certainty: sr.summary.clone().certainty.clone(), -}), - table: sr.table.clone(), -}) -}), - ExprData::ExprForEach => { - let c = foreach_collection(texpr.clone()); -let bd = foreach_body(texpr.clone()); -let c_r = cost_of_expr(&c, &func_index, &scc_index, table, &parser_always_advancing, &recursion_ctx, &si); -let bd_r = cost_of_expr(&bd, &func_index, &scc_index, c_r.table.clone(), &parser_always_advancing, &recursion_ctx, &si); -let size = receiver_size_var(c.clone(), si.clone()); -let binder = size_binder_name(size.clone()); -let loop_work = cost_loop(binder, size.clone(), &bd_r.summary.clone().work.clone()); -Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: cost_seq(c_r.summary.clone().work.clone(), &loop_work), - span: cost_seq(c_r.summary.clone().span.clone(), &loop_work), - output_size: v2_rt::rc_empty_map::>(), - certainty: bd_r.summary.clone().certainty.clone(), -}), - table: bd_r.table.clone(), -}) -}, - ExprData::NoExprData => texpr.children.clone().iter().cloned().fold(Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: Rc::new(CostExpr::CostConst { - value: 0, -}), - span: Rc::new(CostExpr::CostConst { - value: 0, -}), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Proven, -}), - table: table, -}), |acc: Rc, child: Rc| { - let cr = cost_of_expr(&child, &func_index, &scc_index, acc.table.clone(), &parser_always_advancing, &recursion_ctx, &si); -Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: cost_seq(acc.summary.clone().work.clone(), &cr.summary.clone().work.clone()), - span: cost_seq(acc.summary.clone().span.clone(), &cr.summary.clone().span.clone()), - output_size: cr.summary.clone().output_size.clone(), - certainty: cr.summary.clone().certainty.clone(), -}), - table: cr.table.clone(), -}) -}), - _ => texpr.children.clone().iter().cloned().fold(Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: Rc::new(CostExpr::CostConst { - value: 1, -}), - span: Rc::new(CostExpr::CostConst { - value: 1, -}), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Proven, -}), - table: table, -}), |acc: Rc, child: Rc| { - let cr = cost_of_expr(&child, &func_index, &scc_index, acc.table.clone(), &parser_always_advancing, &recursion_ctx, &si); -Rc::new(SummaryResult { - summary: Rc::new(ComplexitySummary { - work: cost_seq(acc.summary.clone().work.clone(), &cr.summary.clone().work.clone()), - span: cost_seq(acc.summary.clone().span.clone(), &cr.summary.clone().span.clone()), - output_size: cr.summary.clone().output_size.clone(), - certainty: cr.summary.clone().certainty.clone(), -}), - table: cr.table.clone(), -}) -}), -} + ExprData::ExprLiteral { .. } => Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: Rc::new(CostExpr::CostConst { value: 1 }), + span: Rc::new(CostExpr::CostConst { value: 1 }), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Proven, + }), + table: table, + }), + ExprData::ExprError { .. } => Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: Rc::new(CostExpr::CostConst { value: 0 }), + span: Rc::new(CostExpr::CostConst { value: 0 }), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Proven, + }), + table: table, + }), + ExprData::ExprVar { .. } => Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: Rc::new(CostExpr::CostConst { value: 1 }), + span: Rc::new(CostExpr::CostConst { value: 1 }), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Proven, + }), + table: table, + }), + ExprData::ExprBinOp { .. } => { + let l = binop_left(texpr.clone()); + let r = binop_right(texpr.clone()); + let lr = cost_of_expr( + &l, + &func_index, + &scc_index, + table, + &parser_always_advancing, + &recursion_ctx, + &si, + ); + let rr = cost_of_expr( + &r, + &func_index, + &scc_index, + lr.table.clone(), + &parser_always_advancing, + &recursion_ctx, + &si, + ); + Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: cost_seq( + lr.summary.clone().work.clone(), + &cost_seq( + Rc::new(CostExpr::CostConst { value: 1 }), + &rr.summary.clone().work.clone(), + ), + ), + span: cost_seq( + lr.summary.clone().span.clone(), + &cost_seq( + Rc::new(CostExpr::CostConst { value: 1 }), + &rr.summary.clone().span.clone(), + ), + ), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Proven, + }), + table: rr.table.clone(), + }) + } + ExprData::ExprCall { .. } => { + let fname = expr_call_func_at(texpr.clone(), si.clone()); + let callee_result = match v2_rt::map_get(&func_index, fname.clone()) { + Some(entry) => get_or_compute_summary( + &fname, + &func_index, + &scc_index, + &table, + parser_always_advancing.clone(), + recursion_ctx.clone(), + si.clone(), + ), + None => Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: Rc::new(CostExpr::CostConst { value: 1 }), + span: Rc::new(CostExpr::CostConst { value: 1 }), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Proven, + }), + table: table, + }), + }; + let args_result = texpr.children.clone().iter().cloned().fold( + Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: Rc::new(CostExpr::CostConst { value: 0 }), + span: Rc::new(CostExpr::CostConst { value: 0 }), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Proven, + }), + table: callee_result.table.clone(), + }), + |acc: Rc, a: Rc| { + let ar = cost_of_expr( + &arg_value(&a), + &func_index, + &scc_index, + acc.table.clone(), + &parser_always_advancing, + &recursion_ctx, + &si, + ); + Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: cost_seq( + acc.summary.clone().work.clone(), + &ar.summary.clone().work.clone(), + ), + span: cost_seq( + acc.summary.clone().span.clone(), + &ar.summary.clone().span.clone(), + ), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Proven, + }), + table: ar.table.clone(), + }) + }, + ); + Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: cost_seq( + args_result.summary.clone().work.clone(), + &callee_result.summary.clone().work.clone(), + ), + span: cost_seq( + args_result.summary.clone().span.clone(), + &callee_result.summary.clone().span.clone(), + ), + output_size: callee_result.summary.clone().output_size.clone(), + certainty: callee_result.summary.clone().certainty.clone(), + }), + table: args_result.table.clone(), + }) + } + ExprData::ExprMethodCall { + method_semantics: ms, + .. + } => { + let recv = method_receiver(texpr.clone()); + let mc_args = method_arg_nodes(texpr.clone()); + let recv_r = cost_of_expr( + &recv, + &func_index, + &scc_index, + table, + &parser_always_advancing, + &recursion_ctx, + &si, + ); + let size = receiver_size_var(recv.clone(), si.clone()); + let binder = size_binder_name(size.clone()); + let method_cost_result = if (ms.clone() == None) { + None + } else { + match (*ms.clone().unwrap()).clone() { + MethodSemantics::AlgebraMethodSemantics { + method_def: md, + cost_shape: cs, + .. + } => { + let pc = node_is_collection(&resolved_type(texpr.clone()), si.clone()); + match cs.clone() { + Some(shape) => Some(cost_of_method_by_shape( + shape.clone(), + pc, + &recv_r, + mc_args.clone(), + &size, + &binder, + func_index.clone(), + scc_index.clone(), + parser_always_advancing.clone(), + recursion_ctx.clone(), + &si, + )), + None => Some(Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: cost_seq( + recv_r.summary.clone().work.clone(), + &Rc::new(CostExpr::CostConst { value: 1 }), + ), + span: cost_seq( + recv_r.summary.clone().span.clone(), + &Rc::new(CostExpr::CostConst { value: 1 }), + ), + output_size: v2_rt::rc_empty_map::>(), + certainty: recv_r.summary.clone().certainty.clone(), + }), + table: recv_r.table.clone(), + })), + } + } + _ => None, + } + }; + match method_cost_result { + Some(result) => result.clone(), + _ => { + let args_result = mc_args.clone().iter().cloned().fold( + Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: Rc::new(CostExpr::CostConst { value: 0 }), + span: Rc::new(CostExpr::CostConst { value: 0 }), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Proven, + }), + table: recv_r.table.clone(), + }), + |acc: Rc, a: Rc| { + let ar = cost_of_expr( + &arg_value(&a), + &func_index, + &scc_index, + acc.table.clone(), + &parser_always_advancing, + &recursion_ctx, + &si, + ); + Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: cost_seq( + acc.summary.clone().work.clone(), + &ar.summary.clone().work.clone(), + ), + span: cost_seq( + acc.summary.clone().span.clone(), + &ar.summary.clone().span.clone(), + ), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Proven, + }), + table: ar.table.clone(), + }) + }, + ); + Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: cost_seq( + recv_r.summary.clone().work.clone(), + &cost_seq( + Rc::new(CostExpr::CostConst { value: 1 }), + &args_result.summary.clone().work.clone(), + ), + ), + span: cost_seq( + recv_r.summary.clone().span.clone(), + &cost_seq( + Rc::new(CostExpr::CostConst { value: 1 }), + &args_result.summary.clone().span.clone(), + ), + ), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Proven, + }), + table: args_result.table.clone(), + }) + } + } + } + ExprData::ExprMatch => { + let scrut = match_scrutinee(texpr.clone()); + let arm_nodes = match_arm_nodes(texpr.clone()); + let s_r = cost_of_expr( + &scrut, + &func_index, + &scc_index, + table, + &parser_always_advancing, + &recursion_ctx, + &si, + ); + let arms_accum = arm_nodes.iter().cloned().fold( + Rc::new(MatchCostAccum { + result: Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: Rc::new(CostExpr::CostConst { value: 0 }), + span: Rc::new(CostExpr::CostConst { value: 0 }), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Proven, + }), + table: s_r.table.clone(), + }), + branch_costs: Rc::new(vec![]), + }), + |acc: Rc, arm_node: Rc| { + let ar = cost_of_expr( + &arm_body(&arm_node), + &func_index, + &scc_index, + acc.result.clone().table.clone(), + &parser_always_advancing, + &recursion_ctx, + &si, + ); + Rc::new(MatchCostAccum { + result: Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: cost_par( + acc.result.clone().summary.clone().work.clone(), + &ar.summary.clone().work.clone(), + ), + span: cost_par( + acc.result.clone().summary.clone().span.clone(), + &ar.summary.clone().span.clone(), + ), + output_size: ar.summary.clone().output_size.clone(), + certainty: ar.summary.clone().certainty.clone(), + }), + table: ar.table.clone(), + }), + branch_costs: v2_rt::concat( + acc.branch_costs.clone(), + Rc::new(vec![ar.summary.clone().work.clone()]), + ), + }) + }, + ); + Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: cost_conditional( + s_r.summary.clone().work.clone(), + arms_accum.branch_costs.clone(), + ), + span: cost_conditional( + s_r.summary.clone().span.clone(), + Rc::new(vec![arms_accum.result.clone().summary.clone().span.clone()]), + ), + output_size: arms_accum + .result + .clone() + .summary + .clone() + .output_size + .clone(), + certainty: arms_accum.result.clone().summary.clone().certainty.clone(), + }), + table: arms_accum.result.clone().table.clone(), + }) + } + ExprData::ExprIf => { + let c = if_condition(texpr.clone()); + let t = if_then_branch(texpr.clone()); + let c_r = cost_of_expr( + &c, + &func_index, + &scc_index, + table, + &parser_always_advancing, + &recursion_ctx, + &si, + ); + let t_r = cost_of_expr( + &t, + &func_index, + &scc_index, + c_r.table.clone(), + &parser_always_advancing, + &recursion_ctx, + &si, + ); + let e_result = match if_else_branch(texpr.clone()) { + Some(eb) => { + let er = cost_of_expr( + &eb, + &func_index, + &scc_index, + t_r.table.clone(), + &parser_always_advancing, + &recursion_ctx, + &si, + ); + Rc::new(SummaryResult { + summary: er.summary.clone(), + table: er.table.clone(), + }) + } + None => Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: Rc::new(CostExpr::CostConst { value: 0 }), + span: Rc::new(CostExpr::CostConst { value: 0 }), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Proven, + }), + table: t_r.table.clone(), + }), + }; + Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: cost_conditional( + c_r.summary.clone().work.clone(), + Rc::new(vec![ + t_r.summary.clone().work.clone(), + e_result.summary.clone().work.clone(), + ]), + ), + span: cost_conditional( + c_r.summary.clone().span.clone(), + Rc::new(vec![ + t_r.summary.clone().span.clone(), + e_result.summary.clone().span.clone(), + ]), + ), + output_size: t_r.summary.clone().output_size.clone(), + certainty: Certainty::Proven, + }), + table: e_result.table.clone(), + }) + } + ExprData::ExprLet => { + let v = let_value(texpr.clone()); + let v_r = cost_of_expr( + &v, + &func_index, + &scc_index, + table, + &parser_always_advancing, + &recursion_ctx, + &si, + ); + match let_body(texpr.clone()) { + Some(b) => { + let b_r = cost_of_expr( + &b, + &func_index, + &scc_index, + v_r.table.clone(), + &parser_always_advancing, + &recursion_ctx, + &si, + ); + Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: cost_seq( + v_r.summary.clone().work.clone(), + &b_r.summary.clone().work.clone(), + ), + span: cost_seq( + v_r.summary.clone().span.clone(), + &b_r.summary.clone().span.clone(), + ), + output_size: b_r.summary.clone().output_size.clone(), + certainty: b_r.summary.clone().certainty.clone(), + }), + table: b_r.table.clone(), + }) + } + None => v_r.clone(), + } + } + ExprData::ExprBlock => texpr.children.clone().iter().cloned().fold( + Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: Rc::new(CostExpr::CostConst { value: 0 }), + span: Rc::new(CostExpr::CostConst { value: 0 }), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Proven, + }), + table: table, + }), + |acc: Rc, s: Rc| { + let sr = cost_of_expr( + &s, + &func_index, + &scc_index, + acc.table.clone(), + &parser_always_advancing, + &recursion_ctx, + &si, + ); + Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: cost_seq( + acc.summary.clone().work.clone(), + &sr.summary.clone().work.clone(), + ), + span: cost_seq( + acc.summary.clone().span.clone(), + &sr.summary.clone().span.clone(), + ), + output_size: sr.summary.clone().output_size.clone(), + certainty: sr.summary.clone().certainty.clone(), + }), + table: sr.table.clone(), + }) + }, + ), + ExprData::ExprForEach => { + let c = foreach_collection(texpr.clone()); + let bd = foreach_body(texpr.clone()); + let c_r = cost_of_expr( + &c, + &func_index, + &scc_index, + table, + &parser_always_advancing, + &recursion_ctx, + &si, + ); + let bd_r = cost_of_expr( + &bd, + &func_index, + &scc_index, + c_r.table.clone(), + &parser_always_advancing, + &recursion_ctx, + &si, + ); + let size = receiver_size_var(c.clone(), si.clone()); + let binder = size_binder_name(size.clone()); + let loop_work = cost_loop(binder, size.clone(), &bd_r.summary.clone().work.clone()); + Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: cost_seq(c_r.summary.clone().work.clone(), &loop_work), + span: cost_seq(c_r.summary.clone().span.clone(), &loop_work), + output_size: v2_rt::rc_empty_map::>(), + certainty: bd_r.summary.clone().certainty.clone(), + }), + table: bd_r.table.clone(), + }) + } + ExprData::NoExprData => texpr.children.clone().iter().cloned().fold( + Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: Rc::new(CostExpr::CostConst { value: 0 }), + span: Rc::new(CostExpr::CostConst { value: 0 }), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Proven, + }), + table: table, + }), + |acc: Rc, child: Rc| { + let cr = cost_of_expr( + &child, + &func_index, + &scc_index, + acc.table.clone(), + &parser_always_advancing, + &recursion_ctx, + &si, + ); + Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: cost_seq( + acc.summary.clone().work.clone(), + &cr.summary.clone().work.clone(), + ), + span: cost_seq( + acc.summary.clone().span.clone(), + &cr.summary.clone().span.clone(), + ), + output_size: cr.summary.clone().output_size.clone(), + certainty: cr.summary.clone().certainty.clone(), + }), + table: cr.table.clone(), + }) + }, + ), + _ => texpr.children.clone().iter().cloned().fold( + Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: Rc::new(CostExpr::CostConst { value: 1 }), + span: Rc::new(CostExpr::CostConst { value: 1 }), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Proven, + }), + table: table, + }), + |acc: Rc, child: Rc| { + let cr = cost_of_expr( + &child, + &func_index, + &scc_index, + acc.table.clone(), + &parser_always_advancing, + &recursion_ctx, + &si, + ); + Rc::new(SummaryResult { + summary: Rc::new(ComplexitySummary { + work: cost_seq( + acc.summary.clone().work.clone(), + &cr.summary.clone().work.clone(), + ), + span: cost_seq( + acc.summary.clone().span.clone(), + &cr.summary.clone().span.clone(), + ), + output_size: cr.summary.clone().output_size.clone(), + certainty: cr.summary.clone().certainty.clone(), + }), + table: cr.table.clone(), + }) + }, + ), + } }) } @@ -4716,436 +8827,736 @@ pub fn estimate_expr_size(texpr: Rc, budget: i64) -> i64 { if (budget.clone() <= 0) { 0 } else { - texpr.children.clone().iter().cloned().fold((budget.clone() - 1), |acc: i64, child: Rc| estimate_expr_size(child.clone(), acc)) + texpr + .children + .clone() + .iter() + .cloned() + .fold((budget.clone() - 1), |acc: i64, child: Rc| { + estimate_expr_size(child.clone(), acc) + }) } }) } -pub fn get_or_compute_summary(func_name: &String, func_index: &Rc>>, scc_index: &Rc>>, table: &Rc, parser_always_advancing: Rc>, recursion_ctx: RecursionContext, si: Rc>>) -> Rc { +pub fn get_or_compute_summary( + func_name: &String, + func_index: &Rc>>, + scc_index: &Rc>>, + table: &Rc, + parser_always_advancing: Rc>, + recursion_ctx: RecursionContext, + si: Rc>>, +) -> Rc { match lookup_summary(table.clone(), func_name.clone()) { - Some(cached) => Rc::new(SummaryResult { - summary: cached.clone(), - table: table.clone(), -}), - None => match v2_rt::map_get(&func_index, func_name.clone()) { - Some(entry) => { - let target = match v2_rt::map_get(&scc_index, func_name.clone()) { - Some(info) => Some(info.pattern.clone()), - None => None, -}; -let is_recursive = (target.clone() != None); -let zero_placeholder = Rc::new(ComplexitySummary { - work: Rc::new(CostExpr::CostConst { - value: 0, -}), - span: Rc::new(CostExpr::CostConst { - value: 0, -}), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Conservative, -}); -let table_prepped = if is_recursive { - cache_summary(table.clone(), func_name.clone(), zero_placeholder) - } else { - table.clone() - }; -let result = cost_of_expr(&entry.body.clone(), &func_index, &scc_index, table_prepped, &parser_always_advancing, &recursion_ctx, &si); -let scc_members = match v2_rt::map_get(&scc_index, func_name.clone()) { - Some(info) => info.members.clone(), - None => Rc::new(vec![]), -}; -let is_scc = ((scc_members.clone().len() as i64) > 1); -let bounded = match target.clone() { - Some(t) => if is_scc { - Rc::new(ComplexitySummary { - work: bounded_scc_cost(t.clone(), result.summary.clone().work.clone(), scc_members.clone()), - span: bounded_scc_cost(t.clone(), result.summary.clone().span.clone(), scc_members.clone()), - output_size: result.summary.clone().output_size.clone(), - certainty: Certainty::Conservative, -}) - } else { - Rc::new(ComplexitySummary { - work: bounded_recursive_cost(t.clone(), result.summary.clone().work.clone(), func_name.clone()), - span: bounded_recursive_cost(t.clone(), result.summary.clone().span.clone(), func_name.clone()), - output_size: result.summary.clone().output_size.clone(), - certainty: Certainty::Conservative, -}) + Some(cached) => Rc::new(SummaryResult { + summary: cached.clone(), + table: table.clone(), + }), + None => match v2_rt::map_get(&func_index, func_name.clone()) { + Some(entry) => { + let target = match v2_rt::map_get(&scc_index, func_name.clone()) { + Some(info) => Some(info.pattern.clone()), + None => None, + }; + let is_recursive = (target.clone() != None); + let zero_placeholder = Rc::new(ComplexitySummary { + work: Rc::new(CostExpr::CostConst { value: 0 }), + span: Rc::new(CostExpr::CostConst { value: 0 }), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Conservative, + }); + let table_prepped = if is_recursive { + cache_summary(table.clone(), func_name.clone(), zero_placeholder) + } else { + table.clone() + }; + let result = cost_of_expr( + &entry.body.clone(), + &func_index, + &scc_index, + table_prepped, + &parser_always_advancing, + &recursion_ctx, + &si, + ); + let scc_members = match v2_rt::map_get(&scc_index, func_name.clone()) { + Some(info) => info.members.clone(), + None => Rc::new(vec![]), + }; + let is_scc = ((scc_members.clone().len() as i64) > 1); + let bounded = match target.clone() { + Some(t) => { + if is_scc { + Rc::new(ComplexitySummary { + work: bounded_scc_cost( + t.clone(), + result.summary.clone().work.clone(), + scc_members.clone(), + ), + span: bounded_scc_cost( + t.clone(), + result.summary.clone().span.clone(), + scc_members.clone(), + ), + output_size: result.summary.clone().output_size.clone(), + certainty: Certainty::Conservative, + }) + } else { + Rc::new(ComplexitySummary { + work: bounded_recursive_cost( + t.clone(), + result.summary.clone().work.clone(), + func_name.clone(), + ), + span: bounded_recursive_cost( + t.clone(), + result.summary.clone().span.clone(), + func_name.clone(), + ), + output_size: result.summary.clone().output_size.clone(), + certainty: Certainty::Conservative, + }) + } + } + None => result.summary.clone(), + }; + let simplified = Rc::new(ComplexitySummary { + work: simplify_cost(bounded.work.clone()), + span: simplify_cost(bounded.span.clone()), + output_size: bounded.output_size.clone(), + certainty: bounded.certainty.clone(), + }); + let final_table = + cache_summary(result.table.clone(), func_name.clone(), simplified.clone()); + Rc::new(SummaryResult { + summary: simplified.clone(), + table: final_table, + }) + } + None => { + let is_unexpected_miss = (v2_rt::map_get(&scc_index, func_name.clone()) != None); + if is_unexpected_miss { + { + let miss_summary = Rc::new(ComplexitySummary { + work: Rc::new(CostExpr::CostUnknown { + reason: v2_rt::concat( + "internal function missing from index: ".to_string(), + func_name.clone(), + ), + }), + span: Rc::new(CostExpr::CostUnknown { + reason: v2_rt::concat( + "internal function missing from index: ".to_string(), + func_name.clone(), + ), + }), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Conservative, + }); + Rc::new(SummaryResult { + summary: miss_summary, + table: table.clone(), + }) + } + } else { + { + let external_summary = Rc::new(ComplexitySummary { + work: Rc::new(CostExpr::CostExtern { + name: func_name.clone(), + }), + span: Rc::new(CostExpr::CostExtern { + name: func_name.clone(), + }), + output_size: v2_rt::rc_empty_map::>(), + certainty: Certainty::Conservative, + }); + Rc::new(SummaryResult { + summary: external_summary, + table: table.clone(), + }) + } + } + } }, - None => result.summary.clone(), -}; -let simplified = Rc::new(ComplexitySummary { - work: simplify_cost(bounded.work.clone()), - span: simplify_cost(bounded.span.clone()), - output_size: bounded.output_size.clone(), - certainty: bounded.certainty.clone(), -}); -let final_table = cache_summary(result.table.clone(), func_name.clone(), simplified.clone()); -Rc::new(SummaryResult { - summary: simplified.clone(), - table: final_table, -}) -}, - None => { - let is_unexpected_miss = (v2_rt::map_get(&scc_index, func_name.clone()) != None); -if is_unexpected_miss { - { - let miss_summary = Rc::new(ComplexitySummary { - work: Rc::new(CostExpr::CostUnknown { - reason: v2_rt::concat("internal function missing from index: ".to_string(), func_name.clone()), -}), - span: Rc::new(CostExpr::CostUnknown { - reason: v2_rt::concat("internal function missing from index: ".to_string(), func_name.clone()), -}), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Conservative, -}); -Rc::new(SummaryResult { - summary: miss_summary, - table: table.clone(), -}) -} - } else { - { - let external_summary = Rc::new(ComplexitySummary { - work: Rc::new(CostExpr::CostExtern { - name: func_name.clone(), -}), - span: Rc::new(CostExpr::CostExtern { - name: func_name.clone(), -}), - output_size: v2_rt::rc_empty_map::>(), - certainty: Certainty::Conservative, -}); -Rc::new(SummaryResult { - summary: external_summary, - table: table.clone(), -}) -} - } -}, -}, -} + } } -pub fn collect_call_evidence(body: &Rc, target_set: &Rc>, si: &Rc>>) -> Rc>>>> { +pub fn collect_call_evidence( + body: &Rc, + target_set: &Rc>, + si: &Rc>>, +) -> Rc>>>> { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*body.expr_data.clone()).clone() { - ExprData::ExprCall { descent_evidence: de, .. } => { - let callee = expr_call_func_at(body.clone(), si.clone()); -let own = if (v2_rt::map_get(&target_set, callee) != None) { - match de.clone() { - Some(evidence) => Rc::new(vec![evidence.clone()]), - None => Rc::new(vec![]), -} - } else { - Rc::new(vec![]) - }; -let from_children = body.children.clone().iter().cloned().fold(Rc::new(vec![]), |acc: _, child: Rc| v2_rt::concat(acc, collect_call_evidence(&child, &target_set, &si))); -v2_rt::concat(own, from_children) -}, - _ => body.children.clone().iter().cloned().fold(Rc::new(vec![]), |acc: Rc>>>>, child: Rc| v2_rt::concat(acc, collect_call_evidence(&child, &target_set, &si))), -} + ExprData::ExprCall { + descent_evidence: de, + .. + } => { + let callee = expr_call_func_at(body.clone(), si.clone()); + let own = if (v2_rt::map_get(&target_set, callee) != None) { + match de.clone() { + Some(evidence) => Rc::new(vec![evidence.clone()]), + None => Rc::new(vec![]), + } + } else { + Rc::new(vec![]) + }; + let from_children = body.children.clone().iter().cloned().fold( + Rc::new(vec![]), + |acc: _, child: Rc| { + v2_rt::concat(acc, collect_call_evidence(&child, &target_set, &si)) + }, + ); + v2_rt::concat(own, from_children) + } + _ => body.children.clone().iter().cloned().fold( + Rc::new(vec![]), + |acc: Rc>>>>, child: Rc| { + v2_rt::concat(acc, collect_call_evidence(&child, &target_set, &si)) + }, + ), + } }) } -pub fn collect_self_call_evidence(body: Rc, fn_name: String, si: Rc>>) -> Rc>>>> { - collect_call_evidence(&body, &v2_rt::rc_map_insert(v2_rt::rc_empty_map::(), fn_name, true), &si) +pub fn collect_self_call_evidence( + body: Rc, + fn_name: String, + si: Rc>>, +) -> Rc>>>> { + collect_call_evidence( + &body, + &v2_rt::rc_map_insert(v2_rt::rc_empty_map::(), fn_name, true), + &si, + ) } -pub fn collect_callee_evidence(body: Rc, callee_name: String, si: Rc>>) -> Rc>>>> { - collect_call_evidence(&body, &v2_rt::rc_map_insert(v2_rt::rc_empty_map::(), callee_name, true), &si) +pub fn collect_callee_evidence( + body: Rc, + callee_name: String, + si: Rc>>, +) -> Rc>>>> { + collect_call_evidence( + &body, + &v2_rt::rc_map_insert(v2_rt::rc_empty_map::(), callee_name, true), + &si, + ) } pub fn derive_edge_evidence(all_calls: Rc>>>>) -> DescentEvidence { - all_calls.iter().cloned().fold(DescentEvidence::Strict, |worst: DescentEvidence, call_ev: Rc>>| { - let call_best = call_ev.clone().iter().cloned().fold(DescentEvidence::DescentUnknown, |best: DescentEvidence, rel: Rc| { - let ev = sub_value_to_evidence(rel.clone()); -match ev.clone() { - DescentEvidence::Strict => DescentEvidence::Strict, - _ => match best { - DescentEvidence::Strict => DescentEvidence::Strict, - DescentEvidence::NonIncreasing => DescentEvidence::NonIncreasing, - _ => ev.clone(), -}, -} -}); -merge_evidence(worst, call_best.clone()) -}) -} - -pub fn merge_param_evidence(all_calls: Rc>>>>, param_index: i64) -> DescentEvidence { - all_calls.iter().cloned().fold(DescentEvidence::Strict, |acc: DescentEvidence, call_evidence: Rc>>| match call_evidence.clone().get(param_index.clone() as usize).cloned() { - Some(rel) => merge_evidence(acc.clone(), sub_value_to_evidence(rel.clone())), - None => acc.clone(), -}) + all_calls.iter().cloned().fold( + DescentEvidence::Strict, + |worst: DescentEvidence, call_ev: Rc>>| { + let call_best = call_ev.clone().iter().cloned().fold( + DescentEvidence::DescentUnknown, + |best: DescentEvidence, rel: Rc| { + let ev = sub_value_to_evidence(rel.clone()); + match ev.clone() { + DescentEvidence::Strict => DescentEvidence::Strict, + _ => match best { + DescentEvidence::Strict => DescentEvidence::Strict, + DescentEvidence::NonIncreasing => DescentEvidence::NonIncreasing, + _ => ev.clone(), + }, + } + }, + ); + merge_evidence(worst, call_best.clone()) + }, + ) +} + +pub fn merge_param_evidence( + all_calls: Rc>>>>, + param_index: i64, +) -> DescentEvidence { + all_calls.iter().cloned().fold( + DescentEvidence::Strict, + |acc: DescentEvidence, call_evidence: Rc>>| match call_evidence + .clone() + .get(param_index.clone() as usize) + .cloned() + { + Some(rel) => merge_evidence(acc.clone(), sub_value_to_evidence(rel.clone())), + None => acc.clone(), + }, + ) } -pub fn extract_shrink_factor(all_calls: Rc>>>>, param_index: i64) -> Option> { - all_calls.iter().cloned().fold(Some(Rc::new(ShrinkFactor::UnitShrink)), |acc: Option>, call_evidence: Rc>>| match acc.clone() { - None => None, - Some(prev) => match call_evidence.clone().get(param_index.clone() as usize).cloned() { - Some(rel) => match (*rel.clone()).clone() { - SubValueRelation::StrictSubValue { factor: f, .. } => match (*prev.clone()).clone() { - ShrinkFactor::UnitShrink => Some(f.clone()), - _ => if (prev.clone() == f.clone()) { - acc.clone() - } else { - None - }, -}, - SubValueRelation::ArithmeticDescent { factor: f, .. } => match (*prev.clone()).clone() { - ShrinkFactor::UnitShrink => Some(f.clone()), - _ => if (prev.clone() == f.clone()) { - acc.clone() - } else { - None - }, -}, - _ => acc.clone(), -}, - None => acc.clone(), -}, -}) +pub fn extract_shrink_factor( + all_calls: Rc>>>>, + param_index: i64, +) -> Option> { + all_calls.iter().cloned().fold( + Some(Rc::new(ShrinkFactor::UnitShrink)), + |acc: Option>, call_evidence: Rc>>| match acc + .clone() + { + None => None, + Some(prev) => match call_evidence + .clone() + .get(param_index.clone() as usize) + .cloned() + { + Some(rel) => match (*rel.clone()).clone() { + SubValueRelation::StrictSubValue { factor: f, .. } => { + match (*prev.clone()).clone() { + ShrinkFactor::UnitShrink => Some(f.clone()), + _ => { + if (prev.clone() == f.clone()) { + acc.clone() + } else { + None + } + } + } + } + SubValueRelation::ArithmeticDescent { factor: f, .. } => { + match (*prev.clone()).clone() { + ShrinkFactor::UnitShrink => Some(f.clone()), + _ => { + if (prev.clone() == f.clone()) { + acc.clone() + } else { + None + } + } + } + } + _ => acc.clone(), + }, + None => acc.clone(), + }, + }, + ) } -pub fn max_path_descending(body: &Rc, fn_name: &String, param_index: i64, si: &Rc>>) -> i64 { +pub fn max_path_descending( + body: &Rc, + fn_name: &String, + param_index: i64, + si: &Rc>>, +) -> i64 { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*body.expr_data.clone()).clone() { - ExprData::ExprCall { descent_evidence: de, .. } => { - let callee = expr_call_func_at(body.clone(), si.clone()); -let own = if (callee.as_str() == fn_name.clone().as_str()) { - match de.clone() { - Some(evidence) => match evidence.clone().get(param_index.clone() as usize).cloned() { - Some(rel) => match (*rel.clone()).clone() { - SubValueRelation::StrictSubValue { .. } => 1, - SubValueRelation::IteratedSubValue { .. } => 1, - SubValueRelation::ArithmeticDescent { .. } => 1, - _ => 0, -}, - None => 0, -}, - None => 0, -} - } else { - 0 - }; -let from_children = body.children.clone().iter().cloned().fold(0, |acc: i64, child: Rc| (acc + max_path_descending(&child, &fn_name, param_index.clone(), &si))); -(own + from_children) -}, - ExprData::ExprIf => { - let cond_count = max_path_descending(&if_condition(body.clone()), &fn_name, param_index.clone(), &si); -let then_count = max_path_descending(&if_then_branch(body.clone()), &fn_name, param_index.clone(), &si); -let else_branch = if_else_branch(body.clone()); -let else_count = match else_branch { - Some(eb) => max_path_descending(&eb, &fn_name, param_index.clone(), &si), - None => 0, -}; -let branch_max = if (then_count.clone() > else_count.clone()) { - then_count.clone() - } else { - else_count.clone() - }; -(cond_count + branch_max) -}, - ExprData::ExprMatch => { - let scrut_count = max_path_descending(&match_scrutinee(body.clone()), &fn_name, param_index.clone(), &si); -let arms = match_arm_nodes(body.clone()); -let arm_max = arms.iter().cloned().fold(0, |acc: i64, arm: Rc| { - let arm_count = max_path_descending(&arm_body(&arm), &fn_name, param_index.clone(), &si); -if (arm_count.clone() > acc.clone()) { - arm_count.clone() + ExprData::ExprCall { + descent_evidence: de, + .. + } => { + let callee = expr_call_func_at(body.clone(), si.clone()); + let own = if (callee.as_str() == fn_name.clone().as_str()) { + match de.clone() { + Some(evidence) => { + match evidence.clone().get(param_index.clone() as usize).cloned() { + Some(rel) => match (*rel.clone()).clone() { + SubValueRelation::StrictSubValue { .. } => 1, + SubValueRelation::IteratedSubValue { .. } => 1, + SubValueRelation::ArithmeticDescent { .. } => 1, + _ => 0, + }, + None => 0, + } + } + None => 0, + } } else { - acc.clone() - } -}); -(scrut_count + arm_max) -}, - _ => body.children.clone().iter().cloned().fold(0, |acc: i64, child: Rc| (acc + max_path_descending(&child, &fn_name, param_index.clone(), &si))), -} + 0 + }; + let from_children = + body.children + .clone() + .iter() + .cloned() + .fold(0, |acc: i64, child: Rc| { + (acc + max_path_descending(&child, &fn_name, param_index.clone(), &si)) + }); + (own + from_children) + } + ExprData::ExprIf => { + let cond_count = max_path_descending( + &if_condition(body.clone()), + &fn_name, + param_index.clone(), + &si, + ); + let then_count = max_path_descending( + &if_then_branch(body.clone()), + &fn_name, + param_index.clone(), + &si, + ); + let else_branch = if_else_branch(body.clone()); + let else_count = match else_branch { + Some(eb) => max_path_descending(&eb, &fn_name, param_index.clone(), &si), + None => 0, + }; + let branch_max = if (then_count.clone() > else_count.clone()) { + then_count.clone() + } else { + else_count.clone() + }; + (cond_count + branch_max) + } + ExprData::ExprMatch => { + let scrut_count = max_path_descending( + &match_scrutinee(body.clone()), + &fn_name, + param_index.clone(), + &si, + ); + let arms = match_arm_nodes(body.clone()); + let arm_max = arms.iter().cloned().fold(0, |acc: i64, arm: Rc| { + let arm_count = + max_path_descending(&arm_body(&arm), &fn_name, param_index.clone(), &si); + if (arm_count.clone() > acc.clone()) { + arm_count.clone() + } else { + acc.clone() + } + }); + (scrut_count + arm_max) + } + _ => body + .children + .clone() + .iter() + .cloned() + .fold(0, |acc: i64, child: Rc| { + (acc + max_path_descending(&child, &fn_name, param_index.clone(), &si)) + }), + } }) } -pub fn distinct_descended_fields(all_calls: Rc>>>>, param_index: i64) -> i64 { +pub fn distinct_descended_fields( + all_calls: Rc>>>>, + param_index: i64, +) -> i64 { { - let field_set = all_calls.iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, call_evidence: Rc>>| match call_evidence.clone().get(param_index.clone() as usize).cloned() { - Some(rel) => match (*rel.clone()).clone() { - SubValueRelation::StrictSubValue { field: f, .. } => v2_rt::rc_map_insert(acc.clone(), f.field_name.clone(), true), - SubValueRelation::IteratedSubValue { field: f, .. } => v2_rt::rc_map_insert(acc.clone(), f.field_name.clone(), true), - _ => acc.clone(), -}, - None => acc.clone(), -}); -(Rc::new(v2_rt::map_keys(&field_set)).len() as i64) -} + let field_set = all_calls.iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, call_evidence: Rc>>| { + match call_evidence + .clone() + .get(param_index.clone() as usize) + .cloned() + { + Some(rel) => match (*rel.clone()).clone() { + SubValueRelation::StrictSubValue { field: f, .. } => { + v2_rt::rc_map_insert(acc.clone(), f.field_name.clone(), true) + } + SubValueRelation::IteratedSubValue { field: f, .. } => { + v2_rt::rc_map_insert(acc.clone(), f.field_name.clone(), true) + } + _ => acc.clone(), + }, + None => acc.clone(), + } + }, + ); + (Rc::new(v2_rt::map_keys(&field_set)).len() as i64) + } } -pub fn analyze_structural_bounds(func_entries: Rc>>, si: Rc>>) -> Rc>> { - func_entries.iter().cloned().fold(Rc::new(vec![]), |acc: Rc>>, entry: Rc| { - let all_calls = collect_self_call_evidence(entry.body.clone(), entry.name.clone(), si.clone()); -if ((all_calls.clone().len() as i64) == 0) { - acc.clone() - } else { - { - let param_results = Rc::new(entry.params.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned().fold(Rc::new(vec![]), |pacc: _, pair: (i64, Rc)| { - let param_index = pair.0.clone(); -let param_node = pair.1.clone(); -let evidence = merge_param_evidence(all_calls.clone(), param_index.clone()); -match evidence.clone() { - DescentEvidence::Strict => { - let param_name = param_node_name_at(param_node.clone(), si.clone()); -let factor_opt = extract_shrink_factor(all_calls.clone(), param_index.clone()); -match factor_opt.clone() { - Some(factor) => { - let branches = max_path_descending(&entry.body.clone(), &entry.name.clone(), param_index.clone(), &si); -let recurrence = match (*factor.clone()).clone() { - ShrinkFactor::UnitShrink => { - let distinct_fields = distinct_descended_fields(all_calls.clone(), param_index.clone()); -if (branches.clone() <= distinct_fields.clone()) { - catamorphism_bound(param_name.clone(), 1) - } else { - derive_bound(param_name.clone(), branches.clone(), factor.clone(), 0) - } -}, - ShrinkFactor::ConstantShrink { .. } => { - let distinct_fields = distinct_descended_fields(all_calls.clone(), param_index.clone()); -if (branches.clone() <= distinct_fields.clone()) { - catamorphism_bound(param_name.clone(), 1) - } else { - derive_bound(param_name.clone(), branches.clone(), factor.clone(), 0) +pub fn analyze_structural_bounds( + func_entries: Rc>>, + si: Rc>>, +) -> Rc>> { + func_entries.iter().cloned().fold( + Rc::new(vec![]), + |acc: Rc>>, entry: Rc| { + let all_calls = + collect_self_call_evidence(entry.body.clone(), entry.name.clone(), si.clone()); + if ((all_calls.clone().len() as i64) == 0) { + acc.clone() + } else { + { + let param_results = Rc::new( + entry + .params + .clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + .fold(Rc::new(vec![]), |pacc: _, pair: (i64, Rc)| { + let param_index = pair.0.clone(); + let param_node = pair.1.clone(); + let evidence = merge_param_evidence(all_calls.clone(), param_index.clone()); + match evidence.clone() { + DescentEvidence::Strict => { + let param_name = param_node_name_at(param_node.clone(), si.clone()); + let factor_opt = + extract_shrink_factor(all_calls.clone(), param_index.clone()); + match factor_opt.clone() { + Some(factor) => { + let branches = max_path_descending( + &entry.body.clone(), + &entry.name.clone(), + param_index.clone(), + &si, + ); + let recurrence = match (*factor.clone()).clone() { + ShrinkFactor::UnitShrink => { + let distinct_fields = distinct_descended_fields( + all_calls.clone(), + param_index.clone(), + ); + if (branches.clone() <= distinct_fields.clone()) { + catamorphism_bound(param_name.clone(), 1) + } else { + derive_bound( + param_name.clone(), + branches.clone(), + factor.clone(), + 0, + ) + } + } + ShrinkFactor::ConstantShrink { .. } => { + let distinct_fields = distinct_descended_fields( + all_calls.clone(), + param_index.clone(), + ); + if (branches.clone() <= distinct_fields.clone()) { + catamorphism_bound(param_name.clone(), 1) + } else { + derive_bound( + param_name.clone(), + branches.clone(), + factor.clone(), + 0, + ) + } + } + ShrinkFactor::ProportionalShrink { .. } => { + derive_bound( + param_name.clone(), + branches.clone(), + factor.clone(), + 0, + ) + } + }; + let stack_bound = if entry.is_tail_recursive.clone() { + Rc::new(CostBound::ConstantBound) + } else { + derive_bound(param_name.clone(), 1, factor.clone(), 0) + }; + v2_rt::concat( + pacc.clone(), + Rc::new(vec![Rc::new(StructuralBoundResult { + func_name: entry.name.clone(), + param: param_name.clone(), + recurrence_bound: recurrence.clone(), + stack_bound: stack_bound.clone(), + span: entry.span.clone(), + })]), + ) + } + None => pacc.clone(), } -}, - ShrinkFactor::ProportionalShrink { .. } => derive_bound(param_name.clone(), branches.clone(), factor.clone(), 0), -}; -let stack_bound = if entry.is_tail_recursive.clone() { - Rc::new(CostBound::ConstantBound) - } else { - derive_bound(param_name.clone(), 1, factor.clone(), 0) - }; -v2_rt::concat(pacc.clone(), Rc::new(vec![Rc::new(StructuralBoundResult { - func_name: entry.name.clone(), - param: param_name.clone(), - recurrence_bound: recurrence.clone(), - stack_bound: stack_bound.clone(), - span: entry.span.clone(), -})])) -}, - None => pacc.clone(), -} -}, - _ => pacc.clone(), -} -}); -v2_rt::concat(acc.clone(), param_results.clone()) -} - } -}) + } + _ => pacc.clone(), + } + }); + v2_rt::concat(acc.clone(), param_results.clone()) + } + } + }, + ) } -pub fn build_complexity_report(func_entries: &Rc>>, recursion_ctx: RecursionContext, source_indices: Rc>>) -> Rc { +pub fn build_complexity_report( + func_entries: &Rc>>, + recursion_ctx: RecursionContext, + source_indices: Rc>>, +) -> Rc { { let si = source_indices; -let func_index = func_entries.clone().iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, entry: Rc| v2_rt::rc_map_insert(acc, entry.name.clone(), entry.clone())); -let scc_result = build_scc_index(&func_entries, func_index.clone(), &si); -let parser_always_advancing = infer_all_parser_always_advancing(&func_index, &si); -let full_scc_index = func_entries.clone().iter().cloned().fold(scc_result.index.clone(), |acc: Rc>>, entry: Rc| match v2_rt::map_get(&acc, entry.name.clone()) { - Some(_) => acc.clone(), - None => if (max_path_self_calls(entry.body.clone(), entry.name.clone(), si.clone()) > 0) { - { - let pattern = classify_recursion_pattern(&entry.name.clone(), &entry.body.clone(), &entry.params.clone(), parser_always_advancing.clone(), &si); -let info = Rc::new(SccInfo { - members: Rc::new(vec![entry.name.clone()]), - member_set: v2_rt::rc_map_insert(v2_rt::rc_empty_map::(), entry.name.clone(), true), - pattern: pattern.clone(), -}); -v2_rt::rc_map_insert(acc.clone(), entry.name.clone(), info.clone()) -} - } else { - acc.clone() - }, -}); -let fan_in = func_entries.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, entry: Rc| { - let callees = match v2_rt::map_get(&scc_result.call_graph.clone().forward.clone(), entry.name.clone()) { - Some(cs) => cs.clone(), - None => Rc::new(vec![]), -}; -let unique_set = callees.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |s: Rc>, c: String| v2_rt::rc_map_insert(s, c.clone(), true)); -Rc::new(v2_rt::map_keys(&unique_set)).iter().cloned().fold(acc, |inner: Rc>, callee: String| { - let current = match v2_rt::map_get(&inner, callee.clone()) { - Some(v) => v.clone(), - None => 0, -}; -v2_rt::rc_map_insert(inner.clone(), callee.clone(), (current.clone() + 1)) -}) -}); -let result = scc_result.processing_order.clone().iter().cloned().fold(Rc::new(TopoBuildAcc { - table: empty_intern_table(), - classes: v2_rt::rc_empty_map::(), - violations: Rc::new(vec![]), - fan_in: fan_in, - processed: v2_rt::rc_empty_map::(), -}), |acc: Rc, func_name: String| match v2_rt::map_get(&func_index, func_name.clone()) { - Some(entry) => { - let sr = get_or_compute_summary(&func_name, &func_index, &full_scc_index, &acc.table.clone(), parser_always_advancing.clone(), recursion_ctx.clone(), si.clone()); -let class_str = classify_complexity(sr.summary.clone().work.clone()); -let new_classes = v2_rt::rc_map_insert(acc.classes.clone(), func_name.clone(), class_str.clone()); -let new_processed = v2_rt::rc_map_insert(acc.processed.clone(), func_name.clone(), true); -let new_violations = if is_unknown_cost(sr.summary.clone().work.clone()) { - v2_rt::concat(acc.violations.clone(), Rc::new(vec![Rc::new(ComplexityViolation { - func_name: func_name.clone(), - reason: extract_unknown_reason(sr.summary.clone().work.clone()), - span: entry.span.clone(), -})])) - } else { - acc.violations.clone() - }; -let callees = match v2_rt::map_get(&scc_result.call_graph.clone().forward.clone(), func_name.clone()) { - Some(cs) => cs.clone(), - None => Rc::new(vec![]), -}; -let unique_set = callees.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |s: Rc>, c: String| v2_rt::rc_map_insert(s, c.clone(), true)); -let unique_callees = Rc::new(v2_rt::map_keys(&unique_set)); -let new_fan_in = unique_callees.clone().iter().cloned().fold(acc.fan_in.clone(), |fi: Rc>, callee: String| { - let current = match v2_rt::map_get(&fi, callee.clone()) { - Some(v) => v.clone(), - None => 0, -}; -v2_rt::rc_map_insert(fi.clone(), callee.clone(), (current.clone() - 1)) -}); -let evicted_table = unique_callees.clone().iter().cloned().fold(sr.table.clone(), |t: Rc, callee: String| { - let remaining = match v2_rt::map_get(&new_fan_in, callee.clone()) { - Some(v) => v.clone(), - None => 0, -}; -if ((remaining.clone() <= 0) && set_has(new_processed.clone(), callee.clone())) { - evict_summary(t.clone(), callee.clone()) - } else { - t.clone() + let func_index = func_entries.clone().iter().cloned().fold( + v2_rt::rc_empty_map::>(), + |acc: Rc>>, entry: Rc| { + v2_rt::rc_map_insert(acc, entry.name.clone(), entry.clone()) + }, + ); + let scc_result = build_scc_index(&func_entries, func_index.clone(), &si); + let parser_always_advancing = infer_all_parser_always_advancing(&func_index, &si); + let full_scc_index = func_entries.clone().iter().cloned().fold( + scc_result.index.clone(), + |acc: Rc>>, entry: Rc| match v2_rt::map_get( + &acc, + entry.name.clone(), + ) { + Some(_) => acc.clone(), + None => { + if (max_path_self_calls(entry.body.clone(), entry.name.clone(), si.clone()) > 0) + { + { + let pattern = classify_recursion_pattern( + &entry.name.clone(), + &entry.body.clone(), + &entry.params.clone(), + parser_always_advancing.clone(), + &si, + ); + let info = Rc::new(SccInfo { + members: Rc::new(vec![entry.name.clone()]), + member_set: v2_rt::rc_map_insert( + v2_rt::rc_empty_map::(), + entry.name.clone(), + true, + ), + pattern: pattern.clone(), + }); + v2_rt::rc_map_insert(acc.clone(), entry.name.clone(), info.clone()) + } + } else { + acc.clone() + } } -}); -let self_fan_in = match v2_rt::map_get(&new_fan_in, func_name.clone()) { - Some(v) => v.clone(), - None => 0, -}; -let final_table = if (self_fan_in.clone() <= 0) { - evict_summary(evicted_table.clone(), func_name.clone()) - } else { - evicted_table.clone() - }; -Rc::new(TopoBuildAcc { - table: final_table.clone(), - classes: new_classes.clone(), - violations: new_violations.clone(), - fan_in: new_fan_in.clone(), - processed: new_processed.clone(), -}) -}, - None => acc.clone(), -}); -let structural_bounds = analyze_structural_bounds(func_entries.clone(), si.clone()); -Rc::new(ComplexityReport { - function_classes: result.classes.clone(), - violations: result.violations.clone(), - structural_bounds: structural_bounds, -}) -} + }, + ); + let fan_in = func_entries.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, entry: Rc| { + let callees = match v2_rt::map_get( + &scc_result.call_graph.clone().forward.clone(), + entry.name.clone(), + ) { + Some(cs) => cs.clone(), + None => Rc::new(vec![]), + }; + let unique_set = callees.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |s: Rc>, c: String| { + v2_rt::rc_map_insert(s, c.clone(), true) + }, + ); + Rc::new(v2_rt::map_keys(&unique_set)).iter().cloned().fold( + acc, + |inner: Rc>, callee: String| { + let current = match v2_rt::map_get(&inner, callee.clone()) { + Some(v) => v.clone(), + None => 0, + }; + v2_rt::rc_map_insert(inner.clone(), callee.clone(), (current.clone() + 1)) + }, + ) + }, + ); + let result = scc_result.processing_order.clone().iter().cloned().fold( + Rc::new(TopoBuildAcc { + table: empty_intern_table(), + classes: v2_rt::rc_empty_map::(), + violations: Rc::new(vec![]), + fan_in: fan_in, + processed: v2_rt::rc_empty_map::(), + }), + |acc: Rc, func_name: String| match v2_rt::map_get( + &func_index, + func_name.clone(), + ) { + Some(entry) => { + let sr = get_or_compute_summary( + &func_name, + &func_index, + &full_scc_index, + &acc.table.clone(), + parser_always_advancing.clone(), + recursion_ctx.clone(), + si.clone(), + ); + let class_str = classify_complexity(sr.summary.clone().work.clone()); + let new_classes = v2_rt::rc_map_insert( + acc.classes.clone(), + func_name.clone(), + class_str.clone(), + ); + let new_processed = + v2_rt::rc_map_insert(acc.processed.clone(), func_name.clone(), true); + let new_violations = if is_unknown_cost(sr.summary.clone().work.clone()) { + v2_rt::concat( + acc.violations.clone(), + Rc::new(vec![Rc::new(ComplexityViolation { + func_name: func_name.clone(), + reason: extract_unknown_reason(sr.summary.clone().work.clone()), + span: entry.span.clone(), + })]), + ) + } else { + acc.violations.clone() + }; + let callees = match v2_rt::map_get( + &scc_result.call_graph.clone().forward.clone(), + func_name.clone(), + ) { + Some(cs) => cs.clone(), + None => Rc::new(vec![]), + }; + let unique_set = callees.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |s: Rc>, c: String| { + v2_rt::rc_map_insert(s, c.clone(), true) + }, + ); + let unique_callees = Rc::new(v2_rt::map_keys(&unique_set)); + let new_fan_in = unique_callees.clone().iter().cloned().fold( + acc.fan_in.clone(), + |fi: Rc>, callee: String| { + let current = match v2_rt::map_get(&fi, callee.clone()) { + Some(v) => v.clone(), + None => 0, + }; + v2_rt::rc_map_insert(fi.clone(), callee.clone(), (current.clone() - 1)) + }, + ); + let evicted_table = unique_callees.clone().iter().cloned().fold( + sr.table.clone(), + |t: Rc, callee: String| { + let remaining = match v2_rt::map_get(&new_fan_in, callee.clone()) { + Some(v) => v.clone(), + None => 0, + }; + if ((remaining.clone() <= 0) + && set_has(new_processed.clone(), callee.clone())) + { + evict_summary(t.clone(), callee.clone()) + } else { + t.clone() + } + }, + ); + let self_fan_in = match v2_rt::map_get(&new_fan_in, func_name.clone()) { + Some(v) => v.clone(), + None => 0, + }; + let final_table = if (self_fan_in.clone() <= 0) { + evict_summary(evicted_table.clone(), func_name.clone()) + } else { + evicted_table.clone() + }; + Rc::new(TopoBuildAcc { + table: final_table.clone(), + classes: new_classes.clone(), + violations: new_violations.clone(), + fan_in: new_fan_in.clone(), + processed: new_processed.clone(), + }) + } + None => acc.clone(), + }, + ); + let structural_bounds = analyze_structural_bounds(func_entries.clone(), si.clone()); + Rc::new(ComplexityReport { + function_classes: result.classes.clone(), + violations: result.violations.clone(), + structural_bounds: structural_bounds, + }) + } } diff --git a/src/v2/stage0/src/v2_compiler_effect_derivation.rs b/src/v2/stage0/src/v2_compiler_effect_derivation.rs index c3249dc60df..f3f15ded398 100644 --- a/src/v2/stage0/src/v2_compiler_effect_derivation.rs +++ b/src/v2/stage0/src/v2_compiler_effect_derivation.rs @@ -1,28 +1,49 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.effect_derivation -use std::collections::HashMap; -use std::rc::Rc; +use crate::std_effects::DeriveOpEffectResult::{ + DerivedEffect, MalformedPathInput, UnknownHttpMethodInput, +}; +use crate::std_effects::EffectShape::{ + AppendEffect, CreateEffect, DeleteEffect, ReadEffect, UpsertEffect, +}; +use crate::std_effects::IdempotencyEvidence::{IdentityEffect, LatticeEffect, NonIdempotent}; +use crate::std_effects::KeySource::{CompositeKey, InputField, PathParam}; +use crate::std_effects::ModifierAgreement::{Agrees, DerivationUnknown, Disagrees}; +pub use crate::std_effects::{ + check_modifier_vs_derivation, compose_effects, derive_effect_shape, derive_op_effect, + generate_idempotency_obligations, is_idempotent_effect, parse_http_method, ComposedEffect, + DeriveOpEffectResult, DerivedOpEffect, EffectShape, IdempotencyEvidence, + IdempotencyTestObligation, KeySource, ModifierAgreement, ModifierCheck, OperationEffect, + WorkflowEffectConcern, +}; +use crate::std_http_path::PathTemplateParseResult::{MalformedPathTemplate, ParsedPathTemplate}; +use crate::std_http_path::UrlPathToken::{LiteralToken, ParamToken}; +pub use crate::std_http_path::{ + has_path_params, last_path_param, parse_path_template, PathTemplate, PathTemplateParseResult, + UrlPathToken, +}; +pub use crate::std_types::HttpMethod; +use crate::std_types::HttpMethod::{DELETE, GET, HEAD, OPTIONS, PATCH, POST, PUT}; use crate::v2_rt; -use crate::NonEmptyVec; use crate::NonEmptyBTreeSet; -pub use crate::std_types::{HttpMethod}; -use crate::std_types::HttpMethod::{GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS}; -pub use crate::std_effects::{EffectShape, KeySource, DerivedOpEffect, DeriveOpEffectResult, ModifierAgreement, ModifierCheck, IdempotencyTestObligation, WorkflowEffectConcern, parse_http_method, derive_effect_shape, derive_op_effect, check_modifier_vs_derivation, generate_idempotency_obligations, is_idempotent_effect, compose_effects, OperationEffect, ComposedEffect, IdempotencyEvidence}; -use crate::std_effects::EffectShape::{ReadEffect, UpsertEffect, DeleteEffect, CreateEffect, AppendEffect}; -use crate::std_effects::KeySource::{PathParam, InputField, CompositeKey}; -use crate::std_effects::DeriveOpEffectResult::{DerivedEffect, UnknownHttpMethodInput, MalformedPathInput}; -use crate::std_effects::ModifierAgreement::{Agrees, Disagrees, DerivationUnknown}; -use crate::std_effects::IdempotencyEvidence::{LatticeEffect, IdentityEffect, NonIdempotent}; -pub use crate::std_http_path::{UrlPathToken, PathTemplate, PathTemplateParseResult, parse_path_template, has_path_params, last_path_param}; -use crate::std_http_path::UrlPathToken::{LiteralToken, ParamToken}; -use crate::std_http_path::PathTemplateParseResult::{ParsedPathTemplate, MalformedPathTemplate}; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; -pub fn re_export_derive_op_effect(operation_name: String, method_str: String, path_str: String) -> Rc { +pub fn re_export_derive_op_effect( + operation_name: String, + method_str: String, + path_str: String, +) -> Rc { derive_op_effect(operation_name, &method_str, path_str) } -pub fn re_export_check_modifier(op: Rc, declared_idempotent: bool, declared_readonly: bool) -> Rc { +pub fn re_export_check_modifier( + op: Rc, + declared_idempotent: bool, + declared_readonly: bool, +) -> Rc { check_modifier_vs_derivation(&op, &declared_idempotent, &declared_readonly) } diff --git a/src/v2/stage0/src/v2_compiler_emit.rs b/src/v2/stage0/src/v2_compiler_emit.rs index bdc4c8fb8f1..0f605521c74 100644 --- a/src/v2/stage0/src/v2_compiler_emit.rs +++ b/src/v2/stage0/src/v2_compiler_emit.rs @@ -1,56 +1,99 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.emit -use std::collections::HashMap; -use std::rc::Rc; -use crate::v2_rt; -use crate::NonEmptyVec; -use crate::NonEmptyBTreeSet; -pub use crate::v2_std_core::{Node, ErrorNode, InferredNode, is_compiler_error, module_imports, module_items, param_node_name_at, param_node_type_expr, param_node_default_value, NewlineIndex, authored_name_at, empty_intern_table, expr_var_name_at, expr_call_func_at, let_binding_name_at, field_access_field_at, ExprData, VarBindingKind, StringPart, LiteralValue, TextFile, SourceSpan, BinOp, UnaryOpKind, AlgebraFieldKind, DeclaredFuncSig, MethodSemantics, MatchPattern, field_binding_name_at, field_binding_pattern, FieldSummary, expr_method_name_at, method_arg_nodes, expr_method_call_semantics, expr_field_access_summary, lambda_param_names_at, record_lit_type_name_at, arm_body, arm_pattern, arm_guard, arg_name_at, arg_value, field_init_node_name_at, field_init_node_value, if_condition, if_then_branch, if_else_branch, match_scrutinee, match_arm_nodes, let_value, let_body, field_access_base, method_receiver, lambda_body, cast_expr, cast_target, return_value, binop_left, binop_right, foreach_variable_at, foreach_collection, foreach_body, index_base, index_expr, slice_base, slice_start, slice_end, unaryop_operand, expr_has_self_call, expr_has_non_tail_self_call, local_transport_node, is_rest_transport, is_shell_transport, is_file_transport, is_local_transport, transport_has_auth, field_init_operation_modifier, operation_modifier_name, with_required_cardinality, tuple_type_name, find_child_named, Connective, FieldAccessStyle, Cardinality}; -use crate::v2_std_core::InferredNode::{Resolved, CompilerError, TypeVariable}; -use crate::v2_std_core::ExprData::{NoExprData, ExprLiteral, ExprVar, ExprFieldAccess, ExprCall, ExprMethodCall, ExprMatch, ExprIf, ExprLet, ExprRecordLit, ExprListLit, ExprBinOp, ExprUnaryOp, ExprLambda, ExprStringInterp, ExprBlock, ExprCast, ExprForEach, ExprIndex, ExprSlice, ExprError, ExprReturn}; -use crate::v2_std_core::StringPart::{Text, Interpolation}; -use crate::v2_std_core::BinOp::{NullCoalesce}; -use crate::v2_std_core::MethodSemantics::{PlainMethodSemantics, AlgebraMethodSemantics, ServiceMethodSemantics}; -use crate::v2_std_core::MatchPattern::{Wildcard, Bind, LitPattern, VariantPattern}; -use crate::v2_std_core::FieldAccessStyle::{TupleFirst, TupleSecond}; -use crate::v2_std_core::Connective::{Conj, Disj, NoConnective, Arrow}; -use crate::v2_std_core::Cardinality::{CardOptional}; -use crate::v2_std_core::VarBindingKind::*; -use crate::v2_std_core::LiteralValue::*; -use crate::v2_std_core::UnaryOpKind::*; -use crate::v2_std_core::AlgebraFieldKind::*; -pub use crate::v2_compiler_infer_env::{TypeEnv, TypeBinding, authored_name}; -pub use crate::std_induction::{InductiveField, SubValueRelation}; -use crate::std_induction::SubValueRelation::{SubValueUnknown}; -pub use crate::v2_compiler_infer_types::{resolved_type, child_type_node, emit_map_has, node_is_collection, node_is_keyed_collection, node_is_element_collection, normalize_access_type_node, for_each_element_type_node, is_unit_like}; -pub use crate::std_types::{is_container_type, container_template_algebra}; -pub use crate::v2_compiler_coercion::{coerce_primitive_type, coerce_container_template, target_optional_template, target_callable, can_cast, render_cast, literal_suffix}; -pub use crate::v2_compiler_infer_sigs::{ResolvedFuncSig, ResolvedFuncEnv}; -pub use crate::v2_compiler_infer_items::{TypedModule, ResolvedGraph, ItemInfo}; -pub use crate::v2_compiler_infer_service::{UniqueAccum, OpEntry, is_typed_service_call_receiver, extract_typed_service_name}; -pub use crate::v2_compiler_infer::{InferScope, build_params_scope, extend_scope}; -pub use crate::v2_compiler_infer_emit_info::{TypeSummary, EmitGraphInfo}; -pub use crate::v2_compiler_artifact::{RenderTarget}; -use crate::v2_compiler_artifact::RenderTarget::{Rust, Python, Go, Dag}; -pub use crate::v2_compiler_languages::{LanguageSpec, TestConventions, ServiceFieldTemplates, BlockSyntax, TcoSyntax, ExpressionSemantics, VariantPatternSyntax, IfValueForm, VisibilitySpec, NamingCase, ReservedWordStrategy, StringInterpSyntax, InterpStyle, EscapePair, RecordLitSyntax, ImportRule, language_spec_for_target, is_string_like, test_conventions_for_target, target_keyword, binop_symbol, wrap_shared_type, service_self_param, service_receiver_str, service_method_depth, service_methods_inside_class, service_return_str, TestNameStyle, ImportTrigger}; -use crate::v2_compiler_languages::TestNameStyle::{SnakeCaseTestNames, PascalCaseTestNames}; -use crate::v2_compiler_languages::IfValueForm::{IfExpression, ConditionalTernary, IfStatement}; -use crate::v2_compiler_languages::VisibilitySpec::{KeywordVisibility, CaseVisibility}; -use crate::v2_compiler_languages::NamingCase::{PascalCase, SnakeCase, CamelCase, AsAuthored}; -use crate::v2_compiler_languages::ReservedWordStrategy::{PrefixEscape, SuffixEscape, NoEscape}; -use crate::v2_compiler_languages::InterpStyle::{FormatArgs, InlineExpr}; -use crate::v2_compiler_languages::ImportTrigger::{TypeUsageTrigger, TraitImplTrigger, DeriveMacroTrigger, ContainerUsageTrigger, AsyncUsageTrigger}; use self::BackendCapability::*; use self::ExprCategory::*; use self::FuncBodyShape::*; use self::TcoExprShape::*; +use crate::std_induction::SubValueRelation::SubValueUnknown; +pub use crate::std_induction::{InductiveField, SubValueRelation}; +pub use crate::std_types::{container_template_algebra, is_container_type}; +pub use crate::v2_compiler_artifact::RenderTarget; +use crate::v2_compiler_artifact::RenderTarget::{Dag, Go, Python, Rust}; +pub use crate::v2_compiler_coercion::{ + can_cast, coerce_container_template, coerce_primitive_type, literal_suffix, render_cast, + target_callable, target_optional_template, +}; +pub use crate::v2_compiler_infer::{build_params_scope, extend_scope, InferScope}; +pub use crate::v2_compiler_infer_emit_info::{EmitGraphInfo, TypeSummary}; +pub use crate::v2_compiler_infer_env::{authored_name, TypeBinding, TypeEnv}; +pub use crate::v2_compiler_infer_items::{ItemInfo, ResolvedGraph, TypedModule}; +pub use crate::v2_compiler_infer_service::{ + extract_typed_service_name, is_typed_service_call_receiver, OpEntry, UniqueAccum, +}; +pub use crate::v2_compiler_infer_sigs::{ResolvedFuncEnv, ResolvedFuncSig}; +pub use crate::v2_compiler_infer_types::{ + child_type_node, emit_map_has, for_each_element_type_node, is_unit_like, node_is_collection, + node_is_element_collection, node_is_keyed_collection, normalize_access_type_node, + resolved_type, +}; +use crate::v2_compiler_languages::IfValueForm::{ConditionalTernary, IfExpression, IfStatement}; +use crate::v2_compiler_languages::ImportTrigger::{ + AsyncUsageTrigger, ContainerUsageTrigger, DeriveMacroTrigger, TraitImplTrigger, + TypeUsageTrigger, +}; +use crate::v2_compiler_languages::InterpStyle::{FormatArgs, InlineExpr}; +use crate::v2_compiler_languages::NamingCase::{AsAuthored, CamelCase, PascalCase, SnakeCase}; +use crate::v2_compiler_languages::ReservedWordStrategy::{NoEscape, PrefixEscape, SuffixEscape}; +use crate::v2_compiler_languages::TestNameStyle::{PascalCaseTestNames, SnakeCaseTestNames}; +use crate::v2_compiler_languages::VisibilitySpec::{CaseVisibility, KeywordVisibility}; +pub use crate::v2_compiler_languages::{ + binop_symbol, is_string_like, language_spec_for_target, service_method_depth, + service_methods_inside_class, service_receiver_str, service_return_str, service_self_param, + target_keyword, test_conventions_for_target, wrap_shared_type, BlockSyntax, EscapePair, + ExpressionSemantics, IfValueForm, ImportRule, ImportTrigger, InterpStyle, LanguageSpec, + NamingCase, RecordLitSyntax, ReservedWordStrategy, ServiceFieldTemplates, StringInterpSyntax, + TcoSyntax, TestConventions, TestNameStyle, VariantPatternSyntax, VisibilitySpec, +}; +use crate::v2_rt; +use crate::v2_std_core::AlgebraFieldKind::*; +use crate::v2_std_core::BinOp::NullCoalesce; +use crate::v2_std_core::Cardinality::CardOptional; +use crate::v2_std_core::Connective::{Arrow, Conj, Disj, NoConnective}; +use crate::v2_std_core::ExprData::{ + ExprBinOp, ExprBlock, ExprCall, ExprCast, ExprError, ExprFieldAccess, ExprForEach, ExprIf, + ExprIndex, ExprLambda, ExprLet, ExprListLit, ExprLiteral, ExprMatch, ExprMethodCall, + ExprRecordLit, ExprReturn, ExprSlice, ExprStringInterp, ExprUnaryOp, ExprVar, NoExprData, +}; +use crate::v2_std_core::FieldAccessStyle::{TupleFirst, TupleSecond}; +use crate::v2_std_core::InferredNode::{CompilerError, Resolved, TypeVariable}; +use crate::v2_std_core::LiteralValue::*; +use crate::v2_std_core::MatchPattern::{Bind, LitPattern, VariantPattern, Wildcard}; +use crate::v2_std_core::MethodSemantics::{ + AlgebraMethodSemantics, PlainMethodSemantics, ServiceMethodSemantics, +}; +use crate::v2_std_core::StringPart::{Interpolation, Text}; +use crate::v2_std_core::UnaryOpKind::*; +use crate::v2_std_core::VarBindingKind::*; +pub use crate::v2_std_core::{ + arg_name_at, arg_value, arm_body, arm_guard, arm_pattern, authored_name_at, binop_left, + binop_right, cast_expr, cast_target, empty_intern_table, expr_call_func_at, + expr_field_access_summary, expr_has_non_tail_self_call, expr_has_self_call, + expr_method_call_semantics, expr_method_name_at, expr_var_name_at, field_access_base, + field_access_field_at, field_binding_name_at, field_binding_pattern, field_init_node_name_at, + field_init_node_value, field_init_operation_modifier, find_child_named, foreach_body, + foreach_collection, foreach_variable_at, if_condition, if_else_branch, if_then_branch, + index_base, index_expr, is_compiler_error, is_file_transport, is_local_transport, + is_rest_transport, is_shell_transport, lambda_body, lambda_param_names_at, let_binding_name_at, + let_body, let_value, local_transport_node, match_arm_nodes, match_scrutinee, method_arg_nodes, + method_receiver, module_imports, module_items, operation_modifier_name, + param_node_default_value, param_node_name_at, param_node_type_expr, record_lit_type_name_at, + return_value, slice_base, slice_end, slice_start, transport_has_auth, tuple_type_name, + unaryop_operand, with_required_cardinality, AlgebraFieldKind, BinOp, Cardinality, Connective, + DeclaredFuncSig, ErrorNode, ExprData, FieldAccessStyle, FieldSummary, InferredNode, + LiteralValue, MatchPattern, MethodSemantics, NewlineIndex, Node, SourceSpan, StringPart, + TextFile, UnaryOpKind, VarBindingKind, +}; +use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; pub fn is_type_variable(inferred: Rc) -> bool { match (*inferred).clone() { - InferredNode::TypeVariable { .. } => true, - _ => false, -} + InferredNode::TypeVariable { .. } => true, + _ => false, + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -115,46 +158,210 @@ pub fn has_mock_prefix(name: &String) -> bool { } pub fn extract_test_projections(typed: Rc) -> Rc>> { - Rc::new({ let mut __result = Vec::new(); for tm in typed.modules.clone().iter().cloned() { __result.extend((*Rc::new({ let mut __result = Vec::new(); for item in Rc::new({ let mut __result = Vec::new(); for item in tm.items.clone().iter().cloned() { if is_service_item(&item) { __result.push(item); } } __result }).iter().cloned() { __result.extend((*Rc::new({ let mut __result = Vec::new(); for c in Rc::new({ let mut __result = Vec::new(); for c in item.children.clone().iter().cloned() { if { let mut __found = false; for p in c.properties.clone().iter().cloned() { if has_mock_prefix(&field_init_node_name_at(p.clone(), tm.type_env.clone().source_indices.clone())) { __found = true; break; } } __found } { __result.push(c); } } __result }).iter().cloned() { __result.push(Rc::new(TestProjection { - module_name: authored_name_at(tm.type_env.clone().source_indices.clone(), &tm.module.clone()), - service_name: authored_name_at(tm.type_env.clone().source_indices.clone(), &item), - operation_name: authored_name_at(tm.type_env.clone().source_indices.clone(), &c), - inferred: resolved_type(c.clone()), - params: c.params.clone(), - mock_field_inits: Rc::new({ let mut __result = Vec::new(); for p in c.properties.clone().iter().cloned() { if has_mock_prefix(&field_init_node_name_at(p.clone(), tm.type_env.clone().source_indices.clone())) { __result.push(p); } } __result }), - source_indices: tm.type_env.clone().source_indices.clone(), -})); } __result })).iter().cloned()); } __result })).iter().cloned()); } __result }) + Rc::new({ + let mut __result = Vec::new(); + for tm in typed.modules.clone().iter().cloned() { + __result.extend( + (*Rc::new({ + let mut __result = Vec::new(); + for item in Rc::new({ + let mut __result = Vec::new(); + for item in tm.items.clone().iter().cloned() { + if is_service_item(&item) { + __result.push(item); + } + } + __result + }) + .iter() + .cloned() + { + __result.extend( + (*Rc::new({ + let mut __result = Vec::new(); + for c in Rc::new({ + let mut __result = Vec::new(); + for c in item.children.clone().iter().cloned() { + if { + let mut __found = false; + for p in c.properties.clone().iter().cloned() { + if has_mock_prefix(&field_init_node_name_at( + p.clone(), + tm.type_env.clone().source_indices.clone(), + )) { + __found = true; + break; + } + } + __found + } { + __result.push(c); + } + } + __result + }) + .iter() + .cloned() + { + __result.push(Rc::new(TestProjection { + module_name: authored_name_at( + tm.type_env.clone().source_indices.clone(), + &tm.module.clone(), + ), + service_name: authored_name_at( + tm.type_env.clone().source_indices.clone(), + &item, + ), + operation_name: authored_name_at( + tm.type_env.clone().source_indices.clone(), + &c, + ), + inferred: resolved_type(c.clone()), + params: c.params.clone(), + mock_field_inits: Rc::new({ + let mut __result = Vec::new(); + for p in c.properties.clone().iter().cloned() { + if has_mock_prefix(&field_init_node_name_at( + p.clone(), + tm.type_env.clone().source_indices.clone(), + )) { + __result.push(p); + } + } + __result + }), + source_indices: tm.type_env.clone().source_indices.clone(), + })); + } + __result + })) + .iter() + .cloned(), + ); + } + __result + })) + .iter() + .cloned(), + ); + } + __result + }) } -pub fn derive_module_imports(items: &Rc>>, import_rules: Rc>>, target: RenderTarget, source_indices: Rc>>) -> Rc> { +pub fn derive_module_imports( + items: &Rc>>, + import_rules: Rc>>, + target: RenderTarget, + source_indices: Rc>>, +) -> Rc> { { - let has_async = { let mut __found = false; for item in items.clone().iter().cloned() { if ((item.uses.clone().len() as i64) > 0) { __found = true; break; } } __found }; -let type_names = collect_type_names_from_items(items.clone(), source_indices); -Rc::new({ let mut __result = Vec::new(); for path in Rc::new({ let mut __result = Vec::new(); for rule in Rc::new({ let mut __result = Vec::new(); for rule in import_rules.iter().cloned() { if match (*rule.trigger.clone()).clone() { - ImportTrigger::TypeUsageTrigger { type_name: t, .. } => { let mut __found = false; for n in type_names.clone().iter().cloned() { if (n.clone().as_str() == t.clone().as_str()) { __found = true; break; } } __found }, - ImportTrigger::TraitImplTrigger { .. } => false, - ImportTrigger::DeriveMacroTrigger { .. } => false, - ImportTrigger::ContainerUsageTrigger { container: c, .. } => { let mut __found = false; for n in type_names.clone().iter().cloned() { if (n.clone().as_str() == c.clone().as_str()) { __found = true; break; } } __found }, - ImportTrigger::AsyncUsageTrigger => has_async.clone(), -} { __result.push(rule); } } __result }).iter().cloned() { __result.push(rule.import_path.clone()); } __result }).iter().cloned() { if (path.clone().as_str() != "".to_string().as_str()) { __result.push(path); } } __result }) -} + let has_async = { + let mut __found = false; + for item in items.clone().iter().cloned() { + if ((item.uses.clone().len() as i64) > 0) { + __found = true; + break; + } + } + __found + }; + let type_names = collect_type_names_from_items(items.clone(), source_indices); + Rc::new({ + let mut __result = Vec::new(); + for path in Rc::new({ + let mut __result = Vec::new(); + for rule in Rc::new({ + let mut __result = Vec::new(); + for rule in import_rules.iter().cloned() { + if match (*rule.trigger.clone()).clone() { + ImportTrigger::TypeUsageTrigger { type_name: t, .. } => { + let mut __found = false; + for n in type_names.clone().iter().cloned() { + if (n.clone().as_str() == t.clone().as_str()) { + __found = true; + break; + } + } + __found + } + ImportTrigger::TraitImplTrigger { .. } => false, + ImportTrigger::DeriveMacroTrigger { .. } => false, + ImportTrigger::ContainerUsageTrigger { container: c, .. } => { + let mut __found = false; + for n in type_names.clone().iter().cloned() { + if (n.clone().as_str() == c.clone().as_str()) { + __found = true; + break; + } + } + __found + } + ImportTrigger::AsyncUsageTrigger => has_async.clone(), + } { + __result.push(rule); + } + } + __result + }) + .iter() + .cloned() + { + __result.push(rule.import_path.clone()); + } + __result + }) + .iter() + .cloned() + { + if (path.clone().as_str() != "".to_string().as_str()) { + __result.push(path); + } + } + __result + }) + } } -pub fn collect_type_names_from_items(items: Rc>>, source_indices: Rc>>) -> Rc> { - Rc::new({ let mut __result = Vec::new(); for item in items.iter().cloned() { __result.extend((*collect_type_names_from_node(&item, &source_indices)).iter().cloned()); } __result }) +pub fn collect_type_names_from_items( + items: Rc>>, + source_indices: Rc>>, +) -> Rc> { + Rc::new({ + let mut __result = Vec::new(); + for item in items.iter().cloned() { + __result.extend( + (*collect_type_names_from_node(&item, &source_indices)) + .iter() + .cloned(), + ); + } + __result + }) } -pub fn collect_type_names_from_node(n: &Rc, source_indices: &Rc>>) -> Rc> { +pub fn collect_type_names_from_node( + n: &Rc, + source_indices: &Rc>>, +) -> Rc> { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - { - let self_name = if (n.ident_span.clone() != None) { - Rc::new(vec![authored_name_at(source_indices.clone(), &n)]) - } else { - Rc::new(vec![]) - }; -let child_names = Rc::new({ let mut __result = Vec::new(); for child in n.children.clone().iter().cloned() { __result.extend((*collect_type_names_from_node(&child, &source_indices)).iter().cloned()); } __result }); -v2_rt::concat(self_name, child_names) -} + let self_name = if (n.ident_span.clone() != None) { + Rc::new(vec![authored_name_at(source_indices.clone(), &n)]) + } else { + Rc::new(vec![]) + }; + let child_names = Rc::new({ + let mut __result = Vec::new(); + for child in n.children.clone().iter().cloned() { + __result.extend( + (*collect_type_names_from_node(&child, &source_indices)) + .iter() + .cloned(), + ); + } + __result + }); + v2_rt::concat(self_name, child_names) }) } @@ -164,345 +371,650 @@ pub struct InterpPart { pub arg_expr: String, } -pub fn emit_simple_expr(expr: &Rc, target: &RenderTarget, source_indices: &Rc>>) -> String { +pub fn emit_simple_expr( + expr: &Rc, + target: &RenderTarget, + source_indices: &Rc>>, +) -> String { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*expr.expr_data.clone()).clone() { - ExprData::ExprLiteral { value: v, .. } => emit_literal(v.clone(), &target), - ExprData::ExprError { message, .. } => emit_error_expr(message.clone(), target.clone()), - ExprData::ExprVar { .. } => emit_ident(expr_var_name_at(expr.clone(), source_indices.clone()), target.clone()), - ExprData::ExprFieldAccess { .. } => { - let f = field_access_field_at(expr.clone(), source_indices.clone()); -let b = field_access_base(expr.clone()); -if is_typed_service_call_receiver(&expr, source_indices.clone()) { - match extract_typed_service_name(&expr, &source_indices) { - Some(svc_name) => service_var_name(svc_name.clone()), - None => v2_rt::concat(v2_rt::concat(emit_simple_expr(&b, &target, &source_indices), ".".to_string()), emit_ident(f.clone(), target.clone())), -} - } else { - { - let base_is_fn = match (*b.expr_data.clone()).clone() { - ExprData::ExprVar { binding_kind: bk, .. } => match bk.clone().as_deref().cloned() { - Some(VarBindingKind::MatchBoundBinding) => false, - Some(VarBindingKind::VariantValueBinding { .. }) => false, - _ => true, -}, - _ => false, -}; -let base_str = emit_simple_expr(&b, &target, &source_indices); -let base_call = if base_is_fn.clone() { - v2_rt::concat(base_str, "()".to_string()) - } else { - base_str - }; -let field_str = v2_rt::concat(v2_rt::concat(base_call, ".".to_string()), emit_ident(f.clone(), target.clone())); -let needs_clone = (base_is_fn.clone() && match target.clone() { - RenderTarget::Rust => true, - _ => false, -}); -if needs_clone { - v2_rt::concat(field_str, ".clone()".to_string()) - } else { - field_str + ExprData::ExprLiteral { value: v, .. } => emit_literal(v.clone(), &target), + ExprData::ExprError { message, .. } => emit_error_expr(message.clone(), target.clone()), + ExprData::ExprVar { .. } => emit_ident( + expr_var_name_at(expr.clone(), source_indices.clone()), + target.clone(), + ), + ExprData::ExprFieldAccess { .. } => { + let f = field_access_field_at(expr.clone(), source_indices.clone()); + let b = field_access_base(expr.clone()); + if is_typed_service_call_receiver(&expr, source_indices.clone()) { + match extract_typed_service_name(&expr, &source_indices) { + Some(svc_name) => service_var_name(svc_name.clone()), + None => v2_rt::concat( + v2_rt::concat( + emit_simple_expr(&b, &target, &source_indices), + ".".to_string(), + ), + emit_ident(f.clone(), target.clone()), + ), } -} + } else { + { + let base_is_fn = match (*b.expr_data.clone()).clone() { + ExprData::ExprVar { + binding_kind: bk, .. + } => match bk.clone().as_deref().cloned() { + Some(VarBindingKind::MatchBoundBinding) => false, + Some(VarBindingKind::VariantValueBinding { .. }) => false, + _ => true, + }, + _ => false, + }; + let base_str = emit_simple_expr(&b, &target, &source_indices); + let base_call = if base_is_fn.clone() { + v2_rt::concat(base_str, "()".to_string()) + } else { + base_str + }; + let field_str = v2_rt::concat( + v2_rt::concat(base_call, ".".to_string()), + emit_ident(f.clone(), target.clone()), + ); + let needs_clone = (base_is_fn.clone() + && match target.clone() { + RenderTarget::Rust => true, + _ => false, + }); + if needs_clone { + v2_rt::concat(field_str, ".clone()".to_string()) + } else { + field_str + } + } + } } -}, - ExprData::ExprStringInterp => { - let ps = Rc::new({ let mut __result = Vec::new(); for child in expr.children.clone().iter().cloned() { __result.push(match (*child.expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitStr { value: text, .. } = value.as_ref() else { unreachable!() }; Rc::new(StringPart::Text { - value: text.clone(), -}) }, - _ => Rc::new(StringPart::Interpolation { - expr: arg_value(&child), -}), -}); } __result }); -emit_simple_string_interp(&ps, &target, source_indices.clone()) -}, - ExprData::ExprListLit => match target.clone() { - RenderTarget::Go => emit_error_expr("list literal in simple expr not yet supported for Go".to_string(), target.clone()), - _ => { - let el_strs = Rc::new({ let mut __result = Vec::new(); for e in expr.children.clone().iter().cloned() { __result.push(emit_simple_expr(&e, &target, &source_indices)); } __result }); -v2_rt::concat(v2_rt::concat("[".to_string(), el_strs.join(&", ".to_string())), "]".to_string()) -}, -}, - ExprData::ExprRecordLit { .. } => match target.clone() { - RenderTarget::Go => emit_error_expr("record literal in simple expr not yet supported for Go".to_string(), target.clone()), - _ => { - let field_strs = Rc::new({ let mut __result = Vec::new(); for f in expr.children.clone().iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(v2_rt::concat("\"".to_string(), field_init_node_name_at(f.clone(), source_indices.clone())), "\": ".to_string()), emit_simple_expr(&field_init_node_value(&f), &target, &source_indices))); } __result }); -v2_rt::concat(v2_rt::concat("{".to_string(), field_strs.join(&", ".to_string())), "}".to_string()) -}, -}, - _ => emit_error_expr("unsupported simple expr in test/mock binding".to_string(), target.clone()), -} + ExprData::ExprStringInterp => { + let ps = Rc::new({ + let mut __result = Vec::new(); + for child in expr.children.clone().iter().cloned() { + __result.push(match (*child.expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { + let LiteralValue::LitStr { value: text, .. } = value.as_ref() + else { + unreachable!() + }; + Rc::new(StringPart::Text { + value: text.clone(), + }) + } + _ => Rc::new(StringPart::Interpolation { + expr: arg_value(&child), + }), + }); + } + __result + }); + emit_simple_string_interp(&ps, &target, source_indices.clone()) + } + ExprData::ExprListLit => match target.clone() { + RenderTarget::Go => emit_error_expr( + "list literal in simple expr not yet supported for Go".to_string(), + target.clone(), + ), + _ => { + let el_strs = Rc::new({ + let mut __result = Vec::new(); + for e in expr.children.clone().iter().cloned() { + __result.push(emit_simple_expr(&e, &target, &source_indices)); + } + __result + }); + v2_rt::concat( + v2_rt::concat("[".to_string(), el_strs.join(&", ".to_string())), + "]".to_string(), + ) + } + }, + ExprData::ExprRecordLit { .. } => match target.clone() { + RenderTarget::Go => emit_error_expr( + "record literal in simple expr not yet supported for Go".to_string(), + target.clone(), + ), + _ => { + let field_strs = Rc::new({ + let mut __result = Vec::new(); + for f in expr.children.clone().iter().cloned() { + __result.push(v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "\"".to_string(), + field_init_node_name_at(f.clone(), source_indices.clone()), + ), + "\": ".to_string(), + ), + emit_simple_expr( + &field_init_node_value(&f), + &target, + &source_indices, + ), + )); + } + __result + }); + v2_rt::concat( + v2_rt::concat("{".to_string(), field_strs.join(&", ".to_string())), + "}".to_string(), + ) + } + }, + _ => emit_error_expr( + "unsupported simple expr in test/mock binding".to_string(), + target.clone(), + ), + } }) } -pub fn emit_simple_string_interp(parts: &Rc>>, target: &RenderTarget, source_indices: Rc>>) -> String { +pub fn emit_simple_string_interp( + parts: &Rc>>, + target: &RenderTarget, + source_indices: Rc>>, +) -> String { { let spec = language_spec(target.clone()); -let interp = spec.string_interp.clone(); -let has_interpolations = { let mut __found = false; for p in parts.clone().iter().cloned() { if match (*p.clone()).clone() { - StringPart::Interpolation { .. } => true, - _ => false, -} { __found = true; break; } } __found }; -match (*interp.style.clone()).clone() { - InterpStyle::FormatArgs { placeholder: ph, .. } => { - let fmt_parts = Rc::new({ let mut __result = Vec::new(); for p in parts.clone().iter().cloned() { __result.push(match (*p.clone()).clone() { - StringPart::Text { value: v, .. } => { - let base = escape_string_literal_body(v.clone()); -let escaped = if has_interpolations.clone() { - apply_escape_pairs(base.clone(), interp.escape_pairs.clone()) - } else { - base.clone() - }; -Rc::new(InterpPart { - format_segment: escaped.clone(), - arg_expr: "".to_string(), -}) -}, - StringPart::Interpolation { expr: e, .. } => Rc::new(InterpPart { - format_segment: ph.clone(), - arg_expr: emit_simple_expr(&e, &target, &source_indices), -}), -}); } __result }); -let fmt_str = Rc::new({ let mut __result = Vec::new(); for p in fmt_parts.clone().iter().cloned() { __result.push(p.format_segment.clone()); } __result }).join(&"".to_string()); -let args = Rc::new({ let mut __result = Vec::new(); for a in Rc::new({ let mut __result = Vec::new(); for p in fmt_parts.clone().iter().cloned() { __result.push(p.arg_expr.clone()); } __result }).iter().cloned() { if (a.clone().as_str() != "".to_string().as_str()) { __result.push(a); } } __result }); -if ((args.clone().len() as i64) == 0) { - apply_type_template1(interp.plain_template.clone(), fmt_str) - } else { - { - let args_str = args.clone().join(&", ".to_string()); -apply_type_template2(interp.format_template.clone(), fmt_str, args_str) -} + let interp = spec.string_interp.clone(); + let has_interpolations = { + let mut __found = false; + for p in parts.clone().iter().cloned() { + if match (*p.clone()).clone() { + StringPart::Interpolation { .. } => true, + _ => false, + } { + __found = true; + break; + } } -}, - InterpStyle::InlineExpr => { - let segments = Rc::new({ let mut __result = Vec::new(); for p in parts.clone().iter().cloned() { __result.push(match (*p.clone()).clone() { - StringPart::Text { value: v, .. } => { - let base = escape_string_literal_body(v.clone()); -if has_interpolations.clone() { - apply_escape_pairs(base.clone(), interp.escape_pairs.clone()) + __found + }; + match (*interp.style.clone()).clone() { + InterpStyle::FormatArgs { + placeholder: ph, .. + } => { + let fmt_parts = Rc::new({ + let mut __result = Vec::new(); + for p in parts.clone().iter().cloned() { + __result.push(match (*p.clone()).clone() { + StringPart::Text { value: v, .. } => { + let base = escape_string_literal_body(v.clone()); + let escaped = if has_interpolations.clone() { + apply_escape_pairs(base.clone(), interp.escape_pairs.clone()) + } else { + base.clone() + }; + Rc::new(InterpPart { + format_segment: escaped.clone(), + arg_expr: "".to_string(), + }) + } + StringPart::Interpolation { expr: e, .. } => Rc::new(InterpPart { + format_segment: ph.clone(), + arg_expr: emit_simple_expr(&e, &target, &source_indices), + }), + }); + } + __result + }); + let fmt_str = Rc::new({ + let mut __result = Vec::new(); + for p in fmt_parts.clone().iter().cloned() { + __result.push(p.format_segment.clone()); + } + __result + }) + .join(&"".to_string()); + let args = Rc::new({ + let mut __result = Vec::new(); + for a in Rc::new({ + let mut __result = Vec::new(); + for p in fmt_parts.clone().iter().cloned() { + __result.push(p.arg_expr.clone()); + } + __result + }) + .iter() + .cloned() + { + if (a.clone().as_str() != "".to_string().as_str()) { + __result.push(a); + } + } + __result + }); + if ((args.clone().len() as i64) == 0) { + apply_type_template1(interp.plain_template.clone(), fmt_str) } else { - base.clone() + { + let args_str = args.clone().join(&", ".to_string()); + apply_type_template2(interp.format_template.clone(), fmt_str, args_str) + } } -}, - StringPart::Interpolation { expr: e, .. } => v2_rt::concat(v2_rt::concat("{".to_string(), emit_simple_expr(&e, &target, &source_indices)), "}".to_string()), -}); } __result }); -apply_type_template1(interp.format_template.clone(), segments.join(&"".to_string())) -}, -} -} + } + InterpStyle::InlineExpr => { + let segments = Rc::new({ + let mut __result = Vec::new(); + for p in parts.clone().iter().cloned() { + __result.push(match (*p.clone()).clone() { + StringPart::Text { value: v, .. } => { + let base = escape_string_literal_body(v.clone()); + if has_interpolations.clone() { + apply_escape_pairs(base.clone(), interp.escape_pairs.clone()) + } else { + base.clone() + } + } + StringPart::Interpolation { expr: e, .. } => v2_rt::concat( + v2_rt::concat( + "{".to_string(), + emit_simple_expr(&e, &target, &source_indices), + ), + "}".to_string(), + ), + }); + } + __result + }); + apply_type_template1( + interp.format_template.clone(), + segments.join(&"".to_string()), + ) + } + } + } } pub fn empty_emit_scope() -> Rc { Rc::new(InferScope { - type_env: Rc::new(TypeEnv { - bindings: v2_rt::rc_empty_map::>(), - recursive_types: Rc::new(vec![]), - recursive_type_set: v2_rt::rc_empty_map::(), - inductive_fields: v2_rt::rc_empty_map::>>>(), - source_indices: v2_rt::rc_empty_map::>(), - intern_table: empty_intern_table(), -}), - func_env: Rc::new(ResolvedFuncEnv { - signatures: v2_rt::rc_empty_map::>(), -}), - locals: v2_rt::rc_empty_map::>(), - match_bound_names: v2_rt::rc_empty_map::(), - module_name: "".to_string(), - service_registry: v2_rt::rc_empty_map::>>>(), - item_registry: v2_rt::rc_empty_map::>(), - lambda_param_provenance: v2_rt::rc_empty_map::>(), -}) + type_env: Rc::new(TypeEnv { + bindings: v2_rt::rc_empty_map::>(), + recursive_types: Rc::new(vec![]), + recursive_type_set: v2_rt::rc_empty_map::(), + inductive_fields: v2_rt::rc_empty_map::>>>(), + source_indices: v2_rt::rc_empty_map::>(), + intern_table: empty_intern_table(), + }), + func_env: Rc::new(ResolvedFuncEnv { + signatures: v2_rt::rc_empty_map::>(), + }), + locals: v2_rt::rc_empty_map::>(), + match_bound_names: v2_rt::rc_empty_map::(), + module_name: "".to_string(), + service_registry: v2_rt::rc_empty_map::>>>(), + item_registry: v2_rt::rc_empty_map::>(), + lambda_param_provenance: v2_rt::rc_empty_map::>(), + }) } pub fn module_emit_scope(typed_module: &Rc) -> Rc { Rc::new(InferScope { - type_env: typed_module.type_env.clone(), - func_env: typed_module.func_env.clone(), - locals: v2_rt::rc_empty_map::>(), - match_bound_names: v2_rt::rc_empty_map::(), - module_name: authored_name_at(typed_module.type_env.clone().source_indices.clone(), &typed_module.module.clone()), - service_registry: v2_rt::rc_empty_map::>>>(), - item_registry: typed_module.item_registry.clone(), - lambda_param_provenance: v2_rt::rc_empty_map::>(), -}) + type_env: typed_module.type_env.clone(), + func_env: typed_module.func_env.clone(), + locals: v2_rt::rc_empty_map::>(), + match_bound_names: v2_rt::rc_empty_map::(), + module_name: authored_name_at( + typed_module.type_env.clone().source_indices.clone(), + &typed_module.module.clone(), + ), + service_registry: v2_rt::rc_empty_map::>>>(), + item_registry: typed_module.item_registry.clone(), + lambda_param_provenance: v2_rt::rc_empty_map::>(), + }) } pub fn scope_after_expr(texpr: &Rc, scope: &Rc) -> Rc { match (*texpr.expr_data.clone()).clone() { - ExprData::ExprLet => { - let ch = texpr.children.clone(); -let has_body = ((ch.len() as i64) > 1); -if (has_body == false) { - { - let value = let_value(texpr.clone()); -extend_scope(&scope, &let_binding_name_at(texpr.clone(), scope.type_env.clone().source_indices.clone()), resolved_type(value), Rc::new(SubValueRelation::SubValueUnknown)) -} - } else { - scope.clone() + ExprData::ExprLet => { + let ch = texpr.children.clone(); + let has_body = ((ch.len() as i64) > 1); + if (has_body == false) { + { + let value = let_value(texpr.clone()); + extend_scope( + &scope, + &let_binding_name_at( + texpr.clone(), + scope.type_env.clone().source_indices.clone(), + ), + resolved_type(value), + Rc::new(SubValueRelation::SubValueUnknown), + ) + } + } else { + scope.clone() + } } -}, - _ => scope.clone(), -} + _ => scope.clone(), + } } -pub fn lookup_item(registry: Rc>>, name: String) -> Option> { +pub fn lookup_item( + registry: Rc>>, + name: String, +) -> Option> { v2_rt::map_get(®istry, name) } -pub fn lookup_func_sig_in_scope(scope: Rc, name: String) -> Option> { +pub fn lookup_func_sig_in_scope( + scope: Rc, + name: String, +) -> Option> { v2_rt::map_get(&scope.func_env.clone().signatures.clone(), name) } -pub fn typed_named_arg_matches(arg: Rc, name: String, source_indices: Rc>>) -> bool { +pub fn typed_named_arg_matches( + arg: Rc, + name: String, + source_indices: Rc>>, +) -> bool { { let n = arg_name_at(arg, source_indices); -if (n.clone() == None) { + if (n.clone() == None) { false } else { (n.clone().unwrap().as_str() == name.as_str()) } -} + } } -pub fn order_typed_call_args(args: &Rc>>, func: String, scope: &Rc) -> Rc>> { +pub fn order_typed_call_args( + args: &Rc>>, + func: String, + scope: &Rc, +) -> Rc>> { { - let has_unnamed = { let mut __found = false; for arg in args.clone().iter().cloned() { if (arg_name_at(arg.clone(), scope.type_env.clone().source_indices.clone()) == None) { __found = true; break; } } __found }; -if has_unnamed { + let has_unnamed = { + let mut __found = false; + for arg in args.clone().iter().cloned() { + if (arg_name_at(arg.clone(), scope.type_env.clone().source_indices.clone()) == None) + { + __found = true; + break; + } + } + __found + }; + if has_unnamed { args.clone() } else { match lookup_func_sig_in_scope(scope.clone(), func) { - None => args.clone(), - Some(sig) => { - let arg_map = args.clone().iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, arg: Rc| { - let n = arg_name_at(arg.clone(), scope.type_env.clone().source_indices.clone()); -if (n.clone() != None) { - v2_rt::rc_map_insert(acc.clone(), n.clone().unwrap(), arg.clone()) - } else { - acc.clone() - } -}); -let param_name_set = sig.params.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, param: Rc| v2_rt::rc_map_insert(acc, param_node_name_at(param.clone(), scope.type_env.clone().source_indices.clone()), true)); -let ordered = Rc::new({ let mut __result = Vec::new(); for param in sig.params.clone().iter().cloned() { __result.extend((*match v2_rt::map_get(&arg_map, param_node_name_at(param.clone(), scope.type_env.clone().source_indices.clone())) { - Some(arg) => Rc::new(vec![arg.clone()]), - None => Rc::new(vec![]), -}).iter().cloned()); } __result }); -let leftovers = Rc::new({ let mut __result = Vec::new(); for arg in args.clone().iter().cloned() { if { - let n = arg_name_at(arg.clone(), scope.type_env.clone().source_indices.clone()); -if (n.clone() == None) { - true - } else { - (emit_map_has(param_name_set.clone(), n.clone().unwrap()) == false) - } -} { __result.push(arg); } } __result }); -v2_rt::concat(ordered, leftovers) -}, -} + None => args.clone(), + Some(sig) => { + let arg_map = args.clone().iter().cloned().fold( + v2_rt::rc_empty_map::>(), + |acc: Rc>>, arg: Rc| { + let n = arg_name_at( + arg.clone(), + scope.type_env.clone().source_indices.clone(), + ); + if (n.clone() != None) { + v2_rt::rc_map_insert(acc.clone(), n.clone().unwrap(), arg.clone()) + } else { + acc.clone() + } + }, + ); + let param_name_set = sig.params.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, param: Rc| { + v2_rt::rc_map_insert( + acc, + param_node_name_at( + param.clone(), + scope.type_env.clone().source_indices.clone(), + ), + true, + ) + }, + ); + let ordered = Rc::new({ + let mut __result = Vec::new(); + for param in sig.params.clone().iter().cloned() { + __result.extend( + (*match v2_rt::map_get( + &arg_map, + param_node_name_at( + param.clone(), + scope.type_env.clone().source_indices.clone(), + ), + ) { + Some(arg) => Rc::new(vec![arg.clone()]), + None => Rc::new(vec![]), + }) + .iter() + .cloned(), + ); + } + __result + }); + let leftovers = Rc::new({ + let mut __result = Vec::new(); + for arg in args.clone().iter().cloned() { + if { + let n = arg_name_at( + arg.clone(), + scope.type_env.clone().source_indices.clone(), + ); + if (n.clone() == None) { + true + } else { + (emit_map_has(param_name_set.clone(), n.clone().unwrap()) + == false) + } + } { + __result.push(arg); + } + } + __result + }); + v2_rt::concat(ordered, leftovers) + } + } } -} + } } pub fn unique_strings(items: Rc>) -> Rc> { { - let result = items.iter().cloned().fold(Rc::new(UniqueAccum { - seen: v2_rt::rc_empty_map::(), - result: Rc::new(vec![]), -}), |acc: Rc, item: String| if emit_map_has(acc.seen.clone(), item.clone()) { - acc.clone() - } else { + let result = items.iter().cloned().fold( Rc::new(UniqueAccum { - seen: v2_rt::rc_map_insert(acc.seen.clone(), item.clone(), true), - result: v2_rt::rc_list_push(acc.result.clone(), item.clone()), -}) - }); -result.result.clone() -} + seen: v2_rt::rc_empty_map::(), + result: Rc::new(vec![]), + }), + |acc: Rc, item: String| { + if emit_map_has(acc.seen.clone(), item.clone()) { + acc.clone() + } else { + Rc::new(UniqueAccum { + seen: v2_rt::rc_map_insert(acc.seen.clone(), item.clone(), true), + result: v2_rt::rc_list_push(acc.result.clone(), item.clone()), + }) + } + }, + ); + result.result.clone() + } } -pub fn has_nested_records_node(mut n: Rc, mut source_indices: Rc>>) -> bool { +pub fn has_nested_records_node( + mut n: Rc, + mut source_indices: Rc>>, +) -> bool { loop { let is_product = (n.connective.clone() == Connective::Conj); -let is_coproduct = (n.connective.clone() == Connective::Disj); -if is_product { + let is_coproduct = (n.connective.clone() == Connective::Disj); + if is_product { break true; -} else { + } else { if is_coproduct { let is_optional = (n.return_cardinality.clone() == Cardinality::CardOptional); -if is_optional { + if is_optional { { let __tco_0 = with_required_cardinality(&n); -n = __tco_0; -continue; -} -} else { + n = __tco_0; + continue; + } + } else { break false; -} -} else { + } + } else { let is_map = node_is_keyed_collection(&n, source_indices.clone()); -if is_map { + if is_map { match n.children.clone().get(1 as usize).cloned() { - Some(val_child) => { { - let __tco_0 = child_type_node(&val_child); -n = __tco_0; -continue; -} }, - None => { break false; }, -} -} else { + Some(val_child) => { + let __tco_0 = child_type_node(&val_child); + n = __tco_0; + continue; + } + None => { + break false; + } + } + } else { if ((n.children.clone().len() as i64) == 1) { match n.children.clone().first().cloned() { - Some(el) => { { - let __tco_0 = child_type_node(&el); -n = __tco_0; -continue; -} }, - None => { break false; }, -} -} else { + Some(el) => { + let __tco_0 = child_type_node(&el); + n = __tco_0; + continue; + } + None => { + break false; + } + } + } else { break false; -} -} -} -} -} + } + } + } + } + } } -pub fn emit_data_value_json(value: &Rc, source_indices: Rc>>) -> String { +pub fn emit_data_value_json( + value: &Rc, + source_indices: Rc>>, +) -> String { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*value.expr_data.clone()).clone() { - ExprData::ExprLiteral { value: v, .. } => match (*v.clone()).clone() { - LiteralValue::LitStr { value: s, .. } => v2_rt::concat(v2_rt::concat("\"".to_string(), escape_json_string(s.clone())), "\"".to_string()), - LiteralValue::LitInt { value: i, .. } => (i.clone()).to_string(), - LiteralValue::LitFloat { value: f, .. } => f.clone(), - LiteralValue::LitBool { value: b, .. } => if b.clone() { - "true".to_string() - } else { - "false".to_string() - }, - LiteralValue::LitNull => "null".to_string(), -}, - ExprData::ExprListLit => { - let el_strs = Rc::new({ let mut __result = Vec::new(); for e in value.children.clone().iter().cloned() { __result.push(emit_data_value_json(&e, source_indices.clone())); } __result }); -v2_rt::concat(v2_rt::concat("[".to_string(), el_strs.join(&", ".to_string())), "]".to_string()) -}, - ExprData::ExprRecordLit { .. } => { - let field_strs = Rc::new({ let mut __result = Vec::new(); for f in value.children.clone().iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(v2_rt::concat("\"".to_string(), escape_json_string(field_init_node_name_at(f.clone(), source_indices.clone()))), "\": ".to_string()), emit_data_value_json(&field_init_node_value(&f), source_indices.clone()))); } __result }); -v2_rt::concat(v2_rt::concat("{".to_string(), field_strs.join(&", ".to_string())), "}".to_string()) -}, - ExprData::ExprVar { .. } => v2_rt::concat(v2_rt::concat("\"".to_string(), escape_json_string(expr_var_name_at(value.clone(), source_indices.clone()))), "\"".to_string()), - ExprData::ExprUnaryOp { op: UnaryOpKind::Neg, .. } => v2_rt::concat("-".to_string(), emit_data_value_json(&unaryop_operand(value.clone()), source_indices.clone())), - _ => "\"compile_error!(unsupported mock expression)\"".to_string(), -} + ExprData::ExprLiteral { value: v, .. } => match (*v.clone()).clone() { + LiteralValue::LitStr { value: s, .. } => v2_rt::concat( + v2_rt::concat("\"".to_string(), escape_json_string(s.clone())), + "\"".to_string(), + ), + LiteralValue::LitInt { value: i, .. } => (i.clone()).to_string(), + LiteralValue::LitFloat { value: f, .. } => f.clone(), + LiteralValue::LitBool { value: b, .. } => { + if b.clone() { + "true".to_string() + } else { + "false".to_string() + } + } + LiteralValue::LitNull => "null".to_string(), + }, + ExprData::ExprListLit => { + let el_strs = Rc::new({ + let mut __result = Vec::new(); + for e in value.children.clone().iter().cloned() { + __result.push(emit_data_value_json(&e, source_indices.clone())); + } + __result + }); + v2_rt::concat( + v2_rt::concat("[".to_string(), el_strs.join(&", ".to_string())), + "]".to_string(), + ) + } + ExprData::ExprRecordLit { .. } => { + let field_strs = Rc::new({ + let mut __result = Vec::new(); + for f in value.children.clone().iter().cloned() { + __result.push(v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "\"".to_string(), + escape_json_string(field_init_node_name_at( + f.clone(), + source_indices.clone(), + )), + ), + "\": ".to_string(), + ), + emit_data_value_json( + &field_init_node_value(&f), + source_indices.clone(), + ), + )); + } + __result + }); + v2_rt::concat( + v2_rt::concat("{".to_string(), field_strs.join(&", ".to_string())), + "}".to_string(), + ) + } + ExprData::ExprVar { .. } => v2_rt::concat( + v2_rt::concat( + "\"".to_string(), + escape_json_string(expr_var_name_at(value.clone(), source_indices.clone())), + ), + "\"".to_string(), + ), + ExprData::ExprUnaryOp { + op: UnaryOpKind::Neg, + .. + } => v2_rt::concat( + "-".to_string(), + emit_data_value_json(&unaryop_operand(value.clone()), source_indices.clone()), + ), + _ => "\"compile_error!(unsupported mock expression)\"".to_string(), + } }) } pub fn escape_json_string(s: String) -> String { - Rc::new(Rc::new(Rc::new(Rc::new(s.split(&"\\".to_string()).map(|s| s.to_string()).collect::>()).join(&"\\\\".to_string()).split(&"\"".to_string()).map(|s| s.to_string()).collect::>()).join(&"\\\"".to_string()).split(&"\n".to_string()).map(|s| s.to_string()).collect::>()).join(&"\\n".to_string()).split(&"\t".to_string()).map(|s| s.to_string()).collect::>()).join(&"\\t".to_string()) + Rc::new( + Rc::new( + Rc::new( + Rc::new( + s.split(&"\\".to_string()) + .map(|s| s.to_string()) + .collect::>(), + ) + .join(&"\\\\".to_string()) + .split(&"\"".to_string()) + .map(|s| s.to_string()) + .collect::>(), + ) + .join(&"\\\"".to_string()) + .split(&"\n".to_string()) + .map(|s| s.to_string()) + .collect::>(), + ) + .join(&"\\n".to_string()) + .split(&"\t".to_string()) + .map(|s| s.to_string()) + .collect::>(), + ) + .join(&"\\t".to_string()) } pub fn module_to_filename(name: String) -> String { - Rc::new(name.split(&".".to_string()).map(|s| s.to_string()).collect::>()).join(&"_".to_string()) + Rc::new( + name.split(&".".to_string()) + .map(|s| s.to_string()) + .collect::>(), + ) + .join(&"_".to_string()) } pub fn make_indent(level: i64) -> String { @@ -518,15 +1030,26 @@ pub fn make_indent(level: i64) -> String { pub fn to_string(value: i64) -> String { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { if (value.clone() < 0) { - v2_rt::concat("-".to_string(), ((0 - value.clone())).to_string()) + v2_rt::concat("-".to_string(), (0 - value.clone()).to_string()) } else { if (value.clone() == 0) { "0".to_string() } else { { - let digit_chars = Rc::new(vec!["0".to_string(), "1".to_string(), "2".to_string(), "3".to_string(), "4".to_string(), "5".to_string(), "6".to_string(), "7".to_string(), "8".to_string(), "9".to_string()]); -to_string_helper(value.clone(), Rc::new(vec![])).join(&"".to_string()) -} + let digit_chars = Rc::new(vec![ + "0".to_string(), + "1".to_string(), + "2".to_string(), + "3".to_string(), + "4".to_string(), + "5".to_string(), + "6".to_string(), + "7".to_string(), + "8".to_string(), + "9".to_string(), + ]); + to_string_helper(value.clone(), Rc::new(vec![])).join(&"".to_string()) + } } } }) @@ -536,68 +1059,169 @@ pub fn to_string_helper(mut value: i64, mut acc: Rc>) -> Rc>()).iter().cloned() { if (p.0.clone() == digit.clone()) { __result.push(p); } } __result }).first().cloned() { - Some(p) => p.1.clone(), - None => "?".to_string(), -}; -{ + let rest = ((value.clone() - digit.clone()) / 10); + let digit_chars = Rc::new(vec![ + "0".to_string(), + "1".to_string(), + "2".to_string(), + "3".to_string(), + "4".to_string(), + "5".to_string(), + "6".to_string(), + "7".to_string(), + "8".to_string(), + "9".to_string(), + ]); + let ch = match Rc::new({ + let mut __result = Vec::new(); + for p in Rc::new( + digit_chars + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + { + if (p.0.clone() == digit.clone()) { + __result.push(p); + } + } + __result + }) + .first() + .cloned() + { + Some(p) => p.1.clone(), + None => "?".to_string(), + }; + { let __tco_0 = rest; -let __tco_1 = v2_rt::concat(Rc::new(vec![ch]), acc); -value = __tco_0; -acc = __tco_1; -continue; -} -} -} + let __tco_1 = v2_rt::concat(Rc::new(vec![ch]), acc); + value = __tco_0; + acc = __tco_1; + continue; + } + } + } } pub fn to_snake(name: String) -> String { { let chars_list = Rc::new(name.chars().map(|c| c as i64).collect::>()); -let result = Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(chars_list.iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { __result.push({ - let idx = pair.0.clone(); -let ch = pair.1.clone(); -if is_upper(ch.clone()) { - if (idx.clone() == 0) { - to_lower_char(ch.clone()) - } else { - v2_rt::concat("_".to_string(), to_lower_char(ch.clone())) - } - } else { - v2_rt::from_code_point(ch.clone()) + let result = Rc::new({ + let mut __result = Vec::new(); + for pair in Rc::new( + chars_list + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + { + __result.push({ + let idx = pair.0.clone(); + let ch = pair.1.clone(); + if is_upper(ch.clone()) { + if (idx.clone() == 0) { + to_lower_char(ch.clone()) + } else { + v2_rt::concat("_".to_string(), to_lower_char(ch.clone())) + } + } else { + v2_rt::from_code_point(ch.clone()) + } + }); } -}); } __result }); -result.join(&"".to_string()) -} + __result + }); + result.join(&"".to_string()) + } } pub fn to_screaming_snake(name: String) -> String { { let snake = to_snake(name); -Rc::new({ let mut __result = Vec::new(); for ch in Rc::new(snake.chars().map(|c| c as i64).collect::>()).iter().cloned() { __result.push(to_upper_char(ch.clone())); } __result }).join(&"".to_string()) -} + Rc::new({ + let mut __result = Vec::new(); + for ch in Rc::new(snake.chars().map(|c| c as i64).collect::>()) + .iter() + .cloned() + { + __result.push(to_upper_char(ch.clone())); + } + __result + }) + .join(&"".to_string()) + } } pub fn to_camel(name: String) -> String { { - let parts = Rc::new(name.clone().split(&"_".to_string()).map(|s| s.to_string()).collect::>()); -if ((parts.clone().len() as i64) == 0) { + let parts = Rc::new( + name.clone() + .split(&"_".to_string()) + .map(|s| s.to_string()) + .collect::>(), + ); + if ((parts.clone().len() as i64) == 0) { name.clone() } else { { let first_part = match parts.clone().first().cloned() { - Some(p) => Rc::new({ let mut __result = Vec::new(); for c in Rc::new(p.clone().chars().map(|c| c as i64).collect::>()).iter().cloned() { __result.push(to_lower_char(c.clone())); } __result }).join(&"".to_string()), - None => "".to_string(), -}; -let rest_parts = Rc::new({ let mut __result = Vec::new(); for pair in Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(parts.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { if (pair.0.clone() > 0) { __result.push(pair); } } __result }).iter().cloned() { __result.push(capitalize_first(pair.1.clone())); } __result }); -v2_rt::concat(first_part, rest_parts.join(&"".to_string())) -} + Some(p) => Rc::new({ + let mut __result = Vec::new(); + for c in Rc::new(p.clone().chars().map(|c| c as i64).collect::>()) + .iter() + .cloned() + { + __result.push(to_lower_char(c.clone())); + } + __result + }) + .join(&"".to_string()), + None => "".to_string(), + }; + let rest_parts = Rc::new({ + let mut __result = Vec::new(); + for pair in Rc::new({ + let mut __result = Vec::new(); + for pair in Rc::new( + parts + .clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + { + if (pair.0.clone() > 0) { + __result.push(pair); + } + } + __result + }) + .iter() + .cloned() + { + __result.push(capitalize_first(pair.1.clone())); + } + __result + }); + v2_rt::concat(first_part, rest_parts.join(&"".to_string())) + } } -} + } } pub fn is_upper(ch: i64) -> bool { @@ -607,74 +1231,123 @@ pub fn is_upper(ch: i64) -> bool { pub fn to_lower_char(ch: i64) -> String { { let cp = ch.clone(); -if ((cp.clone() >= 65) && (cp.clone() <= 90)) { + if ((cp.clone() >= 65) && (cp.clone() <= 90)) { { let lower_cp = (cp.clone() + 32); -v2_rt::from_code_point(lower_cp) -} + v2_rt::from_code_point(lower_cp) + } } else { v2_rt::from_code_point(ch.clone()) } -} + } } pub fn to_upper_char(ch: i64) -> String { { let cp = ch.clone(); -if ((cp.clone() >= 97) && (cp.clone() <= 122)) { + if ((cp.clone() >= 97) && (cp.clone() <= 122)) { { let upper_cp = (cp.clone() - 32); -v2_rt::from_code_point(upper_cp) -} + v2_rt::from_code_point(upper_cp) + } } else { v2_rt::from_code_point(ch.clone()) } -} + } } pub fn sanitize_service_name(name: String) -> String { { - let parts = Rc::new(name.split(&".".to_string()).map(|s| s.to_string()).collect::>()); -let pascal_parts = Rc::new({ let mut __result = Vec::new(); for p in parts.iter().cloned() { __result.push(capitalize_first(p.clone())); } __result }); -pascal_parts.join(&"".to_string()) -} -} + let parts = Rc::new( + name.split(&".".to_string()) + .map(|s| s.to_string()) + .collect::>(), + ); + let pascal_parts = Rc::new({ + let mut __result = Vec::new(); + for p in parts.iter().cloned() { + __result.push(capitalize_first(p.clone())); + } + __result + }); + pascal_parts.join(&"".to_string()) + } +} pub fn capitalize_first(s: String) -> String { { let chars_list = Rc::new(s.chars().map(|c| c as i64).collect::>()); -if ((chars_list.clone().len() as i64) == 0) { + if ((chars_list.clone().len() as i64) == 0) { "".to_string() } else { - Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(chars_list.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { __result.push(if (pair.0.clone() == 0) { - to_upper_char(pair.1.clone()) - } else { - v2_rt::from_code_point(pair.1.clone()) - }); } __result }).join(&"".to_string()) + Rc::new({ + let mut __result = Vec::new(); + for pair in Rc::new( + chars_list + .clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + { + __result.push(if (pair.0.clone() == 0) { + to_upper_char(pair.1.clone()) + } else { + v2_rt::from_code_point(pair.1.clone()) + }); + } + __result + }) + .join(&"".to_string()) } -} + } } pub fn to_pascal(name: String) -> String { { let snake = to_snake(name); -let parts = Rc::new(snake.split(&"_".to_string()).map(|s| s.to_string()).collect::>()); -let pascal_parts = Rc::new({ let mut __result = Vec::new(); for p in parts.iter().cloned() { __result.push(capitalize_first(p.clone())); } __result }); -pascal_parts.join(&"".to_string()) -} + let parts = Rc::new( + snake + .split(&"_".to_string()) + .map(|s| s.to_string()) + .collect::>(), + ); + let pascal_parts = Rc::new({ + let mut __result = Vec::new(); + for p in parts.iter().cloned() { + __result.push(capitalize_first(p.clone())); + } + __result + }); + pascal_parts.join(&"".to_string()) + } } pub fn apply_naming_case(name: String, case_style: NamingCase) -> String { match case_style { - NamingCase::PascalCase => { - let parts = Rc::new(name.split(&"_".to_string()).map(|s| s.to_string()).collect::>()); -let pascal_parts = Rc::new({ let mut __result = Vec::new(); for p in parts.iter().cloned() { __result.push(capitalize_first(p.clone())); } __result }); -pascal_parts.join(&"".to_string()) -}, - NamingCase::SnakeCase => to_snake(name), - NamingCase::CamelCase => to_camel(name), - NamingCase::AsAuthored => name, -} + NamingCase::PascalCase => { + let parts = Rc::new( + name.split(&"_".to_string()) + .map(|s| s.to_string()) + .collect::>(), + ); + let pascal_parts = Rc::new({ + let mut __result = Vec::new(); + for p in parts.iter().cloned() { + __result.push(capitalize_first(p.clone())); + } + __result + }); + pascal_parts.join(&"".to_string()) + } + NamingCase::SnakeCase => to_snake(name), + NamingCase::CamelCase => to_camel(name), + NamingCase::AsAuthored => name, + } } pub fn service_var_name(service_name: String) -> String { @@ -684,71 +1357,176 @@ pub fn service_var_name(service_name: String) -> String { pub fn test_file_path(module_name: String, target: &RenderTarget) -> String { { let conventions = test_conventions_for_target(target.clone()); -let file_dir = match conventions.file_dir.clone() { - Some(dir) => dir.clone(), - None => "".to_string(), -}; -let filename = module_to_filename(module_name); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(file_dir, conventions.file_prefix.clone()), filename), conventions.file_suffix.clone()), language_spec(target.clone()).scaffold.clone().source_file_extension.clone()) -} + let file_dir = match conventions.file_dir.clone() { + Some(dir) => dir.clone(), + None => "".to_string(), + }; + let filename = module_to_filename(module_name); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(file_dir, conventions.file_prefix.clone()), + filename, + ), + conventions.file_suffix.clone(), + ), + language_spec(target.clone()) + .scaffold + .clone() + .source_file_extension + .clone(), + ) + } } pub fn test_function_name(projection: &Rc, target: RenderTarget) -> String { { let conventions = test_conventions_for_target(target); -let formatted = match conventions.name_style.clone() { - TestNameStyle::SnakeCaseTestNames => v2_rt::concat(v2_rt::concat(to_snake(sanitize_service_name(projection.service_name.clone())), "_".to_string()), to_snake(projection.operation_name.clone())), - TestNameStyle::PascalCaseTestNames => v2_rt::concat(to_pascal(sanitize_service_name(projection.service_name.clone())), to_pascal(projection.operation_name.clone())), -}; -v2_rt::concat(conventions.function_prefix.clone(), formatted) -} + let formatted = match conventions.name_style.clone() { + TestNameStyle::SnakeCaseTestNames => v2_rt::concat( + v2_rt::concat( + to_snake(sanitize_service_name(projection.service_name.clone())), + "_".to_string(), + ), + to_snake(projection.operation_name.clone()), + ), + TestNameStyle::PascalCaseTestNames => v2_rt::concat( + to_pascal(sanitize_service_name(projection.service_name.clone())), + to_pascal(projection.operation_name.clone()), + ), + }; + v2_rt::concat(conventions.function_prefix.clone(), formatted) + } } pub fn apply_type_template1(template: String, arg0: String) -> String { - Rc::new(template.split(&"{0}".to_string()).map(|s| s.to_string()).collect::>()).join(&arg0) + Rc::new( + template + .split(&"{0}".to_string()) + .map(|s| s.to_string()) + .collect::>(), + ) + .join(&arg0) } pub fn apply_type_template2(template: String, arg0: String, arg1: String) -> String { { - let parts = Rc::new(template.split(&"{0}".to_string()).map(|s| s.to_string()).collect::>()); -let replaced = Rc::new({ let mut __result = Vec::new(); for p in parts.iter().cloned() { __result.push(Rc::new(p.clone().split(&"{1}".to_string()).map(|s| s.to_string()).collect::>()).join(&arg1.clone())); } __result }); -replaced.join(&arg0) -} + let parts = Rc::new( + template + .split(&"{0}".to_string()) + .map(|s| s.to_string()) + .collect::>(), + ); + let replaced = Rc::new({ + let mut __result = Vec::new(); + for p in parts.iter().cloned() { + __result.push( + Rc::new( + p.clone() + .split(&"{1}".to_string()) + .map(|s| s.to_string()) + .collect::>(), + ) + .join(&arg1.clone()), + ); + } + __result + }); + replaced.join(&arg0) + } } pub fn apply_type_template3(template: String, arg0: String, arg1: String, arg2: String) -> String { { - let parts0 = Rc::new(template.split(&"{0}".to_string()).map(|s| s.to_string()).collect::>()); -let replaced = Rc::new({ let mut __result = Vec::new(); for p0 in parts0.iter().cloned() { __result.push({ - let parts1 = Rc::new(p0.clone().split(&"{1}".to_string()).map(|s| s.to_string()).collect::>()); -let inner = Rc::new({ let mut __result = Vec::new(); for p1 in parts1.clone().iter().cloned() { __result.push(Rc::new(p1.clone().split(&"{2}".to_string()).map(|s| s.to_string()).collect::>()).join(&arg2.clone())); } __result }); -inner.clone().join(&arg1.clone()) -}); } __result }); -replaced.join(&arg0) -} + let parts0 = Rc::new( + template + .split(&"{0}".to_string()) + .map(|s| s.to_string()) + .collect::>(), + ); + let replaced = Rc::new({ + let mut __result = Vec::new(); + for p0 in parts0.iter().cloned() { + __result.push({ + let parts1 = Rc::new( + p0.clone() + .split(&"{1}".to_string()) + .map(|s| s.to_string()) + .collect::>(), + ); + let inner = Rc::new({ + let mut __result = Vec::new(); + for p1 in parts1.clone().iter().cloned() { + __result.push( + Rc::new( + p1.clone() + .split(&"{2}".to_string()) + .map(|s| s.to_string()) + .collect::>(), + ) + .join(&arg2.clone()), + ); + } + __result + }); + inner.clone().join(&arg1.clone()) + }); + } + __result + }); + replaced.join(&arg0) + } } pub fn apply_named_template(template: String, bindings: &Rc>) -> String { apply_named_template_nested(template, &bindings, &Rc::new(v2_rt::map_keys(&bindings))) } -pub fn apply_named_template_nested(template: String, bindings: &Rc>, keys: &Rc>) -> String { +pub fn apply_named_template_nested( + template: String, + bindings: &Rc>, + keys: &Rc>, +) -> String { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match keys.clone().first().cloned() { - None => template, - Some(key) => { - let rest = Rc::new(keys.clone().iter().cloned().skip(1 as usize).collect::>()); -let placeholder = v2_rt::concat(v2_rt::concat("{".to_string(), key.clone()), "}".to_string()); -match v2_rt::map_get(&bindings, key.clone()) { - Some(val) => { - let parts = Rc::new(template.split(&placeholder).map(|s| s.to_string()).collect::>()); -let processed = Rc::new({ let mut __result = Vec::new(); for part in parts.iter().cloned() { __result.push(apply_named_template_nested(part.clone(), &bindings, &rest)); } __result }); -processed.join(&val.clone()) -}, - None => v2_rt::concat("TEMPLATE_ERROR_MISSING_BINDING_".to_string(), key.clone()), -} -}, -} + None => template, + Some(key) => { + let rest = Rc::new( + keys.clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ); + let placeholder = + v2_rt::concat(v2_rt::concat("{".to_string(), key.clone()), "}".to_string()); + match v2_rt::map_get(&bindings, key.clone()) { + Some(val) => { + let parts = Rc::new( + template + .split(&placeholder) + .map(|s| s.to_string()) + .collect::>(), + ); + let processed = Rc::new({ + let mut __result = Vec::new(); + for part in parts.iter().cloned() { + __result.push(apply_named_template_nested( + part.clone(), + &bindings, + &rest, + )); + } + __result + }); + processed.join(&val.clone()) + } + None => { + v2_rt::concat("TEMPLATE_ERROR_MISSING_BINDING_".to_string(), key.clone()) + } + } + } + } }) } @@ -757,74 +1535,163 @@ pub fn language_spec(target: RenderTarget) -> Rc { } pub fn reserved_prefix(target: RenderTarget) -> String { - match (*language_spec(target).reserved_words.clone().strategy.clone()).clone() { - ReservedWordStrategy::PrefixEscape { prefix, .. } => prefix.clone(), - _ => "".to_string(), -} + match (*language_spec(target) + .reserved_words + .clone() + .strategy + .clone()) + .clone() + { + ReservedWordStrategy::PrefixEscape { prefix, .. } => prefix.clone(), + _ => "".to_string(), + } } pub fn reserved_suffix(target: RenderTarget) -> String { - match (*language_spec(target).reserved_words.clone().strategy.clone()).clone() { - ReservedWordStrategy::SuffixEscape { suffix, .. } => suffix.clone(), - _ => "".to_string(), -} + match (*language_spec(target) + .reserved_words + .clone() + .strategy + .clone()) + .clone() + { + ReservedWordStrategy::SuffixEscape { suffix, .. } => suffix.clone(), + _ => "".to_string(), + } } pub fn escape_string_literal_body(s: String) -> String { { - let escaped_backslash = Rc::new(s.split(&"\\".to_string()).map(|s| s.to_string()).collect::>()).join(&"\\\\".to_string()); -let escaped_quote = Rc::new(escaped_backslash.split(&"\"".to_string()).map(|s| s.to_string()).collect::>()).join(&"\\\"".to_string()); -let escaped_newline = Rc::new(escaped_quote.split(&"\n".to_string()).map(|s| s.to_string()).collect::>()).join(&"\\n".to_string()); -let escaped_return = Rc::new(escaped_newline.split(&"\\r".to_string()).map(|s| s.to_string()).collect::>()).join(&"\\r".to_string()); -Rc::new(escaped_return.split(&"\t".to_string()).map(|s| s.to_string()).collect::>()).join(&"\\t".to_string()) -} + let escaped_backslash = Rc::new( + s.split(&"\\".to_string()) + .map(|s| s.to_string()) + .collect::>(), + ) + .join(&"\\\\".to_string()); + let escaped_quote = Rc::new( + escaped_backslash + .split(&"\"".to_string()) + .map(|s| s.to_string()) + .collect::>(), + ) + .join(&"\\\"".to_string()); + let escaped_newline = Rc::new( + escaped_quote + .split(&"\n".to_string()) + .map(|s| s.to_string()) + .collect::>(), + ) + .join(&"\\n".to_string()); + let escaped_return = Rc::new( + escaped_newline + .split(&"\\r".to_string()) + .map(|s| s.to_string()) + .collect::>(), + ) + .join(&"\\r".to_string()); + Rc::new( + escaped_return + .split(&"\t".to_string()) + .map(|s| s.to_string()) + .collect::>(), + ) + .join(&"\\t".to_string()) + } } pub fn escape_rust_interp_text(s: String) -> String { { - let escaped = Rc::new(escape_string_literal_body(s).split(&"{".to_string()).map(|s| s.to_string()).collect::>()).join(&"{{".to_string()); -Rc::new(escaped.split(&"}".to_string()).map(|s| s.to_string()).collect::>()).join(&"}}".to_string()) -} + let escaped = Rc::new( + escape_string_literal_body(s) + .split(&"{".to_string()) + .map(|s| s.to_string()) + .collect::>(), + ) + .join(&"{{".to_string()); + Rc::new( + escaped + .split(&"}".to_string()) + .map(|s| s.to_string()) + .collect::>(), + ) + .join(&"}}".to_string()) + } } pub fn escape_go_interp_text(s: String) -> String { - Rc::new(escape_string_literal_body(s).split(&"%".to_string()).map(|s| s.to_string()).collect::>()).join(&"%%".to_string()) + Rc::new( + escape_string_literal_body(s) + .split(&"%".to_string()) + .map(|s| s.to_string()) + .collect::>(), + ) + .join(&"%%".to_string()) } pub fn escape_python_interp_text(s: String) -> String { { - let escaped = Rc::new(escape_string_literal_body(s).split(&"{".to_string()).map(|s| s.to_string()).collect::>()).join(&"{{".to_string()); -Rc::new(escaped.split(&"}".to_string()).map(|s| s.to_string()).collect::>()).join(&"}}".to_string()) -} + let escaped = Rc::new( + escape_string_literal_body(s) + .split(&"{".to_string()) + .map(|s| s.to_string()) + .collect::>(), + ) + .join(&"{{".to_string()); + Rc::new( + escaped + .split(&"}".to_string()) + .map(|s| s.to_string()) + .collect::>(), + ) + .join(&"}}".to_string()) + } } pub fn apply_escape_pairs(s: String, pairs: Rc>>) -> String { - pairs.iter().cloned().fold(s.clone(), |acc: String, pair: Rc| Rc::new(acc.split(&pair.from.clone()).map(|s| s.to_string()).collect::>()).join(&pair.to.clone())) + pairs + .iter() + .cloned() + .fold(s.clone(), |acc: String, pair: Rc| { + Rc::new( + acc.split(&pair.from.clone()) + .map(|s| s.to_string()) + .collect::>(), + ) + .join(&pair.to.clone()) + }) } pub fn emit_string_literal(s: String, suffix: String) -> String { - v2_rt::concat(v2_rt::concat(v2_rt::concat("\"".to_string(), escape_string_literal_body(s)), "\"".to_string()), suffix) + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("\"".to_string(), escape_string_literal_body(s)), + "\"".to_string(), + ), + suffix, + ) } pub fn is_null_coalesce(op: BinOp) -> bool { match op { - BinOp::NullCoalesce => true, - _ => false, -} + BinOp::NullCoalesce => true, + _ => false, + } } pub fn rust_literal_for_pattern(value: Rc) -> String { match (*value).clone() { - LiteralValue::LitStr { value: s, .. } => emit_string_literal(s.clone(), "".to_string()), - LiteralValue::LitInt { value: i, .. } => (i.clone()).to_string(), - LiteralValue::LitFloat { value: f, .. } => f.clone(), - LiteralValue::LitBool { value: b, .. } => if b.clone() { - emit_keyword("true".to_string(), RenderTarget::Rust) - } else { - emit_keyword("false".to_string(), RenderTarget::Rust) - }, - LiteralValue::LitNull => emit_keyword("null".to_string(), RenderTarget::Rust), -} + LiteralValue::LitStr { value: s, .. } => emit_string_literal(s.clone(), "".to_string()), + LiteralValue::LitInt { value: i, .. } => (i.clone()).to_string(), + LiteralValue::LitFloat { value: f, .. } => f.clone(), + LiteralValue::LitBool { value: b, .. } => { + if b.clone() { + emit_keyword("true".to_string(), RenderTarget::Rust) + } else { + emit_keyword("false".to_string(), RenderTarget::Rust) + } + } + LiteralValue::LitNull => emit_keyword("null".to_string(), RenderTarget::Rust), + } } pub fn emit_keyword(key: String, target: RenderTarget) -> String { @@ -833,29 +1700,41 @@ pub fn emit_keyword(key: String, target: RenderTarget) -> String { pub fn emit_literal(value: Rc, target: &RenderTarget) -> String { match (*value).clone() { - LiteralValue::LitStr { value: s, .. } => { - let suffix = match literal_suffix(target.clone(), "String".to_string()) { - Some(sfx) => sfx.clone(), - None => emit_error_expr("missing TypeCheckpoint for String literal suffix".to_string(), target.clone()), -}; -emit_string_literal(s.clone(), suffix) -}, - LiteralValue::LitInt { value: i, .. } => (i.clone()).to_string(), - LiteralValue::LitFloat { value: f, .. } => f.clone(), - LiteralValue::LitBool { value: b, .. } => if b.clone() { - emit_keyword("true".to_string(), target.clone()) - } else { - emit_keyword("false".to_string(), target.clone()) - }, - LiteralValue::LitNull => emit_keyword("null".to_string(), target.clone()), -} + LiteralValue::LitStr { value: s, .. } => { + let suffix = match literal_suffix(target.clone(), "String".to_string()) { + Some(sfx) => sfx.clone(), + None => emit_error_expr( + "missing TypeCheckpoint for String literal suffix".to_string(), + target.clone(), + ), + }; + emit_string_literal(s.clone(), suffix) + } + LiteralValue::LitInt { value: i, .. } => (i.clone()).to_string(), + LiteralValue::LitFloat { value: f, .. } => f.clone(), + LiteralValue::LitBool { value: b, .. } => { + if b.clone() { + emit_keyword("true".to_string(), target.clone()) + } else { + emit_keyword("false".to_string(), target.clone()) + } + } + LiteralValue::LitNull => emit_keyword("null".to_string(), target.clone()), + } } -pub fn emit_bin_op_symbol(op: BinOp, target: &RenderTarget, algebra_field: Option) -> String { +pub fn emit_bin_op_symbol( + op: BinOp, + target: &RenderTarget, + algebra_field: Option, +) -> String { match binop_symbol(target.clone(), op, algebra_field) { - Some(sym) => sym.clone(), - None => emit_error_expr("missing OperatorSpec for BinOp in target language".to_string(), target.clone()), -} + Some(sym) => sym.clone(), + None => emit_error_expr( + "missing OperatorSpec for BinOp in target language".to_string(), + target.clone(), + ), + } } pub fn emit_container(kind: &String, inner: String, target: &RenderTarget) -> String { @@ -863,303 +1742,467 @@ pub fn emit_container(kind: &String, inner: String, target: &RenderTarget) -> St apply_type_template1(target_optional_template(target.clone()), inner) } else { match coerce_container_template(target.clone(), kind.clone()) { - Some(template) => apply_type_template1(template.clone(), inner), - None => { - let spec = language_spec(target.clone()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(kind.clone(), spec.type_arg_open.clone()), inner), spec.type_arg_close.clone()) -}, -} + Some(template) => apply_type_template1(template.clone(), inner), + None => { + let spec = language_spec(target.clone()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(kind.clone(), spec.type_arg_open.clone()), + inner, + ), + spec.type_arg_close.clone(), + ) + } + } } } pub fn emit_map_type(key_type: String, val_type: String, target: RenderTarget) -> String { match coerce_container_template(target, "map".to_string()) { - Some(template) => apply_type_template2(template.clone(), key_type, val_type), - None => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("Map<".to_string(), key_type), ", ".to_string()), val_type), ">".to_string()), -} -} - -pub fn emit_node_type(n: Rc, target: RenderTarget, source_indices: Rc>>) -> String { - render_node_type(&n, &target, &v2_rt::rc_empty_map::(), &source_indices) + Some(template) => apply_type_template2(template.clone(), key_type, val_type), + None => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("Map<".to_string(), key_type), + ", ".to_string(), + ), + val_type, + ), + ">".to_string(), + ), + } } -pub fn render_node_type(n: &Rc, target: &RenderTarget, shared_types: &Rc>, source_indices: &Rc>>) -> String { +pub fn emit_node_type( + n: Rc, + target: RenderTarget, + source_indices: Rc>>, +) -> String { + render_node_type( + &n, + &target, + &v2_rt::rc_empty_map::(), + &source_indices, + ) +} + +pub fn render_node_type( + n: &Rc, + target: &RenderTarget, + shared_types: &Rc>, + source_indices: &Rc>>, +) -> String { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - { - let tn = authored_name_at(source_indices.clone(), &n); -let n_is_error = if (n.inferred.clone() != None) { - is_compiler_error(n.inferred.clone().clone().unwrap()) - } else { - false - }; -let n_is_type_var = if (n.inferred.clone() != None) { - is_type_variable(n.inferred.clone().clone().unwrap()) - } else { - false - }; -if ((n_is_type_var || n_is_error.clone()) && ((n.children.clone().len() as i64) == 0)) { - { - let label = if n_is_error.clone() { - "CompilerError".to_string() - } else { - "TypeVariable".to_string() - }; -let spec = language_spec(target.clone()); -let err_str = apply_type_template1(spec.error_type_template.clone(), v2_rt::concat("UNRESOLVED_".to_string(), label)); -return err_str -} + let tn = authored_name_at(source_indices.clone(), &n); + let n_is_error = if (n.inferred.clone() != None) { + is_compiler_error(n.inferred.clone().clone().unwrap()) + } else { + false + }; + let n_is_type_var = if (n.inferred.clone() != None) { + is_type_variable(n.inferred.clone().clone().unwrap()) + } else { + false + }; + if ((n_is_type_var || n_is_error.clone()) && ((n.children.clone().len() as i64) == 0)) { + { + let label = if n_is_error.clone() { + "CompilerError".to_string() + } else { + "TypeVariable".to_string() + }; + let spec = language_spec(target.clone()); + let err_str = apply_type_template1( + spec.error_type_template.clone(), + v2_rt::concat("UNRESOLVED_".to_string(), label), + ); + return err_str; } -let is_arrow = (n.connective.clone() == Connective::Arrow); -if is_arrow { - { - let repr = target_callable(target.clone()); -let param_strs = Rc::new({ let mut __result = Vec::new(); for p in n.params.clone().iter().cloned() { __result.push(render_node_type(¶m_node_type_expr(&p), &target, &shared_types, &source_indices)); } __result }); -let param_str = param_strs.join(&repr.param_separator.clone()); -let ret_str = match n.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => render_node_type(&rt, &target, &shared_types, &source_indices), - _ => language_spec(target.clone()).void_type.clone(), -}; -let spec = language_spec(target.clone()); -let result = match spec.callable_type_template.clone() { - Some(t) => v2_rt::replace(v2_rt::replace(t.clone(), "{params}".to_string(), param_str), "{return}".to_string(), ret_str.clone()), - None => if (ret_str.clone().as_str() == "".to_string().as_str()) { - { - let void_template = v2_rt::replace(repr.template.clone(), v2_rt::concat(repr.return_separator.clone(), "{return}".to_string()), "".to_string()); -v2_rt::replace(void_template, "{params}".to_string(), param_str) -} - } else { - v2_rt::replace(v2_rt::replace(repr.template.clone(), "{params}".to_string(), param_str), "{return}".to_string(), ret_str.clone()) - }, -}; -return result -} + } + let is_arrow = (n.connective.clone() == Connective::Arrow); + if is_arrow { + { + let repr = target_callable(target.clone()); + let param_strs = Rc::new({ + let mut __result = Vec::new(); + for p in n.params.clone().iter().cloned() { + __result.push(render_node_type( + ¶m_node_type_expr(&p), + &target, + &shared_types, + &source_indices, + )); + } + __result + }); + let param_str = param_strs.join(&repr.param_separator.clone()); + let ret_str = match n.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => { + render_node_type(&rt, &target, &shared_types, &source_indices) + } + _ => language_spec(target.clone()).void_type.clone(), + }; + let spec = language_spec(target.clone()); + let result = match spec.callable_type_template.clone() { + Some(t) => v2_rt::replace( + v2_rt::replace(t.clone(), "{params}".to_string(), param_str), + "{return}".to_string(), + ret_str.clone(), + ), + None => { + if (ret_str.clone().as_str() == "".to_string().as_str()) { + { + let void_template = v2_rt::replace( + repr.template.clone(), + v2_rt::concat( + repr.return_separator.clone(), + "{return}".to_string(), + ), + "".to_string(), + ); + v2_rt::replace(void_template, "{params}".to_string(), param_str) + } + } else { + v2_rt::replace( + v2_rt::replace( + repr.template.clone(), + "{params}".to_string(), + param_str, + ), + "{return}".to_string(), + ret_str.clone(), + ) + } + } + }; + return result; } -let is_optional = (n.return_cardinality.clone() == Cardinality::CardOptional); -if is_optional { - { - let inner_str = render_node_type(&with_required_cardinality(&n), &target, &shared_types, &source_indices); -let opt_str = emit_container(&"optional".to_string(), inner_str, &target); -return opt_str -} + } + let is_optional = (n.return_cardinality.clone() == Cardinality::CardOptional); + if is_optional { + { + let inner_str = render_node_type( + &with_required_cardinality(&n), + &target, + &shared_types, + &source_indices, + ); + let opt_str = emit_container(&"optional".to_string(), inner_str, &target); + return opt_str; } -let is_conj = (n.connective.clone() == Connective::Conj); -let is_disj = (n.connective.clone() == Connective::Disj); -let shared = emit_map_has(shared_types.clone(), tn.clone()); -if is_disj { - { - let base = if (n.ident_span.clone() != None) { - coerce_primitive_type(target.clone(), tn.clone()) - } else { - { - let spec = language_spec(target.clone()); -apply_type_template1(spec.error_type_template.clone(), "ANONYMOUS_COPRODUCT".to_string()) -} - }; -let disj_str = if shared.clone() { - wrap_shared_type(target.clone(), base.clone()) - } else { - base.clone() - }; -return disj_str -} + } + let is_conj = (n.connective.clone() == Connective::Conj); + let is_disj = (n.connective.clone() == Connective::Disj); + let shared = emit_map_has(shared_types.clone(), tn.clone()); + if is_disj { + { + let base = if (n.ident_span.clone() != None) { + coerce_primitive_type(target.clone(), tn.clone()) + } else { + { + let spec = language_spec(target.clone()); + apply_type_template1( + spec.error_type_template.clone(), + "ANONYMOUS_COPRODUCT".to_string(), + ) + } + }; + let disj_str = if shared.clone() { + wrap_shared_type(target.clone(), base.clone()) + } else { + base.clone() + }; + return disj_str; } -if is_conj { - { - if (n.type_annotation.clone() != None) { - { - let refined_str = match n.children.clone().first().cloned() { - Some(base) => render_node_type(&base, &target, &shared_types, &source_indices), - None => coerce_primitive_type(target.clone(), "Refined".to_string()), -}; -return refined_str -} + } + if is_conj { + { + if (n.type_annotation.clone() != None) { + { + let refined_str = match n.children.clone().first().cloned() { + Some(base) => { + render_node_type(&base, &target, &shared_types, &source_indices) + } + None => coerce_primitive_type(target.clone(), "Refined".to_string()), + }; + return refined_str; } -let is_pair = (((n.connective.clone() == Connective::Conj) && (n.ident_span.clone() == None)) && ((n.children.clone().len() as i64) == 2)); -if is_pair { - { - let first_child = match n.children.clone().first().cloned() { - Some(c) => if (c.inferred.clone() != None) { - render_node_type(&resolved_type(c.clone()), &target, &shared_types, &source_indices) - } else { - render_node_type(&c, &target, &shared_types, &source_indices) - }, - None => "_".to_string(), -}; -let second_child = match n.children.clone().get(1 as usize).cloned() { - Some(c) => if (c.inferred.clone() != None) { - render_node_type(&resolved_type(c.clone()), &target, &shared_types, &source_indices) - } else { - render_node_type(&c, &target, &shared_types, &source_indices) - }, - None => "_".to_string(), -}; -let tuple_str = render_tuple_parts(&Rc::new(vec![first_child, second_child]), target.clone()); -return tuple_str -} + } + let is_pair = (((n.connective.clone() == Connective::Conj) + && (n.ident_span.clone() == None)) + && ((n.children.clone().len() as i64) == 2)); + if is_pair { + { + let first_child = match n.children.clone().first().cloned() { + Some(c) => { + if (c.inferred.clone() != None) { + render_node_type( + &resolved_type(c.clone()), + &target, + &shared_types, + &source_indices, + ) + } else { + render_node_type(&c, &target, &shared_types, &source_indices) + } + } + None => "_".to_string(), + }; + let second_child = match n.children.clone().get(1 as usize).cloned() { + Some(c) => { + if (c.inferred.clone() != None) { + render_node_type( + &resolved_type(c.clone()), + &target, + &shared_types, + &source_indices, + ) + } else { + render_node_type(&c, &target, &shared_types, &source_indices) + } + } + None => "_".to_string(), + }; + let tuple_str = render_tuple_parts( + &Rc::new(vec![first_child, second_child]), + target.clone(), + ); + return tuple_str; } -if (n.ident_span.clone() != None) { - { - let snake = to_snake(tn.clone()); -let has_template = match container_template_algebra(snake.clone()) { - Some(_) => true, - None => false, -}; -if has_template { + } + if (n.ident_span.clone() != None) { + { + let snake = to_snake(tn.clone()); + let has_template = match container_template_algebra(snake.clone()) { + Some(_) => true, + None => false, + }; + if has_template { + { + let base = if (snake.clone().as_str() == "map".to_string().as_str()) { - let base = if (snake.clone().as_str() == "map".to_string().as_str()) { - emit_map_type("_".to_string(), "_".to_string(), target.clone()) - } else { - emit_container(&snake, "_".to_string(), &target) - }; -let conj_container_str = if shared.clone() { - wrap_shared_type(target.clone(), base.clone()) - } else { - base.clone() - }; -return conj_container_str -} + emit_map_type("_".to_string(), "_".to_string(), target.clone()) + } else { + emit_container(&snake, "_".to_string(), &target) + }; + let conj_container_str = if shared.clone() { + wrap_shared_type(target.clone(), base.clone()) + } else { + base.clone() + }; + return conj_container_str; } -let base = coerce_primitive_type(target.clone(), tn.clone()); -let conj_named_str = if shared.clone() { - wrap_shared_type(target.clone(), base.clone()) - } else { - base.clone() - }; -return conj_named_str -} + } + let base = coerce_primitive_type(target.clone(), tn.clone()); + let conj_named_str = if shared.clone() { + wrap_shared_type(target.clone(), base.clone()) + } else { + base.clone() + }; + return conj_named_str; } -let parts = Rc::new({ let mut __result = Vec::new(); for child in n.children.clone().iter().cloned() { __result.push(render_node_type(&resolved_type(child.clone()), &target, &shared_types, &source_indices)); } __result }); -let anon_str = render_tuple_parts(&parts, target.clone()); -return anon_str -} + } + let parts = Rc::new({ + let mut __result = Vec::new(); + for child in n.children.clone().iter().cloned() { + __result.push(render_node_type( + &resolved_type(child.clone()), + &target, + &shared_types, + &source_indices, + )); + } + __result + }); + let anon_str = render_tuple_parts(&parts, target.clone()); + return anon_str; } -if ((n.children.clone().len() as i64) == 0) { + } + if ((n.children.clone().len() as i64) == 0) { + { + let bare_is_map = (is_container_type(tn.clone()) + && (to_snake(tn.clone()).as_str() == "map".to_string().as_str())); + let bare_is_collection = (is_container_type(tn.clone()) && !bare_is_map.clone()); + let has_container_template = match container_template_algebra(to_snake(tn.clone())) { - let bare_is_map = (is_container_type(tn.clone()) && (to_snake(tn.clone()).as_str() == "map".to_string().as_str())); -let bare_is_collection = (is_container_type(tn.clone()) && !bare_is_map.clone()); -let has_container_template = match container_template_algebra(to_snake(tn.clone())) { - Some(_) => true, - None => false, -}; -let param_count = (n.params.clone().len() as i64); -let base = if bare_is_map.clone() { - emit_map_type("_".to_string(), "_".to_string(), target.clone()) + Some(_) => true, + None => false, + }; + let param_count = (n.params.clone().len() as i64); + let base = if bare_is_map.clone() { + emit_map_type("_".to_string(), "_".to_string(), target.clone()) + } else { + if bare_is_collection { + emit_container(&to_snake(tn.clone()), "_".to_string(), &target) } else { - if bare_is_collection { - emit_container(&to_snake(tn.clone()), "_".to_string(), &target) + if (has_container_template && (param_count == 1)) { + { + let inner = match n.params.clone().first().cloned() { + Some(p) => render_node_type( + ¶m_node_type_expr(&p), + &target, + &shared_types, + &source_indices, + ), + None => "_".to_string(), + }; + emit_container(&to_snake(tn.clone()), inner, &target) + } } else { - if (has_container_template && (param_count == 1)) { - { - let inner = match n.params.clone().first().cloned() { - Some(p) => render_node_type(¶m_node_type_expr(&p), &target, &shared_types, &source_indices), - None => "_".to_string(), -}; -emit_container(&to_snake(tn.clone()), inner, &target) -} + if (tn.clone().as_str() == tuple_type_name().as_str()) { + render_tuple_parts(&Rc::new(vec![]), target.clone()) } else { - if (tn.clone().as_str() == tuple_type_name().as_str()) { - render_tuple_parts(&Rc::new(vec![]), target.clone()) - } else { - coerce_primitive_type(target.clone(), tn.clone()) - } + coerce_primitive_type(target.clone(), tn.clone()) } } - }; -let bare_str = if shared.clone() { - wrap_shared_type(target.clone(), base.clone()) - } else { - base.clone() - }; -return bare_str -} + } + }; + let bare_str = if shared.clone() { + wrap_shared_type(target.clone(), base.clone()) + } else { + base.clone() + }; + return bare_str; } -let is_map = node_is_keyed_collection(&n, source_indices.clone()); -if is_map { - { - let k = match n.children.clone().first().cloned() { - Some(kn) => render_node_type(&child_type_node(&kn), &target, &shared_types, &source_indices), - None => "_".to_string(), -}; -let v = match n.children.clone().get(1 as usize).cloned() { - Some(vn) => render_node_type(&child_type_node(&vn), &target, &shared_types, &source_indices), - None => "_".to_string(), -}; -let base = emit_map_type(k, v, target.clone()); -let map_str = if shared.clone() { - wrap_shared_type(target.clone(), base.clone()) - } else { - base.clone() - }; -return map_str -} + } + let is_map = node_is_keyed_collection(&n, source_indices.clone()); + if is_map { + { + let k = match n.children.clone().first().cloned() { + Some(kn) => render_node_type( + &child_type_node(&kn), + &target, + &shared_types, + &source_indices, + ), + None => "_".to_string(), + }; + let v = match n.children.clone().get(1 as usize).cloned() { + Some(vn) => render_node_type( + &child_type_node(&vn), + &target, + &shared_types, + &source_indices, + ), + None => "_".to_string(), + }; + let base = emit_map_type(k, v, target.clone()); + let map_str = if shared.clone() { + wrap_shared_type(target.clone(), base.clone()) + } else { + base.clone() + }; + return map_str; } -if ((n.children.clone().len() as i64) == 1) { - { - let child_str = match n.children.clone().first().cloned() { - Some(child) => render_node_type(&child_type_node(&child), &target, &shared_types, &source_indices), - None => "_".to_string(), -}; -let is_container = node_is_collection(&n, source_indices.clone()); -let base = if is_container { - emit_container(&to_snake(tn.clone()), child_str, &target) - } else { - { - let type_base = coerce_primitive_type(target.clone(), tn.clone()); -let spec = language_spec(target.clone()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(type_base.clone(), spec.type_arg_open.clone()), child_str), spec.type_arg_close.clone()) -} - }; -let single_str = if shared.clone() { - wrap_shared_type(target.clone(), base.clone()) - } else { - base.clone() - }; -return single_str -} + } + if ((n.children.clone().len() as i64) == 1) { + { + let child_str = match n.children.clone().first().cloned() { + Some(child) => render_node_type( + &child_type_node(&child), + &target, + &shared_types, + &source_indices, + ), + None => "_".to_string(), + }; + let is_container = node_is_collection(&n, source_indices.clone()); + let base = if is_container { + emit_container(&to_snake(tn.clone()), child_str, &target) + } else { + { + let type_base = coerce_primitive_type(target.clone(), tn.clone()); + let spec = language_spec(target.clone()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(type_base.clone(), spec.type_arg_open.clone()), + child_str, + ), + spec.type_arg_close.clone(), + ) + } + }; + let single_str = if shared.clone() { + wrap_shared_type(target.clone(), base.clone()) + } else { + base.clone() + }; + return single_str; } -let child_strs = Rc::new({ let mut __result = Vec::new(); for c in n.children.clone().iter().cloned() { __result.push(render_node_type(&child_type_node(&c), &target, &shared_types, &source_indices)); } __result }); -if (tn.clone().as_str() == tuple_type_name().as_str()) { - { - let multi_tuple_str = render_tuple_parts(&child_strs, target.clone()); -return multi_tuple_str -} + } + let child_strs = Rc::new({ + let mut __result = Vec::new(); + for c in n.children.clone().iter().cloned() { + __result.push(render_node_type( + &child_type_node(&c), + &target, + &shared_types, + &source_indices, + )); } -let type_base = coerce_primitive_type(target.clone(), tn.clone()); -let args_joined = child_strs.clone().join(&", ".to_string()); -let spec = language_spec(target.clone()); -let base = v2_rt::concat(v2_rt::concat(v2_rt::concat(type_base.clone(), spec.type_arg_open.clone()), args_joined), spec.type_arg_close.clone()); -if shared.clone() { - wrap_shared_type(target.clone(), base.clone()) - } else { - base.clone() + __result + }); + if (tn.clone().as_str() == tuple_type_name().as_str()) { + { + let multi_tuple_str = render_tuple_parts(&child_strs, target.clone()); + return multi_tuple_str; } -} + } + let type_base = coerce_primitive_type(target.clone(), tn.clone()); + let args_joined = child_strs.clone().join(&", ".to_string()); + let spec = language_spec(target.clone()); + let base = v2_rt::concat( + v2_rt::concat( + v2_rt::concat(type_base.clone(), spec.type_arg_open.clone()), + args_joined, + ), + spec.type_arg_close.clone(), + ); + if shared.clone() { + wrap_shared_type(target.clone(), base.clone()) + } else { + base.clone() + } }) } pub fn render_tuple_parts(parts: &Rc>, target: RenderTarget) -> String { { let spec = language_spec(target); -let ts = spec.tuple_syntax.clone(); -if ((parts.clone().len() as i64) > 0) { + let ts = spec.tuple_syntax.clone(); + if ((parts.clone().len() as i64) > 0) { if ((parts.clone().len() as i64) == 2) { match parts.clone().first().cloned() { - Some(p0) => match parts.clone().get(1 as usize).cloned() { - Some(p1) => apply_type_template2(ts.pair_template.clone(), p0.clone(), p1.clone()), - None => apply_type_template1(ts.multi_template.clone(), parts.clone().join(&ts.separator.clone())), -}, - None => apply_type_template1(ts.multi_template.clone(), parts.clone().join(&ts.separator.clone())), -} + Some(p0) => match parts.clone().get(1 as usize).cloned() { + Some(p1) => { + apply_type_template2(ts.pair_template.clone(), p0.clone(), p1.clone()) + } + None => apply_type_template1( + ts.multi_template.clone(), + parts.clone().join(&ts.separator.clone()), + ), + }, + None => apply_type_template1( + ts.multi_template.clone(), + parts.clone().join(&ts.separator.clone()), + ), + } } else { - apply_type_template1(ts.multi_template.clone(), parts.clone().join(&ts.separator.clone())) + apply_type_template1( + ts.multi_template.clone(), + parts.clone().join(&ts.separator.clone()), + ) } } else { ts.empty.clone() } -} + } } -pub fn is_type_alias_return_node(n: Rc, source_indices: Rc>>) -> bool { +pub fn is_type_alias_return_node( + n: Rc, + source_indices: Rc>>, +) -> bool { (authored_name_at(source_indices, &n).as_str() != "Unit".to_string().as_str()) } @@ -1168,7 +2211,25 @@ pub fn is_service_item(item: &Rc) -> bool { } pub fn has_service_items(typed: Rc) -> bool { - { let mut __found = false; for tm in typed.modules.clone().iter().cloned() { if { let mut __found = false; for item in tm.items.clone().iter().cloned() { if is_service_item(&item) { __found = true; break; } } __found } { __found = true; break; } } __found } + { + let mut __found = false; + for tm in typed.modules.clone().iter().cloned() { + if { + let mut __found = false; + for item in tm.items.clone().iter().cloned() { + if is_service_item(&item) { + __found = true; + break; + } + } + __found + } { + __found = true; + break; + } + } + __found + } } pub fn service_fallback_transport(item: &Rc) -> Rc { @@ -1181,76 +2242,144 @@ pub fn service_fallback_transport(item: &Rc) -> Rc { pub fn effective_operation_transport(op_node: Rc, fallback: Rc) -> Rc { match op_node.transport.clone() { - Some(op_transport) => op_transport.clone(), - None => fallback, -} + Some(op_transport) => op_transport.clone(), + None => fallback, + } } -pub fn service_has_rest(fallback_transport: Rc, op_children: Rc>>, source_indices: &Rc>>) -> bool { +pub fn service_has_rest( + fallback_transport: Rc, + op_children: Rc>>, + source_indices: &Rc>>, +) -> bool { { let from_fallback = is_rest_transport(fallback_transport, source_indices.clone()); -let from_ops = { let mut __found = false; for op in op_children.iter().cloned() { if if (op.transport.clone() != None) { - is_rest_transport(op.transport.clone().clone().unwrap(), source_indices.clone()) - } else { - false - } { __found = true; break; } } __found }; -(from_fallback || from_ops) -} + let from_ops = { + let mut __found = false; + for op in op_children.iter().cloned() { + if if (op.transport.clone() != None) { + is_rest_transport( + op.transport.clone().clone().unwrap(), + source_indices.clone(), + ) + } else { + false + } { + __found = true; + break; + } + } + __found + }; + (from_fallback || from_ops) + } } pub fn service_has_shell(fallback_transport: Rc, op_children: Rc>>) -> bool { { let from_fallback = is_shell_transport(fallback_transport); -let from_ops = { let mut __found = false; for op in op_children.iter().cloned() { if if (op.transport.clone() != None) { - is_shell_transport(op.transport.clone().clone().unwrap()) - } else { - false - } { __found = true; break; } } __found }; -(from_fallback || from_ops) -} + let from_ops = { + let mut __found = false; + for op in op_children.iter().cloned() { + if if (op.transport.clone() != None) { + is_shell_transport(op.transport.clone().clone().unwrap()) + } else { + false + } { + __found = true; + break; + } + } + __found + }; + (from_fallback || from_ops) + } } -pub fn service_has_file(fallback_transport: Rc, op_children: Rc>>, source_indices: &Rc>>) -> bool { +pub fn service_has_file( + fallback_transport: Rc, + op_children: Rc>>, + source_indices: &Rc>>, +) -> bool { { let from_fallback = is_file_transport(fallback_transport, source_indices.clone()); -let from_ops = { let mut __found = false; for op in op_children.iter().cloned() { if if (op.transport.clone() != None) { - is_file_transport(op.transport.clone().clone().unwrap(), source_indices.clone()) - } else { - false - } { __found = true; break; } } __found }; -(from_fallback || from_ops) -} + let from_ops = { + let mut __found = false; + for op in op_children.iter().cloned() { + if if (op.transport.clone() != None) { + is_file_transport( + op.transport.clone().clone().unwrap(), + source_indices.clone(), + ) + } else { + false + } { + __found = true; + break; + } + } + __found + }; + (from_fallback || from_ops) + } } -pub fn service_has_rest_auth(fallback_transport: &Rc, op_children: Rc>>, source_indices: &Rc>>) -> bool { +pub fn service_has_rest_auth( + fallback_transport: &Rc, + op_children: Rc>>, + source_indices: &Rc>>, +) -> bool { { - let fallback_is_rest = is_rest_transport(fallback_transport.clone(), source_indices.clone()); -let from_fallback = if fallback_is_rest { + let fallback_is_rest = + is_rest_transport(fallback_transport.clone(), source_indices.clone()); + let from_fallback = if fallback_is_rest { transport_has_auth(fallback_transport.clone(), source_indices.clone()) } else { false }; -let from_ops = { let mut __found = false; for op in op_children.iter().cloned() { if if (op.transport.clone() != None) { - { - let t = op.transport.clone().clone().unwrap(); -if is_rest_transport(t.clone(), source_indices.clone()) { - transport_has_auth(t.clone(), source_indices.clone()) + let from_ops = { + let mut __found = false; + for op in op_children.iter().cloned() { + if if (op.transport.clone() != None) { + { + let t = op.transport.clone().clone().unwrap(); + if is_rest_transport(t.clone(), source_indices.clone()) { + transport_has_auth(t.clone(), source_indices.clone()) + } else { + false + } + } } else { false + } { + __found = true; + break; } -} - } else { - false - } { __found = true; break; } } __found }; -(from_fallback || from_ops) -} + } + __found + }; + (from_fallback || from_ops) + } } -pub fn extract_modifier_names(properties: Rc>>, source_indices: Rc>>) -> Rc> { - Rc::new({ let mut __result = Vec::new(); for p in properties.iter().cloned() { __result.extend((*match field_init_operation_modifier(p.clone(), source_indices.clone()) { - Some(modifier) => Rc::new(vec![operation_modifier_name(modifier.clone())]), - None => Rc::new(vec![]), -}).iter().cloned()); } __result }) +pub fn extract_modifier_names( + properties: Rc>>, + source_indices: Rc>>, +) -> Rc> { + Rc::new({ + let mut __result = Vec::new(); + for p in properties.iter().cloned() { + __result.extend( + (*match field_init_operation_modifier(p.clone(), source_indices.clone()) { + Some(modifier) => Rc::new(vec![operation_modifier_name(modifier.clone())]), + None => Rc::new(vec![]), + }) + .iter() + .cloned(), + ); + } + __result + }) } #[derive(Debug, Clone, Copy, PartialEq, serde::Serialize, serde::Deserialize)] @@ -1261,70 +2390,93 @@ pub struct ServiceFieldSet { pub has_auth: bool, } -pub fn compute_service_fields(fallback_transport: &Rc, op_children: &Rc>>, source_indices: &Rc>>) -> ServiceFieldSet { +pub fn compute_service_fields( + fallback_transport: &Rc, + op_children: &Rc>>, + source_indices: &Rc>>, +) -> ServiceFieldSet { ServiceFieldSet { - has_rest: service_has_rest(fallback_transport.clone(), op_children.clone(), &source_indices), - has_shell: service_has_shell(fallback_transport.clone(), op_children.clone()), - has_file: service_has_file(fallback_transport.clone(), op_children.clone(), &source_indices), - has_auth: service_has_rest_auth(&fallback_transport, op_children.clone(), &source_indices), -} + has_rest: service_has_rest( + fallback_transport.clone(), + op_children.clone(), + &source_indices, + ), + has_shell: service_has_shell(fallback_transport.clone(), op_children.clone()), + has_file: service_has_file( + fallback_transport.clone(), + op_children.clone(), + &source_indices, + ), + has_auth: service_has_rest_auth(&fallback_transport, op_children.clone(), &source_indices), + } } pub fn service_field_decls(fs: &ServiceFieldSet, t: &Rc) -> Rc> { { let result = Rc::new(vec![]); -let result = if fs.has_rest.clone() { + let result = if fs.has_rest.clone() { v2_rt::concat(result.clone(), Rc::new(vec![t.rest_decl.clone()])) } else { result.clone() }; -let result = if fs.has_auth.clone() { + let result = if fs.has_auth.clone() { v2_rt::concat(result.clone(), Rc::new(vec![t.auth_decl.clone()])) } else { result.clone() }; -let result = if fs.has_shell.clone() { + let result = if fs.has_shell.clone() { v2_rt::concat(result.clone(), Rc::new(vec![t.shell_decl.clone()])) } else { result.clone() }; -let result = if fs.has_file.clone() { + let result = if fs.has_file.clone() { v2_rt::concat(result.clone(), Rc::new(vec![t.file_decl.clone()])) } else { result.clone() }; -result.clone() -} + result.clone() + } } pub fn service_field_ctors(fs: &ServiceFieldSet, t: &Rc) -> Rc> { { let result = Rc::new(vec![]); -let result = if fs.has_rest.clone() { + let result = if fs.has_rest.clone() { v2_rt::concat(result.clone(), Rc::new(vec![t.rest_ctor.clone()])) } else { result.clone() }; -let result = if fs.has_auth.clone() { + let result = if fs.has_auth.clone() { v2_rt::concat(result.clone(), Rc::new(vec![t.auth_ctor.clone()])) } else { result.clone() }; -let result = if fs.has_shell.clone() { + let result = if fs.has_shell.clone() { v2_rt::concat(result.clone(), Rc::new(vec![t.shell_ctor.clone()])) } else { result.clone() }; -let result = if fs.has_file.clone() { + let result = if fs.has_file.clone() { v2_rt::concat(result.clone(), Rc::new(vec![t.file_ctor.clone()])) } else { result.clone() }; -result.clone() -} + result.clone() + } } -pub fn emit_unified_transport_dispatch(transport: &Rc, op_name: String, source_indices: &Rc>>, depth: i64, target: RenderTarget, render_rest: impl Fn(String, Rc, i64, Rc>>) -> String + Clone, render_shell: impl Fn(String, Rc, i64, Rc>>) -> String + Clone, render_file: impl Fn(String, i64) -> String + Clone, render_local: impl Fn(String, i64) -> String + Clone) -> String { +pub fn emit_unified_transport_dispatch( + transport: &Rc, + op_name: String, + source_indices: &Rc>>, + depth: i64, + target: RenderTarget, + render_rest: impl Fn(String, Rc, i64, Rc>>) -> String + Clone, + render_shell: impl Fn(String, Rc, i64, Rc>>) -> String + + Clone, + render_file: impl Fn(String, i64) -> String + Clone, + render_local: impl Fn(String, i64) -> String + Clone, +) -> String { if is_rest_transport(transport.clone(), source_indices.clone()) { render_rest(op_name, transport.clone(), depth, source_indices.clone()) } else { @@ -1344,56 +2496,167 @@ pub fn emit_unified_transport_dispatch(transport: &Rc, op_name: String, so } } -pub fn emit_unified_operation_method(service_name: String, fallback_transport: Rc, op_node: &Rc, target: &RenderTarget, registry: Rc>>, env: &Rc, render_transport_body: impl Fn(Rc, String, Rc>>, i64) -> String + Clone) -> String { +pub fn emit_unified_operation_method( + service_name: String, + fallback_transport: Rc, + op_node: &Rc, + target: &RenderTarget, + registry: Rc>>, + env: &Rc, + render_transport_body: impl Fn(Rc, String, Rc>>, i64) -> String + + Clone, +) -> String { { let spec = language_spec(target.clone()); -let si = env.source_indices.clone(); -let op_text = authored_name(env.clone(), op_node.clone()); -let params_str = emit_params_shared(op_node.params.clone(), &target, si.clone()); -let sp = service_self_param(spec.clone()); -let all_params = if (sp.clone().as_str() == "".to_string().as_str()) { + let si = env.source_indices.clone(); + let op_text = authored_name(env.clone(), op_node.clone()); + let params_str = emit_params_shared(op_node.params.clone(), &target, si.clone()); + let sp = service_self_param(spec.clone()); + let all_params = if (sp.clone().as_str() == "".to_string().as_str()) { params_str.clone() } else { if (params_str.clone().as_str() == "".to_string().as_str()) { sp.clone() } else { - v2_rt::concat(v2_rt::concat(sp.clone(), ", ".to_string()), params_str.clone()) + v2_rt::concat( + v2_rt::concat(sp.clone(), ", ".to_string()), + params_str.clone(), + ) } }; -let receiver_str = service_receiver_str(spec.clone(), service_name); -let method_depth = service_method_depth(spec.clone()); -let ret_type = emit_node_type(resolved_type(op_node.clone()), target.clone(), si.clone()); -let ret_str = service_return_str(&spec, ret_type); -let method_name = match (*spec.visibility.clone()).clone() { - VisibilitySpec::CaseVisibility { .. } => emit_export_ident(op_text.clone(), &target), - _ => emit_ident(op_text.clone(), target.clone()), -}; -let eff_transport = effective_operation_transport(op_node.clone(), fallback_transport); -let body = render_transport_body(eff_transport, op_text.clone(), si.clone(), (method_depth.clone() + 1)); -let sig = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(spec.items.clone().async_prefix.clone(), spec.items.clone().func_keyword.clone()), " ".to_string()), receiver_str), method_name), "(".to_string()), all_params), ")".to_string()), ret_str); -if spec.block_syntax.clone().significant_whitespace.clone() { - v2_rt::concat(v2_rt::concat(v2_rt::concat(sig, spec.block_syntax.clone().block_open.clone()), make_indent((method_depth.clone() + 1))), body) + let receiver_str = service_receiver_str(spec.clone(), service_name); + let method_depth = service_method_depth(spec.clone()); + let ret_type = emit_node_type(resolved_type(op_node.clone()), target.clone(), si.clone()); + let ret_str = service_return_str(&spec, ret_type); + let method_name = match (*spec.visibility.clone()).clone() { + VisibilitySpec::CaseVisibility { .. } => emit_export_ident(op_text.clone(), &target), + _ => emit_ident(op_text.clone(), target.clone()), + }; + let eff_transport = effective_operation_transport(op_node.clone(), fallback_transport); + let body = render_transport_body( + eff_transport, + op_text.clone(), + si.clone(), + (method_depth.clone() + 1), + ); + let sig = v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + spec.items.clone().async_prefix.clone(), + spec.items.clone().func_keyword.clone(), + ), + " ".to_string(), + ), + receiver_str, + ), + method_name, + ), + "(".to_string(), + ), + all_params, + ), + ")".to_string(), + ), + ret_str, + ); + if spec.block_syntax.clone().significant_whitespace.clone() { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(sig, spec.block_syntax.clone().block_open.clone()), + make_indent((method_depth.clone() + 1)), + ), + body, + ) } else { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(sig, spec.block_syntax.clone().block_open.clone()), body), "\n".to_string()), make_indent(method_depth.clone())), spec.block_syntax.clone().block_close.clone()) + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(sig, spec.block_syntax.clone().block_open.clone()), + body, + ), + "\n".to_string(), + ), + make_indent(method_depth.clone()), + ), + spec.block_syntax.clone().block_close.clone(), + ) } -} + } } -pub fn emit_unified_service_def(item: &Rc, target: &RenderTarget, registry: Rc>>, env: &Rc, render_service_fields: impl Fn(String, Rc, Rc>>, Rc>>) -> String + Clone, render_transport_body: impl Fn(Rc, String, Rc>>, i64) -> String + Clone) -> String { +pub fn emit_unified_service_def( + item: &Rc, + target: &RenderTarget, + registry: Rc>>, + env: &Rc, + render_service_fields: impl Fn(String, Rc, Rc>>, Rc>>) -> String + + Clone, + render_transport_body: impl Fn(Rc, String, Rc>>, i64) -> String + + Clone, +) -> String { { let spec = language_spec(target.clone()); -let safe_name = sanitize_service_name(authored_name(env.clone(), item.clone())); -let transport = service_fallback_transport(&item); -let op_children = item.children.clone(); -let fields_str = render_service_fields(safe_name.clone(), transport.clone(), op_children.clone(), env.source_indices.clone()); -let methods = Rc::new({ let mut __result = Vec::new(); for op_node in op_children.clone().iter().cloned() { __result.push(emit_unified_operation_method(safe_name.clone(), transport.clone(), &op_node, &target, registry.clone(), &env, render_transport_body.clone())); } __result }); -let methods_str = methods.join(&"\n\n".to_string()); -if service_methods_inside_class(spec.clone()) { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(spec.items.clone().struct_keyword.clone(), " ".to_string()), safe_name.clone()), ":\n".to_string()), make_indent(1)), fields_str), "\n\n".to_string()), make_indent(1)), methods_str) + let safe_name = sanitize_service_name(authored_name(env.clone(), item.clone())); + let transport = service_fallback_transport(&item); + let op_children = item.children.clone(); + let fields_str = render_service_fields( + safe_name.clone(), + transport.clone(), + op_children.clone(), + env.source_indices.clone(), + ); + let methods = Rc::new({ + let mut __result = Vec::new(); + for op_node in op_children.clone().iter().cloned() { + __result.push(emit_unified_operation_method( + safe_name.clone(), + transport.clone(), + &op_node, + &target, + registry.clone(), + &env, + render_transport_body.clone(), + )); + } + __result + }); + let methods_str = methods.join(&"\n\n".to_string()); + if service_methods_inside_class(spec.clone()) { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + spec.items.clone().struct_keyword.clone(), + " ".to_string(), + ), + safe_name.clone(), + ), + ":\n".to_string(), + ), + make_indent(1), + ), + fields_str, + ), + "\n\n".to_string(), + ), + make_indent(1), + ), + methods_str, + ) } else { v2_rt::concat(v2_rt::concat(fields_str, "\n\n".to_string()), methods_str) } -} + } } pub fn is_type_def_item(item: &Rc) -> bool { @@ -1401,15 +2664,29 @@ pub fn is_type_def_item(item: &Rc) -> bool { } pub fn is_bare_leaf_item(item: &Rc) -> bool { - (((((item.connective.clone() == Connective::NoConnective) && (item.body.clone() == None)) && ((item.params.clone().len() as i64) == 0)) && (item.transport.clone() == None)) && ((item.children.clone().len() as i64) == 0)) + (((((item.connective.clone() == Connective::NoConnective) && (item.body.clone() == None)) + && ((item.params.clone().len() as i64) == 0)) + && (item.transport.clone() == None)) + && ((item.children.clone().len() as i64) == 0)) } -pub fn is_type_alias_item(item: &Rc, source_indices: Rc>>) -> bool { - (is_bare_leaf_item(&item) && is_type_alias_return_node(resolved_type(item.clone()), source_indices)) +pub fn is_type_alias_item( + item: &Rc, + source_indices: Rc>>, +) -> bool { + (is_bare_leaf_item(&item) + && is_type_alias_return_node(resolved_type(item.clone()), source_indices)) } -pub fn is_type_decl_item(item: &Rc, source_indices: Rc>>) -> bool { - ((is_bare_leaf_item(&item) && !is_type_alias_return_node(resolved_type(item.clone()), source_indices)) || (((((item.params.clone().len() as i64) > 0) && (item.body.clone() == None)) && (item.transport.clone() == None)) && ((item.children.clone().len() as i64) == 0))) +pub fn is_type_decl_item( + item: &Rc, + source_indices: Rc>>, +) -> bool { + ((is_bare_leaf_item(&item) + && !is_type_alias_return_node(resolved_type(item.clone()), source_indices)) + || (((((item.params.clone().len() as i64) > 0) && (item.body.clone() == None)) + && (item.transport.clone() == None)) + && ((item.children.clone().len() as i64) == 0))) } pub fn is_function_item(item: &Rc) -> bool { @@ -1425,7 +2702,10 @@ pub fn is_service_def_item(item: &Rc) -> bool { } pub fn is_resource_def_item(item: &Rc) -> bool { - (((item.transport.clone() == None) && ((item.children.clone().len() as i64) > 0)) || ((((item.transport.clone() == None) && ((item.children.clone().len() as i64) == 0)) && ((item.properties.clone().len() as i64) > 0)) && (item.body.clone() == None))) + (((item.transport.clone() == None) && ((item.children.clone().len() as i64) > 0)) + || ((((item.transport.clone() == None) && ((item.children.clone().len() as i64) == 0)) + && ((item.properties.clone().len() as i64) > 0)) + && (item.body.clone() == None))) } #[derive(Debug, Clone, Copy, PartialEq, serde::Serialize, serde::Deserialize)] @@ -1441,30 +2721,30 @@ pub enum ExprCategory { pub fn classify_expr(texpr: Rc) -> ExprCategory { match (*texpr.expr_data.clone()).clone() { - ExprData::ExprLiteral { .. } => ExprCategory::ExprCatLeaf, - ExprData::ExprError { .. } => ExprCategory::ExprCatLeaf, - ExprData::ExprVar { .. } => ExprCategory::ExprCatLeaf, - ExprData::ExprFieldAccess { .. } => ExprCategory::ExprCatCompound, - ExprData::ExprCall { .. } => ExprCategory::ExprCatCompound, - ExprData::ExprMethodCall { .. } => ExprCategory::ExprCatCompound, - ExprData::ExprRecordLit { .. } => ExprCategory::ExprCatCompound, - ExprData::ExprListLit => ExprCategory::ExprCatCompound, - ExprData::ExprBinOp { .. } => ExprCategory::ExprCatCompound, - ExprData::ExprUnaryOp { .. } => ExprCategory::ExprCatCompound, - ExprData::ExprLambda => ExprCategory::ExprCatCompound, - ExprData::ExprStringInterp => ExprCategory::ExprCatCompound, - ExprData::ExprCast => ExprCategory::ExprCatCompound, - ExprData::ExprIndex => ExprCategory::ExprCatCompound, - ExprData::ExprSlice => ExprCategory::ExprCatCompound, - ExprData::ExprMatch => ExprCategory::ExprCatControlFlow, - ExprData::ExprIf => ExprCategory::ExprCatControlFlow, - ExprData::ExprForEach => ExprCategory::ExprCatControlFlow, - ExprData::ExprBlock => ExprCategory::ExprCatControlFlow, - ExprData::ExprLet => ExprCategory::ExprCatBinding, - ExprData::ExprReturn => ExprCategory::ExprCatControlFlow, - ExprData::NoExprData => ExprCategory::ExprCatNone, - _ => ExprCategory::ExprCatNone, -} + ExprData::ExprLiteral { .. } => ExprCategory::ExprCatLeaf, + ExprData::ExprError { .. } => ExprCategory::ExprCatLeaf, + ExprData::ExprVar { .. } => ExprCategory::ExprCatLeaf, + ExprData::ExprFieldAccess { .. } => ExprCategory::ExprCatCompound, + ExprData::ExprCall { .. } => ExprCategory::ExprCatCompound, + ExprData::ExprMethodCall { .. } => ExprCategory::ExprCatCompound, + ExprData::ExprRecordLit { .. } => ExprCategory::ExprCatCompound, + ExprData::ExprListLit => ExprCategory::ExprCatCompound, + ExprData::ExprBinOp { .. } => ExprCategory::ExprCatCompound, + ExprData::ExprUnaryOp { .. } => ExprCategory::ExprCatCompound, + ExprData::ExprLambda => ExprCategory::ExprCatCompound, + ExprData::ExprStringInterp => ExprCategory::ExprCatCompound, + ExprData::ExprCast => ExprCategory::ExprCatCompound, + ExprData::ExprIndex => ExprCategory::ExprCatCompound, + ExprData::ExprSlice => ExprCategory::ExprCatCompound, + ExprData::ExprMatch => ExprCategory::ExprCatControlFlow, + ExprData::ExprIf => ExprCategory::ExprCatControlFlow, + ExprData::ExprForEach => ExprCategory::ExprCatControlFlow, + ExprData::ExprBlock => ExprCategory::ExprCatControlFlow, + ExprData::ExprLet => ExprCategory::ExprCatBinding, + ExprData::ExprReturn => ExprCategory::ExprCatControlFlow, + ExprData::NoExprData => ExprCategory::ExprCatNone, + _ => ExprCategory::ExprCatNone, + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -1483,25 +2763,26 @@ pub enum FuncBodyShape { }, } -pub fn classify_func_body(body: &Rc, source_indices: Rc>>) -> Rc { +pub fn classify_func_body( + body: &Rc, + source_indices: Rc>>, +) -> Rc { match (*body.expr_data.clone()).clone() { - ExprData::ExprLet => { - let n = let_binding_name_at(body.clone(), source_indices); -let v = let_value(body.clone()); -let rest = let_body(body.clone()); -Rc::new(FuncBodyShape::FuncBodyLet { - name: n, - value: v, - rest: rest, -}) -}, - ExprData::ExprBlock => Rc::new(FuncBodyShape::FuncBodyBlock { - stmts: body.children.clone(), -}), - _ => Rc::new(FuncBodyShape::FuncBodyExpr { - expr: body.clone(), -}), -} + ExprData::ExprLet => { + let n = let_binding_name_at(body.clone(), source_indices); + let v = let_value(body.clone()); + let rest = let_body(body.clone()); + Rc::new(FuncBodyShape::FuncBodyLet { + name: n, + value: v, + rest: rest, + }) + } + ExprData::ExprBlock => Rc::new(FuncBodyShape::FuncBodyBlock { + stmts: body.children.clone(), + }), + _ => Rc::new(FuncBodyShape::FuncBodyExpr { expr: body.clone() }), + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -1533,446 +2814,1258 @@ pub enum TcoExprShape { }, } -pub fn classify_tco_expr(texpr: &Rc, source_indices: Rc>>) -> Rc { +pub fn classify_tco_expr( + texpr: &Rc, + source_indices: Rc>>, +) -> Rc { match (*texpr.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => Rc::new(TcoExprShape::TcoCall { - func: expr_call_func_at(texpr.clone(), source_indices), - args: texpr.children.clone(), -}), - ExprData::ExprIf => { - let c = if_condition(texpr.clone()); -let t = if_then_branch(texpr.clone()); -let e = if_else_branch(texpr.clone()); -Rc::new(TcoExprShape::TcoIf { - condition: c, - then_branch: t, - else_branch: e, -}) -}, - ExprData::ExprMatch => { - let scrut = match_scrutinee(texpr.clone()); -let arm_list = match_arm_nodes(texpr.clone()); -Rc::new(TcoExprShape::TcoMatch { - scrutinee: scrut, - arms: arm_list, -}) -}, - ExprData::ExprLet => { - let n = let_binding_name_at(texpr.clone(), source_indices); -let v = let_value(texpr.clone()); -let bd = let_body(texpr.clone()); -Rc::new(TcoExprShape::TcoLet { - name: n, - value: v, - body: bd, -}) -}, - ExprData::ExprBlock => Rc::new(TcoExprShape::TcoBlock { - stmts: texpr.children.clone(), -}), - _ => Rc::new(TcoExprShape::TcoOther { - expr: texpr.clone(), -}), -} + ExprData::ExprCall { .. } => Rc::new(TcoExprShape::TcoCall { + func: expr_call_func_at(texpr.clone(), source_indices), + args: texpr.children.clone(), + }), + ExprData::ExprIf => { + let c = if_condition(texpr.clone()); + let t = if_then_branch(texpr.clone()); + let e = if_else_branch(texpr.clone()); + Rc::new(TcoExprShape::TcoIf { + condition: c, + then_branch: t, + else_branch: e, + }) + } + ExprData::ExprMatch => { + let scrut = match_scrutinee(texpr.clone()); + let arm_list = match_arm_nodes(texpr.clone()); + Rc::new(TcoExprShape::TcoMatch { + scrutinee: scrut, + arms: arm_list, + }) + } + ExprData::ExprLet => { + let n = let_binding_name_at(texpr.clone(), source_indices); + let v = let_value(texpr.clone()); + let bd = let_body(texpr.clone()); + Rc::new(TcoExprShape::TcoLet { + name: n, + value: v, + body: bd, + }) + } + ExprData::ExprBlock => Rc::new(TcoExprShape::TcoBlock { + stmts: texpr.children.clone(), + }), + _ => Rc::new(TcoExprShape::TcoOther { + expr: texpr.clone(), + }), + } } pub fn block_stmts_init(stmts: &Rc>>) -> Rc>> { if ((stmts.clone().len() as i64) <= 1) { Rc::new(vec![]) } else { - Rc::new(stmts.clone().iter().cloned().take(((stmts.clone().len() as i64) - 1) as usize).collect::>()) + Rc::new( + stmts + .clone() + .iter() + .cloned() + .take(((stmts.clone().len() as i64) - 1) as usize) + .collect::>(), + ) } } -pub fn is_tco_eligible(name: &String, body: &Rc, registry: Rc>>, source_indices: &Rc>>) -> bool { +pub fn is_tco_eligible( + name: &String, + body: &Rc, + registry: Rc>>, + source_indices: &Rc>>, +) -> bool { match lookup_item(registry, name.clone()) { - Some(info) => (info.is_self_recursive.clone() && (info.has_non_tail_self_call.clone() == false)), - None => (expr_has_self_call(&body, &name, &source_indices) && (expr_has_non_tail_self_call(&body, &name, true, &source_indices) == false)), -} + Some(info) => { + (info.is_self_recursive.clone() && (info.has_non_tail_self_call.clone() == false)) + } + None => { + (expr_has_self_call(&body, &name, &source_indices) + && (expr_has_non_tail_self_call(&body, &name, true, &source_indices) == false)) + } + } } -pub fn is_self_recursive(name: &String, body: Rc, registry: Rc>>, source_indices: Rc>>) -> bool { +pub fn is_self_recursive( + name: &String, + body: Rc, + registry: Rc>>, + source_indices: Rc>>, +) -> bool { match lookup_item(registry, name.clone()) { - Some(info) => info.is_self_recursive.clone(), - None => expr_has_self_call(&body, &name, &source_indices), -} + Some(info) => info.is_self_recursive.clone(), + None => expr_has_self_call(&body, &name, &source_indices), + } } -pub fn tco_reassign_core(ordered_args: Rc>, param_names: Rc>, temp_var_prefix: String, temp_decl_prefix: String, temp_assign_op: String, stmt_terminator: String, continue_str: String, line_prefix: &String) -> Rc> { +pub fn tco_reassign_core( + ordered_args: Rc>, + param_names: Rc>, + temp_var_prefix: String, + temp_decl_prefix: String, + temp_assign_op: String, + stmt_terminator: String, + continue_str: String, + line_prefix: &String, +) -> Rc> { { - let temp_lets = Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(ordered_args.iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(line_prefix.clone(), temp_decl_prefix.clone()), temp_var_prefix.clone()), (pair.0.clone()).to_string()), temp_assign_op.clone()), pair.1.clone()), stmt_terminator.clone())); } __result }); -let assigns = Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(param_names.iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(line_prefix.clone(), pair.1.clone()), " = ".to_string()), temp_var_prefix.clone()), (pair.0.clone()).to_string()), stmt_terminator.clone())); } __result }); -v2_rt::concat(v2_rt::concat(temp_lets, assigns), Rc::new(vec![v2_rt::concat(line_prefix.clone(), continue_str)])) -} + let temp_lets = Rc::new({ + let mut __result = Vec::new(); + for pair in Rc::new( + ordered_args + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + { + __result.push(v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(line_prefix.clone(), temp_decl_prefix.clone()), + temp_var_prefix.clone(), + ), + (pair.0.clone()).to_string(), + ), + temp_assign_op.clone(), + ), + pair.1.clone(), + ), + stmt_terminator.clone(), + )); + } + __result + }); + let assigns = Rc::new({ + let mut __result = Vec::new(); + for pair in Rc::new( + param_names + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + { + __result.push(v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(line_prefix.clone(), pair.1.clone()), + " = ".to_string(), + ), + temp_var_prefix.clone(), + ), + (pair.0.clone()).to_string(), + ), + stmt_terminator.clone(), + )); + } + __result + }); + v2_rt::concat( + v2_rt::concat(temp_lets, assigns), + Rc::new(vec![v2_rt::concat(line_prefix.clone(), continue_str)]), + ) + } } -pub fn emit_shared_tco_expr(mut frame: Rc, mut fn_name: String, mut emit_self_call_reassign: impl Fn(Rc) -> String + Clone, mut emit_non_self_call: impl Fn(Rc) -> String + Clone, mut emit_if: impl Fn(Rc) -> String + Clone, mut emit_match: impl Fn(Rc) -> String + Clone, mut emit_let: impl Fn(Rc) -> String + Clone, mut emit_block: impl Fn(Rc) -> String + Clone, mut emit_default_return: impl Fn(Rc) -> String + Clone) -> String { +pub fn emit_shared_tco_expr( + mut frame: Rc, + mut fn_name: String, + mut emit_self_call_reassign: impl Fn(Rc) -> String + Clone, + mut emit_non_self_call: impl Fn(Rc) -> String + Clone, + mut emit_if: impl Fn(Rc) -> String + Clone, + mut emit_match: impl Fn(Rc) -> String + Clone, + mut emit_let: impl Fn(Rc) -> String + Clone, + mut emit_block: impl Fn(Rc) -> String + Clone, + mut emit_default_return: impl Fn(Rc) -> String + Clone, +) -> String { loop { let si = frame.scope.clone().type_env.clone().source_indices.clone(); -match (*frame.expr.clone().expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { if (expr_call_func_at(frame.expr.clone(), si).as_str() == fn_name.as_str()) { - break emit_self_call_reassign(Rc::new(TcoReassignInput { - args: frame.expr.clone().children.clone(), - scope: frame.scope.clone(), - depth: frame.depth.clone(), -})); -} else { - break emit_non_self_call(frame.clone()); -} }, - ExprData::ExprReturn => { let inner = return_value(frame.expr.clone()); -{ - let __tco_0 = Rc::new(TcoFrame { - expr: inner, - scope: frame.scope.clone(), - depth: frame.depth.clone(), -}); -frame = __tco_0; -continue; -} }, - ExprData::ExprIf => { break emit_if(frame.clone()); }, - ExprData::ExprMatch => { break emit_match(frame.clone()); }, - ExprData::ExprLet => { break emit_let(frame.clone()); }, - ExprData::ExprBlock => { break emit_block(frame.clone()); }, - _ => { break emit_default_return(frame.clone()); }, -} -} + match (*frame.expr.clone().expr_data.clone()).clone() { + ExprData::ExprCall { .. } => { + if (expr_call_func_at(frame.expr.clone(), si).as_str() == fn_name.as_str()) { + break emit_self_call_reassign(Rc::new(TcoReassignInput { + args: frame.expr.clone().children.clone(), + scope: frame.scope.clone(), + depth: frame.depth.clone(), + })); + } else { + break emit_non_self_call(frame.clone()); + } + } + ExprData::ExprReturn => { + let inner = return_value(frame.expr.clone()); + { + let __tco_0 = Rc::new(TcoFrame { + expr: inner, + scope: frame.scope.clone(), + depth: frame.depth.clone(), + }); + frame = __tco_0; + continue; + } + } + ExprData::ExprIf => { + break emit_if(frame.clone()); + } + ExprData::ExprMatch => { + break emit_match(frame.clone()); + } + ExprData::ExprLet => { + break emit_let(frame.clone()); + } + ExprData::ExprBlock => { + break emit_block(frame.clone()); + } + _ => { + break emit_default_return(frame.clone()); + } + } + } } pub fn shared_tco_body(inner: String, depth: i64, spec: &Rc) -> String { { let syntax = spec.block_syntax.clone(); -let tco = spec.tco.clone(); -if syntax.significant_whitespace.clone() { - v2_rt::concat(v2_rt::concat(v2_rt::concat(tco.loop_keyword.clone(), syntax.block_open.clone()), make_indent((depth + 1))), inner) + let tco = spec.tco.clone(); + if syntax.significant_whitespace.clone() { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(tco.loop_keyword.clone(), syntax.block_open.clone()), + make_indent((depth + 1)), + ), + inner, + ) } else { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(tco.loop_keyword.clone(), syntax.block_open.clone()), make_indent((depth + 1))), inner), "\n".to_string()), syntax.block_close.clone()) + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(tco.loop_keyword.clone(), syntax.block_open.clone()), + make_indent((depth + 1)), + ), + inner, + ), + "\n".to_string(), + ), + syntax.block_close.clone(), + ) } -} + } } -pub fn shared_tco_default_return(frame: &Rc, spec: Rc, recurse_expr: impl Fn(Rc, Rc, i64) -> String + Clone) -> String { +pub fn shared_tco_default_return( + frame: &Rc, + spec: Rc, + recurse_expr: impl Fn(Rc, Rc, i64) -> String + Clone, +) -> String { { let val_str = recurse_expr(frame.expr.clone(), frame.scope.clone(), frame.depth.clone()); -v2_rt::concat(v2_rt::concat(spec.tco.clone().break_return.clone(), " ".to_string()), val_str) -} + v2_rt::concat( + v2_rt::concat(spec.tco.clone().break_return.clone(), " ".to_string()), + val_str, + ) + } } -pub fn shared_tco_non_self_call(frame: &Rc, target: RenderTarget, spec: Rc, recurse_call: impl Fn(String, Rc>>, Rc, i64) -> String + Clone) -> String { +pub fn shared_tco_non_self_call( + frame: &Rc, + target: RenderTarget, + spec: Rc, + recurse_call: impl Fn(String, Rc>>, Rc, i64) -> String + Clone, +) -> String { match (*frame.expr.clone().expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { - let f = expr_call_func_at(frame.expr.clone(), frame.scope.clone().type_env.clone().source_indices.clone()); -let call_str = recurse_call(f, frame.expr.clone().children.clone(), frame.scope.clone(), frame.depth.clone()); -v2_rt::concat(v2_rt::concat(spec.tco.clone().break_return.clone(), " ".to_string()), call_str) -}, - _ => emit_error_expr("shared_tco_non_self_call expected ExprCall".to_string(), target), -} + ExprData::ExprCall { .. } => { + let f = expr_call_func_at( + frame.expr.clone(), + frame.scope.clone().type_env.clone().source_indices.clone(), + ); + let call_str = recurse_call( + f, + frame.expr.clone().children.clone(), + frame.scope.clone(), + frame.depth.clone(), + ); + v2_rt::concat( + v2_rt::concat(spec.tco.clone().break_return.clone(), " ".to_string()), + call_str, + ) + } + _ => emit_error_expr( + "shared_tco_non_self_call expected ExprCall".to_string(), + target, + ), + } } -pub fn shared_tco_if(frame: &Rc, fn_name: String, params: Rc>>, target: RenderTarget, spec: Rc, recurse_expr: impl Fn(Rc, Rc, i64) -> String + Clone, recurse_tco: impl Fn(Rc, Rc, i64) -> String + Clone) -> String { +pub fn shared_tco_if( + frame: &Rc, + fn_name: String, + params: Rc>>, + target: RenderTarget, + spec: Rc, + recurse_expr: impl Fn(Rc, Rc, i64) -> String + Clone, + recurse_tco: impl Fn(Rc, Rc, i64) -> String + Clone, +) -> String { { let syntax = spec.block_syntax.clone(); -match (*frame.expr.clone().expr_data.clone()).clone() { - ExprData::ExprIf => { - let c = if_condition(frame.expr.clone()); -let t = if_then_branch(frame.expr.clone()); -let e = if_else_branch(frame.expr.clone()); -let cond_str = recurse_expr(c, frame.scope.clone(), frame.depth.clone()); -let then_str = recurse_tco(t, frame.scope.clone(), (frame.depth.clone() + 1)); -let else_prefix = if syntax.significant_whitespace.clone() { - make_indent(frame.depth.clone()) - } else { - "".to_string() - }; -match e { - Some(eb) => { - let else_str = recurse_tco(eb.clone(), frame.scope.clone(), (frame.depth.clone() + 1)); -if syntax.significant_whitespace.clone() { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("if ".to_string(), cond_str), syntax.block_open.clone()), make_indent((frame.depth.clone() + 1))), then_str), "\n".to_string()), else_prefix), syntax.else_clause.clone()), make_indent((frame.depth.clone() + 1))), else_str) + match (*frame.expr.clone().expr_data.clone()).clone() { + ExprData::ExprIf => { + let c = if_condition(frame.expr.clone()); + let t = if_then_branch(frame.expr.clone()); + let e = if_else_branch(frame.expr.clone()); + let cond_str = recurse_expr(c, frame.scope.clone(), frame.depth.clone()); + let then_str = recurse_tco(t, frame.scope.clone(), (frame.depth.clone() + 1)); + let else_prefix = if syntax.significant_whitespace.clone() { + make_indent(frame.depth.clone()) } else { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("if ".to_string(), cond_str), syntax.block_open.clone()), make_indent((frame.depth.clone() + 1))), then_str), "\n".to_string()), syntax.else_clause.clone()), make_indent((frame.depth.clone() + 1))), else_str), "\n".to_string()), syntax.block_close.clone()) + "".to_string() + }; + match e { + Some(eb) => { + let else_str = + recurse_tco(eb.clone(), frame.scope.clone(), (frame.depth.clone() + 1)); + if syntax.significant_whitespace.clone() { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "if ".to_string(), + cond_str, + ), + syntax.block_open.clone(), + ), + make_indent((frame.depth.clone() + 1)), + ), + then_str, + ), + "\n".to_string(), + ), + else_prefix, + ), + syntax.else_clause.clone(), + ), + make_indent((frame.depth.clone() + 1)), + ), + else_str, + ) + } else { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "if ".to_string(), + cond_str, + ), + syntax.block_open.clone(), + ), + make_indent((frame.depth.clone() + 1)), + ), + then_str, + ), + "\n".to_string(), + ), + syntax.else_clause.clone(), + ), + make_indent((frame.depth.clone() + 1)), + ), + else_str, + ), + "\n".to_string(), + ), + syntax.block_close.clone(), + ) + } + } + None => { + if syntax.significant_whitespace.clone() { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("if ".to_string(), cond_str), + syntax.block_open.clone(), + ), + make_indent((frame.depth.clone() + 1)), + ), + then_str, + ) + } else { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("if ".to_string(), cond_str), + syntax.block_open.clone(), + ), + make_indent((frame.depth.clone() + 1)), + ), + then_str, + ), + "\n".to_string(), + ), + syntax.block_close.clone(), + ) + } + } } -}, - None => if syntax.significant_whitespace.clone() { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("if ".to_string(), cond_str), syntax.block_open.clone()), make_indent((frame.depth.clone() + 1))), then_str) - } else { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("if ".to_string(), cond_str), syntax.block_open.clone()), make_indent((frame.depth.clone() + 1))), then_str), "\n".to_string()), syntax.block_close.clone()) - }, -} -}, - _ => emit_error_expr("shared_tco_if expected ExprIf".to_string(), target), -} -} + } + _ => emit_error_expr("shared_tco_if expected ExprIf".to_string(), target), + } + } } -pub fn shared_tco_let(frame: &Rc, fn_name: String, params: Rc>>, target: RenderTarget, recurse_expr: impl Fn(Rc, Rc, i64) -> String + Clone, recurse_tco: impl Fn(Rc, Rc, i64) -> String + Clone) -> String { +pub fn shared_tco_let( + frame: &Rc, + fn_name: String, + params: Rc>>, + target: RenderTarget, + recurse_expr: impl Fn(Rc, Rc, i64) -> String + Clone, + recurse_tco: impl Fn(Rc, Rc, i64) -> String + Clone, +) -> String { match (*frame.expr.clone().expr_data.clone()).clone() { - ExprData::ExprLet => { - let n = let_binding_name_at(frame.expr.clone(), frame.scope.clone().type_env.clone().source_indices.clone()); -let v = let_value(frame.expr.clone()); -let bd = let_body(frame.expr.clone()); -let val_str = recurse_expr(v.clone(), frame.scope.clone(), frame.depth.clone()); -let let_line = emit_let_binding(n.clone(), val_str, &target); -let next_scope = extend_scope(&frame.scope.clone(), &n, resolved_type(v.clone()), Rc::new(SubValueRelation::SubValueUnknown)); -match bd { - Some(b) => v2_rt::concat(v2_rt::concat(let_line, "\n".to_string()), recurse_tco(b.clone(), next_scope, frame.depth.clone())), - None => let_line, -} -}, - _ => emit_error_expr("shared_tco_let expected ExprLet".to_string(), target), -} + ExprData::ExprLet => { + let n = let_binding_name_at( + frame.expr.clone(), + frame.scope.clone().type_env.clone().source_indices.clone(), + ); + let v = let_value(frame.expr.clone()); + let bd = let_body(frame.expr.clone()); + let val_str = recurse_expr(v.clone(), frame.scope.clone(), frame.depth.clone()); + let let_line = emit_let_binding(n.clone(), val_str, &target); + let next_scope = extend_scope( + &frame.scope.clone(), + &n, + resolved_type(v.clone()), + Rc::new(SubValueRelation::SubValueUnknown), + ); + match bd { + Some(b) => v2_rt::concat( + v2_rt::concat(let_line, "\n".to_string()), + recurse_tco(b.clone(), next_scope, frame.depth.clone()), + ), + None => let_line, + } + } + _ => emit_error_expr("shared_tco_let expected ExprLet".to_string(), target), + } } -pub fn shared_tco_block(frame: &Rc, fn_name: String, params: Rc>>, target: RenderTarget, spec: Rc, emit_init_stmts: impl Fn(Rc>>, Rc, i64) -> Rc + Clone, recurse_tco: impl Fn(Rc, Rc, i64) -> String + Clone) -> String { +pub fn shared_tco_block( + frame: &Rc, + fn_name: String, + params: Rc>>, + target: RenderTarget, + spec: Rc, + emit_init_stmts: impl Fn(Rc>>, Rc, i64) -> Rc + Clone, + recurse_tco: impl Fn(Rc, Rc, i64) -> String + Clone, +) -> String { match (*frame.expr.clone().expr_data.clone()).clone() { - ExprData::ExprBlock => { - let ss = frame.expr.clone().children.clone(); -if ((ss.clone().len() as i64) == 0) { - spec.tco.clone().break_return.clone() - } else { - { - let init_state = emit_init_stmts(ss.clone(), frame.scope.clone(), frame.depth.clone()); -let last_str = match ss.clone().last().cloned() { - Some(last_expr) => recurse_tco(last_expr.clone(), init_state.scope.clone(), frame.depth.clone()), - None => spec.tco.clone().break_return.clone(), -}; -if ((init_state.text.clone().len() as i64) == 0) { - last_str - } else { - v2_rt::concat(v2_rt::concat(init_state.text.clone().join(&"\n".to_string()), "\n".to_string()), last_str) + ExprData::ExprBlock => { + let ss = frame.expr.clone().children.clone(); + if ((ss.clone().len() as i64) == 0) { + spec.tco.clone().break_return.clone() + } else { + { + let init_state = + emit_init_stmts(ss.clone(), frame.scope.clone(), frame.depth.clone()); + let last_str = match ss.clone().last().cloned() { + Some(last_expr) => recurse_tco( + last_expr.clone(), + init_state.scope.clone(), + frame.depth.clone(), + ), + None => spec.tco.clone().break_return.clone(), + }; + if ((init_state.text.clone().len() as i64) == 0) { + last_str + } else { + v2_rt::concat( + v2_rt::concat( + init_state.text.clone().join(&"\n".to_string()), + "\n".to_string(), + ), + last_str, + ) + } } -} + } } -}, - _ => emit_error_expr("shared_tco_block expected ExprBlock".to_string(), target), -} + _ => emit_error_expr("shared_tco_block expected ExprBlock".to_string(), target), + } } -pub fn shared_tco_reassign(ordered_args: Rc>, param_names: Rc>, spec: &Rc) -> String { +pub fn shared_tco_reassign( + ordered_args: Rc>, + param_names: Rc>, + spec: &Rc, +) -> String { { - let all_lines = tco_reassign_core(ordered_args, param_names, spec.tco.clone().temp_var_prefix.clone(), spec.tco.clone().temp_decl_prefix.clone(), spec.tco.clone().temp_assign_op.clone(), spec.block_syntax.clone().stmt_terminator.clone(), spec.tco.clone().continue_str.clone(), &"".to_string()); -all_lines.join(&"\n".to_string()) -} -} - -pub fn unified_tco_recurse(expr: Rc, scope: Rc, depth: i64, fn_name: String, params: Rc>>, target: RenderTarget, registry: Rc>>, recurse_expr: impl Fn(Rc, Rc, i64) -> String + Clone, render_match: impl Fn(Rc) -> String + Clone, render_init_stmts: impl Fn(Rc>>, Rc, i64) -> Rc + Clone) -> String { - emit_unified_tco_expr(&Rc::new(TcoFrame { - expr: expr, - scope: scope, - depth: depth, -}), &fn_name, params, &target, registry, recurse_expr, render_match, render_init_stmts) + let all_lines = tco_reassign_core( + ordered_args, + param_names, + spec.tco.clone().temp_var_prefix.clone(), + spec.tco.clone().temp_decl_prefix.clone(), + spec.tco.clone().temp_assign_op.clone(), + spec.block_syntax.clone().stmt_terminator.clone(), + spec.tco.clone().continue_str.clone(), + &"".to_string(), + ); + all_lines.join(&"\n".to_string()) + } } -pub fn emit_unified_tco_expr(frame: &Rc, fn_name: &String, params: Rc>>, target: &RenderTarget, registry: Rc>>, recurse_expr: impl Fn(Rc, Rc, i64) -> String + Clone, render_match: impl Fn(Rc) -> String + Clone, render_init_stmts: impl Fn(Rc>>, Rc, i64) -> Rc + Clone) -> String { +pub fn unified_tco_recurse( + expr: Rc, + scope: Rc, + depth: i64, + fn_name: String, + params: Rc>>, + target: RenderTarget, + registry: Rc>>, + recurse_expr: impl Fn(Rc, Rc, i64) -> String + Clone, + render_match: impl Fn(Rc) -> String + Clone, + render_init_stmts: impl Fn(Rc>>, Rc, i64) -> Rc + Clone, +) -> String { + emit_unified_tco_expr( + &Rc::new(TcoFrame { + expr: expr, + scope: scope, + depth: depth, + }), + &fn_name, + params, + &target, + registry, + recurse_expr, + render_match, + render_init_stmts, + ) +} + +pub fn emit_unified_tco_expr( + frame: &Rc, + fn_name: &String, + params: Rc>>, + target: &RenderTarget, + registry: Rc>>, + recurse_expr: impl Fn(Rc, Rc, i64) -> String + Clone, + render_match: impl Fn(Rc) -> String + Clone, + render_init_stmts: impl Fn(Rc>>, Rc, i64) -> Rc + Clone, +) -> String { { let spec = language_spec(target.clone()); -emit_shared_tco_expr(frame.clone(), fn_name.clone(), |input| emit_typed_tco_reassign_shared(input.args.clone(), params.clone(), &target, |child| recurse_expr(child.clone(), input.scope.clone(), input.depth.clone()), input.scope.clone().type_env.clone().source_indices.clone()), |frame| shared_tco_non_self_call(&frame, target.clone(), spec.clone(), |f, args, scope, depth| emit_typed_call_unified(&f, args.clone(), &target, registry.clone(), scope.clone(), |n| recurse_expr(n.clone(), scope.clone(), depth.clone()))), |frame| shared_tco_if(&frame, fn_name.clone(), params.clone(), target.clone(), spec.clone(), recurse_expr.clone(), |expr, scope, depth| unified_tco_recurse(expr.clone(), scope.clone(), depth.clone(), fn_name.clone(), params.clone(), target.clone(), registry.clone(), recurse_expr.clone(), render_match.clone(), render_init_stmts.clone())), render_match.clone(), |frame| shared_tco_let(&frame, fn_name.clone(), params.clone(), target.clone(), recurse_expr.clone(), |expr, scope, depth| unified_tco_recurse(expr.clone(), scope.clone(), depth.clone(), fn_name.clone(), params.clone(), target.clone(), registry.clone(), recurse_expr.clone(), render_match.clone(), render_init_stmts.clone())), |frame| shared_tco_block(&frame, fn_name.clone(), params.clone(), target.clone(), spec.clone(), render_init_stmts.clone(), |expr, scope, depth| unified_tco_recurse(expr.clone(), scope.clone(), depth.clone(), fn_name.clone(), params.clone(), target.clone(), registry.clone(), recurse_expr.clone(), render_match.clone(), render_init_stmts.clone())), |frame| shared_tco_default_return(&frame, spec.clone(), recurse_expr.clone())) -} + emit_shared_tco_expr( + frame.clone(), + fn_name.clone(), + |input| { + emit_typed_tco_reassign_shared( + input.args.clone(), + params.clone(), + &target, + |child| recurse_expr(child.clone(), input.scope.clone(), input.depth.clone()), + input.scope.clone().type_env.clone().source_indices.clone(), + ) + }, + |frame| { + shared_tco_non_self_call( + &frame, + target.clone(), + spec.clone(), + |f, args, scope, depth| { + emit_typed_call_unified( + &f, + args.clone(), + &target, + registry.clone(), + scope.clone(), + |n| recurse_expr(n.clone(), scope.clone(), depth.clone()), + ) + }, + ) + }, + |frame| { + shared_tco_if( + &frame, + fn_name.clone(), + params.clone(), + target.clone(), + spec.clone(), + recurse_expr.clone(), + |expr, scope, depth| { + unified_tco_recurse( + expr.clone(), + scope.clone(), + depth.clone(), + fn_name.clone(), + params.clone(), + target.clone(), + registry.clone(), + recurse_expr.clone(), + render_match.clone(), + render_init_stmts.clone(), + ) + }, + ) + }, + render_match.clone(), + |frame| { + shared_tco_let( + &frame, + fn_name.clone(), + params.clone(), + target.clone(), + recurse_expr.clone(), + |expr, scope, depth| { + unified_tco_recurse( + expr.clone(), + scope.clone(), + depth.clone(), + fn_name.clone(), + params.clone(), + target.clone(), + registry.clone(), + recurse_expr.clone(), + render_match.clone(), + render_init_stmts.clone(), + ) + }, + ) + }, + |frame| { + shared_tco_block( + &frame, + fn_name.clone(), + params.clone(), + target.clone(), + spec.clone(), + render_init_stmts.clone(), + |expr, scope, depth| { + unified_tco_recurse( + expr.clone(), + scope.clone(), + depth.clone(), + fn_name.clone(), + params.clone(), + target.clone(), + registry.clone(), + recurse_expr.clone(), + render_match.clone(), + render_init_stmts.clone(), + ) + }, + ) + }, + |frame| shared_tco_default_return(&frame, spec.clone(), recurse_expr.clone()), + ) + } } -pub fn emit_unified_tco_body(texpr: Rc, fn_name: String, params: Rc>>, target: &RenderTarget, registry: Rc>>, scope: Rc, depth: i64, recurse_expr: impl Fn(Rc, Rc, i64) -> String + Clone, render_match: impl Fn(Rc) -> String + Clone, render_init_stmts: impl Fn(Rc>>, Rc, i64) -> Rc + Clone) -> String { +pub fn emit_unified_tco_body( + texpr: Rc, + fn_name: String, + params: Rc>>, + target: &RenderTarget, + registry: Rc>>, + scope: Rc, + depth: i64, + recurse_expr: impl Fn(Rc, Rc, i64) -> String + Clone, + render_match: impl Fn(Rc) -> String + Clone, + render_init_stmts: impl Fn(Rc>>, Rc, i64) -> Rc + Clone, +) -> String { { let spec = language_spec(target.clone()); -let inner = emit_unified_tco_expr(&Rc::new(TcoFrame { - expr: texpr, - scope: scope, - depth: (depth.clone() + 1), -}), &fn_name, params, &target, registry, recurse_expr, render_match, render_init_stmts); -shared_tco_body(inner, depth.clone(), &spec) -} + let inner = emit_unified_tco_expr( + &Rc::new(TcoFrame { + expr: texpr, + scope: scope, + depth: (depth.clone() + 1), + }), + &fn_name, + params, + &target, + registry, + recurse_expr, + render_match, + render_init_stmts, + ); + shared_tco_body(inner, depth.clone(), &spec) + } } -pub fn emit_unified_init_block_stmts(remaining: Rc>>, text: Rc>, scope: Rc, depth: i64, target: &RenderTarget, registry: Rc>>, render_pattern: impl Fn(Rc) -> String + Clone) -> Rc { +pub fn emit_unified_init_block_stmts( + remaining: Rc>>, + text: Rc>, + scope: Rc, + depth: i64, + target: &RenderTarget, + registry: Rc>>, + render_pattern: impl Fn(Rc) -> String + Clone, +) -> Rc { { - let prepend = if language_spec(target.clone()).block_syntax.clone().significant_whitespace.clone() { + let prepend = if language_spec(target.clone()) + .block_syntax + .clone() + .significant_whitespace + .clone() + { false } else { true }; -emit_init_block_stmts_shared(remaining, text, scope, depth, prepend, |stmt, sc, d| emit_unified_typed_expr(stmt.clone(), &target, registry.clone(), &sc, d.clone(), 1024, render_pattern.clone())) -} + emit_init_block_stmts_shared(remaining, text, scope, depth, prepend, |stmt, sc, d| { + emit_unified_typed_expr( + stmt.clone(), + &target, + registry.clone(), + &sc, + d.clone(), + 1024, + render_pattern.clone(), + ) + }) + } } -pub fn emit_unified_tco_match(frame: &Rc, fn_name: String, params: Rc>>, target: &RenderTarget, registry: &Rc>>, render_pattern: impl Fn(Rc) -> String + Clone, render_init_stmts: impl Fn(Rc>>, Rc, i64) -> Rc + Clone) -> String { +pub fn emit_unified_tco_match( + frame: &Rc, + fn_name: String, + params: Rc>>, + target: &RenderTarget, + registry: &Rc>>, + render_pattern: impl Fn(Rc) -> String + Clone, + render_init_stmts: impl Fn(Rc>>, Rc, i64) -> Rc + Clone, +) -> String { match (*frame.expr.clone().expr_data.clone()).clone() { - ExprData::ExprMatch => { - let s = match_scrutinee(frame.expr.clone()); -let arm_list = match_arm_nodes(frame.expr.clone()); -let scrut_str = emit_unified_typed_expr(s, &target, registry.clone(), &frame.scope.clone(), frame.depth.clone(), 1024, render_pattern.clone()); -let arm_strs = Rc::new({ let mut __result = Vec::new(); for arm in arm_list.iter().cloned() { __result.push(emit_unified_tco_match_arm(&arm, &fn_name, ¶ms, &target, ®istry, &frame.scope.clone(), frame.depth.clone(), render_pattern.clone(), render_init_stmts.clone())); } __result }); -let arms_str = arm_strs.join(&"\n".to_string()); -let bs = language_spec(target.clone()).block_syntax.clone(); -if (bs.block_close.clone().as_str() == "".to_string().as_str()) { - v2_rt::concat(v2_rt::concat(v2_rt::concat(bs.match_keyword.clone(), scrut_str), bs.block_open.clone()), arms_str) - } else { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(bs.match_keyword.clone(), scrut_str), bs.block_open.clone()), arms_str), "\n".to_string()), bs.block_close.clone()) + ExprData::ExprMatch => { + let s = match_scrutinee(frame.expr.clone()); + let arm_list = match_arm_nodes(frame.expr.clone()); + let scrut_str = emit_unified_typed_expr( + s, + &target, + registry.clone(), + &frame.scope.clone(), + frame.depth.clone(), + 1024, + render_pattern.clone(), + ); + let arm_strs = Rc::new({ + let mut __result = Vec::new(); + for arm in arm_list.iter().cloned() { + __result.push(emit_unified_tco_match_arm( + &arm, + &fn_name, + ¶ms, + &target, + ®istry, + &frame.scope.clone(), + frame.depth.clone(), + render_pattern.clone(), + render_init_stmts.clone(), + )); + } + __result + }); + let arms_str = arm_strs.join(&"\n".to_string()); + let bs = language_spec(target.clone()).block_syntax.clone(); + if (bs.block_close.clone().as_str() == "".to_string().as_str()) { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(bs.match_keyword.clone(), scrut_str), + bs.block_open.clone(), + ), + arms_str, + ) + } else { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(bs.match_keyword.clone(), scrut_str), + bs.block_open.clone(), + ), + arms_str, + ), + "\n".to_string(), + ), + bs.block_close.clone(), + ) + } } -}, - _ => emit_error_expr("emit_unified_tco_match expected ExprMatch".to_string(), target.clone()), -} + _ => emit_error_expr( + "emit_unified_tco_match expected ExprMatch".to_string(), + target.clone(), + ), + } } -pub fn emit_unified_tco_match_arm(arm: &Rc, fn_name: &String, params: &Rc>>, target: &RenderTarget, registry: &Rc>>, scope: &Rc, depth: i64, render_pattern: impl Fn(Rc) -> String + Clone, render_init_stmts: impl Fn(Rc>>, Rc, i64) -> Rc + Clone) -> String { +pub fn emit_unified_tco_match_arm( + arm: &Rc, + fn_name: &String, + params: &Rc>>, + target: &RenderTarget, + registry: &Rc>>, + scope: &Rc, + depth: i64, + render_pattern: impl Fn(Rc) -> String + Clone, + render_init_stmts: impl Fn(Rc>>, Rc, i64) -> Rc + Clone, +) -> String { { let bs = language_spec(target.clone()).block_syntax.clone(); -let case_depth = if bs.significant_whitespace.clone() { + let case_depth = if bs.significant_whitespace.clone() { (depth.clone() + 1) } else { depth.clone() }; -let body_depth = (case_depth.clone() + 1); -let guard_str = emit_arm_guard(arm.clone(), &target, |g| emit_unified_typed_expr(g.clone(), &target, registry.clone(), &scope, depth.clone(), 1024, render_pattern.clone())); -let body_str = emit_unified_tco_expr(&Rc::new(TcoFrame { - expr: arm_body(&arm), - scope: scope.clone(), - depth: body_depth.clone(), -}), &fn_name, params.clone(), &target, registry.clone(), |expr, scope, depth| emit_unified_typed_expr(expr.clone(), &target, registry.clone(), &scope, depth.clone(), 1024, render_pattern.clone()), |frame| emit_unified_tco_match(&frame, fn_name.clone(), params.clone(), &target, ®istry, render_pattern.clone(), render_init_stmts.clone()), render_init_stmts.clone()); -emit_match_arm_line(arm.clone(), target.clone(), case_depth.clone(), body_depth.clone(), body_str, guard_str, render_pattern.clone()) -} + let body_depth = (case_depth.clone() + 1); + let guard_str = emit_arm_guard(arm.clone(), &target, |g| { + emit_unified_typed_expr( + g.clone(), + &target, + registry.clone(), + &scope, + depth.clone(), + 1024, + render_pattern.clone(), + ) + }); + let body_str = emit_unified_tco_expr( + &Rc::new(TcoFrame { + expr: arm_body(&arm), + scope: scope.clone(), + depth: body_depth.clone(), + }), + &fn_name, + params.clone(), + &target, + registry.clone(), + |expr, scope, depth| { + emit_unified_typed_expr( + expr.clone(), + &target, + registry.clone(), + &scope, + depth.clone(), + 1024, + render_pattern.clone(), + ) + }, + |frame| { + emit_unified_tco_match( + &frame, + fn_name.clone(), + params.clone(), + &target, + ®istry, + render_pattern.clone(), + render_init_stmts.clone(), + ) + }, + render_init_stmts.clone(), + ); + emit_match_arm_line( + arm.clone(), + target.clone(), + case_depth.clone(), + body_depth.clone(), + body_str, + guard_str, + render_pattern.clone(), + ) + } } -pub fn emit_tco_unified(texpr: Rc, fn_name: &String, params: &Rc>>, target: &RenderTarget, registry: &Rc>>, scope: &Rc, depth: i64, render_pattern: impl Fn(Rc) -> String + Clone) -> String { - emit_unified_tco_body(texpr, fn_name.clone(), params.clone(), &target, registry.clone(), scope.clone(), depth.clone(), |expr, scope, depth| emit_unified_typed_expr(expr.clone(), &target, registry.clone(), &scope, depth.clone(), 1024, render_pattern.clone()), |frame| emit_unified_tco_match(&frame, fn_name.clone(), params.clone(), &target, ®istry, render_pattern.clone(), |stmts, scope, depth| emit_unified_init_block_stmts(stmts.clone(), Rc::new(vec![]), scope.clone(), depth.clone(), &target, registry.clone(), render_pattern.clone())), |stmts, scope, depth| emit_unified_init_block_stmts(stmts.clone(), Rc::new(vec![]), scope.clone(), depth.clone(), &target, registry.clone(), render_pattern.clone())) +pub fn emit_tco_unified( + texpr: Rc, + fn_name: &String, + params: &Rc>>, + target: &RenderTarget, + registry: &Rc>>, + scope: &Rc, + depth: i64, + render_pattern: impl Fn(Rc) -> String + Clone, +) -> String { + emit_unified_tco_body( + texpr, + fn_name.clone(), + params.clone(), + &target, + registry.clone(), + scope.clone(), + depth.clone(), + |expr, scope, depth| { + emit_unified_typed_expr( + expr.clone(), + &target, + registry.clone(), + &scope, + depth.clone(), + 1024, + render_pattern.clone(), + ) + }, + |frame| { + emit_unified_tco_match( + &frame, + fn_name.clone(), + params.clone(), + &target, + ®istry, + render_pattern.clone(), + |stmts, scope, depth| { + emit_unified_init_block_stmts( + stmts.clone(), + Rc::new(vec![]), + scope.clone(), + depth.clone(), + &target, + registry.clone(), + render_pattern.clone(), + ) + }, + ) + }, + |stmts, scope, depth| { + emit_unified_init_block_stmts( + stmts.clone(), + Rc::new(vec![]), + scope.clone(), + depth.clone(), + &target, + registry.clone(), + render_pattern.clone(), + ) + }, + ) } -pub fn emit_unified_typed_func_body(body: &Rc, target: &RenderTarget, registry: &Rc>>, scope: &Rc, depth: i64) -> String { +pub fn emit_unified_typed_func_body( + body: &Rc, + target: &RenderTarget, + registry: &Rc>>, + scope: &Rc, + depth: i64, +) -> String { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - { - let es = language_spec(target.clone()).expression_semantics.clone(); -let bs = language_spec(target.clone()).block_syntax.clone(); -let si = scope.type_env.clone().source_indices.clone(); -let prefix = if bs.significant_whitespace.clone() { - "".to_string() - } else { - make_indent(depth.clone()) - }; -match (*body.expr_data.clone()).clone() { - ExprData::ExprLet => { + let es = language_spec(target.clone()).expression_semantics.clone(); + let bs = language_spec(target.clone()).block_syntax.clone(); + let si = scope.type_env.clone().source_indices.clone(); + let prefix = if bs.significant_whitespace.clone() { + "".to_string() + } else { + make_indent(depth.clone()) + }; + match (*body.expr_data.clone()).clone() { + ExprData::ExprLet => { let n = let_binding_name_at(body.clone(), si.clone()); -let ch = body.children.clone(); -let v = let_value(body.clone()); -let inner = let_body(body.clone()); -let val_str = emit_unified_typed_expr(v.clone(), &target, registry.clone(), &scope, depth.clone(), 1024, |pat| emit_unified_pattern(pat.clone(), target.clone(), si.clone())); -let let_line = v2_rt::concat(prefix, emit_let_binding(n.clone(), val_str, &target)); -let next_scope = extend_scope(&scope, &n, resolved_type(v.clone()), Rc::new(SubValueRelation::SubValueUnknown)); -match inner { - Some(bd) => v2_rt::concat(v2_rt::concat(let_line, "\n".to_string()), emit_unified_typed_func_body(&bd, &target, ®istry, &next_scope, depth.clone())), - None => let_line, -} -}, - ExprData::ExprBlock => { + let ch = body.children.clone(); + let v = let_value(body.clone()); + let inner = let_body(body.clone()); + let val_str = emit_unified_typed_expr( + v.clone(), + &target, + registry.clone(), + &scope, + depth.clone(), + 1024, + |pat| emit_unified_pattern(pat.clone(), target.clone(), si.clone()), + ); + let let_line = v2_rt::concat(prefix, emit_let_binding(n.clone(), val_str, &target)); + let next_scope = extend_scope( + &scope, + &n, + resolved_type(v.clone()), + Rc::new(SubValueRelation::SubValueUnknown), + ); + match inner { + Some(bd) => v2_rt::concat( + v2_rt::concat(let_line, "\n".to_string()), + emit_unified_typed_func_body( + &bd, + &target, + ®istry, + &next_scope, + depth.clone(), + ), + ), + None => let_line, + } + } + ExprData::ExprBlock => { let ss = body.children.clone(); -if ((ss.clone().len() as i64) == 0) { - v2_rt::concat(v2_rt::concat(prefix, "return ".to_string()), es.empty_return_value.clone()) + if ((ss.clone().len() as i64) == 0) { + v2_rt::concat( + v2_rt::concat(prefix, "return ".to_string()), + es.empty_return_value.clone(), + ) } else { { - let init_state = emit_unified_init_block_stmts(ss.clone(), Rc::new(vec![]), scope.clone(), depth.clone(), &target, registry.clone(), |pat| emit_unified_pattern(pat.clone(), target.clone(), si.clone())); -let last_stmt = ss.clone().last().cloned(); -let last_str = match last_stmt { - Some(s) => v2_rt::concat(v2_rt::concat(v2_rt::concat(prefix, "return ".to_string()), emit_unified_typed_expr(s.clone(), &target, registry.clone(), &init_state.scope.clone(), depth.clone(), 1024, |pat| emit_unified_pattern(pat.clone(), target.clone(), si.clone()))), es.return_suffix.clone()), - None => v2_rt::concat(v2_rt::concat(prefix, "return ".to_string()), es.empty_return_value.clone()), -}; -if ((init_state.text.clone().len() as i64) == 0) { + let init_state = emit_unified_init_block_stmts( + ss.clone(), + Rc::new(vec![]), + scope.clone(), + depth.clone(), + &target, + registry.clone(), + |pat| emit_unified_pattern(pat.clone(), target.clone(), si.clone()), + ); + let last_stmt = ss.clone().last().cloned(); + let last_str = match last_stmt { + Some(s) => v2_rt::concat( + v2_rt::concat( + v2_rt::concat(prefix, "return ".to_string()), + emit_unified_typed_expr( + s.clone(), + &target, + registry.clone(), + &init_state.scope.clone(), + depth.clone(), + 1024, + |pat| { + emit_unified_pattern( + pat.clone(), + target.clone(), + si.clone(), + ) + }, + ), + ), + es.return_suffix.clone(), + ), + None => v2_rt::concat( + v2_rt::concat(prefix, "return ".to_string()), + es.empty_return_value.clone(), + ), + }; + if ((init_state.text.clone().len() as i64) == 0) { last_str } else { - v2_rt::concat(v2_rt::concat(init_state.text.clone().join(&"\n".to_string()), "\n".to_string()), last_str) + v2_rt::concat( + v2_rt::concat( + init_state.text.clone().join(&"\n".to_string()), + "\n".to_string(), + ), + last_str, + ) } -} + } } -}, - _ => v2_rt::concat(v2_rt::concat(v2_rt::concat(prefix, "return ".to_string()), emit_unified_typed_expr(body.clone(), &target, registry.clone(), &scope, depth.clone(), 1024, |pat| emit_unified_pattern(pat.clone(), target.clone(), si.clone()))), es.return_suffix.clone()), -} -} + } + _ => v2_rt::concat( + v2_rt::concat( + v2_rt::concat(prefix, "return ".to_string()), + emit_unified_typed_expr( + body.clone(), + &target, + registry.clone(), + &scope, + depth.clone(), + 1024, + |pat| emit_unified_pattern(pat.clone(), target.clone(), si.clone()), + ), + ), + es.return_suffix.clone(), + ), + } }) } -pub fn is_tco_candidate(texpr: &Rc, func_name: &String, source_indices: &Rc>>) -> bool { +pub fn is_tco_candidate( + texpr: &Rc, + func_name: &String, + source_indices: &Rc>>, +) -> bool { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*texpr.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => (expr_call_func_at(texpr.clone(), source_indices.clone()).as_str() == func_name.clone().as_str()), - ExprData::ExprReturn => is_tco_candidate(&return_value(texpr.clone()), &func_name, &source_indices), - ExprData::ExprIf => { - let then_cand = is_tco_candidate(&if_then_branch(texpr.clone()), &func_name, &source_indices); -let else_cand = match if_else_branch(texpr.clone()) { - Some(e) => is_tco_candidate(&e, &func_name, &source_indices), - None => false, -}; -(then_cand || else_cand) -}, - ExprData::ExprMatch => { let mut __found = false; for arm_node in match_arm_nodes(texpr.clone()).iter().cloned() { if is_tco_candidate(&arm_body(&arm_node), &func_name, &source_indices) { __found = true; break; } } __found }, - ExprData::ExprLet => match let_body(texpr.clone()) { - Some(b) => is_tco_candidate(&b, &func_name, &source_indices), - None => false, -}, - ExprData::ExprBlock => { let mut __found = false; for s in texpr.children.clone().iter().cloned() { if is_tco_candidate(&s, &func_name, &source_indices) { __found = true; break; } } __found }, - ExprData::NoExprData => { let mut __found = false; for child in texpr.children.clone().iter().cloned() { if is_tco_candidate(&child, &func_name, &source_indices) { __found = true; break; } } __found }, - _ => false, -} + ExprData::ExprCall { .. } => { + (expr_call_func_at(texpr.clone(), source_indices.clone()).as_str() + == func_name.clone().as_str()) + } + ExprData::ExprReturn => { + is_tco_candidate(&return_value(texpr.clone()), &func_name, &source_indices) + } + ExprData::ExprIf => { + let then_cand = + is_tco_candidate(&if_then_branch(texpr.clone()), &func_name, &source_indices); + let else_cand = match if_else_branch(texpr.clone()) { + Some(e) => is_tco_candidate(&e, &func_name, &source_indices), + None => false, + }; + (then_cand || else_cand) + } + ExprData::ExprMatch => { + let mut __found = false; + for arm_node in match_arm_nodes(texpr.clone()).iter().cloned() { + if is_tco_candidate(&arm_body(&arm_node), &func_name, &source_indices) { + __found = true; + break; + } + } + __found + } + ExprData::ExprLet => match let_body(texpr.clone()) { + Some(b) => is_tco_candidate(&b, &func_name, &source_indices), + None => false, + }, + ExprData::ExprBlock => { + let mut __found = false; + for s in texpr.children.clone().iter().cloned() { + if is_tco_candidate(&s, &func_name, &source_indices) { + __found = true; + break; + } + } + __found + } + ExprData::NoExprData => { + let mut __found = false; + for child in texpr.children.clone().iter().cloned() { + if is_tco_candidate(&child, &func_name, &source_indices) { + __found = true; + break; + } + } + __found + } + _ => false, + } }) } pub fn emit_ident(name: String, target: RenderTarget) -> String { { let spec = language_spec(target); -let converted = match spec.naming_case.clone() { - NamingCase::SnakeCase => to_snake(name), - NamingCase::CamelCase => to_camel(name), - NamingCase::PascalCase => capitalize_first(to_camel(name)), - NamingCase::AsAuthored => name, -}; -let is_reserved = { let mut __found = false; for r in spec.reserved_words.clone().keywords.clone().iter().cloned() { if (r.clone().as_str() == converted.clone().as_str()) { __found = true; break; } } __found }; -if is_reserved { + let converted = match spec.naming_case.clone() { + NamingCase::SnakeCase => to_snake(name), + NamingCase::CamelCase => to_camel(name), + NamingCase::PascalCase => capitalize_first(to_camel(name)), + NamingCase::AsAuthored => name, + }; + let is_reserved = { + let mut __found = false; + for r in spec.reserved_words.clone().keywords.clone().iter().cloned() { + if (r.clone().as_str() == converted.clone().as_str()) { + __found = true; + break; + } + } + __found + }; + if is_reserved { match (*spec.reserved_words.clone().strategy.clone()).clone() { - ReservedWordStrategy::PrefixEscape { prefix: p, .. } => v2_rt::concat(p.clone(), converted.clone()), - ReservedWordStrategy::SuffixEscape { suffix: s, .. } => v2_rt::concat(converted.clone(), s.clone()), - ReservedWordStrategy::NoEscape => converted.clone(), -} + ReservedWordStrategy::PrefixEscape { prefix: p, .. } => { + v2_rt::concat(p.clone(), converted.clone()) + } + ReservedWordStrategy::SuffixEscape { suffix: s, .. } => { + v2_rt::concat(converted.clone(), s.clone()) + } + ReservedWordStrategy::NoEscape => converted.clone(), + } } else { converted.clone() } -} + } } pub fn emit_export_ident(name: String, target: &RenderTarget) -> String { { let spec = language_spec(target.clone()); -match (*spec.visibility.clone()).clone() { - VisibilitySpec::CaseVisibility { export_case: ec, .. } => { - let result = apply_naming_case(name, ec.clone()); -let is_reserved = { let mut __found = false; for r in spec.reserved_words.clone().keywords.clone().iter().cloned() { if (r.clone().as_str() == result.clone().as_str()) { __found = true; break; } } __found }; -if is_reserved { - match (*spec.reserved_words.clone().strategy.clone()).clone() { - ReservedWordStrategy::SuffixEscape { suffix: s, .. } => v2_rt::concat(result.clone(), s.clone()), - ReservedWordStrategy::PrefixEscape { prefix: p, .. } => v2_rt::concat(p.clone(), result.clone()), - ReservedWordStrategy::NoEscape => result.clone(), -} - } else { - result.clone() + match (*spec.visibility.clone()).clone() { + VisibilitySpec::CaseVisibility { + export_case: ec, .. + } => { + let result = apply_naming_case(name, ec.clone()); + let is_reserved = { + let mut __found = false; + for r in spec.reserved_words.clone().keywords.clone().iter().cloned() { + if (r.clone().as_str() == result.clone().as_str()) { + __found = true; + break; + } + } + __found + }; + if is_reserved { + match (*spec.reserved_words.clone().strategy.clone()).clone() { + ReservedWordStrategy::SuffixEscape { suffix: s, .. } => { + v2_rt::concat(result.clone(), s.clone()) + } + ReservedWordStrategy::PrefixEscape { prefix: p, .. } => { + v2_rt::concat(p.clone(), result.clone()) + } + ReservedWordStrategy::NoEscape => result.clone(), + } + } else { + result.clone() + } } -}, - VisibilitySpec::KeywordVisibility { .. } => emit_ident(name, target.clone()), -} -} + VisibilitySpec::KeywordVisibility { .. } => emit_ident(name, target.clone()), + } + } } -pub fn apply_bridge_method_overrides(name: String, overrides: Rc>) -> String { +pub fn apply_bridge_method_overrides( + name: String, + overrides: Rc>, +) -> String { match v2_rt::lookup(&overrides, name.clone()) { - Some(replacement) => replacement.clone(), - None => name.clone(), -} + Some(replacement) => replacement.clone(), + None => name.clone(), + } } pub fn emit_let_binding(name: String, value: String, target: &RenderTarget) -> String { { let spec = language_spec(target.clone()); -apply_type_template2(spec.annotations.clone().let_binding_inferred.clone(), emit_ident(name, target.clone()), value) -} + apply_type_template2( + spec.annotations.clone().let_binding_inferred.clone(), + emit_ident(name, target.clone()), + value, + ) + } } -pub fn emit_let_binding_annotated(name: String, type_str: String, value: String, target: &RenderTarget) -> String { +pub fn emit_let_binding_annotated( + name: String, + type_str: String, + value: String, + target: &RenderTarget, +) -> String { { let spec = language_spec(target.clone()); -apply_type_template3(spec.annotations.clone().let_binding_annotated.clone(), emit_ident(name, target.clone()), type_str, value) -} + apply_type_template3( + spec.annotations.clone().let_binding_annotated.clone(), + emit_ident(name, target.clone()), + type_str, + value, + ) + } } pub fn emit_return(value: String, target: RenderTarget) -> String { @@ -1981,765 +4074,2002 @@ pub fn emit_return(value: String, target: RenderTarget) -> String { pub fn emit_unary_op(op: UnaryOpKind, operand_str: String, target: RenderTarget) -> String { match op { - UnaryOpKind::Not => v2_rt::concat(emit_keyword("not".to_string(), target), operand_str), - UnaryOpKind::Neg => v2_rt::concat("-".to_string(), operand_str), -} + UnaryOpKind::Not => v2_rt::concat(emit_keyword("not".to_string(), target), operand_str), + UnaryOpKind::Neg => v2_rt::concat("-".to_string(), operand_str), + } } pub fn emit_lambda(params_str: String, body_str: String, target: RenderTarget) -> String { { let spec = language_spec(target); -apply_type_template2(spec.lambda_template.clone(), params_str, body_str) -} + apply_type_template2(spec.lambda_template.clone(), params_str, body_str) + } } pub fn emit_error_expr(message: String, target: RenderTarget) -> String { { let msg = emit_string_literal(message, "".to_string()); -let spec = language_spec(target); -apply_type_template1(spec.error_expr_template.clone(), msg) -} + let spec = language_spec(target); + apply_type_template1(spec.error_expr_template.clone(), msg) + } } pub fn emit_lambda_params(param_names: Rc>, target: &RenderTarget) -> String { { let spec = language_spec(target.clone()); -let param_strs = Rc::new({ let mut __result = Vec::new(); for p in param_names.iter().cloned() { __result.push(apply_type_template1(spec.annotations.clone().lambda_param_untyped.clone(), emit_ident(p.clone(), target.clone()))); } __result }); -param_strs.join(&", ".to_string()) -} + let param_strs = Rc::new({ + let mut __result = Vec::new(); + for p in param_names.iter().cloned() { + __result.push(apply_type_template1( + spec.annotations.clone().lambda_param_untyped.clone(), + emit_ident(p.clone(), target.clone()), + )); + } + __result + }); + param_strs.join(&", ".to_string()) + } } pub fn emit_list_lit_expr(element_strs: &Rc>, target: RenderTarget) -> String { { let spec = language_spec(target); -if ((element_strs.clone().len() as i64) == 0) { + if ((element_strs.clone().len() as i64) == 0) { spec.list_literal_empty.clone() } else { { let els_str = element_strs.clone().join(&", ".to_string()); -apply_type_template1(spec.list_literal_template.clone(), els_str) -} + apply_type_template1(spec.list_literal_template.clone(), els_str) + } } -} + } } pub fn emit_null_coalesce(l_str: String, r_str: String, target: RenderTarget) -> String { { let spec = language_spec(target); -apply_type_template2(spec.null_coalesce_template.clone(), l_str, r_str) -} + apply_type_template2(spec.null_coalesce_template.clone(), l_str, r_str) + } } -pub fn emit_expr_var_shared(expr: Rc, target: RenderTarget, source_indices: Rc>>) -> String { +pub fn emit_expr_var_shared( + expr: Rc, + target: RenderTarget, + source_indices: Rc>>, +) -> String { { let n = expr_var_name_at(expr, source_indices); -if (n.clone().as_str() == "none".to_string().as_str()) { + if (n.clone().as_str() == "none".to_string().as_str()) { emit_keyword("null".to_string(), target) } else { - if ((n.clone().as_str() == "true".to_string().as_str()) || (n.clone().as_str() == "false".to_string().as_str())) { + if ((n.clone().as_str() == "true".to_string().as_str()) + || (n.clone().as_str() == "false".to_string().as_str())) + { emit_keyword(n.clone(), target) } else { emit_ident(n.clone(), target) } } -} + } } -pub fn emit_expr_field_access_shared(expr: &Rc, target: RenderTarget, emit_field: impl Fn(Rc) -> String + Clone, source_indices: &Rc>>) -> String { +pub fn emit_expr_field_access_shared( + expr: &Rc, + target: RenderTarget, + emit_field: impl Fn(Rc) -> String + Clone, + source_indices: &Rc>>, +) -> String { if is_typed_service_call_receiver(&expr, source_indices.clone()) { match extract_typed_service_name(&expr, &source_indices) { - Some(svc_name) => service_var_name(svc_name.clone()), - None => emit_field(expr.clone()), -} + Some(svc_name) => service_var_name(svc_name.clone()), + None => emit_field(expr.clone()), + } } else { emit_field(expr.clone()) } } pub fn extract_string_interp_parts(expr: Rc) -> Rc>> { - Rc::new({ let mut __result = Vec::new(); for child in expr.children.clone().iter().cloned() { __result.push(match (*child.expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitStr { value: text, .. } = value.as_ref() else { unreachable!() }; Rc::new(StringPart::Text { - value: text.clone(), -}) }, - _ => Rc::new(StringPart::Interpolation { - expr: arg_value(&child), -}), -}); } __result }) -} + Rc::new({ + let mut __result = Vec::new(); + for child in expr.children.clone().iter().cloned() { + __result.push(match (*child.expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { + let LiteralValue::LitStr { value: text, .. } = value.as_ref() else { + unreachable!() + }; + Rc::new(StringPart::Text { + value: text.clone(), + }) + } + _ => Rc::new(StringPart::Interpolation { + expr: arg_value(&child), + }), + }); + } + __result + }) +} -pub fn emit_typed_cast_shared(expr: &Rc, cast_target_node: Rc, target: &RenderTarget, recurse: impl Fn(Rc) -> String + Clone, source_indices: &Rc>>) -> String { +pub fn emit_typed_cast_shared( + expr: &Rc, + cast_target_node: Rc, + target: &RenderTarget, + recurse: impl Fn(Rc) -> String + Clone, + source_indices: &Rc>>, +) -> String { { let expr_str = recurse(expr.clone()); -let ty_str = emit_node_type(cast_target_node, target.clone(), source_indices.clone()); -let src_ty = match expr.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: n, .. }) => emit_node_type(n.clone(), target.clone(), source_indices.clone()), - _ => "".to_string(), -}; -if ((src_ty.clone().as_str() != "".to_string().as_str()) && (src_ty.clone().as_str() == ty_str.clone().as_str())) { + let ty_str = emit_node_type(cast_target_node, target.clone(), source_indices.clone()); + let src_ty = match expr.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: n, .. }) => { + emit_node_type(n.clone(), target.clone(), source_indices.clone()) + } + _ => "".to_string(), + }; + if ((src_ty.clone().as_str() != "".to_string().as_str()) + && (src_ty.clone().as_str() == ty_str.clone().as_str())) + { expr_str } else { if can_cast(target.clone(), src_ty.clone(), ty_str.clone()) { render_cast(expr_str, ty_str.clone(), target.clone()) } else { - emit_error_expr(v2_rt::concat(v2_rt::concat(v2_rt::concat("unsupported cast from ".to_string(), src_ty.clone()), " to ".to_string()), ty_str.clone()), target.clone()) + emit_error_expr( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("unsupported cast from ".to_string(), src_ty.clone()), + " to ".to_string(), + ), + ty_str.clone(), + ), + target.clone(), + ) } } -} + } } -pub fn emit_typed_for_each_shared(variable: &String, collection: &Rc, body: Rc, target: &RenderTarget, depth: i64, source_indices: Rc>>, recurse: impl Fn(Rc, Rc, i64) -> String + Clone, scope: &Rc) -> String { +pub fn emit_typed_for_each_shared( + variable: &String, + collection: &Rc, + body: Rc, + target: &RenderTarget, + depth: i64, + source_indices: Rc>>, + recurse: impl Fn(Rc, Rc, i64) -> String + Clone, + scope: &Rc, +) -> String { { let coll_str = recurse(collection.clone(), scope.clone(), depth.clone()); -let elem_type = for_each_element_type_node(resolved_type(collection.clone()), source_indices); -let body_scope = extend_scope(&scope, &variable, elem_type, Rc::new(SubValueRelation::SubValueUnknown)); -let body_str = recurse(body, body_scope, (depth.clone() + 1)); -let var_str = emit_ident(variable.clone(), target.clone()); -let spec = language_spec(target.clone()); -let fes = spec.for_each_syntax.clone(); -let bs = spec.block_syntax.clone(); -let body_indent = make_indent((depth.clone() + 1)); -if bs.significant_whitespace.clone() { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(fes.prefix.clone(), var_str), fes.separator.clone()), coll_str), bs.block_open.clone()), body_indent), body_str) + let elem_type = + for_each_element_type_node(resolved_type(collection.clone()), source_indices); + let body_scope = extend_scope( + &scope, + &variable, + elem_type, + Rc::new(SubValueRelation::SubValueUnknown), + ); + let body_str = recurse(body, body_scope, (depth.clone() + 1)); + let var_str = emit_ident(variable.clone(), target.clone()); + let spec = language_spec(target.clone()); + let fes = spec.for_each_syntax.clone(); + let bs = spec.block_syntax.clone(); + let body_indent = make_indent((depth.clone() + 1)); + if bs.significant_whitespace.clone() { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(fes.prefix.clone(), var_str), + fes.separator.clone(), + ), + coll_str, + ), + bs.block_open.clone(), + ), + body_indent, + ), + body_str, + ) } else { { let close_indent = make_indent(depth.clone()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(fes.prefix.clone(), var_str), fes.separator.clone()), coll_str), bs.block_open.clone()), body_indent), body_str), "\n".to_string()), close_indent), bs.block_close.clone()) -} + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(fes.prefix.clone(), var_str), + fes.separator.clone(), + ), + coll_str, + ), + bs.block_open.clone(), + ), + body_indent, + ), + body_str, + ), + "\n".to_string(), + ), + close_indent, + ), + bs.block_close.clone(), + ) + } } -} + } } -pub fn emit_typed_index_shared(base: &Rc, index: Rc, target: &RenderTarget, recurse: impl Fn(Rc) -> String + Clone, source_indices: &Rc>>) -> String { +pub fn emit_typed_index_shared( + base: &Rc, + index: Rc, + target: &RenderTarget, + recurse: impl Fn(Rc) -> String + Clone, + source_indices: &Rc>>, +) -> String { { let spec = language_spec(target.clone()); -let base_str = recurse(base.clone()); -let index_str = recurse(index); -let base_node = normalize_access_type_node(resolved_type(base.clone())); -let is_map = node_is_keyed_collection(&base_node, source_indices.clone()); -if is_string_like(target.clone(), authored_name_at(source_indices.clone(), &base_node)) { - apply_type_template2(spec.indexing.clone().string_index.clone(), base_str, index_str) + let base_str = recurse(base.clone()); + let index_str = recurse(index); + let base_node = normalize_access_type_node(resolved_type(base.clone())); + let is_map = node_is_keyed_collection(&base_node, source_indices.clone()); + if is_string_like( + target.clone(), + authored_name_at(source_indices.clone(), &base_node), + ) { + apply_type_template2( + spec.indexing.clone().string_index.clone(), + base_str, + index_str, + ) } else { if is_map { apply_type_template2(spec.indexing.clone().map_index.clone(), base_str, index_str) } else { - apply_type_template2(spec.indexing.clone().list_index.clone(), base_str, index_str) + apply_type_template2( + spec.indexing.clone().list_index.clone(), + base_str, + index_str, + ) } } -} + } } -pub fn emit_typed_slice_shared(base: &Rc, start: Rc, end: Rc, target: &RenderTarget, recurse: impl Fn(Rc) -> String + Clone, source_indices: Rc>>) -> String { +pub fn emit_typed_slice_shared( + base: &Rc, + start: Rc, + end: Rc, + target: &RenderTarget, + recurse: impl Fn(Rc) -> String + Clone, + source_indices: Rc>>, +) -> String { { let spec = language_spec(target.clone()); -let base_str = recurse(base.clone()); -let start_str = recurse(start); -let end_str = recurse(end); -let base_node = normalize_access_type_node(resolved_type(base.clone())); -if is_string_like(target.clone(), authored_name_at(source_indices, &base_node)) { + let base_str = recurse(base.clone()); + let start_str = recurse(start); + let end_str = recurse(end); + let base_node = normalize_access_type_node(resolved_type(base.clone())); + if is_string_like(target.clone(), authored_name_at(source_indices, &base_node)) { match spec.indexing.clone().string_slice.clone() { - Some(tmpl) => apply_type_template3(tmpl.clone(), base_str, start_str, end_str), - None => emit_error_expr("unsupported string slice for target".to_string(), target.clone()), -} + Some(tmpl) => apply_type_template3(tmpl.clone(), base_str, start_str, end_str), + None => emit_error_expr( + "unsupported string slice for target".to_string(), + target.clone(), + ), + } } else { match spec.indexing.clone().list_slice.clone() { - Some(tmpl) => apply_type_template3(tmpl.clone(), base_str, start_str, end_str), - None => emit_error_expr("unsupported slice for target".to_string(), target.clone()), -} + Some(tmpl) => apply_type_template3(tmpl.clone(), base_str, start_str, end_str), + None => emit_error_expr("unsupported slice for target".to_string(), target.clone()), + } } -} + } } -pub fn emit_shared_expr(texpr: &Rc, target: &RenderTarget, source_indices: Rc>>, wrap_result: impl Fn(String) -> String + Clone, recurse: impl Fn(Rc) -> String + Clone, emit_var: impl Fn(Rc) -> String + Clone, emit_field_access: impl Fn(Rc) -> String + Clone, emit_call: impl Fn(Rc) -> String + Clone, emit_method_call: impl Fn(Rc) -> String + Clone, emit_match: impl Fn(Rc) -> String + Clone, emit_if: impl Fn(Rc) -> String + Clone, emit_let: impl Fn(Rc) -> String + Clone, emit_record_lit: impl Fn(Rc) -> String + Clone, emit_string_interp: impl Fn(Rc) -> String + Clone, emit_block: impl Fn(Rc) -> String + Clone, emit_cast: impl Fn(Rc) -> String + Clone, emit_for_each: impl Fn(Rc) -> String + Clone, emit_index: impl Fn(Rc) -> String + Clone, emit_slice: impl Fn(Rc) -> String + Clone, emit_bin_op: impl Fn(Rc) -> String + Clone) -> String { - match (*texpr.expr_data.clone()).clone() { - ExprData::ExprLiteral { value: v, .. } => wrap_result(emit_literal(v.clone(), &target)), - ExprData::ExprError { message, .. } => wrap_result(emit_error_expr(message.clone(), target.clone())), - ExprData::ExprVar { .. } => emit_var(texpr.clone()), - ExprData::ExprFieldAccess { .. } => emit_field_access(texpr.clone()), - ExprData::ExprCall { .. } => emit_call(texpr.clone()), - ExprData::ExprMethodCall { .. } => emit_method_call(texpr.clone()), - ExprData::ExprMatch => emit_match(texpr.clone()), - ExprData::ExprIf => emit_if(texpr.clone()), - ExprData::ExprLet => emit_let(texpr.clone()), - ExprData::ExprRecordLit { .. } => emit_record_lit(texpr.clone()), - ExprData::ExprBinOp { .. } => emit_bin_op(texpr.clone()), - ExprData::ExprUnaryOp { op, .. } => { - let operand = unaryop_operand(texpr.clone()); -wrap_result(emit_unary_op(op.clone(), recurse(operand), target.clone())) -}, - ExprData::ExprLambda => { - let body = lambda_body(texpr.clone()); -wrap_result(emit_lambda(emit_lambda_params(lambda_param_names_at(texpr.clone(), source_indices), &target), recurse(body), target.clone())) -}, - ExprData::ExprStringInterp => emit_string_interp(texpr.clone()), - ExprData::ExprBlock => emit_block(texpr.clone()), - ExprData::ExprCast => emit_cast(texpr.clone()), - ExprData::ExprForEach => emit_for_each(texpr.clone()), - ExprData::ExprIndex => emit_index(texpr.clone()), - ExprData::ExprSlice => emit_slice(texpr.clone()), - ExprData::ExprListLit => wrap_result(emit_list_lit_expr(&Rc::new({ let mut __result = Vec::new(); for el in texpr.children.clone().iter().cloned() { __result.push(recurse(el.clone())); } __result }), target.clone())), - ExprData::ExprReturn => { - let ret_val = return_value(texpr.clone()); -wrap_result(emit_return(recurse(ret_val), target.clone())) -}, - ExprData::NoExprData => wrap_result("".to_string()), -} -} - -pub fn emit_default_bin_op(texpr: &Rc, target: RenderTarget, source_indices: Rc>>, recurse: impl Fn(Rc) -> String + Clone, wrap_result: impl Fn(String) -> String + Clone) -> String { +pub fn emit_shared_expr( + texpr: &Rc, + target: &RenderTarget, + source_indices: Rc>>, + wrap_result: impl Fn(String) -> String + Clone, + recurse: impl Fn(Rc) -> String + Clone, + emit_var: impl Fn(Rc) -> String + Clone, + emit_field_access: impl Fn(Rc) -> String + Clone, + emit_call: impl Fn(Rc) -> String + Clone, + emit_method_call: impl Fn(Rc) -> String + Clone, + emit_match: impl Fn(Rc) -> String + Clone, + emit_if: impl Fn(Rc) -> String + Clone, + emit_let: impl Fn(Rc) -> String + Clone, + emit_record_lit: impl Fn(Rc) -> String + Clone, + emit_string_interp: impl Fn(Rc) -> String + Clone, + emit_block: impl Fn(Rc) -> String + Clone, + emit_cast: impl Fn(Rc) -> String + Clone, + emit_for_each: impl Fn(Rc) -> String + Clone, + emit_index: impl Fn(Rc) -> String + Clone, + emit_slice: impl Fn(Rc) -> String + Clone, + emit_bin_op: impl Fn(Rc) -> String + Clone, +) -> String { match (*texpr.expr_data.clone()).clone() { - ExprData::ExprBinOp { op, algebra_field: algebra, .. } => { - let left = binop_left(texpr.clone()); -let right = binop_right(texpr.clone()); -let left_str = recurse(left); -let right_str = recurse(right); -if is_null_coalesce(op.clone()) { - wrap_result(emit_null_coalesce(left_str, right_str, target)) - } else { - { - let op_str = emit_bin_op_symbol(op.clone(), &target, algebra.clone()); -wrap_result(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("(".to_string(), left_str), " ".to_string()), op_str), " ".to_string()), right_str), ")".to_string())) -} + ExprData::ExprLiteral { value: v, .. } => wrap_result(emit_literal(v.clone(), &target)), + ExprData::ExprError { message, .. } => { + wrap_result(emit_error_expr(message.clone(), target.clone())) + } + ExprData::ExprVar { .. } => emit_var(texpr.clone()), + ExprData::ExprFieldAccess { .. } => emit_field_access(texpr.clone()), + ExprData::ExprCall { .. } => emit_call(texpr.clone()), + ExprData::ExprMethodCall { .. } => emit_method_call(texpr.clone()), + ExprData::ExprMatch => emit_match(texpr.clone()), + ExprData::ExprIf => emit_if(texpr.clone()), + ExprData::ExprLet => emit_let(texpr.clone()), + ExprData::ExprRecordLit { .. } => emit_record_lit(texpr.clone()), + ExprData::ExprBinOp { .. } => emit_bin_op(texpr.clone()), + ExprData::ExprUnaryOp { op, .. } => { + let operand = unaryop_operand(texpr.clone()); + wrap_result(emit_unary_op(op.clone(), recurse(operand), target.clone())) + } + ExprData::ExprLambda => { + let body = lambda_body(texpr.clone()); + wrap_result(emit_lambda( + emit_lambda_params( + lambda_param_names_at(texpr.clone(), source_indices), + &target, + ), + recurse(body), + target.clone(), + )) } -}, - _ => wrap_result(emit_error_expr("emit_default_bin_op expected ExprBinOp".to_string(), target)), + ExprData::ExprStringInterp => emit_string_interp(texpr.clone()), + ExprData::ExprBlock => emit_block(texpr.clone()), + ExprData::ExprCast => emit_cast(texpr.clone()), + ExprData::ExprForEach => emit_for_each(texpr.clone()), + ExprData::ExprIndex => emit_index(texpr.clone()), + ExprData::ExprSlice => emit_slice(texpr.clone()), + ExprData::ExprListLit => wrap_result(emit_list_lit_expr( + &Rc::new({ + let mut __result = Vec::new(); + for el in texpr.children.clone().iter().cloned() { + __result.push(recurse(el.clone())); + } + __result + }), + target.clone(), + )), + ExprData::ExprReturn => { + let ret_val = return_value(texpr.clone()); + wrap_result(emit_return(recurse(ret_val), target.clone())) + } + ExprData::NoExprData => wrap_result("".to_string()), + } } + +pub fn emit_default_bin_op( + texpr: &Rc, + target: RenderTarget, + source_indices: Rc>>, + recurse: impl Fn(Rc) -> String + Clone, + wrap_result: impl Fn(String) -> String + Clone, +) -> String { + match (*texpr.expr_data.clone()).clone() { + ExprData::ExprBinOp { + op, + algebra_field: algebra, + .. + } => { + let left = binop_left(texpr.clone()); + let right = binop_right(texpr.clone()); + let left_str = recurse(left); + let right_str = recurse(right); + if is_null_coalesce(op.clone()) { + wrap_result(emit_null_coalesce(left_str, right_str, target)) + } else { + { + let op_str = emit_bin_op_symbol(op.clone(), &target, algebra.clone()); + wrap_result(v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("(".to_string(), left_str), + " ".to_string(), + ), + op_str, + ), + " ".to_string(), + ), + right_str, + ), + ")".to_string(), + )) + } + } + } + _ => wrap_result(emit_error_expr( + "emit_default_bin_op expected ExprBinOp".to_string(), + target, + )), + } } -pub fn emit_block_stmts_shared(mut remaining: Rc>>, mut text: Rc>, mut scope: Rc, mut depth: i64, mut prepend_indent: bool, mut emit_expr: impl Fn(Rc, Rc, i64) -> String + Clone) -> Rc { +pub fn emit_block_stmts_shared( + mut remaining: Rc>>, + mut text: Rc>, + mut scope: Rc, + mut depth: i64, + mut prepend_indent: bool, + mut emit_expr: impl Fn(Rc, Rc, i64) -> String + Clone, +) -> Rc { loop { match remaining.clone().first().cloned() { - None => { break Rc::new(BlockEmitState { - text: text, - scope: scope.clone(), -}); }, - Some(stmt) => { let raw = emit_expr(stmt.clone(), scope.clone(), depth.clone()); -let line = if prepend_indent.clone() { - v2_rt::concat(make_indent(depth.clone()), raw) - } else { - raw - }; -let next_scope = scope_after_expr(&stmt, &scope); -{ - let __tco_0 = Rc::new(remaining.iter().cloned().skip(1 as usize).collect::>()); -let __tco_1 = v2_rt::rc_list_push(text, line); -let __tco_2 = next_scope; -remaining = __tco_0; -text = __tco_1; -scope = __tco_2; -continue; -} }, -} -} + None => { + break Rc::new(BlockEmitState { + text: text, + scope: scope.clone(), + }); + } + Some(stmt) => { + let raw = emit_expr(stmt.clone(), scope.clone(), depth.clone()); + let line = if prepend_indent.clone() { + v2_rt::concat(make_indent(depth.clone()), raw) + } else { + raw + }; + let next_scope = scope_after_expr(&stmt, &scope); + { + let __tco_0 = Rc::new( + remaining + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ); + let __tco_1 = v2_rt::rc_list_push(text, line); + let __tco_2 = next_scope; + remaining = __tco_0; + text = __tco_1; + scope = __tco_2; + continue; + } + } + } + } } -pub fn emit_init_block_stmts_shared(mut remaining: Rc>>, mut text: Rc>, mut scope: Rc, mut depth: i64, mut prepend_indent: bool, mut emit_expr: impl Fn(Rc, Rc, i64) -> String + Clone) -> Rc { +pub fn emit_init_block_stmts_shared( + mut remaining: Rc>>, + mut text: Rc>, + mut scope: Rc, + mut depth: i64, + mut prepend_indent: bool, + mut emit_expr: impl Fn(Rc, Rc, i64) -> String + Clone, +) -> Rc { loop { match remaining.clone().first().cloned() { - None => { break Rc::new(BlockEmitState { - text: text, - scope: scope.clone(), -}); }, - Some(stmt) => { let rest = Rc::new(remaining.clone().iter().cloned().skip(1 as usize).collect::>()); -match rest.clone().first().cloned() { - None => { break Rc::new(BlockEmitState { - text: text, - scope: scope.clone(), -}); }, - Some(_) => { let raw = emit_expr(stmt.clone(), scope.clone(), depth.clone()); -let line = if prepend_indent.clone() { - v2_rt::concat(make_indent(depth.clone()), raw) - } else { - raw - }; -let next_scope = scope_after_expr(&stmt, &scope); -{ - let __tco_0 = rest.clone(); -let __tco_1 = v2_rt::rc_list_push(text, line); -let __tco_2 = next_scope; -remaining = __tco_0; -text = __tco_1; -scope = __tco_2; -continue; -} }, -} }, -} -} + None => { + break Rc::new(BlockEmitState { + text: text, + scope: scope.clone(), + }); + } + Some(stmt) => { + let rest = Rc::new( + remaining + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ); + match rest.clone().first().cloned() { + None => { + break Rc::new(BlockEmitState { + text: text, + scope: scope.clone(), + }); + } + Some(_) => { + let raw = emit_expr(stmt.clone(), scope.clone(), depth.clone()); + let line = if prepend_indent.clone() { + v2_rt::concat(make_indent(depth.clone()), raw) + } else { + raw + }; + let next_scope = scope_after_expr(&stmt, &scope); + { + let __tco_0 = rest.clone(); + let __tco_1 = v2_rt::rc_list_push(text, line); + let __tco_2 = next_scope; + remaining = __tco_0; + text = __tco_1; + scope = __tco_2; + continue; + } + } + } + } + } + } } -pub fn emit_typed_let_shared(name: &String, value_str: String, body: Option>, target: RenderTarget, recurse: impl Fn(Rc, Rc) -> String + Clone, scope: Rc, value_node: Rc) -> String { +pub fn emit_typed_let_shared( + name: &String, + value_str: String, + body: Option>, + target: RenderTarget, + recurse: impl Fn(Rc, Rc) -> String + Clone, + scope: Rc, + value_node: Rc, +) -> String { { let let_line = emit_let_binding(name.clone(), value_str, &target); -match body { - Some(bd) => { - let next_scope = extend_scope(&scope, &name, resolved_type(value_node), Rc::new(SubValueRelation::SubValueUnknown)); -v2_rt::concat(v2_rt::concat(let_line, "\n".to_string()), recurse(bd.clone(), next_scope)) -}, - None => let_line, -} -} + match body { + Some(bd) => { + let next_scope = extend_scope( + &scope, + &name, + resolved_type(value_node), + Rc::new(SubValueRelation::SubValueUnknown), + ); + v2_rt::concat( + v2_rt::concat(let_line, "\n".to_string()), + recurse(bd.clone(), next_scope), + ) + } + None => let_line, + } + } } -pub fn emit_typed_if_shared(cond_str: String, then_branch: &Rc, else_branch: Option>, if_result_type: Option>, depth: i64, target: &RenderTarget, source_indices: Rc>>, recurse: impl Fn(Rc, i64) -> String + Clone) -> String { +pub fn emit_typed_if_shared( + cond_str: String, + then_branch: &Rc, + else_branch: Option>, + if_result_type: Option>, + depth: i64, + target: &RenderTarget, + source_indices: Rc>>, + recurse: impl Fn(Rc, i64) -> String + Clone, +) -> String { { let spec = language_spec(target.clone()); -let es = spec.expression_semantics.clone(); -let bs = spec.block_syntax.clone(); -match else_branch { - Some(eb) => match es.if_value_form.clone() { - IfValueForm::IfExpression => { - let then_str = recurse(then_branch.clone(), (depth.clone() + 1)); -let else_str = recurse(eb.clone(), (depth.clone() + 1)); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("if ".to_string(), cond_str), bs.block_open.clone()), make_indent((depth.clone() + 1))), then_str), "\n".to_string()), make_indent(depth.clone())), bs.else_clause.clone()), make_indent((depth.clone() + 1))), else_str), "\n".to_string()), make_indent(depth.clone())), bs.block_close.clone()) -}, - IfValueForm::ConditionalTernary => { - let then_str = recurse(then_branch.clone(), depth.clone()); -let else_str = recurse(eb.clone(), depth.clone()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("(".to_string(), then_str), ") if (".to_string()), cond_str), ") else (".to_string()), else_str), ")".to_string()) -}, - IfValueForm::IfStatement => { - let result_type = match if_result_type { - Some(rt) => emit_node_type(rt.clone(), target.clone(), source_indices), - None => emit_node_type(resolved_type(then_branch.clone()), target.clone(), source_indices), -}; -let then_str = recurse(then_branch.clone(), depth.clone()); -let else_str = recurse(eb.clone(), depth.clone()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("func() ".to_string(), result_type), " { if ".to_string()), cond_str), bs.block_open.clone()), make_indent((depth.clone() + 1))), "return ".to_string()), then_str), "\n".to_string()), make_indent(depth.clone())), bs.else_clause.clone()), make_indent((depth.clone() + 1))), "return ".to_string()), else_str), "\n".to_string()), make_indent(depth.clone())), bs.block_close.clone()), " }()".to_string()) -}, -}, - None => if bs.significant_whitespace.clone() { - { - let then_str = recurse(then_branch.clone(), depth.clone()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("if ".to_string(), cond_str), bs.block_open.clone()), make_indent((depth.clone() + 1))), then_str) -} - } else { - { - let then_str = recurse(then_branch.clone(), (depth.clone() + 1)); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("if ".to_string(), cond_str), bs.block_open.clone()), make_indent((depth.clone() + 1))), then_str), "\n".to_string()), make_indent(depth.clone())), bs.block_close.clone()) -} - }, -} -} + let es = spec.expression_semantics.clone(); + let bs = spec.block_syntax.clone(); + match else_branch { + Some(eb) => match es.if_value_form.clone() { + IfValueForm::IfExpression => { + let then_str = recurse(then_branch.clone(), (depth.clone() + 1)); + let else_str = recurse(eb.clone(), (depth.clone() + 1)); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "if ".to_string(), + cond_str, + ), + bs.block_open.clone(), + ), + make_indent((depth.clone() + 1)), + ), + then_str, + ), + "\n".to_string(), + ), + make_indent(depth.clone()), + ), + bs.else_clause.clone(), + ), + make_indent((depth.clone() + 1)), + ), + else_str, + ), + "\n".to_string(), + ), + make_indent(depth.clone()), + ), + bs.block_close.clone(), + ) + } + IfValueForm::ConditionalTernary => { + let then_str = recurse(then_branch.clone(), depth.clone()); + let else_str = recurse(eb.clone(), depth.clone()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("(".to_string(), then_str), + ") if (".to_string(), + ), + cond_str, + ), + ") else (".to_string(), + ), + else_str, + ), + ")".to_string(), + ) + } + IfValueForm::IfStatement => { + let result_type = match if_result_type { + Some(rt) => emit_node_type(rt.clone(), target.clone(), source_indices), + None => emit_node_type( + resolved_type(then_branch.clone()), + target.clone(), + source_indices, + ), + }; + let then_str = recurse(then_branch.clone(), depth.clone()); + let else_str = recurse(eb.clone(), depth.clone()); + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("func() ".to_string(), result_type), " { if ".to_string()), cond_str), bs.block_open.clone()), make_indent((depth.clone() + 1))), "return ".to_string()), then_str), "\n".to_string()), make_indent(depth.clone())), bs.else_clause.clone()), make_indent((depth.clone() + 1))), "return ".to_string()), else_str), "\n".to_string()), make_indent(depth.clone())), bs.block_close.clone()), " }()".to_string()) + } + }, + None => { + if bs.significant_whitespace.clone() { + { + let then_str = recurse(then_branch.clone(), depth.clone()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("if ".to_string(), cond_str), + bs.block_open.clone(), + ), + make_indent((depth.clone() + 1)), + ), + then_str, + ) + } + } else { + { + let then_str = recurse(then_branch.clone(), (depth.clone() + 1)); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("if ".to_string(), cond_str), + bs.block_open.clone(), + ), + make_indent((depth.clone() + 1)), + ), + then_str, + ), + "\n".to_string(), + ), + make_indent(depth.clone()), + ), + bs.block_close.clone(), + ) + } + } + } + } + } } -pub fn emit_param_shared(param: &Rc, target: &RenderTarget, source_indices: &Rc>>) -> String { +pub fn emit_param_shared( + param: &Rc, + target: &RenderTarget, + source_indices: &Rc>>, +) -> String { { - let ty = emit_node_type(param_node_type_expr(¶m), target.clone(), source_indices.clone()); -v2_rt::concat(v2_rt::concat(emit_ident(param_node_name_at(param.clone(), source_indices.clone()), target.clone()), language_spec(target.clone()).items.clone().param_type_sep.clone()), ty) -} + let ty = emit_node_type( + param_node_type_expr(¶m), + target.clone(), + source_indices.clone(), + ); + v2_rt::concat( + v2_rt::concat( + emit_ident( + param_node_name_at(param.clone(), source_indices.clone()), + target.clone(), + ), + language_spec(target.clone()) + .items + .clone() + .param_type_sep + .clone(), + ), + ty, + ) + } } -pub fn emit_params_shared(params: Rc>>, target: &RenderTarget, source_indices: Rc>>) -> String { +pub fn emit_params_shared( + params: Rc>>, + target: &RenderTarget, + source_indices: Rc>>, +) -> String { { - let strs = Rc::new({ let mut __result = Vec::new(); for p in params.iter().cloned() { __result.push(emit_param_shared(&p, &target, &source_indices)); } __result }); -strs.join(&language_spec(target.clone()).items.clone().param_separator.clone()) -} + let strs = Rc::new({ + let mut __result = Vec::new(); + for p in params.iter().cloned() { + __result.push(emit_param_shared(&p, &target, &source_indices)); + } + __result + }); + strs.join( + &language_spec(target.clone()) + .items + .clone() + .param_separator + .clone(), + ) + } } -pub fn emit_inferred_shared(inferred: &Rc, target: &RenderTarget, source_indices: Rc>>) -> String { - if language_spec(target.clone()).expression_semantics.clone().suppress_unit_return.clone() { +pub fn emit_inferred_shared( + inferred: &Rc, + target: &RenderTarget, + source_indices: Rc>>, +) -> String { + if language_spec(target.clone()) + .expression_semantics + .clone() + .suppress_unit_return + .clone() + { if is_unit_like(&inferred) { "".to_string() } else { - v2_rt::concat(language_spec(target.clone()).items.clone().return_arrow.clone(), emit_node_type(inferred.clone(), target.clone(), source_indices)) + v2_rt::concat( + language_spec(target.clone()) + .items + .clone() + .return_arrow + .clone(), + emit_node_type(inferred.clone(), target.clone(), source_indices), + ) } } else { - v2_rt::concat(language_spec(target.clone()).items.clone().return_arrow.clone(), emit_node_type(inferred.clone(), target.clone(), source_indices)) + v2_rt::concat( + language_spec(target.clone()) + .items + .clone() + .return_arrow + .clone(), + emit_node_type(inferred.clone(), target.clone(), source_indices), + ) } } -pub fn emit_typed_block_join(stmts: Rc>>, scope: Rc, depth: i64, emit_block_stmts: impl Fn(Rc>>, Rc, i64) -> Rc + Clone) -> String { +pub fn emit_typed_block_join( + stmts: Rc>>, + scope: Rc, + depth: i64, + emit_block_stmts: impl Fn(Rc>>, Rc, i64) -> Rc + Clone, +) -> String { { let state = emit_block_stmts(stmts, scope, depth); -state.text.clone().join(&"\n".to_string()) -} + state.text.clone().join(&"\n".to_string()) + } } -pub fn emit_algebra_method_template(method_name: String, recv_str: String, first_arg_str: String, target: RenderTarget) -> Option { +pub fn emit_algebra_method_template( + method_name: String, + recv_str: String, + first_arg_str: String, + target: RenderTarget, +) -> Option { { let spec = language_spec(target); -match spec.method_templates.clone() { - Some(templates) => match v2_rt::map_get(&templates, method_name) { - Some(tmpl) => { - let bindings = v2_rt::rc_map_insert(seed_bindings("recv".to_string(), recv_str), "arg".to_string(), first_arg_str); -Some(apply_named_template(tmpl.clone(), &bindings)) -}, - None => None, -}, - None => None, -} -} + match spec.method_templates.clone() { + Some(templates) => match v2_rt::map_get(&templates, method_name) { + Some(tmpl) => { + let bindings = v2_rt::rc_map_insert( + seed_bindings("recv".to_string(), recv_str), + "arg".to_string(), + first_arg_str, + ); + Some(apply_named_template(tmpl.clone(), &bindings)) + } + None => None, + }, + None => None, + } + } } -pub fn emit_typed_first_arg_shared(args: Rc>>, target: RenderTarget, recurse: impl Fn(Rc) -> String + Clone) -> String { +pub fn emit_typed_first_arg_shared( + args: Rc>>, + target: RenderTarget, + recurse: impl Fn(Rc) -> String + Clone, +) -> String { match args.first().cloned() { - Some(a) => recurse(arg_value(&a)), - None => emit_error_expr("missing method argument".to_string(), target), -} + Some(a) => recurse(arg_value(&a)), + None => emit_error_expr("missing method argument".to_string(), target), + } } -pub fn emit_typed_string_interp_unified(parts: &Rc>>, target: RenderTarget, recurse: impl Fn(Rc) -> String + Clone) -> String { +pub fn emit_typed_string_interp_unified( + parts: &Rc>>, + target: RenderTarget, + recurse: impl Fn(Rc) -> String + Clone, +) -> String { { let spec = language_spec(target); -let interp = spec.string_interp.clone(); -let has_interpolations = { let mut __found = false; for p in parts.clone().iter().cloned() { if match (*p.clone()).clone() { - StringPart::Interpolation { .. } => true, - _ => false, -} { __found = true; break; } } __found }; -match (*interp.style.clone()).clone() { - InterpStyle::FormatArgs { placeholder: ph, .. } => { - let fmt_parts = Rc::new({ let mut __result = Vec::new(); for p in parts.clone().iter().cloned() { __result.push(match (*p.clone()).clone() { - StringPart::Text { value: v, .. } => { - let base = escape_string_literal_body(v.clone()); -let escaped = if has_interpolations.clone() { - apply_escape_pairs(base.clone(), interp.escape_pairs.clone()) - } else { - base.clone() - }; -Rc::new(InterpPart { - format_segment: escaped.clone(), - arg_expr: "".to_string(), -}) -}, - StringPart::Interpolation { expr: e, .. } => Rc::new(InterpPart { - format_segment: ph.clone(), - arg_expr: recurse(e.clone()), -}), -}); } __result }); -let fmt_str = Rc::new({ let mut __result = Vec::new(); for p in fmt_parts.clone().iter().cloned() { __result.push(p.format_segment.clone()); } __result }).join(&"".to_string()); -let args = Rc::new({ let mut __result = Vec::new(); for a in Rc::new({ let mut __result = Vec::new(); for p in fmt_parts.clone().iter().cloned() { __result.push(p.arg_expr.clone()); } __result }).iter().cloned() { if (a.clone().as_str() != "".to_string().as_str()) { __result.push(a); } } __result }); -if ((args.clone().len() as i64) == 0) { - apply_type_template1(interp.plain_template.clone(), fmt_str) - } else { - { - let args_str = args.clone().join(&", ".to_string()); -apply_type_template2(interp.format_template.clone(), fmt_str, args_str) -} + let interp = spec.string_interp.clone(); + let has_interpolations = { + let mut __found = false; + for p in parts.clone().iter().cloned() { + if match (*p.clone()).clone() { + StringPart::Interpolation { .. } => true, + _ => false, + } { + __found = true; + break; + } } -}, - InterpStyle::InlineExpr => { - let segments = Rc::new({ let mut __result = Vec::new(); for p in parts.clone().iter().cloned() { __result.push(match (*p.clone()).clone() { - StringPart::Text { value: v, .. } => { - let base = escape_string_literal_body(v.clone()); -if has_interpolations.clone() { - apply_escape_pairs(base.clone(), interp.escape_pairs.clone()) + __found + }; + match (*interp.style.clone()).clone() { + InterpStyle::FormatArgs { + placeholder: ph, .. + } => { + let fmt_parts = Rc::new({ + let mut __result = Vec::new(); + for p in parts.clone().iter().cloned() { + __result.push(match (*p.clone()).clone() { + StringPart::Text { value: v, .. } => { + let base = escape_string_literal_body(v.clone()); + let escaped = if has_interpolations.clone() { + apply_escape_pairs(base.clone(), interp.escape_pairs.clone()) + } else { + base.clone() + }; + Rc::new(InterpPart { + format_segment: escaped.clone(), + arg_expr: "".to_string(), + }) + } + StringPart::Interpolation { expr: e, .. } => Rc::new(InterpPart { + format_segment: ph.clone(), + arg_expr: recurse(e.clone()), + }), + }); + } + __result + }); + let fmt_str = Rc::new({ + let mut __result = Vec::new(); + for p in fmt_parts.clone().iter().cloned() { + __result.push(p.format_segment.clone()); + } + __result + }) + .join(&"".to_string()); + let args = Rc::new({ + let mut __result = Vec::new(); + for a in Rc::new({ + let mut __result = Vec::new(); + for p in fmt_parts.clone().iter().cloned() { + __result.push(p.arg_expr.clone()); + } + __result + }) + .iter() + .cloned() + { + if (a.clone().as_str() != "".to_string().as_str()) { + __result.push(a); + } + } + __result + }); + if ((args.clone().len() as i64) == 0) { + apply_type_template1(interp.plain_template.clone(), fmt_str) } else { - base.clone() + { + let args_str = args.clone().join(&", ".to_string()); + apply_type_template2(interp.format_template.clone(), fmt_str, args_str) + } } -}, - StringPart::Interpolation { expr: e, .. } => v2_rt::concat(v2_rt::concat("{".to_string(), recurse(e.clone())), "}".to_string()), -}); } __result }); -apply_type_template1(interp.format_template.clone(), segments.join(&"".to_string())) -}, -} -} + } + InterpStyle::InlineExpr => { + let segments = Rc::new({ + let mut __result = Vec::new(); + for p in parts.clone().iter().cloned() { + __result.push(match (*p.clone()).clone() { + StringPart::Text { value: v, .. } => { + let base = escape_string_literal_body(v.clone()); + if has_interpolations.clone() { + apply_escape_pairs(base.clone(), interp.escape_pairs.clone()) + } else { + base.clone() + } + } + StringPart::Interpolation { expr: e, .. } => v2_rt::concat( + v2_rt::concat("{".to_string(), recurse(e.clone())), + "}".to_string(), + ), + }); + } + __result + }); + apply_type_template1( + interp.format_template.clone(), + segments.join(&"".to_string()), + ) + } + } + } } -pub fn emit_typed_record_lit_unified(type_name: Option, fields: &Rc>>, target: &RenderTarget, source_indices: Rc>>, recurse: impl Fn(Rc) -> String + Clone) -> String { +pub fn emit_typed_record_lit_unified( + type_name: Option, + fields: &Rc>>, + target: &RenderTarget, + source_indices: Rc>>, + recurse: impl Fn(Rc) -> String + Clone, +) -> String { { let rls = language_spec(target.clone()).record_lit.clone(); -match type_name { - None => if ((fields.clone().len() as i64) == 0) { - rls.anon_empty.clone() - } else { - { - let field_strs = Rc::new({ let mut __result = Vec::new(); for f in fields.clone().iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(rls.anon_field_indent.clone(), "\"".to_string()), field_init_node_name_at(f.clone(), source_indices.clone())), "\": ".to_string()), recurse(field_init_node_value(&f))), ",".to_string())); } __result }); -let fields_str = field_strs.join(&"\n".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(rls.anon_prefix.clone(), fields_str), "\n".to_string()), rls.anon_suffix.clone()) -} - }, - Some(tn) => if ((fields.clone().len() as i64) == 0) { - v2_rt::concat(tn.clone(), rls.named_empty.clone()) - } else { - { - let field_strs = Rc::new({ let mut __result = Vec::new(); for f in fields.clone().iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(emit_export_ident(field_init_node_name_at(f.clone(), source_indices.clone()), &target), rls.named_field_sep.clone()), recurse(field_init_node_value(&f)))); } __result }); -let fields_str = field_strs.join(&rls.named_field_join.clone()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(tn.clone(), rls.named_open.clone()), fields_str), rls.named_close.clone()) -} - }, -} -} + match type_name { + None => { + if ((fields.clone().len() as i64) == 0) { + rls.anon_empty.clone() + } else { + { + let field_strs = Rc::new({ + let mut __result = Vec::new(); + for f in fields.clone().iter().cloned() { + __result.push(v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + rls.anon_field_indent.clone(), + "\"".to_string(), + ), + field_init_node_name_at( + f.clone(), + source_indices.clone(), + ), + ), + "\": ".to_string(), + ), + recurse(field_init_node_value(&f)), + ), + ",".to_string(), + )); + } + __result + }); + let fields_str = field_strs.join(&"\n".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(rls.anon_prefix.clone(), fields_str), + "\n".to_string(), + ), + rls.anon_suffix.clone(), + ) + } + } + } + Some(tn) => { + if ((fields.clone().len() as i64) == 0) { + v2_rt::concat(tn.clone(), rls.named_empty.clone()) + } else { + { + let field_strs = Rc::new({ + let mut __result = Vec::new(); + for f in fields.clone().iter().cloned() { + __result.push(v2_rt::concat( + v2_rt::concat( + emit_export_ident( + field_init_node_name_at( + f.clone(), + source_indices.clone(), + ), + &target, + ), + rls.named_field_sep.clone(), + ), + recurse(field_init_node_value(&f)), + )); + } + __result + }); + let fields_str = field_strs.join(&rls.named_field_join.clone()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(tn.clone(), rls.named_open.clone()), + fields_str, + ), + rls.named_close.clone(), + ) + } + } + } + } + } } -pub fn emit_typed_call_unified(func: &String, args: Rc>>, target: &RenderTarget, registry: Rc>>, scope: Rc, recurse: impl Fn(Rc) -> String + Clone) -> String { +pub fn emit_typed_call_unified( + func: &String, + args: Rc>>, + target: &RenderTarget, + registry: Rc>>, + scope: Rc, + recurse: impl Fn(Rc) -> String + Clone, +) -> String { { let spec = language_spec(target.clone()); -let ordered_args = order_typed_call_args(&args, func.clone(), &scope); -let arg_strs = Rc::new({ let mut __result = Vec::new(); for a in ordered_args.iter().cloned() { __result.push(recurse(arg_value(&a))); } __result }); -let callee = lookup_item(registry, func.clone()); -let extra_args = match callee.clone() { - Some(info) => { - let has_effects = (((info.service_names.clone().len() as i64) > 0) || ((info.resource_names.clone().len() as i64) > 0)); -if has_effects.clone() { - { - let resource_args = Rc::new({ let mut __result = Vec::new(); for rn in info.resource_names.clone().iter().cloned() { __result.push(emit_ident(rn.clone(), target.clone())); } __result }); -let service_args = Rc::new({ let mut __result = Vec::new(); for sn in info.service_names.clone().iter().cloned() { __result.push(service_var_name(sn.clone())); } __result }); -v2_rt::concat(resource_args, service_args) -} - } else { - Rc::new(vec![]) + let ordered_args = order_typed_call_args(&args, func.clone(), &scope); + let arg_strs = Rc::new({ + let mut __result = Vec::new(); + for a in ordered_args.iter().cloned() { + __result.push(recurse(arg_value(&a))); } -}, - None => Rc::new(vec![]), -}; -let all_args = v2_rt::concat(arg_strs, extra_args); -let args_str = all_args.join(&", ".to_string()); -let call_str = v2_rt::concat(v2_rt::concat(v2_rt::concat(emit_export_ident(func.clone(), &target), "(".to_string()), args_str), ")".to_string()); -match callee.clone() { - Some(info) => { - let has_effects = (((info.service_names.clone().len() as i64) > 0) || ((info.resource_names.clone().len() as i64) > 0)); -if has_effects.clone() { - v2_rt::concat(spec.async_call_prefix.clone(), call_str) - } else { - call_str + __result + }); + let callee = lookup_item(registry, func.clone()); + let extra_args = match callee.clone() { + Some(info) => { + let has_effects = (((info.service_names.clone().len() as i64) > 0) + || ((info.resource_names.clone().len() as i64) > 0)); + if has_effects.clone() { + { + let resource_args = Rc::new({ + let mut __result = Vec::new(); + for rn in info.resource_names.clone().iter().cloned() { + __result.push(emit_ident(rn.clone(), target.clone())); + } + __result + }); + let service_args = Rc::new({ + let mut __result = Vec::new(); + for sn in info.service_names.clone().iter().cloned() { + __result.push(service_var_name(sn.clone())); + } + __result + }); + v2_rt::concat(resource_args, service_args) + } + } else { + Rc::new(vec![]) + } } -}, - None => call_str, -} -} + None => Rc::new(vec![]), + }; + let all_args = v2_rt::concat(arg_strs, extra_args); + let args_str = all_args.join(&", ".to_string()); + let call_str = v2_rt::concat( + v2_rt::concat( + v2_rt::concat(emit_export_ident(func.clone(), &target), "(".to_string()), + args_str, + ), + ")".to_string(), + ); + match callee.clone() { + Some(info) => { + let has_effects = (((info.service_names.clone().len() as i64) > 0) + || ((info.resource_names.clone().len() as i64) > 0)); + if has_effects.clone() { + v2_rt::concat(spec.async_call_prefix.clone(), call_str) + } else { + call_str + } + } + None => call_str, + } + } } pub fn bridge_method_name_unified(method_name: String, target: RenderTarget) -> String { { let spec = language_spec(target); -let overridden = apply_bridge_method_overrides(method_name, spec.bridge_method_overrides.clone()); -apply_naming_case(overridden, spec.bridge_method_case.clone()) -} + let overridden = + apply_bridge_method_overrides(method_name, spec.bridge_method_overrides.clone()); + apply_naming_case(overridden, spec.bridge_method_case.clone()) + } } -pub fn emit_algebra_method_call_unified(method_name: &String, receiver: Rc, args: Rc>>, target: &RenderTarget, first_arg_str: String, recurse: impl Fn(Rc) -> String + Clone) -> String { +pub fn emit_algebra_method_call_unified( + method_name: &String, + receiver: Rc, + args: Rc>>, + target: &RenderTarget, + first_arg_str: String, + recurse: impl Fn(Rc) -> String + Clone, +) -> String { { let spec = language_spec(target.clone()); -let recv_str = recurse(receiver); -match emit_algebra_method_template(method_name.clone(), recv_str.clone(), first_arg_str, target.clone()) { - Some(result) => result.clone(), - None => { - let function_name = bridge_method_name_unified(method_name.clone(), target.clone()); -let arg_strs = Rc::new({ let mut __result = Vec::new(); for a in args.iter().cloned() { __result.push(recurse(arg_value(&a))); } __result }); -let all_args = v2_rt::concat(Rc::new(vec![recv_str.clone()]), arg_strs); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(spec.bridge_method_prefix.clone(), emit_export_ident(function_name, &target)), "(".to_string()), all_args.join(&", ".to_string())), ")".to_string()) -}, -} -} + let recv_str = recurse(receiver); + match emit_algebra_method_template( + method_name.clone(), + recv_str.clone(), + first_arg_str, + target.clone(), + ) { + Some(result) => result.clone(), + None => { + let function_name = bridge_method_name_unified(method_name.clone(), target.clone()); + let arg_strs = Rc::new({ + let mut __result = Vec::new(); + for a in args.iter().cloned() { + __result.push(recurse(arg_value(&a))); + } + __result + }); + let all_args = v2_rt::concat(Rc::new(vec![recv_str.clone()]), arg_strs); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + spec.bridge_method_prefix.clone(), + emit_export_ident(function_name, &target), + ), + "(".to_string(), + ), + all_args.join(&", ".to_string()), + ), + ")".to_string(), + ) + } + } + } } -pub fn emit_plain_method_call_unified(receiver: Rc, method: String, args: Rc>>, target: RenderTarget, recurse: impl Fn(Rc) -> String + Clone) -> String { +pub fn emit_plain_method_call_unified( + receiver: Rc, + method: String, + args: Rc>>, + target: RenderTarget, + recurse: impl Fn(Rc) -> String + Clone, +) -> String { { let recv_str = recurse(receiver); -let arg_strs = Rc::new({ let mut __result = Vec::new(); for a in args.iter().cloned() { __result.push(recurse(arg_value(&a))); } __result }); -let args_str = arg_strs.join(&", ".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(recv_str, ".".to_string()), emit_export_ident(method, &target)), "(".to_string()), args_str), ")".to_string()) -} + let arg_strs = Rc::new({ + let mut __result = Vec::new(); + for a in args.iter().cloned() { + __result.push(recurse(arg_value(&a))); + } + __result + }); + let args_str = arg_strs.join(&", ".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(recv_str, ".".to_string()), + emit_export_ident(method, &target), + ), + "(".to_string(), + ), + args_str, + ), + ")".to_string(), + ) + } } -pub fn emit_typed_method_call_unified(receiver: &Rc, method: String, args: &Rc>>, method_semantics: &Option>, target: &RenderTarget, registry: Rc>>, scope: Rc, depth: i64, recurse: impl Fn(Rc) -> String + Clone) -> String { +pub fn emit_typed_method_call_unified( + receiver: &Rc, + method: String, + args: &Rc>>, + method_semantics: &Option>, + target: &RenderTarget, + registry: Rc>>, + scope: Rc, + depth: i64, + recurse: impl Fn(Rc) -> String + Clone, +) -> String { { let spec = language_spec(target.clone()); -let source_indices = scope.type_env.clone().source_indices.clone(); -if (method_semantics.clone() != None) { + let source_indices = scope.type_env.clone().source_indices.clone(); + if (method_semantics.clone() != None) { match (*method_semantics.clone().unwrap()).clone() { - MethodSemantics::ServiceMethodSemantics { service_name: svc_name, .. } => { - let var_name = service_var_name(svc_name.clone()); -let arg_strs = Rc::new({ let mut __result = Vec::new(); for a in args.clone().iter().cloned() { __result.push(recurse(arg_value(&a))); } __result }); -let args_str = arg_strs.join(&", ".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(spec.async_call_prefix.clone(), var_name), ".".to_string()), emit_export_ident(method, &target)), "(".to_string()), args_str), ")".to_string()) -}, - MethodSemantics::AlgebraMethodSemantics { method_def, .. } => { - let mn = authored_name_at(source_indices.clone(), &method_def); -let first_arg_str = emit_typed_first_arg_shared(args.clone(), target.clone(), recurse.clone()); -emit_algebra_method_call_unified(&mn, receiver.clone(), args.clone(), &target, first_arg_str, recurse.clone()) -}, - MethodSemantics::PlainMethodSemantics => emit_plain_method_call_unified(receiver.clone(), method, args.clone(), target.clone(), recurse.clone()), -} + MethodSemantics::ServiceMethodSemantics { + service_name: svc_name, + .. + } => { + let var_name = service_var_name(svc_name.clone()); + let arg_strs = Rc::new({ + let mut __result = Vec::new(); + for a in args.clone().iter().cloned() { + __result.push(recurse(arg_value(&a))); + } + __result + }); + let args_str = arg_strs.join(&", ".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(spec.async_call_prefix.clone(), var_name), + ".".to_string(), + ), + emit_export_ident(method, &target), + ), + "(".to_string(), + ), + args_str, + ), + ")".to_string(), + ) + } + MethodSemantics::AlgebraMethodSemantics { method_def, .. } => { + let mn = authored_name_at(source_indices.clone(), &method_def); + let first_arg_str = + emit_typed_first_arg_shared(args.clone(), target.clone(), recurse.clone()); + emit_algebra_method_call_unified( + &mn, + receiver.clone(), + args.clone(), + &target, + first_arg_str, + recurse.clone(), + ) + } + MethodSemantics::PlainMethodSemantics => emit_plain_method_call_unified( + receiver.clone(), + method, + args.clone(), + target.clone(), + recurse.clone(), + ), + } } else { if is_typed_service_call_receiver(&receiver, source_indices.clone()) { match extract_typed_service_name(&receiver, &source_indices) { - Some(svc_name) => { - let var_name = service_var_name(svc_name.clone()); -let arg_strs = Rc::new({ let mut __result = Vec::new(); for a in args.clone().iter().cloned() { __result.push(recurse(arg_value(&a))); } __result }); -let args_str = arg_strs.join(&", ".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(spec.async_call_prefix.clone(), var_name), ".".to_string()), emit_export_ident(method, &target)), "(".to_string()), args_str), ")".to_string()) -}, - None => emit_error_expr("unsupported service receiver".to_string(), target.clone()), -} + Some(svc_name) => { + let var_name = service_var_name(svc_name.clone()); + let arg_strs = Rc::new({ + let mut __result = Vec::new(); + for a in args.clone().iter().cloned() { + __result.push(recurse(arg_value(&a))); + } + __result + }); + let args_str = arg_strs.join(&", ".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(spec.async_call_prefix.clone(), var_name), + ".".to_string(), + ), + emit_export_ident(method, &target), + ), + "(".to_string(), + ), + args_str, + ), + ")".to_string(), + ) + } + None => { + emit_error_expr("unsupported service receiver".to_string(), target.clone()) + } + } } else { - emit_plain_method_call_unified(receiver.clone(), method, args.clone(), target.clone(), recurse.clone()) + emit_plain_method_call_unified( + receiver.clone(), + method, + args.clone(), + target.clone(), + recurse.clone(), + ) } } -} + } } -pub fn emit_unified_pattern(pattern: Rc, target: RenderTarget, source_indices: Rc>>) -> String { +pub fn emit_unified_pattern( + pattern: Rc, + target: RenderTarget, + source_indices: Rc>>, +) -> String { match (*pattern).clone() { - MatchPattern::Bind { name: n, .. } => emit_ident(n.clone(), target), - MatchPattern::LitPattern { value: v, .. } => emit_literal(v.clone(), &target), - MatchPattern::VariantPattern { name: n, field_bindings: fbs, .. } => emit_unified_variant_pattern(n.clone(), &fbs, &target, source_indices), - MatchPattern::Wildcard => "_".to_string(), -} + MatchPattern::Bind { name: n, .. } => emit_ident(n.clone(), target), + MatchPattern::LitPattern { value: v, .. } => emit_literal(v.clone(), &target), + MatchPattern::VariantPattern { + name: n, + field_bindings: fbs, + .. + } => emit_unified_variant_pattern(n.clone(), &fbs, &target, source_indices), + MatchPattern::Wildcard => "_".to_string(), + } } -pub fn emit_unified_variant_pattern(name: String, field_bindings: &Rc>>, target: &RenderTarget, source_indices: Rc>>) -> String { +pub fn emit_unified_variant_pattern( + name: String, + field_bindings: &Rc>>, + target: &RenderTarget, + source_indices: Rc>>, +) -> String { { let es = language_spec(target.clone()).expression_semantics.clone(); -match es.variant_pattern.clone() { - Some(vps) => if ((field_bindings.clone().len() as i64) == 0) { - v2_rt::concat(name, vps.empty_suffix.clone()) - } else { - { - let binding_strs = Rc::new({ let mut __result = Vec::new(); for fb in field_bindings.clone().iter().cloned() { __result.push({ - let pat_str = emit_unified_pattern(field_binding_pattern(fb.clone()), target.clone(), source_indices.clone()); -v2_rt::concat(v2_rt::concat(emit_ident(field_binding_name_at(fb.clone(), source_indices.clone()), target.clone()), vps.binding_sep.clone()), pat_str.clone()) -}); } __result }); -v2_rt::concat(v2_rt::concat(v2_rt::concat(name, vps.open.clone()), binding_strs.join(&", ".to_string())), vps.close.clone()) -} - }, - None => if ((field_bindings.clone().len() as i64) > 0) { - emit_error_expr(v2_rt::concat("variant pattern has bindings but target has no destructuring syntax: ".to_string(), name), target.clone()) - } else { - name - }, -} -} + match es.variant_pattern.clone() { + Some(vps) => { + if ((field_bindings.clone().len() as i64) == 0) { + v2_rt::concat(name, vps.empty_suffix.clone()) + } else { + { + let binding_strs = Rc::new({ + let mut __result = Vec::new(); + for fb in field_bindings.clone().iter().cloned() { + __result.push({ + let pat_str = emit_unified_pattern( + field_binding_pattern(fb.clone()), + target.clone(), + source_indices.clone(), + ); + v2_rt::concat( + v2_rt::concat( + emit_ident( + field_binding_name_at( + fb.clone(), + source_indices.clone(), + ), + target.clone(), + ), + vps.binding_sep.clone(), + ), + pat_str.clone(), + ) + }); + } + __result + }); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(name, vps.open.clone()), + binding_strs.join(&", ".to_string()), + ), + vps.close.clone(), + ) + } + } + } + None => { + if ((field_bindings.clone().len() as i64) > 0) { + emit_error_expr( + v2_rt::concat( + "variant pattern has bindings but target has no destructuring syntax: " + .to_string(), + name, + ), + target.clone(), + ) + } else { + name + } + } + } + } } -pub fn emit_match_arm_line(arm: Rc, target: RenderTarget, case_depth: i64, body_depth: i64, body_str: String, guard_str: String, render_pattern: impl Fn(Rc) -> String + Clone) -> String { +pub fn emit_match_arm_line( + arm: Rc, + target: RenderTarget, + case_depth: i64, + body_depth: i64, + body_str: String, + guard_str: String, + render_pattern: impl Fn(Rc) -> String + Clone, +) -> String { { let spec = language_spec(target); -let bs = spec.block_syntax.clone(); -let es = spec.expression_semantics.clone(); -let pat = arm_pattern(arm); -let case_kw = match (*pat.clone()).clone() { - MatchPattern::Wildcard => match es.wildcard_case.clone() { - Some(wc) => wc.clone(), - None => v2_rt::concat(bs.case_keyword.clone(), render_pattern(pat.clone())), -}, - _ => v2_rt::concat(bs.case_keyword.clone(), render_pattern(pat.clone())), -}; -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(make_indent(case_depth), case_kw), guard_str), ":\n".to_string()), make_indent(body_depth)), body_str) -} + let bs = spec.block_syntax.clone(); + let es = spec.expression_semantics.clone(); + let pat = arm_pattern(arm); + let case_kw = match (*pat.clone()).clone() { + MatchPattern::Wildcard => match es.wildcard_case.clone() { + Some(wc) => wc.clone(), + None => v2_rt::concat(bs.case_keyword.clone(), render_pattern(pat.clone())), + }, + _ => v2_rt::concat(bs.case_keyword.clone(), render_pattern(pat.clone())), + }; + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(v2_rt::concat(make_indent(case_depth), case_kw), guard_str), + ":\n".to_string(), + ), + make_indent(body_depth), + ), + body_str, + ) + } } -pub fn emit_arm_guard(arm: Rc, target: &RenderTarget, render_guard_expr: impl Fn(Rc) -> String + Clone) -> String { +pub fn emit_arm_guard( + arm: Rc, + target: &RenderTarget, + render_guard_expr: impl Fn(Rc) -> String + Clone, +) -> String { { let es = language_spec(target.clone()).expression_semantics.clone(); -match arm_guard(&arm) { - Some(g) => match es.guard_prefix.clone() { - Some(prefix) => v2_rt::concat(prefix.clone(), render_guard_expr(g.clone())), - None => emit_error_expr("target does not support pattern guards".to_string(), target.clone()), -}, - None => "".to_string(), -} -} + match arm_guard(&arm) { + Some(g) => match es.guard_prefix.clone() { + Some(prefix) => v2_rt::concat(prefix.clone(), render_guard_expr(g.clone())), + None => emit_error_expr( + "target does not support pattern guards".to_string(), + target.clone(), + ), + }, + None => "".to_string(), + } + } } -pub fn emit_typed_match_unified(scrutinee_str: String, arms: Rc>>, target: &RenderTarget, depth: i64, recurse: impl Fn(Rc, i64) -> String + Clone, render_pattern: impl Fn(Rc) -> String + Clone, source_indices: Rc>>) -> String { +pub fn emit_typed_match_unified( + scrutinee_str: String, + arms: Rc>>, + target: &RenderTarget, + depth: i64, + recurse: impl Fn(Rc, i64) -> String + Clone, + render_pattern: impl Fn(Rc) -> String + Clone, + source_indices: Rc>>, +) -> String { { let bs = language_spec(target.clone()).block_syntax.clone(); -let case_depth = if bs.significant_whitespace.clone() { + let case_depth = if bs.significant_whitespace.clone() { (depth.clone() + 1) } else { depth.clone() }; -let body_depth = (case_depth.clone() + 1); -let arm_strs = Rc::new({ let mut __result = Vec::new(); for arm in arms.iter().cloned() { __result.push({ - let body_str = recurse(arm_body(&arm), body_depth.clone()); -let guard_str = emit_arm_guard(arm.clone(), &target, |g| recurse(g.clone(), depth.clone())); -emit_match_arm_line(arm.clone(), target.clone(), case_depth.clone(), body_depth.clone(), body_str.clone(), guard_str.clone(), render_pattern.clone()) -}); } __result }); -let arms_str = arm_strs.join(&"\n".to_string()); -if (bs.block_close.clone().as_str() == "".to_string().as_str()) { - v2_rt::concat(v2_rt::concat(v2_rt::concat(bs.match_keyword.clone(), scrutinee_str), bs.block_open.clone()), arms_str) + let body_depth = (case_depth.clone() + 1); + let arm_strs = Rc::new({ + let mut __result = Vec::new(); + for arm in arms.iter().cloned() { + __result.push({ + let body_str = recurse(arm_body(&arm), body_depth.clone()); + let guard_str = + emit_arm_guard(arm.clone(), &target, |g| recurse(g.clone(), depth.clone())); + emit_match_arm_line( + arm.clone(), + target.clone(), + case_depth.clone(), + body_depth.clone(), + body_str.clone(), + guard_str.clone(), + render_pattern.clone(), + ) + }); + } + __result + }); + let arms_str = arm_strs.join(&"\n".to_string()); + if (bs.block_close.clone().as_str() == "".to_string().as_str()) { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(bs.match_keyword.clone(), scrutinee_str), + bs.block_open.clone(), + ), + arms_str, + ) } else { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(bs.match_keyword.clone(), scrutinee_str), bs.block_open.clone()), arms_str), "\n".to_string()), make_indent(depth.clone())), bs.block_close.clone()) + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(bs.match_keyword.clone(), scrutinee_str), + bs.block_open.clone(), + ), + arms_str, + ), + "\n".to_string(), + ), + make_indent(depth.clone()), + ), + bs.block_close.clone(), + ) } -} + } } -pub fn emit_field_access_unified(base_str: String, field: String, summary: Option>, target: &RenderTarget) -> String { +pub fn emit_field_access_unified( + base_str: String, + field: String, + summary: Option>, + target: &RenderTarget, +) -> String { { let ts = language_spec(target.clone()).tuple_syntax.clone(); -match summary { - Some(fs) => match fs.access_style.clone() { - FieldAccessStyle::TupleFirst => v2_rt::concat(base_str, ts.first_accessor.clone()), - FieldAccessStyle::TupleSecond => v2_rt::concat(base_str, ts.second_accessor.clone()), - _ => v2_rt::concat(v2_rt::concat(base_str, ".".to_string()), emit_export_ident(field, &target)), -}, - None => v2_rt::concat(v2_rt::concat(base_str, ".".to_string()), emit_export_ident(field, &target)), -} -} + match summary { + Some(fs) => match fs.access_style.clone() { + FieldAccessStyle::TupleFirst => v2_rt::concat(base_str, ts.first_accessor.clone()), + FieldAccessStyle::TupleSecond => { + v2_rt::concat(base_str, ts.second_accessor.clone()) + } + _ => v2_rt::concat( + v2_rt::concat(base_str, ".".to_string()), + emit_export_ident(field, &target), + ), + }, + None => v2_rt::concat( + v2_rt::concat(base_str, ".".to_string()), + emit_export_ident(field, &target), + ), + } + } } -pub fn emit_unified_typed_expr(texpr: Rc, target: &RenderTarget, registry: Rc>>, scope: &Rc, depth: i64, fuel: i64, render_pattern: impl Fn(Rc) -> String + Clone) -> String { +pub fn emit_unified_typed_expr( + texpr: Rc, + target: &RenderTarget, + registry: Rc>>, + scope: &Rc, + depth: i64, + fuel: i64, + render_pattern: impl Fn(Rc) -> String + Clone, +) -> String { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - { - let si = scope.type_env.clone().source_indices.clone(); -let spec = language_spec(target.clone()); -emit_shared_expr(&texpr, &target, si.clone(), |result| result.clone(), |child| emit_unified_typed_expr(child.clone(), &target, registry.clone(), &scope, depth.clone(), (fuel.clone() - 1), render_pattern.clone()), |expr| emit_expr_var_shared(expr.clone(), target.clone(), si.clone()), |expr| { + let si = scope.type_env.clone().source_indices.clone(); + let spec = language_spec(target.clone()); + emit_shared_expr( + &texpr, + &target, + si.clone(), + |result| result.clone(), + |child| { + emit_unified_typed_expr( + child.clone(), + &target, + registry.clone(), + &scope, + depth.clone(), + (fuel.clone() - 1), + render_pattern.clone(), + ) + }, + |expr| emit_expr_var_shared(expr.clone(), target.clone(), si.clone()), + |expr| { let fa_si = scope.type_env.clone().source_indices.clone(); -if is_typed_service_call_receiver(&expr, fa_si.clone()) { + if is_typed_service_call_receiver(&expr, fa_si.clone()) { match extract_typed_service_name(&expr, &fa_si) { - Some(svc_name) => service_var_name(svc_name.clone()), - None => { - let base_str = emit_unified_typed_expr(field_access_base(expr.clone()), &target, registry.clone(), &scope, depth.clone(), 1024, render_pattern.clone()); -emit_field_access_unified(base_str.clone(), field_access_field_at(expr.clone(), fa_si.clone()), expr_field_access_summary(expr.clone()), &target) -}, -} + Some(svc_name) => service_var_name(svc_name.clone()), + None => { + let base_str = emit_unified_typed_expr( + field_access_base(expr.clone()), + &target, + registry.clone(), + &scope, + depth.clone(), + 1024, + render_pattern.clone(), + ); + emit_field_access_unified( + base_str.clone(), + field_access_field_at(expr.clone(), fa_si.clone()), + expr_field_access_summary(expr.clone()), + &target, + ) + } + } } else { { - let base_str = emit_unified_typed_expr(field_access_base(expr.clone()), &target, registry.clone(), &scope, depth.clone(), 1024, render_pattern.clone()); -emit_field_access_unified(base_str.clone(), field_access_field_at(expr.clone(), fa_si.clone()), expr_field_access_summary(expr.clone()), &target) -} - } -}, |expr| emit_typed_call_unified(&expr_call_func_at(expr.clone(), si.clone()), expr.children.clone(), &target, registry.clone(), scope.clone(), |n| emit_unified_typed_expr(n.clone(), &target, registry.clone(), &scope, depth.clone(), 1024, render_pattern.clone())), |expr| emit_typed_method_call_unified(&method_receiver(expr.clone()), expr_method_name_at(expr.clone(), si.clone()), &method_arg_nodes(expr.clone()), &expr_method_call_semantics(expr.clone()), &target, registry.clone(), scope.clone(), depth.clone(), |n| emit_unified_typed_expr(n.clone(), &target, registry.clone(), &scope, depth.clone(), 1024, render_pattern.clone())), |expr| { - let scrut_str = emit_unified_typed_expr(match_scrutinee(expr.clone()), &target, registry.clone(), &scope, depth.clone(), 1024, render_pattern.clone()); -emit_typed_match_unified(scrut_str.clone(), match_arm_nodes(expr.clone()), &target, depth.clone(), |node, d| emit_unified_typed_expr(node.clone(), &target, registry.clone(), &scope, d.clone(), 1024, render_pattern.clone()), render_pattern.clone(), si.clone()) -}, |expr| { - let cond_str = emit_unified_typed_expr(if_condition(expr.clone()), &target, registry.clone(), &scope, depth.clone(), 1024, render_pattern.clone()); -let if_result_type = match spec.expression_semantics.clone().if_value_form.clone() { - IfValueForm::IfStatement => Some(resolved_type(expr.clone())), - _ => None, -}; -emit_typed_if_shared(cond_str.clone(), &if_then_branch(expr.clone()), if_else_branch(expr.clone()), if_result_type.clone(), depth.clone(), &target, si.clone(), |node, d| emit_unified_typed_expr(node.clone(), &target, registry.clone(), &scope, d.clone(), 1024, render_pattern.clone())) -}, |expr| { - let val_str = emit_unified_typed_expr(let_value(expr.clone()), &target, registry.clone(), &scope, depth.clone(), 1024, render_pattern.clone()); -emit_typed_let_shared(&let_binding_name_at(expr.clone(), si.clone()), val_str.clone(), let_body(expr.clone()), target.clone(), |bd, sc| emit_unified_typed_expr(bd.clone(), &target, registry.clone(), &sc, depth.clone(), 1024, render_pattern.clone()), scope.clone(), let_value(expr.clone())) -}, |expr| emit_typed_record_lit_unified(record_lit_type_name_at(expr.clone(), si.clone()), &expr.children.clone(), &target, si.clone(), |n| emit_unified_typed_expr(n.clone(), &target, registry.clone(), &scope, depth.clone(), 1024, render_pattern.clone())), |expr| emit_typed_string_interp_unified(&extract_string_interp_parts(expr.clone()), target.clone(), |e| emit_unified_typed_expr(e.clone(), &target, registry.clone(), &scope, depth.clone(), 1024, render_pattern.clone())), |expr| emit_typed_block_join(expr.children.clone(), scope.clone(), depth.clone(), |remaining, sc, d| { - let prepend = if spec.block_syntax.clone().significant_whitespace.clone() { - false - } else { - true + let base_str = emit_unified_typed_expr( + field_access_base(expr.clone()), + &target, + registry.clone(), + &scope, + depth.clone(), + 1024, + render_pattern.clone(), + ); + emit_field_access_unified( + base_str.clone(), + field_access_field_at(expr.clone(), fa_si.clone()), + expr_field_access_summary(expr.clone()), + &target, + ) + } + } + }, + |expr| { + emit_typed_call_unified( + &expr_call_func_at(expr.clone(), si.clone()), + expr.children.clone(), + &target, + registry.clone(), + scope.clone(), + |n| { + emit_unified_typed_expr( + n.clone(), + &target, + registry.clone(), + &scope, + depth.clone(), + 1024, + render_pattern.clone(), + ) + }, + ) + }, + |expr| { + emit_typed_method_call_unified( + &method_receiver(expr.clone()), + expr_method_name_at(expr.clone(), si.clone()), + &method_arg_nodes(expr.clone()), + &expr_method_call_semantics(expr.clone()), + &target, + registry.clone(), + scope.clone(), + depth.clone(), + |n| { + emit_unified_typed_expr( + n.clone(), + &target, + registry.clone(), + &scope, + depth.clone(), + 1024, + render_pattern.clone(), + ) + }, + ) + }, + |expr| { + let scrut_str = emit_unified_typed_expr( + match_scrutinee(expr.clone()), + &target, + registry.clone(), + &scope, + depth.clone(), + 1024, + render_pattern.clone(), + ); + emit_typed_match_unified( + scrut_str.clone(), + match_arm_nodes(expr.clone()), + &target, + depth.clone(), + |node, d| { + emit_unified_typed_expr( + node.clone(), + &target, + registry.clone(), + &scope, + d.clone(), + 1024, + render_pattern.clone(), + ) + }, + render_pattern.clone(), + si.clone(), + ) + }, + |expr| { + let cond_str = emit_unified_typed_expr( + if_condition(expr.clone()), + &target, + registry.clone(), + &scope, + depth.clone(), + 1024, + render_pattern.clone(), + ); + let if_result_type = match spec.expression_semantics.clone().if_value_form.clone() { + IfValueForm::IfStatement => Some(resolved_type(expr.clone())), + _ => None, }; -emit_block_stmts_shared(remaining.clone(), Rc::new(vec![]), sc.clone(), d.clone(), prepend.clone(), |stmt, s, dd| emit_unified_typed_expr(stmt.clone(), &target, registry.clone(), &s, dd.clone(), 1024, render_pattern.clone())) -}), |expr| emit_typed_cast_shared(&cast_expr(expr.clone()), cast_target(expr.clone()), &target, |child| emit_unified_typed_expr(child.clone(), &target, registry.clone(), &scope, depth.clone(), 1024, render_pattern.clone()), &si), |expr| emit_typed_for_each_shared(&foreach_variable_at(expr.clone(), si.clone()), &foreach_collection(expr.clone()), foreach_body(expr.clone()), &target, depth.clone(), si.clone(), |child, s, d| emit_unified_typed_expr(child.clone(), &target, registry.clone(), &s, d.clone(), 1024, render_pattern.clone()), &scope), |expr| emit_typed_index_shared(&index_base(expr.clone()), index_expr(expr.clone()), &target, |child| emit_unified_typed_expr(child.clone(), &target, registry.clone(), &scope, depth.clone(), 1024, render_pattern.clone()), &si), |expr| emit_typed_slice_shared(&slice_base(expr.clone()), slice_start(expr.clone()), slice_end(expr.clone()), &target, |child| emit_unified_typed_expr(child.clone(), &target, registry.clone(), &scope, depth.clone(), 1024, render_pattern.clone()), si.clone()), |expr| emit_default_bin_op(&expr, target.clone(), si.clone(), |child| emit_unified_typed_expr(child.clone(), &target, registry.clone(), &scope, depth.clone(), (fuel.clone() - 1), render_pattern.clone()), |result| result.clone())) -} + emit_typed_if_shared( + cond_str.clone(), + &if_then_branch(expr.clone()), + if_else_branch(expr.clone()), + if_result_type.clone(), + depth.clone(), + &target, + si.clone(), + |node, d| { + emit_unified_typed_expr( + node.clone(), + &target, + registry.clone(), + &scope, + d.clone(), + 1024, + render_pattern.clone(), + ) + }, + ) + }, + |expr| { + let val_str = emit_unified_typed_expr( + let_value(expr.clone()), + &target, + registry.clone(), + &scope, + depth.clone(), + 1024, + render_pattern.clone(), + ); + emit_typed_let_shared( + &let_binding_name_at(expr.clone(), si.clone()), + val_str.clone(), + let_body(expr.clone()), + target.clone(), + |bd, sc| { + emit_unified_typed_expr( + bd.clone(), + &target, + registry.clone(), + &sc, + depth.clone(), + 1024, + render_pattern.clone(), + ) + }, + scope.clone(), + let_value(expr.clone()), + ) + }, + |expr| { + emit_typed_record_lit_unified( + record_lit_type_name_at(expr.clone(), si.clone()), + &expr.children.clone(), + &target, + si.clone(), + |n| { + emit_unified_typed_expr( + n.clone(), + &target, + registry.clone(), + &scope, + depth.clone(), + 1024, + render_pattern.clone(), + ) + }, + ) + }, + |expr| { + emit_typed_string_interp_unified( + &extract_string_interp_parts(expr.clone()), + target.clone(), + |e| { + emit_unified_typed_expr( + e.clone(), + &target, + registry.clone(), + &scope, + depth.clone(), + 1024, + render_pattern.clone(), + ) + }, + ) + }, + |expr| { + emit_typed_block_join( + expr.children.clone(), + scope.clone(), + depth.clone(), + |remaining, sc, d| { + let prepend = if spec.block_syntax.clone().significant_whitespace.clone() { + false + } else { + true + }; + emit_block_stmts_shared( + remaining.clone(), + Rc::new(vec![]), + sc.clone(), + d.clone(), + prepend.clone(), + |stmt, s, dd| { + emit_unified_typed_expr( + stmt.clone(), + &target, + registry.clone(), + &s, + dd.clone(), + 1024, + render_pattern.clone(), + ) + }, + ) + }, + ) + }, + |expr| { + emit_typed_cast_shared( + &cast_expr(expr.clone()), + cast_target(expr.clone()), + &target, + |child| { + emit_unified_typed_expr( + child.clone(), + &target, + registry.clone(), + &scope, + depth.clone(), + 1024, + render_pattern.clone(), + ) + }, + &si, + ) + }, + |expr| { + emit_typed_for_each_shared( + &foreach_variable_at(expr.clone(), si.clone()), + &foreach_collection(expr.clone()), + foreach_body(expr.clone()), + &target, + depth.clone(), + si.clone(), + |child, s, d| { + emit_unified_typed_expr( + child.clone(), + &target, + registry.clone(), + &s, + d.clone(), + 1024, + render_pattern.clone(), + ) + }, + &scope, + ) + }, + |expr| { + emit_typed_index_shared( + &index_base(expr.clone()), + index_expr(expr.clone()), + &target, + |child| { + emit_unified_typed_expr( + child.clone(), + &target, + registry.clone(), + &scope, + depth.clone(), + 1024, + render_pattern.clone(), + ) + }, + &si, + ) + }, + |expr| { + emit_typed_slice_shared( + &slice_base(expr.clone()), + slice_start(expr.clone()), + slice_end(expr.clone()), + &target, + |child| { + emit_unified_typed_expr( + child.clone(), + &target, + registry.clone(), + &scope, + depth.clone(), + 1024, + render_pattern.clone(), + ) + }, + si.clone(), + ) + }, + |expr| { + emit_default_bin_op( + &expr, + target.clone(), + si.clone(), + |child| { + emit_unified_typed_expr( + child.clone(), + &target, + registry.clone(), + &scope, + depth.clone(), + (fuel.clone() - 1), + render_pattern.clone(), + ) + }, + |result| result.clone(), + ) + }, + ) }) } -pub fn is_tco_identity_passthrough(arg_val: &Rc, param_name: String, si: Rc>>) -> bool { +pub fn is_tco_identity_passthrough( + arg_val: &Rc, + param_name: String, + si: Rc>>, +) -> bool { match (*arg_val.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => (expr_var_name_at(arg_val.clone(), si).as_str() == param_name.as_str()), - _ => false, -} + ExprData::ExprVar { .. } => { + (expr_var_name_at(arg_val.clone(), si).as_str() == param_name.as_str()) + } + _ => false, + } } -pub fn emit_typed_tco_reassign_shared(args: Rc>>, params: Rc>>, target: &RenderTarget, recurse: impl Fn(Rc) -> String + Clone, source_indices: Rc>>) -> String { +pub fn emit_typed_tco_reassign_shared( + args: Rc>>, + params: Rc>>, + target: &RenderTarget, + recurse: impl Fn(Rc) -> String + Clone, + source_indices: Rc>>, +) -> String { { - let arg_values = Rc::new({ let mut __result = Vec::new(); for a in args.iter().cloned() { __result.push(arg_value(&a)); } __result }); -let pairs = Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(params.iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { if { - let pname = param_node_name_at(pair.1.clone(), source_indices.clone()); -let av = match arg_values.clone().get(pair.0.clone() as usize).cloned() { - Some(v) => v.clone(), - None => pair.1.clone(), -}; -!is_tco_identity_passthrough(&av, pname.clone(), source_indices.clone()) -} { __result.push(pair); } } __result }); -let filtered_arg_values = Rc::new({ let mut __result = Vec::new(); for pair in pairs.clone().iter().cloned() { __result.push(match arg_values.clone().get(pair.0.clone() as usize).cloned() { - Some(v) => v.clone(), - None => pair.1.clone(), -}); } __result }); -let ordered_args = Rc::new({ let mut __result = Vec::new(); for av in filtered_arg_values.iter().cloned() { __result.push(recurse(av.clone())); } __result }); -let param_names = Rc::new({ let mut __result = Vec::new(); for pair in pairs.clone().iter().cloned() { __result.push(emit_ident(param_node_name_at(pair.1.clone(), source_indices.clone()), target.clone())); } __result }); -shared_tco_reassign(ordered_args, param_names, &language_spec(target.clone())) -} + let arg_values = Rc::new({ + let mut __result = Vec::new(); + for a in args.iter().cloned() { + __result.push(arg_value(&a)); + } + __result + }); + let pairs = Rc::new({ + let mut __result = Vec::new(); + for pair in Rc::new( + params + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + { + if { + let pname = param_node_name_at(pair.1.clone(), source_indices.clone()); + let av = match arg_values.clone().get(pair.0.clone() as usize).cloned() { + Some(v) => v.clone(), + None => pair.1.clone(), + }; + !is_tco_identity_passthrough(&av, pname.clone(), source_indices.clone()) + } { + __result.push(pair); + } + } + __result + }); + let filtered_arg_values = Rc::new({ + let mut __result = Vec::new(); + for pair in pairs.clone().iter().cloned() { + __result.push( + match arg_values.clone().get(pair.0.clone() as usize).cloned() { + Some(v) => v.clone(), + None => pair.1.clone(), + }, + ); + } + __result + }); + let ordered_args = Rc::new({ + let mut __result = Vec::new(); + for av in filtered_arg_values.iter().cloned() { + __result.push(recurse(av.clone())); + } + __result + }); + let param_names = Rc::new({ + let mut __result = Vec::new(); + for pair in pairs.clone().iter().cloned() { + __result.push(emit_ident( + param_node_name_at(pair.1.clone(), source_indices.clone()), + target.clone(), + )); + } + __result + }); + shared_tco_reassign(ordered_args, param_names, &language_spec(target.clone())) + } } pub fn seed_bindings(key: String, value: String) -> Rc> { diff --git a/src/v2/stage0/src/v2_compiler_emit_go.rs b/src/v2/stage0/src/v2_compiler_emit_go.rs index 5dfc39fc302..c84b2b03217 100644 --- a/src/v2/stage0/src/v2_compiler_emit_go.rs +++ b/src/v2/stage0/src/v2_compiler_emit_go.rs @@ -1,220 +1,683 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.emit_go -use std::collections::HashMap; -use std::rc::Rc; +pub use crate::extdeps_languages_go_emit::{go_reserved, go_reserved_escape_suffix}; +pub use crate::std_induction::SubValueRelation; +use crate::std_induction::SubValueRelation::SubValueUnknown; +pub use crate::v2_compiler_artifact::RenderTarget; +use crate::v2_compiler_artifact::RenderTarget::Go; +pub use crate::v2_compiler_emit::{ + apply_named_template, apply_naming_case, apply_type_template1, apply_type_template2, + apply_type_template3, capitalize_first, compute_service_fields, effective_operation_transport, + emit_algebra_method_template, emit_bin_op_symbol, emit_container, emit_default_bin_op, + emit_error_expr, emit_expr_field_access_shared, emit_expr_var_shared, emit_ident, + emit_inferred_shared, emit_keyword, emit_lambda, emit_lambda_params, emit_let_binding, + emit_list_lit_expr, emit_literal, emit_map_type, emit_node_type, emit_null_coalesce, + emit_param_shared, emit_params_shared, emit_return, emit_shared_expr, emit_simple_expr, + emit_string_literal, emit_tco_unified, emit_typed_block_join, emit_typed_call_unified, + emit_typed_cast_shared, emit_typed_first_arg_shared, emit_typed_for_each_shared, + emit_typed_if_shared, emit_typed_index_shared, emit_typed_let_shared, emit_typed_match_unified, + emit_typed_method_call_unified, emit_typed_record_lit_unified, emit_typed_slice_shared, + emit_typed_string_interp_unified, emit_unary_op, emit_unified_init_block_stmts, + emit_unified_operation_method, emit_unified_pattern, emit_unified_service_def, + emit_unified_transport_dispatch, emit_unified_typed_expr, emit_unified_typed_func_body, + empty_emit_scope, escape_go_interp_text, escape_json_string, escape_string_literal_body, + extract_string_interp_parts, extract_test_projections, has_nested_records_node, + is_data_def_item, is_function_item, is_null_coalesce, is_resource_def_item, + is_service_def_item, is_service_item, is_tco_eligible, is_type_alias_item, + is_type_alias_return_node, is_type_decl_item, is_type_def_item, is_upper, language_spec, + lookup_item, make_indent, module_emit_scope, module_to_filename, order_typed_call_args, + sanitize_service_name, scope_after_expr, seed_bindings, service_fallback_transport, + service_field_decls, service_var_name, test_file_path, test_function_name, to_lower_char, + to_screaming_snake, to_snake, to_string, to_string_helper, to_upper_char, + typed_named_arg_matches, unique_strings, BlockEmitState, EmitResult, InterpPart, + ServiceFieldSet, TestProjection, +}; +pub use crate::v2_compiler_infer::{build_params_scope, expr_span, extend_scope, InferScope}; +pub use crate::v2_compiler_infer_env::{authored_name, TypeBinding, TypeEnv}; +pub use crate::v2_compiler_infer_items::{ItemInfo, ResolvedGraph, TypedModule}; +pub use crate::v2_compiler_infer_service::{ + extract_typed_service_name, is_typed_service_call_receiver, +}; +pub use crate::v2_compiler_infer_sigs::{ResolvedFuncEnv, ResolvedFuncSig}; +pub use crate::v2_compiler_infer_types::{ + node_is_keyed_collection, normalize_access_type_node, resolved_type, +}; +use crate::v2_compiler_languages::VisibilitySpec::CaseVisibility; +pub use crate::v2_compiler_languages::{ + is_string_like, scaffold_for_target, test_conventions_for_target, ItemKeywords, + TestConventions, VisibilitySpec, +}; use crate::v2_rt; -use crate::NonEmptyVec; -use crate::NonEmptyBTreeSet; -pub use crate::v2_std_core::{Node, InferredNode, VarBindingKind, import_is_all, module_imports, module_items, param_node_type_expr, authored_name_at, NewlineIndex, expr_var_name_at, expr_call_func_at, expr_method_name_at, let_binding_name_at, param_node_name_at, resource_use_name_at, MatchPattern, LiteralValue, TextFile, SourceSpan, resource_use_resource, BinOp, UnaryOpKind, StringPart, DeclaredFuncSig, transport_has_auth, transport_auth_header_name, transport_headers, transport_env, ExprData, make_expr_node, MethodSemantics, FieldSummary, FieldAccessStyle, arg_value, arm_body, arm_pattern, arm_guard, field_init_node_name_at, field_init_node_value, if_condition, if_then_branch, if_else_branch, match_scrutinee, match_arm_nodes, let_value, let_body, field_access_base, field_access_field_at, method_receiver, expr_field_access_summary, expr_method_call_semantics, record_lit_type_name_at, lambda_body, cast_expr, cast_target, return_value, foreach_variable_at, foreach_collection, foreach_body, method_arg_nodes, index_base, index_expr, slice_base, slice_start, slice_end, with_required_cardinality, Connective, is_rest_transport, is_shell_transport, is_file_transport, Cardinality}; -use crate::v2_std_core::InferredNode::{Resolved, CompilerError}; -use crate::v2_std_core::VarBindingKind::{FunctionValueBinding}; -use crate::v2_std_core::BinOp::{NullCoalesce}; -use crate::v2_std_core::ExprData::{NoExprData, ExprLiteral, ExprError, ExprVar, ExprFieldAccess, ExprCall, ExprMethodCall, ExprMatch, ExprIf, ExprLet, ExprRecordLit, ExprListLit, ExprBinOp, ExprUnaryOp, ExprLambda, ExprStringInterp, ExprBlock, ExprCast, ExprForEach, ExprIndex, ExprSlice, ExprReturn}; -use crate::v2_std_core::MethodSemantics::{PlainMethodSemantics, AlgebraMethodSemantics, ServiceMethodSemantics}; -use crate::v2_std_core::StringPart::{Text, Interpolation}; -use crate::v2_std_core::FieldAccessStyle::{StoredField, EnumAccessor, OptionalUnwrap, TupleFirst, TupleSecond}; +use crate::v2_std_core::BinOp::NullCoalesce; +use crate::v2_std_core::Cardinality::CardOptional; use crate::v2_std_core::Connective::{Conj, Disj}; -use crate::v2_std_core::Cardinality::{CardOptional}; -use crate::v2_std_core::MatchPattern::*; +use crate::v2_std_core::ExprData::{ + ExprBinOp, ExprBlock, ExprCall, ExprCast, ExprError, ExprFieldAccess, ExprForEach, ExprIf, + ExprIndex, ExprLambda, ExprLet, ExprListLit, ExprLiteral, ExprMatch, ExprMethodCall, + ExprRecordLit, ExprReturn, ExprSlice, ExprStringInterp, ExprUnaryOp, ExprVar, NoExprData, +}; +use crate::v2_std_core::FieldAccessStyle::{ + EnumAccessor, OptionalUnwrap, StoredField, TupleFirst, TupleSecond, +}; +use crate::v2_std_core::InferredNode::{CompilerError, Resolved}; use crate::v2_std_core::LiteralValue::*; +use crate::v2_std_core::MatchPattern::*; +use crate::v2_std_core::MethodSemantics::{ + AlgebraMethodSemantics, PlainMethodSemantics, ServiceMethodSemantics, +}; +use crate::v2_std_core::StringPart::{Interpolation, Text}; use crate::v2_std_core::UnaryOpKind::*; -pub use crate::v2_compiler_artifact::{RenderTarget}; -use crate::v2_compiler_artifact::RenderTarget::{Go}; -pub use crate::extdeps_languages_go_emit::{go_reserved, go_reserved_escape_suffix}; -pub use crate::v2_compiler_languages::{scaffold_for_target, TestConventions, ItemKeywords, test_conventions_for_target, is_string_like, VisibilitySpec}; -use crate::v2_compiler_languages::VisibilitySpec::{CaseVisibility}; -pub use crate::v2_compiler_infer_env::{TypeEnv, TypeBinding, authored_name}; -pub use crate::v2_compiler_infer_types::{resolved_type, normalize_access_type_node, node_is_keyed_collection}; -pub use crate::v2_compiler_infer_sigs::{ResolvedFuncSig, ResolvedFuncEnv}; -pub use crate::v2_compiler_infer_items::{ResolvedGraph, TypedModule, ItemInfo}; -pub use crate::v2_compiler_infer_service::{is_typed_service_call_receiver, extract_typed_service_name}; -pub use crate::v2_compiler_infer::{InferScope, build_params_scope, extend_scope, expr_span}; -pub use crate::std_induction::{SubValueRelation}; -use crate::std_induction::SubValueRelation::{SubValueUnknown}; -pub use crate::v2_compiler_emit::{EmitResult, BlockEmitState, InterpPart, TestProjection, emit_literal, emit_bin_op_symbol, emit_keyword, emit_container, emit_map_type, emit_node_type, emit_ident, emit_let_binding, emit_simple_expr, emit_unary_op, emit_lambda, emit_error_expr, emit_return, emit_lambda_params, emit_list_lit_expr, emit_shared_expr, emit_default_bin_op, emit_string_literal, escape_go_interp_text, escape_string_literal_body, empty_emit_scope, module_emit_scope, scope_after_expr, lookup_item, unique_strings, escape_json_string, module_to_filename, make_indent, to_string, to_string_helper, to_snake, to_screaming_snake, is_upper, to_lower_char, to_upper_char, capitalize_first, sanitize_service_name, service_var_name, test_function_name, apply_type_template1, apply_type_template2, apply_type_template3, apply_named_template, language_spec, is_null_coalesce, emit_null_coalesce, is_type_alias_return_node, has_nested_records_node, is_service_item, typed_named_arg_matches, order_typed_call_args, is_type_def_item, is_type_alias_item, is_type_decl_item, is_function_item, is_data_def_item, is_service_def_item, is_resource_def_item, extract_test_projections, is_tco_eligible, service_fallback_transport, effective_operation_transport, ServiceFieldSet, compute_service_fields, service_field_decls, seed_bindings, emit_expr_var_shared, emit_expr_field_access_shared, extract_string_interp_parts, emit_typed_cast_shared, emit_typed_for_each_shared, emit_typed_index_shared, emit_typed_slice_shared, emit_unified_init_block_stmts, emit_typed_if_shared, emit_typed_let_shared, emit_param_shared, emit_params_shared, apply_naming_case, emit_inferred_shared, emit_typed_block_join, emit_typed_first_arg_shared, emit_algebra_method_template, emit_typed_string_interp_unified, emit_typed_record_lit_unified, emit_typed_call_unified, emit_typed_method_call_unified, emit_typed_match_unified, emit_unified_typed_expr, emit_tco_unified, emit_unified_pattern, test_file_path, emit_unified_typed_func_body, emit_unified_service_def, emit_unified_operation_method, emit_unified_transport_dispatch}; +use crate::v2_std_core::VarBindingKind::FunctionValueBinding; +pub use crate::v2_std_core::{ + arg_value, arm_body, arm_guard, arm_pattern, authored_name_at, cast_expr, cast_target, + expr_call_func_at, expr_field_access_summary, expr_method_call_semantics, expr_method_name_at, + expr_var_name_at, field_access_base, field_access_field_at, field_init_node_name_at, + field_init_node_value, foreach_body, foreach_collection, foreach_variable_at, if_condition, + if_else_branch, if_then_branch, import_is_all, index_base, index_expr, is_file_transport, + is_rest_transport, is_shell_transport, lambda_body, let_binding_name_at, let_body, let_value, + make_expr_node, match_arm_nodes, match_scrutinee, method_arg_nodes, method_receiver, + module_imports, module_items, param_node_name_at, param_node_type_expr, + record_lit_type_name_at, resource_use_name_at, resource_use_resource, return_value, slice_base, + slice_end, slice_start, transport_auth_header_name, transport_env, transport_has_auth, + transport_headers, with_required_cardinality, BinOp, Cardinality, Connective, DeclaredFuncSig, + ExprData, FieldAccessStyle, FieldSummary, InferredNode, LiteralValue, MatchPattern, + MethodSemantics, NewlineIndex, Node, SourceSpan, StringPart, TextFile, UnaryOpKind, + VarBindingKind, +}; +use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; pub fn emit_go(typed: &Rc) -> Rc { { let registry = typed.item_registry.clone(); -let test_projections = extract_test_projections(typed.clone()); -let module_files = Rc::new({ let mut __result = Vec::new(); for tm in typed.modules.clone().iter().cloned() { __result.push(emit_go_module(&tm, registry.clone())); } __result }); -let test_files = Rc::new({ let mut __result = Vec::new(); for f in Rc::new({ let mut __result = Vec::new(); for tm in typed.modules.clone().iter().cloned() { __result.push(emit_go_test_file(&authored_name_at(tm.type_env.clone().source_indices.clone(), &tm.module.clone()), &Rc::new({ let mut __result = Vec::new(); for p in test_projections.clone().iter().cloned() { if (p.module_name.clone().as_str() == authored_name_at(tm.type_env.clone().source_indices.clone(), &tm.module.clone()).as_str()) { __result.push(p); } } __result }))); } __result }).iter().cloned() { if (f.path.clone().as_str() != "".to_string().as_str()) { __result.push(f); } } __result }); -let go_mod = emit_go_mod("generated".to_string()); -let files = v2_rt::concat(v2_rt::concat(Rc::new(vec![go_mod]), module_files), test_files); -Rc::new(EmitResult { - files: files, - diagnostics: Rc::new(vec![]), -}) -} + let test_projections = extract_test_projections(typed.clone()); + let module_files = Rc::new({ + let mut __result = Vec::new(); + for tm in typed.modules.clone().iter().cloned() { + __result.push(emit_go_module(&tm, registry.clone())); + } + __result + }); + let test_files = Rc::new({ + let mut __result = Vec::new(); + for f in Rc::new({ + let mut __result = Vec::new(); + for tm in typed.modules.clone().iter().cloned() { + __result.push(emit_go_test_file( + &authored_name_at( + tm.type_env.clone().source_indices.clone(), + &tm.module.clone(), + ), + &Rc::new({ + let mut __result = Vec::new(); + for p in test_projections.clone().iter().cloned() { + if (p.module_name.clone().as_str() + == authored_name_at( + tm.type_env.clone().source_indices.clone(), + &tm.module.clone(), + ) + .as_str()) + { + __result.push(p); + } + } + __result + }), + )); + } + __result + }) + .iter() + .cloned() + { + if (f.path.clone().as_str() != "".to_string().as_str()) { + __result.push(f); + } + } + __result + }); + let go_mod = emit_go_mod("generated".to_string()); + let files = v2_rt::concat( + v2_rt::concat(Rc::new(vec![go_mod]), module_files), + test_files, + ); + Rc::new(EmitResult { + files: files, + diagnostics: Rc::new(vec![]), + }) + } } pub fn emit_go_mod(module_name: String) -> Rc { { let manifest_path = match scaffold_for_target(RenderTarget::Go).manifest_file.clone() { - Some(path) => path.clone(), - None => "go.mod".to_string(), -}; -let content = v2_rt::concat(v2_rt::concat("module ".to_string(), module_name), "\n\ngo 1.21\n".to_string()); -Rc::new(TextFile { - path: manifest_path, - content: content, -}) -} + Some(path) => path.clone(), + None => "go.mod".to_string(), + }; + let content = v2_rt::concat( + v2_rt::concat("module ".to_string(), module_name), + "\n\ngo 1.21\n".to_string(), + ); + Rc::new(TextFile { + path: manifest_path, + content: content, + }) + } } -pub fn go_mock_expr_uses_fmt(expr: Rc, source_indices: Rc>>) -> bool { +pub fn go_mock_expr_uses_fmt( + expr: Rc, + source_indices: Rc>>, +) -> bool { { let rendered = emit_simple_expr(&expr, &RenderTarget::Go, &source_indices); -((Rc::new(rendered.split(&"fmt.Sprintf(".to_string()).map(|s| s.to_string()).collect::>()).len() as i64) > 1) -} + ((Rc::new( + rendered + .split(&"fmt.Sprintf(".to_string()) + .map(|s| s.to_string()) + .collect::>(), + ) + .len() as i64) + > 1) + } } pub fn go_test_import_block(projections: Rc>>) -> String { { - let needs_fmt = { let mut __found = false; for p in projections.iter().cloned() { if { let mut __found = false; for mp in p.mock_field_inits.clone().iter().cloned() { if go_mock_expr_uses_fmt(field_init_node_value(&mp), p.source_indices.clone()) { __found = true; break; } } __found } { __found = true; break; } } __found }; -if needs_fmt { + let needs_fmt = { + let mut __found = false; + for p in projections.iter().cloned() { + if { + let mut __found = false; + for mp in p.mock_field_inits.clone().iter().cloned() { + if go_mock_expr_uses_fmt( + field_init_node_value(&mp), + p.source_indices.clone(), + ) { + __found = true; + break; + } + } + __found + } { + __found = true; + break; + } + } + __found + }; + if needs_fmt { "import (\n\t\"fmt\"\n\t\"testing\"\n)\n\n".to_string() } else { "import \"testing\"\n\n".to_string() } -} + } } pub fn go_test_signature_comment(projection: &Rc) -> String { { - let params_str = Rc::new({ let mut __result = Vec::new(); for p in projection.params.clone().iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(param_node_name_at(p.clone(), projection.source_indices.clone()), " ".to_string()), emit_node_type(param_node_type_expr(&p), RenderTarget::Go, projection.source_indices.clone()))); } __result }).join(&", ".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("// Signature: ".to_string(), sanitize_service_name(projection.service_name.clone())), ".".to_string()), projection.operation_name.clone()), "(".to_string()), params_str), ") ".to_string()), emit_node_type(projection.inferred.clone(), RenderTarget::Go, projection.source_indices.clone())) -} + let params_str = Rc::new({ + let mut __result = Vec::new(); + for p in projection.params.clone().iter().cloned() { + __result.push(v2_rt::concat( + v2_rt::concat( + param_node_name_at(p.clone(), projection.source_indices.clone()), + " ".to_string(), + ), + emit_node_type( + param_node_type_expr(&p), + RenderTarget::Go, + projection.source_indices.clone(), + ), + )); + } + __result + }) + .join(&", ".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "// Signature: ".to_string(), + sanitize_service_name(projection.service_name.clone()), + ), + ".".to_string(), + ), + projection.operation_name.clone(), + ), + "(".to_string(), + ), + params_str, + ), + ") ".to_string(), + ), + emit_node_type( + projection.inferred.clone(), + RenderTarget::Go, + projection.source_indices.clone(), + ), + ) + } } -pub fn emit_go_test_file(module_name: &String, projections: &Rc>>) -> Rc { +pub fn emit_go_test_file( + module_name: &String, + projections: &Rc>>, +) -> Rc { if ((projections.clone().len() as i64) == 0) { Rc::new(TextFile { - path: "".to_string(), - content: "".to_string(), -}) + path: "".to_string(), + content: "".to_string(), + }) } else { { let package_name = go_package_name(module_name.clone()); -let tests_str = Rc::new({ let mut __result = Vec::new(); for p in projections.clone().iter().cloned() { __result.push(emit_go_operation_test(&p, 0)); } __result }).join(&"\n\n".to_string()); -let content = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("// Generated tests -- do not edit.\n".to_string(), "// Source module: ".to_string()), module_name.clone()), "\n\n".to_string()), language_spec(RenderTarget::Go).items.clone().module_keyword.clone()), " ".to_string()), package_name), "\n\n".to_string()), go_test_import_block(projections.clone())), tests_str), "\n".to_string()); -Rc::new(TextFile { - path: test_file_path(module_name.clone(), &RenderTarget::Go), - content: content, -}) -} + let tests_str = Rc::new({ + let mut __result = Vec::new(); + for p in projections.clone().iter().cloned() { + __result.push(emit_go_operation_test(&p, 0)); + } + __result + }) + .join(&"\n\n".to_string()); + let content = v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "// Generated tests -- do not edit.\n" + .to_string(), + "// Source module: ".to_string(), + ), + module_name.clone(), + ), + "\n\n".to_string(), + ), + language_spec(RenderTarget::Go) + .items + .clone() + .module_keyword + .clone(), + ), + " ".to_string(), + ), + package_name, + ), + "\n\n".to_string(), + ), + go_test_import_block(projections.clone()), + ), + tests_str, + ), + "\n".to_string(), + ); + Rc::new(TextFile { + path: test_file_path(module_name.clone(), &RenderTarget::Go), + content: content, + }) + } } } pub fn emit_go_operation_test(projection: &Rc, depth: i64) -> String { { let test_name = test_function_name(&projection, RenderTarget::Go); -let struct_name = sanitize_service_name(projection.service_name.clone()); -let indent = make_indent((depth.clone() + 1)); -let mock_setup = Rc::new({ let mut __result = Vec::new(); for mp in projection.mock_field_inits.clone().iter().cloned() { __result.push(emit_go_mock_prop_setup(&mp, (depth.clone() + 1), &projection.source_indices.clone())); } __result }).join(&"\n".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Go).items.clone().func_keyword.clone(), " ".to_string()), test_name), "(t *testing.T) {\n".to_string()), indent.clone()), go_test_signature_comment(&projection)), "\n".to_string()), indent.clone()), "_ = ".to_string()), struct_name), "{}\n".to_string()), indent.clone()), mock_setup), "\n".to_string()), indent.clone()), "// TODO: add dry-run support to Go service emission for full invocation tests\n".to_string()), "}".to_string()) -} + let struct_name = sanitize_service_name(projection.service_name.clone()); + let indent = make_indent((depth.clone() + 1)); + let mock_setup = Rc::new({ + let mut __result = Vec::new(); + for mp in projection.mock_field_inits.clone().iter().cloned() { + __result.push(emit_go_mock_prop_setup( + &mp, + (depth.clone() + 1), + &projection.source_indices.clone(), + )); + } + __result + }) + .join(&"\n".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + language_spec( + RenderTarget::Go, + ) + .items + .clone() + .func_keyword + .clone(), + " ".to_string(), + ), + test_name, + ), + "(t *testing.T) {\n".to_string(), + ), + indent.clone(), + ), + go_test_signature_comment(&projection), + ), + "\n".to_string(), + ), + indent.clone(), + ), + "_ = ".to_string(), + ), + struct_name, + ), + "{}\n".to_string(), + ), + indent.clone(), + ), + mock_setup, + ), + "\n".to_string(), + ), + indent.clone(), + ), + "// TODO: add dry-run support to Go service emission for full invocation tests\n" + .to_string(), + ), + "}".to_string(), + ) + } } -pub fn emit_go_mock_prop_setup(mock_prop: &Rc, depth: i64, source_indices: &Rc>>) -> String { - v2_rt::concat(v2_rt::concat(emit_ident(field_init_node_name_at(mock_prop.clone(), source_indices.clone()), RenderTarget::Go), " := ".to_string()), emit_simple_expr(&field_init_node_value(&mock_prop), &RenderTarget::Go, &source_indices)) +pub fn emit_go_mock_prop_setup( + mock_prop: &Rc, + depth: i64, + source_indices: &Rc>>, +) -> String { + v2_rt::concat( + v2_rt::concat( + emit_ident( + field_init_node_name_at(mock_prop.clone(), source_indices.clone()), + RenderTarget::Go, + ), + " := ".to_string(), + ), + emit_simple_expr( + &field_init_node_value(&mock_prop), + &RenderTarget::Go, + &source_indices, + ), + ) } -pub fn emit_go_module(typed_module: &Rc, registry: Rc>>) -> Rc { +pub fn emit_go_module( + typed_module: &Rc, + registry: Rc>>, +) -> Rc { { let m = typed_module.module.clone(); -let scope = module_emit_scope(&typed_module); -let si = typed_module.type_env.clone().source_indices.clone(); -let mod_name_str = authored_name_at(si.clone(), &m); -let pkg_name = go_package_name(mod_name_str.clone()); -let pkg_decl = v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Go).items.clone().module_keyword.clone(), " ".to_string()), pkg_name); -let imports_str = emit_go_imports(&typed_module.items.clone(), module_imports(m.clone()), si.clone()); -let imports_section = if (imports_str.clone().as_str() == "".to_string().as_str()) { + let scope = module_emit_scope(&typed_module); + let si = typed_module.type_env.clone().source_indices.clone(); + let mod_name_str = authored_name_at(si.clone(), &m); + let pkg_name = go_package_name(mod_name_str.clone()); + let pkg_decl = v2_rt::concat( + v2_rt::concat( + language_spec(RenderTarget::Go) + .items + .clone() + .module_keyword + .clone(), + " ".to_string(), + ), + pkg_name, + ); + let imports_str = emit_go_imports( + &typed_module.items.clone(), + module_imports(m.clone()), + si.clone(), + ); + let imports_section = if (imports_str.clone().as_str() == "".to_string().as_str()) { "".to_string() } else { v2_rt::concat("\n\n".to_string(), imports_str.clone()) }; -let items_str = Rc::new({ let mut __result = Vec::new(); for item in typed_module.items.clone().iter().cloned() { __result.push(emit_go_typed_item(&item, registry.clone(), &scope)); } __result }).join(&"\n\n".to_string()); -let filename = module_to_filename(mod_name_str.clone()); -let content = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("// Generated by v2 compiler -- do not edit.\n".to_string(), "// Source module: ".to_string()), mod_name_str.clone()), "\n\n".to_string()), pkg_decl), imports_section), "\n\n".to_string()), items_str), "\n".to_string()); -Rc::new(TextFile { - path: v2_rt::concat(filename, scaffold_for_target(RenderTarget::Go).source_file_extension.clone()), - content: content, -}) -} + let items_str = Rc::new({ + let mut __result = Vec::new(); + for item in typed_module.items.clone().iter().cloned() { + __result.push(emit_go_typed_item(&item, registry.clone(), &scope)); + } + __result + }) + .join(&"\n\n".to_string()); + let filename = module_to_filename(mod_name_str.clone()); + let content = v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "// Generated by v2 compiler -- do not edit.\n".to_string(), + "// Source module: ".to_string(), + ), + mod_name_str.clone(), + ), + "\n\n".to_string(), + ), + pkg_decl, + ), + imports_section, + ), + "\n\n".to_string(), + ), + items_str, + ), + "\n".to_string(), + ); + Rc::new(TextFile { + path: v2_rt::concat( + filename, + scaffold_for_target(RenderTarget::Go) + .source_file_extension + .clone(), + ), + content: content, + }) + } } pub fn go_package_name(module_name: String) -> String { { - let parts = Rc::new(module_name.split(&".".to_string()).map(|s| s.to_string()).collect::>()); -match parts.last().cloned() { - Some(last_part) => Rc::new({ let mut __result = Vec::new(); for c in Rc::new(last_part.clone().chars().map(|c| c as i64).collect::>()).iter().cloned() { __result.push(to_lower_char(c.clone())); } __result }).join(&"".to_string()), - None => "main".to_string(), -} -} + let parts = Rc::new( + module_name + .split(&".".to_string()) + .map(|s| s.to_string()) + .collect::>(), + ); + match parts.last().cloned() { + Some(last_part) => Rc::new({ + let mut __result = Vec::new(); + for c in Rc::new( + last_part + .clone() + .chars() + .map(|c| c as i64) + .collect::>(), + ) + .iter() + .cloned() + { + __result.push(to_lower_char(c.clone())); + } + __result + }) + .join(&"".to_string()), + None => "main".to_string(), + } + } } -pub fn emit_go_imports(items: &Rc>>, imports: Rc>>, source_indices: Rc>>) -> String { +pub fn emit_go_imports( + items: &Rc>>, + imports: Rc>>, + source_indices: Rc>>, +) -> String { { - let has_services = { let mut __found = false; for item in items.clone().iter().cloned() { if is_service_item(&item) { __found = true; break; } } __found }; -let has_types = { let mut __found = false; for item in items.clone().iter().cloned() { if is_type_def_item(&item) { __found = true; break; } } __found }; -let has_functions = { let mut __found = false; for item in items.clone().iter().cloned() { if is_function_item(&item) { __found = true; break; } } __found }; -let std_imports = collect_go_std_imports(&has_services, has_types, has_functions); -let pkg_imports = Rc::new({ let mut __result = Vec::new(); for imp in imports.iter().cloned() { __result.push({ - let mod_name = module_to_filename(authored_name_at(source_indices.clone(), &imp)); -v2_rt::concat(v2_rt::concat("\t\"generated/".to_string(), mod_name.clone()), "\"".to_string()) -}); } __result }); -let all_imports = v2_rt::concat(std_imports, pkg_imports); -if ((all_imports.clone().len() as i64) == 0) { + let has_services = { + let mut __found = false; + for item in items.clone().iter().cloned() { + if is_service_item(&item) { + __found = true; + break; + } + } + __found + }; + let has_types = { + let mut __found = false; + for item in items.clone().iter().cloned() { + if is_type_def_item(&item) { + __found = true; + break; + } + } + __found + }; + let has_functions = { + let mut __found = false; + for item in items.clone().iter().cloned() { + if is_function_item(&item) { + __found = true; + break; + } + } + __found + }; + let std_imports = collect_go_std_imports(&has_services, has_types, has_functions); + let pkg_imports = Rc::new({ + let mut __result = Vec::new(); + for imp in imports.iter().cloned() { + __result.push({ + let mod_name = + module_to_filename(authored_name_at(source_indices.clone(), &imp)); + v2_rt::concat( + v2_rt::concat("\t\"generated/".to_string(), mod_name.clone()), + "\"".to_string(), + ) + }); + } + __result + }); + let all_imports = v2_rt::concat(std_imports, pkg_imports); + if ((all_imports.clone().len() as i64) == 0) { "".to_string() } else { { let imports_str = all_imports.clone().join(&"\n".to_string()); -v2_rt::concat(v2_rt::concat("import (\n".to_string(), imports_str), "\n)".to_string()) -} + v2_rt::concat( + v2_rt::concat("import (\n".to_string(), imports_str), + "\n)".to_string(), + ) + } } -} + } } -pub fn collect_go_std_imports(has_services: &bool, has_types: bool, has_functions: bool) -> Rc> { +pub fn collect_go_std_imports( + has_services: &bool, + has_types: bool, + has_functions: bool, +) -> Rc> { { let fmt_import = if ((has_types || has_functions) || has_services.clone()) { Rc::new(vec!["\t\"fmt\"".to_string()]) } else { Rc::new(vec![]) }; -let net_imports = if has_services.clone() { - Rc::new(vec!["\t\"net/http\"".to_string(), "\t\"encoding/json\"".to_string(), "\t\"bytes\"".to_string(), "\t\"io\"".to_string()]) + let net_imports = if has_services.clone() { + Rc::new(vec![ + "\t\"net/http\"".to_string(), + "\t\"encoding/json\"".to_string(), + "\t\"bytes\"".to_string(), + "\t\"io\"".to_string(), + ]) } else { Rc::new(vec![]) }; -v2_rt::concat(fmt_import, net_imports) -} + v2_rt::concat(fmt_import, net_imports) + } } -pub fn emit_go_typed_item(item: &Rc, registry: Rc>>, scope: &Rc) -> String { +pub fn emit_go_typed_item( + item: &Rc, + registry: Rc>>, + scope: &Rc, +) -> String { { let env = scope.type_env.clone(); -let item_text = authored_name(env.clone(), item.clone()); -if is_type_def_item(&item) { + let item_text = authored_name(env.clone(), item.clone()); + if is_type_def_item(&item) { emit_go_type_def_from_connective(&item, &env) } else { if is_type_alias_item(&item, env.source_indices.clone()) { - emit_go_type_alias(item_text, resolved_type(item.clone()), env.source_indices.clone()) + emit_go_type_alias( + item_text, + resolved_type(item.clone()), + env.source_indices.clone(), + ) } else { if is_type_decl_item(&item, env.source_indices.clone()) { "".to_string() } else { if is_function_item(&item) { if ((item.uses.clone().len() as i64) > 0) { - emit_go_func_def(&item_text, &item.params.clone(), resolved_type(item.clone()), &item.uses.clone(), item.body.clone().clone().unwrap(), ®istry, &scope) + emit_go_func_def( + &item_text, + &item.params.clone(), + resolved_type(item.clone()), + &item.uses.clone(), + item.body.clone().clone().unwrap(), + ®istry, + &scope, + ) } else { - emit_go_fn_def(&item_text, &item.params.clone(), resolved_type(item.clone()), &item.body.clone().clone().unwrap(), ®istry, &scope) + emit_go_fn_def( + &item_text, + &item.params.clone(), + resolved_type(item.clone()), + &item.body.clone().clone().unwrap(), + ®istry, + &scope, + ) } } else { if is_data_def_item(&item) { - emit_go_data_def(item_text, item.type_annotation.clone().clone().unwrap(), item.body.clone().clone().unwrap(), registry, &scope, 0) + emit_go_data_def( + item_text, + item.type_annotation.clone().clone().unwrap(), + item.body.clone().clone().unwrap(), + registry, + &scope, + 0, + ) } else { if is_service_def_item(&item) { emit_go_service_def(item.clone(), registry, env.clone()) @@ -222,7 +685,21 @@ if is_type_def_item(&item) { if is_resource_def_item(&item) { emit_go_resource_def(&item, &env) } else { - v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Go).items.clone().func_keyword.clone(), " init() { panic(\"EMIT BUG: unhandled item: ".to_string()), item_text), "\") }".to_string()) + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + language_spec(RenderTarget::Go) + .items + .clone() + .func_keyword + .clone(), + " init() { panic(\"EMIT BUG: unhandled item: " + .to_string(), + ), + item_text, + ), + "\") }".to_string(), + ) } } } @@ -230,255 +707,1065 @@ if is_type_def_item(&item) { } } } -} + } } pub fn emit_go_type_def_from_connective(item: &Rc, env: &Rc) -> String { { let item_text = authored_name(env.clone(), item.clone()); -let is_product = (item.connective.clone() == Connective::Conj); -if is_product { + let is_product = (item.connective.clone() == Connective::Conj); + if is_product { emit_go_struct_from_children(item_text, &item.children.clone(), env.clone()) } else { emit_go_sum_from_children(&item_text, &item.children.clone(), env.clone()) } -} + } } -pub fn emit_go_struct_from_children(name: String, children: &Rc>>, env: Rc) -> String { +pub fn emit_go_struct_from_children( + name: String, + children: &Rc>>, + env: Rc, +) -> String { if ((children.clone().len() as i64) == 0) { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Go).items.clone().type_alias_keyword.clone(), " ".to_string()), name), " ".to_string()), language_spec(RenderTarget::Go).items.clone().struct_keyword.clone()), "{}".to_string()) + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + language_spec(RenderTarget::Go) + .items + .clone() + .type_alias_keyword + .clone(), + " ".to_string(), + ), + name, + ), + " ".to_string(), + ), + language_spec(RenderTarget::Go) + .items + .clone() + .struct_keyword + .clone(), + ), + "{}".to_string(), + ) } else { { - let field_lines = Rc::new({ let mut __result = Vec::new(); for child in children.clone().iter().cloned() { __result.push(emit_go_struct_field_from_child(&child, &env)); } __result }); -let fields_str = field_lines.join(&"\n".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Go).items.clone().type_alias_keyword.clone(), " ".to_string()), name), " ".to_string()), language_spec(RenderTarget::Go).items.clone().struct_keyword.clone()), " {\n".to_string()), fields_str), "\n}".to_string()) -} + let field_lines = Rc::new({ + let mut __result = Vec::new(); + for child in children.clone().iter().cloned() { + __result.push(emit_go_struct_field_from_child(&child, &env)); + } + __result + }); + let fields_str = field_lines.join(&"\n".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + language_spec(RenderTarget::Go) + .items + .clone() + .type_alias_keyword + .clone(), + " ".to_string(), + ), + name, + ), + " ".to_string(), + ), + language_spec(RenderTarget::Go) + .items + .clone() + .struct_keyword + .clone(), + ), + " {\n".to_string(), + ), + fields_str, + ), + "\n}".to_string(), + ) + } } } pub fn emit_go_struct_field_from_child(child: &Rc, env: &Rc) -> String { { let child_text = authored_name(env.clone(), child.clone()); -let ty = emit_node_type(resolved_type(child.clone()), RenderTarget::Go, env.source_indices.clone()); -let json_tag = v2_rt::concat(v2_rt::concat(" `json:\"".to_string(), to_snake(child_text.clone())), "\"`".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("\t".to_string(), go_export_ident(child_text.clone())), " ".to_string()), ty), json_tag) -} + let ty = emit_node_type( + resolved_type(child.clone()), + RenderTarget::Go, + env.source_indices.clone(), + ); + let json_tag = v2_rt::concat( + v2_rt::concat(" `json:\"".to_string(), to_snake(child_text.clone())), + "\"`".to_string(), + ); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("\t".to_string(), go_export_ident(child_text.clone())), + " ".to_string(), + ), + ty, + ), + json_tag, + ) + } } -pub fn emit_go_sum_from_children(name: &String, children: &Rc>>, env: Rc) -> String { +pub fn emit_go_sum_from_children( + name: &String, + children: &Rc>>, + env: Rc, +) -> String { { - let has_data = { let mut __found = false; for child in children.clone().iter().cloned() { if ((child.children.clone().len() as i64) > 0) { __found = true; break; } } __found }; -if has_data { + let has_data = { + let mut __found = false; + for child in children.clone().iter().cloned() { + if ((child.children.clone().len() as i64) > 0) { + __found = true; + break; + } + } + __found + }; + if has_data { { - let iface = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Go).items.clone().type_alias_keyword.clone(), " ".to_string()), name.clone()), " interface {\n\tis".to_string()), name.clone()), "()\n}".to_string()); -let variant_structs = Rc::new({ let mut __result = Vec::new(); for child in children.clone().iter().cloned() { __result.push(emit_go_variant_struct(&name, &child, &env)); } __result }); -let structs_str = variant_structs.join(&"\n\n".to_string()); -v2_rt::concat(v2_rt::concat(iface, "\n\n".to_string()), structs_str) -} + let iface = v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + language_spec(RenderTarget::Go) + .items + .clone() + .type_alias_keyword + .clone(), + " ".to_string(), + ), + name.clone(), + ), + " interface {\n\tis".to_string(), + ), + name.clone(), + ), + "()\n}".to_string(), + ); + let variant_structs = Rc::new({ + let mut __result = Vec::new(); + for child in children.clone().iter().cloned() { + __result.push(emit_go_variant_struct(&name, &child, &env)); + } + __result + }); + let structs_str = variant_structs.join(&"\n\n".to_string()); + v2_rt::concat(v2_rt::concat(iface, "\n\n".to_string()), structs_str) + } } else { { - let type_decl = v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Go).items.clone().enum_keyword.clone(), " ".to_string()), name.clone()), " int".to_string()); -let variant_consts = Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(children.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { __result.push({ - let child = pair.1.clone(); -let child_text = authored_name(env.clone(), child.clone()); -if (pair.0.clone() == 0) { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("\t".to_string(), name.clone()), child_text.clone()), " ".to_string()), name.clone()), " = iota".to_string()) - } else { - v2_rt::concat(v2_rt::concat("\t".to_string(), name.clone()), child_text.clone()) + let type_decl = v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + language_spec(RenderTarget::Go) + .items + .clone() + .enum_keyword + .clone(), + " ".to_string(), + ), + name.clone(), + ), + " int".to_string(), + ); + let variant_consts = Rc::new({ + let mut __result = Vec::new(); + for pair in Rc::new( + children + .clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + { + __result.push({ + let child = pair.1.clone(); + let child_text = authored_name(env.clone(), child.clone()); + if (pair.0.clone() == 0) { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("\t".to_string(), name.clone()), + child_text.clone(), + ), + " ".to_string(), + ), + name.clone(), + ), + " = iota".to_string(), + ) + } else { + v2_rt::concat( + v2_rt::concat("\t".to_string(), name.clone()), + child_text.clone(), + ) + } + }); } -}); } __result }); -let consts_str = variant_consts.join(&"\n".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(type_decl, "\n\nconst (\n".to_string()), consts_str), "\n)".to_string()) -} + __result + }); + let consts_str = variant_consts.join(&"\n".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(type_decl, "\n\nconst (\n".to_string()), + consts_str, + ), + "\n)".to_string(), + ) + } } -} + } } pub fn emit_go_variant_struct(parent_name: &String, child: &Rc, env: &Rc) -> String { { - let struct_name = v2_rt::concat(parent_name.clone(), authored_name(env.clone(), child.clone())); -let marker_method = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Go).items.clone().func_keyword.clone(), " (".to_string()), struct_name.clone()), ") is".to_string()), parent_name.clone()), "() {}".to_string()); -if ((child.children.clone().len() as i64) == 0) { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Go).items.clone().type_alias_keyword.clone(), " ".to_string()), struct_name.clone()), " ".to_string()), language_spec(RenderTarget::Go).items.clone().struct_keyword.clone()), "{}\n\n".to_string()), marker_method) + let struct_name = v2_rt::concat( + parent_name.clone(), + authored_name(env.clone(), child.clone()), + ); + let marker_method = v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + language_spec(RenderTarget::Go) + .items + .clone() + .func_keyword + .clone(), + " (".to_string(), + ), + struct_name.clone(), + ), + ") is".to_string(), + ), + parent_name.clone(), + ), + "() {}".to_string(), + ); + if ((child.children.clone().len() as i64) == 0) { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + language_spec(RenderTarget::Go) + .items + .clone() + .type_alias_keyword + .clone(), + " ".to_string(), + ), + struct_name.clone(), + ), + " ".to_string(), + ), + language_spec(RenderTarget::Go) + .items + .clone() + .struct_keyword + .clone(), + ), + "{}\n\n".to_string(), + ), + marker_method, + ) } else { { - let field_lines = Rc::new({ let mut __result = Vec::new(); for f in child.children.clone().iter().cloned() { __result.push(emit_go_struct_field_from_child(&f, &env)); } __result }); -let fields_str = field_lines.join(&"\n".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Go).items.clone().type_alias_keyword.clone(), " ".to_string()), struct_name.clone()), " ".to_string()), language_spec(RenderTarget::Go).items.clone().struct_keyword.clone()), " {\n".to_string()), fields_str), "\n}\n\n".to_string()), marker_method) -} + let field_lines = Rc::new({ + let mut __result = Vec::new(); + for f in child.children.clone().iter().cloned() { + __result.push(emit_go_struct_field_from_child(&f, &env)); + } + __result + }); + let fields_str = field_lines.join(&"\n".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + language_spec(RenderTarget::Go) + .items + .clone() + .type_alias_keyword + .clone(), + " ".to_string(), + ), + struct_name.clone(), + ), + " ".to_string(), + ), + language_spec(RenderTarget::Go) + .items + .clone() + .struct_keyword + .clone(), + ), + " {\n".to_string(), + ), + fields_str, + ), + "\n}\n\n".to_string(), + ), + marker_method, + ) + } } -} + } } -pub fn emit_go_type_alias(name: String, base: Rc, source_indices: Rc>>) -> String { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Go).items.clone().type_alias_keyword.clone(), " ".to_string()), name), " = ".to_string()), emit_node_type(base, RenderTarget::Go, source_indices)) +pub fn emit_go_type_alias( + name: String, + base: Rc, + source_indices: Rc>>, +) -> String { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + language_spec(RenderTarget::Go) + .items + .clone() + .type_alias_keyword + .clone(), + " ".to_string(), + ), + name, + ), + " = ".to_string(), + ), + emit_node_type(base, RenderTarget::Go, source_indices), + ) } -pub fn emit_go_fn_def(name: &String, params: &Rc>>, inferred: Rc, body: &Rc, registry: &Rc>>, scope: &Rc) -> String { +pub fn emit_go_fn_def( + name: &String, + params: &Rc>>, + inferred: Rc, + body: &Rc, + registry: &Rc>>, + scope: &Rc, +) -> String { { let si = scope.type_env.clone().source_indices.clone(); -let params_str = emit_params_shared(params.clone(), &RenderTarget::Go, si.clone()); -let ret_str = emit_inferred_shared(&inferred, &RenderTarget::Go, si.clone()); -let body_scope = build_params_scope(&scope, params.clone()); -let use_tco = is_tco_eligible(&name, &body, registry.clone(), &si); -if use_tco { + let params_str = emit_params_shared(params.clone(), &RenderTarget::Go, si.clone()); + let ret_str = emit_inferred_shared(&inferred, &RenderTarget::Go, si.clone()); + let body_scope = build_params_scope(&scope, params.clone()); + let use_tco = is_tco_eligible(&name, &body, registry.clone(), &si); + if use_tco { { - let body_str = emit_tco_unified(body.clone(), &name, ¶ms, &RenderTarget::Go, ®istry, &body_scope, 1, |pat| emit_unified_pattern(pat.clone(), RenderTarget::Go, si.clone())); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Go).items.clone().func_keyword.clone(), " ".to_string()), go_export_ident(name.clone())), "(".to_string()), params_str), ")".to_string()), ret_str), " {\n".to_string()), body_str), "\n}".to_string()) -} + let body_str = emit_tco_unified( + body.clone(), + &name, + ¶ms, + &RenderTarget::Go, + ®istry, + &body_scope, + 1, + |pat| emit_unified_pattern(pat.clone(), RenderTarget::Go, si.clone()), + ); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + language_spec(RenderTarget::Go) + .items + .clone() + .func_keyword + .clone(), + " ".to_string(), + ), + go_export_ident(name.clone()), + ), + "(".to_string(), + ), + params_str, + ), + ")".to_string(), + ), + ret_str, + ), + " {\n".to_string(), + ), + body_str, + ), + "\n}".to_string(), + ) + } } else { { - let body_str = emit_go_typed_expr(body.clone(), registry.clone(), &body_scope, 1, 1024); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Go).items.clone().func_keyword.clone(), " ".to_string()), go_export_ident(name.clone())), "(".to_string()), params_str), ")".to_string()), ret_str), " {\n".to_string()), make_indent(1)), "return ".to_string()), body_str), "\n}".to_string()) -} + let body_str = + emit_go_typed_expr(body.clone(), registry.clone(), &body_scope, 1, 1024); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + language_spec(RenderTarget::Go) + .items + .clone() + .func_keyword + .clone(), + " ".to_string(), + ), + go_export_ident(name.clone()), + ), + "(".to_string(), + ), + params_str, + ), + ")".to_string(), + ), + ret_str, + ), + " {\n".to_string(), + ), + make_indent(1), + ), + "return ".to_string(), + ), + body_str, + ), + "\n}".to_string(), + ) + } } -} + } } -pub fn emit_go_func_def(name: &String, params: &Rc>>, inferred: Rc, uses: &Rc>>, body: Rc, registry: &Rc>>, scope: &Rc) -> String { +pub fn emit_go_func_def( + name: &String, + params: &Rc>>, + inferred: Rc, + uses: &Rc>>, + body: Rc, + registry: &Rc>>, + scope: &Rc, +) -> String { { let service_names = match lookup_item(registry.clone(), name.clone()) { - Some(info) => info.service_names.clone(), - None => Rc::new(vec![]), -}; -let params_str = emit_go_func_params(params.clone(), uses.clone(), service_names, scope.type_env.clone().source_indices.clone()); -let ret_type = emit_node_type(inferred, RenderTarget::Go, scope.type_env.clone().source_indices.clone()); -let body_scope = build_params_scope(&scope, params.clone()); -let si = scope.type_env.clone().source_indices.clone(); -let body_scope = uses.clone().iter().cloned().fold(body_scope.clone(), |s: Rc, u: Rc| extend_scope(&s, &resource_use_name_at(u.clone(), si.clone()), resource_use_resource(&u), Rc::new(SubValueRelation::SubValueUnknown))); -let body_str = emit_unified_typed_func_body(&body, &RenderTarget::Go, ®istry, &body_scope, 1); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Go).items.clone().func_keyword.clone(), " ".to_string()), go_export_ident(name.clone())), "(".to_string()), params_str), ") (".to_string()), ret_type), ", error) {\n".to_string()), body_str), "\n}".to_string()) -} + Some(info) => info.service_names.clone(), + None => Rc::new(vec![]), + }; + let params_str = emit_go_func_params( + params.clone(), + uses.clone(), + service_names, + scope.type_env.clone().source_indices.clone(), + ); + let ret_type = emit_node_type( + inferred, + RenderTarget::Go, + scope.type_env.clone().source_indices.clone(), + ); + let body_scope = build_params_scope(&scope, params.clone()); + let si = scope.type_env.clone().source_indices.clone(); + let body_scope = uses.clone().iter().cloned().fold( + body_scope.clone(), + |s: Rc, u: Rc| { + extend_scope( + &s, + &resource_use_name_at(u.clone(), si.clone()), + resource_use_resource(&u), + Rc::new(SubValueRelation::SubValueUnknown), + ) + }, + ); + let body_str = + emit_unified_typed_func_body(&body, &RenderTarget::Go, ®istry, &body_scope, 1); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + language_spec(RenderTarget::Go) + .items + .clone() + .func_keyword + .clone(), + " ".to_string(), + ), + go_export_ident(name.clone()), + ), + "(".to_string(), + ), + params_str, + ), + ") (".to_string(), + ), + ret_type, + ), + ", error) {\n".to_string(), + ), + body_str, + ), + "\n}".to_string(), + ) + } } -pub fn emit_go_func_params(params: Rc>>, uses: Rc>>, service_names: Rc>, source_indices: Rc>>) -> String { +pub fn emit_go_func_params( + params: Rc>>, + uses: Rc>>, + service_names: Rc>, + source_indices: Rc>>, +) -> String { { - let param_strs = Rc::new({ let mut __result = Vec::new(); for p in params.iter().cloned() { __result.push(emit_param_shared(&p, &RenderTarget::Go, &source_indices)); } __result }); -let resource_strs = Rc::new({ let mut __result = Vec::new(); for u in uses.iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(emit_ident(resource_use_name_at(u.clone(), source_indices.clone()), RenderTarget::Go), " ".to_string()), emit_node_type(resource_use_resource(&u), RenderTarget::Go, source_indices.clone()))); } __result }); -let service_strs = Rc::new({ let mut __result = Vec::new(); for sn in service_names.iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(service_var_name(sn.clone()), " *".to_string()), sanitize_service_name(sn.clone()))); } __result }); -let all_params = v2_rt::concat(v2_rt::concat(param_strs, resource_strs), service_strs); -all_params.join(&", ".to_string()) -} + let param_strs = Rc::new({ + let mut __result = Vec::new(); + for p in params.iter().cloned() { + __result.push(emit_param_shared(&p, &RenderTarget::Go, &source_indices)); + } + __result + }); + let resource_strs = Rc::new({ + let mut __result = Vec::new(); + for u in uses.iter().cloned() { + __result.push(v2_rt::concat( + v2_rt::concat( + emit_ident( + resource_use_name_at(u.clone(), source_indices.clone()), + RenderTarget::Go, + ), + " ".to_string(), + ), + emit_node_type( + resource_use_resource(&u), + RenderTarget::Go, + source_indices.clone(), + ), + )); + } + __result + }); + let service_strs = Rc::new({ + let mut __result = Vec::new(); + for sn in service_names.iter().cloned() { + __result.push(v2_rt::concat( + v2_rt::concat(service_var_name(sn.clone()), " *".to_string()), + sanitize_service_name(sn.clone()), + )); + } + __result + }); + let all_params = v2_rt::concat(v2_rt::concat(param_strs, resource_strs), service_strs); + all_params.join(&", ".to_string()) + } } -pub fn emit_go_typed_expr(texpr: Rc, registry: Rc>>, scope: &Rc, depth: i64, fuel: i64) -> String { - emit_unified_typed_expr(texpr, &RenderTarget::Go, registry, &scope, depth, fuel, |pat| emit_unified_pattern(pat.clone(), RenderTarget::Go, scope.type_env.clone().source_indices.clone())) +pub fn emit_go_typed_expr( + texpr: Rc, + registry: Rc>>, + scope: &Rc, + depth: i64, + fuel: i64, +) -> String { + emit_unified_typed_expr( + texpr, + &RenderTarget::Go, + registry, + &scope, + depth, + fuel, + |pat| { + emit_unified_pattern( + pat.clone(), + RenderTarget::Go, + scope.type_env.clone().source_indices.clone(), + ) + }, + ) } -pub fn emit_go_transport_body(transport: Rc, op_name: String, source_indices: Rc>>, depth: i64) -> String { - emit_unified_transport_dispatch(&transport, op_name, &source_indices, depth, RenderTarget::Go, |n, t, d, si| emit_go_rest_call(n.clone(), &t, d.clone(), &si), |n, t, d, si| emit_go_shell_call(n.clone(), t.clone(), d.clone(), &si), |n, d| emit_go_file_call(n.clone(), d.clone()), |n, d| emit_go_local_call(n.clone(), d.clone())) +pub fn emit_go_transport_body( + transport: Rc, + op_name: String, + source_indices: Rc>>, + depth: i64, +) -> String { + emit_unified_transport_dispatch( + &transport, + op_name, + &source_indices, + depth, + RenderTarget::Go, + |n, t, d, si| emit_go_rest_call(n.clone(), &t, d.clone(), &si), + |n, t, d, si| emit_go_shell_call(n.clone(), t.clone(), d.clone(), &si), + |n, d| emit_go_file_call(n.clone(), d.clone()), + |n, d| emit_go_local_call(n.clone(), d.clone()), + ) } -pub fn emit_go_service_def(item: Rc, registry: Rc>>, env: Rc) -> String { - emit_unified_service_def(&item, &RenderTarget::Go, registry, &env, |name, transport, ops, si| emit_go_service_struct(name.clone(), transport.clone(), ops.clone(), si.clone()), |transport, op_name, si, depth| emit_go_transport_body(transport.clone(), op_name.clone(), si.clone(), depth.clone())) +pub fn emit_go_service_def( + item: Rc, + registry: Rc>>, + env: Rc, +) -> String { + emit_unified_service_def( + &item, + &RenderTarget::Go, + registry, + &env, + |name, transport, ops, si| { + emit_go_service_struct(name.clone(), transport.clone(), ops.clone(), si.clone()) + }, + |transport, op_name, si, depth| { + emit_go_transport_body( + transport.clone(), + op_name.clone(), + si.clone(), + depth.clone(), + ) + }, + ) } -pub fn emit_go_service_struct(name: String, fallback_transport: Rc, op_children: Rc>>, source_indices: Rc>>) -> String { +pub fn emit_go_service_struct( + name: String, + fallback_transport: Rc, + op_children: Rc>>, + source_indices: Rc>>, +) -> String { { let fs = compute_service_fields(&fallback_transport, &op_children, &source_indices); -let decls = service_field_decls(&fs, &language_spec(RenderTarget::Go).service_fields.clone()); -if ((decls.clone().len() as i64) == 0) { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Go).items.clone().type_alias_keyword.clone(), " ".to_string()), name), " ".to_string()), language_spec(RenderTarget::Go).items.clone().struct_keyword.clone()), "{}".to_string()) + let decls = + service_field_decls(&fs, &language_spec(RenderTarget::Go).service_fields.clone()); + if ((decls.clone().len() as i64) == 0) { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + language_spec(RenderTarget::Go) + .items + .clone() + .type_alias_keyword + .clone(), + " ".to_string(), + ), + name, + ), + " ".to_string(), + ), + language_spec(RenderTarget::Go) + .items + .clone() + .struct_keyword + .clone(), + ), + "{}".to_string(), + ) } else { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Go).items.clone().type_alias_keyword.clone(), " ".to_string()), name), " ".to_string()), language_spec(RenderTarget::Go).items.clone().struct_keyword.clone()), " {\n".to_string()), decls.clone().join(&"\n".to_string())), "\n}".to_string()) + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + language_spec(RenderTarget::Go) + .items + .clone() + .type_alias_keyword + .clone(), + " ".to_string(), + ), + name, + ), + " ".to_string(), + ), + language_spec(RenderTarget::Go) + .items + .clone() + .struct_keyword + .clone(), + ), + " {\n".to_string(), + ), + decls.clone().join(&"\n".to_string()), + ), + "\n}".to_string(), + ) } -} + } } -pub fn emit_go_rest_call(op_name: String, transport: &Rc, depth: i64, source_indices: &Rc>>) -> String { +pub fn emit_go_rest_call( + op_name: String, + transport: &Rc, + depth: i64, + source_indices: &Rc>>, +) -> String { { let prefix = make_indent(depth); -let url_line = v2_rt::concat(v2_rt::concat(v2_rt::concat(prefix.clone(), "url := fmt.Sprintf(\"%s/".to_string()), to_snake(op_name)), "\", c.BaseURL)".to_string()); -let body_line = v2_rt::concat(prefix.clone(), "reqBody := bytes.NewBuffer(nil)".to_string()); -let req_line = v2_rt::concat(v2_rt::concat(prefix.clone(), "req, err := http.NewRequest(\"POST\", url, reqBody)\n".to_string()), "if err != nil {\n\treturn nil, fmt.Errorf(\"creating request: %w\", err)\n}".to_string()); -let auth_line = if transport_has_auth(transport.clone(), source_indices.clone()) { + let url_line = v2_rt::concat( + v2_rt::concat( + v2_rt::concat(prefix.clone(), "url := fmt.Sprintf(\"%s/".to_string()), + to_snake(op_name), + ), + "\", c.BaseURL)".to_string(), + ); + let body_line = v2_rt::concat( + prefix.clone(), + "reqBody := bytes.NewBuffer(nil)".to_string(), + ); + let req_line = v2_rt::concat( + v2_rt::concat( + prefix.clone(), + "req, err := http.NewRequest(\"POST\", url, reqBody)\n".to_string(), + ), + "if err != nil {\n\treturn nil, fmt.Errorf(\"creating request: %w\", err)\n}" + .to_string(), + ); + let auth_line = if transport_has_auth(transport.clone(), source_indices.clone()) { { - let header_name = match transport_auth_header_name(transport.clone(), source_indices.clone()) { - Some(h) => h.clone(), - None => "Authorization".to_string(), -}; -v2_rt::concat(v2_rt::concat(v2_rt::concat(prefix.clone(), "req.Header.Set(\"".to_string()), header_name), "\", c.AuthToken)".to_string()) -} + let header_name = + match transport_auth_header_name(transport.clone(), source_indices.clone()) { + Some(h) => h.clone(), + None => "Authorization".to_string(), + }; + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(prefix.clone(), "req.Header.Set(\"".to_string()), + header_name, + ), + "\", c.AuthToken)".to_string(), + ) + } } else { "".to_string() }; -let hdrs = transport_headers(transport.clone(), source_indices.clone()); -let header_lines = Rc::new({ let mut __result = Vec::new(); for h in hdrs.iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(prefix.clone(), "req.Header.Set(\"".to_string()), field_init_node_name_at(h.clone(), source_indices.clone())), "\", ".to_string()), emit_simple_expr(&field_init_node_value(&h), &RenderTarget::Go, &source_indices)), ")".to_string())); } __result }); -let send_lines = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(prefix.clone(), "resp, err := http.DefaultClient.Do(req)\n".to_string()), "if err != nil {\n\treturn nil, fmt.Errorf(\"sending request: %w\", err)\n}\n".to_string()), "defer resp.Body.Close()\n".to_string()), "body, err := io.ReadAll(resp.Body)\n".to_string()), "if err != nil {\n\treturn nil, fmt.Errorf(\"reading response: %w\", err)\n}\n".to_string()), "var result interface{}\n".to_string()), "if err := json.Unmarshal(body, &result); err != nil {\n".to_string()), "\treturn nil, fmt.Errorf(\"decoding response: %w\", err)\n}\n".to_string()), "return result, nil".to_string()); -let all_lines = v2_rt::concat(v2_rt::concat(v2_rt::concat(Rc::new(vec![url_line, body_line, req_line]), if (auth_line.clone().as_str() == "".to_string().as_str()) { - Rc::new(vec![]) - } else { - Rc::new(vec![auth_line.clone()]) - }), header_lines), Rc::new(vec![send_lines])); -all_lines.join(&"\n".to_string()) -} + let hdrs = transport_headers(transport.clone(), source_indices.clone()); + let header_lines = Rc::new({ + let mut __result = Vec::new(); + for h in hdrs.iter().cloned() { + __result.push(v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(prefix.clone(), "req.Header.Set(\"".to_string()), + field_init_node_name_at(h.clone(), source_indices.clone()), + ), + "\", ".to_string(), + ), + emit_simple_expr( + &field_init_node_value(&h), + &RenderTarget::Go, + &source_indices, + ), + ), + ")".to_string(), + )); + } + __result + }); + let send_lines = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(prefix.clone(), "resp, err := http.DefaultClient.Do(req)\n".to_string()), "if err != nil {\n\treturn nil, fmt.Errorf(\"sending request: %w\", err)\n}\n".to_string()), "defer resp.Body.Close()\n".to_string()), "body, err := io.ReadAll(resp.Body)\n".to_string()), "if err != nil {\n\treturn nil, fmt.Errorf(\"reading response: %w\", err)\n}\n".to_string()), "var result interface{}\n".to_string()), "if err := json.Unmarshal(body, &result); err != nil {\n".to_string()), "\treturn nil, fmt.Errorf(\"decoding response: %w\", err)\n}\n".to_string()), "return result, nil".to_string()); + let all_lines = v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + Rc::new(vec![url_line, body_line, req_line]), + if (auth_line.clone().as_str() == "".to_string().as_str()) { + Rc::new(vec![]) + } else { + Rc::new(vec![auth_line.clone()]) + }, + ), + header_lines, + ), + Rc::new(vec![send_lines]), + ); + all_lines.join(&"\n".to_string()) + } } -pub fn emit_go_shell_call(op_name: String, transport: Rc, depth: i64, source_indices: &Rc>>) -> String { +pub fn emit_go_shell_call( + op_name: String, + transport: Rc, + depth: i64, + source_indices: &Rc>>, +) -> String { { let prefix = make_indent(depth); -let cmd_line = v2_rt::concat(v2_rt::concat(v2_rt::concat(prefix.clone(), "cmd := exec.Command(\"".to_string()), to_snake(op_name)), "\")".to_string()); -let dir_line = v2_rt::concat(prefix.clone(), "cmd.Dir = c.WorkingDir".to_string()); -let envs = transport_env(transport, source_indices.clone()); -let env_lines = Rc::new({ let mut __result = Vec::new(); for e in envs.iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(prefix.clone(), "cmd.Env = append(cmd.Env, \"".to_string()), field_init_node_name_at(e.clone(), source_indices.clone())), "=\" + ".to_string()), emit_simple_expr(&field_init_node_value(&e), &RenderTarget::Go, &source_indices)), ")".to_string())); } __result }); -let run_lines = v2_rt::concat(v2_rt::concat(v2_rt::concat(prefix.clone(), "output, err := cmd.Output()\n".to_string()), "if err != nil {\n\treturn \"\", fmt.Errorf(\"running command: %w\", err)\n}\n".to_string()), "return string(output), nil".to_string()); -let all_lines = v2_rt::concat(v2_rt::concat(Rc::new(vec![cmd_line, dir_line]), env_lines), Rc::new(vec![run_lines])); -all_lines.join(&"\n".to_string()) -} + let cmd_line = v2_rt::concat( + v2_rt::concat( + v2_rt::concat(prefix.clone(), "cmd := exec.Command(\"".to_string()), + to_snake(op_name), + ), + "\")".to_string(), + ); + let dir_line = v2_rt::concat(prefix.clone(), "cmd.Dir = c.WorkingDir".to_string()); + let envs = transport_env(transport, source_indices.clone()); + let env_lines = Rc::new({ + let mut __result = Vec::new(); + for e in envs.iter().cloned() { + __result.push(v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + prefix.clone(), + "cmd.Env = append(cmd.Env, \"".to_string(), + ), + field_init_node_name_at(e.clone(), source_indices.clone()), + ), + "=\" + ".to_string(), + ), + emit_simple_expr( + &field_init_node_value(&e), + &RenderTarget::Go, + &source_indices, + ), + ), + ")".to_string(), + )); + } + __result + }); + let run_lines = v2_rt::concat( + v2_rt::concat( + v2_rt::concat(prefix.clone(), "output, err := cmd.Output()\n".to_string()), + "if err != nil {\n\treturn \"\", fmt.Errorf(\"running command: %w\", err)\n}\n" + .to_string(), + ), + "return string(output), nil".to_string(), + ); + let all_lines = v2_rt::concat( + v2_rt::concat(Rc::new(vec![cmd_line, dir_line]), env_lines), + Rc::new(vec![run_lines]), + ); + all_lines.join(&"\n".to_string()) + } } pub fn emit_go_file_call(op_name: String, depth: i64) -> String { { let prefix = make_indent(depth); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(prefix, "path := fmt.Sprintf(\"%s/".to_string()), to_snake(op_name)), "\", c.BasePath)\n".to_string()), "data, err := os.ReadFile(path)\n".to_string()), "if err != nil {\n\treturn \"\", fmt.Errorf(\"reading file: %w\", err)\n}\n".to_string()), "return string(data), nil".to_string()) -} + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(prefix, "path := fmt.Sprintf(\"%s/".to_string()), + to_snake(op_name), + ), + "\", c.BasePath)\n".to_string(), + ), + "data, err := os.ReadFile(path)\n".to_string(), + ), + "if err != nil {\n\treturn \"\", fmt.Errorf(\"reading file: %w\", err)\n}\n" + .to_string(), + ), + "return string(data), nil".to_string(), + ) + } } pub fn emit_go_local_call(op_name: String, depth: i64) -> String { { let prefix = make_indent(depth); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(prefix, "// Local binding -- direct function call\n".to_string()), "return ".to_string()), go_export_ident(op_name)), "(), nil".to_string()) -} + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + prefix, + "// Local binding -- direct function call\n".to_string(), + ), + "return ".to_string(), + ), + go_export_ident(op_name), + ), + "(), nil".to_string(), + ) + } } pub fn emit_go_resource_def(item: &Rc, env: &Rc) -> String { { let item_text = authored_name(env.clone(), item.clone()); -let cap_children = Rc::new({ let mut __result = Vec::new(); for c in item.children.clone().iter().cloned() { if ((c.params.clone().len() as i64) > 0) { __result.push(c); } } __result }); -let methods = Rc::new({ let mut __result = Vec::new(); for c in cap_children.iter().cloned() { __result.push(emit_go_capability_method(&c, 1, &env)); } __result }); -let methods_str = methods.join(&"\n".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Go).items.clone().type_alias_keyword.clone(), " ".to_string()), item_text), " interface {\n".to_string()), methods_str), "\n}".to_string()) -} + let cap_children = Rc::new({ + let mut __result = Vec::new(); + for c in item.children.clone().iter().cloned() { + if ((c.params.clone().len() as i64) > 0) { + __result.push(c); + } + } + __result + }); + let methods = Rc::new({ + let mut __result = Vec::new(); + for c in cap_children.iter().cloned() { + __result.push(emit_go_capability_method(&c, 1, &env)); + } + __result + }); + let methods_str = methods.join(&"\n".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + language_spec(RenderTarget::Go) + .items + .clone() + .type_alias_keyword + .clone(), + " ".to_string(), + ), + item_text, + ), + " interface {\n".to_string(), + ), + methods_str, + ), + "\n}".to_string(), + ) + } } pub fn emit_go_capability_method(cap_node: &Rc, depth: i64, env: &Rc) -> String { { - let input_params = Rc::new({ let mut __result = Vec::new(); for p in cap_node.params.clone().iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(emit_ident(param_node_name_at(p.clone(), env.source_indices.clone()), RenderTarget::Go), " ".to_string()), emit_node_type(param_node_type_expr(&p), RenderTarget::Go, env.source_indices.clone()))); } __result }); -let params_str = input_params.join(&", ".to_string()); -let ret = emit_node_type(resolved_type(cap_node.clone()), RenderTarget::Go, env.source_indices.clone()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(make_indent(depth), go_export_ident(authored_name(env.clone(), cap_node.clone()))), "(".to_string()), params_str), ") (".to_string()), ret), ", error)".to_string()) -} + let input_params = Rc::new({ + let mut __result = Vec::new(); + for p in cap_node.params.clone().iter().cloned() { + __result.push(v2_rt::concat( + v2_rt::concat( + emit_ident( + param_node_name_at(p.clone(), env.source_indices.clone()), + RenderTarget::Go, + ), + " ".to_string(), + ), + emit_node_type( + param_node_type_expr(&p), + RenderTarget::Go, + env.source_indices.clone(), + ), + )); + } + __result + }); + let params_str = input_params.join(&", ".to_string()); + let ret = emit_node_type( + resolved_type(cap_node.clone()), + RenderTarget::Go, + env.source_indices.clone(), + ); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + make_indent(depth), + go_export_ident(authored_name(env.clone(), cap_node.clone())), + ), + "(".to_string(), + ), + params_str, + ), + ") (".to_string(), + ), + ret, + ), + ", error)".to_string(), + ) + } } -pub fn emit_go_data_def(name: String, type_node: Rc, value: Rc, registry: Rc>>, scope: &Rc, depth: i64) -> String { +pub fn emit_go_data_def( + name: String, + type_node: Rc, + value: Rc, + registry: Rc>>, + scope: &Rc, + depth: i64, +) -> String { { - let ty_str = emit_node_type(type_node, RenderTarget::Go, scope.type_env.clone().source_indices.clone()); -let val_str = emit_go_typed_expr(value, registry, &scope, depth, 1024); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("var ".to_string(), go_export_ident(name)), " ".to_string()), ty_str), " = ".to_string()), val_str) -} + let ty_str = emit_node_type( + type_node, + RenderTarget::Go, + scope.type_env.clone().source_indices.clone(), + ); + let val_str = emit_go_typed_expr(value, registry, &scope, depth, 1024); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("var ".to_string(), go_export_ident(name)), + " ".to_string(), + ), + ty_str, + ), + " = ".to_string(), + ), + val_str, + ) + } } pub fn go_export_ident(name: String) -> String { match (*language_spec(RenderTarget::Go).visibility.clone()).clone() { - VisibilitySpec::CaseVisibility { export_case: ec, .. } => { - let result = apply_naming_case(name, ec.clone()); -if { let mut __found = false; for r in go_reserved().iter().cloned() { if (r.clone().as_str() == result.clone().as_str()) { __found = true; break; } } __found } { - v2_rt::concat(result.clone(), go_reserved_escape_suffix()) - } else { - result.clone() + VisibilitySpec::CaseVisibility { + export_case: ec, .. + } => { + let result = apply_naming_case(name, ec.clone()); + if { + let mut __found = false; + for r in go_reserved().iter().cloned() { + if (r.clone().as_str() == result.clone().as_str()) { + __found = true; + break; + } + } + __found + } { + v2_rt::concat(result.clone(), go_reserved_escape_suffix()) + } else { + result.clone() + } } -}, - _ => "__GO_VISIBILITY_SPEC_MISMATCH__".to_string(), -} + _ => "__GO_VISIBILITY_SPEC_MISMATCH__".to_string(), + } } diff --git a/src/v2/stage0/src/v2_compiler_emit_python.rs b/src/v2/stage0/src/v2_compiler_emit_python.rs index 280d452ed08..3ca12b846ae 100644 --- a/src/v2/stage0/src/v2_compiler_emit_python.rs +++ b/src/v2/stage0/src/v2_compiler_emit_python.rs @@ -1,229 +1,615 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.emit_python -use std::collections::HashMap; -use std::rc::Rc; +pub use crate::std_induction::SubValueRelation; +use crate::std_induction::SubValueRelation::SubValueUnknown; +pub use crate::v2_compiler_artifact::RenderTarget; +use crate::v2_compiler_artifact::RenderTarget::Python; +pub use crate::v2_compiler_emit::{ + apply_named_template, apply_type_template1, apply_type_template2, apply_type_template3, + capitalize_first, compute_service_fields, effective_operation_transport, + emit_algebra_method_template, emit_bin_op_symbol, emit_container, emit_default_bin_op, + emit_error_expr, emit_expr_field_access_shared, emit_expr_var_shared, emit_ident, + emit_inferred_shared, emit_keyword, emit_lambda, emit_lambda_params, emit_let_binding, + emit_list_lit_expr, emit_literal, emit_map_type, emit_node_type, emit_null_coalesce, + emit_param_shared, emit_params_shared, emit_return, emit_shared_expr, emit_simple_expr, + emit_string_literal, emit_tco_unified, emit_typed_block_join, emit_typed_call_unified, + emit_typed_cast_shared, emit_typed_first_arg_shared, emit_typed_for_each_shared, + emit_typed_if_shared, emit_typed_index_shared, emit_typed_let_shared, emit_typed_match_unified, + emit_typed_method_call_unified, emit_typed_record_lit_unified, emit_typed_slice_shared, + emit_typed_string_interp_unified, emit_unary_op, emit_unified_init_block_stmts, + emit_unified_operation_method, emit_unified_pattern, emit_unified_service_def, + emit_unified_transport_dispatch, emit_unified_typed_expr, emit_unified_typed_func_body, + empty_emit_scope, escape_json_string, escape_python_interp_text, escape_string_literal_body, + extract_string_interp_parts, extract_test_projections, has_nested_records_node, + has_service_items, is_data_def_item, is_function_item, is_null_coalesce, is_resource_def_item, + is_service_def_item, is_service_item, is_tco_eligible, is_type_alias_item, + is_type_alias_return_node, is_type_decl_item, is_type_def_item, is_upper, language_spec, + lookup_item, make_indent, module_emit_scope, module_to_filename, order_typed_call_args, + sanitize_service_name, scope_after_expr, seed_bindings, service_fallback_transport, + service_field_ctors, service_field_decls, service_var_name, test_file_path, test_function_name, + to_lower_char, to_screaming_snake, to_snake, to_string, to_string_helper, to_upper_char, + typed_named_arg_matches, unique_strings, BlockEmitState, EmitResult, InterpPart, + ServiceFieldSet, TestProjection, +}; +pub use crate::v2_compiler_infer::{build_params_scope, expr_span, extend_scope, InferScope}; +pub use crate::v2_compiler_infer_env::{authored_name, TypeBinding, TypeEnv}; +pub use crate::v2_compiler_infer_items::{ItemInfo, ResolvedGraph, TypedModule}; +pub use crate::v2_compiler_infer_service::{ + extract_typed_service_name, is_typed_service_call_receiver, +}; +pub use crate::v2_compiler_infer_sigs::{ResolvedFuncEnv, ResolvedFuncSig}; +pub use crate::v2_compiler_infer_types::{ + node_is_keyed_collection, normalize_access_type_node, resolved_type, +}; +pub use crate::v2_compiler_languages::{ + is_string_like, scaffold_for_target, serialization_for_target, test_conventions_for_target, + ItemKeywords, TestConventions, +}; use crate::v2_rt; -use crate::NonEmptyVec; -use crate::NonEmptyBTreeSet; -pub use crate::v2_std_core::{Node, InferredNode, VarBindingKind, import_is_all, import_specific_names_at, module_imports, module_items, param_node_type_expr, authored_name_at, NewlineIndex, expr_var_name_at, expr_call_func_at, expr_method_name_at, let_binding_name_at, param_node_name_at, resource_use_name_at, MatchPattern, LiteralValue, TextFile, SourceSpan, resource_use_resource, BinOp, UnaryOpKind, StringPart, DeclaredFuncSig, transport_has_auth, transport_auth_header_name, transport_headers, transport_env, ExprData, make_expr_node, MethodSemantics, FieldSummary, arg_value, arm_body, arm_pattern, arm_guard, field_init_node_name_at, field_init_node_value, if_condition, if_then_branch, if_else_branch, match_scrutinee, match_arm_nodes, let_value, let_body, field_access_base, field_access_field_at, method_receiver, expr_field_access_summary, expr_method_call_semantics, record_lit_type_name_at, lambda_body, cast_expr, cast_target, return_value, foreach_variable_at, foreach_collection, foreach_body, method_arg_nodes, index_base, index_expr, slice_base, slice_start, slice_end, with_required_cardinality, Connective, is_rest_transport, is_shell_transport, is_file_transport, FieldAccessStyle, Cardinality}; -use crate::v2_std_core::InferredNode::{Resolved, CompilerError}; -use crate::v2_std_core::VarBindingKind::{FunctionValueBinding}; -use crate::v2_std_core::BinOp::{NullCoalesce}; -use crate::v2_std_core::ExprData::{NoExprData, ExprLiteral, ExprError, ExprVar, ExprFieldAccess, ExprCall, ExprMethodCall, ExprMatch, ExprIf, ExprLet, ExprRecordLit, ExprListLit, ExprBinOp, ExprUnaryOp, ExprLambda, ExprStringInterp, ExprBlock, ExprCast, ExprForEach, ExprIndex, ExprSlice, ExprReturn}; -use crate::v2_std_core::MethodSemantics::{PlainMethodSemantics, AlgebraMethodSemantics, ServiceMethodSemantics}; -use crate::v2_std_core::FieldAccessStyle::{TupleFirst, TupleSecond}; -use crate::v2_std_core::StringPart::{Text, Interpolation}; +use crate::v2_std_core::BinOp::NullCoalesce; +use crate::v2_std_core::Cardinality::CardOptional; use crate::v2_std_core::Connective::{Conj, Disj}; -use crate::v2_std_core::Cardinality::{CardOptional}; -use crate::v2_std_core::MatchPattern::*; +use crate::v2_std_core::ExprData::{ + ExprBinOp, ExprBlock, ExprCall, ExprCast, ExprError, ExprFieldAccess, ExprForEach, ExprIf, + ExprIndex, ExprLambda, ExprLet, ExprListLit, ExprLiteral, ExprMatch, ExprMethodCall, + ExprRecordLit, ExprReturn, ExprSlice, ExprStringInterp, ExprUnaryOp, ExprVar, NoExprData, +}; +use crate::v2_std_core::FieldAccessStyle::{TupleFirst, TupleSecond}; +use crate::v2_std_core::InferredNode::{CompilerError, Resolved}; use crate::v2_std_core::LiteralValue::*; +use crate::v2_std_core::MatchPattern::*; +use crate::v2_std_core::MethodSemantics::{ + AlgebraMethodSemantics, PlainMethodSemantics, ServiceMethodSemantics, +}; +use crate::v2_std_core::StringPart::{Interpolation, Text}; use crate::v2_std_core::UnaryOpKind::*; -pub use crate::v2_compiler_artifact::{RenderTarget}; -use crate::v2_compiler_artifact::RenderTarget::{Python}; -pub use crate::v2_compiler_languages::{scaffold_for_target, serialization_for_target, TestConventions, ItemKeywords, test_conventions_for_target, is_string_like}; -pub use crate::v2_compiler_infer_env::{TypeEnv, TypeBinding, authored_name}; -pub use crate::v2_compiler_infer_types::{resolved_type, normalize_access_type_node, node_is_keyed_collection}; -pub use crate::v2_compiler_infer_sigs::{ResolvedFuncSig, ResolvedFuncEnv}; -pub use crate::v2_compiler_infer_items::{ResolvedGraph, TypedModule, ItemInfo}; -pub use crate::v2_compiler_infer_service::{is_typed_service_call_receiver, extract_typed_service_name}; -pub use crate::v2_compiler_infer::{InferScope, build_params_scope, extend_scope, expr_span}; -pub use crate::std_induction::{SubValueRelation}; -use crate::std_induction::SubValueRelation::{SubValueUnknown}; -pub use crate::v2_compiler_emit::{EmitResult, BlockEmitState, InterpPart, TestProjection, emit_literal, emit_bin_op_symbol, emit_keyword, emit_container, emit_map_type, emit_node_type, emit_ident, emit_let_binding, emit_simple_expr, emit_unary_op, emit_lambda, emit_error_expr, emit_return, emit_lambda_params, emit_list_lit_expr, emit_shared_expr, emit_default_bin_op, emit_string_literal, escape_python_interp_text, escape_string_literal_body, empty_emit_scope, module_emit_scope, scope_after_expr, lookup_item, typed_named_arg_matches, order_typed_call_args, unique_strings, has_nested_records_node, escape_json_string, module_to_filename, make_indent, to_string, to_string_helper, to_snake, to_screaming_snake, is_upper, to_lower_char, to_upper_char, capitalize_first, sanitize_service_name, service_var_name, test_function_name, apply_type_template1, apply_type_template2, apply_type_template3, apply_named_template, language_spec, is_null_coalesce, emit_null_coalesce, is_type_alias_return_node, is_service_item, has_service_items, is_type_def_item, is_type_alias_item, is_type_decl_item, is_function_item, is_data_def_item, is_service_def_item, is_resource_def_item, extract_test_projections, is_tco_eligible, service_fallback_transport, effective_operation_transport, ServiceFieldSet, compute_service_fields, service_field_decls, service_field_ctors, seed_bindings, emit_expr_var_shared, emit_expr_field_access_shared, extract_string_interp_parts, emit_typed_cast_shared, emit_typed_for_each_shared, emit_typed_index_shared, emit_typed_slice_shared, emit_unified_init_block_stmts, emit_typed_if_shared, emit_typed_let_shared, emit_param_shared, emit_params_shared, emit_inferred_shared, emit_typed_block_join, emit_typed_first_arg_shared, emit_algebra_method_template, emit_typed_string_interp_unified, emit_typed_record_lit_unified, emit_typed_call_unified, emit_typed_method_call_unified, emit_typed_match_unified, emit_unified_typed_expr, emit_tco_unified, emit_unified_pattern, test_file_path, emit_unified_typed_func_body, emit_unified_service_def, emit_unified_operation_method, emit_unified_transport_dispatch}; +use crate::v2_std_core::VarBindingKind::FunctionValueBinding; +pub use crate::v2_std_core::{ + arg_value, arm_body, arm_guard, arm_pattern, authored_name_at, cast_expr, cast_target, + expr_call_func_at, expr_field_access_summary, expr_method_call_semantics, expr_method_name_at, + expr_var_name_at, field_access_base, field_access_field_at, field_init_node_name_at, + field_init_node_value, foreach_body, foreach_collection, foreach_variable_at, if_condition, + if_else_branch, if_then_branch, import_is_all, import_specific_names_at, index_base, + index_expr, is_file_transport, is_rest_transport, is_shell_transport, lambda_body, + let_binding_name_at, let_body, let_value, make_expr_node, match_arm_nodes, match_scrutinee, + method_arg_nodes, method_receiver, module_imports, module_items, param_node_name_at, + param_node_type_expr, record_lit_type_name_at, resource_use_name_at, resource_use_resource, + return_value, slice_base, slice_end, slice_start, transport_auth_header_name, transport_env, + transport_has_auth, transport_headers, with_required_cardinality, BinOp, Cardinality, + Connective, DeclaredFuncSig, ExprData, FieldAccessStyle, FieldSummary, InferredNode, + LiteralValue, MatchPattern, MethodSemantics, NewlineIndex, Node, SourceSpan, StringPart, + TextFile, UnaryOpKind, VarBindingKind, +}; +use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; pub fn emit_python(typed: &Rc) -> Rc { { let registry = typed.item_registry.clone(); -let test_projections = extract_test_projections(typed.clone()); -let module_files = Rc::new({ let mut __result = Vec::new(); for tm in typed.modules.clone().iter().cloned() { __result.push(emit_py_module(&tm, registry.clone())); } __result }); -let test_files = Rc::new({ let mut __result = Vec::new(); for f in Rc::new({ let mut __result = Vec::new(); for tm in typed.modules.clone().iter().cloned() { __result.push(emit_py_test_file(&authored_name_at(tm.type_env.clone().source_indices.clone(), &tm.module.clone()), &Rc::new({ let mut __result = Vec::new(); for p in test_projections.clone().iter().cloned() { if (p.module_name.clone().as_str() == authored_name_at(tm.type_env.clone().source_indices.clone(), &tm.module.clone()).as_str()) { __result.push(p); } } __result }))); } __result }).iter().cloned() { if (f.path.clone().as_str() != "".to_string().as_str()) { __result.push(f); } } __result }); -let init_file = emit_init_py(typed.modules.clone()); -let requirements = emit_requirements_txt(has_service_items(typed.clone())); -let files = v2_rt::concat(v2_rt::concat(Rc::new(vec![requirements, init_file]), module_files), test_files); -Rc::new(EmitResult { - files: files, - diagnostics: Rc::new(vec![]), -}) -} + let test_projections = extract_test_projections(typed.clone()); + let module_files = Rc::new({ + let mut __result = Vec::new(); + for tm in typed.modules.clone().iter().cloned() { + __result.push(emit_py_module(&tm, registry.clone())); + } + __result + }); + let test_files = Rc::new({ + let mut __result = Vec::new(); + for f in Rc::new({ + let mut __result = Vec::new(); + for tm in typed.modules.clone().iter().cloned() { + __result.push(emit_py_test_file( + &authored_name_at( + tm.type_env.clone().source_indices.clone(), + &tm.module.clone(), + ), + &Rc::new({ + let mut __result = Vec::new(); + for p in test_projections.clone().iter().cloned() { + if (p.module_name.clone().as_str() + == authored_name_at( + tm.type_env.clone().source_indices.clone(), + &tm.module.clone(), + ) + .as_str()) + { + __result.push(p); + } + } + __result + }), + )); + } + __result + }) + .iter() + .cloned() + { + if (f.path.clone().as_str() != "".to_string().as_str()) { + __result.push(f); + } + } + __result + }); + let init_file = emit_init_py(typed.modules.clone()); + let requirements = emit_requirements_txt(has_service_items(typed.clone())); + let files = v2_rt::concat( + v2_rt::concat(Rc::new(vec![requirements, init_file]), module_files), + test_files, + ); + Rc::new(EmitResult { + files: files, + diagnostics: Rc::new(vec![]), + }) + } } pub fn py_derive_attribute() -> String { - match serialization_for_target(RenderTarget::Python).derive_attribute.clone() { - Some(attr) => attr.clone(), - None => "@dataclass".to_string(), -} + match serialization_for_target(RenderTarget::Python) + .derive_attribute + .clone() + { + Some(attr) => attr.clone(), + None => "@dataclass".to_string(), + } } pub fn py_default_value() -> String { - match serialization_for_target(RenderTarget::Python).default_value.clone() { - Some(value) => value.clone(), - None => "None".to_string(), -} + match serialization_for_target(RenderTarget::Python) + .default_value + .clone() + { + Some(value) => value.clone(), + None => "None".to_string(), + } } pub fn emit_init_py(modules: Rc>>) -> Rc { { - let import_lines = Rc::new({ let mut __result = Vec::new(); for tm in modules.iter().cloned() { __result.push({ - let mod_name = module_to_filename(authored_name_at(tm.type_env.clone().source_indices.clone(), &tm.module.clone())); -let items = language_spec(RenderTarget::Python).items.clone(); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(items.import_from_keyword.clone(), " . ".to_string()), items.import_keyword.clone()), " ".to_string()), mod_name.clone()) -}); } __result }); -let content = v2_rt::concat(v2_rt::concat("# Generated by v2 compiler -- do not edit.\n\n".to_string(), import_lines.join(&"\n".to_string())), "\n".to_string()); -let init_path = match scaffold_for_target(RenderTarget::Python).module_init_file.clone() { - Some(path) => path.clone(), - None => "__init__.py".to_string(), -}; -Rc::new(TextFile { - path: init_path, - content: content, -}) -} + let import_lines = Rc::new({ + let mut __result = Vec::new(); + for tm in modules.iter().cloned() { + __result.push({ + let mod_name = module_to_filename(authored_name_at( + tm.type_env.clone().source_indices.clone(), + &tm.module.clone(), + )); + let items = language_spec(RenderTarget::Python).items.clone(); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(items.import_from_keyword.clone(), " . ".to_string()), + items.import_keyword.clone(), + ), + " ".to_string(), + ), + mod_name.clone(), + ) + }); + } + __result + }); + let content = v2_rt::concat( + v2_rt::concat( + "# Generated by v2 compiler -- do not edit.\n\n".to_string(), + import_lines.join(&"\n".to_string()), + ), + "\n".to_string(), + ); + let init_path = match scaffold_for_target(RenderTarget::Python) + .module_init_file + .clone() + { + Some(path) => path.clone(), + None => "__init__.py".to_string(), + }; + Rc::new(TextFile { + path: init_path, + content: content, + }) + } } pub fn python_test_signature_comment(projection: &Rc) -> String { { - let params_str = Rc::new({ let mut __result = Vec::new(); for p in projection.params.clone().iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(param_node_name_at(p.clone(), projection.source_indices.clone()), ": ".to_string()), emit_node_type(param_node_type_expr(&p), RenderTarget::Python, projection.source_indices.clone()))); } __result }).join(&", ".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("# Signature: ".to_string(), sanitize_service_name(projection.service_name.clone())), ".".to_string()), projection.operation_name.clone()), "(".to_string()), params_str), ") -> ".to_string()), emit_node_type(projection.inferred.clone(), RenderTarget::Python, projection.source_indices.clone())) -} + let params_str = Rc::new({ + let mut __result = Vec::new(); + for p in projection.params.clone().iter().cloned() { + __result.push(v2_rt::concat( + v2_rt::concat( + param_node_name_at(p.clone(), projection.source_indices.clone()), + ": ".to_string(), + ), + emit_node_type( + param_node_type_expr(&p), + RenderTarget::Python, + projection.source_indices.clone(), + ), + )); + } + __result + }) + .join(&", ".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "# Signature: ".to_string(), + sanitize_service_name(projection.service_name.clone()), + ), + ".".to_string(), + ), + projection.operation_name.clone(), + ), + "(".to_string(), + ), + params_str, + ), + ") -> ".to_string(), + ), + emit_node_type( + projection.inferred.clone(), + RenderTarget::Python, + projection.source_indices.clone(), + ), + ) + } } -pub fn emit_py_test_file(module_name: &String, projections: &Rc>>) -> Rc { +pub fn emit_py_test_file( + module_name: &String, + projections: &Rc>>, +) -> Rc { if ((projections.clone().len() as i64) == 0) { Rc::new(TextFile { - path: "".to_string(), - content: "".to_string(), -}) + path: "".to_string(), + content: "".to_string(), + }) } else { { - let tests_str = Rc::new({ let mut __result = Vec::new(); for p in projections.clone().iter().cloned() { __result.push(emit_py_operation_test(&p, 0)); } __result }).join(&"\n\n".to_string()); -let content = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("# Generated tests -- do not edit.\n".to_string(), "# Source module: ".to_string()), module_name.clone()), "\n\n".to_string()), tests_str), "\n".to_string()); -Rc::new(TextFile { - path: test_file_path(module_name.clone(), &RenderTarget::Python), - content: content, -}) -} + let tests_str = Rc::new({ + let mut __result = Vec::new(); + for p in projections.clone().iter().cloned() { + __result.push(emit_py_operation_test(&p, 0)); + } + __result + }) + .join(&"\n\n".to_string()); + let content = v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "# Generated tests -- do not edit.\n".to_string(), + "# Source module: ".to_string(), + ), + module_name.clone(), + ), + "\n\n".to_string(), + ), + tests_str, + ), + "\n".to_string(), + ); + Rc::new(TextFile { + path: test_file_path(module_name.clone(), &RenderTarget::Python), + content: content, + }) + } } } pub fn emit_py_operation_test(projection: &Rc, depth: i64) -> String { { let test_name = test_function_name(&projection, RenderTarget::Python); -let indent = make_indent((depth.clone() + 1)); -let mock_setup = Rc::new({ let mut __result = Vec::new(); for mp in projection.mock_field_inits.clone().iter().cloned() { __result.push(emit_py_mock_prop_setup(&mp, (depth.clone() + 1), &projection.source_indices.clone())); } __result }).join(&"\n".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Python).items.clone().func_keyword.clone(), " ".to_string()), test_name), "() -> None:\n".to_string()), indent.clone()), python_test_signature_comment(&projection)), "\n".to_string()), indent.clone()), mock_setup), "\n".to_string()), indent.clone()), "# TODO: add dry-run support to Python service emission for full invocation tests\n".to_string()), indent.clone()), "assert True # mock data setup verified\n".to_string()) -} + let indent = make_indent((depth.clone() + 1)); + let mock_setup = Rc::new({ + let mut __result = Vec::new(); + for mp in projection.mock_field_inits.clone().iter().cloned() { + __result.push(emit_py_mock_prop_setup( + &mp, + (depth.clone() + 1), + &projection.source_indices.clone(), + )); + } + __result + }) + .join(&"\n".to_string()); + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Python).items.clone().func_keyword.clone(), " ".to_string()), test_name), "() -> None:\n".to_string()), indent.clone()), python_test_signature_comment(&projection)), "\n".to_string()), indent.clone()), mock_setup), "\n".to_string()), indent.clone()), "# TODO: add dry-run support to Python service emission for full invocation tests\n".to_string()), indent.clone()), "assert True # mock data setup verified\n".to_string()) + } } -pub fn emit_py_mock_prop_setup(mock_prop: &Rc, depth: i64, source_indices: &Rc>>) -> String { - v2_rt::concat(v2_rt::concat(emit_ident(field_init_node_name_at(mock_prop.clone(), source_indices.clone()), RenderTarget::Python), " = ".to_string()), emit_simple_expr(&field_init_node_value(&mock_prop), &RenderTarget::Python, &source_indices)) +pub fn emit_py_mock_prop_setup( + mock_prop: &Rc, + depth: i64, + source_indices: &Rc>>, +) -> String { + v2_rt::concat( + v2_rt::concat( + emit_ident( + field_init_node_name_at(mock_prop.clone(), source_indices.clone()), + RenderTarget::Python, + ), + " = ".to_string(), + ), + emit_simple_expr( + &field_init_node_value(&mock_prop), + &RenderTarget::Python, + &source_indices, + ), + ) } -pub fn emit_py_module(typed_module: &Rc, registry: Rc>>) -> Rc { +pub fn emit_py_module( + typed_module: &Rc, + registry: Rc>>, +) -> Rc { { let m = typed_module.module.clone(); -let scope = module_emit_scope(&typed_module); -let si = scope.type_env.clone().source_indices.clone(); -let mod_name_str = authored_name_at(si.clone(), &m); -let prelude = emit_py_prelude(typed_module.clone()); -let imports_str = emit_py_imports(&module_imports(m.clone()), si.clone()); -let imports_section = if (imports_str.clone().as_str() == "".to_string().as_str()) { + let scope = module_emit_scope(&typed_module); + let si = scope.type_env.clone().source_indices.clone(); + let mod_name_str = authored_name_at(si.clone(), &m); + let prelude = emit_py_prelude(typed_module.clone()); + let imports_str = emit_py_imports(&module_imports(m.clone()), si.clone()); + let imports_section = if (imports_str.clone().as_str() == "".to_string().as_str()) { "".to_string() } else { v2_rt::concat("\n".to_string(), imports_str.clone()) }; -let items_str = Rc::new({ let mut __result = Vec::new(); for item in typed_module.items.clone().iter().cloned() { __result.push(emit_py_typed_item(&item, registry.clone(), &scope)); } __result }).join(&"\n\n\n".to_string()); -let filename = module_to_filename(mod_name_str.clone()); -let content = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("# Generated by v2 compiler -- do not edit.\n".to_string(), "# Source module: ".to_string()), mod_name_str.clone()), "\n\n".to_string()), prelude), imports_section), "\n\n\n".to_string()), items_str), "\n".to_string()); -Rc::new(TextFile { - path: v2_rt::concat(filename, scaffold_for_target(RenderTarget::Python).source_file_extension.clone()), - content: content, -}) -} + let items_str = Rc::new({ + let mut __result = Vec::new(); + for item in typed_module.items.clone().iter().cloned() { + __result.push(emit_py_typed_item(&item, registry.clone(), &scope)); + } + __result + }) + .join(&"\n\n\n".to_string()); + let filename = module_to_filename(mod_name_str.clone()); + let content = v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "# Generated by v2 compiler -- do not edit.\n".to_string(), + "# Source module: ".to_string(), + ), + mod_name_str.clone(), + ), + "\n\n".to_string(), + ), + prelude, + ), + imports_section, + ), + "\n\n\n".to_string(), + ), + items_str, + ), + "\n".to_string(), + ); + Rc::new(TextFile { + path: v2_rt::concat( + filename, + scaffold_for_target(RenderTarget::Python) + .source_file_extension + .clone(), + ), + content: content, + }) + } } -pub fn emit_py_imports(imports: &Rc>>, source_indices: Rc>>) -> String { +pub fn emit_py_imports( + imports: &Rc>>, + source_indices: Rc>>, +) -> String { if ((imports.clone().len() as i64) == 0) { "".to_string() } else { { - let import_lines = Rc::new({ let mut __result = Vec::new(); for imp in imports.clone().iter().cloned() { __result.push({ - let mod_name = module_to_filename(authored_name_at(source_indices.clone(), &imp)); -let items = language_spec(RenderTarget::Python).items.clone(); -if import_is_all(imp.clone()) { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(items.import_from_keyword.clone(), " ".to_string()), mod_name.clone()), " ".to_string()), items.import_keyword.clone()), " *".to_string()) - } else { - { - let specific_names = import_specific_names_at(imp.clone(), source_indices.clone()); -if ((specific_names.clone().len() as i64) == 0) { - "".to_string() + let import_lines = Rc::new({ + let mut __result = Vec::new(); + for imp in imports.clone().iter().cloned() { + __result.push({ + let mod_name = + module_to_filename(authored_name_at(source_indices.clone(), &imp)); + let items = language_spec(RenderTarget::Python).items.clone(); + if import_is_all(imp.clone()) { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + items.import_from_keyword.clone(), + " ".to_string(), + ), + mod_name.clone(), + ), + " ".to_string(), + ), + items.import_keyword.clone(), + ), + " *".to_string(), + ) } else { { - let names_str = specific_names.clone().join(&", ".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(items.import_from_keyword.clone(), " ".to_string()), mod_name.clone()), " ".to_string()), items.import_keyword.clone()), " ".to_string()), names_str.clone()) -} + let specific_names = + import_specific_names_at(imp.clone(), source_indices.clone()); + if ((specific_names.clone().len() as i64) == 0) { + "".to_string() + } else { + { + let names_str = + specific_names.clone().join(&", ".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + items.import_from_keyword.clone(), + " ".to_string(), + ), + mod_name.clone(), + ), + " ".to_string(), + ), + items.import_keyword.clone(), + ), + " ".to_string(), + ), + names_str.clone(), + ) + } + } + } } -} + }); } -}); } __result }); -Rc::new({ let mut __result = Vec::new(); for line in import_lines.iter().cloned() { if (line.clone().as_str() != "".to_string().as_str()) { __result.push(line); } } __result }).join(&"\n".to_string()) -} + __result + }); + Rc::new({ + let mut __result = Vec::new(); + for line in import_lines.iter().cloned() { + if (line.clone().as_str() != "".to_string().as_str()) { + __result.push(line); + } + } + __result + }) + .join(&"\n".to_string()) + } } } pub fn emit_py_prelude(typed_module: Rc) -> String { { let items = typed_module.items.clone(); -let has_structs = { let mut __found = false; for item in items.clone().iter().cloned() { if (is_type_def_item(&item) && (item.connective.clone() == Connective::Conj)) { __found = true; break; } } __found }; -let has_enums = { let mut __found = false; for item in items.clone().iter().cloned() { if (is_type_def_item(&item) && (item.connective.clone() == Connective::Disj)) { __found = true; break; } } __found }; -let has_services = { let mut __found = false; for item in items.clone().iter().cloned() { if is_service_item(&item) { __found = true; break; } } __found }; -let future_import = "from __future__ import annotations\n".to_string(); -let dc_import = if has_structs.clone() { + let has_structs = { + let mut __found = false; + for item in items.clone().iter().cloned() { + if (is_type_def_item(&item) && (item.connective.clone() == Connective::Conj)) { + __found = true; + break; + } + } + __found + }; + let has_enums = { + let mut __found = false; + for item in items.clone().iter().cloned() { + if (is_type_def_item(&item) && (item.connective.clone() == Connective::Disj)) { + __found = true; + break; + } + } + __found + }; + let has_services = { + let mut __found = false; + for item in items.clone().iter().cloned() { + if is_service_item(&item) { + __found = true; + break; + } + } + __found + }; + let future_import = "from __future__ import annotations\n".to_string(); + let dc_import = if has_structs.clone() { "from dataclasses import dataclass, field\n".to_string() } else { "".to_string() }; -let enum_import = if has_enums.clone() { + let enum_import = if has_enums.clone() { "from enum import Enum, auto\n".to_string() } else { "".to_string() }; -let typing_import = if (has_structs.clone() || has_enums.clone()) { + let typing_import = if (has_structs.clone() || has_enums.clone()) { "from typing import Optional, Union\n".to_string() } else { "".to_string() }; -let async_import = if has_services { + let async_import = if has_services { "import aiohttp\n".to_string() } else { "".to_string() }; -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(future_import, dc_import), enum_import), typing_import), async_import) -} + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(v2_rt::concat(future_import, dc_import), enum_import), + typing_import, + ), + async_import, + ) + } } -pub fn emit_py_typed_item(item: &Rc, registry: Rc>>, scope: &Rc) -> String { +pub fn emit_py_typed_item( + item: &Rc, + registry: Rc>>, + scope: &Rc, +) -> String { { let env = scope.type_env.clone(); -let item_text = authored_name(env.clone(), item.clone()); -if is_type_def_item(&item) { + let item_text = authored_name(env.clone(), item.clone()); + if is_type_def_item(&item) { emit_py_type_def_from_connective(&item, &env) } else { if is_type_alias_item(&item, env.source_indices.clone()) { - v2_rt::concat(v2_rt::concat(item_text, " = ".to_string()), emit_node_type(resolved_type(item.clone()), RenderTarget::Python, env.source_indices.clone())) + v2_rt::concat( + v2_rt::concat(item_text, " = ".to_string()), + emit_node_type( + resolved_type(item.clone()), + RenderTarget::Python, + env.source_indices.clone(), + ), + ) } else { if is_type_decl_item(&item, env.source_indices.clone()) { "".to_string() } else { if is_function_item(&item) { if ((item.uses.clone().len() as i64) > 0) { - emit_py_func_def(&item_text, &item.params.clone(), resolved_type(item.clone()), &item.uses.clone(), item.body.clone().clone().unwrap(), ®istry, &scope) + emit_py_func_def( + &item_text, + &item.params.clone(), + resolved_type(item.clone()), + &item.uses.clone(), + item.body.clone().clone().unwrap(), + ®istry, + &scope, + ) } else { - emit_py_fn_def(&item_text, &item.params.clone(), resolved_type(item.clone()), &item.body.clone().clone().unwrap(), ®istry, &scope) + emit_py_fn_def( + &item_text, + &item.params.clone(), + resolved_type(item.clone()), + &item.body.clone().clone().unwrap(), + ®istry, + &scope, + ) } } else { if is_data_def_item(&item) { - emit_py_data_def(item_text, item.type_annotation.clone().clone().unwrap(), item.body.clone().clone().unwrap(), registry, &scope) + emit_py_data_def( + item_text, + item.type_annotation.clone().clone().unwrap(), + item.body.clone().clone().unwrap(), + registry, + &scope, + ) } else { if is_service_def_item(&item) { emit_py_service_def(item.clone(), registry, env.clone()) @@ -239,262 +625,915 @@ if is_type_def_item(&item) { } } } -} + } } pub fn emit_py_type_def_from_connective(item: &Rc, env: &Rc) -> String { { let item_text = authored_name(env.clone(), item.clone()); -let is_product = (item.connective.clone() == Connective::Conj); -if is_product { + let is_product = (item.connective.clone() == Connective::Conj); + if is_product { emit_py_dataclass_from_children(item_text, &item.children.clone(), env.clone()) } else { emit_py_enum_from_children(&item_text, &item.children.clone(), env.clone()) } -} + } } -pub fn emit_py_dataclass_from_children(name: String, children: &Rc>>, env: Rc) -> String { +pub fn emit_py_dataclass_from_children( + name: String, + children: &Rc>>, + env: Rc, +) -> String { if ((children.clone().len() as i64) == 0) { - v2_rt::concat(v2_rt::concat(v2_rt::concat(py_derive_attribute(), "\nclass ".to_string()), name), ":\n pass".to_string()) + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(py_derive_attribute(), "\nclass ".to_string()), + name, + ), + ":\n pass".to_string(), + ) } else { { - let field_lines = Rc::new({ let mut __result = Vec::new(); for child in children.clone().iter().cloned() { __result.push(emit_py_dataclass_field_from_child(&child, &env)); } __result }); -let fields_str = field_lines.join(&"\n".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(py_derive_attribute(), "\nclass ".to_string()), name), ":\n".to_string()), fields_str) -} + let field_lines = Rc::new({ + let mut __result = Vec::new(); + for child in children.clone().iter().cloned() { + __result.push(emit_py_dataclass_field_from_child(&child, &env)); + } + __result + }); + let fields_str = field_lines.join(&"\n".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(py_derive_attribute(), "\nclass ".to_string()), + name, + ), + ":\n".to_string(), + ), + fields_str, + ) + } } } pub fn emit_py_dataclass_field_from_child(child: &Rc, env: &Rc) -> String { { - let ty = emit_node_type(resolved_type(child.clone()), RenderTarget::Python, env.source_indices.clone()); -let is_optional = (resolved_type(child.clone()).return_cardinality.clone() == Cardinality::CardOptional); -let default_str = if is_optional { + let ty = emit_node_type( + resolved_type(child.clone()), + RenderTarget::Python, + env.source_indices.clone(), + ); + let is_optional = + (resolved_type(child.clone()).return_cardinality.clone() == Cardinality::CardOptional); + let default_str = if is_optional { v2_rt::concat(" = ".to_string(), py_default_value()) } else { "".to_string() }; -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" ".to_string(), emit_ident(authored_name(env.clone(), child.clone()), RenderTarget::Python)), ": ".to_string()), ty), default_str) -} + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + " ".to_string(), + emit_ident( + authored_name(env.clone(), child.clone()), + RenderTarget::Python, + ), + ), + ": ".to_string(), + ), + ty, + ), + default_str, + ) + } } -pub fn emit_py_enum_from_children(name: &String, children: &Rc>>, env: Rc) -> String { +pub fn emit_py_enum_from_children( + name: &String, + children: &Rc>>, + env: Rc, +) -> String { { - let has_data = { let mut __found = false; for child in children.clone().iter().cloned() { if ((child.children.clone().len() as i64) > 0) { __found = true; break; } } __found }; -if has_data { + let has_data = { + let mut __found = false; + for child in children.clone().iter().cloned() { + if ((child.children.clone().len() as i64) > 0) { + __found = true; + break; + } + } + __found + }; + if has_data { { - let variant_classes = Rc::new({ let mut __result = Vec::new(); for child in children.clone().iter().cloned() { __result.push(emit_py_variant_class_from_child(name.clone(), &child, &env)); } __result }); -let variant_names = Rc::new({ let mut __result = Vec::new(); for child in children.clone().iter().cloned() { __result.push(v2_rt::concat(name.clone(), authored_name(env.clone(), child.clone()))); } __result }); -let union_str = variant_names.join(&", ".to_string()); -let classes_str = variant_classes.join(&"\n\n\n".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(classes_str, "\n\n\n".to_string()), name.clone()), " = Union[".to_string()), union_str), "]".to_string()) -} + let variant_classes = Rc::new({ + let mut __result = Vec::new(); + for child in children.clone().iter().cloned() { + __result.push(emit_py_variant_class_from_child(name.clone(), &child, &env)); + } + __result + }); + let variant_names = Rc::new({ + let mut __result = Vec::new(); + for child in children.clone().iter().cloned() { + __result.push(v2_rt::concat( + name.clone(), + authored_name(env.clone(), child.clone()), + )); + } + __result + }); + let union_str = variant_names.join(&", ".to_string()); + let classes_str = variant_classes.join(&"\n\n\n".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(classes_str, "\n\n\n".to_string()), + name.clone(), + ), + " = Union[".to_string(), + ), + union_str, + ), + "]".to_string(), + ) + } } else { { - let variant_lines = Rc::new({ let mut __result = Vec::new(); for child in children.clone().iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(" ".to_string(), authored_name(env.clone(), child.clone())), " = auto()".to_string())); } __result }); -let variants_str = variant_lines.join(&"\n".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(language_spec(RenderTarget::Python).items.clone().enum_keyword.clone(), " ".to_string()), name.clone()), "(Enum):\n".to_string()), variants_str) -} + let variant_lines = Rc::new({ + let mut __result = Vec::new(); + for child in children.clone().iter().cloned() { + __result.push(v2_rt::concat( + v2_rt::concat( + " ".to_string(), + authored_name(env.clone(), child.clone()), + ), + " = auto()".to_string(), + )); + } + __result + }); + let variants_str = variant_lines.join(&"\n".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + language_spec(RenderTarget::Python) + .items + .clone() + .enum_keyword + .clone(), + " ".to_string(), + ), + name.clone(), + ), + "(Enum):\n".to_string(), + ), + variants_str, + ) + } } -} + } } -pub fn emit_py_variant_class_from_child(parent_name: String, child: &Rc, env: &Rc) -> String { +pub fn emit_py_variant_class_from_child( + parent_name: String, + child: &Rc, + env: &Rc, +) -> String { { let class_name = v2_rt::concat(parent_name, authored_name(env.clone(), child.clone())); -if ((child.children.clone().len() as i64) == 0) { - v2_rt::concat(v2_rt::concat(v2_rt::concat(py_derive_attribute(), "\nclass ".to_string()), class_name), ":\n pass".to_string()) + if ((child.children.clone().len() as i64) == 0) { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(py_derive_attribute(), "\nclass ".to_string()), + class_name, + ), + ":\n pass".to_string(), + ) } else { { - let field_lines = Rc::new({ let mut __result = Vec::new(); for f in child.children.clone().iter().cloned() { __result.push(emit_py_dataclass_field_from_child(&f, &env)); } __result }); -let fields_str = field_lines.join(&"\n".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(py_derive_attribute(), "\nclass ".to_string()), class_name), ":\n".to_string()), fields_str) -} + let field_lines = Rc::new({ + let mut __result = Vec::new(); + for f in child.children.clone().iter().cloned() { + __result.push(emit_py_dataclass_field_from_child(&f, &env)); + } + __result + }); + let fields_str = field_lines.join(&"\n".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(py_derive_attribute(), "\nclass ".to_string()), + class_name, + ), + ":\n".to_string(), + ), + fields_str, + ) + } } -} + } } -pub fn emit_py_fn_def(name: &String, params: &Rc>>, inferred: Rc, body: &Rc, registry: &Rc>>, scope: &Rc) -> String { +pub fn emit_py_fn_def( + name: &String, + params: &Rc>>, + inferred: Rc, + body: &Rc, + registry: &Rc>>, + scope: &Rc, +) -> String { { let depth = 0; -let si = scope.type_env.clone().source_indices.clone(); -let params_str = emit_params_shared(params.clone(), &RenderTarget::Python, si.clone()); -let ret_str = emit_inferred_shared(&inferred, &RenderTarget::Python, si.clone()); -let body_scope = build_params_scope(&scope, params.clone()); -let use_tco = is_tco_eligible(&name, &body, registry.clone(), &si); -if use_tco { + let si = scope.type_env.clone().source_indices.clone(); + let params_str = emit_params_shared(params.clone(), &RenderTarget::Python, si.clone()); + let ret_str = emit_inferred_shared(&inferred, &RenderTarget::Python, si.clone()); + let body_scope = build_params_scope(&scope, params.clone()); + let use_tco = is_tco_eligible(&name, &body, registry.clone(), &si); + if use_tco { { - let body_str = emit_tco_unified(body.clone(), &name, ¶ms, &RenderTarget::Python, ®istry, &body_scope, (depth.clone() + 1), |pat| emit_unified_pattern(pat.clone(), RenderTarget::Python, si.clone())); -let kw = language_spec(RenderTarget::Python).items.clone().func_keyword.clone(); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(kw, " ".to_string()), emit_ident(name.clone(), RenderTarget::Python)), "(".to_string()), params_str), ")".to_string()), ret_str), ":\n".to_string()), make_indent((depth.clone() + 1))), body_str) -} + let body_str = emit_tco_unified( + body.clone(), + &name, + ¶ms, + &RenderTarget::Python, + ®istry, + &body_scope, + (depth.clone() + 1), + |pat| emit_unified_pattern(pat.clone(), RenderTarget::Python, si.clone()), + ); + let kw = language_spec(RenderTarget::Python) + .items + .clone() + .func_keyword + .clone(); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(kw, " ".to_string()), + emit_ident(name.clone(), RenderTarget::Python), + ), + "(".to_string(), + ), + params_str, + ), + ")".to_string(), + ), + ret_str, + ), + ":\n".to_string(), + ), + make_indent((depth.clone() + 1)), + ), + body_str, + ) + } } else { { - let body_str = emit_py_typed_expr(body.clone(), registry.clone(), &body_scope, (depth.clone() + 1), 1024); -let kw = language_spec(RenderTarget::Python).items.clone().func_keyword.clone(); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(kw, " ".to_string()), emit_ident(name.clone(), RenderTarget::Python)), "(".to_string()), params_str), ")".to_string()), ret_str), ":\n".to_string()), make_indent((depth.clone() + 1))), "return ".to_string()), body_str) -} + let body_str = emit_py_typed_expr( + body.clone(), + registry.clone(), + &body_scope, + (depth.clone() + 1), + 1024, + ); + let kw = language_spec(RenderTarget::Python) + .items + .clone() + .func_keyword + .clone(); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(kw, " ".to_string()), + emit_ident(name.clone(), RenderTarget::Python), + ), + "(".to_string(), + ), + params_str, + ), + ")".to_string(), + ), + ret_str, + ), + ":\n".to_string(), + ), + make_indent((depth.clone() + 1)), + ), + "return ".to_string(), + ), + body_str, + ) + } } -} + } } -pub fn emit_py_func_def(name: &String, params: &Rc>>, inferred: Rc, uses: &Rc>>, body: Rc, registry: &Rc>>, scope: &Rc) -> String { +pub fn emit_py_func_def( + name: &String, + params: &Rc>>, + inferred: Rc, + uses: &Rc>>, + body: Rc, + registry: &Rc>>, + scope: &Rc, +) -> String { { let depth = 0; -let service_names = match lookup_item(registry.clone(), name.clone()) { - Some(info) => info.service_names.clone(), - None => Rc::new(vec![]), -}; -let params_str = emit_py_func_params(params.clone(), uses.clone(), service_names, scope.type_env.clone().source_indices.clone()); -let ret_str = emit_inferred_shared(&inferred, &RenderTarget::Python, scope.type_env.clone().source_indices.clone()); -let body_scope = build_params_scope(&scope, params.clone()); -let si = scope.type_env.clone().source_indices.clone(); -let body_scope = uses.clone().iter().cloned().fold(body_scope.clone(), |s: Rc, u: Rc| extend_scope(&s, &resource_use_name_at(u.clone(), si.clone()), resource_use_resource(&u), Rc::new(SubValueRelation::SubValueUnknown))); -let body_str = emit_unified_typed_func_body(&body, &RenderTarget::Python, ®istry, &body_scope, (depth.clone() + 1)); -let items = language_spec(RenderTarget::Python).items.clone(); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(items.async_prefix.clone(), items.func_keyword.clone()), " ".to_string()), emit_ident(name.clone(), RenderTarget::Python)), "(".to_string()), params_str), ")".to_string()), ret_str), ":\n".to_string()), make_indent((depth.clone() + 1))), body_str) -} + let service_names = match lookup_item(registry.clone(), name.clone()) { + Some(info) => info.service_names.clone(), + None => Rc::new(vec![]), + }; + let params_str = emit_py_func_params( + params.clone(), + uses.clone(), + service_names, + scope.type_env.clone().source_indices.clone(), + ); + let ret_str = emit_inferred_shared( + &inferred, + &RenderTarget::Python, + scope.type_env.clone().source_indices.clone(), + ); + let body_scope = build_params_scope(&scope, params.clone()); + let si = scope.type_env.clone().source_indices.clone(); + let body_scope = uses.clone().iter().cloned().fold( + body_scope.clone(), + |s: Rc, u: Rc| { + extend_scope( + &s, + &resource_use_name_at(u.clone(), si.clone()), + resource_use_resource(&u), + Rc::new(SubValueRelation::SubValueUnknown), + ) + }, + ); + let body_str = emit_unified_typed_func_body( + &body, + &RenderTarget::Python, + ®istry, + &body_scope, + (depth.clone() + 1), + ); + let items = language_spec(RenderTarget::Python).items.clone(); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + items.async_prefix.clone(), + items.func_keyword.clone(), + ), + " ".to_string(), + ), + emit_ident(name.clone(), RenderTarget::Python), + ), + "(".to_string(), + ), + params_str, + ), + ")".to_string(), + ), + ret_str, + ), + ":\n".to_string(), + ), + make_indent((depth.clone() + 1)), + ), + body_str, + ) + } } -pub fn emit_py_func_params(params: Rc>>, uses: Rc>>, service_names: Rc>, source_indices: Rc>>) -> String { +pub fn emit_py_func_params( + params: Rc>>, + uses: Rc>>, + service_names: Rc>, + source_indices: Rc>>, +) -> String { { - let param_strs = Rc::new({ let mut __result = Vec::new(); for p in params.iter().cloned() { __result.push(emit_param_shared(&p, &RenderTarget::Python, &source_indices)); } __result }); -let resource_strs = Rc::new({ let mut __result = Vec::new(); for u in uses.iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(emit_ident(resource_use_name_at(u.clone(), source_indices.clone()), RenderTarget::Python), ": ".to_string()), emit_node_type(resource_use_resource(&u), RenderTarget::Python, source_indices.clone()))); } __result }); -let service_strs = Rc::new({ let mut __result = Vec::new(); for sn in service_names.iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(service_var_name(sn.clone()), ": ".to_string()), sanitize_service_name(sn.clone()))); } __result }); -let all_params = v2_rt::concat(v2_rt::concat(param_strs, resource_strs), service_strs); -all_params.join(&", ".to_string()) -} + let param_strs = Rc::new({ + let mut __result = Vec::new(); + for p in params.iter().cloned() { + __result.push(emit_param_shared( + &p, + &RenderTarget::Python, + &source_indices, + )); + } + __result + }); + let resource_strs = Rc::new({ + let mut __result = Vec::new(); + for u in uses.iter().cloned() { + __result.push(v2_rt::concat( + v2_rt::concat( + emit_ident( + resource_use_name_at(u.clone(), source_indices.clone()), + RenderTarget::Python, + ), + ": ".to_string(), + ), + emit_node_type( + resource_use_resource(&u), + RenderTarget::Python, + source_indices.clone(), + ), + )); + } + __result + }); + let service_strs = Rc::new({ + let mut __result = Vec::new(); + for sn in service_names.iter().cloned() { + __result.push(v2_rt::concat( + v2_rt::concat(service_var_name(sn.clone()), ": ".to_string()), + sanitize_service_name(sn.clone()), + )); + } + __result + }); + let all_params = v2_rt::concat(v2_rt::concat(param_strs, resource_strs), service_strs); + all_params.join(&", ".to_string()) + } } -pub fn emit_py_typed_expr(texpr: Rc, registry: Rc>>, scope: &Rc, depth: i64, fuel: i64) -> String { - emit_unified_typed_expr(texpr, &RenderTarget::Python, registry, &scope, depth, fuel, |pat| emit_unified_pattern(pat.clone(), RenderTarget::Python, scope.type_env.clone().source_indices.clone())) +pub fn emit_py_typed_expr( + texpr: Rc, + registry: Rc>>, + scope: &Rc, + depth: i64, + fuel: i64, +) -> String { + emit_unified_typed_expr( + texpr, + &RenderTarget::Python, + registry, + &scope, + depth, + fuel, + |pat| { + emit_unified_pattern( + pat.clone(), + RenderTarget::Python, + scope.type_env.clone().source_indices.clone(), + ) + }, + ) } -pub fn emit_py_transport_body(transport: Rc, op_name: String, source_indices: Rc>>, depth: i64) -> String { - emit_unified_transport_dispatch(&transport, op_name, &source_indices, depth, RenderTarget::Python, |n, t, d, si| emit_py_rest_call(n.clone(), t.clone(), si.clone()), |n, t, d, si| emit_py_shell_call(n.clone(), t.clone(), &si), |n, d| emit_py_file_call(n.clone()), |n, d| emit_py_local_call(n.clone())) +pub fn emit_py_transport_body( + transport: Rc, + op_name: String, + source_indices: Rc>>, + depth: i64, +) -> String { + emit_unified_transport_dispatch( + &transport, + op_name, + &source_indices, + depth, + RenderTarget::Python, + |n, t, d, si| emit_py_rest_call(n.clone(), t.clone(), si.clone()), + |n, t, d, si| emit_py_shell_call(n.clone(), t.clone(), &si), + |n, d| emit_py_file_call(n.clone()), + |n, d| emit_py_local_call(n.clone()), + ) } -pub fn emit_py_service_def(item: Rc, registry: Rc>>, env: Rc) -> String { - emit_unified_service_def(&item, &RenderTarget::Python, registry, &env, |name, transport, ops, si| emit_py_service_init(transport.clone(), ops.clone(), si.clone()), |transport, op_name, si, depth| emit_py_transport_body(transport.clone(), op_name.clone(), si.clone(), depth.clone())) +pub fn emit_py_service_def( + item: Rc, + registry: Rc>>, + env: Rc, +) -> String { + emit_unified_service_def( + &item, + &RenderTarget::Python, + registry, + &env, + |name, transport, ops, si| emit_py_service_init(transport.clone(), ops.clone(), si.clone()), + |transport, op_name, si, depth| { + emit_py_transport_body( + transport.clone(), + op_name.clone(), + si.clone(), + depth.clone(), + ) + }, + ) } -pub fn emit_py_service_init(fallback_transport: Rc, op_children: Rc>>, source_indices: Rc>>) -> String { +pub fn emit_py_service_init( + fallback_transport: Rc, + op_children: Rc>>, + source_indices: Rc>>, +) -> String { { let fs = compute_service_fields(&fallback_transport, &op_children, &source_indices); -let params = service_field_decls(&fs, &language_spec(RenderTarget::Python).service_fields.clone()); -let assigns = service_field_ctors(&fs, &language_spec(RenderTarget::Python).service_fields.clone()); -if ((params.clone().len() as i64) == 0) { + let params = service_field_decls( + &fs, + &language_spec(RenderTarget::Python).service_fields.clone(), + ); + let assigns = service_field_ctors( + &fs, + &language_spec(RenderTarget::Python).service_fields.clone(), + ); + if ((params.clone().len() as i64) == 0) { "def __init__(self):\n pass".to_string() } else { { - let params_str = v2_rt::concat("self, ".to_string(), params.clone().join(&", ".to_string())); -let assigns_str = Rc::new({ let mut __result = Vec::new(); for a in assigns.iter().cloned() { __result.push(v2_rt::concat(" ".to_string(), a.clone())); } __result }).join(&"\n".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat("def __init__(".to_string(), params_str), "):\n".to_string()), assigns_str) -} + let params_str = + v2_rt::concat("self, ".to_string(), params.clone().join(&", ".to_string())); + let assigns_str = Rc::new({ + let mut __result = Vec::new(); + for a in assigns.iter().cloned() { + __result.push(v2_rt::concat(" ".to_string(), a.clone())); + } + __result + }) + .join(&"\n".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("def __init__(".to_string(), params_str), + "):\n".to_string(), + ), + assigns_str, + ) + } } -} + } } -pub fn emit_py_rest_call(op_name: String, transport: Rc, source_indices: Rc>>) -> String { +pub fn emit_py_rest_call( + op_name: String, + transport: Rc, + source_indices: Rc>>, +) -> String { { - let self_base_url = v2_rt::concat(v2_rt::concat("{".to_string(), "self.base_url".to_string()), "}".to_string()); -let url_line = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("url = f\"".to_string(), self_base_url), "/".to_string()), emit_ident(op_name, RenderTarget::Python)), "\"".to_string()); -let headers_dict = emit_py_headers_dict(&transport, &source_indices); -let session_lines = v2_rt::concat(v2_rt::concat("async with aiohttp.ClientSession() as session:\n".to_string(), " async with session.post(url, headers=headers) as response:\n".to_string()), " return await response.json()".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(url_line, "\n".to_string()), headers_dict), "\n".to_string()), session_lines) -} + let self_base_url = v2_rt::concat( + v2_rt::concat("{".to_string(), "self.base_url".to_string()), + "}".to_string(), + ); + let url_line = v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("url = f\"".to_string(), self_base_url), + "/".to_string(), + ), + emit_ident(op_name, RenderTarget::Python), + ), + "\"".to_string(), + ); + let headers_dict = emit_py_headers_dict(&transport, &source_indices); + let session_lines = v2_rt::concat( + v2_rt::concat( + "async with aiohttp.ClientSession() as session:\n".to_string(), + " async with session.post(url, headers=headers) as response:\n".to_string(), + ), + " return await response.json()".to_string(), + ); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(v2_rt::concat(url_line, "\n".to_string()), headers_dict), + "\n".to_string(), + ), + session_lines, + ) + } } -pub fn emit_py_headers_dict(transport: &Rc, source_indices: &Rc>>) -> String { +pub fn emit_py_headers_dict( + transport: &Rc, + source_indices: &Rc>>, +) -> String { { let auth_entry = if transport_has_auth(transport.clone(), source_indices.clone()) { { - let header_name = match transport_auth_header_name(transport.clone(), source_indices.clone()) { - Some(h) => h.clone(), - None => "Authorization".to_string(), -}; -v2_rt::concat(v2_rt::concat("\"".to_string(), header_name), "\": self.auth_token, ".to_string()) -} + let header_name = + match transport_auth_header_name(transport.clone(), source_indices.clone()) { + Some(h) => h.clone(), + None => "Authorization".to_string(), + }; + v2_rt::concat( + v2_rt::concat("\"".to_string(), header_name), + "\": self.auth_token, ".to_string(), + ) + } } else { "".to_string() }; -let hdrs = transport_headers(transport.clone(), source_indices.clone()); -let header_entries = Rc::new({ let mut __result = Vec::new(); for h in hdrs.iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(v2_rt::concat("\"".to_string(), field_init_node_name_at(h.clone(), source_indices.clone())), "\": ".to_string()), emit_simple_expr(&field_init_node_value(&h), &RenderTarget::Python, &source_indices))); } __result }); -let all_entries = if (auth_entry.clone().as_str() == "".to_string().as_str()) { + let hdrs = transport_headers(transport.clone(), source_indices.clone()); + let header_entries = Rc::new({ + let mut __result = Vec::new(); + for h in hdrs.iter().cloned() { + __result.push(v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "\"".to_string(), + field_init_node_name_at(h.clone(), source_indices.clone()), + ), + "\": ".to_string(), + ), + emit_simple_expr( + &field_init_node_value(&h), + &RenderTarget::Python, + &source_indices, + ), + )); + } + __result + }); + let all_entries = if (auth_entry.clone().as_str() == "".to_string().as_str()) { header_entries.join(&", ".to_string()) } else { v2_rt::concat(auth_entry.clone(), header_entries.join(&", ".to_string())) }; -v2_rt::concat(v2_rt::concat("headers = {".to_string(), all_entries), "}".to_string()) -} + v2_rt::concat( + v2_rt::concat("headers = {".to_string(), all_entries), + "}".to_string(), + ) + } } -pub fn emit_py_shell_call(op_name: String, transport: Rc, source_indices: &Rc>>) -> String { +pub fn emit_py_shell_call( + op_name: String, + transport: Rc, + source_indices: &Rc>>, +) -> String { { let envs = transport_env(transport, source_indices.clone()); -let env_dict_entries = Rc::new({ let mut __result = Vec::new(); for e in envs.iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(v2_rt::concat("\"".to_string(), field_init_node_name_at(e.clone(), source_indices.clone())), "\": ".to_string()), emit_simple_expr(&field_init_node_value(&e), &RenderTarget::Python, &source_indices))); } __result }); -let env_str = v2_rt::concat(v2_rt::concat("{".to_string(), env_dict_entries.join(&", ".to_string())), "}".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("import subprocess\n".to_string(), "result = subprocess.run(\n".to_string()), " [\"".to_string()), emit_ident(op_name, RenderTarget::Python)), "\"],\n".to_string()), " cwd=self.working_dir or \".\",\n".to_string()), " env=".to_string()), env_str), ",\n".to_string()), " capture_output=True, text=True,\n".to_string()), ")\n".to_string()), "return result.stdout".to_string()) -} + let env_dict_entries = Rc::new({ + let mut __result = Vec::new(); + for e in envs.iter().cloned() { + __result.push(v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "\"".to_string(), + field_init_node_name_at(e.clone(), source_indices.clone()), + ), + "\": ".to_string(), + ), + emit_simple_expr( + &field_init_node_value(&e), + &RenderTarget::Python, + &source_indices, + ), + )); + } + __result + }); + let env_str = v2_rt::concat( + v2_rt::concat("{".to_string(), env_dict_entries.join(&", ".to_string())), + "}".to_string(), + ); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "import subprocess\n".to_string(), + "result = subprocess.run(\n".to_string(), + ), + " [\"".to_string(), + ), + emit_ident(op_name, RenderTarget::Python), + ), + "\"],\n".to_string(), + ), + " cwd=self.working_dir or \".\",\n".to_string(), + ), + " env=".to_string(), + ), + env_str, + ), + ",\n".to_string(), + ), + " capture_output=True, text=True,\n".to_string(), + ), + ")\n".to_string(), + ), + "return result.stdout".to_string(), + ) + } } pub fn emit_py_file_call(op_name: String) -> String { { - let self_base_path = v2_rt::concat(v2_rt::concat("{".to_string(), "self.base_path".to_string()), "}".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("path = f\"".to_string(), self_base_path), "/".to_string()), emit_ident(op_name, RenderTarget::Python)), "\"\n".to_string()), "with open(path) as f:\n".to_string()), " return f.read()".to_string()) -} + let self_base_path = v2_rt::concat( + v2_rt::concat("{".to_string(), "self.base_path".to_string()), + "}".to_string(), + ); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("path = f\"".to_string(), self_base_path), + "/".to_string(), + ), + emit_ident(op_name, RenderTarget::Python), + ), + "\"\n".to_string(), + ), + "with open(path) as f:\n".to_string(), + ), + " return f.read()".to_string(), + ) + } } pub fn emit_py_local_call(op_name: String) -> String { - v2_rt::concat(v2_rt::concat(v2_rt::concat("# Local binding -- direct function call\n".to_string(), "return ".to_string()), emit_ident(op_name, RenderTarget::Python)), "()".to_string()) + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "# Local binding -- direct function call\n".to_string(), + "return ".to_string(), + ), + emit_ident(op_name, RenderTarget::Python), + ), + "()".to_string(), + ) } pub fn emit_py_resource_def(item: &Rc, env: &Rc) -> String { { let item_text = authored_name(env.clone(), item.clone()); -let depth = 0; -let cap_children = item.children.clone(); -let methods = Rc::new({ let mut __result = Vec::new(); for c in cap_children.iter().cloned() { __result.push(emit_py_capability_method(&c, &env)); } __result }); -let methods_str = methods.join(&"\n\n".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("from abc import ABC, abstractmethod\n\n".to_string(), language_spec(RenderTarget::Python).items.clone().struct_keyword.clone()), " ".to_string()), item_text), "(ABC):\n".to_string()), make_indent((depth + 1))), methods_str) -} + let depth = 0; + let cap_children = item.children.clone(); + let methods = Rc::new({ + let mut __result = Vec::new(); + for c in cap_children.iter().cloned() { + __result.push(emit_py_capability_method(&c, &env)); + } + __result + }); + let methods_str = methods.join(&"\n\n".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "from abc import ABC, abstractmethod\n\n".to_string(), + language_spec(RenderTarget::Python) + .items + .clone() + .struct_keyword + .clone(), + ), + " ".to_string(), + ), + item_text, + ), + "(ABC):\n".to_string(), + ), + make_indent((depth + 1)), + ), + methods_str, + ) + } } pub fn emit_py_capability_method(cap_node: &Rc, env: &Rc) -> String { { - let input_params = Rc::new({ let mut __result = Vec::new(); for p in cap_node.params.clone().iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(emit_ident(param_node_name_at(p.clone(), env.source_indices.clone()), RenderTarget::Python), ": ".to_string()), emit_node_type(param_node_type_expr(&p), RenderTarget::Python, env.source_indices.clone()))); } __result }); -let params_str = input_params.join(&", ".to_string()); -let all_params = if (params_str.clone().as_str() == "".to_string().as_str()) { + let input_params = Rc::new({ + let mut __result = Vec::new(); + for p in cap_node.params.clone().iter().cloned() { + __result.push(v2_rt::concat( + v2_rt::concat( + emit_ident( + param_node_name_at(p.clone(), env.source_indices.clone()), + RenderTarget::Python, + ), + ": ".to_string(), + ), + emit_node_type( + param_node_type_expr(&p), + RenderTarget::Python, + env.source_indices.clone(), + ), + )); + } + __result + }); + let params_str = input_params.join(&", ".to_string()); + let all_params = if (params_str.clone().as_str() == "".to_string().as_str()) { "self".to_string() } else { v2_rt::concat("self, ".to_string(), params_str.clone()) }; -let ret = emit_node_type(resolved_type(cap_node.clone()), RenderTarget::Python, env.source_indices.clone()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("@abstractmethod\n".to_string(), language_spec(RenderTarget::Python).items.clone().async_prefix.clone()), language_spec(RenderTarget::Python).items.clone().func_keyword.clone()), " ".to_string()), emit_ident(authored_name(env.clone(), cap_node.clone()), RenderTarget::Python)), "(".to_string()), all_params), ") -> ".to_string()), ret), ":\n".to_string()), " ...".to_string()) -} + let ret = emit_node_type( + resolved_type(cap_node.clone()), + RenderTarget::Python, + env.source_indices.clone(), + ); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "@abstractmethod\n".to_string(), + language_spec(RenderTarget::Python) + .items + .clone() + .async_prefix + .clone(), + ), + language_spec(RenderTarget::Python) + .items + .clone() + .func_keyword + .clone(), + ), + " ".to_string(), + ), + emit_ident( + authored_name(env.clone(), cap_node.clone()), + RenderTarget::Python, + ), + ), + "(".to_string(), + ), + all_params, + ), + ") -> ".to_string(), + ), + ret, + ), + ":\n".to_string(), + ), + " ...".to_string(), + ) + } } -pub fn emit_py_data_def(name: String, type_node: Rc, value: Rc, registry: Rc>>, scope: &Rc) -> String { +pub fn emit_py_data_def( + name: String, + type_node: Rc, + value: Rc, + registry: Rc>>, + scope: &Rc, +) -> String { { - let ty_str = emit_node_type(type_node, RenderTarget::Python, scope.type_env.clone().source_indices.clone()); -let upper_name = to_screaming_snake(name); -let val_str = emit_py_typed_expr(value, registry, &scope, 0, 1024); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(upper_name, ": ".to_string()), ty_str), " = ".to_string()), val_str) -} + let ty_str = emit_node_type( + type_node, + RenderTarget::Python, + scope.type_env.clone().source_indices.clone(), + ); + let upper_name = to_screaming_snake(name); + let val_str = emit_py_typed_expr(value, registry, &scope, 0, 1024); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(v2_rt::concat(upper_name, ": ".to_string()), ty_str), + " = ".to_string(), + ), + val_str, + ) + } } pub fn emit_requirements_txt(has_services: bool) -> Rc { { let base_deps = "".to_string(); -let async_deps = if has_services { + let async_deps = if has_services { "aiohttp>=3.9\n".to_string() } else { "".to_string() }; -Rc::new(TextFile { - path: "requirements.txt".to_string(), - content: v2_rt::concat(base_deps, async_deps), -}) -} + Rc::new(TextFile { + path: "requirements.txt".to_string(), + content: v2_rt::concat(base_deps, async_deps), + }) + } } diff --git a/src/v2/stage0/src/v2_compiler_emit_rust.rs b/src/v2/stage0/src/v2_compiler_emit_rust.rs index b7aa3a2e8e9..7a51d3ff8b8 100644 --- a/src/v2/stage0/src/v2_compiler_emit_rust.rs +++ b/src/v2/stage0/src/v2_compiler_emit_rust.rs @@ -1,120 +1,210 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.emit_rust -use std::collections::HashMap; -use std::rc::Rc; +pub use crate::extdeps_languages_rust_emit::{ + rt_bridge_function_names, rt_functions, rt_ref_map_functions, rt_wraps_result, + rust_container_templates, rust_enum_derives, rust_enum_derives_copy, rust_higher_order_methods, + rust_method_wraps_result, rust_struct_derives, rust_struct_derives_copy, HigherOrderMethodSpec, +}; +pub use crate::std_induction::SubValueRelation; +use crate::std_induction::SubValueRelation::SubValueUnknown; +pub use crate::std_types::is_container_type; +pub use crate::v2_compiler_artifact::RenderTarget; +use crate::v2_compiler_artifact::RenderTarget::Rust; +pub use crate::v2_compiler_coercion::{coerce_primitive_type, is_copy, lookup_checkpoint}; +pub use crate::v2_compiler_compiler_tests_rust::compiler_tests_source; +pub use crate::v2_compiler_emit::{ + apply_named_template, apply_type_template1, apply_type_template2, apply_type_template3, + capitalize_first, compute_service_fields, effective_operation_transport, emit_bin_op_symbol, + emit_data_value_json, emit_error_expr, emit_ident, emit_keyword, emit_lambda, + emit_lambda_params, emit_let_binding, emit_let_binding_annotated, emit_list_lit_expr, + emit_literal, emit_node_type, emit_null_coalesce, emit_return, emit_shared_expr, + emit_shared_tco_expr, emit_simple_expr, emit_string_literal, emit_typed_cast_shared, + emit_typed_if_shared, emit_typed_let_shared, emit_unary_op, escape_json_string, + escape_rust_interp_text, escape_string_literal_body, extract_modifier_names, + extract_test_projections, has_mock_prefix, has_nested_records_node, has_service_items, + is_data_def_item, is_function_item, is_null_coalesce, is_resource_def_item, is_self_recursive, + is_service_def_item, is_service_item, is_tco_eligible, is_tco_identity_passthrough, + is_type_alias_item, is_type_alias_return_node, is_type_decl_item, is_type_def_item, is_upper, + language_spec, lookup_item, make_indent, module_emit_scope, module_to_filename, + order_typed_call_args, render_node_type, rust_literal_for_pattern, sanitize_service_name, + scope_after_expr, seed_bindings, service_fallback_transport, service_field_ctors, + service_field_decls, service_var_name, tco_reassign_core, test_function_name, to_lower_char, + to_pascal, to_screaming_snake, to_snake, to_string, to_string_helper, to_upper_char, + typed_named_arg_matches, unique_strings, BlockEmitState, EmitResult, InterpPart, + ServiceFieldSet, TcoFrame, TcoReassignInput, TestProjection, +}; +pub use crate::v2_compiler_infer::{ + build_emit_graph_info, build_params_scope, expr_span, extend_scope, InferScope, +}; +use crate::v2_compiler_infer_emit_info::TypeRepr::{EnumRepr, StructRepr}; +pub use crate::v2_compiler_infer_emit_info::{ + find_variant_parent, is_enum_in_summaries, is_known_variant, lookup_emit_type_summary, + variant_belongs_to_enum, EmitGraphInfo, TypeRepr, TypeSummary, +}; +pub use crate::v2_compiler_infer_env::{authored_name, lookup_type_by_name, TypeBinding, TypeEnv}; +use crate::v2_compiler_infer_items::ItemKind::DataItem; +pub use crate::v2_compiler_infer_items::{ItemInfo, ItemKind, ResolvedGraph, TypedModule}; +pub use crate::v2_compiler_infer_service::{ + extract_typed_service_name, is_typed_service_call_receiver, +}; +pub use crate::v2_compiler_infer_sigs::ResolvedFuncEnv; +pub use crate::v2_compiler_infer_types::{ + child_type_node, emit_map_has, for_each_element_type_node, is_coproduct_type, is_product_type, + is_unit_like, node_is_collection, node_is_element_collection, node_is_keyed_collection, + normalize_access_type_node, resolved_type, +}; +use crate::v2_compiler_languages::VisibilitySpec::KeywordVisibility; +pub use crate::v2_compiler_languages::{ + is_string_like, scaffold_for_target, serialization_for_target, sharing_for_target, + test_conventions_for_target, visibility_for_target, ItemKeywords, TestConventions, + VisibilitySpec, +}; +pub use crate::v2_compiler_ownership::{ + analyze_ownership, analyze_single_fold, build_movable_set, build_read_only_params, + collect_callable_refs, OwnershipProof, +}; +pub use crate::v2_compiler_runtime_rust::rust_runtime_source; use crate::v2_rt; -use crate::NonEmptyVec; -use crate::NonEmptyBTreeSet; -pub use crate::v2_std_core::{Node, InferredNode, is_compiler_error, import_is_all, import_specific_names_at, module_imports, module_items, param_node_type_expr, param_node_default_value, authored_name_at, NewlineIndex, find_child_named, expr_var_name_at, expr_call_func_at, field_access_field_at, param_node_name_at, resource_use_name_at, field_binding_name_at, generic_param_name_at, LiteralValue, ExprData, make_expr_node, FieldSummary, VarBindingKind, CallSemantics, MethodSemantics, MatchPattern, field_binding_pattern, TextFile, ErrorNode, make_error_node, SourceSpan, resource_use_resource, BinOp, AlgebraFieldKind, UnaryOpKind, StringPart, transport_base_url, transport_has_auth, transport_auth_token, transport_auth_header_name, transport_headers, transport_env, transport_method, transport_path_template, transport_query, transport_request_body, transport_stdin, transport_response_format, service_config_auth, service_config_auth_input, service_config_auth_source, service_config_endpoint, expr_has_self_call, expr_has_non_tail_self_call, field_access_base, foreach_variable_at, expr_method_name_at, let_binding_name_at, record_lit_type_name_at, arg_name_at, arg_value, arm_body, arm_pattern, arm_guard, field_init_node_name_at, field_init_node_value, make_arg_node, make_named_expr_node, let_value, let_body, lambda_body, lambda_param_names_at, foreach_collection, foreach_body, method_receiver, method_arg_nodes, match_scrutinee, match_arm_nodes, if_condition, if_then_branch, if_else_branch, index_base, index_expr, slice_base, slice_start, slice_end, cast_target, cast_expr, return_value, binop_left, binop_right, make_span, with_required_cardinality, Connective, Cardinality, is_rest_transport, is_shell_transport, is_file_transport, FieldAccessStyle, FieldValueShape, CompilerDiagnostic}; -use crate::v2_std_core::InferredNode::{Resolved, CompilerError, TypeVariable}; -use crate::v2_std_core::ExprData::{NoExprData, ExprLiteral, ExprError, ExprVar, ExprFieldAccess, ExprCall, ExprMethodCall, ExprMatch, ExprIf, ExprLet, ExprRecordLit, ExprListLit, ExprBinOp, ExprUnaryOp, ExprLambda, ExprStringInterp, ExprBlock, ExprCast, ExprForEach, ExprIndex, ExprSlice, ExprReturn}; -use crate::v2_std_core::FieldAccessStyle::{StoredField, EnumAccessor, OptionalUnwrap, TupleFirst, TupleSecond}; -use crate::v2_std_core::FieldValueShape::{OptionalValue}; -use crate::v2_std_core::VarBindingKind::{LocalValueBinding, FunctionValueBinding, VariantValueBinding, MatchBoundBinding}; -use crate::v2_std_core::CallSemantics::{PlainCallSemantics, LookupCallSemantics}; -use crate::v2_std_core::MethodSemantics::{PlainMethodSemantics, AlgebraMethodSemantics, ServiceMethodSemantics}; -use crate::v2_std_core::CompilerDiagnostic::{InternalError}; -use crate::v2_std_core::StringPart::{Text, Interpolation}; +use crate::v2_std_core::AlgebraFieldKind::*; +use crate::v2_std_core::BinOp::*; +use crate::v2_std_core::CallSemantics::{LookupCallSemantics, PlainCallSemantics}; +use crate::v2_std_core::Cardinality::{CardOptional, Required}; +use crate::v2_std_core::CompilerDiagnostic::InternalError; use crate::v2_std_core::Connective::{Conj, Disj, NoConnective}; -use crate::v2_std_core::Cardinality::{Required, CardOptional}; +use crate::v2_std_core::ExprData::{ + ExprBinOp, ExprBlock, ExprCall, ExprCast, ExprError, ExprFieldAccess, ExprForEach, ExprIf, + ExprIndex, ExprLambda, ExprLet, ExprListLit, ExprLiteral, ExprMatch, ExprMethodCall, + ExprRecordLit, ExprReturn, ExprSlice, ExprStringInterp, ExprUnaryOp, ExprVar, NoExprData, +}; +use crate::v2_std_core::FieldAccessStyle::{ + EnumAccessor, OptionalUnwrap, StoredField, TupleFirst, TupleSecond, +}; +use crate::v2_std_core::FieldValueShape::OptionalValue; +use crate::v2_std_core::InferredNode::{CompilerError, Resolved, TypeVariable}; use crate::v2_std_core::LiteralValue::*; use crate::v2_std_core::MatchPattern::*; -use crate::v2_std_core::BinOp::*; -use crate::v2_std_core::AlgebraFieldKind::*; +use crate::v2_std_core::MethodSemantics::{ + AlgebraMethodSemantics, PlainMethodSemantics, ServiceMethodSemantics, +}; +use crate::v2_std_core::StringPart::{Interpolation, Text}; use crate::v2_std_core::UnaryOpKind::*; -pub use crate::v2_compiler_artifact::{RenderTarget}; -use crate::v2_compiler_artifact::RenderTarget::{Rust}; -pub use crate::extdeps_languages_rust_emit::{rt_functions, rt_ref_map_functions, rt_wraps_result, rt_bridge_function_names, rust_container_templates, rust_method_wraps_result, rust_struct_derives, rust_struct_derives_copy, rust_enum_derives, rust_enum_derives_copy, HigherOrderMethodSpec, rust_higher_order_methods}; -pub use crate::v2_compiler_languages::{scaffold_for_target, serialization_for_target, TestConventions, ItemKeywords, test_conventions_for_target, visibility_for_target, sharing_for_target, is_string_like, VisibilitySpec}; -use crate::v2_compiler_languages::VisibilitySpec::{KeywordVisibility}; -pub use crate::v2_compiler_runtime_rust::{rust_runtime_source}; -pub use crate::v2_compiler_compiler_tests_rust::{compiler_tests_source}; -pub use crate::v2_compiler_coercion::{coerce_primitive_type, is_copy, lookup_checkpoint}; -pub use crate::std_types::{is_container_type}; -pub use crate::v2_compiler_infer_env::{TypeEnv, TypeBinding, authored_name, lookup_type_by_name}; -pub use crate::v2_compiler_infer_types::{resolved_type, normalize_access_type_node, for_each_element_type_node, child_type_node, emit_map_has, node_is_keyed_collection, node_is_element_collection, node_is_collection, is_product_type, is_coproduct_type, is_unit_like}; -pub use crate::v2_compiler_infer_sigs::{ResolvedFuncEnv}; -pub use crate::v2_compiler_infer_items::{ResolvedGraph, TypedModule, ItemInfo, ItemKind}; -use crate::v2_compiler_infer_items::ItemKind::{DataItem}; -pub use crate::v2_compiler_infer_service::{is_typed_service_call_receiver, extract_typed_service_name}; -pub use crate::v2_compiler_infer::{InferScope, build_params_scope, extend_scope, build_emit_graph_info, expr_span}; -pub use crate::v2_compiler_infer_emit_info::{EmitGraphInfo, TypeSummary, lookup_emit_type_summary, is_enum_in_summaries, find_variant_parent, is_known_variant, variant_belongs_to_enum, TypeRepr}; -use crate::v2_compiler_infer_emit_info::TypeRepr::{StructRepr, EnumRepr}; -pub use crate::v2_compiler_ownership::{OwnershipProof, analyze_ownership, analyze_single_fold, build_movable_set, build_read_only_params, collect_callable_refs}; -pub use crate::std_induction::{SubValueRelation}; -use crate::std_induction::SubValueRelation::{SubValueUnknown}; -pub use crate::v2_compiler_emit::{EmitResult, BlockEmitState, TestProjection, TcoFrame, TcoReassignInput, InterpPart, rust_literal_for_pattern, emit_literal, emit_bin_op_symbol, emit_keyword, emit_node_type, render_node_type, emit_ident, emit_let_binding, emit_let_binding_annotated, emit_return, emit_unary_op, emit_lambda, emit_error_expr, emit_lambda_params, emit_null_coalesce, emit_list_lit_expr, emit_shared_expr, emit_typed_cast_shared, emit_string_literal, emit_simple_expr, escape_rust_interp_text, escape_string_literal_body, module_emit_scope, scope_after_expr, lookup_item, unique_strings, has_nested_records_node, emit_data_value_json, escape_json_string, module_to_filename, make_indent, to_string, to_string_helper, to_snake, to_screaming_snake, to_pascal, is_upper, to_lower_char, to_upper_char, capitalize_first, sanitize_service_name, service_var_name, test_function_name, apply_type_template1, apply_type_template2, apply_type_template3, apply_named_template, language_spec, is_null_coalesce, is_type_alias_return_node, is_service_item, has_service_items, typed_named_arg_matches, order_typed_call_args, is_type_def_item, is_type_alias_item, is_type_decl_item, is_function_item, is_data_def_item, is_service_def_item, is_resource_def_item, has_mock_prefix, extract_test_projections, is_tco_eligible, is_self_recursive, emit_shared_tco_expr, tco_reassign_core, is_tco_identity_passthrough, service_fallback_transport, effective_operation_transport, ServiceFieldSet, compute_service_fields, service_field_decls, service_field_ctors, extract_modifier_names, seed_bindings, emit_typed_if_shared, emit_typed_let_shared}; - -pub fn render_rust_type(n: Rc, shared_types: Rc>, source_indices: Rc>>) -> String { +use crate::v2_std_core::VarBindingKind::{ + FunctionValueBinding, LocalValueBinding, MatchBoundBinding, VariantValueBinding, +}; +pub use crate::v2_std_core::{ + arg_name_at, arg_value, arm_body, arm_guard, arm_pattern, authored_name_at, binop_left, + binop_right, cast_expr, cast_target, expr_call_func_at, expr_has_non_tail_self_call, + expr_has_self_call, expr_method_name_at, expr_var_name_at, field_access_base, + field_access_field_at, field_binding_name_at, field_binding_pattern, field_init_node_name_at, + field_init_node_value, find_child_named, foreach_body, foreach_collection, foreach_variable_at, + generic_param_name_at, if_condition, if_else_branch, if_then_branch, import_is_all, + import_specific_names_at, index_base, index_expr, is_compiler_error, is_file_transport, + is_rest_transport, is_shell_transport, lambda_body, lambda_param_names_at, let_binding_name_at, + let_body, let_value, make_arg_node, make_error_node, make_expr_node, make_named_expr_node, + make_span, match_arm_nodes, match_scrutinee, method_arg_nodes, method_receiver, module_imports, + module_items, param_node_default_value, param_node_name_at, param_node_type_expr, + record_lit_type_name_at, resource_use_name_at, resource_use_resource, return_value, + service_config_auth, service_config_auth_input, service_config_auth_source, + service_config_endpoint, slice_base, slice_end, slice_start, transport_auth_header_name, + transport_auth_token, transport_base_url, transport_env, transport_has_auth, transport_headers, + transport_method, transport_path_template, transport_query, transport_request_body, + transport_response_format, transport_stdin, with_required_cardinality, AlgebraFieldKind, BinOp, + CallSemantics, Cardinality, CompilerDiagnostic, Connective, ErrorNode, ExprData, + FieldAccessStyle, FieldSummary, FieldValueShape, InferredNode, LiteralValue, MatchPattern, + MethodSemantics, NewlineIndex, Node, SourceSpan, StringPart, TextFile, UnaryOpKind, + VarBindingKind, +}; +use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; + +pub fn render_rust_type( + n: Rc, + shared_types: Rc>, + source_indices: Rc>>, +) -> String { render_node_type(&n, &RenderTarget::Rust, &shared_types, &source_indices) } pub fn type_variable_node(id: String) -> Rc { Rc::new(Node { - name: "".to_string(), - span: make_span(0, 0), - ident_span: None, - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::TypeVariable { - id: id, -})), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}) + name: "".to_string(), + span: make_span(0, 0), + ident_span: None, + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::TypeVariable { id: id })), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }) } pub fn is_type_variable(inferred: Rc) -> bool { match (*inferred).clone() { - InferredNode::TypeVariable { .. } => true, - _ => false, -} + InferredNode::TypeVariable { .. } => true, + _ => false, + } } -pub fn is_rust_value_type(n: Rc, source_indices: Rc>>) -> bool { +pub fn is_rust_value_type( + n: Rc, + source_indices: Rc>>, +) -> bool { { let normed = normalize_access_type_node(n); -match is_copy(RenderTarget::Rust, authored_name_at(source_indices, &normed)) { - Some(v) => v.clone(), - None => false, -} -} + match is_copy( + RenderTarget::Rust, + authored_name_at(source_indices, &normed), + ) { + Some(v) => v.clone(), + None => false, + } + } } -pub fn is_rust_string_like(n: Rc, source_indices: Rc>>) -> bool { +pub fn is_rust_string_like( + n: Rc, + source_indices: Rc>>, +) -> bool { { let normed = normalize_access_type_node(n); -is_string_like(RenderTarget::Rust, authored_name_at(source_indices, &normed)) -} + is_string_like( + RenderTarget::Rust, + authored_name_at(source_indices, &normed), + ) + } } pub fn rust_source_root() -> String { match scaffold_for_target(RenderTarget::Rust).source_dir.clone() { - Some(dir) => dir.clone(), - None => "".to_string(), -} + Some(dir) => dir.clone(), + None => "".to_string(), + } } pub fn rust_source_ext() -> String { - scaffold_for_target(RenderTarget::Rust).source_file_extension.clone() + scaffold_for_target(RenderTarget::Rust) + .source_file_extension + .clone() } pub fn rust_visibility_prefix() -> String { match (*visibility_for_target(RenderTarget::Rust)).clone() { - VisibilitySpec::KeywordVisibility { prefix: p, .. } => p.clone(), - _ => "__VISIBILITY_SPEC_MISMATCH__".to_string(), -} + VisibilitySpec::KeywordVisibility { prefix: p, .. } => p.clone(), + _ => "__VISIBILITY_SPEC_MISMATCH__".to_string(), + } } pub fn rust_items() -> Rc { @@ -138,193 +228,410 @@ pub fn rust_enum_derives_copy_text() -> String { } pub fn rust_serde_tag_attr() -> String { - match serialization_for_target(RenderTarget::Rust).tag_attribute.clone() { - Some(attr) => attr.clone(), - None => emit_error_expr("missing serde tag_attribute for Rust".to_string(), RenderTarget::Rust), -} + match serialization_for_target(RenderTarget::Rust) + .tag_attribute + .clone() + { + Some(attr) => attr.clone(), + None => emit_error_expr( + "missing serde tag_attribute for Rust".to_string(), + RenderTarget::Rust, + ), + } } -pub fn resolve_wire_serde_tag_from_encoding_node(ve: &Rc, source_indices: &Rc>>) -> String { +pub fn resolve_wire_serde_tag_from_encoding_node( + ve: &Rc, + source_indices: &Rc>>, +) -> String { if ((ve.children.clone().len() as i64) > 0) { { - let naming_field = Rc::new({ let mut __result = Vec::new(); for fi in ve.children.clone().iter().cloned() { if (field_init_node_name_at(fi.clone(), source_indices.clone()).as_str() == "naming".to_string().as_str()) { __result.push(fi); } } __result }).first().cloned(); -match naming_field { - Some(nf) => { - let nv = field_init_node_value(&nf); -if (authored_name_at(source_indices.clone(), &nv).as_str() == "SnakeCase".to_string().as_str()) { - "#[serde(rename_all = \"snake_case\")]".to_string() - } else { - "".to_string() + let naming_field = Rc::new({ + let mut __result = Vec::new(); + for fi in ve.children.clone().iter().cloned() { + if (field_init_node_name_at(fi.clone(), source_indices.clone()).as_str() + == "naming".to_string().as_str()) + { + __result.push(fi); + } } -}, - None => "".to_string(), -} -} + __result + }) + .first() + .cloned(); + match naming_field { + Some(nf) => { + let nv = field_init_node_value(&nf); + if (authored_name_at(source_indices.clone(), &nv).as_str() + == "SnakeCase".to_string().as_str()) + { + "#[serde(rename_all = \"snake_case\")]".to_string() + } else { + "".to_string() + } + } + None => "".to_string(), + } + } } else { rust_serde_tag_attr() } } -pub fn resolve_wire_serde_tag(wire_item: &Rc, source_indices: Rc>>) -> String { +pub fn resolve_wire_serde_tag( + wire_item: &Rc, + source_indices: Rc>>, +) -> String { match wire_item.body.clone() { - Some(ve) => resolve_wire_serde_tag_from_encoding_node(&ve, &source_indices), - None => match (*wire_item.expr_data.clone()).clone() { - ExprData::ExprRecordLit { .. } => resolve_wire_serde_tag_from_encoding_node(&wire_item, &source_indices), - _ => rust_serde_tag_attr(), -}, -} + Some(ve) => resolve_wire_serde_tag_from_encoding_node(&ve, &source_indices), + None => match (*wire_item.expr_data.clone()).clone() { + ExprData::ExprRecordLit { .. } => { + resolve_wire_serde_tag_from_encoding_node(&wire_item, &source_indices) + } + _ => rust_serde_tag_attr(), + }, + } } pub fn item_binding_is_named(env: Rc, node: &Rc, name: &String) -> bool { - ((authored_name(env, node.clone()).as_str() == name.clone().as_str()) || (node.name.clone().as_str() == name.clone().as_str())) -} - -pub fn resolve_wire_serde_tag_for_coproduct(wire_contract_item: Option>, source_indices: Rc>>, data_items: Rc>>>>) -> String { - resolve_wire_serde_tag_for_coproduct_seen(wire_contract_item, source_indices, data_items, v2_rt::rc_empty_map::(), 32) -} - -pub fn resolve_wire_serde_tag_for_coproduct_seen(mut wire_contract_item: Option>, mut source_indices: Rc>>, mut data_items: Rc>>>>, mut seen_aliases: Rc>, mut fuel: i64) -> String { + ((authored_name(env, node.clone()).as_str() == name.clone().as_str()) + || (node.name.clone().as_str() == name.clone().as_str())) +} + +pub fn resolve_wire_serde_tag_for_coproduct( + wire_contract_item: Option>, + source_indices: Rc>>, + data_items: Rc>>>>, +) -> String { + resolve_wire_serde_tag_for_coproduct_seen( + wire_contract_item, + source_indices, + data_items, + v2_rt::rc_empty_map::(), + 32, + ) +} + +pub fn resolve_wire_serde_tag_for_coproduct_seen( + mut wire_contract_item: Option>, + mut source_indices: Rc>>, + mut data_items: Rc>>>>, + mut seen_aliases: Rc>, + mut fuel: i64, +) -> String { loop { if (fuel.clone() <= 0) { - break emit_error_expr("wire_contract: VariantEncoding alias chain exceeded recursion limit".to_string(), RenderTarget::Rust); -} else { + break emit_error_expr( + "wire_contract: VariantEncoding alias chain exceeded recursion limit".to_string(), + RenderTarget::Rust, + ); + } else { match wire_contract_item { - None => { break rust_serde_tag_attr(); }, - Some(wc) => { if is_data_def_item(&wc) { - match wc.body.clone() { - None => { break emit_error_expr("wire_contract: data item has no initializer body".to_string(), RenderTarget::Rust); }, - Some(init) => { match (*init.expr_data.clone()).clone() { - ExprData::ExprRecordLit { .. } => { break resolve_wire_serde_tag(&init, source_indices.clone()); }, - ExprData::ExprVar { .. } => { let alias_name = expr_var_name_at(init.clone(), source_indices.clone()); -if (v2_rt::map_get(&seen_aliases, alias_name.clone()) != None) { - break emit_error_expr(v2_rt::concat("wire_contract: cyclic VariantEncoding alias: ".to_string(), alias_name.clone()), RenderTarget::Rust); -} else { - match v2_rt::map_get(&data_items, alias_name.clone()) { - Some(candidates) => { if ((candidates.clone().len() as i64) == 1) { - match candidates.clone().first().cloned() { - Some(aliased_data) => { { - let __tco_0 = Some(aliased_data.clone()); -let __tco_1 = v2_rt::rc_map_insert(seen_aliases, alias_name.clone(), true); -let __tco_2 = (fuel - 1); -wire_contract_item = __tco_0; -seen_aliases = __tco_1; -fuel = __tco_2; -continue; -} }, - None => { break emit_error_expr(v2_rt::concat("wire_contract: missing VariantEncoding data alias: ".to_string(), alias_name.clone()), RenderTarget::Rust); }, -} -} else { - break emit_error_expr(v2_rt::concat("wire_contract: ambiguous VariantEncoding data alias: ".to_string(), alias_name.clone()), RenderTarget::Rust); -} }, - None => { match init.inferred.clone() { - None => { break emit_error_expr("wire_contract: missing type inference on initializer (cannot resolve VariantEncoding alias)".to_string(), RenderTarget::Rust); }, - Some(inf) => { match (*inf.clone()).clone() { - InferredNode::Resolved { node, .. } => { if is_data_def_item(&node) { - { - let __tco_0 = Some(node.clone()); -let __tco_1 = v2_rt::rc_map_insert(seen_aliases, alias_name.clone(), true); -let __tco_2 = (fuel - 1); -wire_contract_item = __tco_0; -seen_aliases = __tco_1; -fuel = __tco_2; -continue; -} -} else { - break resolve_wire_serde_tag(&node, source_indices.clone()); -} }, - InferredNode::CompilerError { message, .. } => { break emit_error_expr(v2_rt::concat("wire_contract: ".to_string(), message.clone()), RenderTarget::Rust); }, - InferredNode::TypeVariable { .. } => { break emit_error_expr("wire_contract: unresolved type variable in wire_contract initializer".to_string(), RenderTarget::Rust); }, -} }, -} }, -} -} }, - _ => { match init.inferred.clone() { - None => { break emit_error_expr("wire_contract: missing type inference on initializer (cannot resolve VariantEncoding alias)".to_string(), RenderTarget::Rust); }, - Some(inf) => { match (*inf.clone()).clone() { - InferredNode::Resolved { node, .. } => { if is_data_def_item(&node) { - { - let __tco_0 = Some(node.clone()); -let __tco_1 = (fuel - 1); -wire_contract_item = __tco_0; -fuel = __tco_1; -continue; -} -} else { - break resolve_wire_serde_tag(&node, source_indices.clone()); -} }, - InferredNode::CompilerError { message, .. } => { break emit_error_expr(v2_rt::concat("wire_contract: ".to_string(), message.clone()), RenderTarget::Rust); }, - InferredNode::TypeVariable { .. } => { break emit_error_expr("wire_contract: unresolved type variable in wire_contract initializer".to_string(), RenderTarget::Rust); }, -} }, -} }, -} }, -} -} else { - break resolve_wire_serde_tag(&wc, source_indices.clone()); -} }, -} -} -} + None => { + break rust_serde_tag_attr(); + } + Some(wc) => { + if is_data_def_item(&wc) { + match wc.body.clone() { + None => { + break emit_error_expr( + "wire_contract: data item has no initializer body".to_string(), + RenderTarget::Rust, + ); + } + Some(init) => match (*init.expr_data.clone()).clone() { + ExprData::ExprRecordLit { .. } => { + break resolve_wire_serde_tag(&init, source_indices.clone()); + } + ExprData::ExprVar { .. } => { + let alias_name = + expr_var_name_at(init.clone(), source_indices.clone()); + if (v2_rt::map_get(&seen_aliases, alias_name.clone()) != None) { + break emit_error_expr( + v2_rt::concat( + "wire_contract: cyclic VariantEncoding alias: " + .to_string(), + alias_name.clone(), + ), + RenderTarget::Rust, + ); + } else { + match v2_rt::map_get(&data_items, alias_name.clone()) { + Some(candidates) => { + if ((candidates.clone().len() as i64) == 1) { + match candidates.clone().first().cloned() { + Some(aliased_data) => { + let __tco_0 = + Some(aliased_data.clone()); + let __tco_1 = v2_rt::rc_map_insert( + seen_aliases, + alias_name.clone(), + true, + ); + let __tco_2 = (fuel - 1); + wire_contract_item = __tco_0; + seen_aliases = __tco_1; + fuel = __tco_2; + continue; + } + None => { + break emit_error_expr(v2_rt::concat("wire_contract: missing VariantEncoding data alias: ".to_string(), alias_name.clone()), RenderTarget::Rust); + } + } + } else { + break emit_error_expr(v2_rt::concat("wire_contract: ambiguous VariantEncoding data alias: ".to_string(), alias_name.clone()), RenderTarget::Rust); + } + } + None => match init.inferred.clone() { + None => { + break emit_error_expr("wire_contract: missing type inference on initializer (cannot resolve VariantEncoding alias)".to_string(), RenderTarget::Rust); + } + Some(inf) => match (*inf.clone()).clone() { + InferredNode::Resolved { node, .. } => { + if is_data_def_item(&node) { + { + let __tco_0 = Some(node.clone()); + let __tco_1 = v2_rt::rc_map_insert( + seen_aliases, + alias_name.clone(), + true, + ); + let __tco_2 = (fuel - 1); + wire_contract_item = __tco_0; + seen_aliases = __tco_1; + fuel = __tco_2; + continue; + } + } else { + break resolve_wire_serde_tag( + &node, + source_indices.clone(), + ); + } + } + InferredNode::CompilerError { + message, .. + } => { + break emit_error_expr( + v2_rt::concat( + "wire_contract: ".to_string(), + message.clone(), + ), + RenderTarget::Rust, + ); + } + InferredNode::TypeVariable { .. } => { + break emit_error_expr("wire_contract: unresolved type variable in wire_contract initializer".to_string(), RenderTarget::Rust); + } + }, + }, + } + } + } + _ => match init.inferred.clone() { + None => { + break emit_error_expr("wire_contract: missing type inference on initializer (cannot resolve VariantEncoding alias)".to_string(), RenderTarget::Rust); + } + Some(inf) => match (*inf.clone()).clone() { + InferredNode::Resolved { node, .. } => { + if is_data_def_item(&node) { + { + let __tco_0 = Some(node.clone()); + let __tco_1 = (fuel - 1); + wire_contract_item = __tco_0; + fuel = __tco_1; + continue; + } + } else { + break resolve_wire_serde_tag( + &node, + source_indices.clone(), + ); + } + } + InferredNode::CompilerError { message, .. } => { + break emit_error_expr( + v2_rt::concat( + "wire_contract: ".to_string(), + message.clone(), + ), + RenderTarget::Rust, + ); + } + InferredNode::TypeVariable { .. } => { + break emit_error_expr("wire_contract: unresolved type variable in wire_contract initializer".to_string(), RenderTarget::Rust); + } + }, + }, + }, + } + } else { + break resolve_wire_serde_tag(&wc, source_indices.clone()); + } + } + } + } + } } pub fn build_data_item_index(modules: Rc>>) -> Rc>> { - modules.iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, tm: Rc| { - let module_name = authored_name_at(tm.type_env.clone().source_indices.clone(), &tm.module.clone()); -Rc::new({ let mut __result = Vec::new(); for item in tm.items.clone().iter().cloned() { if is_data_def_item(&item) { __result.push(item); } } __result }).iter().cloned().fold(acc, |item_acc: Rc>>, item: Rc| { - let item_name = authored_name_at(tm.type_env.clone().source_indices.clone(), &item); -let qualified_name = v2_rt::concat(v2_rt::concat(module_name.clone(), ".".to_string()), item_name.clone()); -v2_rt::rc_map_insert(item_acc, qualified_name.clone(), item.clone()) -}) -}) + modules.iter().cloned().fold( + v2_rt::rc_empty_map::>(), + |acc: Rc>>, tm: Rc| { + let module_name = authored_name_at( + tm.type_env.clone().source_indices.clone(), + &tm.module.clone(), + ); + Rc::new({ + let mut __result = Vec::new(); + for item in tm.items.clone().iter().cloned() { + if is_data_def_item(&item) { + __result.push(item); + } + } + __result + }) + .iter() + .cloned() + .fold( + acc, + |item_acc: Rc>>, item: Rc| { + let item_name = + authored_name_at(tm.type_env.clone().source_indices.clone(), &item); + let qualified_name = v2_rt::concat( + v2_rt::concat(module_name.clone(), ".".to_string()), + item_name.clone(), + ); + v2_rt::rc_map_insert(item_acc, qualified_name.clone(), item.clone()) + }, + ) + }, + ) } -pub fn insert_scoped_data_item(scoped: &Rc>>>>, name: &String, item: Rc) -> Rc>>>> { +pub fn insert_scoped_data_item( + scoped: &Rc>>>>, + name: &String, + item: Rc, +) -> Rc>>>> { { let existing = match v2_rt::map_get(&scoped, name.clone()) { - Some(entries) => entries.clone(), - None => Rc::new(vec![]), -}; -v2_rt::rc_map_insert(scoped.clone(), name.clone(), v2_rt::concat(existing, Rc::new(vec![item]))) -} + Some(entries) => entries.clone(), + None => Rc::new(vec![]), + }; + v2_rt::rc_map_insert( + scoped.clone(), + name.clone(), + v2_rt::concat(existing, Rc::new(vec![item])), + ) + } } -pub fn build_scoped_data_item_index(typed_module: &Rc, data_items: Rc>>) -> Rc>>>> { +pub fn build_scoped_data_item_index( + typed_module: &Rc, + data_items: Rc>>, +) -> Rc>>>> { { - let module_name = authored_name_at(typed_module.type_env.clone().source_indices.clone(), &typed_module.module.clone()); -let local = Rc::new({ let mut __result = Vec::new(); for item in typed_module.items.clone().iter().cloned() { if is_data_def_item(&item) { __result.push(item); } } __result }).iter().cloned().fold(v2_rt::rc_empty_map::>>>(), |acc: Rc>>>>, item: Rc| insert_scoped_data_item(&acc, &authored_name_at(typed_module.type_env.clone().source_indices.clone(), &item), item.clone())); -module_imports(typed_module.module.clone()).iter().cloned().fold(local.clone(), |acc: Rc>>>>, imp: Rc| { - let import_path = authored_name_at(typed_module.type_env.clone().source_indices.clone(), &imp); -if import_is_all(imp.clone()) { - acc.clone() - } else { - import_specific_names_at(imp.clone(), typed_module.type_env.clone().source_indices.clone()).iter().cloned().fold(acc.clone(), |inner: Rc>>>>, imported_name: String| { - let qualified = v2_rt::concat(v2_rt::concat(import_path.clone(), ".".to_string()), imported_name.clone()); -match v2_rt::map_get(&data_items, qualified.clone()) { - Some(imported_item) => insert_scoped_data_item(&inner, &imported_name, imported_item.clone()), - None => inner.clone(), -} -}) + let module_name = authored_name_at( + typed_module.type_env.clone().source_indices.clone(), + &typed_module.module.clone(), + ); + let local = Rc::new({ + let mut __result = Vec::new(); + for item in typed_module.items.clone().iter().cloned() { + if is_data_def_item(&item) { + __result.push(item); + } } -}) -} + __result + }) + .iter() + .cloned() + .fold( + v2_rt::rc_empty_map::>>>(), + |acc: Rc>>>>, item: Rc| { + insert_scoped_data_item( + &acc, + &authored_name_at(typed_module.type_env.clone().source_indices.clone(), &item), + item.clone(), + ) + }, + ); + module_imports(typed_module.module.clone()) + .iter() + .cloned() + .fold( + local.clone(), + |acc: Rc>>>>, imp: Rc| { + let import_path = authored_name_at( + typed_module.type_env.clone().source_indices.clone(), + &imp, + ); + if import_is_all(imp.clone()) { + acc.clone() + } else { + import_specific_names_at( + imp.clone(), + typed_module.type_env.clone().source_indices.clone(), + ) + .iter() + .cloned() + .fold( + acc.clone(), + |inner: Rc>>>>, + imported_name: String| { + let qualified = v2_rt::concat( + v2_rt::concat(import_path.clone(), ".".to_string()), + imported_name.clone(), + ); + match v2_rt::map_get(&data_items, qualified.clone()) { + Some(imported_item) => insert_scoped_data_item( + &inner, + &imported_name, + imported_item.clone(), + ), + None => inner.clone(), + } + }, + ) + } + }, + ) + } } pub fn rust_serde_rename_template_text() -> String { - match serialization_for_target(RenderTarget::Rust).rename_attribute_template.clone() { - Some(template) => template.clone(), - None => emit_error_expr("missing serde rename_attribute_template for Rust".to_string(), RenderTarget::Rust), -} + match serialization_for_target(RenderTarget::Rust) + .rename_attribute_template + .clone() + { + Some(template) => template.clone(), + None => emit_error_expr( + "missing serde rename_attribute_template for Rust".to_string(), + RenderTarget::Rust, + ), + } } pub fn rust_test_file_path(module_name: String) -> String { { let conventions = test_conventions_for_target(RenderTarget::Rust); -let file_dir = match conventions.file_dir.clone() { - Some(dir) => dir.clone(), - None => "".to_string(), -}; -let filename = module_to_filename(module_name); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(file_dir, conventions.file_prefix.clone()), filename), conventions.file_suffix.clone()), rust_source_ext()) -} + let file_dir = match conventions.file_dir.clone() { + Some(dir) => dir.clone(), + None => "".to_string(), + }; + let filename = module_to_filename(module_name); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(file_dir, conventions.file_prefix.clone()), + filename, + ), + conventions.file_suffix.clone(), + ), + rust_source_ext(), + ) + } } pub fn rust_test_name(projection: Rc) -> String { @@ -332,141 +639,285 @@ pub fn rust_test_name(projection: Rc) -> String { } pub fn rust_async_test_decorator() -> String { - match test_conventions_for_target(RenderTarget::Rust).async_decorator.clone() { - Some(decorator) => decorator.clone(), - None => emit_error_expr("missing async_decorator for Rust test conventions".to_string(), RenderTarget::Rust), -} + match test_conventions_for_target(RenderTarget::Rust) + .async_decorator + .clone() + { + Some(decorator) => decorator.clone(), + None => emit_error_expr( + "missing async_decorator for Rust test conventions".to_string(), + RenderTarget::Rust, + ), + } } -pub fn emit_rust_block_stmts(mut remaining: Rc>>, mut text: Rc>, mut scope: Rc, mut registry: Rc>>, mut depth: i64, mut shared_types: Rc>, mut emit_info: Rc) -> Rc { +pub fn emit_rust_block_stmts( + mut remaining: Rc>>, + mut text: Rc>, + mut scope: Rc, + mut registry: Rc>>, + mut depth: i64, + mut shared_types: Rc>, + mut emit_info: Rc, +) -> Rc { loop { match remaining.clone().first().cloned() { - None => { break Rc::new(BlockEmitState { - text: text, - scope: scope.clone(), -}); }, - Some(stmt) => { let line = emit_typed_expr(stmt.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -let next_scope = scope_after_expr(&stmt, &scope); -{ - let __tco_0 = Rc::new(remaining.iter().cloned().skip(1 as usize).collect::>()); -let __tco_1 = v2_rt::rc_list_push(text, line); -let __tco_2 = next_scope; -remaining = __tco_0; -text = __tco_1; -scope = __tco_2; -continue; -} }, -} -} -} - -pub fn emit_rust_init_block_stmts(mut remaining: Rc>>, mut text: Rc>, mut scope: Rc, mut registry: Rc>>, mut depth: i64, mut shared_types: Rc>, mut emit_info: Rc) -> Rc { + None => { + break Rc::new(BlockEmitState { + text: text, + scope: scope.clone(), + }); + } + Some(stmt) => { + let line = emit_typed_expr( + stmt.clone(), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + let next_scope = scope_after_expr(&stmt, &scope); + { + let __tco_0 = Rc::new( + remaining + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ); + let __tco_1 = v2_rt::rc_list_push(text, line); + let __tco_2 = next_scope; + remaining = __tco_0; + text = __tco_1; + scope = __tco_2; + continue; + } + } + } + } +} + +pub fn emit_rust_init_block_stmts( + mut remaining: Rc>>, + mut text: Rc>, + mut scope: Rc, + mut registry: Rc>>, + mut depth: i64, + mut shared_types: Rc>, + mut emit_info: Rc, +) -> Rc { loop { match remaining.clone().first().cloned() { - None => { break Rc::new(BlockEmitState { - text: text, - scope: scope.clone(), -}); }, - Some(stmt) => { let rest = Rc::new(remaining.clone().iter().cloned().skip(1 as usize).collect::>()); -match rest.clone().first().cloned() { - None => { break Rc::new(BlockEmitState { - text: text, - scope: scope.clone(), -}); }, - Some(_) => { let raw_line = emit_typed_expr(stmt.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -let is_let = match (*stmt.expr_data.clone()).clone() { - ExprData::ExprLet => true, - _ => false, -}; -let line = if is_let { - raw_line - } else { - v2_rt::concat(raw_line, ";".to_string()) - }; -let next_scope = scope_after_expr(&stmt, &scope); -{ - let __tco_0 = rest.clone(); -let __tco_1 = v2_rt::rc_list_push(text, line); -let __tco_2 = next_scope; -remaining = __tco_0; -text = __tco_1; -scope = __tco_2; -continue; -} }, -} }, -} -} + None => { + break Rc::new(BlockEmitState { + text: text, + scope: scope.clone(), + }); + } + Some(stmt) => { + let rest = Rc::new( + remaining + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ); + match rest.clone().first().cloned() { + None => { + break Rc::new(BlockEmitState { + text: text, + scope: scope.clone(), + }); + } + Some(_) => { + let raw_line = emit_typed_expr( + stmt.clone(), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + let is_let = match (*stmt.expr_data.clone()).clone() { + ExprData::ExprLet => true, + _ => false, + }; + let line = if is_let { + raw_line + } else { + v2_rt::concat(raw_line, ";".to_string()) + }; + let next_scope = scope_after_expr(&stmt, &scope); + { + let __tco_0 = rest.clone(); + let __tco_1 = v2_rt::rc_list_push(text, line); + let __tco_2 = next_scope; + remaining = __tco_0; + text = __tco_1; + scope = __tco_2; + continue; + } + } + } + } + } + } } pub fn has_complex_variants(item: &Rc) -> bool { if ((item.children.clone().len() as i64) == 0) { false } else { - { let mut __found = false; for c in item.children.clone().iter().cloned() { if (c.connective.clone() != Connective::NoConnective) { __found = true; break; } } __found } + { + let mut __found = false; + for c in item.children.clone().iter().cloned() { + if (c.connective.clone() != Connective::NoConnective) { + __found = true; + break; + } + } + __found + } } } pub fn is_simple_disj(item: Rc) -> bool { { - let complex = Rc::new({ let mut __result = Vec::new(); for v in item.children.clone().iter().cloned() { if ((v.children.clone().len() as i64) > 0) { __result.push(v); } } __result }); -((complex.len() as i64) == 0) -} + let complex = Rc::new({ + let mut __result = Vec::new(); + for v in item.children.clone().iter().cloned() { + if ((v.children.clone().len() as i64) > 0) { + __result.push(v); + } + } + __result + }); + ((complex.len() as i64) == 0) + } } pub fn is_dag_value_type_name(name: String) -> bool { match is_copy(RenderTarget::Rust, name) { - Some(v) => v.clone(), - None => false, -} + Some(v) => v.clone(), + None => false, + } } -pub fn is_type_constant(summary: &Rc, recursive_type_set: Rc>) -> bool { +pub fn is_type_constant( + summary: &Rc, + recursive_type_set: Rc>, +) -> bool { { let is_recursive = v2_rt::map_contains_key(&recursive_type_set, summary.name.clone()); -let has_generics = ((summary.generic_param_names.clone().len() as i64) > 0); -match (*summary.repr.clone()).clone() { - TypeRepr::EnumRepr { unit_only, .. } => (((unit_only.clone() && !is_recursive) && !has_generics) && !summary.has_fn_fields.clone()), - TypeRepr::StructRepr => if ((is_recursive || has_generics) || summary.has_fn_fields.clone()) { - false - } else { - { - let field_count = (Rc::new(v2_rt::map_keys(&summary.field_summaries.clone())).len() as i64); -let ft_count = (Rc::new(v2_rt::map_keys(&summary.field_type_map.clone())).len() as i64); -if (ft_count < field_count) { + let has_generics = ((summary.generic_param_names.clone().len() as i64) > 0); + match (*summary.repr.clone()).clone() { + TypeRepr::EnumRepr { unit_only, .. } => { + (((unit_only.clone() && !is_recursive) && !has_generics) + && !summary.has_fn_fields.clone()) + } + TypeRepr::StructRepr => { + if ((is_recursive || has_generics) || summary.has_fn_fields.clone()) { false } else { - { let mut __all = true; for tn in Rc::new(v2_rt::map_values(&summary.field_type_map.clone())).iter().cloned() { if !(is_dag_value_type_name(tn.clone())) { __all = false; break; } } __all } + { + let field_count = + (Rc::new(v2_rt::map_keys(&summary.field_summaries.clone())).len() + as i64); + let ft_count = (Rc::new(v2_rt::map_keys(&summary.field_type_map.clone())) + .len() as i64); + if (ft_count < field_count) { + false + } else { + { + let mut __all = true; + for tn in + Rc::new(v2_rt::map_values(&summary.field_type_map.clone())) + .iter() + .cloned() + { + if !(is_dag_value_type_name(tn.clone())) { + __all = false; + break; + } + } + __all + } + } + } } -} - }, -} -} + } + } + } } -pub fn maybe_mark_shared_type(acc: Rc>, summary: &Rc, recursive_type_set: Rc>, target_needs_sharing: bool) -> Rc> { +pub fn maybe_mark_shared_type( + acc: Rc>, + summary: &Rc, + recursive_type_set: Rc>, + target_needs_sharing: bool, +) -> Rc> { { - let needs_sharing = (target_needs_sharing && match (*summary.repr.clone()).clone() { - TypeRepr::StructRepr => true, - TypeRepr::EnumRepr { unit_only, .. } => (unit_only.clone() == false), -}); -if (needs_sharing && !is_type_constant(&summary, recursive_type_set)) { + let needs_sharing = (target_needs_sharing + && match (*summary.repr.clone()).clone() { + TypeRepr::StructRepr => true, + TypeRepr::EnumRepr { unit_only, .. } => (unit_only.clone() == false), + }); + if (needs_sharing && !is_type_constant(&summary, recursive_type_set)) { v2_rt::rc_map_insert(acc, summary.name.clone(), true) } else { acc } -} + } } -pub fn build_shared_types(type_summaries: Rc>>, recursive_type_set: Rc>, target: RenderTarget) -> Rc> { +pub fn build_shared_types( + type_summaries: Rc>>, + recursive_type_set: Rc>, + target: RenderTarget, +) -> Rc> { { let sharing = sharing_for_target(target); -let user_shared = Rc::new(v2_rt::map_values(&type_summaries)).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, summary: Rc| maybe_mark_shared_type(acc, &summary, recursive_type_set.clone(), sharing.needs_sharing.clone())); -let collection_keys = Rc::new({ let mut __result = Vec::new(); for k in Rc::new(v2_rt::map_keys(&rust_container_templates())).iter().cloned() { if ((sharing.needs_sharing.clone() && (k.clone().as_str() != "optional".to_string().as_str())) && (k.clone().as_str() != "boolean_algebra".to_string().as_str())) { __result.push(k); } } __result }); -collection_keys.iter().cloned().fold(user_shared.clone(), |acc: Rc>, key: String| { - let pascal = to_pascal(key.clone()); -v2_rt::rc_map_insert(acc, pascal.clone(), true) -}) -} + let user_shared = Rc::new(v2_rt::map_values(&type_summaries)) + .iter() + .cloned() + .fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, summary: Rc| { + maybe_mark_shared_type( + acc, + &summary, + recursive_type_set.clone(), + sharing.needs_sharing.clone(), + ) + }, + ); + let collection_keys = Rc::new({ + let mut __result = Vec::new(); + for k in Rc::new(v2_rt::map_keys(&rust_container_templates())) + .iter() + .cloned() + { + if ((sharing.needs_sharing.clone() + && (k.clone().as_str() != "optional".to_string().as_str())) + && (k.clone().as_str() != "boolean_algebra".to_string().as_str())) + { + __result.push(k); + } + } + __result + }); + collection_keys.iter().cloned().fold( + user_shared.clone(), + |acc: Rc>, key: String| { + let pascal = to_pascal(key.clone()); + v2_rt::rc_map_insert(acc, pascal.clone(), true) + }, + ) + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -484,386 +935,1166 @@ pub struct OwnershipBuildResult { pub fn build_ownership_results(modules: &Rc>>) -> Rc { { - let callable_set = modules.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, m: Rc| Rc::new({ let mut __result = Vec::new(); for item in m.items.clone().iter().cloned() { if (item.body.clone() != None) { __result.push(item); } } __result }).iter().cloned().fold(acc, |inner: Rc>, item: Rc| v2_rt::rc_map_merge(inner, collect_callable_refs(&item.body.clone().clone().unwrap(), &m.type_env.clone().source_indices.clone())))); -let proofs = Rc::new({ let mut __result = Vec::new(); for m in modules.clone().iter().cloned() { __result.extend((*Rc::new({ let mut __result = Vec::new(); for item in Rc::new({ let mut __result = Vec::new(); for item in m.items.clone().iter().cloned() { if (item.body.clone() != None) { __result.push(item); } } __result }).iter().cloned() { __result.push({ - let pnames = item.params.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, p: Rc| v2_rt::rc_map_insert(acc, param_node_name_at(p.clone(), m.type_env.clone().source_indices.clone()), true)); -let si = m.type_env.clone().source_indices.clone(); -let qualified = v2_rt::concat(v2_rt::concat(authored_name_at(si.clone(), &m.module.clone()), ".".to_string()), authored_name_at(si.clone(), &item)); -Rc::new(OwnershipProofEntry { - name: qualified.clone(), - proof: analyze_ownership(authored_name_at(si.clone(), &item), item.params.clone(), item.body.clone().clone().unwrap(), &si), - param_names: pnames.clone(), -}) -}); } __result })).iter().cloned()); } __result }); -proofs.iter().cloned().fold(Rc::new(OwnershipBuildResult { - ownership_index: v2_rt::rc_empty_map::>>(), - read_only_params_index: v2_rt::rc_empty_map::>>(), -}), |acc: Rc, entry: Rc| { let acc = Rc::try_unwrap(acc).unwrap_or_else(|rc| (*rc).clone()); { - let read_only = if v2_rt::map_contains_key(&callable_set, entry.proof.clone().func_name.clone()) { - v2_rt::rc_empty_map::() - } else { - build_read_only_params(entry.proof.clone(), entry.param_names.clone()) - }; -let movable = build_movable_set(entry.proof.clone()); -Rc::new(OwnershipBuildResult { - ownership_index: v2_rt::rc_map_insert(acc.ownership_index, entry.name.clone(), movable.clone()), - read_only_params_index: v2_rt::rc_map_insert(acc.read_only_params_index, entry.name.clone(), read_only.clone()), -}) -} }) -} + let callable_set = modules.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, m: Rc| { + Rc::new({ + let mut __result = Vec::new(); + for item in m.items.clone().iter().cloned() { + if (item.body.clone() != None) { + __result.push(item); + } + } + __result + }) + .iter() + .cloned() + .fold(acc, |inner: Rc>, item: Rc| { + v2_rt::rc_map_merge( + inner, + collect_callable_refs( + &item.body.clone().clone().unwrap(), + &m.type_env.clone().source_indices.clone(), + ), + ) + }) + }, + ); + let proofs = Rc::new({ + let mut __result = Vec::new(); + for m in modules.clone().iter().cloned() { + __result.extend( + (*Rc::new({ + let mut __result = Vec::new(); + for item in Rc::new({ + let mut __result = Vec::new(); + for item in m.items.clone().iter().cloned() { + if (item.body.clone() != None) { + __result.push(item); + } + } + __result + }) + .iter() + .cloned() + { + __result.push({ + let pnames = item.params.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, p: Rc| { + v2_rt::rc_map_insert( + acc, + param_node_name_at( + p.clone(), + m.type_env.clone().source_indices.clone(), + ), + true, + ) + }, + ); + let si = m.type_env.clone().source_indices.clone(); + let qualified = v2_rt::concat( + v2_rt::concat( + authored_name_at(si.clone(), &m.module.clone()), + ".".to_string(), + ), + authored_name_at(si.clone(), &item), + ); + Rc::new(OwnershipProofEntry { + name: qualified.clone(), + proof: analyze_ownership( + authored_name_at(si.clone(), &item), + item.params.clone(), + item.body.clone().clone().unwrap(), + &si, + ), + param_names: pnames.clone(), + }) + }); + } + __result + })) + .iter() + .cloned(), + ); + } + __result + }); + proofs.iter().cloned().fold( + Rc::new(OwnershipBuildResult { + ownership_index: v2_rt::rc_empty_map::>>(), + read_only_params_index: v2_rt::rc_empty_map::>>(), + }), + |acc: Rc, entry: Rc| { + let acc = Rc::try_unwrap(acc).unwrap_or_else(|rc| (*rc).clone()); + { + let read_only = if v2_rt::map_contains_key( + &callable_set, + entry.proof.clone().func_name.clone(), + ) { + v2_rt::rc_empty_map::() + } else { + build_read_only_params(entry.proof.clone(), entry.param_names.clone()) + }; + let movable = build_movable_set(entry.proof.clone()); + Rc::new(OwnershipBuildResult { + ownership_index: v2_rt::rc_map_insert( + acc.ownership_index, + entry.name.clone(), + movable.clone(), + ), + read_only_params_index: v2_rt::rc_map_insert( + acc.read_only_params_index, + entry.name.clone(), + read_only.clone(), + ), + }) + } + }, + ) + } } pub fn emit_rust(typed: &Rc) -> Rc { { let base_info = build_emit_graph_info(&typed.modules.clone()); -let ownership = build_ownership_results(&typed.modules.clone()); -let shared = build_shared_types(base_info.type_summaries.clone(), base_info.recursive_type_set.clone(), RenderTarget::Rust); -let emit_info = Rc::new(EmitGraphInfo { - type_summaries: base_info.type_summaries.clone(), - recursive_type_set: base_info.recursive_type_set.clone(), - fielded_variants: base_info.fielded_variants.clone(), - shared_types: shared, - ownership_index: ownership.ownership_index.clone(), - movable: v2_rt::rc_empty_map::(), - variant_to_enum: base_info.variant_to_enum.clone(), - owned_bindings: v2_rt::rc_empty_map::(), - read_only_params_index: ownership.read_only_params_index.clone(), - read_only_params: v2_rt::rc_empty_map::(), -}); -let shared_types = emit_info.shared_types.clone(); -let registry = typed.item_registry.clone(); -let data_items = build_data_item_index(typed.modules.clone()); -let workflow_funcs = collect_workflow_funcs(typed.modules.clone(), registry.clone(), emit_info.read_only_params_index.clone()); -let workflow_default_diags = validate_workflow_param_defaults(workflow_funcs.clone()); -if ((workflow_default_diags.clone().len() as i64) > 0) { + let ownership = build_ownership_results(&typed.modules.clone()); + let shared = build_shared_types( + base_info.type_summaries.clone(), + base_info.recursive_type_set.clone(), + RenderTarget::Rust, + ); + let emit_info = Rc::new(EmitGraphInfo { + type_summaries: base_info.type_summaries.clone(), + recursive_type_set: base_info.recursive_type_set.clone(), + fielded_variants: base_info.fielded_variants.clone(), + shared_types: shared, + ownership_index: ownership.ownership_index.clone(), + movable: v2_rt::rc_empty_map::(), + variant_to_enum: base_info.variant_to_enum.clone(), + owned_bindings: v2_rt::rc_empty_map::(), + read_only_params_index: ownership.read_only_params_index.clone(), + read_only_params: v2_rt::rc_empty_map::(), + }); + let shared_types = emit_info.shared_types.clone(); + let registry = typed.item_registry.clone(); + let data_items = build_data_item_index(typed.modules.clone()); + let workflow_funcs = collect_workflow_funcs( + typed.modules.clone(), + registry.clone(), + emit_info.read_only_params_index.clone(), + ); + let workflow_default_diags = validate_workflow_param_defaults(workflow_funcs.clone()); + if ((workflow_default_diags.clone().len() as i64) > 0) { return Rc::new(EmitResult { - files: Rc::new(vec![]), - diagnostics: workflow_default_diags.clone(), -}) - } -let svc_module_map = typed.modules.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, tm: Rc| { - let svc_items = Rc::new({ let mut __result = Vec::new(); for item in tm.items.clone().iter().cloned() { if is_service_item(&item) { __result.push(item); } } __result }); -let mod_filename = module_to_filename(authored_name_at(tm.type_env.clone().source_indices.clone(), &tm.module.clone())); -svc_items.clone().iter().cloned().fold(acc, |a: Rc>, svc: Rc| v2_rt::rc_map_insert(a, authored_name_at(tm.type_env.clone().source_indices.clone(), &svc), mod_filename.clone())) -}); -let test_projections = extract_test_projections(typed.clone()); -let module_files = Rc::new({ let mut __result = Vec::new(); for tm in typed.modules.clone().iter().cloned() { __result.push(emit_module_full(&tm, ®istry, &emit_info, shared_types.clone(), svc_module_map.clone(), data_items.clone())); } __result }); -let test_files = Rc::new({ let mut __result = Vec::new(); for f in Rc::new({ let mut __result = Vec::new(); for tm in typed.modules.clone().iter().cloned() { __result.push(emit_test_file(&authored_name_at(tm.type_env.clone().source_indices.clone(), &tm.module.clone()), Rc::new({ let mut __result = Vec::new(); for p in test_projections.clone().iter().cloned() { if (p.module_name.clone().as_str() == authored_name_at(tm.type_env.clone().source_indices.clone(), &tm.module.clone()).as_str()) { __result.push(p); } } __result }))); } __result }).iter().cloned() { if (f.path.clone().as_str() != "".to_string().as_str()) { __result.push(f); } } __result }); -let has_services = has_service_items(typed.clone()); -let has_pipeline = { let mut __found = false; for m in typed.modules.clone().iter().cloned() { if (authored_name_at(m.type_env.clone().source_indices.clone(), &m.module.clone()).as_str() == "v2.compiler.compile".to_string().as_str()) { __found = true; break; } } __found }; -let crate_name = if has_pipeline.clone() { + files: Rc::new(vec![]), + diagnostics: workflow_default_diags.clone(), + }); + } + let svc_module_map = typed.modules.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, tm: Rc| { + let svc_items = Rc::new({ + let mut __result = Vec::new(); + for item in tm.items.clone().iter().cloned() { + if is_service_item(&item) { + __result.push(item); + } + } + __result + }); + let mod_filename = module_to_filename(authored_name_at( + tm.type_env.clone().source_indices.clone(), + &tm.module.clone(), + )); + svc_items.clone().iter().cloned().fold( + acc, + |a: Rc>, svc: Rc| { + v2_rt::rc_map_insert( + a, + authored_name_at(tm.type_env.clone().source_indices.clone(), &svc), + mod_filename.clone(), + ) + }, + ) + }, + ); + let test_projections = extract_test_projections(typed.clone()); + let module_files = Rc::new({ + let mut __result = Vec::new(); + for tm in typed.modules.clone().iter().cloned() { + __result.push(emit_module_full( + &tm, + ®istry, + &emit_info, + shared_types.clone(), + svc_module_map.clone(), + data_items.clone(), + )); + } + __result + }); + let test_files = Rc::new({ + let mut __result = Vec::new(); + for f in Rc::new({ + let mut __result = Vec::new(); + for tm in typed.modules.clone().iter().cloned() { + __result.push(emit_test_file( + &authored_name_at( + tm.type_env.clone().source_indices.clone(), + &tm.module.clone(), + ), + Rc::new({ + let mut __result = Vec::new(); + for p in test_projections.clone().iter().cloned() { + if (p.module_name.clone().as_str() + == authored_name_at( + tm.type_env.clone().source_indices.clone(), + &tm.module.clone(), + ) + .as_str()) + { + __result.push(p); + } + } + __result + }), + )); + } + __result + }) + .iter() + .cloned() + { + if (f.path.clone().as_str() != "".to_string().as_str()) { + __result.push(f); + } + } + __result + }); + let has_services = has_service_items(typed.clone()); + let has_pipeline = { + let mut __found = false; + for m in typed.modules.clone().iter().cloned() { + if (authored_name_at(m.type_env.clone().source_indices.clone(), &m.module.clone()) + .as_str() + == "v2.compiler.compile".to_string().as_str()) + { + __found = true; + break; + } + } + __found + }; + let crate_name = if has_pipeline.clone() { "v2_compiler".to_string() } else { "v2_compiled".to_string() }; -let cargo = emit_cargo_toml(crate_name.clone(), has_services.clone()); -let main_file = emit_main_rs(&workflow_funcs, &typed.modules.clone(), &has_services, &crate_name, svc_module_map.clone()); -let rt_file = emit_v2_rt_module(); -let compiler_tests_file = if has_pipeline.clone() { + let cargo = emit_cargo_toml(crate_name.clone(), has_services.clone()); + let main_file = emit_main_rs( + &workflow_funcs, + &typed.modules.clone(), + &has_services, + &crate_name, + svc_module_map.clone(), + ); + let rt_file = emit_v2_rt_module(); + let compiler_tests_file = if has_pipeline.clone() { Rc::new(vec![emit_compiler_tests_module()]) } else { Rc::new(vec![]) }; -let dry_run_file = if has_services.clone() { + let dry_run_file = if has_services.clone() { Rc::new(vec![emit_dry_run_module()]) } else { Rc::new(vec![]) }; -let all_mod_files = v2_rt::concat(v2_rt::concat(module_files, Rc::new(vec![rt_file])), dry_run_file); -let lib_file = emit_lib_rs_from_files(all_mod_files.clone(), &has_pipeline); -let files = v2_rt::concat(v2_rt::concat(v2_rt::concat(Rc::new(vec![cargo, lib_file, main_file]), all_mod_files.clone()), compiler_tests_file), test_files); -Rc::new(EmitResult { - files: files, - diagnostics: Rc::new(vec![]), -}) -} + let all_mod_files = v2_rt::concat( + v2_rt::concat(module_files, Rc::new(vec![rt_file])), + dry_run_file, + ); + let lib_file = emit_lib_rs_from_files(all_mod_files.clone(), &has_pipeline); + let files = v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + Rc::new(vec![cargo, lib_file, main_file]), + all_mod_files.clone(), + ), + compiler_tests_file, + ), + test_files, + ); + Rc::new(EmitResult { + files: files, + diagnostics: Rc::new(vec![]), + }) + } } pub fn emit_v2_rt_module() -> Rc { Rc::new(TextFile { - path: v2_rt::concat(v2_rt::concat(rust_source_root(), "v2_rt".to_string()), rust_source_ext()), - content: rust_runtime_source(), -}) + path: v2_rt::concat( + v2_rt::concat(rust_source_root(), "v2_rt".to_string()), + rust_source_ext(), + ), + content: rust_runtime_source(), + }) } pub fn emit_compiler_tests_module() -> Rc { Rc::new(TextFile { - path: v2_rt::concat(v2_rt::concat(rust_source_root(), "compiler_tests".to_string()), rust_source_ext()), - content: compiler_tests_source(), -}) + path: v2_rt::concat( + v2_rt::concat(rust_source_root(), "compiler_tests".to_string()), + rust_source_ext(), + ), + content: compiler_tests_source(), + }) } -pub fn emit_lib_rs_from_files(all_module_files: Rc>>, has_compiler_tests: &bool) -> Rc { +pub fn emit_lib_rs_from_files( + all_module_files: Rc>>, + has_compiler_tests: &bool, +) -> Rc { { let src_prefix_len = v2_rt::string_length(&rust_source_root()); -let ext_len = v2_rt::string_length(&rust_source_ext()); -let mod_decls = Rc::new({ let mut __result = Vec::new(); for f in all_module_files.iter().cloned() { __result.push({ - let path_len = v2_rt::string_length(&f.path.clone()); -let mod_name = v2_rt::substring(&f.path.clone(), src_prefix_len.clone(), (path_len.clone() - ext_len.clone())); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(rust_visibility_prefix(), rust_items().module_keyword.clone()), " ".to_string()), mod_name.clone()), ";".to_string()) -}); } __result }); -let hand_maintained_mods = if has_compiler_tests.clone() { + let ext_len = v2_rt::string_length(&rust_source_ext()); + let mod_decls = Rc::new({ + let mut __result = Vec::new(); + for f in all_module_files.iter().cloned() { + __result.push({ + let path_len = v2_rt::string_length(&f.path.clone()); + let mod_name = v2_rt::substring( + &f.path.clone(), + src_prefix_len.clone(), + (path_len.clone() - ext_len.clone()), + ); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + rust_visibility_prefix(), + rust_items().module_keyword.clone(), + ), + " ".to_string(), + ), + mod_name.clone(), + ), + ";".to_string(), + ) + }); + } + __result + }); + let hand_maintained_mods = if has_compiler_tests.clone() { "\npub mod v2_interpreter;\npub mod cli_run;\npub mod rest_transport_facts;".to_string() } else { "".to_string() }; -let test_mod = if has_compiler_tests.clone() { + let test_mod = if has_compiler_tests.clone() { "\n\n#[cfg(test)]\nmod compiler_tests;".to_string() } else { "".to_string() }; -let shared_types = emit_non_empty_wrappers(); -let content = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("// Generated by v2 compiler -- do not edit.\n\n".to_string(), "#![allow(unused_imports, unused_variables, unused_mut, unused_parens, dead_code, unreachable_patterns, non_shorthand_field_patterns, suspicious_double_ref_op, clippy::all)]\n\n".to_string()), mod_decls.join(&"\n".to_string())), hand_maintained_mods), "\n\n".to_string()), shared_types), test_mod); -Rc::new(TextFile { - path: v2_rt::concat(v2_rt::concat(rust_source_root(), "lib".to_string()), rust_source_ext()), - content: v2_rt::concat(content, "\n".to_string()), -}) -} + let shared_types = emit_non_empty_wrappers(); + let content = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("// Generated by v2 compiler -- do not edit.\n\n".to_string(), "#![allow(unused_imports, unused_variables, unused_mut, unused_parens, dead_code, unreachable_patterns, non_shorthand_field_patterns, suspicious_double_ref_op, clippy::all)]\n\n".to_string()), mod_decls.join(&"\n".to_string())), hand_maintained_mods), "\n\n".to_string()), shared_types), test_mod); + Rc::new(TextFile { + path: v2_rt::concat( + v2_rt::concat(rust_source_root(), "lib".to_string()), + rust_source_ext(), + ), + content: v2_rt::concat(content, "\n".to_string()), + }) + } } -pub fn emit_module(typed_module: &Rc, registry: Rc>>) -> Rc { +pub fn emit_module( + typed_module: &Rc, + registry: Rc>>, +) -> Rc { { let base_info = build_emit_graph_info(&Rc::new(vec![typed_module.clone()])); -let shared = build_shared_types(base_info.type_summaries.clone(), base_info.recursive_type_set.clone(), RenderTarget::Rust); -let emit_info = Rc::new(EmitGraphInfo { - type_summaries: base_info.type_summaries.clone(), - recursive_type_set: base_info.recursive_type_set.clone(), - fielded_variants: base_info.fielded_variants.clone(), - shared_types: shared, - ownership_index: base_info.ownership_index.clone(), - movable: base_info.movable.clone(), - variant_to_enum: base_info.variant_to_enum.clone(), - owned_bindings: v2_rt::rc_empty_map::(), - read_only_params_index: base_info.read_only_params_index.clone(), - read_only_params: v2_rt::rc_empty_map::(), -}); -let shared_types = emit_info.shared_types.clone(); -emit_module_full(&typed_module, ®istry, &emit_info, shared_types, v2_rt::rc_empty_map::(), build_data_item_index(Rc::new(vec![typed_module.clone()]))) -} + let shared = build_shared_types( + base_info.type_summaries.clone(), + base_info.recursive_type_set.clone(), + RenderTarget::Rust, + ); + let emit_info = Rc::new(EmitGraphInfo { + type_summaries: base_info.type_summaries.clone(), + recursive_type_set: base_info.recursive_type_set.clone(), + fielded_variants: base_info.fielded_variants.clone(), + shared_types: shared, + ownership_index: base_info.ownership_index.clone(), + movable: base_info.movable.clone(), + variant_to_enum: base_info.variant_to_enum.clone(), + owned_bindings: v2_rt::rc_empty_map::(), + read_only_params_index: base_info.read_only_params_index.clone(), + read_only_params: v2_rt::rc_empty_map::(), + }); + let shared_types = emit_info.shared_types.clone(); + emit_module_full( + &typed_module, + ®istry, + &emit_info, + shared_types, + v2_rt::rc_empty_map::(), + build_data_item_index(Rc::new(vec![typed_module.clone()])), + ) + } } -pub fn emit_module_full(typed_module: &Rc, registry: &Rc>>, emit_info: &Rc, shared_types: Rc>, svc_module_map: Rc>, data_items: Rc>>) -> Rc { +pub fn emit_module_full( + typed_module: &Rc, + registry: &Rc>>, + emit_info: &Rc, + shared_types: Rc>, + svc_module_map: Rc>, + data_items: Rc>>, +) -> Rc { { let m = typed_module.module.clone(); -let scope = module_emit_scope(&typed_module); -let scoped_data_items = build_scoped_data_item_index(&typed_module, data_items); -let prelude = emit_prelude(); -let local_type_names = Rc::new({ let mut __result = Vec::new(); for item in Rc::new({ let mut __result = Vec::new(); for item in typed_module.items.clone().iter().cloned() { if is_type_def_item(&item) { __result.push(item); } } __result }).iter().cloned() { __result.push(authored_name(scope.type_env.clone(), item.clone())); } __result }); -let imports_str = emit_imports(&module_imports(m.clone()), emit_info.clone(), registry.clone(), local_type_names, scope.type_env.clone().source_indices.clone()); -let imports_section = if (imports_str.clone().as_str() == "".to_string().as_str()) { + let scope = module_emit_scope(&typed_module); + let scoped_data_items = build_scoped_data_item_index(&typed_module, data_items); + let prelude = emit_prelude(); + let local_type_names = Rc::new({ + let mut __result = Vec::new(); + for item in Rc::new({ + let mut __result = Vec::new(); + for item in typed_module.items.clone().iter().cloned() { + if is_type_def_item(&item) { + __result.push(item); + } + } + __result + }) + .iter() + .cloned() + { + __result.push(authored_name(scope.type_env.clone(), item.clone())); + } + __result + }); + let imports_str = emit_imports( + &module_imports(m.clone()), + emit_info.clone(), + registry.clone(), + local_type_names, + scope.type_env.clone().source_indices.clone(), + ); + let imports_section = if (imports_str.clone().as_str() == "".to_string().as_str()) { "".to_string() } else { v2_rt::concat("\n".to_string(), imports_str.clone()) }; -let this_mod_filename = module_to_filename(authored_name(scope.type_env.clone(), m.clone())); -let all_svc_names = Rc::new({ let mut __result = Vec::new(); for item in typed_module.items.clone().iter().cloned() { __result.extend((*match v2_rt::map_get(®istry, authored_name(scope.type_env.clone(), item.clone())) { - Some(info) => info.service_names.clone(), - None => Rc::new(vec![]), -}).iter().cloned()); } __result }); -let extern_svc_imports = Rc::new({ let mut __result = Vec::new(); for sn in unique_strings(all_svc_names).iter().cloned() { __result.extend((*match v2_rt::map_get(&svc_module_map, sn.clone()) { - Some(mod_file) => if (mod_file.clone().as_str() == this_mod_filename.clone().as_str()) { - Rc::new(vec![]) - } else { - Rc::new(vec![v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(rust_visibility_prefix(), "use crate::".to_string()), mod_file.clone()), "::".to_string()), sanitize_service_name(sn.clone())), ";".to_string())]) - }, - None => Rc::new(vec![]), -}).iter().cloned()); } __result }); -let svc_imports_str = if ((extern_svc_imports.clone().len() as i64) == 0) { + let this_mod_filename = + module_to_filename(authored_name(scope.type_env.clone(), m.clone())); + let all_svc_names = Rc::new({ + let mut __result = Vec::new(); + for item in typed_module.items.clone().iter().cloned() { + __result.extend( + (*match v2_rt::map_get( + ®istry, + authored_name(scope.type_env.clone(), item.clone()), + ) { + Some(info) => info.service_names.clone(), + None => Rc::new(vec![]), + }) + .iter() + .cloned(), + ); + } + __result + }); + let extern_svc_imports = Rc::new({ + let mut __result = Vec::new(); + for sn in unique_strings(all_svc_names).iter().cloned() { + __result.extend( + (*match v2_rt::map_get(&svc_module_map, sn.clone()) { + Some(mod_file) => { + if (mod_file.clone().as_str() == this_mod_filename.clone().as_str()) { + Rc::new(vec![]) + } else { + Rc::new(vec![v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + rust_visibility_prefix(), + "use crate::".to_string(), + ), + mod_file.clone(), + ), + "::".to_string(), + ), + sanitize_service_name(sn.clone()), + ), + ";".to_string(), + )]) + } + } + None => Rc::new(vec![]), + }) + .iter() + .cloned(), + ); + } + __result + }); + let svc_imports_str = if ((extern_svc_imports.clone().len() as i64) == 0) { "".to_string() } else { - v2_rt::concat("\n".to_string(), extern_svc_imports.clone().join(&"\n".to_string())) + v2_rt::concat( + "\n".to_string(), + extern_svc_imports.clone().join(&"\n".to_string()), + ) }; -let local_enum_uses = Rc::new({ let mut __result = Vec::new(); for item in Rc::new({ let mut __result = Vec::new(); for item in typed_module.items.clone().iter().cloned() { if (is_type_def_item(&item) && is_coproduct_type(item.clone())) { __result.push(item); } } __result }).iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat("use self::".to_string(), authored_name(scope.type_env.clone(), item.clone())), "::*;".to_string())); } __result }); -let local_uses_str = if ((local_enum_uses.clone().len() as i64) == 0) { + let local_enum_uses = Rc::new({ + let mut __result = Vec::new(); + for item in Rc::new({ + let mut __result = Vec::new(); + for item in typed_module.items.clone().iter().cloned() { + if (is_type_def_item(&item) && is_coproduct_type(item.clone())) { + __result.push(item); + } + } + __result + }) + .iter() + .cloned() + { + __result.push(v2_rt::concat( + v2_rt::concat( + "use self::".to_string(), + authored_name(scope.type_env.clone(), item.clone()), + ), + "::*;".to_string(), + )); + } + __result + }); + let local_uses_str = if ((local_enum_uses.clone().len() as i64) == 0) { "".to_string() } else { - v2_rt::concat("\n".to_string(), local_enum_uses.clone().join(&"\n".to_string())) + v2_rt::concat( + "\n".to_string(), + local_enum_uses.clone().join(&"\n".to_string()), + ) }; -let wire_contract_item = Rc::new({ let mut __result = Vec::new(); for i in typed_module.items.clone().iter().cloned() { if (item_binding_is_named(scope.type_env.clone(), &i, &"wire_contract".to_string()) && match v2_rt::map_get(&scope.item_registry.clone(), "wire_contract".to_string()) { - Some(info) => (info.kind.clone() == ItemKind::DataItem), - None => false, -}) { __result.push(i); } } __result }).first().cloned(); -let items_str = Rc::new({ let mut __result = Vec::new(); for item in typed_module.items.clone().iter().cloned() { __result.push(emit_typed_item(&item, authored_name(scope.type_env.clone(), m.clone()), ®istry, &scope, shared_types.clone(), &emit_info, wire_contract_item.clone(), scoped_data_items.clone())); } __result }).join(&"\n\n".to_string()); -let raw_filename = module_to_filename(authored_name(scope.type_env.clone(), m.clone())); -let filename = if (raw_filename.clone().as_str() == "main".to_string().as_str()) { + let wire_contract_item = Rc::new({ + let mut __result = Vec::new(); + for i in typed_module.items.clone().iter().cloned() { + if (item_binding_is_named(scope.type_env.clone(), &i, &"wire_contract".to_string()) + && match v2_rt::map_get( + &scope.item_registry.clone(), + "wire_contract".to_string(), + ) { + Some(info) => (info.kind.clone() == ItemKind::DataItem), + None => false, + }) + { + __result.push(i); + } + } + __result + }) + .first() + .cloned(); + let items_str = Rc::new({ + let mut __result = Vec::new(); + for item in typed_module.items.clone().iter().cloned() { + __result.push(emit_typed_item( + &item, + authored_name(scope.type_env.clone(), m.clone()), + ®istry, + &scope, + shared_types.clone(), + &emit_info, + wire_contract_item.clone(), + scoped_data_items.clone(), + )); + } + __result + }) + .join(&"\n\n".to_string()); + let raw_filename = module_to_filename(authored_name(scope.type_env.clone(), m.clone())); + let filename = if (raw_filename.clone().as_str() == "main".to_string().as_str()) { "main_mod".to_string() } else { raw_filename.clone() }; -let module_attrs = if (authored_name(scope.type_env.clone(), m.clone()).as_str() == "std.error_primitives".to_string().as_str()) { + let module_attrs = if (authored_name(scope.type_env.clone(), m.clone()).as_str() + == "std.error_primitives".to_string().as_str()) + { "#![allow(non_camel_case_types)]\n\n".to_string() } else { "".to_string() }; -let content = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("// Generated by v2 compiler -- do not edit.\n".to_string(), "// Source module: ".to_string()), authored_name(scope.type_env.clone(), m.clone())), "\n\n".to_string()), module_attrs), prelude), imports_section), svc_imports_str), local_uses_str), "\n\n".to_string()), items_str), "\n".to_string()); -Rc::new(TextFile { - path: v2_rt::concat(v2_rt::concat(rust_source_root(), filename), rust_source_ext()), - content: content, -}) -} + let content = v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "// Generated by v2 compiler -- do not edit.\n" + .to_string(), + "// Source module: ".to_string(), + ), + authored_name(scope.type_env.clone(), m.clone()), + ), + "\n\n".to_string(), + ), + module_attrs, + ), + prelude, + ), + imports_section, + ), + svc_imports_str, + ), + local_uses_str, + ), + "\n\n".to_string(), + ), + items_str, + ), + "\n".to_string(), + ); + Rc::new(TextFile { + path: v2_rt::concat( + v2_rt::concat(rust_source_root(), filename), + rust_source_ext(), + ), + content: content, + }) + } } pub fn emit_import_name(n: &String, registry: Rc>>) -> String { { let is_data = match v2_rt::map_get(®istry, n.clone()) { - Some(info) => (info.kind.clone() == ItemKind::DataItem), - None => false, -}; -if is_data { + Some(info) => (info.kind.clone() == ItemKind::DataItem), + None => false, + }; + if is_data { to_snake(n.clone()) } else { n.clone() } -} + } } -pub fn emit_imports(imports: &Rc>>, emit_info: Rc, registry: Rc>>, local_names: Rc>, source_indices: Rc>>) -> String { +pub fn emit_imports( + imports: &Rc>>, + emit_info: Rc, + registry: Rc>>, + local_names: Rc>, + source_indices: Rc>>, +) -> String { if ((imports.clone().len() as i64) == 0) { "".to_string() } else { { let type_summaries = emit_info.type_summaries.clone(); -let import_lines = Rc::new({ let mut __result = Vec::new(); for imp in imports.clone().iter().cloned() { __result.push({ - let mod_name = module_to_filename(authored_name_at(source_indices.clone(), &imp)); -if import_is_all(imp.clone()) { - v2_rt::concat(v2_rt::concat("use crate::".to_string(), mod_name.clone()), "::*;".to_string()) - } else { - { - let specific_names = import_specific_names_at(imp.clone(), source_indices.clone()); -let filtered_names = Rc::new({ let mut __result = Vec::new(); for n in specific_names.clone().iter().cloned() { if { let mut __all = true; for ln in local_names.clone().iter().cloned() { if !((ln.clone().as_str() != n.clone().as_str())) { __all = false; break; } } __all } { __result.push(n); } } __result }); -if ((filtered_names.clone().len() as i64) == 0) { - "".to_string() + let import_lines = Rc::new({ + let mut __result = Vec::new(); + for imp in imports.clone().iter().cloned() { + __result.push({ + let mod_name = + module_to_filename(authored_name_at(source_indices.clone(), &imp)); + if import_is_all(imp.clone()) { + v2_rt::concat( + v2_rt::concat("use crate::".to_string(), mod_name.clone()), + "::*;".to_string(), + ) } else { { - let deduped_names = unique_strings(filtered_names.clone()); -let top_level = Rc::new({ let mut __result = Vec::new(); for n in deduped_names.clone().iter().cloned() { if if is_known_variant(type_summaries.clone(), n.clone()) { - is_enum_in_summaries(type_summaries.clone(), n.clone()) - } else { - true - } { __result.push(n); } } __result }); -let all_enum_names = Rc::new({ let mut __result = Vec::new(); for n in Rc::new(v2_rt::map_keys(&type_summaries)).iter().cloned() { if is_enum_in_summaries(type_summaries.clone(), n.clone()) { __result.push(n); } } __result }); -let imported_enums = Rc::new({ let mut __result = Vec::new(); for n in deduped_names.clone().iter().cloned() { if is_enum_in_summaries(type_summaries.clone(), n.clone()) { __result.push(n); } } __result }); -let all_parents = Rc::new({ let mut __result = Vec::new(); for p in Rc::new({ let mut __result = Vec::new(); for n in deduped_names.clone().iter().cloned() { __result.push(if is_enum_in_summaries(type_summaries.clone(), n.clone()) { + let specific_names = + import_specific_names_at(imp.clone(), source_indices.clone()); + let filtered_names = Rc::new({ + let mut __result = Vec::new(); + for n in specific_names.clone().iter().cloned() { + if { + let mut __all = true; + for ln in local_names.clone().iter().cloned() { + if !(ln.clone().as_str() != n.clone().as_str()) { + __all = false; + break; + } + } + __all + } { + __result.push(n); + } + } + __result + }); + if ((filtered_names.clone().len() as i64) == 0) { "".to_string() } else { - match find_variant_parent(type_summaries.clone(), n.clone(), imported_enums.clone()) { - Some(parent) => parent.clone(), - None => match find_variant_parent(type_summaries.clone(), n.clone(), all_enum_names.clone()) { - Some(parent) => parent.clone(), - None => "".to_string(), -}, -} - }); } __result }).iter().cloned() { if (p.clone().as_str() != "".to_string().as_str()) { __result.push(p); } } __result }); -let parent_list = unique_strings(all_parents.clone()); -let top_with_parents = unique_strings(v2_rt::concat(top_level.clone(), parent_list.clone())); -let main_line = if ((top_with_parents.clone().len() as i64) > 0) { { - let names_str = Rc::new({ let mut __result = Vec::new(); for n in top_with_parents.clone().iter().cloned() { __result.push(emit_import_name(&n, registry.clone())); } __result }).join(&", ".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(rust_visibility_prefix(), "use crate::".to_string()), mod_name.clone()), "::{".to_string()), names_str.clone()), "};".to_string()) -} - } else { - "".to_string() - }; -let variant_lines = Rc::new({ let mut __result = Vec::new(); for parent in parent_list.clone().iter().cloned() { __result.push({ - let variants = Rc::new({ let mut __result = Vec::new(); for n in deduped_names.clone().iter().cloned() { if if is_enum_in_summaries(type_summaries.clone(), n.clone()) { - false - } else { - match find_variant_parent(type_summaries.clone(), n.clone(), Rc::new(vec![parent.clone()])) { - Some(_) => true, - None => false, -} - } { __result.push(n); } } __result }); -let vars_str = variants.clone().join(&", ".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("use crate::".to_string(), mod_name.clone()), "::".to_string()), parent.clone()), "::{".to_string()), vars_str.clone()), "};".to_string()) -}); } __result }); -let imported_enums = Rc::new({ let mut __result = Vec::new(); for n in top_level.clone().iter().cloned() { if is_enum_in_summaries(type_summaries.clone(), n.clone()) { __result.push(n); } } __result }); -let wildcard_enum_lines = Rc::new({ let mut __result = Vec::new(); for en in Rc::new({ let mut __result = Vec::new(); for en in imported_enums.clone().iter().cloned() { if ({ let mut __found = false; for p in parent_list.clone().iter().cloned() { if (p.clone().as_str() == en.clone().as_str()) { __found = true; break; } } __found } == false) { __result.push(en); } } __result }).iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("use crate::".to_string(), mod_name.clone()), "::".to_string()), en.clone()), "::*;".to_string())); } __result }); -let all_lines = if (main_line.clone().as_str() != "".to_string().as_str()) { - v2_rt::concat(v2_rt::concat(Rc::new(vec![main_line.clone()]), Rc::new({ let mut __result = Vec::new(); for l in variant_lines.clone().iter().cloned() { if (l.clone().as_str() != "".to_string().as_str()) { __result.push(l); } } __result })), wildcard_enum_lines.clone()) - } else { - v2_rt::concat(Rc::new({ let mut __result = Vec::new(); for l in variant_lines.clone().iter().cloned() { if (l.clone().as_str() != "".to_string().as_str()) { __result.push(l); } } __result }), wildcard_enum_lines.clone()) - }; -all_lines.clone().join(&"\n".to_string()) -} + let deduped_names = unique_strings(filtered_names.clone()); + let top_level = Rc::new({ + let mut __result = Vec::new(); + for n in deduped_names.clone().iter().cloned() { + if if is_known_variant( + type_summaries.clone(), + n.clone(), + ) { + is_enum_in_summaries( + type_summaries.clone(), + n.clone(), + ) + } else { + true + } { + __result.push(n); + } + } + __result + }); + let all_enum_names = Rc::new({ + let mut __result = Vec::new(); + for n in Rc::new(v2_rt::map_keys(&type_summaries)) + .iter() + .cloned() + { + if is_enum_in_summaries( + type_summaries.clone(), + n.clone(), + ) { + __result.push(n); + } + } + __result + }); + let imported_enums = Rc::new({ + let mut __result = Vec::new(); + for n in deduped_names.clone().iter().cloned() { + if is_enum_in_summaries( + type_summaries.clone(), + n.clone(), + ) { + __result.push(n); + } + } + __result + }); + let all_parents = Rc::new({ + let mut __result = Vec::new(); + for p in Rc::new({ + let mut __result = Vec::new(); + for n in deduped_names.clone().iter().cloned() { + __result.push( + if is_enum_in_summaries( + type_summaries.clone(), + n.clone(), + ) { + "".to_string() + } else { + match find_variant_parent( + type_summaries.clone(), + n.clone(), + imported_enums.clone(), + ) { + Some(parent) => parent.clone(), + None => match find_variant_parent( + type_summaries.clone(), + n.clone(), + all_enum_names.clone(), + ) { + Some(parent) => parent.clone(), + None => "".to_string(), + }, + } + }, + ); + } + __result + }) + .iter() + .cloned() + { + if (p.clone().as_str() != "".to_string().as_str()) { + __result.push(p); + } + } + __result + }); + let parent_list = unique_strings(all_parents.clone()); + let top_with_parents = unique_strings(v2_rt::concat( + top_level.clone(), + parent_list.clone(), + )); + let main_line = + if ((top_with_parents.clone().len() as i64) > 0) { + { + let names_str = Rc::new({ + let mut __result = Vec::new(); + for n in + top_with_parents.clone().iter().cloned() + { + __result.push(emit_import_name( + &n, + registry.clone(), + )); + } + __result + }) + .join(&", ".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + rust_visibility_prefix(), + "use crate::".to_string(), + ), + mod_name.clone(), + ), + "::{".to_string(), + ), + names_str.clone(), + ), + "};".to_string(), + ) + } + } else { + "".to_string() + }; + let variant_lines = Rc::new({ + let mut __result = Vec::new(); + for parent in parent_list.clone().iter().cloned() { + __result.push({ + let variants = Rc::new({ + let mut __result = Vec::new(); + for n in + deduped_names.clone().iter().cloned() + { + if if is_enum_in_summaries( + type_summaries.clone(), + n.clone(), + ) { + false + } else { + match find_variant_parent( + type_summaries.clone(), + n.clone(), + Rc::new(vec![parent.clone()]), + ) { + Some(_) => true, + None => false, + } + } { + __result.push(n); + } + } + __result + }); + let vars_str = + variants.clone().join(&", ".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "use crate::" + .to_string(), + mod_name.clone(), + ), + "::".to_string(), + ), + parent.clone(), + ), + "::{".to_string(), + ), + vars_str.clone(), + ), + "};".to_string(), + ) + }); + } + __result + }); + let imported_enums = Rc::new({ + let mut __result = Vec::new(); + for n in top_level.clone().iter().cloned() { + if is_enum_in_summaries( + type_summaries.clone(), + n.clone(), + ) { + __result.push(n); + } + } + __result + }); + let wildcard_enum_lines = Rc::new({ + let mut __result = Vec::new(); + for en in Rc::new({ + let mut __result = Vec::new(); + for en in imported_enums.clone().iter().cloned() { + if ({ + let mut __found = false; + for p in parent_list.clone().iter().cloned() + { + if (p.clone().as_str() + == en.clone().as_str()) + { + __found = true; + break; + } + } + __found + } == false) + { + __result.push(en); + } + } + __result + }) + .iter() + .cloned() + { + __result.push(v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "use crate::".to_string(), + mod_name.clone(), + ), + "::".to_string(), + ), + en.clone(), + ), + "::*;".to_string(), + )); + } + __result + }); + let all_lines = if (main_line.clone().as_str() + != "".to_string().as_str()) + { + v2_rt::concat( + v2_rt::concat( + Rc::new(vec![main_line.clone()]), + Rc::new({ + let mut __result = Vec::new(); + for l in + variant_lines.clone().iter().cloned() + { + if (l.clone().as_str() + != "".to_string().as_str()) + { + __result.push(l); + } + } + __result + }), + ), + wildcard_enum_lines.clone(), + ) + } else { + v2_rt::concat( + Rc::new({ + let mut __result = Vec::new(); + for l in variant_lines.clone().iter().cloned() { + if (l.clone().as_str() + != "".to_string().as_str()) + { + __result.push(l); + } + } + __result + }), + wildcard_enum_lines.clone(), + ) + }; + all_lines.clone().join(&"\n".to_string()) + } + } + } } -} + }); } -}); } __result }); -Rc::new({ let mut __result = Vec::new(); for line in import_lines.iter().cloned() { if (line.clone().as_str() != "".to_string().as_str()) { __result.push(line); } } __result }).join(&"\n".to_string()) -} + __result + }); + Rc::new({ + let mut __result = Vec::new(); + for line in import_lines.iter().cloned() { + if (line.clone().as_str() != "".to_string().as_str()) { + __result.push(line); + } + } + __result + }) + .join(&"\n".to_string()) + } } } pub fn emit_prelude() -> String { { - let use_line = "use std::collections::HashMap;\nuse std::rc::Rc;\nuse crate::v2_rt;".to_string(); -let wrapper_use = "use crate::NonEmptyVec;\nuse crate::NonEmptyBTreeSet;".to_string(); -v2_rt::concat(v2_rt::concat(use_line, "\n".to_string()), wrapper_use) -} + let use_line = + "use std::collections::HashMap;\nuse std::rc::Rc;\nuse crate::v2_rt;".to_string(); + let wrapper_use = "use crate::NonEmptyVec;\nuse crate::NonEmptyBTreeSet;".to_string(); + v2_rt::concat(v2_rt::concat(use_line, "\n".to_string()), wrapper_use) + } } pub fn emit_non_empty_wrappers() -> String { { let vec_wrapper = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("#[derive(Debug, Clone, PartialEq)]\n".to_string(), "pub struct NonEmptyVec(Vec);\n\n".to_string()), "impl NonEmptyVec {\n".to_string()), " pub fn new(items: Vec) -> Result {\n".to_string()), " if items.is_empty() {\n".to_string()), " Err(\"NonEmptyVec requires at least one element\")\n".to_string()), " } else {\n".to_string()), " Ok(Self(items))\n".to_string()), " }\n".to_string()), " }\n\n".to_string()), " pub fn as_slice(&self) -> &[T] {\n".to_string()), " &self.0\n".to_string()), " }\n\n".to_string()), " pub fn into_vec(self) -> Vec {\n".to_string()), " self.0\n".to_string()), " }\n".to_string()), "}".to_string()); -let set_wrapper = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("#[derive(Debug, Clone, PartialEq)]\n".to_string(), "pub struct NonEmptyBTreeSet(std::collections::BTreeSet);\n\n".to_string()), "impl NonEmptyBTreeSet {\n".to_string()), " pub fn new(items: std::collections::BTreeSet) -> Result {\n".to_string()), " if items.is_empty() {\n".to_string()), " Err(\"NonEmptyBTreeSet requires at least one element\")\n".to_string()), " } else {\n".to_string()), " Ok(Self(items))\n".to_string()), " }\n".to_string()), " }\n\n".to_string()), " pub fn as_set(&self) -> &std::collections::BTreeSet {\n".to_string()), " &self.0\n".to_string()), " }\n\n".to_string()), " pub fn into_set(self) -> std::collections::BTreeSet {\n".to_string()), " self.0\n".to_string()), " }\n".to_string()), "}".to_string()); -v2_rt::concat(v2_rt::concat(vec_wrapper, "\n\n".to_string()), set_wrapper) -} + let set_wrapper = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("#[derive(Debug, Clone, PartialEq)]\n".to_string(), "pub struct NonEmptyBTreeSet(std::collections::BTreeSet);\n\n".to_string()), "impl NonEmptyBTreeSet {\n".to_string()), " pub fn new(items: std::collections::BTreeSet) -> Result {\n".to_string()), " if items.is_empty() {\n".to_string()), " Err(\"NonEmptyBTreeSet requires at least one element\")\n".to_string()), " } else {\n".to_string()), " Ok(Self(items))\n".to_string()), " }\n".to_string()), " }\n\n".to_string()), " pub fn as_set(&self) -> &std::collections::BTreeSet {\n".to_string()), " &self.0\n".to_string()), " }\n\n".to_string()), " pub fn into_set(self) -> std::collections::BTreeSet {\n".to_string()), " self.0\n".to_string()), " }\n".to_string()), "}".to_string()); + v2_rt::concat(v2_rt::concat(vec_wrapper, "\n\n".to_string()), set_wrapper) + } } -pub fn emit_typed_item(item: &Rc, module_name: String, registry: &Rc>>, scope: &Rc, shared_types: Rc>, emit_info: &Rc, wire_contract_item: Option>, data_items: Rc>>>>) -> String { +pub fn emit_typed_item( + item: &Rc, + module_name: String, + registry: &Rc>>, + scope: &Rc, + shared_types: Rc>, + emit_info: &Rc, + wire_contract_item: Option>, + data_items: Rc>>>>, +) -> String { { let env = scope.type_env.clone(); -let qualified_name = v2_rt::concat(v2_rt::concat(module_name, ".".to_string()), authored_name(env.clone(), item.clone())); -let item_text = authored_name(env.clone(), item.clone()); -if is_type_def_item(&item) { - emit_type_def_from_connective(&item, emit_info.recursive_type_set.clone(), shared_types, &env, emit_info.clone(), &wire_contract_item, data_items) + let qualified_name = v2_rt::concat( + v2_rt::concat(module_name, ".".to_string()), + authored_name(env.clone(), item.clone()), + ); + let item_text = authored_name(env.clone(), item.clone()); + if is_type_def_item(&item) { + emit_type_def_from_connective( + &item, + emit_info.recursive_type_set.clone(), + shared_types, + &env, + emit_info.clone(), + &wire_contract_item, + data_items, + ) } else { if is_type_alias_item(&item, env.source_indices.clone()) { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(rust_visibility_prefix(), rust_items().type_alias_keyword.clone()), " ".to_string()), item_text), " = ".to_string()), render_rust_type(resolved_type(item.clone()), shared_types, env.source_indices.clone())), ";".to_string()) + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + rust_visibility_prefix(), + rust_items().type_alias_keyword.clone(), + ), + " ".to_string(), + ), + item_text, + ), + " = ".to_string(), + ), + render_rust_type( + resolved_type(item.clone()), + shared_types, + env.source_indices.clone(), + ), + ), + ";".to_string(), + ) } else { if is_type_decl_item(&item, env.source_indices.clone()) { "".to_string() } else { if is_function_item(&item) { { - let fn_movable = match v2_rt::map_get(&emit_info.ownership_index.clone(), qualified_name.clone()) { - Some(m) => m.clone(), - None => v2_rt::rc_empty_map::(), -}; -let item_is_tco = is_tco_eligible(&authored_name(env.clone(), item.clone()), &item.body.clone().clone().unwrap(), registry.clone(), &env.source_indices.clone()); -let fn_read_only = if item_is_tco { + let fn_movable = match v2_rt::map_get( + &emit_info.ownership_index.clone(), + qualified_name.clone(), + ) { + Some(m) => m.clone(), + None => v2_rt::rc_empty_map::(), + }; + let item_is_tco = is_tco_eligible( + &authored_name(env.clone(), item.clone()), + &item.body.clone().clone().unwrap(), + registry.clone(), + &env.source_indices.clone(), + ); + let fn_read_only = if item_is_tco { v2_rt::rc_empty_map::() } else { - match v2_rt::map_get(&emit_info.read_only_params_index.clone(), qualified_name.clone()) { - Some(m) => m.clone(), - None => v2_rt::rc_empty_map::(), -} + match v2_rt::map_get( + &emit_info.read_only_params_index.clone(), + qualified_name.clone(), + ) { + Some(m) => m.clone(), + None => v2_rt::rc_empty_map::(), + } }; -let fn_emit_info = Rc::new(EmitGraphInfo { - type_summaries: emit_info.type_summaries.clone(), - recursive_type_set: emit_info.recursive_type_set.clone(), - fielded_variants: emit_info.fielded_variants.clone(), - shared_types: emit_info.shared_types.clone(), - ownership_index: emit_info.ownership_index.clone(), - movable: fn_movable, - variant_to_enum: emit_info.variant_to_enum.clone(), - owned_bindings: v2_rt::rc_empty_map::(), - read_only_params_index: emit_info.read_only_params_index.clone(), - read_only_params: fn_read_only, -}); -let is_effectful = match lookup_item(registry.clone(), authored_name(env.clone(), item.clone())) { - Some(info) => (((info.service_names.clone().len() as i64) > 0) || ((info.resource_names.clone().len() as i64) > 0)), - None => false, -}; -if is_effectful { - emit_func_def(&item_text, &item.params.clone(), resolved_type(item.clone()), &item.uses.clone(), item.body.clone().clone().unwrap(), ®istry, &scope, &shared_types, &fn_emit_info) + let fn_emit_info = Rc::new(EmitGraphInfo { + type_summaries: emit_info.type_summaries.clone(), + recursive_type_set: emit_info.recursive_type_set.clone(), + fielded_variants: emit_info.fielded_variants.clone(), + shared_types: emit_info.shared_types.clone(), + ownership_index: emit_info.ownership_index.clone(), + movable: fn_movable, + variant_to_enum: emit_info.variant_to_enum.clone(), + owned_bindings: v2_rt::rc_empty_map::(), + read_only_params_index: emit_info.read_only_params_index.clone(), + read_only_params: fn_read_only, + }); + let is_effectful = match lookup_item( + registry.clone(), + authored_name(env.clone(), item.clone()), + ) { + Some(info) => { + (((info.service_names.clone().len() as i64) > 0) + || ((info.resource_names.clone().len() as i64) > 0)) + } + None => false, + }; + if is_effectful { + emit_func_def( + &item_text, + &item.params.clone(), + resolved_type(item.clone()), + &item.uses.clone(), + item.body.clone().clone().unwrap(), + ®istry, + &scope, + &shared_types, + &fn_emit_info, + ) } else { - emit_fn_def(&item_text, &item.params.clone(), resolved_type(item.clone()), &item.body.clone().clone().unwrap(), ®istry, &scope, &shared_types, &fn_emit_info) + emit_fn_def( + &item_text, + &item.params.clone(), + resolved_type(item.clone()), + &item.body.clone().clone().unwrap(), + ®istry, + &scope, + &shared_types, + &fn_emit_info, + ) } -} + } } else { if is_data_def_item(&item) { - emit_data_def(item_text, &item.type_annotation.clone().clone().unwrap(), item.body.clone().clone().unwrap(), registry.clone(), &scope, 0, &shared_types, emit_info.clone()) + emit_data_def( + item_text, + &item.type_annotation.clone().clone().unwrap(), + item.body.clone().clone().unwrap(), + registry.clone(), + &scope, + 0, + &shared_types, + emit_info.clone(), + ) } else { if is_service_def_item(&item) { emit_service_def(&item, registry.clone(), shared_types, &env) @@ -871,7 +2102,13 @@ if is_effectful { if is_resource_def_item(&item) { emit_resource_def(&item, shared_types, &env) } else { - v2_rt::concat(v2_rt::concat("compile_error!(\"unhandled item: ".to_string(), item_text), "\");".to_string()) + v2_rt::concat( + v2_rt::concat( + "compile_error!(\"unhandled item: ".to_string(), + item_text, + ), + "\");".to_string(), + ) } } } @@ -879,96 +2116,172 @@ if is_effectful { } } } -} + } } -pub fn needs_box_wrapping(mut n: Rc, mut recursive_types: Rc>, mut shared_types: Rc>, mut source_indices: Rc>>) -> bool { +pub fn needs_box_wrapping( + mut n: Rc, + mut recursive_types: Rc>, + mut shared_types: Rc>, + mut source_indices: Rc>>, +) -> bool { loop { if ((n.children.clone().len() as i64) == 0) { let name = authored_name_at(source_indices, &n); -if emit_map_has(shared_types, name.clone()) { + if emit_map_has(shared_types, name.clone()) { break false; -} else { + } else { break emit_map_has(recursive_types, name.clone()); -} -} else { + } + } else { let is_optional = (n.return_cardinality.clone() == Cardinality::CardOptional); -if is_optional { + if is_optional { { let __tco_0 = with_required_cardinality(&n); -n = __tco_0; -continue; -} -} else { + n = __tco_0; + continue; + } + } else { break false; -} -} -} + } + } + } } -pub fn emit_type_params(params: &Rc>>, source_indices: Rc>>) -> String { +pub fn emit_type_params( + params: &Rc>>, + source_indices: Rc>>, +) -> String { if ((params.clone().len() as i64) == 0) { "".to_string() } else { { - let names = Rc::new({ let mut __result = Vec::new(); for p in params.clone().iter().cloned() { __result.push(generic_param_name_at(p.clone(), source_indices.clone())); } __result }); -v2_rt::concat(v2_rt::concat("<".to_string(), names.join(&", ".to_string())), ">".to_string()) -} + let names = Rc::new({ + let mut __result = Vec::new(); + for p in params.clone().iter().cloned() { + __result.push(generic_param_name_at(p.clone(), source_indices.clone())); + } + __result + }); + v2_rt::concat( + v2_rt::concat("<".to_string(), names.join(&", ".to_string())), + ">".to_string(), + ) + } } } pub fn is_function_type_param(param: &Rc) -> bool { { let type_expr = param_node_type_expr(¶m); -let type_expr_is_var = match type_expr.inferred.clone() { - Some(inf) => is_type_variable(inf.clone()), - None => false, -}; -((type_expr_is_var && (param.name.clone().as_str() != "".to_string().as_str())) && (param.name.clone().as_str() == type_expr.name.clone().as_str())) -} + let type_expr_is_var = match type_expr.inferred.clone() { + Some(inf) => is_type_variable(inf.clone()), + None => false, + }; + ((type_expr_is_var && (param.name.clone().as_str() != "".to_string().as_str())) + && (param.name.clone().as_str() == type_expr.name.clone().as_str())) + } } pub fn function_type_params(params: Rc>>) -> Rc>> { - Rc::new({ let mut __result = Vec::new(); for p in params.iter().cloned() { if is_function_type_param(&p) { __result.push(p); } } __result }) + Rc::new({ + let mut __result = Vec::new(); + for p in params.iter().cloned() { + if is_function_type_param(&p) { + __result.push(p); + } + } + __result + }) } pub fn function_value_params(params: Rc>>) -> Rc>> { - Rc::new({ let mut __result = Vec::new(); for p in params.iter().cloned() { if !is_function_type_param(&p) { __result.push(p); } } __result }) + Rc::new({ + let mut __result = Vec::new(); + for p in params.iter().cloned() { + if !is_function_type_param(&p) { + __result.push(p); + } + } + __result + }) } pub fn function_type_params_have_collision(type_params: Rc>>) -> bool { { - let names = Rc::new({ let mut __result = Vec::new(); for p in type_params.iter().cloned() { __result.push(p.name.clone()); } __result }); -((names.clone().len() as i64) > (unique_strings(names.clone()).len() as i64)) -} + let names = Rc::new({ + let mut __result = Vec::new(); + for p in type_params.iter().cloned() { + __result.push(p.name.clone()); + } + __result + }); + ((names.clone().len() as i64) > (unique_strings(names.clone()).len() as i64)) + } } -pub fn emit_type_def_from_connective(item: &Rc, recursive_types: Rc>, shared_types: Rc>, env: &Rc, emit_info: Rc, wire_contract_item: &Option>, data_items: Rc>>>>) -> String { +pub fn emit_type_def_from_connective( + item: &Rc, + recursive_types: Rc>, + shared_types: Rc>, + env: &Rc, + emit_info: Rc, + wire_contract_item: &Option>, + data_items: Rc>>>>, +) -> String { { let type_params = emit_type_params(&item.params.clone(), env.source_indices.clone()); -let item_text = authored_name(env.clone(), item.clone()); -let is_product = is_product_type(item.clone()); -if is_product { - emit_struct_from_children(&item_text, type_params, &item.children.clone(), recursive_types, &shared_types, env.clone(), emit_info) + let item_text = authored_name(env.clone(), item.clone()); + let is_product = is_product_type(item.clone()); + if is_product { + emit_struct_from_children( + &item_text, + type_params, + &item.children.clone(), + recursive_types, + &shared_types, + env.clone(), + emit_info, + ) } else { { let serde_enum_tag = match wire_contract_item.clone() { - Some(_) => resolve_wire_serde_tag_for_coproduct(wire_contract_item.clone(), env.source_indices.clone(), data_items), - None => rust_serde_tag_attr(), -}; -emit_enum_from_children(&item_text, &type_params, &item.children.clone(), &recursive_types, &shared_types, &env, &serde_enum_tag) -} + Some(_) => resolve_wire_serde_tag_for_coproduct( + wire_contract_item.clone(), + env.source_indices.clone(), + data_items, + ), + None => rust_serde_tag_attr(), + }; + emit_enum_from_children( + &item_text, + &type_params, + &item.children.clone(), + &recursive_types, + &shared_types, + &env, + &serde_enum_tag, + ) + } } -} + } } -pub fn emit_struct_from_children(name: &String, type_params: String, children: &Rc>>, recursive_types: Rc>, shared_types: &Rc>, env: Rc, emit_info: Rc) -> String { +pub fn emit_struct_from_children( + name: &String, + type_params: String, + children: &Rc>>, + recursive_types: Rc>, + shared_types: &Rc>, + env: Rc, + emit_info: Rc, +) -> String { { let has_fn_fields = match v2_rt::map_get(&emit_info.type_summaries.clone(), name.clone()) { - Some(ts) => ts.has_fn_fields.clone(), - None => false, -}; -let derives = if has_fn_fields { + Some(ts) => ts.has_fn_fields.clone(), + None => false, + }; + let derives = if has_fn_fields { "#[derive(Clone)]".to_string() } else { if emit_map_has(shared_types.clone(), name.clone()) { @@ -977,468 +2290,1583 @@ let derives = if has_fn_fields { rust_struct_derives_copy_text() } }; -if ((children.clone().len() as i64) == 0) { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(derives, "\n".to_string()), rust_visibility_prefix()), rust_items().struct_keyword.clone()), " ".to_string()), name.clone()), type_params), ";".to_string()) + if ((children.clone().len() as i64) == 0) { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(derives, "\n".to_string()), + rust_visibility_prefix(), + ), + rust_items().struct_keyword.clone(), + ), + " ".to_string(), + ), + name.clone(), + ), + type_params, + ), + ";".to_string(), + ) } else { { - let field_lines = Rc::new({ let mut __result = Vec::new(); for child in children.clone().iter().cloned() { __result.push(emit_struct_field_from_child(&child, recursive_types.clone(), &shared_types, &env)); } __result }); -let fields_str = field_lines.join(&"\n".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(derives, "\n".to_string()), rust_visibility_prefix()), rust_items().struct_keyword.clone()), " ".to_string()), name.clone()), type_params), " {\n".to_string()), fields_str), "\n}".to_string()) -} + let field_lines = Rc::new({ + let mut __result = Vec::new(); + for child in children.clone().iter().cloned() { + __result.push(emit_struct_field_from_child( + &child, + recursive_types.clone(), + &shared_types, + &env, + )); + } + __result + }); + let fields_str = field_lines.join(&"\n".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(derives, "\n".to_string()), + rust_visibility_prefix(), + ), + rust_items().struct_keyword.clone(), + ), + " ".to_string(), + ), + name.clone(), + ), + type_params, + ), + " {\n".to_string(), + ), + fields_str, + ), + "\n}".to_string(), + ) + } } -} + } } -pub fn emit_struct_field_from_child(child: &Rc, recursive_types: Rc>, shared_types: &Rc>, env: &Rc) -> String { +pub fn emit_struct_field_from_child( + child: &Rc, + recursive_types: Rc>, + shared_types: &Rc>, + env: &Rc, +) -> String { { let rt_child = resolved_type(child.clone()); -let ty = if ((is_product_type(rt_child.clone()) && (rt_child.ident_span.clone() != None)) && ((rt_child.children.clone().len() as i64) > 2)) { + let ty = if ((is_product_type(rt_child.clone()) && (rt_child.ident_span.clone() != None)) + && ((rt_child.children.clone().len() as i64) > 2)) + { { let rt_child_name = authored_name_at(env.source_indices.clone(), &rt_child); -match lookup_type_by_name(&env, rt_child_name.clone()) { - Some(resolved) => if ((resolved.params.clone().len() as i64) > 0) { - { - let base = coerce_primitive_type(RenderTarget::Rust, rt_child_name.clone()); -let param_names = Rc::new({ let mut __result = Vec::new(); for p in resolved.params.clone().iter().cloned() { __result.push(generic_param_name_at(p.clone(), env.source_indices.clone())); } __result }); -let with_params = v2_rt::concat(v2_rt::concat(v2_rt::concat(base, "<".to_string()), param_names.join(&", ".to_string())), ">".to_string()); -if emit_map_has(shared_types.clone(), rt_child_name.clone()) { - v2_rt::concat(v2_rt::concat("Rc<".to_string(), with_params), ">".to_string()) + match lookup_type_by_name(&env, rt_child_name.clone()) { + Some(resolved) => { + if ((resolved.params.clone().len() as i64) > 0) { + { + let base = coerce_primitive_type( + RenderTarget::Rust, + rt_child_name.clone(), + ); + let param_names = Rc::new({ + let mut __result = Vec::new(); + for p in resolved.params.clone().iter().cloned() { + __result.push(generic_param_name_at( + p.clone(), + env.source_indices.clone(), + )); + } + __result + }); + let with_params = v2_rt::concat( + v2_rt::concat( + v2_rt::concat(base, "<".to_string()), + param_names.join(&", ".to_string()), + ), + ">".to_string(), + ); + if emit_map_has(shared_types.clone(), rt_child_name.clone()) { + v2_rt::concat( + v2_rt::concat("Rc<".to_string(), with_params), + ">".to_string(), + ) + } else { + with_params + } + } } else { - with_params + render_rust_type( + rt_child.clone(), + shared_types.clone(), + env.source_indices.clone(), + ) } -} - } else { - render_rust_type(rt_child.clone(), shared_types.clone(), env.source_indices.clone()) - }, - None => render_rust_type(rt_child.clone(), shared_types.clone(), env.source_indices.clone()), -} -} + } + None => render_rust_type( + rt_child.clone(), + shared_types.clone(), + env.source_indices.clone(), + ), + } + } } else { - render_rust_type(rt_child.clone(), shared_types.clone(), env.source_indices.clone()) + render_rust_type( + rt_child.clone(), + shared_types.clone(), + env.source_indices.clone(), + ) }; -let final_ty = if needs_box_wrapping(rt_child.clone(), recursive_types, shared_types.clone(), env.source_indices.clone()) { + let final_ty = if needs_box_wrapping( + rt_child.clone(), + recursive_types, + shared_types.clone(), + env.source_indices.clone(), + ) { v2_rt::concat(v2_rt::concat("Box<".to_string(), ty), ">".to_string()) } else { ty }; -let rename_attr = match Rc::new({ let mut __result = Vec::new(); for p in child.properties.clone().iter().cloned() { if (field_init_node_name_at(p.clone(), env.source_indices.clone()).as_str() == "from_key".to_string().as_str()) { __result.push(p); } } __result }).first().cloned() { - Some(prop) => match (*field_init_node_value(&prop).expr_data.clone()).clone() { - ExprData::ExprLiteral { value: lv, .. } => match (*lv.clone()).clone() { - LiteralValue::LitStr { value: key, .. } => v2_rt::concat(v2_rt::concat(" ".to_string(), apply_type_template1(rust_serde_rename_template_text(), key.clone())), "\n".to_string()), - _ => "".to_string(), -}, - _ => "".to_string(), -}, - None => "".to_string(), -}; -let authored = authored_name(env.clone(), child.clone()); -let snake = to_snake(authored.clone()); -let is_reserved = { let mut __found = false; for r in language_spec(RenderTarget::Rust).reserved_words.clone().keywords.clone().iter().cloned() { if (r.clone().as_str() == snake.clone().as_str()) { __found = true; break; } } __found }; -let keyword_rename = if (is_reserved && (rename_attr.clone().as_str() == "".to_string().as_str())) { - v2_rt::concat(v2_rt::concat(" #[serde(rename = \"".to_string(), snake.clone()), "\")]\n".to_string()) - } else { - "".to_string() + let rename_attr = match Rc::new({ + let mut __result = Vec::new(); + for p in child.properties.clone().iter().cloned() { + if (field_init_node_name_at(p.clone(), env.source_indices.clone()).as_str() + == "from_key".to_string().as_str()) + { + __result.push(p); + } + } + __result + }) + .first() + .cloned() + { + Some(prop) => match (*field_init_node_value(&prop).expr_data.clone()).clone() { + ExprData::ExprLiteral { value: lv, .. } => match (*lv.clone()).clone() { + LiteralValue::LitStr { value: key, .. } => v2_rt::concat( + v2_rt::concat( + " ".to_string(), + apply_type_template1(rust_serde_rename_template_text(), key.clone()), + ), + "\n".to_string(), + ), + _ => "".to_string(), + }, + _ => "".to_string(), + }, + None => "".to_string(), }; -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(keyword_rename, rename_attr.clone()), " ".to_string()), rust_visibility_prefix()), emit_ident(authored.clone(), RenderTarget::Rust)), ": ".to_string()), final_ty), ",".to_string()) -} + let authored = authored_name(env.clone(), child.clone()); + let snake = to_snake(authored.clone()); + let is_reserved = { + let mut __found = false; + for r in language_spec(RenderTarget::Rust) + .reserved_words + .clone() + .keywords + .clone() + .iter() + .cloned() + { + if (r.clone().as_str() == snake.clone().as_str()) { + __found = true; + break; + } + } + __found + }; + let keyword_rename = + if (is_reserved && (rename_attr.clone().as_str() == "".to_string().as_str())) { + v2_rt::concat( + v2_rt::concat(" #[serde(rename = \"".to_string(), snake.clone()), + "\")]\n".to_string(), + ) + } else { + "".to_string() + }; + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(keyword_rename, rename_attr.clone()), + " ".to_string(), + ), + rust_visibility_prefix(), + ), + emit_ident(authored.clone(), RenderTarget::Rust), + ), + ": ".to_string(), + ), + final_ty, + ), + ",".to_string(), + ) + } } pub fn enum_derives(children: Rc>>) -> String { { - let complex = Rc::new({ let mut __result = Vec::new(); for v in children.iter().cloned() { if ((v.children.clone().len() as i64) > 0) { __result.push(v); } } __result }); -match ((complex.len() as i64) == 0) { - true => rust_enum_derives_copy_text(), - false => rust_enum_derives_text(), -} -} + let complex = Rc::new({ + let mut __result = Vec::new(); + for v in children.iter().cloned() { + if ((v.children.clone().len() as i64) > 0) { + __result.push(v); + } + } + __result + }); + match ((complex.len() as i64) == 0) { + true => rust_enum_derives_copy_text(), + false => rust_enum_derives_text(), + } + } } -pub fn emit_enum_from_children(name: &String, type_params: &String, children: &Rc>>, recursive_types: &Rc>, shared_types: &Rc>, env: &Rc, serde_enum_tag: &String) -> String { +pub fn emit_enum_from_children( + name: &String, + type_params: &String, + children: &Rc>>, + recursive_types: &Rc>, + shared_types: &Rc>, + env: &Rc, + serde_enum_tag: &String, +) -> String { { let derives = enum_derives(children.clone()); -let variant_lines = Rc::new({ let mut __result = Vec::new(); for child in children.clone().iter().cloned() { __result.push(emit_variant_from_child(&child, recursive_types.clone(), shared_types.clone(), &env)); } __result }); -let variants_str = variant_lines.join(&"\n".to_string()); -let tag_line = if (serde_enum_tag.clone().as_str() == "".to_string().as_str()) { + let variant_lines = Rc::new({ + let mut __result = Vec::new(); + for child in children.clone().iter().cloned() { + __result.push(emit_variant_from_child( + &child, + recursive_types.clone(), + shared_types.clone(), + &env, + )); + } + __result + }); + let variants_str = variant_lines.join(&"\n".to_string()); + let tag_line = if (serde_enum_tag.clone().as_str() == "".to_string().as_str()) { "".to_string() } else { v2_rt::concat(serde_enum_tag.clone(), "\n".to_string()) }; -let enum_def = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(derives, "\n".to_string()), tag_line), rust_visibility_prefix()), rust_items().enum_keyword.clone()), " ".to_string()), name.clone()), type_params.clone()), " {\n".to_string()), variants_str), "\n}".to_string()); -let accessor_impl = emit_enum_shared_accessors(&name, &type_params, &children, recursive_types.clone(), shared_types.clone(), &env); -if (accessor_impl.clone().as_str() == "".to_string().as_str()) { + let enum_def = v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(derives, "\n".to_string()), + tag_line, + ), + rust_visibility_prefix(), + ), + rust_items().enum_keyword.clone(), + ), + " ".to_string(), + ), + name.clone(), + ), + type_params.clone(), + ), + " {\n".to_string(), + ), + variants_str, + ), + "\n}".to_string(), + ); + let accessor_impl = emit_enum_shared_accessors( + &name, + &type_params, + &children, + recursive_types.clone(), + shared_types.clone(), + &env, + ); + if (accessor_impl.clone().as_str() == "".to_string().as_str()) { enum_def } else { - v2_rt::concat(v2_rt::concat(enum_def, "\n".to_string()), accessor_impl.clone()) + v2_rt::concat( + v2_rt::concat(enum_def, "\n".to_string()), + accessor_impl.clone(), + ) } -} + } } pub fn find_shared_enum_fields(children: Rc>>, env: Rc) -> Rc> { { - let fielded = Rc::new({ let mut __result = Vec::new(); for child in children.iter().cloned() { if ((child.children.clone().len() as i64) > 0) { __result.push(child); } } __result }); -if ((fielded.clone().len() as i64) == 0) { - return Rc::new(vec![]) + let fielded = Rc::new({ + let mut __result = Vec::new(); + for child in children.iter().cloned() { + if ((child.children.clone().len() as i64) > 0) { + __result.push(child); + } + } + __result + }); + if ((fielded.clone().len() as i64) == 0) { + return Rc::new(vec![]); } -let first_fields = match fielded.clone().first().cloned() { - Some(v) => Rc::new({ let mut __result = Vec::new(); for f in v.children.clone().iter().cloned() { __result.push(authored_name(env.clone(), f.clone())); } __result }), - None => Rc::new(vec![]), -}; -Rc::new({ let mut __result = Vec::new(); for fname in first_fields.iter().cloned() { if { let mut __all = true; for variant in fielded.clone().iter().cloned() { if !({ let mut __found = false; for f in variant.children.clone().iter().cloned() { if (authored_name(env.clone(), f.clone()).as_str() == fname.clone().as_str()) { __found = true; break; } } __found }) { __all = false; break; } } __all } { __result.push(fname); } } __result }) -} + let first_fields = match fielded.clone().first().cloned() { + Some(v) => Rc::new({ + let mut __result = Vec::new(); + for f in v.children.clone().iter().cloned() { + __result.push(authored_name(env.clone(), f.clone())); + } + __result + }), + None => Rc::new(vec![]), + }; + Rc::new({ + let mut __result = Vec::new(); + for fname in first_fields.iter().cloned() { + if { + let mut __all = true; + for variant in fielded.clone().iter().cloned() { + if !({ + let mut __found = false; + for f in variant.children.clone().iter().cloned() { + if (authored_name(env.clone(), f.clone()).as_str() + == fname.clone().as_str()) + { + __found = true; + break; + } + } + __found + }) { + __all = false; + break; + } + } + __all + } { + __result.push(fname); + } + } + __result + }) + } } -pub fn emit_enum_shared_accessors(name: &String, type_params: &String, children: &Rc>>, recursive_types: Rc>, shared_types: Rc>, env: &Rc) -> String { +pub fn emit_enum_shared_accessors( + name: &String, + type_params: &String, + children: &Rc>>, + recursive_types: Rc>, + shared_types: Rc>, + env: &Rc, +) -> String { { let all_shared = find_shared_enum_fields(children.clone(), env.clone()); -if ((all_shared.clone().len() as i64) == 0) { - return "".to_string() + if ((all_shared.clone().len() as i64) == 0) { + return "".to_string(); } -let fielded = Rc::new({ let mut __result = Vec::new(); for child in children.clone().iter().cloned() { if ((child.children.clone().len() as i64) > 0) { __result.push(child); } } __result }); -if ((fielded.clone().len() as i64) == 0) { - return "compile_error!(\"enum shared accessor missing fielded variant\")".to_string() + let fielded = Rc::new({ + let mut __result = Vec::new(); + for child in children.clone().iter().cloned() { + if ((child.children.clone().len() as i64) > 0) { + __result.push(child); + } + } + __result + }); + if ((fielded.clone().len() as i64) == 0) { + return "compile_error!(\"enum shared accessor missing fielded variant\")".to_string(); } -let first_fielded = fielded.clone().first().cloned().clone().unwrap(); -let shared = Rc::new({ let mut __result = Vec::new(); for fname in all_shared.clone().iter().cloned() { if { - let types = Rc::new({ let mut __result = Vec::new(); for variant in fielded.clone().iter().cloned() { __result.push(match Rc::new({ let mut __result = Vec::new(); for f in variant.children.clone().iter().cloned() { if (authored_name(env.clone(), f.clone()).as_str() == fname.clone().as_str()) { __result.push(f); } } __result }).first().cloned() { - Some(f) => render_rust_type(resolved_type(f.clone()), shared_types.clone(), env.source_indices.clone()), - None => "".to_string(), -}); } __result }); -let first_type = match types.clone().first().cloned() { - Some(t) => t.clone(), - None => "".to_string(), -}; -{ let mut __all = true; for t in types.clone().iter().cloned() { if !((t.clone().as_str() == first_type.clone().as_str())) { __all = false; break; } } __all } -} { __result.push(fname); } } __result }); -if ((shared.clone().len() as i64) == 0) { - return "".to_string() - } -let accessor_fns = Rc::new({ let mut __result = Vec::new(); for fname in shared.clone().iter().cloned() { __result.push({ - let ty = match Rc::new({ let mut __result = Vec::new(); for f in first_fielded.children.clone().iter().cloned() { if (authored_name(env.clone(), f.clone()).as_str() == fname.clone().as_str()) { __result.push(f); } } __result }).first().cloned() { - Some(f) => render_rust_type(resolved_type(f.clone()), shared_types.clone(), env.source_indices.clone()), - None => "compile_error!(\"enum shared accessor missing field metadata\")".to_string(), -}; -let arms = Rc::new({ let mut __result = Vec::new(); for child in children.clone().iter().cloned() { __result.push({ - let child_text = authored_name(env.clone(), child.clone()); -if ((child.children.clone().len() as i64) == 0) { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" ".to_string(), name.clone()), "::".to_string()), child_text.clone()), " => panic!(\"no ".to_string()), fname.clone()), " on unit variant\"),".to_string()) - } else { + let first_fielded = fielded.clone().first().cloned().clone().unwrap(); + let shared = Rc::new({ + let mut __result = Vec::new(); + for fname in all_shared.clone().iter().cloned() { + if { + let types = Rc::new({ + let mut __result = Vec::new(); + for variant in fielded.clone().iter().cloned() { + __result.push( + match Rc::new({ + let mut __result = Vec::new(); + for f in variant.children.clone().iter().cloned() { + if (authored_name(env.clone(), f.clone()).as_str() + == fname.clone().as_str()) + { + __result.push(f); + } + } + __result + }) + .first() + .cloned() + { + Some(f) => render_rust_type( + resolved_type(f.clone()), + shared_types.clone(), + env.source_indices.clone(), + ), + None => "".to_string(), + }, + ); + } + __result + }); + let first_type = match types.clone().first().cloned() { + Some(t) => t.clone(), + None => "".to_string(), + }; { - let sharing = language_spec(RenderTarget::Rust).sharing.clone(); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" ".to_string(), name.clone()), "::".to_string()), child_text.clone()), " { ".to_string()), emit_ident(fname.clone(), RenderTarget::Rust)), ": __val, .. } => ".to_string()), apply_type_template1(sharing.clone_value.clone(), "__val".to_string())), ",".to_string()) -} + let mut __all = true; + for t in types.clone().iter().cloned() { + if !(t.clone().as_str() == first_type.clone().as_str()) { + __all = false; + break; + } + } + __all + } + } { + __result.push(fname); } -}); } __result }); -let arms_str = arms.clone().join(&"\n".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" pub fn ".to_string(), emit_ident(fname.clone(), RenderTarget::Rust)), "(&self) -> ".to_string()), ty.clone()), " {\n match self {\n".to_string()), arms_str.clone()), "\n }\n }".to_string()) -}); } __result }); -let fns_str = accessor_fns.join(&"\n".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("impl".to_string(), type_params.clone()), " ".to_string()), name.clone()), type_params.clone()), " {\n".to_string()), fns_str), "\n}".to_string()) -} + } + __result + }); + if ((shared.clone().len() as i64) == 0) { + return "".to_string(); + } + let accessor_fns = Rc::new({ + let mut __result = Vec::new(); + for fname in shared.clone().iter().cloned() { + __result.push({ + let ty = match Rc::new({ + let mut __result = Vec::new(); + for f in first_fielded.children.clone().iter().cloned() { + if (authored_name(env.clone(), f.clone()).as_str() + == fname.clone().as_str()) + { + __result.push(f); + } + } + __result + }) + .first() + .cloned() + { + Some(f) => render_rust_type( + resolved_type(f.clone()), + shared_types.clone(), + env.source_indices.clone(), + ), + None => "compile_error!(\"enum shared accessor missing field metadata\")" + .to_string(), + }; + let arms = Rc::new({ + let mut __result = Vec::new(); + for child in children.clone().iter().cloned() { + __result.push({ + let child_text = authored_name(env.clone(), child.clone()); + if ((child.children.clone().len() as i64) == 0) { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + " ".to_string(), + name.clone(), + ), + "::".to_string(), + ), + child_text.clone(), + ), + " => panic!(\"no ".to_string(), + ), + fname.clone(), + ), + " on unit variant\"),".to_string(), + ) + } else { + { + let sharing = + language_spec(RenderTarget::Rust).sharing.clone(); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + " ".to_string(), + name.clone(), + ), + "::".to_string(), + ), + child_text.clone(), + ), + " { ".to_string(), + ), + emit_ident( + fname.clone(), + RenderTarget::Rust, + ), + ), + ": __val, .. } => ".to_string(), + ), + apply_type_template1( + sharing.clone_value.clone(), + "__val".to_string(), + ), + ), + ",".to_string(), + ) + } + } + }); + } + __result + }); + let arms_str = arms.clone().join(&"\n".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + " pub fn ".to_string(), + emit_ident(fname.clone(), RenderTarget::Rust), + ), + "(&self) -> ".to_string(), + ), + ty.clone(), + ), + " {\n match self {\n".to_string(), + ), + arms_str.clone(), + ), + "\n }\n }".to_string(), + ) + }); + } + __result + }); + let fns_str = accessor_fns.join(&"\n".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("impl".to_string(), type_params.clone()), + " ".to_string(), + ), + name.clone(), + ), + type_params.clone(), + ), + " {\n".to_string(), + ), + fns_str, + ), + "\n}".to_string(), + ) + } } -pub fn emit_variant_from_child(child: &Rc, recursive_types: Rc>, shared_types: Rc>, env: &Rc) -> String { +pub fn emit_variant_from_child( + child: &Rc, + recursive_types: Rc>, + shared_types: Rc>, + env: &Rc, +) -> String { { let child_text = authored_name(env.clone(), child.clone()); -if ((child.children.clone().len() as i64) == 0) { - v2_rt::concat(v2_rt::concat(" ".to_string(), child_text), ",".to_string()) + if ((child.children.clone().len() as i64) == 0) { + v2_rt::concat( + v2_rt::concat(" ".to_string(), child_text), + ",".to_string(), + ) } else { { - let field_lines = Rc::new({ let mut __result = Vec::new(); for f in child.children.clone().iter().cloned() { __result.push({ - let rt_f = resolved_type(f.clone()); -let ty = render_rust_type(rt_f.clone(), shared_types.clone(), env.source_indices.clone()); -let final_ty = if needs_box_wrapping(rt_f.clone(), recursive_types.clone(), shared_types.clone(), env.source_indices.clone()) { - v2_rt::concat(v2_rt::concat("Box<".to_string(), ty.clone()), ">".to_string()) - } else { - ty.clone() - }; -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" ".to_string(), emit_ident(authored_name(env.clone(), f.clone()), RenderTarget::Rust)), ": ".to_string()), final_ty.clone()), ",".to_string()) -}); } __result }); -let fields_str = field_lines.join(&"\n".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" ".to_string(), child_text), " {\n".to_string()), fields_str), "\n },".to_string()) -} + let field_lines = Rc::new({ + let mut __result = Vec::new(); + for f in child.children.clone().iter().cloned() { + __result.push({ + let rt_f = resolved_type(f.clone()); + let ty = render_rust_type( + rt_f.clone(), + shared_types.clone(), + env.source_indices.clone(), + ); + let final_ty = if needs_box_wrapping( + rt_f.clone(), + recursive_types.clone(), + shared_types.clone(), + env.source_indices.clone(), + ) { + v2_rt::concat( + v2_rt::concat("Box<".to_string(), ty.clone()), + ">".to_string(), + ) + } else { + ty.clone() + }; + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + " ".to_string(), + emit_ident( + authored_name(env.clone(), f.clone()), + RenderTarget::Rust, + ), + ), + ": ".to_string(), + ), + final_ty.clone(), + ), + ",".to_string(), + ) + }); + } + __result + }); + let fields_str = field_lines.join(&"\n".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(" ".to_string(), child_text), + " {\n".to_string(), + ), + fields_str, + ), + "\n },".to_string(), + ) + } } -} + } } -pub fn emit_fn_def(name: &String, params: &Rc>>, inferred: Rc, body: &Rc, registry: &Rc>>, scope: &Rc, shared_types: &Rc>, emit_info: &Rc) -> String { +pub fn emit_fn_def( + name: &String, + params: &Rc>>, + inferred: Rc, + body: &Rc, + registry: &Rc>>, + scope: &Rc, + shared_types: &Rc>, + emit_info: &Rc, +) -> String { { let si = scope.type_env.clone().source_indices.clone(); -let type_params = function_type_params(params.clone()); -let value_params = function_value_params(params.clone()); -if function_type_params_have_collision(type_params.clone()) { - return v2_rt::concat(v2_rt::concat("compile_error!(\"type param name collides with a value param in fn '".to_string(), name.clone()), "' — a value param shares its name with a declared type param; rename the value param or dissolve via ParamKind/params-slot partition\");\n".to_string()) - } -let type_params_str = emit_type_params(&type_params, si.clone()); -let params_str = emit_params(value_params.clone(), shared_types.clone(), si.clone(), emit_info.read_only_params.clone()); -let ret_str = emit_inferred(inferred, shared_types.clone(), si.clone()); -let body_scope = build_params_scope(&scope, value_params.clone()); -let depth = 0; -let use_tco = is_tco_eligible(&name, &body, registry.clone(), &si); -let needs_stacker = (is_self_recursive(&name, body.clone(), registry.clone(), si.clone()) && (use_tco.clone() == false)); -if use_tco.clone() { + let type_params = function_type_params(params.clone()); + let value_params = function_value_params(params.clone()); + if function_type_params_have_collision(type_params.clone()) { + return v2_rt::concat(v2_rt::concat("compile_error!(\"type param name collides with a value param in fn '".to_string(), name.clone()), "' — a value param shares its name with a declared type param; rename the value param or dissolve via ParamKind/params-slot partition\");\n".to_string()); + } + let type_params_str = emit_type_params(&type_params, si.clone()); + let params_str = emit_params( + value_params.clone(), + shared_types.clone(), + si.clone(), + emit_info.read_only_params.clone(), + ); + let ret_str = emit_inferred(inferred, shared_types.clone(), si.clone()); + let body_scope = build_params_scope(&scope, value_params.clone()); + let depth = 0; + let use_tco = is_tco_eligible(&name, &body, registry.clone(), &si); + let needs_stacker = (is_self_recursive(&name, body.clone(), registry.clone(), si.clone()) + && (use_tco.clone() == false)); + if use_tco.clone() { { - let tco_params_str = emit_tco_params(value_params.clone(), shared_types.clone(), si.clone()); -let body_str = emit_typed_tco_body(body.clone(), name.clone(), value_params.clone(), registry.clone(), body_scope, (depth.clone() + 1), shared_types.clone(), emit_info.clone()); -let kw = rust_items().func_keyword.clone(); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(rust_visibility_prefix(), kw), " ".to_string()), emit_ident(name.clone(), RenderTarget::Rust)), type_params_str), "(".to_string()), tco_params_str), ")".to_string()), ret_str), " {\n".to_string()), make_indent((depth.clone() + 1))), body_str), "\n}".to_string()) -} + let tco_params_str = + emit_tco_params(value_params.clone(), shared_types.clone(), si.clone()); + let body_str = emit_typed_tco_body( + body.clone(), + name.clone(), + value_params.clone(), + registry.clone(), + body_scope, + (depth.clone() + 1), + shared_types.clone(), + emit_info.clone(), + ); + let kw = rust_items().func_keyword.clone(); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + rust_visibility_prefix(), + kw, + ), + " ".to_string(), + ), + emit_ident( + name.clone(), + RenderTarget::Rust, + ), + ), + type_params_str, + ), + "(".to_string(), + ), + tco_params_str, + ), + ")".to_string(), + ), + ret_str, + ), + " {\n".to_string(), + ), + make_indent((depth.clone() + 1)), + ), + body_str, + ), + "\n}".to_string(), + ) + } } else { - emit_fn_def_non_tco(name.clone(), type_params_str, params_str, ret_str, body.clone(), registry.clone(), body_scope, depth.clone(), shared_types.clone(), emit_info.clone(), needs_stacker) + emit_fn_def_non_tco( + name.clone(), + type_params_str, + params_str, + ret_str, + body.clone(), + registry.clone(), + body_scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + needs_stacker, + ) } -} + } } -pub fn emit_fn_def_non_tco(name: String, type_params_str: String, params_str: String, ret_str: String, body: Rc, registry: Rc>>, scope: Rc, depth: i64, shared_types: Rc>, emit_info: Rc, needs_stacker: bool) -> String { +pub fn emit_fn_def_non_tco( + name: String, + type_params_str: String, + params_str: String, + ret_str: String, + body: Rc, + registry: Rc>>, + scope: Rc, + depth: i64, + shared_types: Rc>, + emit_info: Rc, + needs_stacker: bool, +) -> String { if needs_stacker { { - let body_str = emit_typed_expr(body, registry, &scope, (depth.clone() + 2), shared_types, emit_info, 1024); -let kw = rust_items().func_keyword.clone(); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(rust_visibility_prefix(), kw), " ".to_string()), emit_ident(name, RenderTarget::Rust)), type_params_str), "(".to_string()), params_str), ")".to_string()), ret_str), " {\n".to_string()), make_indent((depth.clone() + 1))), "stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || {\n".to_string()), make_indent((depth.clone() + 2))), body_str), "\n".to_string()), make_indent((depth.clone() + 1))), "})\n}".to_string()) -} + let body_str = emit_typed_expr( + body, + registry, + &scope, + (depth.clone() + 2), + shared_types, + emit_info, + 1024, + ); + let kw = rust_items().func_keyword.clone(); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + rust_visibility_prefix( + ), + kw, + ), + " ".to_string(), + ), + emit_ident( + name, + RenderTarget::Rust, + ), + ), + type_params_str, + ), + "(".to_string(), + ), + params_str, + ), + ")".to_string(), + ), + ret_str, + ), + " {\n".to_string(), + ), + make_indent((depth.clone() + 1)), + ), + "stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || {\n" + .to_string(), + ), + make_indent((depth.clone() + 2)), + ), + body_str, + ), + "\n".to_string(), + ), + make_indent((depth.clone() + 1)), + ), + "})\n}".to_string(), + ) + } } else { { - let body_str = emit_typed_expr(body, registry, &scope, (depth.clone() + 1), shared_types, emit_info, 1024); -let kw = rust_items().func_keyword.clone(); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(rust_visibility_prefix(), kw), " ".to_string()), emit_ident(name, RenderTarget::Rust)), type_params_str), "(".to_string()), params_str), ")".to_string()), ret_str), " {\n".to_string()), make_indent((depth.clone() + 1))), body_str), "\n}".to_string()) -} + let body_str = emit_typed_expr( + body, + registry, + &scope, + (depth.clone() + 1), + shared_types, + emit_info, + 1024, + ); + let kw = rust_items().func_keyword.clone(); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(rust_visibility_prefix(), kw), + " ".to_string(), + ), + emit_ident(name, RenderTarget::Rust), + ), + type_params_str, + ), + "(".to_string(), + ), + params_str, + ), + ")".to_string(), + ), + ret_str, + ), + " {\n".to_string(), + ), + make_indent((depth.clone() + 1)), + ), + body_str, + ), + "\n}".to_string(), + ) + } } } -pub fn emit_func_def(name: &String, params: &Rc>>, inferred: Rc, uses: &Rc>>, body: Rc, registry: &Rc>>, scope: &Rc, shared_types: &Rc>, emit_info: &Rc) -> String { +pub fn emit_func_def( + name: &String, + params: &Rc>>, + inferred: Rc, + uses: &Rc>>, + body: Rc, + registry: &Rc>>, + scope: &Rc, + shared_types: &Rc>, + emit_info: &Rc, +) -> String { { if ((function_type_params(params.clone()).len() as i64) > 0) { - return v2_rt::concat(v2_rt::concat("compile_error!(\"emit_func_def saw type params in `".to_string(), name.clone()), "` — func/pattern/interface don't route through the generic-fn split today; the parser invariant at parse_block_body_from_prefix has changed. Plumb type_params through this path or dissolve via ParamKind/params-slot partition.\");\n".to_string()) + return v2_rt::concat(v2_rt::concat("compile_error!(\"emit_func_def saw type params in `".to_string(), name.clone()), "` — func/pattern/interface don't route through the generic-fn split today; the parser invariant at parse_block_body_from_prefix has changed. Plumb type_params through this path or dissolve via ParamKind/params-slot partition.\");\n".to_string()); } -let depth = 0; -let service_names = match lookup_item(registry.clone(), name.clone()) { - Some(info) => info.service_names.clone(), - None => Rc::new(vec![]), -}; -let params_str = emit_func_params(params.clone(), uses.clone(), service_names, shared_types.clone(), scope.type_env.clone().source_indices.clone(), emit_info.read_only_params.clone()); -let ret_str = emit_func_inferred(inferred, shared_types.clone(), scope.type_env.clone().source_indices.clone()); -let body_scope = build_params_scope(&scope, params.clone()); -let si = scope.type_env.clone().source_indices.clone(); -let body_scope = uses.clone().iter().cloned().fold(body_scope.clone(), |s: Rc, u: Rc| extend_scope(&s, &resource_use_name_at(u.clone(), si.clone()), resource_use_resource(&u), Rc::new(SubValueRelation::SubValueUnknown))); -let body_str = emit_func_body(&body, ®istry, &body_scope, (depth.clone() + 1), &shared_types, &emit_info); -let items = rust_items(); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(rust_visibility_prefix(), items.async_prefix.clone()), items.func_keyword.clone()), " ".to_string()), emit_ident(name.clone(), RenderTarget::Rust)), "(".to_string()), params_str), ")".to_string()), ret_str), " {\n".to_string()), make_indent((depth.clone() + 1))), body_str), "\n}".to_string()) -} + let depth = 0; + let service_names = match lookup_item(registry.clone(), name.clone()) { + Some(info) => info.service_names.clone(), + None => Rc::new(vec![]), + }; + let params_str = emit_func_params( + params.clone(), + uses.clone(), + service_names, + shared_types.clone(), + scope.type_env.clone().source_indices.clone(), + emit_info.read_only_params.clone(), + ); + let ret_str = emit_func_inferred( + inferred, + shared_types.clone(), + scope.type_env.clone().source_indices.clone(), + ); + let body_scope = build_params_scope(&scope, params.clone()); + let si = scope.type_env.clone().source_indices.clone(); + let body_scope = uses.clone().iter().cloned().fold( + body_scope.clone(), + |s: Rc, u: Rc| { + extend_scope( + &s, + &resource_use_name_at(u.clone(), si.clone()), + resource_use_resource(&u), + Rc::new(SubValueRelation::SubValueUnknown), + ) + }, + ); + let body_str = emit_func_body( + &body, + ®istry, + &body_scope, + (depth.clone() + 1), + &shared_types, + &emit_info, + ); + let items = rust_items(); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + rust_visibility_prefix(), + items.async_prefix.clone(), + ), + items.func_keyword.clone(), + ), + " ".to_string(), + ), + emit_ident(name.clone(), RenderTarget::Rust), + ), + "(".to_string(), + ), + params_str, + ), + ")".to_string(), + ), + ret_str, + ), + " {\n".to_string(), + ), + make_indent((depth.clone() + 1)), + ), + body_str, + ), + "\n}".to_string(), + ) + } } -pub fn emit_func_body(body: &Rc, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { +pub fn emit_func_body( + body: &Rc, + registry: &Rc>>, + scope: &Rc, + depth: i64, + shared_types: &Rc>, + emit_info: &Rc, +) -> String { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - { - let si = scope.type_env.clone().source_indices.clone(); -match (*body.expr_data.clone()).clone() { - ExprData::ExprLet => { + let si = scope.type_env.clone().source_indices.clone(); + match (*body.expr_data.clone()).clone() { + ExprData::ExprLet => { let n = let_binding_name_at(body.clone(), si); -let v = let_value(body.clone()); -let inner = let_body(body.clone()); -let val_str = emit_typed_expr(v.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -let let_line = emit_let_binding(n.clone(), val_str, &RenderTarget::Rust); -let next_scope = extend_scope(&scope, &n, resolved_type(v.clone()), Rc::new(SubValueRelation::SubValueUnknown)); -match inner { - Some(bd) => v2_rt::concat(v2_rt::concat(let_line, "\n".to_string()), emit_func_body(&bd, ®istry, &next_scope, depth.clone(), &shared_types, &emit_info)), - None => let_line, -} -}, - ExprData::ExprBlock => { + let v = let_value(body.clone()); + let inner = let_body(body.clone()); + let val_str = emit_typed_expr( + v.clone(), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + let let_line = emit_let_binding(n.clone(), val_str, &RenderTarget::Rust); + let next_scope = extend_scope( + &scope, + &n, + resolved_type(v.clone()), + Rc::new(SubValueRelation::SubValueUnknown), + ); + match inner { + Some(bd) => v2_rt::concat( + v2_rt::concat(let_line, "\n".to_string()), + emit_func_body( + &bd, + ®istry, + &next_scope, + depth.clone(), + &shared_types, + &emit_info, + ), + ), + None => let_line, + } + } + ExprData::ExprBlock => { let ss = body.children.clone(); -if ((ss.clone().len() as i64) == 0) { + if ((ss.clone().len() as i64) == 0) { "Ok(())".to_string() } else { { - let init_state = emit_rust_init_block_stmts(ss.clone(), Rc::new(vec![]), scope.clone(), registry.clone(), depth.clone(), shared_types.clone(), emit_info.clone()); -let last_stmt = ss.clone().last().cloned(); -let last_str = match last_stmt { - Some(s) => match (*s.expr_data.clone()).clone() { - ExprData::ExprReturn => v2_rt::concat(v2_rt::concat("return Ok(".to_string(), emit_typed_expr(return_value(s.clone()), registry.clone(), &init_state.scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone(), 1024)), ")".to_string()), - _ => v2_rt::concat(v2_rt::concat("Ok(".to_string(), emit_typed_expr(s.clone(), registry.clone(), &init_state.scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone(), 1024)), ")".to_string()), -}, - None => "Ok(())".to_string(), -}; -if ((init_state.text.clone().len() as i64) == 0) { + let init_state = emit_rust_init_block_stmts( + ss.clone(), + Rc::new(vec![]), + scope.clone(), + registry.clone(), + depth.clone(), + shared_types.clone(), + emit_info.clone(), + ); + let last_stmt = ss.clone().last().cloned(); + let last_str = match last_stmt { + Some(s) => match (*s.expr_data.clone()).clone() { + ExprData::ExprReturn => v2_rt::concat( + v2_rt::concat( + "return Ok(".to_string(), + emit_typed_expr( + return_value(s.clone()), + registry.clone(), + &init_state.scope.clone(), + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ), + ), + ")".to_string(), + ), + _ => v2_rt::concat( + v2_rt::concat( + "Ok(".to_string(), + emit_typed_expr( + s.clone(), + registry.clone(), + &init_state.scope.clone(), + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ), + ), + ")".to_string(), + ), + }, + None => "Ok(())".to_string(), + }; + if ((init_state.text.clone().len() as i64) == 0) { last_str } else { - v2_rt::concat(v2_rt::concat(init_state.text.clone().join(&"\n".to_string()), "\n".to_string()), last_str) + v2_rt::concat( + v2_rt::concat( + init_state.text.clone().join(&"\n".to_string()), + "\n".to_string(), + ), + last_str, + ) } -} + } } -}, - ExprData::ExprReturn => v2_rt::concat(v2_rt::concat("return Ok(".to_string(), emit_typed_expr(return_value(body.clone()), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024)), ")".to_string()), - _ => v2_rt::concat(v2_rt::concat("Ok(".to_string(), emit_typed_expr(body.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024)), ")".to_string()), -} -} + } + ExprData::ExprReturn => v2_rt::concat( + v2_rt::concat( + "return Ok(".to_string(), + emit_typed_expr( + return_value(body.clone()), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ), + ), + ")".to_string(), + ), + _ => v2_rt::concat( + v2_rt::concat( + "Ok(".to_string(), + emit_typed_expr( + body.clone(), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ), + ), + ")".to_string(), + ), + } }) } -pub fn emit_tco_params(params: Rc>>, shared_types: Rc>, source_indices: Rc>>) -> String { +pub fn emit_tco_params( + params: Rc>>, + shared_types: Rc>, + source_indices: Rc>>, +) -> String { { - let strs = Rc::new({ let mut __result = Vec::new(); for p in params.iter().cloned() { __result.push(emit_tco_param(&p, shared_types.clone(), &source_indices)); } __result }); -strs.join(&", ".to_string()) -} + let strs = Rc::new({ + let mut __result = Vec::new(); + for p in params.iter().cloned() { + __result.push(emit_tco_param(&p, shared_types.clone(), &source_indices)); + } + __result + }); + strs.join(&", ".to_string()) + } } -pub fn emit_tco_param(param: &Rc, shared_types: Rc>, source_indices: &Rc>>) -> String { +pub fn emit_tco_param( + param: &Rc, + shared_types: Rc>, + source_indices: &Rc>>, +) -> String { { let n = param_node_type_expr(¶m); -let ty = emit_rust_param_type(&n, &shared_types, &source_indices); -v2_rt::concat(v2_rt::concat(v2_rt::concat("mut ".to_string(), emit_ident(param_node_name_at(param.clone(), source_indices.clone()), RenderTarget::Rust)), rust_items().param_type_sep.clone()), ty) -} + let ty = emit_rust_param_type(&n, &shared_types, &source_indices); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "mut ".to_string(), + emit_ident( + param_node_name_at(param.clone(), source_indices.clone()), + RenderTarget::Rust, + ), + ), + rust_items().param_type_sep.clone(), + ), + ty, + ) + } } -pub fn emit_func_params(params: Rc>>, uses: Rc>>, service_names: Rc>, shared_types: Rc>, source_indices: Rc>>, read_only_params: Rc>) -> String { +pub fn emit_func_params( + params: Rc>>, + uses: Rc>>, + service_names: Rc>, + shared_types: Rc>, + source_indices: Rc>>, + read_only_params: Rc>, +) -> String { { - let param_strs = Rc::new({ let mut __result = Vec::new(); for p in params.iter().cloned() { __result.push(emit_param(&p, shared_types.clone(), &source_indices, read_only_params.clone())); } __result }); -let resource_strs = Rc::new({ let mut __result = Vec::new(); for u in uses.iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(emit_ident(resource_use_name_at(u.clone(), source_indices.clone()), RenderTarget::Rust), ": &".to_string()), render_rust_type(resource_use_resource(&u), shared_types.clone(), source_indices.clone()))); } __result }); -let service_strs = Rc::new({ let mut __result = Vec::new(); for sn in service_names.iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(service_var_name(sn.clone()), ": &".to_string()), sanitize_service_name(sn.clone()))); } __result }); -let all_params = v2_rt::concat(v2_rt::concat(param_strs, resource_strs), service_strs); -all_params.join(&", ".to_string()) -} -} - -pub fn emit_func_inferred(inferred: Rc, shared_types: Rc>, source_indices: Rc>>) -> String { - v2_rt::concat(v2_rt::concat(" -> Result<".to_string(), render_rust_type(inferred, shared_types, source_indices)), ", Box>".to_string()) + let param_strs = Rc::new({ + let mut __result = Vec::new(); + for p in params.iter().cloned() { + __result.push(emit_param( + &p, + shared_types.clone(), + &source_indices, + read_only_params.clone(), + )); + } + __result + }); + let resource_strs = Rc::new({ + let mut __result = Vec::new(); + for u in uses.iter().cloned() { + __result.push(v2_rt::concat( + v2_rt::concat( + emit_ident( + resource_use_name_at(u.clone(), source_indices.clone()), + RenderTarget::Rust, + ), + ": &".to_string(), + ), + render_rust_type( + resource_use_resource(&u), + shared_types.clone(), + source_indices.clone(), + ), + )); + } + __result + }); + let service_strs = Rc::new({ + let mut __result = Vec::new(); + for sn in service_names.iter().cloned() { + __result.push(v2_rt::concat( + v2_rt::concat(service_var_name(sn.clone()), ": &".to_string()), + sanitize_service_name(sn.clone()), + )); + } + __result + }); + let all_params = v2_rt::concat(v2_rt::concat(param_strs, resource_strs), service_strs); + all_params.join(&", ".to_string()) + } } -pub fn emit_params(params: Rc>>, shared_types: Rc>, source_indices: Rc>>, read_only_params: Rc>) -> String { +pub fn emit_func_inferred( + inferred: Rc, + shared_types: Rc>, + source_indices: Rc>>, +) -> String { + v2_rt::concat( + v2_rt::concat( + " -> Result<".to_string(), + render_rust_type(inferred, shared_types, source_indices), + ), + ", Box>".to_string(), + ) +} + +pub fn emit_params( + params: Rc>>, + shared_types: Rc>, + source_indices: Rc>>, + read_only_params: Rc>, +) -> String { { - let strs = Rc::new({ let mut __result = Vec::new(); for p in params.iter().cloned() { __result.push(emit_param(&p, shared_types.clone(), &source_indices, read_only_params.clone())); } __result }); -strs.join(&", ".to_string()) -} + let strs = Rc::new({ + let mut __result = Vec::new(); + for p in params.iter().cloned() { + __result.push(emit_param( + &p, + shared_types.clone(), + &source_indices, + read_only_params.clone(), + )); + } + __result + }); + strs.join(&", ".to_string()) + } } -pub fn emit_rust_param_type(n: &Rc, shared_types: &Rc>, source_indices: &Rc>>) -> String { +pub fn emit_rust_param_type( + n: &Rc, + shared_types: &Rc>, + source_indices: &Rc>>, +) -> String { if ((n.params.clone().len() as i64) > 0) { { - let param_types = Rc::new({ let mut __result = Vec::new(); for p in n.params.clone().iter().cloned() { __result.push(render_rust_type(param_node_type_expr(&p), shared_types.clone(), source_indices.clone())); } __result }); -let param_str = param_types.join(&", ".to_string()); -let ret_str = match n.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => render_rust_type(rt.clone(), shared_types.clone(), source_indices.clone()), - _ => "()".to_string(), -}; -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("impl Fn(".to_string(), param_str), ") -> ".to_string()), ret_str), " + Clone".to_string()) -} + let param_types = Rc::new({ + let mut __result = Vec::new(); + for p in n.params.clone().iter().cloned() { + __result.push(render_rust_type( + param_node_type_expr(&p), + shared_types.clone(), + source_indices.clone(), + )); + } + __result + }); + let param_str = param_types.join(&", ".to_string()); + let ret_str = match n.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => { + render_rust_type(rt.clone(), shared_types.clone(), source_indices.clone()) + } + _ => "()".to_string(), + }; + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("impl Fn(".to_string(), param_str), + ") -> ".to_string(), + ), + ret_str, + ), + " + Clone".to_string(), + ) + } } else { render_rust_type(n.clone(), shared_types.clone(), source_indices.clone()) } } -pub fn emit_param(param: &Rc, shared_types: Rc>, source_indices: &Rc>>, read_only_params: Rc>) -> String { +pub fn emit_param( + param: &Rc, + shared_types: Rc>, + source_indices: &Rc>>, + read_only_params: Rc>, +) -> String { { let n = param_node_type_expr(¶m); -let ty = emit_rust_param_type(&n, &shared_types, &source_indices); -let pname = param_node_name_at(param.clone(), source_indices.clone()); -let is_callable_param = ((n.params.clone().len() as i64) > 0); -let is_borrowable = ((v2_rt::map_contains_key(&read_only_params, pname.clone()) && (is_callable_param == false)) && needs_reference_node(&n, source_indices.clone())); -let final_ty = if is_borrowable { - apply_type_template1(sharing_for_target(RenderTarget::Rust).borrow_param_template.clone(), ty) + let ty = emit_rust_param_type(&n, &shared_types, &source_indices); + let pname = param_node_name_at(param.clone(), source_indices.clone()); + let is_callable_param = ((n.params.clone().len() as i64) > 0); + let is_borrowable = ((v2_rt::map_contains_key(&read_only_params, pname.clone()) + && (is_callable_param == false)) + && needs_reference_node(&n, source_indices.clone())); + let final_ty = if is_borrowable { + apply_type_template1( + sharing_for_target(RenderTarget::Rust) + .borrow_param_template + .clone(), + ty, + ) } else { ty }; -v2_rt::concat(v2_rt::concat(emit_ident(pname.clone(), RenderTarget::Rust), rust_items().param_type_sep.clone()), final_ty) -} + v2_rt::concat( + v2_rt::concat( + emit_ident(pname.clone(), RenderTarget::Rust), + rust_items().param_type_sep.clone(), + ), + final_ty, + ) + } } -pub fn emit_inferred(inferred: Rc, shared_types: Rc>, source_indices: Rc>>) -> String { - v2_rt::concat(rust_items().return_arrow.clone(), render_rust_type(inferred, shared_types, source_indices)) +pub fn emit_inferred( + inferred: Rc, + shared_types: Rc>, + source_indices: Rc>>, +) -> String { + v2_rt::concat( + rust_items().return_arrow.clone(), + render_rust_type(inferred, shared_types, source_indices), + ) } -pub fn needs_reference_node(n: &Rc, source_indices: Rc>>) -> bool { - if ((n.connective.clone() != Connective::NoConnective) || ((n.children.clone().len() as i64) > 0)) { +pub fn needs_reference_node( + n: &Rc, + source_indices: Rc>>, +) -> bool { + if ((n.connective.clone() != Connective::NoConnective) + || ((n.children.clone().len() as i64) > 0)) + { true } else { { - let is_copy = (is_rust_value_type(n.clone(), source_indices) || (is_product_type(n.clone()) && ((n.children.clone().len() as i64) == 0))); -(is_copy == false) -} + let is_copy = (is_rust_value_type(n.clone(), source_indices) + || (is_product_type(n.clone()) && ((n.children.clone().len() as i64) == 0))); + (is_copy == false) + } } } pub fn is_string_lit_pattern(p: Rc) -> bool { match (*p).clone() { - MatchPattern::LitPattern { value: v, .. } => match (*v.clone()).clone() { - LiteralValue::LitStr { .. } => true, - _ => false, -}, - _ => false, -} + MatchPattern::LitPattern { value: v, .. } => match (*v.clone()).clone() { + LiteralValue::LitStr { .. } => true, + _ => false, + }, + _ => false, + } } -pub fn collect_pattern_string_guards(mut pattern: Rc, mut source_indices: Rc>>) -> String { +pub fn collect_pattern_string_guards( + mut pattern: Rc, + mut source_indices: Rc>>, +) -> String { loop { match (*pattern).clone() { - MatchPattern::VariantPattern { name: n, field_bindings: fbs, .. } => { if ((n.clone().as_str() == "Some".to_string().as_str()) && ((fbs.clone().len() as i64) == 1)) { - match fbs.clone().first().cloned() { - Some(fb) => { let fb_pat = field_binding_pattern(fb.clone()); -if is_string_lit_pattern(fb_pat.clone()) { - match (*fb_pat.clone()).clone() { - MatchPattern::LitPattern { ref value, .. } => { let LiteralValue::LitStr { value: s, .. } = value.as_ref() else { unreachable!() }; break v2_rt::concat("__some_val == ".to_string(), emit_string_literal(s.clone(), "".to_string())); }, - _ => { break "".to_string(); }, -} -} else { + MatchPattern::VariantPattern { + name: n, + field_bindings: fbs, + .. + } => { + if ((n.clone().as_str() == "Some".to_string().as_str()) + && ((fbs.clone().len() as i64) == 1)) { - let __tco_0 = fb_pat.clone(); -pattern = __tco_0; -continue; -} -} }, - None => { break "".to_string(); }, -} -} else { - let str_bindings = Rc::new({ let mut __result = Vec::new(); for fb in fbs.clone().iter().cloned() { if is_string_lit_pattern(field_binding_pattern(fb.clone())) { __result.push(fb); } } __result }); -let guards = Rc::new({ let mut __result = Vec::new(); for fb in str_bindings.iter().cloned() { __result.push(match (*field_binding_pattern(fb.clone())).clone() { - MatchPattern::LitPattern { ref value, .. } => { let LiteralValue::LitStr { value: s, .. } = value.as_ref() else { unreachable!() }; v2_rt::concat(v2_rt::concat(emit_ident(field_binding_name_at(fb.clone(), source_indices.clone()), RenderTarget::Rust), " == ".to_string()), emit_string_literal(s.clone(), "".to_string())) }, - _ => "".to_string(), -}); } __result }); -break guards.join(&" && ".to_string()); -} }, - _ => { break "".to_string(); }, -} -} + match fbs.clone().first().cloned() { + Some(fb) => { + let fb_pat = field_binding_pattern(fb.clone()); + if is_string_lit_pattern(fb_pat.clone()) { + match (*fb_pat.clone()).clone() { + MatchPattern::LitPattern { ref value, .. } => { + let LiteralValue::LitStr { value: s, .. } = value.as_ref() + else { + unreachable!() + }; + break v2_rt::concat( + "__some_val == ".to_string(), + emit_string_literal(s.clone(), "".to_string()), + ); + } + _ => { + break "".to_string(); + } + } + } else { + { + let __tco_0 = fb_pat.clone(); + pattern = __tco_0; + continue; + } + } + } + None => { + break "".to_string(); + } + } + } else { + let str_bindings = Rc::new({ + let mut __result = Vec::new(); + for fb in fbs.clone().iter().cloned() { + if is_string_lit_pattern(field_binding_pattern(fb.clone())) { + __result.push(fb); + } + } + __result + }); + let guards = Rc::new({ + let mut __result = Vec::new(); + for fb in str_bindings.iter().cloned() { + __result.push(match (*field_binding_pattern(fb.clone())).clone() { + MatchPattern::LitPattern { ref value, .. } => { + let LiteralValue::LitStr { value: s, .. } = value.as_ref() + else { + unreachable!() + }; + v2_rt::concat( + v2_rt::concat( + emit_ident( + field_binding_name_at( + fb.clone(), + source_indices.clone(), + ), + RenderTarget::Rust, + ), + " == ".to_string(), + ), + emit_string_literal(s.clone(), "".to_string()), + ) + } + _ => "".to_string(), + }); + } + __result + }); + break guards.join(&" && ".to_string()); + } + } + _ => { + break "".to_string(); + } + } + } } pub fn all_arms_are_string_lit(arms: &Rc>>) -> bool { - ({ let mut __all = true; for arm in arms.clone().iter().cloned() { if !(match (*arm_pattern(arm.clone())).clone() { - MatchPattern::LitPattern { value: v, .. } => match (*v.clone()).clone() { - LiteralValue::LitStr { .. } => true, - _ => false, -}, - MatchPattern::Wildcard => true, - _ => false, -}) { __all = false; break; } } __all } && ((arms.clone().len() as i64) > 0)) + ({ + let mut __all = true; + for arm in arms.clone().iter().cloned() { + if !(match (*arm_pattern(arm.clone())).clone() { + MatchPattern::LitPattern { value: v, .. } => match (*v.clone()).clone() { + LiteralValue::LitStr { .. } => true, + _ => false, + }, + MatchPattern::Wildcard => true, + _ => false, + }) { + __all = false; + break; + } + } + __all + } && ((arms.clone().len() as i64) > 0)) } pub fn has_string_lit_with_bind(arms: &Rc>>) -> bool { { - let has_lit = { let mut __found = false; for arm in arms.clone().iter().cloned() { if match (*arm_pattern(arm.clone())).clone() { - MatchPattern::LitPattern { value: v, .. } => match (*v.clone()).clone() { - LiteralValue::LitStr { .. } => true, - _ => false, -}, - _ => false, -} { __found = true; break; } } __found }; -let has_bind = { let mut __found = false; for arm in arms.clone().iter().cloned() { if match (*arm_pattern(arm.clone())).clone() { - MatchPattern::Bind { .. } => true, - _ => false, -} { __found = true; break; } } __found }; -(has_lit && has_bind) -} + let has_lit = { + let mut __found = false; + for arm in arms.clone().iter().cloned() { + if match (*arm_pattern(arm.clone())).clone() { + MatchPattern::LitPattern { value: v, .. } => match (*v.clone()).clone() { + LiteralValue::LitStr { .. } => true, + _ => false, + }, + _ => false, + } { + __found = true; + break; + } + } + __found + }; + let has_bind = { + let mut __found = false; + for arm in arms.clone().iter().cloned() { + if match (*arm_pattern(arm.clone())).clone() { + MatchPattern::Bind { .. } => true, + _ => false, + } { + __found = true; + break; + } + } + __found + }; + (has_lit && has_bind) + } } -pub fn emit_pattern(pattern: Rc, shared_types: Rc>, scrut_type: String, source_indices: Rc>>, emit_info: Rc) -> String { +pub fn emit_pattern( + pattern: Rc, + shared_types: Rc>, + scrut_type: String, + source_indices: Rc>>, + emit_info: Rc, +) -> String { match (*pattern).clone() { - MatchPattern::Bind { name: n, .. } => emit_ident(n.clone(), RenderTarget::Rust), - MatchPattern::LitPattern { value: v, .. } => rust_literal_for_pattern(v.clone()), - MatchPattern::VariantPattern { name: n, parent_enum, field_bindings: fbs, .. } => emit_variant_pattern(&n, parent_enum.clone(), &fbs, shared_types, &scrut_type, source_indices, &emit_info), - MatchPattern::Wildcard => "_".to_string(), -} + MatchPattern::Bind { name: n, .. } => emit_ident(n.clone(), RenderTarget::Rust), + MatchPattern::LitPattern { value: v, .. } => rust_literal_for_pattern(v.clone()), + MatchPattern::VariantPattern { + name: n, + parent_enum, + field_bindings: fbs, + .. + } => emit_variant_pattern( + &n, + parent_enum.clone(), + &fbs, + shared_types, + &scrut_type, + source_indices, + &emit_info, + ), + MatchPattern::Wildcard => "_".to_string(), + } } -pub fn pattern_parent_enum(name: &String, parent_enum: Option, scrut_type: &String, type_summaries: Rc>>) -> Option { +pub fn pattern_parent_enum( + name: &String, + parent_enum: Option, + scrut_type: &String, + type_summaries: Rc>>, +) -> Option { { - let scrut_is_known_enum = ((scrut_type.clone().as_str() != "".to_string().as_str()) && is_enum_type_name(scrut_type.clone(), type_summaries)); -if ((name.clone().as_str() == "Some".to_string().as_str()) || (name.clone().as_str() == "None".to_string().as_str())) { + let scrut_is_known_enum = ((scrut_type.clone().as_str() != "".to_string().as_str()) + && is_enum_type_name(scrut_type.clone(), type_summaries)); + if ((name.clone().as_str() == "Some".to_string().as_str()) + || (name.clone().as_str() == "None".to_string().as_str())) + { None } else { if scrut_is_known_enum { @@ -1447,112 +3875,201 @@ if ((name.clone().as_str() == "Some".to_string().as_str()) || (name.clone().as_s parent_enum } } -} + } } -pub fn emit_variant_pattern(name: &String, parent_enum: Option, field_bindings: &Rc>>, shared_types: Rc>, scrut_type: &String, source_indices: Rc>>, emit_info: &Rc) -> String { +pub fn emit_variant_pattern( + name: &String, + parent_enum: Option, + field_bindings: &Rc>>, + shared_types: Rc>, + scrut_type: &String, + source_indices: Rc>>, + emit_info: &Rc, +) -> String { { - let resolved_parent = if ((name.clone().as_str() == "Some".to_string().as_str()) || (name.clone().as_str() == "None".to_string().as_str())) { + let resolved_parent = if ((name.clone().as_str() == "Some".to_string().as_str()) + || (name.clone().as_str() == "None".to_string().as_str())) + { None } else { - pattern_parent_enum(&name, parent_enum, &scrut_type, emit_info.type_summaries.clone()) + pattern_parent_enum( + &name, + parent_enum, + &scrut_type, + emit_info.type_summaries.clone(), + ) }; -let qualified = match resolved_parent.clone() { - Some(parent) => v2_rt::concat(v2_rt::concat(parent.clone(), "::".to_string()), name.clone()), - None => name.clone(), -}; -if ((name.clone().as_str() == "Some".to_string().as_str()) && ((field_bindings.clone().len() as i64) == 1)) { + let qualified = match resolved_parent.clone() { + Some(parent) => v2_rt::concat( + v2_rt::concat(parent.clone(), "::".to_string()), + name.clone(), + ), + None => name.clone(), + }; + if ((name.clone().as_str() == "Some".to_string().as_str()) + && ((field_bindings.clone().len() as i64) == 1)) + { match field_bindings.clone().first().cloned() { - Some(fb) => { - let fb_pat = field_binding_pattern(fb.clone()); -if is_string_lit_pattern(fb_pat.clone()) { - "Some(ref __some_val)".to_string() - } else { - { - let inner_pat = emit_pattern(fb_pat.clone(), shared_types.clone(), scrut_type.clone(), source_indices.clone(), emit_info.clone()); -v2_rt::concat(v2_rt::concat("Some(".to_string(), inner_pat), ")".to_string()) -} + Some(fb) => { + let fb_pat = field_binding_pattern(fb.clone()); + if is_string_lit_pattern(fb_pat.clone()) { + "Some(ref __some_val)".to_string() + } else { + { + let inner_pat = emit_pattern( + fb_pat.clone(), + shared_types.clone(), + scrut_type.clone(), + source_indices.clone(), + emit_info.clone(), + ); + v2_rt::concat( + v2_rt::concat("Some(".to_string(), inner_pat), + ")".to_string(), + ) + } + } } -}, - None => qualified.clone(), -} + None => qualified.clone(), + } } else { if ((field_bindings.clone().len() as i64) == 0) { { let fielded_key = match resolved_parent.clone() { - Some(parent) => v2_rt::concat(v2_rt::concat(parent.clone(), "::".to_string()), name.clone()), - None => name.clone(), -}; -let is_fielded = match v2_rt::map_get(&emit_info.fielded_variants.clone(), fielded_key) { - Some(true) => true, - _ => match v2_rt::map_get(&emit_info.fielded_variants.clone(), qualified.clone()) { - Some(true) => true, - _ => false, -}, -}; -if is_fielded { + Some(parent) => v2_rt::concat( + v2_rt::concat(parent.clone(), "::".to_string()), + name.clone(), + ), + None => name.clone(), + }; + let is_fielded = + match v2_rt::map_get(&emit_info.fielded_variants.clone(), fielded_key) { + Some(true) => true, + _ => match v2_rt::map_get( + &emit_info.fielded_variants.clone(), + qualified.clone(), + ) { + Some(true) => true, + _ => false, + }, + }; + if is_fielded { v2_rt::concat(qualified.clone(), " { .. }".to_string()) } else { qualified.clone() } -} + } } else { { - let effective_bindings = Rc::new({ let mut __result = Vec::new(); for fb in field_bindings.clone().iter().cloned() { if match (*field_binding_pattern(fb.clone())).clone() { - MatchPattern::Wildcard => false, - _ => true, -} { __result.push(fb); } } __result }); -if ((effective_bindings.clone().len() as i64) == 0) { + let effective_bindings = Rc::new({ + let mut __result = Vec::new(); + for fb in field_bindings.clone().iter().cloned() { + if match (*field_binding_pattern(fb.clone())).clone() { + MatchPattern::Wildcard => false, + _ => true, + } { + __result.push(fb); + } + } + __result + }); + if ((effective_bindings.clone().len() as i64) == 0) { { let fielded_key2 = match resolved_parent.clone() { - Some(parent) => v2_rt::concat(v2_rt::concat(parent.clone(), "::".to_string()), name.clone()), - None => name.clone(), -}; -let is_fielded2 = match v2_rt::map_get(&emit_info.fielded_variants.clone(), fielded_key2) { - Some(true) => true, - _ => match v2_rt::map_get(&emit_info.fielded_variants.clone(), qualified.clone()) { - Some(true) => true, - _ => false, -}, -}; -if is_fielded2 { + Some(parent) => v2_rt::concat( + v2_rt::concat(parent.clone(), "::".to_string()), + name.clone(), + ), + None => name.clone(), + }; + let is_fielded2 = match v2_rt::map_get( + &emit_info.fielded_variants.clone(), + fielded_key2, + ) { + Some(true) => true, + _ => match v2_rt::map_get( + &emit_info.fielded_variants.clone(), + qualified.clone(), + ) { + Some(true) => true, + _ => false, + }, + }; + if is_fielded2 { v2_rt::concat(qualified.clone(), " { .. }".to_string()) } else { qualified.clone() } -} + } } else { { - let binding_strs = Rc::new({ let mut __result = Vec::new(); for fb in effective_bindings.clone().iter().cloned() { __result.push({ - let fb_name = field_binding_name_at(fb.clone(), source_indices.clone()); -let fb_pat = field_binding_pattern(fb.clone()); -if is_string_lit_pattern(fb_pat.clone()) { - v2_rt::concat("ref ".to_string(), emit_ident(fb_name.clone(), RenderTarget::Rust)) - } else { - { - let is_shorthand = match (*fb_pat.clone()).clone() { - MatchPattern::Bind { name: n, .. } => (n.clone().as_str() == fb_name.clone().as_str()), - _ => false, -}; -if is_shorthand.clone() { - emit_ident(fb_name.clone(), RenderTarget::Rust) + let binding_strs = Rc::new({ + let mut __result = Vec::new(); + for fb in effective_bindings.clone().iter().cloned() { + __result.push({ + let fb_name = field_binding_name_at( + fb.clone(), + source_indices.clone(), + ); + let fb_pat = field_binding_pattern(fb.clone()); + if is_string_lit_pattern(fb_pat.clone()) { + v2_rt::concat( + "ref ".to_string(), + emit_ident(fb_name.clone(), RenderTarget::Rust), + ) } else { { - let pat_str = emit_pattern(fb_pat.clone(), shared_types.clone(), "".to_string(), source_indices.clone(), emit_info.clone()); -v2_rt::concat(v2_rt::concat(emit_ident(fb_name.clone(), RenderTarget::Rust), ": ".to_string()), pat_str.clone()) -} + let is_shorthand = match (*fb_pat.clone()).clone() { + MatchPattern::Bind { name: n, .. } => { + (n.clone().as_str() + == fb_name.clone().as_str()) + } + _ => false, + }; + if is_shorthand.clone() { + emit_ident(fb_name.clone(), RenderTarget::Rust) + } else { + { + let pat_str = emit_pattern( + fb_pat.clone(), + shared_types.clone(), + "".to_string(), + source_indices.clone(), + emit_info.clone(), + ); + v2_rt::concat( + v2_rt::concat( + emit_ident( + fb_name.clone(), + RenderTarget::Rust, + ), + ": ".to_string(), + ), + pat_str.clone(), + ) + } + } + } } -} + }); } -}); } __result }); -let bindings_str = binding_strs.join(&", ".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(qualified.clone(), " { ".to_string()), bindings_str), ", .. }".to_string()) -} + __result + }); + let bindings_str = binding_strs.join(&", ".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(qualified.clone(), " { ".to_string()), + bindings_str, + ), + ", .. }".to_string(), + ) + } } -} + } } } -} + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -1571,269 +4088,574 @@ pub struct RcMatchAnalysis { pub fn empty_rc_pattern_analysis() -> Rc { Rc::new(RcPatternAnalysis { - matches_rc_variant: false, - matches_option_rc_variant: false, - needs_rc_pattern: false, - ref_bound_fields: Rc::new(vec![]), -}) + matches_rc_variant: false, + matches_option_rc_variant: false, + needs_rc_pattern: false, + ref_bound_fields: Rc::new(vec![]), + }) } pub fn field_needs_rc_ref(field_name: String, rc_analysis: Rc) -> bool { - { let mut __found = false; for name in rc_analysis.ref_bound_fields.clone().iter().cloned() { if (name.clone().as_str() == field_name.clone().as_str()) { __found = true; break; } } __found } + { + let mut __found = false; + for name in rc_analysis.ref_bound_fields.clone().iter().cloned() { + if (name.clone().as_str() == field_name.clone().as_str()) { + __found = true; + break; + } + } + __found + } } -pub fn analyze_rc_pattern(pattern: Rc, scrut_type: String, shared_types: &Rc>, emit_info: &Rc, source_indices: Rc>>) -> Rc { - stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - match (*pattern).clone() { - MatchPattern::VariantPattern { name: n, parent_enum, field_bindings: fbs, .. } => if ((n.clone().as_str() == "Some".to_string().as_str()) || (n.clone().as_str() == "None".to_string().as_str())) { - if ((fbs.clone().len() as i64) == 1) { - match fbs.clone().first().cloned() { - Some(fb) => { - let inner = analyze_rc_pattern(field_binding_pattern(fb.clone()), "".to_string(), &shared_types, &emit_info, source_indices.clone()); -Rc::new(RcPatternAnalysis { - matches_rc_variant: false, - matches_option_rc_variant: ((n.clone().as_str() == "Some".to_string().as_str()) && inner.matches_rc_variant.clone()), - needs_rc_pattern: inner.needs_rc_pattern.clone(), - ref_bound_fields: Rc::new(vec![]), -}) -}, - None => empty_rc_pattern_analysis(), -} - } else { - empty_rc_pattern_analysis() - } - } else { +pub fn analyze_rc_pattern( + pattern: Rc, + scrut_type: String, + shared_types: &Rc>, + emit_info: &Rc, + source_indices: Rc>>, +) -> Rc { + stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || match (*pattern).clone() { + MatchPattern::VariantPattern { + name: n, + parent_enum, + field_bindings: fbs, + .. + } => { + if ((n.clone().as_str() == "Some".to_string().as_str()) + || (n.clone().as_str() == "None".to_string().as_str())) { - let matches_rc_variant = match pattern_parent_enum(&n, parent_enum.clone(), &scrut_type, emit_info.type_summaries.clone()) { - Some(enum_name) => emit_map_has(shared_types.clone(), enum_name.clone()), - None => false, -}; -let ref_bound_fields = Rc::new({ let mut __result = Vec::new(); for fb in fbs.clone().iter().cloned() { __result.extend((*if analyze_rc_pattern(field_binding_pattern(fb.clone()), "".to_string(), &shared_types, &emit_info, source_indices.clone()).matches_rc_variant.clone() { - Rc::new(vec![field_binding_name_at(fb.clone(), source_indices.clone())]) + if ((fbs.clone().len() as i64) == 1) { + match fbs.clone().first().cloned() { + Some(fb) => { + let inner = analyze_rc_pattern( + field_binding_pattern(fb.clone()), + "".to_string(), + &shared_types, + &emit_info, + source_indices.clone(), + ); + Rc::new(RcPatternAnalysis { + matches_rc_variant: false, + matches_option_rc_variant: ((n.clone().as_str() + == "Some".to_string().as_str()) + && inner.matches_rc_variant.clone()), + needs_rc_pattern: inner.needs_rc_pattern.clone(), + ref_bound_fields: Rc::new(vec![]), + }) + } + None => empty_rc_pattern_analysis(), + } } else { - Rc::new(vec![]) - }).iter().cloned()); } __result }); -Rc::new(RcPatternAnalysis { - matches_rc_variant: matches_rc_variant, - matches_option_rc_variant: false, - needs_rc_pattern: ((ref_bound_fields.clone().len() as i64) > 0), - ref_bound_fields: ref_bound_fields.clone(), -}) -} - }, - _ => empty_rc_pattern_analysis(), -} + empty_rc_pattern_analysis() + } + } else { + { + let matches_rc_variant = match pattern_parent_enum( + &n, + parent_enum.clone(), + &scrut_type, + emit_info.type_summaries.clone(), + ) { + Some(enum_name) => emit_map_has(shared_types.clone(), enum_name.clone()), + None => false, + }; + let ref_bound_fields = Rc::new({ + let mut __result = Vec::new(); + for fb in fbs.clone().iter().cloned() { + __result.extend( + (*if analyze_rc_pattern( + field_binding_pattern(fb.clone()), + "".to_string(), + &shared_types, + &emit_info, + source_indices.clone(), + ) + .matches_rc_variant + .clone() + { + Rc::new(vec![field_binding_name_at( + fb.clone(), + source_indices.clone(), + )]) + } else { + Rc::new(vec![]) + }) + .iter() + .cloned(), + ); + } + __result + }); + Rc::new(RcPatternAnalysis { + matches_rc_variant: matches_rc_variant, + matches_option_rc_variant: false, + needs_rc_pattern: ((ref_bound_fields.clone().len() as i64) > 0), + ref_bound_fields: ref_bound_fields.clone(), + }) + } + } + } + _ => empty_rc_pattern_analysis(), }) } -pub fn analyze_rc_match(scrutinee: &Rc, arms: Rc>>, scrut_type: String, shared_types: &Rc>, emit_info: Rc, source_indices: &Rc>>) -> RcMatchAnalysis { +pub fn analyze_rc_match( + scrutinee: &Rc, + arms: Rc>>, + scrut_type: String, + shared_types: &Rc>, + emit_info: Rc, + source_indices: &Rc>>, +) -> RcMatchAnalysis { { - let arm_analyses = Rc::new({ let mut __result = Vec::new(); for arm in arms.iter().cloned() { __result.push(analyze_rc_pattern(arm_pattern(arm.clone()), scrut_type.clone(), &shared_types, &emit_info, source_indices.clone())); } __result }); -let scrutinee_is_optional = match scrutinee.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => (rt.return_cardinality.clone() == Cardinality::CardOptional), - _ => false, -}; -let scrutinee_is_rc_wrapped = match scrutinee.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => if (((rt.children.clone().len() as i64) == 0) && (rt.ident_span.clone() != None)) { - emit_map_has(shared_types.clone(), authored_name_at(source_indices.clone(), &rt)) - } else { - false - }, - _ => false, -}; -let arms_want_option = { let mut __found = false; for a in arm_analyses.clone().iter().cloned() { if a.matches_option_rc_variant.clone() { __found = true; break; } } __found }; -let arms_want_deref = { let mut __found = false; for a in arm_analyses.clone().iter().cloned() { if a.matches_rc_variant.clone() { __found = true; break; } } __found }; -RcMatchAnalysis { - needs_option_deref: arms_want_option, - needs_deref: if scrutinee_is_optional { - false - } else { - (scrutinee_is_rc_wrapped || arms_want_deref) - }, -} -} + let arm_analyses = Rc::new({ + let mut __result = Vec::new(); + for arm in arms.iter().cloned() { + __result.push(analyze_rc_pattern( + arm_pattern(arm.clone()), + scrut_type.clone(), + &shared_types, + &emit_info, + source_indices.clone(), + )); + } + __result + }); + let scrutinee_is_optional = match scrutinee.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => { + (rt.return_cardinality.clone() == Cardinality::CardOptional) + } + _ => false, + }; + let scrutinee_is_rc_wrapped = match scrutinee.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => { + if (((rt.children.clone().len() as i64) == 0) && (rt.ident_span.clone() != None)) { + emit_map_has( + shared_types.clone(), + authored_name_at(source_indices.clone(), &rt), + ) + } else { + false + } + } + _ => false, + }; + let arms_want_option = { + let mut __found = false; + for a in arm_analyses.clone().iter().cloned() { + if a.matches_option_rc_variant.clone() { + __found = true; + break; + } + } + __found + }; + let arms_want_deref = { + let mut __found = false; + for a in arm_analyses.clone().iter().cloned() { + if a.matches_rc_variant.clone() { + __found = true; + break; + } + } + __found + }; + RcMatchAnalysis { + needs_option_deref: arms_want_option, + needs_deref: if scrutinee_is_optional { + false + } else { + (scrutinee_is_rc_wrapped || arms_want_deref) + }, + } + } } -pub fn emit_pattern_rc_aware(pattern: Rc, rc_analysis: Rc, shared_types: Rc>, scrut_type: String, source_indices: Rc>>, emit_info: Rc) -> String { +pub fn emit_pattern_rc_aware( + pattern: Rc, + rc_analysis: Rc, + shared_types: Rc>, + scrut_type: String, + source_indices: Rc>>, + emit_info: Rc, +) -> String { match (*pattern).clone() { - MatchPattern::Bind { name: n, .. } => emit_ident(n.clone(), RenderTarget::Rust), - MatchPattern::LitPattern { value: v, .. } => rust_literal_for_pattern(v.clone()), - MatchPattern::VariantPattern { name: n, parent_enum, field_bindings: fbs, .. } => emit_variant_pattern_rc_aware(&n, parent_enum.clone(), &fbs, rc_analysis, &shared_types, &scrut_type, &source_indices, &emit_info), - MatchPattern::Wildcard => "_".to_string(), -} + MatchPattern::Bind { name: n, .. } => emit_ident(n.clone(), RenderTarget::Rust), + MatchPattern::LitPattern { value: v, .. } => rust_literal_for_pattern(v.clone()), + MatchPattern::VariantPattern { + name: n, + parent_enum, + field_bindings: fbs, + .. + } => emit_variant_pattern_rc_aware( + &n, + parent_enum.clone(), + &fbs, + rc_analysis, + &shared_types, + &scrut_type, + &source_indices, + &emit_info, + ), + MatchPattern::Wildcard => "_".to_string(), + } } -pub fn emit_variant_pattern_rc_aware(name: &String, parent_enum: Option, field_bindings: &Rc>>, rc_analysis: Rc, shared_types: &Rc>, scrut_type: &String, source_indices: &Rc>>, emit_info: &Rc) -> String { +pub fn emit_variant_pattern_rc_aware( + name: &String, + parent_enum: Option, + field_bindings: &Rc>>, + rc_analysis: Rc, + shared_types: &Rc>, + scrut_type: &String, + source_indices: &Rc>>, + emit_info: &Rc, +) -> String { { - let resolved_parent = if ((name.clone().as_str() == "Some".to_string().as_str()) || (name.clone().as_str() == "None".to_string().as_str())) { + let resolved_parent = if ((name.clone().as_str() == "Some".to_string().as_str()) + || (name.clone().as_str() == "None".to_string().as_str())) + { None } else { - pattern_parent_enum(&name, parent_enum, &scrut_type, emit_info.type_summaries.clone()) + pattern_parent_enum( + &name, + parent_enum, + &scrut_type, + emit_info.type_summaries.clone(), + ) }; -let qualified = match resolved_parent.clone() { - Some(parent) => v2_rt::concat(v2_rt::concat(parent.clone(), "::".to_string()), name.clone()), - None => name.clone(), -}; -if ((name.clone().as_str() == "Some".to_string().as_str()) && ((field_bindings.clone().len() as i64) == 1)) { + let qualified = match resolved_parent.clone() { + Some(parent) => v2_rt::concat( + v2_rt::concat(parent.clone(), "::".to_string()), + name.clone(), + ), + None => name.clone(), + }; + if ((name.clone().as_str() == "Some".to_string().as_str()) + && ((field_bindings.clone().len() as i64) == 1)) + { match field_bindings.clone().first().cloned() { - Some(fb) => { - let fb_pat = field_binding_pattern(fb.clone()); -if is_string_lit_pattern(fb_pat.clone()) { - "Some(ref __some_val)".to_string() - } else { - { - let inner_analysis = analyze_rc_pattern(fb_pat.clone(), scrut_type.clone(), &shared_types, &emit_info, source_indices.clone()); -let inner_pat = emit_pattern_rc_aware(fb_pat.clone(), inner_analysis.clone(), shared_types.clone(), scrut_type.clone(), source_indices.clone(), emit_info.clone()); -v2_rt::concat(v2_rt::concat("Some(".to_string(), inner_pat), ")".to_string()) -} + Some(fb) => { + let fb_pat = field_binding_pattern(fb.clone()); + if is_string_lit_pattern(fb_pat.clone()) { + "Some(ref __some_val)".to_string() + } else { + { + let inner_analysis = analyze_rc_pattern( + fb_pat.clone(), + scrut_type.clone(), + &shared_types, + &emit_info, + source_indices.clone(), + ); + let inner_pat = emit_pattern_rc_aware( + fb_pat.clone(), + inner_analysis.clone(), + shared_types.clone(), + scrut_type.clone(), + source_indices.clone(), + emit_info.clone(), + ); + v2_rt::concat( + v2_rt::concat("Some(".to_string(), inner_pat), + ")".to_string(), + ) + } + } } -}, - None => qualified.clone(), -} + None => qualified.clone(), + } } else { if ((field_bindings.clone().len() as i64) == 0) { { let fielded_key = match resolved_parent.clone() { - Some(parent) => v2_rt::concat(v2_rt::concat(parent.clone(), "::".to_string()), name.clone()), - None => name.clone(), -}; -let is_fielded = match v2_rt::map_get(&emit_info.fielded_variants.clone(), fielded_key) { - Some(true) => true, - _ => match v2_rt::map_get(&emit_info.fielded_variants.clone(), qualified.clone()) { - Some(true) => true, - _ => false, -}, -}; -if is_fielded { + Some(parent) => v2_rt::concat( + v2_rt::concat(parent.clone(), "::".to_string()), + name.clone(), + ), + None => name.clone(), + }; + let is_fielded = + match v2_rt::map_get(&emit_info.fielded_variants.clone(), fielded_key) { + Some(true) => true, + _ => match v2_rt::map_get( + &emit_info.fielded_variants.clone(), + qualified.clone(), + ) { + Some(true) => true, + _ => false, + }, + }; + if is_fielded { v2_rt::concat(qualified.clone(), " { .. }".to_string()) } else { qualified.clone() } -} + } } else { { - let effective_bindings = Rc::new({ let mut __result = Vec::new(); for fb in field_bindings.clone().iter().cloned() { if match (*field_binding_pattern(fb.clone())).clone() { - MatchPattern::Wildcard => false, - _ => true, -} { __result.push(fb); } } __result }); -if ((effective_bindings.clone().len() as i64) == 0) { + let effective_bindings = Rc::new({ + let mut __result = Vec::new(); + for fb in field_bindings.clone().iter().cloned() { + if match (*field_binding_pattern(fb.clone())).clone() { + MatchPattern::Wildcard => false, + _ => true, + } { + __result.push(fb); + } + } + __result + }); + if ((effective_bindings.clone().len() as i64) == 0) { { let fielded_key2 = match resolved_parent.clone() { - Some(parent) => v2_rt::concat(v2_rt::concat(parent.clone(), "::".to_string()), name.clone()), - None => name.clone(), -}; -let is_fielded2 = match v2_rt::map_get(&emit_info.fielded_variants.clone(), fielded_key2) { - Some(true) => true, - _ => match v2_rt::map_get(&emit_info.fielded_variants.clone(), qualified.clone()) { - Some(true) => true, - _ => false, -}, -}; -if is_fielded2 { + Some(parent) => v2_rt::concat( + v2_rt::concat(parent.clone(), "::".to_string()), + name.clone(), + ), + None => name.clone(), + }; + let is_fielded2 = match v2_rt::map_get( + &emit_info.fielded_variants.clone(), + fielded_key2, + ) { + Some(true) => true, + _ => match v2_rt::map_get( + &emit_info.fielded_variants.clone(), + qualified.clone(), + ) { + Some(true) => true, + _ => false, + }, + }; + if is_fielded2 { v2_rt::concat(qualified.clone(), " { .. }".to_string()) } else { qualified.clone() } -} + } } else { { - let binding_strs = Rc::new({ let mut __result = Vec::new(); for fb in effective_bindings.clone().iter().cloned() { __result.push({ - let fb_name = field_binding_name_at(fb.clone(), source_indices.clone()); -let fb_pat = field_binding_pattern(fb.clone()); -if is_string_lit_pattern(fb_pat.clone()) { - v2_rt::concat("ref ".to_string(), emit_ident(fb_name.clone(), RenderTarget::Rust)) - } else { - if field_needs_rc_ref(fb_name.clone(), rc_analysis.clone()) { - v2_rt::concat("ref ".to_string(), emit_ident(fb_name.clone(), RenderTarget::Rust)) - } else { - { - let is_shorthand = match (*fb_pat.clone()).clone() { - MatchPattern::Bind { name: n, .. } => (n.clone().as_str() == fb_name.clone().as_str()), - _ => false, -}; -if is_shorthand.clone() { - emit_ident(fb_name.clone(), RenderTarget::Rust) + let binding_strs = Rc::new({ + let mut __result = Vec::new(); + for fb in effective_bindings.clone().iter().cloned() { + __result.push({ + let fb_name = field_binding_name_at( + fb.clone(), + source_indices.clone(), + ); + let fb_pat = field_binding_pattern(fb.clone()); + if is_string_lit_pattern(fb_pat.clone()) { + v2_rt::concat( + "ref ".to_string(), + emit_ident(fb_name.clone(), RenderTarget::Rust), + ) + } else { + if field_needs_rc_ref( + fb_name.clone(), + rc_analysis.clone(), + ) { + v2_rt::concat( + "ref ".to_string(), + emit_ident(fb_name.clone(), RenderTarget::Rust), + ) } else { { - let inner_analysis = analyze_rc_pattern(fb_pat.clone(), "".to_string(), &shared_types, &emit_info, source_indices.clone()); -let pat_str = emit_pattern_rc_aware(fb_pat.clone(), inner_analysis.clone(), shared_types.clone(), "".to_string(), source_indices.clone(), emit_info.clone()); -v2_rt::concat(v2_rt::concat(emit_ident(fb_name.clone(), RenderTarget::Rust), ": ".to_string()), pat_str.clone()) -} + let is_shorthand = match (*fb_pat.clone()) + .clone() + { + MatchPattern::Bind { name: n, .. } => { + (n.clone().as_str() + == fb_name.clone().as_str()) + } + _ => false, + }; + if is_shorthand.clone() { + emit_ident( + fb_name.clone(), + RenderTarget::Rust, + ) + } else { + { + let inner_analysis = analyze_rc_pattern( + fb_pat.clone(), + "".to_string(), + &shared_types, + &emit_info, + source_indices.clone(), + ); + let pat_str = emit_pattern_rc_aware( + fb_pat.clone(), + inner_analysis.clone(), + shared_types.clone(), + "".to_string(), + source_indices.clone(), + emit_info.clone(), + ); + v2_rt::concat( + v2_rt::concat( + emit_ident( + fb_name.clone(), + RenderTarget::Rust, + ), + ": ".to_string(), + ), + pat_str.clone(), + ) + } + } + } } -} - } + } + }); } -}); } __result }); -let bindings_str = binding_strs.join(&", ".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(qualified.clone(), " { ".to_string()), bindings_str), ", .. }".to_string()) -} + __result + }); + let bindings_str = binding_strs.join(&", ".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(qualified.clone(), " { ".to_string()), + bindings_str, + ), + ", .. }".to_string(), + ) + } } -} + } } } -} + } } -pub fn rc_pattern_preludes(mut pattern: Rc, mut rc_analysis: Rc, mut shared_types: Rc>, mut source_indices: Rc>>, mut emit_info: Rc) -> String { +pub fn rc_pattern_preludes( + mut pattern: Rc, + mut rc_analysis: Rc, + mut shared_types: Rc>, + mut source_indices: Rc>>, + mut emit_info: Rc, +) -> String { loop { match (*pattern).clone() { - MatchPattern::VariantPattern { name: n, field_bindings: fbs, .. } => { if ((n.clone().as_str() == "Some".to_string().as_str()) || (n.clone().as_str() == "None".to_string().as_str())) { - 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, &emit_info, source_indices.clone()); -{ - let __tco_0 = fb_pat.clone(); -let __tco_1 = inner_analysis; -pattern = __tco_0; -rc_analysis = __tco_1; -continue; -} }, - None => { break "".to_string(); }, -} -} else { - break "".to_string(); -} -} else { - let preludes = Rc::new({ let mut __result = Vec::new(); for fb in fbs.clone().iter().cloned() { __result.extend((*if field_needs_rc_ref(field_binding_name_at(fb.clone(), source_indices.clone()), rc_analysis.clone()) { - Rc::new(vec![v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("let ".to_string(), emit_pattern(field_binding_pattern(fb.clone()), shared_types.clone(), "".to_string(), source_indices.clone(), emit_info.clone())), " = ".to_string()), emit_ident(field_binding_name_at(fb.clone(), source_indices.clone()), RenderTarget::Rust)), ".as_ref() else { unreachable!() };".to_string())]) - } else { - Rc::new(vec![]) - }).iter().cloned()); } __result }); -break preludes.join(&" ".to_string()); -} }, - _ => { break "".to_string(); }, -} -} + MatchPattern::VariantPattern { + name: n, + field_bindings: fbs, + .. + } => { + if ((n.clone().as_str() == "Some".to_string().as_str()) + || (n.clone().as_str() == "None".to_string().as_str())) + { + 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, + &emit_info, + source_indices.clone(), + ); + { + let __tco_0 = fb_pat.clone(); + let __tco_1 = inner_analysis; + pattern = __tco_0; + rc_analysis = __tco_1; + continue; + } + } + None => { + break "".to_string(); + } + } + } else { + break "".to_string(); + } + } else { + let preludes = Rc::new({ + let mut __result = Vec::new(); + for fb in fbs.clone().iter().cloned() { + __result.extend( + (*if field_needs_rc_ref( + field_binding_name_at(fb.clone(), source_indices.clone()), + rc_analysis.clone(), + ) { + Rc::new(vec![v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "let ".to_string(), + emit_pattern( + field_binding_pattern(fb.clone()), + shared_types.clone(), + "".to_string(), + source_indices.clone(), + emit_info.clone(), + ), + ), + " = ".to_string(), + ), + emit_ident( + field_binding_name_at( + fb.clone(), + source_indices.clone(), + ), + RenderTarget::Rust, + ), + ), + ".as_ref() else { unreachable!() };".to_string(), + )]) + } else { + Rc::new(vec![]) + }) + .iter() + .cloned(), + ); + } + __result + }); + break preludes.join(&" ".to_string()); + } + } + _ => { + break "".to_string(); + } + } + } } -pub fn explicit_record_struct_name(type_name: Option, inferred_node: &Rc, shared_types: Rc>, source_indices: Rc>>) -> Option { +pub fn explicit_record_struct_name( + type_name: Option, + inferred_node: &Rc, + shared_types: Rc>, + source_indices: Rc>>, +) -> Option { { let is_optional = (inferred_node.return_cardinality.clone() == Cardinality::CardOptional); -if is_optional { + if is_optional { { let result = type_name.clone(); -return result -} + return result; + } } -let has_structure = (inferred_node.connective.clone() != Connective::NoConnective); -let n = if ((inferred_node.type_annotation.clone() != None) && has_structure) { + let has_structure = (inferred_node.connective.clone() != Connective::NoConnective); + let n = if ((inferred_node.type_annotation.clone() != None) && has_structure) { match inferred_node.children.clone().first().cloned() { - Some(base) => base.clone(), - None => inferred_node.clone(), -} + Some(base) => base.clone(), + None => inferred_node.clone(), + } } else { inferred_node.clone() }; -let is_product = is_product_type(n.clone()); -let is_coproduct = is_coproduct_type(n.clone()); -let n_is_error = if (n.inferred.clone() != None) { + let is_product = is_product_type(n.clone()); + let is_coproduct = is_coproduct_type(n.clone()); + let n_is_error = if (n.inferred.clone() != None) { is_compiler_error(n.inferred.clone().clone().unwrap()) } else { false }; -let nname = authored_name_at(source_indices, &n); -if (nname.clone().as_str() == "__EmitTypeCacheMiss".to_string().as_str()) { + let nname = authored_name_at(source_indices, &n); + if (nname.clone().as_str() == "__EmitTypeCacheMiss".to_string().as_str()) { type_name.clone() } else { if n_is_error { @@ -1849,7 +4671,9 @@ if (nname.clone().as_str() == "__EmitTypeCacheMiss".to_string().as_str()) { if is_coproduct { type_name.clone() } else { - if (((n.children.clone().len() as i64) == 0) && (n.ident_span.clone() != None)) { + if (((n.children.clone().len() as i64) == 0) + && (n.ident_span.clone() != None)) + { Some(nname.clone()) } else { type_name.clone() @@ -1858,293 +4682,502 @@ if (nname.clone().as_str() == "__EmitTypeCacheMiss".to_string().as_str()) { } } } -} + } } -pub fn is_simple_type_node(n: Rc, source_indices: Rc>>) -> bool { +pub fn is_simple_type_node( + n: Rc, + source_indices: Rc>>, +) -> bool { is_rust_value_type(n, source_indices) } -pub fn variant_parent_from_binding_kind(binding_kind: Option>) -> Option { +pub fn variant_parent_from_binding_kind( + binding_kind: Option>, +) -> Option { match binding_kind.as_deref().cloned() { - Some(VarBindingKind::VariantValueBinding { parent_enum, .. }) => Some(parent_enum.clone()), - _ => None, -} + Some(VarBindingKind::VariantValueBinding { parent_enum, .. }) => Some(parent_enum.clone()), + _ => None, + } } pub fn apply_clone(expr: String) -> String { - apply_type_template1(sharing_for_target(RenderTarget::Rust).clone_value.clone(), expr) + apply_type_template1( + sharing_for_target(RenderTarget::Rust).clone_value.clone(), + expr, + ) } pub fn apply_deref_clone(expr: String) -> String { - apply_type_template1(sharing_for_target(RenderTarget::Rust).deref_clone.clone(), expr) + apply_type_template1( + sharing_for_target(RenderTarget::Rust).deref_clone.clone(), + expr, + ) } pub fn apply_field_clone(expr: String, field: String) -> String { - apply_type_template2(sharing_for_target(RenderTarget::Rust).field_clone.clone(), expr, field) + apply_type_template2( + sharing_for_target(RenderTarget::Rust).field_clone.clone(), + expr, + field, + ) } pub fn clone_iterator_suffix() -> String { sharing_for_target(RenderTarget::Rust).clone_suffix.clone() } -pub fn effective_variant_parent(name: &String, binding_kind: Option>, resolved_type: Option>, emit_info: &Rc, source_indices: Rc>>) -> Option { +pub fn effective_variant_parent( + name: &String, + binding_kind: Option>, + resolved_type: Option>, + emit_info: &Rc, + source_indices: Rc>>, +) -> Option { { let cached = match v2_rt::map_get(&emit_info.variant_to_enum.clone(), name.clone()) { - Some(p) => if (p.clone().as_str() != "".to_string().as_str()) { - Some(p.clone()) - } else { - None - }, - None => None, -}; -match cached { - Some(parent) => Some(parent.clone()), - None => match resolved_type.as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - let rt_name = authored_name_at(source_indices, &rt); -if (((rt.ident_span.clone() != None) && (rt_name.clone().as_str() != name.clone().as_str())) && variant_belongs_to_enum(emit_info.type_summaries.clone(), name.clone(), rt_name.clone())) { - Some(rt_name.clone()) - } else { - variant_parent_from_binding_kind(binding_kind) + Some(p) => { + if (p.clone().as_str() != "".to_string().as_str()) { + Some(p.clone()) + } else { + None + } } -}, - _ => variant_parent_from_binding_kind(binding_kind), -}, -} -} + None => None, + }; + match cached { + Some(parent) => Some(parent.clone()), + None => match resolved_type.as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => { + let rt_name = authored_name_at(source_indices, &rt); + if (((rt.ident_span.clone() != None) + && (rt_name.clone().as_str() != name.clone().as_str())) + && variant_belongs_to_enum( + emit_info.type_summaries.clone(), + name.clone(), + rt_name.clone(), + )) + { + Some(rt_name.clone()) + } else { + variant_parent_from_binding_kind(binding_kind) + } + } + _ => variant_parent_from_binding_kind(binding_kind), + }, + } + } } -pub fn emit_var_ref(name: &String, binding_kind: &Option>, resolved_type: &Option>, shared_types: Rc>, registry: Rc>>, emit_info: &Rc, source_indices: Rc>>) -> String { - if ((name.clone().as_str() == "none".to_string().as_str()) || (name.clone().as_str() == "None".to_string().as_str())) { +pub fn emit_var_ref( + name: &String, + binding_kind: &Option>, + resolved_type: &Option>, + shared_types: Rc>, + registry: Rc>>, + emit_info: &Rc, + source_indices: Rc>>, +) -> String { + if ((name.clone().as_str() == "none".to_string().as_str()) + || (name.clone().as_str() == "None".to_string().as_str())) + { emit_keyword("null".to_string(), RenderTarget::Rust) } else { - if ((name.clone().as_str() == "true".to_string().as_str()) || (name.clone().as_str() == "false".to_string().as_str())) { + if ((name.clone().as_str() == "true".to_string().as_str()) + || (name.clone().as_str() == "false".to_string().as_str())) + { emit_keyword(name.clone(), RenderTarget::Rust) } else { { let moves_by_value = emit_map_has(emit_info.movable.clone(), name.clone()); -let sharing = language_spec(RenderTarget::Rust).sharing.clone(); -let variant_parent = effective_variant_parent(&name, binding_kind.clone(), resolved_type.clone(), &emit_info, source_indices); -let ref_str = match variant_parent { - Some(enum_name) => { - let qualified = v2_rt::concat(v2_rt::concat(enum_name.clone(), "::".to_string()), name.clone()); -if emit_map_has(shared_types, enum_name.clone()) { - v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), qualified), ")".to_string()) - } else { - qualified + let sharing = language_spec(RenderTarget::Rust).sharing.clone(); + let variant_parent = effective_variant_parent( + &name, + binding_kind.clone(), + resolved_type.clone(), + &emit_info, + source_indices, + ); + let ref_str = match variant_parent { + Some(enum_name) => { + let qualified = v2_rt::concat( + v2_rt::concat(enum_name.clone(), "::".to_string()), + name.clone(), + ); + if emit_map_has(shared_types, enum_name.clone()) { + v2_rt::concat( + v2_rt::concat("Rc::new(".to_string(), qualified), + ")".to_string(), + ) + } else { + qualified + } } -}, - None => match v2_rt::map_get(®istry, name.clone()) { - Some(info) => { - let is_data = (info.kind.clone() == ItemKind::DataItem); -if is_data { - v2_rt::concat(to_snake(name.clone()), "()".to_string()) - } else { - { - let is_function_value = match binding_kind.clone().as_deref().cloned() { - Some(VarBindingKind::FunctionValueBinding) => true, - _ => false, -}; -let ident = emit_ident(name.clone(), RenderTarget::Rust); -let ident_str = if is_function_value { + None => match v2_rt::map_get(®istry, name.clone()) { + Some(info) => { + let is_data = (info.kind.clone() == ItemKind::DataItem); + if is_data { + v2_rt::concat(to_snake(name.clone()), "()".to_string()) + } else { + { + let is_function_value = + match binding_kind.clone().as_deref().cloned() { + Some(VarBindingKind::FunctionValueBinding) => true, + _ => false, + }; + let ident = emit_ident(name.clone(), RenderTarget::Rust); + let ident_str = if is_function_value { + ident + } else { + if moves_by_value { + ident + } else { + match resolved_type.clone() { + Some(_) => apply_type_template1( + sharing.clone_value.clone(), + ident, + ), + _ => ident, + } + } + }; + ident_str + } + } + } + None => { + let ident = emit_ident(name.clone(), RenderTarget::Rust); + let ident_str = if moves_by_value { ident } else { - if moves_by_value { - ident - } else { - match resolved_type.clone() { - Some(_) => apply_type_template1(sharing.clone_value.clone(), ident), - _ => ident, -} + match resolved_type.clone() { + Some(_) => { + apply_type_template1(sharing.clone_value.clone(), ident) + } + _ => ident, } }; -ident_str -} - } -}, - None => { - let ident = emit_ident(name.clone(), RenderTarget::Rust); -let ident_str = if moves_by_value { - ident - } else { - match resolved_type.clone() { - Some(_) => apply_type_template1(sharing.clone_value.clone(), ident), - _ => ident, -} - }; -ident_str -}, -}, -}; -ref_str -} + ident_str + } + }, + }; + ref_str + } } } } -pub fn emit_typed_expr_base(texpr: &Rc, registry: Rc>>, scope: &Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { +pub fn emit_typed_expr_base( + texpr: &Rc, + registry: Rc>>, + scope: &Rc, + depth: i64, + shared_types: Rc>, + emit_info: Rc, +) -> String { { let si = scope.type_env.clone().source_indices.clone(); -match (*texpr.expr_data.clone()).clone() { - ExprData::ExprVar { binding_kind, .. } => { - let n = expr_var_name_at(texpr.clone(), si.clone()); -if ((n.clone().as_str() == "none".to_string().as_str()) || (n.clone().as_str() == "None".to_string().as_str())) { - emit_keyword("null".to_string(), RenderTarget::Rust) - } else { - if ((n.clone().as_str() == "true".to_string().as_str()) || (n.clone().as_str() == "false".to_string().as_str())) { - emit_keyword(n.clone(), RenderTarget::Rust) + match (*texpr.expr_data.clone()).clone() { + ExprData::ExprVar { binding_kind, .. } => { + let n = expr_var_name_at(texpr.clone(), si.clone()); + if ((n.clone().as_str() == "none".to_string().as_str()) + || (n.clone().as_str() == "None".to_string().as_str())) + { + emit_keyword("null".to_string(), RenderTarget::Rust) } else { + if ((n.clone().as_str() == "true".to_string().as_str()) + || (n.clone().as_str() == "false".to_string().as_str())) { - let variant_parent = effective_variant_parent(&n, binding_kind.clone(), texpr.inferred.clone(), &emit_info, si.clone()); -match variant_parent { - Some(enum_name) => { - let qualified = v2_rt::concat(v2_rt::concat(enum_name.clone(), "::".to_string()), n.clone()); -if emit_map_has(shared_types, enum_name.clone()) { - v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), qualified), ")".to_string()) - } else { - qualified - } -}, - None => match v2_rt::map_get(®istry, n.clone()) { - Some(info) => { - let is_data = (info.kind.clone() == ItemKind::DataItem); -if is_data { - v2_rt::concat(to_snake(n.clone()), "()".to_string()) - } else { - emit_ident(n.clone(), RenderTarget::Rust) + emit_keyword(n.clone(), RenderTarget::Rust) + } else { + { + let variant_parent = effective_variant_parent( + &n, + binding_kind.clone(), + texpr.inferred.clone(), + &emit_info, + si.clone(), + ); + match variant_parent { + Some(enum_name) => { + let qualified = v2_rt::concat( + v2_rt::concat(enum_name.clone(), "::".to_string()), + n.clone(), + ); + if emit_map_has(shared_types, enum_name.clone()) { + v2_rt::concat( + v2_rt::concat("Rc::new(".to_string(), qualified), + ")".to_string(), + ) + } else { + qualified + } + } + None => match v2_rt::map_get(®istry, n.clone()) { + Some(info) => { + let is_data = (info.kind.clone() == ItemKind::DataItem); + if is_data { + v2_rt::concat(to_snake(n.clone()), "()".to_string()) + } else { + emit_ident(n.clone(), RenderTarget::Rust) + } + } + None => emit_ident(n.clone(), RenderTarget::Rust), + }, } -}, - None => emit_ident(n.clone(), RenderTarget::Rust), -}, -} -} + } + } } } -}, - _ => emit_typed_expr(texpr.clone(), registry, &scope, depth, shared_types, emit_info, 1024), -} -} + _ => emit_typed_expr( + texpr.clone(), + registry, + &scope, + depth, + shared_types, + emit_info, + 1024, + ), + } + } } -pub fn emit_typed_field_access(base: &Rc, field: &String, summary: Option>, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { +pub fn emit_typed_field_access( + base: &Rc, + field: &String, + summary: Option>, + registry: &Rc>>, + scope: &Rc, + depth: i64, + shared_types: &Rc>, + emit_info: &Rc, +) -> String { { - let base_str = emit_typed_expr_base(&base, registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone()); -let base_is_anon_record = match base.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: bt, .. }) => { - let is_product = is_product_type(bt.clone()); -if (is_product && (bt.ident_span.clone() == None)) { - true - } else { - false + let base_str = emit_typed_expr_base( + &base, + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + ); + let base_is_anon_record = match base.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: bt, .. }) => { + let is_product = is_product_type(bt.clone()); + if (is_product && (bt.ident_span.clone() == None)) { + true + } else { + false + } } -}, - _ => false, -}; -if base_is_anon_record { + _ => false, + }; + if base_is_anon_record { { let bt = resolved_type(base.clone()); -if ((bt.children.clone().len() as i64) == 1) { - emit_typed_expr(base.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024) + if ((bt.children.clone().len() as i64) == 1) { + emit_typed_expr( + base.clone(), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ) } else { { - let matches = Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(bt.children.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { if (authored_name_at(scope.type_env.clone().source_indices.clone(), &pair.1.clone()).as_str() == field.clone().as_str()) { __result.push(pair); } } __result }); -match matches.first().cloned() { - Some(m) => { - let sharing = language_spec(RenderTarget::Rust).sharing.clone(); -apply_type_template1(sharing.clone_value.clone(), v2_rt::concat(v2_rt::concat(base_str, ".".to_string()), (m.0.clone()).to_string())) -}, - None => v2_rt::concat(v2_rt::concat("compile_error!(\"anonymous record field not found: ".to_string(), field.clone()), "\")".to_string()), -} -} + let matches = Rc::new({ + let mut __result = Vec::new(); + for pair in Rc::new( + bt.children + .clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + { + if (authored_name_at( + scope.type_env.clone().source_indices.clone(), + &pair.1.clone(), + ) + .as_str() + == field.clone().as_str()) + { + __result.push(pair); + } + } + __result + }); + match matches.first().cloned() { + Some(m) => { + let sharing = language_spec(RenderTarget::Rust).sharing.clone(); + apply_type_template1( + sharing.clone_value.clone(), + v2_rt::concat( + v2_rt::concat(base_str, ".".to_string()), + (m.0.clone()).to_string(), + ), + ) + } + None => v2_rt::concat( + v2_rt::concat( + "compile_error!(\"anonymous record field not found: " + .to_string(), + field.clone(), + ), + "\")".to_string(), + ), + } + } } -} + } } else { { let sharing = language_spec(RenderTarget::Rust).sharing.clone(); -match summary { - Some(field_summary) => match field_summary.access_style.clone() { - FieldAccessStyle::TupleFirst => apply_type_template1(sharing.clone_value.clone(), v2_rt::concat(base_str, ".0".to_string())), - FieldAccessStyle::TupleSecond => apply_type_template1(sharing.clone_value.clone(), v2_rt::concat(base_str, ".1".to_string())), - FieldAccessStyle::OptionalUnwrap => v2_rt::concat(apply_type_template1(sharing.clone_value.clone(), base_str), ".unwrap()".to_string()), - FieldAccessStyle::EnumAccessor => v2_rt::concat(v2_rt::concat(v2_rt::concat(base_str, ".".to_string()), emit_ident(field.clone(), RenderTarget::Rust)), "()".to_string()), - FieldAccessStyle::StoredField => { - let base_is_owned = match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let base_name = expr_var_name_at(base.clone(), scope.type_env.clone().source_indices.clone()); -emit_map_has(emit_info.owned_bindings.clone(), base_name) -}, - _ => false, -}; -if base_is_owned { - v2_rt::concat(v2_rt::concat(base_str, ".".to_string()), emit_ident(field.clone(), RenderTarget::Rust)) - } else { - apply_type_template1(sharing.clone_value.clone(), v2_rt::concat(v2_rt::concat(base_str, ".".to_string()), emit_ident(field.clone(), RenderTarget::Rust))) - } -}, -}, - None => v2_rt::concat(v2_rt::concat("compile_error!(\"field access missing reconcile summary for '".to_string(), field.clone()), "'\")".to_string()), -} -} + match summary { + Some(field_summary) => match field_summary.access_style.clone() { + FieldAccessStyle::TupleFirst => apply_type_template1( + sharing.clone_value.clone(), + v2_rt::concat(base_str, ".0".to_string()), + ), + FieldAccessStyle::TupleSecond => apply_type_template1( + sharing.clone_value.clone(), + v2_rt::concat(base_str, ".1".to_string()), + ), + FieldAccessStyle::OptionalUnwrap => v2_rt::concat( + apply_type_template1(sharing.clone_value.clone(), base_str), + ".unwrap()".to_string(), + ), + FieldAccessStyle::EnumAccessor => v2_rt::concat( + v2_rt::concat( + v2_rt::concat(base_str, ".".to_string()), + emit_ident(field.clone(), RenderTarget::Rust), + ), + "()".to_string(), + ), + FieldAccessStyle::StoredField => { + let base_is_owned = match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let base_name = expr_var_name_at( + base.clone(), + scope.type_env.clone().source_indices.clone(), + ); + emit_map_has(emit_info.owned_bindings.clone(), base_name) + } + _ => false, + }; + if base_is_owned { + v2_rt::concat( + v2_rt::concat(base_str, ".".to_string()), + emit_ident(field.clone(), RenderTarget::Rust), + ) + } else { + apply_type_template1( + sharing.clone_value.clone(), + v2_rt::concat( + v2_rt::concat(base_str, ".".to_string()), + emit_ident(field.clone(), RenderTarget::Rust), + ), + ) + } + } + }, + None => v2_rt::concat( + v2_rt::concat( + "compile_error!(\"field access missing reconcile summary for '" + .to_string(), + field.clone(), + ), + "'\")".to_string(), + ), + } + } } -} + } } -pub fn type_needs_rc(type_node: Rc, source_indices: Rc>>) -> bool { - type_needs_rc_seen(type_node, v2_rt::rc_empty_map::(), source_indices) +pub fn type_needs_rc( + type_node: Rc, + source_indices: Rc>>, +) -> bool { + type_needs_rc_seen( + type_node, + v2_rt::rc_empty_map::(), + source_indices, + ) } -pub fn type_needs_rc_seen(mut type_node: Rc, mut seen: Rc>, mut source_indices: Rc>>) -> bool { +pub fn type_needs_rc_seen( + mut type_node: Rc, + mut seen: Rc>, + mut source_indices: Rc>>, +) -> bool { loop { let normed = normalize_access_type_node(type_node); -let is_product = is_product_type(normed.clone()); -let is_coproduct = is_coproduct_type(normed.clone()); -if is_product { + let is_product = is_product_type(normed.clone()); + let is_coproduct = is_coproduct_type(normed.clone()); + if is_product { break true; -} else { + } else { if is_coproduct { - break { let mut __found = false; for child in normed.children.clone().iter().cloned() { if ((child.children.clone().len() as i64) > 0) { __found = true; break; } } __found }; -} else { + break { + let mut __found = false; + for child in normed.children.clone().iter().cloned() { + if ((child.children.clone().len() as i64) > 0) { + __found = true; + break; + } + } + __found + }; + } else { let canonical = authored_name_at(source_indices.clone(), &normed); -if (normed.inferred.clone() != None) { + if (normed.inferred.clone() != None) { let next_seen = if (canonical.clone().as_str() == "".to_string().as_str()) { seen.clone() } else { v2_rt::rc_map_insert(seen.clone(), canonical.clone(), true) }; -{ + { let __tco_0 = resolved_type(normed.clone()); -let __tco_1 = next_seen; -type_node = __tco_0; -seen = __tco_1; -continue; -} -} else { - if ((canonical.clone().as_str() != "".to_string().as_str()) && emit_map_has(seen.clone(), canonical.clone())) { + let __tco_1 = next_seen; + type_node = __tco_0; + seen = __tco_1; + continue; + } + } else { + if ((canonical.clone().as_str() != "".to_string().as_str()) + && emit_map_has(seen.clone(), canonical.clone())) + { break false; -} else { + } else { let next_seen = if (canonical.clone().as_str() == "".to_string().as_str()) { seen.clone() } else { v2_rt::rc_map_insert(seen.clone(), canonical.clone(), true) }; -let has_structure = (normed.connective.clone() != Connective::NoConnective); -if (!has_structure && ((normed.children.clone().len() as i64) == 0)) { + let has_structure = (normed.connective.clone() != Connective::NoConnective); + if (!has_structure && ((normed.children.clone().len() as i64) == 0)) { break false; -} else { + } else { { let __tco_0 = normed.clone(); -let __tco_1 = next_seen; -type_node = __tco_0; -seen = __tco_1; -continue; -} -} -} -} -} -} -} + let __tco_1 = next_seen; + type_node = __tco_0; + seen = __tco_1; + continue; + } + } + } + } + } + } + } } pub fn rust_runtime_bridge_passes_receiver_by_ref(function_name: String) -> bool { @@ -2153,1228 +5186,3338 @@ pub fn rust_runtime_bridge_passes_receiver_by_ref(function_name: String) -> bool pub fn rust_runtime_bridge_name(function_name: String) -> String { match v2_rt::map_get(&rt_bridge_function_names(), function_name.clone()) { - Some(runtime_name) => runtime_name.clone(), - None => function_name.clone(), -} + Some(runtime_name) => runtime_name.clone(), + None => function_name.clone(), + } } -pub fn rust_empty_map_value_type_str(map_type: Rc, shared_types: Rc>, source_indices: Rc>>) -> String { +pub fn rust_empty_map_value_type_str( + map_type: Rc, + shared_types: Rc>, + source_indices: Rc>>, +) -> String { match map_type.children.clone().get(1 as usize).cloned() { - Some(value_child) => { - let rendered = render_rust_type(child_type_node(&value_child), shared_types, source_indices); -if (rendered.clone().as_str() == "".to_string().as_str()) { - "".to_string() - } else { - rendered.clone() + Some(value_child) => { + let rendered = + render_rust_type(child_type_node(&value_child), shared_types, source_indices); + if (rendered.clone().as_str() == "".to_string().as_str()) { + "".to_string() + } else { + rendered.clone() + } } -}, - None => "".to_string(), -} + None => "".to_string(), + } } -pub fn rust_empty_map_kv_type_str(map_type: &Rc, shared_types: &Rc>, source_indices: &Rc>>) -> String { +pub fn rust_empty_map_kv_type_str( + map_type: &Rc, + shared_types: &Rc>, + source_indices: &Rc>>, +) -> String { { let key_str = match map_type.children.clone().first().cloned() { - Some(key_child) => render_rust_type(child_type_node(&key_child), shared_types.clone(), source_indices.clone()), - None => "".to_string(), -}; -let val_str = rust_empty_map_value_type_str(map_type.clone(), shared_types.clone(), source_indices.clone()); -if ((key_str.clone().as_str() != "".to_string().as_str()) && (val_str.clone().as_str() != "".to_string().as_str())) { - v2_rt::concat(v2_rt::concat(key_str.clone(), ", ".to_string()), val_str.clone()) + Some(key_child) => render_rust_type( + child_type_node(&key_child), + shared_types.clone(), + source_indices.clone(), + ), + None => "".to_string(), + }; + let val_str = rust_empty_map_value_type_str( + map_type.clone(), + shared_types.clone(), + source_indices.clone(), + ); + if ((key_str.clone().as_str() != "".to_string().as_str()) + && (val_str.clone().as_str() != "".to_string().as_str())) + { + v2_rt::concat( + v2_rt::concat(key_str.clone(), ", ".to_string()), + val_str.clone(), + ) } else { "".to_string() } -} + } } pub fn rust_runtime_bridge_wraps_collection_result_in_rc(function_name: &String) -> bool { - (v2_rt::map_contains_key(&rt_wraps_result(), function_name.clone()) || v2_rt::map_contains_key(&rust_method_wraps_result(), function_name.clone())) + (v2_rt::map_contains_key(&rt_wraps_result(), function_name.clone()) + || v2_rt::map_contains_key(&rust_method_wraps_result(), function_name.clone())) } -pub fn rust_runtime_bridge_collection_result_needs_rc_elements(function_name: String, result_type: Option>) -> bool { +pub fn rust_runtime_bridge_collection_result_needs_rc_elements( + function_name: String, + result_type: Option>, +) -> bool { false } -pub fn rust_wrap_runtime_collection_result(call_str: String, function_name: &String, result_type: Option>) -> String { +pub fn rust_wrap_runtime_collection_result( + call_str: String, + function_name: &String, + result_type: Option>, +) -> String { if rust_runtime_bridge_wraps_collection_result_in_rc(&function_name) { - if rust_runtime_bridge_collection_result_needs_rc_elements(function_name.clone(), result_type) { - v2_rt::concat(v2_rt::concat("Rc::new((".to_string(), call_str), ").into_iter().map(Rc::new).collect::>())".to_string()) - } else { - v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), call_str), ")".to_string()) + if rust_runtime_bridge_collection_result_needs_rc_elements( + function_name.clone(), + result_type, + ) { + v2_rt::concat( + v2_rt::concat("Rc::new((".to_string(), call_str), + ").into_iter().map(Rc::new).collect::>())".to_string(), + ) + } else { + v2_rt::concat( + v2_rt::concat("Rc::new(".to_string(), call_str), + ")".to_string(), + ) } } else { call_str } } -pub fn emit_rust_expr_var(expr: &Rc, registry: Rc>>, shared_types: Rc>, emit_info: Rc, source_indices: &Rc>>) -> String { +pub fn emit_rust_expr_var( + expr: &Rc, + registry: Rc>>, + shared_types: Rc>, + emit_info: Rc, + source_indices: &Rc>>, +) -> String { match (*expr.expr_data.clone()).clone() { - ExprData::ExprVar { binding_kind, .. } => { - let n = expr_var_name_at(expr.clone(), source_indices.clone()); -emit_var_ref(&n, &binding_kind, &expr.inferred.clone(), shared_types, registry, &emit_info, source_indices.clone()) -}, - _ => emit_error_expr("emit_rust_expr_var expected ExprVar".to_string(), RenderTarget::Rust), -} + ExprData::ExprVar { binding_kind, .. } => { + let n = expr_var_name_at(expr.clone(), source_indices.clone()); + emit_var_ref( + &n, + &binding_kind, + &expr.inferred.clone(), + shared_types, + registry, + &emit_info, + source_indices.clone(), + ) + } + _ => emit_error_expr( + "emit_rust_expr_var expected ExprVar".to_string(), + RenderTarget::Rust, + ), + } } -pub fn emit_rust_expr_field_access(expr: &Rc, registry: Rc>>, scope: &Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { +pub fn emit_rust_expr_field_access( + expr: &Rc, + registry: Rc>>, + scope: &Rc, + depth: i64, + shared_types: Rc>, + emit_info: Rc, +) -> String { { let si = scope.type_env.clone().source_indices.clone(); -match (*expr.expr_data.clone()).clone() { - ExprData::ExprFieldAccess { summary, .. } => { - let f = field_access_field_at(expr.clone(), si); -let b = field_access_base(expr.clone()); -if is_typed_service_call_receiver(&expr, scope.type_env.clone().source_indices.clone()) { - match extract_typed_service_name(&expr, &scope.type_env.clone().source_indices.clone()) { - Some(svc_name) => service_var_name(svc_name.clone()), - None => emit_typed_field_access(&b, &f, summary.clone(), ®istry, &scope, depth, &shared_types, &emit_info), -} - } else { - emit_typed_field_access(&b, &f, summary.clone(), ®istry, &scope, depth, &shared_types, &emit_info) + match (*expr.expr_data.clone()).clone() { + ExprData::ExprFieldAccess { summary, .. } => { + let f = field_access_field_at(expr.clone(), si); + let b = field_access_base(expr.clone()); + if is_typed_service_call_receiver( + &expr, + scope.type_env.clone().source_indices.clone(), + ) { + match extract_typed_service_name( + &expr, + &scope.type_env.clone().source_indices.clone(), + ) { + Some(svc_name) => service_var_name(svc_name.clone()), + None => emit_typed_field_access( + &b, + &f, + summary.clone(), + ®istry, + &scope, + depth, + &shared_types, + &emit_info, + ), + } + } else { + emit_typed_field_access( + &b, + &f, + summary.clone(), + ®istry, + &scope, + depth, + &shared_types, + &emit_info, + ) + } } -}, - _ => emit_error_expr("emit_rust_expr_field_access expected ExprFieldAccess".to_string(), RenderTarget::Rust), -} -} + _ => emit_error_expr( + "emit_rust_expr_field_access expected ExprFieldAccess".to_string(), + RenderTarget::Rust, + ), + } + } } -pub fn emit_rust_expr_call(expr: &Rc, registry: Rc>>, scope: &Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { +pub fn emit_rust_expr_call( + expr: &Rc, + registry: Rc>>, + scope: &Rc, + depth: i64, + shared_types: Rc>, + emit_info: Rc, +) -> String { match (*expr.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { - let f = expr_call_func_at(expr.clone(), scope.type_env.clone().source_indices.clone()); -emit_typed_call_expr(&f, expr.children.clone(), expr.inferred.clone(), registry, scope.clone(), depth, shared_types, emit_info) -}, - _ => emit_error_expr("emit_rust_expr_call expected ExprCall".to_string(), RenderTarget::Rust), -} + ExprData::ExprCall { .. } => { + let f = expr_call_func_at(expr.clone(), scope.type_env.clone().source_indices.clone()); + emit_typed_call_expr( + &f, + expr.children.clone(), + expr.inferred.clone(), + registry, + scope.clone(), + depth, + shared_types, + emit_info, + ) + } + _ => emit_error_expr( + "emit_rust_expr_call expected ExprCall".to_string(), + RenderTarget::Rust, + ), + } } -pub fn emit_rust_expr_method_call(expr: &Rc, registry: Rc>>, scope: &Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { +pub fn emit_rust_expr_method_call( + expr: &Rc, + registry: Rc>>, + scope: &Rc, + depth: i64, + shared_types: Rc>, + emit_info: Rc, +) -> String { match (*expr.expr_data.clone()).clone() { - ExprData::ExprMethodCall { method_semantics, .. } => { - let r = method_receiver(expr.clone()); -let a = method_arg_nodes(expr.clone()); -let m = expr_method_name_at(expr.clone(), scope.type_env.clone().source_indices.clone()); -emit_typed_method_call(expr.clone(), &r, m, &a, expr.inferred.clone(), &method_semantics, ®istry, &scope, depth, &shared_types, &emit_info) -}, - _ => emit_error_expr("emit_rust_expr_method_call expected ExprMethodCall".to_string(), RenderTarget::Rust), -} + ExprData::ExprMethodCall { + method_semantics, .. + } => { + let r = method_receiver(expr.clone()); + let a = method_arg_nodes(expr.clone()); + let m = + expr_method_name_at(expr.clone(), scope.type_env.clone().source_indices.clone()); + emit_typed_method_call( + expr.clone(), + &r, + m, + &a, + expr.inferred.clone(), + &method_semantics, + ®istry, + &scope, + depth, + &shared_types, + &emit_info, + ) + } + _ => emit_error_expr( + "emit_rust_expr_method_call expected ExprMethodCall".to_string(), + RenderTarget::Rust, + ), + } } -pub fn emit_rust_expr_match(expr: &Rc, registry: Rc>>, scope: Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { +pub fn emit_rust_expr_match( + expr: &Rc, + registry: Rc>>, + scope: Rc, + depth: i64, + shared_types: Rc>, + emit_info: Rc, +) -> String { match (*expr.expr_data.clone()).clone() { - ExprData::ExprMatch => { - let s = match_scrutinee(expr.clone()); -let arm_list = match_arm_nodes(expr.clone()); -emit_typed_match(&s, &arm_list, ®istry, &scope, depth, &shared_types, &emit_info) -}, - _ => emit_error_expr("emit_rust_expr_match expected ExprMatch".to_string(), RenderTarget::Rust), -} + ExprData::ExprMatch => { + let s = match_scrutinee(expr.clone()); + let arm_list = match_arm_nodes(expr.clone()); + emit_typed_match( + &s, + &arm_list, + ®istry, + &scope, + depth, + &shared_types, + &emit_info, + ) + } + _ => emit_error_expr( + "emit_rust_expr_match expected ExprMatch".to_string(), + RenderTarget::Rust, + ), + } } -pub fn emit_rust_expr_if(expr: &Rc, registry: Rc>>, scope: Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { +pub fn emit_rust_expr_if( + expr: &Rc, + registry: Rc>>, + scope: Rc, + depth: i64, + shared_types: Rc>, + emit_info: Rc, +) -> String { match (*expr.expr_data.clone()).clone() { - ExprData::ExprIf => { - let c = if_condition(expr.clone()); -let t = if_then_branch(expr.clone()); -let e = if_else_branch(expr.clone()); -emit_typed_if(c, t, e, ®istry, &scope, depth, &shared_types, &emit_info) -}, - _ => emit_error_expr("emit_rust_expr_if expected ExprIf".to_string(), RenderTarget::Rust), -} + ExprData::ExprIf => { + let c = if_condition(expr.clone()); + let t = if_then_branch(expr.clone()); + let e = if_else_branch(expr.clone()); + emit_typed_if(c, t, e, ®istry, &scope, depth, &shared_types, &emit_info) + } + _ => emit_error_expr( + "emit_rust_expr_if expected ExprIf".to_string(), + RenderTarget::Rust, + ), + } } -pub fn emit_rust_expr_let(expr: &Rc, registry: Rc>>, scope: &Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { +pub fn emit_rust_expr_let( + expr: &Rc, + registry: Rc>>, + scope: &Rc, + depth: i64, + shared_types: Rc>, + emit_info: Rc, +) -> String { match (*expr.expr_data.clone()).clone() { - ExprData::ExprLet => { - let n = let_binding_name_at(expr.clone(), scope.type_env.clone().source_indices.clone()); -let v = let_value(expr.clone()); -let bd = let_body(expr.clone()); -emit_typed_let(n, &v, bd, ®istry, &scope, depth, &shared_types, &emit_info) -}, - _ => emit_error_expr("emit_rust_expr_let expected ExprLet".to_string(), RenderTarget::Rust), -} + ExprData::ExprLet => { + let n = + let_binding_name_at(expr.clone(), scope.type_env.clone().source_indices.clone()); + let v = let_value(expr.clone()); + let bd = let_body(expr.clone()); + emit_typed_let( + n, + &v, + bd, + ®istry, + &scope, + depth, + &shared_types, + &emit_info, + ) + } + _ => emit_error_expr( + "emit_rust_expr_let expected ExprLet".to_string(), + RenderTarget::Rust, + ), + } } -pub fn emit_rust_expr_record_lit(expr: &Rc, registry: Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: Rc) -> String { +pub fn emit_rust_expr_record_lit( + expr: &Rc, + registry: Rc>>, + scope: &Rc, + depth: i64, + shared_types: &Rc>, + emit_info: Rc, +) -> String { match (*expr.expr_data.clone()).clone() { - ExprData::ExprRecordLit { parent_enum, .. } => { - let tn = record_lit_type_name_at(expr.clone(), scope.type_env.clone().source_indices.clone()); -let fs = expr.children.clone(); -let raw = emit_typed_record_lit(&tn, &fs, &parent_enum, &resolved_type(expr.clone()), registry, &scope, depth, &shared_types, &emit_info); -let rc_name = match parent_enum.clone() { - Some(en) => en.clone(), - None => match tn.clone() { - Some(n) => n.clone(), - None => "".to_string(), -}, -}; -if ((rc_name.clone().as_str() != "".to_string().as_str()) && emit_map_has(shared_types.clone(), rc_name.clone())) { - v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), raw), ")".to_string()) - } else { - raw + ExprData::ExprRecordLit { parent_enum, .. } => { + let tn = record_lit_type_name_at( + expr.clone(), + scope.type_env.clone().source_indices.clone(), + ); + let fs = expr.children.clone(); + let raw = emit_typed_record_lit( + &tn, + &fs, + &parent_enum, + &resolved_type(expr.clone()), + registry, + &scope, + depth, + &shared_types, + &emit_info, + ); + let rc_name = match parent_enum.clone() { + Some(en) => en.clone(), + None => match tn.clone() { + Some(n) => n.clone(), + None => "".to_string(), + }, + }; + if ((rc_name.clone().as_str() != "".to_string().as_str()) + && emit_map_has(shared_types.clone(), rc_name.clone())) + { + v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), raw), ")".to_string()) + } else { + raw + } } -}, - _ => emit_error_expr("emit_rust_expr_record_lit expected ExprRecordLit".to_string(), RenderTarget::Rust), -} + _ => emit_error_expr( + "emit_rust_expr_record_lit expected ExprRecordLit".to_string(), + RenderTarget::Rust, + ), + } } -pub fn emit_rust_expr_string_interp(expr: &Rc, registry: Rc>>, scope: Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { +pub fn emit_rust_expr_string_interp( + expr: &Rc, + registry: Rc>>, + scope: Rc, + depth: i64, + shared_types: Rc>, + emit_info: Rc, +) -> String { match (*expr.expr_data.clone()).clone() { - ExprData::ExprStringInterp => { - let ps = Rc::new({ let mut __result = Vec::new(); for child in expr.children.clone().iter().cloned() { __result.push(match (*child.expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitStr { value: text, .. } = value.as_ref() else { unreachable!() }; Rc::new(StringPart::Text { - value: text.clone(), -}) }, - _ => Rc::new(StringPart::Interpolation { - expr: arg_value(&child), -}), -}); } __result }); -emit_typed_string_interp(&ps, registry, scope, depth, shared_types, emit_info) -}, - _ => emit_error_expr("emit_rust_expr_string_interp expected ExprStringInterp".to_string(), RenderTarget::Rust), -} + ExprData::ExprStringInterp => { + let ps = Rc::new({ + let mut __result = Vec::new(); + for child in expr.children.clone().iter().cloned() { + __result.push(match (*child.expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { + let LiteralValue::LitStr { value: text, .. } = value.as_ref() else { + unreachable!() + }; + Rc::new(StringPart::Text { + value: text.clone(), + }) + } + _ => Rc::new(StringPart::Interpolation { + expr: arg_value(&child), + }), + }); + } + __result + }); + emit_typed_string_interp(&ps, registry, scope, depth, shared_types, emit_info) + } + _ => emit_error_expr( + "emit_rust_expr_string_interp expected ExprStringInterp".to_string(), + RenderTarget::Rust, + ), + } } -pub fn emit_rust_expr_block(expr: &Rc, registry: Rc>>, scope: Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { +pub fn emit_rust_expr_block( + expr: &Rc, + registry: Rc>>, + scope: Rc, + depth: i64, + shared_types: Rc>, + emit_info: Rc, +) -> String { match (*expr.expr_data.clone()).clone() { - ExprData::ExprBlock => emit_typed_block(expr.children.clone(), registry, scope, depth, shared_types, emit_info), - _ => emit_error_expr("emit_rust_expr_block expected ExprBlock".to_string(), RenderTarget::Rust), -} + ExprData::ExprBlock => emit_typed_block( + expr.children.clone(), + registry, + scope, + depth, + shared_types, + emit_info, + ), + _ => emit_error_expr( + "emit_rust_expr_block expected ExprBlock".to_string(), + RenderTarget::Rust, + ), + } } -pub fn emit_rust_expr_cast(expr: &Rc, registry: Rc>>, scope: &Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { +pub fn emit_rust_expr_cast( + expr: &Rc, + registry: Rc>>, + scope: &Rc, + depth: i64, + shared_types: Rc>, + emit_info: Rc, +) -> String { match (*expr.expr_data.clone()).clone() { - ExprData::ExprCast => emit_typed_cast_shared(&cast_expr(expr.clone()), cast_target(expr.clone()), &RenderTarget::Rust, |child| emit_typed_expr(child.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024), &scope.type_env.clone().source_indices.clone()), - _ => emit_error_expr("emit_rust_expr_cast expected ExprCast".to_string(), RenderTarget::Rust), -} + ExprData::ExprCast => emit_typed_cast_shared( + &cast_expr(expr.clone()), + cast_target(expr.clone()), + &RenderTarget::Rust, + |child| { + emit_typed_expr( + child.clone(), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ) + }, + &scope.type_env.clone().source_indices.clone(), + ), + _ => emit_error_expr( + "emit_rust_expr_cast expected ExprCast".to_string(), + RenderTarget::Rust, + ), + } } -pub fn emit_rust_expr_for_each(expr: &Rc, registry: Rc>>, scope: &Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { +pub fn emit_rust_expr_for_each( + expr: &Rc, + registry: Rc>>, + scope: &Rc, + depth: i64, + shared_types: Rc>, + emit_info: Rc, +) -> String { match (*expr.expr_data.clone()).clone() { - ExprData::ExprForEach => { - let v = foreach_variable_at(expr.clone(), scope.type_env.clone().source_indices.clone()); -let c = foreach_collection(expr.clone()); -let bd = foreach_body(expr.clone()); -emit_typed_for_each(&v, &c, bd, ®istry, &scope, depth, &shared_types, &emit_info) -}, - _ => emit_error_expr("emit_rust_expr_for_each expected ExprForEach".to_string(), RenderTarget::Rust), -} + ExprData::ExprForEach => { + let v = + foreach_variable_at(expr.clone(), scope.type_env.clone().source_indices.clone()); + let c = foreach_collection(expr.clone()); + let bd = foreach_body(expr.clone()); + emit_typed_for_each( + &v, + &c, + bd, + ®istry, + &scope, + depth, + &shared_types, + &emit_info, + ) + } + _ => emit_error_expr( + "emit_rust_expr_for_each expected ExprForEach".to_string(), + RenderTarget::Rust, + ), + } } -pub fn emit_rust_expr_index(expr: &Rc, registry: Rc>>, scope: Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { +pub fn emit_rust_expr_index( + expr: &Rc, + registry: Rc>>, + scope: Rc, + depth: i64, + shared_types: Rc>, + emit_info: Rc, +) -> String { match (*expr.expr_data.clone()).clone() { - ExprData::ExprIndex => { - let b = index_base(expr.clone()); -let i = index_expr(expr.clone()); -emit_typed_index(&b, i, ®istry, &scope, depth, &shared_types, &emit_info) -}, - _ => emit_error_expr("emit_rust_expr_index expected ExprIndex".to_string(), RenderTarget::Rust), -} + ExprData::ExprIndex => { + let b = index_base(expr.clone()); + let i = index_expr(expr.clone()); + emit_typed_index(&b, i, ®istry, &scope, depth, &shared_types, &emit_info) + } + _ => emit_error_expr( + "emit_rust_expr_index expected ExprIndex".to_string(), + RenderTarget::Rust, + ), + } } -pub fn emit_rust_expr_slice(expr: &Rc, registry: Rc>>, scope: Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { +pub fn emit_rust_expr_slice( + expr: &Rc, + registry: Rc>>, + scope: Rc, + depth: i64, + shared_types: Rc>, + emit_info: Rc, +) -> String { match (*expr.expr_data.clone()).clone() { - ExprData::ExprSlice => { - let b = slice_base(expr.clone()); -let s = slice_start(expr.clone()); -let e = slice_end(expr.clone()); -emit_typed_slice(&b, s, e, ®istry, &scope, depth, &shared_types, &emit_info) -}, - _ => emit_error_expr("emit_rust_expr_slice expected ExprSlice".to_string(), RenderTarget::Rust), -} + ExprData::ExprSlice => { + let b = slice_base(expr.clone()); + let s = slice_start(expr.clone()); + let e = slice_end(expr.clone()); + emit_typed_slice( + &b, + s, + e, + ®istry, + &scope, + depth, + &shared_types, + &emit_info, + ) + } + _ => emit_error_expr( + "emit_rust_expr_slice expected ExprSlice".to_string(), + RenderTarget::Rust, + ), + } } -pub fn emit_rust_expr_bin_op(expr: &Rc, registry: Rc>>, scope: Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { +pub fn emit_rust_expr_bin_op( + expr: &Rc, + registry: Rc>>, + scope: Rc, + depth: i64, + shared_types: Rc>, + emit_info: Rc, +) -> String { match (*expr.expr_data.clone()).clone() { - ExprData::ExprBinOp { op, algebra_field: algebra, .. } => emit_typed_bin_op(&op, algebra.clone(), &binop_left(expr.clone()), &binop_right(expr.clone()), ®istry, &scope, depth, &shared_types, &emit_info), - _ => emit_error_expr("emit_rust_expr_bin_op expected ExprBinOp".to_string(), RenderTarget::Rust), -} + ExprData::ExprBinOp { + op, + algebra_field: algebra, + .. + } => emit_typed_bin_op( + &op, + algebra.clone(), + &binop_left(expr.clone()), + &binop_right(expr.clone()), + ®istry, + &scope, + depth, + &shared_types, + &emit_info, + ), + _ => emit_error_expr( + "emit_rust_expr_bin_op expected ExprBinOp".to_string(), + RenderTarget::Rust, + ), + } } -pub fn emit_typed_expr(texpr: Rc, registry: Rc>>, scope: &Rc, depth: i64, shared_types: Rc>, emit_info: Rc, fuel: i64) -> String { +pub fn emit_typed_expr( + texpr: Rc, + registry: Rc>>, + scope: &Rc, + depth: i64, + shared_types: Rc>, + emit_info: Rc, + fuel: i64, +) -> String { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - emit_shared_expr(&texpr, &RenderTarget::Rust, scope.type_env.clone().source_indices.clone(), |result| result.clone(), |child| emit_typed_expr(child.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), (fuel.clone() - 1)), |expr| emit_rust_expr_var(&expr, registry.clone(), shared_types.clone(), emit_info.clone(), &scope.type_env.clone().source_indices.clone()), |expr| emit_rust_expr_field_access(&expr, registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone()), |expr| emit_rust_expr_call(&expr, registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone()), |expr| emit_rust_expr_method_call(&expr, registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone()), |expr| emit_rust_expr_match(&expr, registry.clone(), scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone()), |expr| emit_rust_expr_if(&expr, registry.clone(), scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone()), |expr| emit_rust_expr_let(&expr, registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone()), |expr| emit_rust_expr_record_lit(&expr, registry.clone(), &scope, depth.clone(), &shared_types, emit_info.clone()), |expr| emit_rust_expr_string_interp(&expr, registry.clone(), scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone()), |expr| emit_rust_expr_block(&expr, registry.clone(), scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone()), |expr| emit_rust_expr_cast(&expr, registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone()), |expr| emit_rust_expr_for_each(&expr, registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone()), |expr| emit_rust_expr_index(&expr, registry.clone(), scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone()), |expr| emit_rust_expr_slice(&expr, registry.clone(), scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone()), |expr| emit_rust_expr_bin_op(&expr, registry.clone(), scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone())) + emit_shared_expr( + &texpr, + &RenderTarget::Rust, + scope.type_env.clone().source_indices.clone(), + |result| result.clone(), + |child| { + emit_typed_expr( + child.clone(), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + (fuel.clone() - 1), + ) + }, + |expr| { + emit_rust_expr_var( + &expr, + registry.clone(), + shared_types.clone(), + emit_info.clone(), + &scope.type_env.clone().source_indices.clone(), + ) + }, + |expr| { + emit_rust_expr_field_access( + &expr, + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + ) + }, + |expr| { + emit_rust_expr_call( + &expr, + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + ) + }, + |expr| { + emit_rust_expr_method_call( + &expr, + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + ) + }, + |expr| { + emit_rust_expr_match( + &expr, + registry.clone(), + scope.clone(), + depth.clone(), + shared_types.clone(), + emit_info.clone(), + ) + }, + |expr| { + emit_rust_expr_if( + &expr, + registry.clone(), + scope.clone(), + depth.clone(), + shared_types.clone(), + emit_info.clone(), + ) + }, + |expr| { + emit_rust_expr_let( + &expr, + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + ) + }, + |expr| { + emit_rust_expr_record_lit( + &expr, + registry.clone(), + &scope, + depth.clone(), + &shared_types, + emit_info.clone(), + ) + }, + |expr| { + emit_rust_expr_string_interp( + &expr, + registry.clone(), + scope.clone(), + depth.clone(), + shared_types.clone(), + emit_info.clone(), + ) + }, + |expr| { + emit_rust_expr_block( + &expr, + registry.clone(), + scope.clone(), + depth.clone(), + shared_types.clone(), + emit_info.clone(), + ) + }, + |expr| { + emit_rust_expr_cast( + &expr, + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + ) + }, + |expr| { + emit_rust_expr_for_each( + &expr, + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + ) + }, + |expr| { + emit_rust_expr_index( + &expr, + registry.clone(), + scope.clone(), + depth.clone(), + shared_types.clone(), + emit_info.clone(), + ) + }, + |expr| { + emit_rust_expr_slice( + &expr, + registry.clone(), + scope.clone(), + depth.clone(), + shared_types.clone(), + emit_info.clone(), + ) + }, + |expr| { + emit_rust_expr_bin_op( + &expr, + registry.clone(), + scope.clone(), + depth.clone(), + shared_types.clone(), + emit_info.clone(), + ) + }, + ) }) } -pub fn emit_cloned_arg(texpr: Rc, registry: Rc>>, scope: Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { - emit_typed_expr(texpr, registry, &scope, depth, shared_types, emit_info, 1024) -} - -pub fn is_enum_type_name(type_name: String, type_summaries: Rc>>) -> bool { +pub fn emit_cloned_arg( + texpr: Rc, + registry: Rc>>, + scope: Rc, + depth: i64, + shared_types: Rc>, + emit_info: Rc, +) -> String { + emit_typed_expr( + texpr, + registry, + &scope, + depth, + shared_types, + emit_info, + 1024, + ) +} + +pub fn is_enum_type_name( + type_name: String, + type_summaries: Rc>>, +) -> bool { is_enum_in_summaries(type_summaries, type_name) } -pub fn contextual_variant_parent(variant_name: &String, parent_enum: Option, resolved_type: &Rc, emit_info: Rc, source_indices: Rc>>) -> Option { +pub fn contextual_variant_parent( + variant_name: &String, + parent_enum: Option, + resolved_type: &Rc, + emit_info: Rc, + source_indices: Rc>>, +) -> Option { match parent_enum { - Some(explicit_parent) => if variant_belongs_to_enum(emit_info.type_summaries.clone(), variant_name.clone(), explicit_parent.clone()) { - Some(explicit_parent.clone()) - } else { - None - }, - None => { - let rt_name = authored_name_at(source_indices, &resolved_type); -if (((resolved_type.ident_span.clone() != None) && (rt_name.clone().as_str() != variant_name.clone().as_str())) && variant_belongs_to_enum(emit_info.type_summaries.clone(), variant_name.clone(), rt_name.clone())) { - Some(rt_name.clone()) - } else { - None + Some(explicit_parent) => { + if variant_belongs_to_enum( + emit_info.type_summaries.clone(), + variant_name.clone(), + explicit_parent.clone(), + ) { + Some(explicit_parent.clone()) + } else { + None + } } -}, -} + None => { + let rt_name = authored_name_at(source_indices, &resolved_type); + if (((resolved_type.ident_span.clone() != None) + && (rt_name.clone().as_str() != variant_name.clone().as_str())) + && variant_belongs_to_enum( + emit_info.type_summaries.clone(), + variant_name.clone(), + rt_name.clone(), + )) + { + Some(rt_name.clone()) + } else { + None + } + } + } } -pub fn is_map_typed_expr(texpr: Rc, source_indices: Rc>>) -> bool { +pub fn is_map_typed_expr( + texpr: Rc, + source_indices: Rc>>, +) -> bool { match texpr.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: n, .. }) => node_is_keyed_collection(&n, source_indices), - _ => false, -} + Some(InferredNode::Resolved { node: n, .. }) => { + node_is_keyed_collection(&n, source_indices) + } + _ => false, + } } -pub fn emit_typed_call_expr(func: &String, args: Rc>>, inferred: Option>, registry: Rc>>, scope: Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { +pub fn emit_typed_call_expr( + func: &String, + args: Rc>>, + inferred: Option>, + registry: Rc>>, + scope: Rc, + depth: i64, + shared_types: Rc>, + emit_info: Rc, +) -> String { { let call_str = if (func.clone().as_str() == "empty_map".to_string().as_str()) { match inferred.as_deref().cloned() { - Some(InferredNode::Resolved { node: ret_type, .. }) => { - let kv_type_str = rust_empty_map_kv_type_str(&ret_type, &shared_types, &scope.type_env.clone().source_indices.clone()); -if (kv_type_str.clone().as_str() != "".to_string().as_str()) { - v2_rt::concat(v2_rt::concat("v2_rt::rc_empty_map::<".to_string(), kv_type_str.clone()), ">()".to_string()) - } else { - "Rc::new(HashMap::new()) /* BRIDGE: empty_map value type unresolved */".to_string() + Some(InferredNode::Resolved { node: ret_type, .. }) => { + let kv_type_str = rust_empty_map_kv_type_str( + &ret_type, + &shared_types, + &scope.type_env.clone().source_indices.clone(), + ); + if (kv_type_str.clone().as_str() != "".to_string().as_str()) { + v2_rt::concat( + v2_rt::concat( + "v2_rt::rc_empty_map::<".to_string(), + kv_type_str.clone(), + ), + ">()".to_string(), + ) + } else { + "Rc::new(HashMap::new()) /* BRIDGE: empty_map value type unresolved */" + .to_string() + } } -}, - _ => "Rc::new(HashMap::new()) /* BRIDGE: empty_map return type unresolved */".to_string(), -} + _ => "Rc::new(HashMap::new()) /* BRIDGE: empty_map return type unresolved */" + .to_string(), + } } else { - emit_typed_call(&func, &args, ®istry, &scope, depth, &shared_types, &emit_info) + emit_typed_call( + &func, + &args, + ®istry, + &scope, + depth, + &shared_types, + &emit_info, + ) }; -if rust_runtime_bridge_wraps_collection_result_in_rc(&func) { - v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), call_str), ")".to_string()) + if rust_runtime_bridge_wraps_collection_result_in_rc(&func) { + v2_rt::concat( + v2_rt::concat("Rc::new(".to_string(), call_str), + ")".to_string(), + ) } else { call_str } -} + } } -pub fn emit_typed_call(func: &String, args: &Rc>>, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { +pub fn emit_typed_call( + func: &String, + args: &Rc>>, + registry: &Rc>>, + scope: &Rc, + depth: i64, + shared_types: &Rc>, + emit_info: &Rc, +) -> String { { if (func.clone().as_str() == "get".to_string().as_str()) { { let get_args = order_typed_call_args(&args, func.clone(), &scope); -let get_list = get_args.clone().first().cloned(); -let get_idx = get_args.clone().get(1 as usize).cloned(); -let get_result = match get_list { - Some(list_arg) => match get_idx { - Some(idx_arg) => { - let list_str = emit_typed_expr(arg_value(&list_arg), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -let index_str = emit_typed_expr(arg_value(&idx_arg), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(list_str, ".get((".to_string()), index_str), ") as usize)".to_string()), clone_iterator_suffix()) -}, - None => "compile_error!(\"get call missing index argument\")".to_string(), -}, - None => "compile_error!(\"get call missing list argument\")".to_string(), -}; -return get_result -} + let get_list = get_args.clone().first().cloned(); + let get_idx = get_args.clone().get(1 as usize).cloned(); + let get_result = match get_list { + Some(list_arg) => match get_idx { + Some(idx_arg) => { + let list_str = emit_typed_expr( + arg_value(&list_arg), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + let index_str = emit_typed_expr( + arg_value(&idx_arg), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(list_str, ".get((".to_string()), + index_str, + ), + ") as usize)".to_string(), + ), + clone_iterator_suffix(), + ) + } + None => "compile_error!(\"get call missing index argument\")".to_string(), + }, + None => "compile_error!(\"get call missing list argument\")".to_string(), + }; + return get_result; + } } -if (func.clone().as_str() == "with".to_string().as_str()) { + if (func.clone().as_str() == "with".to_string().as_str()) { { let with_args = order_typed_call_args(&args, func.clone(), &scope); -if ((with_args.clone().len() as i64) == 0) { - return "compile_error!(\"with call missing base record\")".to_string() + if ((with_args.clone().len() as i64) == 0) { + return "compile_error!(\"with call missing base record\")".to_string(); } -let base_arg = arg_value(&with_args.clone().first().cloned().clone().unwrap()); -if ((with_args.clone().len() as i64) < 2) { - return "compile_error!(\"with call missing update record\")".to_string() + let base_arg = arg_value(&with_args.clone().first().cloned().clone().unwrap()); + if ((with_args.clone().len() as i64) < 2) { + return "compile_error!(\"with call missing update record\")".to_string(); } -let update_arg = arg_value(&with_args.clone().get(1 as usize).cloned().clone().unwrap()); -let base_str = emit_typed_expr(base_arg.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -let type_name = if (base_arg.inferred.clone() != None) { - authored_name_at(scope.type_env.clone().source_indices.clone(), &resolved_type(base_arg.clone())) + let update_arg = + arg_value(&with_args.clone().get(1 as usize).cloned().clone().unwrap()); + let base_str = emit_typed_expr( + base_arg.clone(), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + let type_name = if (base_arg.inferred.clone() != None) { + authored_name_at( + scope.type_env.clone().source_indices.clone(), + &resolved_type(base_arg.clone()), + ) } else { "compile_error!(\"with call missing resolved record type\")".to_string() }; -let field_strs = match (*update_arg.expr_data.clone()).clone() { - ExprData::ExprRecordLit { .. } => Rc::new({ let mut __result = Vec::new(); for f in update_arg.children.clone().iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(emit_ident(field_init_node_name_at(f.clone(), scope.type_env.clone().source_indices.clone()), RenderTarget::Rust), ": ".to_string()), emit_typed_expr(field_init_node_value(&f), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024))); } __result }), - _ => Rc::new(vec![emit_typed_expr(update_arg.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024)]), -}; -let fields_str = field_strs.join(&", ".to_string()); -let needs_rc = emit_map_has(shared_types.clone(), type_name.clone()); -let sharing = language_spec(RenderTarget::Rust).sharing.clone(); -let spread = if needs_rc.clone() { + let field_strs = match (*update_arg.expr_data.clone()).clone() { + ExprData::ExprRecordLit { .. } => Rc::new({ + let mut __result = Vec::new(); + for f in update_arg.children.clone().iter().cloned() { + __result.push(v2_rt::concat( + v2_rt::concat( + emit_ident( + field_init_node_name_at( + f.clone(), + scope.type_env.clone().source_indices.clone(), + ), + RenderTarget::Rust, + ), + ": ".to_string(), + ), + emit_typed_expr( + field_init_node_value(&f), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ), + )); + } + __result + }), + _ => Rc::new(vec![emit_typed_expr( + update_arg.clone(), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + )]), + }; + let fields_str = field_strs.join(&", ".to_string()); + let needs_rc = emit_map_has(shared_types.clone(), type_name.clone()); + let sharing = language_spec(RenderTarget::Rust).sharing.clone(); + let spread = if needs_rc.clone() { apply_type_template1(sharing.deref_clone.clone(), base_str) } else { apply_type_template1(sharing.clone_value.clone(), base_str) }; -let raw = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(type_name.clone(), " { ".to_string()), fields_str), ", ..".to_string()), spread), " }".to_string()); -if needs_rc.clone() { - return v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), raw), ")".to_string()) + let raw = v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(type_name.clone(), " { ".to_string()), + fields_str, + ), + ", ..".to_string(), + ), + spread, + ), + " }".to_string(), + ); + if needs_rc.clone() { + return v2_rt::concat( + v2_rt::concat("Rc::new(".to_string(), raw), + ")".to_string(), + ); } else { - return raw + return raw; } -} + } } -if (func.clone().as_str() == "to_string".to_string().as_str()) { + if (func.clone().as_str() == "to_string".to_string().as_str()) { { let to_string_args = order_typed_call_args(&args, func.clone(), &scope); -let ts_result = match to_string_args.first().cloned() { - Some(value_arg) => v2_rt::concat(v2_rt::concat("(".to_string(), emit_typed_expr(arg_value(&value_arg), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024)), ").to_string()".to_string()), - None => "compile_error!(\"to_string call missing value argument\")".to_string(), -}; -return ts_result -} + let ts_result = match to_string_args.first().cloned() { + Some(value_arg) => v2_rt::concat( + v2_rt::concat( + "(".to_string(), + emit_typed_expr( + arg_value(&value_arg), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ), + ), + ").to_string()".to_string(), + ), + None => "compile_error!(\"to_string call missing value argument\")".to_string(), + }; + return ts_result; + } } -let collection_scope = if ((((func.clone().as_str() == "map".to_string().as_str()) || (func.clone().as_str() == "filter".to_string().as_str())) || (func.clone().as_str() == "flat_map".to_string().as_str())) || (func.clone().as_str() == "fold".to_string().as_str())) { + let collection_scope = if ((((func.clone().as_str() == "map".to_string().as_str()) + || (func.clone().as_str() == "filter".to_string().as_str())) + || (func.clone().as_str() == "flat_map".to_string().as_str())) + || (func.clone().as_str() == "fold".to_string().as_str())) + { { let call_args = order_typed_call_args(&args, func.clone(), &scope); -match call_args.last().cloned() { - Some(a) => match (*arg_value(&a).expr_data.clone()).clone() { - ExprData::ExprLambda => { - let lps = lambda_param_names_at(arg_value(&a), scope.type_env.clone().source_indices.clone()); -lambda_scope_from_children(scope.clone(), lps, Rc::new(arg_value(&a).children.clone().iter().cloned().skip(1 as usize).collect::>())) -}, - _ => scope.clone(), -}, - None => scope.clone(), -} -} + match call_args.last().cloned() { + Some(a) => match (*arg_value(&a).expr_data.clone()).clone() { + ExprData::ExprLambda => { + let lps = lambda_param_names_at( + arg_value(&a), + scope.type_env.clone().source_indices.clone(), + ); + lambda_scope_from_children( + scope.clone(), + lps, + Rc::new( + arg_value(&a) + .children + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + ) + } + _ => scope.clone(), + }, + None => scope.clone(), + } + } } else { scope.clone() }; -let ordered_args = order_typed_call_args(&args, func.clone(), &collection_scope); -let callee = lookup_item(registry.clone(), func.clone()); -let filled_args = fill_default_args(&ordered_args, callee.clone(), registry.clone(), collection_scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone()); -let is_rt = v2_rt::map_contains_key(&rt_functions(), func.clone()); -let is_rt_ref_map = v2_rt::map_contains_key(&rt_ref_map_functions(), func.clone()); -let callee_qualified = match callee.clone() { - Some(info) => v2_rt::concat(v2_rt::concat(info.module_name.clone(), ".".to_string()), func.clone()), - None => func.clone(), -}; -let callee_read_only = match v2_rt::map_get(&emit_info.read_only_params_index.clone(), callee_qualified) { - Some(m) => m.clone(), - None => v2_rt::rc_empty_map::(), -}; -let callee_is_tco = match callee.clone() { - Some(info) => (info.is_self_recursive.clone() && (info.has_non_tail_self_call.clone() == false)), - None => false, -}; -let callee_borrow_positions = if callee_is_tco { + let ordered_args = order_typed_call_args(&args, func.clone(), &collection_scope); + let callee = lookup_item(registry.clone(), func.clone()); + let filled_args = fill_default_args( + &ordered_args, + callee.clone(), + registry.clone(), + collection_scope.clone(), + depth.clone(), + shared_types.clone(), + emit_info.clone(), + ); + let is_rt = v2_rt::map_contains_key(&rt_functions(), func.clone()); + let is_rt_ref_map = v2_rt::map_contains_key(&rt_ref_map_functions(), func.clone()); + let callee_qualified = match callee.clone() { + Some(info) => v2_rt::concat( + v2_rt::concat(info.module_name.clone(), ".".to_string()), + func.clone(), + ), + None => func.clone(), + }; + let callee_read_only = + match v2_rt::map_get(&emit_info.read_only_params_index.clone(), callee_qualified) { + Some(m) => m.clone(), + None => v2_rt::rc_empty_map::(), + }; + let callee_is_tco = match callee.clone() { + Some(info) => { + (info.is_self_recursive.clone() && (info.has_non_tail_self_call.clone() == false)) + } + None => false, + }; + let callee_borrow_positions = if callee_is_tco { v2_rt::rc_empty_map::() } else { match callee.clone() { - Some(info) => Rc::new(info.params.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, pair: (i64, Rc)| { - let pname = param_node_name_at(pair.1.clone(), collection_scope.type_env.clone().source_indices.clone()); -let n = param_node_type_expr(&pair.1.clone()); -let is_callable = ((n.params.clone().len() as i64) > 0); -let is_borrowable = ((v2_rt::map_contains_key(&callee_read_only, pname.clone()) && (is_callable.clone() == false)) && needs_reference_node(&n, collection_scope.type_env.clone().source_indices.clone())); -if is_borrowable.clone() { - v2_rt::rc_map_insert(acc.clone(), (pair.0.clone()).to_string(), true) - } else { - acc.clone() - } -}), - None => v2_rt::rc_empty_map::(), -} + Some(info) => Rc::new( + info.params + .clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + .fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, pair: (i64, Rc)| { + let pname = param_node_name_at( + pair.1.clone(), + collection_scope.type_env.clone().source_indices.clone(), + ); + let n = param_node_type_expr(&pair.1.clone()); + let is_callable = ((n.params.clone().len() as i64) > 0); + let is_borrowable = + ((v2_rt::map_contains_key(&callee_read_only, pname.clone()) + && (is_callable.clone() == false)) + && needs_reference_node( + &n, + collection_scope.type_env.clone().source_indices.clone(), + )); + if is_borrowable.clone() { + v2_rt::rc_map_insert(acc.clone(), (pair.0.clone()).to_string(), true) + } else { + acc.clone() + } + }, + ), + None => v2_rt::rc_empty_map::(), + } }; -let arg_strs = Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(filled_args.iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { __result.push({ - let idx = pair.0.clone(); -let a = pair.1.clone(); -if (is_rt_ref_map.clone() && (idx.clone() == 0)) { - { - let base = emit_typed_expr_base(&arg_value(&a), registry.clone(), &collection_scope, depth.clone(), shared_types.clone(), emit_info.clone()); -v2_rt::concat("&".to_string(), base.clone()) -} - } else { - if v2_rt::map_contains_key(&callee_borrow_positions, (idx.clone()).to_string()) { + let arg_strs = Rc::new({ + let mut __result = Vec::new(); + for pair in Rc::new( + filled_args + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + { + __result.push({ + let idx = pair.0.clone(); + let a = pair.1.clone(); + if (is_rt_ref_map.clone() && (idx.clone() == 0)) { + { + let base = emit_typed_expr_base( + &arg_value(&a), + registry.clone(), + &collection_scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + ); + v2_rt::concat("&".to_string(), base.clone()) + } + } else { + if v2_rt::map_contains_key( + &callee_borrow_positions, + (idx.clone()).to_string(), + ) { + { + let base = emit_typed_expr_base( + &arg_value(&a), + registry.clone(), + &collection_scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + ); + apply_type_template1( + sharing_for_target(RenderTarget::Rust) + .borrow_arg_template + .clone(), + base.clone(), + ) + } + } else { + emit_cloned_arg( + arg_value(&a), + registry.clone(), + collection_scope.clone(), + depth.clone(), + shared_types.clone(), + emit_info.clone(), + ) + } + } + }); + } + __result + }); + let extra_args = match callee.clone() { + Some(info) => { + let has_effects = (((info.service_names.clone().len() as i64) > 0) + || ((info.resource_names.clone().len() as i64) > 0)); + if has_effects.clone() { { - let base = emit_typed_expr_base(&arg_value(&a), registry.clone(), &collection_scope, depth.clone(), shared_types.clone(), emit_info.clone()); -apply_type_template1(sharing_for_target(RenderTarget::Rust).borrow_arg_template.clone(), base.clone()) -} + let resource_args = Rc::new({ + let mut __result = Vec::new(); + for rn in info.resource_names.clone().iter().cloned() { + __result.push(v2_rt::concat( + "&".to_string(), + emit_ident(rn.clone(), RenderTarget::Rust), + )); + } + __result + }); + let service_args = Rc::new({ + let mut __result = Vec::new(); + for sn in info.service_names.clone().iter().cloned() { + __result.push(service_var_name(sn.clone())); + } + __result + }); + v2_rt::concat(resource_args, service_args) + } } else { - emit_cloned_arg(arg_value(&a), registry.clone(), collection_scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone()) + Rc::new(vec![]) } } -}); } __result }); -let extra_args = match callee.clone() { - Some(info) => { - let has_effects = (((info.service_names.clone().len() as i64) > 0) || ((info.resource_names.clone().len() as i64) > 0)); -if has_effects.clone() { - { - let resource_args = Rc::new({ let mut __result = Vec::new(); for rn in info.resource_names.clone().iter().cloned() { __result.push(v2_rt::concat("&".to_string(), emit_ident(rn.clone(), RenderTarget::Rust))); } __result }); -let service_args = Rc::new({ let mut __result = Vec::new(); for sn in info.service_names.clone().iter().cloned() { __result.push(service_var_name(sn.clone())); } __result }); -v2_rt::concat(resource_args, service_args) -} - } else { - Rc::new(vec![]) - } -}, - None => Rc::new(vec![]), -}; -let all_args = v2_rt::concat(arg_strs, extra_args); -let args_str = all_args.clone().join(&", ".to_string()); -let runtime_name = rust_runtime_bridge_name(func.clone()); -let func_name = if is_rt.clone() { - v2_rt::concat("v2_rt::".to_string(), emit_ident(runtime_name, RenderTarget::Rust)) + None => Rc::new(vec![]), + }; + let all_args = v2_rt::concat(arg_strs, extra_args); + let args_str = all_args.clone().join(&", ".to_string()); + let runtime_name = rust_runtime_bridge_name(func.clone()); + let func_name = if is_rt.clone() { + v2_rt::concat( + "v2_rt::".to_string(), + emit_ident(runtime_name, RenderTarget::Rust), + ) } else { emit_ident(func.clone(), RenderTarget::Rust) }; -let call_str = if ((is_rt.clone() && (func.clone().as_str() == "concat".to_string().as_str())) && ((all_args.clone().len() as i64) > 2)) { + let call_str = if ((is_rt.clone() + && (func.clone().as_str() == "concat".to_string().as_str())) + && ((all_args.clone().len() as i64) > 2)) + { emit_nested_rt_concat(all_args.clone(), "".to_string(), shared_types.clone()) } else { - v2_rt::concat(v2_rt::concat(v2_rt::concat(func_name, "(".to_string()), args_str), ")".to_string()) + v2_rt::concat( + v2_rt::concat(v2_rt::concat(func_name, "(".to_string()), args_str), + ")".to_string(), + ) }; -match callee.clone() { - Some(info) => { - let has_effects = (((info.service_names.clone().len() as i64) > 0) || ((info.resource_names.clone().len() as i64) > 0)); -if has_effects.clone() { - v2_rt::concat(call_str, ".await?".to_string()) - } else { - call_str + match callee.clone() { + Some(info) => { + let has_effects = (((info.service_names.clone().len() as i64) > 0) + || ((info.resource_names.clone().len() as i64) > 0)); + if has_effects.clone() { + v2_rt::concat(call_str, ".await?".to_string()) + } else { + call_str + } } -}, - None => call_str, -} -} + None => call_str, + } + } } -pub fn fill_default_args(ordered: &Rc>>, callee: Option>, registry: Rc>>, scope: Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> Rc>> { +pub fn fill_default_args( + ordered: &Rc>>, + callee: Option>, + registry: Rc>>, + scope: Rc, + depth: i64, + shared_types: Rc>, + emit_info: Rc, +) -> Rc>> { match callee { - Some(info) => { - let provided_names = Rc::new({ let mut __result = Vec::new(); for a in ordered.clone().iter().cloned() { __result.push(match arg_name_at(a.clone(), scope.type_env.clone().source_indices.clone()) { - Some(n) => n.clone(), - None => "".to_string(), -}); } __result }); -let missing_with_defaults = Rc::new({ let mut __result = Vec::new(); for p in info.params.clone().iter().cloned() { if { - let is_provided = { let mut __found = false; for n in provided_names.clone().iter().cloned() { if (n.clone().as_str() == param_node_name_at(p.clone(), scope.type_env.clone().source_indices.clone()).as_str()) { __found = true; break; } } __found }; -if is_provided.clone() { - false - } else { - (param_node_default_value(&p) != None) - } -} { __result.push(p); } } __result }); -let default_args = Rc::new({ let mut __result = Vec::new(); for p in missing_with_defaults.iter().cloned() { __result.push(make_arg_node(Some(param_node_name_at(p.clone(), scope.type_env.clone().source_indices.clone())), param_node_default_value(&p).clone().unwrap(), p.span.clone(), p.span.clone())); } __result }); -v2_rt::concat(ordered.clone(), default_args) -}, - None => ordered.clone(), -} + Some(info) => { + let provided_names = Rc::new({ + let mut __result = Vec::new(); + for a in ordered.clone().iter().cloned() { + __result.push( + match arg_name_at(a.clone(), scope.type_env.clone().source_indices.clone()) + { + Some(n) => n.clone(), + None => "".to_string(), + }, + ); + } + __result + }); + let missing_with_defaults = Rc::new({ + let mut __result = Vec::new(); + for p in info.params.clone().iter().cloned() { + if { + let is_provided = { + let mut __found = false; + for n in provided_names.clone().iter().cloned() { + if (n.clone().as_str() + == param_node_name_at( + p.clone(), + scope.type_env.clone().source_indices.clone(), + ) + .as_str()) + { + __found = true; + break; + } + } + __found + }; + if is_provided.clone() { + false + } else { + (param_node_default_value(&p) != None) + } + } { + __result.push(p); + } + } + __result + }); + let default_args = Rc::new({ + let mut __result = Vec::new(); + for p in missing_with_defaults.iter().cloned() { + __result.push(make_arg_node( + Some(param_node_name_at( + p.clone(), + scope.type_env.clone().source_indices.clone(), + )), + param_node_default_value(&p).clone().unwrap(), + p.span.clone(), + p.span.clone(), + )); + } + __result + }); + v2_rt::concat(ordered.clone(), default_args) + } + None => ordered.clone(), + } } -pub fn fill_op_default_args(ordered: &Rc>>, op_params: Rc>>, registry: Rc>>, scope: Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> Rc>> { +pub fn fill_op_default_args( + ordered: &Rc>>, + op_params: Rc>>, + registry: Rc>>, + scope: Rc, + depth: i64, + shared_types: Rc>, + emit_info: Rc, +) -> Rc>> { { let si = scope.type_env.clone().source_indices.clone(); -let arg_map = ordered.clone().iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, a: Rc| match arg_name_at(a.clone(), si.clone()) { - Some(n) => v2_rt::rc_map_insert(acc.clone(), n.clone(), a.clone()), - None => acc.clone(), -}); -let unnamed_args = Rc::new({ let mut __result = Vec::new(); for a in ordered.clone().iter().cloned() { if (arg_name_at(a.clone(), si.clone()) == None) { __result.push(a); } } __result }); -let named_ordered = Rc::new({ let mut __result = Vec::new(); for p in op_params.iter().cloned() { __result.extend((*{ - let pname = param_node_name_at(p.clone(), si.clone()); -match v2_rt::map_get(&arg_map, pname.clone()) { - Some(arg) => Rc::new(vec![arg.clone()]), - None => if (param_node_default_value(&p) != None) { - Rc::new(vec![make_arg_node(Some(pname.clone()), param_node_default_value(&p).clone().unwrap(), p.span.clone(), p.span.clone())]) - } else { - Rc::new(vec![]) + let arg_map = ordered.clone().iter().cloned().fold( + v2_rt::rc_empty_map::>(), + |acc: Rc>>, a: Rc| match arg_name_at( + a.clone(), + si.clone(), + ) { + Some(n) => v2_rt::rc_map_insert(acc.clone(), n.clone(), a.clone()), + None => acc.clone(), }, -} -}).iter().cloned()); } __result }); -v2_rt::concat(named_ordered, unnamed_args) -} + ); + let unnamed_args = Rc::new({ + let mut __result = Vec::new(); + for a in ordered.clone().iter().cloned() { + if (arg_name_at(a.clone(), si.clone()) == None) { + __result.push(a); + } + } + __result + }); + let named_ordered = Rc::new({ + let mut __result = Vec::new(); + for p in op_params.iter().cloned() { + __result.extend( + (*{ + let pname = param_node_name_at(p.clone(), si.clone()); + match v2_rt::map_get(&arg_map, pname.clone()) { + Some(arg) => Rc::new(vec![arg.clone()]), + None => { + if (param_node_default_value(&p) != None) { + Rc::new(vec![make_arg_node( + Some(pname.clone()), + param_node_default_value(&p).clone().unwrap(), + p.span.clone(), + p.span.clone(), + )]) + } else { + Rc::new(vec![]) + } + } + } + }) + .iter() + .cloned(), + ); + } + __result + }); + v2_rt::concat(named_ordered, unnamed_args) + } } -pub fn emit_nested_rt_concat(mut remaining: Rc>, mut acc: String, mut shared_types: Rc>) -> String { +pub fn emit_nested_rt_concat( + mut remaining: Rc>, + mut acc: String, + mut shared_types: Rc>, +) -> String { loop { match remaining.clone().first().cloned() { - None => { break acc.clone(); }, - Some(arg) => { let next_acc = if (acc.clone().as_str() == "".to_string().as_str()) { - arg.clone() - } else { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("v2_rt::concat(".to_string(), acc.clone()), ", ".to_string()), arg.clone()), ")".to_string()) - }; -{ - let __tco_0 = Rc::new(remaining.iter().cloned().skip(1 as usize).collect::>()); -let __tco_1 = next_acc; -remaining = __tco_0; -acc = __tco_1; -continue; -} }, -} -} + None => { + break acc.clone(); + } + Some(arg) => { + let next_acc = if (acc.clone().as_str() == "".to_string().as_str()) { + arg.clone() + } else { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("v2_rt::concat(".to_string(), acc.clone()), + ", ".to_string(), + ), + arg.clone(), + ), + ")".to_string(), + ) + }; + { + let __tco_0 = Rc::new( + remaining + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ); + let __tco_1 = next_acc; + remaining = __tco_0; + acc = __tco_1; + continue; + } + } + } + } } -pub fn emit_typed_for_each(variable: &String, collection: &Rc, body: Rc, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { +pub fn emit_typed_for_each( + variable: &String, + collection: &Rc, + body: Rc, + registry: &Rc>>, + scope: &Rc, + depth: i64, + shared_types: &Rc>, + emit_info: &Rc, +) -> String { { let sharing = language_spec(RenderTarget::Rust).sharing.clone(); -let coll_str = emit_typed_expr(collection.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -let elem_type = for_each_element_type_node(resolved_type(collection.clone()), scope.type_env.clone().source_indices.clone()); -let body_scope = extend_scope(&scope, &variable, elem_type, Rc::new(SubValueRelation::SubValueUnknown)); -let body_str = emit_typed_expr(body, registry.clone(), &body_scope, (depth.clone() + 2), shared_types.clone(), emit_info.clone(), 1024); -let ind1 = make_indent((depth.clone() + 1)); -let ind2 = make_indent((depth.clone() + 2)); -let ind0 = make_indent(depth.clone()); -let iter_str = apply_type_template1(sharing.iter_owned.clone(), coll_str); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\n".to_string(), ind1.clone()), "let mut __collect = Vec::new();\n".to_string()), ind1.clone()), "for ".to_string()), emit_ident(variable.clone(), RenderTarget::Rust)), " in ".to_string()), iter_str), " {\n".to_string()), ind2), "__collect.push(".to_string()), body_str), ");\n".to_string()), ind1.clone()), "}\n".to_string()), ind1.clone()), "Rc::new(__collect)\n".to_string()), ind0), "}".to_string()) -} + let coll_str = emit_typed_expr( + collection.clone(), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + let elem_type = for_each_element_type_node( + resolved_type(collection.clone()), + scope.type_env.clone().source_indices.clone(), + ); + let body_scope = extend_scope( + &scope, + &variable, + elem_type, + Rc::new(SubValueRelation::SubValueUnknown), + ); + let body_str = emit_typed_expr( + body, + registry.clone(), + &body_scope, + (depth.clone() + 2), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + let ind1 = make_indent((depth.clone() + 1)); + let ind2 = make_indent((depth.clone() + 2)); + let ind0 = make_indent(depth.clone()); + let iter_str = apply_type_template1(sharing.iter_owned.clone(), coll_str); + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("{\n".to_string(), ind1.clone()), "let mut __collect = Vec::new();\n".to_string()), ind1.clone()), "for ".to_string()), emit_ident(variable.clone(), RenderTarget::Rust)), " in ".to_string()), iter_str), " {\n".to_string()), ind2), "__collect.push(".to_string()), body_str), ");\n".to_string()), ind1.clone()), "}\n".to_string()), ind1.clone()), "Rc::new(__collect)\n".to_string()), ind0), "}".to_string()) + } } -pub fn emit_typed_index(base: &Rc, index: Rc, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { +pub fn emit_typed_index( + base: &Rc, + index: Rc, + registry: &Rc>>, + scope: &Rc, + depth: i64, + shared_types: &Rc>, + emit_info: &Rc, +) -> String { { let spec = language_spec(RenderTarget::Rust); -let base_str = emit_typed_expr(base.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -let index_str = emit_typed_expr(index, registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -let base_node = normalize_access_type_node(resolved_type(base.clone())); -let is_map = node_is_keyed_collection(&base_node, scope.type_env.clone().source_indices.clone()); -if is_rust_string_like(base_node.clone(), scope.type_env.clone().source_indices.clone()) { - apply_type_template2(spec.indexing.clone().string_index.clone(), base_str, index_str) + let base_str = emit_typed_expr( + base.clone(), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + let index_str = emit_typed_expr( + index, + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + let base_node = normalize_access_type_node(resolved_type(base.clone())); + let is_map = + node_is_keyed_collection(&base_node, scope.type_env.clone().source_indices.clone()); + if is_rust_string_like( + base_node.clone(), + scope.type_env.clone().source_indices.clone(), + ) { + apply_type_template2( + spec.indexing.clone().string_index.clone(), + base_str, + index_str, + ) } else { if is_map { apply_type_template2(spec.indexing.clone().map_index.clone(), base_str, index_str) } else { - apply_type_template2(spec.indexing.clone().list_index.clone(), base_str, index_str) + apply_type_template2( + spec.indexing.clone().list_index.clone(), + base_str, + index_str, + ) } } -} + } } -pub fn emit_typed_slice(base: &Rc, start: Rc, end: Rc, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { +pub fn emit_typed_slice( + base: &Rc, + start: Rc, + end: Rc, + registry: &Rc>>, + scope: &Rc, + depth: i64, + shared_types: &Rc>, + emit_info: &Rc, +) -> String { { let spec = language_spec(RenderTarget::Rust); -let base_str = emit_typed_expr(base.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -let start_str = emit_typed_expr(start, registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -let end_str = emit_typed_expr(end, registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -let base_node = normalize_access_type_node(resolved_type(base.clone())); -if is_rust_string_like(base_node, scope.type_env.clone().source_indices.clone()) { + let base_str = emit_typed_expr( + base.clone(), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + let start_str = emit_typed_expr( + start, + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + let end_str = emit_typed_expr( + end, + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + let base_node = normalize_access_type_node(resolved_type(base.clone())); + if is_rust_string_like(base_node, scope.type_env.clone().source_indices.clone()) { match spec.indexing.clone().string_slice.clone() { - Some(tmpl) => apply_type_template3(tmpl.clone(), base_str, start_str, end_str), - None => emit_error_expr("unsupported string slice for target".to_string(), RenderTarget::Rust), -} + Some(tmpl) => apply_type_template3(tmpl.clone(), base_str, start_str, end_str), + None => emit_error_expr( + "unsupported string slice for target".to_string(), + RenderTarget::Rust, + ), + } } else { match spec.indexing.clone().list_slice.clone() { - Some(tmpl) => apply_type_template3(tmpl.clone(), base_str, start_str, end_str), - None => emit_error_expr("unsupported list slice for target".to_string(), RenderTarget::Rust), + Some(tmpl) => apply_type_template3(tmpl.clone(), base_str, start_str, end_str), + None => emit_error_expr( + "unsupported list slice for target".to_string(), + RenderTarget::Rust, + ), + } + } + } } + +pub fn collection_element_type( + receiver_type: Option>, + shared_types: Rc>, + source_indices: &Rc>>, +) -> String { + match receiver_type.as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => { + let __rt_is_container = node_is_element_collection(&rt, source_indices.clone()); + if __rt_is_container { + match rt.children.clone().first().cloned() { + Some(elem_child) => { + let elem_node = child_type_node(&elem_child); + let elem_is_error = if (elem_node.inferred.clone() != None) { + is_compiler_error(elem_node.inferred.clone().clone().unwrap()) + } else { + false + }; + let elem_is_type_var = if (elem_node.inferred.clone() != None) { + is_type_variable(elem_node.inferred.clone().clone().unwrap()) + } else { + false + }; + if (elem_is_error || elem_is_type_var) { + "_".to_string() + } else { + render_rust_type( + elem_node.clone(), + shared_types, + source_indices.clone(), + ) + } + } + None => "_".to_string(), + } + } else { + "_".to_string() + } } + _ => "_".to_string(), + } } + +pub fn lambda_scope_from_children( + scope: Rc, + params: Rc>, + param_nodes: Rc>>, +) -> Rc { + Rc::new( + params + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + .fold(scope.clone(), |acc: Rc, pair: (i64, String)| { + let idx = pair.0.clone(); + let param_name = pair.1.clone(); + let param_type = match param_nodes.clone().get(idx.clone() as usize).cloned() { + Some(pn) => match pn.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { + node: resolved_type, + .. + }) => resolved_type.clone(), + _ => type_variable_node("lambda_param".to_string()), + }, + None => type_variable_node("lambda_param".to_string()), + }; + extend_scope( + &acc, + ¶m_name, + param_type.clone(), + Rc::new(SubValueRelation::SubValueUnknown), + ) + }) } -pub fn collection_element_type(receiver_type: Option>, shared_types: Rc>, source_indices: &Rc>>) -> String { - match receiver_type.as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - let __rt_is_container = node_is_element_collection(&rt, source_indices.clone()); -if __rt_is_container { - match rt.children.clone().first().cloned() { - Some(elem_child) => { - let elem_node = child_type_node(&elem_child); -let elem_is_error = if (elem_node.inferred.clone() != None) { - is_compiler_error(elem_node.inferred.clone().clone().unwrap()) - } else { - false +pub fn lambda_param_type_strs( + params: Rc>, + param_nodes: Rc>>, + fallback_types: Rc>, + shared_types: Rc>, + source_indices: Rc>>, +) -> Rc> { + Rc::new({ + let mut __result = Vec::new(); + for pair in Rc::new( + params + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + { + __result.push({ + let idx = pair.0.clone(); + let param_name = pair.1.clone(); + let inferred_type = match param_nodes.clone().get(idx.clone() as usize).cloned() { + Some(pn) => match pn.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { + node: param_type, .. + }) => { + let param_is_error = if (param_type.inferred.clone() != None) { + is_compiler_error(param_type.inferred.clone().clone().unwrap()) + } else { + false + }; + let param_is_type_var = if (param_type.inferred.clone() != None) { + is_type_variable(param_type.inferred.clone().clone().unwrap()) + } else { + false + }; + if (param_is_type_var.clone() || param_is_error.clone()) { + None + } else { + Some(render_rust_type( + param_type.clone(), + shared_types.clone(), + source_indices.clone(), + )) + } + } + _ => None, + }, + None => None, }; -let elem_is_type_var = if (elem_node.inferred.clone() != None) { - is_type_variable(elem_node.inferred.clone().clone().unwrap()) - } else { - false + let fallback_type = match fallback_types.clone().get(idx.clone() as usize).cloned() + { + Some(ty) => ty.clone(), + None => "_".to_string(), }; -if (elem_is_error || elem_is_type_var) { - "_".to_string() - } else { - render_rust_type(elem_node.clone(), shared_types, source_indices.clone()) + let spec = language_spec(RenderTarget::Rust); + let ident = emit_ident(param_name.clone(), RenderTarget::Rust); + match inferred_type.clone() { + Some(ty) => apply_type_template2( + spec.annotations.clone().lambda_param_typed.clone(), + ident.clone(), + ty.clone(), + ), + None => apply_type_template2( + spec.annotations.clone().lambda_param_typed.clone(), + ident.clone(), + fallback_type.clone(), + ), } -}, - None => "_".to_string(), -} - } else { - "_".to_string() + }); } -}, - _ => "_".to_string(), -} + __result + }) } -pub fn lambda_scope_from_children(scope: Rc, params: Rc>, param_nodes: Rc>>) -> Rc { - Rc::new(params.iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned().fold(scope.clone(), |acc: Rc, pair: (i64, String)| { - let idx = pair.0.clone(); -let param_name = pair.1.clone(); -let param_type = match param_nodes.clone().get(idx.clone() as usize).cloned() { - Some(pn) => match pn.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: resolved_type, .. }) => resolved_type.clone(), - _ => type_variable_node("lambda_param".to_string()), -}, - None => type_variable_node("lambda_param".to_string()), -}; -extend_scope(&acc, ¶m_name, param_type.clone(), Rc::new(SubValueRelation::SubValueUnknown)) -}) +pub fn emit_typed_collection_lambda( + lambda_expr: &Rc, + elem_type_str: String, + registry: Rc>>, + scope: &Rc, + depth: i64, + shared_types: &Rc>, + emit_info: Rc, +) -> String { + match (*lambda_expr.expr_data.clone()).clone() { + ExprData::ExprLambda => { + let ps = lambda_param_names_at( + lambda_expr.clone(), + scope.type_env.clone().source_indices.clone(), + ); + let bd = lambda_body(lambda_expr.clone()); + let pn = Rc::new( + lambda_expr + .children + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ); + let param_strs = lambda_param_type_strs( + ps.clone(), + pn.clone(), + Rc::new(vec![elem_type_str]), + shared_types.clone(), + scope.type_env.clone().source_indices.clone(), + ); + let params_str = param_strs.join(&", ".to_string()); + let lambda_scope = lambda_scope_from_children(scope.clone(), ps.clone(), pn.clone()); + let body_str = emit_typed_expr( + bd, + registry, + &lambda_scope, + depth, + shared_types.clone(), + emit_info, + 1024, + ); + v2_rt::concat( + v2_rt::concat(v2_rt::concat("|".to_string(), params_str), "| ".to_string()), + body_str, + ) + } + _ => emit_typed_expr( + lambda_expr.clone(), + registry, + &scope, + depth, + shared_types.clone(), + emit_info, + 1024, + ), + } } -pub fn lambda_param_type_strs(params: Rc>, param_nodes: Rc>>, fallback_types: Rc>, shared_types: Rc>, source_indices: Rc>>) -> Rc> { - Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(params.iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { __result.push({ - let idx = pair.0.clone(); -let param_name = pair.1.clone(); -let inferred_type = match param_nodes.clone().get(idx.clone() as usize).cloned() { - Some(pn) => match pn.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: param_type, .. }) => { - let param_is_error = if (param_type.inferred.clone() != None) { - is_compiler_error(param_type.inferred.clone().clone().unwrap()) - } else { - false - }; -let param_is_type_var = if (param_type.inferred.clone() != None) { - is_type_variable(param_type.inferred.clone().clone().unwrap()) +pub fn emit_typed_fold_lambda( + lambda_expr: &Rc, + acc_type_str: &String, + elem_type_str: String, + registry: Rc>>, + scope: &Rc, + depth: i64, + shared_types: &Rc>, + emit_info: &Rc, +) -> String { + match (*lambda_expr.expr_data.clone()).clone() { + ExprData::ExprLambda => { + let ps = lambda_param_names_at( + lambda_expr.clone(), + scope.type_env.clone().source_indices.clone(), + ); + let bd = lambda_body(lambda_expr.clone()); + let pn = Rc::new( + lambda_expr + .children + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ); + let safe_acc_type = if (((acc_type_str.clone().as_str() + == "Rc>".to_string().as_str()) + || (acc_type_str.clone().as_str() == "Vec<()>".to_string().as_str())) + || (acc_type_str.clone().as_str() == "Option<()>".to_string().as_str())) + { + "_".to_string() } else { - false + acc_type_str.clone() }; -if (param_is_type_var.clone() || param_is_error.clone()) { - None + let fallback_types = Rc::new({ + let mut __result = Vec::new(); + for pair in Rc::new( + ps.clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + { + __result.push(if (pair.0.clone() == 0) { + safe_acc_type.clone() + } else { + elem_type_str.clone() + }); + } + __result + }); + let param_strs = lambda_param_type_strs( + ps.clone(), + Rc::new(vec![]), + fallback_types, + shared_types.clone(), + scope.type_env.clone().source_indices.clone(), + ); + let params_str = param_strs.join(&", ".to_string()); + let lambda_scope = lambda_scope_from_children(scope.clone(), ps.clone(), pn); + let body_str = emit_typed_expr( + bd, + registry, + &lambda_scope, + depth, + shared_types.clone(), + emit_info.clone(), + 1024, + ); + let acc_name = match ps.clone().first().cloned() { + Some(n) => n.clone(), + None => "".to_string(), + }; + let needs_unwrap = ((acc_name.clone().as_str() != "".to_string().as_str()) + && emit_map_has(emit_info.owned_bindings.clone(), acc_name.clone())); + if needs_unwrap { + { + let acc_ident = emit_ident(acc_name.clone(), RenderTarget::Rust); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("|".to_string(), params_str), + "| { let ".to_string(), + ), + acc_ident.clone(), + ), + " = Rc::try_unwrap(".to_string(), + ), + acc_ident.clone(), + ), + ").unwrap_or_else(|rc| (*rc).clone()); ".to_string(), + ), + body_str, + ), + " }".to_string(), + ) + } } else { - Some(render_rust_type(param_type.clone(), shared_types.clone(), source_indices.clone())) + v2_rt::concat( + v2_rt::concat(v2_rt::concat("|".to_string(), params_str), "| ".to_string()), + body_str, + ) } -}, - _ => None, -}, - None => None, -}; -let fallback_type = match fallback_types.clone().get(idx.clone() as usize).cloned() { - Some(ty) => ty.clone(), - None => "_".to_string(), -}; -let spec = language_spec(RenderTarget::Rust); -let ident = emit_ident(param_name.clone(), RenderTarget::Rust); -match inferred_type.clone() { - Some(ty) => apply_type_template2(spec.annotations.clone().lambda_param_typed.clone(), ident.clone(), ty.clone()), - None => apply_type_template2(spec.annotations.clone().lambda_param_typed.clone(), ident.clone(), fallback_type.clone()), -} -}); } __result }) -} - -pub fn emit_typed_collection_lambda(lambda_expr: &Rc, elem_type_str: String, registry: Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: Rc) -> String { - match (*lambda_expr.expr_data.clone()).clone() { - ExprData::ExprLambda => { - let ps = lambda_param_names_at(lambda_expr.clone(), scope.type_env.clone().source_indices.clone()); -let bd = lambda_body(lambda_expr.clone()); -let pn = Rc::new(lambda_expr.children.clone().iter().cloned().skip(1 as usize).collect::>()); -let param_strs = lambda_param_type_strs(ps.clone(), pn.clone(), Rc::new(vec![elem_type_str]), shared_types.clone(), scope.type_env.clone().source_indices.clone()); -let params_str = param_strs.join(&", ".to_string()); -let lambda_scope = lambda_scope_from_children(scope.clone(), ps.clone(), pn.clone()); -let body_str = emit_typed_expr(bd, registry, &lambda_scope, depth, shared_types.clone(), emit_info, 1024); -v2_rt::concat(v2_rt::concat(v2_rt::concat("|".to_string(), params_str), "| ".to_string()), body_str) -}, - _ => emit_typed_expr(lambda_expr.clone(), registry, &scope, depth, shared_types.clone(), emit_info, 1024), -} -} - -pub fn emit_typed_fold_lambda(lambda_expr: &Rc, acc_type_str: &String, elem_type_str: String, registry: Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { - match (*lambda_expr.expr_data.clone()).clone() { - ExprData::ExprLambda => { - let ps = lambda_param_names_at(lambda_expr.clone(), scope.type_env.clone().source_indices.clone()); -let bd = lambda_body(lambda_expr.clone()); -let pn = Rc::new(lambda_expr.children.clone().iter().cloned().skip(1 as usize).collect::>()); -let safe_acc_type = if (((acc_type_str.clone().as_str() == "Rc>".to_string().as_str()) || (acc_type_str.clone().as_str() == "Vec<()>".to_string().as_str())) || (acc_type_str.clone().as_str() == "Option<()>".to_string().as_str())) { - "_".to_string() - } else { - acc_type_str.clone() - }; -let fallback_types = Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(ps.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { __result.push(if (pair.0.clone() == 0) { - safe_acc_type.clone() - } else { - elem_type_str.clone() - }); } __result }); -let param_strs = lambda_param_type_strs(ps.clone(), Rc::new(vec![]), fallback_types, shared_types.clone(), scope.type_env.clone().source_indices.clone()); -let params_str = param_strs.join(&", ".to_string()); -let lambda_scope = lambda_scope_from_children(scope.clone(), ps.clone(), pn); -let body_str = emit_typed_expr(bd, registry, &lambda_scope, depth, shared_types.clone(), emit_info.clone(), 1024); -let acc_name = match ps.clone().first().cloned() { - Some(n) => n.clone(), - None => "".to_string(), -}; -let needs_unwrap = ((acc_name.clone().as_str() != "".to_string().as_str()) && emit_map_has(emit_info.owned_bindings.clone(), acc_name.clone())); -if needs_unwrap { - { - let acc_ident = emit_ident(acc_name.clone(), RenderTarget::Rust); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("|".to_string(), params_str), "| { let ".to_string()), acc_ident.clone()), " = Rc::try_unwrap(".to_string()), acc_ident.clone()), ").unwrap_or_else(|rc| (*rc).clone()); ".to_string()), body_str), " }".to_string()) -} - } else { - v2_rt::concat(v2_rt::concat(v2_rt::concat("|".to_string(), params_str), "| ".to_string()), body_str) } -}, - _ => emit_typed_expr(lambda_expr.clone(), registry, &scope, depth, shared_types.clone(), emit_info.clone(), 1024), -} + _ => emit_typed_expr( + lambda_expr.clone(), + registry, + &scope, + depth, + shared_types.clone(), + emit_info.clone(), + 1024, + ), + } } -pub fn emit_rust_fold_method_call(method_call_node: Rc, fold_accumulator_type: Option>, result_type: Option>, receiver: &Rc, args: &Rc>>, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { +pub fn emit_rust_fold_method_call( + method_call_node: Rc, + fold_accumulator_type: Option>, + result_type: Option>, + receiver: &Rc, + args: &Rc>>, + registry: &Rc>>, + scope: &Rc, + depth: i64, + shared_types: &Rc>, + emit_info: &Rc, +) -> String { { - let recv_str = emit_typed_expr(receiver.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -let elem_type_str = collection_element_type(receiver.inferred.clone(), shared_types.clone(), &scope.type_env.clone().source_indices.clone()); -let contextual_acc_type = match result_type.as_deref().cloned() { - Some(InferredNode::Resolved { node: method_result_type, .. }) => Some(method_result_type.clone()), - _ => None, -}; -let acc_type_node = match fold_accumulator_type { - Some(acc_type) => { - let acc_children_have_unit = ({ let mut __found = false; for c in acc_type.children.clone().iter().cloned() { if (is_unit_like(&c) || (c.ident_span.clone() == None)) { __found = true; break; } } __found } || { let mut __found = false; for c in acc_type.children.clone().iter().cloned() { if { let mut __found = false; for gc in c.children.clone().iter().cloned() { if (is_unit_like(&gc) || (gc.ident_span.clone() == None)) { __found = true; break; } } __found } { __found = true; break; } } __found }); -let is_under_resolved_map = (node_is_keyed_collection(&acc_type, scope.type_env.clone().source_indices.clone()) && (((acc_type.children.clone().len() as i64) == 0) || acc_children_have_unit)); -let is_under_resolved_list = (node_is_element_collection(&acc_type, scope.type_env.clone().source_indices.clone()) && ((acc_type.children.clone().len() as i64) == 0)); -let is_under_resolved_non_collection = ((!node_is_keyed_collection(&acc_type, scope.type_env.clone().source_indices.clone()) && !node_is_element_collection(&acc_type, scope.type_env.clone().source_indices.clone())) && !node_is_collection(&acc_type, scope.type_env.clone().source_indices.clone())); -if ((is_under_resolved_map || is_under_resolved_list) || is_under_resolved_non_collection) { - match contextual_acc_type { - Some(concrete_type) => concrete_type.clone(), - None => acc_type.clone(), -} - } else { - acc_type.clone() + let recv_str = emit_typed_expr( + receiver.clone(), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + let elem_type_str = collection_element_type( + receiver.inferred.clone(), + shared_types.clone(), + &scope.type_env.clone().source_indices.clone(), + ); + let contextual_acc_type = match result_type.as_deref().cloned() { + Some(InferredNode::Resolved { + node: method_result_type, + .. + }) => Some(method_result_type.clone()), + _ => None, + }; + let acc_type_node = match fold_accumulator_type { + Some(acc_type) => { + let acc_children_have_unit = ({ + let mut __found = false; + for c in acc_type.children.clone().iter().cloned() { + if (is_unit_like(&c) || (c.ident_span.clone() == None)) { + __found = true; + break; + } + } + __found + } || { + let mut __found = false; + for c in acc_type.children.clone().iter().cloned() { + if { + let mut __found = false; + for gc in c.children.clone().iter().cloned() { + if (is_unit_like(&gc) || (gc.ident_span.clone() == None)) { + __found = true; + break; + } + } + __found + } { + __found = true; + break; + } + } + __found + }); + let is_under_resolved_map = (node_is_keyed_collection( + &acc_type, + scope.type_env.clone().source_indices.clone(), + ) && (((acc_type.children.clone().len() as i64) + == 0) + || acc_children_have_unit)); + let is_under_resolved_list = (node_is_element_collection( + &acc_type, + scope.type_env.clone().source_indices.clone(), + ) && ((acc_type.children.clone().len() as i64) == 0)); + let is_under_resolved_non_collection = ((!node_is_keyed_collection( + &acc_type, + scope.type_env.clone().source_indices.clone(), + ) && !node_is_element_collection( + &acc_type, + scope.type_env.clone().source_indices.clone(), + )) && !node_is_collection( + &acc_type, + scope.type_env.clone().source_indices.clone(), + )); + if ((is_under_resolved_map || is_under_resolved_list) + || is_under_resolved_non_collection) + { + match contextual_acc_type { + Some(concrete_type) => concrete_type.clone(), + None => acc_type.clone(), + } + } else { + acc_type.clone() + } } -}, - None => match contextual_acc_type { - Some(concrete_type) => concrete_type.clone(), - None => match args.clone().first().cloned() { - Some(init_arg) => if (arg_value(&init_arg).inferred.clone() != None) { - resolved_type(arg_value(&init_arg)) - } else { - type_variable_node("fold_accum".to_string()) - }, - None => type_variable_node("fold_accum".to_string()), -}, -}, -}; -let acc_type_name = authored_name_at(scope.type_env.clone().source_indices.clone(), &acc_type_node); -let fold_lambda_node = match args.clone().get(1 as usize).cloned() { - Some(a) => arg_value(&a), - None => type_variable_node("".to_string()), -}; -let acc_param_name = match (*fold_lambda_node.expr_data.clone()).clone() { - ExprData::ExprLambda => match lambda_param_names_at(fold_lambda_node.clone(), scope.type_env.clone().source_indices.clone()).first().cloned() { - Some(n) => n.clone(), - None => "".to_string(), -}, - _ => "".to_string(), -}; -let fold_proof = analyze_single_fold(&method_call_node, &scope.type_env.clone().source_indices.clone()); -let structural_unwrap = ((fold_proof.eligible.clone() && fold_proof.body_constructs_acc.clone()) && fold_proof.safe_field_moves.clone()); -let structural_move = (fold_proof.eligible.clone() && fold_proof.whole_acc_single_use.clone()); -let acc_unwrap = (structural_unwrap && emit_map_has(shared_types.clone(), acc_type_name.clone())); -let fold_emit_info = if acc_unwrap { + None => match contextual_acc_type { + Some(concrete_type) => concrete_type.clone(), + None => match args.clone().first().cloned() { + Some(init_arg) => { + if (arg_value(&init_arg).inferred.clone() != None) { + resolved_type(arg_value(&init_arg)) + } else { + type_variable_node("fold_accum".to_string()) + } + } + None => type_variable_node("fold_accum".to_string()), + }, + }, + }; + let acc_type_name = authored_name_at( + scope.type_env.clone().source_indices.clone(), + &acc_type_node, + ); + let fold_lambda_node = match args.clone().get(1 as usize).cloned() { + Some(a) => arg_value(&a), + None => type_variable_node("".to_string()), + }; + let acc_param_name = match (*fold_lambda_node.expr_data.clone()).clone() { + ExprData::ExprLambda => match lambda_param_names_at( + fold_lambda_node.clone(), + scope.type_env.clone().source_indices.clone(), + ) + .first() + .cloned() + { + Some(n) => n.clone(), + None => "".to_string(), + }, + _ => "".to_string(), + }; + let fold_proof = analyze_single_fold( + &method_call_node, + &scope.type_env.clone().source_indices.clone(), + ); + let structural_unwrap = ((fold_proof.eligible.clone() + && fold_proof.body_constructs_acc.clone()) + && fold_proof.safe_field_moves.clone()); + let structural_move = + (fold_proof.eligible.clone() && fold_proof.whole_acc_single_use.clone()); + let acc_unwrap = + (structural_unwrap && emit_map_has(shared_types.clone(), acc_type_name.clone())); + let fold_emit_info = if acc_unwrap { match (*fold_lambda_node.expr_data.clone()).clone() { - ExprData::ExprLambda => { - let ps = lambda_param_names_at(fold_lambda_node.clone(), scope.type_env.clone().source_indices.clone()); -match ps.first().cloned() { - Some(acc_name) => Rc::new(EmitGraphInfo { - type_summaries: emit_info.type_summaries.clone(), - recursive_type_set: emit_info.recursive_type_set.clone(), - fielded_variants: emit_info.fielded_variants.clone(), - shared_types: emit_info.shared_types.clone(), - ownership_index: emit_info.ownership_index.clone(), - movable: emit_info.movable.clone(), - variant_to_enum: emit_info.variant_to_enum.clone(), - owned_bindings: v2_rt::rc_map_insert(emit_info.owned_bindings.clone(), acc_name.clone(), true), - read_only_params_index: emit_info.read_only_params_index.clone(), - read_only_params: emit_info.read_only_params.clone(), -}), - None => emit_info.clone(), -} -}, - _ => emit_info.clone(), -} + ExprData::ExprLambda => { + let ps = lambda_param_names_at( + fold_lambda_node.clone(), + scope.type_env.clone().source_indices.clone(), + ); + match ps.first().cloned() { + Some(acc_name) => Rc::new(EmitGraphInfo { + type_summaries: emit_info.type_summaries.clone(), + recursive_type_set: emit_info.recursive_type_set.clone(), + fielded_variants: emit_info.fielded_variants.clone(), + shared_types: emit_info.shared_types.clone(), + ownership_index: emit_info.ownership_index.clone(), + movable: emit_info.movable.clone(), + variant_to_enum: emit_info.variant_to_enum.clone(), + owned_bindings: v2_rt::rc_map_insert( + emit_info.owned_bindings.clone(), + acc_name.clone(), + true, + ), + read_only_params_index: emit_info.read_only_params_index.clone(), + read_only_params: emit_info.read_only_params.clone(), + }), + None => emit_info.clone(), + } + } + _ => emit_info.clone(), + } } else { if structural_move { match (*fold_lambda_node.expr_data.clone()).clone() { - ExprData::ExprLambda => { - let ps = lambda_param_names_at(fold_lambda_node.clone(), scope.type_env.clone().source_indices.clone()); -match ps.first().cloned() { - Some(acc_name) => Rc::new(EmitGraphInfo { - type_summaries: emit_info.type_summaries.clone(), - recursive_type_set: emit_info.recursive_type_set.clone(), - fielded_variants: emit_info.fielded_variants.clone(), - shared_types: emit_info.shared_types.clone(), - ownership_index: emit_info.ownership_index.clone(), - movable: v2_rt::rc_map_insert(emit_info.movable.clone(), acc_name.clone(), true), - variant_to_enum: emit_info.variant_to_enum.clone(), - owned_bindings: emit_info.owned_bindings.clone(), - read_only_params_index: emit_info.read_only_params_index.clone(), - read_only_params: emit_info.read_only_params.clone(), -}), - None => emit_info.clone(), -} -}, - _ => emit_info.clone(), -} + ExprData::ExprLambda => { + let ps = lambda_param_names_at( + fold_lambda_node.clone(), + scope.type_env.clone().source_indices.clone(), + ); + match ps.first().cloned() { + Some(acc_name) => Rc::new(EmitGraphInfo { + type_summaries: emit_info.type_summaries.clone(), + recursive_type_set: emit_info.recursive_type_set.clone(), + fielded_variants: emit_info.fielded_variants.clone(), + shared_types: emit_info.shared_types.clone(), + ownership_index: emit_info.ownership_index.clone(), + movable: v2_rt::rc_map_insert( + emit_info.movable.clone(), + acc_name.clone(), + true, + ), + variant_to_enum: emit_info.variant_to_enum.clone(), + owned_bindings: emit_info.owned_bindings.clone(), + read_only_params_index: emit_info.read_only_params_index.clone(), + read_only_params: emit_info.read_only_params.clone(), + }), + None => emit_info.clone(), + } + } + _ => emit_info.clone(), + } } else { emit_info.clone() } }; -let acc_type_str = render_rust_type(acc_type_node.clone(), shared_types.clone(), scope.type_env.clone().source_indices.clone()); -let is_bare_container = (((acc_type_node.children.clone().len() as i64) == 0) && is_container_type(acc_type_name.clone())); -let lambda_acc_type_str = if is_bare_container { + let acc_type_str = render_rust_type( + acc_type_node.clone(), + shared_types.clone(), + scope.type_env.clone().source_indices.clone(), + ); + let is_bare_container = (((acc_type_node.children.clone().len() as i64) == 0) + && is_container_type(acc_type_name.clone())); + let lambda_acc_type_str = if is_bare_container { "_".to_string() } else { acc_type_str.clone() }; -let acc_has_unit_child = ({ let mut __found = false; for c in acc_type_node.children.clone().iter().cloned() { if (is_unit_like(&c) || (c.ident_span.clone() == None)) { __found = true; break; } } __found } || { let mut __found = false; for c in acc_type_node.children.clone().iter().cloned() { if { let mut __found = false; for gc in c.children.clone().iter().cloned() { if (is_unit_like(&gc) || (gc.ident_span.clone() == None)) { __found = true; break; } } __found } { __found = true; break; } } __found }); -let init_str = match args.clone().first().cloned() { - Some(init_arg) => match (*arg_value(&init_arg).expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { - let init_func = expr_call_func_at(arg_value(&init_arg), scope.type_env.clone().source_indices.clone()); -if ((((init_func.clone().as_str() == "empty_map".to_string().as_str()) && (acc_type_str.clone().as_str() != "_".to_string().as_str())) && (acc_type_str.clone().as_str() != "".to_string().as_str())) && !acc_has_unit_child) { - { - let kv_type_str = rust_empty_map_kv_type_str(&acc_type_node, &shared_types, &scope.type_env.clone().source_indices.clone()); -if (kv_type_str.clone().as_str() != "".to_string().as_str()) { - v2_rt::concat(v2_rt::concat("v2_rt::rc_empty_map::<".to_string(), kv_type_str.clone()), ">()".to_string()) - } else { - "Rc::new(HashMap::new()) /* BRIDGE: fold empty_map value type unresolved */".to_string() + let acc_has_unit_child = ({ + let mut __found = false; + for c in acc_type_node.children.clone().iter().cloned() { + if (is_unit_like(&c) || (c.ident_span.clone() == None)) { + __found = true; + break; + } + } + __found + } || { + let mut __found = false; + for c in acc_type_node.children.clone().iter().cloned() { + if { + let mut __found = false; + for gc in c.children.clone().iter().cloned() { + if (is_unit_like(&gc) || (gc.ident_span.clone() == None)) { + __found = true; + break; + } } -} - } else { - if (init_func.clone().as_str() == "empty_map".to_string().as_str()) { - "Rc::new(HashMap::new()) /* BRIDGE: fold empty_map accumulator type unresolved */".to_string() - } else { - emit_typed_expr(arg_value(&init_arg), registry.clone(), &scope, depth.clone(), shared_types.clone(), fold_emit_info.clone(), 1024) + __found + } { + __found = true; + break; } } -}, - _ => emit_typed_expr(arg_value(&init_arg), registry.clone(), &scope, depth.clone(), shared_types.clone(), fold_emit_info.clone(), 1024), -}, - None => "compile_error!(\"missing fold init argument\")".to_string(), -}; -let fold_fn = match args.clone().get(1 as usize).cloned() { - Some(a) => emit_typed_fold_lambda(&arg_value(&a), &lambda_acc_type_str, elem_type_str, registry.clone(), &scope, depth.clone(), &shared_types, &fold_emit_info), - None => "compile_error!(\"missing fold function argument\")".to_string(), -}; -let sharing = language_spec(RenderTarget::Rust).sharing.clone(); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(apply_type_template1(sharing.iter_owned.clone(), recv_str), ".fold(".to_string()), init_str), ", ".to_string()), fold_fn), ")".to_string()) -} + __found + }); + let init_str = match args.clone().first().cloned() { + Some(init_arg) => match (*arg_value(&init_arg).expr_data.clone()).clone() { + ExprData::ExprCall { .. } => { + let init_func = expr_call_func_at( + arg_value(&init_arg), + scope.type_env.clone().source_indices.clone(), + ); + if ((((init_func.clone().as_str() == "empty_map".to_string().as_str()) + && (acc_type_str.clone().as_str() != "_".to_string().as_str())) + && (acc_type_str.clone().as_str() != "".to_string().as_str())) + && !acc_has_unit_child) + { + { + let kv_type_str = rust_empty_map_kv_type_str( + &acc_type_node, + &shared_types, + &scope.type_env.clone().source_indices.clone(), + ); + if (kv_type_str.clone().as_str() != "".to_string().as_str()) { + v2_rt::concat( + v2_rt::concat( + "v2_rt::rc_empty_map::<".to_string(), + kv_type_str.clone(), + ), + ">()".to_string(), + ) + } else { + "Rc::new(HashMap::new()) /* BRIDGE: fold empty_map value type unresolved */".to_string() + } + } + } else { + if (init_func.clone().as_str() == "empty_map".to_string().as_str()) { + "Rc::new(HashMap::new()) /* BRIDGE: fold empty_map accumulator type unresolved */".to_string() + } else { + emit_typed_expr( + arg_value(&init_arg), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + fold_emit_info.clone(), + 1024, + ) + } + } + } + _ => emit_typed_expr( + arg_value(&init_arg), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + fold_emit_info.clone(), + 1024, + ), + }, + None => "compile_error!(\"missing fold init argument\")".to_string(), + }; + let fold_fn = match args.clone().get(1 as usize).cloned() { + Some(a) => emit_typed_fold_lambda( + &arg_value(&a), + &lambda_acc_type_str, + elem_type_str, + registry.clone(), + &scope, + depth.clone(), + &shared_types, + &fold_emit_info, + ), + None => "compile_error!(\"missing fold function argument\")".to_string(), + }; + let sharing = language_spec(RenderTarget::Rust).sharing.clone(); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + apply_type_template1(sharing.iter_owned.clone(), recv_str), + ".fold(".to_string(), + ), + init_str, + ), + ", ".to_string(), + ), + fold_fn, + ), + ")".to_string(), + ) + } } -pub fn emit_rust_sort_by_method_call(receiver: &Rc, args: Rc>>, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { +pub fn emit_rust_sort_by_method_call( + receiver: &Rc, + args: Rc>>, + registry: &Rc>>, + scope: &Rc, + depth: i64, + shared_types: &Rc>, + emit_info: &Rc, +) -> String { { - let recv_str = emit_typed_expr(receiver.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -let elem_type_str = match receiver.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - let resolved = rt.clone(); -let elem = for_each_element_type_node(resolved, scope.type_env.clone().source_indices.clone()); -let elem_is_type_var = if (elem.inferred.clone() != None) { - is_type_variable(elem.inferred.clone().clone().unwrap()) - } else { - false - }; -if ((elem.ident_span.clone() != None) && !elem_is_type_var) { - render_rust_type(elem.clone(), shared_types.clone(), scope.type_env.clone().source_indices.clone()) - } else { - "_".to_string() + let recv_str = emit_typed_expr( + receiver.clone(), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + let elem_type_str = match receiver.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => { + let resolved = rt.clone(); + let elem = for_each_element_type_node( + resolved, + scope.type_env.clone().source_indices.clone(), + ); + let elem_is_type_var = if (elem.inferred.clone() != None) { + is_type_variable(elem.inferred.clone().clone().unwrap()) + } else { + false + }; + if ((elem.ident_span.clone() != None) && !elem_is_type_var) { + render_rust_type( + elem.clone(), + shared_types.clone(), + scope.type_env.clone().source_indices.clone(), + ) + } else { + "_".to_string() + } } -}, - _ => "_".to_string(), -}; -let sort_key_fn = match args.first().cloned() { - Some(a) => emit_typed_collection_lambda(&arg_value(&a), elem_type_str.clone(), registry.clone(), &scope, depth.clone(), &shared_types, emit_info.clone()), - None => "compile_error!(\"missing sort_by key function argument\")".to_string(), -}; -let sharing = language_spec(RenderTarget::Rust).sharing.clone(); -let iter_str = apply_type_template1(sharing.iter_owned.clone(), recv_str); -let a_clone = apply_type_template1(sharing.clone_value.clone(), "a".to_string()); -let b_clone = apply_type_template1(sharing.clone_value.clone(), "b".to_string()); -if (elem_type_str.clone().as_str() == "_".to_string().as_str()) { + _ => "_".to_string(), + }; + let sort_key_fn = match args.first().cloned() { + Some(a) => emit_typed_collection_lambda( + &arg_value(&a), + elem_type_str.clone(), + registry.clone(), + &scope, + depth.clone(), + &shared_types, + emit_info.clone(), + ), + None => "compile_error!(\"missing sort_by key function argument\")".to_string(), + }; + let sharing = language_spec(RenderTarget::Rust).sharing.clone(); + let iter_str = apply_type_template1(sharing.iter_owned.clone(), recv_str); + let a_clone = apply_type_template1(sharing.clone_value.clone(), "a".to_string()); + let b_clone = apply_type_template1(sharing.clone_value.clone(), "b".to_string()); + if (elem_type_str.clone().as_str() == "_".to_string().as_str()) { v2_rt::concat(v2_rt::concat("Rc::new({ let mut __sorted: Vec<_> = ".to_string(), iter_str), ".collect(); __sorted.sort_by(|a, b| { a.partial_cmp(b).unwrap_or(std::cmp::Ordering::Equal) }); __sorted })".to_string()) } else { v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("Rc::new({ let mut __sorted: Vec<_> = ".to_string(), iter_str), ".collect(); __sorted.sort_by(|a: &".to_string()), elem_type_str.clone()), ", b: &".to_string()), elem_type_str.clone()), "| { let __ka = (".to_string()), sort_key_fn.clone()), ")(".to_string()), a_clone), "); let __kb = (".to_string()), sort_key_fn.clone()), ")(".to_string()), b_clone), "); __ka.partial_cmp(&__kb).unwrap_or(std::cmp::Ordering::Equal) }); __sorted })".to_string()) } -} + } } -pub fn emit_rust_map_method_call(receiver: &Rc, args: &Rc>>, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { +pub fn emit_rust_map_method_call( + receiver: &Rc, + args: &Rc>>, + registry: &Rc>>, + scope: &Rc, + depth: i64, + shared_types: &Rc>, + emit_info: &Rc, +) -> String { { - let recv_str = emit_typed_expr(receiver.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -let first_arg_str = emit_typed_first_arg(args.clone(), registry.clone(), scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone()); -let recv_is_optional = match receiver.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => (rt.return_cardinality.clone() == Cardinality::CardOptional), - _ => false, -}; -if recv_is_optional { + let recv_str = emit_typed_expr( + receiver.clone(), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + let first_arg_str = emit_typed_first_arg( + args.clone(), + registry.clone(), + scope.clone(), + depth.clone(), + shared_types.clone(), + emit_info.clone(), + ); + let recv_is_optional = match receiver.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => { + (rt.return_cardinality.clone() == Cardinality::CardOptional) + } + _ => false, + }; + if recv_is_optional { match args.clone().first().cloned() { - Some(a) => match (*arg_value(&a).expr_data.clone()).clone() { - ExprData::ExprLambda => { - let bd = match arg_value(&a).children.clone().first().cloned() { - Some(v) => v.clone(), - None => arg_value(&a), -}; -let ps = lambda_param_names_at(arg_value(&a), scope.type_env.clone().source_indices.clone()); -let dag_name = match ps.clone().first().cloned() { - Some(n) => n.clone(), - None => "__x".to_string(), -}; -let p = emit_ident(dag_name, RenderTarget::Rust); -let lambda_scope = lambda_scope_from_children(scope.clone(), ps.clone(), Rc::new(arg_value(&a).children.clone().iter().cloned().skip(1 as usize).collect::>())); -let body_str = emit_typed_expr(bd, registry.clone(), &lambda_scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(recv_str, ".map(|".to_string()), p), "| ".to_string()), body_str), ")".to_string()) -}, - _ => v2_rt::concat(v2_rt::concat(v2_rt::concat(recv_str, ".map(".to_string()), first_arg_str), ")".to_string()), -}, - None => v2_rt::concat(v2_rt::concat(v2_rt::concat(recv_str, ".map(".to_string()), first_arg_str), ")".to_string()), -} + Some(a) => match (*arg_value(&a).expr_data.clone()).clone() { + ExprData::ExprLambda => { + let bd = match arg_value(&a).children.clone().first().cloned() { + Some(v) => v.clone(), + None => arg_value(&a), + }; + let ps = lambda_param_names_at( + arg_value(&a), + scope.type_env.clone().source_indices.clone(), + ); + let dag_name = match ps.clone().first().cloned() { + Some(n) => n.clone(), + None => "__x".to_string(), + }; + let p = emit_ident(dag_name, RenderTarget::Rust); + let lambda_scope = lambda_scope_from_children( + scope.clone(), + ps.clone(), + Rc::new( + arg_value(&a) + .children + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + ); + let body_str = emit_typed_expr( + bd, + registry.clone(), + &lambda_scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(v2_rt::concat(recv_str, ".map(|".to_string()), p), + "| ".to_string(), + ), + body_str, + ), + ")".to_string(), + ) + } + _ => v2_rt::concat( + v2_rt::concat(v2_rt::concat(recv_str, ".map(".to_string()), first_arg_str), + ")".to_string(), + ), + }, + None => v2_rt::concat( + v2_rt::concat(v2_rt::concat(recv_str, ".map(".to_string()), first_arg_str), + ")".to_string(), + ), + } } else { { let sharing = language_spec(RenderTarget::Rust).sharing.clone(); -let iter_str = apply_type_template1(sharing.iter_owned.clone(), recv_str); -match args.clone().first().cloned() { - Some(a) => match (*arg_value(&a).expr_data.clone()).clone() { - ExprData::ExprLambda => { - let bd = match arg_value(&a).children.clone().first().cloned() { - Some(v) => v.clone(), - None => arg_value(&a), -}; -let ps = lambda_param_names_at(arg_value(&a), scope.type_env.clone().source_indices.clone()); -let dag_name = match ps.clone().first().cloned() { - Some(n) => n.clone(), - None => "__x".to_string(), -}; -let p = emit_ident(dag_name, RenderTarget::Rust); -let lambda_scope = lambda_scope_from_children(scope.clone(), ps.clone(), Rc::new(arg_value(&a).children.clone().iter().cloned().skip(1 as usize).collect::>())); -let body_str = emit_typed_expr(bd, registry.clone(), &lambda_scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("Rc::new({ let mut __result = Vec::new(); for ".to_string(), p), " in ".to_string()), iter_str), " { __result.push(".to_string()), body_str), "); } __result })".to_string()) -}, - _ => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), iter_str), ".map(".to_string()), first_arg_str), ").collect::>())".to_string()), -}, - None => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), iter_str), ".map(".to_string()), first_arg_str), ").collect::>())".to_string()), -} -} + let iter_str = apply_type_template1(sharing.iter_owned.clone(), recv_str); + match args.clone().first().cloned() { + Some(a) => { + match (*arg_value(&a).expr_data.clone()).clone() { + ExprData::ExprLambda => { + let bd = match arg_value(&a).children.clone().first().cloned() { + Some(v) => v.clone(), + None => arg_value(&a), + }; + let ps = lambda_param_names_at( + arg_value(&a), + scope.type_env.clone().source_indices.clone(), + ); + let dag_name = match ps.clone().first().cloned() { + Some(n) => n.clone(), + None => "__x".to_string(), + }; + let p = emit_ident(dag_name, RenderTarget::Rust); + let lambda_scope = lambda_scope_from_children( + scope.clone(), + ps.clone(), + Rc::new( + arg_value(&a) + .children + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + ); + let body_str = emit_typed_expr( + bd, + registry.clone(), + &lambda_scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("Rc::new({ let mut __result = Vec::new(); for ".to_string(), p), " in ".to_string()), iter_str), " { __result.push(".to_string()), body_str), "); } __result })".to_string()) + } + _ => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("Rc::new(".to_string(), iter_str), + ".map(".to_string(), + ), + first_arg_str, + ), + ").collect::>())".to_string(), + ), + } + } + None => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("Rc::new(".to_string(), iter_str), + ".map(".to_string(), + ), + first_arg_str, + ), + ").collect::>())".to_string(), + ), + } + } } -} + } } -pub fn emit_rust_higher_order_method(ho_spec: &Rc, receiver: Rc, args: &Rc>>, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { +pub fn emit_rust_higher_order_method( + ho_spec: &Rc, + receiver: Rc, + args: &Rc>>, + registry: &Rc>>, + scope: &Rc, + depth: i64, + shared_types: &Rc>, + emit_info: &Rc, +) -> String { { let sharing = language_spec(RenderTarget::Rust).sharing.clone(); -let recv_str = emit_typed_expr(receiver, registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -let first_arg_str = emit_typed_first_arg(args.clone(), registry.clone(), scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone()); -let iter_str = apply_type_template1(sharing.iter_owned.clone(), recv_str); -match args.clone().first().cloned() { - Some(a) => match (*arg_value(&a).expr_data.clone()).clone() { - ExprData::ExprLambda => { - let bd = match arg_value(&a).children.clone().first().cloned() { - Some(v) => v.clone(), - None => arg_value(&a), -}; -let ps = lambda_param_names_at(arg_value(&a), scope.type_env.clone().source_indices.clone()); -let dag_name = match ps.clone().first().cloned() { - Some(n) => n.clone(), - None => "__x".to_string(), -}; -let p = emit_ident(dag_name, RenderTarget::Rust); -let lambda_scope = lambda_scope_from_children(scope.clone(), ps.clone(), Rc::new(arg_value(&a).children.clone().iter().cloned().skip(1 as usize).collect::>())); -let body_str = emit_typed_expr(bd, registry.clone(), &lambda_scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -let inner_iter = apply_type_template1(sharing.iter_owned.clone(), v2_rt::concat(v2_rt::concat("(*".to_string(), body_str.clone()), ")".to_string())); -let bindings = v2_rt::rc_map_insert(v2_rt::rc_map_insert(v2_rt::rc_map_insert(seed_bindings("param".to_string(), p), "body".to_string(), body_str.clone()), "iter".to_string(), iter_str), "inner_iter".to_string(), inner_iter); -let raw = apply_named_template(ho_spec.inline_template.clone(), &bindings); -if ho_spec.wraps_in_sharing.clone() { - v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), raw), ")".to_string()) - } else { - raw - } -}, - _ => { - let bindings = v2_rt::rc_map_insert(seed_bindings("iter".to_string(), iter_str), "arg".to_string(), first_arg_str); -let raw = apply_named_template(ho_spec.fn_ref_template.clone(), &bindings); -if ho_spec.wraps_in_sharing.clone() { - v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), raw), ")".to_string()) - } else { - raw - } -}, -}, - None => { - let bindings = v2_rt::rc_map_insert(seed_bindings("iter".to_string(), iter_str), "arg".to_string(), first_arg_str); -let raw = apply_named_template(ho_spec.fn_ref_template.clone(), &bindings); -if ho_spec.wraps_in_sharing.clone() { - v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), raw), ")".to_string()) - } else { - raw + let recv_str = emit_typed_expr( + receiver, + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + let first_arg_str = emit_typed_first_arg( + args.clone(), + registry.clone(), + scope.clone(), + depth.clone(), + shared_types.clone(), + emit_info.clone(), + ); + let iter_str = apply_type_template1(sharing.iter_owned.clone(), recv_str); + match args.clone().first().cloned() { + Some(a) => match (*arg_value(&a).expr_data.clone()).clone() { + ExprData::ExprLambda => { + let bd = match arg_value(&a).children.clone().first().cloned() { + Some(v) => v.clone(), + None => arg_value(&a), + }; + let ps = lambda_param_names_at( + arg_value(&a), + scope.type_env.clone().source_indices.clone(), + ); + let dag_name = match ps.clone().first().cloned() { + Some(n) => n.clone(), + None => "__x".to_string(), + }; + let p = emit_ident(dag_name, RenderTarget::Rust); + let lambda_scope = lambda_scope_from_children( + scope.clone(), + ps.clone(), + Rc::new( + arg_value(&a) + .children + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + ); + let body_str = emit_typed_expr( + bd, + registry.clone(), + &lambda_scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + let inner_iter = apply_type_template1( + sharing.iter_owned.clone(), + v2_rt::concat( + v2_rt::concat("(*".to_string(), body_str.clone()), + ")".to_string(), + ), + ); + let bindings = v2_rt::rc_map_insert( + v2_rt::rc_map_insert( + v2_rt::rc_map_insert( + seed_bindings("param".to_string(), p), + "body".to_string(), + body_str.clone(), + ), + "iter".to_string(), + iter_str, + ), + "inner_iter".to_string(), + inner_iter, + ); + let raw = apply_named_template(ho_spec.inline_template.clone(), &bindings); + if ho_spec.wraps_in_sharing.clone() { + v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), raw), ")".to_string()) + } else { + raw + } + } + _ => { + let bindings = v2_rt::rc_map_insert( + seed_bindings("iter".to_string(), iter_str), + "arg".to_string(), + first_arg_str, + ); + let raw = apply_named_template(ho_spec.fn_ref_template.clone(), &bindings); + if ho_spec.wraps_in_sharing.clone() { + v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), raw), ")".to_string()) + } else { + raw + } + } + }, + None => { + let bindings = v2_rt::rc_map_insert( + seed_bindings("iter".to_string(), iter_str), + "arg".to_string(), + first_arg_str, + ); + let raw = apply_named_template(ho_spec.fn_ref_template.clone(), &bindings); + if ho_spec.wraps_in_sharing.clone() { + v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), raw), ")".to_string()) + } else { + raw + } } -}, -} -} + } + } } -pub fn emit_rust_get_method_call(receiver: &Rc, args: Rc>>, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { +pub fn emit_rust_get_method_call( + receiver: &Rc, + args: Rc>>, + registry: &Rc>>, + scope: &Rc, + depth: i64, + shared_types: &Rc>, + emit_info: &Rc, +) -> String { { - let recv_str = emit_typed_expr(receiver.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -let index_str = match args.first().cloned() { - Some(a) => emit_typed_expr(arg_value(&a), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024), - None => "compile_error!(\"get method missing index\")".to_string(), -}; -let receiver_resolved = match receiver.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { .. }) => true, - _ => false, -}; -if is_map_typed_expr(receiver.clone(), scope.type_env.clone().source_indices.clone()) { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("v2_rt::map_get(&".to_string(), recv_str), ", ".to_string()), index_str), ")".to_string()) + let recv_str = emit_typed_expr( + receiver.clone(), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + let index_str = match args.first().cloned() { + Some(a) => emit_typed_expr( + arg_value(&a), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ), + None => "compile_error!(\"get method missing index\")".to_string(), + }; + let receiver_resolved = match receiver.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { .. }) => true, + _ => false, + }; + if is_map_typed_expr( + receiver.clone(), + scope.type_env.clone().source_indices.clone(), + ) { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("v2_rt::map_get(&".to_string(), recv_str), + ", ".to_string(), + ), + index_str, + ), + ")".to_string(), + ) } else { if receiver_resolved { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(recv_str, ".get((".to_string()), index_str), ") as usize)".to_string()), clone_iterator_suffix()) + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(v2_rt::concat(recv_str, ".get((".to_string()), index_str), + ") as usize)".to_string(), + ), + clone_iterator_suffix(), + ) } else { "compile_error!(\"get: receiver type unresolved\")".to_string() } } -} + } } -pub fn emit_rust_with_method_call(receiver: &Rc, args: &Rc>>, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { +pub fn emit_rust_with_method_call( + receiver: &Rc, + args: &Rc>>, + registry: &Rc>>, + scope: &Rc, + depth: i64, + shared_types: &Rc>, + emit_info: &Rc, +) -> String { { - let base_str = emit_typed_expr(receiver.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -let type_name = match receiver.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - let rt_is_error = if (rt.inferred.clone() != None) { - is_compiler_error(rt.inferred.clone().clone().unwrap()) - } else { - false - }; -if (rt_is_error || (rt.ident_span.clone() == None)) { - "compile_error!(\"with method missing resolved record type\")".to_string() - } else { - authored_name_at(scope.type_env.clone().source_indices.clone(), &rt) + let base_str = emit_typed_expr( + receiver.clone(), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + let type_name = match receiver.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => { + let rt_is_error = if (rt.inferred.clone() != None) { + is_compiler_error(rt.inferred.clone().clone().unwrap()) + } else { + false + }; + if (rt_is_error || (rt.ident_span.clone() == None)) { + "compile_error!(\"with method missing resolved record type\")".to_string() + } else { + authored_name_at(scope.type_env.clone().source_indices.clone(), &rt) + } } -}, - _ => "compile_error!(\"with method missing resolved record type\")".to_string(), -}; -if ((args.clone().len() as i64) == 0) { - return "compile_error!(\"with method missing update record\")".to_string() + _ => "compile_error!(\"with method missing resolved record type\")".to_string(), + }; + if ((args.clone().len() as i64) == 0) { + return "compile_error!(\"with method missing update record\")".to_string(); } -let update_arg = arg_value(&args.clone().first().cloned().clone().unwrap()); -let field_strs = match (*update_arg.expr_data.clone()).clone() { - ExprData::ExprRecordLit { .. } => Rc::new({ let mut __result = Vec::new(); for f in update_arg.children.clone().iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(emit_ident(field_init_node_name_at(f.clone(), scope.type_env.clone().source_indices.clone()), RenderTarget::Rust), ": ".to_string()), emit_typed_expr(field_init_node_value(&f), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024))); } __result }), - _ => Rc::new(vec![emit_typed_expr(update_arg.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024)]), -}; -let fields_str = field_strs.join(&", ".to_string()); -let needs_rc = emit_map_has(shared_types.clone(), type_name.clone()); -let sharing = language_spec(RenderTarget::Rust).sharing.clone(); -let spread = if needs_rc.clone() { + let update_arg = arg_value(&args.clone().first().cloned().clone().unwrap()); + let field_strs = match (*update_arg.expr_data.clone()).clone() { + ExprData::ExprRecordLit { .. } => Rc::new({ + let mut __result = Vec::new(); + for f in update_arg.children.clone().iter().cloned() { + __result.push(v2_rt::concat( + v2_rt::concat( + emit_ident( + field_init_node_name_at( + f.clone(), + scope.type_env.clone().source_indices.clone(), + ), + RenderTarget::Rust, + ), + ": ".to_string(), + ), + emit_typed_expr( + field_init_node_value(&f), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ), + )); + } + __result + }), + _ => Rc::new(vec![emit_typed_expr( + update_arg.clone(), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + )]), + }; + let fields_str = field_strs.join(&", ".to_string()); + let needs_rc = emit_map_has(shared_types.clone(), type_name.clone()); + let sharing = language_spec(RenderTarget::Rust).sharing.clone(); + let spread = if needs_rc.clone() { apply_type_template1(sharing.deref_clone.clone(), base_str) } else { apply_type_template1(sharing.clone_value.clone(), base_str) }; -let raw = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(type_name.clone(), " { ".to_string()), fields_str), ", ..".to_string()), spread), " }".to_string()); -if needs_rc.clone() { + let raw = v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(type_name.clone(), " { ".to_string()), + fields_str, + ), + ", ..".to_string(), + ), + spread, + ), + " }".to_string(), + ); + if needs_rc.clone() { v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), raw), ")".to_string()) } else { raw } -} + } } -pub fn emit_rust_first_method_call(receiver: &Rc, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { +pub fn emit_rust_first_method_call( + receiver: &Rc, + registry: &Rc>>, + scope: &Rc, + depth: i64, + shared_types: &Rc>, + emit_info: &Rc, +) -> String { match (*receiver.expr_data.clone()).clone() { - ExprData::ExprMethodCall { .. } => if (expr_method_name_at(receiver.clone(), scope.type_env.clone().source_indices.clone()).as_str() == "skip".to_string().as_str()) { - { - let skip_recv = method_receiver(receiver.clone()); -let skip_args = method_arg_nodes(receiver.clone()); -let recv_str = emit_typed_expr(skip_recv, registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -let arg_str = emit_typed_first_arg(skip_args, registry.clone(), scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(recv_str, ".get(".to_string()), arg_str), " as usize).cloned()".to_string()) -} - } else { - { - let recv_str = emit_typed_expr(receiver.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -v2_rt::concat(recv_str, ".first().cloned()".to_string()) -} - }, - _ => { - let recv_str = emit_typed_expr(receiver.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -v2_rt::concat(recv_str, ".first().cloned()".to_string()) -}, -} + ExprData::ExprMethodCall { .. } => { + if (expr_method_name_at( + receiver.clone(), + scope.type_env.clone().source_indices.clone(), + ) + .as_str() + == "skip".to_string().as_str()) + { + { + let skip_recv = method_receiver(receiver.clone()); + let skip_args = method_arg_nodes(receiver.clone()); + let recv_str = emit_typed_expr( + skip_recv, + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + let arg_str = emit_typed_first_arg( + skip_args, + registry.clone(), + scope.clone(), + depth.clone(), + shared_types.clone(), + emit_info.clone(), + ); + v2_rt::concat( + v2_rt::concat(v2_rt::concat(recv_str, ".get(".to_string()), arg_str), + " as usize).cloned()".to_string(), + ) + } + } else { + { + let recv_str = emit_typed_expr( + receiver.clone(), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + v2_rt::concat(recv_str, ".first().cloned()".to_string()) + } + } + } + _ => { + let recv_str = emit_typed_expr( + receiver.clone(), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + v2_rt::concat(recv_str, ".first().cloned()".to_string()) + } + } } -pub fn emit_rust_generic_method_call(method_name: String, receiver: Rc, args: Rc>>, result_type: Option>, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { +pub fn emit_rust_generic_method_call( + method_name: String, + receiver: Rc, + args: Rc>>, + result_type: Option>, + registry: &Rc>>, + scope: &Rc, + depth: i64, + shared_types: &Rc>, + emit_info: &Rc, +) -> String { { let function_name = method_name; -let recv_str = if rust_runtime_bridge_passes_receiver_by_ref(function_name.clone()) { - v2_rt::concat("&".to_string(), emit_typed_expr_base(&receiver, registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone())) - } else { - emit_cloned_arg(receiver, registry.clone(), scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone()) + let recv_str = if rust_runtime_bridge_passes_receiver_by_ref(function_name.clone()) { + v2_rt::concat( + "&".to_string(), + emit_typed_expr_base( + &receiver, + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + ), + ) + } else { + emit_cloned_arg( + receiver, + registry.clone(), + scope.clone(), + depth.clone(), + shared_types.clone(), + emit_info.clone(), + ) }; -let arg_strs = Rc::new({ let mut __result = Vec::new(); for a in args.iter().cloned() { __result.push(emit_cloned_arg(arg_value(&a), registry.clone(), scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone())); } __result }); -let all_strs = v2_rt::concat(Rc::new(vec![recv_str]), arg_strs); -let bridge_name = rust_runtime_bridge_name(function_name.clone()); -let lowered = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("v2_rt::".to_string(), emit_ident(bridge_name, RenderTarget::Rust)), "(".to_string()), all_strs.join(&", ".to_string())), ")".to_string()); -if rust_runtime_bridge_wraps_collection_result_in_rc(&function_name) { - v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), lowered), ")".to_string()) + let arg_strs = Rc::new({ + let mut __result = Vec::new(); + for a in args.iter().cloned() { + __result.push(emit_cloned_arg( + arg_value(&a), + registry.clone(), + scope.clone(), + depth.clone(), + shared_types.clone(), + emit_info.clone(), + )); + } + __result + }); + let all_strs = v2_rt::concat(Rc::new(vec![recv_str]), arg_strs); + let bridge_name = rust_runtime_bridge_name(function_name.clone()); + let lowered = v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "v2_rt::".to_string(), + emit_ident(bridge_name, RenderTarget::Rust), + ), + "(".to_string(), + ), + all_strs.join(&", ".to_string()), + ), + ")".to_string(), + ); + if rust_runtime_bridge_wraps_collection_result_in_rc(&function_name) { + v2_rt::concat( + v2_rt::concat("Rc::new(".to_string(), lowered), + ")".to_string(), + ) } else { lowered } -} + } } -pub fn emit_typed_method_call(method_call_node: Rc, receiver: &Rc, method: String, args: &Rc>>, result_type: Option>, method_semantics: &Option>, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { +pub fn emit_typed_method_call( + method_call_node: Rc, + receiver: &Rc, + method: String, + args: &Rc>>, + result_type: Option>, + method_semantics: &Option>, + registry: &Rc>>, + scope: &Rc, + depth: i64, + shared_types: &Rc>, + emit_info: &Rc, +) -> String { if (method_semantics.clone() != None) { match (*method_semantics.clone().unwrap()).clone() { - MethodSemantics::ServiceMethodSemantics { service_name: svc_name, op_params, .. } => { - let var_name = service_var_name(svc_name.clone()); -let si = scope.type_env.clone().source_indices.clone(); -let filled_args = fill_op_default_args(&args, op_params.clone(), registry.clone(), scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone()); -let optional_param_set = Rc::new({ let mut __result = Vec::new(); for p in op_params.clone().iter().cloned() { if (param_node_type_expr(&p).return_cardinality.clone() == Cardinality::CardOptional) { __result.push(p); } } __result }).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, p: Rc| v2_rt::rc_map_insert(acc, param_node_name_at(p.clone(), si.clone()), true)); -let json_param_set = Rc::new({ let mut __result = Vec::new(); for p in op_params.clone().iter().cloned() { if (coerce_primitive_type(RenderTarget::Rust, authored_name_at(si.clone(), ¶m_node_type_expr(&p))).as_str() == "serde_json::Value".to_string().as_str()) { __result.push(p); } } __result }).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, p: Rc| v2_rt::rc_map_insert(acc, param_node_name_at(p.clone(), si.clone()), true)); -let arg_strs = Rc::new({ let mut __result = Vec::new(); for a in filled_args.iter().cloned() { __result.push({ - let arg_str = emit_typed_expr(arg_value(&a), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -let aname = match arg_name_at(a.clone(), si.clone()) { - Some(n) => n.clone(), - None => "".to_string(), -}; -let param_is_json = match v2_rt::map_get(&json_param_set, aname.clone()) { - Some(_) => true, - None => false, -}; -let param_is_optional = match v2_rt::map_get(&optional_param_set, aname.clone()) { - Some(_) => true, - None => false, -}; -let needs_optional = (param_is_optional.clone() && (is_already_optional(&arg_value(&a), emit_info.clone(), &scope) == false)); -let coerced = if (param_is_json.clone() && is_string_typed_expr(arg_value(&a), si.clone())) { - v2_rt::concat(v2_rt::concat("serde_json::from_str(&".to_string(), arg_str.clone()), ").unwrap()".to_string()) - } else { - arg_str.clone() - }; -if needs_optional.clone() { - v2_rt::concat(v2_rt::concat("Some(".to_string(), coerced.clone()), ")".to_string()) - } else { - coerced.clone() - } -}); } __result }); -let args_str = arg_strs.join(&", ".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(var_name, ".".to_string()), emit_ident(method, RenderTarget::Rust)), "(".to_string()), args_str), ").await?".to_string()) -}, - MethodSemantics::AlgebraMethodSemantics { method_def, fold_accumulator_type, .. } => { - let method_name = authored_name_at(scope.type_env.clone().source_indices.clone(), &method_def); -if (method_name.clone().as_str() == "fold".to_string().as_str()) { - emit_rust_fold_method_call(method_call_node, fold_accumulator_type.clone(), result_type, &receiver, &args, ®istry, &scope, depth.clone(), &shared_types, &emit_info) - } else { - if (method_name.clone().as_str() == "sort_by".to_string().as_str()) { - emit_rust_sort_by_method_call(&receiver, args.clone(), ®istry, &scope, depth.clone(), &shared_types, &emit_info) + MethodSemantics::ServiceMethodSemantics { + service_name: svc_name, + op_params, + .. + } => { + let var_name = service_var_name(svc_name.clone()); + let si = scope.type_env.clone().source_indices.clone(); + let filled_args = fill_op_default_args( + &args, + op_params.clone(), + registry.clone(), + scope.clone(), + depth.clone(), + shared_types.clone(), + emit_info.clone(), + ); + let optional_param_set = Rc::new({ + let mut __result = Vec::new(); + for p in op_params.clone().iter().cloned() { + if (param_node_type_expr(&p).return_cardinality.clone() + == Cardinality::CardOptional) + { + __result.push(p); + } + } + __result + }) + .iter() + .cloned() + .fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, p: Rc| { + v2_rt::rc_map_insert(acc, param_node_name_at(p.clone(), si.clone()), true) + }, + ); + let json_param_set = Rc::new({ + let mut __result = Vec::new(); + for p in op_params.clone().iter().cloned() { + if (coerce_primitive_type( + RenderTarget::Rust, + authored_name_at(si.clone(), ¶m_node_type_expr(&p)), + ) + .as_str() + == "serde_json::Value".to_string().as_str()) + { + __result.push(p); + } + } + __result + }) + .iter() + .cloned() + .fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, p: Rc| { + v2_rt::rc_map_insert(acc, param_node_name_at(p.clone(), si.clone()), true) + }, + ); + let arg_strs = Rc::new({ + let mut __result = Vec::new(); + for a in filled_args.iter().cloned() { + __result.push({ + let arg_str = emit_typed_expr( + arg_value(&a), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + let aname = match arg_name_at(a.clone(), si.clone()) { + Some(n) => n.clone(), + None => "".to_string(), + }; + let param_is_json = match v2_rt::map_get(&json_param_set, aname.clone()) + { + Some(_) => true, + None => false, + }; + let param_is_optional = + match v2_rt::map_get(&optional_param_set, aname.clone()) { + Some(_) => true, + None => false, + }; + let needs_optional = (param_is_optional.clone() + && (is_already_optional( + &arg_value(&a), + emit_info.clone(), + &scope, + ) == false)); + let coerced = if (param_is_json.clone() + && is_string_typed_expr(arg_value(&a), si.clone())) + { + v2_rt::concat( + v2_rt::concat( + "serde_json::from_str(&".to_string(), + arg_str.clone(), + ), + ").unwrap()".to_string(), + ) + } else { + arg_str.clone() + }; + if needs_optional.clone() { + v2_rt::concat( + v2_rt::concat("Some(".to_string(), coerced.clone()), + ")".to_string(), + ) + } else { + coerced.clone() + } + }); + } + __result + }); + let args_str = arg_strs.join(&", ".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(var_name, ".".to_string()), + emit_ident(method, RenderTarget::Rust), + ), + "(".to_string(), + ), + args_str, + ), + ").await?".to_string(), + ) + } + MethodSemantics::AlgebraMethodSemantics { + method_def, + fold_accumulator_type, + .. + } => { + let method_name = + authored_name_at(scope.type_env.clone().source_indices.clone(), &method_def); + if (method_name.clone().as_str() == "fold".to_string().as_str()) { + emit_rust_fold_method_call( + method_call_node, + fold_accumulator_type.clone(), + result_type, + &receiver, + &args, + ®istry, + &scope, + depth.clone(), + &shared_types, + &emit_info, + ) } else { - if (method_name.clone().as_str() == "map".to_string().as_str()) { - emit_rust_map_method_call(&receiver, &args, ®istry, &scope, depth.clone(), &shared_types, &emit_info) + if (method_name.clone().as_str() == "sort_by".to_string().as_str()) { + emit_rust_sort_by_method_call( + &receiver, + args.clone(), + ®istry, + &scope, + depth.clone(), + &shared_types, + &emit_info, + ) } else { - match Rc::new({ let mut __result = Vec::new(); for s in rust_higher_order_methods().iter().cloned() { if (s.method_name.clone().as_str() == method_name.clone().as_str()) { __result.push(s); } } __result }).first().cloned() { - Some(ho_spec) => emit_rust_higher_order_method(&ho_spec, receiver.clone(), &args, ®istry, &scope, depth.clone(), &shared_types, &emit_info), - None => if (method_name.clone().as_str() == "get".to_string().as_str()) { - emit_rust_get_method_call(&receiver, args.clone(), ®istry, &scope, depth.clone(), &shared_types, &emit_info) + if (method_name.clone().as_str() == "map".to_string().as_str()) { + emit_rust_map_method_call( + &receiver, + &args, + ®istry, + &scope, + depth.clone(), + &shared_types, + &emit_info, + ) } else { - if (method_name.clone().as_str() == "with".to_string().as_str()) { - emit_rust_with_method_call(&receiver, &args, ®istry, &scope, depth.clone(), &shared_types, &emit_info) - } else { - if (method_name.clone().as_str() == "string_contains".to_string().as_str()) { - emit_rust_generic_method_call("string_contains".to_string(), receiver.clone(), args.clone(), result_type, ®istry, &scope, depth.clone(), &shared_types, &emit_info) - } else { - if (method_name.clone().as_str() == "concat".to_string().as_str()) { - { - let recv_str = emit_typed_expr(receiver.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -let arg_strs = Rc::new({ let mut __result = Vec::new(); for a in args.clone().iter().cloned() { __result.push(emit_typed_expr(arg_value(&a), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024)); } __result }); -let all_arg_strs = v2_rt::concat(Rc::new(vec![recv_str]), arg_strs); -emit_nested_rt_concat(all_arg_strs, "".to_string(), shared_types.clone()) -} + match Rc::new({ + let mut __result = Vec::new(); + for s in rust_higher_order_methods().iter().cloned() { + if (s.method_name.clone().as_str() + == method_name.clone().as_str()) + { + __result.push(s); + } + } + __result + }) + .first() + .cloned() + { + Some(ho_spec) => emit_rust_higher_order_method( + &ho_spec, + receiver.clone(), + &args, + ®istry, + &scope, + depth.clone(), + &shared_types, + &emit_info, + ), + None => { + if (method_name.clone().as_str() == "get".to_string().as_str()) + { + emit_rust_get_method_call( + &receiver, + args.clone(), + ®istry, + &scope, + depth.clone(), + &shared_types, + &emit_info, + ) } else { - if (method_name.clone().as_str() == "first".to_string().as_str()) { - emit_rust_first_method_call(&receiver, ®istry, &scope, depth.clone(), &shared_types, &emit_info) + if (method_name.clone().as_str() + == "with".to_string().as_str()) + { + emit_rust_with_method_call( + &receiver, + &args, + ®istry, + &scope, + depth.clone(), + &shared_types, + &emit_info, + ) } else { + if (method_name.clone().as_str() + == "string_contains".to_string().as_str()) { - let recv_str = emit_typed_expr(receiver.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -let first_arg_str = emit_typed_first_arg(args.clone(), registry.clone(), scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone()); -let spec = language_spec(RenderTarget::Rust); -match spec.method_templates.clone() { + emit_rust_generic_method_call( + "string_contains".to_string(), + receiver.clone(), + args.clone(), + result_type, + ®istry, + &scope, + depth.clone(), + &shared_types, + &emit_info, + ) + } else { + if (method_name.clone().as_str() + == "concat".to_string().as_str()) + { + { + let recv_str = emit_typed_expr( + receiver.clone(), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + let arg_strs = Rc::new({ + let mut __result = Vec::new(); + for a in args.clone().iter().cloned() { + __result.push(emit_typed_expr( + arg_value(&a), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + )); + } + __result + }); + let all_arg_strs = v2_rt::concat( + Rc::new(vec![recv_str]), + arg_strs, + ); + emit_nested_rt_concat( + all_arg_strs, + "".to_string(), + shared_types.clone(), + ) + } + } else { + if (method_name.clone().as_str() + == "first".to_string().as_str()) + { + emit_rust_first_method_call( + &receiver, + ®istry, + &scope, + depth.clone(), + &shared_types, + &emit_info, + ) + } else { + { + let recv_str = emit_typed_expr( + receiver.clone(), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + let first_arg_str = + emit_typed_first_arg( + args.clone(), + registry.clone(), + scope.clone(), + depth.clone(), + shared_types.clone(), + emit_info.clone(), + ); + let spec = + language_spec(RenderTarget::Rust); + match spec.method_templates.clone() { Some(templates) => match v2_rt::map_get(&templates, method_name.clone()) { Some(tmpl) => { let bindings = v2_rt::rc_map_insert(seed_bindings("recv".to_string(), recv_str), "arg".to_string(), first_arg_str); @@ -3389,115 +8532,334 @@ if rust_runtime_bridge_wraps_collection_result_in_rc(&method_name) { }, None => emit_rust_generic_method_call(method_name.clone(), receiver.clone(), args.clone(), result_type, ®istry, &scope, depth.clone(), &shared_types, &emit_info), } -} + } + } + } + } } } } } - }, -} + } } } } -}, - MethodSemantics::PlainMethodSemantics => { - let recv_str = emit_typed_expr(receiver.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -let arg_strs = Rc::new({ let mut __result = Vec::new(); for a in args.clone().iter().cloned() { __result.push(emit_typed_expr(arg_value(&a), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024)); } __result }); -let args_str = arg_strs.join(&", ".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(recv_str, ".".to_string()), emit_ident(method, RenderTarget::Rust)), "(".to_string()), args_str), ")".to_string()) -}, -} + MethodSemantics::PlainMethodSemantics => { + let recv_str = emit_typed_expr( + receiver.clone(), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + let arg_strs = Rc::new({ + let mut __result = Vec::new(); + for a in args.clone().iter().cloned() { + __result.push(emit_typed_expr( + arg_value(&a), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + )); + } + __result + }); + let args_str = arg_strs.join(&", ".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(recv_str, ".".to_string()), + emit_ident(method, RenderTarget::Rust), + ), + "(".to_string(), + ), + args_str, + ), + ")".to_string(), + ) + } + } } else { "compile_error!(\"method call missing reconcile semantics\")".to_string() } } -pub fn emit_typed_first_arg(args: Rc>>, registry: Rc>>, scope: Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { +pub fn emit_typed_first_arg( + args: Rc>>, + registry: Rc>>, + scope: Rc, + depth: i64, + shared_types: Rc>, + emit_info: Rc, +) -> String { match args.first().cloned() { - Some(a) => emit_typed_expr(arg_value(&a), registry, &scope, depth, shared_types, emit_info, 1024), - None => "compile_error!(\"missing method argument\")".to_string(), -} + Some(a) => emit_typed_expr( + arg_value(&a), + registry, + &scope, + depth, + shared_types, + emit_info, + 1024, + ), + None => "compile_error!(\"missing method argument\")".to_string(), + } } -pub fn emit_typed_match(scrutinee: &Rc, arms: &Rc>>, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { +pub fn emit_typed_match( + scrutinee: &Rc, + arms: &Rc>>, + registry: &Rc>>, + scope: &Rc, + depth: i64, + shared_types: &Rc>, + emit_info: &Rc, +) -> String { { - let scrut_str = emit_typed_expr(scrutinee.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -let scrut_type = match scrutinee.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - let is_optional = (rt.return_cardinality.clone() == Cardinality::CardOptional); -if is_optional { - authored_name_at(scope.type_env.clone().source_indices.clone(), &with_required_cardinality(&rt)) - } else { - authored_name_at(scope.type_env.clone().source_indices.clone(), &rt) + let scrut_str = emit_typed_expr( + scrutinee.clone(), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + let scrut_type = match scrutinee.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => { + let is_optional = (rt.return_cardinality.clone() == Cardinality::CardOptional); + if is_optional { + authored_name_at( + scope.type_env.clone().source_indices.clone(), + &with_required_cardinality(&rt), + ) + } else { + authored_name_at(scope.type_env.clone().source_indices.clone(), &rt) + } } -}, - _ => "".to_string(), -}; -let rc_match = analyze_rc_match(&scrutinee, arms.clone(), scrut_type.clone(), &shared_types, emit_info.clone(), &scope.type_env.clone().source_indices.clone()); -let match_result_type = match arms.clone().first().cloned() { - Some(first_arm) => resolved_type(arm_body(&first_arm)), - None => type_variable_node("match_result".to_string()), -}; -let arm_strs = Rc::new({ let mut __result = Vec::new(); for arm in arms.clone().iter().cloned() { __result.push(emit_typed_match_arm(&arm, ®istry, &scope, depth.clone(), &shared_types, &emit_info, &scrut_type, match_result_type.clone(), false)); } __result }); -let arms_str = arm_strs.join(&"\n".to_string()); -let needs_as_str = (all_arms_are_string_lit(&arms) && ((arms.clone().len() as i64) > 0)); -let needs_string_from = has_string_lit_with_bind(&arms); -if rc_match.needs_option_deref.clone() { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("match ".to_string(), scrut_str), ".as_deref()".to_string()), clone_iterator_suffix()), " {\n".to_string()), arms_str), "\n}".to_string()) + _ => "".to_string(), + }; + let rc_match = analyze_rc_match( + &scrutinee, + arms.clone(), + scrut_type.clone(), + &shared_types, + emit_info.clone(), + &scope.type_env.clone().source_indices.clone(), + ); + let match_result_type = match arms.clone().first().cloned() { + Some(first_arm) => resolved_type(arm_body(&first_arm)), + None => type_variable_node("match_result".to_string()), + }; + let arm_strs = Rc::new({ + let mut __result = Vec::new(); + for arm in arms.clone().iter().cloned() { + __result.push(emit_typed_match_arm( + &arm, + ®istry, + &scope, + depth.clone(), + &shared_types, + &emit_info, + &scrut_type, + match_result_type.clone(), + false, + )); + } + __result + }); + let arms_str = arm_strs.join(&"\n".to_string()); + let needs_as_str = (all_arms_are_string_lit(&arms) && ((arms.clone().len() as i64) > 0)); + let needs_string_from = has_string_lit_with_bind(&arms); + if rc_match.needs_option_deref.clone() { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("match ".to_string(), scrut_str), + ".as_deref()".to_string(), + ), + clone_iterator_suffix(), + ), + " {\n".to_string(), + ), + arms_str, + ), + "\n}".to_string(), + ) } else { if rc_match.needs_deref.clone() { { let sharing = language_spec(RenderTarget::Rust).sharing.clone(); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("match ".to_string(), apply_type_template1(sharing.deref_clone.clone(), scrut_str)), " {\n".to_string()), arms_str), "\n}".to_string()) -} + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "match ".to_string(), + apply_type_template1(sharing.deref_clone.clone(), scrut_str), + ), + " {\n".to_string(), + ), + arms_str, + ), + "\n}".to_string(), + ) + } } else { if needs_as_str { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("match ".to_string(), scrut_str), ".as_str() {\n".to_string()), arms_str), "\n}".to_string()) + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("match ".to_string(), scrut_str), + ".as_str() {\n".to_string(), + ), + arms_str, + ), + "\n}".to_string(), + ) } else { if needs_string_from { { - let sf_arm_strs = Rc::new({ let mut __result = Vec::new(); for arm in arms.clone().iter().cloned() { __result.push(emit_typed_match_arm(&arm, ®istry, &scope, depth.clone(), &shared_types, &emit_info, &scrut_type, match_result_type.clone(), true)); } __result }); -let sf_arms_str = sf_arm_strs.join(&"\n".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("match ".to_string(), scrut_str), " {\n".to_string()), sf_arms_str), "\n}".to_string()) -} + let sf_arm_strs = Rc::new({ + let mut __result = Vec::new(); + for arm in arms.clone().iter().cloned() { + __result.push(emit_typed_match_arm( + &arm, + ®istry, + &scope, + depth.clone(), + &shared_types, + &emit_info, + &scrut_type, + match_result_type.clone(), + true, + )); + } + __result + }); + let sf_arms_str = sf_arm_strs.join(&"\n".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("match ".to_string(), scrut_str), + " {\n".to_string(), + ), + sf_arms_str, + ), + "\n}".to_string(), + ) + } } else { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("match ".to_string(), scrut_str), " {\n".to_string()), arms_str), "\n}".to_string()) + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("match ".to_string(), scrut_str), + " {\n".to_string(), + ), + arms_str, + ), + "\n}".to_string(), + ) } } } } -} + } } -pub fn emit_typed_match_arm(arm: &Rc, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc, scrut_type: &String, match_result_type: Rc, string_from_mode: bool) -> String { +pub fn emit_typed_match_arm( + arm: &Rc, + registry: &Rc>>, + scope: &Rc, + depth: i64, + shared_types: &Rc>, + emit_info: &Rc, + scrut_type: &String, + match_result_type: Rc, + string_from_mode: bool, +) -> String { { let arm_pat = arm_pattern(arm.clone()); -let arm_g = arm_guard(&arm); -let arm_b = arm_body(&arm); -let si = scope.type_env.clone().source_indices.clone(); -let rc_analysis = analyze_rc_pattern(arm_pat.clone(), scrut_type.clone(), &shared_types, &emit_info, si.clone()); -let pat_str = if string_from_mode { + let arm_g = arm_guard(&arm); + let arm_b = arm_body(&arm); + let si = scope.type_env.clone().source_indices.clone(); + let rc_analysis = analyze_rc_pattern( + arm_pat.clone(), + scrut_type.clone(), + &shared_types, + &emit_info, + si.clone(), + ); + let pat_str = if string_from_mode { match (*arm_pat.clone()).clone() { - MatchPattern::LitPattern { value: v, .. } => match (*v.clone()).clone() { - LiteralValue::LitStr { value: s, .. } => v2_rt::concat(v2_rt::concat("ref __s if __s == \"".to_string(), escape_string_literal_body(s.clone())), "\"".to_string()), - _ => rust_literal_for_pattern(v.clone()), -}, - _ => emit_pattern(arm_pat.clone(), shared_types.clone(), scrut_type.clone(), si.clone(), emit_info.clone()), -} + MatchPattern::LitPattern { value: v, .. } => match (*v.clone()).clone() { + LiteralValue::LitStr { value: s, .. } => v2_rt::concat( + v2_rt::concat( + "ref __s if __s == \"".to_string(), + escape_string_literal_body(s.clone()), + ), + "\"".to_string(), + ), + _ => rust_literal_for_pattern(v.clone()), + }, + _ => emit_pattern( + arm_pat.clone(), + shared_types.clone(), + scrut_type.clone(), + si.clone(), + emit_info.clone(), + ), + } } else { if rc_analysis.needs_rc_pattern.clone() { - emit_pattern_rc_aware(arm_pat.clone(), rc_analysis.clone(), shared_types.clone(), scrut_type.clone(), si.clone(), emit_info.clone()) + emit_pattern_rc_aware( + arm_pat.clone(), + rc_analysis.clone(), + shared_types.clone(), + scrut_type.clone(), + si.clone(), + emit_info.clone(), + ) } else { - emit_pattern(arm_pat.clone(), shared_types.clone(), scrut_type.clone(), si.clone(), emit_info.clone()) + emit_pattern( + arm_pat.clone(), + shared_types.clone(), + scrut_type.clone(), + si.clone(), + emit_info.clone(), + ) } }; -let field_guards = collect_pattern_string_guards(arm_pat.clone(), si.clone()); -let arm_guard_str = match arm_g { - Some(g) => emit_typed_expr(g.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024), - None => "".to_string(), -}; -let guard_str = if ((field_guards.clone().as_str() != "".to_string().as_str()) && (arm_guard_str.clone().as_str() != "".to_string().as_str())) { - v2_rt::concat(v2_rt::concat(v2_rt::concat(" if ".to_string(), field_guards.clone()), " && ".to_string()), arm_guard_str.clone()) + let field_guards = collect_pattern_string_guards(arm_pat.clone(), si.clone()); + let arm_guard_str = match arm_g { + Some(g) => emit_typed_expr( + g.clone(), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ), + None => "".to_string(), + }; + let guard_str = if ((field_guards.clone().as_str() != "".to_string().as_str()) + && (arm_guard_str.clone().as_str() != "".to_string().as_str())) + { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(" if ".to_string(), field_guards.clone()), + " && ".to_string(), + ), + arm_guard_str.clone(), + ) } else { if (field_guards.clone().as_str() != "".to_string().as_str()) { v2_rt::concat(" if ".to_string(), field_guards.clone()) @@ -3509,376 +8871,878 @@ let guard_str = if ((field_guards.clone().as_str() != "".to_string().as_str()) & } } }; -let body_str = match (*arm_b.expr_data.clone()).clone() { - ExprData::ExprVar { binding_kind: body_binding_kind, .. } => { - let body_name = expr_var_name_at(arm_b.clone(), si.clone()); -if (variant_parent_from_binding_kind(body_binding_kind.clone()) != None) { - emit_var_ref(&body_name, &body_binding_kind, &Some(Rc::new(InferredNode::Resolved { - node: match_result_type, -})), shared_types.clone(), registry.clone(), &emit_info, si.clone()) - } else { - emit_typed_expr(arm_b.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024) + let body_str = match (*arm_b.expr_data.clone()).clone() { + ExprData::ExprVar { + binding_kind: body_binding_kind, + .. + } => { + let body_name = expr_var_name_at(arm_b.clone(), si.clone()); + if (variant_parent_from_binding_kind(body_binding_kind.clone()) != None) { + emit_var_ref( + &body_name, + &body_binding_kind, + &Some(Rc::new(InferredNode::Resolved { + node: match_result_type, + })), + shared_types.clone(), + registry.clone(), + &emit_info, + si.clone(), + ) + } else { + emit_typed_expr( + arm_b.clone(), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ) + } } -}, - _ => emit_typed_expr(arm_b.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024), -}; -if rc_analysis.needs_rc_pattern.clone() { + _ => emit_typed_expr( + arm_b.clone(), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ), + }; + if rc_analysis.needs_rc_pattern.clone() { { - let prelude = rc_pattern_preludes(arm_pat.clone(), rc_analysis.clone(), shared_types.clone(), si.clone(), emit_info.clone()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" ".to_string(), pat_str), guard_str), " => { ".to_string()), prelude), " ".to_string()), body_str), " },".to_string()) -} + let prelude = rc_pattern_preludes( + arm_pat.clone(), + rc_analysis.clone(), + shared_types.clone(), + si.clone(), + emit_info.clone(), + ); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(" ".to_string(), pat_str), + guard_str, + ), + " => { ".to_string(), + ), + prelude, + ), + " ".to_string(), + ), + body_str, + ), + " },".to_string(), + ) + } } else { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" ".to_string(), pat_str), guard_str), " => ".to_string()), body_str), ",".to_string()) + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(v2_rt::concat(" ".to_string(), pat_str), guard_str), + " => ".to_string(), + ), + body_str, + ), + ",".to_string(), + ) } -} + } } -pub fn emit_typed_if(condition: Rc, then_branch: Rc, else_branch: Option>, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { +pub fn emit_typed_if( + condition: Rc, + then_branch: Rc, + else_branch: Option>, + registry: &Rc>>, + scope: &Rc, + depth: i64, + shared_types: &Rc>, + emit_info: &Rc, +) -> String { { - let cond_str = emit_typed_expr(condition, registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -emit_typed_if_shared(cond_str, &then_branch, else_branch, None, depth.clone(), &RenderTarget::Rust, scope.type_env.clone().source_indices.clone(), |node, d| emit_typed_expr(node.clone(), registry.clone(), &scope, d.clone(), shared_types.clone(), emit_info.clone(), 1024)) -} + let cond_str = emit_typed_expr( + condition, + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + emit_typed_if_shared( + cond_str, + &then_branch, + else_branch, + None, + depth.clone(), + &RenderTarget::Rust, + scope.type_env.clone().source_indices.clone(), + |node, d| { + emit_typed_expr( + node.clone(), + registry.clone(), + &scope, + d.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ) + }, + ) + } } -pub fn emit_typed_let(name: String, value: &Rc, body: Option>, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { +pub fn emit_typed_let( + name: String, + value: &Rc, + body: Option>, + registry: &Rc>>, + scope: &Rc, + depth: i64, + shared_types: &Rc>, + emit_info: &Rc, +) -> String { { - let val_str = emit_typed_expr(value.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -emit_typed_let_shared(&name, val_str, body, RenderTarget::Rust, |bd, sc| emit_typed_expr(bd.clone(), registry.clone(), &sc, depth.clone(), shared_types.clone(), emit_info.clone(), 1024), scope.clone(), value.clone()) -} + let val_str = emit_typed_expr( + value.clone(), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + emit_typed_let_shared( + &name, + val_str, + body, + RenderTarget::Rust, + |bd, sc| { + emit_typed_expr( + bd.clone(), + registry.clone(), + &sc, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ) + }, + scope.clone(), + value.clone(), + ) + } } -pub fn is_optional_struct_field(emit_info: Rc, struct_name: String, field_name: String) -> bool { +pub fn is_optional_struct_field( + emit_info: Rc, + struct_name: String, + field_name: String, +) -> bool { match lookup_emit_type_summary(emit_info, struct_name) { - Some(summary) => match v2_rt::map_get(&summary.field_summaries.clone(), field_name) { - Some(field_summary) => match field_summary.value_shape.clone() { - FieldValueShape::OptionalValue => true, - _ => false, -}, - None => false, -}, - None => false, -} + Some(summary) => match v2_rt::map_get(&summary.field_summaries.clone(), field_name) { + Some(field_summary) => match field_summary.value_shape.clone() { + FieldValueShape::OptionalValue => true, + _ => false, + }, + None => false, + }, + None => false, + } } -pub fn is_already_optional(texpr: &Rc, emit_info: Rc, scope: &Rc) -> bool { +pub fn is_already_optional( + texpr: &Rc, + emit_info: Rc, + scope: &Rc, +) -> bool { { let si = scope.type_env.clone().source_indices.clone(); -let n = expr_var_name_at(texpr.clone(), si.clone()); -let tn = record_lit_type_name_at(texpr.clone(), si.clone()); -let f = field_access_field_at(texpr.clone(), si.clone()); -match (*texpr.expr_data.clone()).clone() { - ExprData::ExprLiteral { value: v, .. } => match (*v.clone()).clone() { - LiteralValue::LitNull => true, - _ => false, -}, - ExprData::ExprVar { .. } => if ((n.clone().as_str() == "none".to_string().as_str()) || (n.clone().as_str() == "None".to_string().as_str())) { - true - } else { - match texpr.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => (rt.return_cardinality.clone() == Cardinality::CardOptional), - _ => match v2_rt::map_get(&scope.locals.clone(), n.clone()) { - Some(binding) => (binding.resolved.clone().return_cardinality.clone() == Cardinality::CardOptional), - None => false, -}, -} - }, - ExprData::ExprRecordLit { .. } => match tn { - Some(name) => ((name.clone().as_str() == "Some".to_string().as_str()) || (name.clone().as_str() == "None".to_string().as_str())), - None => false, -}, - ExprData::ExprFieldAccess { summary: fa_summary, .. } => { - let b = field_access_base(texpr.clone()); -let summary_says_optional = match fa_summary.clone() { - Some(fs) => match fs.value_shape.clone() { - FieldValueShape::OptionalValue => true, - _ => false, -}, - None => false, -}; -if summary_says_optional { - true - } else { - match b.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: base_type, .. }) => { - let resolved_base = base_type.clone(); -if is_optional_struct_field(emit_info, authored_name_at(scope.type_env.clone().source_indices.clone(), &resolved_base), f) { - true - } else { - match texpr.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => (rt.return_cardinality.clone() == Cardinality::CardOptional), - _ => false, -} + let n = expr_var_name_at(texpr.clone(), si.clone()); + let tn = record_lit_type_name_at(texpr.clone(), si.clone()); + let f = field_access_field_at(texpr.clone(), si.clone()); + match (*texpr.expr_data.clone()).clone() { + ExprData::ExprLiteral { value: v, .. } => match (*v.clone()).clone() { + LiteralValue::LitNull => true, + _ => false, + }, + ExprData::ExprVar { .. } => { + if ((n.clone().as_str() == "none".to_string().as_str()) + || (n.clone().as_str() == "None".to_string().as_str())) + { + true + } else { + match texpr.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => { + (rt.return_cardinality.clone() == Cardinality::CardOptional) + } + _ => match v2_rt::map_get(&scope.locals.clone(), n.clone()) { + Some(binding) => { + (binding.resolved.clone().return_cardinality.clone() + == Cardinality::CardOptional) + } + None => false, + }, } -}, - _ => match texpr.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => (rt.return_cardinality.clone() == Cardinality::CardOptional), - _ => false, -}, -} + } } -}, - _ => match texpr.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => (rt.return_cardinality.clone() == Cardinality::CardOptional), - _ => false, -}, -} -} + ExprData::ExprRecordLit { .. } => match tn { + Some(name) => { + ((name.clone().as_str() == "Some".to_string().as_str()) + || (name.clone().as_str() == "None".to_string().as_str())) + } + None => false, + }, + ExprData::ExprFieldAccess { + summary: fa_summary, + .. + } => { + let b = field_access_base(texpr.clone()); + let summary_says_optional = match fa_summary.clone() { + Some(fs) => match fs.value_shape.clone() { + FieldValueShape::OptionalValue => true, + _ => false, + }, + None => false, + }; + if summary_says_optional { + true + } else { + match b.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { + node: base_type, .. + }) => { + let resolved_base = base_type.clone(); + if is_optional_struct_field( + emit_info, + authored_name_at( + scope.type_env.clone().source_indices.clone(), + &resolved_base, + ), + f, + ) { + true + } else { + match texpr.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => { + (rt.return_cardinality.clone() == Cardinality::CardOptional) + } + _ => false, + } + } + } + _ => match texpr.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => { + (rt.return_cardinality.clone() == Cardinality::CardOptional) + } + _ => false, + }, + } + } + } + _ => match texpr.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => { + (rt.return_cardinality.clone() == Cardinality::CardOptional) + } + _ => false, + }, + } + } } -pub fn lookup_struct_field_type_name(struct_node: &Rc, field_name: &String, variant_name: Option, source_indices: &Rc>>) -> Option { +pub fn lookup_struct_field_type_name( + struct_node: &Rc, + field_name: &String, + variant_name: Option, + source_indices: &Rc>>, +) -> Option { { - let direct = match find_child_named(struct_node.clone(), field_name.clone(), source_indices.clone()) { - Some(field_child) => if (field_child.inferred.clone() != None) { - { - let field_type = resolved_type(field_child.clone()); -let ft_is_type_var = if (field_type.inferred.clone() != None) { - is_type_variable(field_type.inferred.clone().clone().unwrap()) - } else { - false - }; -if ((field_type.ident_span.clone() != None) && !ft_is_type_var.clone()) { - Some(authored_name_at(source_indices.clone(), &field_type)) + let direct = match find_child_named( + struct_node.clone(), + field_name.clone(), + source_indices.clone(), + ) { + Some(field_child) => { + if (field_child.inferred.clone() != None) { + { + let field_type = resolved_type(field_child.clone()); + let ft_is_type_var = if (field_type.inferred.clone() != None) { + is_type_variable(field_type.inferred.clone().clone().unwrap()) + } else { + false + }; + if ((field_type.ident_span.clone() != None) && !ft_is_type_var.clone()) { + Some(authored_name_at(source_indices.clone(), &field_type)) + } else { + None + } + } } else { None } -} - } else { - None - }, - None => None, -}; -match direct.clone() { - Some(_) => direct.clone(), - None => match variant_name { - Some(vn) => match find_child_named(struct_node.clone(), vn.clone(), source_indices.clone()) { - Some(variant_child) => match find_child_named(variant_child.clone(), field_name.clone(), source_indices.clone()) { - Some(field_child) => if (field_child.inferred.clone() != None) { - { - let field_type = resolved_type(field_child.clone()); -let ft_is_type_var = if (field_type.inferred.clone() != None) { - is_type_variable(field_type.inferred.clone().clone().unwrap()) - } else { - false - }; -if ((field_type.ident_span.clone() != None) && !ft_is_type_var.clone()) { - Some(authored_name_at(source_indices.clone(), &field_type)) - } else { - None + } + None => None, + }; + match direct.clone() { + Some(_) => direct.clone(), + None => match variant_name { + Some(vn) => { + match find_child_named(struct_node.clone(), vn.clone(), source_indices.clone()) + { + Some(variant_child) => match find_child_named( + variant_child.clone(), + field_name.clone(), + source_indices.clone(), + ) { + Some(field_child) => { + if (field_child.inferred.clone() != None) { + { + let field_type = resolved_type(field_child.clone()); + let ft_is_type_var = + if (field_type.inferred.clone() != None) { + is_type_variable( + field_type.inferred.clone().clone().unwrap(), + ) + } else { + false + }; + if ((field_type.ident_span.clone() != None) + && !ft_is_type_var.clone()) + { + Some(authored_name_at( + source_indices.clone(), + &field_type, + )) + } else { + None + } + } + } else { + None + } + } + None => None, + }, + None => None, + } } -} - } else { - None - }, - None => None, -}, - None => None, -}, - None => None, -}, -} -} + None => None, + }, + } + } } -pub fn emit_field_value_with_context(field_value: &Rc, struct_node: &Rc, outer_type_name: Option, field_name: &String, registry: Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { +pub fn emit_field_value_with_context( + field_value: &Rc, + struct_node: &Rc, + outer_type_name: Option, + field_name: &String, + registry: Rc>>, + scope: &Rc, + depth: i64, + shared_types: &Rc>, + emit_info: &Rc, +) -> String { match (*field_value.expr_data.clone()).clone() { - ExprData::ExprRecordLit { parent_enum: pe, .. } => { - let inner_fields = field_value.children.clone(); -let tn = record_lit_type_name_at(field_value.clone(), scope.type_env.clone().source_indices.clone()); -match tn.clone() { - Some(variant_name) => { - let node_lookup = lookup_struct_field_type_name(&struct_node, &field_name, outer_type_name, &scope.type_env.clone().source_indices.clone()); -let expected_type = match node_lookup.clone() { - Some(_) => node_lookup.clone(), - None => if (struct_node.ident_span.clone() != None) { - match lookup_emit_type_summary(emit_info.clone(), authored_name_at(scope.type_env.clone().source_indices.clone(), &struct_node)) { - Some(summary) => v2_rt::map_get(&summary.field_type_map.clone(), field_name.clone()), - None => None, -} - } else { - None - }, -}; -let corrected_parent = match expected_type { - Some(et) => if variant_belongs_to_enum(emit_info.type_summaries.clone(), variant_name.clone(), et.clone()) { - Some(et.clone()) - } else { - pe.clone() - }, - None => pe.clone(), -}; -let raw = emit_typed_record_lit(&tn, &inner_fields, &corrected_parent, &resolved_type(field_value.clone()), registry, &scope, depth, &shared_types, &emit_info); -let rc_name = match corrected_parent.clone() { - Some(en) => en.clone(), - None => variant_name.clone(), -}; -if ((rc_name.clone().as_str() != "".to_string().as_str()) && emit_map_has(shared_types.clone(), rc_name.clone())) { - v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), raw), ")".to_string()) - } else { - raw + ExprData::ExprRecordLit { + parent_enum: pe, .. + } => { + let inner_fields = field_value.children.clone(); + let tn = record_lit_type_name_at( + field_value.clone(), + scope.type_env.clone().source_indices.clone(), + ); + match tn.clone() { + Some(variant_name) => { + let node_lookup = lookup_struct_field_type_name( + &struct_node, + &field_name, + outer_type_name, + &scope.type_env.clone().source_indices.clone(), + ); + let expected_type = match node_lookup.clone() { + Some(_) => node_lookup.clone(), + None => { + if (struct_node.ident_span.clone() != None) { + match lookup_emit_type_summary( + emit_info.clone(), + authored_name_at( + scope.type_env.clone().source_indices.clone(), + &struct_node, + ), + ) { + Some(summary) => v2_rt::map_get( + &summary.field_type_map.clone(), + field_name.clone(), + ), + None => None, + } + } else { + None + } + } + }; + let corrected_parent = match expected_type { + Some(et) => { + if variant_belongs_to_enum( + emit_info.type_summaries.clone(), + variant_name.clone(), + et.clone(), + ) { + Some(et.clone()) + } else { + pe.clone() + } + } + None => pe.clone(), + }; + let raw = emit_typed_record_lit( + &tn, + &inner_fields, + &corrected_parent, + &resolved_type(field_value.clone()), + registry, + &scope, + depth, + &shared_types, + &emit_info, + ); + let rc_name = match corrected_parent.clone() { + Some(en) => en.clone(), + None => variant_name.clone(), + }; + if ((rc_name.clone().as_str() != "".to_string().as_str()) + && emit_map_has(shared_types.clone(), rc_name.clone())) + { + v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), raw), ")".to_string()) + } else { + raw + } + } + None => emit_typed_expr( + field_value.clone(), + registry, + &scope, + depth, + shared_types.clone(), + emit_info.clone(), + 1024, + ), } -}, - None => emit_typed_expr(field_value.clone(), registry, &scope, depth, shared_types.clone(), emit_info.clone(), 1024), -} -}, - _ => emit_typed_expr(field_value.clone(), registry, &scope, depth, shared_types.clone(), emit_info.clone(), 1024), -} + } + _ => emit_typed_expr( + field_value.clone(), + registry, + &scope, + depth, + shared_types.clone(), + emit_info.clone(), + 1024, + ), + } } -pub fn find_struct_name_by_fields(field_names: &Rc>, type_summaries: Rc>>) -> Option { +pub fn find_struct_name_by_fields( + field_names: &Rc>, + type_summaries: Rc>>, +) -> Option { { let n_fields = (field_names.clone().len() as i64); -if (n_fields.clone() == 0) { - return None - } -let candidates = Rc::new({ let mut __result = Vec::new(); for summary in Rc::new(v2_rt::map_values(&type_summaries)).iter().cloned() { if match (*summary.repr.clone()).clone() { - TypeRepr::StructRepr => { - let ftm_keys = Rc::new(v2_rt::map_keys(&summary.field_type_map.clone())); -if ((ftm_keys.clone().len() as i64) == n_fields.clone()) { - { let mut __all = true; for fn_name in field_names.clone().iter().cloned() { if !(v2_rt::map_contains_key(&summary.field_type_map.clone(), fn_name.clone())) { __all = false; break; } } __all } - } else { - false + if (n_fields.clone() == 0) { + return None; + } + let candidates = Rc::new({ + let mut __result = Vec::new(); + for summary in Rc::new(v2_rt::map_values(&type_summaries)).iter().cloned() { + if match (*summary.repr.clone()).clone() { + TypeRepr::StructRepr => { + let ftm_keys = Rc::new(v2_rt::map_keys(&summary.field_type_map.clone())); + if ((ftm_keys.clone().len() as i64) == n_fields.clone()) { + { + let mut __all = true; + for fn_name in field_names.clone().iter().cloned() { + if !(v2_rt::map_contains_key( + &summary.field_type_map.clone(), + fn_name.clone(), + )) { + __all = false; + break; + } + } + __all + } + } else { + false + } + } + _ => false, + } { + __result.push(summary); + } } -}, - _ => false, -} { __result.push(summary); } } __result }); -match candidates.first().cloned() { - Some(s) => Some(s.name.clone()), - None => None, -} -} + __result + }); + match candidates.first().cloned() { + Some(s) => Some(s.name.clone()), + None => None, + } + } } -pub fn emit_typed_record_lit(type_name: &Option, fields: &Rc>>, parent_enum: &Option, resolved_type: &Rc, registry: Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { +pub fn emit_typed_record_lit( + type_name: &Option, + fields: &Rc>>, + parent_enum: &Option, + resolved_type: &Rc, + registry: Rc>>, + scope: &Rc, + depth: i64, + shared_types: &Rc>, + emit_info: &Rc, +) -> String { { - let struct_name = explicit_record_struct_name(type_name.clone(), &resolved_type, shared_types.clone(), scope.type_env.clone().source_indices.clone()); -let qualified_name = match struct_name { - Some(sn) => Some(sn.clone()), - None => { - let rt_name = authored_name_at(scope.type_env.clone().source_indices.clone(), &resolved_type); -if ((resolved_type.ident_span.clone() != None) && v2_rt::map_contains_key(&emit_info.type_summaries.clone(), rt_name.clone())) { - Some(rt_name.clone()) - } else { - None - } -}, -}; -match qualified_name { - None => { - let is_product = is_product_type(resolved_type.clone()); -if (is_product && (resolved_type.ident_span.clone() == None)) { - if ((fields.clone().len() as i64) == 1) { - match fields.clone().first().cloned() { - Some(f) => emit_typed_expr(field_init_node_value(&f), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024), - None => "compile_error!(\"empty anonymous record literal\")".to_string(), -} + let struct_name = explicit_record_struct_name( + type_name.clone(), + &resolved_type, + shared_types.clone(), + scope.type_env.clone().source_indices.clone(), + ); + let qualified_name = match struct_name { + Some(sn) => Some(sn.clone()), + None => { + let rt_name = authored_name_at( + scope.type_env.clone().source_indices.clone(), + &resolved_type, + ); + if ((resolved_type.ident_span.clone() != None) + && v2_rt::map_contains_key(&emit_info.type_summaries.clone(), rt_name.clone())) + { + Some(rt_name.clone()) } else { - { - let lit_field_names = Rc::new({ let mut __result = Vec::new(); for f in fields.clone().iter().cloned() { __result.push(field_init_node_name_at(f.clone(), scope.type_env.clone().source_indices.clone())); } __result }); -match find_struct_name_by_fields(&lit_field_names, emit_info.type_summaries.clone()) { - Some(resolved_sn) => { - let field_strs = Rc::new({ let mut __result = Vec::new(); for f in fields.clone().iter().cloned() { __result.push({ - let fname = field_init_node_name_at(f.clone(), scope.type_env.clone().source_indices.clone()); -let fval = emit_typed_expr(field_init_node_value(&f), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" ".to_string(), emit_ident(fname.clone(), RenderTarget::Rust)), ": ".to_string()), fval.clone()), ",".to_string()) -}); } __result }); -let body = field_strs.join(&"\n".to_string()); -let struct_lit = v2_rt::concat(v2_rt::concat(v2_rt::concat(resolved_sn.clone(), " {\n".to_string()), body), "\n}".to_string()); -if emit_map_has(shared_types.clone(), resolved_sn.clone()) { - v2_rt::concat(v2_rt::concat("Rc::new(".to_string(), struct_lit), ")".to_string()) - } else { - struct_lit - } -}, - None => { - let vals = Rc::new({ let mut __result = Vec::new(); for f in fields.clone().iter().cloned() { __result.push(emit_typed_expr(field_init_node_value(&f), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024)); } __result }); -v2_rt::concat(v2_rt::concat("(".to_string(), vals.join(&", ".to_string())), ")".to_string()) -}, -} -} + None } - } else { - "compile_error!(\"cannot resolve anonymous record type in emitter\")".to_string() } -}, - Some(tn) => { - let si = scope.type_env.clone().source_indices.clone(); -let context_lookup = contextual_variant_parent(&tn, parent_enum.clone(), &resolved_type, emit_info.clone(), si.clone()); -let effective_parent = match context_lookup { - Some(context_parent) => Some(context_parent.clone()), - None => { - let rt_is_type_var = if (resolved_type.inferred.clone() != None) { - is_type_variable(resolved_type.inferred.clone().clone().unwrap()) + }; + match qualified_name { + None => { + let is_product = is_product_type(resolved_type.clone()); + if (is_product && (resolved_type.ident_span.clone() == None)) { + if ((fields.clone().len() as i64) == 1) { + match fields.clone().first().cloned() { + Some(f) => emit_typed_expr( + field_init_node_value(&f), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ), + None => { + "compile_error!(\"empty anonymous record literal\")".to_string() + } + } + } else { + { + let lit_field_names = Rc::new({ + let mut __result = Vec::new(); + for f in fields.clone().iter().cloned() { + __result.push(field_init_node_name_at( + f.clone(), + scope.type_env.clone().source_indices.clone(), + )); + } + __result + }); + match find_struct_name_by_fields( + &lit_field_names, + emit_info.type_summaries.clone(), + ) { + Some(resolved_sn) => { + let field_strs = Rc::new({ + let mut __result = Vec::new(); + for f in fields.clone().iter().cloned() { + __result.push({ + let fname = field_init_node_name_at( + f.clone(), + scope.type_env.clone().source_indices.clone(), + ); + let fval = emit_typed_expr( + field_init_node_value(&f), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + " ".to_string(), + emit_ident( + fname.clone(), + RenderTarget::Rust, + ), + ), + ": ".to_string(), + ), + fval.clone(), + ), + ",".to_string(), + ) + }); + } + __result + }); + let body = field_strs.join(&"\n".to_string()); + let struct_lit = v2_rt::concat( + v2_rt::concat( + v2_rt::concat(resolved_sn.clone(), " {\n".to_string()), + body, + ), + "\n}".to_string(), + ); + if emit_map_has(shared_types.clone(), resolved_sn.clone()) { + v2_rt::concat( + v2_rt::concat("Rc::new(".to_string(), struct_lit), + ")".to_string(), + ) + } else { + struct_lit + } + } + None => { + let vals = Rc::new({ + let mut __result = Vec::new(); + for f in fields.clone().iter().cloned() { + __result.push(emit_typed_expr( + field_init_node_value(&f), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + )); + } + __result + }); + v2_rt::concat( + v2_rt::concat( + "(".to_string(), + vals.join(&", ".to_string()), + ), + ")".to_string(), + ) + } + } + } + } } else { - false + "compile_error!(\"cannot resolve anonymous record type in emitter\")" + .to_string() + } + } + Some(tn) => { + let si = scope.type_env.clone().source_indices.clone(); + let context_lookup = contextual_variant_parent( + &tn, + parent_enum.clone(), + &resolved_type, + emit_info.clone(), + si.clone(), + ); + let effective_parent = match context_lookup { + Some(context_parent) => Some(context_parent.clone()), + None => { + let rt_is_type_var = if (resolved_type.inferred.clone() != None) { + is_type_variable(resolved_type.inferred.clone().clone().unwrap()) + } else { + false + }; + let rt_name = authored_name_at(si.clone(), &resolved_type); + if ((((resolved_type.ident_span.clone() != None) + && (rt_name.clone().as_str() != tn.clone().as_str())) + && !rt_is_type_var) + && (rt_name.clone().as_str() != "Error".to_string().as_str())) + { + Some(rt_name.clone()) + } else { + parent_enum.clone() + } + } }; -let rt_name = authored_name_at(si.clone(), &resolved_type); -if ((((resolved_type.ident_span.clone() != None) && (rt_name.clone().as_str() != tn.clone().as_str())) && !rt_is_type_var) && (rt_name.clone().as_str() != "Error".to_string().as_str())) { - Some(rt_name.clone()) + let display_tn = if ((tn.clone().as_str() == "Some".to_string().as_str()) + || (tn.clone().as_str() == "None".to_string().as_str())) + { + tn.clone() } else { - parent_enum.clone() - } -}, -}; -let display_tn = if ((tn.clone().as_str() == "Some".to_string().as_str()) || (tn.clone().as_str() == "None".to_string().as_str())) { - tn.clone() - } else { - match effective_parent { - Some(resolved_parent_enum) => v2_rt::concat(v2_rt::concat(resolved_parent_enum.clone(), "::".to_string()), tn.clone()), - None => tn.clone(), -} - }; -if ((tn.clone().as_str() == "Some".to_string().as_str()) && ((fields.clone().len() as i64) == 1)) { - match fields.clone().first().cloned() { - Some(f) => { - let inner = emit_typed_expr(field_init_node_value(&f), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -v2_rt::concat(v2_rt::concat("Some(".to_string(), inner), ")".to_string()) -}, - None => v2_rt::concat(display_tn, " {}".to_string()), -} - } else { - if ((fields.clone().len() as i64) == 0) { - { - let empty_raw = v2_rt::concat(display_tn, " {}".to_string()); -let record_parent_enum = match parent_enum.clone() { - Some(en) => en.clone(), - None => "".to_string(), -}; -empty_raw -} + match effective_parent { + Some(resolved_parent_enum) => v2_rt::concat( + v2_rt::concat(resolved_parent_enum.clone(), "::".to_string()), + tn.clone(), + ), + None => tn.clone(), + } + }; + if ((tn.clone().as_str() == "Some".to_string().as_str()) + && ((fields.clone().len() as i64) == 1)) + { + match fields.clone().first().cloned() { + Some(f) => { + let inner = emit_typed_expr( + field_init_node_value(&f), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + v2_rt::concat( + v2_rt::concat("Some(".to_string(), inner), + ")".to_string(), + ) + } + None => v2_rt::concat(display_tn, " {}".to_string()), + } } else { - { - let field_strs = Rc::new({ let mut __result = Vec::new(); for f in fields.clone().iter().cloned() { __result.push({ - let f_name = field_init_node_name_at(f.clone(), scope.type_env.clone().source_indices.clone()); -let f_value = field_init_node_value(&f); -let val_str = emit_field_value_with_context(&f_value, &resolved_type, type_name.clone(), &f_name, registry.clone(), &scope, depth.clone(), &shared_types, &emit_info); -let needs_wrap = (is_optional_struct_field(emit_info.clone(), tn.clone(), f_name.clone()) && (is_already_optional(&f_value, emit_info.clone(), &scope) == false)); -let field_val = if needs_wrap.clone() { - v2_rt::concat(v2_rt::concat("Some(".to_string(), val_str.clone()), ")".to_string()) - } else { - val_str.clone() + if ((fields.clone().len() as i64) == 0) { + { + let empty_raw = v2_rt::concat(display_tn, " {}".to_string()); + let record_parent_enum = match parent_enum.clone() { + Some(en) => en.clone(), + None => "".to_string(), }; -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" ".to_string(), emit_ident(f_name.clone(), RenderTarget::Rust)), ": ".to_string()), field_val.clone()), ",".to_string()) -}); } __result }); -let provided_names = Rc::new({ let mut __result = Vec::new(); for f in fields.clone().iter().cloned() { __result.push(field_init_node_name_at(f.clone(), scope.type_env.clone().source_indices.clone())); } __result }); -let provided_set = provided_names.iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, n: String| v2_rt::rc_map_insert(acc, n.clone(), true)); -let summary = lookup_emit_type_summary(emit_info.clone(), tn.clone()); -let default_strs = match summary { - Some(s) => { - let fs = s.field_summaries.clone(); -let ftm = s.field_type_map.clone(); -let missing = Rc::new({ let mut __result = Vec::new(); for k in Rc::new(v2_rt::map_keys(&fs)).iter().cloned() { if !emit_map_has(provided_set.clone(), k.clone()) { __result.push(k); } } __result }); -let all_defaultable = { let mut __all = true; for fname in missing.clone().iter().cloned() { if !({ - let has_zv = match v2_rt::map_get(&ftm, fname.clone()) { - Some(ft) => match rust_zero_value(&ft) { - Some(_) => true, - None => false, -}, - None => false, -}; -(has_zv.clone() || is_optional_struct_field(emit_info.clone(), tn.clone(), fname.clone())) -}) { __all = false; break; } } __all }; -if all_defaultable { - Rc::new({ let mut __result = Vec::new(); for fname in missing.clone().iter().cloned() { __result.extend((*if is_optional_struct_field(emit_info.clone(), tn.clone(), fname.clone()) { + empty_raw + } + } else { + { + let field_strs = Rc::new({ + let mut __result = Vec::new(); + for f in fields.clone().iter().cloned() { + __result.push({ + let f_name = field_init_node_name_at( + f.clone(), + scope.type_env.clone().source_indices.clone(), + ); + let f_value = field_init_node_value(&f); + let val_str = emit_field_value_with_context( + &f_value, + &resolved_type, + type_name.clone(), + &f_name, + registry.clone(), + &scope, + depth.clone(), + &shared_types, + &emit_info, + ); + let needs_wrap = (is_optional_struct_field( + emit_info.clone(), + tn.clone(), + f_name.clone(), + ) && (is_already_optional( + &f_value, + emit_info.clone(), + &scope, + ) == false)); + let field_val = if needs_wrap.clone() { + v2_rt::concat( + v2_rt::concat("Some(".to_string(), val_str.clone()), + ")".to_string(), + ) + } else { + val_str.clone() + }; + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + " ".to_string(), + emit_ident( + f_name.clone(), + RenderTarget::Rust, + ), + ), + ": ".to_string(), + ), + field_val.clone(), + ), + ",".to_string(), + ) + }); + } + __result + }); + let provided_names = Rc::new({ + let mut __result = Vec::new(); + for f in fields.clone().iter().cloned() { + __result.push(field_init_node_name_at( + f.clone(), + scope.type_env.clone().source_indices.clone(), + )); + } + __result + }); + let provided_set = provided_names.iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, n: String| { + v2_rt::rc_map_insert(acc, n.clone(), true) + }, + ); + let summary = lookup_emit_type_summary(emit_info.clone(), tn.clone()); + let default_strs = match summary { + Some(s) => { + let fs = s.field_summaries.clone(); + let ftm = s.field_type_map.clone(); + let missing = Rc::new({ + let mut __result = Vec::new(); + for k in Rc::new(v2_rt::map_keys(&fs)).iter().cloned() { + if !emit_map_has(provided_set.clone(), k.clone()) { + __result.push(k); + } + } + __result + }); + let all_defaultable = { + let mut __all = true; + for fname in missing.clone().iter().cloned() { + if !({ + let has_zv = + match v2_rt::map_get(&ftm, fname.clone()) { + Some(ft) => match rust_zero_value(&ft) { + Some(_) => true, + None => false, + }, + None => false, + }; + (has_zv.clone() + || is_optional_struct_field( + emit_info.clone(), + tn.clone(), + fname.clone(), + )) + }) { + __all = false; + break; + } + } + __all + }; + if all_defaultable { + Rc::new({ + let mut __result = Vec::new(); + for fname in missing.clone().iter().cloned() { + __result.extend((*if is_optional_struct_field(emit_info.clone(), tn.clone(), fname.clone()) { Rc::new(vec![v2_rt::concat(v2_rt::concat(" ".to_string(), emit_ident(fname.clone(), RenderTarget::Rust)), ": None,".to_string())]) } else { match v2_rt::map_get(&ftm, fname.clone()) { @@ -3888,23 +9752,32 @@ if all_defaultable { }, None => Rc::new(vec![]), } - }).iter().cloned()); } __result }) - } else { - Rc::new(vec![]) - } -}, - None => Rc::new(vec![]), -}; -let all_field_strs = v2_rt::concat(field_strs, default_strs); -let fields_str = all_field_strs.join(&"\n".to_string()); -let raw = v2_rt::concat(v2_rt::concat(v2_rt::concat(display_tn, " {\n".to_string()), fields_str), "\n}".to_string()); -raw -} + }).iter().cloned()); + } + __result + }) + } else { + Rc::new(vec![]) + } + } + None => Rc::new(vec![]), + }; + let all_field_strs = v2_rt::concat(field_strs, default_strs); + let fields_str = all_field_strs.join(&"\n".to_string()); + let raw = v2_rt::concat( + v2_rt::concat( + v2_rt::concat(display_tn, " {\n".to_string()), + fields_str, + ), + "\n}".to_string(), + ); + raw + } + } } } -}, -} -} + } + } } pub fn rust_zero_value(type_name: &String) -> Option { @@ -3915,7 +9788,10 @@ pub fn rust_zero_value(type_name: &String) -> Option { Some("false".to_string()) } else { if (type_name.clone().as_str() == "String".to_string().as_str()) { - Some(v2_rt::concat("\"\"".to_string(), ".to_string()".to_string())) + Some(v2_rt::concat( + "\"\"".to_string(), + ".to_string()".to_string(), + )) } else { None } @@ -3923,330 +9799,1058 @@ pub fn rust_zero_value(type_name: &String) -> Option { } } -pub fn emit_typed_bin_op(op: &BinOp, algebra_field: Option, left: &Rc, right: &Rc, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc) -> String { +pub fn emit_typed_bin_op( + op: &BinOp, + algebra_field: Option, + left: &Rc, + right: &Rc, + registry: &Rc>>, + scope: &Rc, + depth: i64, + shared_types: &Rc>, + emit_info: &Rc, +) -> String { { - let l_str = emit_typed_expr(left.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -let r_str = emit_typed_expr(right.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -if is_null_coalesce(op.clone()) { + let l_str = emit_typed_expr( + left.clone(), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + let r_str = emit_typed_expr( + right.clone(), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + if is_null_coalesce(op.clone()) { emit_null_coalesce(l_str, r_str, RenderTarget::Rust) } else { { let op_str = emit_bin_op_symbol(op.clone(), &RenderTarget::Rust, algebra_field); -if is_string_comparison(op.clone(), left.clone(), right.clone(), &scope.type_env.clone().source_indices.clone()) { + if is_string_comparison( + op.clone(), + left.clone(), + right.clone(), + &scope.type_env.clone().source_indices.clone(), + ) { { let l_optional = is_optional_typed_expr(left.clone()); -let r_optional = is_optional_typed_expr(right.clone()); -if (l_optional.clone() || r_optional.clone()) { + let r_optional = is_optional_typed_expr(right.clone()); + if (l_optional.clone() || r_optional.clone()) { { let l_cmp = if l_optional.clone() { v2_rt::concat(l_str, ".as_deref()".to_string()) } else { - v2_rt::concat(v2_rt::concat("Some(".to_string(), l_str), ".as_str())".to_string()) + v2_rt::concat( + v2_rt::concat("Some(".to_string(), l_str), + ".as_str())".to_string(), + ) }; -let r_cmp = if r_optional.clone() { + let r_cmp = if r_optional.clone() { v2_rt::concat(r_str, ".as_deref()".to_string()) } else { - v2_rt::concat(v2_rt::concat("Some(".to_string(), r_str), ".as_str())".to_string()) + v2_rt::concat( + v2_rt::concat("Some(".to_string(), r_str), + ".as_str())".to_string(), + ) }; -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("(".to_string(), l_cmp), " ".to_string()), op_str), " ".to_string()), r_cmp), ")".to_string()) -} + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("(".to_string(), l_cmp), + " ".to_string(), + ), + op_str, + ), + " ".to_string(), + ), + r_cmp, + ), + ")".to_string(), + ) + } } else { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("(".to_string(), l_str), ".as_str() ".to_string()), op_str), " ".to_string()), r_str), ".as_str())".to_string()) + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("(".to_string(), l_str), + ".as_str() ".to_string(), + ), + op_str, + ), + " ".to_string(), + ), + r_str, + ), + ".as_str())".to_string(), + ) } -} + } } else { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("(".to_string(), l_str), " ".to_string()), op_str), " ".to_string()), r_str), ")".to_string()) + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("(".to_string(), l_str), + " ".to_string(), + ), + op_str, + ), + " ".to_string(), + ), + r_str, + ), + ")".to_string(), + ) } -} + } } -} + } } pub fn is_optional_typed_expr(e: Rc) -> bool { match e.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => (rt.return_cardinality.clone() == Cardinality::CardOptional), - _ => false, -} + Some(InferredNode::Resolved { node: rt, .. }) => { + (rt.return_cardinality.clone() == Cardinality::CardOptional) + } + _ => false, + } } -pub fn is_string_comparison(op: BinOp, left: Rc, right: Rc, source_indices: &Rc>>) -> bool { +pub fn is_string_comparison( + op: BinOp, + left: Rc, + right: Rc, + source_indices: &Rc>>, +) -> bool { match op { - BinOp::Eq => (is_string_typed_expr(left, source_indices.clone()) && is_string_typed_expr(right, source_indices.clone())), - BinOp::Ne => (is_string_typed_expr(left, source_indices.clone()) && is_string_typed_expr(right, source_indices.clone())), - _ => false, -} + BinOp::Eq => { + (is_string_typed_expr(left, source_indices.clone()) + && is_string_typed_expr(right, source_indices.clone())) + } + BinOp::Ne => { + (is_string_typed_expr(left, source_indices.clone()) + && is_string_typed_expr(right, source_indices.clone())) + } + _ => false, + } } -pub fn is_string_typed_expr(e: Rc, source_indices: Rc>>) -> bool { +pub fn is_string_typed_expr( + e: Rc, + source_indices: Rc>>, +) -> bool { match e.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - let is_optional = (rt.return_cardinality.clone() == Cardinality::CardOptional); -let inner = if is_optional { - with_required_cardinality(&rt) - } else { - rt.clone() - }; -is_rust_string_like(inner, source_indices) -}, - _ => false, -} + Some(InferredNode::Resolved { node: rt, .. }) => { + let is_optional = (rt.return_cardinality.clone() == Cardinality::CardOptional); + let inner = if is_optional { + with_required_cardinality(&rt) + } else { + rt.clone() + }; + is_rust_string_like(inner, source_indices) + } + _ => false, + } } -pub fn emit_typed_string_interp(parts: &Rc>>, registry: Rc>>, scope: Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { +pub fn emit_typed_string_interp( + parts: &Rc>>, + registry: Rc>>, + scope: Rc, + depth: i64, + shared_types: Rc>, + emit_info: Rc, +) -> String { { - let has_interpolations = { let mut __found = false; for p in parts.clone().iter().cloned() { if match (*p.clone()).clone() { - StringPart::Interpolation { .. } => true, - _ => false, -} { __found = true; break; } } __found }; -let fmt_parts = Rc::new({ let mut __result = Vec::new(); for p in parts.clone().iter().cloned() { __result.push(typed_interp_format_part(p.clone(), registry.clone(), scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone(), has_interpolations.clone())); } __result }); -let fmt_str = Rc::new({ let mut __result = Vec::new(); for p in fmt_parts.clone().iter().cloned() { __result.push(p.format_segment.clone()); } __result }).join(&"".to_string()); -let args = Rc::new({ let mut __result = Vec::new(); for a in Rc::new({ let mut __result = Vec::new(); for p in fmt_parts.clone().iter().cloned() { __result.push(p.arg_expr.clone()); } __result }).iter().cloned() { if (a.clone().as_str() != "".to_string().as_str()) { __result.push(a); } } __result }); -if ((args.clone().len() as i64) == 0) { - v2_rt::concat(v2_rt::concat("\"".to_string(), fmt_str), "\".to_string()".to_string()) + let has_interpolations = { + let mut __found = false; + for p in parts.clone().iter().cloned() { + if match (*p.clone()).clone() { + StringPart::Interpolation { .. } => true, + _ => false, + } { + __found = true; + break; + } + } + __found + }; + let fmt_parts = Rc::new({ + let mut __result = Vec::new(); + for p in parts.clone().iter().cloned() { + __result.push(typed_interp_format_part( + p.clone(), + registry.clone(), + scope.clone(), + depth.clone(), + shared_types.clone(), + emit_info.clone(), + has_interpolations.clone(), + )); + } + __result + }); + let fmt_str = Rc::new({ + let mut __result = Vec::new(); + for p in fmt_parts.clone().iter().cloned() { + __result.push(p.format_segment.clone()); + } + __result + }) + .join(&"".to_string()); + let args = Rc::new({ + let mut __result = Vec::new(); + for a in Rc::new({ + let mut __result = Vec::new(); + for p in fmt_parts.clone().iter().cloned() { + __result.push(p.arg_expr.clone()); + } + __result + }) + .iter() + .cloned() + { + if (a.clone().as_str() != "".to_string().as_str()) { + __result.push(a); + } + } + __result + }); + if ((args.clone().len() as i64) == 0) { + v2_rt::concat( + v2_rt::concat("\"".to_string(), fmt_str), + "\".to_string()".to_string(), + ) } else { { let args_str = args.clone().join(&", ".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("format!(\"".to_string(), fmt_str), "\", ".to_string()), args_str), ")".to_string()) -} + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("format!(\"".to_string(), fmt_str), + "\", ".to_string(), + ), + args_str, + ), + ")".to_string(), + ) + } } -} + } } -pub fn typed_interp_format_part(part: Rc, registry: Rc>>, scope: Rc, depth: i64, shared_types: Rc>, emit_info: Rc, has_interpolations: bool) -> Rc { +pub fn typed_interp_format_part( + part: Rc, + registry: Rc>>, + scope: Rc, + depth: i64, + shared_types: Rc>, + emit_info: Rc, + has_interpolations: bool, +) -> Rc { match (*part).clone() { - StringPart::Text { value: v, .. } => { - let escaped = if has_interpolations { - escape_rust_interp_text(v.clone()) - } else { - escape_string_literal_body(v.clone()) - }; -Rc::new(InterpPart { - format_segment: escaped, - arg_expr: "".to_string(), -}) -}, - StringPart::Interpolation { expr: e, .. } => Rc::new(InterpPart { - format_segment: "{}".to_string(), - arg_expr: emit_typed_expr(e.clone(), registry, &scope, depth, shared_types, emit_info, 1024), -}), -} + StringPart::Text { value: v, .. } => { + let escaped = if has_interpolations { + escape_rust_interp_text(v.clone()) + } else { + escape_string_literal_body(v.clone()) + }; + Rc::new(InterpPart { + format_segment: escaped, + arg_expr: "".to_string(), + }) + } + StringPart::Interpolation { expr: e, .. } => Rc::new(InterpPart { + format_segment: "{}".to_string(), + arg_expr: emit_typed_expr( + e.clone(), + registry, + &scope, + depth, + shared_types, + emit_info, + 1024, + ), + }), + } } -pub fn emit_typed_block(stmts: Rc>>, registry: Rc>>, scope: Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { +pub fn emit_typed_block( + stmts: Rc>>, + registry: Rc>>, + scope: Rc, + depth: i64, + shared_types: Rc>, + emit_info: Rc, +) -> String { { - let state = emit_rust_block_stmts(stmts, Rc::new(vec![]), scope, registry, (depth.clone() + 1), shared_types, emit_info); -v2_rt::concat(v2_rt::concat(v2_rt::concat("{\n".to_string(), make_indent((depth.clone() + 1))), state.text.clone().join(&"\n".to_string())), "\n}".to_string()) + let state = emit_rust_block_stmts( + stmts, + Rc::new(vec![]), + scope, + registry, + (depth.clone() + 1), + shared_types, + emit_info, + ); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("{\n".to_string(), make_indent((depth.clone() + 1))), + state.text.clone().join(&"\n".to_string()), + ), + "\n}".to_string(), + ) + } } + +pub fn emit_tco_init_block_stmts( + mut remaining: Rc>>, + mut text: Rc>, + mut scope: Rc, + mut registry: Rc>>, + mut depth: i64, + mut shared_types: Rc>, + mut emit_info: Rc, + mut params: Rc>>, +) -> Rc { + loop { + match remaining.clone().first().cloned() { + None => { + break Rc::new(BlockEmitState { + text: text, + scope: scope.clone(), + }); + } + Some(stmt) => { + let rest = Rc::new( + remaining + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ); + match rest.clone().first().cloned() { + None => { + break Rc::new(BlockEmitState { + text: text, + scope: scope.clone(), + }); + } + Some(_) => { + let line = emit_tco_init_stmt( + &stmt, + params.clone(), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + ); + let next_scope = scope_after_expr(&stmt, &scope); + { + let __tco_0 = rest.clone(); + let __tco_1 = v2_rt::rc_list_push(text, line); + let __tco_2 = next_scope; + remaining = __tco_0; + text = __tco_1; + scope = __tco_2; + continue; + } + } + } + } + } + } } -pub fn emit_tco_init_block_stmts(mut remaining: Rc>>, mut text: Rc>, mut scope: Rc, mut registry: Rc>>, mut depth: i64, mut shared_types: Rc>, mut emit_info: Rc, mut params: Rc>>) -> Rc { - loop { - match remaining.clone().first().cloned() { - None => { break Rc::new(BlockEmitState { - text: text, - scope: scope.clone(), -}); }, - Some(stmt) => { let rest = Rc::new(remaining.clone().iter().cloned().skip(1 as usize).collect::>()); -match rest.clone().first().cloned() { - None => { break Rc::new(BlockEmitState { - text: text, - scope: scope.clone(), -}); }, - Some(_) => { let line = emit_tco_init_stmt(&stmt, params.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone()); -let next_scope = scope_after_expr(&stmt, &scope); -{ - let __tco_0 = rest.clone(); -let __tco_1 = v2_rt::rc_list_push(text, line); -let __tco_2 = next_scope; -remaining = __tco_0; -text = __tco_1; -scope = __tco_2; -continue; -} }, -} }, -} -} -} - -pub fn emit_tco_init_stmt(stmt: &Rc, params: Rc>>, registry: Rc>>, scope: &Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { +pub fn emit_tco_init_stmt( + stmt: &Rc, + params: Rc>>, + registry: Rc>>, + scope: &Rc, + depth: i64, + shared_types: Rc>, + emit_info: Rc, +) -> String { match (*stmt.expr_data.clone()).clone() { - ExprData::ExprLet => { - let n = let_binding_name_at(stmt.clone(), scope.type_env.clone().source_indices.clone()); -let v = let_value(stmt.clone()); -let val_str = emit_typed_expr(v, registry, &scope, depth, shared_types, emit_info, 1024); -let is_param = { let mut __found = false; for p in params.iter().cloned() { if (param_node_name_at(p.clone(), scope.type_env.clone().source_indices.clone()).as_str() == n.clone().as_str()) { __found = true; break; } } __found }; -if is_param { - v2_rt::concat(v2_rt::concat(v2_rt::concat(emit_ident(n.clone(), RenderTarget::Rust), " = ".to_string()), val_str), ";".to_string()) - } else { - emit_let_binding(n.clone(), val_str, &RenderTarget::Rust) + ExprData::ExprLet => { + let n = + let_binding_name_at(stmt.clone(), scope.type_env.clone().source_indices.clone()); + let v = let_value(stmt.clone()); + let val_str = + emit_typed_expr(v, registry, &scope, depth, shared_types, emit_info, 1024); + let is_param = { + let mut __found = false; + for p in params.iter().cloned() { + if (param_node_name_at( + p.clone(), + scope.type_env.clone().source_indices.clone(), + ) + .as_str() + == n.clone().as_str()) + { + __found = true; + break; + } + } + __found + }; + if is_param { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(emit_ident(n.clone(), RenderTarget::Rust), " = ".to_string()), + val_str, + ), + ";".to_string(), + ) + } else { + emit_let_binding(n.clone(), val_str, &RenderTarget::Rust) + } } -}, - _ => emit_typed_expr(stmt.clone(), registry, &scope, depth, shared_types, emit_info, 1024), -} + _ => emit_typed_expr( + stmt.clone(), + registry, + &scope, + depth, + shared_types, + emit_info, + 1024, + ), + } } -pub fn emit_typed_tco_body(texpr: Rc, fn_name: String, params: Rc>>, registry: Rc>>, scope: Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { +pub fn emit_typed_tco_body( + texpr: Rc, + fn_name: String, + params: Rc>>, + registry: Rc>>, + scope: Rc, + depth: i64, + shared_types: Rc>, + emit_info: Rc, +) -> String { { - let inner = emit_typed_tco_expr(texpr, &fn_name, params, registry, scope, (depth.clone() + 1), shared_types, emit_info); -v2_rt::concat(v2_rt::concat(v2_rt::concat("loop {\n".to_string(), make_indent((depth.clone() + 1))), inner), "\n}".to_string()) -} + let inner = emit_typed_tco_expr( + texpr, + &fn_name, + params, + registry, + scope, + (depth.clone() + 1), + shared_types, + emit_info, + ); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("loop {\n".to_string(), make_indent((depth.clone() + 1))), + inner, + ), + "\n}".to_string(), + ) + } } -pub fn emit_rust_tco_non_self_call(frame: &Rc, registry: Rc>>, shared_types: Rc>, emit_info: Rc) -> String { +pub fn emit_rust_tco_non_self_call( + frame: &Rc, + registry: Rc>>, + shared_types: Rc>, + emit_info: Rc, +) -> String { match (*frame.expr.clone().expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { - let f = expr_call_func_at(frame.expr.clone(), frame.scope.clone().type_env.clone().source_indices.clone()); -let call_str = emit_typed_call(&f, &frame.expr.clone().children.clone(), ®istry, &frame.scope.clone(), frame.depth.clone(), &shared_types, &emit_info); -v2_rt::concat(v2_rt::concat("break ".to_string(), call_str), ";".to_string()) -}, - _ => emit_error_expr("emit_rust_tco_non_self_call expected ExprCall".to_string(), RenderTarget::Rust), -} + ExprData::ExprCall { .. } => { + let f = expr_call_func_at( + frame.expr.clone(), + frame.scope.clone().type_env.clone().source_indices.clone(), + ); + let call_str = emit_typed_call( + &f, + &frame.expr.clone().children.clone(), + ®istry, + &frame.scope.clone(), + frame.depth.clone(), + &shared_types, + &emit_info, + ); + v2_rt::concat( + v2_rt::concat("break ".to_string(), call_str), + ";".to_string(), + ) + } + _ => emit_error_expr( + "emit_rust_tco_non_self_call expected ExprCall".to_string(), + RenderTarget::Rust, + ), + } } -pub fn emit_rust_tco_if(frame: &Rc, fn_name: &String, params: &Rc>>, registry: &Rc>>, shared_types: &Rc>, emit_info: &Rc) -> String { +pub fn emit_rust_tco_if( + frame: &Rc, + fn_name: &String, + params: &Rc>>, + registry: &Rc>>, + shared_types: &Rc>, + emit_info: &Rc, +) -> String { match (*frame.expr.clone().expr_data.clone()).clone() { - ExprData::ExprIf => { - let c = if_condition(frame.expr.clone()); -let t = if_then_branch(frame.expr.clone()); -let e = if_else_branch(frame.expr.clone()); -let cond_str = emit_typed_expr(c, registry.clone(), &frame.scope.clone(), frame.depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -let then_str = emit_typed_tco_expr(t, &fn_name, params.clone(), registry.clone(), frame.scope.clone(), (frame.depth.clone() + 1), shared_types.clone(), emit_info.clone()); -match e { - Some(eb) => { - let else_str = emit_typed_tco_expr(eb.clone(), &fn_name, params.clone(), registry.clone(), frame.scope.clone(), (frame.depth.clone() + 1), shared_types.clone(), emit_info.clone()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("if ".to_string(), cond_str), " {\n".to_string()), make_indent((frame.depth.clone() + 1))), then_str), "\n} else {\n".to_string()), make_indent((frame.depth.clone() + 1))), else_str), "\n}".to_string()) -}, - None => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("if ".to_string(), cond_str), " {\n".to_string()), make_indent((frame.depth.clone() + 1))), then_str), "\n}".to_string()), -} -}, - _ => emit_error_expr("emit_rust_tco_if expected ExprIf".to_string(), RenderTarget::Rust), -} + ExprData::ExprIf => { + let c = if_condition(frame.expr.clone()); + let t = if_then_branch(frame.expr.clone()); + let e = if_else_branch(frame.expr.clone()); + let cond_str = emit_typed_expr( + c, + registry.clone(), + &frame.scope.clone(), + frame.depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + let then_str = emit_typed_tco_expr( + t, + &fn_name, + params.clone(), + registry.clone(), + frame.scope.clone(), + (frame.depth.clone() + 1), + shared_types.clone(), + emit_info.clone(), + ); + match e { + Some(eb) => { + let else_str = emit_typed_tco_expr( + eb.clone(), + &fn_name, + params.clone(), + registry.clone(), + frame.scope.clone(), + (frame.depth.clone() + 1), + shared_types.clone(), + emit_info.clone(), + ); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("if ".to_string(), cond_str), + " {\n".to_string(), + ), + make_indent((frame.depth.clone() + 1)), + ), + then_str, + ), + "\n} else {\n".to_string(), + ), + make_indent((frame.depth.clone() + 1)), + ), + else_str, + ), + "\n}".to_string(), + ) + } + None => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("if ".to_string(), cond_str), + " {\n".to_string(), + ), + make_indent((frame.depth.clone() + 1)), + ), + then_str, + ), + "\n}".to_string(), + ), + } + } + _ => emit_error_expr( + "emit_rust_tco_if expected ExprIf".to_string(), + RenderTarget::Rust, + ), + } } -pub fn emit_rust_tco_match(frame: &Rc, fn_name: String, params: Rc>>, registry: &Rc>>, shared_types: &Rc>, emit_info: &Rc) -> String { +pub fn emit_rust_tco_match( + frame: &Rc, + fn_name: String, + params: Rc>>, + registry: &Rc>>, + shared_types: &Rc>, + emit_info: &Rc, +) -> String { match (*frame.expr.clone().expr_data.clone()).clone() { - ExprData::ExprMatch => { - let s = match_scrutinee(frame.expr.clone()); -let arm_list = match_arm_nodes(frame.expr.clone()); -let scrut_str = emit_typed_expr(s.clone(), registry.clone(), &frame.scope.clone(), frame.depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -let tco_scrut_type = match s.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => { - let is_optional = (rt.return_cardinality.clone() == Cardinality::CardOptional); -if is_optional { - authored_name_at(frame.scope.clone().type_env.clone().source_indices.clone(), &with_required_cardinality(&rt)) - } else { - authored_name_at(frame.scope.clone().type_env.clone().source_indices.clone(), &rt) - } -}, - _ => "".to_string(), -}; -let rc_match = analyze_rc_match(&s, arm_list.clone(), tco_scrut_type.clone(), &shared_types, emit_info.clone(), &frame.scope.clone().type_env.clone().source_indices.clone()); -let arm_strs = Rc::new({ let mut __result = Vec::new(); for arm in arm_list.clone().iter().cloned() { __result.push(emit_typed_tco_match_arm(&arm, fn_name.clone(), params.clone(), ®istry, &frame.scope.clone(), frame.depth.clone(), &shared_types, &emit_info, &tco_scrut_type)); } __result }); -let arms_str = arm_strs.join(&"\n".to_string()); -let tco_needs_as_str = (all_arms_are_string_lit(&arm_list) && ((arm_list.clone().len() as i64) > 0)); -if rc_match.needs_option_deref.clone() { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("match ".to_string(), scrut_str), ".as_deref()".to_string()), clone_iterator_suffix()), " {\n".to_string()), arms_str), "\n}".to_string()) - } else { - if rc_match.needs_deref.clone() { - { - let sharing = language_spec(RenderTarget::Rust).sharing.clone(); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("match ".to_string(), apply_type_template1(sharing.deref_clone.clone(), scrut_str)), " {\n".to_string()), arms_str), "\n}".to_string()) -} + ExprData::ExprMatch => { + let s = match_scrutinee(frame.expr.clone()); + let arm_list = match_arm_nodes(frame.expr.clone()); + let scrut_str = emit_typed_expr( + s.clone(), + registry.clone(), + &frame.scope.clone(), + frame.depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + let tco_scrut_type = match s.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => { + let is_optional = (rt.return_cardinality.clone() == Cardinality::CardOptional); + if is_optional { + authored_name_at( + frame.scope.clone().type_env.clone().source_indices.clone(), + &with_required_cardinality(&rt), + ) + } else { + authored_name_at( + frame.scope.clone().type_env.clone().source_indices.clone(), + &rt, + ) + } + } + _ => "".to_string(), + }; + let rc_match = analyze_rc_match( + &s, + arm_list.clone(), + tco_scrut_type.clone(), + &shared_types, + emit_info.clone(), + &frame.scope.clone().type_env.clone().source_indices.clone(), + ); + let arm_strs = Rc::new({ + let mut __result = Vec::new(); + for arm in arm_list.clone().iter().cloned() { + __result.push(emit_typed_tco_match_arm( + &arm, + fn_name.clone(), + params.clone(), + ®istry, + &frame.scope.clone(), + frame.depth.clone(), + &shared_types, + &emit_info, + &tco_scrut_type, + )); + } + __result + }); + let arms_str = arm_strs.join(&"\n".to_string()); + let tco_needs_as_str = + (all_arms_are_string_lit(&arm_list) && ((arm_list.clone().len() as i64) > 0)); + if rc_match.needs_option_deref.clone() { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("match ".to_string(), scrut_str), + ".as_deref()".to_string(), + ), + clone_iterator_suffix(), + ), + " {\n".to_string(), + ), + arms_str, + ), + "\n}".to_string(), + ) } else { - if tco_needs_as_str { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("match ".to_string(), scrut_str), ".as_str() {\n".to_string()), arms_str), "\n}".to_string()) + if rc_match.needs_deref.clone() { + { + let sharing = language_spec(RenderTarget::Rust).sharing.clone(); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "match ".to_string(), + apply_type_template1( + sharing.deref_clone.clone(), + scrut_str, + ), + ), + " {\n".to_string(), + ), + arms_str, + ), + "\n}".to_string(), + ) + } } else { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("match ".to_string(), scrut_str), " {\n".to_string()), arms_str), "\n}".to_string()) + if tco_needs_as_str { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("match ".to_string(), scrut_str), + ".as_str() {\n".to_string(), + ), + arms_str, + ), + "\n}".to_string(), + ) + } else { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("match ".to_string(), scrut_str), + " {\n".to_string(), + ), + arms_str, + ), + "\n}".to_string(), + ) + } } } } -}, - _ => emit_error_expr("emit_rust_tco_match expected ExprMatch".to_string(), RenderTarget::Rust), -} + _ => emit_error_expr( + "emit_rust_tco_match expected ExprMatch".to_string(), + RenderTarget::Rust, + ), + } } -pub fn emit_rust_tco_let(frame: &Rc, fn_name: String, params: &Rc>>, registry: &Rc>>, shared_types: &Rc>, emit_info: &Rc) -> String { +pub fn emit_rust_tco_let( + frame: &Rc, + fn_name: String, + params: &Rc>>, + registry: &Rc>>, + shared_types: &Rc>, + emit_info: &Rc, +) -> String { match (*frame.expr.clone().expr_data.clone()).clone() { - ExprData::ExprLet => { - let n = let_binding_name_at(frame.expr.clone(), frame.scope.clone().type_env.clone().source_indices.clone()); -let v = let_value(frame.expr.clone()); -let bd = let_body(frame.expr.clone()); -let val_str = emit_typed_expr(v.clone(), registry.clone(), &frame.scope.clone(), frame.depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -let is_param = { let mut __found = false; for p in params.clone().iter().cloned() { if (param_node_name_at(p.clone(), frame.scope.clone().type_env.clone().source_indices.clone()).as_str() == n.clone().as_str()) { __found = true; break; } } __found }; -let let_line = if is_param { - v2_rt::concat(v2_rt::concat(v2_rt::concat(emit_ident(n.clone(), RenderTarget::Rust), " = ".to_string()), val_str), ";".to_string()) - } else { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("let ".to_string(), emit_ident(n.clone(), RenderTarget::Rust)), " = ".to_string()), val_str), ";".to_string()) - }; -let next_scope = extend_scope(&frame.scope.clone(), &n, resolved_type(v.clone()), Rc::new(SubValueRelation::SubValueUnknown)); -match bd { - Some(b) => v2_rt::concat(v2_rt::concat(let_line, "\n".to_string()), emit_typed_tco_expr(b.clone(), &fn_name, params.clone(), registry.clone(), next_scope, frame.depth.clone(), shared_types.clone(), emit_info.clone())), - None => let_line, -} -}, - _ => emit_error_expr("emit_rust_tco_let expected ExprLet".to_string(), RenderTarget::Rust), -} + ExprData::ExprLet => { + let n = let_binding_name_at( + frame.expr.clone(), + frame.scope.clone().type_env.clone().source_indices.clone(), + ); + let v = let_value(frame.expr.clone()); + let bd = let_body(frame.expr.clone()); + let val_str = emit_typed_expr( + v.clone(), + registry.clone(), + &frame.scope.clone(), + frame.depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + let is_param = { + let mut __found = false; + for p in params.clone().iter().cloned() { + if (param_node_name_at( + p.clone(), + frame.scope.clone().type_env.clone().source_indices.clone(), + ) + .as_str() + == n.clone().as_str()) + { + __found = true; + break; + } + } + __found + }; + let let_line = if is_param { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(emit_ident(n.clone(), RenderTarget::Rust), " = ".to_string()), + val_str, + ), + ";".to_string(), + ) + } else { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "let ".to_string(), + emit_ident(n.clone(), RenderTarget::Rust), + ), + " = ".to_string(), + ), + val_str, + ), + ";".to_string(), + ) + }; + let next_scope = extend_scope( + &frame.scope.clone(), + &n, + resolved_type(v.clone()), + Rc::new(SubValueRelation::SubValueUnknown), + ); + match bd { + Some(b) => v2_rt::concat( + v2_rt::concat(let_line, "\n".to_string()), + emit_typed_tco_expr( + b.clone(), + &fn_name, + params.clone(), + registry.clone(), + next_scope, + frame.depth.clone(), + shared_types.clone(), + emit_info.clone(), + ), + ), + None => let_line, + } + } + _ => emit_error_expr( + "emit_rust_tco_let expected ExprLet".to_string(), + RenderTarget::Rust, + ), + } } -pub fn emit_rust_tco_block(frame: &Rc, fn_name: String, params: &Rc>>, registry: &Rc>>, shared_types: &Rc>, emit_info: &Rc) -> String { +pub fn emit_rust_tco_block( + frame: &Rc, + fn_name: String, + params: &Rc>>, + registry: &Rc>>, + shared_types: &Rc>, + emit_info: &Rc, +) -> String { match (*frame.expr.clone().expr_data.clone()).clone() { - ExprData::ExprBlock => { - let ss = frame.expr.clone().children.clone(); -if ((ss.clone().len() as i64) == 0) { - "break;".to_string() - } else { - { - let init_state = emit_tco_init_block_stmts(ss.clone(), Rc::new(vec![]), frame.scope.clone(), registry.clone(), frame.depth.clone(), shared_types.clone(), emit_info.clone(), params.clone()); -let last_str = match ss.clone().last().cloned() { - Some(last_expr) => emit_typed_tco_expr(last_expr.clone(), &fn_name, params.clone(), registry.clone(), init_state.scope.clone(), frame.depth.clone(), shared_types.clone(), emit_info.clone()), - None => "break;".to_string(), -}; -if ((init_state.text.clone().len() as i64) == 0) { - last_str - } else { - v2_rt::concat(v2_rt::concat(init_state.text.clone().join(&"\n".to_string()), "\n".to_string()), last_str) + ExprData::ExprBlock => { + let ss = frame.expr.clone().children.clone(); + if ((ss.clone().len() as i64) == 0) { + "break;".to_string() + } else { + { + let init_state = emit_tco_init_block_stmts( + ss.clone(), + Rc::new(vec![]), + frame.scope.clone(), + registry.clone(), + frame.depth.clone(), + shared_types.clone(), + emit_info.clone(), + params.clone(), + ); + let last_str = match ss.clone().last().cloned() { + Some(last_expr) => emit_typed_tco_expr( + last_expr.clone(), + &fn_name, + params.clone(), + registry.clone(), + init_state.scope.clone(), + frame.depth.clone(), + shared_types.clone(), + emit_info.clone(), + ), + None => "break;".to_string(), + }; + if ((init_state.text.clone().len() as i64) == 0) { + last_str + } else { + v2_rt::concat( + v2_rt::concat( + init_state.text.clone().join(&"\n".to_string()), + "\n".to_string(), + ), + last_str, + ) + } } -} + } } -}, - _ => emit_error_expr("emit_rust_tco_block expected ExprBlock".to_string(), RenderTarget::Rust), -} + _ => emit_error_expr( + "emit_rust_tco_block expected ExprBlock".to_string(), + RenderTarget::Rust, + ), + } } -pub fn emit_rust_tco_default_return(frame: &Rc, registry: Rc>>, shared_types: Rc>, emit_info: Rc) -> String { +pub fn emit_rust_tco_default_return( + frame: &Rc, + registry: Rc>>, + shared_types: Rc>, + emit_info: Rc, +) -> String { { - let val_str = emit_typed_expr(frame.expr.clone(), registry, &frame.scope.clone(), frame.depth.clone(), shared_types, emit_info, 1024); -v2_rt::concat(v2_rt::concat("break ".to_string(), val_str), ";".to_string()) -} -} - -pub fn emit_typed_tco_expr(texpr: Rc, fn_name: &String, params: Rc>>, registry: Rc>>, scope: Rc, depth: i64, shared_types: Rc>, emit_info: Rc) -> String { - emit_shared_tco_expr(Rc::new(TcoFrame { - expr: texpr, - scope: scope, - depth: depth, -}), fn_name.clone(), |input| emit_typed_tco_reassign(input.args.clone(), ¶ms, registry.clone(), &input.scope.clone(), input.depth.clone(), shared_types.clone(), &emit_info), |frame| emit_rust_tco_non_self_call(&frame, registry.clone(), shared_types.clone(), emit_info.clone()), |frame| emit_rust_tco_if(&frame, &fn_name, ¶ms, ®istry, &shared_types, &emit_info), |frame| emit_rust_tco_match(&frame, fn_name.clone(), params.clone(), ®istry, &shared_types, &emit_info), |frame| emit_rust_tco_let(&frame, fn_name.clone(), ¶ms, ®istry, &shared_types, &emit_info), |frame| emit_rust_tco_block(&frame, fn_name.clone(), ¶ms, ®istry, &shared_types, &emit_info), |frame| emit_rust_tco_default_return(&frame, registry.clone(), shared_types.clone(), emit_info.clone())) + let val_str = emit_typed_expr( + frame.expr.clone(), + registry, + &frame.scope.clone(), + frame.depth.clone(), + shared_types, + emit_info, + 1024, + ); + v2_rt::concat( + v2_rt::concat("break ".to_string(), val_str), + ";".to_string(), + ) + } } -pub fn emit_typed_tco_match_arm(arm: &Rc, fn_name: String, params: Rc>>, registry: &Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: &Rc, scrut_type: &String) -> String { +pub fn emit_typed_tco_expr( + texpr: Rc, + fn_name: &String, + params: Rc>>, + registry: Rc>>, + scope: Rc, + depth: i64, + shared_types: Rc>, + emit_info: Rc, +) -> String { + emit_shared_tco_expr( + Rc::new(TcoFrame { + expr: texpr, + scope: scope, + depth: depth, + }), + fn_name.clone(), + |input| { + emit_typed_tco_reassign( + input.args.clone(), + ¶ms, + registry.clone(), + &input.scope.clone(), + input.depth.clone(), + shared_types.clone(), + &emit_info, + ) + }, + |frame| { + emit_rust_tco_non_self_call( + &frame, + registry.clone(), + shared_types.clone(), + emit_info.clone(), + ) + }, + |frame| { + emit_rust_tco_if( + &frame, + &fn_name, + ¶ms, + ®istry, + &shared_types, + &emit_info, + ) + }, + |frame| { + emit_rust_tco_match( + &frame, + fn_name.clone(), + params.clone(), + ®istry, + &shared_types, + &emit_info, + ) + }, + |frame| { + emit_rust_tco_let( + &frame, + fn_name.clone(), + ¶ms, + ®istry, + &shared_types, + &emit_info, + ) + }, + |frame| { + emit_rust_tco_block( + &frame, + fn_name.clone(), + ¶ms, + ®istry, + &shared_types, + &emit_info, + ) + }, + |frame| { + emit_rust_tco_default_return( + &frame, + registry.clone(), + shared_types.clone(), + emit_info.clone(), + ) + }, + ) +} + +pub fn emit_typed_tco_match_arm( + arm: &Rc, + fn_name: String, + params: Rc>>, + registry: &Rc>>, + scope: &Rc, + depth: i64, + shared_types: &Rc>, + emit_info: &Rc, + scrut_type: &String, +) -> String { { let arm_pat = arm_pattern(arm.clone()); -let arm_g = arm_guard(&arm); -let arm_b = arm_body(&arm); -let si = scope.type_env.clone().source_indices.clone(); -let rc_analysis = analyze_rc_pattern(arm_pat.clone(), scrut_type.clone(), &shared_types, &emit_info, si.clone()); -let pat_str = if rc_analysis.needs_rc_pattern.clone() { - emit_pattern_rc_aware(arm_pat.clone(), rc_analysis.clone(), shared_types.clone(), scrut_type.clone(), si.clone(), emit_info.clone()) - } else { - emit_pattern(arm_pat.clone(), shared_types.clone(), scrut_type.clone(), si.clone(), emit_info.clone()) + let arm_g = arm_guard(&arm); + let arm_b = arm_body(&arm); + let si = scope.type_env.clone().source_indices.clone(); + let rc_analysis = analyze_rc_pattern( + arm_pat.clone(), + scrut_type.clone(), + &shared_types, + &emit_info, + si.clone(), + ); + let pat_str = if rc_analysis.needs_rc_pattern.clone() { + emit_pattern_rc_aware( + arm_pat.clone(), + rc_analysis.clone(), + shared_types.clone(), + scrut_type.clone(), + si.clone(), + emit_info.clone(), + ) + } else { + emit_pattern( + arm_pat.clone(), + shared_types.clone(), + scrut_type.clone(), + si.clone(), + emit_info.clone(), + ) }; -let field_guards = collect_pattern_string_guards(arm_pat.clone(), si.clone()); -let arm_guard_str = match arm_g { - Some(g) => emit_typed_expr(g.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024), - None => "".to_string(), -}; -let guard_str = if ((field_guards.clone().as_str() != "".to_string().as_str()) && (arm_guard_str.clone().as_str() != "".to_string().as_str())) { - v2_rt::concat(v2_rt::concat(v2_rt::concat(" if ".to_string(), field_guards.clone()), " && ".to_string()), arm_guard_str.clone()) + let field_guards = collect_pattern_string_guards(arm_pat.clone(), si.clone()); + let arm_guard_str = match arm_g { + Some(g) => emit_typed_expr( + g.clone(), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ), + None => "".to_string(), + }; + let guard_str = if ((field_guards.clone().as_str() != "".to_string().as_str()) + && (arm_guard_str.clone().as_str() != "".to_string().as_str())) + { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(" if ".to_string(), field_guards.clone()), + " && ".to_string(), + ), + arm_guard_str.clone(), + ) } else { if (field_guards.clone().as_str() != "".to_string().as_str()) { v2_rt::concat(" if ".to_string(), field_guards.clone()) @@ -4258,199 +10862,529 @@ let guard_str = if ((field_guards.clone().as_str() != "".to_string().as_str()) & } } }; -let body_str = emit_typed_tco_expr(arm_b, &fn_name, params, registry.clone(), scope.clone(), depth.clone(), shared_types.clone(), emit_info.clone()); -if rc_analysis.needs_rc_pattern.clone() { + let body_str = emit_typed_tco_expr( + arm_b, + &fn_name, + params, + registry.clone(), + scope.clone(), + depth.clone(), + shared_types.clone(), + emit_info.clone(), + ); + if rc_analysis.needs_rc_pattern.clone() { { - let prelude = rc_pattern_preludes(arm_pat.clone(), rc_analysis.clone(), shared_types.clone(), si.clone(), emit_info.clone()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" ".to_string(), pat_str), guard_str), " => { ".to_string()), prelude), " ".to_string()), body_str), " },".to_string()) -} + let prelude = rc_pattern_preludes( + arm_pat.clone(), + rc_analysis.clone(), + shared_types.clone(), + si.clone(), + emit_info.clone(), + ); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(" ".to_string(), pat_str), + guard_str, + ), + " => { ".to_string(), + ), + prelude, + ), + " ".to_string(), + ), + body_str, + ), + " },".to_string(), + ) + } } else { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" ".to_string(), pat_str), guard_str), " => { ".to_string()), body_str), " },".to_string()) + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(v2_rt::concat(" ".to_string(), pat_str), guard_str), + " => { ".to_string(), + ), + body_str, + ), + " },".to_string(), + ) } -} + } } -pub fn expr_references_var(node: &Rc, var_name: String, source_indices: Rc>>) -> bool { +pub fn expr_references_var( + node: &Rc, + var_name: String, + source_indices: Rc>>, +) -> bool { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*node.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => (expr_var_name_at(node.clone(), source_indices.clone()).as_str() == var_name.clone().as_str()), - _ => { let mut __found = false; for c in node.children.clone().iter().cloned() { if expr_references_var(&c, var_name.clone(), source_indices.clone()) { __found = true; break; } } __found }, -} + ExprData::ExprVar { .. } => { + (expr_var_name_at(node.clone(), source_indices.clone()).as_str() + == var_name.clone().as_str()) + } + _ => { + let mut __found = false; + for c in node.children.clone().iter().cloned() { + if expr_references_var(&c, var_name.clone(), source_indices.clone()) { + __found = true; + break; + } + } + __found + } + } }) } -pub fn emit_typed_tco_reassign(args: Rc>>, params: &Rc>>, registry: Rc>>, scope: &Rc, depth: i64, shared_types: Rc>, emit_info: &Rc) -> String { +pub fn emit_typed_tco_reassign( + args: Rc>>, + params: &Rc>>, + registry: Rc>>, + scope: &Rc, + depth: i64, + shared_types: Rc>, + emit_info: &Rc, +) -> String { { let si = scope.type_env.clone().source_indices.clone(); -let arg_values = Rc::new({ let mut __result = Vec::new(); for a in args.iter().cloned() { __result.push(arg_value(&a)); } __result }); -let identity_params = Rc::new(params.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned().fold(v2_rt::rc_empty_map::(), |m: Rc>, pair: (i64, Rc)| { - let pname = param_node_name_at(pair.1.clone(), si.clone()); -let av = match arg_values.clone().get(pair.0.clone() as usize).cloned() { - Some(v) => v.clone(), - None => pair.1.clone(), -}; -if is_tco_identity_passthrough(&av, pname.clone(), si.clone()) { - v2_rt::rc_map_insert(m.clone(), pname.clone(), true) - } else { - m.clone() + let arg_values = Rc::new({ + let mut __result = Vec::new(); + for a in args.iter().cloned() { + __result.push(arg_value(&a)); } -}); -let filtered_arg_values = Rc::new({ let mut __result = Vec::new(); for pair in Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(params.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { if match v2_rt::map_get(&identity_params, param_node_name_at(pair.1.clone(), si.clone())) { - Some(_) => false, - None => true, -} { __result.push(pair); } } __result }).iter().cloned() { __result.push(match arg_values.clone().get(pair.0.clone() as usize).cloned() { - Some(v) => v.clone(), - None => pair.1.clone(), -}); } __result }); -let filtered_params = Rc::new({ let mut __result = Vec::new(); for p in params.clone().iter().cloned() { if match v2_rt::map_get(&identity_params, param_node_name_at(p.clone(), si.clone())) { - Some(_) => false, - None => true, -} { __result.push(p); } } __result }); -let tco_movable = filtered_params.clone().iter().cloned().fold(emit_info.movable.clone(), |m: Rc>, p: Rc| { - let pname = param_node_name_at(p.clone(), si.clone()); -let ref_count = filtered_arg_values.clone().iter().cloned().fold(0, |n: i64, av: Rc| if expr_references_var(&av, pname.clone(), si.clone()) { - (n.clone() + 1) - } else { - n.clone() - }); -if (ref_count.clone() <= 1) { - v2_rt::rc_map_insert(m.clone(), pname.clone(), true) - } else { - m.clone() + __result + }); + let identity_params = Rc::new( + params + .clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + .fold( + v2_rt::rc_empty_map::(), + |m: Rc>, pair: (i64, Rc)| { + let pname = param_node_name_at(pair.1.clone(), si.clone()); + let av = match arg_values.clone().get(pair.0.clone() as usize).cloned() { + Some(v) => v.clone(), + None => pair.1.clone(), + }; + if is_tco_identity_passthrough(&av, pname.clone(), si.clone()) { + v2_rt::rc_map_insert(m.clone(), pname.clone(), true) + } else { + m.clone() + } + }, + ); + let filtered_arg_values = Rc::new({ + let mut __result = Vec::new(); + for pair in Rc::new({ + let mut __result = Vec::new(); + for pair in Rc::new( + params + .clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + { + if match v2_rt::map_get( + &identity_params, + param_node_name_at(pair.1.clone(), si.clone()), + ) { + Some(_) => false, + None => true, + } { + __result.push(pair); + } + } + __result + }) + .iter() + .cloned() + { + __result.push( + match arg_values.clone().get(pair.0.clone() as usize).cloned() { + Some(v) => v.clone(), + None => pair.1.clone(), + }, + ); } -}); -let tco_emit_info = Rc::new(EmitGraphInfo { movable: tco_movable, ..(*emit_info.clone()).clone() }); -let ordered_args = Rc::new({ let mut __result = Vec::new(); for av in filtered_arg_values.clone().iter().cloned() { __result.push(emit_typed_expr(av.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), tco_emit_info.clone(), 1024)); } __result }); -let param_names = Rc::new({ let mut __result = Vec::new(); for p in filtered_params.clone().iter().cloned() { __result.push(emit_ident(param_node_name_at(p.clone(), si.clone()), RenderTarget::Rust)); } __result }); -let all_lines = tco_reassign_core(ordered_args, param_names, "__tco_".to_string(), "let ".to_string(), " = ".to_string(), ";".to_string(), "continue;".to_string(), &"".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat("{\n".to_string(), make_indent((depth.clone() + 1))), all_lines.join(&"\n".to_string())), "\n}".to_string()) -} + __result + }); + let filtered_params = Rc::new({ + let mut __result = Vec::new(); + for p in params.clone().iter().cloned() { + if match v2_rt::map_get(&identity_params, param_node_name_at(p.clone(), si.clone())) + { + Some(_) => false, + None => true, + } { + __result.push(p); + } + } + __result + }); + let tco_movable = + filtered_params.clone().iter().cloned().fold( + emit_info.movable.clone(), + |m: Rc>, p: Rc| { + let pname = param_node_name_at(p.clone(), si.clone()); + let ref_count = filtered_arg_values.clone().iter().cloned().fold( + 0, + |n: i64, av: Rc| { + if expr_references_var(&av, pname.clone(), si.clone()) { + (n.clone() + 1) + } else { + n.clone() + } + }, + ); + if (ref_count.clone() <= 1) { + v2_rt::rc_map_insert(m.clone(), pname.clone(), true) + } else { + m.clone() + } + }, + ); + let tco_emit_info = Rc::new(EmitGraphInfo { + movable: tco_movable, + ..(*emit_info.clone()).clone() + }); + let ordered_args = Rc::new({ + let mut __result = Vec::new(); + for av in filtered_arg_values.clone().iter().cloned() { + __result.push(emit_typed_expr( + av.clone(), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + tco_emit_info.clone(), + 1024, + )); + } + __result + }); + let param_names = Rc::new({ + let mut __result = Vec::new(); + for p in filtered_params.clone().iter().cloned() { + __result.push(emit_ident( + param_node_name_at(p.clone(), si.clone()), + RenderTarget::Rust, + )); + } + __result + }); + let all_lines = tco_reassign_core( + ordered_args, + param_names, + "__tco_".to_string(), + "let ".to_string(), + " = ".to_string(), + ";".to_string(), + "continue;".to_string(), + &"".to_string(), + ); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("{\n".to_string(), make_indent((depth.clone() + 1))), + all_lines.join(&"\n".to_string()), + ), + "\n}".to_string(), + ) + } } -pub fn emit_service_def(item: &Rc, registry: Rc>>, shared_types: Rc>, env: &Rc) -> String { +pub fn emit_service_def( + item: &Rc, + registry: Rc>>, + shared_types: Rc>, + env: &Rc, +) -> String { { let safe_name = sanitize_service_name(authored_name(env.clone(), item.clone())); -let fallback_transport = service_fallback_transport(&item); -let op_children = item.children.clone(); -let struct_def = emit_service_struct(safe_name.clone(), fallback_transport.clone(), op_children.clone(), item.clone(), env.source_indices.clone()); -let impl_block = emit_service_impl(&safe_name, &fallback_transport, &op_children, registry, shared_types, &env, &item); -v2_rt::concat(v2_rt::concat(struct_def, "\n\n".to_string()), impl_block) -} + let fallback_transport = service_fallback_transport(&item); + let op_children = item.children.clone(); + let struct_def = emit_service_struct( + safe_name.clone(), + fallback_transport.clone(), + op_children.clone(), + item.clone(), + env.source_indices.clone(), + ); + let impl_block = emit_service_impl( + &safe_name, + &fallback_transport, + &op_children, + registry, + shared_types, + &env, + &item, + ); + v2_rt::concat(v2_rt::concat(struct_def, "\n\n".to_string()), impl_block) + } } -pub fn emit_service_struct(name: String, fallback_transport: Rc, op_children: Rc>>, service_item: Rc, source_indices: Rc>>) -> String { +pub fn emit_service_struct( + name: String, + fallback_transport: Rc, + op_children: Rc>>, + service_item: Rc, + source_indices: Rc>>, +) -> String { { let derives = "#[derive(Debug, Clone)]".to_string(); -let config_fields = emit_service_config_fields(fallback_transport, op_children, service_item, &source_indices); -let dry_run_field = "\n pub dry_run: crate::dry_run::DryRunMode,".to_string(); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(derives, "\npub struct ".to_string()), name), " {\n".to_string()), config_fields), dry_run_field), "\n}".to_string()) -} + let config_fields = emit_service_config_fields( + fallback_transport, + op_children, + service_item, + &source_indices, + ); + let dry_run_field = "\n pub dry_run: crate::dry_run::DryRunMode,".to_string(); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(v2_rt::concat(derives, "\npub struct ".to_string()), name), + " {\n".to_string(), + ), + config_fields, + ), + dry_run_field, + ), + "\n}".to_string(), + ) + } } -pub fn emit_service_config_fields(fallback_transport: Rc, op_children: Rc>>, service_item: Rc, source_indices: &Rc>>) -> String { +pub fn emit_service_config_fields( + fallback_transport: Rc, + op_children: Rc>>, + service_item: Rc, + source_indices: &Rc>>, +) -> String { { let fs = compute_service_fields(&fallback_transport, &op_children, &source_indices); -let has_svc_auth = match service_config_auth_source(service_item, source_indices.clone()) { - Some(_) => true, - None => false, -}; -let fs = if has_svc_auth { + let has_svc_auth = match service_config_auth_source(service_item, source_indices.clone()) { + Some(_) => true, + None => false, + }; + let fs = if has_svc_auth { ServiceFieldSet { - has_rest: fs.has_rest.clone(), - has_shell: fs.has_shell.clone(), - has_file: fs.has_file.clone(), - has_auth: true, -} + has_rest: fs.has_rest.clone(), + has_shell: fs.has_shell.clone(), + has_file: fs.has_file.clone(), + has_auth: true, + } } else { fs.clone() }; -let decls = service_field_decls(&fs, &language_spec(RenderTarget::Rust).service_fields.clone()); -if ((decls.clone().len() as i64) == 0) { + let decls = service_field_decls( + &fs, + &language_spec(RenderTarget::Rust).service_fields.clone(), + ); + if ((decls.clone().len() as i64) == 0) { " // No configuration needed for local binding.\n".to_string() } else { decls.clone().join(&"".to_string()) } -} + } } -pub fn emit_service_impl(name: &String, transport: &Rc, op_children: &Rc>>, registry: Rc>>, shared_types: Rc>, env: &Rc, service_item: &Rc) -> String { +pub fn emit_service_impl( + name: &String, + transport: &Rc, + op_children: &Rc>>, + registry: Rc>>, + shared_types: Rc>, + env: &Rc, + service_item: &Rc, +) -> String { { let depth = 0; -let new_method = emit_service_new_method(name.clone(), &transport, op_children.clone(), &service_item, &env.source_indices.clone()); -let method_strs = Rc::new({ let mut __result = Vec::new(); for op_node in op_children.clone().iter().cloned() { __result.push(emit_operation_method(name.clone(), transport.clone(), &op_node, ®istry, (depth.clone() + 1), &shared_types, &env, service_item.clone())); } __result }); -let all_methods = v2_rt::concat(Rc::new(vec![new_method]), method_strs); -let methods_str = all_methods.join(&"\n\n".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("impl ".to_string(), name.clone()), " {\n".to_string()), make_indent((depth.clone() + 1))), methods_str), "\n}".to_string()) -} + let new_method = emit_service_new_method( + name.clone(), + &transport, + op_children.clone(), + &service_item, + &env.source_indices.clone(), + ); + let method_strs = Rc::new({ + let mut __result = Vec::new(); + for op_node in op_children.clone().iter().cloned() { + __result.push(emit_operation_method( + name.clone(), + transport.clone(), + &op_node, + ®istry, + (depth.clone() + 1), + &shared_types, + &env, + service_item.clone(), + )); + } + __result + }); + let all_methods = v2_rt::concat(Rc::new(vec![new_method]), method_strs); + let methods_str = all_methods.join(&"\n\n".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("impl ".to_string(), name.clone()), + " {\n".to_string(), + ), + make_indent((depth.clone() + 1)), + ), + methods_str, + ), + "\n}".to_string(), + ) + } } -pub fn emit_service_new_method(name: String, fallback_transport: &Rc, op_children: Rc>>, service_item: &Rc, source_indices: &Rc>>) -> String { +pub fn emit_service_new_method( + name: String, + fallback_transport: &Rc, + op_children: Rc>>, + service_item: &Rc, + source_indices: &Rc>>, +) -> String { { let fs = compute_service_fields(&fallback_transport, &op_children, &source_indices); -let has_svc_auth = match service_config_auth_source(service_item.clone(), source_indices.clone()) { - Some(_) => true, - None => false, -}; -let fs = if has_svc_auth { + let has_svc_auth = + match service_config_auth_source(service_item.clone(), source_indices.clone()) { + Some(_) => true, + None => false, + }; + let fs = if has_svc_auth { ServiceFieldSet { - has_rest: fs.has_rest.clone(), - has_shell: fs.has_shell.clone(), - has_file: fs.has_file.clone(), - has_auth: true, -} + has_rest: fs.has_rest.clone(), + has_shell: fs.has_shell.clone(), + has_file: fs.has_file.clone(), + has_auth: true, + } } else { fs.clone() }; -let from_config = match service_config_endpoint(service_item.clone(), source_indices.clone()) { - Some(ep) => match (*ep.expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitStr { value: s, .. } = value.as_ref() else { unreachable!() }; s.clone() }, - _ => "".to_string(), -}, - None => "".to_string(), -}; -let base_url_default = if (from_config.clone().as_str() != "".to_string().as_str()) { + let from_config = + match service_config_endpoint(service_item.clone(), source_indices.clone()) { + Some(ep) => match (*ep.expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { + let LiteralValue::LitStr { value: s, .. } = value.as_ref() else { + unreachable!() + }; + s.clone() + } + _ => "".to_string(), + }, + None => "".to_string(), + }; + let base_url_default = if (from_config.clone().as_str() != "".to_string().as_str()) { from_config.clone() } else { if fs.has_rest.clone() { { - let fallback_is_rest = is_rest_transport(fallback_transport.clone(), source_indices.clone()); -let from_fallback = if fallback_is_rest { - match transport_base_url(fallback_transport.clone(), source_indices.clone()) { - Some(bu) => match (*bu.expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitStr { value: s, .. } = value.as_ref() else { unreachable!() }; s.clone() }, - _ => "".to_string(), -}, - None => "".to_string(), -} + let fallback_is_rest = + is_rest_transport(fallback_transport.clone(), source_indices.clone()); + let from_fallback = if fallback_is_rest { + match transport_base_url(fallback_transport.clone(), source_indices.clone()) + { + Some(bu) => match (*bu.expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { + let LiteralValue::LitStr { value: s, .. } = value.as_ref() + else { + unreachable!() + }; + s.clone() + } + _ => "".to_string(), + }, + None => "".to_string(), + } } else { "".to_string() }; -if (from_fallback.clone().as_str() != "".to_string().as_str()) { + if (from_fallback.clone().as_str() != "".to_string().as_str()) { from_fallback.clone() } else { "http://localhost".to_string() } -} + } } else { "".to_string() } }; -let ctors = service_field_ctors(&fs, &language_spec(RenderTarget::Rust).service_fields.clone()); -let ctors = Rc::new({ let mut __result = Vec::new(); for c in ctors.clone().iter().cloned() { __result.push(apply_type_template1(c.clone(), base_url_default.clone())); } __result }); -let ctors = match service_config_auth_source(service_item.clone(), source_indices.clone()) { - Some(src) => Rc::new({ let mut __result = Vec::new(); for c in ctors.clone().iter().cloned() { __result.push(if v2_rt::contains(c.clone(), "auth_token".to_string()) { - emit_auth_source_ctor(&src, source_indices.clone()) - } else { - c.clone() - }); } __result }), - None => ctors.clone(), -}; -let inits = ctors.clone().join(&"".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("pub fn new(dry_run: crate::dry_run::DryRunMode) -> Self {\n".to_string(), " ".to_string()), name), " {\n".to_string()), inits), " dry_run,\n".to_string()), " }\n".to_string()), "}".to_string()) -} + let ctors = service_field_ctors( + &fs, + &language_spec(RenderTarget::Rust).service_fields.clone(), + ); + let ctors = Rc::new({ + let mut __result = Vec::new(); + for c in ctors.clone().iter().cloned() { + __result.push(apply_type_template1(c.clone(), base_url_default.clone())); + } + __result + }); + let ctors = match service_config_auth_source(service_item.clone(), source_indices.clone()) { + Some(src) => Rc::new({ + let mut __result = Vec::new(); + for c in ctors.clone().iter().cloned() { + __result.push(if v2_rt::contains(c.clone(), "auth_token".to_string()) { + emit_auth_source_ctor(&src, source_indices.clone()) + } else { + c.clone() + }); + } + __result + }), + None => ctors.clone(), + }; + let inits = ctors.clone().join(&"".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "pub fn new(dry_run: crate::dry_run::DryRunMode) -> Self {\n" + .to_string(), + " ".to_string(), + ), + name, + ), + " {\n".to_string(), + ), + inits, + ), + " dry_run,\n".to_string(), + ), + " }\n".to_string(), + ), + "}".to_string(), + ) + } } -pub fn emit_auth_source_ctor(source_expr: &Rc, source_indices: Rc>>) -> String { +pub fn emit_auth_source_ctor( + source_expr: &Rc, + source_indices: Rc>>, +) -> String { match (*source_expr.expr_data.clone()).clone() { ExprData::ExprRecordLit { .. } => match record_lit_type_name_at(source_expr.clone(), source_indices) { Some(variant) => if (variant.clone().as_str() == "EnvVar".to_string().as_str()) { @@ -4470,47 +11404,195 @@ pub fn emit_auth_source_ctor(source_expr: &Rc, source_indices: Rc>>, source_indices: Rc>>) -> String { +pub fn emit_modifier_doc_from_props( + properties: Rc>>, + source_indices: Rc>>, +) -> String { { let names = extract_modifier_names(properties, source_indices); -if ((names.clone().len() as i64) == 0) { + if ((names.clone().len() as i64) == 0) { "".to_string() } else { - v2_rt::concat(v2_rt::concat("/// Modifiers: ".to_string(), names.clone().join(&", ".to_string())), "\n".to_string()) + v2_rt::concat( + v2_rt::concat( + "/// Modifiers: ".to_string(), + names.clone().join(&", ".to_string()), + ), + "\n".to_string(), + ) } -} + } } -pub fn emit_operation_method(service_name: String, transport: Rc, op_node: &Rc, registry: &Rc>>, depth: i64, shared_types: &Rc>, env: &Rc, service_item: Rc) -> String { +pub fn emit_operation_method( + service_name: String, + transport: Rc, + op_node: &Rc, + registry: &Rc>>, + depth: i64, + shared_types: &Rc>, + env: &Rc, + service_item: Rc, +) -> String { { let op_text = authored_name(env.clone(), op_node.clone()); -let input_params = Rc::new({ let mut __result = Vec::new(); for p in op_node.params.clone().iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(emit_ident(param_node_name_at(p.clone(), env.source_indices.clone()), RenderTarget::Rust), rust_items().param_type_sep.clone()), emit_rust_param_type(¶m_node_type_expr(&p), &shared_types, &env.source_indices.clone()))); } __result }); -let params_str = input_params.join(&", ".to_string()); -let all_params = if (params_str.clone().as_str() == "".to_string().as_str()) { + let input_params = Rc::new({ + let mut __result = Vec::new(); + for p in op_node.params.clone().iter().cloned() { + __result.push(v2_rt::concat( + v2_rt::concat( + emit_ident( + param_node_name_at(p.clone(), env.source_indices.clone()), + RenderTarget::Rust, + ), + rust_items().param_type_sep.clone(), + ), + emit_rust_param_type( + ¶m_node_type_expr(&p), + &shared_types, + &env.source_indices.clone(), + ), + )); + } + __result + }); + let params_str = input_params.join(&", ".to_string()); + let all_params = if (params_str.clone().as_str() == "".to_string().as_str()) { "&self".to_string() } else { v2_rt::concat("&self, ".to_string(), params_str.clone()) }; -let ret_type = render_rust_type(resolved_type(op_node.clone()), shared_types.clone(), env.source_indices.clone()); -let eff_transport = effective_operation_transport(op_node.clone(), transport); -let op_inferred = resolved_type(op_node.clone()); -let real_body = emit_transport_call(&eff_transport, op_text.clone(), registry.clone(), (depth.clone() + 2), op_inferred, service_item, op_node.clone(), &env.source_indices.clone(), shared_types.clone(), env.clone()); -let mock_props = Rc::new({ let mut __result = Vec::new(); for p in op_node.properties.clone().iter().cloned() { if has_mock_prefix(&field_init_node_name_at(p.clone(), env.source_indices.clone())) { __result.push(p); } } __result }); -let dry_run_body = emit_dry_run_branch_from_props(&op_text, &resolved_type(op_node.clone()), &mock_props, registry.clone(), &env.source_indices.clone(), &op_node, env.clone(), shared_types.clone()); -let body = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("if self.dry_run.is_dry_run() {\n".to_string(), make_indent((depth.clone() + 2))), dry_run_body), "\n".to_string()), "} else {\n".to_string()), make_indent((depth.clone() + 2))), real_body), "\n".to_string()), "}".to_string()); -let modifier_doc = emit_modifier_doc_from_props(op_node.properties.clone(), env.source_indices.clone()); -let items = rust_items(); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(modifier_doc, rust_visibility_prefix()), items.async_prefix.clone()), items.func_keyword.clone()), " ".to_string()), emit_ident(op_text.clone(), RenderTarget::Rust)), "(".to_string()), all_params), ") -> Result<".to_string()), ret_type), ", Box> {\n".to_string()), make_indent((depth.clone() + 1))), body), "\n}".to_string()) -} + let ret_type = render_rust_type( + resolved_type(op_node.clone()), + shared_types.clone(), + env.source_indices.clone(), + ); + let eff_transport = effective_operation_transport(op_node.clone(), transport); + let op_inferred = resolved_type(op_node.clone()); + let real_body = emit_transport_call( + &eff_transport, + op_text.clone(), + registry.clone(), + (depth.clone() + 2), + op_inferred, + service_item, + op_node.clone(), + &env.source_indices.clone(), + shared_types.clone(), + env.clone(), + ); + let mock_props = Rc::new({ + let mut __result = Vec::new(); + for p in op_node.properties.clone().iter().cloned() { + if has_mock_prefix(&field_init_node_name_at( + p.clone(), + env.source_indices.clone(), + )) { + __result.push(p); + } + } + __result + }); + let dry_run_body = emit_dry_run_branch_from_props( + &op_text, + &resolved_type(op_node.clone()), + &mock_props, + registry.clone(), + &env.source_indices.clone(), + &op_node, + env.clone(), + shared_types.clone(), + ); + let body = v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "if self.dry_run.is_dry_run() {\n".to_string(), + make_indent((depth.clone() + 2)), + ), + dry_run_body, + ), + "\n".to_string(), + ), + "} else {\n".to_string(), + ), + make_indent((depth.clone() + 2)), + ), + real_body, + ), + "\n".to_string(), + ), + "}".to_string(), + ); + let modifier_doc = + emit_modifier_doc_from_props(op_node.properties.clone(), env.source_indices.clone()); + let items = rust_items(); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + modifier_doc, + rust_visibility_prefix(), + ), + items.async_prefix.clone(), + ), + items.func_keyword.clone(), + ), + " ".to_string(), + ), + emit_ident(op_text.clone(), RenderTarget::Rust), + ), + "(".to_string(), + ), + all_params, + ), + ") -> Result<".to_string(), + ), + ret_type, + ), + ", Box> {\n".to_string(), + ), + make_indent((depth.clone() + 1)), + ), + body, + ), + "\n}".to_string(), + ) + } } -pub fn emit_dry_run_branch_from_props(op_name: &String, inferred: &Rc, mock_props: &Rc>>, registry: Rc>>, source_indices: &Rc>>, op_node: &Rc, env: Rc, shared_types: Rc>) -> String { +pub fn emit_dry_run_branch_from_props( + op_name: &String, + inferred: &Rc, + mock_props: &Rc>>, + registry: Rc>>, + source_indices: &Rc>>, + op_node: &Rc, + env: Rc, + shared_types: Rc>, +) -> String { { - let log_line = v2_rt::concat(v2_rt::concat("eprintln!(\"[dry-run] ".to_string(), op_name.clone()), "\");".to_string()); -if ((mock_props.clone().len() as i64) > 0) { + let log_line = v2_rt::concat( + v2_rt::concat("eprintln!(\"[dry-run] ".to_string(), op_name.clone()), + "\");".to_string(), + ); + if ((mock_props.clone().len() as i64) > 0) { { let first_mock = mock_props.clone().first().cloned(); -match first_mock { + match first_mock { Some(mp) => { let mock_json = emit_data_value_json(&field_init_node_value(&mp), source_indices.clone()); let is_multi_field_conj = ((inferred.connective.clone() == Connective::Conj) && ((inferred.children.clone().len() as i64) > 1)); @@ -4578,19 +11660,58 @@ v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::con }, None => v2_rt::concat(log_line, "\ncompile_error!(\"mock property list was non-empty but first() returned None\")".to_string()), } -} + } } else { - v2_rt::concat(v2_rt::concat(v2_rt::concat(log_line, "\ncompile_error!(\"no mock data available for dry-run operation: ".to_string()), op_name.clone()), "\")".to_string()) + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + log_line, + "\ncompile_error!(\"no mock data available for dry-run operation: " + .to_string(), + ), + op_name.clone(), + ), + "\")".to_string(), + ) } -} + } } -pub fn emit_transport_call(transport: &Rc, op_name: String, registry: Rc>>, depth: i64, inferred: Rc, service_item: Rc, op_node: Rc, source_indices: &Rc>>, shared_types: Rc>, env: Rc) -> String { +pub fn emit_transport_call( + transport: &Rc, + op_name: String, + registry: Rc>>, + depth: i64, + inferred: Rc, + service_item: Rc, + op_node: Rc, + source_indices: &Rc>>, + shared_types: Rc>, + env: Rc, +) -> String { if is_rest_transport(transport.clone(), source_indices.clone()) { - emit_rest_call(op_name, &transport, registry, depth, service_item, op_node, &source_indices, shared_types, env) + emit_rest_call( + op_name, + &transport, + registry, + depth, + service_item, + op_node, + &source_indices, + shared_types, + env, + ) } else { if is_shell_transport(transport.clone()) { - emit_shell_call(op_name, &transport, registry, depth, inferred, &op_node, &source_indices) + emit_shell_call( + op_name, + &transport, + registry, + depth, + inferred, + &op_node, + &source_indices, + ) } else { if is_file_transport(transport.clone(), source_indices.clone()) { emit_file_call(op_name, inferred) @@ -4601,104 +11722,250 @@ pub fn emit_transport_call(transport: &Rc, op_name: String, registry: Rc, registry: Rc>>, depth: i64, service_item: Rc, op_node: Rc, source_indices: &Rc>>, shared_types: Rc>, env: Rc) -> String { +pub fn emit_rest_call( + op_name: String, + transport: &Rc, + registry: Rc>>, + depth: i64, + service_item: Rc, + op_node: Rc, + source_indices: &Rc>>, + shared_types: Rc>, + env: Rc, +) -> String { { - let client_init = "let client = reqwest::Client::builder().user_agent(\"gunbc/1.0\").build()?;".to_string(); -let url_line = emit_rest_url_line(transport.clone(), op_name, &source_indices); -let http_method = emit_rest_http_method(transport.clone(), &source_indices); -let auth_line = emit_rest_auth_line(&transport, &service_item, http_method, &source_indices); -let query_line = emit_rest_query_line(transport.clone(), &source_indices); -let body_line = emit_rest_body_line(transport.clone(), &source_indices); -let headers = transport_headers(transport.clone(), source_indices.clone()); -let header_lines = Rc::new({ let mut __result = Vec::new(); for h in headers.iter().cloned() { __result.push({ - let hval = field_init_node_value(&h); -let val_str = emit_simple_expr(&hval, &RenderTarget::Rust, &source_indices); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("let request = request.header(\"".to_string(), field_init_node_name_at(h.clone(), source_indices.clone())), "\", ".to_string()), val_str.clone()), ");".to_string()) -}); } __result }); -let send_line = "let response = request.send().await?;".to_string(); -let response_handling = emit_response_code_handling(&op_node, transport.clone(), &source_indices, shared_types, env); -let all_lines = Rc::new({ let mut __result = Vec::new(); for l in v2_rt::concat(v2_rt::concat(Rc::new(vec![client_init, url_line, auth_line]), header_lines), Rc::new(vec![query_line, body_line, send_line, response_handling])).iter().cloned() { if (l.clone().as_str() != "".to_string().as_str()) { __result.push(l); } } __result }); -all_lines.join(&"\n".to_string()) -} + let client_init = + "let client = reqwest::Client::builder().user_agent(\"gunbc/1.0\").build()?;" + .to_string(); + let url_line = emit_rest_url_line(transport.clone(), op_name, &source_indices); + let http_method = emit_rest_http_method(transport.clone(), &source_indices); + let auth_line = + emit_rest_auth_line(&transport, &service_item, http_method, &source_indices); + let query_line = emit_rest_query_line(transport.clone(), &source_indices); + let body_line = emit_rest_body_line(transport.clone(), &source_indices); + let headers = transport_headers(transport.clone(), source_indices.clone()); + let header_lines = Rc::new({ + let mut __result = Vec::new(); + for h in headers.iter().cloned() { + __result.push({ + let hval = field_init_node_value(&h); + let val_str = emit_simple_expr(&hval, &RenderTarget::Rust, &source_indices); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "let request = request.header(\"".to_string(), + field_init_node_name_at(h.clone(), source_indices.clone()), + ), + "\", ".to_string(), + ), + val_str.clone(), + ), + ");".to_string(), + ) + }); + } + __result + }); + let send_line = "let response = request.send().await?;".to_string(); + let response_handling = emit_response_code_handling( + &op_node, + transport.clone(), + &source_indices, + shared_types, + env, + ); + let all_lines = Rc::new({ + let mut __result = Vec::new(); + for l in v2_rt::concat( + v2_rt::concat( + Rc::new(vec![client_init, url_line, auth_line]), + header_lines, + ), + Rc::new(vec![query_line, body_line, send_line, response_handling]), + ) + .iter() + .cloned() + { + if (l.clone().as_str() != "".to_string().as_str()) { + __result.push(l); + } + } + __result + }); + all_lines.join(&"\n".to_string()) + } } -pub fn emit_rest_http_method(transport: Rc, source_indices: &Rc>>) -> String { +pub fn emit_rest_http_method( + transport: Rc, + source_indices: &Rc>>, +) -> String { match transport_method(transport, source_indices.clone()) { - Some(m) => match m.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { .. }) => { - let method_name = expr_var_name_at(m.clone(), source_indices.clone()); -Rc::new({ let mut __result = Vec::new(); for ch in Rc::new(method_name.chars().map(|c| c as i64).collect::>()).iter().cloned() { __result.push(to_lower_char(ch.clone())); } __result }).join(&"".to_string()) -}, - _ => "compile_error!(\"transport method type not resolved\")".to_string(), -}, - None => "compile_error!(\"transport method not specified\")".to_string(), -} + Some(m) => match m.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { .. }) => { + let method_name = expr_var_name_at(m.clone(), source_indices.clone()); + Rc::new({ + let mut __result = Vec::new(); + for ch in Rc::new(method_name.chars().map(|c| c as i64).collect::>()) + .iter() + .cloned() + { + __result.push(to_lower_char(ch.clone())); + } + __result + }) + .join(&"".to_string()) + } + _ => "compile_error!(\"transport method type not resolved\")".to_string(), + }, + None => "compile_error!(\"transport method not specified\")".to_string(), + } } -pub fn emit_rest_url_line(transport: Rc, op_name: String, source_indices: &Rc>>) -> String { +pub fn emit_rest_url_line( + transport: Rc, + op_name: String, + source_indices: &Rc>>, +) -> String { match transport_path_template(transport, source_indices.clone()) { - Some(path_node) => match (*path_node.expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitStr { value: path_str, .. } = value.as_ref() else { unreachable!() }; v2_rt::concat(v2_rt::concat("let url = format!(\"{}".to_string(), escape_string_literal_body(path_str.clone())), "\", self.base_url);".to_string()) }, - ExprData::ExprStringInterp => { - let parts = Rc::new({ let mut __result = Vec::new(); for child in path_node.children.clone().iter().cloned() { __result.push(match (*child.expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitStr { value: text, .. } = value.as_ref() else { unreachable!() }; Rc::new(StringPart::Text { - value: text.clone(), -}) }, - _ => Rc::new(StringPart::Interpolation { - expr: arg_value(&child), -}), -}); } __result }); -let fmt_segments = Rc::new({ let mut __result = Vec::new(); for p in parts.clone().iter().cloned() { __result.push(match (*p.clone()).clone() { - StringPart::Text { value: v, .. } => escape_rust_interp_text(v.clone()), - StringPart::Interpolation { .. } => "{}".to_string(), -}); } __result }); -let fmt_str = fmt_segments.join(&"".to_string()); -let args = Rc::new({ let mut __result = Vec::new(); for p in parts.clone().iter().cloned() { __result.extend((*match (*p.clone()).clone() { - StringPart::Text { .. } => Rc::new(vec![]), - StringPart::Interpolation { expr: e, .. } => { - let var_name = emit_ident(expr_var_name_at(e.clone(), source_indices.clone()), RenderTarget::Rust); -let is_opt = is_optional_typed_expr(e.clone()); -if is_opt.clone() { - Rc::new(vec![v2_rt::concat(var_name.clone(), ".as_deref().unwrap_or(\"\")".to_string())]) - } else { - Rc::new(vec![var_name.clone()]) + Some(path_node) => match (*path_node.expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { + let LiteralValue::LitStr { + value: path_str, .. + } = value.as_ref() + else { + unreachable!() + }; + v2_rt::concat( + v2_rt::concat( + "let url = format!(\"{}".to_string(), + escape_string_literal_body(path_str.clone()), + ), + "\", self.base_url);".to_string(), + ) } -}, -}).iter().cloned()); } __result }); -if ((args.clone().len() as i64) == 0) { - v2_rt::concat(v2_rt::concat("let url = format!(\"{}".to_string(), fmt_str), "\", self.base_url);".to_string()) - } else { - { - let args_str = args.clone().join(&", ".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("let url = format!(\"{}".to_string(), fmt_str), "\", self.base_url, ".to_string()), args_str), ");".to_string()) -} - } -}, - _ => "compile_error!(\"transport path must be a string literal or interpolation\");".to_string(), -}, - None => v2_rt::concat(v2_rt::concat("let url = format!(\"{}/{}\", self.base_url, \"".to_string(), emit_ident(op_name, RenderTarget::Rust)), "\");".to_string()), -} + ExprData::ExprStringInterp => { + let parts = Rc::new({ + let mut __result = Vec::new(); + for child in path_node.children.clone().iter().cloned() { + __result.push(match (*child.expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { + let LiteralValue::LitStr { value: text, .. } = value.as_ref() + else { + unreachable!() + }; + Rc::new(StringPart::Text { + value: text.clone(), + }) + } + _ => Rc::new(StringPart::Interpolation { + expr: arg_value(&child), + }), + }); + } + __result + }); + let fmt_segments = Rc::new({ + let mut __result = Vec::new(); + for p in parts.clone().iter().cloned() { + __result.push(match (*p.clone()).clone() { + StringPart::Text { value: v, .. } => escape_rust_interp_text(v.clone()), + StringPart::Interpolation { .. } => "{}".to_string(), + }); + } + __result + }); + let fmt_str = fmt_segments.join(&"".to_string()); + let args = Rc::new({ + let mut __result = Vec::new(); + for p in parts.clone().iter().cloned() { + __result.extend( + (*match (*p.clone()).clone() { + StringPart::Text { .. } => Rc::new(vec![]), + StringPart::Interpolation { expr: e, .. } => { + let var_name = emit_ident( + expr_var_name_at(e.clone(), source_indices.clone()), + RenderTarget::Rust, + ); + let is_opt = is_optional_typed_expr(e.clone()); + if is_opt.clone() { + Rc::new(vec![v2_rt::concat( + var_name.clone(), + ".as_deref().unwrap_or(\"\")".to_string(), + )]) + } else { + Rc::new(vec![var_name.clone()]) + } + } + }) + .iter() + .cloned(), + ); + } + __result + }); + if ((args.clone().len() as i64) == 0) { + v2_rt::concat( + v2_rt::concat("let url = format!(\"{}".to_string(), fmt_str), + "\", self.base_url);".to_string(), + ) + } else { + { + let args_str = args.clone().join(&", ".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("let url = format!(\"{}".to_string(), fmt_str), + "\", self.base_url, ".to_string(), + ), + args_str, + ), + ");".to_string(), + ) + } + } + } + _ => "compile_error!(\"transport path must be a string literal or interpolation\");" + .to_string(), + }, + None => v2_rt::concat( + v2_rt::concat( + "let url = format!(\"{}/{}\", self.base_url, \"".to_string(), + emit_ident(op_name, RenderTarget::Rust), + ), + "\");".to_string(), + ), + } } -pub fn emit_rest_auth_line(transport: &Rc, service_item: &Rc, http_method: String, source_indices: &Rc>>) -> String { +pub fn emit_rest_auth_line( + transport: &Rc, + service_item: &Rc, + http_method: String, + source_indices: &Rc>>, +) -> String { { let auth_scheme = service_config_auth(service_item.clone(), source_indices.clone()); -let auth_input = service_config_auth_input(service_item.clone(), source_indices.clone()); -match auth_scheme { - Some(auth) => { - let has_auth_source = match service_config_auth_source(service_item.clone(), source_indices.clone()) { - Some(_) => true, - None => false, -}; -let token_param = if has_auth_source { - "self.auth_token.clone()".to_string() - } else { - match auth_input { + let auth_input = service_config_auth_input(service_item.clone(), source_indices.clone()); + match auth_scheme { + Some(auth) => { + let has_auth_source = match service_config_auth_source( + service_item.clone(), + source_indices.clone(), + ) { + Some(_) => true, + None => false, + }; + let token_param = if has_auth_source { + "self.auth_token.clone()".to_string() + } else { + match auth_input { Some(ai) => emit_simple_expr(&ai, &RenderTarget::Rust, &source_indices), None => "compile_error!(\"service config has auth but no auth_input or auth_source\")".to_string(), } - }; -match (*auth.expr_data.clone()).clone() { + }; + match (*auth.expr_data.clone()).clone() { ExprData::ExprVar { .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("let request = client.".to_string(), http_method), "(&url)\n .header(\"Authorization\", format!(\"Bearer {}\", ".to_string()), token_param), "));".to_string()), ExprData::ExprCall { .. } => { let header_name = match auth.children.clone().first().cloned() { @@ -4712,41 +11979,104 @@ v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::con }, _ => v2_rt::concat(v2_rt::concat("compile_error!(\"unrecognized auth scheme expression shape\"); let request = client.".to_string(), http_method), "(&url);".to_string()), } -}, - None => if transport_has_auth(transport.clone(), source_indices.clone()) { - { - let header_name = match transport_auth_header_name(transport.clone(), source_indices.clone()) { - Some(h) => h.clone(), - None => "Authorization".to_string(), -}; -let token_node = match transport_auth_token(transport.clone(), source_indices.clone()) { - Some(tn) => emit_simple_expr(&tn, &RenderTarget::Rust, &source_indices), - None => "\"\"".to_string(), -}; -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("let request = client.".to_string(), http_method), "(&url)\n .header(\"".to_string()), header_name), "\", ".to_string()), token_node), ");".to_string()) -} - } else { - v2_rt::concat(v2_rt::concat("let request = client.".to_string(), http_method), "(&url);".to_string()) - }, -} -} + } + None => { + if transport_has_auth(transport.clone(), source_indices.clone()) { + { + let header_name = match transport_auth_header_name( + transport.clone(), + source_indices.clone(), + ) { + Some(h) => h.clone(), + None => "Authorization".to_string(), + }; + let token_node = + match transport_auth_token(transport.clone(), source_indices.clone()) { + Some(tn) => { + emit_simple_expr(&tn, &RenderTarget::Rust, &source_indices) + } + None => "\"\"".to_string(), + }; + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "let request = client.".to_string(), + http_method, + ), + "(&url)\n .header(\"".to_string(), + ), + header_name, + ), + "\", ".to_string(), + ), + token_node, + ), + ");".to_string(), + ) + } + } else { + v2_rt::concat( + v2_rt::concat("let request = client.".to_string(), http_method), + "(&url);".to_string(), + ) + } + } + } + } } -pub fn emit_rest_query_line(transport: Rc, source_indices: &Rc>>) -> String { +pub fn emit_rest_query_line( + transport: Rc, + source_indices: &Rc>>, +) -> String { match transport_query(transport, source_indices.clone()) { - Some(q) => { - let pairs = Rc::new({ let mut __result = Vec::new(); for fi in q.children.clone().iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("(\"".to_string(), field_init_node_name_at(fi.clone(), source_indices.clone())), "\", &".to_string()), emit_simple_expr(&field_init_node_value(&fi), &RenderTarget::Rust, &source_indices)), ".to_string())".to_string())); } __result }); -if ((pairs.clone().len() as i64) > 0) { - v2_rt::concat(v2_rt::concat("let request = request.query(&[".to_string(), pairs.clone().join(&", ".to_string())), "]);".to_string()) - } else { - "".to_string() + Some(q) => { + let pairs = Rc::new({ + let mut __result = Vec::new(); + for fi in q.children.clone().iter().cloned() { + __result.push(v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "(\"".to_string(), + field_init_node_name_at(fi.clone(), source_indices.clone()), + ), + "\", &".to_string(), + ), + emit_simple_expr( + &field_init_node_value(&fi), + &RenderTarget::Rust, + &source_indices, + ), + ), + ".to_string())".to_string(), + )); + } + __result + }); + if ((pairs.clone().len() as i64) > 0) { + v2_rt::concat( + v2_rt::concat( + "let request = request.query(&[".to_string(), + pairs.clone().join(&", ".to_string()), + ), + "]);".to_string(), + ) + } else { + "".to_string() + } } -}, - None => "".to_string(), -} + None => "".to_string(), + } } -pub fn emit_rest_body_line(transport: Rc, source_indices: &Rc>>) -> String { +pub fn emit_rest_body_line( + transport: Rc, + source_indices: &Rc>>, +) -> String { match transport_request_body(transport, source_indices.clone()) { Some(b) => match (*b.expr_data.clone()).clone() { ExprData::ExprRecordLit { .. } => { @@ -4786,74 +12116,161 @@ pub fn has_response_prefix(name: &String) -> bool { } } -pub fn child_from_key(ch: Rc, source_indices: Rc>>) -> Option { - match Rc::new({ let mut __result = Vec::new(); for p in ch.properties.clone().iter().cloned() { if (field_init_node_name_at(p.clone(), source_indices.clone()).as_str() == "from_key".to_string().as_str()) { __result.push(p); } } __result }).first().cloned() { - Some(prop) => match (*field_init_node_value(&prop).expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitStr { value: s, .. } = value.as_ref() else { unreachable!() }; Some(s.clone()) }, - _ => None, -}, - None => None, -} +pub fn child_from_key( + ch: Rc, + source_indices: Rc>>, +) -> Option { + match Rc::new({ + let mut __result = Vec::new(); + for p in ch.properties.clone().iter().cloned() { + if (field_init_node_name_at(p.clone(), source_indices.clone()).as_str() + == "from_key".to_string().as_str()) + { + __result.push(p); + } + } + __result + }) + .first() + .cloned() + { + Some(prop) => match (*field_init_node_value(&prop).expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { + let LiteralValue::LitStr { value: s, .. } = value.as_ref() else { + unreachable!() + }; + Some(s.clone()) + } + _ => None, + }, + None => None, + } } -pub fn has_from_key_fields(op_node: Rc, source_indices: Rc>>) -> bool { +pub fn has_from_key_fields( + op_node: Rc, + source_indices: Rc>>, +) -> bool { { let rt = resolved_type(op_node); -let is_conj = (rt.connective.clone() == Connective::Conj); -let from_key_count = (Rc::new({ let mut __result = Vec::new(); for ch in rt.children.clone().iter().cloned() { if match child_from_key(ch.clone(), source_indices.clone()) { - Some(_) => true, - None => false, -} { __result.push(ch); } } __result }).len() as i64); -(is_conj && (from_key_count > 0)) -} + let is_conj = (rt.connective.clone() == Connective::Conj); + let from_key_count = (Rc::new({ + let mut __result = Vec::new(); + for ch in rt.children.clone().iter().cloned() { + if match child_from_key(ch.clone(), source_indices.clone()) { + Some(_) => true, + None => false, + } { + __result.push(ch); + } + } + __result + }) + .len() as i64); + (is_conj && (from_key_count > 0)) + } } -pub fn has_response_200_property(op_node: Rc, source_indices: Rc>>) -> bool { - { let mut __found = false; for p in op_node.properties.clone().iter().cloned() { if (field_init_node_name_at(p.clone(), source_indices.clone()).as_str() == "response_200".to_string().as_str()) { __found = true; break; } } __found } +pub fn has_response_200_property( + op_node: Rc, + source_indices: Rc>>, +) -> bool { + { + let mut __found = false; + for p in op_node.properties.clone().iter().cloned() { + if (field_init_node_name_at(p.clone(), source_indices.clone()).as_str() + == "response_200".to_string().as_str()) + { + __found = true; + break; + } + } + __found + } } -pub fn operation_response_200_resolved_type(op_node: Rc, source_indices: &Rc>>, env: Rc) -> Option> { - match Rc::new({ let mut __result = Vec::new(); for p in op_node.properties.clone().iter().cloned() { if (field_init_node_name_at(p.clone(), source_indices.clone()).as_str() == "response_200".to_string().as_str()) { __result.push(p); } } __result }).first().cloned() { - Some(p) => { - let v = field_init_node_value(&p); -match v.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: tn, .. }) => Some(tn.clone()), - _ => { - let type_name = authored_name_at(source_indices.clone(), &normalize_access_type_node(v.clone())); -if (type_name.clone().as_str() == "".to_string().as_str()) { - None - } else { - lookup_type_by_name(&env, type_name.clone()) +pub fn operation_response_200_resolved_type( + op_node: Rc, + source_indices: &Rc>>, + env: Rc, +) -> Option> { + match Rc::new({ + let mut __result = Vec::new(); + for p in op_node.properties.clone().iter().cloned() { + if (field_init_node_name_at(p.clone(), source_indices.clone()).as_str() + == "response_200".to_string().as_str()) + { + __result.push(p); } -}, -} -}, - None => None, -} + } + __result + }) + .first() + .cloned() + { + Some(p) => { + let v = field_init_node_value(&p); + match v.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: tn, .. }) => Some(tn.clone()), + _ => { + let type_name = authored_name_at( + source_indices.clone(), + &normalize_access_type_node(v.clone()), + ); + if (type_name.clone().as_str() == "".to_string().as_str()) { + None + } else { + lookup_type_by_name(&env, type_name.clone()) + } + } + } + } + None => None, + } } -pub fn is_json_wire_declaration_type(t: Rc, source_indices: Rc>>) -> bool { +pub fn is_json_wire_declaration_type( + t: Rc, + source_indices: Rc>>, +) -> bool { { let n = authored_name_at(source_indices, &normalize_access_type_node(t)); -if (n.clone().as_str() == "Json".to_string().as_str()) { + if (n.clone().as_str() == "Json".to_string().as_str()) { true } else { { - let parts = Rc::new(n.clone().split(&".".to_string()).map(|s| s.to_string()).collect::>()); -match parts.last().cloned() { - Some(last) => (last.clone().as_str() == "Json".to_string().as_str()), - None => false, -} -} + let parts = Rc::new( + n.clone() + .split(&".".to_string()) + .map(|s| s.to_string()) + .collect::>(), + ); + match parts.last().cloned() { + Some(last) => (last.clone().as_str() == "Json".to_string().as_str()), + None => false, + } + } } -} + } } pub fn path_segment_is_list_index(seg: &String) -> bool { if (v2_rt::string_length(&seg) == 0) { false } else { - { let mut __all = true; for c in Rc::new(seg.clone().chars().map(|c| c as i64).collect::>()).iter().cloned() { if !(((c.clone() >= 48) && (c.clone() <= 57))) { __all = false; break; } } __all } + { + let mut __all = true; + for c in Rc::new(seg.clone().chars().map(|c| c as i64).collect::>()) + .iter() + .cloned() + { + if !((c.clone() >= 48) && (c.clone() <= 57)) { + __all = false; + break; + } + } + __all + } } } @@ -4864,146 +12281,337 @@ pub struct WirePathProjection { pub ok: bool, } -pub fn wire_child_for_segment(wire_node: Rc, seg: String, source_indices: Rc>>) -> Option> { +pub fn wire_child_for_segment( + wire_node: Rc, + seg: String, + source_indices: Rc>>, +) -> Option> { { let normed = normalize_access_type_node(wire_node); -match Rc::new({ let mut __result = Vec::new(); for ch in normed.children.clone().iter().cloned() { if { - let authored = authored_name_at(source_indices.clone(), &ch); -let wire_key = match child_from_key(ch.clone(), source_indices.clone()) { - Some(k) => k.clone(), - None => authored.clone(), -}; -(wire_key.clone().as_str() == seg.clone().as_str()) -} { __result.push(ch); } } __result }).first().cloned() { - Some(ch) => Some(ch.clone()), - None => None, -} -} + match Rc::new({ + let mut __result = Vec::new(); + for ch in normed.children.clone().iter().cloned() { + if { + let authored = authored_name_at(source_indices.clone(), &ch); + let wire_key = match child_from_key(ch.clone(), source_indices.clone()) { + Some(k) => k.clone(), + None => authored.clone(), + }; + (wire_key.clone().as_str() == seg.clone().as_str()) + } { + __result.push(ch); + } + } + __result + }) + .first() + .cloned() + { + Some(ch) => Some(ch.clone()), + None => None, + } + } } -pub fn advance_wire_path_projection(state: &Rc, seg: &String, full_path: String, source_indices: &Rc>>) -> Rc { +pub fn advance_wire_path_projection( + state: &Rc, + seg: &String, + full_path: String, + source_indices: &Rc>>, +) -> Rc { if !state.ok.clone() { state.clone() } else { if path_segment_is_list_index(&seg) { { let next_node = match state.node.clone() { - Some(n) => Some(for_each_element_type_node(n.clone(), source_indices.clone())), - None => None, -}; -Rc::new(WirePathProjection { - expr: v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("(".to_string(), state.expr.clone()), ").get(".to_string()), seg.clone()), ").ok_or_else(|| format!(\"REST path missing index ".to_string()), seg.clone()), " at ".to_string()), full_path), "\"))?".to_string()), - node: next_node, - ok: true, -}) -} + Some(n) => Some(for_each_element_type_node( + n.clone(), + source_indices.clone(), + )), + None => None, + }; + Rc::new(WirePathProjection { + expr: v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("(".to_string(), state.expr.clone()), + ").get(".to_string(), + ), + seg.clone(), + ), + ").ok_or_else(|| format!(\"REST path missing index " + .to_string(), + ), + seg.clone(), + ), + " at ".to_string(), + ), + full_path, + ), + "\"))?".to_string(), + ), + node: next_node, + ok: true, + }) + } } else { match state.node.clone() { - Some(n) => match wire_child_for_segment(n.clone(), seg.clone(), source_indices.clone()) { - Some(ch) => Rc::new(WirePathProjection { - expr: v2_rt::concat(v2_rt::concat(v2_rt::concat("(".to_string(), state.expr.clone()), ").".to_string()), emit_ident(authored_name_at(source_indices.clone(), &ch), RenderTarget::Rust)), - node: Some(resolved_type(ch.clone())), - ok: true, -}), - None => Rc::new(WirePathProjection { - expr: state.expr.clone(), - node: None, - ok: false, -}), -}, - None => Rc::new(WirePathProjection { - expr: state.expr.clone(), - node: None, - ok: false, -}), -} + Some(n) => { + match wire_child_for_segment(n.clone(), seg.clone(), source_indices.clone()) { + Some(ch) => Rc::new(WirePathProjection { + expr: v2_rt::concat( + v2_rt::concat( + v2_rt::concat("(".to_string(), state.expr.clone()), + ").".to_string(), + ), + emit_ident( + authored_name_at(source_indices.clone(), &ch), + RenderTarget::Rust, + ), + ), + node: Some(resolved_type(ch.clone())), + ok: true, + }), + None => Rc::new(WirePathProjection { + expr: state.expr.clone(), + node: None, + ok: false, + }), + } + } + None => Rc::new(WirePathProjection { + expr: state.expr.clone(), + node: None, + ok: false, + }), + } } } } -pub fn emit_wire_struct_path_chain(base: String, wire_node: Rc, from_path: &String, source_indices: Rc>>) -> Rc { +pub fn emit_wire_struct_path_chain( + base: String, + wire_node: Rc, + from_path: &String, + source_indices: Rc>>, +) -> Rc { { - let segs = Rc::new({ let mut __result = Vec::new(); for s in Rc::new(from_path.clone().split(&"/".to_string()).map(|s| s.to_string()).collect::>()).iter().cloned() { if (s.clone().as_str() != "".to_string().as_str()) { __result.push(s); } } __result }); -segs.iter().cloned().fold(Rc::new(WirePathProjection { - expr: base, - node: Some(wire_node), - ok: true, -}), |acc: Rc, seg: String| advance_wire_path_projection(&acc, &seg, from_path.clone(), &source_indices)) -} + let segs = Rc::new({ + let mut __result = Vec::new(); + for s in Rc::new( + from_path + .clone() + .split(&"/".to_string()) + .map(|s| s.to_string()) + .collect::>(), + ) + .iter() + .cloned() + { + if (s.clone().as_str() != "".to_string().as_str()) { + __result.push(s); + } + } + __result + }); + segs.iter().cloned().fold( + Rc::new(WirePathProjection { + expr: base, + node: Some(wire_node), + ok: true, + }), + |acc: Rc, seg: String| { + advance_wire_path_projection(&acc, &seg, from_path.clone(), &source_indices) + }, + ) + } } -pub fn emit_typed_wire_field_assign(field_name: String, from_path: &String, wire_node: Rc, source_indices: Rc>>) -> String { +pub fn emit_typed_wire_field_assign( + field_name: String, + from_path: &String, + wire_node: Rc, + source_indices: Rc>>, +) -> String { { - let projection = emit_wire_struct_path_chain("__rest_wire".to_string(), wire_node, &from_path, source_indices); -if projection.ok.clone() { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("let ".to_string(), field_name), " = ".to_string()), projection.expr.clone()), ".clone();\n".to_string()) + let projection = emit_wire_struct_path_chain( + "__rest_wire".to_string(), + wire_node, + &from_path, + source_indices, + ); + if projection.ok.clone() { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("let ".to_string(), field_name), + " = ".to_string(), + ), + projection.expr.clone(), + ), + ".clone();\n".to_string(), + ) } else { v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("let ".to_string(), field_name), " = compile_error!(\"REST typed response path could not be resolved against declared 200 body: ".to_string()), from_path.clone()), "\");\n".to_string()) } -} + } } pub fn escape_json_pointer_segment(seg: String) -> String { - v2_rt::replace(v2_rt::replace(seg, "~".to_string(), "~0".to_string()), "/".to_string(), "~1".to_string()) -} - -pub fn emit_json_value_extract(var_name: String, from_path: &String, dag_type_name: String) -> String { + v2_rt::replace( + v2_rt::replace(seg, "~".to_string(), "~0".to_string()), + "/".to_string(), + "~1".to_string(), + ) +} + +pub fn emit_json_value_extract( + var_name: String, + from_path: &String, + dag_type_name: String, +) -> String { { - let escaped_path = Rc::new({ let mut __result = Vec::new(); for seg in Rc::new(from_path.clone().split(&"/".to_string()).map(|s| s.to_string()).collect::>()).iter().cloned() { __result.push(escape_json_pointer_segment(seg.clone())); } __result }).join(&"/".to_string()); -let pointer = v2_rt::concat("/".to_string(), escaped_path); -let rust_type = coerce_primitive_type(RenderTarget::Rust, dag_type_name); -let accessor = if (rust_type.clone().as_str() == "String".to_string().as_str()) { - v2_rt::concat(v2_rt::concat(".and_then(|v| v.as_str()).map(|s| s.to_string()).ok_or(\"missing field: ".to_string(), from_path.clone()), "\")?".to_string()) + let escaped_path = Rc::new({ + let mut __result = Vec::new(); + for seg in Rc::new( + from_path + .clone() + .split(&"/".to_string()) + .map(|s| s.to_string()) + .collect::>(), + ) + .iter() + .cloned() + { + __result.push(escape_json_pointer_segment(seg.clone())); + } + __result + }) + .join(&"/".to_string()); + let pointer = v2_rt::concat("/".to_string(), escaped_path); + let rust_type = coerce_primitive_type(RenderTarget::Rust, dag_type_name); + let accessor = if (rust_type.clone().as_str() == "String".to_string().as_str()) { + v2_rt::concat( + v2_rt::concat( + ".and_then(|v| v.as_str()).map(|s| s.to_string()).ok_or(\"missing field: " + .to_string(), + from_path.clone(), + ), + "\")?".to_string(), + ) } else { if (rust_type.clone().as_str() == "i64".to_string().as_str()) { - v2_rt::concat(v2_rt::concat(".and_then(|v| v.as_i64()).ok_or(\"missing field: ".to_string(), from_path.clone()), "\")?".to_string()) + v2_rt::concat( + v2_rt::concat( + ".and_then(|v| v.as_i64()).ok_or(\"missing field: ".to_string(), + from_path.clone(), + ), + "\")?".to_string(), + ) } else { if (rust_type.clone().as_str() == "f64".to_string().as_str()) { - v2_rt::concat(v2_rt::concat(".and_then(|v| v.as_f64()).ok_or(\"missing field: ".to_string(), from_path.clone()), "\")?".to_string()) + v2_rt::concat( + v2_rt::concat( + ".and_then(|v| v.as_f64()).ok_or(\"missing field: ".to_string(), + from_path.clone(), + ), + "\")?".to_string(), + ) } else { if (rust_type.clone().as_str() == "bool".to_string().as_str()) { - v2_rt::concat(v2_rt::concat(".and_then(|v| v.as_bool()).ok_or(\"missing field: ".to_string(), from_path.clone()), "\")?".to_string()) + v2_rt::concat( + v2_rt::concat( + ".and_then(|v| v.as_bool()).ok_or(\"missing field: ".to_string(), + from_path.clone(), + ), + "\")?".to_string(), + ) } else { v2_rt::concat(v2_rt::concat(".cloned().map(|v| serde_json::from_value(v)).transpose()?.ok_or(\"missing field: ".to_string(), from_path.clone()), "\")?".to_string()) } } } }; -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("let ".to_string(), var_name), " = json_body.pointer(\"".to_string()), pointer), "\")".to_string()), accessor), ";".to_string()) -} + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("let ".to_string(), var_name), + " = json_body.pointer(\"".to_string(), + ), + pointer, + ), + "\")".to_string(), + ), + accessor, + ), + ";".to_string(), + ) + } } -pub fn emit_from_key_extraction(op_node: &Rc, source_indices: &Rc>>, shared_types: Rc>, env: Rc) -> String { +pub fn emit_from_key_extraction( + op_node: &Rc, + source_indices: &Rc>>, + shared_types: Rc>, + env: Rc, +) -> String { { let rt = resolved_type(op_node.clone()); -let children = rt.children.clone(); -let wire_opt = operation_response_200_resolved_type(op_node.clone(), &source_indices, env); -if (has_response_200_property(op_node.clone(), source_indices.clone()) && match wire_opt.clone() { - None => true, - Some(_) => false, -}) { + let children = rt.children.clone(); + let wire_opt = operation_response_200_resolved_type(op_node.clone(), &source_indices, env); + if (has_response_200_property(op_node.clone(), source_indices.clone()) + && match wire_opt.clone() { + None => true, + Some(_) => false, + }) + { "compile_error!(\"REST response_200: declared HTTP 200 body type is present but could not be resolved (empty name, missing TypeEnv binding, or inference gap); illegal state\");\n".to_string() } else { { let use_typed_wire = match wire_opt.clone() { - Some(tn) => !is_json_wire_declaration_type(tn.clone(), source_indices.clone()), - None => false, -}; -let prelude = match wire_opt.clone() { - Some(tn) => if is_json_wire_declaration_type(tn.clone(), source_indices.clone()) { - "let json_body: serde_json::Value = response.json().await?;\n".to_string() - } else { - { - let wire_ty = match tn.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => rt.clone(), - _ => tn.clone(), -}; -v2_rt::concat(v2_rt::concat("let __rest_wire: ".to_string(), render_rust_type(wire_ty, shared_types, source_indices.clone())), " = response.json().await?;\n".to_string()) -} - }, - None => "let json_body: serde_json::Value = response.json().await?;\n".to_string(), -}; -let extract_lines = Rc::new({ let mut __result = Vec::new(); for ch in children.clone().iter().cloned() { __result.push({ + Some(tn) => !is_json_wire_declaration_type(tn.clone(), source_indices.clone()), + None => false, + }; + let prelude = match wire_opt.clone() { + Some(tn) => { + if is_json_wire_declaration_type(tn.clone(), source_indices.clone()) { + "let json_body: serde_json::Value = response.json().await?;\n" + .to_string() + } else { + { + let wire_ty = match tn.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => rt.clone(), + _ => tn.clone(), + }; + v2_rt::concat( + v2_rt::concat( + "let __rest_wire: ".to_string(), + render_rust_type( + wire_ty, + shared_types, + source_indices.clone(), + ), + ), + " = response.json().await?;\n".to_string(), + ) + } + } + } + None => { + "let json_body: serde_json::Value = response.json().await?;\n".to_string() + } + }; + let extract_lines = Rc::new({ + let mut __result = Vec::new(); + for ch in children.clone().iter().cloned() { + __result.push({ let ch_name = authored_name_at(source_indices.clone(), &ch); let field_name = emit_ident(ch_name.clone(), RenderTarget::Rust); let from_path = match child_from_key(ch.clone(), source_indices.clone()) { @@ -5021,83 +12629,201 @@ match ch.inferred.clone().as_deref().cloned() { }, _ => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("let ".to_string(), field_name.clone()), " = compile_error!(\"unresolved type for output field: ".to_string()), ch_name.clone()), "\");".to_string()), } -}); } __result }); -let field_names = Rc::new({ let mut __result = Vec::new(); for ch in children.clone().iter().cloned() { __result.push(emit_ident(authored_name_at(source_indices.clone(), &ch), RenderTarget::Rust)); } __result }); -let tuple_body = if ((field_names.clone().len() as i64) == 1) { - v2_rt::concat(v2_rt::concat("(".to_string(), field_names.clone().first().cloned().clone().unwrap()), ",)".to_string()) +}); + } + __result + }); + let field_names = Rc::new({ + let mut __result = Vec::new(); + for ch in children.clone().iter().cloned() { + __result.push(emit_ident( + authored_name_at(source_indices.clone(), &ch), + RenderTarget::Rust, + )); + } + __result + }); + let tuple_body = if ((field_names.clone().len() as i64) == 1) { + v2_rt::concat( + v2_rt::concat( + "(".to_string(), + field_names.clone().first().cloned().clone().unwrap(), + ), + ",)".to_string(), + ) } else { - v2_rt::concat(v2_rt::concat("(".to_string(), field_names.clone().join(&", ".to_string())), ")".to_string()) + v2_rt::concat( + v2_rt::concat("(".to_string(), field_names.clone().join(&", ".to_string())), + ")".to_string(), + ) }; -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(prelude, extract_lines.join(&"\n".to_string())), "\nOk(".to_string()), tuple_body), ")".to_string()) -} + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(prelude, extract_lines.join(&"\n".to_string())), + "\nOk(".to_string(), + ), + tuple_body, + ), + ")".to_string(), + ) + } } -} + } } -pub fn emit_plain_response_body(op_node: Rc, transport: Rc, source_indices: &Rc>>) -> String { +pub fn emit_plain_response_body( + op_node: Rc, + transport: Rc, + source_indices: &Rc>>, +) -> String { { let is_text = match transport_response_format(transport, source_indices.clone()) { - Some(fmt) => (authored_name_at(source_indices.clone(), &fmt).as_str() == "Text".to_string().as_str()), - None => false, -}; -if is_text { + Some(fmt) => { + (authored_name_at(source_indices.clone(), &fmt).as_str() + == "Text".to_string().as_str()) + } + None => false, + }; + if is_text { "let result = response.text().await?;\nOk(result)".to_string() } else { "let result = response.json().await?;\nOk(result)".to_string() } -} + } } -pub fn emit_response_code_handling(op_node: &Rc, transport: Rc, source_indices: &Rc>>, shared_types: Rc>, env: Rc) -> String { +pub fn emit_response_code_handling( + op_node: &Rc, + transport: Rc, + source_indices: &Rc>>, + shared_types: Rc>, + env: Rc, +) -> String { { let use_from_key = has_from_key_fields(op_node.clone(), source_indices.clone()); -let response_props = Rc::new({ let mut __result = Vec::new(); for p in op_node.properties.clone().iter().cloned() { if has_response_prefix(&field_init_node_name_at(p.clone(), source_indices.clone())) { __result.push(p); } } __result }); -if ((response_props.clone().len() as i64) == 0) { + let response_props = Rc::new({ + let mut __result = Vec::new(); + for p in op_node.properties.clone().iter().cloned() { + if has_response_prefix(&field_init_node_name_at(p.clone(), source_indices.clone())) + { + __result.push(p); + } + } + __result + }); + if ((response_props.clone().len() as i64) == 0) { if use_from_key.clone() { - emit_from_key_extraction(&op_node, &source_indices, shared_types.clone(), env.clone()) + emit_from_key_extraction( + &op_node, + &source_indices, + shared_types.clone(), + env.clone(), + ) } else { emit_plain_response_body(op_node.clone(), transport.clone(), &source_indices) } } else { { - let arms = Rc::new({ let mut __result = Vec::new(); for p in response_props.clone().iter().cloned() { __result.push(emit_response_arm(p.clone(), op_node.clone(), use_from_key.clone(), transport.clone(), &source_indices, shared_types.clone(), env.clone())); } __result }); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("let status = response.status().as_u16();\n".to_string(), "match status {\n".to_string()), arms.join(&"\n".to_string())), "\n _ => Err(format!(\"unexpected status code: {}\", status).into())\n".to_string()), "}".to_string()) -} + let arms = Rc::new({ + let mut __result = Vec::new(); + for p in response_props.clone().iter().cloned() { + __result.push(emit_response_arm( + p.clone(), + op_node.clone(), + use_from_key.clone(), + transport.clone(), + &source_indices, + shared_types.clone(), + env.clone(), + )); + } + __result + }); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "let status = response.status().as_u16();\n".to_string(), + "match status {\n".to_string(), + ), + arms.join(&"\n".to_string()), + ), + "\n _ => Err(format!(\"unexpected status code: {}\", status).into())\n" + .to_string(), + ), + "}".to_string(), + ) + } } -} + } } -pub fn emit_response_arm(prop: Rc, op_node: Rc, use_from_key: bool, transport: Rc, source_indices: &Rc>>, shared_types: Rc>, env: Rc) -> String { +pub fn emit_response_arm( + prop: Rc, + op_node: Rc, + use_from_key: bool, + transport: Rc, + source_indices: &Rc>>, + shared_types: Rc>, + env: Rc, +) -> String { { let name = field_init_node_name_at(prop, source_indices.clone()); -let code_str = v2_rt::substring(&name, 9, v2_rt::string_length(&name)); -let is_success = if (v2_rt::string_length(&code_str) >= 1) { + let code_str = v2_rt::substring(&name, 9, v2_rt::string_length(&name)); + let is_success = if (v2_rt::string_length(&code_str) >= 1) { (v2_rt::substring(&code_str, 0, 1).as_str() == "2".to_string().as_str()) } else { false }; -let pattern = if (code_str.clone().as_str() == "nonzero".to_string().as_str()) { + let pattern = if (code_str.clone().as_str() == "nonzero".to_string().as_str()) { "_".to_string() } else { - if ((v2_rt::string_length(&code_str) == 3) && (v2_rt::substring(&code_str, 1, 3).as_str() == "xx".to_string().as_str())) { + if ((v2_rt::string_length(&code_str) == 3) + && (v2_rt::substring(&code_str, 1, 3).as_str() == "xx".to_string().as_str())) + { { let prefix = v2_rt::substring(&code_str, 0, 1); -v2_rt::concat(v2_rt::concat(v2_rt::concat(prefix.clone(), "00..=".to_string()), prefix.clone()), "99".to_string()) -} + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(prefix.clone(), "00..=".to_string()), + prefix.clone(), + ), + "99".to_string(), + ) + } } else { code_str.clone() } }; -if is_success { + if is_success { if use_from_key { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" ".to_string(), pattern), " => { ".to_string()), emit_from_key_extraction(&op_node, &source_indices, shared_types, env)), " },".to_string()) + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(" ".to_string(), pattern), + " => { ".to_string(), + ), + emit_from_key_extraction(&op_node, &source_indices, shared_types, env), + ), + " },".to_string(), + ) } else { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" ".to_string(), pattern), " => { ".to_string()), emit_plain_response_body(op_node, transport, &source_indices)), " },".to_string()) + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(" ".to_string(), pattern), + " => { ".to_string(), + ), + emit_plain_response_body(op_node, transport, &source_indices), + ), + " },".to_string(), + ) } } else { v2_rt::concat(v2_rt::concat(" ".to_string(), pattern), " => { let err_body = response.text().await.unwrap_or_default(); Err(format!(\"HTTP {}: {}\", status, err_body).into()) },".to_string()) } -} + } } pub fn has_exit_prefix(name: &String) -> bool { @@ -5108,205 +12834,472 @@ pub fn has_exit_prefix(name: &String) -> bool { } } -pub fn emit_exit_code_handling(op_node: Rc, inferred: Rc, source_indices: Rc>>) -> String { +pub fn emit_exit_code_handling( + op_node: Rc, + inferred: Rc, + source_indices: Rc>>, +) -> String { { - let exit_props = Rc::new({ let mut __result = Vec::new(); for p in op_node.properties.clone().iter().cloned() { if has_exit_prefix(&field_init_node_name_at(p.clone(), source_indices.clone())) { __result.push(p); } } __result }); -if ((exit_props.clone().len() as i64) == 0) { + let exit_props = Rc::new({ + let mut __result = Vec::new(); + for p in op_node.properties.clone().iter().cloned() { + if has_exit_prefix(&field_init_node_name_at(p.clone(), source_indices.clone())) { + __result.push(p); + } + } + __result + }); + if ((exit_props.clone().len() as i64) == 0) { emit_shell_return(inferred.clone(), &source_indices) } else { { - let has_nonzero = { let mut __found = false; for p in exit_props.clone().iter().cloned() { if (field_init_node_name_at(p.clone(), source_indices.clone()).as_str() == "exit_nonzero".to_string().as_str()) { __found = true; break; } } __found }; -let exit_arms = Rc::new({ let mut __result = Vec::new(); for p in exit_props.clone().iter().cloned() { __result.push(emit_exit_arm(p.clone(), inferred.clone(), &source_indices)); } __result }); -let default_arm = if has_nonzero { + let has_nonzero = { + let mut __found = false; + for p in exit_props.clone().iter().cloned() { + if (field_init_node_name_at(p.clone(), source_indices.clone()).as_str() + == "exit_nonzero".to_string().as_str()) + { + __found = true; + break; + } + } + __found + }; + let exit_arms = Rc::new({ + let mut __result = Vec::new(); + for p in exit_props.clone().iter().cloned() { + __result.push(emit_exit_arm(p.clone(), inferred.clone(), &source_indices)); + } + __result + }); + let default_arm = if has_nonzero { "".to_string() } else { "\n _ => { let stderr = String::from_utf8_lossy(&output.stderr).to_string(); Err(stderr.into()) },".to_string() }; -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("let exit_code = output.status.code().unwrap_or(-1);\n".to_string(), "match exit_code {\n".to_string()), exit_arms.join(&"\n".to_string())), default_arm), "\n}".to_string()) -} + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "let exit_code = output.status.code().unwrap_or(-1);\n".to_string(), + "match exit_code {\n".to_string(), + ), + exit_arms.join(&"\n".to_string()), + ), + default_arm, + ), + "\n}".to_string(), + ) + } } -} + } } -pub fn emit_exit_arm(prop: Rc, inferred: Rc, source_indices: &Rc>>) -> String { +pub fn emit_exit_arm( + prop: Rc, + inferred: Rc, + source_indices: &Rc>>, +) -> String { { let name = field_init_node_name_at(prop, source_indices.clone()); -let code_str = v2_rt::substring(&name, 5, v2_rt::string_length(&name)); -let pattern = if (code_str.clone().as_str() == "nonzero".to_string().as_str()) { + let code_str = v2_rt::substring(&name, 5, v2_rt::string_length(&name)); + let pattern = if (code_str.clone().as_str() == "nonzero".to_string().as_str()) { "_".to_string() } else { code_str.clone() }; -let is_success = (code_str.clone().as_str() == "0".to_string().as_str()); -if is_success { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" ".to_string(), pattern), " => { ".to_string()), emit_shell_return(inferred, &source_indices)), " },".to_string()) + let is_success = (code_str.clone().as_str() == "0".to_string().as_str()); + if is_success { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(" ".to_string(), pattern), + " => { ".to_string(), + ), + emit_shell_return(inferred, &source_indices), + ), + " },".to_string(), + ) } else { v2_rt::concat(v2_rt::concat(" ".to_string(), pattern), " => { let stderr = String::from_utf8_lossy(&output.stderr).to_string(); Err(stderr.into()) },".to_string()) } -} + } } -pub fn emit_shell_call(op_name: String, transport: &Rc, registry: Rc>>, depth: i64, inferred: Rc, op_node: &Rc, source_indices: &Rc>>) -> String { +pub fn emit_shell_call( + op_name: String, + transport: &Rc, + registry: Rc>>, + depth: i64, + inferred: Rc, + op_node: &Rc, + source_indices: &Rc>>, +) -> String { { let argv = transport.children.clone(); -let optional_params = Rc::new({ let mut __result = Vec::new(); for p in op_node.params.clone().iter().cloned() { if (param_node_type_expr(&p).return_cardinality.clone() == Cardinality::CardOptional) { __result.push(p); } } __result }).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, p: Rc| v2_rt::rc_map_insert(acc, param_node_name_at(p.clone(), source_indices.clone()), true)); -let has_stdin = match transport_stdin(transport.clone(), source_indices.clone()) { - Some(_) => true, - None => false, -}; -let let_kw = if has_stdin.clone() { + let optional_params = Rc::new({ + let mut __result = Vec::new(); + for p in op_node.params.clone().iter().cloned() { + if (param_node_type_expr(&p).return_cardinality.clone() + == Cardinality::CardOptional) + { + __result.push(p); + } + } + __result + }) + .iter() + .cloned() + .fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, p: Rc| { + v2_rt::rc_map_insert( + acc, + param_node_name_at(p.clone(), source_indices.clone()), + true, + ) + }, + ); + let has_stdin = match transport_stdin(transport.clone(), source_indices.clone()) { + Some(_) => true, + None => false, + }; + let let_kw = if has_stdin.clone() { "let mut output".to_string() } else { "let output".to_string() }; -let cmd_line = if ((argv.clone().len() as i64) > 0) { + let cmd_line = if ((argv.clone().len() as i64) > 0) { match argv.clone().first().cloned() { - Some(first_arg) => v2_rt::concat(v2_rt::concat(v2_rt::concat(let_kw, " = std::process::Command::new(".to_string()), emit_shell_argv_element(&first_arg, optional_params.clone(), source_indices.clone())), ")".to_string()), - None => v2_rt::concat(v2_rt::concat(v2_rt::concat(let_kw, " = std::process::Command::new(\"".to_string()), emit_ident(op_name, RenderTarget::Rust)), "\")".to_string()), -} + Some(first_arg) => v2_rt::concat( + v2_rt::concat( + v2_rt::concat(let_kw, " = std::process::Command::new(".to_string()), + emit_shell_argv_element( + &first_arg, + optional_params.clone(), + source_indices.clone(), + ), + ), + ")".to_string(), + ), + None => v2_rt::concat( + v2_rt::concat( + v2_rt::concat(let_kw, " = std::process::Command::new(\"".to_string()), + emit_ident(op_name, RenderTarget::Rust), + ), + "\")".to_string(), + ), + } } else { - v2_rt::concat(v2_rt::concat(v2_rt::concat(let_kw, " = std::process::Command::new(\"".to_string()), emit_ident(op_name, RenderTarget::Rust)), "\")".to_string()) + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(let_kw, " = std::process::Command::new(\"".to_string()), + emit_ident(op_name, RenderTarget::Rust), + ), + "\")".to_string(), + ) }; -let arg_lines = if ((argv.clone().len() as i64) > 1) { - Rc::new({ let mut __result = Vec::new(); for arg in Rc::new(argv.clone().iter().cloned().skip(1 as usize).collect::>()).iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(" .arg(".to_string(), emit_shell_argv_element(&arg, optional_params.clone(), source_indices.clone())), ")".to_string())); } __result }) + let arg_lines = if ((argv.clone().len() as i64) > 1) { + Rc::new({ + let mut __result = Vec::new(); + for arg in Rc::new( + argv.clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ) + .iter() + .cloned() + { + __result.push(v2_rt::concat( + v2_rt::concat( + " .arg(".to_string(), + emit_shell_argv_element( + &arg, + optional_params.clone(), + source_indices.clone(), + ), + ), + ")".to_string(), + )); + } + __result + }) } else { Rc::new(vec![]) }; -let env_entries = transport_env(transport.clone(), source_indices.clone()); -let env_lines = Rc::new({ let mut __result = Vec::new(); for e in env_entries.iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" .env(\"".to_string(), field_init_node_name_at(e.clone(), source_indices.clone())), "\", ".to_string()), emit_simple_expr(&field_init_node_value(&e), &RenderTarget::Rust, &source_indices)), ")".to_string())); } __result }); -let wd_line = " .current_dir(self.working_dir.as_deref().unwrap_or(\".\"))".to_string(); -if has_stdin.clone() { + let env_entries = transport_env(transport.clone(), source_indices.clone()); + let env_lines = Rc::new({ + let mut __result = Vec::new(); + for e in env_entries.iter().cloned() { + __result.push(v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + " .env(\"".to_string(), + field_init_node_name_at(e.clone(), source_indices.clone()), + ), + "\", ".to_string(), + ), + emit_simple_expr( + &field_init_node_value(&e), + &RenderTarget::Rust, + &source_indices, + ), + ), + ")".to_string(), + )); + } + __result + }); + let wd_line = " .current_dir(self.working_dir.as_deref().unwrap_or(\".\"))".to_string(); + if has_stdin.clone() { { - let stdin_expr = transport_stdin(transport.clone(), source_indices.clone()).clone().unwrap(); -let stdin_var = match (*stdin_expr.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => emit_ident(expr_var_name_at(stdin_expr.clone(), source_indices.clone()), RenderTarget::Rust), - _ => emit_simple_expr(&stdin_expr, &RenderTarget::Rust, &source_indices), -}; -let spawn_line = " .stdin(std::process::Stdio::piped())\n .stdout(std::process::Stdio::piped())\n .stderr(std::process::Stdio::piped())".to_string(); -let spawn_exec = " .spawn()?;".to_string(); -let write_block = v2_rt::concat(v2_rt::concat("{\n use std::io::Write;\n if let Some(mut stdin) = output.stdin.take() {\n stdin.write_all(".to_string(), stdin_var), ".as_bytes())?;\n }\n}".to_string()); -let wait_line = "let output = output.wait_with_output()?;".to_string(); -let check_line = "let stdout = String::from_utf8_lossy(&output.stdout).to_string();".to_string(); -let return_line = emit_exit_code_handling(op_node.clone(), inferred, source_indices.clone()); -let all_lines = v2_rt::concat(v2_rt::concat(v2_rt::concat(Rc::new(vec![cmd_line]), arg_lines), env_lines), Rc::new(vec![wd_line, spawn_line, spawn_exec, write_block, wait_line, check_line, return_line])); -all_lines.join(&"\n".to_string()) -} + let stdin_expr = transport_stdin(transport.clone(), source_indices.clone()) + .clone() + .unwrap(); + let stdin_var = match (*stdin_expr.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => emit_ident( + expr_var_name_at(stdin_expr.clone(), source_indices.clone()), + RenderTarget::Rust, + ), + _ => emit_simple_expr(&stdin_expr, &RenderTarget::Rust, &source_indices), + }; + let spawn_line = " .stdin(std::process::Stdio::piped())\n .stdout(std::process::Stdio::piped())\n .stderr(std::process::Stdio::piped())".to_string(); + let spawn_exec = " .spawn()?;".to_string(); + let write_block = v2_rt::concat(v2_rt::concat("{\n use std::io::Write;\n if let Some(mut stdin) = output.stdin.take() {\n stdin.write_all(".to_string(), stdin_var), ".as_bytes())?;\n }\n}".to_string()); + let wait_line = "let output = output.wait_with_output()?;".to_string(); + let check_line = + "let stdout = String::from_utf8_lossy(&output.stdout).to_string();".to_string(); + let return_line = + emit_exit_code_handling(op_node.clone(), inferred, source_indices.clone()); + let all_lines = v2_rt::concat( + v2_rt::concat(v2_rt::concat(Rc::new(vec![cmd_line]), arg_lines), env_lines), + Rc::new(vec![ + wd_line, + spawn_line, + spawn_exec, + write_block, + wait_line, + check_line, + return_line, + ]), + ); + all_lines.join(&"\n".to_string()) + } } else { { let output_line = " .output()?;".to_string(); -let check_line = "let stdout = String::from_utf8_lossy(&output.stdout).to_string();".to_string(); -let return_line = emit_exit_code_handling(op_node.clone(), inferred, source_indices.clone()); -let all_lines = v2_rt::concat(v2_rt::concat(v2_rt::concat(Rc::new(vec![cmd_line]), arg_lines), env_lines), Rc::new(vec![wd_line, output_line, check_line, return_line])); -all_lines.join(&"\n".to_string()) -} + let check_line = + "let stdout = String::from_utf8_lossy(&output.stdout).to_string();".to_string(); + let return_line = + emit_exit_code_handling(op_node.clone(), inferred, source_indices.clone()); + let all_lines = v2_rt::concat( + v2_rt::concat(v2_rt::concat(Rc::new(vec![cmd_line]), arg_lines), env_lines), + Rc::new(vec![wd_line, output_line, check_line, return_line]), + ); + all_lines.join(&"\n".to_string()) + } } -} + } } -pub fn emit_shell_argv_element(arg: &Rc, optional_params: Rc>, source_indices: Rc>>) -> String { +pub fn emit_shell_argv_element( + arg: &Rc, + optional_params: Rc>, + source_indices: Rc>>, +) -> String { match (*arg.expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitStr { value: s, .. } = value.as_ref() else { unreachable!() }; v2_rt::concat(v2_rt::concat("\"".to_string(), escape_string_literal_body(s.clone())), "\"".to_string()) }, - ExprData::ExprStringInterp => { - let parts = Rc::new({ let mut __result = Vec::new(); for child in arg.children.clone().iter().cloned() { __result.push(match (*child.expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitStr { value: text, .. } = value.as_ref() else { unreachable!() }; Rc::new(StringPart::Text { - value: text.clone(), -}) }, - _ => Rc::new(StringPart::Interpolation { - expr: arg_value(&child), -}), -}); } __result }); -let fmt_segments = Rc::new({ let mut __result = Vec::new(); for p in parts.clone().iter().cloned() { __result.push(match (*p.clone()).clone() { - StringPart::Text { value: v, .. } => escape_rust_interp_text(v.clone()), - StringPart::Interpolation { .. } => "{}".to_string(), -}); } __result }); -let fmt_str = fmt_segments.join(&"".to_string()); -let args = Rc::new({ let mut __result = Vec::new(); for p in parts.clone().iter().cloned() { __result.extend((*match (*p.clone()).clone() { - StringPart::Text { .. } => Rc::new(vec![]), - StringPart::Interpolation { expr: e, .. } => { - let name = expr_var_name_at(e.clone(), source_indices.clone()); -let var_name = emit_ident(name.clone(), RenderTarget::Rust); -let is_opt = (is_optional_typed_expr(e.clone()) || match v2_rt::map_get(&optional_params, name.clone()) { - Some(_) => true, - None => false, -}); -if is_opt.clone() { - Rc::new(vec![v2_rt::concat(var_name.clone(), ".as_deref().unwrap_or(\"\")".to_string())]) + ExprData::ExprLiteral { ref value, .. } => { + let LiteralValue::LitStr { value: s, .. } = value.as_ref() else { + unreachable!() + }; + v2_rt::concat( + v2_rt::concat("\"".to_string(), escape_string_literal_body(s.clone())), + "\"".to_string(), + ) + } + ExprData::ExprStringInterp => { + let parts = Rc::new({ + let mut __result = Vec::new(); + for child in arg.children.clone().iter().cloned() { + __result.push(match (*child.expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { + let LiteralValue::LitStr { value: text, .. } = value.as_ref() else { + unreachable!() + }; + Rc::new(StringPart::Text { + value: text.clone(), + }) + } + _ => Rc::new(StringPart::Interpolation { + expr: arg_value(&child), + }), + }); + } + __result + }); + let fmt_segments = Rc::new({ + let mut __result = Vec::new(); + for p in parts.clone().iter().cloned() { + __result.push(match (*p.clone()).clone() { + StringPart::Text { value: v, .. } => escape_rust_interp_text(v.clone()), + StringPart::Interpolation { .. } => "{}".to_string(), + }); + } + __result + }); + let fmt_str = fmt_segments.join(&"".to_string()); + let args = Rc::new({ + let mut __result = Vec::new(); + for p in parts.clone().iter().cloned() { + __result.extend( + (*match (*p.clone()).clone() { + StringPart::Text { .. } => Rc::new(vec![]), + StringPart::Interpolation { expr: e, .. } => { + let name = expr_var_name_at(e.clone(), source_indices.clone()); + let var_name = emit_ident(name.clone(), RenderTarget::Rust); + let is_opt = (is_optional_typed_expr(e.clone()) + || match v2_rt::map_get(&optional_params, name.clone()) { + Some(_) => true, + None => false, + }); + if is_opt.clone() { + Rc::new(vec![v2_rt::concat( + var_name.clone(), + ".as_deref().unwrap_or(\"\")".to_string(), + )]) + } else { + Rc::new(vec![var_name.clone()]) + } + } + }) + .iter() + .cloned(), + ); + } + __result + }); + let args_str = args.join(&", ".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("&format!(\"".to_string(), fmt_str), + "\", ".to_string(), + ), + args_str, + ), + ")".to_string(), + ) + } + ExprData::ExprVar { .. } => { + let name = expr_var_name_at(arg.clone(), source_indices.clone()); + let var_name = emit_ident(name.clone(), RenderTarget::Rust); + let is_opt = (is_optional_typed_expr(arg.clone()) + || match v2_rt::map_get(&optional_params, name.clone()) { + Some(_) => true, + None => false, + }); + if is_opt.clone() { + v2_rt::concat( + v2_rt::concat("&".to_string(), var_name.clone()), + ".as_deref().unwrap_or(\"\").to_string()".to_string(), + ) } else { - Rc::new(vec![var_name.clone()]) + v2_rt::concat( + v2_rt::concat("&".to_string(), var_name.clone()), + ".to_string()".to_string(), + ) } -}, -}).iter().cloned()); } __result }); -let args_str = args.join(&", ".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("&format!(\"".to_string(), fmt_str), "\", ".to_string()), args_str), ")".to_string()) -}, - ExprData::ExprVar { .. } => { - let name = expr_var_name_at(arg.clone(), source_indices.clone()); -let var_name = emit_ident(name.clone(), RenderTarget::Rust); -let is_opt = (is_optional_typed_expr(arg.clone()) || match v2_rt::map_get(&optional_params, name.clone()) { - Some(_) => true, - None => false, -}); -if is_opt.clone() { - v2_rt::concat(v2_rt::concat("&".to_string(), var_name.clone()), ".as_deref().unwrap_or(\"\").to_string()".to_string()) - } else { - v2_rt::concat(v2_rt::concat("&".to_string(), var_name.clone()), ".to_string()".to_string()) - } -}, - _ => emit_simple_expr(&arg, &RenderTarget::Rust, &source_indices), -} -} - -pub fn emit_shell_return(inferred: Rc, source_indices: &Rc>>) -> String { - { - let effective = unwrap_single_field_product(inferred); -let is_product = is_product_type(effective.clone()); -let single_from = if (is_product.clone() && ((effective.children.clone().len() as i64) == 1)) { - match effective.children.clone().first().cloned() { - Some(ch) => child_from_key(ch.clone(), source_indices.clone()), - None => None, -} - } else { - None - }; -match single_from { - Some(channel) => { - let is_optional = (effective.return_cardinality.clone() == Cardinality::CardOptional); -emit_shell_channel_expr(&channel, is_optional.clone()) -}, - None => if (is_product.clone() && ((effective.children.clone().len() as i64) > 1)) { - { - let needs_stderr = { let mut __found = false; for ch in effective.children.clone().iter().cloned() { if match child_from_key(ch.clone(), source_indices.clone()) { - Some(ref __some_val) if __some_val == "stderr" => true, - _ => false, -} { __found = true; break; } } __found }; -let stderr_line = if needs_stderr { - "let stderr = String::from_utf8_lossy(&output.stderr).to_string();".to_string() - } else { - "".to_string() - }; -let field_exprs = Rc::new({ let mut __result = Vec::new(); for ch in effective.children.clone().iter().cloned() { __result.push({ - let is_optional = (ch.return_cardinality.clone() == Cardinality::CardOptional); -let channel = match child_from_key(ch.clone(), source_indices.clone()) { - Some(c) => c.clone(), - None => "stdout".to_string(), -}; -emit_shell_channel_expr(&channel, is_optional.clone()) -}); } __result }); -let lines = if (stderr_line.clone().as_str() != "".to_string().as_str()) { - v2_rt::concat(stderr_line.clone(), "\n".to_string()) - } else { - "".to_string() - }; -v2_rt::concat(v2_rt::concat(v2_rt::concat(lines, "Ok((".to_string()), field_exprs.join(&", ".to_string())), "))".to_string()) -} - } else { - { - let is_optional = (effective.return_cardinality.clone() == Cardinality::CardOptional); -emit_shell_channel_expr(&"stdout".to_string(), is_optional.clone()) -} - }, -} + } + _ => emit_simple_expr(&arg, &RenderTarget::Rust, &source_indices), + } } + +pub fn emit_shell_return( + inferred: Rc, + source_indices: &Rc>>, +) -> String { + { + let effective = unwrap_single_field_product(inferred); + let is_product = is_product_type(effective.clone()); + let single_from = + if (is_product.clone() && ((effective.children.clone().len() as i64) == 1)) { + match effective.children.clone().first().cloned() { + Some(ch) => child_from_key(ch.clone(), source_indices.clone()), + None => None, + } + } else { + None + }; + match single_from { + Some(channel) => { + let is_optional = + (effective.return_cardinality.clone() == Cardinality::CardOptional); + emit_shell_channel_expr(&channel, is_optional.clone()) + } + None => { + if (is_product.clone() && ((effective.children.clone().len() as i64) > 1)) { + { + let needs_stderr = { + let mut __found = false; + for ch in effective.children.clone().iter().cloned() { + if match child_from_key(ch.clone(), source_indices.clone()) { + Some(ref __some_val) if __some_val == "stderr" => true, + _ => false, + } { + __found = true; + break; + } + } + __found + }; + let stderr_line = if needs_stderr { + "let stderr = String::from_utf8_lossy(&output.stderr).to_string();" + .to_string() + } else { + "".to_string() + }; + let field_exprs = Rc::new({ + let mut __result = Vec::new(); + for ch in effective.children.clone().iter().cloned() { + __result.push({ + let is_optional = (ch.return_cardinality.clone() + == Cardinality::CardOptional); + let channel = + match child_from_key(ch.clone(), source_indices.clone()) { + Some(c) => c.clone(), + None => "stdout".to_string(), + }; + emit_shell_channel_expr(&channel, is_optional.clone()) + }); + } + __result + }); + let lines = if (stderr_line.clone().as_str() != "".to_string().as_str()) { + v2_rt::concat(stderr_line.clone(), "\n".to_string()) + } else { + "".to_string() + }; + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(lines, "Ok((".to_string()), + field_exprs.join(&", ".to_string()), + ), + "))".to_string(), + ) + } + } else { + { + let is_optional = + (effective.return_cardinality.clone() == Cardinality::CardOptional); + emit_shell_channel_expr(&"stdout".to_string(), is_optional.clone()) + } + } + } + } + } } pub fn emit_shell_channel_expr(channel: &String, is_optional: bool) -> String { @@ -5324,252 +13317,709 @@ pub fn emit_shell_channel_expr(channel: &String, is_optional: bool) -> String { } } }; -if is_optional { + if is_optional { v2_rt::concat(v2_rt::concat("Some(".to_string(), base), ")".to_string()) } else { base } -} + } } pub fn unwrap_single_field_product(n: Rc) -> Rc { { let is_product = is_product_type(n.clone()); -if ((is_product && (n.ident_span.clone() == None)) && ((n.children.clone().len() as i64) == 1)) { + if ((is_product && (n.ident_span.clone() == None)) + && ((n.children.clone().len() as i64) == 1)) + { match n.children.clone().first().cloned() { - Some(field_node) => resolved_type(field_node.clone()), - None => n.clone(), -} + Some(field_node) => resolved_type(field_node.clone()), + None => n.clone(), + } } else { n.clone() } -} + } } pub fn emit_file_call(op_name: String, inferred: Rc) -> String { { let effective = unwrap_single_field_product(inferred); -let is_product = is_product_type(effective.clone()); -let parse_line = if (is_product && ((effective.children.clone().len() as i64) > 1)) { + let is_product = is_product_type(effective.clone()); + let parse_line = if (is_product && ((effective.children.clone().len() as i64) > 1)) { "let parsed: serde_json::Value = serde_json::from_str(&content)?;\nOk(serde_json::from_value(parsed)?)".to_string() } else { "Ok(content)".to_string() }; -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("let path = format!(\"{}/{}\", self.base_path, \"".to_string(), emit_ident(op_name, RenderTarget::Rust)), "\");\n".to_string()), "let content = std::fs::read_to_string(&path)?;\n".to_string()), parse_line) -} + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "let path = format!(\"{}/{}\", self.base_path, \"".to_string(), + emit_ident(op_name, RenderTarget::Rust), + ), + "\");\n".to_string(), + ), + "let content = std::fs::read_to_string(&path)?;\n".to_string(), + ), + parse_line, + ) + } } pub fn emit_local_call(op_name: String) -> String { - v2_rt::concat(v2_rt::concat(v2_rt::concat("// Local binding -- direct function call\n".to_string(), "Ok(".to_string()), emit_ident(op_name, RenderTarget::Rust)), "())".to_string()) -} - -pub fn emit_resource_def(item: &Rc, shared_types: Rc>, env: &Rc) -> String { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "// Local binding -- direct function call\n".to_string(), + "Ok(".to_string(), + ), + emit_ident(op_name, RenderTarget::Rust), + ), + "())".to_string(), + ) +} + +pub fn emit_resource_def( + item: &Rc, + shared_types: Rc>, + env: &Rc, +) -> String { { let item_text = authored_name(env.clone(), item.clone()); -let cap_children = item.children.clone(); -if ((cap_children.clone().len() as i64) == 0) { - v2_rt::concat(v2_rt::concat("#[derive(Debug, Clone)]\npub struct ".to_string(), item_text), ";".to_string()) + let cap_children = item.children.clone(); + if ((cap_children.clone().len() as i64) == 0) { + v2_rt::concat( + v2_rt::concat( + "#[derive(Debug, Clone)]\npub struct ".to_string(), + item_text, + ), + ";".to_string(), + ) } else { { let depth = 0; -let cap_methods = Rc::new({ let mut __result = Vec::new(); for c in cap_children.clone().iter().cloned() { __result.push(emit_capability_method(&c, &shared_types, &env)); } __result }); -let methods_str = cap_methods.join(&"\n\n".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("#[async_trait::async_trait]\npub trait ".to_string(), item_text), " {\n".to_string()), make_indent((depth + 1))), methods_str), "\n}".to_string()) -} + let cap_methods = Rc::new({ + let mut __result = Vec::new(); + for c in cap_children.clone().iter().cloned() { + __result.push(emit_capability_method(&c, &shared_types, &env)); + } + __result + }); + let methods_str = cap_methods.join(&"\n\n".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "#[async_trait::async_trait]\npub trait ".to_string(), + item_text, + ), + " {\n".to_string(), + ), + make_indent((depth + 1)), + ), + methods_str, + ), + "\n}".to_string(), + ) + } } -} + } } -pub fn emit_capability_method(cap_node: &Rc, shared_types: &Rc>, env: &Rc) -> String { +pub fn emit_capability_method( + cap_node: &Rc, + shared_types: &Rc>, + env: &Rc, +) -> String { { - let input_params = Rc::new({ let mut __result = Vec::new(); for p in cap_node.params.clone().iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(emit_ident(param_node_name_at(p.clone(), env.source_indices.clone()), RenderTarget::Rust), rust_items().param_type_sep.clone()), emit_rust_param_type(¶m_node_type_expr(&p), &shared_types, &env.source_indices.clone()))); } __result }); -let params_str = input_params.join(&", ".to_string()); -let all_params = if (params_str.clone().as_str() == "".to_string().as_str()) { + let input_params = Rc::new({ + let mut __result = Vec::new(); + for p in cap_node.params.clone().iter().cloned() { + __result.push(v2_rt::concat( + v2_rt::concat( + emit_ident( + param_node_name_at(p.clone(), env.source_indices.clone()), + RenderTarget::Rust, + ), + rust_items().param_type_sep.clone(), + ), + emit_rust_param_type( + ¶m_node_type_expr(&p), + &shared_types, + &env.source_indices.clone(), + ), + )); + } + __result + }); + let params_str = input_params.join(&", ".to_string()); + let all_params = if (params_str.clone().as_str() == "".to_string().as_str()) { "&self".to_string() } else { v2_rt::concat("&self, ".to_string(), params_str.clone()) }; -let ret = render_rust_type(resolved_type(cap_node.clone()), shared_types.clone(), env.source_indices.clone()); -let items = rust_items(); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(items.async_prefix.clone(), items.func_keyword.clone()), " ".to_string()), emit_ident(authored_name(env.clone(), cap_node.clone()), RenderTarget::Rust)), "(".to_string()), all_params), ") -> Result<".to_string()), ret), ", Box>;".to_string()) -} + let ret = render_rust_type( + resolved_type(cap_node.clone()), + shared_types.clone(), + env.source_indices.clone(), + ); + let items = rust_items(); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + items.async_prefix.clone(), + items.func_keyword.clone(), + ), + " ".to_string(), + ), + emit_ident( + authored_name(env.clone(), cap_node.clone()), + RenderTarget::Rust, + ), + ), + "(".to_string(), + ), + all_params, + ), + ") -> Result<".to_string(), + ), + ret, + ), + ", Box>;".to_string(), + ) + } } pub fn data_value_has_cross_refs(value: &Rc) -> bool { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*value.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => true, - ExprData::ExprListLit => { let mut __found = false; for c in value.children.clone().iter().cloned() { if data_value_has_cross_refs(&c) { __found = true; break; } } __found }, - ExprData::ExprRecordLit { .. } => { let mut __found = false; for f in value.children.clone().iter().cloned() { if data_value_has_cross_refs(&field_init_node_value(&f)) { __found = true; break; } } __found }, - _ => false, -} + ExprData::ExprVar { .. } => true, + ExprData::ExprListLit => { + let mut __found = false; + for c in value.children.clone().iter().cloned() { + if data_value_has_cross_refs(&c) { + __found = true; + break; + } + } + __found + } + ExprData::ExprRecordLit { .. } => { + let mut __found = false; + for f in value.children.clone().iter().cloned() { + if data_value_has_cross_refs(&field_init_node_value(&f)) { + __found = true; + break; + } + } + __found + } + _ => false, + } }) } -pub fn emit_data_def(name: String, type_node: &Rc, value: Rc, registry: Rc>>, scope: &Rc, depth: i64, shared_types: &Rc>, emit_info: Rc) -> String { +pub fn emit_data_def( + name: String, + type_node: &Rc, + value: Rc, + registry: Rc>>, + scope: &Rc, + depth: i64, + shared_types: &Rc>, + emit_info: Rc, +) -> String { { - let ty_str = render_rust_type(type_node.clone(), shared_types.clone(), scope.type_env.clone().source_indices.clone()); -let fn_name = to_snake(name); -let needs_rc = v2_rt::map_contains_key(&shared_types, authored_name_at(scope.type_env.clone().source_indices.clone(), &type_node)); -if is_simple_type_node(type_node.clone(), scope.type_env.clone().source_indices.clone()) { + let ty_str = render_rust_type( + type_node.clone(), + shared_types.clone(), + scope.type_env.clone().source_indices.clone(), + ); + let fn_name = to_snake(name); + let needs_rc = v2_rt::map_contains_key( + &shared_types, + authored_name_at(scope.type_env.clone().source_indices.clone(), &type_node), + ); + if is_simple_type_node( + type_node.clone(), + scope.type_env.clone().source_indices.clone(), + ) { { - let val_str = emit_typed_expr(value, registry, &scope, depth, shared_types.clone(), emit_info, 1024); -let kw = rust_items().func_keyword.clone(); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(rust_visibility_prefix(), kw), " ".to_string()), fn_name), "() -> ".to_string()), ty_str.clone()), " { ".to_string()), val_str), " }".to_string()) -} + let val_str = emit_typed_expr( + value, + registry, + &scope, + depth, + shared_types.clone(), + emit_info, + 1024, + ); + let kw = rust_items().func_keyword.clone(); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(rust_visibility_prefix(), kw), + " ".to_string(), + ), + fn_name, + ), + "() -> ".to_string(), + ), + ty_str.clone(), + ), + " { ".to_string(), + ), + val_str, + ), + " }".to_string(), + ) + } } else { { - let body = emit_data_def_body(&type_node, &value, registry, &scope, depth, shared_types.clone(), emit_info, &needs_rc); -let kw = rust_items().func_keyword.clone(); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(rust_visibility_prefix(), kw), " ".to_string()), fn_name), "() -> ".to_string()), ty_str.clone()), " {\n".to_string()), " thread_local! {\n".to_string()), " static CACHED: ".to_string()), ty_str.clone()), " = {\n".to_string()), body), "\n".to_string()), " };\n".to_string()), " }\n".to_string()), " CACHED.with(|c| c.clone())\n".to_string()), "}".to_string()) -} + let body = emit_data_def_body( + &type_node, + &value, + registry, + &scope, + depth, + shared_types.clone(), + emit_info, + &needs_rc, + ); + let kw = rust_items().func_keyword.clone(); + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(rust_visibility_prefix(), kw), " ".to_string()), fn_name), "() -> ".to_string()), ty_str.clone()), " {\n".to_string()), " thread_local! {\n".to_string()), " static CACHED: ".to_string()), ty_str.clone()), " = {\n".to_string()), body), "\n".to_string()), " };\n".to_string()), " }\n".to_string()), " CACHED.with(|c| c.clone())\n".to_string()), "}".to_string()) + } } -} + } } -pub fn emit_data_def_body(type_node: &Rc, value: &Rc, registry: Rc>>, scope: &Rc, depth: i64, shared_types: Rc>, emit_info: Rc, needs_rc: &bool) -> String { - if (has_nested_records_node(type_node.clone(), scope.type_env.clone().source_indices.clone()) && !data_value_has_cross_refs(&value)) { +pub fn emit_data_def_body( + type_node: &Rc, + value: &Rc, + registry: Rc>>, + scope: &Rc, + depth: i64, + shared_types: Rc>, + emit_info: Rc, + needs_rc: &bool, +) -> String { + if (has_nested_records_node( + type_node.clone(), + scope.type_env.clone().source_indices.clone(), + ) && !data_value_has_cross_refs(&value)) + { { - let json_str = emit_data_value_json(&value, scope.type_env.clone().source_indices.clone()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(" serde_json::from_value(serde_json::json!(".to_string(), json_str), "))\n".to_string()), " .expect(\"valid data definition\")".to_string()) -} + let json_str = + emit_data_value_json(&value, scope.type_env.clone().source_indices.clone()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + " serde_json::from_value(serde_json::json!(".to_string(), + json_str, + ), + "))\n".to_string(), + ), + " .expect(\"valid data definition\")".to_string(), + ) + } } else { { - let is_map = node_is_keyed_collection(&type_node, scope.type_env.clone().source_indices.clone()); -if is_map { + let is_map = + node_is_keyed_collection(&type_node, scope.type_env.clone().source_indices.clone()); + if is_map { match (*value.expr_data.clone()).clone() { - ExprData::ExprRecordLit { .. } => { - let inserts = Rc::new({ let mut __result = Vec::new(); for f in value.children.clone().iter().cloned() { __result.push({ - let val_str = emit_typed_expr(field_init_node_value(&f), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" __m.insert(\"".to_string(), field_init_node_name_at(f.clone(), scope.type_env.clone().source_indices.clone())), "\".to_string(), ".to_string()), val_str.clone()), ");".to_string()) -}); } __result }); -let inserts_str = inserts.join(&"\n".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(" let mut __m = HashMap::new();\n".to_string(), inserts_str), "\n".to_string()), " Rc::new(__m)".to_string()) -}, - _ => { - let val_str = emit_typed_expr(value.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -v2_rt::concat(" ".to_string(), val_str.clone()) -}, -} + ExprData::ExprRecordLit { .. } => { + let inserts = Rc::new({ + let mut __result = Vec::new(); + for f in value.children.clone().iter().cloned() { + __result.push({ + let val_str = emit_typed_expr( + field_init_node_value(&f), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + " __m.insert(\"".to_string(), + field_init_node_name_at( + f.clone(), + scope + .type_env + .clone() + .source_indices + .clone(), + ), + ), + "\".to_string(), ".to_string(), + ), + val_str.clone(), + ), + ");".to_string(), + ) + }); + } + __result + }); + let inserts_str = inserts.join(&"\n".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + " let mut __m = HashMap::new();\n".to_string(), + inserts_str, + ), + "\n".to_string(), + ), + " Rc::new(__m)".to_string(), + ) + } + _ => { + let val_str = emit_typed_expr( + value.clone(), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + v2_rt::concat(" ".to_string(), val_str.clone()) + } + } } else { { - let val_str = emit_typed_expr(value.clone(), registry.clone(), &scope, depth.clone(), shared_types.clone(), emit_info.clone(), 1024); -let is_already_wrapped = match (*value.expr_data.clone()).clone() { - ExprData::ExprRecordLit { .. } => true, - ExprData::ExprListLit => true, - _ => false, -}; -let wrap_start = if (needs_rc.clone() && !is_already_wrapped.clone()) { + let val_str = emit_typed_expr( + value.clone(), + registry.clone(), + &scope, + depth.clone(), + shared_types.clone(), + emit_info.clone(), + 1024, + ); + let is_already_wrapped = match (*value.expr_data.clone()).clone() { + ExprData::ExprRecordLit { .. } => true, + ExprData::ExprListLit => true, + _ => false, + }; + let wrap_start = if (needs_rc.clone() && !is_already_wrapped.clone()) { "Rc::new(".to_string() } else { "".to_string() }; -let wrap_end = if (needs_rc.clone() && !is_already_wrapped.clone()) { + let wrap_end = if (needs_rc.clone() && !is_already_wrapped.clone()) { ")".to_string() } else { "".to_string() }; -v2_rt::concat(v2_rt::concat(v2_rt::concat(" ".to_string(), wrap_start), val_str.clone()), wrap_end) -} + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(" ".to_string(), wrap_start), + val_str.clone(), + ), + wrap_end, + ) + } } -} + } } } -pub fn emit_test_file(module_name: &String, projections: Rc>>) -> Rc { +pub fn emit_test_file( + module_name: &String, + projections: Rc>>, +) -> Rc { { let depth = 0; -let test_fns = Rc::new({ let mut __result = Vec::new(); for p in projections.iter().cloned() { __result.push(emit_operation_test(&p, (depth.clone() + 1))); } __result }); -if ((test_fns.clone().len() as i64) == 0) { + let test_fns = Rc::new({ + let mut __result = Vec::new(); + for p in projections.iter().cloned() { + __result.push(emit_operation_test(&p, (depth.clone() + 1))); + } + __result + }); + if ((test_fns.clone().len() as i64) == 0) { Rc::new(TextFile { - path: "".to_string(), - content: "".to_string(), -}) + path: "".to_string(), + content: "".to_string(), + }) } else { { let filename = module_to_filename(module_name.clone()); -let tests_str = test_fns.clone().join(&"\n\n".to_string()); -let content = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("// Generated tests -- do not edit.\n".to_string(), "// Source module: ".to_string()), module_name.clone()), "\n\n".to_string()), "#[cfg(test)]\nmod tests {\n".to_string()), " use super::*;\n\n".to_string()), make_indent((depth.clone() + 1))), tests_str), "\n".to_string()), "}\n".to_string()); -Rc::new(TextFile { - path: rust_test_file_path(module_name.clone()), - content: content, -}) -} + let tests_str = test_fns.clone().join(&"\n\n".to_string()); + let content = v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "// Generated tests -- do not edit.\n" + .to_string(), + "// Source module: ".to_string(), + ), + module_name.clone(), + ), + "\n\n".to_string(), + ), + "#[cfg(test)]\nmod tests {\n".to_string(), + ), + " use super::*;\n\n".to_string(), + ), + make_indent((depth.clone() + 1)), + ), + tests_str, + ), + "\n".to_string(), + ), + "}\n".to_string(), + ); + Rc::new(TextFile { + path: rust_test_file_path(module_name.clone()), + content: content, + }) + } } -} + } } pub fn rust_test_signature_comment(projection: &Rc) -> String { { - let params_str = Rc::new({ let mut __result = Vec::new(); for p in projection.params.clone().iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(param_node_name_at(p.clone(), projection.source_indices.clone()), ": ".to_string()), emit_rust_param_type(¶m_node_type_expr(&p), &v2_rt::rc_empty_map::(), &projection.source_indices.clone()))); } __result }).join(&", ".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("// Signature: ".to_string(), sanitize_service_name(projection.service_name.clone())), ".".to_string()), projection.operation_name.clone()), "(".to_string()), params_str), ") -> ".to_string()), emit_node_type(projection.inferred.clone(), RenderTarget::Rust, projection.source_indices.clone())) -} + let params_str = Rc::new({ + let mut __result = Vec::new(); + for p in projection.params.clone().iter().cloned() { + __result.push(v2_rt::concat( + v2_rt::concat( + param_node_name_at(p.clone(), projection.source_indices.clone()), + ": ".to_string(), + ), + emit_rust_param_type( + ¶m_node_type_expr(&p), + &v2_rt::rc_empty_map::(), + &projection.source_indices.clone(), + ), + )); + } + __result + }) + .join(&", ".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "// Signature: ".to_string(), + sanitize_service_name(projection.service_name.clone()), + ), + ".".to_string(), + ), + projection.operation_name.clone(), + ), + "(".to_string(), + ), + params_str, + ), + ") -> ".to_string(), + ), + emit_node_type( + projection.inferred.clone(), + RenderTarget::Rust, + projection.source_indices.clone(), + ), + ) + } } pub fn emit_operation_test(projection: &Rc, depth: i64) -> String { { let test_name = rust_test_name(projection.clone()); -let struct_name = sanitize_service_name(projection.service_name.clone()); -let op_method = to_snake(projection.operation_name.clone()); -let indent = make_indent((depth + 1)); -let param_args = Rc::new({ let mut __result = Vec::new(); for p in projection.params.clone().iter().cloned() { __result.push(emit_rust_default_value(p.clone(), projection.source_indices.clone())); } __result }); -let args_str = param_args.join(&", ".to_string()); -let call_args = if (args_str.clone().as_str() == "".to_string().as_str()) { + let struct_name = sanitize_service_name(projection.service_name.clone()); + let op_method = to_snake(projection.operation_name.clone()); + let indent = make_indent((depth + 1)); + let param_args = Rc::new({ + let mut __result = Vec::new(); + for p in projection.params.clone().iter().cloned() { + __result.push(emit_rust_default_value( + p.clone(), + projection.source_indices.clone(), + )); + } + __result + }); + let args_str = param_args.join(&", ".to_string()); + let call_args = if (args_str.clone().as_str() == "".to_string().as_str()) { "".to_string() } else { args_str.clone() }; -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(rust_async_test_decorator(), "\nasync fn ".to_string()), test_name), "() {\n".to_string()), indent.clone()), rust_test_signature_comment(&projection)), "\n".to_string()), indent.clone()), "let service = ".to_string()), struct_name.clone()), "::new(crate::dry_run::DryRunMode(true));\n".to_string()), indent.clone()), "let result = service.".to_string()), emit_ident(op_method, RenderTarget::Rust)), "(".to_string()), call_args), ").await;\n".to_string()), indent.clone()), "assert!(result.is_ok(), \"".to_string()), struct_name.clone()), ".".to_string()), projection.operation_name.clone()), " should succeed in dry-run mode: {:?}\", result.err());\n".to_string()), "}".to_string()) -} + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(rust_async_test_decorator(), "\nasync fn ".to_string()), test_name), "() {\n".to_string()), indent.clone()), rust_test_signature_comment(&projection)), "\n".to_string()), indent.clone()), "let service = ".to_string()), struct_name.clone()), "::new(crate::dry_run::DryRunMode(true));\n".to_string()), indent.clone()), "let result = service.".to_string()), emit_ident(op_method, RenderTarget::Rust)), "(".to_string()), call_args), ").await;\n".to_string()), indent.clone()), "assert!(result.is_ok(), \"".to_string()), struct_name.clone()), ".".to_string()), projection.operation_name.clone()), " should succeed in dry-run mode: {:?}\", result.err());\n".to_string()), "}".to_string()) + } } -pub fn emit_rust_default_value(param: Rc, source_indices: Rc>>) -> String { +pub fn emit_rust_default_value( + param: Rc, + source_indices: Rc>>, +) -> String { { let type_name = authored_name_at(source_indices, ¶m_node_type_expr(¶m)); -match lookup_checkpoint(RenderTarget::Rust, type_name.clone()) { - Some(cp) => match cp.default_expr.clone() { - Some(expr) => expr.clone(), - None => v2_rt::concat(v2_rt::concat("compile_error!(\"no test default for type: ".to_string(), type_name.clone()), "\")".to_string()), -}, - None => v2_rt::concat(v2_rt::concat("compile_error!(\"no test default for type: ".to_string(), type_name.clone()), "\")".to_string()), -} -} + match lookup_checkpoint(RenderTarget::Rust, type_name.clone()) { + Some(cp) => match cp.default_expr.clone() { + Some(expr) => expr.clone(), + None => v2_rt::concat( + v2_rt::concat( + "compile_error!(\"no test default for type: ".to_string(), + type_name.clone(), + ), + "\")".to_string(), + ), + }, + None => v2_rt::concat( + v2_rt::concat( + "compile_error!(\"no test default for type: ".to_string(), + type_name.clone(), + ), + "\")".to_string(), + ), + } + } } -pub fn emit_mock_prop_setup(mock_prop: &Rc, depth: i64, source_indices: &Rc>>) -> String { +pub fn emit_mock_prop_setup( + mock_prop: &Rc, + depth: i64, + source_indices: &Rc>>, +) -> String { { - let body_str = emit_simple_expr(&field_init_node_value(&mock_prop), &RenderTarget::Rust, &source_indices); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("let ".to_string(), field_init_node_name_at(mock_prop.clone(), source_indices.clone())), " = ".to_string()), body_str), ";".to_string()) -} + let body_str = emit_simple_expr( + &field_init_node_value(&mock_prop), + &RenderTarget::Rust, + &source_indices, + ); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "let ".to_string(), + field_init_node_name_at(mock_prop.clone(), source_indices.clone()), + ), + " = ".to_string(), + ), + body_str, + ), + ";".to_string(), + ) + } } pub fn emit_cargo_dep(name: String, version: String, features: &Rc>) -> String { if ((features.clone().len() as i64) > 0) { { - let feat_strs = Rc::new({ let mut __result = Vec::new(); for f in features.clone().iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat("\"".to_string(), f.clone()), "\"".to_string())); } __result }); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(name, " = { version = \"".to_string()), version), "\", features = [".to_string()), feat_strs.join(&", ".to_string())), "] }\n".to_string()) -} + let feat_strs = Rc::new({ + let mut __result = Vec::new(); + for f in features.clone().iter().cloned() { + __result.push(v2_rt::concat( + v2_rt::concat("\"".to_string(), f.clone()), + "\"".to_string(), + )); + } + __result + }); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(name, " = { version = \"".to_string()), + version, + ), + "\", features = [".to_string(), + ), + feat_strs.join(&", ".to_string()), + ), + "] }\n".to_string(), + ) + } } else { - v2_rt::concat(v2_rt::concat(v2_rt::concat(name, " = \"".to_string()), version), "\"\n".to_string()) + v2_rt::concat( + v2_rt::concat(v2_rt::concat(name, " = \"".to_string()), version), + "\"\n".to_string(), + ) } } pub fn emit_cargo_toml(crate_name: String, has_services: bool) -> Rc { { - let header = v2_rt::concat(v2_rt::concat("[package]\nname = \"".to_string(), crate_name), "\"\nversion = \"0.1.0\"\nedition = \"2021\"\n".to_string()); -let workspace = "\n[workspace]\n".to_string(); -let base_deps = Rc::new(vec![emit_cargo_dep("serde".to_string(), "1".to_string(), &Rc::new(vec!["derive".to_string(), "rc".to_string()])), emit_cargo_dep("serde_json".to_string(), "1".to_string(), &Rc::new(vec![])), emit_cargo_dep("stacker".to_string(), "0.1".to_string(), &Rc::new(vec![])), emit_cargo_dep("clap".to_string(), "4".to_string(), &Rc::new(vec!["derive".to_string()])), emit_cargo_dep("lazy_static".to_string(), "1".to_string(), &Rc::new(vec![]))]); -let async_deps = if has_services { - Rc::new(vec![emit_cargo_dep("tokio".to_string(), "1".to_string(), &Rc::new(vec!["full".to_string()])), emit_cargo_dep("reqwest".to_string(), "0.12".to_string(), &Rc::new(vec!["json".to_string()])), emit_cargo_dep("async-trait".to_string(), "0.1".to_string(), &Rc::new(vec![]))]) + let header = v2_rt::concat( + v2_rt::concat("[package]\nname = \"".to_string(), crate_name), + "\"\nversion = \"0.1.0\"\nedition = \"2021\"\n".to_string(), + ); + let workspace = "\n[workspace]\n".to_string(); + let base_deps = Rc::new(vec![ + emit_cargo_dep( + "serde".to_string(), + "1".to_string(), + &Rc::new(vec!["derive".to_string(), "rc".to_string()]), + ), + emit_cargo_dep("serde_json".to_string(), "1".to_string(), &Rc::new(vec![])), + emit_cargo_dep("stacker".to_string(), "0.1".to_string(), &Rc::new(vec![])), + emit_cargo_dep( + "clap".to_string(), + "4".to_string(), + &Rc::new(vec!["derive".to_string()]), + ), + emit_cargo_dep("lazy_static".to_string(), "1".to_string(), &Rc::new(vec![])), + ]); + let async_deps = if has_services { + Rc::new(vec![ + emit_cargo_dep( + "tokio".to_string(), + "1".to_string(), + &Rc::new(vec!["full".to_string()]), + ), + emit_cargo_dep( + "reqwest".to_string(), + "0.12".to_string(), + &Rc::new(vec!["json".to_string()]), + ), + emit_cargo_dep( + "async-trait".to_string(), + "0.1".to_string(), + &Rc::new(vec![]), + ), + ]) } else { Rc::new(vec![]) }; -let all_deps = v2_rt::concat(base_deps, async_deps); -Rc::new(TextFile { - path: "Cargo.toml".to_string(), - content: v2_rt::concat(v2_rt::concat(v2_rt::concat(header, workspace), "\n[dependencies]\n".to_string()), all_deps.join(&"".to_string())), -}) -} + let all_deps = v2_rt::concat(base_deps, async_deps); + Rc::new(TextFile { + path: "Cargo.toml".to_string(), + content: v2_rt::concat( + v2_rt::concat( + v2_rt::concat(header, workspace), + "\n[dependencies]\n".to_string(), + ), + all_deps.join(&"".to_string()), + ), + }) + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -5587,73 +14037,119 @@ pub struct WorkflowFunc { pub fn extract_literal_string(expr: Rc) -> Option { match (*expr.expr_data.clone()).clone() { - ExprData::ExprLiteral { value: v, .. } => match (*v.clone()).clone() { - LiteralValue::LitStr { value: s, .. } => Some(s.clone()), - LiteralValue::LitBool { value: b, .. } => Some(if b.clone() { - "true".to_string() - } else { - "false".to_string() - }), - _ => None, -}, - _ => None, -} + ExprData::ExprLiteral { value: v, .. } => match (*v.clone()).clone() { + LiteralValue::LitStr { value: s, .. } => Some(s.clone()), + LiteralValue::LitBool { value: b, .. } => Some(if b.clone() { + "true".to_string() + } else { + "false".to_string() + }), + _ => None, + }, + _ => None, + } } -pub fn resolve_param_default(param: Rc, registry: Rc>>, module_items: Rc>>, source_indices: &Rc>>) -> Option { +pub fn resolve_param_default( + param: Rc, + registry: Rc>>, + module_items: Rc>>, + source_indices: &Rc>>, +) -> Option { match param_node_default_value(¶m) { - Some(dv) => match (*dv.expr_data.clone()).clone() { - ExprData::ExprLiteral { .. } => extract_literal_string(dv.clone()), - ExprData::ExprVar { .. } => match lookup_item(registry, authored_name_at(source_indices.clone(), &dv)) { - Some(info) => match info.kind.clone() { - ItemKind::DataItem => match Rc::new({ let mut __result = Vec::new(); for i in module_items.iter().cloned() { if (authored_name_at(source_indices.clone(), &i).as_str() == authored_name_at(source_indices.clone(), &dv).as_str()) { __result.push(i); } } __result }).first().cloned() { - Some(data_item) => match data_item.body.clone() { - Some(body) => extract_literal_string(body.clone()), - None => None, -}, - None => None, -}, - _ => None, -}, - None => None, -}, - _ => None, -}, - None => None, -} + Some(dv) => match (*dv.expr_data.clone()).clone() { + ExprData::ExprLiteral { .. } => extract_literal_string(dv.clone()), + ExprData::ExprVar { .. } => { + match lookup_item(registry, authored_name_at(source_indices.clone(), &dv)) { + Some(info) => match info.kind.clone() { + ItemKind::DataItem => match Rc::new({ + let mut __result = Vec::new(); + for i in module_items.iter().cloned() { + if (authored_name_at(source_indices.clone(), &i).as_str() + == authored_name_at(source_indices.clone(), &dv).as_str()) + { + __result.push(i); + } + } + __result + }) + .first() + .cloned() + { + Some(data_item) => match data_item.body.clone() { + Some(body) => extract_literal_string(body.clone()), + None => None, + }, + None => None, + }, + _ => None, + }, + None => None, + } + } + _ => None, + }, + None => None, + } } -pub fn to_workflow_func(item: &Rc, module_name: &String, registry: &Rc>>, module_items: Rc>>, source_indices: &Rc>>, read_only_params_index: Rc>>>) -> Rc { +pub fn to_workflow_func( + item: &Rc, + module_name: &String, + registry: &Rc>>, + module_items: Rc>>, + source_indices: &Rc>>, + read_only_params_index: Rc>>>, +) -> Rc { { let item_name = authored_name_at(source_indices.clone(), &item); -let svc_names = match lookup_item(registry.clone(), item_name.clone()) { - Some(info) => info.service_names.clone(), - None => Rc::new(vec![]), -}; -let defaults = item.params.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, p: Rc| match resolve_param_default(p.clone(), registry.clone(), module_items.clone(), &source_indices) { - Some(lit) => v2_rt::rc_map_insert(acc.clone(), param_node_name_at(p.clone(), source_indices.clone()), lit.clone()), - None => acc.clone(), -}); -let qualified = v2_rt::concat(v2_rt::concat(module_name.clone(), ".".to_string()), item_name.clone()); -let ro_params = match v2_rt::map_get(&read_only_params_index, qualified) { - Some(m) => m.clone(), - None => v2_rt::rc_empty_map::(), -}; -Rc::new(WorkflowFunc { - name: item_name.clone(), - module_name: module_name.clone(), - params: item.params.clone(), - inferred: resolved_type(item.clone()), - uses: item.uses.clone(), - service_names: svc_names, - resolved_defaults: defaults, - read_only_params: ro_params, - source_indices: source_indices.clone(), -}) -} + let svc_names = match lookup_item(registry.clone(), item_name.clone()) { + Some(info) => info.service_names.clone(), + None => Rc::new(vec![]), + }; + let defaults = item.params.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, p: Rc| match resolve_param_default( + p.clone(), + registry.clone(), + module_items.clone(), + &source_indices, + ) { + Some(lit) => v2_rt::rc_map_insert( + acc.clone(), + param_node_name_at(p.clone(), source_indices.clone()), + lit.clone(), + ), + None => acc.clone(), + }, + ); + let qualified = v2_rt::concat( + v2_rt::concat(module_name.clone(), ".".to_string()), + item_name.clone(), + ); + let ro_params = match v2_rt::map_get(&read_only_params_index, qualified) { + Some(m) => m.clone(), + None => v2_rt::rc_empty_map::(), + }; + Rc::new(WorkflowFunc { + name: item_name.clone(), + module_name: module_name.clone(), + params: item.params.clone(), + inferred: resolved_type(item.clone()), + uses: item.uses.clone(), + service_names: svc_names, + resolved_defaults: defaults, + read_only_params: ro_params, + source_indices: source_indices.clone(), + }) + } } -pub fn is_workflow_item(item: &Rc, registry: Rc>>, source_indices: Rc>>) -> bool { +pub fn is_workflow_item( + item: &Rc, + registry: Rc>>, + source_indices: Rc>>, +) -> bool { if (item.body.clone() == None) { false } else { @@ -5661,36 +14157,89 @@ pub fn is_workflow_item(item: &Rc, registry: Rc (((info.service_names.clone().len() as i64) > 0) || ((info.resource_names.clone().len() as i64) > 0)), - None => true, -} + Some(info) => { + (((info.service_names.clone().len() as i64) > 0) + || ((info.resource_names.clone().len() as i64) > 0)) + } + None => true, + } } } } -pub fn collect_workflow_funcs(modules: Rc>>, registry: Rc>>, read_only_params_index: Rc>>>) -> Rc>> { - Rc::new({ let mut __result = Vec::new(); for tm in modules.iter().cloned() { __result.extend((*Rc::new({ let mut __result = Vec::new(); for item in Rc::new({ let mut __result = Vec::new(); for item in tm.items.clone().iter().cloned() { if is_workflow_item(&item, registry.clone(), tm.type_env.clone().source_indices.clone()) { __result.push(item); } } __result }).iter().cloned() { __result.push(to_workflow_func(&item, &authored_name_at(tm.type_env.clone().source_indices.clone(), &tm.module.clone()), ®istry, tm.items.clone(), &tm.type_env.clone().source_indices.clone(), read_only_params_index.clone())); } __result })).iter().cloned()); } __result }) +pub fn collect_workflow_funcs( + modules: Rc>>, + registry: Rc>>, + read_only_params_index: Rc>>>, +) -> Rc>> { + Rc::new({ + let mut __result = Vec::new(); + for tm in modules.iter().cloned() { + __result.extend( + (*Rc::new({ + let mut __result = Vec::new(); + for item in Rc::new({ + let mut __result = Vec::new(); + for item in tm.items.clone().iter().cloned() { + if is_workflow_item( + &item, + registry.clone(), + tm.type_env.clone().source_indices.clone(), + ) { + __result.push(item); + } + } + __result + }) + .iter() + .cloned() + { + __result.push(to_workflow_func( + &item, + &authored_name_at( + tm.type_env.clone().source_indices.clone(), + &tm.module.clone(), + ), + ®istry, + tm.items.clone(), + &tm.type_env.clone().source_indices.clone(), + read_only_params_index.clone(), + )); + } + __result + })) + .iter() + .cloned(), + ); + } + __result + }) } pub fn cli_default_literal_value(expr: Rc) -> Option { match (*expr.expr_data.clone()).clone() { - ExprData::ExprLiteral { value: v, .. } => match (*v.clone()).clone() { - LiteralValue::LitStr { value: s, .. } => Some(s.clone()), - LiteralValue::LitInt { value: i, .. } => Some((i.clone()).to_string()), - LiteralValue::LitFloat { value: f, .. } => Some(f.clone()), - LiteralValue::LitBool { value: b, .. } => Some(if b.clone() { - emit_keyword("true".to_string(), RenderTarget::Rust) - } else { - emit_keyword("false".to_string(), RenderTarget::Rust) - }), - LiteralValue::LitNull => None, -}, - _ => None, -} + ExprData::ExprLiteral { value: v, .. } => match (*v.clone()).clone() { + LiteralValue::LitStr { value: s, .. } => Some(s.clone()), + LiteralValue::LitInt { value: i, .. } => Some((i.clone()).to_string()), + LiteralValue::LitFloat { value: f, .. } => Some(f.clone()), + LiteralValue::LitBool { value: b, .. } => Some(if b.clone() { + emit_keyword("true".to_string(), RenderTarget::Rust) + } else { + emit_keyword("false".to_string(), RenderTarget::Rust) + }), + LiteralValue::LitNull => None, + }, + _ => None, + } } -pub fn validate_workflow_param_defaults(workflow_funcs: Rc>>) -> Rc>> { - Rc::new({ let mut __result = Vec::new(); for wf in workflow_funcs.iter().cloned() { __result.extend((*Rc::new({ let mut __result = Vec::new(); for param in wf.params.clone().iter().cloned() { __result.extend((*match param_node_default_value(¶m) { +pub fn validate_workflow_param_defaults( + workflow_funcs: Rc>>, +) -> Rc>> { + Rc::new({ + let mut __result = Vec::new(); + for wf in workflow_funcs.iter().cloned() { + __result.extend((*Rc::new({ let mut __result = Vec::new(); for param in wf.params.clone().iter().cloned() { __result.extend((*match param_node_default_value(¶m) { Some(dv) => { let param_name = authored_name_at(wf.source_indices.clone(), ¶m); let resolved = match v2_rt::map_get(&wf.resolved_defaults.clone(), param_name.clone()) { @@ -5710,257 +14259,617 @@ if resolved.clone() { } }, None => Rc::new(vec![]), -}).iter().cloned()); } __result })).iter().cloned()); } __result }) +}).iter().cloned()); } __result })).iter().cloned()); + } + __result + }) } pub fn find_resource_module(resource_name: String, modules: Rc>>) -> String { { - let matching = Rc::new({ let mut __result = Vec::new(); for m in modules.iter().cloned() { if { let mut __found = false; for item in m.items.clone().iter().cloned() { if (authored_name_at(m.type_env.clone().source_indices.clone(), &item).as_str() == resource_name.clone().as_str()) { __found = true; break; } } __found } { __result.push(m); } } __result }); -let result = match matching.first().cloned() { - Some(tm) => module_to_filename(authored_name_at(tm.type_env.clone().source_indices.clone(), &tm.module.clone())), - None => "".to_string(), -}; -result -} + let matching = Rc::new({ + let mut __result = Vec::new(); + for m in modules.iter().cloned() { + if { + let mut __found = false; + for item in m.items.clone().iter().cloned() { + if (authored_name_at(m.type_env.clone().source_indices.clone(), &item) + .as_str() + == resource_name.clone().as_str()) + { + __found = true; + break; + } + } + __found + } { + __result.push(m); + } + } + __result + }); + let result = match matching.first().cloned() { + Some(tm) => module_to_filename(authored_name_at( + tm.type_env.clone().source_indices.clone(), + &tm.module.clone(), + )), + None => "".to_string(), + }; + result + } } -pub fn emit_main_rs(workflow_funcs: &Rc>>, modules: &Rc>>, has_services: &bool, crate_name: &String, svc_module_map: Rc>) -> Rc { +pub fn emit_main_rs( + workflow_funcs: &Rc>>, + modules: &Rc>>, + has_services: &bool, + crate_name: &String, + svc_module_map: Rc>, +) -> Rc { { - let has_pipeline = { let mut __found = false; for m in modules.clone().iter().cloned() { if (authored_name_at(m.type_env.clone().source_indices.clone(), &m.module.clone()).as_str() == "v2.compiler.compile".to_string().as_str()) { __found = true; break; } } __found }; -let resource_type_names = Rc::new({ let mut __result = Vec::new(); for wf in workflow_funcs.clone().iter().cloned() { __result.extend((*Rc::new({ let mut __result = Vec::new(); for u in wf.uses.clone().iter().cloned() { __result.push(authored_name_at(wf.source_indices.clone(), &resource_use_resource(&u))); } __result })).iter().cloned()); } __result }); -let unique_resource_types = unique_strings(resource_type_names); -let resource_imports = Rc::new({ let mut __result = Vec::new(); for rname in unique_resource_types.iter().cloned() { __result.extend((*{ - let mod_name = find_resource_module(rname.clone(), modules.clone()); -if (mod_name.clone().as_str() != "".to_string().as_str()) { - Rc::new(vec![v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("use ".to_string(), crate_name.clone()), "::".to_string()), mod_name.clone()), "::".to_string()), rname.clone()), ";".to_string())]) - } else { - Rc::new(vec![]) - } -}).iter().cloned()); } __result }); -let resource_imports_str = resource_imports.join(&"\n".to_string()); -let all_svc_names = Rc::new({ let mut __result = Vec::new(); for wf in workflow_funcs.clone().iter().cloned() { __result.extend((*wf.service_names.clone()).iter().cloned()); } __result }); -let unique_svc_names = unique_strings(all_svc_names); -let svc_imports = Rc::new({ let mut __result = Vec::new(); for sn in unique_svc_names.iter().cloned() { __result.extend((*{ - let struct_name = sanitize_service_name(sn.clone()); -match v2_rt::map_get(&svc_module_map, sn.clone()) { - Some(mod_name) => Rc::new(vec![v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("use ".to_string(), crate_name.clone()), "::".to_string()), mod_name.clone()), "::".to_string()), struct_name.clone()), ";".to_string())]), - None => Rc::new(vec![]), -} -}).iter().cloned()); } __result }); -let svc_imports_str = svc_imports.join(&"\n".to_string()); -let header = v2_rt::concat(v2_rt::concat("// Generated by v2 compiler -- do not edit.\n\n".to_string(), "#![allow(unused_parens, clippy::all, clippy::disallowed_macros)]\n\n".to_string()), v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("use clap::".to_string(), "{".to_string()), "Parser, Subcommand".to_string()), "}".to_string()), ";\n".to_string())); -let crate_use = if has_services.clone() { - v2_rt::concat(v2_rt::concat("use ".to_string(), crate_name.clone()), "::dry_run::DryRunMode;\n".to_string()) + let has_pipeline = { + let mut __found = false; + for m in modules.clone().iter().cloned() { + if (authored_name_at(m.type_env.clone().source_indices.clone(), &m.module.clone()) + .as_str() + == "v2.compiler.compile".to_string().as_str()) + { + __found = true; + break; + } + } + __found + }; + let resource_type_names = Rc::new({ + let mut __result = Vec::new(); + for wf in workflow_funcs.clone().iter().cloned() { + __result.extend( + (*Rc::new({ + let mut __result = Vec::new(); + for u in wf.uses.clone().iter().cloned() { + __result.push(authored_name_at( + wf.source_indices.clone(), + &resource_use_resource(&u), + )); + } + __result + })) + .iter() + .cloned(), + ); + } + __result + }); + let unique_resource_types = unique_strings(resource_type_names); + let resource_imports = Rc::new({ + let mut __result = Vec::new(); + for rname in unique_resource_types.iter().cloned() { + __result.extend( + (*{ + let mod_name = find_resource_module(rname.clone(), modules.clone()); + if (mod_name.clone().as_str() != "".to_string().as_str()) { + Rc::new(vec![v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "use ".to_string(), + crate_name.clone(), + ), + "::".to_string(), + ), + mod_name.clone(), + ), + "::".to_string(), + ), + rname.clone(), + ), + ";".to_string(), + )]) + } else { + Rc::new(vec![]) + } + }) + .iter() + .cloned(), + ); + } + __result + }); + let resource_imports_str = resource_imports.join(&"\n".to_string()); + let all_svc_names = Rc::new({ + let mut __result = Vec::new(); + for wf in workflow_funcs.clone().iter().cloned() { + __result.extend((*wf.service_names.clone()).iter().cloned()); + } + __result + }); + let unique_svc_names = unique_strings(all_svc_names); + let svc_imports = Rc::new({ + let mut __result = Vec::new(); + for sn in unique_svc_names.iter().cloned() { + __result.extend( + (*{ + let struct_name = sanitize_service_name(sn.clone()); + match v2_rt::map_get(&svc_module_map, sn.clone()) { + Some(mod_name) => Rc::new(vec![v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "use ".to_string(), + crate_name.clone(), + ), + "::".to_string(), + ), + mod_name.clone(), + ), + "::".to_string(), + ), + struct_name.clone(), + ), + ";".to_string(), + )]), + None => Rc::new(vec![]), + } + }) + .iter() + .cloned(), + ); + } + __result + }); + let svc_imports_str = svc_imports.join(&"\n".to_string()); + let header = v2_rt::concat( + v2_rt::concat( + "// Generated by v2 compiler -- do not edit.\n\n".to_string(), + "#![allow(unused_parens, clippy::all, clippy::disallowed_macros)]\n\n".to_string(), + ), + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("use clap::".to_string(), "{".to_string()), + "Parser, Subcommand".to_string(), + ), + "}".to_string(), + ), + ";\n".to_string(), + ), + ); + let crate_use = if has_services.clone() { + v2_rt::concat( + v2_rt::concat("use ".to_string(), crate_name.clone()), + "::dry_run::DryRunMode;\n".to_string(), + ) } else { "".to_string() }; -let resource_use = if (resource_imports_str.clone().as_str() != "".to_string().as_str()) { + let resource_use = if (resource_imports_str.clone().as_str() != "".to_string().as_str()) { v2_rt::concat(resource_imports_str.clone(), "\n".to_string()) } else { "".to_string() }; -let svc_use = if (svc_imports_str.clone().as_str() != "".to_string().as_str()) { + let svc_use = if (svc_imports_str.clone().as_str() != "".to_string().as_str()) { v2_rt::concat(svc_imports_str.clone(), "\n".to_string()) } else { "".to_string() }; -let mod_uses = emit_main_mod_uses(workflow_funcs.clone(), has_pipeline.clone(), &crate_name); -let cli_struct = emit_cli_struct(workflow_funcs.clone()); -let subcommand_enum = emit_subcommand_enum(workflow_funcs.clone(), &has_pipeline); -let pipeline_fns = if has_pipeline.clone() { + let mod_uses = + emit_main_mod_uses(workflow_funcs.clone(), has_pipeline.clone(), &crate_name); + let cli_struct = emit_cli_struct(workflow_funcs.clone()); + let subcommand_enum = emit_subcommand_enum(workflow_funcs.clone(), &has_pipeline); + let pipeline_fns = if has_pipeline.clone() { emit_main_pipeline_fns(crate_name.clone()) } else { "".to_string() }; -let main_fn = emit_main_fn(workflow_funcs.clone(), &has_services, &has_pipeline, &crate_name); -let diagnostic_fns = if has_pipeline.clone() { + let main_fn = emit_main_fn( + workflow_funcs.clone(), + &has_services, + &has_pipeline, + &crate_name, + ); + let diagnostic_fns = if has_pipeline.clone() { emit_main_diagnostic_fns(crate_name.clone()) } else { "".to_string() }; -let content = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(header, crate_use), resource_use), svc_use), mod_uses), "\n".to_string()), cli_struct), "\n\n".to_string()), subcommand_enum), "\n\n".to_string()), pipeline_fns), main_fn), "\n".to_string()), diagnostic_fns); -Rc::new(TextFile { - path: v2_rt::concat(v2_rt::concat(rust_source_root(), "main".to_string()), rust_source_ext()), - content: content, -}) -} + let content = v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(header, crate_use), + resource_use, + ), + svc_use, + ), + mod_uses, + ), + "\n".to_string(), + ), + cli_struct, + ), + "\n\n".to_string(), + ), + subcommand_enum, + ), + "\n\n".to_string(), + ), + pipeline_fns, + ), + main_fn, + ), + "\n".to_string(), + ), + diagnostic_fns, + ); + Rc::new(TextFile { + path: v2_rt::concat( + v2_rt::concat(rust_source_root(), "main".to_string()), + rust_source_ext(), + ), + content: content, + }) + } } -pub fn emit_main_mod_uses(workflow_funcs: Rc>>, has_pipeline: bool, crate_name: &String) -> String { +pub fn emit_main_mod_uses( + workflow_funcs: Rc>>, + has_pipeline: bool, + crate_name: &String, +) -> String { { - let mod_names = Rc::new({ let mut __result = Vec::new(); for wf in workflow_funcs.iter().cloned() { __result.push(module_to_filename(wf.module_name.clone())); } __result }); -let unique_mods = unique_strings(mod_names); -let use_lines = Rc::new({ let mut __result = Vec::new(); for m in unique_mods.iter().cloned() { __result.push(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("use ".to_string(), crate_name.clone()), "::".to_string()), m.clone()), ";".to_string())); } __result }); -let base = use_lines.join(&"\n".to_string()); -if has_pipeline { + let mod_names = Rc::new({ + let mut __result = Vec::new(); + for wf in workflow_funcs.iter().cloned() { + __result.push(module_to_filename(wf.module_name.clone())); + } + __result + }); + let unique_mods = unique_strings(mod_names); + let use_lines = Rc::new({ + let mut __result = Vec::new(); + for m in unique_mods.iter().cloned() { + __result.push(v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("use ".to_string(), crate_name.clone()), + "::".to_string(), + ), + m.clone(), + ), + ";".to_string(), + )); + } + __result + }); + let base = use_lines.join(&"\n".to_string()); + if has_pipeline { { let pipeline_mod = module_to_filename("v2.compiler.compile".to_string()); -let artifact_mod = module_to_filename("v2.compiler.artifact".to_string()); -let core_mod = module_to_filename("v2.std.core".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(base, "\nuse std::collections::HashMap;\n".to_string()), "use std::rc::Rc;\n".to_string()), "use ".to_string()), crate_name.clone()), "::".to_string()), pipeline_mod.clone()), ";\n".to_string()), "use ".to_string()), crate_name.clone()), "::".to_string()), pipeline_mod.clone()), "::PipelineResult;\n".to_string()), "use ".to_string()), crate_name.clone()), "::".to_string()), artifact_mod), ";\n".to_string()), "use ".to_string()), crate_name.clone()), "::".to_string()), core_mod), "::".to_string()), "{".to_string()), "\n diagnostic_to_message, diagnostic_to_span,\n".to_string()), " byte_to_line_col, source_line_at, NewlineIndex,\n".to_string()), " CompilerDiagnostic,\n".to_string()), "}".to_string()), ";\n".to_string()), "use ".to_string()), crate_name.clone()), "::cli_run;\n".to_string()) -} + let artifact_mod = module_to_filename("v2.compiler.artifact".to_string()); + let core_mod = module_to_filename("v2.std.core".to_string()); + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(base, "\nuse std::collections::HashMap;\n".to_string()), "use std::rc::Rc;\n".to_string()), "use ".to_string()), crate_name.clone()), "::".to_string()), pipeline_mod.clone()), ";\n".to_string()), "use ".to_string()), crate_name.clone()), "::".to_string()), pipeline_mod.clone()), "::PipelineResult;\n".to_string()), "use ".to_string()), crate_name.clone()), "::".to_string()), artifact_mod), ";\n".to_string()), "use ".to_string()), crate_name.clone()), "::".to_string()), core_mod), "::".to_string()), "{".to_string()), "\n diagnostic_to_message, diagnostic_to_span,\n".to_string()), " byte_to_line_col, source_line_at, NewlineIndex,\n".to_string()), " CompilerDiagnostic,\n".to_string()), "}".to_string()), ";\n".to_string()), "use ".to_string()), crate_name.clone()), "::cli_run;\n".to_string()) + } } else { base } -} + } } pub fn emit_cli_struct(workflow_funcs: Rc>>) -> String { v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("#[derive(Parser)]\n".to_string(), "#[command(name = \"v2-compiled\", about = \"Generated CLI from DAG compiler\")]\n".to_string()), "struct Cli {\n".to_string()), " #[command(subcommand)]\n".to_string()), " command: Commands,\n".to_string()), " /// Run in dry-run mode (mock all service calls)\n".to_string()), " #[arg(long, global = true)]\n".to_string()), " dry_run: bool,\n".to_string()), "}".to_string()) } -pub fn emit_subcommand_enum(workflow_funcs: Rc>>, has_pipeline: &bool) -> String { +pub fn emit_subcommand_enum( + workflow_funcs: Rc>>, + has_pipeline: &bool, +) -> String { { let depth = 0; -let variants = Rc::new({ let mut __result = Vec::new(); for wf in workflow_funcs.iter().cloned() { __result.push(emit_subcommand_variant(&wf, (depth.clone() + 1))); } __result }); -let compile_variant = if has_pipeline.clone() { + let variants = Rc::new({ + let mut __result = Vec::new(); + for wf in workflow_funcs.iter().cloned() { + __result.push(emit_subcommand_variant(&wf, (depth.clone() + 1))); + } + __result + }); + let compile_variant = if has_pipeline.clone() { v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("/// Compile .dag source files to a target language\n".to_string(), make_indent((depth.clone() + 1))), "Compile {\n".to_string()), make_indent((depth.clone() + 2))), "/// Source root directories (searched recursively for .dag files).\n".to_string()), make_indent((depth.clone() + 2))), "/// Module imports are resolved transitively from these roots.\n".to_string()), make_indent((depth.clone() + 2))), "#[arg(long = \"source-root\")]\n".to_string()), make_indent((depth.clone() + 2))), "source_roots: Vec,\n".to_string()), make_indent((depth.clone() + 2))), "/// Legacy: single source directory (all .dag files loaded, no import resolution)\n".to_string()), make_indent((depth.clone() + 2))), "#[arg(long = \"source-dir\")]\n".to_string()), make_indent((depth.clone() + 2))), "source_dir: Option,\n".to_string()), make_indent((depth.clone() + 2))), "#[arg(long)]\n".to_string()), make_indent((depth.clone() + 2))), "output_dir: String,\n".to_string()), make_indent((depth.clone() + 2))), "/// Target language: rust, python, go, dag\n".to_string()), make_indent((depth.clone() + 2))), "#[arg(long, default_value = \"rust\")]\n".to_string()), make_indent((depth.clone() + 2))), "target: String,\n".to_string()), make_indent((depth.clone() + 1))), "},".to_string()) } else { "".to_string() }; -let run_variant = if has_pipeline.clone() { + let run_variant = if has_pipeline.clone() { v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("/// Execute a .dag program directly (interpreter)\n".to_string(), make_indent((depth.clone() + 1))), "Run {\n".to_string()), make_indent((depth.clone() + 2))), "/// Source root directories (searched recursively for .dag files)\n".to_string()), make_indent((depth.clone() + 2))), "#[arg(long = \"source-root\")]\n".to_string()), make_indent((depth.clone() + 2))), "source_roots: Vec,\n".to_string()), make_indent((depth.clone() + 2))), "/// Entry function to execute (default: \"main\")\n".to_string()), make_indent((depth.clone() + 2))), "#[arg(long, default_value = \"main\")]\n".to_string()), make_indent((depth.clone() + 2))), "function: String,\n".to_string()), make_indent((depth.clone() + 1))), "},".to_string()) } else { "".to_string() }; -let all_variants = if has_pipeline.clone() { + let all_variants = if has_pipeline.clone() { v2_rt::concat(variants, Rc::new(vec![compile_variant, run_variant])) } else { variants }; -let variants_str = all_variants.join(&"\n".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("#[derive(Subcommand)]\n".to_string(), "enum Commands {\n".to_string()), make_indent((depth.clone() + 1))), variants_str), "\n".to_string()), "}".to_string()) -} + let variants_str = all_variants.join(&"\n".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "#[derive(Subcommand)]\n".to_string(), + "enum Commands {\n".to_string(), + ), + make_indent((depth.clone() + 1)), + ), + variants_str, + ), + "\n".to_string(), + ), + "}".to_string(), + ) + } } pub fn emit_subcommand_variant(wf: &Rc, depth: i64) -> String { { let variant_name = to_pascal(wf.name.clone()); -let doc_line = v2_rt::concat(v2_rt::concat("/// Run the ".to_string(), wf.name.clone()), " workflow".to_string()); -if ((wf.params.clone().len() as i64) == 0) { - v2_rt::concat(v2_rt::concat(v2_rt::concat(doc_line, "\n".to_string()), variant_name), ",".to_string()) + let doc_line = v2_rt::concat( + v2_rt::concat("/// Run the ".to_string(), wf.name.clone()), + " workflow".to_string(), + ); + if ((wf.params.clone().len() as i64) == 0) { + v2_rt::concat( + v2_rt::concat(v2_rt::concat(doc_line, "\n".to_string()), variant_name), + ",".to_string(), + ) } else { { - let fields = Rc::new({ let mut __result = Vec::new(); for p in wf.params.clone().iter().cloned() { __result.push(emit_subcommand_field(&p, &wf.source_indices.clone(), wf.resolved_defaults.clone())); } __result }); -let fields_str = fields.join(&"\n".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(doc_line, "\n".to_string()), variant_name), " {\n".to_string()), make_indent((depth + 1))), fields_str), "\n".to_string()), "},".to_string()) -} + let fields = Rc::new({ + let mut __result = Vec::new(); + for p in wf.params.clone().iter().cloned() { + __result.push(emit_subcommand_field( + &p, + &wf.source_indices.clone(), + wf.resolved_defaults.clone(), + )); + } + __result + }); + let fields_str = fields.join(&"\n".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(doc_line, "\n".to_string()), + variant_name, + ), + " {\n".to_string(), + ), + make_indent((depth + 1)), + ), + fields_str, + ), + "\n".to_string(), + ), + "},".to_string(), + ) + } } -} + } } -pub fn emit_subcommand_field(param: &Rc, source_indices: &Rc>>, resolved_defaults: Rc>) -> String { +pub fn emit_subcommand_field( + param: &Rc, + source_indices: &Rc>>, + resolved_defaults: Rc>, +) -> String { { - let field_name = emit_ident(param_node_name_at(param.clone(), source_indices.clone()), RenderTarget::Rust); -let param_name = param_node_name_at(param.clone(), source_indices.clone()); -let field_type = emit_cli_param_type_node(¶m_node_type_expr(¶m), source_indices.clone()); -let default_attr = match v2_rt::map_get(&resolved_defaults, param_name) { - Some(resolved) => v2_rt::concat(v2_rt::concat("#[arg(long, default_value = \"".to_string(), resolved.clone()), "\")]\n".to_string()), - None => match param_node_default_value(¶m) { - Some(dv) => match cli_default_literal_value(dv.clone()) { - Some(default_value) => v2_rt::concat(v2_rt::concat("#[arg(long, default_value = \"".to_string(), default_value.clone()), "\")]\n".to_string()), - None => "#[arg(long)]\n".to_string(), -}, - None => "#[arg(long)]\n".to_string(), -}, -}; -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(default_attr, field_name), ": ".to_string()), field_type), ",".to_string()) -} + let field_name = emit_ident( + param_node_name_at(param.clone(), source_indices.clone()), + RenderTarget::Rust, + ); + let param_name = param_node_name_at(param.clone(), source_indices.clone()); + let field_type = + emit_cli_param_type_node(¶m_node_type_expr(¶m), source_indices.clone()); + let default_attr = match v2_rt::map_get(&resolved_defaults, param_name) { + Some(resolved) => v2_rt::concat( + v2_rt::concat( + "#[arg(long, default_value = \"".to_string(), + resolved.clone(), + ), + "\")]\n".to_string(), + ), + None => match param_node_default_value(¶m) { + Some(dv) => match cli_default_literal_value(dv.clone()) { + Some(default_value) => v2_rt::concat( + v2_rt::concat( + "#[arg(long, default_value = \"".to_string(), + default_value.clone(), + ), + "\")]\n".to_string(), + ), + None => "#[arg(long)]\n".to_string(), + }, + None => "#[arg(long)]\n".to_string(), + }, + }; + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(v2_rt::concat(default_attr, field_name), ": ".to_string()), + field_type, + ), + ",".to_string(), + ) + } } -pub fn emit_cli_param_type_node(n: &Rc, source_indices: Rc>>) -> String { +pub fn emit_cli_param_type_node( + n: &Rc, + source_indices: Rc>>, +) -> String { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - { - let is_optional = (n.return_cardinality.clone() == Cardinality::CardOptional); -let has_structure = (n.connective.clone() != Connective::NoConnective); -if is_optional { - v2_rt::concat(v2_rt::concat("Option<".to_string(), emit_cli_param_type_node(&with_required_cardinality(&n), source_indices)), ">".to_string()) + let is_optional = (n.return_cardinality.clone() == Cardinality::CardOptional); + let has_structure = (n.connective.clone() != Connective::NoConnective); + if is_optional { + v2_rt::concat( + v2_rt::concat( + "Option<".to_string(), + emit_cli_param_type_node(&with_required_cardinality(&n), source_indices), + ), + ">".to_string(), + ) + } else { + if has_structure { + "String".to_string() } else { - if has_structure { - "String".to_string() - } else { - if ((n.children.clone().len() as i64) == 0) { - { - let nname = authored_name_at(source_indices, &n); -let mapped = coerce_primitive_type(RenderTarget::Rust, nname.clone()); -if (mapped.clone().as_str() != nname.clone().as_str()) { - mapped.clone() - } else { - "String".to_string() - } -} - } else { - "String".to_string() + if ((n.children.clone().len() as i64) == 0) { + { + let nname = authored_name_at(source_indices, &n); + let mapped = coerce_primitive_type(RenderTarget::Rust, nname.clone()); + if (mapped.clone().as_str() != nname.clone().as_str()) { + mapped.clone() + } else { + "String".to_string() + } } + } else { + "String".to_string() } } -} + } }) } -pub fn emit_main_fn(workflow_funcs: Rc>>, has_services: &bool, has_pipeline: &bool, crate_name: &String) -> String { +pub fn emit_main_fn( + workflow_funcs: Rc>>, + has_services: &bool, + has_pipeline: &bool, + crate_name: &String, +) -> String { { let depth = 0; -let async_attr = if has_services.clone() { + let async_attr = if has_services.clone() { "#[tokio::main]\nasync fn main() ".to_string() } else { "fn main() ".to_string() }; -let parse_line = "let cli = Cli::parse();".to_string(); -let dry_run_line = if has_services.clone() { + let parse_line = "let cli = Cli::parse();".to_string(); + let dry_run_line = if has_services.clone() { "let dry_run = DryRunMode(cli.dry_run);".to_string() } else { "".to_string() }; -let match_arms = Rc::new({ let mut __result = Vec::new(); for wf in workflow_funcs.iter().cloned() { __result.push(emit_main_match_arm(&wf, &has_services)); } __result }); -let compile_arm = if has_pipeline.clone() { + let match_arms = Rc::new({ + let mut __result = Vec::new(); + for wf in workflow_funcs.iter().cloned() { + __result.push(emit_main_match_arm(&wf, &has_services)); + } + __result + }); + let compile_arm = if has_pipeline.clone() { emit_compile_match_arm(crate_name.clone()) } else { "".to_string() }; -let run_arm = if has_pipeline.clone() { + let run_arm = if has_pipeline.clone() { emit_run_match_arm(crate_name.clone()) } else { "".to_string() }; -let all_arms = if has_pipeline.clone() { + let all_arms = if has_pipeline.clone() { v2_rt::concat(match_arms, Rc::new(vec![compile_arm, run_arm])) } else { match_arms }; -let arms_str = all_arms.join(&"\n".to_string()); -let match_block = v2_rt::concat(v2_rt::concat(v2_rt::concat("match cli.command {\n".to_string(), make_indent((depth.clone() + 2))), arms_str), "\n }".to_string()); -let result_handling = if has_services.clone() { + let arms_str = all_arms.join(&"\n".to_string()); + let match_block = v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "match cli.command {\n".to_string(), + make_indent((depth.clone() + 2)), + ), + arms_str, + ), + "\n }".to_string(), + ); + let result_handling = if has_services.clone() { match_block } else { - v2_rt::concat(v2_rt::concat("let _result = ".to_string(), match_block), ";".to_string()) + v2_rt::concat( + v2_rt::concat("let _result = ".to_string(), match_block), + ";".to_string(), + ) }; -let body_lines = if (dry_run_line.clone().as_str() == "".to_string().as_str()) { + let body_lines = if (dry_run_line.clone().as_str() == "".to_string().as_str()) { v2_rt::concat(v2_rt::concat(parse_line, "\n".to_string()), result_handling) } else { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(parse_line, "\n".to_string()), dry_run_line.clone()), "\n".to_string()), result_handling) + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(parse_line, "\n".to_string()), + dry_run_line.clone(), + ), + "\n".to_string(), + ), + result_handling, + ) }; -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(async_attr, "{\n".to_string()), make_indent((depth.clone() + 1))), body_lines), "\n}".to_string()) -} + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(async_attr, "{\n".to_string()), + make_indent((depth.clone() + 1)), + ), + body_lines, + ), + "\n}".to_string(), + ) + } } pub fn emit_compile_match_arm(crate_name: String) -> String { { let pipeline_mod = module_to_filename("v2.compiler.compile".to_string()); -let artifact_mod = module_to_filename("v2.compiler.artifact".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("Commands::Compile { source_roots, source_dir, output_dir, target } => {\n".to_string(), " let render_target = match target.as_str() {\n".to_string()), " \"rust\" => ".to_string()), artifact_mod.clone()), "::RenderTarget::Rust,\n".to_string()), " \"python\" => ".to_string()), artifact_mod.clone()), "::RenderTarget::Python,\n".to_string()), " \"go\" => ".to_string()), artifact_mod.clone()), "::RenderTarget::Go,\n".to_string()), " \"dag\" => ".to_string()), artifact_mod.clone()), "::RenderTarget::Dag,\n".to_string()), " other => {\n".to_string()), " eprintln!(\"unknown target: {}. supported: rust, python, go, dag\", other);\n".to_string()), " std::process::exit(1);\n".to_string()), " }\n".to_string()), " };\n".to_string()), "\n".to_string()), " let sources = if !source_roots.is_empty() {\n".to_string()), " // FF-9: Import-driven resolution from source roots\n".to_string()), " let index = build_module_index(&source_roots);\n".to_string()), " eprintln!(\"indexed {} modules from {} source roots\", index.len(), source_roots.len());\n".to_string()), "\n".to_string()), " // Entry modules: all .dag files in the FIRST source root.\n".to_string()), " // Additional roots are dependency pools resolved via imports.\n".to_string()), " // This is intentional: --source-root src/v2 --source-root dsl\n".to_string()), " // means 'compile src/v2, using dsl as a dependency pool.'\n".to_string()), " let first_root = std::path::Path::new(&source_roots[0]);\n".to_string()), " let mut entry_files = Vec::new();\n".to_string()), " if first_root.is_dir() {\n".to_string()), " let mut dag_paths = Vec::new();\n".to_string()), " collect_dag_files(first_root, &mut dag_paths);\n".to_string()), " for path in dag_paths {\n".to_string()), " let content = std::fs::read_to_string(&path)\n".to_string()), " .unwrap_or_else(|e| panic!(\"failed to read {:?}: {}\", path, e));\n".to_string()), " entry_files.push((path.to_string_lossy().to_string(), content));\n".to_string()), " }\n".to_string()), " }\n".to_string()), "\n".to_string()), " let mut seen: HashMap> = HashMap::new();\n".to_string()), " let mut entry_for_queue = Vec::new();\n".to_string()), " for (path, content) in &entry_files {\n".to_string()), " if let Some(mod_path) = extract_module_path(content) {\n".to_string()), " let source = Rc::new(".to_string()), pipeline_mod.clone()), "::SourceFile {\n".to_string()), " path: path.clone(),\n".to_string()), " content: content.clone(),\n".to_string()), " });\n".to_string()), " seen.insert(mod_path, source);\n".to_string()), " }\n".to_string()), " entry_for_queue.push((path.clone(), content.clone()));\n".to_string()), " }\n".to_string()), "\n".to_string()), " let mut resolved = resolve_transitively_with_seen(entry_for_queue, &index, seen);\n".to_string()), " for (path, content) in entry_files {\n".to_string()), " let already_there = resolved.iter().any(|s| s.path == path);\n".to_string()), " if !already_there {\n".to_string()), " resolved.push(Rc::new(".to_string()), pipeline_mod.clone()), "::SourceFile { path, content }));\n".to_string()), " }\n".to_string()), " }\n".to_string()), " eprintln!(\"resolved {} sources (transitive import closure)\", resolved.len());\n".to_string()), " resolved\n".to_string()), "\n".to_string()), " } else if let Some(dir) = source_dir {\n".to_string()), " // Legacy: flat directory scan (backward compatibility)\n".to_string()), " let mut dag_paths = Vec::new();\n".to_string()), " collect_dag_files(std::path::Path::new(&dir), &mut dag_paths);\n".to_string()), " let mut sources = Vec::new();\n".to_string()), " for path in &dag_paths {\n".to_string()), " let content = std::fs::read_to_string(path)\n".to_string()), " .unwrap_or_else(|e| panic!(\"failed to read {:?}: {}\", path, e));\n".to_string()), " let filename = path.file_name().unwrap().to_string_lossy().to_string();\n".to_string()), " sources.push(Rc::new(".to_string()), pipeline_mod.clone()), "::SourceFile {\n".to_string()), " path: filename,\n".to_string()), " content,\n".to_string()), " }));\n".to_string()), " }\n".to_string()), " eprintln!(\"compiling {} .dag files from {} (target: {})\", sources.len(), dir, target);\n".to_string()), " sources\n".to_string()), "\n".to_string()), " } else {\n".to_string()), " eprintln!(\"error: provide --source-root or --source-dir\");\n".to_string()), " std::process::exit(1);\n".to_string()), " };\n".to_string()), "\n".to_string()), " let result = ".to_string()), pipeline_mod.clone()), "::compile_sources(Rc::new(sources), render_target);\n".to_string()), "\n".to_string()), " std::fs::create_dir_all(format!(\"{}/src\", output_dir))\n".to_string()), " .unwrap_or_else(|e| panic!(\"failed to create output dir: {}\", e));\n".to_string()), " for file in result.files.iter() {\n".to_string()), " let out_path = format!(\"{}/{}\", output_dir, file.path);\n".to_string()), " if let Some(parent) = std::path::Path::new(&out_path).parent() {\n".to_string()), " std::fs::create_dir_all(parent).ok();\n".to_string()), " }\n".to_string()), " std::fs::write(&out_path, &*file.content)\n".to_string()), " .unwrap_or_else(|e| panic!(\"failed to write {}: {}\", file.path, e));\n".to_string()), " }\n".to_string()), " eprintln!(\"compiled: {} files emitted, {} diagnostics\",\n".to_string()), " result.files.len(), result.diagnostics.len());\n".to_string()), " render_diagnostics(&result);\n".to_string()), " // Complexity violations are non-blocking (analyzer limitations).\n".to_string()), " let hard_errors = result.diagnostics.iter().any(|d| {\n".to_string()), " !matches!(*d.diagnostic.clone(), CompilerDiagnostic::ComplexityUnknown { .. })\n".to_string()), " });\n".to_string()), " if hard_errors {\n".to_string()), " std::process::exit(1);\n".to_string()), " }\n".to_string()), " if result.files.is_empty() {\n".to_string()), " eprintln!(\"error: no files emitted\");\n".to_string()), " std::process::exit(1);\n".to_string()), " }\n".to_string()), " },".to_string()) -} + let artifact_mod = module_to_filename("v2.compiler.artifact".to_string()); + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("Commands::Compile { source_roots, source_dir, output_dir, target } => {\n".to_string(), " let render_target = match target.as_str() {\n".to_string()), " \"rust\" => ".to_string()), artifact_mod.clone()), "::RenderTarget::Rust,\n".to_string()), " \"python\" => ".to_string()), artifact_mod.clone()), "::RenderTarget::Python,\n".to_string()), " \"go\" => ".to_string()), artifact_mod.clone()), "::RenderTarget::Go,\n".to_string()), " \"dag\" => ".to_string()), artifact_mod.clone()), "::RenderTarget::Dag,\n".to_string()), " other => {\n".to_string()), " eprintln!(\"unknown target: {}. supported: rust, python, go, dag\", other);\n".to_string()), " std::process::exit(1);\n".to_string()), " }\n".to_string()), " };\n".to_string()), "\n".to_string()), " let sources = if !source_roots.is_empty() {\n".to_string()), " // FF-9: Import-driven resolution from source roots\n".to_string()), " let index = build_module_index(&source_roots);\n".to_string()), " eprintln!(\"indexed {} modules from {} source roots\", index.len(), source_roots.len());\n".to_string()), "\n".to_string()), " // Entry modules: all .dag files in the FIRST source root.\n".to_string()), " // Additional roots are dependency pools resolved via imports.\n".to_string()), " // This is intentional: --source-root src/v2 --source-root dsl\n".to_string()), " // means 'compile src/v2, using dsl as a dependency pool.'\n".to_string()), " let first_root = std::path::Path::new(&source_roots[0]);\n".to_string()), " let mut entry_files = Vec::new();\n".to_string()), " if first_root.is_dir() {\n".to_string()), " let mut dag_paths = Vec::new();\n".to_string()), " collect_dag_files(first_root, &mut dag_paths);\n".to_string()), " for path in dag_paths {\n".to_string()), " let content = std::fs::read_to_string(&path)\n".to_string()), " .unwrap_or_else(|e| panic!(\"failed to read {:?}: {}\", path, e));\n".to_string()), " entry_files.push((path.to_string_lossy().to_string(), content));\n".to_string()), " }\n".to_string()), " }\n".to_string()), "\n".to_string()), " let mut seen: HashMap> = HashMap::new();\n".to_string()), " let mut entry_for_queue = Vec::new();\n".to_string()), " for (path, content) in &entry_files {\n".to_string()), " if let Some(mod_path) = extract_module_path(content) {\n".to_string()), " let source = Rc::new(".to_string()), pipeline_mod.clone()), "::SourceFile {\n".to_string()), " path: path.clone(),\n".to_string()), " content: content.clone(),\n".to_string()), " });\n".to_string()), " seen.insert(mod_path, source);\n".to_string()), " }\n".to_string()), " entry_for_queue.push((path.clone(), content.clone()));\n".to_string()), " }\n".to_string()), "\n".to_string()), " let mut resolved = resolve_transitively_with_seen(entry_for_queue, &index, seen);\n".to_string()), " for (path, content) in entry_files {\n".to_string()), " let already_there = resolved.iter().any(|s| s.path == path);\n".to_string()), " if !already_there {\n".to_string()), " resolved.push(Rc::new(".to_string()), pipeline_mod.clone()), "::SourceFile { path, content }));\n".to_string()), " }\n".to_string()), " }\n".to_string()), " eprintln!(\"resolved {} sources (transitive import closure)\", resolved.len());\n".to_string()), " resolved\n".to_string()), "\n".to_string()), " } else if let Some(dir) = source_dir {\n".to_string()), " // Legacy: flat directory scan (backward compatibility)\n".to_string()), " let mut dag_paths = Vec::new();\n".to_string()), " collect_dag_files(std::path::Path::new(&dir), &mut dag_paths);\n".to_string()), " let mut sources = Vec::new();\n".to_string()), " for path in &dag_paths {\n".to_string()), " let content = std::fs::read_to_string(path)\n".to_string()), " .unwrap_or_else(|e| panic!(\"failed to read {:?}: {}\", path, e));\n".to_string()), " let filename = path.file_name().unwrap().to_string_lossy().to_string();\n".to_string()), " sources.push(Rc::new(".to_string()), pipeline_mod.clone()), "::SourceFile {\n".to_string()), " path: filename,\n".to_string()), " content,\n".to_string()), " }));\n".to_string()), " }\n".to_string()), " eprintln!(\"compiling {} .dag files from {} (target: {})\", sources.len(), dir, target);\n".to_string()), " sources\n".to_string()), "\n".to_string()), " } else {\n".to_string()), " eprintln!(\"error: provide --source-root or --source-dir\");\n".to_string()), " std::process::exit(1);\n".to_string()), " };\n".to_string()), "\n".to_string()), " let result = ".to_string()), pipeline_mod.clone()), "::compile_sources(Rc::new(sources), render_target);\n".to_string()), "\n".to_string()), " std::fs::create_dir_all(format!(\"{}/src\", output_dir))\n".to_string()), " .unwrap_or_else(|e| panic!(\"failed to create output dir: {}\", e));\n".to_string()), " for file in result.files.iter() {\n".to_string()), " let out_path = format!(\"{}/{}\", output_dir, file.path);\n".to_string()), " if let Some(parent) = std::path::Path::new(&out_path).parent() {\n".to_string()), " std::fs::create_dir_all(parent).ok();\n".to_string()), " }\n".to_string()), " std::fs::write(&out_path, &*file.content)\n".to_string()), " .unwrap_or_else(|e| panic!(\"failed to write {}: {}\", file.path, e));\n".to_string()), " }\n".to_string()), " eprintln!(\"compiled: {} files emitted, {} diagnostics\",\n".to_string()), " result.files.len(), result.diagnostics.len());\n".to_string()), " render_diagnostics(&result);\n".to_string()), " // Complexity violations are non-blocking (analyzer limitations).\n".to_string()), " let hard_errors = result.diagnostics.iter().any(|d| {\n".to_string()), " !matches!(*d.diagnostic.clone(), CompilerDiagnostic::ComplexityUnknown { .. })\n".to_string()), " });\n".to_string()), " if hard_errors {\n".to_string()), " std::process::exit(1);\n".to_string()), " }\n".to_string()), " if result.files.is_empty() {\n".to_string()), " eprintln!(\"error: no files emitted\");\n".to_string()), " std::process::exit(1);\n".to_string()), " }\n".to_string()), " },".to_string()) + } } pub fn emit_run_match_arm(crate_name: String) -> String { - v2_rt::concat(v2_rt::concat("\n Commands::Run { source_roots, function } => {\n".to_string(), " cli_run::handle_run(source_roots, function);\n".to_string()), " },".to_string()) + v2_rt::concat( + v2_rt::concat( + "\n Commands::Run { source_roots, function } => {\n".to_string(), + " cli_run::handle_run(source_roots, function);\n".to_string(), + ), + " },".to_string(), + ) } pub fn emit_main_pipeline_fns(crate_name: String) -> String { { let pipeline_mod = module_to_filename("v2.compiler.compile".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(emit_collect_dag_files_fn(), emit_extract_module_path_fn()), emit_extract_import_paths_fn()), emit_build_module_index_fn()), emit_resolve_transitively_fn(&crate_name, &pipeline_mod)) -} + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(emit_collect_dag_files_fn(), emit_extract_module_path_fn()), + emit_extract_import_paths_fn(), + ), + emit_build_module_index_fn(), + ), + emit_resolve_transitively_fn(&crate_name, &pipeline_mod), + ) + } } pub fn emit_collect_dag_files_fn() -> String { @@ -5986,96 +14895,183 @@ pub fn emit_resolve_transitively_fn(crate_name: &String, pipeline_mod: &String) pub fn emit_main_diagnostic_fns(crate_name: String) -> String { { let core_mod = module_to_filename("v2.std.core".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("\nfn render_diagnostics(result: &PipelineResult) {\n".to_string(), " if result.diagnostics.is_empty() {\n".to_string()), " return;\n".to_string()), " }\n".to_string()), "\n".to_string()), " let index_map: HashMap> = result\n".to_string()), " .newline_indices\n".to_string()), " .iter()\n".to_string()), " .map(|idx| (idx.file.clone(), idx.clone()))\n".to_string()), " .collect();\n".to_string()), "\n".to_string()), " for d in result.diagnostics.iter() {\n".to_string()), " render_one_diagnostic(d, &index_map, \"\");\n".to_string()), " }\n".to_string()), "\n".to_string()), " eprintln!(\"\\n{} error(s)\", result.diagnostics.len());\n".to_string()), "}\n".to_string()), "\n".to_string()), "fn render_one_diagnostic(\n".to_string()), " d: &".to_string()), crate_name), "::".to_string()), core_mod), "::ErrorNode,\n".to_string()), " index_map: &HashMap>,\n".to_string()), " indent: &str,\n".to_string()), ") {\n".to_string()), " let severity = \"error\";\n".to_string()), " let message = diagnostic_to_message(d.diagnostic.clone());\n".to_string()), " let span = diagnostic_to_span(d.diagnostic.clone());\n".to_string()), "\n".to_string()), " let location = if !span.file.is_empty() {\n".to_string()), " if let Some(idx) = index_map.get(&span.file) {\n".to_string()), " let lc = byte_to_line_col(idx, span.start);\n".to_string()), " format!(\"{}:{}:{}\", span.file, lc.line, lc.col)\n".to_string()), " } else {\n".to_string()), " span.file.clone()\n".to_string()), " }\n".to_string()), " } else if !d.module_name.is_empty() {\n".to_string()), " d.module_name.clone()\n".to_string()), " } else {\n".to_string()), " String::new()\n".to_string()), " };\n".to_string()), "\n".to_string()), " if location.is_empty() {\n".to_string()), " eprintln!(\"{}{}: {}\", indent, severity, message);\n".to_string()), " } else {\n".to_string()), " eprintln!(\"{}{}[{}]: {}\", indent, severity, location, message);\n".to_string()), " }\n".to_string()), "\n".to_string()), " if !span.file.is_empty() {\n".to_string()), " if let Some(idx) = index_map.get(&span.file) {\n".to_string()), " let lc = byte_to_line_col(idx, span.start);\n".to_string()), " let line_text = source_line_at(idx, lc.line);\n".to_string()), " let line_num = format!(\"{}\", lc.line);\n".to_string()), " let gutter_width = line_num.len();\n".to_string()), " eprintln!(\"{} {} |\", indent, \" \".repeat(gutter_width));\n".to_string()), " eprintln!(\"{} {} | {}\", indent, line_num, line_text);\n".to_string()), "\n".to_string()), " let span_len = std::cmp::max(1, (span.end - span.start) as usize);\n".to_string()), " let col_offset = (lc.col - 1) as usize;\n".to_string()), " eprintln!(\n".to_string()), " \"{} {} | {}{}\",\n".to_string()), " indent,\n".to_string()), " \" \".repeat(gutter_width),\n".to_string()), " \" \".repeat(col_offset),\n".to_string()), " \"^\".repeat(std::cmp::min(span_len, line_text.len().saturating_sub(col_offset)))\n".to_string()), " );\n".to_string()), " }\n".to_string()), " }\n".to_string()), "}\n".to_string()) -} + v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("\nfn render_diagnostics(result: &PipelineResult) {\n".to_string(), " if result.diagnostics.is_empty() {\n".to_string()), " return;\n".to_string()), " }\n".to_string()), "\n".to_string()), " let index_map: HashMap> = result\n".to_string()), " .newline_indices\n".to_string()), " .iter()\n".to_string()), " .map(|idx| (idx.file.clone(), idx.clone()))\n".to_string()), " .collect();\n".to_string()), "\n".to_string()), " for d in result.diagnostics.iter() {\n".to_string()), " render_one_diagnostic(d, &index_map, \"\");\n".to_string()), " }\n".to_string()), "\n".to_string()), " eprintln!(\"\\n{} error(s)\", result.diagnostics.len());\n".to_string()), "}\n".to_string()), "\n".to_string()), "fn render_one_diagnostic(\n".to_string()), " d: &".to_string()), crate_name), "::".to_string()), core_mod), "::ErrorNode,\n".to_string()), " index_map: &HashMap>,\n".to_string()), " indent: &str,\n".to_string()), ") {\n".to_string()), " let severity = \"error\";\n".to_string()), " let message = diagnostic_to_message(d.diagnostic.clone());\n".to_string()), " let span = diagnostic_to_span(d.diagnostic.clone());\n".to_string()), "\n".to_string()), " let location = if !span.file.is_empty() {\n".to_string()), " if let Some(idx) = index_map.get(&span.file) {\n".to_string()), " let lc = byte_to_line_col(idx, span.start);\n".to_string()), " format!(\"{}:{}:{}\", span.file, lc.line, lc.col)\n".to_string()), " } else {\n".to_string()), " span.file.clone()\n".to_string()), " }\n".to_string()), " } else if !d.module_name.is_empty() {\n".to_string()), " d.module_name.clone()\n".to_string()), " } else {\n".to_string()), " String::new()\n".to_string()), " };\n".to_string()), "\n".to_string()), " if location.is_empty() {\n".to_string()), " eprintln!(\"{}{}: {}\", indent, severity, message);\n".to_string()), " } else {\n".to_string()), " eprintln!(\"{}{}[{}]: {}\", indent, severity, location, message);\n".to_string()), " }\n".to_string()), "\n".to_string()), " if !span.file.is_empty() {\n".to_string()), " if let Some(idx) = index_map.get(&span.file) {\n".to_string()), " let lc = byte_to_line_col(idx, span.start);\n".to_string()), " let line_text = source_line_at(idx, lc.line);\n".to_string()), " let line_num = format!(\"{}\", lc.line);\n".to_string()), " let gutter_width = line_num.len();\n".to_string()), " eprintln!(\"{} {} |\", indent, \" \".repeat(gutter_width));\n".to_string()), " eprintln!(\"{} {} | {}\", indent, line_num, line_text);\n".to_string()), "\n".to_string()), " let span_len = std::cmp::max(1, (span.end - span.start) as usize);\n".to_string()), " let col_offset = (lc.col - 1) as usize;\n".to_string()), " eprintln!(\n".to_string()), " \"{} {} | {}{}\",\n".to_string()), " indent,\n".to_string()), " \" \".repeat(gutter_width),\n".to_string()), " \" \".repeat(col_offset),\n".to_string()), " \"^\".repeat(std::cmp::min(span_len, line_text.len().saturating_sub(col_offset)))\n".to_string()), " );\n".to_string()), " }\n".to_string()), " }\n".to_string()), "}\n".to_string()) + } } pub fn emit_main_match_arm(wf: &Rc, has_services: &bool) -> String { { let variant_name = to_pascal(wf.name.clone()); -let mod_name = module_to_filename(wf.module_name.clone()); -let fn_name = emit_ident(wf.name.clone(), RenderTarget::Rust); -let await_suffix = if has_services.clone() { + let mod_name = module_to_filename(wf.module_name.clone()); + let fn_name = emit_ident(wf.name.clone(), RenderTarget::Rust); + let await_suffix = if has_services.clone() { ".await".to_string() } else { "".to_string() }; -let call_expr = if ((wf.params.clone().len() as i64) == 0) { + let call_expr = if ((wf.params.clone().len() as i64) == 0) { { let service_args = emit_main_service_args(wf.clone(), has_services.clone()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(mod_name, "::".to_string()), fn_name), "(".to_string()), service_args), ")".to_string()), await_suffix) -} + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(v2_rt::concat(mod_name, "::".to_string()), fn_name), + "(".to_string(), + ), + service_args, + ), + ")".to_string(), + ), + await_suffix, + ) + } } else { { let call_args = emit_main_call_args(&wf, has_services.clone()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(mod_name, "::".to_string()), fn_name), "(".to_string()), call_args), ")".to_string()), await_suffix) -} + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(v2_rt::concat(mod_name, "::".to_string()), fn_name), + "(".to_string(), + ), + call_args, + ), + ")".to_string(), + ), + await_suffix, + ) + } }; -let pattern = if ((wf.params.clone().len() as i64) == 0) { + let pattern = if ((wf.params.clone().len() as i64) == 0) { v2_rt::concat("Commands::".to_string(), variant_name) } else { { - let field_binds = Rc::new({ let mut __result = Vec::new(); for p in wf.params.clone().iter().cloned() { __result.push(emit_ident(param_node_name_at(p.clone(), wf.source_indices.clone()), RenderTarget::Rust)); } __result }); -let binds_str = field_binds.join(&", ".to_string()); -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("Commands::".to_string(), variant_name), " { ".to_string()), binds_str), " }".to_string()) -} + let field_binds = Rc::new({ + let mut __result = Vec::new(); + for p in wf.params.clone().iter().cloned() { + __result.push(emit_ident( + param_node_name_at(p.clone(), wf.source_indices.clone()), + RenderTarget::Rust, + )); + } + __result + }); + let binds_str = field_binds.join(&", ".to_string()); + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("Commands::".to_string(), variant_name), + " { ".to_string(), + ), + binds_str, + ), + " }".to_string(), + ) + } }; -if has_services.clone() { + if has_services.clone() { v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(pattern, " => {\n".to_string()), " match ".to_string()), call_expr), " {\n".to_string()), " Ok(value) => {\n".to_string()), " let json = serde_json::to_string_pretty(&value).unwrap_or_else(|_| format!(\"{:?}\", value));\n".to_string()), " println!(\"{}\", json);\n".to_string()), " }\n".to_string()), " Err(e) => {\n".to_string()), " eprintln!(\"Error: {}\", e);\n".to_string()), " std::process::exit(1);\n".to_string()), " }\n".to_string()), " }\n".to_string()), " }".to_string()) } else { - v2_rt::concat(v2_rt::concat(v2_rt::concat(pattern, " => ".to_string()), call_expr), ",".to_string()) + v2_rt::concat( + v2_rt::concat(v2_rt::concat(pattern, " => ".to_string()), call_expr), + ",".to_string(), + ) } -} + } } pub fn emit_main_call_args(wf: &Rc, has_services: bool) -> String { { - let param_args = Rc::new({ let mut __result = Vec::new(); for p in wf.params.clone().iter().cloned() { __result.push({ - let pname = param_node_name_at(p.clone(), wf.source_indices.clone()); -let ident = emit_ident(pname.clone(), RenderTarget::Rust); -let n = param_node_type_expr(&p); -let is_borrowable = ((v2_rt::map_contains_key(&wf.read_only_params.clone(), pname.clone()) && ((n.params.clone().len() as i64) == 0)) && needs_reference_node(&n, wf.source_indices.clone())); -if is_borrowable.clone() { - v2_rt::concat("&".to_string(), ident.clone()) - } else { - ident.clone() + let param_args = Rc::new({ + let mut __result = Vec::new(); + for p in wf.params.clone().iter().cloned() { + __result.push({ + let pname = param_node_name_at(p.clone(), wf.source_indices.clone()); + let ident = emit_ident(pname.clone(), RenderTarget::Rust); + let n = param_node_type_expr(&p); + let is_borrowable = + ((v2_rt::map_contains_key(&wf.read_only_params.clone(), pname.clone()) + && ((n.params.clone().len() as i64) == 0)) + && needs_reference_node(&n, wf.source_indices.clone())); + if is_borrowable.clone() { + v2_rt::concat("&".to_string(), ident.clone()) + } else { + ident.clone() + } + }); } -}); } __result }); -let service_args = emit_main_service_arg_list(&wf, has_services); -let all_args = v2_rt::concat(param_args, service_args); -all_args.join(&", ".to_string()) -} + __result + }); + let service_args = emit_main_service_arg_list(&wf, has_services); + let all_args = v2_rt::concat(param_args, service_args); + all_args.join(&", ".to_string()) + } } pub fn emit_main_service_args(wf: Rc, has_services: bool) -> String { { let service_args = emit_main_service_arg_list(&wf, has_services); -service_args.join(&", ".to_string()) -} + service_args.join(&", ".to_string()) + } } pub fn emit_main_service_arg_list(wf: &Rc, has_services: bool) -> Rc> { { let sharing = language_spec(RenderTarget::Rust).sharing.clone(); -let resource_args = Rc::new({ let mut __result = Vec::new(); for u in wf.uses.clone().iter().cloned() { __result.push(v2_rt::concat("&".to_string(), authored_name_at(wf.source_indices.clone(), &resource_use_resource(&u)))); } __result }); -let svc_args = Rc::new({ let mut __result = Vec::new(); for sn in wf.service_names.clone().iter().cloned() { __result.push({ - let struct_name = sanitize_service_name(sn.clone()); -if has_services.clone() { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("&".to_string(), struct_name.clone()), "::new(".to_string()), apply_type_template1(sharing.clone_value.clone(), "dry_run".to_string())), ")".to_string()) - } else { - v2_rt::concat(v2_rt::concat("&".to_string(), struct_name.clone()), "::new()".to_string()) + let resource_args = Rc::new({ + let mut __result = Vec::new(); + for u in wf.uses.clone().iter().cloned() { + __result.push(v2_rt::concat( + "&".to_string(), + authored_name_at(wf.source_indices.clone(), &resource_use_resource(&u)), + )); } -}); } __result }); -v2_rt::concat(resource_args, svc_args) -} + __result + }); + let svc_args = Rc::new({ + let mut __result = Vec::new(); + for sn in wf.service_names.clone().iter().cloned() { + __result.push({ + let struct_name = sanitize_service_name(sn.clone()); + if has_services.clone() { + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("&".to_string(), struct_name.clone()), + "::new(".to_string(), + ), + apply_type_template1( + sharing.clone_value.clone(), + "dry_run".to_string(), + ), + ), + ")".to_string(), + ) + } else { + v2_rt::concat( + v2_rt::concat("&".to_string(), struct_name.clone()), + "::new()".to_string(), + ) + } + }); + } + __result + }); + v2_rt::concat(resource_args, svc_args) + } } pub fn emit_dry_run_module() -> Rc { { let content = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("// Generated by v2 compiler -- do not edit.\n".to_string(), "//\n".to_string()), "// Dry-run support: when DryRunMode(true), service methods return\n".to_string()), "// mock data instead of performing real I/O.\n\n".to_string()), "#[derive(Debug, Clone)]\n".to_string()), "pub struct DryRunMode(pub bool);\n\n".to_string()), "impl DryRunMode {\n".to_string()), " pub fn is_dry_run(&self) -> bool {\n".to_string()), " self.0\n".to_string()), " }\n".to_string()), "}\n\n".to_string()), "impl Default for DryRunMode {\n".to_string()), " fn default() -> Self {\n".to_string()), " DryRunMode(false)\n".to_string()), " }\n".to_string()), "}\n".to_string()); -Rc::new(TextFile { - path: v2_rt::concat(v2_rt::concat(rust_source_root(), "dry_run".to_string()), rust_source_ext()), - content: content, -}) -} + Rc::new(TextFile { + path: v2_rt::concat( + v2_rt::concat(rust_source_root(), "dry_run".to_string()), + rust_source_ext(), + ), + content: content, + }) + } } diff --git a/src/v2/stage0/src/v2_compiler_infer.rs b/src/v2/stage0/src/v2_compiler_infer.rs index da2b7a9a5bc..cd823a0e656 100644 --- a/src/v2/stage0/src/v2_compiler_infer.rs +++ b/src/v2/stage0/src/v2_compiler_infer.rs @@ -1,56 +1,143 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.infer -use std::collections::HashMap; -use std::rc::Rc; -use crate::v2_rt; -use crate::NonEmptyVec; -use crate::NonEmptyBTreeSet; -pub use crate::std_types::{SourceSpan, container_param_name}; +use self::SizeExpr::*; +pub use crate::std_algebra::CollectionSizeEffect; +use crate::std_algebra::CollectionSizeEffect::ShrinkEffect; pub use crate::std_coercion::{dag_can_cast, is_dag_cast_domain_type}; -pub use crate::v2_std_core::{Node, InternTable, intern, intern_str, authored_name_at, NewlineIndex, has_child_named, build_newline_index, module_node, module_imports, module_items, import_is_all, make_param_node, param_node_name_at, param_node_type_expr, field_node_type_expr, Connective, ExprData, make_expr_node, make_named_expr_node, make_expr_error_node, expr_var_name_at, field_access_base, field_access_field_at, expr_call_func_at, expr_method_name_at, let_binding_name_at, foreach_variable_at, lambda_param_names_at, record_lit_type_name_at, make_arg_node, make_arm_node, arm_pattern, arm_guard, arm_body, make_field_init_node, field_init_node_name_at, field_init_node_value, make_text_part_node, make_interp_part_node, map_children, arg_value, arg_name_at, has_inferred, is_compiler_error, InferredNode, Cardinality, ErrorNode, make_error_node, is_error_diagnostic, resource_use_name_at, resource_use_resource, kernel_type_set, is_kernel_type, is_child_accessor_in_model, is_tree_size_reducing, is_property_contraction, expr_has_self_call, expr_has_non_tail_self_call, DeclaredFuncSig, DeclaredFuncEnv, LiteralValue, FieldAccessStyle, FieldValueShape, FieldSummary, VarBindingKind, CallSemantics, MethodSemantics, ExprErrorKind, BinOp, UnaryOpKind, unaryop_operand, MatchPattern, StringPart, make_field_binding_node, field_binding_name_at, field_binding_pattern, let_value, let_body, lambda_body, foreach_collection, foreach_body, method_receiver, method_arg_nodes, match_scrutinee, match_arm_nodes, if_condition, if_then_branch, if_else_branch, index_base, index_expr, slice_base, slice_start, slice_end, cast_target, cast_expr, return_value, binop_left, binop_right, make_transport_node, local_transport_node, with_optional_cardinality, with_required_cardinality, no_span, make_span, unit_type, bool_type, string_type, int_type, float_type, none_type, error_type, is_container_type, container_expected_arity, default_ident_span, node_name_span, CompilerDiagnostic}; -use crate::v2_std_core::Connective::{Conj, Disj, NoConnective, Arrow}; -use crate::v2_std_core::ExprData::{NoExprData, ExprLiteral, ExprError, ExprVar, ExprFieldAccess, ExprCall, ExprMethodCall, ExprMatch, ExprIf, ExprLet, ExprRecordLit, ExprListLit, ExprBinOp, ExprUnaryOp, ExprLambda, ExprStringInterp, ExprBlock, ExprCast, ExprForEach, ExprIndex, ExprSlice, ExprReturn}; -use crate::v2_std_core::InferredNode::{Resolved, CompilerError, TypeVariable}; -use crate::v2_std_core::Cardinality::{Required, CardOptional}; -use crate::v2_std_core::CompilerDiagnostic::{InternalError, VariantCollision}; -use crate::v2_std_core::LiteralValue::{LitStr, LitInt, LitFloat, LitBool, LitNull}; -use crate::v2_std_core::FieldAccessStyle::{StoredField, EnumAccessor, OptionalUnwrap, TupleFirst, TupleSecond}; -use crate::v2_std_core::FieldValueShape::{PlainValue, OptionalValue}; -use crate::v2_std_core::VarBindingKind::{LocalValueBinding, FunctionValueBinding, VariantValueBinding, MatchBoundBinding}; -use crate::v2_std_core::CallSemantics::{PlainCallSemantics, LookupCallSemantics}; -use crate::v2_std_core::MethodSemantics::{PlainMethodSemantics, AlgebraMethodSemantics, ServiceMethodSemantics}; -use crate::v2_std_core::ExprErrorKind::{ParseRecoveryError, SemanticExprError, InternalExprError}; -use crate::v2_std_core::BinOp::{Add, Sub, Mul, Div, Mod, Eq, Ne, Lt, Gt, Le, Ge, And, Or, NullCoalesce}; -use crate::v2_std_core::UnaryOpKind::{Not, Neg}; -use crate::v2_std_core::MatchPattern::{Bind, VariantPattern, Wildcard}; -use crate::v2_std_core::StringPart::{Text, Interpolation}; -pub use crate::v2_compiler_resolve::{ModuleGraph, ResolvedModule, ResolvedImport}; -pub use crate::v2_compiler_infer_types::{nominal_type_ref, make_container_type, make_callable_type, KernelTypeBuild, node_is_keyed_collection, node_is_element_collection, node_is_collection, is_fully_resolved, resolve_type_variables_from_template, template_return_has_variables, template_return_is_receiver_self, bare_map_node, callable_inferred, normalize_access_type_node, node_type_shape, node_type_compatible, node_type_equals, prefer_specific_type, node_type_deps, method_receiver_element_node, infer_literal_node, infer_binop_type_node, extract_optional_inner_node, for_each_element_type_node, resolved_type, child_type_node, emit_map_has}; -pub use crate::v2_compiler_infer_method::{builtin_kernel_seed_diagnostics, infer_builtin_call_type, resolve_builtin_call_type}; -pub use crate::v2_compiler_infer_cycle::{detect_type_cycles_kahn}; -pub use crate::v2_compiler_infer_env::{TypeEnv, TypeBinding, is_recursive_type, is_recursive_type_by_name, lookup_type, lookup_type_by_name, lookup_type_for, merge_envs, put_inductive_field, put_inductive_field_cross, merge_inductive_fields, inductive_fields_for, inductive_fields_list_to_map}; +use crate::std_induction::RecursionShape::{ + DirectRecursion, ListRecursion, MapValueRecursion, OptionalRecursion, SetRecursion, +}; +use crate::std_induction::ShrinkFactor::{ConstantShrink, ProportionalShrink, UnitShrink}; +use crate::std_induction::SubValueRelation::{ + ArithmeticDescent, IteratedSubValue, PreservedValue, StrictSubValue, SubValueUnknown, +}; +pub use crate::std_induction::{ + compose_sub_value, compose_sub_value_relations, join_sub_value, meet_sub_value, + sub_value_to_evidence, InductiveField, RecursionShape, ShrinkFactor, SubValueRelation, +}; pub use crate::std_node::{compiler_inductive_fields, compiler_recursive_types}; -pub use crate::std_induction::{InductiveField, RecursionShape, SubValueRelation, ShrinkFactor, sub_value_to_evidence, meet_sub_value, join_sub_value, compose_sub_value, compose_sub_value_relations}; -use crate::std_induction::RecursionShape::{DirectRecursion, ListRecursion, OptionalRecursion, SetRecursion, MapValueRecursion}; -use crate::std_induction::SubValueRelation::{StrictSubValue, IteratedSubValue, ArithmeticDescent, PreservedValue, SubValueUnknown}; -use crate::std_induction::ShrinkFactor::{UnitShrink, ConstantShrink, ProportionalShrink}; -pub use crate::std_termination::{positive_descent_amount_from_positive_int, proportional_divisor_from_int_at_least_two, PositiveDescentAmount}; -use crate::std_termination::PositiveDescentAmount::{OneStep}; -pub use crate::std_algebra::{CollectionSizeEffect}; -use crate::std_algebra::CollectionSizeEffect::{ShrinkEffect}; -pub use crate::v2_compiler_infer_resolve::{resolve_node, resolve_item_types, NodeResolveResult, ItemResult}; -pub use crate::v2_compiler_infer_sigs::{ResolvedFuncSig, ResolvedFuncEnv, ResolveFuncSigsResult, resolve_func_sigs}; -pub use crate::v2_compiler_infer_emit_info::{TypeRepr, TypeSummary, EmitGraphInfo, EmitInfoBuildState, empty_emit_graph_info, lookup_emit_type_summary, build_struct_field_summaries, build_enum_field_summaries, add_emit_item_summary, derive_variant_to_enum}; -use crate::v2_compiler_infer_emit_info::TypeRepr::{StructRepr, EnumRepr}; -pub use crate::v2_compiler_infer_items::{ItemKind, ItemInfo, TypedModule, TypedGraph, ResolvedGraph, inferred_to_outputs, item_kind, variant_locals_from_items}; -use crate::v2_compiler_infer_items::ItemKind::{FnItem, FuncItem, TypeItem, DataItem, ServiceItem, OtherItem}; -pub use crate::v2_compiler_infer_service::{UniqueAccum, OpEntry, ServiceMethodResult, is_typed_service_call_receiver, extract_typed_service_name, collect_typed_service_calls, collect_called_func_names, expand_transitive_services, check_service_field_access_node, check_service_method_call_node, service_op_entry}; -pub use crate::v2_compiler_infer_patterns::{NodeLookupResult, PatternSubject, lookup_variant_in_type, lookup_field_in_variant, pattern_subject_from_inferred, pattern_subject_from_node, lookup_result_subject, pattern_binding_type, check_match_exhaustiveness}; +use crate::std_termination::PositiveDescentAmount::OneStep; +pub use crate::std_termination::{ + positive_descent_amount_from_positive_int, proportional_divisor_from_int_at_least_two, + PositiveDescentAmount, +}; +pub use crate::std_types::{container_param_name, SourceSpan}; +pub use crate::v2_compiler_infer_access::{ + check_index_access_node, check_slice_access_node, AccessCheckResultNode, +}; +pub use crate::v2_compiler_infer_cycle::detect_type_cycles_kahn; +use crate::v2_compiler_infer_emit_info::TypeRepr::{EnumRepr, StructRepr}; +pub use crate::v2_compiler_infer_emit_info::{ + add_emit_item_summary, build_enum_field_summaries, build_struct_field_summaries, + derive_variant_to_enum, empty_emit_graph_info, lookup_emit_type_summary, EmitGraphInfo, + EmitInfoBuildState, TypeRepr, TypeSummary, +}; +pub use crate::v2_compiler_infer_env::{ + inductive_fields_for, inductive_fields_list_to_map, is_recursive_type, + is_recursive_type_by_name, lookup_type, lookup_type_by_name, lookup_type_for, merge_envs, + merge_inductive_fields, put_inductive_field, put_inductive_field_cross, TypeBinding, TypeEnv, +}; +use crate::v2_compiler_infer_items::ItemKind::{ + DataItem, FnItem, FuncItem, OtherItem, ServiceItem, TypeItem, +}; +pub use crate::v2_compiler_infer_items::{ + inferred_to_outputs, item_kind, variant_locals_from_items, ItemInfo, ItemKind, ResolvedGraph, + TypedGraph, TypedModule, +}; +pub use crate::v2_compiler_infer_lookup::{ + field_summary_for_type, lookup_coproduct_common_field_node, lookup_field_type_node, + lookup_func_sig, lookup_in_scope, map_key_type_in_env, map_value_type_in_env, + resolve_known_method_node, resolve_scrutinee_type_node, KnownMethodResolution, +}; +pub use crate::v2_compiler_infer_method::{ + builtin_kernel_seed_diagnostics, infer_builtin_call_type, resolve_builtin_call_type, +}; use crate::v2_compiler_infer_patterns::PatternSubject::*; -pub use crate::v2_compiler_infer_lookup::{KnownMethodResolution, resolve_known_method_node, resolve_scrutinee_type_node, field_summary_for_type, lookup_field_type_node, lookup_coproduct_common_field_node, map_value_type_in_env, map_key_type_in_env, lookup_in_scope, lookup_func_sig}; -pub use crate::v2_compiler_infer_access::{AccessCheckResultNode, check_index_access_node, check_slice_access_node}; -use self::SizeExpr::*; +pub use crate::v2_compiler_infer_patterns::{ + check_match_exhaustiveness, lookup_field_in_variant, lookup_result_subject, + lookup_variant_in_type, pattern_binding_type, pattern_subject_from_inferred, + pattern_subject_from_node, NodeLookupResult, PatternSubject, +}; +pub use crate::v2_compiler_infer_resolve::{ + resolve_item_types, resolve_node, ItemResult, NodeResolveResult, +}; +pub use crate::v2_compiler_infer_service::{ + check_service_field_access_node, check_service_method_call_node, collect_called_func_names, + collect_typed_service_calls, expand_transitive_services, extract_typed_service_name, + is_typed_service_call_receiver, service_op_entry, OpEntry, ServiceMethodResult, UniqueAccum, +}; +pub use crate::v2_compiler_infer_sigs::{ + resolve_func_sigs, ResolveFuncSigsResult, ResolvedFuncEnv, ResolvedFuncSig, +}; +pub use crate::v2_compiler_infer_types::{ + bare_map_node, callable_inferred, child_type_node, emit_map_has, extract_optional_inner_node, + for_each_element_type_node, infer_binop_type_node, infer_literal_node, is_fully_resolved, + make_callable_type, make_container_type, method_receiver_element_node, node_is_collection, + node_is_element_collection, node_is_keyed_collection, node_type_compatible, node_type_deps, + node_type_equals, node_type_shape, nominal_type_ref, normalize_access_type_node, + prefer_specific_type, resolve_type_variables_from_template, resolved_type, + template_return_has_variables, template_return_is_receiver_self, KernelTypeBuild, +}; +pub use crate::v2_compiler_resolve::{ModuleGraph, ResolvedImport, ResolvedModule}; +use crate::v2_rt; +use crate::v2_std_core::BinOp::{ + Add, And, Div, Eq, Ge, Gt, Le, Lt, Mod, Mul, Ne, NullCoalesce, Or, Sub, +}; +use crate::v2_std_core::CallSemantics::{LookupCallSemantics, PlainCallSemantics}; +use crate::v2_std_core::Cardinality::{CardOptional, Required}; +use crate::v2_std_core::CompilerDiagnostic::{InternalError, VariantCollision}; +use crate::v2_std_core::Connective::{Arrow, Conj, Disj, NoConnective}; +use crate::v2_std_core::ExprData::{ + ExprBinOp, ExprBlock, ExprCall, ExprCast, ExprError, ExprFieldAccess, ExprForEach, ExprIf, + ExprIndex, ExprLambda, ExprLet, ExprListLit, ExprLiteral, ExprMatch, ExprMethodCall, + ExprRecordLit, ExprReturn, ExprSlice, ExprStringInterp, ExprUnaryOp, ExprVar, NoExprData, +}; +use crate::v2_std_core::ExprErrorKind::{InternalExprError, ParseRecoveryError, SemanticExprError}; +use crate::v2_std_core::FieldAccessStyle::{ + EnumAccessor, OptionalUnwrap, StoredField, TupleFirst, TupleSecond, +}; +use crate::v2_std_core::FieldValueShape::{OptionalValue, PlainValue}; +use crate::v2_std_core::InferredNode::{CompilerError, Resolved, TypeVariable}; +use crate::v2_std_core::LiteralValue::{LitBool, LitFloat, LitInt, LitNull, LitStr}; +use crate::v2_std_core::MatchPattern::{Bind, VariantPattern, Wildcard}; +use crate::v2_std_core::MethodSemantics::{ + AlgebraMethodSemantics, PlainMethodSemantics, ServiceMethodSemantics, +}; +use crate::v2_std_core::StringPart::{Interpolation, Text}; +use crate::v2_std_core::UnaryOpKind::{Neg, Not}; +use crate::v2_std_core::VarBindingKind::{ + FunctionValueBinding, LocalValueBinding, MatchBoundBinding, VariantValueBinding, +}; +pub use crate::v2_std_core::{ + arg_name_at, arg_value, arm_body, arm_guard, arm_pattern, authored_name_at, binop_left, + binop_right, bool_type, build_newline_index, cast_expr, cast_target, container_expected_arity, + default_ident_span, error_type, expr_call_func_at, expr_has_non_tail_self_call, + expr_has_self_call, expr_method_name_at, expr_var_name_at, field_access_base, + field_access_field_at, field_binding_name_at, field_binding_pattern, field_init_node_name_at, + field_init_node_value, field_node_type_expr, float_type, foreach_body, foreach_collection, + foreach_variable_at, has_child_named, has_inferred, if_condition, if_else_branch, + if_then_branch, import_is_all, index_base, index_expr, int_type, intern, intern_str, + is_child_accessor_in_model, is_compiler_error, is_container_type, is_error_diagnostic, + is_kernel_type, is_property_contraction, is_tree_size_reducing, kernel_type_set, lambda_body, + lambda_param_names_at, let_binding_name_at, let_body, let_value, local_transport_node, + make_arg_node, make_arm_node, make_error_node, make_expr_error_node, make_expr_node, + make_field_binding_node, make_field_init_node, make_interp_part_node, make_named_expr_node, + make_param_node, make_span, make_text_part_node, make_transport_node, map_children, + match_arm_nodes, match_scrutinee, method_arg_nodes, method_receiver, module_imports, + module_items, module_node, no_span, node_name_span, none_type, param_node_name_at, + param_node_type_expr, record_lit_type_name_at, resource_use_name_at, resource_use_resource, + return_value, slice_base, slice_end, slice_start, string_type, unaryop_operand, unit_type, + with_optional_cardinality, with_required_cardinality, BinOp, CallSemantics, Cardinality, + CompilerDiagnostic, Connective, DeclaredFuncEnv, DeclaredFuncSig, ErrorNode, ExprData, + ExprErrorKind, FieldAccessStyle, FieldSummary, FieldValueShape, InferredNode, InternTable, + LiteralValue, MatchPattern, MethodSemantics, NewlineIndex, Node, StringPart, UnaryOpKind, + VarBindingKind, +}; +use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] pub struct ItemContribution { @@ -104,43 +191,57 @@ pub struct BlockInferState { pub typed_stmts: Rc>>, } -pub fn infer_block_stmts(mut remaining: Rc>>, mut remaining_count: i64, mut scope: Rc, mut typed_stmts: Rc>>, mut diag_chunks: Rc>>>>, mut last_type: Rc, mut expected: Option>) -> Rc { +pub fn infer_block_stmts( + mut remaining: Rc>>, + mut remaining_count: i64, + mut scope: Rc, + mut typed_stmts: Rc>>, + mut diag_chunks: Rc>>>>, + mut last_type: Rc, + mut expected: Option>, +) -> Rc { loop { match remaining.clone().first().cloned() { - None => { break Rc::new(BlockInferState { - scope: scope.clone(), - diag_chunks: diag_chunks, - last_type: last_type, - typed_stmts: typed_stmts, -}); }, - Some(stmt) => { let is_last = (remaining_count.clone() == 1); -let stmt_expected = if is_last { - expected.clone() - } else { - None - }; -let stmt_result = infer_expr(&stmt, &scope, &stmt_expected); -let stmt_typed = stmt_result.typed.clone(); -let stmt_diags = stmt_result.diagnostics.clone(); -let stmt_rt = resolved_type(stmt_typed.clone()); -let next_scope = scope_after_stmt_node(&stmt, stmt_rt.clone(), &scope); -{ - let __tco_0 = Rc::new(remaining.iter().cloned().skip(1 as usize).collect::>()); -let __tco_1 = (remaining_count - 1); -let __tco_2 = next_scope; -let __tco_3 = v2_rt::rc_list_push(typed_stmts, stmt_typed.clone()); -let __tco_4 = v2_rt::rc_list_push(diag_chunks, stmt_diags); -let __tco_5 = stmt_rt.clone(); -remaining = __tco_0; -remaining_count = __tco_1; -scope = __tco_2; -typed_stmts = __tco_3; -diag_chunks = __tco_4; -last_type = __tco_5; -continue; -} }, -} -} + None => { + break Rc::new(BlockInferState { + scope: scope.clone(), + diag_chunks: diag_chunks, + last_type: last_type, + typed_stmts: typed_stmts, + }); + } + Some(stmt) => { + let is_last = (remaining_count.clone() == 1); + let stmt_expected = if is_last { expected.clone() } else { None }; + let stmt_result = infer_expr(&stmt, &scope, &stmt_expected); + let stmt_typed = stmt_result.typed.clone(); + let stmt_diags = stmt_result.diagnostics.clone(); + let stmt_rt = resolved_type(stmt_typed.clone()); + let next_scope = scope_after_stmt_node(&stmt, stmt_rt.clone(), &scope); + { + let __tco_0 = Rc::new( + remaining + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ); + let __tco_1 = (remaining_count - 1); + let __tco_2 = next_scope; + let __tco_3 = v2_rt::rc_list_push(typed_stmts, stmt_typed.clone()); + let __tco_4 = v2_rt::rc_list_push(diag_chunks, stmt_diags); + let __tco_5 = stmt_rt.clone(); + remaining = __tco_0; + remaining_count = __tco_1; + scope = __tco_2; + typed_stmts = __tco_3; + diag_chunks = __tco_4; + last_type = __tco_5; + continue; + } + } + } + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -222,81 +323,163 @@ pub struct LocalContributionState { pub diag_chunks: Rc>>>>, } -pub fn merge_scope_from_imports(mut remaining: Rc>>, mut parent_index: Rc>>, mut env: Rc, mut func_sigs: Rc>>, mut svc_registry: Rc>>>>, mut svc_locals: Rc>>) -> Rc { +pub fn merge_scope_from_imports( + mut remaining: Rc>>, + mut parent_index: Rc>>, + mut env: Rc, + mut func_sigs: Rc>>, + mut svc_registry: Rc>>>>, + mut svc_locals: Rc>>, +) -> Rc { loop { match remaining.clone().first().cloned() { - None => { break Rc::new(InferScopeComponents { - func_sigs: func_sigs, - svc_registry: svc_registry, - svc_locals: svc_locals, -}); }, - Some(imp) => { match v2_rt::map_get(&parent_index, imp.module_path.clone()) { - Some(typed_parent) => { let next_func_sigs = Rc::new(v2_rt::map_values(&typed_parent.func_env.clone().signatures.clone())).iter().cloned().fold(func_sigs, |acc: Rc>>, rsig: Rc| { - let sig_key = rsig.name.clone(); -let sig_params = rsig.params.clone(); -let sig_rt = rsig.inferred.clone(); -let sig_async = rsig.is_async.clone(); -v2_rt::rc_map_insert(acc, sig_key.clone(), Rc::new(DeclaredFuncSig { - name: sig_key.clone(), - params: sig_params.clone(), - inferred: Some(sig_rt.clone()), - is_async: sig_async.clone(), - output_provenance: rsig.output_provenance.clone(), - variant_provenance: rsig.variant_provenance.clone(), -})) -}); -let parent_result = typed_parent.items.clone().iter().cloned().fold(Rc::new(InferScopeComponents { - func_sigs: next_func_sigs, - svc_registry: svc_registry, - svc_locals: svc_locals, -}), |acc: Rc, titem: Rc| if ((titem.transport.clone() != None) && ((titem.children.clone().len() as i64) > 0)) { - { - let entries = Rc::new({ let mut __result = Vec::new(); for c in titem.children.clone().iter().cloned() { __result.push(Rc::new(OpEntry { - name: authored_name_at(env.source_indices.clone(), &c), - outputs: inferred_to_outputs(&c.inferred.clone(), c.span.clone(), env.source_indices.clone()), - params: c.params.clone(), -})); } __result }); -let root = namespace_root_from_properties(titem.properties.clone(), authored_name_at(env.source_indices.clone(), &titem), env.source_indices.clone()); -Rc::new(InferScopeComponents { - func_sigs: acc.func_sigs.clone(), - svc_registry: v2_rt::rc_map_insert(acc.svc_registry.clone(), authored_name_at(env.source_indices.clone(), &titem), entries.clone()), - svc_locals: v2_rt::rc_map_insert(acc.svc_locals.clone(), root.clone(), nominal_type_binding(&root)), -}) -} - } else { - if (((((titem.body.clone() != None) && ((titem.params.clone().len() as i64) == 0)) && (titem.transport.clone() == None)) && (titem.connective.clone() == Connective::NoConnective)) && (titem.inferred.clone() != None)) { - Rc::new(InferScopeComponents { - func_sigs: acc.func_sigs.clone(), - svc_registry: acc.svc_registry.clone(), - svc_locals: v2_rt::rc_map_insert(acc.svc_locals.clone(), authored_name_at(env.source_indices.clone(), &titem), Rc::new(TypeBinding { - name: authored_name_at(env.source_indices.clone(), &titem), - resolved: resolved_type(titem.clone()), - provenance: Rc::new(SubValueRelation::SubValueUnknown), -})), -}) - } else { - acc.clone() + None => { + break Rc::new(InferScopeComponents { + func_sigs: func_sigs, + svc_registry: svc_registry, + svc_locals: svc_locals, + }); } - }); -{ - let __tco_0 = Rc::new(remaining.iter().cloned().skip(1 as usize).collect::>()); -let __tco_1 = parent_result.func_sigs.clone(); -let __tco_2 = parent_result.svc_registry.clone(); -let __tco_3 = parent_result.svc_locals.clone(); -remaining = __tco_0; -func_sigs = __tco_1; -svc_registry = __tco_2; -svc_locals = __tco_3; -continue; -} }, - None => { { - let __tco_0 = Rc::new(remaining.iter().cloned().skip(1 as usize).collect::>()); -remaining = __tco_0; -continue; -} }, -} }, -} -} + Some(imp) => match v2_rt::map_get(&parent_index, imp.module_path.clone()) { + Some(typed_parent) => { + let next_func_sigs = Rc::new(v2_rt::map_values( + &typed_parent.func_env.clone().signatures.clone(), + )) + .iter() + .cloned() + .fold( + func_sigs, + |acc: Rc>>, + rsig: Rc| { + let sig_key = rsig.name.clone(); + let sig_params = rsig.params.clone(); + let sig_rt = rsig.inferred.clone(); + let sig_async = rsig.is_async.clone(); + v2_rt::rc_map_insert( + acc, + sig_key.clone(), + Rc::new(DeclaredFuncSig { + name: sig_key.clone(), + params: sig_params.clone(), + inferred: Some(sig_rt.clone()), + is_async: sig_async.clone(), + output_provenance: rsig.output_provenance.clone(), + variant_provenance: rsig.variant_provenance.clone(), + }), + ) + }, + ); + let parent_result = typed_parent.items.clone().iter().cloned().fold( + Rc::new(InferScopeComponents { + func_sigs: next_func_sigs, + svc_registry: svc_registry, + svc_locals: svc_locals, + }), + |acc: Rc, titem: Rc| { + if ((titem.transport.clone() != None) + && ((titem.children.clone().len() as i64) > 0)) + { + { + let entries = Rc::new({ + let mut __result = Vec::new(); + for c in titem.children.clone().iter().cloned() { + __result.push(Rc::new(OpEntry { + name: authored_name_at( + env.source_indices.clone(), + &c, + ), + outputs: inferred_to_outputs( + &c.inferred.clone(), + c.span.clone(), + env.source_indices.clone(), + ), + params: c.params.clone(), + })); + } + __result + }); + let root = namespace_root_from_properties( + titem.properties.clone(), + authored_name_at(env.source_indices.clone(), &titem), + env.source_indices.clone(), + ); + Rc::new(InferScopeComponents { + func_sigs: acc.func_sigs.clone(), + svc_registry: v2_rt::rc_map_insert( + acc.svc_registry.clone(), + authored_name_at(env.source_indices.clone(), &titem), + entries.clone(), + ), + svc_locals: v2_rt::rc_map_insert( + acc.svc_locals.clone(), + root.clone(), + nominal_type_binding(&root), + ), + }) + } + } else { + if (((((titem.body.clone() != None) + && ((titem.params.clone().len() as i64) == 0)) + && (titem.transport.clone() == None)) + && (titem.connective.clone() == Connective::NoConnective)) + && (titem.inferred.clone() != None)) + { + Rc::new(InferScopeComponents { + func_sigs: acc.func_sigs.clone(), + svc_registry: acc.svc_registry.clone(), + svc_locals: v2_rt::rc_map_insert( + acc.svc_locals.clone(), + authored_name_at(env.source_indices.clone(), &titem), + Rc::new(TypeBinding { + name: authored_name_at( + env.source_indices.clone(), + &titem, + ), + resolved: resolved_type(titem.clone()), + provenance: Rc::new( + SubValueRelation::SubValueUnknown, + ), + }), + ), + }) + } else { + acc.clone() + } + } + }, + ); + { + let __tco_0 = Rc::new( + remaining + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ); + let __tco_1 = parent_result.func_sigs.clone(); + let __tco_2 = parent_result.svc_registry.clone(); + let __tco_3 = parent_result.svc_locals.clone(); + remaining = __tco_0; + func_sigs = __tco_1; + svc_registry = __tco_2; + svc_locals = __tco_3; + continue; + } + } + None => { + let __tco_0 = Rc::new( + remaining + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ); + remaining = __tco_0; + continue; + } + }, + } + } } pub fn nominal_leaf_type(name: String) -> Rc { @@ -305,17 +488,17 @@ pub fn nominal_leaf_type(name: String) -> Rc { pub fn nominal_type_binding(name: &String) -> Rc { Rc::new(TypeBinding { - name: name.clone(), - resolved: nominal_leaf_type(name.clone()), - provenance: Rc::new(SubValueRelation::SubValueUnknown), -}) + name: name.clone(), + resolved: nominal_leaf_type(name.clone()), + provenance: Rc::new(SubValueRelation::SubValueUnknown), + }) } pub fn set_has(m: Rc>, key: String) -> bool { match v2_rt::map_get(&m, key) { - Some(_) => true, - None => false, -} + Some(_) => true, + None => false, + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -324,147 +507,242 @@ pub struct FieldRecursionResult { pub element_type: String, } -pub fn classify_field_recursion(field_node: &Rc, parent_name: &String, recursive_type_set: Rc>, source_indices: &Rc>>) -> Option> { +pub fn classify_field_recursion( + field_node: &Rc, + parent_name: &String, + recursive_type_set: Rc>, + source_indices: &Rc>>, +) -> Option> { { let type_expr = match field_node.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => rt.clone(), - _ => field_node_type_expr(&field_node), -}; -let field_type_name = authored_name_at(source_indices.clone(), &type_expr); -if (field_type_name.clone().as_str() == parent_name.clone().as_str()) { + Some(InferredNode::Resolved { node: rt, .. }) => rt.clone(), + _ => field_node_type_expr(&field_node), + }; + let field_type_name = authored_name_at(source_indices.clone(), &type_expr); + if (field_type_name.clone().as_str() == parent_name.clone().as_str()) { match field_node.return_cardinality.clone() { - Cardinality::CardOptional => Some(Rc::new(FieldRecursionResult { - shape: RecursionShape::OptionalRecursion, - element_type: parent_name.clone(), -})), - _ => Some(Rc::new(FieldRecursionResult { - shape: RecursionShape::DirectRecursion, - element_type: parent_name.clone(), -})), -} + Cardinality::CardOptional => Some(Rc::new(FieldRecursionResult { + shape: RecursionShape::OptionalRecursion, + element_type: parent_name.clone(), + })), + _ => Some(Rc::new(FieldRecursionResult { + shape: RecursionShape::DirectRecursion, + element_type: parent_name.clone(), + })), + } } else { if is_container_type(field_type_name.clone()) { { let arity = match container_expected_arity(field_type_name.clone()) { - Some(a) => a.clone(), - None => 0, -}; -let value_index = if (arity == 2) { - 1 - } else { - 0 + Some(a) => a.clone(), + None => 0, }; -let value_type = match type_expr.children.clone().get(value_index as usize).cloned() { - Some(t) => authored_name_at(source_indices.clone(), &t), - None => "".to_string(), -}; -let is_recursive_element = ((value_type.clone().as_str() == parent_name.clone().as_str()) || set_has(recursive_type_set, value_type.clone())); -if is_recursive_element { + let value_index = if (arity == 2) { 1 } else { 0 }; + let value_type = match type_expr + .children + .clone() + .get(value_index as usize) + .cloned() + { + Some(t) => authored_name_at(source_indices.clone(), &t), + None => "".to_string(), + }; + let is_recursive_element = ((value_type.clone().as_str() + == parent_name.clone().as_str()) + || set_has(recursive_type_set, value_type.clone())); + if is_recursive_element { { - let elem = if (value_type.clone().as_str() == parent_name.clone().as_str()) { - parent_name.clone() - } else { - value_type.clone() - }; -match field_type_name.clone().as_str() { - "List" => Some(Rc::new(FieldRecursionResult { - shape: RecursionShape::ListRecursion, - element_type: elem, -})), - "Set" => Some(Rc::new(FieldRecursionResult { - shape: RecursionShape::SetRecursion, - element_type: elem, -})), - "Map" => Some(Rc::new(FieldRecursionResult { - shape: RecursionShape::MapValueRecursion, - element_type: elem, -})), - _ => None, -} -} + let elem = + if (value_type.clone().as_str() == parent_name.clone().as_str()) { + parent_name.clone() + } else { + value_type.clone() + }; + match field_type_name.clone().as_str() { + "List" => Some(Rc::new(FieldRecursionResult { + shape: RecursionShape::ListRecursion, + element_type: elem, + })), + "Set" => Some(Rc::new(FieldRecursionResult { + shape: RecursionShape::SetRecursion, + element_type: elem, + })), + "Map" => Some(Rc::new(FieldRecursionResult { + shape: RecursionShape::MapValueRecursion, + element_type: elem, + })), + _ => None, + } + } } else { None } -} + } } else { if set_has(recursive_type_set, field_type_name.clone()) { match field_node.return_cardinality.clone() { - Cardinality::CardOptional => Some(Rc::new(FieldRecursionResult { - shape: RecursionShape::OptionalRecursion, - element_type: field_type_name.clone(), -})), - _ => Some(Rc::new(FieldRecursionResult { - shape: RecursionShape::DirectRecursion, - element_type: field_type_name.clone(), -})), -} + Cardinality::CardOptional => Some(Rc::new(FieldRecursionResult { + shape: RecursionShape::OptionalRecursion, + element_type: field_type_name.clone(), + })), + _ => Some(Rc::new(FieldRecursionResult { + shape: RecursionShape::DirectRecursion, + element_type: field_type_name.clone(), + })), + } } else { None } } } -} + } } -pub fn collect_fields_inductive(fields: Rc>>, parent_name: String, variant_name: String, recursive_type_set: Rc>, acc: Rc>>>>, source_indices: Rc>>) -> Rc>>>> { - fields.iter().cloned().fold(acc.clone(), |field_acc: Rc>>>>, field_node: Rc| match classify_field_recursion(&field_node, &parent_name, recursive_type_set.clone(), &source_indices) { - Some(result) => put_inductive_field_cross(&field_acc, &parent_name, variant_name.clone(), authored_name_at(source_indices.clone(), &field_node), result.shape.clone(), result.element_type.clone()), - None => field_acc.clone(), -}) +pub fn collect_fields_inductive( + fields: Rc>>, + parent_name: String, + variant_name: String, + recursive_type_set: Rc>, + acc: Rc>>>>, + source_indices: Rc>>, +) -> Rc>>>> { + fields.iter().cloned().fold( + acc.clone(), + |field_acc: Rc>>>>, field_node: Rc| { + match classify_field_recursion( + &field_node, + &parent_name, + recursive_type_set.clone(), + &source_indices, + ) { + Some(result) => put_inductive_field_cross( + &field_acc, + &parent_name, + variant_name.clone(), + authored_name_at(source_indices.clone(), &field_node), + result.shape.clone(), + result.element_type.clone(), + ), + None => field_acc.clone(), + } + }, + ) } -pub fn collect_item_inductive_fields(item: &Rc, recursive_type_set: Rc>, source_indices: &Rc>>) -> Rc>>>> { +pub fn collect_item_inductive_fields( + item: &Rc, + recursive_type_set: Rc>, + source_indices: &Rc>>, +) -> Rc>>>> { { let item_name = authored_name_at(source_indices.clone(), &item); -match item.connective.clone() { - Connective::Disj => item.children.clone().iter().cloned().fold(v2_rt::rc_empty_map::>>>(), |variant_acc: Rc>>>>, variant_node: Rc| collect_fields_inductive(variant_node.children.clone(), item_name.clone(), authored_name_at(source_indices.clone(), &variant_node), recursive_type_set.clone(), variant_acc, source_indices.clone())), - Connective::Conj => collect_fields_inductive(item.children.clone(), item_name.clone(), "".to_string(), recursive_type_set.clone(), v2_rt::rc_empty_map::>>>(), source_indices.clone()), - _ => v2_rt::rc_empty_map::>>>(), -} -} + match item.connective.clone() { + Connective::Disj => item.children.clone().iter().cloned().fold( + v2_rt::rc_empty_map::>>>(), + |variant_acc: Rc>>>>, + variant_node: Rc| { + collect_fields_inductive( + variant_node.children.clone(), + item_name.clone(), + authored_name_at(source_indices.clone(), &variant_node), + recursive_type_set.clone(), + variant_acc, + source_indices.clone(), + ) + }, + ), + Connective::Conj => collect_fields_inductive( + item.children.clone(), + item_name.clone(), + "".to_string(), + recursive_type_set.clone(), + v2_rt::rc_empty_map::>>>(), + source_indices.clone(), + ), + _ => v2_rt::rc_empty_map::>>>(), + } + } } -pub fn build_item_inductive_fields(items: Rc>>, recursive_type_set: Rc>, source_indices: Rc>>) -> Rc>>>> { - items.iter().cloned().fold(v2_rt::rc_empty_map::>>>(), |acc: Rc>>>>, item: Rc| merge_inductive_fields(acc, &collect_item_inductive_fields(&item, recursive_type_set.clone(), &source_indices))) +pub fn build_item_inductive_fields( + items: Rc>>, + recursive_type_set: Rc>, + source_indices: Rc>>, +) -> Rc>>>> { + items.iter().cloned().fold( + v2_rt::rc_empty_map::>>>(), + |acc: Rc>>>>, item: Rc| { + merge_inductive_fields( + acc, + &collect_item_inductive_fields(&item, recursive_type_set.clone(), &source_indices), + ) + }, + ) } -pub fn nominal_ref_node(name: &String, span: Rc, ident_span: Option>) -> Rc { +pub fn nominal_ref_node( + name: &String, + span: Rc, + ident_span: Option>, +) -> Rc { Rc::new(Node { - name: name.clone(), - span: span, - ident_span: ident_span, - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::Resolved { - node: nominal_leaf_type(name.clone()), -})), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}) + name: name.clone(), + span: span, + ident_span: ident_span, + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::Resolved { + node: nominal_leaf_type(name.clone()), + })), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }) } pub fn resolved_callable_type(func_params: Rc>>, ret: Rc) -> Rc { make_callable_type(func_params, ret) } -pub fn namespace_root_from_properties(properties: Rc>>, name: String, source_indices: Rc>>) -> String { - match Rc::new({ let mut __result = Vec::new(); for p in properties.iter().cloned() { if (field_init_node_name_at(p.clone(), source_indices.clone()).as_str() == "namespace_root".to_string().as_str()) { __result.push(p); } } __result }).first().cloned() { - Some(ns_prop) => match (*field_init_node_value(&ns_prop).expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitStr { value: root, .. } = value.as_ref() else { unreachable!() }; root.clone() }, - _ => name, -}, - None => name, -} +pub fn namespace_root_from_properties( + properties: Rc>>, + name: String, + source_indices: Rc>>, +) -> String { + match Rc::new({ + let mut __result = Vec::new(); + for p in properties.iter().cloned() { + if (field_init_node_name_at(p.clone(), source_indices.clone()).as_str() + == "namespace_root".to_string().as_str()) + { + __result.push(p); + } + } + __result + }) + .first() + .cloned() + { + Some(ns_prop) => match (*field_init_node_value(&ns_prop).expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { + let LiteralValue::LitStr { value: root, .. } = value.as_ref() else { + unreachable!() + }; + root.clone() + } + _ => name, + }, + None => name, + } } pub fn expr_span(texpr: Rc) -> Rc { @@ -473,9 +751,9 @@ pub fn expr_span(texpr: Rc) -> Rc { pub fn ok_infer(texpr: Rc) -> Rc { Rc::new(InferResult { - typed: texpr, - diagnostics: Rc::new(vec![]), -}) + typed: texpr, + diagnostics: Rc::new(vec![]), + }) } pub fn semantic_expr_error_node(message: String, span: Rc) -> Rc { @@ -488,46 +766,64 @@ pub fn internal_expr_error_node(message: String, span: Rc) -> Rc, name: &String) -> Option { match v2_rt::map_get(&scope.locals.clone(), name.clone()) { - Some(binding) => match lookup_type_for(&scope.type_env.clone(), &binding.resolved.clone()) { - Some(parent) => { - let is_coproduct = (parent.connective.clone() == Connective::Disj); -if is_coproduct { - if has_child_named(parent.clone(), name.clone(), scope.type_env.clone().source_indices.clone()) { - Some(authored_name_at(scope.type_env.clone().source_indices.clone(), &binding.resolved.clone())) - } else { - None + Some(binding) => { + match lookup_type_for(&scope.type_env.clone(), &binding.resolved.clone()) { + Some(parent) => { + let is_coproduct = (parent.connective.clone() == Connective::Disj); + if is_coproduct { + if has_child_named( + parent.clone(), + name.clone(), + scope.type_env.clone().source_indices.clone(), + ) { + Some(authored_name_at( + scope.type_env.clone().source_indices.clone(), + &binding.resolved.clone(), + )) + } else { + None + } + } else { + None + } + } + None => None, } - } else { - None } -}, - None => None, -}, - None => None, -} + None => None, + } } pub fn infer_var_binding_kind(scope: &Rc, name: &String) -> Rc { match lookup_variant_parent_enum(&scope, &name) { - Some(parent_enum) => Rc::new(VarBindingKind::VariantValueBinding { - parent_enum: parent_enum.clone(), -}), - None => match v2_rt::map_get(&scope.locals.clone(), name.clone()) { - Some(_) => if v2_rt::map_has(&scope.match_bound_names.clone(), name.clone()) { - Rc::new(VarBindingKind::MatchBoundBinding) - } else { - Rc::new(VarBindingKind::LocalValueBinding) - }, - None => Rc::new(VarBindingKind::FunctionValueBinding), -}, -} + Some(parent_enum) => Rc::new(VarBindingKind::VariantValueBinding { + parent_enum: parent_enum.clone(), + }), + None => match v2_rt::map_get(&scope.locals.clone(), name.clone()) { + Some(_) => { + if v2_rt::map_has(&scope.match_bound_names.clone(), name.clone()) { + Rc::new(VarBindingKind::MatchBoundBinding) + } else { + Rc::new(VarBindingKind::LocalValueBinding) + } + } + None => Rc::new(VarBindingKind::FunctionValueBinding), + }, + } } -pub fn inference_error(message: String, span: Rc, module_name: String) -> Rc { - make_error_node(Rc::new(CompilerDiagnostic::InternalError { - message: message, - span: span, -}), module_name) +pub fn inference_error( + message: String, + span: Rc, + module_name: String, +) -> Rc { + make_error_node( + Rc::new(CompilerDiagnostic::InternalError { + message: message, + span: span, + }), + module_name, + ) } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -539,11 +835,11 @@ pub struct KernelListTyDiag { pub fn list_kernel_ty_from_element(element: Rc) -> Rc { { let b = make_container_type(&"List".to_string(), element); -Rc::new(KernelListTyDiag { - ty: b.ty.clone(), - miss_diags: b.diagnostics.clone(), -}) -} + Rc::new(KernelListTyDiag { + ty: b.ty.clone(), + miss_diags: b.diagnostics.clone(), + }) + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -552,80 +848,118 @@ pub struct Tier2bBt { pub kernel_diags: Rc>>, } -pub fn infer_tier2b_builtin_with_kernel_diags(func_name: &String, typed_args: Rc>>, scope: Rc, span: Rc) -> Rc { - if ((func_name.clone().as_str() == "lookup".to_string().as_str()) || (func_name.clone().as_str() == "map_get".to_string().as_str())) { +pub fn infer_tier2b_builtin_with_kernel_diags( + func_name: &String, + typed_args: Rc>>, + scope: Rc, + span: Rc, +) -> Rc { + if ((func_name.clone().as_str() == "lookup".to_string().as_str()) + || (func_name.clone().as_str() == "map_get".to_string().as_str())) + { Rc::new(Tier2bBt { - bt: match typed_args.first().cloned() { - Some(receiver_arg) => match arg_value(&receiver_arg).inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: receiver_type, .. }) => match map_value_type_in_env(receiver_type.clone(), &scope.type_env.clone()) { - Some(value_type) => with_optional_cardinality(&value_type), - None => resolve_builtin_call_type(func_name.clone()), -}, - _ => resolve_builtin_call_type(func_name.clone()), -}, - None => resolve_builtin_call_type(func_name.clone()), -}, - kernel_diags: Rc::new(vec![]), -}) + bt: match typed_args.first().cloned() { + Some(receiver_arg) => match arg_value(&receiver_arg) + .inferred + .clone() + .as_deref() + .cloned() + { + Some(InferredNode::Resolved { + node: receiver_type, + .. + }) => { + match map_value_type_in_env(receiver_type.clone(), &scope.type_env.clone()) + { + Some(value_type) => with_optional_cardinality(&value_type), + None => resolve_builtin_call_type(func_name.clone()), + } + } + _ => resolve_builtin_call_type(func_name.clone()), + }, + None => resolve_builtin_call_type(func_name.clone()), + }, + kernel_diags: Rc::new(vec![]), + }) } else { if (func_name.clone().as_str() == "map_keys".to_string().as_str()) { match typed_args.first().cloned() { - Some(receiver_arg) => match arg_value(&receiver_arg).inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: receiver_type, .. }) => match map_key_type_in_env(receiver_type.clone(), &scope.type_env.clone()) { - Some(key_type) => { - let lk = list_kernel_ty_from_element(key_type.clone()); -Rc::new(Tier2bBt { - bt: lk.ty.clone(), - kernel_diags: lk.miss_diags.clone(), -}) -}, - None => Rc::new(Tier2bBt { - bt: resolve_builtin_call_type(func_name.clone()), - kernel_diags: Rc::new(vec![]), -}), -}, - _ => Rc::new(Tier2bBt { - bt: resolve_builtin_call_type(func_name.clone()), - kernel_diags: Rc::new(vec![]), -}), -}, - None => Rc::new(Tier2bBt { - bt: resolve_builtin_call_type(func_name.clone()), - kernel_diags: Rc::new(vec![]), -}), -} + Some(receiver_arg) => match arg_value(&receiver_arg) + .inferred + .clone() + .as_deref() + .cloned() + { + Some(InferredNode::Resolved { + node: receiver_type, + .. + }) => match map_key_type_in_env(receiver_type.clone(), &scope.type_env.clone()) + { + Some(key_type) => { + let lk = list_kernel_ty_from_element(key_type.clone()); + Rc::new(Tier2bBt { + bt: lk.ty.clone(), + kernel_diags: lk.miss_diags.clone(), + }) + } + None => Rc::new(Tier2bBt { + bt: resolve_builtin_call_type(func_name.clone()), + kernel_diags: Rc::new(vec![]), + }), + }, + _ => Rc::new(Tier2bBt { + bt: resolve_builtin_call_type(func_name.clone()), + kernel_diags: Rc::new(vec![]), + }), + }, + None => Rc::new(Tier2bBt { + bt: resolve_builtin_call_type(func_name.clone()), + kernel_diags: Rc::new(vec![]), + }), + } } else { if (func_name.clone().as_str() == "map_values".to_string().as_str()) { match typed_args.first().cloned() { - Some(receiver_arg) => match arg_value(&receiver_arg).inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: receiver_type, .. }) => match map_value_type_in_env(receiver_type.clone(), &scope.type_env.clone()) { - Some(value_type) => { - let lv = list_kernel_ty_from_element(value_type.clone()); -Rc::new(Tier2bBt { - bt: lv.ty.clone(), - kernel_diags: lv.miss_diags.clone(), -}) -}, - None => Rc::new(Tier2bBt { - bt: resolve_builtin_call_type(func_name.clone()), - kernel_diags: Rc::new(vec![]), -}), -}, - _ => Rc::new(Tier2bBt { - bt: resolve_builtin_call_type(func_name.clone()), - kernel_diags: Rc::new(vec![]), -}), -}, - None => Rc::new(Tier2bBt { - bt: resolve_builtin_call_type(func_name.clone()), - kernel_diags: Rc::new(vec![]), -}), -} + Some(receiver_arg) => match arg_value(&receiver_arg) + .inferred + .clone() + .as_deref() + .cloned() + { + Some(InferredNode::Resolved { + node: receiver_type, + .. + }) => match map_value_type_in_env( + receiver_type.clone(), + &scope.type_env.clone(), + ) { + Some(value_type) => { + let lv = list_kernel_ty_from_element(value_type.clone()); + Rc::new(Tier2bBt { + bt: lv.ty.clone(), + kernel_diags: lv.miss_diags.clone(), + }) + } + None => Rc::new(Tier2bBt { + bt: resolve_builtin_call_type(func_name.clone()), + kernel_diags: Rc::new(vec![]), + }), + }, + _ => Rc::new(Tier2bBt { + bt: resolve_builtin_call_type(func_name.clone()), + kernel_diags: Rc::new(vec![]), + }), + }, + None => Rc::new(Tier2bBt { + bt: resolve_builtin_call_type(func_name.clone()), + kernel_diags: Rc::new(vec![]), + }), + } } else { Rc::new(Tier2bBt { - bt: resolve_builtin_call_type(func_name.clone()), - kernel_diags: Rc::new(vec![]), -}) + bt: resolve_builtin_call_type(func_name.clone()), + kernel_diags: Rc::new(vec![]), + }) } } } @@ -637,344 +971,571 @@ pub struct MethodPipeFallback { pub kernel_diags: Rc>>, } -pub fn method_pipe_map_keys_values_fallback(recv_rt: &Rc, method_name: &String, scope: Rc, span: Rc) -> Rc { +pub fn method_pipe_map_keys_values_fallback( + recv_rt: &Rc, + method_name: &String, + scope: Rc, + span: Rc, +) -> Rc { if (method_name.clone().as_str() == "map_keys".to_string().as_str()) { match map_key_type_in_env(recv_rt.clone(), &scope.type_env.clone()) { - Some(key_type) => { - let lk = list_kernel_ty_from_element(key_type.clone()); -Rc::new(MethodPipeFallback { - result_ty: lk.ty.clone(), - kernel_diags: lk.miss_diags.clone(), -}) -}, - None => Rc::new(MethodPipeFallback { - result_ty: recv_rt.clone(), - kernel_diags: Rc::new(vec![]), -}), -} + Some(key_type) => { + let lk = list_kernel_ty_from_element(key_type.clone()); + Rc::new(MethodPipeFallback { + result_ty: lk.ty.clone(), + kernel_diags: lk.miss_diags.clone(), + }) + } + None => Rc::new(MethodPipeFallback { + result_ty: recv_rt.clone(), + kernel_diags: Rc::new(vec![]), + }), + } } else { if (method_name.clone().as_str() == "map_values".to_string().as_str()) { match map_value_type_in_env(recv_rt.clone(), &scope.type_env.clone()) { - Some(value_type) => { - let lv = list_kernel_ty_from_element(value_type.clone()); -Rc::new(MethodPipeFallback { - result_ty: lv.ty.clone(), - kernel_diags: lv.miss_diags.clone(), -}) -}, - None => Rc::new(MethodPipeFallback { - result_ty: recv_rt.clone(), - kernel_diags: Rc::new(vec![]), -}), -} + Some(value_type) => { + let lv = list_kernel_ty_from_element(value_type.clone()); + Rc::new(MethodPipeFallback { + result_ty: lv.ty.clone(), + kernel_diags: lv.miss_diags.clone(), + }) + } + None => Rc::new(MethodPipeFallback { + result_ty: recv_rt.clone(), + kernel_diags: Rc::new(vec![]), + }), + } } else { Rc::new(MethodPipeFallback { - result_ty: recv_rt.clone(), - kernel_diags: Rc::new(vec![]), -}) + result_ty: recv_rt.clone(), + kernel_diags: Rc::new(vec![]), + }) } } } -pub fn categorized_error(message: String, span: Rc, module_name: String, category: String) -> Rc { - make_error_node(Rc::new(CompilerDiagnostic::InternalError { - message: message, - span: span, -}), module_name) -} - -pub fn validate_cast(source_inferred: Option>, target_name: &String, span: Rc, source_indices: Rc>>, module_name: String) -> Option> { +pub fn categorized_error( + message: String, + span: Rc, + module_name: String, + category: String, +) -> Rc { + make_error_node( + Rc::new(CompilerDiagnostic::InternalError { + message: message, + span: span, + }), + module_name, + ) +} + +pub fn validate_cast( + source_inferred: Option>, + target_name: &String, + span: Rc, + source_indices: Rc>>, + module_name: String, +) -> Option> { match source_inferred.as_deref().cloned() { - Some(InferredNode::Resolved { node: src_node, .. }) => { - let source_name = authored_name_at(source_indices, &src_node); -if (source_name.clone().as_str() == target_name.clone().as_str()) { - None - } else { - if !is_dag_cast_domain_type(source_name.clone()) { + Some(InferredNode::Resolved { node: src_node, .. }) => { + let source_name = authored_name_at(source_indices, &src_node); + if (source_name.clone().as_str() == target_name.clone().as_str()) { None } else { - if !is_dag_cast_domain_type(target_name.clone()) { + if !is_dag_cast_domain_type(source_name.clone()) { None } else { - if dag_can_cast(source_name.clone(), target_name.clone()) { + if !is_dag_cast_domain_type(target_name.clone()) { None } else { - { - let msg = v2_rt::concat(v2_rt::concat(v2_rt::concat("invalid cast: ".to_string(), source_name.clone()), " as ".to_string()), target_name.clone()); -let diag = Rc::new(CompilerDiagnostic::InternalError { - message: msg, - span: span, -}); -Some(make_error_node(diag, module_name)) -} + if dag_can_cast(source_name.clone(), target_name.clone()) { + None + } else { + { + let msg = v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "invalid cast: ".to_string(), + source_name.clone(), + ), + " as ".to_string(), + ), + target_name.clone(), + ); + let diag = Rc::new(CompilerDiagnostic::InternalError { + message: msg, + span: span, + }); + Some(make_error_node(diag, module_name)) + } + } } } } } -}, - _ => None, -} + _ => None, + } } pub fn type_variable_node(id: String) -> Rc { Rc::new(Node { - name: "".to_string(), - span: make_span(0, 0), - ident_span: None, - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::TypeVariable { - id: id, -})), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}) + name: "".to_string(), + span: make_span(0, 0), + ident_span: None, + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::TypeVariable { id: id })), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }) } pub fn is_type_variable(inferred: Rc) -> bool { match (*inferred).clone() { - InferredNode::TypeVariable { .. } => true, - _ => false, -} + InferredNode::TypeVariable { .. } => true, + _ => false, + } } -pub fn inferred_or_error(result: Option>, fallback_message: String, fallback_span: Rc) -> Rc { +pub fn inferred_or_error( + result: Option>, + fallback_message: String, + fallback_span: Rc, +) -> Rc { match result { - Some(inferred) => inferred.clone(), - None => Rc::new(InferredNode::CompilerError { - message: fallback_message, - span: fallback_span, -}), -} + Some(inferred) => inferred.clone(), + None => Rc::new(InferredNode::CompilerError { + message: fallback_message, + span: fallback_span, + }), + } } -pub fn resolve_pattern_subject(scope: Rc, scrutinee_subject: Rc) -> Rc { +pub fn resolve_pattern_subject( + scope: Rc, + scrutinee_subject: Rc, +) -> Rc { match (*scrutinee_subject).clone() { - PatternSubject::PatternResolved { node: scrutinee_type, .. } => pattern_subject_from_node(&resolve_scrutinee_type_node(scope.type_env.clone(), scrutinee_type.clone())), - PatternSubject::PatternDynamic { span: dynamic_span, .. } => Rc::new(PatternSubject::PatternDynamic { - span: dynamic_span.clone(), -}), - PatternSubject::PatternLookupBlocked => Rc::new(PatternSubject::PatternLookupBlocked), -} + PatternSubject::PatternResolved { + node: scrutinee_type, + .. + } => pattern_subject_from_node(&resolve_scrutinee_type_node( + scope.type_env.clone(), + scrutinee_type.clone(), + )), + PatternSubject::PatternDynamic { + span: dynamic_span, .. + } => Rc::new(PatternSubject::PatternDynamic { + span: dynamic_span.clone(), + }), + PatternSubject::PatternLookupBlocked => Rc::new(PatternSubject::PatternLookupBlocked), + } } -pub fn annotate_pattern_parent_enums(pattern: Rc, scrutinee_subject: Rc, scope: &Rc) -> Rc { +pub fn annotate_pattern_parent_enums( + pattern: Rc, + scrutinee_subject: Rc, + scope: &Rc, +) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*pattern.clone()).clone() { - MatchPattern::VariantPattern { name: variant_name, field_bindings: bindings, .. } => { - let resolved_scrut = resolve_pattern_subject(scope.clone(), scrutinee_subject); -let inferred_parent = match (*resolved_scrut.clone()).clone() { - PatternSubject::PatternResolved { node: resolved_scrut_node, .. } => if ((resolved_scrut_node.return_cardinality.clone() == Cardinality::CardOptional) && ((variant_name.clone().as_str() == "Some".to_string().as_str()) || (variant_name.clone().as_str() == "None".to_string().as_str()))) { - Some("Optional".to_string()) - } else { - { - let is_coproduct = (resolved_scrut_node.connective.clone() == Connective::Disj); -if is_coproduct { - Some(authored_name_at(scope.type_env.clone().source_indices.clone(), &resolved_scrut_node)) - } else { - None + MatchPattern::VariantPattern { + name: variant_name, + field_bindings: bindings, + .. + } => { + let resolved_scrut = resolve_pattern_subject(scope.clone(), scrutinee_subject); + let inferred_parent = match (*resolved_scrut.clone()).clone() { + PatternSubject::PatternResolved { + node: resolved_scrut_node, + .. + } => { + if ((resolved_scrut_node.return_cardinality.clone() + == Cardinality::CardOptional) + && ((variant_name.clone().as_str() == "Some".to_string().as_str()) + || (variant_name.clone().as_str() == "None".to_string().as_str()))) + { + Some("Optional".to_string()) + } else { + { + let is_coproduct = + (resolved_scrut_node.connective.clone() == Connective::Disj); + if is_coproduct { + Some(authored_name_at( + scope.type_env.clone().source_indices.clone(), + &resolved_scrut_node, + )) + } else { + None + } + } + } } -} - }, - PatternSubject::PatternDynamic { .. } => None, - PatternSubject::PatternLookupBlocked => None, -}; -let variant_lookup = lookup_variant_in_type(resolved_scrut.clone(), &variant_name, scope.module_name.clone(), &scope.type_env.clone().source_indices.clone()); -let variant_subject = lookup_result_subject(variant_lookup); -let annotated_bindings = Rc::new({ let mut __result = Vec::new(); for binding in bindings.clone().iter().cloned() { __result.push({ - let field_lookup = lookup_field_in_variant(variant_subject.clone(), &field_binding_name_at(binding.clone(), scope.type_env.clone().source_indices.clone()), scope.module_name.clone(), &scope.type_env.clone().source_indices.clone()); -let field_subject = lookup_result_subject(field_lookup.clone()); -make_field_binding_node(&field_binding_name_at(binding.clone(), scope.type_env.clone().source_indices.clone()), annotate_pattern_parent_enums(field_binding_pattern(binding.clone()), field_subject.clone(), &scope), binding.span.clone(), node_name_span(&binding)) -}); } __result }); -match inferred_parent { - Some(parent_name) => Rc::new(MatchPattern::VariantPattern { - name: variant_name.clone(), - parent_enum: Some(parent_name.clone()), - field_bindings: annotated_bindings, -}), - None => Rc::new(MatchPattern::VariantPattern { - name: variant_name.clone(), - parent_enum: None, - field_bindings: annotated_bindings, -}), -} -}, - _ => pattern.clone(), -} + PatternSubject::PatternDynamic { .. } => None, + PatternSubject::PatternLookupBlocked => None, + }; + let variant_lookup = lookup_variant_in_type( + resolved_scrut.clone(), + &variant_name, + scope.module_name.clone(), + &scope.type_env.clone().source_indices.clone(), + ); + let variant_subject = lookup_result_subject(variant_lookup); + let annotated_bindings = Rc::new({ + let mut __result = Vec::new(); + for binding in bindings.clone().iter().cloned() { + __result.push({ + let field_lookup = lookup_field_in_variant( + variant_subject.clone(), + &field_binding_name_at( + binding.clone(), + scope.type_env.clone().source_indices.clone(), + ), + scope.module_name.clone(), + &scope.type_env.clone().source_indices.clone(), + ); + let field_subject = lookup_result_subject(field_lookup.clone()); + make_field_binding_node( + &field_binding_name_at( + binding.clone(), + scope.type_env.clone().source_indices.clone(), + ), + annotate_pattern_parent_enums( + field_binding_pattern(binding.clone()), + field_subject.clone(), + &scope, + ), + binding.span.clone(), + node_name_span(&binding), + ) + }); + } + __result + }); + match inferred_parent { + Some(parent_name) => Rc::new(MatchPattern::VariantPattern { + name: variant_name.clone(), + parent_enum: Some(parent_name.clone()), + field_bindings: annotated_bindings, + }), + None => Rc::new(MatchPattern::VariantPattern { + name: variant_name.clone(), + parent_enum: None, + field_bindings: annotated_bindings, + }), + } + } + _ => pattern.clone(), + } }) } pub fn build_params_scope(scope: &Rc, params: Rc>>) -> Rc { { - let new_locals = params.iter().cloned().fold(scope.locals.clone(), |acc: Rc>>, p: Rc| v2_rt::rc_map_insert(acc, param_node_name_at(p.clone(), scope.type_env.clone().source_indices.clone()), Rc::new(TypeBinding { - name: param_node_name_at(p.clone(), scope.type_env.clone().source_indices.clone()), - resolved: param_node_type_expr(&p), - provenance: Rc::new(SubValueRelation::PreservedValue), -}))); -Rc::new(InferScope { - type_env: scope.type_env.clone(), - func_env: scope.func_env.clone(), - locals: new_locals, - match_bound_names: scope.match_bound_names.clone(), - module_name: scope.module_name.clone(), - service_registry: scope.service_registry.clone(), - item_registry: scope.item_registry.clone(), - lambda_param_provenance: v2_rt::rc_empty_map::>(), -}) -} + let new_locals = params.iter().cloned().fold( + scope.locals.clone(), + |acc: Rc>>, p: Rc| { + v2_rt::rc_map_insert( + acc, + param_node_name_at(p.clone(), scope.type_env.clone().source_indices.clone()), + Rc::new(TypeBinding { + name: param_node_name_at( + p.clone(), + scope.type_env.clone().source_indices.clone(), + ), + resolved: param_node_type_expr(&p), + provenance: Rc::new(SubValueRelation::PreservedValue), + }), + ) + }, + ); + Rc::new(InferScope { + type_env: scope.type_env.clone(), + func_env: scope.func_env.clone(), + locals: new_locals, + match_bound_names: scope.match_bound_names.clone(), + module_name: scope.module_name.clone(), + service_registry: scope.service_registry.clone(), + item_registry: scope.item_registry.clone(), + lambda_param_provenance: v2_rt::rc_empty_map::>(), + }) + } } -pub fn extend_scope(scope: &Rc, name: &String, resolved: Rc, provenance: Rc) -> Rc { +pub fn extend_scope( + scope: &Rc, + name: &String, + resolved: Rc, + provenance: Rc, +) -> Rc { Rc::new(InferScope { - type_env: scope.type_env.clone(), - func_env: scope.func_env.clone(), - locals: v2_rt::rc_map_insert(scope.locals.clone(), name.clone(), Rc::new(TypeBinding { - name: name.clone(), - resolved: resolved, - provenance: provenance, -})), - match_bound_names: scope.match_bound_names.clone(), - module_name: scope.module_name.clone(), - service_registry: scope.service_registry.clone(), - item_registry: scope.item_registry.clone(), - lambda_param_provenance: scope.lambda_param_provenance.clone(), -}) + type_env: scope.type_env.clone(), + func_env: scope.func_env.clone(), + locals: v2_rt::rc_map_insert( + scope.locals.clone(), + name.clone(), + Rc::new(TypeBinding { + name: name.clone(), + resolved: resolved, + provenance: provenance, + }), + ), + match_bound_names: scope.match_bound_names.clone(), + module_name: scope.module_name.clone(), + service_registry: scope.service_registry.clone(), + item_registry: scope.item_registry.clone(), + lambda_param_provenance: scope.lambda_param_provenance.clone(), + }) } -pub fn extend_scope_match_bound(scope: &Rc, name: &String, resolved: Rc, provenance: Rc) -> Rc { +pub fn extend_scope_match_bound( + scope: &Rc, + name: &String, + resolved: Rc, + provenance: Rc, +) -> Rc { Rc::new(InferScope { - type_env: scope.type_env.clone(), - func_env: scope.func_env.clone(), - locals: v2_rt::rc_map_insert(scope.locals.clone(), name.clone(), Rc::new(TypeBinding { - name: name.clone(), - resolved: resolved, - provenance: provenance, -})), - match_bound_names: v2_rt::rc_map_insert(scope.match_bound_names.clone(), name.clone(), true), - module_name: scope.module_name.clone(), - service_registry: scope.service_registry.clone(), - item_registry: scope.item_registry.clone(), - lambda_param_provenance: scope.lambda_param_provenance.clone(), -}) + type_env: scope.type_env.clone(), + func_env: scope.func_env.clone(), + locals: v2_rt::rc_map_insert( + scope.locals.clone(), + name.clone(), + Rc::new(TypeBinding { + name: name.clone(), + resolved: resolved, + provenance: provenance, + }), + ), + match_bound_names: v2_rt::rc_map_insert( + scope.match_bound_names.clone(), + name.clone(), + true, + ), + module_name: scope.module_name.clone(), + service_registry: scope.service_registry.clone(), + item_registry: scope.item_registry.clone(), + lambda_param_provenance: scope.lambda_param_provenance.clone(), + }) } pub fn extend_scope_with_params(scope: &Rc, params: Rc>) -> Rc { { - let new_locals = params.iter().cloned().fold(scope.locals.clone(), |acc: Rc>>, p: String| v2_rt::rc_map_insert(acc, p.clone(), Rc::new(TypeBinding { - name: p.clone(), - resolved: type_variable_node("lambda_param".to_string()), - provenance: Rc::new(SubValueRelation::SubValueUnknown), -}))); -Rc::new(InferScope { - type_env: scope.type_env.clone(), - func_env: scope.func_env.clone(), - locals: new_locals, - match_bound_names: scope.match_bound_names.clone(), - module_name: scope.module_name.clone(), - service_registry: scope.service_registry.clone(), - item_registry: scope.item_registry.clone(), - lambda_param_provenance: scope.lambda_param_provenance.clone(), -}) -} + let new_locals = params.iter().cloned().fold( + scope.locals.clone(), + |acc: Rc>>, p: String| { + v2_rt::rc_map_insert( + acc, + p.clone(), + Rc::new(TypeBinding { + name: p.clone(), + resolved: type_variable_node("lambda_param".to_string()), + provenance: Rc::new(SubValueRelation::SubValueUnknown), + }), + ) + }, + ); + Rc::new(InferScope { + type_env: scope.type_env.clone(), + func_env: scope.func_env.clone(), + locals: new_locals, + match_bound_names: scope.match_bound_names.clone(), + module_name: scope.module_name.clone(), + service_registry: scope.service_registry.clone(), + item_registry: scope.item_registry.clone(), + lambda_param_provenance: scope.lambda_param_provenance.clone(), + }) + } } -pub fn scope_after_stmt_node(stmt: &Rc, stmt_type: Rc, scope: &Rc) -> Rc { +pub fn scope_after_stmt_node( + stmt: &Rc, + stmt_type: Rc, + scope: &Rc, +) -> Rc { match (*stmt.expr_data.clone()).clone() { - ExprData::ExprLet => if ((stmt.children.clone().len() as i64) <= 1) { - { - let val = match stmt.children.clone().first().cloned() { - Some(v) => v.clone(), - None => stmt.clone(), -}; -extend_scope(&scope, &let_binding_name_at(stmt.clone(), scope.type_env.clone().source_indices.clone()), stmt_type, classify_binding_provenance(&val, &scope)) -} - } else { - scope.clone() - }, - _ => scope.clone(), -} + ExprData::ExprLet => { + if ((stmt.children.clone().len() as i64) <= 1) { + { + let val = match stmt.children.clone().first().cloned() { + Some(v) => v.clone(), + None => stmt.clone(), + }; + extend_scope( + &scope, + &let_binding_name_at( + stmt.clone(), + scope.type_env.clone().source_indices.clone(), + ), + stmt_type, + classify_binding_provenance(&val, &scope), + ) + } + } else { + scope.clone() + } + } + _ => scope.clone(), + } } -pub fn derive_field_provenance(scope: &Rc, scrutinee_provenance: &Rc, scrutinee_subject: Rc, variant_name: String, field_name: String) -> Rc { +pub fn derive_field_provenance( + scope: &Rc, + scrutinee_provenance: &Rc, + scrutinee_subject: Rc, + variant_name: String, + field_name: String, +) -> Rc { match (*scrutinee_provenance.clone()).clone() { - SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), - _ => { - let scrut_type_name = match (*scrutinee_subject).clone() { - PatternSubject::PatternResolved { node: n, .. } => authored_name_at(scope.type_env.clone().source_indices.clone(), &resolved_type(n.clone())), - _ => "".to_string(), -}; -if (scrut_type_name.clone().as_str() == "".to_string().as_str()) { - Rc::new(SubValueRelation::SubValueUnknown) - } else { - { - let ind_fields = inductive_fields_for(scope.type_env.clone(), scrut_type_name.clone()); -let matching = Rc::new({ let mut __result = Vec::new(); for f in ind_fields.iter().cloned() { if ((f.variant_name.clone().as_str() == variant_name.clone().as_str()) && (f.field_name.clone().as_str() == field_name.clone().as_str())) { __result.push(f); } } __result }).first().cloned(); -match matching { - Some(ind_field) => compose_sub_value(scrutinee_provenance.clone(), ind_field.clone()), - None => Rc::new(SubValueRelation::SubValueUnknown), -} -} + SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), + _ => { + let scrut_type_name = match (*scrutinee_subject).clone() { + PatternSubject::PatternResolved { node: n, .. } => authored_name_at( + scope.type_env.clone().source_indices.clone(), + &resolved_type(n.clone()), + ), + _ => "".to_string(), + }; + if (scrut_type_name.clone().as_str() == "".to_string().as_str()) { + Rc::new(SubValueRelation::SubValueUnknown) + } else { + { + let ind_fields = + inductive_fields_for(scope.type_env.clone(), scrut_type_name.clone()); + let matching = Rc::new({ + let mut __result = Vec::new(); + for f in ind_fields.iter().cloned() { + if ((f.variant_name.clone().as_str() == variant_name.clone().as_str()) + && (f.field_name.clone().as_str() == field_name.clone().as_str())) + { + __result.push(f); + } + } + __result + }) + .first() + .cloned(); + match matching { + Some(ind_field) => { + compose_sub_value(scrutinee_provenance.clone(), ind_field.clone()) + } + None => Rc::new(SubValueRelation::SubValueUnknown), + } + } + } } -}, -} + } } -pub fn extend_scope_with_pattern_node(scope: &Rc, pattern: Rc, scrutinee_subject: &Rc, scrutinee_provenance: Rc) -> Rc { - stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - match (*pattern).clone() { - MatchPattern::Bind { name: n, .. } => Rc::new(PatternScopeResult { - scope: extend_scope_match_bound(&scope, &n, pattern_binding_type(scrutinee_subject.clone()), scrutinee_provenance.clone()), - diagnostics: Rc::new(vec![]), -}), - MatchPattern::Wildcard => Rc::new(PatternScopeResult { - scope: scope.clone(), - diagnostics: Rc::new(vec![]), -}), - MatchPattern::LitPattern { .. } => Rc::new(PatternScopeResult { - scope: scope.clone(), - diagnostics: Rc::new(vec![]), -}), - MatchPattern::VariantPattern { name: vname, field_bindings: bindings, .. } => { +pub fn extend_scope_with_pattern_node( + scope: &Rc, + pattern: Rc, + scrutinee_subject: &Rc, + scrutinee_provenance: Rc, +) -> Rc { + stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || match (*pattern).clone() { + MatchPattern::Bind { name: n, .. } => Rc::new(PatternScopeResult { + scope: extend_scope_match_bound( + &scope, + &n, + pattern_binding_type(scrutinee_subject.clone()), + scrutinee_provenance.clone(), + ), + diagnostics: Rc::new(vec![]), + }), + MatchPattern::Wildcard => Rc::new(PatternScopeResult { + scope: scope.clone(), + diagnostics: Rc::new(vec![]), + }), + MatchPattern::LitPattern { .. } => Rc::new(PatternScopeResult { + scope: scope.clone(), + diagnostics: Rc::new(vec![]), + }), + MatchPattern::VariantPattern { + name: vname, + field_bindings: bindings, + .. + } => { let resolved_scrut = resolve_pattern_subject(scope.clone(), scrutinee_subject.clone()); -let variant_lookup = lookup_variant_in_type(resolved_scrut, &vname, scope.module_name.clone(), &scope.type_env.clone().source_indices.clone()); -let variant_subject = lookup_result_subject(variant_lookup.clone()); -let variant_diags = variant_lookup.diagnostics.clone(); -bindings.clone().iter().cloned().fold(Rc::new(PatternScopeResult { - scope: scope.clone(), - diagnostics: variant_diags, -}), |acc: Rc, fb: Rc| { - let field_name = field_binding_name_at(fb.clone(), scope.type_env.clone().source_indices.clone()); -let field_lookup = lookup_field_in_variant(variant_subject.clone(), &field_name, scope.module_name.clone(), &scope.type_env.clone().source_indices.clone()); -let field_subject = lookup_result_subject(field_lookup.clone()); -let field_type = pattern_binding_type(field_subject.clone()); -let field_provenance = derive_field_provenance(&scope, &scrutinee_provenance, scrutinee_subject.clone(), vname.clone(), field_name.clone()); -let fb_pattern = field_binding_pattern(fb.clone()); -match (*fb_pattern.clone()).clone() { - MatchPattern::Bind { name: n, .. } => Rc::new(PatternScopeResult { - scope: extend_scope_match_bound(&acc.scope.clone(), &n, field_type.clone(), field_provenance.clone()), - diagnostics: v2_rt::concat(acc.diagnostics.clone(), field_lookup.diagnostics.clone()), -}), - _ => { - let nested = extend_scope_with_pattern_node(&acc.scope.clone(), fb_pattern.clone(), &field_subject, field_provenance.clone()); -Rc::new(PatternScopeResult { - scope: nested.scope.clone(), - diagnostics: v2_rt::concat(acc.diagnostics.clone(), v2_rt::concat(field_lookup.diagnostics.clone(), nested.diagnostics.clone())), -}) -}, -} -}) -}, -} + let variant_lookup = lookup_variant_in_type( + resolved_scrut, + &vname, + scope.module_name.clone(), + &scope.type_env.clone().source_indices.clone(), + ); + let variant_subject = lookup_result_subject(variant_lookup.clone()); + let variant_diags = variant_lookup.diagnostics.clone(); + bindings.clone().iter().cloned().fold( + Rc::new(PatternScopeResult { + scope: scope.clone(), + diagnostics: variant_diags, + }), + |acc: Rc, fb: Rc| { + let field_name = field_binding_name_at( + fb.clone(), + scope.type_env.clone().source_indices.clone(), + ); + let field_lookup = lookup_field_in_variant( + variant_subject.clone(), + &field_name, + scope.module_name.clone(), + &scope.type_env.clone().source_indices.clone(), + ); + let field_subject = lookup_result_subject(field_lookup.clone()); + let field_type = pattern_binding_type(field_subject.clone()); + let field_provenance = derive_field_provenance( + &scope, + &scrutinee_provenance, + scrutinee_subject.clone(), + vname.clone(), + field_name.clone(), + ); + let fb_pattern = field_binding_pattern(fb.clone()); + match (*fb_pattern.clone()).clone() { + MatchPattern::Bind { name: n, .. } => Rc::new(PatternScopeResult { + scope: extend_scope_match_bound( + &acc.scope.clone(), + &n, + field_type.clone(), + field_provenance.clone(), + ), + diagnostics: v2_rt::concat( + acc.diagnostics.clone(), + field_lookup.diagnostics.clone(), + ), + }), + _ => { + let nested = extend_scope_with_pattern_node( + &acc.scope.clone(), + fb_pattern.clone(), + &field_subject, + field_provenance.clone(), + ); + Rc::new(PatternScopeResult { + scope: nested.scope.clone(), + diagnostics: v2_rt::concat( + acc.diagnostics.clone(), + v2_rt::concat( + field_lookup.diagnostics.clone(), + nested.diagnostics.clone(), + ), + ), + }) + } + } + }, + ) + } }) } @@ -986,164 +1547,298 @@ pub fn method_name_is(opt: &Option, expected: String) -> bool { } } -pub fn arg_has_name(arg: Rc, name: String, source_indices: Rc>>) -> bool { +pub fn arg_has_name( + arg: Rc, + name: String, + source_indices: Rc>>, +) -> bool { { let n = arg_name_at(arg, source_indices); -if (n.clone() == None) { + if (n.clone() == None) { false } else { (n.clone().unwrap().as_str() == name.as_str()) } -} + } } -pub fn extract_fold_init_info(method_name: Option, method_args: &Rc>>, min_args: i64, scope: &Rc, expected: Option>) -> Option> { +pub fn extract_fold_init_info( + method_name: Option, + method_args: &Rc>>, + min_args: i64, + scope: &Rc, + expected: Option>, +) -> Option> { { let is_fold = method_name_is(&method_name, "fold".to_string()); -if (is_fold && ((method_args.clone().len() as i64) >= min_args)) { + if (is_fold && ((method_args.clone().len() as i64) >= min_args)) { { - let init_arg = match Rc::new({ let mut __result = Vec::new(); for a in method_args.clone().iter().cloned() { if arg_has_name(a.clone(), "init".to_string(), scope.type_env.clone().source_indices.clone()) { __result.push(a); } } __result }).first().cloned() { - Some(a) => Some(a.clone()), - None => method_args.clone().first().cloned(), -}; -match init_arg { - Some(ia) => { - let init_result = infer_expr(&arg_value(&ia), &scope, &expected); -Some(Rc::new(ArgInferResult { - typed_arg: make_arg_node(arg_name_at(ia.clone(), scope.type_env.clone().source_indices.clone()), init_result.typed.clone(), ia.span.clone(), ia.span.clone()), - diagnostics: init_result.diagnostics.clone(), -})) -}, - None => None, -} -} + let init_arg = match Rc::new({ + let mut __result = Vec::new(); + for a in method_args.clone().iter().cloned() { + if arg_has_name( + a.clone(), + "init".to_string(), + scope.type_env.clone().source_indices.clone(), + ) { + __result.push(a); + } + } + __result + }) + .first() + .cloned() + { + Some(a) => Some(a.clone()), + None => method_args.clone().first().cloned(), + }; + match init_arg { + Some(ia) => { + let init_result = infer_expr(&arg_value(&ia), &scope, &expected); + Some(Rc::new(ArgInferResult { + typed_arg: make_arg_node( + arg_name_at( + ia.clone(), + scope.type_env.clone().source_indices.clone(), + ), + init_result.typed.clone(), + ia.span.clone(), + ia.span.clone(), + ), + diagnostics: init_result.diagnostics.clone(), + })) + } + None => None, + } + } } else { None } -} + } } -pub fn derive_element_provenance(coll_expr: Rc, elem_type: &Rc, scope: &Rc) -> Rc { +pub fn derive_element_provenance( + coll_expr: Rc, + elem_type: &Rc, + scope: &Rc, +) -> Rc { { let coll_prov = classify_binding_provenance(&coll_expr, &scope); -match (*coll_prov).clone() { - SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), - _ => if (authored_name_at(scope.type_env.clone().source_indices.clone(), &elem_type).as_str() == "".to_string().as_str()) { - Rc::new(SubValueRelation::SubValueUnknown) - } else { - { - let ind_fields = inductive_fields_for(scope.type_env.clone(), authored_name_at(scope.type_env.clone().source_indices.clone(), &elem_type)); -let list_field = Rc::new({ let mut __result = Vec::new(); for f in ind_fields.iter().cloned() { if match f.shape.clone() { - RecursionShape::ListRecursion => true, - _ => false, -} { __result.push(f); } } __result }).first().cloned(); -match list_field { - Some(f) => Rc::new(SubValueRelation::IteratedSubValue { - field: f.clone(), -}), - None => Rc::new(SubValueRelation::SubValueUnknown), -} -} - }, -} -} + match (*coll_prov).clone() { + SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), + _ => { + if (authored_name_at(scope.type_env.clone().source_indices.clone(), &elem_type) + .as_str() + == "".to_string().as_str()) + { + Rc::new(SubValueRelation::SubValueUnknown) + } else { + { + let ind_fields = inductive_fields_for( + scope.type_env.clone(), + authored_name_at( + scope.type_env.clone().source_indices.clone(), + &elem_type, + ), + ); + let list_field = Rc::new({ + let mut __result = Vec::new(); + for f in ind_fields.iter().cloned() { + if match f.shape.clone() { + RecursionShape::ListRecursion => true, + _ => false, + } { + __result.push(f); + } + } + __result + }) + .first() + .cloned(); + match list_field { + Some(f) => { + Rc::new(SubValueRelation::IteratedSubValue { field: f.clone() }) + } + None => Rc::new(SubValueRelation::SubValueUnknown), + } + } + } + } + } + } } -pub fn infer_method_args_with_fold(method_name: Option, method_args: Rc>>, fold_info: Option>, fold_acc_type: Rc, element_type: Rc, elem_provenance: Rc, scope: Rc) -> Rc>> { +pub fn infer_method_args_with_fold( + method_name: Option, + method_args: Rc>>, + fold_info: Option>, + fold_acc_type: Rc, + element_type: Rc, + elem_provenance: Rc, + scope: Rc, +) -> Rc>> { { let is_fold = method_name_is(&method_name, "fold".to_string()); -Rc::new({ let mut __result = Vec::new(); for idx_pair in Rc::new(method_args.iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { __result.push({ - let a = idx_pair.1.clone(); -let idx = idx_pair.0.clone(); -let is_init_arg = (arg_has_name(a.clone(), "init".to_string(), scope.type_env.clone().source_indices.clone()) || ((arg_name_at(a.clone(), scope.type_env.clone().source_indices.clone()) == None) && (idx.clone() == 0))); -if ((is_fold.clone() && (fold_info.clone() != None)) && is_init_arg.clone()) { - match fold_info.clone() { - Some(fi) => fi.clone(), - None => infer_arg_with_element_type(&a, element_type.clone(), &scope), -} - } else { - if (is_fold.clone() && (fold_info.clone() != None)) { - { - let fold_params = Rc::new(vec![make_param_node(&"acc".to_string(), fold_acc_type.clone(), None, no_span(), no_span()), make_param_node(&"elem".to_string(), element_type.clone(), None, no_span(), no_span())]); -let fold_callable = Rc::new(Node { - name: "".to_string(), - span: no_span(), - ident_span: None, - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: fold_params.clone(), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -let lam_value = arg_value(&a); -let prov_map = match (*elem_provenance.clone()).clone() { - SubValueRelation::SubValueUnknown => v2_rt::rc_empty_map::>(), - _ => v2_rt::rc_map_insert(v2_rt::rc_empty_map::>(), "elem".to_string(), elem_provenance.clone()), -}; -let fold_scope = Rc::new(InferScope { - type_env: scope.type_env.clone(), - func_env: scope.func_env.clone(), - locals: scope.locals.clone(), - match_bound_names: scope.match_bound_names.clone(), - module_name: scope.module_name.clone(), - service_registry: scope.service_registry.clone(), - item_registry: scope.item_registry.clone(), - lambda_param_provenance: prov_map.clone(), -}); -let ar = infer_expr(&lam_value, &fold_scope, &Some(fold_callable.clone())); -Rc::new(ArgInferResult { - typed_arg: make_arg_node(arg_name_at(a.clone(), scope.type_env.clone().source_indices.clone()), ar.typed.clone(), a.span.clone(), a.span.clone()), - diagnostics: ar.diagnostics.clone(), -}) -} - } else { - { - let nf_lam_value = arg_value(&a); -let nf_prov_map = match (*elem_provenance.clone()).clone() { - SubValueRelation::SubValueUnknown => v2_rt::rc_empty_map::>(), - _ => v2_rt::rc_map_insert(v2_rt::rc_empty_map::>(), "elem".to_string(), elem_provenance.clone()), -}; -let nf_scope = if is_lambda_expr(nf_lam_value.clone()) { - Rc::new(InferScope { - type_env: scope.type_env.clone(), - func_env: scope.func_env.clone(), - locals: scope.locals.clone(), - match_bound_names: scope.match_bound_names.clone(), - module_name: scope.module_name.clone(), - service_registry: scope.service_registry.clone(), - item_registry: scope.item_registry.clone(), - lambda_param_provenance: nf_prov_map.clone(), -}) + Rc::new({ + let mut __result = Vec::new(); + for idx_pair in Rc::new( + method_args + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + { + __result.push({ + let a = idx_pair.1.clone(); + let idx = idx_pair.0.clone(); + let is_init_arg = (arg_has_name( + a.clone(), + "init".to_string(), + scope.type_env.clone().source_indices.clone(), + ) || ((arg_name_at( + a.clone(), + scope.type_env.clone().source_indices.clone(), + ) == None) + && (idx.clone() == 0))); + if ((is_fold.clone() && (fold_info.clone() != None)) && is_init_arg.clone()) { + match fold_info.clone() { + Some(fi) => fi.clone(), + None => infer_arg_with_element_type(&a, element_type.clone(), &scope), + } + } else { + if (is_fold.clone() && (fold_info.clone() != None)) { + { + let fold_params = Rc::new(vec![ + make_param_node( + &"acc".to_string(), + fold_acc_type.clone(), + None, + no_span(), + no_span(), + ), + make_param_node( + &"elem".to_string(), + element_type.clone(), + None, + no_span(), + no_span(), + ), + ]); + let fold_callable = Rc::new(Node { + name: "".to_string(), + span: no_span(), + ident_span: None, + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: fold_params.clone(), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + let lam_value = arg_value(&a); + let prov_map = match (*elem_provenance.clone()).clone() { + SubValueRelation::SubValueUnknown => { + v2_rt::rc_empty_map::>() + } + _ => v2_rt::rc_map_insert( + v2_rt::rc_empty_map::>(), + "elem".to_string(), + elem_provenance.clone(), + ), + }; + let fold_scope = Rc::new(InferScope { + type_env: scope.type_env.clone(), + func_env: scope.func_env.clone(), + locals: scope.locals.clone(), + match_bound_names: scope.match_bound_names.clone(), + module_name: scope.module_name.clone(), + service_registry: scope.service_registry.clone(), + item_registry: scope.item_registry.clone(), + lambda_param_provenance: prov_map.clone(), + }); + let ar = infer_expr( + &lam_value, + &fold_scope, + &Some(fold_callable.clone()), + ); + Rc::new(ArgInferResult { + typed_arg: make_arg_node( + arg_name_at( + a.clone(), + scope.type_env.clone().source_indices.clone(), + ), + ar.typed.clone(), + a.span.clone(), + a.span.clone(), + ), + diagnostics: ar.diagnostics.clone(), + }) + } } else { - scope.clone() - }; -infer_arg_with_element_type(&a, element_type.clone(), &nf_scope) -} - } + { + let nf_lam_value = arg_value(&a); + let nf_prov_map = match (*elem_provenance.clone()).clone() { + SubValueRelation::SubValueUnknown => { + v2_rt::rc_empty_map::>() + } + _ => v2_rt::rc_map_insert( + v2_rt::rc_empty_map::>(), + "elem".to_string(), + elem_provenance.clone(), + ), + }; + let nf_scope = if is_lambda_expr(nf_lam_value.clone()) { + Rc::new(InferScope { + type_env: scope.type_env.clone(), + func_env: scope.func_env.clone(), + locals: scope.locals.clone(), + match_bound_names: scope.match_bound_names.clone(), + module_name: scope.module_name.clone(), + service_registry: scope.service_registry.clone(), + item_registry: scope.item_registry.clone(), + lambda_param_provenance: nf_prov_map.clone(), + }) + } else { + scope.clone() + }; + infer_arg_with_element_type(&a, element_type.clone(), &nf_scope) + } + } + } + }); } -}); } __result }) -} + __result + }) + } } pub fn is_lambda_expr(e: Rc) -> bool { match (*e.expr_data.clone()).clone() { - ExprData::ExprLambda => true, - _ => false, -} + ExprData::ExprLambda => true, + _ => false, + } } pub fn seed_override_map() -> Rc>> { - Rc::new(vec!["".to_string()]).iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, k: String| v2_rt::rc_map_insert(acc, k.clone(), unit_type())) + Rc::new(vec!["".to_string()]).iter().cloned().fold( + v2_rt::rc_empty_map::>(), + |acc: Rc>>, k: String| { + v2_rt::rc_map_insert(acc, k.clone(), unit_type()) + }, + ) } pub fn fold_override_map(key: String, value: Rc) -> Rc>> { @@ -1154,355 +1849,704 @@ pub fn empty_override_map() -> Rc>> { seed_override_map() } -pub fn infer_arg_with_element_type(arg: &Rc, element_type: Rc, scope: &Rc) -> Rc { +pub fn infer_arg_with_element_type( + arg: &Rc, + element_type: Rc, + scope: &Rc, +) -> Rc { { let ar = infer_expr(&arg_value(&arg), &scope, &Some(element_type)); -Rc::new(ArgInferResult { - typed_arg: make_arg_node(arg_name_at(arg.clone(), scope.type_env.clone().source_indices.clone()), ar.typed.clone(), arg.span.clone(), arg.span.clone()), - diagnostics: ar.diagnostics.clone(), -}) -} + Rc::new(ArgInferResult { + typed_arg: make_arg_node( + arg_name_at(arg.clone(), scope.type_env.clone().source_indices.clone()), + ar.typed.clone(), + arg.span.clone(), + arg.span.clone(), + ), + diagnostics: ar.diagnostics.clone(), + }) + } } -pub fn infer_expr(texpr: &Rc, scope: &Rc, expected: &Option>) -> Rc { +pub fn infer_expr( + texpr: &Rc, + scope: &Rc, + expected: &Option>, +) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*texpr.expr_data.clone()).clone() { - ExprData::ExprLiteral { value: lit, .. } => { - let span = texpr.span.clone(); -ok_infer(make_expr_node(Rc::new(ExprData::ExprLiteral { - value: lit.clone(), -}), Rc::new(vec![]), Some(Rc::new(InferredNode::Resolved { - node: infer_literal_node(lit.clone()), -})), span.clone())) -}, - ExprData::ExprError { kind, message, .. } => { - let span = texpr.span.clone(); -Rc::new(InferResult { - typed: make_expr_error_node(kind.clone(), &message, &span), - diagnostics: Rc::new(vec![]), -}) -}, - ExprData::ExprVar { .. } => { - let name = expr_var_name_at(texpr.clone(), scope.type_env.clone().source_indices.clone()); -let span = texpr.span.clone(); -match v2_rt::map_get(&scope.locals.clone(), name.clone()) { - Some(binding) => { - let binding_kind = infer_var_binding_kind(&scope, &name); -ok_infer(make_named_expr_node(&name, Rc::new(ExprData::ExprVar { - binding_kind: Some(binding_kind), -}), Rc::new(vec![]), Some(Rc::new(InferredNode::Resolved { - node: binding.resolved.clone(), -})), span.clone(), span.clone())) -}, - None => match lookup_func_sig(scope.func_env.clone(), name.clone()) { - Some(fsig) => if ((fsig.params.clone().len() as i64) == 0) { - ok_infer(make_named_expr_node(&name, Rc::new(ExprData::ExprCall { - call_semantics: Some(CallSemantics::PlainCallSemantics), - descent_evidence: None, -}), Rc::new(vec![]), Some(Rc::new(InferredNode::Resolved { - node: fsig.inferred.clone(), -})), span.clone(), span.clone())) - } else { - ok_infer(make_named_expr_node(&name, Rc::new(ExprData::ExprVar { - binding_kind: Some(Rc::new(VarBindingKind::FunctionValueBinding)), -}), Rc::new(vec![]), Some(Rc::new(InferredNode::Resolved { - node: resolved_callable_type(fsig.params.clone(), fsig.inferred.clone()), -})), span.clone(), span.clone())) - }, - None => { - let err_texpr = make_named_expr_node(&name, Rc::new(ExprData::ExprVar { - binding_kind: None, -}), Rc::new(vec![]), Some(Rc::new(InferredNode::Resolved { - node: error_type(), -})), span.clone(), span.clone()); -Rc::new(InferResult { - typed: err_texpr, - diagnostics: Rc::new(vec![inference_error(v2_rt::concat(v2_rt::concat("undefined variable '".to_string(), name.clone()), "'".to_string()), span.clone(), scope.module_name.clone())]), -}) -}, -}, -} -}, - ExprData::ExprFieldAccess { .. } => { - let field_name = field_access_field_at(texpr.clone(), scope.type_env.clone().source_indices.clone()); -let span = texpr.span.clone(); -let base_expr = field_access_base(texpr.clone()); -let base_result = infer_expr(&base_expr, &scope, &None); -let base_typed = base_result.typed.clone(); -let base_diags = base_result.diagnostics.clone(); -let base_rt = resolved_type(base_typed.clone()); -let resolved_base = resolve_scrutinee_type_node(scope.type_env.clone(), base_rt.clone()); -let resolved_base_is_error = if (resolved_base.inferred.clone() != None) { - is_compiler_error(resolved_base.inferred.clone().clone().unwrap()) - } else { - false - }; -if resolved_base_is_error { + ExprData::ExprLiteral { value: lit, .. } => { + let span = texpr.span.clone(); + ok_infer(make_expr_node( + Rc::new(ExprData::ExprLiteral { value: lit.clone() }), + Rc::new(vec![]), + Some(Rc::new(InferredNode::Resolved { + node: infer_literal_node(lit.clone()), + })), + span.clone(), + )) + } + ExprData::ExprError { kind, message, .. } => { + let span = texpr.span.clone(); Rc::new(InferResult { - typed: make_expr_error_node(ExprErrorKind::SemanticExprError, &"error type cascade".to_string(), &span), - diagnostics: base_diags, -}) - } else { - match lookup_field_type_node(&resolved_base, &field_name, scope.type_env.clone().source_indices.clone()) { - Some(field_type) => { - let field_summary = field_summary_for_type(base_rt.clone(), &scope.type_env.clone(), &field_name); -let fa_texpr = make_named_expr_node(&field_name, Rc::new(ExprData::ExprFieldAccess { - summary: field_summary, -}), Rc::new(vec![base_typed.clone()]), Some(Rc::new(InferredNode::Resolved { - node: field_type.clone(), -})), span.clone(), node_name_span(&texpr)); -Rc::new(InferResult { - typed: fa_texpr, - diagnostics: base_diags, -}) -}, - None => { - let base_is_type_var = if (resolved_base.inferred.clone() != None) { - is_type_variable(resolved_base.inferred.clone().clone().unwrap()) - } else { - false - }; -if base_is_type_var { - { - let fa_texpr = make_named_expr_node(&field_name, Rc::new(ExprData::ExprFieldAccess { - summary: Some(Rc::new(FieldSummary { - access_style: FieldAccessStyle::StoredField, - value_shape: FieldValueShape::PlainValue, -})), -}), Rc::new(vec![base_typed.clone()]), Some(Rc::new(InferredNode::TypeVariable { - id: "field_of_type_var".to_string(), -})), span.clone(), node_name_span(&texpr)); -Rc::new(InferResult { - typed: fa_texpr, - diagnostics: base_diags, -}) -} - } else { - match check_service_field_access_node(&base_rt, field_name.clone(), scope.service_registry.clone(), scope.type_env.clone().source_indices.clone()) { - Some(svc_type) => { - let fa_texpr = make_named_expr_node(&field_name, Rc::new(ExprData::ExprFieldAccess { - summary: Some(Rc::new(FieldSummary { - access_style: FieldAccessStyle::StoredField, - value_shape: FieldValueShape::PlainValue, -})), -}), Rc::new(vec![base_typed.clone()]), Some(Rc::new(InferredNode::Resolved { - node: svc_type.clone(), -})), span.clone(), node_name_span(&texpr)); -Rc::new(InferResult { - typed: fa_texpr, - diagnostics: base_diags, -}) -}, - None => { - let error_message = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("no field '".to_string(), field_name.clone()), "' on type '".to_string()), authored_name_at(scope.type_env.clone().source_indices.clone(), &resolved_base)), "'".to_string()); -let fa_texpr = make_expr_error_node(ExprErrorKind::SemanticExprError, &error_message, &span); -Rc::new(InferResult { - typed: fa_texpr, - diagnostics: v2_rt::concat(base_diags, Rc::new(vec![inference_error(error_message.clone(), span.clone(), scope.module_name.clone())])), -}) -}, -} - } -}, -} + typed: make_expr_error_node(kind.clone(), &message, &span), + diagnostics: Rc::new(vec![]), + }) } -}, - ExprData::ExprCall { .. } => { - let func_name = expr_call_func_at(texpr.clone(), scope.type_env.clone().source_indices.clone()); -let span = texpr.span.clone(); -let call_args = texpr.children.clone(); -let sig = lookup_func_sig(scope.func_env.clone(), func_name.clone()); -let sig_params = match sig.clone() { - Some(s) => s.params.clone(), - None => Rc::new(vec![]), -}; -let has_lambda = { let mut __found = false; for a in call_args.clone().iter().cloned() { if is_lambda_expr(arg_value(&a)) { __found = true; break; } } __found }; -let call_method_args = Rc::new(call_args.clone().iter().cloned().skip(1 as usize).collect::>()); -let call_method_name = Some(func_name.clone()); -let call_fold_info = extract_fold_init_info(call_method_name.clone(), &call_method_args, 2, &scope, expected.clone()); -let call_fold_acc_type = match call_fold_info.clone() { - Some(fi) => resolved_type(arg_value(&fi.typed_arg.clone())), - None => error_type(), -}; -let arg_infer_results = if ((has_lambda && ((call_args.clone().len() as i64) >= 2)) && (sig.clone() == None)) { - match call_args.clone().first().cloned() { - Some(first_arg) => { - let first_result = infer_expr(&arg_value(&first_arg), &scope, &None); -let first_type = resolved_type(first_result.typed.clone()); -let elem_type = for_each_element_type_node(first_type, scope.type_env.clone().source_indices.clone()); -let call_elem_provenance = derive_element_provenance(first_result.typed.clone(), &elem_type, &scope); -let remaining_results = infer_method_args_with_fold(call_method_name.clone(), call_method_args.clone(), call_fold_info.clone(), call_fold_acc_type.clone(), elem_type.clone(), call_elem_provenance, scope.clone()); -v2_rt::concat(Rc::new(vec![Rc::new(ArgInferResult { - typed_arg: make_arg_node(arg_name_at(first_arg.clone(), scope.type_env.clone().source_indices.clone()), first_result.typed.clone(), first_arg.span.clone(), first_arg.span.clone()), - diagnostics: first_result.diagnostics.clone(), -})]), remaining_results) -}, - None => Rc::new(vec![]), -} - } else { - Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(call_args.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { __result.push({ - let a = pair.1.clone(); -let formal_param_type = match sig_params.clone().get(pair.0.clone() as usize).cloned() { - Some(p) => param_node_type_expr(&p), - None => type_variable_node("callable_param".to_string()), -}; -let has_formal = match sig_params.clone().get(pair.0.clone() as usize).cloned() { - Some(_) => true, - None => false, -}; -let expected = if has_formal.clone() { - Some(formal_param_type.clone()) - } else { - None - }; -let ar = infer_expr(&arg_value(&a), &scope, &expected); -Rc::new(ArgInferResult { - typed_arg: make_arg_node(arg_name_at(a.clone(), scope.type_env.clone().source_indices.clone()), ar.typed.clone(), a.span.clone(), a.span.clone()), - diagnostics: ar.diagnostics.clone(), -}) -}); } __result }) - }; -let typed_args = Rc::new({ let mut __result = Vec::new(); for air in arg_infer_results.clone().iter().cloned() { __result.push(air.typed_arg.clone()); } __result }); -let arg_diags = Rc::new({ let mut __result = Vec::new(); for air in arg_infer_results.clone().iter().cloned() { __result.extend((*air.diagnostics.clone()).iter().cloned()); } __result }); -let typed_arg_nodes = typed_args.clone(); -if (sig.clone() != None) { - { - let resolved_type = match sig.clone() { - Some(s) => s.inferred.clone(), - None => error_type(), -}; -Rc::new(InferResult { - typed: make_named_expr_node(&func_name, Rc::new(ExprData::ExprCall { - call_semantics: Some(CallSemantics::PlainCallSemantics), - descent_evidence: None, -}), typed_arg_nodes, Some(Rc::new(InferredNode::Resolved { - node: resolved_type, -})), span.clone(), node_name_span(&texpr)), - diagnostics: arg_diags, -}) -} - } else { - { - let first_arg_type = match typed_args.clone().first().cloned() { - Some(ta) => resolved_type(arg_value(&ta)), - None => unit_type(), -}; -let method_receiver = match typed_args.clone().first().cloned() { - Some(ta) => arg_value(&ta), - None => internal_expr_error_node("method bridge missing receiver".to_string(), span.clone()), -}; -let call_acc_is_under_resolved = !is_fully_resolved(&call_fold_acc_type, &scope.type_env.clone().source_indices.clone()); -let refined_call_fold_acc_type = if ((call_fold_info.clone() != None) && call_acc_is_under_resolved) { - match Rc::new({ let mut __result = Vec::new(); for a in typed_args.clone().iter().cloned() { if is_lambda_expr(arg_value(&a)) { __result.push(a); } } __result }).first().cloned() { - Some(lambda_arg) => resolved_type(arg_value(&lambda_arg)), - None => call_fold_acc_type.clone(), -} - } else { - call_fold_acc_type.clone() - }; -let method_resolution = resolve_known_method_node(method_receiver.clone(), &first_arg_type, &func_name, if (call_fold_info.clone() != None) { - Some(refined_call_fold_acc_type.clone()) - } else { - None - }, scope.service_registry.clone(), &scope.type_env.clone().source_indices.clone()); -let is_known_method = (method_resolution.result_type.clone() != None); -if (is_known_method && ((typed_args.clone().len() as i64) > 0)) { - { - let receiver = method_receiver.clone(); -let remaining = Rc::new(typed_args.clone().iter().cloned().skip(1 as usize).collect::>()); -let base_result_type = match method_resolution.result_type.clone() { - Some(mt) => mt.clone(), - None => error_type(), -}; -let method_tv = if (method_resolution.semantics.clone() == None) { - Rc::new(KernelTypeBuild { - ty: base_result_type.clone(), - diagnostics: Rc::new(vec![]), -}) + ExprData::ExprVar { .. } => { + let name = + expr_var_name_at(texpr.clone(), scope.type_env.clone().source_indices.clone()); + let span = texpr.span.clone(); + match v2_rt::map_get(&scope.locals.clone(), name.clone()) { + Some(binding) => { + let binding_kind = infer_var_binding_kind(&scope, &name); + ok_infer(make_named_expr_node( + &name, + Rc::new(ExprData::ExprVar { + binding_kind: Some(binding_kind), + }), + Rc::new(vec![]), + Some(Rc::new(InferredNode::Resolved { + node: binding.resolved.clone(), + })), + span.clone(), + span.clone(), + )) + } + None => match lookup_func_sig(scope.func_env.clone(), name.clone()) { + Some(fsig) => { + if ((fsig.params.clone().len() as i64) == 0) { + ok_infer(make_named_expr_node( + &name, + Rc::new(ExprData::ExprCall { + call_semantics: Some(CallSemantics::PlainCallSemantics), + descent_evidence: None, + }), + Rc::new(vec![]), + Some(Rc::new(InferredNode::Resolved { + node: fsig.inferred.clone(), + })), + span.clone(), + span.clone(), + )) } else { - match (*method_resolution.semantics.clone().clone().unwrap()).clone() { - MethodSemantics::AlgebraMethodSemantics { algebra_template: at, .. } => match at.clone() { - Some(t) => if (template_return_has_variables(t.clone()) || !is_fully_resolved(&base_result_type, &scope.type_env.clone().source_indices.clone())) { - { - let call_arg_types = Rc::new({ let mut __result = Vec::new(); for a in remaining.clone().iter().cloned() { __result.push(resolved_type(arg_value(&a))); } __result }); -let fold_overrides = if (call_fold_info.clone() != None) { - fold_override_map("FoldAccumulator".to_string(), refined_call_fold_acc_type.clone()) - } else { - empty_override_map() - }; -resolve_type_variables_from_template(&t, call_arg_types, &first_arg_type, fold_overrides, &scope.type_env.clone().source_indices.clone()) -} - } else { - Rc::new(KernelTypeBuild { - ty: base_result_type.clone(), - diagnostics: Rc::new(vec![]), -}) - }, - None => Rc::new(KernelTypeBuild { - ty: base_result_type.clone(), - diagnostics: Rc::new(vec![]), -}), -}, - _ => Rc::new(KernelTypeBuild { - ty: base_result_type.clone(), - diagnostics: Rc::new(vec![]), -}), -} - }; -let bridge_result_type = method_tv.ty.clone(); -let template_subst_diags = method_tv.diagnostics.clone(); -let returns_receiver_self = if (method_resolution.semantics.clone() == None) { - false + ok_infer(make_named_expr_node( + &name, + Rc::new(ExprData::ExprVar { + binding_kind: Some(Rc::new( + VarBindingKind::FunctionValueBinding, + )), + }), + Rc::new(vec![]), + Some(Rc::new(InferredNode::Resolved { + node: resolved_callable_type( + fsig.params.clone(), + fsig.inferred.clone(), + ), + })), + span.clone(), + span.clone(), + )) + } + } + None => { + let err_texpr = make_named_expr_node( + &name, + Rc::new(ExprData::ExprVar { binding_kind: None }), + Rc::new(vec![]), + Some(Rc::new(InferredNode::Resolved { node: error_type() })), + span.clone(), + span.clone(), + ); + Rc::new(InferResult { + typed: err_texpr, + diagnostics: Rc::new(vec![inference_error( + v2_rt::concat( + v2_rt::concat( + "undefined variable '".to_string(), + name.clone(), + ), + "'".to_string(), + ), + span.clone(), + scope.module_name.clone(), + )]), + }) + } + }, + } + } + ExprData::ExprFieldAccess { .. } => { + let field_name = field_access_field_at( + texpr.clone(), + scope.type_env.clone().source_indices.clone(), + ); + let span = texpr.span.clone(); + let base_expr = field_access_base(texpr.clone()); + let base_result = infer_expr(&base_expr, &scope, &None); + let base_typed = base_result.typed.clone(); + let base_diags = base_result.diagnostics.clone(); + let base_rt = resolved_type(base_typed.clone()); + let resolved_base = + resolve_scrutinee_type_node(scope.type_env.clone(), base_rt.clone()); + let resolved_base_is_error = if (resolved_base.inferred.clone() != None) { + is_compiler_error(resolved_base.inferred.clone().clone().unwrap()) + } else { + false + }; + if resolved_base_is_error { + Rc::new(InferResult { + typed: make_expr_error_node( + ExprErrorKind::SemanticExprError, + &"error type cascade".to_string(), + &span, + ), + diagnostics: base_diags, + }) + } else { + match lookup_field_type_node( + &resolved_base, + &field_name, + scope.type_env.clone().source_indices.clone(), + ) { + Some(field_type) => { + let field_summary = field_summary_for_type( + base_rt.clone(), + &scope.type_env.clone(), + &field_name, + ); + let fa_texpr = make_named_expr_node( + &field_name, + Rc::new(ExprData::ExprFieldAccess { + summary: field_summary, + }), + Rc::new(vec![base_typed.clone()]), + Some(Rc::new(InferredNode::Resolved { + node: field_type.clone(), + })), + span.clone(), + node_name_span(&texpr), + ); + Rc::new(InferResult { + typed: fa_texpr, + diagnostics: base_diags, + }) + } + None => { + let base_is_type_var = if (resolved_base.inferred.clone() != None) { + is_type_variable(resolved_base.inferred.clone().clone().unwrap()) } else { - match (*method_resolution.semantics.clone().clone().unwrap()).clone() { - MethodSemantics::AlgebraMethodSemantics { algebra_template: at, .. } => match at.clone() { - Some(t) => template_return_is_receiver_self(t.clone()), - None => false, -}, - _ => false, -} + false }; -let final_receiver = if ((returns_receiver_self && is_fully_resolved(&bridge_result_type, &scope.type_env.clone().source_indices.clone())) && !is_fully_resolved(&first_arg_type, &scope.type_env.clone().source_indices.clone())) { - Rc::new(Node { - name: receiver.name.clone(), - span: receiver.span.clone(), - ident_span: receiver.ident_span.clone(), - children: bridge_result_type.children.clone(), - connective: receiver.connective.clone(), - params: receiver.params.clone(), - inferred: Some(Rc::new(InferredNode::Resolved { - node: bridge_result_type.clone(), -})), - return_cardinality: receiver.return_cardinality.clone(), - uses: receiver.uses.clone(), - body: receiver.body.clone(), - transport: receiver.transport.clone(), - properties: receiver.properties.clone(), - type_annotation: receiver.type_annotation.clone(), - is_self_recursive: receiver.is_self_recursive.clone(), - has_non_tail_self_call: receiver.has_non_tail_self_call.clone(), - match_pattern: receiver.match_pattern.clone(), - expr_data: receiver.expr_data.clone(), - ident: None, -}) + if base_is_type_var { + { + let fa_texpr = make_named_expr_node( + &field_name, + Rc::new(ExprData::ExprFieldAccess { + summary: Some(Rc::new(FieldSummary { + access_style: FieldAccessStyle::StoredField, + value_shape: FieldValueShape::PlainValue, + })), + }), + Rc::new(vec![base_typed.clone()]), + Some(Rc::new(InferredNode::TypeVariable { + id: "field_of_type_var".to_string(), + })), + span.clone(), + node_name_span(&texpr), + ); + Rc::new(InferResult { + typed: fa_texpr, + diagnostics: base_diags, + }) + } + } else { + match check_service_field_access_node( + &base_rt, + field_name.clone(), + scope.service_registry.clone(), + scope.type_env.clone().source_indices.clone(), + ) { + Some(svc_type) => { + let fa_texpr = make_named_expr_node( + &field_name, + Rc::new(ExprData::ExprFieldAccess { + summary: Some(Rc::new(FieldSummary { + access_style: FieldAccessStyle::StoredField, + value_shape: FieldValueShape::PlainValue, + })), + }), + Rc::new(vec![base_typed.clone()]), + Some(Rc::new(InferredNode::Resolved { + node: svc_type.clone(), + })), + span.clone(), + node_name_span(&texpr), + ); + Rc::new(InferResult { + typed: fa_texpr, + diagnostics: base_diags, + }) + } + None => { + let error_message = v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "no field '".to_string(), + field_name.clone(), + ), + "' on type '".to_string(), + ), + authored_name_at( + scope.type_env.clone().source_indices.clone(), + &resolved_base, + ), + ), + "'".to_string(), + ); + let fa_texpr = make_expr_error_node( + ExprErrorKind::SemanticExprError, + &error_message, + &span, + ); + Rc::new(InferResult { + typed: fa_texpr, + diagnostics: v2_rt::concat( + base_diags, + Rc::new(vec![inference_error( + error_message.clone(), + span.clone(), + scope.module_name.clone(), + )]), + ), + }) + } + } + } + } + } + } + } + ExprData::ExprCall { .. } => { + let func_name = + expr_call_func_at(texpr.clone(), scope.type_env.clone().source_indices.clone()); + let span = texpr.span.clone(); + let call_args = texpr.children.clone(); + let sig = lookup_func_sig(scope.func_env.clone(), func_name.clone()); + let sig_params = match sig.clone() { + Some(s) => s.params.clone(), + None => Rc::new(vec![]), + }; + let has_lambda = { + let mut __found = false; + for a in call_args.clone().iter().cloned() { + if is_lambda_expr(arg_value(&a)) { + __found = true; + break; + } + } + __found + }; + let call_method_args = Rc::new( + call_args + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ); + let call_method_name = Some(func_name.clone()); + let call_fold_info = extract_fold_init_info( + call_method_name.clone(), + &call_method_args, + 2, + &scope, + expected.clone(), + ); + let call_fold_acc_type = match call_fold_info.clone() { + Some(fi) => resolved_type(arg_value(&fi.typed_arg.clone())), + None => error_type(), + }; + let arg_infer_results = if ((has_lambda && ((call_args.clone().len() as i64) >= 2)) + && (sig.clone() == None)) + { + match call_args.clone().first().cloned() { + Some(first_arg) => { + let first_result = infer_expr(&arg_value(&first_arg), &scope, &None); + let first_type = resolved_type(first_result.typed.clone()); + let elem_type = for_each_element_type_node( + first_type, + scope.type_env.clone().source_indices.clone(), + ); + let call_elem_provenance = derive_element_provenance( + first_result.typed.clone(), + &elem_type, + &scope, + ); + let remaining_results = infer_method_args_with_fold( + call_method_name.clone(), + call_method_args.clone(), + call_fold_info.clone(), + call_fold_acc_type.clone(), + elem_type.clone(), + call_elem_provenance, + scope.clone(), + ); + v2_rt::concat( + Rc::new(vec![Rc::new(ArgInferResult { + typed_arg: make_arg_node( + arg_name_at( + first_arg.clone(), + scope.type_env.clone().source_indices.clone(), + ), + first_result.typed.clone(), + first_arg.span.clone(), + first_arg.span.clone(), + ), + diagnostics: first_result.diagnostics.clone(), + })]), + remaining_results, + ) + } + None => Rc::new(vec![]), + } + } else { + Rc::new({ + let mut __result = Vec::new(); + for pair in Rc::new( + call_args + .clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + { + __result.push({ + let a = pair.1.clone(); + let formal_param_type = match sig_params + .clone() + .get(pair.0.clone() as usize) + .cloned() + { + Some(p) => param_node_type_expr(&p), + None => type_variable_node("callable_param".to_string()), + }; + let has_formal = match sig_params + .clone() + .get(pair.0.clone() as usize) + .cloned() + { + Some(_) => true, + None => false, + }; + let expected = if has_formal.clone() { + Some(formal_param_type.clone()) + } else { + None + }; + let ar = infer_expr(&arg_value(&a), &scope, &expected); + Rc::new(ArgInferResult { + typed_arg: make_arg_node( + arg_name_at( + a.clone(), + scope.type_env.clone().source_indices.clone(), + ), + ar.typed.clone(), + a.span.clone(), + a.span.clone(), + ), + diagnostics: ar.diagnostics.clone(), + }) + }); + } + __result + }) + }; + let typed_args = Rc::new({ + let mut __result = Vec::new(); + for air in arg_infer_results.clone().iter().cloned() { + __result.push(air.typed_arg.clone()); + } + __result + }); + let arg_diags = Rc::new({ + let mut __result = Vec::new(); + for air in arg_infer_results.clone().iter().cloned() { + __result.extend((*air.diagnostics.clone()).iter().cloned()); + } + __result + }); + let typed_arg_nodes = typed_args.clone(); + if (sig.clone() != None) { + { + let resolved_type = match sig.clone() { + Some(s) => s.inferred.clone(), + None => error_type(), + }; + Rc::new(InferResult { + typed: make_named_expr_node( + &func_name, + Rc::new(ExprData::ExprCall { + call_semantics: Some(CallSemantics::PlainCallSemantics), + descent_evidence: None, + }), + typed_arg_nodes, + Some(Rc::new(InferredNode::Resolved { + node: resolved_type, + })), + span.clone(), + node_name_span(&texpr), + ), + diagnostics: arg_diags, + }) + } + } else { + { + let first_arg_type = match typed_args.clone().first().cloned() { + Some(ta) => resolved_type(arg_value(&ta)), + None => unit_type(), + }; + let method_receiver = match typed_args.clone().first().cloned() { + Some(ta) => arg_value(&ta), + None => internal_expr_error_node( + "method bridge missing receiver".to_string(), + span.clone(), + ), + }; + let call_acc_is_under_resolved = !is_fully_resolved( + &call_fold_acc_type, + &scope.type_env.clone().source_indices.clone(), + ); + let refined_call_fold_acc_type = + if ((call_fold_info.clone() != None) && call_acc_is_under_resolved) { + match Rc::new({ + let mut __result = Vec::new(); + for a in typed_args.clone().iter().cloned() { + if is_lambda_expr(arg_value(&a)) { + __result.push(a); + } + } + __result + }) + .first() + .cloned() + { + Some(lambda_arg) => resolved_type(arg_value(&lambda_arg)), + None => call_fold_acc_type.clone(), + } } else { - receiver.clone() + call_fold_acc_type.clone() }; -let remaining_arg_nodes = Rc::new({ let mut __result = Vec::new(); for ta in remaining.clone().iter().cloned() { __result.push(make_arg_node(arg_name_at(ta.clone(), scope.type_env.clone().source_indices.clone()), arg_value(&ta), span.clone(), span.clone())); } __result }); -Rc::new(InferResult { - typed: make_named_expr_node(&func_name, Rc::new(ExprData::ExprMethodCall { - method_semantics: method_resolution.semantics.clone(), -}), v2_rt::concat(Rc::new(vec![final_receiver]), remaining_arg_nodes), Some(Rc::new(InferredNode::Resolved { - node: bridge_result_type.clone(), -})), span.clone(), node_name_span(&texpr)), - diagnostics: v2_rt::concat(v2_rt::concat(arg_diags, method_resolution.diagnostics.clone()), template_subst_diags), -}) -} - } else { - if (func_name.clone().as_str() == "empty_map".to_string().as_str()) { + let method_resolution = resolve_known_method_node( + method_receiver.clone(), + &first_arg_type, + &func_name, + if (call_fold_info.clone() != None) { + Some(refined_call_fold_acc_type.clone()) + } else { + None + }, + scope.service_registry.clone(), + &scope.type_env.clone().source_indices.clone(), + ); + let is_known_method = (method_resolution.result_type.clone() != None); + if (is_known_method && ((typed_args.clone().len() as i64) > 0)) { { - let bare_m = bare_map_node(); -match expected.clone() { + let receiver = method_receiver.clone(); + let remaining = Rc::new( + typed_args + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ); + let base_result_type = match method_resolution.result_type.clone() { + Some(mt) => mt.clone(), + None => error_type(), + }; + let method_tv = if (method_resolution.semantics.clone() == None) { + Rc::new(KernelTypeBuild { + ty: base_result_type.clone(), + diagnostics: Rc::new(vec![]), + }) + } else { + match (*method_resolution.semantics.clone().clone().unwrap()) + .clone() + { + MethodSemantics::AlgebraMethodSemantics { + algebra_template: at, + .. + } => match at.clone() { + Some(t) => { + if (template_return_has_variables(t.clone()) + || !is_fully_resolved( + &base_result_type, + &scope + .type_env + .clone() + .source_indices + .clone(), + )) + { + { + let call_arg_types = Rc::new({ + let mut __result = Vec::new(); + for a in + remaining.clone().iter().cloned() + { + __result.push(resolved_type( + arg_value(&a), + )); + } + __result + }); + let fold_overrides = + if (call_fold_info.clone() != None) { + fold_override_map( + "FoldAccumulator".to_string(), + refined_call_fold_acc_type + .clone(), + ) + } else { + empty_override_map() + }; + resolve_type_variables_from_template( + &t, + call_arg_types, + &first_arg_type, + fold_overrides, + &scope + .type_env + .clone() + .source_indices + .clone(), + ) + } + } else { + Rc::new(KernelTypeBuild { + ty: base_result_type.clone(), + diagnostics: Rc::new(vec![]), + }) + } + } + None => Rc::new(KernelTypeBuild { + ty: base_result_type.clone(), + diagnostics: Rc::new(vec![]), + }), + }, + _ => Rc::new(KernelTypeBuild { + ty: base_result_type.clone(), + diagnostics: Rc::new(vec![]), + }), + } + }; + let bridge_result_type = method_tv.ty.clone(); + let template_subst_diags = method_tv.diagnostics.clone(); + let returns_receiver_self = if (method_resolution.semantics.clone() + == None) + { + false + } else { + match (*method_resolution.semantics.clone().clone().unwrap()) + .clone() + { + MethodSemantics::AlgebraMethodSemantics { + algebra_template: at, + .. + } => match at.clone() { + Some(t) => template_return_is_receiver_self(t.clone()), + None => false, + }, + _ => false, + } + }; + let final_receiver = if ((returns_receiver_self + && is_fully_resolved( + &bridge_result_type, + &scope.type_env.clone().source_indices.clone(), + )) + && !is_fully_resolved( + &first_arg_type, + &scope.type_env.clone().source_indices.clone(), + )) { + Rc::new(Node { + name: receiver.name.clone(), + span: receiver.span.clone(), + ident_span: receiver.ident_span.clone(), + children: bridge_result_type.children.clone(), + connective: receiver.connective.clone(), + params: receiver.params.clone(), + inferred: Some(Rc::new(InferredNode::Resolved { + node: bridge_result_type.clone(), + })), + return_cardinality: receiver.return_cardinality.clone(), + uses: receiver.uses.clone(), + body: receiver.body.clone(), + transport: receiver.transport.clone(), + properties: receiver.properties.clone(), + type_annotation: receiver.type_annotation.clone(), + is_self_recursive: receiver.is_self_recursive.clone(), + has_non_tail_self_call: receiver + .has_non_tail_self_call + .clone(), + match_pattern: receiver.match_pattern.clone(), + expr_data: receiver.expr_data.clone(), + ident: None, + }) + } else { + receiver.clone() + }; + let remaining_arg_nodes = Rc::new({ + let mut __result = Vec::new(); + for ta in remaining.clone().iter().cloned() { + __result.push(make_arg_node( + arg_name_at( + ta.clone(), + scope.type_env.clone().source_indices.clone(), + ), + arg_value(&ta), + span.clone(), + span.clone(), + )); + } + __result + }); + Rc::new(InferResult { + typed: make_named_expr_node( + &func_name, + Rc::new(ExprData::ExprMethodCall { + method_semantics: method_resolution.semantics.clone(), + }), + v2_rt::concat( + Rc::new(vec![final_receiver]), + remaining_arg_nodes, + ), + Some(Rc::new(InferredNode::Resolved { + node: bridge_result_type.clone(), + })), + span.clone(), + node_name_span(&texpr), + ), + diagnostics: v2_rt::concat( + v2_rt::concat( + arg_diags, + method_resolution.diagnostics.clone(), + ), + template_subst_diags, + ), + }) + } + } else { + if (func_name.clone().as_str() == "empty_map".to_string().as_str()) { + { + let bare_m = bare_map_node(); + match expected.clone() { Some(exp) => if node_is_keyed_collection(&exp, scope.type_env.clone().source_indices.clone()) { Rc::new(InferResult { typed: make_named_expr_node(&func_name, Rc::new(ExprData::ExprCall { @@ -1561,976 +2605,1758 @@ match bare_m { }), }, } -} - } else { - if (infer_builtin_call_type(func_name.clone()) != None) { - { - let tier2b = infer_tier2b_builtin_with_kernel_diags(&func_name, typed_args.clone(), scope.clone(), span.clone()); -let bt = tier2b.bt.clone(); -let call_semantics = if (func_name.clone().as_str() == "lookup".to_string().as_str()) { - Some(CallSemantics::LookupCallSemantics) - } else { - Some(CallSemantics::PlainCallSemantics) - }; -Rc::new(InferResult { - typed: make_named_expr_node(&func_name, Rc::new(ExprData::ExprCall { - call_semantics: call_semantics, - descent_evidence: None, -}), typed_arg_nodes, Some(Rc::new(InferredNode::Resolved { - node: bt, -})), span.clone(), node_name_span(&texpr)), - diagnostics: v2_rt::concat(arg_diags, tier2b.kernel_diags.clone()), -}) -} + } } else { - { - let callable_local = match v2_rt::map_get(&scope.locals.clone(), func_name.clone()) { - Some(binding) => if ((binding.resolved.clone().params.clone().len() as i64) > 0) { - Some(binding.resolved.clone()) - } else { - None - }, - None => None, -}; -if (callable_local.clone() != None) { - { - let callable_type = match callable_local.clone() { - Some(ct) => ct.clone(), - None => error_type(), -}; -let resolved_type = callable_inferred(&callable_type); -Rc::new(InferResult { - typed: make_named_expr_node(&func_name, Rc::new(ExprData::ExprCall { - call_semantics: Some(CallSemantics::PlainCallSemantics), - descent_evidence: None, -}), typed_arg_nodes, Some(Rc::new(InferredNode::Resolved { - node: resolved_type, -})), span.clone(), node_name_span(&texpr)), - diagnostics: arg_diags, -}) -} - } else { + if (infer_builtin_call_type(func_name.clone()) != None) { + { + let tier2b = infer_tier2b_builtin_with_kernel_diags( + &func_name, + typed_args.clone(), + scope.clone(), + span.clone(), + ); + let bt = tier2b.bt.clone(); + let call_semantics = if (func_name.clone().as_str() + == "lookup".to_string().as_str()) { - let type_match = lookup_type_by_name(&scope.type_env.clone(), func_name.clone()); -let resolved_type = match type_match.clone() { - Some(tn) => tn.clone(), - None => error_type(), -}; -let call_diags = match type_match.clone() { - Some(_) => Rc::new(vec![]), - None => Rc::new(vec![inference_error(v2_rt::concat(v2_rt::concat("function '".to_string(), func_name.clone()), "' not found in scope".to_string()), span.clone(), scope.module_name.clone())]), -}; -Rc::new(InferResult { - typed: make_named_expr_node(&func_name, Rc::new(ExprData::ExprCall { - call_semantics: Some(CallSemantics::PlainCallSemantics), - descent_evidence: None, -}), typed_arg_nodes, Some(Rc::new(InferredNode::Resolved { - node: resolved_type, -})), span.clone(), node_name_span(&texpr)), - diagnostics: v2_rt::concat(arg_diags, call_diags), -}) -} + Some(CallSemantics::LookupCallSemantics) + } else { + Some(CallSemantics::PlainCallSemantics) + }; + Rc::new(InferResult { + typed: make_named_expr_node( + &func_name, + Rc::new(ExprData::ExprCall { + call_semantics: call_semantics, + descent_evidence: None, + }), + typed_arg_nodes, + Some(Rc::new(InferredNode::Resolved { node: bt })), + span.clone(), + node_name_span(&texpr), + ), + diagnostics: v2_rt::concat( + arg_diags, + tier2b.kernel_diags.clone(), + ), + }) } -} + } else { + { + let callable_local = match v2_rt::map_get( + &scope.locals.clone(), + func_name.clone(), + ) { + Some(binding) => { + if ((binding.resolved.clone().params.clone().len() + as i64) + > 0) + { + Some(binding.resolved.clone()) + } else { + None + } + } + None => None, + }; + if (callable_local.clone() != None) { + { + let callable_type = match callable_local.clone() { + Some(ct) => ct.clone(), + None => error_type(), + }; + let resolved_type = + callable_inferred(&callable_type); + Rc::new(InferResult { + typed: make_named_expr_node( + &func_name, + Rc::new(ExprData::ExprCall { + call_semantics: Some( + CallSemantics::PlainCallSemantics, + ), + descent_evidence: None, + }), + typed_arg_nodes, + Some(Rc::new(InferredNode::Resolved { + node: resolved_type, + })), + span.clone(), + node_name_span(&texpr), + ), + diagnostics: arg_diags, + }) + } + } else { + { + let type_match = lookup_type_by_name( + &scope.type_env.clone(), + func_name.clone(), + ); + let resolved_type = match type_match.clone() { + Some(tn) => tn.clone(), + None => error_type(), + }; + let call_diags = match type_match.clone() { + Some(_) => Rc::new(vec![]), + None => Rc::new(vec![inference_error( + v2_rt::concat( + v2_rt::concat( + "function '".to_string(), + func_name.clone(), + ), + "' not found in scope".to_string(), + ), + span.clone(), + scope.module_name.clone(), + )]), + }; + Rc::new(InferResult { + typed: make_named_expr_node( + &func_name, + Rc::new(ExprData::ExprCall { + call_semantics: Some( + CallSemantics::PlainCallSemantics, + ), + descent_evidence: None, + }), + typed_arg_nodes, + Some(Rc::new(InferredNode::Resolved { + node: resolved_type, + })), + span.clone(), + node_name_span(&texpr), + ), + diagnostics: v2_rt::concat( + arg_diags, call_diags, + ), + }) + } + } + } + } } } } -} + } } -}, - ExprData::ExprMethodCall { .. } => { - let method_name = expr_method_name_at(texpr.clone(), scope.type_env.clone().source_indices.clone()); -let span = texpr.span.clone(); -let recv = method_receiver(texpr.clone()); -let mc_args = method_arg_nodes(texpr.clone()); -let recv_result = infer_expr(&recv, &scope, &None); -let recv_typed = recv_result.typed.clone(); -let recv_diags = recv_result.diagnostics.clone(); -let recv_rt = resolved_type(recv_typed.clone()); -let recv_elem_type = for_each_element_type_node(recv_rt.clone(), scope.type_env.clone().source_indices.clone()); -let mc_method_name = Some(method_name.clone()); -let fold_info = extract_fold_init_info(mc_method_name.clone(), &mc_args, 2, &scope, expected.clone()); -let fold_acc_type = match fold_info.clone() { - Some(fi) => resolved_type(arg_value(&fi.typed_arg.clone())), - None => error_type(), -}; -let mc_elem_provenance = derive_element_provenance(recv_typed.clone(), &recv_elem_type, &scope); -let mc_arg_infer_results = infer_method_args_with_fold(mc_method_name.clone(), mc_args.clone(), fold_info.clone(), fold_acc_type.clone(), recv_elem_type.clone(), mc_elem_provenance, scope.clone()); -let typed_mc_args = Rc::new({ let mut __result = Vec::new(); for air in mc_arg_infer_results.clone().iter().cloned() { __result.push(air.typed_arg.clone()); } __result }); -let mc_arg_diags = Rc::new({ let mut __result = Vec::new(); for air in mc_arg_infer_results.clone().iter().cloned() { __result.extend((*air.diagnostics.clone()).iter().cloned()); } __result }); -let mc_acc_is_under_resolved = !is_fully_resolved(&fold_acc_type, &scope.type_env.clone().source_indices.clone()); -let refined_fold_acc_type = if ((fold_info.clone() != None) && mc_acc_is_under_resolved) { - match Rc::new({ let mut __result = Vec::new(); for a in typed_mc_args.clone().iter().cloned() { if is_lambda_expr(arg_value(&a)) { __result.push(a); } } __result }).first().cloned() { - Some(lambda_arg) => resolved_type(arg_value(&lambda_arg)), - None => fold_acc_type.clone(), -} - } else { - fold_acc_type.clone() - }; -let method_resolution = resolve_known_method_node(recv_typed.clone(), &recv_rt, &method_name, if (fold_info.clone() != None) { - Some(refined_fold_acc_type.clone()) - } else { - None - }, scope.service_registry.clone(), &scope.type_env.clone().source_indices.clone()); -let pipe_fb = match method_resolution.result_type.clone() { - Some(rt) => Rc::new(MethodPipeFallback { - result_ty: rt.clone(), - kernel_diags: Rc::new(vec![]), -}), - None => method_pipe_map_keys_values_fallback(&recv_rt, &method_name, scope.clone(), span.clone()), -}; -let base_result_type = pipe_fb.result_ty.clone(); -let method_tv_mc = if (method_resolution.semantics.clone() == None) { - Rc::new(KernelTypeBuild { - ty: base_result_type.clone(), - diagnostics: Rc::new(vec![]), -}) - } else { - match (*method_resolution.semantics.clone().clone().unwrap()).clone() { - MethodSemantics::AlgebraMethodSemantics { algebra_template: at, .. } => match at.clone() { - Some(t) => if (template_return_has_variables(t.clone()) || !is_fully_resolved(&base_result_type, &scope.type_env.clone().source_indices.clone())) { - { - let mc_arg_types = Rc::new({ let mut __result = Vec::new(); for a in typed_mc_args.clone().iter().cloned() { __result.push(resolved_type(arg_value(&a))); } __result }); -let mc_fold_overrides = if (fold_info.clone() != None) { - fold_override_map("FoldAccumulator".to_string(), refined_fold_acc_type.clone()) - } else { - empty_override_map() - }; -resolve_type_variables_from_template(&t, mc_arg_types, &recv_rt, mc_fold_overrides, &scope.type_env.clone().source_indices.clone()) -} - } else { + ExprData::ExprMethodCall { .. } => { + let method_name = expr_method_name_at( + texpr.clone(), + scope.type_env.clone().source_indices.clone(), + ); + let span = texpr.span.clone(); + let recv = method_receiver(texpr.clone()); + let mc_args = method_arg_nodes(texpr.clone()); + let recv_result = infer_expr(&recv, &scope, &None); + let recv_typed = recv_result.typed.clone(); + let recv_diags = recv_result.diagnostics.clone(); + let recv_rt = resolved_type(recv_typed.clone()); + let recv_elem_type = for_each_element_type_node( + recv_rt.clone(), + scope.type_env.clone().source_indices.clone(), + ); + let mc_method_name = Some(method_name.clone()); + let fold_info = extract_fold_init_info( + mc_method_name.clone(), + &mc_args, + 2, + &scope, + expected.clone(), + ); + let fold_acc_type = match fold_info.clone() { + Some(fi) => resolved_type(arg_value(&fi.typed_arg.clone())), + None => error_type(), + }; + let mc_elem_provenance = + derive_element_provenance(recv_typed.clone(), &recv_elem_type, &scope); + let mc_arg_infer_results = infer_method_args_with_fold( + mc_method_name.clone(), + mc_args.clone(), + fold_info.clone(), + fold_acc_type.clone(), + recv_elem_type.clone(), + mc_elem_provenance, + scope.clone(), + ); + let typed_mc_args = Rc::new({ + let mut __result = Vec::new(); + for air in mc_arg_infer_results.clone().iter().cloned() { + __result.push(air.typed_arg.clone()); + } + __result + }); + let mc_arg_diags = Rc::new({ + let mut __result = Vec::new(); + for air in mc_arg_infer_results.clone().iter().cloned() { + __result.extend((*air.diagnostics.clone()).iter().cloned()); + } + __result + }); + let mc_acc_is_under_resolved = !is_fully_resolved( + &fold_acc_type, + &scope.type_env.clone().source_indices.clone(), + ); + let refined_fold_acc_type = + if ((fold_info.clone() != None) && mc_acc_is_under_resolved) { + match Rc::new({ + let mut __result = Vec::new(); + for a in typed_mc_args.clone().iter().cloned() { + if is_lambda_expr(arg_value(&a)) { + __result.push(a); + } + } + __result + }) + .first() + .cloned() + { + Some(lambda_arg) => resolved_type(arg_value(&lambda_arg)), + None => fold_acc_type.clone(), + } + } else { + fold_acc_type.clone() + }; + let method_resolution = resolve_known_method_node( + recv_typed.clone(), + &recv_rt, + &method_name, + if (fold_info.clone() != None) { + Some(refined_fold_acc_type.clone()) + } else { + None + }, + scope.service_registry.clone(), + &scope.type_env.clone().source_indices.clone(), + ); + let pipe_fb = match method_resolution.result_type.clone() { + Some(rt) => Rc::new(MethodPipeFallback { + result_ty: rt.clone(), + kernel_diags: Rc::new(vec![]), + }), + None => method_pipe_map_keys_values_fallback( + &recv_rt, + &method_name, + scope.clone(), + span.clone(), + ), + }; + let base_result_type = pipe_fb.result_ty.clone(); + let method_tv_mc = if (method_resolution.semantics.clone() == None) { Rc::new(KernelTypeBuild { - ty: base_result_type.clone(), - diagnostics: Rc::new(vec![]), -}) - }, - None => Rc::new(KernelTypeBuild { - ty: base_result_type.clone(), - diagnostics: Rc::new(vec![]), -}), -}, - _ => Rc::new(KernelTypeBuild { - ty: base_result_type.clone(), - diagnostics: Rc::new(vec![]), -}), -} - }; -let result_type = method_tv_mc.ty.clone(); -let mc_template_diags = method_tv_mc.diagnostics.clone(); -let method_semantics = if (method_resolution.semantics.clone() != None) { - method_resolution.semantics.clone() - } else { - Some(Rc::new(MethodSemantics::PlainMethodSemantics)) - }; -let typed_mc_arg_nodes = typed_mc_args.clone(); -let mc_texpr = make_named_expr_node(&method_name, Rc::new(ExprData::ExprMethodCall { - method_semantics: method_semantics, -}), v2_rt::concat(Rc::new(vec![recv_typed.clone()]), typed_mc_arg_nodes), Some(Rc::new(InferredNode::Resolved { - node: result_type, -})), span.clone(), node_name_span(&texpr)); -Rc::new(InferResult { - typed: mc_texpr, - diagnostics: v2_rt::concat(v2_rt::concat(v2_rt::concat(recv_diags, mc_arg_diags), pipe_fb.kernel_diags.clone()), v2_rt::concat(method_resolution.diagnostics.clone(), mc_template_diags)), -}) -}, - ExprData::ExprMatch => { - let span = texpr.span.clone(); -let scrut = match_scrutinee(texpr.clone()); -let arm_nodes = match_arm_nodes(texpr.clone()); -let scrut_result = infer_expr(&scrut, &scope, &None); -let scrut_typed = scrut_result.typed.clone(); -let scrut_diags = scrut_result.diagnostics.clone(); -let scrut_rt = resolved_type(scrut_typed.clone()); -let scrut_subject = pattern_subject_from_inferred(scrut_typed.inferred.clone()); -let scrut_provenance = classify_binding_provenance(&scrut, &scope); -let arm_infer_results = Rc::new({ let mut __result = Vec::new(); for arm_node in arm_nodes.clone().iter().cloned() { __result.push({ - let arm_pat = arm_pattern(arm_node.clone()); -let arm_g = arm_guard(&arm_node); -let arm_b = arm_body(&arm_node); -let typed_pattern = annotate_pattern_parent_enums(arm_pat.clone(), scrut_subject.clone(), &scope); -let pattern_result = extend_scope_with_pattern_node(&scope, typed_pattern.clone(), &scrut_subject, scrut_provenance.clone()); -let arm_scope = pattern_result.scope.clone(); -let pattern_diags = pattern_result.diagnostics.clone(); -let guard_result = if (arm_g.clone() != None) { - Some(infer_expr(&arm_g.clone().unwrap(), &arm_scope, &None)) + ty: base_result_type.clone(), + diagnostics: Rc::new(vec![]), + }) } else { - None + match (*method_resolution.semantics.clone().clone().unwrap()).clone() { + MethodSemantics::AlgebraMethodSemantics { + algebra_template: at, + .. + } => match at.clone() { + Some(t) => { + if (template_return_has_variables(t.clone()) + || !is_fully_resolved( + &base_result_type, + &scope.type_env.clone().source_indices.clone(), + )) + { + { + let mc_arg_types = Rc::new({ + let mut __result = Vec::new(); + for a in typed_mc_args.clone().iter().cloned() { + __result.push(resolved_type(arg_value(&a))); + } + __result + }); + let mc_fold_overrides = if (fold_info.clone() != None) { + fold_override_map( + "FoldAccumulator".to_string(), + refined_fold_acc_type.clone(), + ) + } else { + empty_override_map() + }; + resolve_type_variables_from_template( + &t, + mc_arg_types, + &recv_rt, + mc_fold_overrides, + &scope.type_env.clone().source_indices.clone(), + ) + } + } else { + Rc::new(KernelTypeBuild { + ty: base_result_type.clone(), + diagnostics: Rc::new(vec![]), + }) + } + } + None => Rc::new(KernelTypeBuild { + ty: base_result_type.clone(), + diagnostics: Rc::new(vec![]), + }), + }, + _ => Rc::new(KernelTypeBuild { + ty: base_result_type.clone(), + diagnostics: Rc::new(vec![]), + }), + } }; -let body_result = infer_expr(&arm_b, &arm_scope, &expected); -let body_typed = body_result.typed.clone(); -let body_diags = body_result.diagnostics.clone(); -let guard_unwrapped = match guard_result.clone() { - Some(gr) => gr.clone(), - None => Rc::new(InferResult { - typed: arm_b.clone(), - diagnostics: Rc::new(vec![]), -}), -}; -let guard_diags = if (guard_result.clone() != None) { - guard_unwrapped.diagnostics.clone() + let result_type = method_tv_mc.ty.clone(); + let mc_template_diags = method_tv_mc.diagnostics.clone(); + let method_semantics = if (method_resolution.semantics.clone() != None) { + method_resolution.semantics.clone() } else { - Rc::new(vec![]) + Some(Rc::new(MethodSemantics::PlainMethodSemantics)) }; -Rc::new(ArmInferResult { - typed_arm: make_arm_node(typed_pattern.clone(), if (guard_result.clone() != None) { - Some(guard_unwrapped.typed.clone()) - } else { - None - }, body_typed.clone(), span.clone()), - diagnostics: v2_rt::concat(pattern_diags.clone(), v2_rt::concat(guard_diags.clone(), body_diags.clone())), - body_type: resolved_type(body_typed.clone()), -}) -}); } __result }); -let arm_body_types = Rc::new({ let mut __result = Vec::new(); for ar in arm_infer_results.clone().iter().cloned() { __result.push(ar.body_type.clone()); } __result }); -let unified_arm_type = match arm_body_types.clone().first().cloned() { - Some(first_type) => Rc::new(arm_body_types.clone().iter().cloned().skip(1 as usize).collect::>()).iter().cloned().fold(first_type, |acc: Rc, t: Rc| prefer_specific_type(acc, t.clone(), &scope.type_env.clone().source_indices.clone())), - None => scrut_rt.clone(), -}; -let arm_infer_results = if is_fully_resolved(&unified_arm_type, &scope.type_env.clone().source_indices.clone()) { - Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(arm_nodes.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { __result.push({ - let idx = pair.0.clone(); -let arm_node = pair.1.clone(); -let original_list = Rc::new({ let mut __result = Vec::new(); for ap in Rc::new({ let mut __result = Vec::new(); for ap in Rc::new(arm_infer_results.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { if (ap.0.clone() == idx.clone()) { __result.push(ap); } } __result }).iter().cloned() { __result.push(ap.1.clone()); } __result }); -let original = match original_list.clone().first().cloned() { - Some(ar) => ar.clone(), - None => Rc::new(ArmInferResult { - typed_arm: arm_node.clone(), - diagnostics: Rc::new(vec![]), - body_type: scrut_rt.clone(), -}), -}; -if !is_fully_resolved(&original.body_type.clone(), &scope.type_env.clone().source_indices.clone()) { - { + let typed_mc_arg_nodes = typed_mc_args.clone(); + let mc_texpr = make_named_expr_node( + &method_name, + Rc::new(ExprData::ExprMethodCall { + method_semantics: method_semantics, + }), + v2_rt::concat(Rc::new(vec![recv_typed.clone()]), typed_mc_arg_nodes), + Some(Rc::new(InferredNode::Resolved { node: result_type })), + span.clone(), + node_name_span(&texpr), + ); + Rc::new(InferResult { + typed: mc_texpr, + diagnostics: v2_rt::concat( + v2_rt::concat( + v2_rt::concat(recv_diags, mc_arg_diags), + pipe_fb.kernel_diags.clone(), + ), + v2_rt::concat(method_resolution.diagnostics.clone(), mc_template_diags), + ), + }) + } + ExprData::ExprMatch => { + let span = texpr.span.clone(); + let scrut = match_scrutinee(texpr.clone()); + let arm_nodes = match_arm_nodes(texpr.clone()); + let scrut_result = infer_expr(&scrut, &scope, &None); + let scrut_typed = scrut_result.typed.clone(); + let scrut_diags = scrut_result.diagnostics.clone(); + let scrut_rt = resolved_type(scrut_typed.clone()); + let scrut_subject = pattern_subject_from_inferred(scrut_typed.inferred.clone()); + let scrut_provenance = classify_binding_provenance(&scrut, &scope); + let arm_infer_results = Rc::new({ + let mut __result = Vec::new(); + for arm_node in arm_nodes.clone().iter().cloned() { + __result.push({ let arm_pat = arm_pattern(arm_node.clone()); -let arm_g = arm_guard(&arm_node); -let arm_b = arm_body(&arm_node); -let typed_pattern = annotate_pattern_parent_enums(arm_pat.clone(), scrut_subject.clone(), &scope); -let pattern_result = extend_scope_with_pattern_node(&scope, typed_pattern.clone(), &scrut_subject, scrut_provenance.clone()); -let arm_scope = pattern_result.scope.clone(); -let pattern_diags = pattern_result.diagnostics.clone(); -let guard_result = if (arm_g.clone() != None) { + let arm_g = arm_guard(&arm_node); + let arm_b = arm_body(&arm_node); + let typed_pattern = annotate_pattern_parent_enums( + arm_pat.clone(), + scrut_subject.clone(), + &scope, + ); + let pattern_result = extend_scope_with_pattern_node( + &scope, + typed_pattern.clone(), + &scrut_subject, + scrut_provenance.clone(), + ); + let arm_scope = pattern_result.scope.clone(); + let pattern_diags = pattern_result.diagnostics.clone(); + let guard_result = if (arm_g.clone() != None) { Some(infer_expr(&arm_g.clone().unwrap(), &arm_scope, &None)) } else { None }; -let body_result = infer_expr(&arm_b, &arm_scope, &Some(unified_arm_type.clone())); -let body_typed = body_result.typed.clone(); -let body_diags = body_result.diagnostics.clone(); -let guard_unwrapped = match guard_result.clone() { - Some(gr) => gr.clone(), - None => Rc::new(InferResult { - typed: arm_b.clone(), - diagnostics: Rc::new(vec![]), -}), -}; -let guard_diags = if (guard_result.clone() != None) { + let body_result = infer_expr(&arm_b, &arm_scope, &expected); + let body_typed = body_result.typed.clone(); + let body_diags = body_result.diagnostics.clone(); + let guard_unwrapped = match guard_result.clone() { + Some(gr) => gr.clone(), + None => Rc::new(InferResult { + typed: arm_b.clone(), + diagnostics: Rc::new(vec![]), + }), + }; + let guard_diags = if (guard_result.clone() != None) { guard_unwrapped.diagnostics.clone() } else { Rc::new(vec![]) }; -Rc::new(ArmInferResult { - typed_arm: make_arm_node(typed_pattern.clone(), if (guard_result.clone() != None) { - Some(guard_unwrapped.typed.clone()) - } else { - None - }, body_typed.clone(), span.clone()), - diagnostics: v2_rt::concat(pattern_diags.clone(), v2_rt::concat(guard_diags.clone(), body_diags.clone())), - body_type: resolved_type(body_typed.clone()), -}) -} - } else { - original.clone() + Rc::new(ArmInferResult { + typed_arm: make_arm_node( + typed_pattern.clone(), + if (guard_result.clone() != None) { + Some(guard_unwrapped.typed.clone()) + } else { + None + }, + body_typed.clone(), + span.clone(), + ), + diagnostics: v2_rt::concat( + pattern_diags.clone(), + v2_rt::concat(guard_diags.clone(), body_diags.clone()), + ), + body_type: resolved_type(body_typed.clone()), + }) + }); } -}); } __result }) - } else { - arm_infer_results.clone() - }; -let typed_arms = Rc::new({ let mut __result = Vec::new(); for ar in arm_infer_results.clone().iter().cloned() { __result.push(ar.typed_arm.clone()); } __result }); -let arm_diags = Rc::new({ let mut __result = Vec::new(); for ar in arm_infer_results.clone().iter().cloned() { __result.extend((*ar.diagnostics.clone()).iter().cloned()); } __result }); -let result_type = unified_arm_type.clone(); -let empty_arms_diags = if ((arm_infer_results.clone().len() as i64) == 0) { - Rc::new(vec![inference_error("match expression has no arms".to_string(), span.clone(), scope.module_name.clone())]) - } else { - Rc::new(vec![]) - }; -let exhaustiveness_diags = match (*resolve_pattern_subject(scope.clone(), scrut_subject.clone())).clone() { - PatternSubject::PatternResolved { node: resolved_scrutinee, .. } => check_match_exhaustiveness(&resolved_scrutinee, &typed_arms, &scope.type_env.clone(), span.clone(), scope.module_name.clone()), - PatternSubject::PatternDynamic { .. } => Rc::new(vec![]), - PatternSubject::PatternLookupBlocked => Rc::new(vec![]), -}; -let match_texpr = make_expr_node(Rc::new(ExprData::ExprMatch), v2_rt::concat(Rc::new(vec![scrut_typed.clone()]), typed_arms.clone()), Some(Rc::new(InferredNode::Resolved { - node: result_type, -})), span.clone()); -Rc::new(InferResult { - typed: match_texpr, - diagnostics: v2_rt::concat(v2_rt::concat(v2_rt::concat(scrut_diags, arm_diags), empty_arms_diags), exhaustiveness_diags), -}) -}, - ExprData::ExprIf => { - let span = texpr.span.clone(); -let cond = if_condition(texpr.clone()); -let then_expr = if_then_branch(texpr.clone()); -let else_expr = if_else_branch(texpr.clone()); -let cond_result = infer_expr(&cond, &scope, &None); -let cond_typed = cond_result.typed.clone(); -let cond_diags = cond_result.diagnostics.clone(); -let then_result = infer_expr(&then_expr, &scope, &expected); -let then_typed = then_result.typed.clone(); -let then_diags = then_result.diagnostics.clone(); -match else_expr { - Some(else_branch) => { - let else_result = infer_expr(&else_branch, &scope, &expected); -let then_rt = resolved_type(then_result.typed.clone()); -let else_rt = resolved_type(else_result.typed.clone()); -let then_result = if (!is_fully_resolved(&then_rt, &scope.type_env.clone().source_indices.clone()) && is_fully_resolved(&else_rt, &scope.type_env.clone().source_indices.clone())) { - infer_expr(&then_expr, &scope, &Some(else_rt.clone())) - } else { - then_result.clone() + __result + }); + let arm_body_types = Rc::new({ + let mut __result = Vec::new(); + for ar in arm_infer_results.clone().iter().cloned() { + __result.push(ar.body_type.clone()); + } + __result + }); + let unified_arm_type = match arm_body_types.clone().first().cloned() { + Some(first_type) => Rc::new( + arm_body_types + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ) + .iter() + .cloned() + .fold(first_type, |acc: Rc, t: Rc| { + prefer_specific_type( + acc, + t.clone(), + &scope.type_env.clone().source_indices.clone(), + ) + }), + None => scrut_rt.clone(), }; -let else_result = if (!is_fully_resolved(&else_rt, &scope.type_env.clone().source_indices.clone()) && is_fully_resolved(&then_rt, &scope.type_env.clone().source_indices.clone())) { - infer_expr(&else_branch, &scope, &Some(then_rt.clone())) + let arm_infer_results = if is_fully_resolved( + &unified_arm_type, + &scope.type_env.clone().source_indices.clone(), + ) { + Rc::new({ + let mut __result = Vec::new(); + for pair in Rc::new( + arm_nodes + .clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + { + __result.push({ + let idx = pair.0.clone(); + let arm_node = pair.1.clone(); + let original_list = Rc::new({ + let mut __result = Vec::new(); + for ap in Rc::new({ + let mut __result = Vec::new(); + for ap in Rc::new( + arm_infer_results + .clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + { + if (ap.0.clone() == idx.clone()) { + __result.push(ap); + } + } + __result + }) + .iter() + .cloned() + { + __result.push(ap.1.clone()); + } + __result + }); + let original = match original_list.clone().first().cloned() { + Some(ar) => ar.clone(), + None => Rc::new(ArmInferResult { + typed_arm: arm_node.clone(), + diagnostics: Rc::new(vec![]), + body_type: scrut_rt.clone(), + }), + }; + if !is_fully_resolved( + &original.body_type.clone(), + &scope.type_env.clone().source_indices.clone(), + ) { + { + let arm_pat = arm_pattern(arm_node.clone()); + let arm_g = arm_guard(&arm_node); + let arm_b = arm_body(&arm_node); + let typed_pattern = annotate_pattern_parent_enums( + arm_pat.clone(), + scrut_subject.clone(), + &scope, + ); + let pattern_result = extend_scope_with_pattern_node( + &scope, + typed_pattern.clone(), + &scrut_subject, + scrut_provenance.clone(), + ); + let arm_scope = pattern_result.scope.clone(); + let pattern_diags = pattern_result.diagnostics.clone(); + let guard_result = if (arm_g.clone() != None) { + Some(infer_expr( + &arm_g.clone().unwrap(), + &arm_scope, + &None, + )) + } else { + None + }; + let body_result = infer_expr( + &arm_b, + &arm_scope, + &Some(unified_arm_type.clone()), + ); + let body_typed = body_result.typed.clone(); + let body_diags = body_result.diagnostics.clone(); + let guard_unwrapped = match guard_result.clone() { + Some(gr) => gr.clone(), + None => Rc::new(InferResult { + typed: arm_b.clone(), + diagnostics: Rc::new(vec![]), + }), + }; + let guard_diags = if (guard_result.clone() != None) { + guard_unwrapped.diagnostics.clone() + } else { + Rc::new(vec![]) + }; + Rc::new(ArmInferResult { + typed_arm: make_arm_node( + typed_pattern.clone(), + if (guard_result.clone() != None) { + Some(guard_unwrapped.typed.clone()) + } else { + None + }, + body_typed.clone(), + span.clone(), + ), + diagnostics: v2_rt::concat( + pattern_diags.clone(), + v2_rt::concat( + guard_diags.clone(), + body_diags.clone(), + ), + ), + body_type: resolved_type(body_typed.clone()), + }) + } + } else { + original.clone() + } + }); + } + __result + }) } else { - else_result.clone() + arm_infer_results.clone() }; -let then_typed = then_result.typed.clone(); -let then_diags = then_result.diagnostics.clone(); -let else_typed = else_result.typed.clone(); -let else_diags = else_result.diagnostics.clone(); -let then_rt = resolved_type(then_typed.clone()); -let else_rt = resolved_type(else_typed.clone()); -let unified = prefer_specific_type(then_rt.clone(), else_rt.clone(), &scope.type_env.clone().source_indices.clone()); -let branch_diags = if node_type_compatible(then_rt.clone(), else_rt.clone(), scope.type_env.clone().source_indices.clone()) { - Rc::new(vec![]) + let typed_arms = Rc::new({ + let mut __result = Vec::new(); + for ar in arm_infer_results.clone().iter().cloned() { + __result.push(ar.typed_arm.clone()); + } + __result + }); + let arm_diags = Rc::new({ + let mut __result = Vec::new(); + for ar in arm_infer_results.clone().iter().cloned() { + __result.extend((*ar.diagnostics.clone()).iter().cloned()); + } + __result + }); + let result_type = unified_arm_type.clone(); + let empty_arms_diags = if ((arm_infer_results.clone().len() as i64) == 0) { + Rc::new(vec![inference_error( + "match expression has no arms".to_string(), + span.clone(), + scope.module_name.clone(), + )]) } else { - Rc::new(vec![inference_error(v2_rt::concat(v2_rt::concat(v2_rt::concat("if branches resolve to incompatible types: ".to_string(), node_type_shape(&then_rt, &scope.type_env.clone().source_indices.clone())), " vs ".to_string()), node_type_shape(&else_rt, &scope.type_env.clone().source_indices.clone())), span.clone(), scope.module_name.clone())]) + Rc::new(vec![]) }; -let if_texpr = make_expr_node(Rc::new(ExprData::ExprIf), Rc::new(vec![cond_typed, then_typed.clone(), else_typed.clone()]), Some(Rc::new(InferredNode::Resolved { - node: unified, -})), span.clone()); -Rc::new(InferResult { - typed: if_texpr, - diagnostics: v2_rt::concat(v2_rt::concat(v2_rt::concat(cond_diags, then_diags), else_diags), branch_diags), -}) -}, - None => { - let if_texpr2 = make_expr_node(Rc::new(ExprData::ExprIf), Rc::new(vec![cond_typed, then_typed.clone()]), Some(Rc::new(InferredNode::Resolved { - node: unit_type(), -})), span.clone()); -Rc::new(InferResult { - typed: if_texpr2, - diagnostics: v2_rt::concat(cond_diags, then_diags), -}) -}, -} -}, - ExprData::ExprLet => { - let let_name = let_binding_name_at(texpr.clone(), scope.type_env.clone().source_indices.clone()); -let span = texpr.span.clone(); -let val_expr = let_value(texpr.clone()); -let body_expr = let_body(texpr.clone()); -let is_tail_return = match body_expr.clone() { - Some(bd) => match (*bd.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => (authored_name_at(scope.type_env.clone().source_indices.clone(), &bd).as_str() == let_name.clone().as_str()), - _ => false, -}, - None => false, -}; -let val_expected = if is_tail_return { - expected.clone() - } else { - None - }; -let val_result = infer_expr(&val_expr, &scope, &val_expected); -let val_typed = val_result.typed.clone(); -let val_diags = val_result.diagnostics.clone(); -let val_type = resolved_type(val_typed.clone()); -if (body_expr.clone() == None) { - { - let let_texpr = make_named_expr_node(&let_name, Rc::new(ExprData::ExprLet), Rc::new(vec![val_typed.clone()]), Some(Rc::new(InferredNode::Resolved { - node: val_type, -})), span.clone(), node_name_span(&texpr)); -Rc::new(InferResult { - typed: let_texpr, - diagnostics: val_diags, -}) -} - } else { + let exhaustiveness_diags = match (*resolve_pattern_subject( + scope.clone(), + scrut_subject.clone(), + )) + .clone() { - let extended = extend_scope(&scope, &let_name, val_type, classify_binding_provenance(&val_typed, &scope)); -let body_result = infer_expr(&body_expr.clone().unwrap(), &extended, &expected); -let body_typed = body_result.typed.clone(); -let body_diags = body_result.diagnostics.clone(); -let let_texpr2 = make_named_expr_node(&let_name, Rc::new(ExprData::ExprLet), Rc::new(vec![val_typed.clone(), body_typed.clone()]), body_typed.inferred.clone(), span.clone(), node_name_span(&texpr)); -Rc::new(InferResult { - typed: let_texpr2, - diagnostics: v2_rt::concat(val_diags, body_diags.clone()), -}) -} + PatternSubject::PatternResolved { + node: resolved_scrutinee, + .. + } => check_match_exhaustiveness( + &resolved_scrutinee, + &typed_arms, + &scope.type_env.clone(), + span.clone(), + scope.module_name.clone(), + ), + PatternSubject::PatternDynamic { .. } => Rc::new(vec![]), + PatternSubject::PatternLookupBlocked => Rc::new(vec![]), + }; + let match_texpr = make_expr_node( + Rc::new(ExprData::ExprMatch), + v2_rt::concat(Rc::new(vec![scrut_typed.clone()]), typed_arms.clone()), + Some(Rc::new(InferredNode::Resolved { node: result_type })), + span.clone(), + ); + Rc::new(InferResult { + typed: match_texpr, + diagnostics: v2_rt::concat( + v2_rt::concat(v2_rt::concat(scrut_diags, arm_diags), empty_arms_diags), + exhaustiveness_diags, + ), + }) } -}, - ExprData::ExprRecordLit { .. } => { - let span = texpr.span.clone(); -let field_inits = texpr.children.clone(); -infer_record_lit(&record_lit_type_name_at(texpr.clone(), scope.type_env.clone().source_indices.clone()), field_inits, &span, node_name_span(&texpr), &scope) -}, - ExprData::ExprListLit => { - let span = texpr.span.clone(); -let elements = texpr.children.clone(); -let elem_expected = match expected.clone() { - Some(exp) => if node_is_element_collection(&exp, scope.type_env.clone().source_indices.clone()) { - match exp.children.clone().first().cloned() { - Some(elem) => Some(child_type_node(&elem)), - None => None, -} - } else { - None - }, - None => None, -}; -let elem_results = Rc::new({ let mut __result = Vec::new(); for e in elements.iter().cloned() { __result.push(infer_expr(&e, &scope, &elem_expected)); } __result }); -let typed_elements = Rc::new({ let mut __result = Vec::new(); for r in elem_results.clone().iter().cloned() { __result.push(r.typed.clone()); } __result }); -let elem_diags = Rc::new({ let mut __result = Vec::new(); for r in elem_results.clone().iter().cloned() { __result.extend((*r.diagnostics.clone()).iter().cloned()); } __result }); -let elem_type_node = if ((elem_results.clone().len() as i64) > 0) { - match elem_results.clone().first().cloned() { - Some(r) => resolved_type(r.typed.clone()), - None => unit_type(), -} - } else { - match expected.clone() { - Some(exp) => if node_is_element_collection(&exp, scope.type_env.clone().source_indices.clone()) { - match exp.children.clone().first().cloned() { - Some(elem) => child_type_node(&elem), - None => unit_type(), -} + ExprData::ExprIf => { + let span = texpr.span.clone(); + let cond = if_condition(texpr.clone()); + let then_expr = if_then_branch(texpr.clone()); + let else_expr = if_else_branch(texpr.clone()); + let cond_result = infer_expr(&cond, &scope, &None); + let cond_typed = cond_result.typed.clone(); + let cond_diags = cond_result.diagnostics.clone(); + let then_result = infer_expr(&then_expr, &scope, &expected); + let then_typed = then_result.typed.clone(); + let then_diags = then_result.diagnostics.clone(); + match else_expr { + Some(else_branch) => { + let else_result = infer_expr(&else_branch, &scope, &expected); + let then_rt = resolved_type(then_result.typed.clone()); + let else_rt = resolved_type(else_result.typed.clone()); + let then_result = if (!is_fully_resolved( + &then_rt, + &scope.type_env.clone().source_indices.clone(), + ) && is_fully_resolved( + &else_rt, + &scope.type_env.clone().source_indices.clone(), + )) { + infer_expr(&then_expr, &scope, &Some(else_rt.clone())) + } else { + then_result.clone() + }; + let else_result = if (!is_fully_resolved( + &else_rt, + &scope.type_env.clone().source_indices.clone(), + ) && is_fully_resolved( + &then_rt, + &scope.type_env.clone().source_indices.clone(), + )) { + infer_expr(&else_branch, &scope, &Some(then_rt.clone())) + } else { + else_result.clone() + }; + let then_typed = then_result.typed.clone(); + let then_diags = then_result.diagnostics.clone(); + let else_typed = else_result.typed.clone(); + let else_diags = else_result.diagnostics.clone(); + let then_rt = resolved_type(then_typed.clone()); + let else_rt = resolved_type(else_typed.clone()); + let unified = prefer_specific_type( + then_rt.clone(), + else_rt.clone(), + &scope.type_env.clone().source_indices.clone(), + ); + let branch_diags = if node_type_compatible( + then_rt.clone(), + else_rt.clone(), + scope.type_env.clone().source_indices.clone(), + ) { + Rc::new(vec![]) + } else { + Rc::new(vec![inference_error( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "if branches resolve to incompatible types: " + .to_string(), + node_type_shape( + &then_rt, + &scope.type_env.clone().source_indices.clone(), + ), + ), + " vs ".to_string(), + ), + node_type_shape( + &else_rt, + &scope.type_env.clone().source_indices.clone(), + ), + ), + span.clone(), + scope.module_name.clone(), + )]) + }; + let if_texpr = make_expr_node( + Rc::new(ExprData::ExprIf), + Rc::new(vec![cond_typed, then_typed.clone(), else_typed.clone()]), + Some(Rc::new(InferredNode::Resolved { node: unified })), + span.clone(), + ); + Rc::new(InferResult { + typed: if_texpr, + diagnostics: v2_rt::concat( + v2_rt::concat(v2_rt::concat(cond_diags, then_diags), else_diags), + branch_diags, + ), + }) + } + None => { + let if_texpr2 = make_expr_node( + Rc::new(ExprData::ExprIf), + Rc::new(vec![cond_typed, then_typed.clone()]), + Some(Rc::new(InferredNode::Resolved { node: unit_type() })), + span.clone(), + ); + Rc::new(InferResult { + typed: if_texpr2, + diagnostics: v2_rt::concat(cond_diags, then_diags), + }) + } + } + } + ExprData::ExprLet => { + let let_name = let_binding_name_at( + texpr.clone(), + scope.type_env.clone().source_indices.clone(), + ); + let span = texpr.span.clone(); + let val_expr = let_value(texpr.clone()); + let body_expr = let_body(texpr.clone()); + let is_tail_return = match body_expr.clone() { + Some(bd) => match (*bd.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + (authored_name_at(scope.type_env.clone().source_indices.clone(), &bd) + .as_str() + == let_name.clone().as_str()) + } + _ => false, + }, + None => false, + }; + let val_expected = if is_tail_return { + expected.clone() } else { - unit_type() - }, - None => unit_type(), -} - }; -let empty_list_diags = if ((elem_results.clone().len() as i64) == 0) { - match expected.clone() { - Some(exp) => if node_is_element_collection(&exp, scope.type_env.clone().source_indices.clone()) { - match exp.children.clone().first().cloned() { - Some(_) => Rc::new(vec![]), - None => Rc::new(vec![inference_error("empty list literal: expected type has no element type".to_string(), span.clone(), scope.module_name.clone())]), -} + None + }; + let val_result = infer_expr(&val_expr, &scope, &val_expected); + let val_typed = val_result.typed.clone(); + let val_diags = val_result.diagnostics.clone(); + let val_type = resolved_type(val_typed.clone()); + if (body_expr.clone() == None) { + { + let let_texpr = make_named_expr_node( + &let_name, + Rc::new(ExprData::ExprLet), + Rc::new(vec![val_typed.clone()]), + Some(Rc::new(InferredNode::Resolved { node: val_type })), + span.clone(), + node_name_span(&texpr), + ); + Rc::new(InferResult { + typed: let_texpr, + diagnostics: val_diags, + }) + } } else { - Rc::new(vec![inference_error("empty list literal: expected type is not a collection".to_string(), span.clone(), scope.module_name.clone())]) - }, - None => Rc::new(vec![]), -} - } else { - Rc::new(vec![]) - }; -let list_k = list_kernel_ty_from_element(elem_type_node.clone()); -let ll_texpr = make_expr_node(Rc::new(ExprData::ExprListLit), typed_elements, Some(Rc::new(InferredNode::Resolved { - node: list_k.ty.clone(), -})), span.clone()); -Rc::new(InferResult { - typed: ll_texpr, - diagnostics: v2_rt::concat(v2_rt::concat(elem_diags, empty_list_diags), list_k.miss_diags.clone()), -}) -}, - ExprData::ExprBinOp { op, .. } => { - let span = texpr.span.clone(); -let left_expr = binop_left(texpr.clone()); -let right_expr = binop_right(texpr.clone()); -let left_result = infer_expr(&left_expr, &scope, &None); -let left_typed = left_result.typed.clone(); -let left_diags = left_result.diagnostics.clone(); -let right_result = infer_expr(&right_expr, &scope, &None); -let right_typed = right_result.typed.clone(); -let right_diags = right_result.diagnostics.clone(); -let binop_info = infer_binop_type_node(&op, &resolved_type(left_typed.clone()), scope.type_env.clone().source_indices.clone()); -let bo_texpr = make_expr_node(Rc::new(ExprData::ExprBinOp { - op: op.clone(), - algebra_field: binop_info.algebra_field.clone(), -}), Rc::new(vec![left_typed.clone(), right_typed]), Some(Rc::new(InferredNode::Resolved { - node: binop_info.result_type.clone(), -})), span.clone()); -Rc::new(InferResult { - typed: bo_texpr, - diagnostics: v2_rt::concat(left_diags, right_diags), -}) -}, - ExprData::ExprUnaryOp { op, .. } => { - let span = texpr.span.clone(); -let operand_expr = unaryop_operand(texpr.clone()); -let operand_result = infer_expr(&operand_expr, &scope, &None); -let operand_typed = operand_result.typed.clone(); -let operand_diags = operand_result.diagnostics.clone(); -let result_type = match op.clone() { - UnaryOpKind::Not => bool_type(), - UnaryOpKind::Neg => resolved_type(operand_typed.clone()), -}; -let uo_texpr = make_expr_node(Rc::new(ExprData::ExprUnaryOp { - op: op.clone(), -}), Rc::new(vec![operand_typed.clone()]), Some(Rc::new(InferredNode::Resolved { - node: result_type, -})), span.clone()); -Rc::new(InferResult { - typed: uo_texpr, - diagnostics: operand_diags, -}) -}, - ExprData::ExprLambda => { - let span = texpr.span.clone(); -let lam_body = lambda_body(texpr.clone()); -let lam_params = lambda_param_names_at(texpr.clone(), scope.type_env.clone().source_indices.clone()); -let lam_param_nodes = Rc::new(texpr.children.clone().iter().cloned().skip(1 as usize).collect::>()); -let elem_prov = match v2_rt::map_get(&scope.lambda_param_provenance.clone(), "elem".to_string()) { - Some(p) => p.clone(), - None => Rc::new(SubValueRelation::SubValueUnknown), -}; -let lam_scope = if (expected.clone() != None) { - { - let exp = expected.clone().unwrap(); -if ((exp.params.clone().len() as i64) > 0) { - Rc::new(lam_params.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned().fold(scope.clone(), |acc: Rc, pair: (i64, String)| { - let param_prov = if (pair.0.clone() == ((lam_params.clone().len() as i64) - 1)) { - elem_prov.clone() + { + let extended = extend_scope( + &scope, + &let_name, + val_type, + classify_binding_provenance(&val_typed, &scope), + ); + let body_result = + infer_expr(&body_expr.clone().unwrap(), &extended, &expected); + let body_typed = body_result.typed.clone(); + let body_diags = body_result.diagnostics.clone(); + let let_texpr2 = make_named_expr_node( + &let_name, + Rc::new(ExprData::ExprLet), + Rc::new(vec![val_typed.clone(), body_typed.clone()]), + body_typed.inferred.clone(), + span.clone(), + node_name_span(&texpr), + ); + Rc::new(InferResult { + typed: let_texpr2, + diagnostics: v2_rt::concat(val_diags, body_diags.clone()), + }) + } + } + } + ExprData::ExprRecordLit { .. } => { + let span = texpr.span.clone(); + let field_inits = texpr.children.clone(); + infer_record_lit( + &record_lit_type_name_at( + texpr.clone(), + scope.type_env.clone().source_indices.clone(), + ), + field_inits, + &span, + node_name_span(&texpr), + &scope, + ) + } + ExprData::ExprListLit => { + let span = texpr.span.clone(); + let elements = texpr.children.clone(); + let elem_expected = match expected.clone() { + Some(exp) => { + if node_is_element_collection( + &exp, + scope.type_env.clone().source_indices.clone(), + ) { + match exp.children.clone().first().cloned() { + Some(elem) => Some(child_type_node(&elem)), + None => None, + } + } else { + None + } + } + None => None, + }; + let elem_results = Rc::new({ + let mut __result = Vec::new(); + for e in elements.iter().cloned() { + __result.push(infer_expr(&e, &scope, &elem_expected)); + } + __result + }); + let typed_elements = Rc::new({ + let mut __result = Vec::new(); + for r in elem_results.clone().iter().cloned() { + __result.push(r.typed.clone()); + } + __result + }); + let elem_diags = Rc::new({ + let mut __result = Vec::new(); + for r in elem_results.clone().iter().cloned() { + __result.extend((*r.diagnostics.clone()).iter().cloned()); + } + __result + }); + let elem_type_node = if ((elem_results.clone().len() as i64) > 0) { + match elem_results.clone().first().cloned() { + Some(r) => resolved_type(r.typed.clone()), + None => unit_type(), + } + } else { + match expected.clone() { + Some(exp) => { + if node_is_element_collection( + &exp, + scope.type_env.clone().source_indices.clone(), + ) { + match exp.children.clone().first().cloned() { + Some(elem) => child_type_node(&elem), + None => unit_type(), + } } else { - Rc::new(SubValueRelation::SubValueUnknown) - }; -match exp.params.clone().get(pair.0.clone() as usize).cloned() { - Some(cp) => extend_scope(&acc, &pair.1.clone(), param_node_type_expr(&cp), param_prov.clone()), - None => extend_scope(&acc, &pair.1.clone(), type_variable_node("callable_param".to_string()), param_prov.clone()), -} -}) - } else { - if ((lam_params.clone().len() as i64) == 1) { - match lam_params.clone().first().cloned() { - Some(p) => extend_scope(&scope, &p, exp.clone(), elem_prov.clone()), - None => scope.clone(), -} + unit_type() + } + } + None => unit_type(), + } + }; + let empty_list_diags = if ((elem_results.clone().len() as i64) == 0) { + match expected.clone() { + Some(exp) => { + if node_is_element_collection( + &exp, + scope.type_env.clone().source_indices.clone(), + ) { + match exp.children.clone().first().cloned() { + Some(_) => Rc::new(vec![]), + None => Rc::new(vec![inference_error( + "empty list literal: expected type has no element type" + .to_string(), + span.clone(), + scope.module_name.clone(), + )]), + } + } else { + Rc::new(vec![inference_error( + "empty list literal: expected type is not a collection" + .to_string(), + span.clone(), + scope.module_name.clone(), + )]) + } + } + None => Rc::new(vec![]), + } + } else { + Rc::new(vec![]) + }; + let list_k = list_kernel_ty_from_element(elem_type_node.clone()); + let ll_texpr = make_expr_node( + Rc::new(ExprData::ExprListLit), + typed_elements, + Some(Rc::new(InferredNode::Resolved { + node: list_k.ty.clone(), + })), + span.clone(), + ); + Rc::new(InferResult { + typed: ll_texpr, + diagnostics: v2_rt::concat( + v2_rt::concat(elem_diags, empty_list_diags), + list_k.miss_diags.clone(), + ), + }) + } + ExprData::ExprBinOp { op, .. } => { + let span = texpr.span.clone(); + let left_expr = binop_left(texpr.clone()); + let right_expr = binop_right(texpr.clone()); + let left_result = infer_expr(&left_expr, &scope, &None); + let left_typed = left_result.typed.clone(); + let left_diags = left_result.diagnostics.clone(); + let right_result = infer_expr(&right_expr, &scope, &None); + let right_typed = right_result.typed.clone(); + let right_diags = right_result.diagnostics.clone(); + let binop_info = infer_binop_type_node( + &op, + &resolved_type(left_typed.clone()), + scope.type_env.clone().source_indices.clone(), + ); + let bo_texpr = make_expr_node( + Rc::new(ExprData::ExprBinOp { + op: op.clone(), + algebra_field: binop_info.algebra_field.clone(), + }), + Rc::new(vec![left_typed.clone(), right_typed]), + Some(Rc::new(InferredNode::Resolved { + node: binop_info.result_type.clone(), + })), + span.clone(), + ); + Rc::new(InferResult { + typed: bo_texpr, + diagnostics: v2_rt::concat(left_diags, right_diags), + }) + } + ExprData::ExprUnaryOp { op, .. } => { + let span = texpr.span.clone(); + let operand_expr = unaryop_operand(texpr.clone()); + let operand_result = infer_expr(&operand_expr, &scope, &None); + let operand_typed = operand_result.typed.clone(); + let operand_diags = operand_result.diagnostics.clone(); + let result_type = match op.clone() { + UnaryOpKind::Not => bool_type(), + UnaryOpKind::Neg => resolved_type(operand_typed.clone()), + }; + let uo_texpr = make_expr_node( + Rc::new(ExprData::ExprUnaryOp { op: op.clone() }), + Rc::new(vec![operand_typed.clone()]), + Some(Rc::new(InferredNode::Resolved { node: result_type })), + span.clone(), + ); + Rc::new(InferResult { + typed: uo_texpr, + diagnostics: operand_diags, + }) + } + ExprData::ExprLambda => { + let span = texpr.span.clone(); + let lam_body = lambda_body(texpr.clone()); + let lam_params = lambda_param_names_at( + texpr.clone(), + scope.type_env.clone().source_indices.clone(), + ); + let lam_param_nodes = Rc::new( + texpr + .children + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ); + let elem_prov = match v2_rt::map_get( + &scope.lambda_param_provenance.clone(), + "elem".to_string(), + ) { + Some(p) => p.clone(), + None => Rc::new(SubValueRelation::SubValueUnknown), + }; + let lam_scope = if (expected.clone() != None) { + { + let exp = expected.clone().unwrap(); + if ((exp.params.clone().len() as i64) > 0) { + Rc::new( + lam_params + .clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + .fold( + scope.clone(), + |acc: Rc, pair: (i64, String)| { + let param_prov = if (pair.0.clone() + == ((lam_params.clone().len() as i64) - 1)) + { + elem_prov.clone() + } else { + Rc::new(SubValueRelation::SubValueUnknown) + }; + match exp.params.clone().get(pair.0.clone() as usize).cloned() { + Some(cp) => extend_scope( + &acc, + &pair.1.clone(), + param_node_type_expr(&cp), + param_prov.clone(), + ), + None => extend_scope( + &acc, + &pair.1.clone(), + type_variable_node("callable_param".to_string()), + param_prov.clone(), + ), + } + }, + ) } else { - Rc::new(lam_params.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned().fold(scope.clone(), |acc: Rc, pair: (i64, String)| { - let param_prov = if (pair.0.clone() == ((lam_params.clone().len() as i64) - 1)) { - elem_prov.clone() - } else { - Rc::new(SubValueRelation::SubValueUnknown) - }; -if (pair.0.clone() == ((lam_params.clone().len() as i64) - 1)) { - extend_scope(&acc, &pair.1.clone(), exp.clone(), param_prov.clone()) - } else { - extend_scope(&acc, &pair.1.clone(), type_variable_node("lambda_param".to_string()), param_prov.clone()) + if ((lam_params.clone().len() as i64) == 1) { + match lam_params.clone().first().cloned() { + Some(p) => { + extend_scope(&scope, &p, exp.clone(), elem_prov.clone()) + } + None => scope.clone(), } -}) + } else { + Rc::new( + lam_params + .clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + .fold( + scope.clone(), + |acc: Rc, pair: (i64, String)| { + let param_prov = if (pair.0.clone() + == ((lam_params.clone().len() as i64) - 1)) + { + elem_prov.clone() + } else { + Rc::new(SubValueRelation::SubValueUnknown) + }; + if (pair.0.clone() + == ((lam_params.clone().len() as i64) - 1)) + { + extend_scope( + &acc, + &pair.1.clone(), + exp.clone(), + param_prov.clone(), + ) + } else { + extend_scope( + &acc, + &pair.1.clone(), + type_variable_node("lambda_param".to_string()), + param_prov.clone(), + ) + } + }, + ) + } } } -} - } else { - extend_scope_with_params(&scope, lam_params.clone()) - }; -let body_expected = if (expected.clone() != None) { - { - let exp = expected.clone().unwrap(); -if ((exp.params.clone().len() as i64) > 0) { - Some(callable_inferred(&exp)) - } else { - None + } else { + extend_scope_with_params(&scope, lam_params.clone()) + }; + let body_expected = if (expected.clone() != None) { + { + let exp = expected.clone().unwrap(); + if ((exp.params.clone().len() as i64) > 0) { + Some(callable_inferred(&exp)) + } else { + None + } } -} - } else { - None - }; -let body_scope = Rc::new(InferScope { - type_env: lam_scope.type_env.clone(), - func_env: lam_scope.func_env.clone(), - locals: lam_scope.locals.clone(), - match_bound_names: lam_scope.match_bound_names.clone(), - module_name: lam_scope.module_name.clone(), - service_registry: lam_scope.service_registry.clone(), - item_registry: lam_scope.item_registry.clone(), - lambda_param_provenance: v2_rt::rc_empty_map::>(), -}); -let body_result = infer_expr(&lam_body, &body_scope, &body_expected); -let body_typed = body_result.typed.clone(); -let body_diags = body_result.diagnostics.clone(); -let typed_param_nodes = Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(lam_param_nodes.iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { __result.push({ - let pn = pair.1.clone(); -let param_name = match lam_params.clone().get(pair.0.clone() as usize).cloned() { - Some(n) => n.clone(), - None => "".to_string(), -}; -let param_type = match v2_rt::map_get(&lam_scope.locals.clone(), param_name.clone()) { - Some(binding) => Some(Rc::new(InferredNode::Resolved { - node: binding.resolved.clone(), -})), - None => None, -}; -Rc::new(Node { - name: pn.name.clone(), - ident: pn.ident.clone(), - span: pn.span.clone(), - ident_span: pn.ident_span.clone(), - children: pn.children.clone(), - connective: pn.connective.clone(), - params: pn.params.clone(), - inferred: param_type.clone(), - return_cardinality: pn.return_cardinality.clone(), - uses: pn.uses.clone(), - body: pn.body.clone(), - transport: pn.transport.clone(), - properties: pn.properties.clone(), - type_annotation: pn.type_annotation.clone(), - is_self_recursive: pn.is_self_recursive.clone(), - has_non_tail_self_call: pn.has_non_tail_self_call.clone(), - match_pattern: pn.match_pattern.clone(), - expr_data: pn.expr_data.clone(), -}) -}); } __result }); -let lam_texpr = make_expr_node(Rc::new(ExprData::ExprLambda), v2_rt::concat(Rc::new(vec![body_typed.clone()]), typed_param_nodes), body_typed.inferred.clone(), span.clone()); -Rc::new(InferResult { - typed: lam_texpr, - diagnostics: body_diags.clone(), -}) -}, - ExprData::ExprStringInterp => { - let span = texpr.span.clone(); -let typed_part_nodes = Rc::new({ let mut __result = Vec::new(); for part_node in texpr.children.clone().iter().cloned() { __result.push(match (*part_node.expr_data.clone()).clone() { - ExprData::ExprLiteral { .. } => part_node.clone(), - _ => match part_node.children.clone().first().cloned() { - Some(inner) => { - let r = infer_expr(&inner, &scope, &None); -make_interp_part_node(r.typed.clone(), part_node.span.clone()) -}, - None => part_node.clone(), -}, -}); } __result }); -let interp_diags = Rc::new({ let mut __result = Vec::new(); for part_node in texpr.children.clone().iter().cloned() { __result.extend((*match (*part_node.expr_data.clone()).clone() { - ExprData::ExprLiteral { .. } => Rc::new(vec![]), - _ => match part_node.children.clone().first().cloned() { - Some(inner) => { - let r = infer_expr(&inner, &scope, &None); -r.diagnostics.clone() -}, - None => Rc::new(vec![]), -}, -}).iter().cloned()); } __result }); -let si_texpr = make_expr_node(Rc::new(ExprData::ExprStringInterp), typed_part_nodes, Some(Rc::new(InferredNode::Resolved { - node: string_type(), -})), span.clone()); -Rc::new(InferResult { - typed: si_texpr, - diagnostics: interp_diags, -}) -}, - ExprData::ExprBlock => { - let span = texpr.span.clone(); -let stmts = texpr.children.clone(); -if ((stmts.clone().len() as i64) > 0) { + } else { + None + }; + let body_scope = Rc::new(InferScope { + type_env: lam_scope.type_env.clone(), + func_env: lam_scope.func_env.clone(), + locals: lam_scope.locals.clone(), + match_bound_names: lam_scope.match_bound_names.clone(), + module_name: lam_scope.module_name.clone(), + service_registry: lam_scope.service_registry.clone(), + item_registry: lam_scope.item_registry.clone(), + lambda_param_provenance: v2_rt::rc_empty_map::>(), + }); + let body_result = infer_expr(&lam_body, &body_scope, &body_expected); + let body_typed = body_result.typed.clone(); + let body_diags = body_result.diagnostics.clone(); + let typed_param_nodes = Rc::new({ + let mut __result = Vec::new(); + for pair in Rc::new( + lam_param_nodes + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + { + __result.push({ + let pn = pair.1.clone(); + let param_name = + match lam_params.clone().get(pair.0.clone() as usize).cloned() { + Some(n) => n.clone(), + None => "".to_string(), + }; + let param_type = + match v2_rt::map_get(&lam_scope.locals.clone(), param_name.clone()) + { + Some(binding) => Some(Rc::new(InferredNode::Resolved { + node: binding.resolved.clone(), + })), + None => None, + }; + Rc::new(Node { + name: pn.name.clone(), + ident: pn.ident.clone(), + span: pn.span.clone(), + ident_span: pn.ident_span.clone(), + children: pn.children.clone(), + connective: pn.connective.clone(), + params: pn.params.clone(), + inferred: param_type.clone(), + return_cardinality: pn.return_cardinality.clone(), + uses: pn.uses.clone(), + body: pn.body.clone(), + transport: pn.transport.clone(), + properties: pn.properties.clone(), + type_annotation: pn.type_annotation.clone(), + is_self_recursive: pn.is_self_recursive.clone(), + has_non_tail_self_call: pn.has_non_tail_self_call.clone(), + match_pattern: pn.match_pattern.clone(), + expr_data: pn.expr_data.clone(), + }) + }); + } + __result + }); + let lam_texpr = make_expr_node( + Rc::new(ExprData::ExprLambda), + v2_rt::concat(Rc::new(vec![body_typed.clone()]), typed_param_nodes), + body_typed.inferred.clone(), + span.clone(), + ); + Rc::new(InferResult { + typed: lam_texpr, + diagnostics: body_diags.clone(), + }) + } + ExprData::ExprStringInterp => { + let span = texpr.span.clone(); + let typed_part_nodes = Rc::new({ + let mut __result = Vec::new(); + for part_node in texpr.children.clone().iter().cloned() { + __result.push(match (*part_node.expr_data.clone()).clone() { + ExprData::ExprLiteral { .. } => part_node.clone(), + _ => match part_node.children.clone().first().cloned() { + Some(inner) => { + let r = infer_expr(&inner, &scope, &None); + make_interp_part_node(r.typed.clone(), part_node.span.clone()) + } + None => part_node.clone(), + }, + }); + } + __result + }); + let interp_diags = Rc::new({ + let mut __result = Vec::new(); + for part_node in texpr.children.clone().iter().cloned() { + __result.extend( + (*match (*part_node.expr_data.clone()).clone() { + ExprData::ExprLiteral { .. } => Rc::new(vec![]), + _ => match part_node.children.clone().first().cloned() { + Some(inner) => { + let r = infer_expr(&inner, &scope, &None); + r.diagnostics.clone() + } + None => Rc::new(vec![]), + }, + }) + .iter() + .cloned(), + ); + } + __result + }); + let si_texpr = make_expr_node( + Rc::new(ExprData::ExprStringInterp), + typed_part_nodes, + Some(Rc::new(InferredNode::Resolved { + node: string_type(), + })), + span.clone(), + ); + Rc::new(InferResult { + typed: si_texpr, + diagnostics: interp_diags, + }) + } + ExprData::ExprBlock => { + let span = texpr.span.clone(); + let stmts = texpr.children.clone(); + if ((stmts.clone().len() as i64) > 0) { + { + let state = infer_block_stmts( + stmts.clone(), + (stmts.clone().len() as i64), + scope.clone(), + Rc::new(vec![]), + Rc::new(vec![]), + unit_type(), + expected.clone(), + ); + let blk_texpr = make_expr_node( + Rc::new(ExprData::ExprBlock), + state.typed_stmts.clone(), + Some(Rc::new(InferredNode::Resolved { + node: state.last_type.clone(), + })), + span.clone(), + ); + Rc::new(InferResult { + typed: blk_texpr, + diagnostics: Rc::new({ + let mut __result = Vec::new(); + for c in state.diag_chunks.clone().iter().cloned() { + __result.extend((*c.clone()).iter().cloned()); + } + __result + }), + }) + } + } else { + ok_infer(make_expr_node( + Rc::new(ExprData::ExprBlock), + Rc::new(vec![]), + Some(Rc::new(InferredNode::Resolved { node: unit_type() })), + span.clone(), + )) + } + } + ExprData::ExprCast => { + let span = texpr.span.clone(); + let cast_inner = cast_expr(texpr.clone()); + let target_type = cast_target(texpr.clone()); + let inner_result = infer_expr(&cast_inner, &scope, &None); + let inner_typed = inner_result.typed.clone(); + let inner_diags = inner_result.diagnostics.clone(); + let si = scope.type_env.clone().source_indices.clone(); + let target_name = authored_name_at(si.clone(), &target_type); + let cast_diag = validate_cast( + inner_typed.inferred.clone(), + &target_name, + span.clone(), + si.clone(), + scope.module_name.clone(), + ); + let cast_diags = match cast_diag { + Some(d) => Rc::new(vec![d.clone()]), + None => Rc::new(vec![]), + }; + let cast_texpr = make_expr_node( + Rc::new(ExprData::ExprCast), + Rc::new(vec![inner_typed.clone(), target_type.clone()]), + Some(Rc::new(InferredNode::Resolved { + node: target_type.clone(), + })), + span.clone(), + ); + Rc::new(InferResult { + typed: cast_texpr, + diagnostics: v2_rt::concat(inner_diags, cast_diags), + }) + } + ExprData::ExprForEach => { + let variable = foreach_variable_at( + texpr.clone(), + scope.type_env.clone().source_indices.clone(), + ); + let span = texpr.span.clone(); + let coll = foreach_collection(texpr.clone()); + let body_expr = foreach_body(texpr.clone()); + let coll_result = infer_expr(&coll, &scope, &None); + let coll_typed = coll_result.typed.clone(); + let coll_diags = coll_result.diagnostics.clone(); + let elem_type_node = for_each_element_type_node( + resolved_type(coll_typed.clone()), + scope.type_env.clone().source_indices.clone(), + ); + let elem_provenance = + derive_element_provenance(coll_typed.clone(), &elem_type_node, &scope); + let body_scope = + extend_scope(&scope, &variable, elem_type_node.clone(), elem_provenance); + let body_result = infer_expr(&body_expr, &body_scope, &None); + let body_typed = body_result.typed.clone(); + let body_diags = body_result.diagnostics.clone(); + let fe_texpr = make_named_expr_node( + &variable, + Rc::new(ExprData::ExprForEach), + Rc::new(vec![coll_typed.clone(), body_typed.clone()]), + body_typed.inferred.clone(), + span.clone(), + node_name_span(&texpr), + ); + Rc::new(InferResult { + typed: fe_texpr, + diagnostics: v2_rt::concat(coll_diags, body_diags.clone()), + }) + } + ExprData::ExprIndex => { + let span = texpr.span.clone(); + let base_expr = index_base(texpr.clone()); + let idx_key = index_expr(texpr.clone()); + let base_result = infer_expr(&base_expr, &scope, &None); + let base_typed = base_result.typed.clone(); + let base_diags = base_result.diagnostics.clone(); + let index_result = infer_expr(&idx_key, &scope, &None); + let index_typed = index_result.typed.clone(); + let index_diags = index_result.diagnostics.clone(); + let index_check = match base_typed.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { + node: base_type, .. + }) => match index_typed.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { + node: index_type, .. + }) => Some(check_index_access_node( + base_type.clone(), + index_type.clone(), + &span, + scope.module_name.clone(), + &scope.type_env.clone().source_indices.clone(), + )), + _ => None, + }, + _ => None, + }; + let access_failure_inferred = match base_typed.inferred.clone().as_deref().cloned() { - let state = infer_block_stmts(stmts.clone(), (stmts.clone().len() as i64), scope.clone(), Rc::new(vec![]), Rc::new(vec![]), unit_type(), expected.clone()); -let blk_texpr = make_expr_node(Rc::new(ExprData::ExprBlock), state.typed_stmts.clone(), Some(Rc::new(InferredNode::Resolved { - node: state.last_type.clone(), -})), span.clone()); -Rc::new(InferResult { - typed: blk_texpr, - diagnostics: Rc::new({ let mut __result = Vec::new(); for c in state.diag_chunks.clone().iter().cloned() { __result.extend((*c.clone()).iter().cloned()); } __result }), -}) -} - } else { - ok_infer(make_expr_node(Rc::new(ExprData::ExprBlock), Rc::new(vec![]), Some(Rc::new(InferredNode::Resolved { - node: unit_type(), -})), span.clone())) + Some(InferredNode::Resolved { .. }) => index_typed.inferred.clone(), + _ => base_typed.inferred.clone(), + }; + let idx_inferred = match index_check.clone() { + Some(checked) => checked.inferred.clone(), + None => Some(inferred_or_error( + access_failure_inferred, + "invalid index access".to_string(), + span.clone(), + )), + }; + let index_access_diags = match index_check.clone() { + Some(checked) => checked.diagnostics.clone(), + None => Rc::new(vec![]), + }; + let idx_texpr = make_expr_node( + Rc::new(ExprData::ExprIndex), + Rc::new(vec![base_typed.clone(), index_typed.clone()]), + idx_inferred, + span.clone(), + ); + Rc::new(InferResult { + typed: idx_texpr, + diagnostics: v2_rt::concat( + v2_rt::concat(base_diags, index_diags), + index_access_diags, + ), + }) } -}, - ExprData::ExprCast => { - let span = texpr.span.clone(); -let cast_inner = cast_expr(texpr.clone()); -let target_type = cast_target(texpr.clone()); -let inner_result = infer_expr(&cast_inner, &scope, &None); -let inner_typed = inner_result.typed.clone(); -let inner_diags = inner_result.diagnostics.clone(); -let si = scope.type_env.clone().source_indices.clone(); -let target_name = authored_name_at(si.clone(), &target_type); -let cast_diag = validate_cast(inner_typed.inferred.clone(), &target_name, span.clone(), si.clone(), scope.module_name.clone()); -let cast_diags = match cast_diag { - Some(d) => Rc::new(vec![d.clone()]), - None => Rc::new(vec![]), -}; -let cast_texpr = make_expr_node(Rc::new(ExprData::ExprCast), Rc::new(vec![inner_typed.clone(), target_type.clone()]), Some(Rc::new(InferredNode::Resolved { - node: target_type.clone(), -})), span.clone()); -Rc::new(InferResult { - typed: cast_texpr, - diagnostics: v2_rt::concat(inner_diags, cast_diags), -}) -}, - ExprData::ExprForEach => { - let variable = foreach_variable_at(texpr.clone(), scope.type_env.clone().source_indices.clone()); -let span = texpr.span.clone(); -let coll = foreach_collection(texpr.clone()); -let body_expr = foreach_body(texpr.clone()); -let coll_result = infer_expr(&coll, &scope, &None); -let coll_typed = coll_result.typed.clone(); -let coll_diags = coll_result.diagnostics.clone(); -let elem_type_node = for_each_element_type_node(resolved_type(coll_typed.clone()), scope.type_env.clone().source_indices.clone()); -let elem_provenance = derive_element_provenance(coll_typed.clone(), &elem_type_node, &scope); -let body_scope = extend_scope(&scope, &variable, elem_type_node.clone(), elem_provenance); -let body_result = infer_expr(&body_expr, &body_scope, &None); -let body_typed = body_result.typed.clone(); -let body_diags = body_result.diagnostics.clone(); -let fe_texpr = make_named_expr_node(&variable, Rc::new(ExprData::ExprForEach), Rc::new(vec![coll_typed.clone(), body_typed.clone()]), body_typed.inferred.clone(), span.clone(), node_name_span(&texpr)); -Rc::new(InferResult { - typed: fe_texpr, - diagnostics: v2_rt::concat(coll_diags, body_diags.clone()), -}) -}, - ExprData::ExprIndex => { - let span = texpr.span.clone(); -let base_expr = index_base(texpr.clone()); -let idx_key = index_expr(texpr.clone()); -let base_result = infer_expr(&base_expr, &scope, &None); -let base_typed = base_result.typed.clone(); -let base_diags = base_result.diagnostics.clone(); -let index_result = infer_expr(&idx_key, &scope, &None); -let index_typed = index_result.typed.clone(); -let index_diags = index_result.diagnostics.clone(); -let index_check = match base_typed.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: base_type, .. }) => match index_typed.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: index_type, .. }) => Some(check_index_access_node(base_type.clone(), index_type.clone(), &span, scope.module_name.clone(), &scope.type_env.clone().source_indices.clone())), - _ => None, -}, - _ => None, -}; -let access_failure_inferred = match base_typed.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { .. }) => index_typed.inferred.clone(), - _ => base_typed.inferred.clone(), -}; -let idx_inferred = match index_check.clone() { - Some(checked) => checked.inferred.clone(), - None => Some(inferred_or_error(access_failure_inferred, "invalid index access".to_string(), span.clone())), -}; -let index_access_diags = match index_check.clone() { - Some(checked) => checked.diagnostics.clone(), - None => Rc::new(vec![]), -}; -let idx_texpr = make_expr_node(Rc::new(ExprData::ExprIndex), Rc::new(vec![base_typed.clone(), index_typed.clone()]), idx_inferred, span.clone()); -Rc::new(InferResult { - typed: idx_texpr, - diagnostics: v2_rt::concat(v2_rt::concat(base_diags, index_diags), index_access_diags), -}) -}, - ExprData::ExprSlice => { - let span = texpr.span.clone(); -let base_expr = slice_base(texpr.clone()); -let start_expr = slice_start(texpr.clone()); -let end_expr = slice_end(texpr.clone()); -let base_result = infer_expr(&base_expr, &scope, &None); -let base_typed = base_result.typed.clone(); -let base_diags = base_result.diagnostics.clone(); -let start_result = infer_expr(&start_expr, &scope, &None); -let start_typed = start_result.typed.clone(); -let start_diags = start_result.diagnostics.clone(); -let end_result = infer_expr(&end_expr, &scope, &None); -let end_typed = end_result.typed.clone(); -let end_diags = end_result.diagnostics.clone(); -let slice_check = match base_typed.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: base_type, .. }) => match start_typed.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: start_type, .. }) => match end_typed.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: end_type, .. }) => Some(check_slice_access_node(base_type.clone(), start_type.clone(), end_type.clone(), &span, &scope.module_name.clone(), &scope.type_env.clone().source_indices.clone())), - _ => None, -}, - _ => None, -}, - _ => None, -}; -let access_failure_inferred = match base_typed.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { .. }) => match start_typed.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { .. }) => end_typed.inferred.clone(), - _ => start_typed.inferred.clone(), -}, - _ => base_typed.inferred.clone(), -}; -let slc_inferred = match slice_check.clone() { - Some(checked) => checked.inferred.clone(), - None => Some(inferred_or_error(access_failure_inferred, "invalid slice access".to_string(), span.clone())), -}; -let slice_access_diags = match slice_check.clone() { - Some(checked) => checked.diagnostics.clone(), - None => Rc::new(vec![]), -}; -let slc_texpr = make_expr_node(Rc::new(ExprData::ExprSlice), Rc::new(vec![base_typed.clone(), start_typed.clone(), end_typed.clone()]), slc_inferred, span.clone()); -Rc::new(InferResult { - typed: slc_texpr, - diagnostics: v2_rt::concat(v2_rt::concat(v2_rt::concat(base_diags, start_diags), end_diags), slice_access_diags), -}) -}, - ExprData::ExprReturn => { - let span = texpr.span.clone(); -let inner_expr = return_value(texpr.clone()); -let inner_result = infer_expr(&inner_expr, &scope, &expected); -let ret_texpr = make_expr_node(Rc::new(ExprData::ExprReturn), Rc::new(vec![inner_result.typed.clone()]), inner_result.typed.clone().inferred.clone(), span.clone()); -Rc::new(InferResult { - typed: ret_texpr, - diagnostics: inner_result.diagnostics.clone(), -}) -}, - _ => { - let span = texpr.span.clone(); -Rc::new(InferResult { - typed: make_expr_error_node(ExprErrorKind::InternalExprError, &"unhandled expression variant in infer_expr".to_string(), &span), - diagnostics: Rc::new(vec![inference_error("unhandled expression variant in infer_expr".to_string(), span.clone(), scope.module_name.clone())]), -}) -}, -} + ExprData::ExprSlice => { + let span = texpr.span.clone(); + let base_expr = slice_base(texpr.clone()); + let start_expr = slice_start(texpr.clone()); + let end_expr = slice_end(texpr.clone()); + let base_result = infer_expr(&base_expr, &scope, &None); + let base_typed = base_result.typed.clone(); + let base_diags = base_result.diagnostics.clone(); + let start_result = infer_expr(&start_expr, &scope, &None); + let start_typed = start_result.typed.clone(); + let start_diags = start_result.diagnostics.clone(); + let end_result = infer_expr(&end_expr, &scope, &None); + let end_typed = end_result.typed.clone(); + let end_diags = end_result.diagnostics.clone(); + let slice_check = match base_typed.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { + node: base_type, .. + }) => match start_typed.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { + node: start_type, .. + }) => match end_typed.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: end_type, .. }) => { + Some(check_slice_access_node( + base_type.clone(), + start_type.clone(), + end_type.clone(), + &span, + &scope.module_name.clone(), + &scope.type_env.clone().source_indices.clone(), + )) + } + _ => None, + }, + _ => None, + }, + _ => None, + }; + let access_failure_inferred = match base_typed.inferred.clone().as_deref().cloned() + { + Some(InferredNode::Resolved { .. }) => { + match start_typed.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { .. }) => end_typed.inferred.clone(), + _ => start_typed.inferred.clone(), + } + } + _ => base_typed.inferred.clone(), + }; + let slc_inferred = match slice_check.clone() { + Some(checked) => checked.inferred.clone(), + None => Some(inferred_or_error( + access_failure_inferred, + "invalid slice access".to_string(), + span.clone(), + )), + }; + let slice_access_diags = match slice_check.clone() { + Some(checked) => checked.diagnostics.clone(), + None => Rc::new(vec![]), + }; + let slc_texpr = make_expr_node( + Rc::new(ExprData::ExprSlice), + Rc::new(vec![ + base_typed.clone(), + start_typed.clone(), + end_typed.clone(), + ]), + slc_inferred, + span.clone(), + ); + Rc::new(InferResult { + typed: slc_texpr, + diagnostics: v2_rt::concat( + v2_rt::concat(v2_rt::concat(base_diags, start_diags), end_diags), + slice_access_diags, + ), + }) + } + ExprData::ExprReturn => { + let span = texpr.span.clone(); + let inner_expr = return_value(texpr.clone()); + let inner_result = infer_expr(&inner_expr, &scope, &expected); + let ret_texpr = make_expr_node( + Rc::new(ExprData::ExprReturn), + Rc::new(vec![inner_result.typed.clone()]), + inner_result.typed.clone().inferred.clone(), + span.clone(), + ); + Rc::new(InferResult { + typed: ret_texpr, + diagnostics: inner_result.diagnostics.clone(), + }) + } + _ => { + let span = texpr.span.clone(); + Rc::new(InferResult { + typed: make_expr_error_node( + ExprErrorKind::InternalExprError, + &"unhandled expression variant in infer_expr".to_string(), + &span, + ), + diagnostics: Rc::new(vec![inference_error( + "unhandled expression variant in infer_expr".to_string(), + span.clone(), + scope.module_name.clone(), + )]), + }) + } + } }) } -pub fn infer_record_lit(type_name: &Option, field_inits: Rc>>, span: &Rc, name_span: Rc, scope: &Rc) -> Rc { +pub fn infer_record_lit( + type_name: &Option, + field_inits: Rc>>, + span: &Rc, + name_span: Rc, + scope: &Rc, +) -> Rc { { let struct_def = match type_name.clone() { - Some(tn) => lookup_type_by_name(&scope.type_env.clone(), tn.clone()), - None => None, -}; -let struct_fields = match struct_def { - Some(sd) => sd.children.clone(), - None => Rc::new(vec![]), -}; -let fi_infer_results = Rc::new({ let mut __result = Vec::new(); for fi in field_inits.iter().cloned() { __result.push({ - let fi_name = field_init_node_name_at(fi.clone(), scope.type_env.clone().source_indices.clone()); -let field_expected = match Rc::new({ let mut __result = Vec::new(); for sf in struct_fields.clone().iter().cloned() { if (authored_name_at(scope.type_env.clone().source_indices.clone(), &sf).as_str() == fi_name.clone().as_str()) { __result.push(sf); } } __result }).first().cloned() { - Some(sf) => { - let ft = resolved_type(sf.clone()); -if (ft.ident_span.clone() != None) { - Some(ft.clone()) - } else { - None - } -}, - None => None, -}; -let ar = infer_expr(&field_init_node_value(&fi), &scope, &field_expected); -let ar_typed = ar.typed.clone(); -let ar_diags = ar.diagnostics.clone(); -Rc::new(FieldInferResult { - typed_field: make_field_init_node(&fi_name, ar_typed.clone(), fi.span.clone(), node_name_span(&fi)), - infer_result: ar.clone(), - diagnostics: ar_diags.clone(), -}) -}); } __result }); -let typed_fields = Rc::new({ let mut __result = Vec::new(); for fir in fi_infer_results.clone().iter().cloned() { __result.push(fir.typed_field.clone()); } __result }); -let fi_diags = Rc::new({ let mut __result = Vec::new(); for fir in fi_infer_results.clone().iter().cloned() { __result.extend((*fir.diagnostics.clone()).iter().cloned()); } __result }); -if (type_name.clone() == None) { + Some(tn) => lookup_type_by_name(&scope.type_env.clone(), tn.clone()), + None => None, + }; + let struct_fields = match struct_def { + Some(sd) => sd.children.clone(), + None => Rc::new(vec![]), + }; + let fi_infer_results = Rc::new({ + let mut __result = Vec::new(); + for fi in field_inits.iter().cloned() { + __result.push({ + let fi_name = field_init_node_name_at( + fi.clone(), + scope.type_env.clone().source_indices.clone(), + ); + let field_expected = match Rc::new({ + let mut __result = Vec::new(); + for sf in struct_fields.clone().iter().cloned() { + if (authored_name_at( + scope.type_env.clone().source_indices.clone(), + &sf, + ) + .as_str() + == fi_name.clone().as_str()) + { + __result.push(sf); + } + } + __result + }) + .first() + .cloned() + { + Some(sf) => { + let ft = resolved_type(sf.clone()); + if (ft.ident_span.clone() != None) { + Some(ft.clone()) + } else { + None + } + } + None => None, + }; + let ar = infer_expr(&field_init_node_value(&fi), &scope, &field_expected); + let ar_typed = ar.typed.clone(); + let ar_diags = ar.diagnostics.clone(); + Rc::new(FieldInferResult { + typed_field: make_field_init_node( + &fi_name, + ar_typed.clone(), + fi.span.clone(), + node_name_span(&fi), + ), + infer_result: ar.clone(), + diagnostics: ar_diags.clone(), + }) + }); + } + __result + }); + let typed_fields = Rc::new({ + let mut __result = Vec::new(); + for fir in fi_infer_results.clone().iter().cloned() { + __result.push(fir.typed_field.clone()); + } + __result + }); + let fi_diags = Rc::new({ + let mut __result = Vec::new(); + for fir in fi_infer_results.clone().iter().cloned() { + __result.extend((*fir.diagnostics.clone()).iter().cloned()); + } + __result + }); + if (type_name.clone() == None) { { - let child_nodes = Rc::new({ let mut __result = Vec::new(); for fir in fi_infer_results.clone().iter().cloned() { __result.push(Rc::new(Node { - name: field_init_node_name_at(fir.typed_field.clone(), scope.type_env.clone().source_indices.clone()), - span: fir.typed_field.clone().span.clone(), - ident_span: fir.typed_field.clone().ident_span.clone(), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: fir.infer_result.clone().typed.clone().inferred.clone(), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -})); } __result }); -let anon_node = Rc::new(Node { - name: "".to_string(), - span: no_span(), - ident_span: None, - children: child_nodes, - connective: Connective::Conj, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -let typed_field_nodes = typed_fields; -let texpr = make_expr_node(Rc::new(ExprData::ExprRecordLit { - parent_enum: None, -}), typed_field_nodes, Some(Rc::new(InferredNode::Resolved { - node: anon_node, -})), span.clone()); -Rc::new(InferResult { - typed: texpr, - diagnostics: fi_diags, -}) -} + let child_nodes = Rc::new({ + let mut __result = Vec::new(); + for fir in fi_infer_results.clone().iter().cloned() { + __result.push(Rc::new(Node { + name: field_init_node_name_at( + fir.typed_field.clone(), + scope.type_env.clone().source_indices.clone(), + ), + span: fir.typed_field.clone().span.clone(), + ident_span: fir.typed_field.clone().ident_span.clone(), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: fir.infer_result.clone().typed.clone().inferred.clone(), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + })); + } + __result + }); + let anon_node = Rc::new(Node { + name: "".to_string(), + span: no_span(), + ident_span: None, + children: child_nodes, + connective: Connective::Conj, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + let typed_field_nodes = typed_fields; + let texpr = make_expr_node( + Rc::new(ExprData::ExprRecordLit { parent_enum: None }), + typed_field_nodes, + Some(Rc::new(InferredNode::Resolved { node: anon_node })), + span.clone(), + ); + Rc::new(InferResult { + typed: texpr, + diagnostics: fi_diags, + }) + } } else { { - let type_lookup = lookup_type_by_name(&scope.type_env.clone(), type_name.clone().unwrap()); -let local_variant_parent = lookup_variant_parent_enum(&scope, &type_name.clone().unwrap()); -let effective_lookup = match type_lookup.clone() { - Some(_) => type_lookup.clone(), - None => { - let local_lookup = lookup_in_scope(scope.locals.clone(), type_name.clone().unwrap()); -match local_lookup { - Some(local_node) => lookup_type_for(&scope.type_env.clone(), &local_node), - None => None, -} -}, -}; -let raw_resolved = match effective_lookup.clone() { - Some(tn) => tn.clone(), - None => error_type(), -}; -let expected_optional_parent = Some("Optional".to_string()); -let is_some_ctor = ((type_name.clone().unwrap().as_str() == "Some".to_string().as_str()) && (local_variant_parent.clone().as_deref() == expected_optional_parent.as_deref())); -let resolved_node = if is_some_ctor { + let type_lookup = + lookup_type_by_name(&scope.type_env.clone(), type_name.clone().unwrap()); + let local_variant_parent = + lookup_variant_parent_enum(&scope, &type_name.clone().unwrap()); + let effective_lookup = match type_lookup.clone() { + Some(_) => type_lookup.clone(), + None => { + let local_lookup = + lookup_in_scope(scope.locals.clone(), type_name.clone().unwrap()); + match local_lookup { + Some(local_node) => { + lookup_type_for(&scope.type_env.clone(), &local_node) + } + None => None, + } + } + }; + let raw_resolved = match effective_lookup.clone() { + Some(tn) => tn.clone(), + None => error_type(), + }; + let expected_optional_parent = Some("Optional".to_string()); + let is_some_ctor = ((type_name.clone().unwrap().as_str() + == "Some".to_string().as_str()) + && (local_variant_parent.clone().as_deref() + == expected_optional_parent.as_deref())); + let resolved_node = if is_some_ctor { { - let val_field = Rc::new({ let mut __result = Vec::new(); for fir in fi_infer_results.clone().iter().cloned() { if (field_init_node_name_at(fir.typed_field.clone(), scope.type_env.clone().source_indices.clone()).as_str() == "value".to_string().as_str()) { __result.push(fir); } } __result }).first().cloned(); -match val_field { - Some(val_fir) => with_optional_cardinality(&resolved_type(val_fir.infer_result.clone().typed.clone())), - None => raw_resolved, -} -} + let val_field = Rc::new({ + let mut __result = Vec::new(); + for fir in fi_infer_results.clone().iter().cloned() { + if (field_init_node_name_at( + fir.typed_field.clone(), + scope.type_env.clone().source_indices.clone(), + ) + .as_str() + == "value".to_string().as_str()) + { + __result.push(fir); + } + } + __result + }) + .first() + .cloned(); + match val_field { + Some(val_fir) => with_optional_cardinality(&resolved_type( + val_fir.infer_result.clone().typed.clone(), + )), + None => raw_resolved, + } + } } else { raw_resolved }; -let type_diags = match effective_lookup.clone() { - Some(_) => Rc::new(vec![]), - None => Rc::new(vec![inference_error(v2_rt::concat(v2_rt::concat("type '".to_string(), type_name.clone().unwrap()), "' not found in scope".to_string()), span.clone(), scope.module_name.clone())]), -}; -let typed_field_nodes2 = typed_fields; -let rl_name = match type_name.clone() { - Some(tn_val) => tn_val.clone(), - None => "".to_string(), -}; -let texpr = make_named_expr_node(&rl_name, Rc::new(ExprData::ExprRecordLit { - parent_enum: local_variant_parent.clone(), -}), typed_field_nodes2, Some(Rc::new(InferredNode::Resolved { - node: resolved_node, -})), span.clone(), name_span); -Rc::new(InferResult { - typed: texpr, - diagnostics: v2_rt::concat(fi_diags, type_diags), -}) -} + let type_diags = match effective_lookup.clone() { + Some(_) => Rc::new(vec![]), + None => Rc::new(vec![inference_error( + v2_rt::concat( + v2_rt::concat("type '".to_string(), type_name.clone().unwrap()), + "' not found in scope".to_string(), + ), + span.clone(), + scope.module_name.clone(), + )]), + }; + let typed_field_nodes2 = typed_fields; + let rl_name = match type_name.clone() { + Some(tn_val) => tn_val.clone(), + None => "".to_string(), + }; + let texpr = make_named_expr_node( + &rl_name, + Rc::new(ExprData::ExprRecordLit { + parent_enum: local_variant_parent.clone(), + }), + typed_field_nodes2, + Some(Rc::new(InferredNode::Resolved { + node: resolved_node, + })), + span.clone(), + name_span, + ); + Rc::new(InferResult { + typed: texpr, + diagnostics: v2_rt::concat(fi_diags, type_diags), + }) + } } -} + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum SizeExpr { - ParamSize { - param: String, - }, - DividedSize { - param: String, - divisor: i64, - }, + ParamSize { param: String }, + DividedSize { param: String, divisor: i64 }, } impl SizeExpr { pub fn param(&self) -> String { @@ -2541,134 +4367,197 @@ impl SizeExpr { } } -#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -pub struct DescentContext { - pub fn_name: String, - pub param_names: Rc>, - pub param_order: Rc>, - pub type_env: Rc, - pub sub_value_vars: Rc>>, - pub size_aliases: Rc>>, - pub scope_locals: Rc>>, - pub func_sigs: Rc>>, - pub per_field_vars: Rc>>>>, -} - -pub fn classify_size_expr(val: &Rc, ctx: &Rc) -> Option> { - match (*val.expr_data.clone()).clone() { - ExprData::ExprMethodCall { .. } => { - let mname = expr_method_name_at(val.clone(), ctx.type_env.clone().source_indices.clone()); -if (mname.as_str() == "count".to_string().as_str()) { - { - let receiver = method_receiver(val.clone()); -match (*receiver.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let rname = expr_var_name_at(receiver.clone(), ctx.type_env.clone().source_indices.clone()); -match v2_rt::map_get(&ctx.param_names.clone(), rname.clone()) { - Some(_) => Some(Rc::new(SizeExpr::ParamSize { - param: rname.clone(), -})), - None => None, -} -}, - _ => None, -} -} - } else { - None - } -}, - ExprData::ExprBinOp { .. } => { - let left = binop_left(val.clone()); -let right = binop_right(val.clone()); -match (*val.expr_data.clone()).clone() { - ExprData::ExprBinOp { op: BinOp::Div, .. } => match (*left.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let lname = expr_var_name_at(left.clone(), ctx.type_env.clone().source_indices.clone()); -match v2_rt::map_get(&ctx.size_aliases.clone(), lname).as_deref().cloned() { - Some(SizeExpr::ParamSize { param: p, .. }) => match (*right.expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitInt { value: d, .. } = value.as_ref() else { unreachable!() }; if (d.clone() > 0) { - Some(Rc::new(SizeExpr::DividedSize { - param: p.clone(), - divisor: d.clone(), -})) - } else { - None - } }, - _ => None, -}, - _ => None, -} -}, - _ => None, -}, - _ => None, -} -}, - _ => None, -} -} - -pub fn proportional_skip_alias_plus_literal(alias_expr: &Rc, lit_expr: Rc, param_name: &String, ctx: &Rc) -> Option> { - match (*alias_expr.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let aname = expr_var_name_at(alias_expr.clone(), ctx.type_env.clone().source_indices.clone()); -match v2_rt::map_get(&ctx.size_aliases.clone(), aname).as_deref().cloned() { - Some(SizeExpr::DividedSize { param: p, divisor: d, .. }) => if (p.clone().as_str() == param_name.clone().as_str()) { - match (*lit_expr.expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitInt { value: k, .. } = value.as_ref() else { unreachable!() }; if (k.clone() > 0) { - match proportional_divisor_from_int_at_least_two(d.clone()) { - Some(div_w) => { - let synth_field = Rc::new(InductiveField { - type_name: param_name.clone(), - variant_name: "".to_string(), - field_name: "skip".to_string(), - shape: RecursionShape::ListRecursion, - element_type: param_name.clone(), -}); -Some(Rc::new(SubValueRelation::StrictSubValue { - field: synth_field, - factor: Rc::new(ShrinkFactor::ProportionalShrink { - divisor: div_w.clone(), -}), -})) -}, - None => None, +#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] +pub struct DescentContext { + pub fn_name: String, + pub param_names: Rc>, + pub param_order: Rc>, + pub type_env: Rc, + pub sub_value_vars: Rc>>, + pub size_aliases: Rc>>, + pub scope_locals: Rc>>, + pub func_sigs: Rc>>, + pub per_field_vars: Rc>>>>, } + +pub fn classify_size_expr(val: &Rc, ctx: &Rc) -> Option> { + match (*val.expr_data.clone()).clone() { + ExprData::ExprMethodCall { .. } => { + let mname = + expr_method_name_at(val.clone(), ctx.type_env.clone().source_indices.clone()); + if (mname.as_str() == "count".to_string().as_str()) { + { + let receiver = method_receiver(val.clone()); + match (*receiver.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let rname = expr_var_name_at( + receiver.clone(), + ctx.type_env.clone().source_indices.clone(), + ); + match v2_rt::map_get(&ctx.param_names.clone(), rname.clone()) { + Some(_) => Some(Rc::new(SizeExpr::ParamSize { + param: rname.clone(), + })), + None => None, + } + } + _ => None, + } + } } else { None - } }, - _ => None, -} - } else { - None - }, - _ => None, -} -}, - _ => None, + } + } + ExprData::ExprBinOp { .. } => { + let left = binop_left(val.clone()); + let right = binop_right(val.clone()); + match (*val.expr_data.clone()).clone() { + ExprData::ExprBinOp { op: BinOp::Div, .. } => match (*left.expr_data.clone()) + .clone() + { + ExprData::ExprVar { .. } => { + let lname = expr_var_name_at( + left.clone(), + ctx.type_env.clone().source_indices.clone(), + ); + match v2_rt::map_get(&ctx.size_aliases.clone(), lname) + .as_deref() + .cloned() + { + Some(SizeExpr::ParamSize { param: p, .. }) => { + match (*right.expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { + let LiteralValue::LitInt { value: d, .. } = value.as_ref() + else { + unreachable!() + }; + if (d.clone() > 0) { + Some(Rc::new(SizeExpr::DividedSize { + param: p.clone(), + divisor: d.clone(), + })) + } else { + None + } + } + _ => None, + } + } + _ => None, + } + } + _ => None, + }, + _ => None, + } + } + _ => None, + } } + +pub fn proportional_skip_alias_plus_literal( + alias_expr: &Rc, + lit_expr: Rc, + param_name: &String, + ctx: &Rc, +) -> Option> { + match (*alias_expr.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let aname = expr_var_name_at( + alias_expr.clone(), + ctx.type_env.clone().source_indices.clone(), + ); + match v2_rt::map_get(&ctx.size_aliases.clone(), aname) + .as_deref() + .cloned() + { + Some(SizeExpr::DividedSize { + param: p, + divisor: d, + .. + }) => { + if (p.clone().as_str() == param_name.clone().as_str()) { + match (*lit_expr.expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { + let LiteralValue::LitInt { value: k, .. } = value.as_ref() else { + unreachable!() + }; + if (k.clone() > 0) { + match proportional_divisor_from_int_at_least_two(d.clone()) { + Some(div_w) => { + let synth_field = Rc::new(InductiveField { + type_name: param_name.clone(), + variant_name: "".to_string(), + field_name: "skip".to_string(), + shape: RecursionShape::ListRecursion, + element_type: param_name.clone(), + }); + Some(Rc::new(SubValueRelation::StrictSubValue { + field: synth_field, + factor: Rc::new(ShrinkFactor::ProportionalShrink { + divisor: div_w.clone(), + }), + })) + } + None => None, + } + } else { + None + } + } + _ => None, + } + } else { + None + } + } + _ => None, + } + } + _ => None, + } } -pub fn classify_collection_shrink(arg_expr: &Rc, param_name: &String, ctx: &Rc) -> Rc { +pub fn classify_collection_shrink( + arg_expr: &Rc, + param_name: &String, + ctx: &Rc, +) -> Rc { match (*arg_expr.expr_data.clone()).clone() { - ExprData::ExprMethodCall { .. } => { - let mname = expr_method_name_at(arg_expr.clone(), ctx.type_env.clone().source_indices.clone()); -if ((mname.clone().as_str() == "take".to_string().as_str()) || (mname.clone().as_str() == "skip".to_string().as_str())) { + ExprData::ExprMethodCall { .. } => { + let mname = expr_method_name_at( + arg_expr.clone(), + ctx.type_env.clone().source_indices.clone(), + ); + if ((mname.clone().as_str() == "take".to_string().as_str()) + || (mname.clone().as_str() == "skip".to_string().as_str())) { - let receiver = method_receiver(arg_expr.clone()); -match (*receiver.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let rname = expr_var_name_at(receiver.clone(), ctx.type_env.clone().source_indices.clone()); -if (rname.as_str() == param_name.clone().as_str()) { - { - let args = method_arg_nodes(arg_expr.clone()); -match args.first().cloned() { - Some(arg_node) => { - let arg_val = arg_value(&arg_node); -match (*arg_val.expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitInt { value: k, .. } = value.as_ref() else { unreachable!() }; if ((k.clone() > 0) && (mname.clone().as_str() == "skip".to_string().as_str())) { - match positive_descent_amount_from_positive_int(k.clone()) { + { + let receiver = method_receiver(arg_expr.clone()); + match (*receiver.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let rname = expr_var_name_at( + receiver.clone(), + ctx.type_env.clone().source_indices.clone(), + ); + if (rname.as_str() == param_name.clone().as_str()) { + { + let args = method_arg_nodes(arg_expr.clone()); + match args.first().cloned() { + Some(arg_node) => { + let arg_val = arg_value(&arg_node); + match (*arg_val.expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { + let LiteralValue::LitInt { value: k, .. } = + value.as_ref() + else { + unreachable!() + }; + if ((k.clone() > 0) + && (mname.clone().as_str() + == "skip".to_string().as_str())) + { + match positive_descent_amount_from_positive_int(k.clone()) { Some(steps) => { let synth_field = Rc::new(InductiveField { type_name: param_name.clone(), @@ -2681,548 +4570,987 @@ Rc::new(SubValueRelation::StrictSubValue { field: synth_field, factor: Rc::new(ShrinkFactor::ConstantShrink { steps: steps.clone(), -}), -}) -}, - None => Rc::new(SubValueRelation::SubValueUnknown), -} - } else { - Rc::new(SubValueRelation::SubValueUnknown) - } }, - ExprData::ExprVar { .. } => { - let aname = expr_var_name_at(arg_val.clone(), ctx.type_env.clone().source_indices.clone()); -match v2_rt::map_get(&ctx.size_aliases.clone(), aname).as_deref().cloned() { - Some(SizeExpr::DividedSize { param: p, divisor: d, .. }) => if (p.clone().as_str() == param_name.clone().as_str()) { - match proportional_divisor_from_int_at_least_two(d.clone()) { - Some(div_w) => { - let synth_field = Rc::new(InductiveField { - type_name: param_name.clone(), - variant_name: "".to_string(), - field_name: mname.clone(), - shape: RecursionShape::ListRecursion, - element_type: param_name.clone(), -}); -Rc::new(SubValueRelation::StrictSubValue { - field: synth_field, - factor: Rc::new(ShrinkFactor::ProportionalShrink { - divisor: div_w.clone(), -}), -}) -}, - None => Rc::new(SubValueRelation::SubValueUnknown), -} - } else { - Rc::new(SubValueRelation::SubValueUnknown) - }, - _ => Rc::new(SubValueRelation::SubValueUnknown), -} -}, - ExprData::ExprBinOp { op, .. } => match op.clone() { - BinOp::Add => if (mname.clone().as_str() == "skip".to_string().as_str()) { - { - let left = binop_left(arg_val.clone()); -let right = binop_right(arg_val.clone()); -match proportional_skip_alias_plus_literal(&left, right.clone(), ¶m_name, &ctx) { - Some(rel) => rel.clone(), - None => match proportional_skip_alias_plus_literal(&right, left.clone(), ¶m_name, &ctx) { - Some(rel) => rel.clone(), - None => Rc::new(SubValueRelation::SubValueUnknown), -}, -} -} - } else { - Rc::new(SubValueRelation::SubValueUnknown) - }, - BinOp::Sub => Rc::new(SubValueRelation::SubValueUnknown), - _ => Rc::new(SubValueRelation::SubValueUnknown), -}, - _ => Rc::new(SubValueRelation::SubValueUnknown), -} -}, - None => Rc::new(SubValueRelation::SubValueUnknown), -} -} - } else { - Rc::new(SubValueRelation::SubValueUnknown) - } -}, - _ => Rc::new(SubValueRelation::SubValueUnknown), -} -} - } else { - Rc::new(SubValueRelation::SubValueUnknown) - } -}, - _ => Rc::new(SubValueRelation::SubValueUnknown), -} -} - -#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -pub struct BlockAnnotateAcc { - pub ctx: Rc, - pub children: Rc>>, -} - -pub fn method_callback_element_position(semantics: Option>) -> Option { - match semantics.as_deref().cloned() { - Some(MethodSemantics::AlgebraMethodSemantics { algebra_template: at, .. }) => match at.clone() { - Some(template) => template.callback_element_position.clone(), - None => None, -}, - _ => None, -} -} - -pub fn maybe_insert_composed_field_relation(acc: Rc>>, fname: String, composed: Option>) -> Rc>> { - match composed { - Some(rel) => match (*rel.clone()).clone() { - SubValueRelation::SubValueUnknown => acc, - _ => v2_rt::rc_map_insert(acc, fname, rel.clone()), -}, - None => acc, -} -} - -pub fn maybe_insert_output_field_relation(acc: Rc>>, idx: i64, fname: String, sig: Rc, val: Rc, ctx: Rc) -> Rc>> { - { - let composed = match sig.output_provenance.clone().get(idx as usize).cloned() { - Some(param_map) => classify_call_via_provenance(val, ¶m_map, ctx), - None => None, -}; -maybe_insert_composed_field_relation(acc, fname, composed) -} -} - -pub fn maybe_insert_match_field_relation(fp_acc: Rc>>, pname: &String, field_label: String, vname: String, scrut_rel: Option>, param_types: Rc>, type_env: Rc) -> Rc>> { - match scrut_rel { - Some(rel) => { - let lookup_type = match (*rel.clone()).clone() { - SubValueRelation::PreservedValue => match v2_rt::map_get(¶m_types, pname.clone()) { - Some(t) => t.clone(), - None => "".to_string(), -}, - SubValueRelation::StrictSubValue { field: f, .. } => f.element_type.clone(), - SubValueRelation::IteratedSubValue { field: f, .. } => f.element_type.clone(), - _ => "".to_string(), -}; -if (lookup_type.clone().as_str() != "".to_string().as_str()) { - { - let ind_fields = inductive_fields_for(type_env, lookup_type.clone()); -let matching = Rc::new({ let mut __result = Vec::new(); for f in ind_fields.iter().cloned() { if ((f.field_name.clone().as_str() == field_label.clone().as_str()) && ((f.variant_name.clone().as_str() == vname.clone().as_str()) || (f.variant_name.clone().as_str() == "".to_string().as_str()))) { __result.push(f); } } __result }).first().cloned(); -match matching { - Some(ind_field) => v2_rt::rc_map_insert(fp_acc, pname.clone(), compose_sub_value(rel.clone(), ind_field.clone())), - None => fp_acc, -} -} - } else { - fp_acc - } -}, - None => fp_acc, -} -} - -pub fn build_per_field_for_let(val: &Rc, binding_name: String, ctx: &Rc) -> Rc>>>> { - match (*val.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { - let callee = expr_call_func_at(val.clone(), ctx.type_env.clone().source_indices.clone()); -match v2_rt::map_get(&ctx.func_sigs.clone(), callee) { - Some(sig) => if ((sig.output_provenance.clone().len() as i64) > 1) { - { - let return_type = sig.inferred.clone(); -let field_map = Rc::new(return_type.children.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, pair: (i64, Rc)| { - let idx = pair.0.clone(); -let field_node = pair.1.clone(); -let fname = authored_name_at(ctx.type_env.clone().source_indices.clone(), &field_node); -maybe_insert_output_field_relation(acc, idx.clone(), fname.clone(), sig.clone(), val.clone(), ctx.clone()) -}); -if ((Rc::new(v2_rt::map_keys(&field_map)).len() as i64) > 0) { - v2_rt::rc_map_insert(ctx.per_field_vars.clone(), binding_name, field_map.clone()) - } else { - ctx.per_field_vars.clone() - } -} - } else { - ctx.per_field_vars.clone() - }, - None => ctx.per_field_vars.clone(), -} -}, - ExprData::ExprMethodCall { .. } => { - let callee = expr_method_name_at(val.clone(), ctx.type_env.clone().source_indices.clone()); -match v2_rt::map_get(&ctx.func_sigs.clone(), callee) { - Some(sig) => if ((sig.output_provenance.clone().len() as i64) > 1) { - { - let return_type = sig.inferred.clone(); -let field_map = Rc::new(return_type.children.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, pair: (i64, Rc)| { - let idx = pair.0.clone(); -let field_node = pair.1.clone(); -let fname = authored_name_at(ctx.type_env.clone().source_indices.clone(), &field_node); -maybe_insert_output_field_relation(acc, idx.clone(), fname.clone(), sig.clone(), val.clone(), ctx.clone()) -}); -if ((Rc::new(v2_rt::map_keys(&field_map)).len() as i64) > 0) { - v2_rt::rc_map_insert(ctx.per_field_vars.clone(), binding_name, field_map.clone()) - } else { - ctx.per_field_vars.clone() - } -} - } else { - ctx.per_field_vars.clone() - }, - None => ctx.per_field_vars.clone(), -} -}, - _ => ctx.per_field_vars.clone(), -} -} - -pub fn resolve_collection_field(mut expr: Rc, mut ctx: Rc) -> Option> { - loop { - match (*expr.expr_data.clone()).clone() { - ExprData::ExprFieldAccess { .. } => { let base = field_access_base(expr.clone()); -let fname = field_access_field_at(expr.clone(), ctx.type_env.clone().source_indices.clone()); -match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { let bname = expr_var_name_at(base.clone(), ctx.type_env.clone().source_indices.clone()); -let base_type = match v2_rt::map_get(&ctx.param_names.clone(), bname.clone()) { - Some(t) => t.clone(), - None => match v2_rt::map_get(&ctx.sub_value_vars.clone(), bname.clone()) { - Some(rel) => match (*rel.clone()).clone() { - SubValueRelation::StrictSubValue { field: f, .. } => f.element_type.clone(), - SubValueRelation::IteratedSubValue { field: f, .. } => f.element_type.clone(), - _ => "".to_string(), -}, - None => "".to_string(), -}, -}; -if (base_type.clone().as_str() != "".to_string().as_str()) { - break Rc::new({ let mut __result = Vec::new(); for f in Rc::new({ let mut __result = Vec::new(); for f in inductive_fields_for(ctx.type_env.clone(), base_type.clone()).iter().cloned() { if (f.field_name.clone().as_str() == fname.clone().as_str()) { __result.push(f); } } __result }).iter().cloned() { if match f.shape.clone() { - RecursionShape::ListRecursion => true, - _ => false, -} { __result.push(f); } } __result }).first().cloned(); -} else { - break None; -} }, - _ => { break None; }, -} }, - ExprData::ExprVar { .. } => { let rname = expr_var_name_at(expr.clone(), ctx.type_env.clone().source_indices.clone()); -match v2_rt::map_get(&ctx.sub_value_vars.clone(), rname) { - Some(rel) => { match (*rel.clone()).clone() { - SubValueRelation::StrictSubValue { field: f, .. } => { match f.shape.clone() { - RecursionShape::ListRecursion => { break Some(f.clone()); }, - _ => { break None; }, -} }, - SubValueRelation::IteratedSubValue { field: f, .. } => { match f.shape.clone() { - RecursionShape::ListRecursion => { break Some(f.clone()); }, - _ => { break None; }, -} }, - _ => { break None; }, -} }, - None => { break None; }, -} }, - ExprData::ExprMethodCall { .. } => { let inner_mname = expr_method_name_at(expr.clone(), ctx.type_env.clone().source_indices.clone()); -let is_collection_preserving = (((((inner_mname.clone().as_str() == "enumerate".to_string().as_str()) || (inner_mname.clone().as_str() == "skip".to_string().as_str())) || (inner_mname.clone().as_str() == "take".to_string().as_str())) || (inner_mname.clone().as_str() == "filter".to_string().as_str())) || (inner_mname.clone().as_str() == "reverse".to_string().as_str())); -if is_collection_preserving { - { - let __tco_0 = method_receiver(expr); -expr = __tco_0; -continue; -} -} else { - break None; -} }, - _ => { break None; }, -} -} -} - -pub fn classify_binding_provenance(val: &Rc, scope: &Rc) -> Rc { - match (*val.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let vname = expr_var_name_at(val.clone(), scope.type_env.clone().source_indices.clone()); -match v2_rt::map_get(&scope.locals.clone(), vname) { - Some(binding) => binding.provenance.clone(), - None => Rc::new(SubValueRelation::SubValueUnknown), -} -}, - ExprData::ExprFieldAccess { .. } => { - let base = field_access_base(val.clone()); -let field = field_access_field_at(val.clone(), scope.type_env.clone().source_indices.clone()); -match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let bname = expr_var_name_at(base.clone(), scope.type_env.clone().source_indices.clone()); -match v2_rt::map_get(&scope.locals.clone(), bname) { - Some(binding) => { - let fields = inductive_fields_for(scope.type_env.clone(), authored_name_at(scope.type_env.clone().source_indices.clone(), &binding.resolved.clone())); -let matching = Rc::new({ let mut __result = Vec::new(); for f in fields.iter().cloned() { if (f.field_name.clone().as_str() == field.clone().as_str()) { __result.push(f); } } __result }).first().cloned(); -match matching { - Some(ind_field) => compose_sub_value(binding.provenance.clone(), ind_field.clone()), - None => Rc::new(SubValueRelation::SubValueUnknown), -} -}, - None => Rc::new(SubValueRelation::SubValueUnknown), -} -}, - _ => Rc::new(SubValueRelation::SubValueUnknown), -} -}, - _ => Rc::new(SubValueRelation::SubValueUnknown), -} -} - -pub fn classify_let_value(val: &Rc, ctx: &Rc) -> Option> { - match (*val.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let vname = expr_var_name_at(val.clone(), ctx.type_env.clone().source_indices.clone()); -match v2_rt::map_get(&ctx.scope_locals.clone(), vname) { - Some(binding) => match (*binding.provenance.clone()).clone() { - SubValueRelation::SubValueUnknown => None, - _ => Some(binding.provenance.clone()), -}, - None => None, -} -}, - ExprData::ExprFieldAccess { .. } => { - let base = field_access_base(val.clone()); -let field = field_access_field_at(val.clone(), ctx.type_env.clone().source_indices.clone()); -match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let bname = expr_var_name_at(base.clone(), ctx.type_env.clone().source_indices.clone()); -let from_per_field = match v2_rt::map_get(&ctx.per_field_vars.clone(), bname.clone()) { - Some(field_map) => v2_rt::map_get(&field_map, field.clone()), - None => None, -}; -match from_per_field { - Some(rel) => Some(rel.clone()), - None => { - let type_name = match v2_rt::map_get(&ctx.scope_locals.clone(), bname.clone()) { - Some(binding) => authored_name_at(ctx.type_env.clone().source_indices.clone(), &binding.resolved.clone()), - None => match v2_rt::map_get(&ctx.param_names.clone(), bname.clone()) { - Some(t) => t.clone(), - None => "".to_string(), -}, -}; -if (type_name.clone().as_str() != "".to_string().as_str()) { - { - let fields = inductive_fields_for(ctx.type_env.clone(), type_name.clone()); -let matching = Rc::new({ let mut __result = Vec::new(); for f in fields.iter().cloned() { if (f.field_name.clone().as_str() == field.clone().as_str()) { __result.push(f); } } __result }).first().cloned(); -match matching { - Some(ind_field) => Some(Rc::new(SubValueRelation::StrictSubValue { - field: ind_field.clone(), - factor: Rc::new(ShrinkFactor::UnitShrink), -})), - None => None, -} -} - } else { - None - } -}, -} -}, - _ => None, -} -}, - ExprData::ExprCall { .. } => { - let callee = expr_call_func_at(val.clone(), ctx.type_env.clone().source_indices.clone()); -let from_provenance = match v2_rt::map_get(&ctx.func_sigs.clone(), callee.clone()) { - Some(sig) => match sig.output_provenance.clone().first().cloned() { - Some(param_map) => classify_call_via_provenance(val.clone(), ¶m_map, ctx.clone()), - None => None, -}, - None => None, -}; -match from_provenance.clone() { - Some(_) => from_provenance.clone(), - None => if (is_child_accessor_in_model(callee.clone()) || is_tree_size_reducing(callee.clone())) { - { - let call_args = val.children.clone(); -match call_args.first().cloned() { - Some(first_arg) => { - let inner = arg_value(&first_arg); -match (*inner.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let iname = expr_var_name_at(inner.clone(), ctx.type_env.clone().source_indices.clone()); -let inner_type = match v2_rt::map_get(&ctx.param_names.clone(), iname.clone()) { - Some(t) => t.clone(), - None => match v2_rt::map_get(&ctx.sub_value_vars.clone(), iname.clone()) { - Some(rel) => match (*rel.clone()).clone() { - SubValueRelation::StrictSubValue { field: f, .. } => f.element_type.clone(), - SubValueRelation::IteratedSubValue { field: f, .. } => f.element_type.clone(), - _ => "".to_string(), -}, - None => "".to_string(), +}), +}) }, -}; -if (inner_type.clone().as_str() != "".to_string().as_str()) { - { - let fields = inductive_fields_for(ctx.type_env.clone(), inner_type.clone()); -let cf = Rc::new({ let mut __result = Vec::new(); for f in fields.iter().cloned() { if match f.shape.clone() { - RecursionShape::ListRecursion => true, - _ => false, -} { __result.push(f); } } __result }).first().cloned(); -match cf { - Some(ind_field) => Some(Rc::new(SubValueRelation::StrictSubValue { - field: ind_field.clone(), - factor: Rc::new(ShrinkFactor::UnitShrink), -})), - None => None, -} + None => Rc::new(SubValueRelation::SubValueUnknown), } - } else { - None - } + } else { + Rc::new(SubValueRelation::SubValueUnknown) + } + } + ExprData::ExprVar { .. } => { + let aname = expr_var_name_at( + arg_val.clone(), + ctx.type_env.clone().source_indices.clone(), + ); + match v2_rt::map_get( + &ctx.size_aliases.clone(), + aname, + ) + .as_deref() + .cloned() + { + Some(SizeExpr::DividedSize { + param: p, + divisor: d, + .. + }) => { + if (p.clone().as_str() + == param_name.clone().as_str()) + { + match proportional_divisor_from_int_at_least_two(d.clone()) { + Some(div_w) => { + let synth_field = Rc::new(InductiveField { + type_name: param_name.clone(), + variant_name: "".to_string(), + field_name: mname.clone(), + shape: RecursionShape::ListRecursion, + element_type: param_name.clone(), +}); +Rc::new(SubValueRelation::StrictSubValue { + field: synth_field, + factor: Rc::new(ShrinkFactor::ProportionalShrink { + divisor: div_w.clone(), +}), +}) }, - _ => None, + None => Rc::new(SubValueRelation::SubValueUnknown), } + } else { + Rc::new(SubValueRelation::SubValueUnknown) + } + } + _ => Rc::new( + SubValueRelation::SubValueUnknown, + ), + } + } + ExprData::ExprBinOp { op, .. } => { + match op.clone() { + BinOp::Add => { + if (mname.clone().as_str() + == "skip".to_string().as_str()) + { + { + let left = + binop_left(arg_val.clone()); + let right = binop_right( + arg_val.clone(), + ); + match proportional_skip_alias_plus_literal(&left, right.clone(), ¶m_name, &ctx) { + Some(rel) => rel.clone(), + None => match proportional_skip_alias_plus_literal(&right, left.clone(), ¶m_name, &ctx) { + Some(rel) => rel.clone(), + None => Rc::new(SubValueRelation::SubValueUnknown), }, - None => None, } + } + } else { + Rc::new(SubValueRelation::SubValueUnknown) + } + } + BinOp::Sub => Rc::new( + SubValueRelation::SubValueUnknown, + ), + _ => Rc::new( + SubValueRelation::SubValueUnknown, + ), + } + } + _ => Rc::new(SubValueRelation::SubValueUnknown), + } + } + None => Rc::new(SubValueRelation::SubValueUnknown), + } + } + } else { + Rc::new(SubValueRelation::SubValueUnknown) + } + } + _ => Rc::new(SubValueRelation::SubValueUnknown), + } + } + } else { + Rc::new(SubValueRelation::SubValueUnknown) + } + } + _ => Rc::new(SubValueRelation::SubValueUnknown), + } } - } else { - None + +#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] +pub struct BlockAnnotateAcc { + pub ctx: Rc, + pub children: Rc>>, +} + +pub fn method_callback_element_position(semantics: Option>) -> Option { + match semantics.as_deref().cloned() { + Some(MethodSemantics::AlgebraMethodSemantics { + algebra_template: at, + .. + }) => match at.clone() { + Some(template) => template.callback_element_position.clone(), + None => None, }, + _ => None, + } } -}, - _ => { - let type_based = match val.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => if is_container_type(authored_name_at(ctx.type_env.clone().source_indices.clone(), &rt)) { - { - let elem = match rt.children.clone().first().cloned() { - Some(c) => authored_name_at(ctx.type_env.clone().source_indices.clone(), &c), - None => "".to_string(), -}; -if ((elem.clone().as_str() != "".to_string().as_str()) && is_recursive_type_by_name(&ctx.type_env.clone(), elem.clone())) { - { - let fields = inductive_fields_for(ctx.type_env.clone(), elem.clone()); -let cf = Rc::new({ let mut __result = Vec::new(); for f in fields.iter().cloned() { if match f.shape.clone() { - RecursionShape::ListRecursion => true, - _ => false, -} { __result.push(f); } } __result }).first().cloned(); -match cf { - Some(ind_field) => Some(Rc::new(SubValueRelation::StrictSubValue { - field: ind_field.clone(), - factor: Rc::new(ShrinkFactor::UnitShrink), -})), - None => None, + +pub fn maybe_insert_composed_field_relation( + acc: Rc>>, + fname: String, + composed: Option>, +) -> Rc>> { + match composed { + Some(rel) => match (*rel.clone()).clone() { + SubValueRelation::SubValueUnknown => acc, + _ => v2_rt::rc_map_insert(acc, fname, rel.clone()), + }, + None => acc, + } } + +pub fn maybe_insert_output_field_relation( + acc: Rc>>, + idx: i64, + fname: String, + sig: Rc, + val: Rc, + ctx: Rc, +) -> Rc>> { + { + let composed = match sig.output_provenance.clone().get(idx as usize).cloned() { + Some(param_map) => classify_call_via_provenance(val, ¶m_map, ctx), + None => None, + }; + maybe_insert_composed_field_relation(acc, fname, composed) + } } - } else { - None + +pub fn maybe_insert_match_field_relation( + fp_acc: Rc>>, + pname: &String, + field_label: String, + vname: String, + scrut_rel: Option>, + param_types: Rc>, + type_env: Rc, +) -> Rc>> { + match scrut_rel { + Some(rel) => { + let lookup_type = match (*rel.clone()).clone() { + SubValueRelation::PreservedValue => { + match v2_rt::map_get(¶m_types, pname.clone()) { + Some(t) => t.clone(), + None => "".to_string(), + } } + SubValueRelation::StrictSubValue { field: f, .. } => f.element_type.clone(), + SubValueRelation::IteratedSubValue { field: f, .. } => f.element_type.clone(), + _ => "".to_string(), + }; + if (lookup_type.clone().as_str() != "".to_string().as_str()) { + { + let ind_fields = inductive_fields_for(type_env, lookup_type.clone()); + let matching = Rc::new({ + let mut __result = Vec::new(); + for f in ind_fields.iter().cloned() { + if ((f.field_name.clone().as_str() == field_label.clone().as_str()) + && ((f.variant_name.clone().as_str() == vname.clone().as_str()) + || (f.variant_name.clone().as_str() + == "".to_string().as_str()))) + { + __result.push(f); + } + } + __result + }) + .first() + .cloned(); + match matching { + Some(ind_field) => v2_rt::rc_map_insert( + fp_acc, + pname.clone(), + compose_sub_value(rel.clone(), ind_field.clone()), + ), + None => fp_acc, + } + } + } else { + fp_acc + } + } + None => fp_acc, + } } - } else { - None - }, - _ => None, -}; -match type_based.clone() { - Some(_) => type_based.clone(), - None => match (*val.expr_data.clone()).clone() { - ExprData::ExprBinOp { op, .. } => { - let left = binop_left(val.clone()); -let right = binop_right(val.clone()); -match op.clone() { - BinOp::Sub => match (*left.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let lname = expr_var_name_at(left.clone(), ctx.type_env.clone().source_indices.clone()); -if ((v2_rt::map_get(&ctx.param_names.clone(), lname.clone()) != None) || (v2_rt::map_get(&ctx.sub_value_vars.clone(), lname.clone()) != None)) { - match (*right.expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitInt { value: k, .. } = value.as_ref() else { unreachable!() }; match positive_descent_amount_from_positive_int(k.clone()) { - Some(steps) => Some(Rc::new(SubValueRelation::ArithmeticDescent { - param: lname.clone(), - factor: Rc::new(ShrinkFactor::ConstantShrink { - steps: steps.clone(), -}), -})), - None => None, -} }, - _ => None, -} - } else { - None + +pub fn build_per_field_for_let( + val: &Rc, + binding_name: String, + ctx: &Rc, +) -> Rc>>>> { + match (*val.expr_data.clone()).clone() { + ExprData::ExprCall { .. } => { + let callee = + expr_call_func_at(val.clone(), ctx.type_env.clone().source_indices.clone()); + match v2_rt::map_get(&ctx.func_sigs.clone(), callee) { + Some(sig) => { + if ((sig.output_provenance.clone().len() as i64) > 1) { + { + let return_type = sig.inferred.clone(); + let field_map = Rc::new( + return_type + .children + .clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + .fold( + v2_rt::rc_empty_map::>(), + |acc: Rc>>, + pair: (i64, Rc)| { + let idx = pair.0.clone(); + let field_node = pair.1.clone(); + let fname = authored_name_at( + ctx.type_env.clone().source_indices.clone(), + &field_node, + ); + maybe_insert_output_field_relation( + acc, + idx.clone(), + fname.clone(), + sig.clone(), + val.clone(), + ctx.clone(), + ) + }, + ); + if ((Rc::new(v2_rt::map_keys(&field_map)).len() as i64) > 0) { + v2_rt::rc_map_insert( + ctx.per_field_vars.clone(), + binding_name, + field_map.clone(), + ) + } else { + ctx.per_field_vars.clone() + } + } + } else { + ctx.per_field_vars.clone() + } } -}, - _ => None, -}, - BinOp::Div => { - let left_name = match (*left.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let lname = expr_var_name_at(left.clone(), ctx.type_env.clone().source_indices.clone()); -if ((v2_rt::map_get(&ctx.param_names.clone(), lname.clone()) != None) || (v2_rt::map_get(&ctx.sub_value_vars.clone(), lname.clone()) != None)) { - lname.clone() + None => ctx.per_field_vars.clone(), + } + } + ExprData::ExprMethodCall { .. } => { + let callee = + expr_method_name_at(val.clone(), ctx.type_env.clone().source_indices.clone()); + match v2_rt::map_get(&ctx.func_sigs.clone(), callee) { + Some(sig) => { + if ((sig.output_provenance.clone().len() as i64) > 1) { + { + let return_type = sig.inferred.clone(); + let field_map = Rc::new( + return_type + .children + .clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + .fold( + v2_rt::rc_empty_map::>(), + |acc: Rc>>, + pair: (i64, Rc)| { + let idx = pair.0.clone(); + let field_node = pair.1.clone(); + let fname = authored_name_at( + ctx.type_env.clone().source_indices.clone(), + &field_node, + ); + maybe_insert_output_field_relation( + acc, + idx.clone(), + fname.clone(), + sig.clone(), + val.clone(), + ctx.clone(), + ) + }, + ); + if ((Rc::new(v2_rt::map_keys(&field_map)).len() as i64) > 0) { + v2_rt::rc_map_insert( + ctx.per_field_vars.clone(), + binding_name, + field_map.clone(), + ) + } else { + ctx.per_field_vars.clone() + } + } } else { - "".to_string() + ctx.per_field_vars.clone() } -}, - ExprData::ExprBinOp { op: BinOp::Sub, .. } => { - let inner_left = binop_left(left.clone()); -match (*inner_left.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let lname = expr_var_name_at(inner_left.clone(), ctx.type_env.clone().source_indices.clone()); -if ((v2_rt::map_get(&ctx.param_names.clone(), lname.clone()) != None) || (v2_rt::map_get(&ctx.sub_value_vars.clone(), lname.clone()) != None)) { - lname.clone() + } + None => ctx.per_field_vars.clone(), + } + } + _ => ctx.per_field_vars.clone(), + } +} + +pub fn resolve_collection_field( + mut expr: Rc, + mut ctx: Rc, +) -> Option> { + loop { + match (*expr.expr_data.clone()).clone() { + ExprData::ExprFieldAccess { .. } => { + let base = field_access_base(expr.clone()); + let fname = field_access_field_at( + expr.clone(), + ctx.type_env.clone().source_indices.clone(), + ); + match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let bname = expr_var_name_at( + base.clone(), + ctx.type_env.clone().source_indices.clone(), + ); + let base_type = + match v2_rt::map_get(&ctx.param_names.clone(), bname.clone()) { + Some(t) => t.clone(), + None => { + match v2_rt::map_get(&ctx.sub_value_vars.clone(), bname.clone()) + { + Some(rel) => match (*rel.clone()).clone() { + SubValueRelation::StrictSubValue { + field: f, .. + } => f.element_type.clone(), + SubValueRelation::IteratedSubValue { + field: f, .. + } => f.element_type.clone(), + _ => "".to_string(), + }, + None => "".to_string(), + } + } + }; + if (base_type.clone().as_str() != "".to_string().as_str()) { + break Rc::new({ + let mut __result = Vec::new(); + for f in Rc::new({ + let mut __result = Vec::new(); + for f in inductive_fields_for( + ctx.type_env.clone(), + base_type.clone(), + ) + .iter() + .cloned() + { + if (f.field_name.clone().as_str() == fname.clone().as_str()) + { + __result.push(f); + } + } + __result + }) + .iter() + .cloned() + { + if match f.shape.clone() { + RecursionShape::ListRecursion => true, + _ => false, + } { + __result.push(f); + } + } + __result + }) + .first() + .cloned(); } else { - "".to_string() + break None; } -}, - _ => "".to_string(), -} -}, - _ => "".to_string(), -}; -if (left_name.clone().as_str() != "".to_string().as_str()) { - match (*right.expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitInt { value: k, .. } = value.as_ref() else { unreachable!() }; match proportional_divisor_from_int_at_least_two(k.clone()) { - Some(div_w) => Some(Rc::new(SubValueRelation::ArithmeticDescent { - param: left_name.clone(), - factor: Rc::new(ShrinkFactor::ProportionalShrink { - divisor: div_w.clone(), -}), -})), - None => None, -} }, - _ => None, -} + } + _ => { + break None; + } + } + } + ExprData::ExprVar { .. } => { + let rname = + expr_var_name_at(expr.clone(), ctx.type_env.clone().source_indices.clone()); + match v2_rt::map_get(&ctx.sub_value_vars.clone(), rname) { + Some(rel) => match (*rel.clone()).clone() { + SubValueRelation::StrictSubValue { field: f, .. } => { + match f.shape.clone() { + RecursionShape::ListRecursion => { + break Some(f.clone()); + } + _ => { + break None; + } + } + } + SubValueRelation::IteratedSubValue { field: f, .. } => { + match f.shape.clone() { + RecursionShape::ListRecursion => { + break Some(f.clone()); + } + _ => { + break None; + } + } + } + _ => { + break None; + } + }, + None => { + break None; + } + } + } + ExprData::ExprMethodCall { .. } => { + let inner_mname = + expr_method_name_at(expr.clone(), ctx.type_env.clone().source_indices.clone()); + let is_collection_preserving = (((((inner_mname.clone().as_str() + == "enumerate".to_string().as_str()) + || (inner_mname.clone().as_str() == "skip".to_string().as_str())) + || (inner_mname.clone().as_str() == "take".to_string().as_str())) + || (inner_mname.clone().as_str() == "filter".to_string().as_str())) + || (inner_mname.clone().as_str() == "reverse".to_string().as_str())); + if is_collection_preserving { + { + let __tco_0 = method_receiver(expr); + expr = __tco_0; + continue; + } } else { - None + break None; } -}, - BinOp::Add => None, - _ => None, + } + _ => { + break None; + } + } + } } -}, - ExprData::ExprMethodCall { .. } => { - let mname = expr_method_name_at(val.clone(), ctx.type_env.clone().source_indices.clone()); -let is_collection_preserving = (((((mname.clone().as_str() == "skip".to_string().as_str()) || (mname.clone().as_str() == "filter".to_string().as_str())) || (mname.clone().as_str() == "take".to_string().as_str())) || (mname.clone().as_str() == "enumerate".to_string().as_str())) || (mname.clone().as_str() == "reverse".to_string().as_str())); -if is_collection_preserving { - { - let receiver = method_receiver(val.clone()); -let coll_field = resolve_collection_field(receiver.clone(), ctx.clone()); -match coll_field { - Some(ind_field) => Some(Rc::new(SubValueRelation::StrictSubValue { - field: ind_field.clone(), - factor: Rc::new(ShrinkFactor::UnitShrink), -})), - None => if (mname.clone().as_str() == "skip".to_string().as_str()) { + +pub fn classify_binding_provenance(val: &Rc, scope: &Rc) -> Rc { + match (*val.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let vname = + expr_var_name_at(val.clone(), scope.type_env.clone().source_indices.clone()); + match v2_rt::map_get(&scope.locals.clone(), vname) { + Some(binding) => binding.provenance.clone(), + None => Rc::new(SubValueRelation::SubValueUnknown), + } + } + ExprData::ExprFieldAccess { .. } => { + let base = field_access_base(val.clone()); + let field = + field_access_field_at(val.clone(), scope.type_env.clone().source_indices.clone()); + match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let bname = expr_var_name_at( + base.clone(), + scope.type_env.clone().source_indices.clone(), + ); + match v2_rt::map_get(&scope.locals.clone(), bname) { + Some(binding) => { + let fields = inductive_fields_for( + scope.type_env.clone(), + authored_name_at( + scope.type_env.clone().source_indices.clone(), + &binding.resolved.clone(), + ), + ); + let matching = Rc::new({ + let mut __result = Vec::new(); + for f in fields.iter().cloned() { + if (f.field_name.clone().as_str() == field.clone().as_str()) { + __result.push(f); + } + } + __result + }) + .first() + .cloned(); + match matching { + Some(ind_field) => { + compose_sub_value(binding.provenance.clone(), ind_field.clone()) + } + None => Rc::new(SubValueRelation::SubValueUnknown), + } + } + None => Rc::new(SubValueRelation::SubValueUnknown), + } + } + _ => Rc::new(SubValueRelation::SubValueUnknown), + } + } + _ => Rc::new(SubValueRelation::SubValueUnknown), + } +} + +pub fn classify_let_value( + val: &Rc, + ctx: &Rc, +) -> Option> { + match (*val.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let vname = expr_var_name_at(val.clone(), ctx.type_env.clone().source_indices.clone()); + match v2_rt::map_get(&ctx.scope_locals.clone(), vname) { + Some(binding) => match (*binding.provenance.clone()).clone() { + SubValueRelation::SubValueUnknown => None, + _ => Some(binding.provenance.clone()), + }, + None => None, + } + } + ExprData::ExprFieldAccess { .. } => { + let base = field_access_base(val.clone()); + let field = + field_access_field_at(val.clone(), ctx.type_env.clone().source_indices.clone()); + match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let bname = + expr_var_name_at(base.clone(), ctx.type_env.clone().source_indices.clone()); + let from_per_field = + match v2_rt::map_get(&ctx.per_field_vars.clone(), bname.clone()) { + Some(field_map) => v2_rt::map_get(&field_map, field.clone()), + None => None, + }; + match from_per_field { + Some(rel) => Some(rel.clone()), + None => { + let type_name = + match v2_rt::map_get(&ctx.scope_locals.clone(), bname.clone()) { + Some(binding) => authored_name_at( + ctx.type_env.clone().source_indices.clone(), + &binding.resolved.clone(), + ), + None => match v2_rt::map_get( + &ctx.param_names.clone(), + bname.clone(), + ) { + Some(t) => t.clone(), + None => "".to_string(), + }, + }; + if (type_name.clone().as_str() != "".to_string().as_str()) { + { + let fields = inductive_fields_for( + ctx.type_env.clone(), + type_name.clone(), + ); + let matching = Rc::new({ + let mut __result = Vec::new(); + for f in fields.iter().cloned() { + if (f.field_name.clone().as_str() + == field.clone().as_str()) + { + __result.push(f); + } + } + __result + }) + .first() + .cloned(); + match matching { + Some(ind_field) => { + Some(Rc::new(SubValueRelation::StrictSubValue { + field: ind_field.clone(), + factor: Rc::new(ShrinkFactor::UnitShrink), + })) + } + None => None, + } + } + } else { + None + } + } + } + } + _ => None, + } + } + ExprData::ExprCall { .. } => { + let callee = + expr_call_func_at(val.clone(), ctx.type_env.clone().source_indices.clone()); + let from_provenance = match v2_rt::map_get(&ctx.func_sigs.clone(), callee.clone()) { + Some(sig) => match sig.output_provenance.clone().first().cloned() { + Some(param_map) => { + classify_call_via_provenance(val.clone(), ¶m_map, ctx.clone()) + } + None => None, + }, + None => None, + }; + match from_provenance.clone() { + Some(_) => from_provenance.clone(), + None => { + if (is_child_accessor_in_model(callee.clone()) + || is_tree_size_reducing(callee.clone())) + { + { + let call_args = val.children.clone(); + match call_args.first().cloned() { + Some(first_arg) => { + let inner = arg_value(&first_arg); + match (*inner.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let iname = expr_var_name_at( + inner.clone(), + ctx.type_env.clone().source_indices.clone(), + ); + let inner_type = match v2_rt::map_get( + &ctx.param_names.clone(), + iname.clone(), + ) { + Some(t) => t.clone(), + None => match v2_rt::map_get( + &ctx.sub_value_vars.clone(), + iname.clone(), + ) { + Some(rel) => match (*rel.clone()).clone() { + SubValueRelation::StrictSubValue { + field: f, + .. + } => f.element_type.clone(), + SubValueRelation::IteratedSubValue { + field: f, + .. + } => f.element_type.clone(), + _ => "".to_string(), + }, + None => "".to_string(), + }, + }; + if (inner_type.clone().as_str() + != "".to_string().as_str()) + { + { + let fields = inductive_fields_for( + ctx.type_env.clone(), + inner_type.clone(), + ); + let cf = + Rc::new({ + let mut __result = Vec::new(); + for f in fields.iter().cloned() { + if match f.shape.clone() { + RecursionShape::ListRecursion => true, + _ => false, +} { __result.push(f); } + } + __result + }) + .first() + .cloned(); + match cf { + Some(ind_field) => Some(Rc::new( + SubValueRelation::StrictSubValue { + field: ind_field.clone(), + factor: Rc::new( + ShrinkFactor::UnitShrink, + ), + }, + )), + None => None, + } + } + } else { + None + } + } + _ => None, + } + } + None => None, + } + } + } else { + None + } + } + } + } + _ => { + let type_based = match val.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => { + if is_container_type(authored_name_at( + ctx.type_env.clone().source_indices.clone(), + &rt, + )) { { - let skip_args = method_arg_nodes(val.clone()); -let skip_amount = match skip_args.first().cloned() { - Some(a) => match (*arg_value(&a).expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitInt { value: k, .. } = value.as_ref() else { unreachable!() }; if (k.clone() > 0) { - k.clone() + let elem = match rt.children.clone().first().cloned() { + Some(c) => authored_name_at( + ctx.type_env.clone().source_indices.clone(), + &c, + ), + None => "".to_string(), + }; + if ((elem.clone().as_str() != "".to_string().as_str()) + && is_recursive_type_by_name(&ctx.type_env.clone(), elem.clone())) + { + { + let fields = + inductive_fields_for(ctx.type_env.clone(), elem.clone()); + let cf = Rc::new({ + let mut __result = Vec::new(); + for f in fields.iter().cloned() { + if match f.shape.clone() { + RecursionShape::ListRecursion => true, + _ => false, + } { + __result.push(f); + } + } + __result + }) + .first() + .cloned(); + match cf { + Some(ind_field) => { + Some(Rc::new(SubValueRelation::StrictSubValue { + field: ind_field.clone(), + factor: Rc::new(ShrinkFactor::UnitShrink), + })) + } + None => None, + } + } } else { - 0 - } }, - _ => 0, -}, - None => 0, -}; -if (skip_amount.clone() > 0) { - match (*receiver.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let rname = expr_var_name_at(receiver.clone(), ctx.type_env.clone().source_indices.clone()); -if ((v2_rt::map_get(&ctx.param_names.clone(), rname.clone()) != None) || (v2_rt::map_get(&ctx.sub_value_vars.clone(), rname.clone()) != None)) { - match positive_descent_amount_from_positive_int(skip_amount.clone()) { + None + } + } + } else { + None + } + } + _ => None, + }; + match type_based.clone() { + Some(_) => type_based.clone(), + None => match (*val.expr_data.clone()).clone() { + ExprData::ExprBinOp { op, .. } => { + let left = binop_left(val.clone()); + let right = binop_right(val.clone()); + match op.clone() { + BinOp::Sub => match (*left.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let lname = expr_var_name_at( + left.clone(), + ctx.type_env.clone().source_indices.clone(), + ); + if ((v2_rt::map_get(&ctx.param_names.clone(), lname.clone()) + != None) + || (v2_rt::map_get( + &ctx.sub_value_vars.clone(), + lname.clone(), + ) != None)) + { + match (*right.expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { + let LiteralValue::LitInt { value: k, .. } = + value.as_ref() + else { + unreachable!() + }; + match positive_descent_amount_from_positive_int( + k.clone(), + ) { + Some(steps) => Some(Rc::new( + SubValueRelation::ArithmeticDescent { + param: lname.clone(), + factor: Rc::new( + ShrinkFactor::ConstantShrink { + steps: steps.clone(), + }, + ), + }, + )), + None => None, + } + } + _ => None, + } + } else { + None + } + } + _ => None, + }, + BinOp::Div => { + let left_name = match (*left.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let lname = expr_var_name_at( + left.clone(), + ctx.type_env.clone().source_indices.clone(), + ); + if ((v2_rt::map_get( + &ctx.param_names.clone(), + lname.clone(), + ) != None) + || (v2_rt::map_get( + &ctx.sub_value_vars.clone(), + lname.clone(), + ) != None)) + { + lname.clone() + } else { + "".to_string() + } + } + ExprData::ExprBinOp { op: BinOp::Sub, .. } => { + let inner_left = binop_left(left.clone()); + match (*inner_left.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let lname = expr_var_name_at( + inner_left.clone(), + ctx.type_env.clone().source_indices.clone(), + ); + if ((v2_rt::map_get( + &ctx.param_names.clone(), + lname.clone(), + ) != None) + || (v2_rt::map_get( + &ctx.sub_value_vars.clone(), + lname.clone(), + ) != None)) + { + lname.clone() + } else { + "".to_string() + } + } + _ => "".to_string(), + } + } + _ => "".to_string(), + }; + if (left_name.clone().as_str() != "".to_string().as_str()) { + match (*right.expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { + let LiteralValue::LitInt { value: k, .. } = + value.as_ref() + else { + unreachable!() + }; + match proportional_divisor_from_int_at_least_two( + k.clone(), + ) { + Some(div_w) => Some(Rc::new( + SubValueRelation::ArithmeticDescent { + param: left_name.clone(), + factor: Rc::new( + ShrinkFactor::ProportionalShrink { + divisor: div_w.clone(), + }, + ), + }, + )), + None => None, + } + } + _ => None, + } + } else { + None + } + } + BinOp::Add => None, + _ => None, + } + } + ExprData::ExprMethodCall { .. } => { + let mname = expr_method_name_at( + val.clone(), + ctx.type_env.clone().source_indices.clone(), + ); + let is_collection_preserving = (((((mname.clone().as_str() + == "skip".to_string().as_str()) + || (mname.clone().as_str() == "filter".to_string().as_str())) + || (mname.clone().as_str() == "take".to_string().as_str())) + || (mname.clone().as_str() == "enumerate".to_string().as_str())) + || (mname.clone().as_str() == "reverse".to_string().as_str())); + if is_collection_preserving { + { + let receiver = method_receiver(val.clone()); + let coll_field = + resolve_collection_field(receiver.clone(), ctx.clone()); + match coll_field { + Some(ind_field) => { + Some(Rc::new(SubValueRelation::StrictSubValue { + field: ind_field.clone(), + factor: Rc::new(ShrinkFactor::UnitShrink), + })) + } + None => { + if (mname.clone().as_str() == "skip".to_string().as_str()) { + { + let skip_args = method_arg_nodes(val.clone()); + let skip_amount = match skip_args.first().cloned() { + Some(a) => match (*arg_value(&a) + .expr_data + .clone()) + .clone() + { + ExprData::ExprLiteral { + ref value, .. + } => { + let LiteralValue::LitInt { + value: k, + .. + } = value.as_ref() + else { + unreachable!() + }; + if (k.clone() > 0) { + k.clone() + } else { + 0 + } + } + _ => 0, + }, + None => 0, + }; + if (skip_amount.clone() > 0) { + match (*receiver.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let rname = expr_var_name_at( + receiver.clone(), + ctx.type_env + .clone() + .source_indices + .clone(), + ); + if ((v2_rt::map_get( + &ctx.param_names.clone(), + rname.clone(), + ) != None) + || (v2_rt::map_get( + &ctx.sub_value_vars.clone(), + rname.clone(), + ) != None)) + { + match positive_descent_amount_from_positive_int(skip_amount.clone()) { Some(steps) => { let synth_field = Rc::new(InductiveField { type_name: rname.clone(), @@ -3240,350 +5568,628 @@ Some(Rc::new(SubValueRelation::StrictSubValue { }, None => None, } - } else { - None + } else { + None + } + } + _ => None, + } + } else { + None + } + } + } else { + None + } } -}, - _ => None, -} - } else { - None + } } -} - } else { - None - }, -} -} - } else { - None + } else { + None + } + } + _ => None, + }, } -}, - _ => None, -}, -} -}, -} + } + } } -pub fn classify_call_via_provenance(call: Rc, param_map: &Rc>>, ctx: Rc) -> Option> { +pub fn classify_call_via_provenance( + call: Rc, + param_map: &Rc>>, + ctx: Rc, +) -> Option> { { let call_args = call.children.clone(); -let arg_by_name = call_args.iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, arg_node: Rc| match arg_name_at(arg_node.clone(), ctx.type_env.clone().source_indices.clone()) { - Some(aname) => v2_rt::rc_map_insert(acc.clone(), aname.clone(), arg_value(&arg_node)), - None => acc.clone(), -}); -Rc::new(v2_rt::map_keys(¶m_map)).iter().cloned().fold(None, |result: _, callee_pname: String| match v2_rt::map_get(¶m_map, callee_pname.clone()) { - Some(callee_rel) => match v2_rt::map_get(&arg_by_name, callee_pname.clone()) { - Some(arg_expr) => { - let arg_rel = classify_call_arg_provenance(&arg_expr, &ctx); -match arg_rel.clone() { - Some(arel) => { - let composed = compose_output_relations(arel.clone(), callee_rel.clone()); -match result.clone() { - Some(prev) => Some(meet_sub_value(prev.clone(), composed.clone())), - None => Some(composed.clone()), -} -}, - None => result.clone(), -} -}, - None => result.clone(), -}, - None => result.clone(), -}) -} + let arg_by_name = call_args.iter().cloned().fold( + v2_rt::rc_empty_map::>(), + |acc: Rc>>, arg_node: Rc| match arg_name_at( + arg_node.clone(), + ctx.type_env.clone().source_indices.clone(), + ) { + Some(aname) => { + v2_rt::rc_map_insert(acc.clone(), aname.clone(), arg_value(&arg_node)) + } + None => acc.clone(), + }, + ); + Rc::new(v2_rt::map_keys(¶m_map)).iter().cloned().fold( + None, + |result: _, callee_pname: String| match v2_rt::map_get(¶m_map, callee_pname.clone()) + { + Some(callee_rel) => match v2_rt::map_get(&arg_by_name, callee_pname.clone()) { + Some(arg_expr) => { + let arg_rel = classify_call_arg_provenance(&arg_expr, &ctx); + match arg_rel.clone() { + Some(arel) => { + let composed = + compose_output_relations(arel.clone(), callee_rel.clone()); + match result.clone() { + Some(prev) => { + Some(meet_sub_value(prev.clone(), composed.clone())) + } + None => Some(composed.clone()), + } + } + None => result.clone(), + } + } + None => result.clone(), + }, + None => result.clone(), + }, + ) + } } -pub fn classify_call_arg_provenance(arg_expr: &Rc, ctx: &Rc) -> Option> { +pub fn classify_call_arg_provenance( + arg_expr: &Rc, + ctx: &Rc, +) -> Option> { match (*arg_expr.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let name = expr_var_name_at(arg_expr.clone(), ctx.type_env.clone().source_indices.clone()); -if (v2_rt::map_get(&ctx.param_names.clone(), name.clone()) != None) { - Some(Rc::new(SubValueRelation::PreservedValue)) - } else { - v2_rt::map_get(&ctx.sub_value_vars.clone(), name.clone()) + ExprData::ExprVar { .. } => { + let name = expr_var_name_at( + arg_expr.clone(), + ctx.type_env.clone().source_indices.clone(), + ); + if (v2_rt::map_get(&ctx.param_names.clone(), name.clone()) != None) { + Some(Rc::new(SubValueRelation::PreservedValue)) + } else { + v2_rt::map_get(&ctx.sub_value_vars.clone(), name.clone()) + } } -}, - _ => classify_let_value(&arg_expr, &ctx), -} + _ => classify_let_value(&arg_expr, &ctx), + } } pub fn merge_argument_relations(rels: &Rc>>) -> Rc { match rels.clone().first().cloned() { - None => Rc::new(SubValueRelation::SubValueUnknown), - Some(first_rel) => Rc::new(rels.clone().iter().cloned().skip(1 as usize).collect::>()).iter().cloned().fold(first_rel.clone(), |acc: Rc, rel: Rc| meet_sub_value(acc, rel.clone())), -} + None => Rc::new(SubValueRelation::SubValueUnknown), + Some(first_rel) => Rc::new( + rels.clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ) + .iter() + .cloned() + .fold( + first_rel.clone(), + |acc: Rc, rel: Rc| meet_sub_value(acc, rel.clone()), + ), + } } -pub fn classify_argument(arg_expr: &Rc, param_name: &String, ctx: &Rc) -> Rc { +pub fn classify_argument( + arg_expr: &Rc, + param_name: &String, + ctx: &Rc, +) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*arg_expr.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let vname = expr_var_name_at(arg_expr.clone(), ctx.type_env.clone().source_indices.clone()); -if (vname.clone().as_str() == param_name.clone().as_str()) { - Rc::new(SubValueRelation::PreservedValue) - } else { - match v2_rt::map_get(&ctx.sub_value_vars.clone(), vname.clone()) { - Some(rel) => rel.clone(), - None => Rc::new(SubValueRelation::SubValueUnknown), -} + ExprData::ExprVar { .. } => { + let vname = expr_var_name_at( + arg_expr.clone(), + ctx.type_env.clone().source_indices.clone(), + ); + if (vname.clone().as_str() == param_name.clone().as_str()) { + Rc::new(SubValueRelation::PreservedValue) + } else { + match v2_rt::map_get(&ctx.sub_value_vars.clone(), vname.clone()) { + Some(rel) => rel.clone(), + None => Rc::new(SubValueRelation::SubValueUnknown), + } + } } -}, - ExprData::ExprFieldAccess { .. } => { - let base = field_access_base(arg_expr.clone()); -let field = field_access_field_at(arg_expr.clone(), ctx.type_env.clone().source_indices.clone()); -match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let bname = expr_var_name_at(base.clone(), ctx.type_env.clone().source_indices.clone()); -let type_name = match v2_rt::map_get(&ctx.param_names.clone(), bname.clone()) { - Some(t) => t.clone(), - None => match v2_rt::map_get(&ctx.sub_value_vars.clone(), bname.clone()) { - Some(rel) => match (*rel.clone()).clone() { - SubValueRelation::StrictSubValue { field: f, .. } => f.element_type.clone(), - SubValueRelation::IteratedSubValue { field: f, .. } => f.element_type.clone(), - _ => "".to_string(), -}, - None => "".to_string(), -}, -}; -let fields = inductive_fields_for(ctx.type_env.clone(), type_name); -let matching = Rc::new({ let mut __result = Vec::new(); for f in fields.iter().cloned() { if (f.field_name.clone().as_str() == field.clone().as_str()) { __result.push(f); } } __result }).first().cloned(); -match matching { - Some(ind_field) => Rc::new(SubValueRelation::StrictSubValue { - field: ind_field.clone(), - factor: Rc::new(ShrinkFactor::UnitShrink), -}), - None => Rc::new(SubValueRelation::SubValueUnknown), -} -}, - _ => Rc::new(SubValueRelation::SubValueUnknown), -} -}, - ExprData::ExprCall { .. } => { - let call_args = arg_expr.children.clone(); -match call_args.first().cloned() { - Some(first_arg) => { - let inner = arg_value(&first_arg); -let inner_rel = classify_argument(&inner, ¶m_name, &ctx); -match (*inner_rel.clone()).clone() { - SubValueRelation::StrictSubValue { .. } => inner_rel.clone(), - SubValueRelation::IteratedSubValue { .. } => inner_rel.clone(), - SubValueRelation::ArithmeticDescent { .. } => inner_rel.clone(), - SubValueRelation::PreservedValue => { - let callee = expr_call_func_at(arg_expr.clone(), ctx.type_env.clone().source_indices.clone()); -let from_provenance = match v2_rt::map_get(&ctx.func_sigs.clone(), callee.clone()) { - Some(sig) => match sig.output_provenance.clone().first().cloned() { - Some(param_map) => classify_call_via_provenance(arg_expr.clone(), ¶m_map, ctx.clone()), - None => None, -}, - None => None, -}; -match from_provenance { - Some(prov_rel) => prov_rel.clone(), - None => if (is_child_accessor_in_model(callee.clone()) || is_tree_size_reducing(callee.clone())) { - { - let type_name = match v2_rt::map_get(&ctx.param_names.clone(), param_name.clone()) { - Some(t) => t.clone(), - None => "".to_string(), -}; -let fields = inductive_fields_for(ctx.type_env.clone(), type_name); -let cf = Rc::new({ let mut __result = Vec::new(); for f in fields.iter().cloned() { if match f.shape.clone() { - RecursionShape::ListRecursion => true, - _ => false, -} { __result.push(f); } } __result }).first().cloned(); -match cf { - Some(ind_field) => Rc::new(SubValueRelation::StrictSubValue { - field: ind_field.clone(), - factor: Rc::new(ShrinkFactor::UnitShrink), -}), - None => Rc::new(SubValueRelation::PreservedValue), -} -} - } else { - if is_property_contraction(callee.clone()) { - Rc::new(SubValueRelation::ArithmeticDescent { - param: param_name.clone(), - factor: Rc::new(ShrinkFactor::ConstantShrink { - steps: Rc::new(PositiveDescentAmount::OneStep), -}), -}) - } else { - Rc::new(SubValueRelation::PreservedValue) + ExprData::ExprFieldAccess { .. } => { + let base = field_access_base(arg_expr.clone()); + let field = field_access_field_at( + arg_expr.clone(), + ctx.type_env.clone().source_indices.clone(), + ); + match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let bname = expr_var_name_at( + base.clone(), + ctx.type_env.clone().source_indices.clone(), + ); + let type_name = + match v2_rt::map_get(&ctx.param_names.clone(), bname.clone()) { + Some(t) => t.clone(), + None => { + match v2_rt::map_get(&ctx.sub_value_vars.clone(), bname.clone()) + { + Some(rel) => match (*rel.clone()).clone() { + SubValueRelation::StrictSubValue { + field: f, .. + } => f.element_type.clone(), + SubValueRelation::IteratedSubValue { + field: f, .. + } => f.element_type.clone(), + _ => "".to_string(), + }, + None => "".to_string(), + } + } + }; + let fields = inductive_fields_for(ctx.type_env.clone(), type_name); + let matching = Rc::new({ + let mut __result = Vec::new(); + for f in fields.iter().cloned() { + if (f.field_name.clone().as_str() == field.clone().as_str()) { + __result.push(f); + } + } + __result + }) + .first() + .cloned(); + match matching { + Some(ind_field) => Rc::new(SubValueRelation::StrictSubValue { + field: ind_field.clone(), + factor: Rc::new(ShrinkFactor::UnitShrink), + }), + None => Rc::new(SubValueRelation::SubValueUnknown), } - }, -} -}, - SubValueRelation::SubValueUnknown => Rc::new(SubValueRelation::SubValueUnknown), -} -}, - None => Rc::new(SubValueRelation::SubValueUnknown), -} -}, - ExprData::ExprMethodCall { .. } => classify_collection_shrink(&arg_expr, ¶m_name, &ctx), - ExprData::ExprBinOp { op, .. } => { - let left = binop_left(arg_expr.clone()); -let right = binop_right(arg_expr.clone()); -match op.clone() { - BinOp::Sub => { - let left_is_param = match (*left.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => ((expr_var_name_at(left.clone(), ctx.type_env.clone().source_indices.clone()).as_str() == param_name.clone().as_str()) || (v2_rt::map_get(&ctx.sub_value_vars.clone(), expr_var_name_at(left.clone(), ctx.type_env.clone().source_indices.clone())) != None)), - _ => false, -}; -if left_is_param { - match (*right.expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitInt { value: k, .. } = value.as_ref() else { unreachable!() }; match positive_descent_amount_from_positive_int(k.clone()) { - Some(steps) => Rc::new(SubValueRelation::ArithmeticDescent { - param: param_name.clone(), - factor: Rc::new(ShrinkFactor::ConstantShrink { - steps: steps.clone(), -}), -}), - None => Rc::new(SubValueRelation::SubValueUnknown), -} }, - _ => Rc::new(SubValueRelation::SubValueUnknown), -} - } else { - Rc::new(SubValueRelation::SubValueUnknown) + } + _ => Rc::new(SubValueRelation::SubValueUnknown), } -}, - BinOp::Div => { - let left_is_param = match (*left.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => ((expr_var_name_at(left.clone(), ctx.type_env.clone().source_indices.clone()).as_str() == param_name.clone().as_str()) || (v2_rt::map_get(&ctx.sub_value_vars.clone(), expr_var_name_at(left.clone(), ctx.type_env.clone().source_indices.clone())) != None)), - ExprData::ExprBinOp { op: BinOp::Sub, .. } => { - let inner_left = binop_left(left.clone()); -match (*inner_left.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => ((expr_var_name_at(inner_left.clone(), ctx.type_env.clone().source_indices.clone()).as_str() == param_name.clone().as_str()) || (v2_rt::map_get(&ctx.sub_value_vars.clone(), expr_var_name_at(inner_left.clone(), ctx.type_env.clone().source_indices.clone())) != None)), - _ => false, -} -}, - _ => false, -}; -if left_is_param { - match (*right.expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitInt { value: k, .. } = value.as_ref() else { unreachable!() }; match proportional_divisor_from_int_at_least_two(k.clone()) { - Some(div_w) => Rc::new(SubValueRelation::ArithmeticDescent { - param: param_name.clone(), - factor: Rc::new(ShrinkFactor::ProportionalShrink { - divisor: div_w.clone(), -}), -}), - None => Rc::new(SubValueRelation::SubValueUnknown), -} }, - _ => Rc::new(SubValueRelation::SubValueUnknown), -} - } else { - Rc::new(SubValueRelation::SubValueUnknown) + } + ExprData::ExprCall { .. } => { + let call_args = arg_expr.children.clone(); + match call_args.first().cloned() { + Some(first_arg) => { + let inner = arg_value(&first_arg); + let inner_rel = classify_argument(&inner, ¶m_name, &ctx); + match (*inner_rel.clone()).clone() { + SubValueRelation::StrictSubValue { .. } => inner_rel.clone(), + SubValueRelation::IteratedSubValue { .. } => inner_rel.clone(), + SubValueRelation::ArithmeticDescent { .. } => inner_rel.clone(), + SubValueRelation::PreservedValue => { + let callee = expr_call_func_at( + arg_expr.clone(), + ctx.type_env.clone().source_indices.clone(), + ); + let from_provenance = + match v2_rt::map_get(&ctx.func_sigs.clone(), callee.clone()) { + Some(sig) => { + match sig.output_provenance.clone().first().cloned() { + Some(param_map) => classify_call_via_provenance( + arg_expr.clone(), + ¶m_map, + ctx.clone(), + ), + None => None, + } + } + None => None, + }; + match from_provenance { + Some(prov_rel) => prov_rel.clone(), + None => { + if (is_child_accessor_in_model(callee.clone()) + || is_tree_size_reducing(callee.clone())) + { + { + let type_name = match v2_rt::map_get( + &ctx.param_names.clone(), + param_name.clone(), + ) { + Some(t) => t.clone(), + None => "".to_string(), + }; + let fields = inductive_fields_for( + ctx.type_env.clone(), + type_name, + ); + let cf = Rc::new({ + let mut __result = Vec::new(); + for f in fields.iter().cloned() { + if match f.shape.clone() { + RecursionShape::ListRecursion => true, + _ => false, + } { + __result.push(f); + } + } + __result + }) + .first() + .cloned(); + match cf { + Some(ind_field) => { + Rc::new(SubValueRelation::StrictSubValue { + field: ind_field.clone(), + factor: Rc::new( + ShrinkFactor::UnitShrink, + ), + }) + } + None => { + Rc::new(SubValueRelation::PreservedValue) + } + } + } + } else { + if is_property_contraction(callee.clone()) { + Rc::new(SubValueRelation::ArithmeticDescent { + param: param_name.clone(), + factor: Rc::new(ShrinkFactor::ConstantShrink { + steps: Rc::new( + PositiveDescentAmount::OneStep, + ), + }), + }) + } else { + Rc::new(SubValueRelation::PreservedValue) + } + } + } + } + } + SubValueRelation::SubValueUnknown => { + Rc::new(SubValueRelation::SubValueUnknown) + } + } + } + None => Rc::new(SubValueRelation::SubValueUnknown), } -}, - BinOp::Add => Rc::new(SubValueRelation::SubValueUnknown), - _ => Rc::new(SubValueRelation::SubValueUnknown), -} -}, - ExprData::ExprMatch => { - let arm_rels = Rc::new({ let mut __result = Vec::new(); for arm in match_arm_nodes(arg_expr.clone()).iter().cloned() { __result.push(classify_argument(&arm_body(&arm), ¶m_name, &ctx)); } __result }); -merge_argument_relations(&arm_rels) -}, - ExprData::ExprIf => { - let then_rel = classify_argument(&if_then_branch(arg_expr.clone()), ¶m_name, &ctx); -let else_rel = match if_else_branch(arg_expr.clone()) { - Some(e) => classify_argument(&e, ¶m_name, &ctx), - None => Rc::new(SubValueRelation::SubValueUnknown), -}; -merge_argument_relations(&Rc::new(vec![then_rel, else_rel])) -}, - ExprData::ExprBlock => match arg_expr.children.clone().last().cloned() { - Some(last_expr) => classify_argument(&last_expr, ¶m_name, &ctx), - None => Rc::new(SubValueRelation::SubValueUnknown), -}, - ExprData::ExprLet => match let_body(arg_expr.clone()) { - Some(body) => classify_argument(&body, ¶m_name, &ctx), - None => Rc::new(SubValueRelation::SubValueUnknown), -}, - ExprData::ExprCast => classify_argument(&cast_expr(arg_expr.clone()), ¶m_name, &ctx), - ExprData::ExprReturn => match arg_expr.children.clone().first().cloned() { - Some(inner) => classify_argument(&inner, ¶m_name, &ctx), - None => Rc::new(SubValueRelation::SubValueUnknown), -}, - _ => Rc::new(SubValueRelation::SubValueUnknown), -} + } + ExprData::ExprMethodCall { .. } => { + classify_collection_shrink(&arg_expr, ¶m_name, &ctx) + } + ExprData::ExprBinOp { op, .. } => { + let left = binop_left(arg_expr.clone()); + let right = binop_right(arg_expr.clone()); + match op.clone() { + BinOp::Sub => { + let left_is_param = match (*left.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + ((expr_var_name_at( + left.clone(), + ctx.type_env.clone().source_indices.clone(), + ) + .as_str() + == param_name.clone().as_str()) + || (v2_rt::map_get( + &ctx.sub_value_vars.clone(), + expr_var_name_at( + left.clone(), + ctx.type_env.clone().source_indices.clone(), + ), + ) != None)) + } + _ => false, + }; + if left_is_param { + match (*right.expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { + let LiteralValue::LitInt { value: k, .. } = value.as_ref() + else { + unreachable!() + }; + match positive_descent_amount_from_positive_int(k.clone()) { + Some(steps) => { + Rc::new(SubValueRelation::ArithmeticDescent { + param: param_name.clone(), + factor: Rc::new(ShrinkFactor::ConstantShrink { + steps: steps.clone(), + }), + }) + } + None => Rc::new(SubValueRelation::SubValueUnknown), + } + } + _ => Rc::new(SubValueRelation::SubValueUnknown), + } + } else { + Rc::new(SubValueRelation::SubValueUnknown) + } + } + BinOp::Div => { + let left_is_param = match (*left.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + ((expr_var_name_at( + left.clone(), + ctx.type_env.clone().source_indices.clone(), + ) + .as_str() + == param_name.clone().as_str()) + || (v2_rt::map_get( + &ctx.sub_value_vars.clone(), + expr_var_name_at( + left.clone(), + ctx.type_env.clone().source_indices.clone(), + ), + ) != None)) + } + ExprData::ExprBinOp { op: BinOp::Sub, .. } => { + let inner_left = binop_left(left.clone()); + match (*inner_left.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + ((expr_var_name_at( + inner_left.clone(), + ctx.type_env.clone().source_indices.clone(), + ) + .as_str() + == param_name.clone().as_str()) + || (v2_rt::map_get( + &ctx.sub_value_vars.clone(), + expr_var_name_at( + inner_left.clone(), + ctx.type_env.clone().source_indices.clone(), + ), + ) != None)) + } + _ => false, + } + } + _ => false, + }; + if left_is_param { + match (*right.expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { + let LiteralValue::LitInt { value: k, .. } = value.as_ref() + else { + unreachable!() + }; + match proportional_divisor_from_int_at_least_two(k.clone()) { + Some(div_w) => { + Rc::new(SubValueRelation::ArithmeticDescent { + param: param_name.clone(), + factor: Rc::new(ShrinkFactor::ProportionalShrink { + divisor: div_w.clone(), + }), + }) + } + None => Rc::new(SubValueRelation::SubValueUnknown), + } + } + _ => Rc::new(SubValueRelation::SubValueUnknown), + } + } else { + Rc::new(SubValueRelation::SubValueUnknown) + } + } + BinOp::Add => Rc::new(SubValueRelation::SubValueUnknown), + _ => Rc::new(SubValueRelation::SubValueUnknown), + } + } + ExprData::ExprMatch => { + let arm_rels = Rc::new({ + let mut __result = Vec::new(); + for arm in match_arm_nodes(arg_expr.clone()).iter().cloned() { + __result.push(classify_argument(&arm_body(&arm), ¶m_name, &ctx)); + } + __result + }); + merge_argument_relations(&arm_rels) + } + ExprData::ExprIf => { + let then_rel = + classify_argument(&if_then_branch(arg_expr.clone()), ¶m_name, &ctx); + let else_rel = match if_else_branch(arg_expr.clone()) { + Some(e) => classify_argument(&e, ¶m_name, &ctx), + None => Rc::new(SubValueRelation::SubValueUnknown), + }; + merge_argument_relations(&Rc::new(vec![then_rel, else_rel])) + } + ExprData::ExprBlock => match arg_expr.children.clone().last().cloned() { + Some(last_expr) => classify_argument(&last_expr, ¶m_name, &ctx), + None => Rc::new(SubValueRelation::SubValueUnknown), + }, + ExprData::ExprLet => match let_body(arg_expr.clone()) { + Some(body) => classify_argument(&body, ¶m_name, &ctx), + None => Rc::new(SubValueRelation::SubValueUnknown), + }, + ExprData::ExprCast => { + classify_argument(&cast_expr(arg_expr.clone()), ¶m_name, &ctx) + } + ExprData::ExprReturn => match arg_expr.children.clone().first().cloned() { + Some(inner) => classify_argument(&inner, ¶m_name, &ctx), + None => Rc::new(SubValueRelation::SubValueUnknown), + }, + _ => Rc::new(SubValueRelation::SubValueUnknown), + } }) } -pub fn read_arg_provenance(arg_expr: &Rc, param_name: String, ctx: &Rc) -> Rc { +pub fn read_arg_provenance( + arg_expr: &Rc, + param_name: String, + ctx: &Rc, +) -> Rc { match (*arg_expr.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let vname = expr_var_name_at(arg_expr.clone(), ctx.type_env.clone().source_indices.clone()); -match v2_rt::map_get(&ctx.scope_locals.clone(), vname) { - Some(binding) => match (*binding.provenance.clone()).clone() { - SubValueRelation::SubValueUnknown => classify_argument(&arg_expr, ¶m_name, &ctx), - _ => binding.provenance.clone(), -}, - None => classify_argument(&arg_expr, ¶m_name, &ctx), -} -}, - ExprData::ExprFieldAccess { .. } => { - let base = field_access_base(arg_expr.clone()); -let field = field_access_field_at(arg_expr.clone(), ctx.type_env.clone().source_indices.clone()); -match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let bname = expr_var_name_at(base.clone(), ctx.type_env.clone().source_indices.clone()); -match v2_rt::map_get(&ctx.scope_locals.clone(), bname) { - Some(binding) => match (*binding.provenance.clone()).clone() { - SubValueRelation::SubValueUnknown => classify_argument(&arg_expr, ¶m_name, &ctx), - _ => { - let fields = inductive_fields_for(ctx.type_env.clone(), authored_name_at(ctx.type_env.clone().source_indices.clone(), &binding.resolved.clone())); -let matching = Rc::new({ let mut __result = Vec::new(); for f in fields.iter().cloned() { if (f.field_name.clone().as_str() == field.clone().as_str()) { __result.push(f); } } __result }).first().cloned(); -match matching { - Some(ind_field) => compose_sub_value(binding.provenance.clone(), ind_field.clone()), - None => Rc::new(SubValueRelation::SubValueUnknown), -} -}, -}, - None => classify_argument(&arg_expr, ¶m_name, &ctx), -} -}, - _ => Rc::new(SubValueRelation::SubValueUnknown), -} -}, - ExprData::ExprCall { .. } => classify_argument(&arg_expr, ¶m_name, &ctx), - ExprData::ExprMethodCall { .. } => classify_argument(&arg_expr, ¶m_name, &ctx), - ExprData::ExprBinOp { .. } => classify_argument(&arg_expr, ¶m_name, &ctx), - ExprData::ExprMatch => classify_argument(&arg_expr, ¶m_name, &ctx), - ExprData::ExprIf => classify_argument(&arg_expr, ¶m_name, &ctx), - ExprData::ExprBlock => classify_argument(&arg_expr, ¶m_name, &ctx), - ExprData::ExprLet => classify_argument(&arg_expr, ¶m_name, &ctx), - ExprData::ExprCast => classify_argument(&arg_expr, ¶m_name, &ctx), - ExprData::ExprReturn => classify_argument(&arg_expr, ¶m_name, &ctx), - _ => Rc::new(SubValueRelation::SubValueUnknown), -} + ExprData::ExprVar { .. } => { + let vname = expr_var_name_at( + arg_expr.clone(), + ctx.type_env.clone().source_indices.clone(), + ); + match v2_rt::map_get(&ctx.scope_locals.clone(), vname) { + Some(binding) => match (*binding.provenance.clone()).clone() { + SubValueRelation::SubValueUnknown => { + classify_argument(&arg_expr, ¶m_name, &ctx) + } + _ => binding.provenance.clone(), + }, + None => classify_argument(&arg_expr, ¶m_name, &ctx), + } + } + ExprData::ExprFieldAccess { .. } => { + let base = field_access_base(arg_expr.clone()); + let field = field_access_field_at( + arg_expr.clone(), + ctx.type_env.clone().source_indices.clone(), + ); + match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let bname = + expr_var_name_at(base.clone(), ctx.type_env.clone().source_indices.clone()); + match v2_rt::map_get(&ctx.scope_locals.clone(), bname) { + Some(binding) => match (*binding.provenance.clone()).clone() { + SubValueRelation::SubValueUnknown => { + classify_argument(&arg_expr, ¶m_name, &ctx) + } + _ => { + let fields = inductive_fields_for( + ctx.type_env.clone(), + authored_name_at( + ctx.type_env.clone().source_indices.clone(), + &binding.resolved.clone(), + ), + ); + let matching = Rc::new({ + let mut __result = Vec::new(); + for f in fields.iter().cloned() { + if (f.field_name.clone().as_str() == field.clone().as_str()) + { + __result.push(f); + } + } + __result + }) + .first() + .cloned(); + match matching { + Some(ind_field) => compose_sub_value( + binding.provenance.clone(), + ind_field.clone(), + ), + None => Rc::new(SubValueRelation::SubValueUnknown), + } + } + }, + None => classify_argument(&arg_expr, ¶m_name, &ctx), + } + } + _ => Rc::new(SubValueRelation::SubValueUnknown), + } + } + ExprData::ExprCall { .. } => classify_argument(&arg_expr, ¶m_name, &ctx), + ExprData::ExprMethodCall { .. } => classify_argument(&arg_expr, ¶m_name, &ctx), + ExprData::ExprBinOp { .. } => classify_argument(&arg_expr, ¶m_name, &ctx), + ExprData::ExprMatch => classify_argument(&arg_expr, ¶m_name, &ctx), + ExprData::ExprIf => classify_argument(&arg_expr, ¶m_name, &ctx), + ExprData::ExprBlock => classify_argument(&arg_expr, ¶m_name, &ctx), + ExprData::ExprLet => classify_argument(&arg_expr, ¶m_name, &ctx), + ExprData::ExprCast => classify_argument(&arg_expr, ¶m_name, &ctx), + ExprData::ExprReturn => classify_argument(&arg_expr, ¶m_name, &ctx), + _ => Rc::new(SubValueRelation::SubValueUnknown), + } } -pub fn build_call_evidence(call_node: &Rc, ctx: &Rc) -> Rc>> { +pub fn build_call_evidence( + call_node: &Rc, + ctx: &Rc, +) -> Rc>> { { - let arg_map = Rc::new(call_node.children.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, pair: (i64, Rc)| { - let idx = pair.0.clone(); -let arg_node = pair.1.clone(); -let aname = arg_name_at(arg_node.clone(), ctx.type_env.clone().source_indices.clone()); -match aname.clone() { - Some(pname) => v2_rt::rc_map_insert(acc.clone(), pname.clone(), arg_value(&arg_node)), - None => acc.clone(), -} -}); -let positional_args = Rc::new({ let mut __result = Vec::new(); for arg_node in Rc::new({ let mut __result = Vec::new(); for arg_node in call_node.children.clone().iter().cloned() { if (arg_name_at(arg_node.clone(), ctx.type_env.clone().source_indices.clone()) == None) { __result.push(arg_node); } } __result }).iter().cloned() { __result.push(arg_value(&arg_node)); } __result }); -let positional_idx = 0; -Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(ctx.param_order.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { __result.push({ - let def_idx = pair.0.clone(); -let pname = pair.1.clone(); -match v2_rt::map_get(&arg_map, pname.clone()) { - Some(arg_val) => read_arg_provenance(&arg_val, pname.clone(), &ctx), - None => match positional_args.clone().get(def_idx.clone() as usize).cloned() { - Some(arg_val) => read_arg_provenance(&arg_val, pname.clone(), &ctx), - None => Rc::new(SubValueRelation::SubValueUnknown), -}, -} -}); } __result }) -} + let arg_map = Rc::new( + call_node + .children + .clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + .fold( + v2_rt::rc_empty_map::>(), + |acc: Rc>>, pair: (i64, Rc)| { + let idx = pair.0.clone(); + let arg_node = pair.1.clone(); + let aname = arg_name_at( + arg_node.clone(), + ctx.type_env.clone().source_indices.clone(), + ); + match aname.clone() { + Some(pname) => { + v2_rt::rc_map_insert(acc.clone(), pname.clone(), arg_value(&arg_node)) + } + None => acc.clone(), + } + }, + ); + let positional_args = Rc::new({ + let mut __result = Vec::new(); + for arg_node in Rc::new({ + let mut __result = Vec::new(); + for arg_node in call_node.children.clone().iter().cloned() { + if (arg_name_at( + arg_node.clone(), + ctx.type_env.clone().source_indices.clone(), + ) == None) + { + __result.push(arg_node); + } + } + __result + }) + .iter() + .cloned() + { + __result.push(arg_value(&arg_node)); + } + __result + }); + let positional_idx = 0; + Rc::new({ + let mut __result = Vec::new(); + for pair in Rc::new( + ctx.param_order + .clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + { + __result.push({ + let def_idx = pair.0.clone(); + let pname = pair.1.clone(); + match v2_rt::map_get(&arg_map, pname.clone()) { + Some(arg_val) => read_arg_provenance(&arg_val, pname.clone(), &ctx), + None => match positional_args + .clone() + .get(def_idx.clone() as usize) + .cloned() + { + Some(arg_val) => read_arg_provenance(&arg_val, pname.clone(), &ctx), + None => Rc::new(SubValueRelation::SubValueUnknown), + }, + } + }); + } + __result + }) + } } pub fn descent_source_type(found: String, arg_node: &Rc, ctx: &Rc) -> String { @@ -3591,188 +6197,334 @@ pub fn descent_source_type(found: String, arg_node: &Rc, ctx: &Rc found.clone(), - _ => { - let arg_val = arg_value(&arg_node); -match (*arg_val.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let vname = expr_var_name_at(arg_val.clone(), ctx.type_env.clone().source_indices.clone()); -match v2_rt::map_get(&ctx.param_names.clone(), vname) { - Some(t) => t.clone(), - None => "".to_string(), -} -}, - _ => "".to_string(), -} -}, -} + ExprData::ExprLambda => found.clone(), + _ => { + let arg_val = arg_value(&arg_node); + match (*arg_val.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let vname = expr_var_name_at( + arg_val.clone(), + ctx.type_env.clone().source_indices.clone(), + ); + match v2_rt::map_get(&ctx.param_names.clone(), vname) { + Some(t) => t.clone(), + None => "".to_string(), + } + } + _ => "".to_string(), + } + } + } } } pub fn annotate_descent(body: &Rc, ctx: &Rc) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*body.expr_data.clone()).clone() { - ExprData::ExprCall { call_semantics: cs, .. } => { - let evidence = build_call_evidence(&body, &ctx); -let source_type = body.children.clone().iter().cloned().fold("".to_string(), |found: String, arg_node: Rc| descent_source_type(found, &arg_node, &ctx)); -let annotated_children = Rc::new({ let mut __result = Vec::new(); for child in body.children.clone().iter().cloned() { __result.push({ - let arg_val = arg_value(&child); -match (*arg_val.expr_data.clone()).clone() { - ExprData::ExprLambda => if (source_type.clone().as_str() != "".to_string().as_str()) { - { - let lparams = lambda_param_names_at(arg_val.clone(), ctx.type_env.clone().source_indices.clone()); -let p1 = match lparams.clone().first().cloned() { - Some(n) => n.clone(), - None => "".to_string(), -}; -let p2 = match lparams.clone().get(1 as usize).cloned() { - Some(n) => n.clone(), - None => "".to_string(), -}; -let lambda_ctx = Rc::new(DescentContext { - fn_name: ctx.fn_name.clone(), - param_names: if (p2.clone().as_str() != "".to_string().as_str()) { - v2_rt::rc_map_insert(v2_rt::rc_map_insert(ctx.param_names.clone(), p1.clone(), source_type.clone()), p2.clone(), source_type.clone()) - } else { - if (p1.clone().as_str() != "".to_string().as_str()) { - v2_rt::rc_map_insert(ctx.param_names.clone(), p1.clone(), source_type.clone()) - } else { - ctx.param_names.clone() - } + ExprData::ExprCall { + call_semantics: cs, .. + } => { + let evidence = build_call_evidence(&body, &ctx); + let source_type = + body.children.clone().iter().cloned().fold( + "".to_string(), + |found: String, arg_node: Rc| { + descent_source_type(found, &arg_node, &ctx) }, - param_order: ctx.param_order.clone(), - type_env: ctx.type_env.clone(), - sub_value_vars: if (p1.clone().as_str() != "".to_string().as_str()) { - { - let source_fields = inductive_fields_for(ctx.type_env.clone(), source_type.clone()); -let cf = Rc::new({ let mut __result = Vec::new(); for f in source_fields.clone().iter().cloned() { if match f.shape.clone() { + ); + let annotated_children = Rc::new({ + let mut __result = Vec::new(); + for child in body.children.clone().iter().cloned() { + __result.push({ + let arg_val = arg_value(&child); + match (*arg_val.expr_data.clone()).clone() { + ExprData::ExprLambda => { + if (source_type.clone().as_str() != "".to_string().as_str()) { + { + let lparams = lambda_param_names_at( + arg_val.clone(), + ctx.type_env.clone().source_indices.clone(), + ); + let p1 = match lparams.clone().first().cloned() { + Some(n) => n.clone(), + None => "".to_string(), + }; + let p2 = match lparams.clone().get(1 as usize).cloned() + { + Some(n) => n.clone(), + None => "".to_string(), + }; + let lambda_ctx = Rc::new(DescentContext { + fn_name: ctx.fn_name.clone(), + param_names: if (p2.clone().as_str() + != "".to_string().as_str()) + { + v2_rt::rc_map_insert( + v2_rt::rc_map_insert( + ctx.param_names.clone(), + p1.clone(), + source_type.clone(), + ), + p2.clone(), + source_type.clone(), + ) + } else { + if (p1.clone().as_str() + != "".to_string().as_str()) + { + v2_rt::rc_map_insert( + ctx.param_names.clone(), + p1.clone(), + source_type.clone(), + ) + } else { + ctx.param_names.clone() + } + }, + param_order: ctx.param_order.clone(), + type_env: ctx.type_env.clone(), + sub_value_vars: if (p1.clone().as_str() + != "".to_string().as_str()) + { + { + let source_fields = inductive_fields_for( + ctx.type_env.clone(), + source_type.clone(), + ); + let cf = Rc::new({ + let mut __result = Vec::new(); + for f in source_fields + .clone() + .iter() + .cloned() + { + if match f.shape.clone() { RecursionShape::ListRecursion => true, _ => false, -} { __result.push(f); } } __result }).first().cloned(); -let rel = match cf.clone() { +} { __result.push(f); } + } + __result + }) + .first() + .cloned(); + let rel = match cf.clone() { Some(f) => Rc::new(SubValueRelation::IteratedSubValue { field: f.clone(), }), None => Rc::new(SubValueRelation::PreservedValue), }; -if (p2.clone().as_str() != "".to_string().as_str()) { - v2_rt::rc_map_insert(v2_rt::rc_map_insert(ctx.sub_value_vars.clone(), p1.clone(), rel.clone()), p2.clone(), rel.clone()) + if (p2.clone().as_str() + != "".to_string().as_str()) + { + v2_rt::rc_map_insert( + v2_rt::rc_map_insert( + ctx.sub_value_vars.clone(), + p1.clone(), + rel.clone(), + ), + p2.clone(), + rel.clone(), + ) + } else { + v2_rt::rc_map_insert( + ctx.sub_value_vars.clone(), + p1.clone(), + rel.clone(), + ) + } + } + } else { + ctx.sub_value_vars.clone() + }, + size_aliases: ctx.size_aliases.clone(), + scope_locals: ctx.scope_locals.clone(), + func_sigs: ctx.func_sigs.clone(), + per_field_vars: ctx.per_field_vars.clone(), + }); + make_arg_node( + arg_name_at( + child.clone(), + ctx.type_env.clone().source_indices.clone(), + ), + annotate_descent(&arg_val, &lambda_ctx), + child.span.clone(), + child.span.clone(), + ) + } + } else { + make_arg_node( + arg_name_at( + child.clone(), + ctx.type_env.clone().source_indices.clone(), + ), + annotate_descent(&arg_val, &ctx), + child.span.clone(), + child.span.clone(), + ) + } + } + _ => make_arg_node( + arg_name_at( + child.clone(), + ctx.type_env.clone().source_indices.clone(), + ), + annotate_descent(&arg_val, &ctx), + child.span.clone(), + child.span.clone(), + ), + } + }); + } + __result + }); + Rc::new(Node { + name: body.name.clone(), + span: body.span.clone(), + ident_span: body.ident_span.clone(), + children: annotated_children, + connective: body.connective.clone(), + params: body.params.clone(), + inferred: body.inferred.clone(), + return_cardinality: body.return_cardinality.clone(), + uses: body.uses.clone(), + body: body.body.clone(), + transport: body.transport.clone(), + properties: body.properties.clone(), + type_annotation: body.type_annotation.clone(), + is_self_recursive: body.is_self_recursive.clone(), + has_non_tail_self_call: body.has_non_tail_self_call.clone(), + match_pattern: body.match_pattern.clone(), + expr_data: Rc::new(ExprData::ExprCall { + call_semantics: cs.clone(), + descent_evidence: Some(evidence), + }), + ident: None, + }) + } + ExprData::ExprMatch => { + let scrut = match_scrutinee(body.clone()); + let scrut_type = match (*scrut.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let sname = expr_var_name_at( + scrut.clone(), + ctx.type_env.clone().source_indices.clone(), + ); + match v2_rt::map_get(&ctx.param_names.clone(), sname.clone()) { + Some(t) => t.clone(), + None => { + match v2_rt::map_get(&ctx.sub_value_vars.clone(), sname.clone()) { + Some(rel) => match (*rel.clone()).clone() { + SubValueRelation::StrictSubValue { field: f, .. } => { + f.element_type.clone() + } + SubValueRelation::IteratedSubValue { field: f, .. } => { + f.element_type.clone() + } + _ => "".to_string(), + }, + None => "".to_string(), + } + } + } + } + _ => "".to_string(), + }; + let scrut_inducing_field = match (*scrut.expr_data.clone()).clone() { + ExprData::ExprFieldAccess { .. } => { + let base = field_access_base(scrut.clone()); + let fname = field_access_field_at( + scrut.clone(), + ctx.type_env.clone().source_indices.clone(), + ); + match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let bname = expr_var_name_at( + base.clone(), + ctx.type_env.clone().source_indices.clone(), + ); + let base_type = + match v2_rt::map_get(&ctx.param_names.clone(), bname.clone()) { + Some(t) => t.clone(), + None => "".to_string(), + }; + if (base_type.clone().as_str() != "".to_string().as_str()) { + { + let ind_fields = inductive_fields_for( + ctx.type_env.clone(), + base_type.clone(), + ); + Rc::new({ + let mut __result = Vec::new(); + for f in ind_fields.clone().iter().cloned() { + if (f.field_name.clone().as_str() + == fname.clone().as_str()) + { + __result.push(f); + } + } + __result + }) + .first() + .cloned() + } } else { - v2_rt::rc_map_insert(ctx.sub_value_vars.clone(), p1.clone(), rel.clone()) + None } -} - } else { - ctx.sub_value_vars.clone() - }, - size_aliases: ctx.size_aliases.clone(), - scope_locals: ctx.scope_locals.clone(), - func_sigs: ctx.func_sigs.clone(), - per_field_vars: ctx.per_field_vars.clone(), -}); -make_arg_node(arg_name_at(child.clone(), ctx.type_env.clone().source_indices.clone()), annotate_descent(&arg_val, &lambda_ctx), child.span.clone(), child.span.clone()) -} - } else { - make_arg_node(arg_name_at(child.clone(), ctx.type_env.clone().source_indices.clone()), annotate_descent(&arg_val, &ctx), child.span.clone(), child.span.clone()) - }, - _ => make_arg_node(arg_name_at(child.clone(), ctx.type_env.clone().source_indices.clone()), annotate_descent(&arg_val, &ctx), child.span.clone(), child.span.clone()), -} -}); } __result }); -Rc::new(Node { - name: body.name.clone(), - span: body.span.clone(), - ident_span: body.ident_span.clone(), - children: annotated_children, - connective: body.connective.clone(), - params: body.params.clone(), - inferred: body.inferred.clone(), - return_cardinality: body.return_cardinality.clone(), - uses: body.uses.clone(), - body: body.body.clone(), - transport: body.transport.clone(), - properties: body.properties.clone(), - type_annotation: body.type_annotation.clone(), - is_self_recursive: body.is_self_recursive.clone(), - has_non_tail_self_call: body.has_non_tail_self_call.clone(), - match_pattern: body.match_pattern.clone(), - expr_data: Rc::new(ExprData::ExprCall { - call_semantics: cs.clone(), - descent_evidence: Some(evidence), -}), - ident: None, -}) -}, - ExprData::ExprMatch => { - let scrut = match_scrutinee(body.clone()); -let scrut_type = match (*scrut.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let sname = expr_var_name_at(scrut.clone(), ctx.type_env.clone().source_indices.clone()); -match v2_rt::map_get(&ctx.param_names.clone(), sname.clone()) { - Some(t) => t.clone(), - None => match v2_rt::map_get(&ctx.sub_value_vars.clone(), sname.clone()) { - Some(rel) => match (*rel.clone()).clone() { - SubValueRelation::StrictSubValue { field: f, .. } => f.element_type.clone(), - SubValueRelation::IteratedSubValue { field: f, .. } => f.element_type.clone(), - _ => "".to_string(), -}, - None => "".to_string(), -}, -} -}, - _ => "".to_string(), -}; -let scrut_inducing_field = match (*scrut.expr_data.clone()).clone() { - ExprData::ExprFieldAccess { .. } => { - let base = field_access_base(scrut.clone()); -let fname = field_access_field_at(scrut.clone(), ctx.type_env.clone().source_indices.clone()); -match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let bname = expr_var_name_at(base.clone(), ctx.type_env.clone().source_indices.clone()); -let base_type = match v2_rt::map_get(&ctx.param_names.clone(), bname.clone()) { - Some(t) => t.clone(), - None => "".to_string(), -}; -if (base_type.clone().as_str() != "".to_string().as_str()) { + } + _ => None, + } + } + ExprData::ExprMethodCall { .. } => { + let mname = expr_method_name_at( + scrut.clone(), + ctx.type_env.clone().source_indices.clone(), + ); + if ((mname.clone().as_str() == "first".to_string().as_str()) + || (mname.clone().as_str() == "last".to_string().as_str())) { - let ind_fields = inductive_fields_for(ctx.type_env.clone(), base_type.clone()); -Rc::new({ let mut __result = Vec::new(); for f in ind_fields.clone().iter().cloned() { if (f.field_name.clone().as_str() == fname.clone().as_str()) { __result.push(f); } } __result }).first().cloned() -} - } else { - None + { + let receiver = method_receiver(scrut.clone()); + resolve_collection_field(receiver.clone(), ctx.clone()) + } + } else { + None + } } -}, - _ => None, -} -}, - ExprData::ExprMethodCall { .. } => { - let mname = expr_method_name_at(scrut.clone(), ctx.type_env.clone().source_indices.clone()); -if ((mname.clone().as_str() == "first".to_string().as_str()) || (mname.clone().as_str() == "last".to_string().as_str())) { - { - let receiver = method_receiver(scrut.clone()); -resolve_collection_field(receiver.clone(), ctx.clone()) -} - } else { - None - } -}, - _ => None, -}; -let scrut_has_inductive = (((scrut_type.clone().as_str() != "".to_string().as_str()) && ((inductive_fields_for(ctx.type_env.clone(), scrut_type.clone()).len() as i64) > 0)) || (scrut_inducing_field.clone() != None)); -let scrut_variant_sig = match (*scrut.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { - let callee = expr_call_func_at(scrut.clone(), ctx.type_env.clone().source_indices.clone()); -match v2_rt::map_get(&ctx.func_sigs.clone(), callee) { - Some(sig) => if ((Rc::new(v2_rt::map_keys(&sig.variant_provenance.clone())).len() as i64) > 0) { - Some(sig.clone()) - } else { - None - }, - None => None, -} -}, - _ => None, -}; -let annotated_scrut = annotate_descent(&scrut, &ctx); -let annotated_arms = Rc::new({ let mut __result = Vec::new(); for arm_node in match_arm_nodes(body.clone()).iter().cloned() { __result.push({ + _ => None, + }; + let scrut_has_inductive = (((scrut_type.clone().as_str() + != "".to_string().as_str()) + && ((inductive_fields_for(ctx.type_env.clone(), scrut_type.clone()).len() + as i64) + > 0)) + || (scrut_inducing_field.clone() != None)); + let scrut_variant_sig = match (*scrut.expr_data.clone()).clone() { + ExprData::ExprCall { .. } => { + let callee = expr_call_func_at( + scrut.clone(), + ctx.type_env.clone().source_indices.clone(), + ); + match v2_rt::map_get(&ctx.func_sigs.clone(), callee) { + Some(sig) => { + if ((Rc::new(v2_rt::map_keys(&sig.variant_provenance.clone())).len() + as i64) + > 0) + { + Some(sig.clone()) + } else { + None + } + } + None => None, + } + } + _ => None, + }; + let annotated_scrut = annotate_descent(&scrut, &ctx); + let annotated_arms = Rc::new({ + let mut __result = Vec::new(); + for arm_node in match_arm_nodes(body.clone()).iter().cloned() { + __result.push({ let variant_arm_ctx = match scrut_variant_sig.clone() { Some(sig) => arm_ctx_from_variant_provenance(arm_node.clone(), sig.clone(), scrut.clone(), &ctx), None => None, @@ -3864,593 +6616,948 @@ match matching.clone() { c.clone() }, None => c.clone(), -} -}) -}, -}, - MatchPattern::Bind { name: bname, .. } => if (scrut_type.clone().as_str() != "".to_string().as_str()) { - Rc::new(DescentContext { - fn_name: ctx.fn_name.clone(), - param_names: v2_rt::rc_map_insert(ctx.param_names.clone(), bname.clone(), scrut_type.clone()), - param_order: ctx.param_order.clone(), - type_env: ctx.type_env.clone(), - sub_value_vars: v2_rt::rc_map_insert(ctx.sub_value_vars.clone(), bname.clone(), Rc::new(SubValueRelation::PreservedValue)), - size_aliases: ctx.size_aliases.clone(), - scope_locals: ctx.scope_locals.clone(), - func_sigs: ctx.func_sigs.clone(), - per_field_vars: ctx.per_field_vars.clone(), -}) - } else { - match scrut_inducing_field.clone() { - Some(ind_field) => Rc::new(DescentContext { - fn_name: ctx.fn_name.clone(), - param_names: v2_rt::rc_map_insert(ctx.param_names.clone(), bname.clone(), ind_field.element_type.clone()), - param_order: ctx.param_order.clone(), - type_env: ctx.type_env.clone(), - sub_value_vars: v2_rt::rc_map_insert(ctx.sub_value_vars.clone(), bname.clone(), Rc::new(SubValueRelation::StrictSubValue { - field: ind_field.clone(), - factor: Rc::new(ShrinkFactor::UnitShrink), -})), - size_aliases: ctx.size_aliases.clone(), - scope_locals: ctx.scope_locals.clone(), - func_sigs: ctx.func_sigs.clone(), - per_field_vars: ctx.per_field_vars.clone(), -}), - None => ctx.clone(), -} - }, - _ => ctx.clone(), -} - } else { - ctx.clone() - }, -}; -let annotated_body = annotate_descent(&arm_body(&arm_node), &arm_ctx); -make_arm_node(arm_pattern(arm_node.clone()), arm_guard(&arm_node), annotated_body.clone(), arm_node.span.clone()) -}); } __result }); -Rc::new(Node { - name: body.name.clone(), - span: body.span.clone(), - ident_span: body.ident_span.clone(), - children: v2_rt::concat(Rc::new(vec![annotated_scrut]), annotated_arms), - connective: body.connective.clone(), - params: body.params.clone(), - inferred: body.inferred.clone(), - return_cardinality: body.return_cardinality.clone(), - uses: body.uses.clone(), - body: body.body.clone(), - transport: body.transport.clone(), - properties: body.properties.clone(), - type_annotation: body.type_annotation.clone(), - is_self_recursive: body.is_self_recursive.clone(), - has_non_tail_self_call: body.has_non_tail_self_call.clone(), - match_pattern: body.match_pattern.clone(), - expr_data: body.expr_data.clone(), - ident: None, -}) -}, - ExprData::ExprLet => { - let val = let_value(body.clone()); -let binding_name = let_binding_name_at(body.clone(), ctx.type_env.clone().source_indices.clone()); -let val_relation = classify_let_value(&val, &ctx); -let size_alias = classify_size_expr(&val, &ctx); -let inner_size_aliases = match size_alias { - Some(se) => v2_rt::rc_map_insert(ctx.size_aliases.clone(), binding_name.clone(), se.clone()), - None => ctx.size_aliases.clone(), -}; -let inner_per_field = build_per_field_for_let(&val, binding_name.clone(), &ctx); -let inner_ctx = match val_relation { - Some(rel) => { - let sub_type = match (*rel.clone()).clone() { - SubValueRelation::StrictSubValue { field: f, .. } => f.element_type.clone(), - SubValueRelation::IteratedSubValue { field: f, .. } => f.element_type.clone(), - _ => "".to_string(), -}; -Rc::new(DescentContext { - fn_name: ctx.fn_name.clone(), - param_names: if (sub_type.clone().as_str() != "".to_string().as_str()) { - v2_rt::rc_map_insert(ctx.param_names.clone(), binding_name.clone(), sub_type.clone()) - } else { - ctx.param_names.clone() - }, - param_order: ctx.param_order.clone(), - type_env: ctx.type_env.clone(), - sub_value_vars: v2_rt::rc_map_insert(ctx.sub_value_vars.clone(), binding_name.clone(), rel.clone()), - size_aliases: inner_size_aliases, - scope_locals: v2_rt::rc_map_insert(ctx.scope_locals.clone(), binding_name.clone(), Rc::new(TypeBinding { - name: binding_name.clone(), - resolved: resolved_type(val.clone()), - provenance: rel.clone(), -})), - func_sigs: ctx.func_sigs.clone(), - per_field_vars: inner_per_field, -}) -}, - None => Rc::new(DescentContext { - fn_name: ctx.fn_name.clone(), - param_names: ctx.param_names.clone(), - param_order: ctx.param_order.clone(), - type_env: ctx.type_env.clone(), - sub_value_vars: ctx.sub_value_vars.clone(), - size_aliases: inner_size_aliases, - scope_locals: v2_rt::rc_map_insert(ctx.scope_locals.clone(), binding_name.clone(), Rc::new(TypeBinding { - name: binding_name.clone(), - resolved: resolved_type(val.clone()), - provenance: Rc::new(SubValueRelation::SubValueUnknown), -})), - func_sigs: ctx.func_sigs.clone(), - per_field_vars: inner_per_field, -}), -}; -let annotated_value = annotate_descent(&val, &ctx); -let annotated_children = match let_body(body.clone()) { - Some(body_child) => Rc::new(vec![annotated_value, annotate_descent(&body_child, &inner_ctx)]), - None => Rc::new(vec![annotated_value]), -}; -Rc::new(Node { - name: body.name.clone(), - span: body.span.clone(), - ident_span: body.ident_span.clone(), - children: annotated_children, - connective: body.connective.clone(), - params: body.params.clone(), - inferred: body.inferred.clone(), - return_cardinality: body.return_cardinality.clone(), - uses: body.uses.clone(), - body: body.body.clone(), - transport: body.transport.clone(), - properties: body.properties.clone(), - type_annotation: body.type_annotation.clone(), - is_self_recursive: body.is_self_recursive.clone(), - has_non_tail_self_call: body.has_non_tail_self_call.clone(), - match_pattern: body.match_pattern.clone(), - expr_data: body.expr_data.clone(), - ident: None, -}) -}, - ExprData::ExprBlock => { - let threaded = body.children.clone().iter().cloned().fold(Rc::new(BlockAnnotateAcc { - ctx: ctx.clone(), - children: Rc::new(vec![]), -}), |acc: Rc, child: Rc| { - let annotated = annotate_descent(&child, &acc.ctx.clone()); -let next_ctx = match (*child.expr_data.clone()).clone() { - ExprData::ExprLet => { - let val = let_value(child.clone()); -let bname = let_binding_name_at(child.clone(), ctx.type_env.clone().source_indices.clone()); -let val_rel = classify_let_value(&val, &acc.ctx.clone()); -let sa = classify_size_expr(&val, &acc.ctx.clone()); -let new_sa = match sa.clone() { - Some(se) => v2_rt::rc_map_insert(acc.ctx.clone().size_aliases.clone(), bname.clone(), se.clone()), - None => acc.ctx.clone().size_aliases.clone(), -}; -match val_rel.clone() { - Some(rel) => { - let sub_type = match (*rel.clone()).clone() { - SubValueRelation::StrictSubValue { field: f, .. } => f.element_type.clone(), - SubValueRelation::IteratedSubValue { field: f, .. } => f.element_type.clone(), - _ => "".to_string(), -}; -Rc::new(DescentContext { - fn_name: acc.ctx.clone().fn_name.clone(), - param_names: if (sub_type.clone().as_str() != "".to_string().as_str()) { - v2_rt::rc_map_insert(acc.ctx.clone().param_names.clone(), bname.clone(), sub_type.clone()) - } else { - acc.ctx.clone().param_names.clone() - }, - param_order: acc.ctx.clone().param_order.clone(), - type_env: acc.ctx.clone().type_env.clone(), - sub_value_vars: v2_rt::rc_map_insert(acc.ctx.clone().sub_value_vars.clone(), bname.clone(), rel.clone()), - size_aliases: new_sa.clone(), - scope_locals: v2_rt::rc_map_insert(acc.ctx.clone().scope_locals.clone(), bname.clone(), Rc::new(TypeBinding { - name: bname.clone(), - resolved: resolved_type(val.clone()), - provenance: rel.clone(), -})), - func_sigs: acc.ctx.clone().func_sigs.clone(), - per_field_vars: acc.ctx.clone().per_field_vars.clone(), -}) -}, - None => Rc::new(DescentContext { - fn_name: acc.ctx.clone().fn_name.clone(), - param_names: acc.ctx.clone().param_names.clone(), - param_order: acc.ctx.clone().param_order.clone(), - type_env: acc.ctx.clone().type_env.clone(), - sub_value_vars: acc.ctx.clone().sub_value_vars.clone(), - size_aliases: new_sa.clone(), - scope_locals: v2_rt::rc_map_insert(acc.ctx.clone().scope_locals.clone(), bname.clone(), Rc::new(TypeBinding { - name: bname.clone(), - resolved: resolved_type(val.clone()), - provenance: Rc::new(SubValueRelation::SubValueUnknown), -})), - func_sigs: acc.ctx.clone().func_sigs.clone(), - per_field_vars: acc.ctx.clone().per_field_vars.clone(), -}), -} -}, - _ => acc.ctx.clone(), -}; -Rc::new(BlockAnnotateAcc { - ctx: next_ctx.clone(), - children: v2_rt::concat(acc.children.clone(), Rc::new(vec![annotated.clone()])), -}) -}); -Rc::new(Node { - name: body.name.clone(), - span: body.span.clone(), - ident_span: body.ident_span.clone(), - children: threaded.children.clone(), - connective: body.connective.clone(), - params: body.params.clone(), - inferred: body.inferred.clone(), - return_cardinality: body.return_cardinality.clone(), - uses: body.uses.clone(), - body: body.body.clone(), - transport: body.transport.clone(), - properties: body.properties.clone(), - type_annotation: body.type_annotation.clone(), - is_self_recursive: body.is_self_recursive.clone(), - has_non_tail_self_call: body.has_non_tail_self_call.clone(), - match_pattern: body.match_pattern.clone(), - expr_data: body.expr_data.clone(), - ident: None, -}) -}, - ExprData::ExprMethodCall { method_semantics: ms, .. } => { - let mname = expr_method_name_at(body.clone(), ctx.type_env.clone().source_indices.clone()); -let elem_position = method_callback_element_position(ms.clone()); -if (elem_position.clone() != None) { - { - let raw_receiver = method_receiver(body.clone()); -let receiver = match (*raw_receiver.expr_data.clone()).clone() { - ExprData::ExprMethodCall { .. } => { - let inner_mname = expr_method_name_at(raw_receiver.clone(), ctx.type_env.clone().source_indices.clone()); -if (inner_mname.as_str() == "enumerate".to_string().as_str()) { - method_receiver(raw_receiver.clone()) - } else { - raw_receiver.clone() - } -}, - _ => raw_receiver.clone(), -}; -let receiver_field = match (*receiver.expr_data.clone()).clone() { - ExprData::ExprFieldAccess { .. } => { - let base = field_access_base(receiver.clone()); -let fname = field_access_field_at(receiver.clone(), ctx.type_env.clone().source_indices.clone()); -match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let bname = expr_var_name_at(base.clone(), ctx.type_env.clone().source_indices.clone()); -let base_type = match v2_rt::map_get(&ctx.param_names.clone(), bname.clone()) { - Some(t) => t.clone(), - None => match v2_rt::map_get(&ctx.sub_value_vars.clone(), bname.clone()) { - Some(rel) => match (*rel.clone()).clone() { - SubValueRelation::StrictSubValue { field: f, .. } => f.element_type.clone(), - SubValueRelation::IteratedSubValue { field: f, .. } => f.element_type.clone(), - _ => "".to_string(), -}, - None => "".to_string(), -}, -}; -if (base_type.clone().as_str() != "".to_string().as_str()) { - Rc::new({ let mut __result = Vec::new(); for f in inductive_fields_for(ctx.type_env.clone(), base_type.clone()).iter().cloned() { if (f.field_name.clone().as_str() == fname.clone().as_str()) { __result.push(f); } } __result }).first().cloned() - } else { - None - } -}, - _ => None, -} -}, - ExprData::ExprVar { .. } => { - let rname = expr_var_name_at(receiver.clone(), ctx.type_env.clone().source_indices.clone()); -match v2_rt::map_get(&ctx.sub_value_vars.clone(), rname) { - Some(rel) => match (*rel.clone()).clone() { - SubValueRelation::StrictSubValue { field: f, .. } => match f.shape.clone() { - RecursionShape::ListRecursion => Some(f.clone()), - _ => None, -}, - SubValueRelation::IteratedSubValue { field: f, .. } => match f.shape.clone() { - RecursionShape::ListRecursion => Some(f.clone()), - _ => None, -}, - _ => None, -}, - None => None, -} -}, - _ => None, -}; -let method_args = method_arg_nodes(body.clone()); -let lambda_arg = Rc::new({ let mut __result = Vec::new(); for a in method_args.iter().cloned() { if match (*arg_value(&a).expr_data.clone()).clone() { - ExprData::ExprLambda => true, - _ => false, -} { __result.push(a); } } __result }).first().cloned(); -let lambda_elem_info = match lambda_arg { - Some(la) => { - let lambda_node = arg_value(&la); -let lparams = lambda_param_names_at(lambda_node, ctx.type_env.clone().source_indices.clone()); -lparams.clone().get(elem_position.clone().unwrap() as usize).cloned() -}, - None => None, -}; -let is_fold = (elem_position.clone().unwrap() > 0); -let inner_ctx = match lambda_elem_info { - Some(elem_name) => match receiver_field { - Some(ind_field) => Rc::new(DescentContext { - fn_name: ctx.fn_name.clone(), - param_names: v2_rt::rc_map_insert(ctx.param_names.clone(), elem_name.clone(), ind_field.element_type.clone()), - param_order: ctx.param_order.clone(), - type_env: ctx.type_env.clone(), - sub_value_vars: if is_fold { - v2_rt::rc_map_insert(v2_rt::rc_empty_map::>(), elem_name.clone(), Rc::new(SubValueRelation::IteratedSubValue { - field: ind_field.clone(), -})) - } else { - v2_rt::rc_map_insert(ctx.sub_value_vars.clone(), elem_name.clone(), Rc::new(SubValueRelation::IteratedSubValue { - field: ind_field.clone(), -})) - }, - size_aliases: ctx.size_aliases.clone(), - scope_locals: ctx.scope_locals.clone(), - func_sigs: ctx.func_sigs.clone(), - per_field_vars: ctx.per_field_vars.clone(), -}), - None => Rc::new(DescentContext { - fn_name: ctx.fn_name.clone(), - param_names: ctx.param_names.clone(), - param_order: ctx.param_order.clone(), - type_env: ctx.type_env.clone(), - sub_value_vars: if is_fold { - v2_rt::rc_empty_map::>() - } else { - ctx.sub_value_vars.clone() - }, - size_aliases: ctx.size_aliases.clone(), - scope_locals: ctx.scope_locals.clone(), - func_sigs: ctx.func_sigs.clone(), - per_field_vars: ctx.per_field_vars.clone(), -}), -}, - None => ctx.clone(), -}; -let annotated_receiver = annotate_descent(&method_receiver(body.clone()), &ctx); -let annotated_args = Rc::new({ let mut __result = Vec::new(); for arg_node in method_arg_nodes(body.clone()).iter().cloned() { __result.push({ - let arg_val = arg_value(&arg_node); -let is_lambda = match (*arg_val.expr_data.clone()).clone() { - ExprData::ExprLambda => true, - _ => false, -}; -if is_lambda.clone() { - make_arg_node(match arg_name_at(arg_node.clone(), ctx.type_env.clone().source_indices.clone()) { - Some(n) => Some(n.clone()), - None => None, -}, annotate_descent(&arg_val, &inner_ctx), arg_node.span.clone(), arg_node.span.clone()) - } else { - make_arg_node(match arg_name_at(arg_node.clone(), ctx.type_env.clone().source_indices.clone()) { - Some(n) => Some(n.clone()), - None => None, -}, annotate_descent(&arg_val, &ctx), arg_node.span.clone(), arg_node.span.clone()) - } -}); } __result }); -Rc::new(Node { - name: body.name.clone(), - span: body.span.clone(), - ident_span: body.ident_span.clone(), - children: v2_rt::concat(Rc::new(vec![annotated_receiver]), annotated_args), - connective: body.connective.clone(), - params: body.params.clone(), - inferred: body.inferred.clone(), - return_cardinality: body.return_cardinality.clone(), - uses: body.uses.clone(), - body: body.body.clone(), - transport: body.transport.clone(), - properties: body.properties.clone(), - type_annotation: body.type_annotation.clone(), - is_self_recursive: body.is_self_recursive.clone(), - has_non_tail_self_call: body.has_non_tail_self_call.clone(), - match_pattern: body.match_pattern.clone(), - expr_data: body.expr_data.clone(), - ident: None, -}) -} - } else { - map_children(&body, |child| annotate_descent(&child, &ctx)) - } +} +}) }, - ExprData::ExprForEach => { - let coll = foreach_collection(body.clone()); -let fe_body = foreach_body(body.clone()); -let fe_var = foreach_variable_at(body.clone(), ctx.type_env.clone().source_indices.clone()); -let coll_field = resolve_collection_field(coll.clone(), ctx.clone()); -let inner_ctx = match coll_field { - Some(ind_field) => Rc::new(DescentContext { +}, + MatchPattern::Bind { name: bname, .. } => if (scrut_type.clone().as_str() != "".to_string().as_str()) { + Rc::new(DescentContext { fn_name: ctx.fn_name.clone(), - param_names: v2_rt::rc_map_insert(ctx.param_names.clone(), fe_var.clone(), ind_field.element_type.clone()), + param_names: v2_rt::rc_map_insert(ctx.param_names.clone(), bname.clone(), scrut_type.clone()), param_order: ctx.param_order.clone(), type_env: ctx.type_env.clone(), - sub_value_vars: v2_rt::rc_map_insert(v2_rt::rc_empty_map::>(), fe_var.clone(), Rc::new(SubValueRelation::IteratedSubValue { - field: ind_field.clone(), -})), + sub_value_vars: v2_rt::rc_map_insert(ctx.sub_value_vars.clone(), bname.clone(), Rc::new(SubValueRelation::PreservedValue)), size_aliases: ctx.size_aliases.clone(), scope_locals: ctx.scope_locals.clone(), func_sigs: ctx.func_sigs.clone(), per_field_vars: ctx.per_field_vars.clone(), -}), - None => Rc::new(DescentContext { +}) + } else { + match scrut_inducing_field.clone() { + Some(ind_field) => Rc::new(DescentContext { fn_name: ctx.fn_name.clone(), - param_names: ctx.param_names.clone(), + param_names: v2_rt::rc_map_insert(ctx.param_names.clone(), bname.clone(), ind_field.element_type.clone()), param_order: ctx.param_order.clone(), type_env: ctx.type_env.clone(), - sub_value_vars: v2_rt::rc_empty_map::>(), + sub_value_vars: v2_rt::rc_map_insert(ctx.sub_value_vars.clone(), bname.clone(), Rc::new(SubValueRelation::StrictSubValue { + field: ind_field.clone(), + factor: Rc::new(ShrinkFactor::UnitShrink), +})), size_aliases: ctx.size_aliases.clone(), scope_locals: ctx.scope_locals.clone(), func_sigs: ctx.func_sigs.clone(), per_field_vars: ctx.per_field_vars.clone(), }), -}; -let annotated_coll = annotate_descent(&coll, &ctx); -let annotated_body = annotate_descent(&fe_body, &inner_ctx); -Rc::new(Node { - name: body.name.clone(), - span: body.span.clone(), - ident_span: body.ident_span.clone(), - children: Rc::new(vec![annotated_coll, annotated_body.clone()]), - connective: body.connective.clone(), - params: body.params.clone(), - inferred: body.inferred.clone(), - return_cardinality: body.return_cardinality.clone(), - uses: body.uses.clone(), - body: body.body.clone(), - transport: body.transport.clone(), - properties: body.properties.clone(), - type_annotation: body.type_annotation.clone(), - is_self_recursive: body.is_self_recursive.clone(), - has_non_tail_self_call: body.has_non_tail_self_call.clone(), - match_pattern: body.match_pattern.clone(), - expr_data: body.expr_data.clone(), - ident: None, -}) -}, - _ => map_children(&body, |child| annotate_descent(&child, &ctx)), + None => ctx.clone(), } + }, + _ => ctx.clone(), +} + } else { + ctx.clone() + }, +}; +let annotated_body = annotate_descent(&arm_body(&arm_node), &arm_ctx); +make_arm_node(arm_pattern(arm_node.clone()), arm_guard(&arm_node), annotated_body.clone(), arm_node.span.clone()) +}); + } + __result + }); + Rc::new(Node { + name: body.name.clone(), + span: body.span.clone(), + ident_span: body.ident_span.clone(), + children: v2_rt::concat(Rc::new(vec![annotated_scrut]), annotated_arms), + connective: body.connective.clone(), + params: body.params.clone(), + inferred: body.inferred.clone(), + return_cardinality: body.return_cardinality.clone(), + uses: body.uses.clone(), + body: body.body.clone(), + transport: body.transport.clone(), + properties: body.properties.clone(), + type_annotation: body.type_annotation.clone(), + is_self_recursive: body.is_self_recursive.clone(), + has_non_tail_self_call: body.has_non_tail_self_call.clone(), + match_pattern: body.match_pattern.clone(), + expr_data: body.expr_data.clone(), + ident: None, + }) + } + ExprData::ExprLet => { + let val = let_value(body.clone()); + let binding_name = + let_binding_name_at(body.clone(), ctx.type_env.clone().source_indices.clone()); + let val_relation = classify_let_value(&val, &ctx); + let size_alias = classify_size_expr(&val, &ctx); + let inner_size_aliases = match size_alias { + Some(se) => v2_rt::rc_map_insert( + ctx.size_aliases.clone(), + binding_name.clone(), + se.clone(), + ), + None => ctx.size_aliases.clone(), + }; + let inner_per_field = build_per_field_for_let(&val, binding_name.clone(), &ctx); + let inner_ctx = match val_relation { + Some(rel) => { + let sub_type = match (*rel.clone()).clone() { + SubValueRelation::StrictSubValue { field: f, .. } => { + f.element_type.clone() + } + SubValueRelation::IteratedSubValue { field: f, .. } => { + f.element_type.clone() + } + _ => "".to_string(), + }; + Rc::new(DescentContext { + fn_name: ctx.fn_name.clone(), + param_names: if (sub_type.clone().as_str() != "".to_string().as_str()) { + v2_rt::rc_map_insert( + ctx.param_names.clone(), + binding_name.clone(), + sub_type.clone(), + ) + } else { + ctx.param_names.clone() + }, + param_order: ctx.param_order.clone(), + type_env: ctx.type_env.clone(), + sub_value_vars: v2_rt::rc_map_insert( + ctx.sub_value_vars.clone(), + binding_name.clone(), + rel.clone(), + ), + size_aliases: inner_size_aliases, + scope_locals: v2_rt::rc_map_insert( + ctx.scope_locals.clone(), + binding_name.clone(), + Rc::new(TypeBinding { + name: binding_name.clone(), + resolved: resolved_type(val.clone()), + provenance: rel.clone(), + }), + ), + func_sigs: ctx.func_sigs.clone(), + per_field_vars: inner_per_field, + }) + } + None => Rc::new(DescentContext { + fn_name: ctx.fn_name.clone(), + param_names: ctx.param_names.clone(), + param_order: ctx.param_order.clone(), + type_env: ctx.type_env.clone(), + sub_value_vars: ctx.sub_value_vars.clone(), + size_aliases: inner_size_aliases, + scope_locals: v2_rt::rc_map_insert( + ctx.scope_locals.clone(), + binding_name.clone(), + Rc::new(TypeBinding { + name: binding_name.clone(), + resolved: resolved_type(val.clone()), + provenance: Rc::new(SubValueRelation::SubValueUnknown), + }), + ), + func_sigs: ctx.func_sigs.clone(), + per_field_vars: inner_per_field, + }), + }; + let annotated_value = annotate_descent(&val, &ctx); + let annotated_children = match let_body(body.clone()) { + Some(body_child) => Rc::new(vec![ + annotated_value, + annotate_descent(&body_child, &inner_ctx), + ]), + None => Rc::new(vec![annotated_value]), + }; + Rc::new(Node { + name: body.name.clone(), + span: body.span.clone(), + ident_span: body.ident_span.clone(), + children: annotated_children, + connective: body.connective.clone(), + params: body.params.clone(), + inferred: body.inferred.clone(), + return_cardinality: body.return_cardinality.clone(), + uses: body.uses.clone(), + body: body.body.clone(), + transport: body.transport.clone(), + properties: body.properties.clone(), + type_annotation: body.type_annotation.clone(), + is_self_recursive: body.is_self_recursive.clone(), + has_non_tail_self_call: body.has_non_tail_self_call.clone(), + match_pattern: body.match_pattern.clone(), + expr_data: body.expr_data.clone(), + ident: None, + }) + } + ExprData::ExprBlock => { + let threaded = body.children.clone().iter().cloned().fold( + Rc::new(BlockAnnotateAcc { + ctx: ctx.clone(), + children: Rc::new(vec![]), + }), + |acc: Rc, child: Rc| { + let annotated = annotate_descent(&child, &acc.ctx.clone()); + let next_ctx = match (*child.expr_data.clone()).clone() { + ExprData::ExprLet => { + let val = let_value(child.clone()); + let bname = let_binding_name_at( + child.clone(), + ctx.type_env.clone().source_indices.clone(), + ); + let val_rel = classify_let_value(&val, &acc.ctx.clone()); + let sa = classify_size_expr(&val, &acc.ctx.clone()); + let new_sa = match sa.clone() { + Some(se) => v2_rt::rc_map_insert( + acc.ctx.clone().size_aliases.clone(), + bname.clone(), + se.clone(), + ), + None => acc.ctx.clone().size_aliases.clone(), + }; + match val_rel.clone() { + Some(rel) => { + let sub_type = match (*rel.clone()).clone() { + SubValueRelation::StrictSubValue { + field: f, .. + } => f.element_type.clone(), + SubValueRelation::IteratedSubValue { + field: f, .. + } => f.element_type.clone(), + _ => "".to_string(), + }; + Rc::new(DescentContext { + fn_name: acc.ctx.clone().fn_name.clone(), + param_names: if (sub_type.clone().as_str() + != "".to_string().as_str()) + { + v2_rt::rc_map_insert( + acc.ctx.clone().param_names.clone(), + bname.clone(), + sub_type.clone(), + ) + } else { + acc.ctx.clone().param_names.clone() + }, + param_order: acc.ctx.clone().param_order.clone(), + type_env: acc.ctx.clone().type_env.clone(), + sub_value_vars: v2_rt::rc_map_insert( + acc.ctx.clone().sub_value_vars.clone(), + bname.clone(), + rel.clone(), + ), + size_aliases: new_sa.clone(), + scope_locals: v2_rt::rc_map_insert( + acc.ctx.clone().scope_locals.clone(), + bname.clone(), + Rc::new(TypeBinding { + name: bname.clone(), + resolved: resolved_type(val.clone()), + provenance: rel.clone(), + }), + ), + func_sigs: acc.ctx.clone().func_sigs.clone(), + per_field_vars: acc.ctx.clone().per_field_vars.clone(), + }) + } + None => Rc::new(DescentContext { + fn_name: acc.ctx.clone().fn_name.clone(), + param_names: acc.ctx.clone().param_names.clone(), + param_order: acc.ctx.clone().param_order.clone(), + type_env: acc.ctx.clone().type_env.clone(), + sub_value_vars: acc.ctx.clone().sub_value_vars.clone(), + size_aliases: new_sa.clone(), + scope_locals: v2_rt::rc_map_insert( + acc.ctx.clone().scope_locals.clone(), + bname.clone(), + Rc::new(TypeBinding { + name: bname.clone(), + resolved: resolved_type(val.clone()), + provenance: Rc::new( + SubValueRelation::SubValueUnknown, + ), + }), + ), + func_sigs: acc.ctx.clone().func_sigs.clone(), + per_field_vars: acc.ctx.clone().per_field_vars.clone(), + }), + } + } + _ => acc.ctx.clone(), + }; + Rc::new(BlockAnnotateAcc { + ctx: next_ctx.clone(), + children: v2_rt::concat( + acc.children.clone(), + Rc::new(vec![annotated.clone()]), + ), + }) + }, + ); + Rc::new(Node { + name: body.name.clone(), + span: body.span.clone(), + ident_span: body.ident_span.clone(), + children: threaded.children.clone(), + connective: body.connective.clone(), + params: body.params.clone(), + inferred: body.inferred.clone(), + return_cardinality: body.return_cardinality.clone(), + uses: body.uses.clone(), + body: body.body.clone(), + transport: body.transport.clone(), + properties: body.properties.clone(), + type_annotation: body.type_annotation.clone(), + is_self_recursive: body.is_self_recursive.clone(), + has_non_tail_self_call: body.has_non_tail_self_call.clone(), + match_pattern: body.match_pattern.clone(), + expr_data: body.expr_data.clone(), + ident: None, + }) + } + ExprData::ExprMethodCall { + method_semantics: ms, + .. + } => { + let mname = + expr_method_name_at(body.clone(), ctx.type_env.clone().source_indices.clone()); + let elem_position = method_callback_element_position(ms.clone()); + if (elem_position.clone() != None) { + { + let raw_receiver = method_receiver(body.clone()); + let receiver = match (*raw_receiver.expr_data.clone()).clone() { + ExprData::ExprMethodCall { .. } => { + let inner_mname = expr_method_name_at( + raw_receiver.clone(), + ctx.type_env.clone().source_indices.clone(), + ); + if (inner_mname.as_str() == "enumerate".to_string().as_str()) { + method_receiver(raw_receiver.clone()) + } else { + raw_receiver.clone() + } + } + _ => raw_receiver.clone(), + }; + let receiver_field = match (*receiver.expr_data.clone()).clone() { + ExprData::ExprFieldAccess { .. } => { + let base = field_access_base(receiver.clone()); + let fname = field_access_field_at( + receiver.clone(), + ctx.type_env.clone().source_indices.clone(), + ); + match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let bname = expr_var_name_at( + base.clone(), + ctx.type_env.clone().source_indices.clone(), + ); + let base_type = match v2_rt::map_get( + &ctx.param_names.clone(), + bname.clone(), + ) { + Some(t) => t.clone(), + None => match v2_rt::map_get( + &ctx.sub_value_vars.clone(), + bname.clone(), + ) { + Some(rel) => match (*rel.clone()).clone() { + SubValueRelation::StrictSubValue { + field: f, + .. + } => f.element_type.clone(), + SubValueRelation::IteratedSubValue { + field: f, + .. + } => f.element_type.clone(), + _ => "".to_string(), + }, + None => "".to_string(), + }, + }; + if (base_type.clone().as_str() != "".to_string().as_str()) { + Rc::new({ + let mut __result = Vec::new(); + for f in inductive_fields_for( + ctx.type_env.clone(), + base_type.clone(), + ) + .iter() + .cloned() + { + if (f.field_name.clone().as_str() + == fname.clone().as_str()) + { + __result.push(f); + } + } + __result + }) + .first() + .cloned() + } else { + None + } + } + _ => None, + } + } + ExprData::ExprVar { .. } => { + let rname = expr_var_name_at( + receiver.clone(), + ctx.type_env.clone().source_indices.clone(), + ); + match v2_rt::map_get(&ctx.sub_value_vars.clone(), rname) { + Some(rel) => match (*rel.clone()).clone() { + SubValueRelation::StrictSubValue { field: f, .. } => { + match f.shape.clone() { + RecursionShape::ListRecursion => Some(f.clone()), + _ => None, + } + } + SubValueRelation::IteratedSubValue { field: f, .. } => { + match f.shape.clone() { + RecursionShape::ListRecursion => Some(f.clone()), + _ => None, + } + } + _ => None, + }, + None => None, + } + } + _ => None, + }; + let method_args = method_arg_nodes(body.clone()); + let lambda_arg = Rc::new({ + let mut __result = Vec::new(); + for a in method_args.iter().cloned() { + if match (*arg_value(&a).expr_data.clone()).clone() { + ExprData::ExprLambda => true, + _ => false, + } { + __result.push(a); + } + } + __result + }) + .first() + .cloned(); + let lambda_elem_info = match lambda_arg { + Some(la) => { + let lambda_node = arg_value(&la); + let lparams = lambda_param_names_at( + lambda_node, + ctx.type_env.clone().source_indices.clone(), + ); + lparams + .clone() + .get(elem_position.clone().unwrap() as usize) + .cloned() + } + None => None, + }; + let is_fold = (elem_position.clone().unwrap() > 0); + let inner_ctx = match lambda_elem_info { + Some(elem_name) => match receiver_field { + Some(ind_field) => Rc::new(DescentContext { + fn_name: ctx.fn_name.clone(), + param_names: v2_rt::rc_map_insert( + ctx.param_names.clone(), + elem_name.clone(), + ind_field.element_type.clone(), + ), + param_order: ctx.param_order.clone(), + type_env: ctx.type_env.clone(), + sub_value_vars: if is_fold { + v2_rt::rc_map_insert( + v2_rt::rc_empty_map::>(), + elem_name.clone(), + Rc::new(SubValueRelation::IteratedSubValue { + field: ind_field.clone(), + }), + ) + } else { + v2_rt::rc_map_insert( + ctx.sub_value_vars.clone(), + elem_name.clone(), + Rc::new(SubValueRelation::IteratedSubValue { + field: ind_field.clone(), + }), + ) + }, + size_aliases: ctx.size_aliases.clone(), + scope_locals: ctx.scope_locals.clone(), + func_sigs: ctx.func_sigs.clone(), + per_field_vars: ctx.per_field_vars.clone(), + }), + None => Rc::new(DescentContext { + fn_name: ctx.fn_name.clone(), + param_names: ctx.param_names.clone(), + param_order: ctx.param_order.clone(), + type_env: ctx.type_env.clone(), + sub_value_vars: if is_fold { + v2_rt::rc_empty_map::>() + } else { + ctx.sub_value_vars.clone() + }, + size_aliases: ctx.size_aliases.clone(), + scope_locals: ctx.scope_locals.clone(), + func_sigs: ctx.func_sigs.clone(), + per_field_vars: ctx.per_field_vars.clone(), + }), + }, + None => ctx.clone(), + }; + let annotated_receiver = + annotate_descent(&method_receiver(body.clone()), &ctx); + let annotated_args = Rc::new({ + let mut __result = Vec::new(); + for arg_node in method_arg_nodes(body.clone()).iter().cloned() { + __result.push({ + let arg_val = arg_value(&arg_node); + let is_lambda = match (*arg_val.expr_data.clone()).clone() { + ExprData::ExprLambda => true, + _ => false, + }; + if is_lambda.clone() { + make_arg_node( + match arg_name_at( + arg_node.clone(), + ctx.type_env.clone().source_indices.clone(), + ) { + Some(n) => Some(n.clone()), + None => None, + }, + annotate_descent(&arg_val, &inner_ctx), + arg_node.span.clone(), + arg_node.span.clone(), + ) + } else { + make_arg_node( + match arg_name_at( + arg_node.clone(), + ctx.type_env.clone().source_indices.clone(), + ) { + Some(n) => Some(n.clone()), + None => None, + }, + annotate_descent(&arg_val, &ctx), + arg_node.span.clone(), + arg_node.span.clone(), + ) + } + }); + } + __result + }); + Rc::new(Node { + name: body.name.clone(), + span: body.span.clone(), + ident_span: body.ident_span.clone(), + children: v2_rt::concat( + Rc::new(vec![annotated_receiver]), + annotated_args, + ), + connective: body.connective.clone(), + params: body.params.clone(), + inferred: body.inferred.clone(), + return_cardinality: body.return_cardinality.clone(), + uses: body.uses.clone(), + body: body.body.clone(), + transport: body.transport.clone(), + properties: body.properties.clone(), + type_annotation: body.type_annotation.clone(), + is_self_recursive: body.is_self_recursive.clone(), + has_non_tail_self_call: body.has_non_tail_self_call.clone(), + match_pattern: body.match_pattern.clone(), + expr_data: body.expr_data.clone(), + ident: None, + }) + } + } else { + map_children(&body, |child| annotate_descent(&child, &ctx)) + } + } + ExprData::ExprForEach => { + let coll = foreach_collection(body.clone()); + let fe_body = foreach_body(body.clone()); + let fe_var = + foreach_variable_at(body.clone(), ctx.type_env.clone().source_indices.clone()); + let coll_field = resolve_collection_field(coll.clone(), ctx.clone()); + let inner_ctx = match coll_field { + Some(ind_field) => Rc::new(DescentContext { + fn_name: ctx.fn_name.clone(), + param_names: v2_rt::rc_map_insert( + ctx.param_names.clone(), + fe_var.clone(), + ind_field.element_type.clone(), + ), + param_order: ctx.param_order.clone(), + type_env: ctx.type_env.clone(), + sub_value_vars: v2_rt::rc_map_insert( + v2_rt::rc_empty_map::>(), + fe_var.clone(), + Rc::new(SubValueRelation::IteratedSubValue { + field: ind_field.clone(), + }), + ), + size_aliases: ctx.size_aliases.clone(), + scope_locals: ctx.scope_locals.clone(), + func_sigs: ctx.func_sigs.clone(), + per_field_vars: ctx.per_field_vars.clone(), + }), + None => Rc::new(DescentContext { + fn_name: ctx.fn_name.clone(), + param_names: ctx.param_names.clone(), + param_order: ctx.param_order.clone(), + type_env: ctx.type_env.clone(), + sub_value_vars: v2_rt::rc_empty_map::>(), + size_aliases: ctx.size_aliases.clone(), + scope_locals: ctx.scope_locals.clone(), + func_sigs: ctx.func_sigs.clone(), + per_field_vars: ctx.per_field_vars.clone(), + }), + }; + let annotated_coll = annotate_descent(&coll, &ctx); + let annotated_body = annotate_descent(&fe_body, &inner_ctx); + Rc::new(Node { + name: body.name.clone(), + span: body.span.clone(), + ident_span: body.ident_span.clone(), + children: Rc::new(vec![annotated_coll, annotated_body.clone()]), + connective: body.connective.clone(), + params: body.params.clone(), + inferred: body.inferred.clone(), + return_cardinality: body.return_cardinality.clone(), + uses: body.uses.clone(), + body: body.body.clone(), + transport: body.transport.clone(), + properties: body.properties.clone(), + type_annotation: body.type_annotation.clone(), + is_self_recursive: body.is_self_recursive.clone(), + has_non_tail_self_call: body.has_non_tail_self_call.clone(), + match_pattern: body.match_pattern.clone(), + expr_data: body.expr_data.clone(), + ident: None, + }) + } + _ => map_children(&body, |child| annotate_descent(&child, &ctx)), + } }) } -pub fn resolved_type_name(n: &Rc, source_indices: Rc>>) -> String { +pub fn resolved_type_name( + n: &Rc, + source_indices: Rc>>, +) -> String { match n.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => authored_name_at(source_indices, &rt), - _ => match n.children.clone().first().cloned() { - Some(c) => authored_name_at(source_indices, &c), - None => "".to_string(), -}, -} + Some(InferredNode::Resolved { node: rt, .. }) => authored_name_at(source_indices, &rt), + _ => match n.children.clone().first().cloned() { + Some(c) => authored_name_at(source_indices, &c), + None => "".to_string(), + }, + } } -pub fn infer_output_provenance(body: &Rc, params: &Rc>>, type_env: &Rc, scope_locals: Rc>>, func_sigs: &Rc>>) -> Rc>>>> { +pub fn infer_output_provenance( + body: &Rc, + params: &Rc>>, + type_env: &Rc, + scope_locals: Rc>>, + func_sigs: &Rc>>, +) -> Rc>>>> { { - let param_names = Rc::new({ let mut __result = Vec::new(); for p in params.clone().iter().cloned() { __result.push(param_node_name_at(p.clone(), type_env.source_indices.clone())); } __result }); -let param_types = params.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, p: Rc| { - let pname = param_node_name_at(p.clone(), type_env.source_indices.clone()); -let ptype = resolved_type_name(&p, type_env.source_indices.clone()); -if ((pname.clone().as_str() != "".to_string().as_str()) && (ptype.clone().as_str() != "".to_string().as_str())) { - v2_rt::rc_map_insert(acc.clone(), pname.clone(), ptype.clone()) - } else { - acc.clone() + let param_names = Rc::new({ + let mut __result = Vec::new(); + for p in params.clone().iter().cloned() { + __result.push(param_node_name_at( + p.clone(), + type_env.source_indices.clone(), + )); } -}); -let scalar = classify_body_provenance(&body, ¶m_names, ¶m_types, &type_env, &func_sigs, &v2_rt::rc_empty_map::>>>()); -if ((Rc::new(v2_rt::map_keys(&scalar)).len() as i64) > 0) { + __result + }); + let param_types = params.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, p: Rc| { + let pname = param_node_name_at(p.clone(), type_env.source_indices.clone()); + let ptype = resolved_type_name(&p, type_env.source_indices.clone()); + if ((pname.clone().as_str() != "".to_string().as_str()) + && (ptype.clone().as_str() != "".to_string().as_str())) + { + v2_rt::rc_map_insert(acc.clone(), pname.clone(), ptype.clone()) + } else { + acc.clone() + } + }, + ); + let scalar = classify_body_provenance( + &body, + ¶m_names, + ¶m_types, + &type_env, + &func_sigs, + &v2_rt::rc_empty_map::>>>(), + ); + if ((Rc::new(v2_rt::map_keys(&scalar)).len() as i64) > 0) { Rc::new(vec![scalar.clone()]) } else { { - let per_field = classify_body_per_field(body.clone(), param_names.clone(), param_types.clone(), &type_env, func_sigs.clone(), v2_rt::rc_empty_map::>>>()); -if (((per_field.clone().len() as i64) > 0) && { let mut __found = false; for m in per_field.clone().iter().cloned() { if ((Rc::new(v2_rt::map_keys(&m)).len() as i64) > 0) { __found = true; break; } } __found }) { + let per_field = classify_body_per_field( + body.clone(), + param_names.clone(), + param_types.clone(), + &type_env, + func_sigs.clone(), + v2_rt::rc_empty_map::>>>(), + ); + if (((per_field.clone().len() as i64) > 0) && { + let mut __found = false; + for m in per_field.clone().iter().cloned() { + if ((Rc::new(v2_rt::map_keys(&m)).len() as i64) > 0) { + __found = true; + break; + } + } + __found + }) { per_field.clone() } else { Rc::new(vec![]) } -} + } } -} + } } -pub fn classify_body_provenance(expr: &Rc, param_names: &Rc>, param_types: &Rc>, type_env: &Rc, func_sigs: &Rc>>, let_prov: &Rc>>>>) -> Rc>> { +pub fn classify_body_provenance( + expr: &Rc, + param_names: &Rc>, + param_types: &Rc>, + type_env: &Rc, + func_sigs: &Rc>>, + let_prov: &Rc>>>>, +) -> Rc>> { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*expr.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let vname = expr_var_name_at(expr.clone(), type_env.source_indices.clone()); -match v2_rt::map_get(&let_prov, vname.clone()) { - Some(prov) => prov.clone(), - None => if { let mut __found = false; for pn in param_names.clone().iter().cloned() { if (pn.clone().as_str() == vname.clone().as_str()) { __found = true; break; } } __found } { - v2_rt::rc_map_insert(v2_rt::rc_empty_map::>(), vname.clone(), Rc::new(SubValueRelation::PreservedValue)) - } else { - v2_rt::rc_empty_map::>() - }, -} -}, - ExprData::ExprFieldAccess { .. } => { - let base = field_access_base(expr.clone()); -let field = field_access_field_at(expr.clone(), type_env.source_indices.clone()); -let base_prov = classify_body_provenance(&base, ¶m_names, ¶m_types, &type_env, &func_sigs, &let_prov); -Rc::new(v2_rt::map_keys(&base_prov)).iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, pname: String| match v2_rt::map_get(&base_prov, pname.clone()) { - Some(base_rel) => { - let type_for_lookup = match (*base_rel.clone()).clone() { - SubValueRelation::PreservedValue => match v2_rt::map_get(¶m_types, pname.clone()) { - Some(t) => t.clone(), - None => "".to_string(), -}, - SubValueRelation::StrictSubValue { field: f, .. } => f.element_type.clone(), - SubValueRelation::IteratedSubValue { field: f, .. } => f.element_type.clone(), - _ => "".to_string(), -}; -if (type_for_lookup.clone().as_str() != "".to_string().as_str()) { - { - let fields = inductive_fields_for(type_env.clone(), type_for_lookup.clone()); -let matching = Rc::new({ let mut __result = Vec::new(); for f in fields.clone().iter().cloned() { if (f.field_name.clone().as_str() == field.clone().as_str()) { __result.push(f); } } __result }).first().cloned(); -match matching.clone() { - Some(ind_field) => v2_rt::rc_map_insert(acc.clone(), pname.clone(), compose_sub_value(base_rel.clone(), ind_field.clone())), - None => acc.clone(), -} -} - } else { - acc.clone() + ExprData::ExprVar { .. } => { + let vname = expr_var_name_at(expr.clone(), type_env.source_indices.clone()); + match v2_rt::map_get(&let_prov, vname.clone()) { + Some(prov) => prov.clone(), + None => { + if { + let mut __found = false; + for pn in param_names.clone().iter().cloned() { + if (pn.clone().as_str() == vname.clone().as_str()) { + __found = true; + break; + } + } + __found + } { + v2_rt::rc_map_insert( + v2_rt::rc_empty_map::>(), + vname.clone(), + Rc::new(SubValueRelation::PreservedValue), + ) + } else { + v2_rt::rc_empty_map::>() + } + } } -}, - None => acc.clone(), -}) -}, - ExprData::ExprCall { .. } => { - let callee = expr_call_func_at(expr.clone(), type_env.source_indices.clone()); -compose_callee_provenance(callee, call_args_by_name(expr.clone(), type_env.source_indices.clone()), param_names.clone(), param_types.clone(), type_env.clone(), &func_sigs, let_prov.clone()) -}, - ExprData::ExprMethodCall { method_semantics: ms, .. } => { - let mname = expr_method_name_at(expr.clone(), type_env.source_indices.clone()); -let callee_result = compose_callee_provenance(mname.clone(), method_call_args_by_name(&expr, func_sigs.clone(), &type_env.source_indices.clone()), param_names.clone(), param_types.clone(), type_env.clone(), &func_sigs, let_prov.clone()); -if ((Rc::new(v2_rt::map_keys(&callee_result)).len() as i64) > 0) { - callee_result.clone() - } else { - { - let is_shrink = match ms.clone().as_deref().cloned() { - Some(MethodSemantics::AlgebraMethodSemantics { size_effect: se, .. }) => match se.clone() { - Some(CollectionSizeEffect::ShrinkEffect) => true, - _ => false, -}, - _ => false, -}; -if (is_shrink && match method_arg_nodes(expr.clone()).first().cloned() { - Some(arg_node) => match (*arg_value(&arg_node).expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitInt { value: n, .. } = value.as_ref() else { unreachable!() }; (n.clone() > 0) }, - _ => false, -}, - None => false, -}) { + } + ExprData::ExprFieldAccess { .. } => { + let base = field_access_base(expr.clone()); + let field = field_access_field_at(expr.clone(), type_env.source_indices.clone()); + let base_prov = classify_body_provenance( + &base, + ¶m_names, + ¶m_types, + &type_env, + &func_sigs, + &let_prov, + ); + Rc::new(v2_rt::map_keys(&base_prov)).iter().cloned().fold( + v2_rt::rc_empty_map::>(), + |acc: Rc>>, pname: String| { + match v2_rt::map_get(&base_prov, pname.clone()) { + Some(base_rel) => { + let type_for_lookup = match (*base_rel.clone()).clone() { + SubValueRelation::PreservedValue => { + match v2_rt::map_get(¶m_types, pname.clone()) { + Some(t) => t.clone(), + None => "".to_string(), + } + } + SubValueRelation::StrictSubValue { field: f, .. } => { + f.element_type.clone() + } + SubValueRelation::IteratedSubValue { field: f, .. } => { + f.element_type.clone() + } + _ => "".to_string(), + }; + if (type_for_lookup.clone().as_str() != "".to_string().as_str()) { + { + let fields = inductive_fields_for( + type_env.clone(), + type_for_lookup.clone(), + ); + let matching = Rc::new({ + let mut __result = Vec::new(); + for f in fields.clone().iter().cloned() { + if (f.field_name.clone().as_str() + == field.clone().as_str()) + { + __result.push(f); + } + } + __result + }) + .first() + .cloned(); + match matching.clone() { + Some(ind_field) => v2_rt::rc_map_insert( + acc.clone(), + pname.clone(), + compose_sub_value( + base_rel.clone(), + ind_field.clone(), + ), + ), + None => acc.clone(), + } + } + } else { + acc.clone() + } + } + None => acc.clone(), + } + }, + ) + } + ExprData::ExprCall { .. } => { + let callee = expr_call_func_at(expr.clone(), type_env.source_indices.clone()); + compose_callee_provenance( + callee, + call_args_by_name(expr.clone(), type_env.source_indices.clone()), + param_names.clone(), + param_types.clone(), + type_env.clone(), + &func_sigs, + let_prov.clone(), + ) + } + ExprData::ExprMethodCall { + method_semantics: ms, + .. + } => { + let mname = expr_method_name_at(expr.clone(), type_env.source_indices.clone()); + let callee_result = compose_callee_provenance( + mname.clone(), + method_call_args_by_name( + &expr, + func_sigs.clone(), + &type_env.source_indices.clone(), + ), + param_names.clone(), + param_types.clone(), + type_env.clone(), + &func_sigs, + let_prov.clone(), + ); + if ((Rc::new(v2_rt::map_keys(&callee_result)).len() as i64) > 0) { + callee_result.clone() + } else { + { + let is_shrink = match ms.clone().as_deref().cloned() { + Some(MethodSemantics::AlgebraMethodSemantics { + size_effect: se, + .. + }) => match se.clone() { + Some(CollectionSizeEffect::ShrinkEffect) => true, + _ => false, + }, + _ => false, + }; + if (is_shrink + && match method_arg_nodes(expr.clone()).first().cloned() { + Some(arg_node) => match (*arg_value(&arg_node).expr_data.clone()) + .clone() + { + ExprData::ExprLiteral { ref value, .. } => { + let LiteralValue::LitInt { value: n, .. } = value.as_ref() + else { + unreachable!() + }; + (n.clone() > 0) + } + _ => false, + }, + None => false, + }) { - let recv = method_receiver(expr.clone()); -let recv_prov = classify_body_provenance(&recv, ¶m_names, ¶m_types, &type_env, &func_sigs, &let_prov); -Rc::new(v2_rt::map_keys(&recv_prov)).iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, pname: String| match v2_rt::map_get(&recv_prov, pname.clone()) { - Some(recv_rel) => { - let synth_field = Rc::new(InductiveField { - type_name: pname.clone(), - variant_name: "".to_string(), - field_name: mname.clone(), - shape: RecursionShape::ListRecursion, - element_type: pname.clone(), -}); -v2_rt::rc_map_insert(acc.clone(), pname.clone(), compose_sub_value(recv_rel.clone(), synth_field.clone())) -}, - None => acc.clone(), -}) -} - } else { - v2_rt::rc_empty_map::>() + { + let recv = method_receiver(expr.clone()); + let recv_prov = classify_body_provenance( + &recv, + ¶m_names, + ¶m_types, + &type_env, + &func_sigs, + &let_prov, + ); + Rc::new(v2_rt::map_keys(&recv_prov)).iter().cloned().fold( + v2_rt::rc_empty_map::>(), + |acc: Rc>>, + pname: String| { + match v2_rt::map_get(&recv_prov, pname.clone()) { + Some(recv_rel) => { + let synth_field = Rc::new(InductiveField { + type_name: pname.clone(), + variant_name: "".to_string(), + field_name: mname.clone(), + shape: RecursionShape::ListRecursion, + element_type: pname.clone(), + }); + v2_rt::rc_map_insert( + acc.clone(), + pname.clone(), + compose_sub_value( + recv_rel.clone(), + synth_field.clone(), + ), + ) + } + None => acc.clone(), + } + }, + ) + } + } else { + v2_rt::rc_empty_map::>() + } } -} + } } -}, - ExprData::ExprMatch => { - let scrut = match_scrutinee(expr.clone()); -let scrut_prov = classify_body_provenance(&scrut, ¶m_names, ¶m_types, &type_env, &func_sigs, &let_prov); -let arms = match_arm_nodes(expr.clone()); -let arm_provs = Rc::new({ let mut __result = Vec::new(); for arm in arms.iter().cloned() { __result.push({ + ExprData::ExprMatch => { + let scrut = match_scrutinee(expr.clone()); + let scrut_prov = classify_body_provenance( + &scrut, + ¶m_names, + ¶m_types, + &type_env, + &func_sigs, + &let_prov, + ); + let arms = match_arm_nodes(expr.clone()); + let arm_provs = Rc::new({ + let mut __result = Vec::new(); + for arm in arms.iter().cloned() { + __result.push({ let arm_let_prov = match (*arm_pattern(arm.clone())).clone() { MatchPattern::VariantPattern { name: vname, field_bindings: bindings, .. } => bindings.clone().iter().cloned().fold(let_prov.clone(), |acc: Rc>>>>, binding: Rc| { let field_label = field_binding_name_at(binding.clone(), type_env.source_indices.clone()); @@ -4471,64 +7578,141 @@ v2_rt::rc_map_insert(acc.clone(), bind_name.clone(), field_prov.clone()) _ => let_prov.clone(), }; classify_body_provenance(&arm_body(&arm), ¶m_names, ¶m_types, &type_env, &func_sigs, &arm_let_prov) -}); } __result }); -meet_body_provenance_maps(&arm_provs) -}, - ExprData::ExprIf => { - let then_prov = classify_body_provenance(&if_then_branch(expr.clone()), ¶m_names, ¶m_types, &type_env, &func_sigs, &let_prov); -match if_else_branch(expr.clone()) { - Some(else_expr) => { - let else_prov = classify_body_provenance(&else_expr, ¶m_names, ¶m_types, &type_env, &func_sigs, &let_prov); -meet_body_provenance_maps(&Rc::new(vec![then_prov, else_prov])) -}, - None => then_prov, -} -}, - ExprData::ExprLet => { - let value = let_value(expr.clone()); -let bname = let_binding_name_at(expr.clone(), type_env.source_indices.clone()); -let value_prov = classify_body_provenance(&value, ¶m_names, ¶m_types, &type_env, &func_sigs, &let_prov); -let updated = v2_rt::rc_map_insert(let_prov.clone(), bname.clone(), value_prov.clone()); -match let_body(expr.clone()) { - Some(body) => classify_body_provenance(&body, ¶m_names, ¶m_types, &type_env, &func_sigs, &updated), - None => v2_rt::rc_empty_map::>(), -} -}, - ExprData::ExprBlock => { - let block_result = expr.children.clone().iter().cloned().fold(Rc::new(BlockProvFoldState { - prov: let_prov.clone(), - last: empty_prov_map(), -}), |state: Rc, stmt: Rc| match (*stmt.expr_data.clone()).clone() { - ExprData::ExprLet => { - let bname = let_binding_name_at(stmt.clone(), type_env.source_indices.clone()); -let value = let_value(stmt.clone()); -let value_prov = classify_body_provenance(&value, ¶m_names, ¶m_types, &type_env, &func_sigs, &state.prov.clone()); -let updated_prov = v2_rt::rc_map_insert(state.prov.clone(), bname.clone(), value_prov.clone()); -match let_body(stmt.clone()) { - Some(body) => Rc::new(BlockProvFoldState { - prov: state.prov.clone(), - last: classify_body_provenance(&body, ¶m_names, ¶m_types, &type_env, &func_sigs, &updated_prov), -}), - None => Rc::new(BlockProvFoldState { - prov: updated_prov.clone(), - last: value_prov.clone(), -}), -} -}, - _ => Rc::new(BlockProvFoldState { - prov: state.prov.clone(), - last: classify_body_provenance(&stmt, ¶m_names, ¶m_types, &type_env, &func_sigs, &state.prov.clone()), -}), }); -block_result.last.clone() -}, - ExprData::ExprCast => classify_body_provenance(&cast_expr(expr.clone()), ¶m_names, ¶m_types, &type_env, &func_sigs, &let_prov), - ExprData::ExprReturn => match expr.children.clone().first().cloned() { - Some(inner) => classify_body_provenance(&inner, ¶m_names, ¶m_types, &type_env, &func_sigs, &let_prov), - None => v2_rt::rc_empty_map::>(), -}, - _ => v2_rt::rc_empty_map::>(), -} + } + __result + }); + meet_body_provenance_maps(&arm_provs) + } + ExprData::ExprIf => { + let then_prov = classify_body_provenance( + &if_then_branch(expr.clone()), + ¶m_names, + ¶m_types, + &type_env, + &func_sigs, + &let_prov, + ); + match if_else_branch(expr.clone()) { + Some(else_expr) => { + let else_prov = classify_body_provenance( + &else_expr, + ¶m_names, + ¶m_types, + &type_env, + &func_sigs, + &let_prov, + ); + meet_body_provenance_maps(&Rc::new(vec![then_prov, else_prov])) + } + None => then_prov, + } + } + ExprData::ExprLet => { + let value = let_value(expr.clone()); + let bname = let_binding_name_at(expr.clone(), type_env.source_indices.clone()); + let value_prov = classify_body_provenance( + &value, + ¶m_names, + ¶m_types, + &type_env, + &func_sigs, + &let_prov, + ); + let updated = + v2_rt::rc_map_insert(let_prov.clone(), bname.clone(), value_prov.clone()); + match let_body(expr.clone()) { + Some(body) => classify_body_provenance( + &body, + ¶m_names, + ¶m_types, + &type_env, + &func_sigs, + &updated, + ), + None => v2_rt::rc_empty_map::>(), + } + } + ExprData::ExprBlock => { + let block_result = expr.children.clone().iter().cloned().fold( + Rc::new(BlockProvFoldState { + prov: let_prov.clone(), + last: empty_prov_map(), + }), + |state: Rc, stmt: Rc| match (*stmt.expr_data.clone()) + .clone() + { + ExprData::ExprLet => { + let bname = + let_binding_name_at(stmt.clone(), type_env.source_indices.clone()); + let value = let_value(stmt.clone()); + let value_prov = classify_body_provenance( + &value, + ¶m_names, + ¶m_types, + &type_env, + &func_sigs, + &state.prov.clone(), + ); + let updated_prov = v2_rt::rc_map_insert( + state.prov.clone(), + bname.clone(), + value_prov.clone(), + ); + match let_body(stmt.clone()) { + Some(body) => Rc::new(BlockProvFoldState { + prov: state.prov.clone(), + last: classify_body_provenance( + &body, + ¶m_names, + ¶m_types, + &type_env, + &func_sigs, + &updated_prov, + ), + }), + None => Rc::new(BlockProvFoldState { + prov: updated_prov.clone(), + last: value_prov.clone(), + }), + } + } + _ => Rc::new(BlockProvFoldState { + prov: state.prov.clone(), + last: classify_body_provenance( + &stmt, + ¶m_names, + ¶m_types, + &type_env, + &func_sigs, + &state.prov.clone(), + ), + }), + }, + ); + block_result.last.clone() + } + ExprData::ExprCast => classify_body_provenance( + &cast_expr(expr.clone()), + ¶m_names, + ¶m_types, + &type_env, + &func_sigs, + &let_prov, + ), + ExprData::ExprReturn => match expr.children.clone().first().cloned() { + Some(inner) => classify_body_provenance( + &inner, + ¶m_names, + ¶m_types, + &type_env, + &func_sigs, + &let_prov, + ), + None => v2_rt::rc_empty_map::>(), + }, + _ => v2_rt::rc_empty_map::>(), + } }) } @@ -4538,112 +7722,275 @@ pub struct BlockProvFoldState { pub last: Rc>>, } -pub fn call_args_by_name(call: Rc, source_indices: Rc>>) -> Rc>> { - call.children.clone().iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, arg_node: Rc| match arg_name_at(arg_node.clone(), source_indices.clone()) { - Some(aname) => v2_rt::rc_map_insert(acc.clone(), aname.clone(), arg_value(&arg_node)), - None => acc.clone(), -}) +pub fn call_args_by_name( + call: Rc, + source_indices: Rc>>, +) -> Rc>> { + call.children.clone().iter().cloned().fold( + v2_rt::rc_empty_map::>(), + |acc: Rc>>, arg_node: Rc| match arg_name_at( + arg_node.clone(), + source_indices.clone(), + ) { + Some(aname) => v2_rt::rc_map_insert(acc.clone(), aname.clone(), arg_value(&arg_node)), + None => acc.clone(), + }, + ) } -pub fn method_call_args_by_name(call: &Rc, func_sigs: Rc>>, source_indices: &Rc>>) -> Rc>> { +pub fn method_call_args_by_name( + call: &Rc, + func_sigs: Rc>>, + source_indices: &Rc>>, +) -> Rc>> { { let mname = expr_method_name_at(call.clone(), source_indices.clone()); -let recv = method_receiver(call.clone()); -let mc_args = method_arg_nodes(call.clone()); -let base = match v2_rt::map_get(&func_sigs, mname) { - Some(sig) => match sig.params.clone().first().cloned() { - Some(first_p) => { - let first_pname = param_node_name_at(first_p.clone(), source_indices.clone()); -if (first_pname.clone().as_str() != "".to_string().as_str()) { - v2_rt::rc_map_insert(v2_rt::rc_empty_map::>(), first_pname.clone(), recv) - } else { - v2_rt::rc_empty_map::>() - } -}, - None => v2_rt::rc_empty_map::>(), -}, - None => v2_rt::rc_empty_map::>(), -}; -mc_args.iter().cloned().fold(base, |acc: Rc>>, arg_node: Rc| match arg_name_at(arg_node.clone(), source_indices.clone()) { - Some(aname) => v2_rt::rc_map_insert(acc.clone(), aname.clone(), arg_value(&arg_node)), - None => acc.clone(), -}) -} + let recv = method_receiver(call.clone()); + let mc_args = method_arg_nodes(call.clone()); + let base = match v2_rt::map_get(&func_sigs, mname) { + Some(sig) => match sig.params.clone().first().cloned() { + Some(first_p) => { + let first_pname = param_node_name_at(first_p.clone(), source_indices.clone()); + if (first_pname.clone().as_str() != "".to_string().as_str()) { + v2_rt::rc_map_insert( + v2_rt::rc_empty_map::>(), + first_pname.clone(), + recv, + ) + } else { + v2_rt::rc_empty_map::>() + } + } + None => v2_rt::rc_empty_map::>(), + }, + None => v2_rt::rc_empty_map::>(), + }; + mc_args.iter().cloned().fold( + base, + |acc: Rc>>, arg_node: Rc| match arg_name_at( + arg_node.clone(), + source_indices.clone(), + ) { + Some(aname) => { + v2_rt::rc_map_insert(acc.clone(), aname.clone(), arg_value(&arg_node)) + } + None => acc.clone(), + }, + ) + } } -pub fn compose_callee_provenance(callee: String, arg_by_name: Rc>>, param_names: Rc>, param_types: Rc>, type_env: Rc, func_sigs: &Rc>>, let_prov: Rc>>>>) -> Rc>> { +pub fn compose_callee_provenance( + callee: String, + arg_by_name: Rc>>, + param_names: Rc>, + param_types: Rc>, + type_env: Rc, + func_sigs: &Rc>>, + let_prov: Rc>>>>, +) -> Rc>> { match v2_rt::map_get(&func_sigs, callee) { - Some(sig) => match sig.output_provenance.clone().first().cloned() { - Some(callee_prov) => Rc::new(v2_rt::map_keys(&callee_prov)).iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, callee_pname: String| match v2_rt::map_get(&callee_prov, callee_pname.clone()) { - Some(callee_rel) => match v2_rt::map_get(&arg_by_name, callee_pname.clone()) { - Some(arg) => { - let arg_prov = classify_body_provenance(&arg, ¶m_names, ¶m_types, &type_env, &func_sigs, &let_prov); -Rc::new(v2_rt::map_keys(&arg_prov)).iter().cloned().fold(acc.clone(), |inner: Rc>>, pname: String| match v2_rt::map_get(&arg_prov, pname.clone()) { - Some(arg_rel) => { - let composed = compose_sub_value_relations(arg_rel.clone(), callee_rel.clone()); -match (*composed.clone()).clone() { - SubValueRelation::SubValueUnknown => inner.clone(), - _ => match v2_rt::map_get(&inner, pname.clone()) { - Some(existing) => v2_rt::rc_map_insert(inner.clone(), pname.clone(), meet_sub_value(existing.clone(), composed.clone())), - None => v2_rt::rc_map_insert(inner.clone(), pname.clone(), composed.clone()), -}, -} -}, - None => inner.clone(), -}) -}, - None => acc.clone(), -}, - None => acc.clone(), -}), - None => v2_rt::rc_empty_map::>(), -}, - None => v2_rt::rc_empty_map::>(), -} + Some(sig) => match sig.output_provenance.clone().first().cloned() { + Some(callee_prov) => Rc::new(v2_rt::map_keys(&callee_prov)).iter().cloned().fold( + v2_rt::rc_empty_map::>(), + |acc: Rc>>, callee_pname: String| { + match v2_rt::map_get(&callee_prov, callee_pname.clone()) { + Some(callee_rel) => { + match v2_rt::map_get(&arg_by_name, callee_pname.clone()) { + Some(arg) => { + let arg_prov = classify_body_provenance( + &arg, + ¶m_names, + ¶m_types, + &type_env, + &func_sigs, + &let_prov, + ); + Rc::new(v2_rt::map_keys(&arg_prov)).iter().cloned().fold( + acc.clone(), + |inner: Rc>>, + pname: String| { + match v2_rt::map_get(&arg_prov, pname.clone()) { + Some(arg_rel) => { + let composed = compose_sub_value_relations( + arg_rel.clone(), + callee_rel.clone(), + ); + match (*composed.clone()).clone() { + SubValueRelation::SubValueUnknown => { + inner.clone() + } + _ => match v2_rt::map_get( + &inner, + pname.clone(), + ) { + Some(existing) => v2_rt::rc_map_insert( + inner.clone(), + pname.clone(), + meet_sub_value( + existing.clone(), + composed.clone(), + ), + ), + None => v2_rt::rc_map_insert( + inner.clone(), + pname.clone(), + composed.clone(), + ), + }, + } + } + None => inner.clone(), + } + }, + ) + } + None => acc.clone(), + } + } + None => acc.clone(), + } + }, + ), + None => v2_rt::rc_empty_map::>(), + }, + None => v2_rt::rc_empty_map::>(), + } } -pub fn classify_body_per_field(expr: Rc, param_names: Rc>, param_types: Rc>, type_env: &Rc, func_sigs: Rc>>, let_prov: Rc>>>>) -> Rc>>>> { +pub fn classify_body_per_field( + expr: Rc, + param_names: Rc>, + param_types: Rc>, + type_env: &Rc, + func_sigs: Rc>>, + let_prov: Rc>>>>, +) -> Rc>>>> { { let unwrapped = unwrap_body_terminal(&expr, let_prov, type_env.clone()); -let terminal = unwrapped.expr.clone(); -let terminal_prov = unwrapped.let_prov.clone(); -classify_terminal_per_field(&terminal, param_names, param_types, &type_env, func_sigs, terminal_prov) -} + let terminal = unwrapped.expr.clone(); + let terminal_prov = unwrapped.let_prov.clone(); + classify_terminal_per_field( + &terminal, + param_names, + param_types, + &type_env, + func_sigs, + terminal_prov, + ) + } } -pub fn classify_terminal_per_field(expr: &Rc, param_names: Rc>, param_types: Rc>, type_env: &Rc, func_sigs: Rc>>, let_prov: Rc>>>>) -> Rc>>>> { +pub fn classify_terminal_per_field( + expr: &Rc, + param_names: Rc>, + param_types: Rc>, + type_env: &Rc, + func_sigs: Rc>>, + let_prov: Rc>>>>, +) -> Rc>>>> { match (*expr.expr_data.clone()).clone() { - ExprData::ExprRecordLit { .. } => Rc::new({ let mut __result = Vec::new(); for fi in expr.children.clone().iter().cloned() { __result.push(classify_body_provenance(&field_init_node_value(&fi), ¶m_names, ¶m_types, &type_env, &func_sigs, &let_prov)); } __result }), - ExprData::ExprMatch => { - let arm_results = Rc::new({ let mut __result = Vec::new(); for arm in match_arm_nodes(expr.clone()).iter().cloned() { __result.push({ - let arm_unwrapped = unwrap_body_terminal(&arm_body(&arm), let_prov.clone(), type_env.clone()); -match (*arm_unwrapped.expr.clone().expr_data.clone()).clone() { - ExprData::ExprRecordLit { .. } => Rc::new({ let mut __result = Vec::new(); for fi in arm_unwrapped.expr.clone().children.clone().iter().cloned() { __result.push(classify_body_provenance(&field_init_node_value(&fi), ¶m_names, ¶m_types, &type_env, &func_sigs, &arm_unwrapped.let_prov.clone())); } __result }), - _ => Rc::new(vec![]), -} -}); } __result }); -meet_per_field_results(&arm_results) -}, - ExprData::ExprIf => { - let then_unwrapped = unwrap_body_terminal(&if_then_branch(expr.clone()), let_prov.clone(), type_env.clone()); -let then_result = match (*then_unwrapped.expr.clone().expr_data.clone()).clone() { - ExprData::ExprRecordLit { .. } => Rc::new({ let mut __result = Vec::new(); for fi in then_unwrapped.expr.clone().children.clone().iter().cloned() { __result.push(classify_body_provenance(&field_init_node_value(&fi), ¶m_names, ¶m_types, &type_env, &func_sigs, &then_unwrapped.let_prov.clone())); } __result }), - _ => Rc::new(vec![]), -}; -match if_else_branch(expr.clone()) { - Some(else_expr) => { - let else_unwrapped = unwrap_body_terminal(&else_expr, let_prov.clone(), type_env.clone()); -let else_result = match (*else_unwrapped.expr.clone().expr_data.clone()).clone() { - ExprData::ExprRecordLit { .. } => Rc::new({ let mut __result = Vec::new(); for fi in else_unwrapped.expr.clone().children.clone().iter().cloned() { __result.push(classify_body_provenance(&field_init_node_value(&fi), ¶m_names, ¶m_types, &type_env, &func_sigs, &else_unwrapped.let_prov.clone())); } __result }), - _ => Rc::new(vec![]), -}; -meet_per_field_results(&Rc::new(vec![then_result, else_result])) -}, - None => then_result, -} -}, - _ => Rc::new(vec![]), -} + ExprData::ExprRecordLit { .. } => Rc::new({ + let mut __result = Vec::new(); + for fi in expr.children.clone().iter().cloned() { + __result.push(classify_body_provenance( + &field_init_node_value(&fi), + ¶m_names, + ¶m_types, + &type_env, + &func_sigs, + &let_prov, + )); + } + __result + }), + ExprData::ExprMatch => { + let arm_results = Rc::new({ + let mut __result = Vec::new(); + for arm in match_arm_nodes(expr.clone()).iter().cloned() { + __result.push({ + let arm_unwrapped = unwrap_body_terminal( + &arm_body(&arm), + let_prov.clone(), + type_env.clone(), + ); + match (*arm_unwrapped.expr.clone().expr_data.clone()).clone() { + ExprData::ExprRecordLit { .. } => Rc::new({ + let mut __result = Vec::new(); + for fi in + arm_unwrapped.expr.clone().children.clone().iter().cloned() + { + __result.push(classify_body_provenance( + &field_init_node_value(&fi), + ¶m_names, + ¶m_types, + &type_env, + &func_sigs, + &arm_unwrapped.let_prov.clone(), + )); + } + __result + }), + _ => Rc::new(vec![]), + } + }); + } + __result + }); + meet_per_field_results(&arm_results) + } + ExprData::ExprIf => { + let then_unwrapped = unwrap_body_terminal( + &if_then_branch(expr.clone()), + let_prov.clone(), + type_env.clone(), + ); + let then_result = match (*then_unwrapped.expr.clone().expr_data.clone()).clone() { + ExprData::ExprRecordLit { .. } => Rc::new({ + let mut __result = Vec::new(); + for fi in then_unwrapped.expr.clone().children.clone().iter().cloned() { + __result.push(classify_body_provenance( + &field_init_node_value(&fi), + ¶m_names, + ¶m_types, + &type_env, + &func_sigs, + &then_unwrapped.let_prov.clone(), + )); + } + __result + }), + _ => Rc::new(vec![]), + }; + match if_else_branch(expr.clone()) { + Some(else_expr) => { + let else_unwrapped = + unwrap_body_terminal(&else_expr, let_prov.clone(), type_env.clone()); + let else_result = match (*else_unwrapped.expr.clone().expr_data.clone()).clone() + { + ExprData::ExprRecordLit { .. } => Rc::new({ + let mut __result = Vec::new(); + for fi in else_unwrapped.expr.clone().children.clone().iter().cloned() { + __result.push(classify_body_provenance( + &field_init_node_value(&fi), + ¶m_names, + ¶m_types, + &type_env, + &func_sigs, + &else_unwrapped.let_prov.clone(), + )); + } + __result + }), + _ => Rc::new(vec![]), + }; + meet_per_field_results(&Rc::new(vec![then_result, else_result])) + } + None => then_result, + } + } + _ => Rc::new(vec![]), + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -4652,401 +7999,884 @@ pub struct BodyTerminal { pub let_prov: Rc>>>>, } -pub fn unwrap_body_terminal(expr: &Rc, let_prov: Rc>>>>, type_env: Rc) -> Rc { +pub fn unwrap_body_terminal( + expr: &Rc, + let_prov: Rc>>>>, + type_env: Rc, +) -> Rc { match (*expr.expr_data.clone()).clone() { - ExprData::ExprBlock => match expr.children.clone().last().cloned() { - Some(last_stmt) => Rc::new(BodyTerminal { - expr: last_stmt.clone(), - let_prov: let_prov, -}), - None => Rc::new(BodyTerminal { - expr: expr.clone(), - let_prov: let_prov, -}), -}, - _ => Rc::new(BodyTerminal { - expr: expr.clone(), - let_prov: let_prov, -}), -} + ExprData::ExprBlock => match expr.children.clone().last().cloned() { + Some(last_stmt) => Rc::new(BodyTerminal { + expr: last_stmt.clone(), + let_prov: let_prov, + }), + None => Rc::new(BodyTerminal { + expr: expr.clone(), + let_prov: let_prov, + }), + }, + _ => Rc::new(BodyTerminal { + expr: expr.clone(), + let_prov: let_prov, + }), + } } -pub fn meet_per_field_results(results: &Rc>>>>>>) -> Rc>>>> { +pub fn meet_per_field_results( + results: &Rc>>>>>>, +) -> Rc>>>> { match results.clone().first().cloned() { - None => Rc::new(vec![]), - Some(first_result) => if ((first_result.clone().len() as i64) == 0) { - Rc::new(vec![]) - } else { - { - let all_same_count = { let mut __all = true; for r in results.clone().iter().cloned() { if !(((r.clone().len() as i64) == (first_result.clone().len() as i64))) { __all = false; break; } } __all }; -if !all_same_count { + None => Rc::new(vec![]), + Some(first_result) => { + if ((first_result.clone().len() as i64) == 0) { Rc::new(vec![]) } else { - Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(first_result.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { __result.push({ - let idx = pair.0.clone(); -let field_provs = Rc::new({ let mut __result = Vec::new(); for r in results.clone().iter().cloned() { __result.push(match r.clone().get(idx.clone() as usize).cloned() { - Some(m) => m.clone(), - None => empty_prov_map(), -}); } __result }); -meet_body_provenance_maps(&field_provs) -}); } __result }) + { + let all_same_count = { + let mut __all = true; + for r in results.clone().iter().cloned() { + if !((r.clone().len() as i64) == (first_result.clone().len() as i64)) { + __all = false; + break; + } + } + __all + }; + if !all_same_count { + Rc::new(vec![]) + } else { + Rc::new({ + let mut __result = Vec::new(); + for pair in Rc::new( + first_result + .clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + { + __result.push({ + let idx = pair.0.clone(); + let field_provs = Rc::new({ + let mut __result = Vec::new(); + for r in results.clone().iter().cloned() { + __result.push( + match r.clone().get(idx.clone() as usize).cloned() { + Some(m) => m.clone(), + None => empty_prov_map(), + }, + ); + } + __result + }); + meet_body_provenance_maps(&field_provs) + }); + } + __result + }) + } + } } -} - }, -} + } + } } pub fn empty_prov_map() -> Rc>> { v2_rt::rc_empty_map::>() } -pub fn meet_body_provenance_maps(provs: &Rc>>>>) -> Rc>> { +pub fn meet_body_provenance_maps( + provs: &Rc>>>>, +) -> Rc>> { match provs.clone().first().cloned() { - None => empty_prov_map(), - Some(first_prov) => Rc::new(provs.clone().iter().cloned().skip(1 as usize).collect::>()).iter().cloned().fold(first_prov.clone(), |acc: Rc>>, prov: Rc>>| intersect_prov_maps(&acc, prov.clone())), -} + None => empty_prov_map(), + Some(first_prov) => Rc::new( + provs + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ) + .iter() + .cloned() + .fold( + first_prov.clone(), + |acc: Rc>>, + prov: Rc>>| { + intersect_prov_maps(&acc, prov.clone()) + }, + ), + } } -pub fn intersect_prov_maps(a: &Rc>>, b: Rc>>) -> Rc>> { - Rc::new(v2_rt::map_keys(&a)).iter().cloned().fold(empty_prov_map(), |result: Rc>>, key: String| match v2_rt::map_get(&b, key.clone()) { - Some(b_rel) => match v2_rt::map_get(&a, key.clone()) { - Some(a_rel) => v2_rt::rc_map_insert(result.clone(), key.clone(), meet_sub_value(a_rel.clone(), b_rel.clone())), - None => result.clone(), -}, - None => result.clone(), -}) +pub fn intersect_prov_maps( + a: &Rc>>, + b: Rc>>, +) -> Rc>> { + Rc::new(v2_rt::map_keys(&a)).iter().cloned().fold( + empty_prov_map(), + |result: Rc>>, key: String| match v2_rt::map_get( + &b, + key.clone(), + ) { + Some(b_rel) => match v2_rt::map_get(&a, key.clone()) { + Some(a_rel) => v2_rt::rc_map_insert( + result.clone(), + key.clone(), + meet_sub_value(a_rel.clone(), b_rel.clone()), + ), + None => result.clone(), + }, + None => result.clone(), + }, + ) } -pub fn arm_ctx_from_variant_provenance(arm_node: Rc, sig: Rc, scrut: Rc, ctx: &Rc) -> Option> { +pub fn arm_ctx_from_variant_provenance( + arm_node: Rc, + sig: Rc, + scrut: Rc, + ctx: &Rc, +) -> Option> { match (*arm_pattern(arm_node)).clone() { - MatchPattern::VariantPattern { name: vname, field_bindings: bindings, .. } => match v2_rt::map_get(&sig.variant_provenance.clone(), vname.clone()) { - Some(variant_field_map) => { - let call_args = call_args_by_name(scrut, ctx.type_env.clone().source_indices.clone()); -let extended = bindings.clone().iter().cloned().fold(ctx.clone(), |c: Rc, fb: Rc| { - let field_label = field_binding_name_at(fb.clone(), ctx.type_env.clone().source_indices.clone()); -let bind_name = match (*field_binding_pattern(fb.clone())).clone() { - MatchPattern::Bind { name: bn, .. } => bn.clone(), - _ => "".to_string(), -}; -if ((bind_name.clone().as_str() == "".to_string().as_str()) || (field_label.clone().as_str() == "".to_string().as_str())) { - c.clone() - } else { - match v2_rt::map_get(&variant_field_map, field_label.clone()) { - Some(param_map) => { - let composed = compose_callee_param_map(¶m_map, call_args.clone(), c.param_order.clone(), c.param_names.clone(), c.type_env.clone(), c.func_sigs.clone(), v2_rt::rc_empty_map::>>>()); -let all_rels = Rc::new({ let mut __result = Vec::new(); for k in Rc::new(v2_rt::map_keys(&composed)).iter().cloned() { __result.push(match v2_rt::map_get(&composed, k.clone()) { - Some(r) => r.clone(), - None => Rc::new(SubValueRelation::SubValueUnknown), -}); } __result }); -let best = merge_argument_relations(&all_rels); -match (*best.clone()).clone() { - SubValueRelation::SubValueUnknown => c.clone(), - _ => Rc::new(DescentContext { - fn_name: c.fn_name.clone(), - param_names: c.param_names.clone(), - param_order: c.param_order.clone(), - type_env: c.type_env.clone(), - sub_value_vars: v2_rt::rc_map_insert(c.sub_value_vars.clone(), bind_name.clone(), best.clone()), - size_aliases: c.size_aliases.clone(), - scope_locals: c.scope_locals.clone(), - func_sigs: c.func_sigs.clone(), - per_field_vars: c.per_field_vars.clone(), -}), -} -}, - None => c.clone(), -} + MatchPattern::VariantPattern { + name: vname, + field_bindings: bindings, + .. + } => match v2_rt::map_get(&sig.variant_provenance.clone(), vname.clone()) { + Some(variant_field_map) => { + let call_args = + call_args_by_name(scrut, ctx.type_env.clone().source_indices.clone()); + let extended = bindings.clone().iter().cloned().fold( + ctx.clone(), + |c: Rc, fb: Rc| { + let field_label = field_binding_name_at( + fb.clone(), + ctx.type_env.clone().source_indices.clone(), + ); + let bind_name = match (*field_binding_pattern(fb.clone())).clone() { + MatchPattern::Bind { name: bn, .. } => bn.clone(), + _ => "".to_string(), + }; + if ((bind_name.clone().as_str() == "".to_string().as_str()) + || (field_label.clone().as_str() == "".to_string().as_str())) + { + c.clone() + } else { + match v2_rt::map_get(&variant_field_map, field_label.clone()) { + Some(param_map) => { + let composed = compose_callee_param_map( + ¶m_map, + call_args.clone(), + c.param_order.clone(), + c.param_names.clone(), + c.type_env.clone(), + c.func_sigs.clone(), + v2_rt::rc_empty_map::< + String, + Rc>>, + >(), + ); + let all_rels = Rc::new({ + let mut __result = Vec::new(); + for k in Rc::new(v2_rt::map_keys(&composed)).iter().cloned() + { + __result.push( + match v2_rt::map_get(&composed, k.clone()) { + Some(r) => r.clone(), + None => { + Rc::new(SubValueRelation::SubValueUnknown) + } + }, + ); + } + __result + }); + let best = merge_argument_relations(&all_rels); + match (*best.clone()).clone() { + SubValueRelation::SubValueUnknown => c.clone(), + _ => Rc::new(DescentContext { + fn_name: c.fn_name.clone(), + param_names: c.param_names.clone(), + param_order: c.param_order.clone(), + type_env: c.type_env.clone(), + sub_value_vars: v2_rt::rc_map_insert( + c.sub_value_vars.clone(), + bind_name.clone(), + best.clone(), + ), + size_aliases: c.size_aliases.clone(), + scope_locals: c.scope_locals.clone(), + func_sigs: c.func_sigs.clone(), + per_field_vars: c.per_field_vars.clone(), + }), + } + } + None => c.clone(), + } + } + }, + ); + Some(extended) } -}); -Some(extended) -}, - None => None, -}, - _ => None, -} + None => None, + }, + _ => None, + } } -pub fn compose_callee_param_map(callee_prov: &Rc>>, arg_by_name: Rc>>, param_names: Rc>, param_types: Rc>, type_env: Rc, func_sigs: Rc>>, let_prov: Rc>>>>) -> Rc>> { - Rc::new(v2_rt::map_keys(&callee_prov)).iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, callee_pname: String| match v2_rt::map_get(&callee_prov, callee_pname.clone()) { - Some(callee_rel) => match v2_rt::map_get(&arg_by_name, callee_pname.clone()) { - Some(arg) => { - let arg_prov = classify_body_provenance(&arg, ¶m_names, ¶m_types, &type_env, &func_sigs, &let_prov); -Rc::new(v2_rt::map_keys(&arg_prov)).iter().cloned().fold(acc.clone(), |inner: Rc>>, pname: String| match v2_rt::map_get(&arg_prov, pname.clone()) { - Some(arg_rel) => { - let composed = compose_sub_value_relations(arg_rel.clone(), callee_rel.clone()); -match (*composed.clone()).clone() { - SubValueRelation::SubValueUnknown => inner.clone(), - _ => v2_rt::rc_map_insert(inner.clone(), pname.clone(), composed.clone()), -} -}, - None => inner.clone(), -}) -}, - None => acc.clone(), -}, - None => acc.clone(), -}) +pub fn compose_callee_param_map( + callee_prov: &Rc>>, + arg_by_name: Rc>>, + param_names: Rc>, + param_types: Rc>, + type_env: Rc, + func_sigs: Rc>>, + let_prov: Rc>>>>, +) -> Rc>> { + Rc::new(v2_rt::map_keys(&callee_prov)).iter().cloned().fold( + v2_rt::rc_empty_map::>(), + |acc: Rc>>, callee_pname: String| match v2_rt::map_get( + &callee_prov, + callee_pname.clone(), + ) { + Some(callee_rel) => match v2_rt::map_get(&arg_by_name, callee_pname.clone()) { + Some(arg) => { + let arg_prov = classify_body_provenance( + &arg, + ¶m_names, + ¶m_types, + &type_env, + &func_sigs, + &let_prov, + ); + Rc::new(v2_rt::map_keys(&arg_prov)).iter().cloned().fold( + acc.clone(), + |inner: Rc>>, pname: String| { + match v2_rt::map_get(&arg_prov, pname.clone()) { + Some(arg_rel) => { + let composed = compose_sub_value_relations( + arg_rel.clone(), + callee_rel.clone(), + ); + match (*composed.clone()).clone() { + SubValueRelation::SubValueUnknown => inner.clone(), + _ => v2_rt::rc_map_insert( + inner.clone(), + pname.clone(), + composed.clone(), + ), + } + } + None => inner.clone(), + } + }, + ) + } + None => acc.clone(), + }, + None => acc.clone(), + }, + ) } -pub fn compose_output_relations(arg_rel: Rc, callee_rel: Rc) -> Rc { +pub fn compose_output_relations( + arg_rel: Rc, + callee_rel: Rc, +) -> Rc { compose_sub_value_relations(arg_rel, callee_rel) } -pub fn compute_variant_provenance(body: Rc, return_type: Rc, params: &Rc>>, type_env: &Rc, func_sigs: Rc>>) -> Rc>>>>>> { +pub fn compute_variant_provenance( + body: Rc, + return_type: Rc, + params: &Rc>>, + type_env: &Rc, + func_sigs: Rc>>, +) -> Rc>>>>>> { { let rt_name = authored_name_at(type_env.source_indices.clone(), &return_type); -let rt_def = lookup_type_by_name(&type_env, rt_name.clone()); -match rt_def { - Some(def_node) => match def_node.connective.clone() { - Connective::Disj => { - let param_names = Rc::new({ let mut __result = Vec::new(); for p in params.clone().iter().cloned() { __result.push(param_node_name_at(p.clone(), type_env.source_indices.clone())); } __result }); -let param_types = params.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, p: Rc| { - let pname = param_node_name_at(p.clone(), type_env.source_indices.clone()); -let ptype = resolved_type_name(&p, type_env.source_indices.clone()); -if ((pname.clone().as_str() != "".to_string().as_str()) && (ptype.clone().as_str() != "".to_string().as_str())) { - v2_rt::rc_map_insert(acc.clone(), pname.clone(), ptype.clone()) - } else { - acc.clone() + let rt_def = lookup_type_by_name(&type_env, rt_name.clone()); + match rt_def { + Some(def_node) => match def_node.connective.clone() { + Connective::Disj => { + let param_names = Rc::new({ + let mut __result = Vec::new(); + for p in params.clone().iter().cloned() { + __result.push(param_node_name_at( + p.clone(), + type_env.source_indices.clone(), + )); + } + __result + }); + let param_types = params.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, p: Rc| { + let pname = + param_node_name_at(p.clone(), type_env.source_indices.clone()); + let ptype = resolved_type_name(&p, type_env.source_indices.clone()); + if ((pname.clone().as_str() != "".to_string().as_str()) + && (ptype.clone().as_str() != "".to_string().as_str())) + { + v2_rt::rc_map_insert(acc.clone(), pname.clone(), ptype.clone()) + } else { + acc.clone() + } + }, + ); + collect_variant_constructors( + &body, + rt_name.clone(), + ¶m_names, + ¶m_types, + &type_env, + &func_sigs, + v2_rt::rc_empty_map::>>>(), + &v2_rt::rc_empty_map::< + String, + Rc>>>>, + >(), + ) } -}); -collect_variant_constructors(&body, rt_name.clone(), ¶m_names, ¶m_types, &type_env, &func_sigs, v2_rt::rc_empty_map::>>>(), &v2_rt::rc_empty_map::>>>>>()) -}, - _ => v2_rt::rc_empty_map::>>>>>(), -}, - None => v2_rt::rc_empty_map::>>>>>(), -} -} + _ => v2_rt::rc_empty_map::< + String, + Rc>>>>, + >(), + }, + None => v2_rt::rc_empty_map::< + String, + Rc>>>>, + >(), + } + } } -pub fn collect_variant_constructors(body: &Rc, parent_enum: String, param_names: &Rc>, param_types: &Rc>, type_env: &Rc, func_sigs: &Rc>>, let_prov: Rc>>>>, acc: &Rc>>>>>>) -> Rc>>>>>> { +pub fn collect_variant_constructors( + body: &Rc, + parent_enum: String, + param_names: &Rc>, + param_types: &Rc>, + type_env: &Rc, + func_sigs: &Rc>>, + let_prov: Rc>>>>, + acc: &Rc>>>>>>, +) -> Rc>>>>>> { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*body.expr_data.clone()).clone() { - ExprData::ExprRecordLit { parent_enum: pe, .. } => match pe.clone() { - Some(enum_name) => if (enum_name.clone().as_str() == parent_enum.clone().as_str()) { - { - let variant_name = body.name.clone(); -let field_prov_map = body.children.clone().iter().cloned().fold(v2_rt::rc_empty_map::>>>(), |m: Rc>>>>, fi: Rc| { - let fname = field_init_node_name_at(fi.clone(), type_env.source_indices.clone()); -let fprov = classify_body_provenance(&field_init_node_value(&fi), ¶m_names, ¶m_types, &type_env, &func_sigs, &let_prov); -if (fname.clone().as_str() != "".to_string().as_str()) { - v2_rt::rc_map_insert(m.clone(), fname.clone(), fprov.clone()) + ExprData::ExprRecordLit { + parent_enum: pe, .. + } => match pe.clone() { + Some(enum_name) => { + if (enum_name.clone().as_str() == parent_enum.clone().as_str()) { + { + let variant_name = body.name.clone(); + let field_prov_map = body.children.clone().iter().cloned().fold( + v2_rt::rc_empty_map::< + String, + Rc>>, + >(), + |m: Rc< + HashMap>>>, + >, + fi: Rc| { + let fname = field_init_node_name_at( + fi.clone(), + type_env.source_indices.clone(), + ); + let fprov = classify_body_provenance( + &field_init_node_value(&fi), + ¶m_names, + ¶m_types, + &type_env, + &func_sigs, + &let_prov, + ); + if (fname.clone().as_str() != "".to_string().as_str()) { + v2_rt::rc_map_insert( + m.clone(), + fname.clone(), + fprov.clone(), + ) + } else { + m.clone() + } + }, + ); + match v2_rt::map_get(&acc, variant_name.clone()) { + Some(existing) => { + let merged = merge_field_prov_maps(&existing, &field_prov_map); + v2_rt::rc_map_insert(acc.clone(), variant_name.clone(), merged) + } + None => v2_rt::rc_map_insert( + acc.clone(), + variant_name.clone(), + field_prov_map, + ), + } + } } else { - m.clone() + acc.clone() } -}); -match v2_rt::map_get(&acc, variant_name.clone()) { - Some(existing) => { - let merged = merge_field_prov_maps(&existing, &field_prov_map); -v2_rt::rc_map_insert(acc.clone(), variant_name.clone(), merged) -}, - None => v2_rt::rc_map_insert(acc.clone(), variant_name.clone(), field_prov_map), -} -} - } else { - acc.clone() - }, - None => acc.clone(), -}, - ExprData::ExprMatch => match_arm_nodes(body.clone()).iter().cloned().fold(acc.clone(), |a: Rc>>>>>>, arm: Rc| collect_variant_constructors(&arm_body(&arm), parent_enum.clone(), ¶m_names, ¶m_types, &type_env, &func_sigs, let_prov.clone(), &a)), - ExprData::ExprIf => { - let then_acc = collect_variant_constructors(&if_then_branch(body.clone()), parent_enum.clone(), ¶m_names, ¶m_types, &type_env, &func_sigs, let_prov.clone(), &acc); -match if_else_branch(body.clone()) { - Some(eb) => collect_variant_constructors(&eb, parent_enum.clone(), ¶m_names, ¶m_types, &type_env, &func_sigs, let_prov.clone(), &then_acc), - None => then_acc, -} -}, - ExprData::ExprLet => match let_body(body.clone()) { - Some(b) => { - let bname = let_binding_name_at(body.clone(), type_env.source_indices.clone()); -let value_prov = classify_body_provenance(&let_value(body.clone()), ¶m_names, ¶m_types, &type_env, &func_sigs, &let_prov); -let new_lp = v2_rt::rc_map_insert(let_prov.clone(), bname.clone(), value_prov); -collect_variant_constructors(&b, parent_enum.clone(), ¶m_names, ¶m_types, &type_env, &func_sigs, new_lp, &acc) -}, - None => acc.clone(), -}, - ExprData::ExprBlock => { - let stmts = body.children.clone(); -let stmt_count = (stmts.clone().len() as i64); -if (stmt_count.clone() == 0) { - acc.clone() - } else { - { - let final_lp = Rc::new(stmts.clone().iter().cloned().take((stmt_count.clone() - 1) as usize).collect::>()).iter().cloned().fold(let_prov.clone(), |lp: Rc>>>>, stmt: Rc| match (*stmt.expr_data.clone()).clone() { - ExprData::ExprLet => { - let bname = let_binding_name_at(stmt.clone(), type_env.source_indices.clone()); -let vprov = classify_body_provenance(&let_value(stmt.clone()), ¶m_names, ¶m_types, &type_env, &func_sigs, &lp); -v2_rt::rc_map_insert(lp.clone(), bname.clone(), vprov.clone()) -}, - _ => lp.clone(), -}); -match stmts.clone().get((stmt_count.clone() - 1) as usize).cloned() { - Some(last) => collect_variant_constructors(&last, parent_enum.clone(), ¶m_names, ¶m_types, &type_env, &func_sigs, final_lp, &acc), - None => acc.clone(), -} -} + } + None => acc.clone(), + }, + ExprData::ExprMatch => match_arm_nodes(body.clone()).iter().cloned().fold( + acc.clone(), + |a: Rc< + HashMap>>>>>, + >, + arm: Rc| { + collect_variant_constructors( + &arm_body(&arm), + parent_enum.clone(), + ¶m_names, + ¶m_types, + &type_env, + &func_sigs, + let_prov.clone(), + &a, + ) + }, + ), + ExprData::ExprIf => { + let then_acc = collect_variant_constructors( + &if_then_branch(body.clone()), + parent_enum.clone(), + ¶m_names, + ¶m_types, + &type_env, + &func_sigs, + let_prov.clone(), + &acc, + ); + match if_else_branch(body.clone()) { + Some(eb) => collect_variant_constructors( + &eb, + parent_enum.clone(), + ¶m_names, + ¶m_types, + &type_env, + &func_sigs, + let_prov.clone(), + &then_acc, + ), + None => then_acc, + } } -}, - _ => acc.clone(), -} + ExprData::ExprLet => match let_body(body.clone()) { + Some(b) => { + let bname = let_binding_name_at(body.clone(), type_env.source_indices.clone()); + let value_prov = classify_body_provenance( + &let_value(body.clone()), + ¶m_names, + ¶m_types, + &type_env, + &func_sigs, + &let_prov, + ); + let new_lp = v2_rt::rc_map_insert(let_prov.clone(), bname.clone(), value_prov); + collect_variant_constructors( + &b, + parent_enum.clone(), + ¶m_names, + ¶m_types, + &type_env, + &func_sigs, + new_lp, + &acc, + ) + } + None => acc.clone(), + }, + ExprData::ExprBlock => { + let stmts = body.children.clone(); + let stmt_count = (stmts.clone().len() as i64); + if (stmt_count.clone() == 0) { + acc.clone() + } else { + { + let final_lp = Rc::new( + stmts + .clone() + .iter() + .cloned() + .take((stmt_count.clone() - 1) as usize) + .collect::>(), + ) + .iter() + .cloned() + .fold( + let_prov.clone(), + |lp: Rc>>>>, + stmt: Rc| match (*stmt + .expr_data + .clone()) + .clone() + { + ExprData::ExprLet => { + let bname = let_binding_name_at( + stmt.clone(), + type_env.source_indices.clone(), + ); + let vprov = classify_body_provenance( + &let_value(stmt.clone()), + ¶m_names, + ¶m_types, + &type_env, + &func_sigs, + &lp, + ); + v2_rt::rc_map_insert(lp.clone(), bname.clone(), vprov.clone()) + } + _ => lp.clone(), + }, + ); + match stmts + .clone() + .get((stmt_count.clone() - 1) as usize) + .cloned() + { + Some(last) => collect_variant_constructors( + &last, + parent_enum.clone(), + ¶m_names, + ¶m_types, + &type_env, + &func_sigs, + final_lp, + &acc, + ), + None => acc.clone(), + } + } + } + } + _ => acc.clone(), + } }) } -pub fn merge_field_prov_maps(a: &Rc>>>>, b: &Rc>>>>) -> Rc>>>> { +pub fn merge_field_prov_maps( + a: &Rc>>>>, + b: &Rc>>>>, +) -> Rc>>>> { { - let from_a = Rc::new(v2_rt::map_keys(&a)).iter().cloned().fold(v2_rt::rc_empty_map::>>>(), |result: Rc>>>>, fname: String| match v2_rt::map_get(&a, fname.clone()) { - Some(a_prov) => match v2_rt::map_get(&b, fname.clone()) { - Some(b_prov) => v2_rt::rc_map_insert(result.clone(), fname.clone(), union_prov_maps(&a_prov, &b_prov)), - None => v2_rt::rc_map_insert(result.clone(), fname.clone(), a_prov.clone()), -}, - None => result.clone(), -}); -Rc::new(v2_rt::map_keys(&b)).iter().cloned().fold(from_a, |result: Rc>>>>, fname: String| if (v2_rt::map_get(&result, fname.clone()) != None) { - result.clone() - } else { - match v2_rt::map_get(&b, fname.clone()) { - Some(b_prov) => v2_rt::rc_map_insert(result.clone(), fname.clone(), b_prov.clone()), - None => result.clone(), -} - }) -} + let from_a = Rc::new(v2_rt::map_keys(&a)).iter().cloned().fold( + v2_rt::rc_empty_map::>>>(), + |result: Rc>>>>, + fname: String| match v2_rt::map_get(&a, fname.clone()) { + Some(a_prov) => match v2_rt::map_get(&b, fname.clone()) { + Some(b_prov) => v2_rt::rc_map_insert( + result.clone(), + fname.clone(), + union_prov_maps(&a_prov, &b_prov), + ), + None => v2_rt::rc_map_insert(result.clone(), fname.clone(), a_prov.clone()), + }, + None => result.clone(), + }, + ); + Rc::new(v2_rt::map_keys(&b)).iter().cloned().fold( + from_a, + |result: Rc>>>>, + fname: String| { + if (v2_rt::map_get(&result, fname.clone()) != None) { + result.clone() + } else { + match v2_rt::map_get(&b, fname.clone()) { + Some(b_prov) => { + v2_rt::rc_map_insert(result.clone(), fname.clone(), b_prov.clone()) + } + None => result.clone(), + } + } + }, + ) + } } -pub fn union_prov_maps(a: &Rc>>, b: &Rc>>) -> Rc>> { +pub fn union_prov_maps( + a: &Rc>>, + b: &Rc>>, +) -> Rc>> { { - let from_a = Rc::new(v2_rt::map_keys(&a)).iter().cloned().fold(empty_prov_map(), |result: Rc>>, key: String| match v2_rt::map_get(&a, key.clone()) { - Some(a_rel) => match v2_rt::map_get(&b, key.clone()) { - Some(b_rel) => v2_rt::rc_map_insert(result.clone(), key.clone(), join_sub_value(a_rel.clone(), b_rel.clone())), - None => v2_rt::rc_map_insert(result.clone(), key.clone(), a_rel.clone()), -}, - None => result.clone(), -}); -Rc::new(v2_rt::map_keys(&b)).iter().cloned().fold(from_a, |result: Rc>>, key: String| if (v2_rt::map_get(&result, key.clone()) != None) { - result.clone() - } else { - match v2_rt::map_get(&b, key.clone()) { - Some(b_rel) => v2_rt::rc_map_insert(result.clone(), key.clone(), b_rel.clone()), - None => result.clone(), -} - }) -} + let from_a = Rc::new(v2_rt::map_keys(&a)).iter().cloned().fold( + empty_prov_map(), + |result: Rc>>, key: String| match v2_rt::map_get( + &a, + key.clone(), + ) { + Some(a_rel) => match v2_rt::map_get(&b, key.clone()) { + Some(b_rel) => v2_rt::rc_map_insert( + result.clone(), + key.clone(), + join_sub_value(a_rel.clone(), b_rel.clone()), + ), + None => v2_rt::rc_map_insert(result.clone(), key.clone(), a_rel.clone()), + }, + None => result.clone(), + }, + ); + Rc::new(v2_rt::map_keys(&b)).iter().cloned().fold( + from_a, + |result: Rc>>, key: String| { + if (v2_rt::map_get(&result, key.clone()) != None) { + result.clone() + } else { + match v2_rt::map_get(&b, key.clone()) { + Some(b_rel) => { + v2_rt::rc_map_insert(result.clone(), key.clone(), b_rel.clone()) + } + None => result.clone(), + } + } + }, + ) + } } -pub fn populate_output_provenance(typed_items: Rc>>, func_env: Rc, type_env: Rc, locals: Rc>>) -> Rc { +pub fn populate_output_provenance( + typed_items: Rc>>, + func_env: Rc, + type_env: Rc, + locals: Rc>>, +) -> Rc { { - let updated_sigs = typed_items.iter().cloned().fold(func_env.signatures.clone(), |acc: Rc>>, item: Rc| if ((item.params.clone().len() as i64) > 0) { - { - let fn_name = authored_name_at(type_env.source_indices.clone(), &item); -if (is_child_accessor_in_model(fn_name.clone()) || is_tree_size_reducing(fn_name.clone())) { - match item.params.clone().first().cloned() { - Some(first_param) => { - let pname = param_node_name_at(first_param.clone(), type_env.source_indices.clone()); -let ptype = resolved_type_name(&first_param, type_env.source_indices.clone()); -if ((ptype.clone().as_str() != "".to_string().as_str()) && (pname.clone().as_str() != "".to_string().as_str())) { - { - let fields = inductive_fields_for(type_env.clone(), ptype.clone()); -let list_field = Rc::new({ let mut __result = Vec::new(); for f in fields.clone().iter().cloned() { if match f.shape.clone() { - RecursionShape::ListRecursion => true, - _ => false, -} { __result.push(f); } } __result }).first().cloned(); -match list_field.clone() { - Some(ind_field) => { - let provenance = Rc::new(vec![v2_rt::rc_map_insert(v2_rt::rc_empty_map::>(), pname.clone(), Rc::new(SubValueRelation::StrictSubValue { - field: ind_field.clone(), - factor: Rc::new(ShrinkFactor::UnitShrink), -}))]); -match v2_rt::map_get(&acc, fn_name.clone()) { - Some(sig) => v2_rt::rc_map_insert(acc.clone(), fn_name.clone(), Rc::new(ResolvedFuncSig { - name: sig.name.clone(), - params: sig.params.clone(), - inferred: sig.inferred.clone(), - is_async: sig.is_async.clone(), - output_provenance: provenance.clone(), - variant_provenance: sig.variant_provenance.clone(), -})), - None => acc.clone(), -} -}, - None => acc.clone(), -} -} + let updated_sigs = typed_items.iter().cloned().fold( + func_env.signatures.clone(), + |acc: Rc>>, item: Rc| { + if ((item.params.clone().len() as i64) > 0) { + { + let fn_name = authored_name_at(type_env.source_indices.clone(), &item); + if (is_child_accessor_in_model(fn_name.clone()) + || is_tree_size_reducing(fn_name.clone())) + { + match item.params.clone().first().cloned() { + Some(first_param) => { + let pname = param_node_name_at( + first_param.clone(), + type_env.source_indices.clone(), + ); + let ptype = resolved_type_name( + &first_param, + type_env.source_indices.clone(), + ); + if ((ptype.clone().as_str() != "".to_string().as_str()) + && (pname.clone().as_str() != "".to_string().as_str())) + { + { + let fields = inductive_fields_for( + type_env.clone(), + ptype.clone(), + ); + let list_field = Rc::new({ + let mut __result = Vec::new(); + for f in fields.clone().iter().cloned() { + if match f.shape.clone() { + RecursionShape::ListRecursion => true, + _ => false, + } { + __result.push(f); + } + } + __result + }) + .first() + .cloned(); + match list_field.clone() { + Some(ind_field) => { + let provenance = + Rc::new(vec![v2_rt::rc_map_insert( + v2_rt::rc_empty_map::< + String, + Rc, + >( + ), + pname.clone(), + Rc::new( + SubValueRelation::StrictSubValue { + field: ind_field.clone(), + factor: Rc::new( + ShrinkFactor::UnitShrink, + ), + }, + ), + )]); + match v2_rt::map_get(&acc, fn_name.clone()) { + Some(sig) => v2_rt::rc_map_insert( + acc.clone(), + fn_name.clone(), + Rc::new(ResolvedFuncSig { + name: sig.name.clone(), + params: sig.params.clone(), + inferred: sig.inferred.clone(), + is_async: sig.is_async.clone(), + output_provenance: provenance + .clone(), + variant_provenance: sig + .variant_provenance + .clone(), + }), + ), + None => acc.clone(), + } + } + None => acc.clone(), + } + } + } else { + acc.clone() + } + } + None => acc.clone(), + } } else { - acc.clone() + match item.body.clone() { + Some(body) => { + if !expr_has_self_call( + &body, + &fn_name, + &type_env.source_indices.clone(), + ) { + { + let provenance = infer_output_provenance( + &body, + &item.params.clone(), + &type_env, + locals.clone(), + &acc, + ); + let variant_prov = + match item.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { + node: rt, + .. + }) => compute_variant_provenance( + body.clone(), + rt.clone(), + &item.params.clone(), + &type_env, + acc.clone(), + ), + _ => v2_rt::rc_empty_map::< + String, + Rc< + HashMap< + String, + Rc< + HashMap< + String, + Rc, + >, + >, + >, + >, + >( + ), + }; + let has_scalar = + ((provenance.clone().len() as i64) > 0); + let has_variant = + ((Rc::new(v2_rt::map_keys(&variant_prov)).len() + as i64) + > 0); + if (has_scalar.clone() || has_variant.clone()) { + match v2_rt::map_get(&acc, fn_name.clone()) { + Some(sig) => v2_rt::rc_map_insert( + acc.clone(), + fn_name.clone(), + Rc::new(ResolvedFuncSig { + name: sig.name.clone(), + params: sig.params.clone(), + inferred: sig.inferred.clone(), + is_async: sig.is_async.clone(), + output_provenance: if has_scalar.clone() + { + provenance.clone() + } else { + sig.output_provenance.clone() + }, + variant_provenance: if has_variant + .clone() + { + variant_prov.clone() + } else { + sig.variant_provenance.clone() + }, + }), + ), + None => acc.clone(), + } + } else { + acc.clone() + } + } + } else { + acc.clone() + } + } + None => acc.clone(), + } } -}, - None => acc.clone(), -} + } } else { - match item.body.clone() { - Some(body) => if !expr_has_self_call(&body, &fn_name, &type_env.source_indices.clone()) { - { - let provenance = infer_output_provenance(&body, &item.params.clone(), &type_env, locals.clone(), &acc); -let variant_prov = match item.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => compute_variant_provenance(body.clone(), rt.clone(), &item.params.clone(), &type_env, acc.clone()), - _ => v2_rt::rc_empty_map::>>>>>(), -}; -let has_scalar = ((provenance.clone().len() as i64) > 0); -let has_variant = ((Rc::new(v2_rt::map_keys(&variant_prov)).len() as i64) > 0); -if (has_scalar.clone() || has_variant.clone()) { - match v2_rt::map_get(&acc, fn_name.clone()) { - Some(sig) => v2_rt::rc_map_insert(acc.clone(), fn_name.clone(), Rc::new(ResolvedFuncSig { - name: sig.name.clone(), - params: sig.params.clone(), - inferred: sig.inferred.clone(), - is_async: sig.is_async.clone(), - output_provenance: if has_scalar.clone() { - provenance.clone() - } else { - sig.output_provenance.clone() - }, - variant_provenance: if has_variant.clone() { - variant_prov.clone() - } else { - sig.variant_provenance.clone() - }, -})), - None => acc.clone(), -} - } else { - acc.clone() - } -} - } else { - acc.clone() - }, - None => acc.clone(), -} + acc.clone() } -} - } else { - acc.clone() - }); -Rc::new(ResolvedFuncEnv { - signatures: updated_sigs, -}) -} + }, + ); + Rc::new(ResolvedFuncEnv { + signatures: updated_sigs, + }) + } } -pub fn annotate_descent_evidence(body: Rc, fn_name: String, params: &Rc>>, type_env: &Rc, scope_locals: Rc>>, func_sigs: Rc>>) -> Rc { +pub fn annotate_descent_evidence( + body: Rc, + fn_name: String, + params: &Rc>>, + type_env: &Rc, + scope_locals: Rc>>, + func_sigs: Rc>>, +) -> Rc { { - let param_name_map = params.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, p: Rc| { - let pname = param_node_name_at(p.clone(), type_env.source_indices.clone()); -let ptype = resolved_type_name(&p, type_env.source_indices.clone()); -v2_rt::rc_map_insert(acc, pname.clone(), ptype.clone()) -}); -let param_order_list = Rc::new({ let mut __result = Vec::new(); for p in params.clone().iter().cloned() { __result.push(param_node_name_at(p.clone(), type_env.source_indices.clone())); } __result }); -let ctx = Rc::new(DescentContext { - fn_name: fn_name, - param_names: param_name_map, - param_order: param_order_list, - type_env: type_env.clone(), - sub_value_vars: v2_rt::rc_empty_map::>(), - size_aliases: v2_rt::rc_empty_map::>(), - scope_locals: scope_locals, - func_sigs: func_sigs, - per_field_vars: v2_rt::rc_empty_map::>>>(), -}); -annotate_descent(&body, &ctx) -} + let param_name_map = params.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, p: Rc| { + let pname = param_node_name_at(p.clone(), type_env.source_indices.clone()); + let ptype = resolved_type_name(&p, type_env.source_indices.clone()); + v2_rt::rc_map_insert(acc, pname.clone(), ptype.clone()) + }, + ); + let param_order_list = Rc::new({ + let mut __result = Vec::new(); + for p in params.clone().iter().cloned() { + __result.push(param_node_name_at( + p.clone(), + type_env.source_indices.clone(), + )); + } + __result + }); + let ctx = Rc::new(DescentContext { + fn_name: fn_name, + param_names: param_name_map, + param_order: param_order_list, + type_env: type_env.clone(), + sub_value_vars: v2_rt::rc_empty_map::>(), + size_aliases: v2_rt::rc_empty_map::>(), + scope_locals: scope_locals, + func_sigs: func_sigs, + per_field_vars: v2_rt::rc_empty_map::>>>( + ), + }); + annotate_descent(&body, &ctx) + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -5061,1146 +8891,1938 @@ pub struct InferTransportResult { pub diagnostics: Rc>>, } -pub fn infer_property_values(props: Rc>>, scope: Rc) -> Rc { +pub fn infer_property_values( + props: Rc>>, + scope: Rc, +) -> Rc { { - let results = Rc::new({ let mut __result = Vec::new(); for p in props.iter().cloned() { __result.push({ - let val = field_init_node_value(&p); -let val_result = infer_expr(&val, &scope, &None); -(Rc::new(Node { - name: p.name.clone(), - span: p.span.clone(), - ident_span: p.ident_span.clone(), - children: Rc::new(vec![val_result.typed.clone()]), - connective: p.connective.clone(), - params: p.params.clone(), - inferred: p.inferred.clone(), - return_cardinality: p.return_cardinality.clone(), - uses: p.uses.clone(), - body: p.body.clone(), - transport: p.transport.clone(), - properties: p.properties.clone(), - type_annotation: p.type_annotation.clone(), - is_self_recursive: p.is_self_recursive.clone(), - has_non_tail_self_call: p.has_non_tail_self_call.clone(), - match_pattern: p.match_pattern.clone(), - expr_data: p.expr_data.clone(), - ident: None, -}), val_result.diagnostics.clone()) -}); } __result }); -Rc::new(InferPropertiesResult { - props: Rc::new({ let mut __result = Vec::new(); for r in results.clone().iter().cloned() { __result.push(r.0.clone()); } __result }), - diagnostics: Rc::new({ let mut __result = Vec::new(); for r in results.clone().iter().cloned() { __result.extend((*r.1.clone()).iter().cloned()); } __result }), -}) -} + let results = Rc::new({ + let mut __result = Vec::new(); + for p in props.iter().cloned() { + __result.push({ + let val = field_init_node_value(&p); + let val_result = infer_expr(&val, &scope, &None); + ( + Rc::new(Node { + name: p.name.clone(), + span: p.span.clone(), + ident_span: p.ident_span.clone(), + children: Rc::new(vec![val_result.typed.clone()]), + connective: p.connective.clone(), + params: p.params.clone(), + inferred: p.inferred.clone(), + return_cardinality: p.return_cardinality.clone(), + uses: p.uses.clone(), + body: p.body.clone(), + transport: p.transport.clone(), + properties: p.properties.clone(), + type_annotation: p.type_annotation.clone(), + is_self_recursive: p.is_self_recursive.clone(), + has_non_tail_self_call: p.has_non_tail_self_call.clone(), + match_pattern: p.match_pattern.clone(), + expr_data: p.expr_data.clone(), + ident: None, + }), + val_result.diagnostics.clone(), + ) + }); + } + __result + }); + Rc::new(InferPropertiesResult { + props: Rc::new({ + let mut __result = Vec::new(); + for r in results.clone().iter().cloned() { + __result.push(r.0.clone()); + } + __result + }), + diagnostics: Rc::new({ + let mut __result = Vec::new(); + for r in results.clone().iter().cloned() { + __result.extend((*r.1.clone()).iter().cloned()); + } + __result + }), + }) + } } -pub fn infer_auth_source_properties(props: Rc>>, scope: Rc) -> Rc { +pub fn infer_auth_source_properties( + props: Rc>>, + scope: Rc, +) -> Rc { { - let results = Rc::new({ let mut __result = Vec::new(); for p in props.iter().cloned() { __result.push(if (field_init_node_name_at(p.clone(), scope.type_env.clone().source_indices.clone()).as_str() == "svc_auth_source".to_string().as_str()) { - { - let val = field_init_node_value(&p); -let val_result = infer_expr(&val, &scope, &None); -(Rc::new(Node { - name: p.name.clone(), - span: p.span.clone(), - ident_span: p.ident_span.clone(), - children: Rc::new(vec![val_result.typed.clone()]), - connective: p.connective.clone(), - params: p.params.clone(), - inferred: p.inferred.clone(), - return_cardinality: p.return_cardinality.clone(), - uses: p.uses.clone(), - body: p.body.clone(), - transport: p.transport.clone(), - properties: p.properties.clone(), - type_annotation: p.type_annotation.clone(), - is_self_recursive: p.is_self_recursive.clone(), - has_non_tail_self_call: p.has_non_tail_self_call.clone(), - match_pattern: p.match_pattern.clone(), - expr_data: p.expr_data.clone(), - ident: None, -}), val_result.diagnostics.clone()) -} - } else { - (p.clone(), Rc::new(vec![])) - }); } __result }); -Rc::new(InferPropertiesResult { - props: Rc::new({ let mut __result = Vec::new(); for r in results.clone().iter().cloned() { __result.push(r.0.clone()); } __result }), - diagnostics: Rc::new({ let mut __result = Vec::new(); for r in results.clone().iter().cloned() { __result.extend((*r.1.clone()).iter().cloned()); } __result }), -}) -} + let results = Rc::new({ + let mut __result = Vec::new(); + for p in props.iter().cloned() { + __result.push( + if (field_init_node_name_at( + p.clone(), + scope.type_env.clone().source_indices.clone(), + ) + .as_str() + == "svc_auth_source".to_string().as_str()) + { + { + let val = field_init_node_value(&p); + let val_result = infer_expr(&val, &scope, &None); + ( + Rc::new(Node { + name: p.name.clone(), + span: p.span.clone(), + ident_span: p.ident_span.clone(), + children: Rc::new(vec![val_result.typed.clone()]), + connective: p.connective.clone(), + params: p.params.clone(), + inferred: p.inferred.clone(), + return_cardinality: p.return_cardinality.clone(), + uses: p.uses.clone(), + body: p.body.clone(), + transport: p.transport.clone(), + properties: p.properties.clone(), + type_annotation: p.type_annotation.clone(), + is_self_recursive: p.is_self_recursive.clone(), + has_non_tail_self_call: p.has_non_tail_self_call.clone(), + match_pattern: p.match_pattern.clone(), + expr_data: p.expr_data.clone(), + ident: None, + }), + val_result.diagnostics.clone(), + ) + } + } else { + (p.clone(), Rc::new(vec![])) + }, + ); + } + __result + }); + Rc::new(InferPropertiesResult { + props: Rc::new({ + let mut __result = Vec::new(); + for r in results.clone().iter().cloned() { + __result.push(r.0.clone()); + } + __result + }), + diagnostics: Rc::new({ + let mut __result = Vec::new(); + for r in results.clone().iter().cloned() { + __result.extend((*r.1.clone()).iter().cloned()); + } + __result + }), + }) + } } -pub fn infer_transport_node(transport: Option>, scope: Rc) -> Rc { +pub fn infer_transport_node( + transport: Option>, + scope: Rc, +) -> Rc { match transport { - None => Rc::new(InferTransportResult { - transport: None, - diagnostics: Rc::new(vec![]), -}), - Some(t) => { - let prop_result = infer_property_values(t.properties.clone(), scope); -Rc::new(InferTransportResult { - transport: Some(Rc::new(Node { - name: t.name.clone(), - span: t.span.clone(), - ident_span: t.ident_span.clone(), - children: t.children.clone(), - connective: t.connective.clone(), - params: t.params.clone(), - inferred: t.inferred.clone(), - return_cardinality: t.return_cardinality.clone(), - uses: t.uses.clone(), - body: t.body.clone(), - transport: t.transport.clone(), - properties: prop_result.props.clone(), - type_annotation: t.type_annotation.clone(), - is_self_recursive: t.is_self_recursive.clone(), - has_non_tail_self_call: t.has_non_tail_self_call.clone(), - match_pattern: t.match_pattern.clone(), - expr_data: t.expr_data.clone(), - ident: None, -})), - diagnostics: prop_result.diagnostics.clone(), -}) -}, -} + None => Rc::new(InferTransportResult { + transport: None, + diagnostics: Rc::new(vec![]), + }), + Some(t) => { + let prop_result = infer_property_values(t.properties.clone(), scope); + Rc::new(InferTransportResult { + transport: Some(Rc::new(Node { + name: t.name.clone(), + span: t.span.clone(), + ident_span: t.ident_span.clone(), + children: t.children.clone(), + connective: t.connective.clone(), + params: t.params.clone(), + inferred: t.inferred.clone(), + return_cardinality: t.return_cardinality.clone(), + uses: t.uses.clone(), + body: t.body.clone(), + transport: t.transport.clone(), + properties: prop_result.props.clone(), + type_annotation: t.type_annotation.clone(), + is_self_recursive: t.is_self_recursive.clone(), + has_non_tail_self_call: t.has_non_tail_self_call.clone(), + match_pattern: t.match_pattern.clone(), + expr_data: t.expr_data.clone(), + ident: None, + })), + diagnostics: prop_result.diagnostics.clone(), + }) + } + } } pub fn infer_item(item: &Rc, scope: &Rc) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { + let typed_anno = item.type_annotation.clone(); + let transport_scope = if ((item.params.clone().len() as i64) > 0) { + build_params_scope(&scope, item.params.clone()) + } else { + scope.clone() + }; + let transport_result = infer_transport_node(item.transport.clone(), transport_scope); + let typed_transport = transport_result.transport.clone(); + let transport_diags = transport_result.diagnostics.clone(); + let props_result = infer_auth_source_properties(item.properties.clone(), scope.clone()); + let typed_properties = props_result.props.clone(); + let props_diags = props_result.diagnostics.clone(); + if ((item.connective.clone() != Connective::NoConnective) + && (item.transport.clone() == None)) { - let typed_anno = item.type_annotation.clone(); -let transport_scope = if ((item.params.clone().len() as i64) > 0) { - build_params_scope(&scope, item.params.clone()) - } else { - scope.clone() - }; -let transport_result = infer_transport_node(item.transport.clone(), transport_scope); -let typed_transport = transport_result.transport.clone(); -let transport_diags = transport_result.diagnostics.clone(); -let props_result = infer_auth_source_properties(item.properties.clone(), scope.clone()); -let typed_properties = props_result.props.clone(); -let props_diags = props_result.diagnostics.clone(); -if ((item.connective.clone() != Connective::NoConnective) && (item.transport.clone() == None)) { - Rc::new(TypedItemResult { - item: Rc::new(Node { - name: item.name.clone(), - span: item.span.clone(), - ident_span: item.ident_span.clone(), - children: Rc::new({ let mut __result = Vec::new(); for c in item.children.clone().iter().cloned() { __result.push(infer_item(&c, &scope).item.clone()); } __result }), - params: item.params.clone(), - inferred: Some(Rc::new(InferredNode::Resolved { - node: unit_type(), -})), - return_cardinality: item.return_cardinality.clone(), - uses: item.uses.clone(), - body: None, - connective: item.connective.clone(), - transport: typed_transport, - properties: typed_properties, - type_annotation: typed_anno, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}), - diagnostics: v2_rt::concat(transport_diags, props_diags), -}) + Rc::new(TypedItemResult { + item: Rc::new(Node { + name: item.name.clone(), + span: item.span.clone(), + ident_span: item.ident_span.clone(), + children: Rc::new({ + let mut __result = Vec::new(); + for c in item.children.clone().iter().cloned() { + __result.push(infer_item(&c, &scope).item.clone()); + } + __result + }), + params: item.params.clone(), + inferred: Some(Rc::new(InferredNode::Resolved { node: unit_type() })), + return_cardinality: item.return_cardinality.clone(), + uses: item.uses.clone(), + body: None, + connective: item.connective.clone(), + transport: typed_transport, + properties: typed_properties, + type_annotation: typed_anno, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }), + diagnostics: v2_rt::concat(transport_diags, props_diags), + }) + } else { + if ((item.body.clone() != None) && ((item.params.clone().len() as i64) > 0)) { + { + let fn_scope = build_params_scope(&scope, item.params.clone()); + let fn_scope = item.uses.clone().iter().cloned().fold( + fn_scope.clone(), + |s: Rc, u: Rc| { + extend_scope( + &s, + &resource_use_name_at( + u.clone(), + scope.type_env.clone().source_indices.clone(), + ), + resource_use_resource(&u), + Rc::new(SubValueRelation::SubValueUnknown), + ) + }, + ); + let fn_return_expected = if (item.inferred.clone() != None) { + Some(resolved_type(item.clone())) + } else { + None + }; + let body_result = infer_expr( + &item.body.clone().clone().unwrap(), + &fn_scope, + &fn_return_expected, + ); + let body_typed = body_result.typed.clone(); + let body_diags = body_result.diagnostics.clone(); + let inferred_ret = if (item.inferred.clone() != None) { + item.inferred.clone() + } else { + body_typed.inferred.clone() + }; + let is_recursive = expr_has_self_call( + &body_typed, + &authored_name_at(scope.type_env.clone().source_indices.clone(), &item), + &scope.type_env.clone().source_indices.clone(), + ); + let annotated_body = if is_recursive.clone() { + annotate_descent_evidence( + body_typed.clone(), + authored_name_at(scope.type_env.clone().source_indices.clone(), &item), + &item.params.clone(), + &scope.type_env.clone(), + fn_scope.locals.clone(), + scope.func_env.clone().signatures.clone(), + ) + } else { + body_typed.clone() + }; + Rc::new(TypedItemResult { + item: Rc::new(Node { + name: item.name.clone(), + span: item.span.clone(), + ident_span: item.ident_span.clone(), + children: Rc::new({ + let mut __result = Vec::new(); + for c in item.children.clone().iter().cloned() { + __result.push(infer_item(&c, &scope).item.clone()); + } + __result + }), + params: item.params.clone(), + inferred: inferred_ret, + return_cardinality: item.return_cardinality.clone(), + uses: item.uses.clone(), + body: Some(annotated_body), + connective: Connective::NoConnective, + transport: typed_transport, + properties: typed_properties, + type_annotation: typed_anno, + is_self_recursive: is_recursive.clone(), + has_non_tail_self_call: expr_has_non_tail_self_call( + &body_typed, + &authored_name_at( + scope.type_env.clone().source_indices.clone(), + &item, + ), + true, + &scope.type_env.clone().source_indices.clone(), + ), + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }), + diagnostics: v2_rt::concat( + v2_rt::concat(transport_diags, props_diags), + body_diags, + ), + }) + } } else { - if ((item.body.clone() != None) && ((item.params.clone().len() as i64) > 0)) { + if (((item.body.clone() != None) && ((item.params.clone().len() as i64) == 0)) + && (item.inferred.clone() != None)) + { { - let fn_scope = build_params_scope(&scope, item.params.clone()); -let fn_scope = item.uses.clone().iter().cloned().fold(fn_scope.clone(), |s: Rc, u: Rc| extend_scope(&s, &resource_use_name_at(u.clone(), scope.type_env.clone().source_indices.clone()), resource_use_resource(&u), Rc::new(SubValueRelation::SubValueUnknown))); -let fn_return_expected = if (item.inferred.clone() != None) { - Some(resolved_type(item.clone())) - } else { - None - }; -let body_result = infer_expr(&item.body.clone().clone().unwrap(), &fn_scope, &fn_return_expected); -let body_typed = body_result.typed.clone(); -let body_diags = body_result.diagnostics.clone(); -let inferred_ret = if (item.inferred.clone() != None) { - item.inferred.clone() - } else { - body_typed.inferred.clone() - }; -let is_recursive = expr_has_self_call(&body_typed, &authored_name_at(scope.type_env.clone().source_indices.clone(), &item), &scope.type_env.clone().source_indices.clone()); -let annotated_body = if is_recursive.clone() { - annotate_descent_evidence(body_typed.clone(), authored_name_at(scope.type_env.clone().source_indices.clone(), &item), &item.params.clone(), &scope.type_env.clone(), fn_scope.locals.clone(), scope.func_env.clone().signatures.clone()) - } else { - body_typed.clone() - }; -Rc::new(TypedItemResult { - item: Rc::new(Node { - name: item.name.clone(), - span: item.span.clone(), - ident_span: item.ident_span.clone(), - children: Rc::new({ let mut __result = Vec::new(); for c in item.children.clone().iter().cloned() { __result.push(infer_item(&c, &scope).item.clone()); } __result }), - params: item.params.clone(), - inferred: inferred_ret, - return_cardinality: item.return_cardinality.clone(), - uses: item.uses.clone(), - body: Some(annotated_body), - connective: Connective::NoConnective, - transport: typed_transport, - properties: typed_properties, - type_annotation: typed_anno, - is_self_recursive: is_recursive.clone(), - has_non_tail_self_call: expr_has_non_tail_self_call(&body_typed, &authored_name_at(scope.type_env.clone().source_indices.clone(), &item), true, &scope.type_env.clone().source_indices.clone()), - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}), - diagnostics: v2_rt::concat(v2_rt::concat(transport_diags, props_diags), body_diags), -}) -} + let fn_scope = scope.clone(); + let body_result = infer_expr( + &item.body.clone().clone().unwrap(), + &fn_scope, + &Some(resolved_type(item.clone())), + ); + let body_typed = body_result.typed.clone(); + let body_diags = body_result.diagnostics.clone(); + Rc::new(TypedItemResult { + item: Rc::new(Node { + name: item.name.clone(), + span: item.span.clone(), + ident_span: item.ident_span.clone(), + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: item.inferred.clone(), + return_cardinality: item.return_cardinality.clone(), + uses: Rc::new(vec![]), + body: Some(body_typed.clone()), + connective: Connective::NoConnective, + transport: typed_transport, + properties: typed_properties, + type_annotation: typed_anno, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }), + diagnostics: v2_rt::concat( + v2_rt::concat(transport_diags, props_diags), + body_diags, + ), + }) + } } else { - if (((item.body.clone() != None) && ((item.params.clone().len() as i64) == 0)) && (item.inferred.clone() != None)) { + if ((item.body.clone() != None) && ((item.params.clone().len() as i64) == 0)) { { - let fn_scope = scope.clone(); -let body_result = infer_expr(&item.body.clone().clone().unwrap(), &fn_scope, &Some(resolved_type(item.clone()))); -let body_typed = body_result.typed.clone(); -let body_diags = body_result.diagnostics.clone(); -Rc::new(TypedItemResult { - item: Rc::new(Node { - name: item.name.clone(), - span: item.span.clone(), - ident_span: item.ident_span.clone(), - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: item.inferred.clone(), - return_cardinality: item.return_cardinality.clone(), - uses: Rc::new(vec![]), - body: Some(body_typed.clone()), - connective: Connective::NoConnective, - transport: typed_transport, - properties: typed_properties, - type_annotation: typed_anno, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}), - diagnostics: v2_rt::concat(v2_rt::concat(transport_diags, props_diags), body_diags), -}) -} + let data_expected = if (item.type_annotation.clone() != None) { + Some(item.type_annotation.clone().clone().unwrap()) + } else { + None + }; + let val_result = infer_expr( + &item.body.clone().clone().unwrap(), + &scope, + &data_expected, + ); + let val_typed = val_result.typed.clone(); + let val_diags = val_result.diagnostics.clone(); + let inferred_ret = if (item.type_annotation.clone() != None) { + Some(Rc::new(InferredNode::Resolved { + node: item.type_annotation.clone().clone().unwrap(), + })) + } else { + val_typed.inferred.clone() + }; + Rc::new(TypedItemResult { + item: Rc::new(Node { + name: item.name.clone(), + span: item.span.clone(), + ident_span: item.ident_span.clone(), + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: inferred_ret, + return_cardinality: item.return_cardinality.clone(), + uses: Rc::new(vec![]), + body: Some(val_typed.clone()), + connective: Connective::NoConnective, + transport: typed_transport, + properties: typed_properties, + type_annotation: typed_anno, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }), + diagnostics: v2_rt::concat( + v2_rt::concat(transport_diags, props_diags), + val_diags, + ), + }) + } } else { - if ((item.body.clone() != None) && ((item.params.clone().len() as i64) == 0)) { - { - let data_expected = if (item.type_annotation.clone() != None) { - Some(item.type_annotation.clone().clone().unwrap()) - } else { - None - }; -let val_result = infer_expr(&item.body.clone().clone().unwrap(), &scope, &data_expected); -let val_typed = val_result.typed.clone(); -let val_diags = val_result.diagnostics.clone(); -let inferred_ret = if (item.type_annotation.clone() != None) { - Some(Rc::new(InferredNode::Resolved { - node: item.type_annotation.clone().clone().unwrap(), -})) - } else { - val_typed.inferred.clone() - }; -Rc::new(TypedItemResult { - item: Rc::new(Node { - name: item.name.clone(), - span: item.span.clone(), - ident_span: item.ident_span.clone(), - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: inferred_ret, - return_cardinality: item.return_cardinality.clone(), - uses: Rc::new(vec![]), - body: Some(val_typed.clone()), - connective: Connective::NoConnective, - transport: typed_transport, - properties: typed_properties, - type_annotation: typed_anno, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}), - diagnostics: v2_rt::concat(v2_rt::concat(transport_diags, props_diags), val_diags), -}) -} + if (((item.params.clone().len() as i64) > 0) && (item.body.clone() == None)) + { + Rc::new(TypedItemResult { + item: Rc::new(Node { + name: item.name.clone(), + span: item.span.clone(), + ident_span: item.ident_span.clone(), + children: Rc::new({ + let mut __result = Vec::new(); + for c in item.children.clone().iter().cloned() { + __result.push(infer_item(&c, &scope).item.clone()); + } + __result + }), + params: item.params.clone(), + inferred: if (item.inferred.clone() != None) { + item.inferred.clone() + } else { + Some(Rc::new(InferredNode::Resolved { node: unit_type() })) + }, + return_cardinality: item.return_cardinality.clone(), + uses: item.uses.clone(), + body: None, + connective: Connective::NoConnective, + transport: typed_transport, + properties: typed_properties, + type_annotation: typed_anno, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }), + diagnostics: v2_rt::concat(transport_diags, props_diags), + }) } else { - if (((item.params.clone().len() as i64) > 0) && (item.body.clone() == None)) { - Rc::new(TypedItemResult { - item: Rc::new(Node { - name: item.name.clone(), - span: item.span.clone(), - ident_span: item.ident_span.clone(), - children: Rc::new({ let mut __result = Vec::new(); for c in item.children.clone().iter().cloned() { __result.push(infer_item(&c, &scope).item.clone()); } __result }), - params: item.params.clone(), - inferred: if (item.inferred.clone() != None) { - item.inferred.clone() - } else { - Some(Rc::new(InferredNode::Resolved { - node: unit_type(), -})) - }, - return_cardinality: item.return_cardinality.clone(), - uses: item.uses.clone(), - body: None, - connective: Connective::NoConnective, - transport: typed_transport, - properties: typed_properties, - type_annotation: typed_anno, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}), - diagnostics: v2_rt::concat(transport_diags, props_diags), -}) - } else { - Rc::new(TypedItemResult { - item: Rc::new(Node { - name: item.name.clone(), - span: item.span.clone(), - ident_span: item.ident_span.clone(), - children: Rc::new({ let mut __result = Vec::new(); for c in item.children.clone().iter().cloned() { __result.push(infer_item(&c, &scope).item.clone()); } __result }), - params: item.params.clone(), - inferred: if (item.inferred.clone() != None) { - item.inferred.clone() - } else { - Some(Rc::new(InferredNode::Resolved { - node: unit_type(), -})) - }, - return_cardinality: item.return_cardinality.clone(), - uses: item.uses.clone(), - body: None, - connective: item.connective.clone(), - transport: typed_transport, - properties: typed_properties, - type_annotation: typed_anno, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}), - diagnostics: v2_rt::concat(transport_diags, props_diags), -}) - } + Rc::new(TypedItemResult { + item: Rc::new(Node { + name: item.name.clone(), + span: item.span.clone(), + ident_span: item.ident_span.clone(), + children: Rc::new({ + let mut __result = Vec::new(); + for c in item.children.clone().iter().cloned() { + __result.push(infer_item(&c, &scope).item.clone()); + } + __result + }), + params: item.params.clone(), + inferred: if (item.inferred.clone() != None) { + item.inferred.clone() + } else { + Some(Rc::new(InferredNode::Resolved { node: unit_type() })) + }, + return_cardinality: item.return_cardinality.clone(), + uses: item.uses.clone(), + body: None, + connective: item.connective.clone(), + transport: typed_transport, + properties: typed_properties, + type_annotation: typed_anno, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }), + diagnostics: v2_rt::concat(transport_diags, props_diags), + }) } } } } -} + } }) } -pub fn infer_items(items: Rc>>, scope: Rc) -> Rc>> { - Rc::new({ let mut __result = Vec::new(); for item in items.iter().cloned() { __result.push(infer_item(&item, &scope)); } __result }) +pub fn infer_items( + items: Rc>>, + scope: Rc, +) -> Rc>> { + Rc::new({ + let mut __result = Vec::new(); + for item in items.iter().cloned() { + __result.push(infer_item(&item, &scope)); + } + __result + }) } pub fn is_type_variable_name(name: &String) -> bool { - (((((name.clone().as_str() == "T".to_string().as_str()) || (name.clone().as_str() == "K".to_string().as_str())) || (name.clone().as_str() == "V".to_string().as_str())) || (name.clone().as_str() == "MappedElement".to_string().as_str())) || (name.clone().as_str() == "FoldAccumulator".to_string().as_str())) -} - -pub fn collect_parent_bindings_filtered(envs: Rc>>) -> Rc>> { - envs.iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, env: Rc| Rc::new(v2_rt::map_keys(&env.bindings.clone())).iter().cloned().fold(acc, |bacc: Rc>>, ident: i64| { - let name = intern_str(env.intern_table.clone(), ident.clone()); -if is_type_variable_name(&name) { - bacc.clone() - } else { - match v2_rt::map_get(&env.bindings.clone(), ident.clone()) { - Some(binding) => v2_rt::rc_map_insert(bacc.clone(), ident.clone(), binding.clone()), - None => bacc.clone(), -} - } -})) + (((((name.clone().as_str() == "T".to_string().as_str()) + || (name.clone().as_str() == "K".to_string().as_str())) + || (name.clone().as_str() == "V".to_string().as_str())) + || (name.clone().as_str() == "MappedElement".to_string().as_str())) + || (name.clone().as_str() == "FoldAccumulator".to_string().as_str())) +} + +pub fn collect_parent_bindings_filtered( + envs: Rc>>, +) -> Rc>> { + envs.iter().cloned().fold( + v2_rt::rc_empty_map::>(), + |acc: Rc>>, env: Rc| { + Rc::new(v2_rt::map_keys(&env.bindings.clone())) + .iter() + .cloned() + .fold( + acc, + |bacc: Rc>>, ident: i64| { + let name = intern_str(env.intern_table.clone(), ident.clone()); + if is_type_variable_name(&name) { + bacc.clone() + } else { + match v2_rt::map_get(&env.bindings.clone(), ident.clone()) { + Some(binding) => v2_rt::rc_map_insert( + bacc.clone(), + ident.clone(), + binding.clone(), + ), + None => bacc.clone(), + } + } + }, + ) + }, + ) } pub fn kernel_span(name: &String) -> Rc { Rc::new(SourceSpan { - file: v2_rt::concat(v2_rt::concat("".to_string()), - start: 0, - end: v2_rt::string_length(&name), -}) + file: v2_rt::concat( + v2_rt::concat("".to_string(), + ), + start: 0, + end: v2_rt::string_length(&name), + }) } -pub fn build_type_env(module: &Rc, parent_index: &Rc>>, source_indices: &Rc>>, intern_table: &Rc) -> Rc { +pub fn build_type_env( + module: &Rc, + parent_index: &Rc>>, + source_indices: &Rc>>, + intern_table: &Rc, +) -> Rc { { - let source_indices = Rc::new(v2_rt::map_keys(&kernel_type_set())).iter().cloned().fold(source_indices.clone(), |acc: Rc>>, name: String| v2_rt::rc_map_insert(acc, v2_rt::concat(v2_rt::concat("".to_string()), build_newline_index(v2_rt::concat(v2_rt::concat("".to_string()), &name))); -let source_indices = Rc::new(vec!["Optional".to_string(), "Some".to_string(), "None".to_string(), "value".to_string(), "none".to_string()]).iter().cloned().fold(source_indices.clone(), |acc: Rc>>, name: String| v2_rt::rc_map_insert(acc, v2_rt::concat(v2_rt::concat("".to_string()), build_newline_index(v2_rt::concat(v2_rt::concat("".to_string()), &name))); -let intern_table = Rc::new(v2_rt::map_keys(&kernel_type_set())).iter().cloned().fold(intern_table.clone(), |t: Rc, name: String| intern(&t, &name).table.clone()); -let intern_table = Rc::new(vec!["Optional".to_string(), "Some".to_string(), "None".to_string(), "value".to_string(), "none".to_string()]).iter().cloned().fold(intern_table.clone(), |t: Rc, name: String| intern(&t, &name).table.clone()); -let intern_table = Rc::new(v2_rt::map_keys(&compiler_recursive_types())).iter().cloned().fold(intern_table.clone(), |t: Rc, name: String| intern(&t, &name).table.clone()); -let kernel_bindings_base = Rc::new(v2_rt::map_keys(&kernel_type_set())).iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, name: String| v2_rt::rc_map_insert(acc, intern(&intern_table, &name).id.clone(), Rc::new(TypeBinding { - name: name.clone(), - resolved: Rc::new(Node { - name: name.clone(), - span: kernel_span(&name), - ident_span: Some(kernel_span(&name)), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}), - provenance: Rc::new(SubValueRelation::SubValueUnknown), -}))); -let unit_span = kernel_span(&"Unit".to_string()); -let kernel_bindings = v2_rt::rc_map_insert(kernel_bindings_base, intern(&intern_table, &"Unit".to_string()).id.clone(), Rc::new(TypeBinding { - name: "Unit".to_string(), - resolved: Rc::new(Node { - name: "Unit".to_string(), - span: unit_span.clone(), - ident_span: Some(unit_span.clone()), - children: Rc::new(vec![]), - connective: Connective::Conj, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}), - provenance: Rc::new(SubValueRelation::SubValueUnknown), -})); -let some_value_field = Rc::new(Node { - name: "value".to_string(), - span: kernel_span(&"value".to_string()), - ident_span: Some(kernel_span(&"value".to_string())), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::TypeVariable { - id: "some_value".to_string(), -})), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -let some_variant = Rc::new(Node { - name: "Some".to_string(), - span: kernel_span(&"Some".to_string()), - ident_span: Some(kernel_span(&"Some".to_string())), - children: Rc::new(vec![some_value_field]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -let kernel_optional = Rc::new(Node { - name: "Optional".to_string(), - span: kernel_span(&"Optional".to_string()), - ident_span: Some(kernel_span(&"Optional".to_string())), - children: Rc::new(vec![some_variant, none_type()]), - connective: Connective::Disj, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -let kernel_bindings = v2_rt::rc_map_insert(kernel_bindings.clone(), intern(&intern_table, &"Optional".to_string()).id.clone(), Rc::new(TypeBinding { - name: "Optional".to_string(), - resolved: kernel_optional, - provenance: Rc::new(SubValueRelation::SubValueUnknown), -})); -let node_fields = inductive_fields_list_to_map(compiler_inductive_fields()); -let kernel_recursive_types = Rc::new({ let mut __result = Vec::new(); for name in Rc::new(v2_rt::map_keys(&compiler_recursive_types())).iter().cloned() { __result.push(intern(&intern_table, &name).id.clone()); } __result }); -let kernel_recursive_type_set = Rc::new(v2_rt::map_keys(&compiler_recursive_types())).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, name: String| v2_rt::rc_map_insert(acc, intern(&intern_table, &name).id.clone(), true)); -let kernel = Rc::new(TypeEnv { - bindings: kernel_bindings.clone(), - recursive_types: kernel_recursive_types, - recursive_type_set: kernel_recursive_type_set, - inductive_fields: node_fields, - source_indices: source_indices.clone(), - intern_table: intern_table.clone(), -}); -let imports_std_types = { let mut __found = false; for imp in module.resolved_imports.clone().iter().cloned() { if (imp.module_path.clone().as_str() == "std.types".to_string().as_str()) { __found = true; break; } } __found }; -let module_name_str = authored_name_at(source_indices.clone(), &module.module.clone()); -let std_types_parent_env = if ((module_name_str.clone().as_str() != "std.types".to_string().as_str()) && (imports_std_types == false)) { + let source_indices = Rc::new(v2_rt::map_keys(&kernel_type_set())) + .iter() + .cloned() + .fold( + source_indices.clone(), + |acc: Rc>>, name: String| { + v2_rt::rc_map_insert( + acc, + v2_rt::concat( + v2_rt::concat("".to_string(), + ), + build_newline_index( + v2_rt::concat( + v2_rt::concat("".to_string(), + ), + &name, + ), + ) + }, + ); + let source_indices = Rc::new(vec![ + "Optional".to_string(), + "Some".to_string(), + "None".to_string(), + "value".to_string(), + "none".to_string(), + ]) + .iter() + .cloned() + .fold( + source_indices.clone(), + |acc: Rc>>, name: String| { + v2_rt::rc_map_insert( + acc, + v2_rt::concat( + v2_rt::concat("".to_string(), + ), + build_newline_index( + v2_rt::concat( + v2_rt::concat("".to_string(), + ), + &name, + ), + ) + }, + ); + let intern_table = Rc::new(v2_rt::map_keys(&kernel_type_set())) + .iter() + .cloned() + .fold(intern_table.clone(), |t: Rc, name: String| { + intern(&t, &name).table.clone() + }); + let intern_table = Rc::new(vec![ + "Optional".to_string(), + "Some".to_string(), + "None".to_string(), + "value".to_string(), + "none".to_string(), + ]) + .iter() + .cloned() + .fold(intern_table.clone(), |t: Rc, name: String| { + intern(&t, &name).table.clone() + }); + let intern_table = Rc::new(v2_rt::map_keys(&compiler_recursive_types())) + .iter() + .cloned() + .fold(intern_table.clone(), |t: Rc, name: String| { + intern(&t, &name).table.clone() + }); + let kernel_bindings_base = Rc::new(v2_rt::map_keys(&kernel_type_set())) + .iter() + .cloned() + .fold( + v2_rt::rc_empty_map::>(), + |acc: Rc>>, name: String| { + v2_rt::rc_map_insert( + acc, + intern(&intern_table, &name).id.clone(), + Rc::new(TypeBinding { + name: name.clone(), + resolved: Rc::new(Node { + name: name.clone(), + span: kernel_span(&name), + ident_span: Some(kernel_span(&name)), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }), + provenance: Rc::new(SubValueRelation::SubValueUnknown), + }), + ) + }, + ); + let unit_span = kernel_span(&"Unit".to_string()); + let kernel_bindings = v2_rt::rc_map_insert( + kernel_bindings_base, + intern(&intern_table, &"Unit".to_string()).id.clone(), + Rc::new(TypeBinding { + name: "Unit".to_string(), + resolved: Rc::new(Node { + name: "Unit".to_string(), + span: unit_span.clone(), + ident_span: Some(unit_span.clone()), + children: Rc::new(vec![]), + connective: Connective::Conj, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }), + provenance: Rc::new(SubValueRelation::SubValueUnknown), + }), + ); + let some_value_field = Rc::new(Node { + name: "value".to_string(), + span: kernel_span(&"value".to_string()), + ident_span: Some(kernel_span(&"value".to_string())), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::TypeVariable { + id: "some_value".to_string(), + })), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + let some_variant = Rc::new(Node { + name: "Some".to_string(), + span: kernel_span(&"Some".to_string()), + ident_span: Some(kernel_span(&"Some".to_string())), + children: Rc::new(vec![some_value_field]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + let kernel_optional = Rc::new(Node { + name: "Optional".to_string(), + span: kernel_span(&"Optional".to_string()), + ident_span: Some(kernel_span(&"Optional".to_string())), + children: Rc::new(vec![some_variant, none_type()]), + connective: Connective::Disj, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + let kernel_bindings = v2_rt::rc_map_insert( + kernel_bindings.clone(), + intern(&intern_table, &"Optional".to_string()).id.clone(), + Rc::new(TypeBinding { + name: "Optional".to_string(), + resolved: kernel_optional, + provenance: Rc::new(SubValueRelation::SubValueUnknown), + }), + ); + let node_fields = inductive_fields_list_to_map(compiler_inductive_fields()); + let kernel_recursive_types = Rc::new({ + let mut __result = Vec::new(); + for name in Rc::new(v2_rt::map_keys(&compiler_recursive_types())) + .iter() + .cloned() + { + __result.push(intern(&intern_table, &name).id.clone()); + } + __result + }); + let kernel_recursive_type_set = Rc::new(v2_rt::map_keys(&compiler_recursive_types())) + .iter() + .cloned() + .fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, name: String| { + v2_rt::rc_map_insert(acc, intern(&intern_table, &name).id.clone(), true) + }, + ); + let kernel = Rc::new(TypeEnv { + bindings: kernel_bindings.clone(), + recursive_types: kernel_recursive_types, + recursive_type_set: kernel_recursive_type_set, + inductive_fields: node_fields, + source_indices: source_indices.clone(), + intern_table: intern_table.clone(), + }); + let imports_std_types = { + let mut __found = false; + for imp in module.resolved_imports.clone().iter().cloned() { + if (imp.module_path.clone().as_str() == "std.types".to_string().as_str()) { + __found = true; + break; + } + } + __found + }; + let module_name_str = authored_name_at(source_indices.clone(), &module.module.clone()); + let std_types_parent_env = if ((module_name_str.clone().as_str() + != "std.types".to_string().as_str()) + && (imports_std_types == false)) + { match v2_rt::map_get(&parent_index, "std.types".to_string()) { - Some(typed_std) => Rc::new(vec![typed_std.type_env.clone()]), - None => Rc::new(vec![]), -} + Some(typed_std) => Rc::new(vec![typed_std.type_env.clone()]), + None => Rc::new(vec![]), + } } else { Rc::new(vec![]) }; -let imported_parent_envs = Rc::new({ let mut __result = Vec::new(); for imp in module.resolved_imports.clone().iter().cloned() { __result.extend((*match v2_rt::map_get(&parent_index, imp.module_path.clone()) { - Some(typed_parent) => Rc::new(vec![typed_parent.type_env.clone()]), - None => Rc::new(vec![]), -}).iter().cloned()); } __result }); -let parent_envs = v2_rt::concat(std_types_parent_env.clone(), imported_parent_envs); -let std_import_bindings = collect_parent_bindings_filtered(std_types_parent_env.clone()); -let import_bindings = module.resolved_imports.clone().iter().cloned().fold(std_import_bindings, |acc: Rc>>, imp: Rc| match v2_rt::map_get(&parent_index, imp.module_path.clone()) { - Some(typed_parent) => if (imp.module_path.clone().as_str() == "std.types".to_string().as_str()) { - Rc::new(v2_rt::map_keys(&typed_parent.type_env.clone().bindings.clone())).iter().cloned().fold(acc.clone(), |bacc: Rc>>, ident: i64| { - let name = intern_str(typed_parent.type_env.clone().intern_table.clone(), ident.clone()); -if is_type_variable_name(&name) { - bacc.clone() - } else { - match v2_rt::map_get(&typed_parent.type_env.clone().bindings.clone(), ident.clone()) { - Some(binding) => v2_rt::rc_map_insert(bacc.clone(), ident.clone(), binding.clone()), - None => bacc.clone(), -} + let imported_parent_envs = Rc::new({ + let mut __result = Vec::new(); + for imp in module.resolved_imports.clone().iter().cloned() { + __result.extend( + (*match v2_rt::map_get(&parent_index, imp.module_path.clone()) { + Some(typed_parent) => Rc::new(vec![typed_parent.type_env.clone()]), + None => Rc::new(vec![]), + }) + .iter() + .cloned(), + ); + } + __result + }); + let parent_envs = v2_rt::concat(std_types_parent_env.clone(), imported_parent_envs); + let std_import_bindings = collect_parent_bindings_filtered(std_types_parent_env.clone()); + let import_bindings = module.resolved_imports.clone().iter().cloned().fold( + std_import_bindings, + |acc: Rc>>, imp: Rc| match v2_rt::map_get( + &parent_index, + imp.module_path.clone(), + ) { + Some(typed_parent) => { + if (imp.module_path.clone().as_str() == "std.types".to_string().as_str()) { + Rc::new(v2_rt::map_keys( + &typed_parent.type_env.clone().bindings.clone(), + )) + .iter() + .cloned() + .fold( + acc.clone(), + |bacc: Rc>>, ident: i64| { + let name = intern_str( + typed_parent.type_env.clone().intern_table.clone(), + ident.clone(), + ); + if is_type_variable_name(&name) { + bacc.clone() + } else { + match v2_rt::map_get( + &typed_parent.type_env.clone().bindings.clone(), + ident.clone(), + ) { + Some(binding) => v2_rt::rc_map_insert( + bacc.clone(), + ident.clone(), + binding.clone(), + ), + None => bacc.clone(), + } + } + }, + ) + } else { + v2_rt::rc_map_merge( + acc.clone(), + typed_parent.type_env.clone().bindings.clone(), + ) + } } -}) - } else { - v2_rt::rc_map_merge(acc.clone(), typed_parent.type_env.clone().bindings.clone()) - }, - None => acc.clone(), -}); -let import_recursive = parent_envs.clone().iter().cloned().fold(Rc::new(vec![]), |acc: _, env: Rc| v2_rt::concat(acc, env.recursive_types.clone())); -let import_recursive_set = parent_envs.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, env: Rc| v2_rt::rc_map_merge(acc, env.recursive_type_set.clone())); -let import_inductive_fields = parent_envs.clone().iter().cloned().fold(v2_rt::rc_empty_map::>>>(), |acc: Rc>>>>, env: Rc| merge_inductive_fields(acc, &env.inductive_fields.clone())); -let import_env = Rc::new(TypeEnv { - bindings: import_bindings, - recursive_types: import_recursive, - recursive_type_set: import_recursive_set, - inductive_fields: import_inductive_fields, - source_indices: source_indices.clone(), - intern_table: intern_table.clone(), -}); -let import_diags = Rc::new({ let mut __result = Vec::new(); for imp in module.resolved_imports.clone().iter().cloned() { __result.extend((*match v2_rt::map_get(&parent_index, imp.module_path.clone()) { - Some(_) => Rc::new(vec![]), - None => Rc::new(vec![make_error_node(Rc::new(CompilerDiagnostic::InternalError { - message: v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("missing parent environment for imported module '".to_string(), imp.module_path.clone()), "' while typechecking '".to_string()), module_name_str.clone()), "'".to_string()), - span: imp.target_module.clone().clone().unwrap().span.clone(), -}), module_name_str.clone())]), -}).iter().cloned()); } __result }); -let local_bindings = module_items(module.module.clone()).iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, item: Rc| { - let item_ident = intern(&intern_table, &authored_name_at(source_indices.clone(), &item)).id.clone(); -let has_structure = (item.connective.clone() != Connective::NoConnective); -if has_structure.clone() { - { - let type_node = Rc::new(Node { - name: item.name.clone(), - span: item.span.clone(), - ident_span: item.ident_span.clone(), - children: item.children.clone(), - connective: item.connective.clone(), - params: item.params.clone(), - inferred: None, - return_cardinality: item.return_cardinality.clone(), - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -v2_rt::rc_map_insert(acc.clone(), item_ident.clone(), Rc::new(TypeBinding { - name: authored_name_at(source_indices.clone(), &item), - resolved: type_node.clone(), - provenance: Rc::new(SubValueRelation::SubValueUnknown), -})) -} - } else { - if (((item.inferred.clone() != None) && ((item.params.clone().len() as i64) == 0)) && (item.body.clone() == None)) { + None => acc.clone(), + }, + ); + let import_recursive = parent_envs + .clone() + .iter() + .cloned() + .fold(Rc::new(vec![]), |acc: _, env: Rc| { + v2_rt::concat(acc, env.recursive_types.clone()) + }); + let import_recursive_set = parent_envs.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, env: Rc| { + v2_rt::rc_map_merge(acc, env.recursive_type_set.clone()) + }, + ); + let import_inductive_fields = parent_envs.clone().iter().cloned().fold( + v2_rt::rc_empty_map::>>>(), + |acc: Rc>>>>, env: Rc| { + merge_inductive_fields(acc, &env.inductive_fields.clone()) + }, + ); + let import_env = Rc::new(TypeEnv { + bindings: import_bindings, + recursive_types: import_recursive, + recursive_type_set: import_recursive_set, + inductive_fields: import_inductive_fields, + source_indices: source_indices.clone(), + intern_table: intern_table.clone(), + }); + let import_diags = Rc::new({ + let mut __result = Vec::new(); + for imp in module.resolved_imports.clone().iter().cloned() { + __result.extend( + (*match v2_rt::map_get(&parent_index, imp.module_path.clone()) { + Some(_) => Rc::new(vec![]), + None => Rc::new(vec![make_error_node( + Rc::new(CompilerDiagnostic::InternalError { + message: v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "missing parent environment for imported module '" + .to_string(), + imp.module_path.clone(), + ), + "' while typechecking '".to_string(), + ), + module_name_str.clone(), + ), + "'".to_string(), + ), + span: imp.target_module.clone().clone().unwrap().span.clone(), + }), + module_name_str.clone(), + )]), + }) + .iter() + .cloned(), + ); + } + __result + }); + let local_bindings = module_items(module.module.clone()).iter().cloned().fold( + v2_rt::rc_empty_map::>(), + |acc: Rc>>, item: Rc| { + let item_ident = intern( + &intern_table, + &authored_name_at(source_indices.clone(), &item), + ) + .id + .clone(); + let has_structure = (item.connective.clone() != Connective::NoConnective); + if has_structure.clone() { { - let alias_node = Rc::new(Node { - name: item.name.clone(), - span: item.span.clone(), - ident_span: item.ident_span.clone(), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: item.inferred.clone(), - return_cardinality: item.return_cardinality.clone(), - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -v2_rt::rc_map_insert(acc.clone(), item_ident.clone(), Rc::new(TypeBinding { - name: authored_name_at(source_indices.clone(), &item), - resolved: alias_node.clone(), - provenance: Rc::new(SubValueRelation::SubValueUnknown), -})) -} + let type_node = Rc::new(Node { + name: item.name.clone(), + span: item.span.clone(), + ident_span: item.ident_span.clone(), + children: item.children.clone(), + connective: item.connective.clone(), + params: item.params.clone(), + inferred: None, + return_cardinality: item.return_cardinality.clone(), + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + v2_rt::rc_map_insert( + acc.clone(), + item_ident.clone(), + Rc::new(TypeBinding { + name: authored_name_at(source_indices.clone(), &item), + resolved: type_node.clone(), + provenance: Rc::new(SubValueRelation::SubValueUnknown), + }), + ) + } } else { - if ((item.transport.clone() == None) && ((item.children.clone().len() as i64) > 0)) { + if (((item.inferred.clone() != None) + && ((item.params.clone().len() as i64) == 0)) + && (item.body.clone() == None)) + { { - let ref_node = nominal_ref_node(&authored_name_at(source_indices.clone(), &item), item.span.clone(), item.ident_span.clone()); -v2_rt::rc_map_insert(acc.clone(), item_ident.clone(), Rc::new(TypeBinding { - name: authored_name_at(source_indices.clone(), &item), - resolved: ref_node.clone(), - provenance: Rc::new(SubValueRelation::SubValueUnknown), -})) -} + let alias_node = Rc::new(Node { + name: item.name.clone(), + span: item.span.clone(), + ident_span: item.ident_span.clone(), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: item.inferred.clone(), + return_cardinality: item.return_cardinality.clone(), + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + v2_rt::rc_map_insert( + acc.clone(), + item_ident.clone(), + Rc::new(TypeBinding { + name: authored_name_at(source_indices.clone(), &item), + resolved: alias_node.clone(), + provenance: Rc::new(SubValueRelation::SubValueUnknown), + }), + ) + } } else { - if (((((item.params.clone().len() as i64) > 0) && (item.connective.clone() == Connective::NoConnective)) && (item.body.clone() == None)) && (item.transport.clone() == None)) { + if ((item.transport.clone() == None) + && ((item.children.clone().len() as i64) > 0)) + { { - let bare_node = Rc::new(Node { - name: item.name.clone(), - span: item.span.clone(), - ident_span: item.ident_span.clone(), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: item.params.clone(), - inferred: item.inferred.clone(), - return_cardinality: item.return_cardinality.clone(), - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -v2_rt::rc_map_insert(acc.clone(), item_ident.clone(), Rc::new(TypeBinding { - name: authored_name_at(source_indices.clone(), &item), - resolved: bare_node.clone(), - provenance: Rc::new(SubValueRelation::SubValueUnknown), -})) -} + let ref_node = nominal_ref_node( + &authored_name_at(source_indices.clone(), &item), + item.span.clone(), + item.ident_span.clone(), + ); + v2_rt::rc_map_insert( + acc.clone(), + item_ident.clone(), + Rc::new(TypeBinding { + name: authored_name_at(source_indices.clone(), &item), + resolved: ref_node.clone(), + provenance: Rc::new(SubValueRelation::SubValueUnknown), + }), + ) + } } else { - if ((((((item.properties.clone().len() as i64) > 0) && (item.connective.clone() == Connective::NoConnective)) && (item.transport.clone() == None)) && (item.inferred.clone() == None)) && ((item.params.clone().len() as i64) == 0)) { - v2_rt::rc_map_insert(acc.clone(), item_ident.clone(), nominal_type_binding(&authored_name_at(source_indices.clone(), &item))) + if (((((item.params.clone().len() as i64) > 0) + && (item.connective.clone() == Connective::NoConnective)) + && (item.body.clone() == None)) + && (item.transport.clone() == None)) + { + { + let bare_node = Rc::new(Node { + name: item.name.clone(), + span: item.span.clone(), + ident_span: item.ident_span.clone(), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: item.params.clone(), + inferred: item.inferred.clone(), + return_cardinality: item.return_cardinality.clone(), + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + v2_rt::rc_map_insert( + acc.clone(), + item_ident.clone(), + Rc::new(TypeBinding { + name: authored_name_at(source_indices.clone(), &item), + resolved: bare_node.clone(), + provenance: Rc::new(SubValueRelation::SubValueUnknown), + }), + ) + } } else { - acc.clone() + if ((((((item.properties.clone().len() as i64) > 0) + && (item.connective.clone() == Connective::NoConnective)) + && (item.transport.clone() == None)) + && (item.inferred.clone() == None)) + && ((item.params.clone().len() as i64) == 0)) + { + v2_rt::rc_map_insert( + acc.clone(), + item_ident.clone(), + nominal_type_binding(&authored_name_at( + source_indices.clone(), + &item, + )), + ) + } else { + acc.clone() + } } } } } + }, + ); + let param_bindings = module_items(module.module.clone()).iter().cloned().fold( + v2_rt::rc_empty_map::>(), + |acc: Rc>>, item: Rc| { + let is_type_decl = match v2_rt::map_get( + &local_bindings, + intern( + &intern_table, + &authored_name_at(source_indices.clone(), &item), + ) + .id + .clone(), + ) { + Some(_) => true, + None => false, + }; + if (((item.params.clone().len() as i64) > 0) && is_type_decl.clone()) { + { + let result = item.params.clone().iter().cloned().fold( + acc.clone(), + |pacc: Rc>>, p: Rc| { + v2_rt::rc_map_insert( + pacc, + intern( + &intern_table, + &authored_name_at(source_indices.clone(), &p), + ) + .id + .clone(), + nominal_type_binding(&authored_name_at( + source_indices.clone(), + &p, + )), + ) + }, + ); + result.clone() + } + } else { + acc.clone() + } + }, + ); + let local_name_set = Rc::new(v2_rt::map_keys(&local_bindings)) + .iter() + .cloned() + .fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, ident: i64| { + v2_rt::rc_map_insert(acc, ident.clone(), true) + }, + ); + let all_local_bindings = v2_rt::rc_map_merge(local_bindings.clone(), param_bindings); + let pre_local_env = Rc::new(TypeEnv { + bindings: all_local_bindings, + recursive_types: Rc::new(vec![]), + recursive_type_set: v2_rt::rc_empty_map::(), + inductive_fields: v2_rt::rc_empty_map::>>>(), + source_indices: source_indices.clone(), + intern_table: intern_table.clone(), + }); + let merged = merge_envs(&Rc::new(vec![kernel, import_env, pre_local_env])); + let all_deps_map = Rc::new(v2_rt::map_values(&merged.bindings.clone())) + .iter() + .cloned() + .fold( + v2_rt::rc_empty_map::>>(), + |acc: Rc>>>, b: Rc| { + v2_rt::rc_map_insert( + acc, + b.name.clone(), + node_type_deps(&b.resolved.clone(), &source_indices), + ) + }, + ); + let str_bindings = Rc::new(v2_rt::map_values(&merged.bindings.clone())) + .iter() + .cloned() + .fold( + v2_rt::rc_empty_map::>(), + |acc: Rc>>, b: Rc| { + v2_rt::rc_map_insert(acc, b.name.clone(), b.clone()) + }, + ); + let cycle_set_str = detect_type_cycles_kahn(&all_deps_map, str_bindings); + let cycle_set = Rc::new({ + let mut __result = Vec::new(); + for name in cycle_set_str.clone().iter().cloned() { + __result.push(intern(&intern_table, &name).id.clone()); } -}); -let param_bindings = module_items(module.module.clone()).iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, item: Rc| { - let is_type_decl = match v2_rt::map_get(&local_bindings, intern(&intern_table, &authored_name_at(source_indices.clone(), &item)).id.clone()) { - Some(_) => true, - None => false, -}; -if (((item.params.clone().len() as i64) > 0) && is_type_decl.clone()) { - { - let result = item.params.clone().iter().cloned().fold(acc.clone(), |pacc: Rc>>, p: Rc| v2_rt::rc_map_insert(pacc, intern(&intern_table, &authored_name_at(source_indices.clone(), &p)).id.clone(), nominal_type_binding(&authored_name_at(source_indices.clone(), &p)))); -result.clone() -} - } else { - acc.clone() - } -}); -let local_name_set = Rc::new(v2_rt::map_keys(&local_bindings)).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, ident: i64| v2_rt::rc_map_insert(acc, ident.clone(), true)); -let all_local_bindings = v2_rt::rc_map_merge(local_bindings.clone(), param_bindings); -let pre_local_env = Rc::new(TypeEnv { - bindings: all_local_bindings, - recursive_types: Rc::new(vec![]), - recursive_type_set: v2_rt::rc_empty_map::(), - inductive_fields: v2_rt::rc_empty_map::>>>(), - source_indices: source_indices.clone(), - intern_table: intern_table.clone(), -}); -let merged = merge_envs(&Rc::new(vec![kernel, import_env, pre_local_env])); -let all_deps_map = Rc::new(v2_rt::map_values(&merged.bindings.clone())).iter().cloned().fold(v2_rt::rc_empty_map::>>(), |acc: Rc>>>, b: Rc| v2_rt::rc_map_insert(acc, b.name.clone(), node_type_deps(&b.resolved.clone(), &source_indices))); -let str_bindings = Rc::new(v2_rt::map_values(&merged.bindings.clone())).iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, b: Rc| v2_rt::rc_map_insert(acc, b.name.clone(), b.clone())); -let cycle_set_str = detect_type_cycles_kahn(&all_deps_map, str_bindings); -let cycle_set = Rc::new({ let mut __result = Vec::new(); for name in cycle_set_str.clone().iter().cloned() { __result.push(intern(&intern_table, &name).id.clone()); } __result }); -let cycle_map = cycle_set_str.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, name: String| v2_rt::rc_map_insert(acc, name.clone(), true)); -let cross_type_set_str = v2_rt::rc_map_merge(cycle_map, compiler_recursive_types()); -let cross_type_set = Rc::new(v2_rt::map_keys(&cross_type_set_str)).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, name: String| v2_rt::rc_map_insert(acc, intern(&intern_table, &name).id.clone(), true)); -let local_inductive_fields = build_item_inductive_fields(module_items(module.module.clone()), cross_type_set_str.clone(), source_indices.clone()); -let merged_inductive_fields = merge_inductive_fields(merged.inductive_fields.clone(), &local_inductive_fields); -let unresolved_env = Rc::new(TypeEnv { - bindings: merged.bindings.clone(), - recursive_types: cycle_set, - recursive_type_set: cross_type_set, - inductive_fields: merged_inductive_fields, - source_indices: source_indices.clone(), - intern_table: intern_table.clone(), -}); -let resolved = resolve_env_bindings(&unresolved_env, module_name_str.clone(), &local_name_set, all_deps_map.clone()); -let resolved_env_out = resolved.env.clone(); -let resolved_diags = resolved.diagnostics.clone(); -let final_env = Rc::new(TypeEnv { - bindings: resolved_env_out.bindings.clone(), - recursive_types: resolved_env_out.recursive_types.clone(), - recursive_type_set: resolved_env_out.recursive_type_set.clone(), - inductive_fields: resolved_env_out.inductive_fields.clone(), - source_indices: resolved_env_out.source_indices.clone(), - intern_table: intern_table.clone(), -}); -Rc::new(BuildTypeEnvResult { - env: final_env, - diagnostics: v2_rt::concat(import_diags, resolved_diags), -}) -} + __result + }); + let cycle_map = cycle_set_str.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, name: String| { + v2_rt::rc_map_insert(acc, name.clone(), true) + }, + ); + let cross_type_set_str = v2_rt::rc_map_merge(cycle_map, compiler_recursive_types()); + let cross_type_set = Rc::new(v2_rt::map_keys(&cross_type_set_str)) + .iter() + .cloned() + .fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, name: String| { + v2_rt::rc_map_insert(acc, intern(&intern_table, &name).id.clone(), true) + }, + ); + let local_inductive_fields = build_item_inductive_fields( + module_items(module.module.clone()), + cross_type_set_str.clone(), + source_indices.clone(), + ); + let merged_inductive_fields = + merge_inductive_fields(merged.inductive_fields.clone(), &local_inductive_fields); + let unresolved_env = Rc::new(TypeEnv { + bindings: merged.bindings.clone(), + recursive_types: cycle_set, + recursive_type_set: cross_type_set, + inductive_fields: merged_inductive_fields, + source_indices: source_indices.clone(), + intern_table: intern_table.clone(), + }); + let resolved = resolve_env_bindings( + &unresolved_env, + module_name_str.clone(), + &local_name_set, + all_deps_map.clone(), + ); + let resolved_env_out = resolved.env.clone(); + let resolved_diags = resolved.diagnostics.clone(); + let final_env = Rc::new(TypeEnv { + bindings: resolved_env_out.bindings.clone(), + recursive_types: resolved_env_out.recursive_types.clone(), + recursive_type_set: resolved_env_out.recursive_type_set.clone(), + inductive_fields: resolved_env_out.inductive_fields.clone(), + source_indices: resolved_env_out.source_indices.clone(), + intern_table: intern_table.clone(), + }); + Rc::new(BuildTypeEnvResult { + env: final_env, + diagnostics: v2_rt::concat(import_diags, resolved_diags), + }) + } } -pub fn build_type_env_unresolved(module: &Rc, parent_index: &Rc>>, source_indices: &Rc>>, intern_table: &Rc) -> Rc { +pub fn build_type_env_unresolved( + module: &Rc, + parent_index: &Rc>>, + source_indices: &Rc>>, + intern_table: &Rc, +) -> Rc { { - let intern_table = Rc::new(v2_rt::map_keys(&kernel_type_set())).iter().cloned().fold(intern_table.clone(), |t: Rc, name: String| intern(&t, &name).table.clone()); -let intern_table = Rc::new(vec!["Optional".to_string()]).iter().cloned().fold(intern_table.clone(), |t: Rc, name: String| intern(&t, &name).table.clone()); -let zero_span = make_span(0, 0); -let kernel_bindings = Rc::new(v2_rt::map_keys(&kernel_type_set())).iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, name: String| v2_rt::rc_map_insert(acc, intern(&intern_table, &name).id.clone(), Rc::new(TypeBinding { - name: name.clone(), - resolved: Rc::new(Node { - name: name.clone(), - span: kernel_span(&name), - ident_span: Some(kernel_span(&name)), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}), - provenance: Rc::new(SubValueRelation::SubValueUnknown), -}))); -let some_value_field = Rc::new(Node { - name: "value".to_string(), - span: kernel_span(&"value".to_string()), - ident_span: Some(kernel_span(&"value".to_string())), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::TypeVariable { - id: "some_value".to_string(), -})), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -let some_variant = Rc::new(Node { - name: "Some".to_string(), - span: kernel_span(&"Some".to_string()), - ident_span: Some(kernel_span(&"Some".to_string())), - children: Rc::new(vec![some_value_field]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -let kernel_optional = Rc::new(Node { - name: "Optional".to_string(), - span: kernel_span(&"Optional".to_string()), - ident_span: Some(kernel_span(&"Optional".to_string())), - children: Rc::new(vec![some_variant, none_type()]), - connective: Connective::Disj, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -let kernel_bindings = v2_rt::rc_map_insert(kernel_bindings.clone(), intern(&intern_table, &"Optional".to_string()).id.clone(), Rc::new(TypeBinding { - name: "Optional".to_string(), - resolved: kernel_optional, - provenance: Rc::new(SubValueRelation::SubValueUnknown), -})); -let kernel = Rc::new(TypeEnv { - bindings: kernel_bindings.clone(), - recursive_types: Rc::new(vec![]), - recursive_type_set: v2_rt::rc_empty_map::(), - inductive_fields: v2_rt::rc_empty_map::>>>(), - source_indices: source_indices.clone(), - intern_table: intern_table.clone(), -}); -let imports_std_types = { let mut __found = false; for imp in module.resolved_imports.clone().iter().cloned() { if (imp.module_path.clone().as_str() == "std.types".to_string().as_str()) { __found = true; break; } } __found }; -let module_name_str = authored_name_at(source_indices.clone(), &module.module.clone()); -let std_types_parent_env = if ((module_name_str.as_str() != "std.types".to_string().as_str()) && (imports_std_types == false)) { + let intern_table = Rc::new(v2_rt::map_keys(&kernel_type_set())) + .iter() + .cloned() + .fold(intern_table.clone(), |t: Rc, name: String| { + intern(&t, &name).table.clone() + }); + let intern_table = Rc::new(vec!["Optional".to_string()]) + .iter() + .cloned() + .fold(intern_table.clone(), |t: Rc, name: String| { + intern(&t, &name).table.clone() + }); + let zero_span = make_span(0, 0); + let kernel_bindings = Rc::new(v2_rt::map_keys(&kernel_type_set())) + .iter() + .cloned() + .fold( + v2_rt::rc_empty_map::>(), + |acc: Rc>>, name: String| { + v2_rt::rc_map_insert( + acc, + intern(&intern_table, &name).id.clone(), + Rc::new(TypeBinding { + name: name.clone(), + resolved: Rc::new(Node { + name: name.clone(), + span: kernel_span(&name), + ident_span: Some(kernel_span(&name)), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }), + provenance: Rc::new(SubValueRelation::SubValueUnknown), + }), + ) + }, + ); + let some_value_field = Rc::new(Node { + name: "value".to_string(), + span: kernel_span(&"value".to_string()), + ident_span: Some(kernel_span(&"value".to_string())), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::TypeVariable { + id: "some_value".to_string(), + })), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + let some_variant = Rc::new(Node { + name: "Some".to_string(), + span: kernel_span(&"Some".to_string()), + ident_span: Some(kernel_span(&"Some".to_string())), + children: Rc::new(vec![some_value_field]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + let kernel_optional = Rc::new(Node { + name: "Optional".to_string(), + span: kernel_span(&"Optional".to_string()), + ident_span: Some(kernel_span(&"Optional".to_string())), + children: Rc::new(vec![some_variant, none_type()]), + connective: Connective::Disj, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + let kernel_bindings = v2_rt::rc_map_insert( + kernel_bindings.clone(), + intern(&intern_table, &"Optional".to_string()).id.clone(), + Rc::new(TypeBinding { + name: "Optional".to_string(), + resolved: kernel_optional, + provenance: Rc::new(SubValueRelation::SubValueUnknown), + }), + ); + let kernel = Rc::new(TypeEnv { + bindings: kernel_bindings.clone(), + recursive_types: Rc::new(vec![]), + recursive_type_set: v2_rt::rc_empty_map::(), + inductive_fields: v2_rt::rc_empty_map::>>>(), + source_indices: source_indices.clone(), + intern_table: intern_table.clone(), + }); + let imports_std_types = { + let mut __found = false; + for imp in module.resolved_imports.clone().iter().cloned() { + if (imp.module_path.clone().as_str() == "std.types".to_string().as_str()) { + __found = true; + break; + } + } + __found + }; + let module_name_str = authored_name_at(source_indices.clone(), &module.module.clone()); + let std_types_parent_env = if ((module_name_str.as_str() + != "std.types".to_string().as_str()) + && (imports_std_types == false)) + { match v2_rt::map_get(&parent_index, "std.types".to_string()) { - Some(typed_std) => Rc::new(vec![typed_std.type_env.clone()]), - None => Rc::new(vec![]), -} + Some(typed_std) => Rc::new(vec![typed_std.type_env.clone()]), + None => Rc::new(vec![]), + } } else { Rc::new(vec![]) }; -let imported_parent_envs = Rc::new({ let mut __result = Vec::new(); for imp in module.resolved_imports.clone().iter().cloned() { __result.extend((*match v2_rt::map_get(&parent_index, imp.module_path.clone()) { - Some(typed_parent) => Rc::new(vec![typed_parent.type_env.clone()]), - None => Rc::new(vec![]), -}).iter().cloned()); } __result }); -let parent_envs = v2_rt::concat(std_types_parent_env.clone(), imported_parent_envs); -let std_import_bindings = collect_parent_bindings_filtered(std_types_parent_env.clone()); -let import_bindings = module.resolved_imports.clone().iter().cloned().fold(std_import_bindings, |acc: Rc>>, imp: Rc| match v2_rt::map_get(&parent_index, imp.module_path.clone()) { - Some(typed_parent) => if (imp.module_path.clone().as_str() == "std.types".to_string().as_str()) { - Rc::new(v2_rt::map_keys(&typed_parent.type_env.clone().bindings.clone())).iter().cloned().fold(acc.clone(), |bacc: Rc>>, ident: i64| { - let name = intern_str(typed_parent.type_env.clone().intern_table.clone(), ident.clone()); -if is_type_variable_name(&name) { - bacc.clone() - } else { - match v2_rt::map_get(&typed_parent.type_env.clone().bindings.clone(), ident.clone()) { - Some(binding) => v2_rt::rc_map_insert(bacc.clone(), ident.clone(), binding.clone()), - None => bacc.clone(), -} - } -}) - } else { - v2_rt::rc_map_merge(acc.clone(), typed_parent.type_env.clone().bindings.clone()) - }, - None => acc.clone(), -}); -let import_recursive = parent_envs.clone().iter().cloned().fold(Rc::new(vec![]), |acc: _, env: Rc| v2_rt::concat(acc, env.recursive_types.clone())); -let import_recursive_set = parent_envs.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, env: Rc| v2_rt::rc_map_merge(acc, env.recursive_type_set.clone())); -let import_inductive_fields = parent_envs.clone().iter().cloned().fold(v2_rt::rc_empty_map::>>>(), |acc: Rc>>>>, env: Rc| merge_inductive_fields(acc, &env.inductive_fields.clone())); -let import_env = Rc::new(TypeEnv { - bindings: import_bindings, - recursive_types: import_recursive, - recursive_type_set: import_recursive_set, - inductive_fields: import_inductive_fields, - source_indices: source_indices.clone(), - intern_table: intern_table.clone(), -}); -let local_bindings = module_items(module.module.clone()).iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, item: Rc| { - let item_ident = intern(&intern_table, &authored_name_at(source_indices.clone(), &item)).id.clone(); -let has_structure = (item.connective.clone() != Connective::NoConnective); -if has_structure.clone() { - { - let type_node = Rc::new(Node { - name: item.name.clone(), - span: item.span.clone(), - ident_span: item.ident_span.clone(), - children: item.children.clone(), - connective: item.connective.clone(), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: item.return_cardinality.clone(), - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -v2_rt::rc_map_insert(acc.clone(), item_ident.clone(), Rc::new(TypeBinding { - name: authored_name_at(source_indices.clone(), &item), - resolved: type_node.clone(), - provenance: Rc::new(SubValueRelation::SubValueUnknown), -})) -} - } else { - if (((item.inferred.clone() != None) && ((item.params.clone().len() as i64) == 0)) && (item.body.clone() == None)) { + let imported_parent_envs = Rc::new({ + let mut __result = Vec::new(); + for imp in module.resolved_imports.clone().iter().cloned() { + __result.extend( + (*match v2_rt::map_get(&parent_index, imp.module_path.clone()) { + Some(typed_parent) => Rc::new(vec![typed_parent.type_env.clone()]), + None => Rc::new(vec![]), + }) + .iter() + .cloned(), + ); + } + __result + }); + let parent_envs = v2_rt::concat(std_types_parent_env.clone(), imported_parent_envs); + let std_import_bindings = collect_parent_bindings_filtered(std_types_parent_env.clone()); + let import_bindings = module.resolved_imports.clone().iter().cloned().fold( + std_import_bindings, + |acc: Rc>>, imp: Rc| match v2_rt::map_get( + &parent_index, + imp.module_path.clone(), + ) { + Some(typed_parent) => { + if (imp.module_path.clone().as_str() == "std.types".to_string().as_str()) { + Rc::new(v2_rt::map_keys( + &typed_parent.type_env.clone().bindings.clone(), + )) + .iter() + .cloned() + .fold( + acc.clone(), + |bacc: Rc>>, ident: i64| { + let name = intern_str( + typed_parent.type_env.clone().intern_table.clone(), + ident.clone(), + ); + if is_type_variable_name(&name) { + bacc.clone() + } else { + match v2_rt::map_get( + &typed_parent.type_env.clone().bindings.clone(), + ident.clone(), + ) { + Some(binding) => v2_rt::rc_map_insert( + bacc.clone(), + ident.clone(), + binding.clone(), + ), + None => bacc.clone(), + } + } + }, + ) + } else { + v2_rt::rc_map_merge( + acc.clone(), + typed_parent.type_env.clone().bindings.clone(), + ) + } + } + None => acc.clone(), + }, + ); + let import_recursive = parent_envs + .clone() + .iter() + .cloned() + .fold(Rc::new(vec![]), |acc: _, env: Rc| { + v2_rt::concat(acc, env.recursive_types.clone()) + }); + let import_recursive_set = parent_envs.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, env: Rc| { + v2_rt::rc_map_merge(acc, env.recursive_type_set.clone()) + }, + ); + let import_inductive_fields = parent_envs.clone().iter().cloned().fold( + v2_rt::rc_empty_map::>>>(), + |acc: Rc>>>>, env: Rc| { + merge_inductive_fields(acc, &env.inductive_fields.clone()) + }, + ); + let import_env = Rc::new(TypeEnv { + bindings: import_bindings, + recursive_types: import_recursive, + recursive_type_set: import_recursive_set, + inductive_fields: import_inductive_fields, + source_indices: source_indices.clone(), + intern_table: intern_table.clone(), + }); + let local_bindings = module_items(module.module.clone()).iter().cloned().fold( + v2_rt::rc_empty_map::>(), + |acc: Rc>>, item: Rc| { + let item_ident = intern( + &intern_table, + &authored_name_at(source_indices.clone(), &item), + ) + .id + .clone(); + let has_structure = (item.connective.clone() != Connective::NoConnective); + if has_structure.clone() { { - let alias_node = Rc::new(Node { - name: item.name.clone(), - span: item.span.clone(), - ident_span: item.ident_span.clone(), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: item.inferred.clone(), - return_cardinality: item.return_cardinality.clone(), - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -v2_rt::rc_map_insert(acc.clone(), item_ident.clone(), Rc::new(TypeBinding { - name: authored_name_at(source_indices.clone(), &item), - resolved: alias_node.clone(), - provenance: Rc::new(SubValueRelation::SubValueUnknown), -})) -} + let type_node = Rc::new(Node { + name: item.name.clone(), + span: item.span.clone(), + ident_span: item.ident_span.clone(), + children: item.children.clone(), + connective: item.connective.clone(), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: item.return_cardinality.clone(), + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + v2_rt::rc_map_insert( + acc.clone(), + item_ident.clone(), + Rc::new(TypeBinding { + name: authored_name_at(source_indices.clone(), &item), + resolved: type_node.clone(), + provenance: Rc::new(SubValueRelation::SubValueUnknown), + }), + ) + } } else { - if ((item.transport.clone() == None) && ((item.children.clone().len() as i64) > 0)) { + if (((item.inferred.clone() != None) + && ((item.params.clone().len() as i64) == 0)) + && (item.body.clone() == None)) + { { - let ref_node = nominal_ref_node(&authored_name_at(source_indices.clone(), &item), item.span.clone(), item.ident_span.clone()); -v2_rt::rc_map_insert(acc.clone(), item_ident.clone(), Rc::new(TypeBinding { - name: authored_name_at(source_indices.clone(), &item), - resolved: ref_node.clone(), - provenance: Rc::new(SubValueRelation::SubValueUnknown), -})) -} + let alias_node = Rc::new(Node { + name: item.name.clone(), + span: item.span.clone(), + ident_span: item.ident_span.clone(), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: item.inferred.clone(), + return_cardinality: item.return_cardinality.clone(), + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + v2_rt::rc_map_insert( + acc.clone(), + item_ident.clone(), + Rc::new(TypeBinding { + name: authored_name_at(source_indices.clone(), &item), + resolved: alias_node.clone(), + provenance: Rc::new(SubValueRelation::SubValueUnknown), + }), + ) + } } else { - if ((((((item.properties.clone().len() as i64) > 0) && (item.connective.clone() == Connective::NoConnective)) && (item.transport.clone() == None)) && (item.inferred.clone() == None)) && ((item.params.clone().len() as i64) == 0)) { - v2_rt::rc_map_insert(acc.clone(), item_ident.clone(), nominal_type_binding(&authored_name_at(source_indices.clone(), &item))) + if ((item.transport.clone() == None) + && ((item.children.clone().len() as i64) > 0)) + { + { + let ref_node = nominal_ref_node( + &authored_name_at(source_indices.clone(), &item), + item.span.clone(), + item.ident_span.clone(), + ); + v2_rt::rc_map_insert( + acc.clone(), + item_ident.clone(), + Rc::new(TypeBinding { + name: authored_name_at(source_indices.clone(), &item), + resolved: ref_node.clone(), + provenance: Rc::new(SubValueRelation::SubValueUnknown), + }), + ) + } } else { - acc.clone() + if ((((((item.properties.clone().len() as i64) > 0) + && (item.connective.clone() == Connective::NoConnective)) + && (item.transport.clone() == None)) + && (item.inferred.clone() == None)) + && ((item.params.clone().len() as i64) == 0)) + { + v2_rt::rc_map_insert( + acc.clone(), + item_ident.clone(), + nominal_type_binding(&authored_name_at( + source_indices.clone(), + &item, + )), + ) + } else { + acc.clone() + } } } } + }, + ); + let pre_local_env = Rc::new(TypeEnv { + bindings: local_bindings, + recursive_types: Rc::new(vec![]), + recursive_type_set: v2_rt::rc_empty_map::(), + inductive_fields: v2_rt::rc_empty_map::>>>(), + source_indices: source_indices.clone(), + intern_table: intern_table.clone(), + }); + let merged = merge_envs(&Rc::new(vec![kernel, import_env, pre_local_env])); + let all_deps_map = Rc::new(v2_rt::map_values(&merged.bindings.clone())) + .iter() + .cloned() + .fold( + v2_rt::rc_empty_map::>>(), + |acc: Rc>>>, b: Rc| { + v2_rt::rc_map_insert( + acc, + b.name.clone(), + node_type_deps(&b.resolved.clone(), &source_indices), + ) + }, + ); + let str_bindings = Rc::new(v2_rt::map_values(&merged.bindings.clone())) + .iter() + .cloned() + .fold( + v2_rt::rc_empty_map::>(), + |acc: Rc>>, b: Rc| { + v2_rt::rc_map_insert(acc, b.name.clone(), b.clone()) + }, + ); + let cycle_set_str = detect_type_cycles_kahn(&all_deps_map, str_bindings); + let cycle_set = Rc::new({ + let mut __result = Vec::new(); + for name in cycle_set_str.clone().iter().cloned() { + __result.push(intern(&intern_table, &name).id.clone()); } -}); -let pre_local_env = Rc::new(TypeEnv { - bindings: local_bindings, - recursive_types: Rc::new(vec![]), - recursive_type_set: v2_rt::rc_empty_map::(), - inductive_fields: v2_rt::rc_empty_map::>>>(), - source_indices: source_indices.clone(), - intern_table: intern_table.clone(), -}); -let merged = merge_envs(&Rc::new(vec![kernel, import_env, pre_local_env])); -let all_deps_map = Rc::new(v2_rt::map_values(&merged.bindings.clone())).iter().cloned().fold(v2_rt::rc_empty_map::>>(), |acc: Rc>>>, b: Rc| v2_rt::rc_map_insert(acc, b.name.clone(), node_type_deps(&b.resolved.clone(), &source_indices))); -let str_bindings = Rc::new(v2_rt::map_values(&merged.bindings.clone())).iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, b: Rc| v2_rt::rc_map_insert(acc, b.name.clone(), b.clone())); -let cycle_set_str = detect_type_cycles_kahn(&all_deps_map, str_bindings); -let cycle_set = Rc::new({ let mut __result = Vec::new(); for name in cycle_set_str.clone().iter().cloned() { __result.push(intern(&intern_table, &name).id.clone()); } __result }); -let cycle_map = cycle_set_str.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, name: String| v2_rt::rc_map_insert(acc, name.clone(), true)); -let cross_type_set_str = v2_rt::rc_map_merge(cycle_map, compiler_recursive_types()); -let cross_type_set = Rc::new(v2_rt::map_keys(&cross_type_set_str)).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, name: String| v2_rt::rc_map_insert(acc, intern(&intern_table, &name).id.clone(), true)); -let local_inductive_fields = build_item_inductive_fields(module_items(module.module.clone()), cross_type_set_str.clone(), source_indices.clone()); -let merged_inductive_fields = merge_inductive_fields(merged.inductive_fields.clone(), &local_inductive_fields); -let unresolved_env = Rc::new(TypeEnv { - bindings: merged.bindings.clone(), - recursive_types: cycle_set, - recursive_type_set: cross_type_set, - inductive_fields: merged_inductive_fields, - source_indices: source_indices.clone(), - intern_table: intern_table.clone(), -}); -Rc::new(BuildTypeEnvResult { - env: unresolved_env, - diagnostics: Rc::new(vec![]), -}) -} + __result + }); + let cycle_map = cycle_set_str.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, name: String| { + v2_rt::rc_map_insert(acc, name.clone(), true) + }, + ); + let cross_type_set_str = v2_rt::rc_map_merge(cycle_map, compiler_recursive_types()); + let cross_type_set = Rc::new(v2_rt::map_keys(&cross_type_set_str)) + .iter() + .cloned() + .fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, name: String| { + v2_rt::rc_map_insert(acc, intern(&intern_table, &name).id.clone(), true) + }, + ); + let local_inductive_fields = build_item_inductive_fields( + module_items(module.module.clone()), + cross_type_set_str.clone(), + source_indices.clone(), + ); + let merged_inductive_fields = + merge_inductive_fields(merged.inductive_fields.clone(), &local_inductive_fields); + let unresolved_env = Rc::new(TypeEnv { + bindings: merged.bindings.clone(), + recursive_types: cycle_set, + recursive_type_set: cross_type_set, + inductive_fields: merged_inductive_fields, + source_indices: source_indices.clone(), + intern_table: intern_table.clone(), + }); + Rc::new(BuildTypeEnvResult { + env: unresolved_env, + diagnostics: Rc::new(vec![]), + }) + } } -pub fn build_item_info(item: &Rc, source_indices: &Rc>>, module_name: String) -> Rc { +pub fn build_item_info( + item: &Rc, + source_indices: &Rc>>, + module_name: String, +) -> Rc { { let kind = item_kind(&item); -let res_names = Rc::new({ let mut __result = Vec::new(); for u in item.uses.clone().iter().cloned() { __result.push(resource_use_name_at(u.clone(), source_indices.clone())); } __result }); -let item_name_str = authored_name_at(source_indices.clone(), &item); -match kind.clone() { - ItemKind::FuncItem => Rc::new(ItemInfo { - name: item_name_str.clone(), - module_name: module_name, - kind: kind.clone(), - service_names: if (item.body.clone() == None) { - Rc::new(vec![]) - } else { - collect_typed_service_calls(item.body.clone().clone().unwrap(), source_indices.clone()) - }, - resource_names: res_names, - params: item.params.clone(), - is_self_recursive: false, - has_non_tail_self_call: false, -}), - ItemKind::FnItem => Rc::new(ItemInfo { - name: item_name_str.clone(), - module_name: module_name, - kind: kind.clone(), - service_names: if (item.body.clone() == None) { - Rc::new(vec![]) - } else { - collect_typed_service_calls(item.body.clone().clone().unwrap(), source_indices.clone()) - }, - resource_names: res_names, - params: item.params.clone(), - is_self_recursive: if (item.body.clone() == None) { - false - } else { - expr_has_self_call(&item.body.clone().clone().unwrap(), &item_name_str, &source_indices) - }, - has_non_tail_self_call: if (item.body.clone() == None) { - false - } else { - expr_has_non_tail_self_call(&item.body.clone().clone().unwrap(), &item_name_str, true, &source_indices) - }, -}), - _ => Rc::new(ItemInfo { - name: item_name_str.clone(), - module_name: module_name, - kind: kind.clone(), - service_names: Rc::new(vec![]), - resource_names: res_names, - params: item.params.clone(), - is_self_recursive: false, - has_non_tail_self_call: false, -}), -} -} + let res_names = Rc::new({ + let mut __result = Vec::new(); + for u in item.uses.clone().iter().cloned() { + __result.push(resource_use_name_at(u.clone(), source_indices.clone())); + } + __result + }); + let item_name_str = authored_name_at(source_indices.clone(), &item); + match kind.clone() { + ItemKind::FuncItem => Rc::new(ItemInfo { + name: item_name_str.clone(), + module_name: module_name, + kind: kind.clone(), + service_names: if (item.body.clone() == None) { + Rc::new(vec![]) + } else { + collect_typed_service_calls( + item.body.clone().clone().unwrap(), + source_indices.clone(), + ) + }, + resource_names: res_names, + params: item.params.clone(), + is_self_recursive: false, + has_non_tail_self_call: false, + }), + ItemKind::FnItem => Rc::new(ItemInfo { + name: item_name_str.clone(), + module_name: module_name, + kind: kind.clone(), + service_names: if (item.body.clone() == None) { + Rc::new(vec![]) + } else { + collect_typed_service_calls( + item.body.clone().clone().unwrap(), + source_indices.clone(), + ) + }, + resource_names: res_names, + params: item.params.clone(), + is_self_recursive: if (item.body.clone() == None) { + false + } else { + expr_has_self_call( + &item.body.clone().clone().unwrap(), + &item_name_str, + &source_indices, + ) + }, + has_non_tail_self_call: if (item.body.clone() == None) { + false + } else { + expr_has_non_tail_self_call( + &item.body.clone().clone().unwrap(), + &item_name_str, + true, + &source_indices, + ) + }, + }), + _ => Rc::new(ItemInfo { + name: item_name_str.clone(), + module_name: module_name, + kind: kind.clone(), + service_names: Rc::new(vec![]), + resource_names: res_names, + params: item.params.clone(), + is_self_recursive: false, + has_non_tail_self_call: false, + }), + } + } } -pub fn analyze_item(item: Rc, env: &Rc, module_name: &String) -> Rc { +pub fn analyze_item( + item: Rc, + env: &Rc, + module_name: &String, +) -> Rc { { let resolved = resolve_item_types(&item, &env, &module_name); -let ritem = resolved.item.clone(); -let is_func = ((ritem.params.clone().len() as i64) > 0); -let is_zero_arg_func = ((((ritem.params.clone().len() as i64) == 0) && (ritem.inferred.clone() != None)) && (ritem.body.clone() != None)); -let func_sig = if (is_func || is_zero_arg_func) { + let ritem = resolved.item.clone(); + let is_func = ((ritem.params.clone().len() as i64) > 0); + let is_zero_arg_func = ((((ritem.params.clone().len() as i64) == 0) + && (ritem.inferred.clone() != None)) + && (ritem.body.clone() != None)); + let func_sig = if (is_func || is_zero_arg_func) { { let declared_rt = if (ritem.inferred.clone() != None) { Some(resolved_type(ritem.clone())) } else { None }; -Some(Rc::new(DeclaredFuncSig { - name: authored_name_at(env.source_indices.clone(), &ritem), - params: ritem.params.clone(), - inferred: declared_rt, - is_async: ((ritem.uses.clone().len() as i64) > 0), - output_provenance: Rc::new(vec![]), - variant_provenance: v2_rt::rc_empty_map::>>>>>(), -})) -} - } else { - None - }; -let svc_entries = if ((ritem.transport.clone() != None) && ((ritem.children.clone().len() as i64) > 0)) { - Rc::new({ let mut __result = Vec::new(); for c in ritem.children.clone().iter().cloned() { __result.push(service_op_entry(&c, &env.source_indices.clone())); } __result }) - } else { - Rc::new(vec![]) - }; -let svc_local = if ((ritem.transport.clone() != None) && ((ritem.children.clone().len() as i64) > 0)) { - { - let root = namespace_root_from_properties(ritem.properties.clone(), authored_name_at(env.source_indices.clone(), &ritem), env.source_indices.clone()); -Some(nominal_type_binding(&root)) -} + Some(Rc::new(DeclaredFuncSig { + name: authored_name_at(env.source_indices.clone(), &ritem), + params: ritem.params.clone(), + inferred: declared_rt, + is_async: ((ritem.uses.clone().len() as i64) > 0), + output_provenance: Rc::new(vec![]), + variant_provenance: v2_rt::rc_empty_map::< + String, + Rc>>>>, + >(), + })) + } } else { None }; -Rc::new(ItemContribution { - resolved_item: ritem.clone(), - resolve_diagnostics: resolved.diagnostics.clone(), - func_sig: func_sig, - svc_entries: svc_entries, - svc_local: svc_local, - item_info: build_item_info(&ritem, &env.source_indices.clone(), module_name.clone()), -}) -} + let svc_entries = + if ((ritem.transport.clone() != None) && ((ritem.children.clone().len() as i64) > 0)) { + Rc::new({ + let mut __result = Vec::new(); + for c in ritem.children.clone().iter().cloned() { + __result.push(service_op_entry(&c, &env.source_indices.clone())); + } + __result + }) + } else { + Rc::new(vec![]) + }; + let svc_local = + if ((ritem.transport.clone() != None) && ((ritem.children.clone().len() as i64) > 0)) { + { + let root = namespace_root_from_properties( + ritem.properties.clone(), + authored_name_at(env.source_indices.clone(), &ritem), + env.source_indices.clone(), + ); + Some(nominal_type_binding(&root)) + } + } else { + None + }; + Rc::new(ItemContribution { + resolved_item: ritem.clone(), + resolve_diagnostics: resolved.diagnostics.clone(), + func_sig: func_sig, + svc_entries: svc_entries, + svc_local: svc_local, + item_info: build_item_info(&ritem, &env.source_indices.clone(), module_name.clone()), + }) + } } -pub fn fold_module_contributions(mut remaining: Rc>>, mut resolved_items: Rc>>, mut func_sigs: Rc>>, mut svc_registry: Rc>>>>, mut svc_locals: Rc>>, mut item_registry: Rc>>, mut diag_chunks: Rc>>>>, mut source_indices: Rc>>) -> Rc { +pub fn fold_module_contributions( + mut remaining: Rc>>, + mut resolved_items: Rc>>, + mut func_sigs: Rc>>, + mut svc_registry: Rc>>>>, + mut svc_locals: Rc>>, + mut item_registry: Rc>>, + mut diag_chunks: Rc>>>>, + mut source_indices: Rc>>, +) -> Rc { loop { match remaining.clone().first().cloned() { - None => { break Rc::new(LocalContributionState { - resolved_items: resolved_items, - func_sigs: func_sigs, - svc_registry: svc_registry, - svc_locals: svc_locals, - item_registry: item_registry, - diag_chunks: diag_chunks, -}); }, - Some(contribution) => { let next_func_sigs = match contribution.func_sig.clone() { - Some(sig) => v2_rt::rc_map_insert(func_sigs, sig.name.clone(), sig.clone()), - None => func_sigs, -}; -let next_svc_registry = if ((contribution.svc_entries.clone().len() as i64) > 0) { - v2_rt::rc_map_insert(svc_registry, authored_name_at(source_indices.clone(), &contribution.resolved_item.clone()), contribution.svc_entries.clone()) - } else { - svc_registry - }; -let next_svc_locals = match contribution.svc_local.clone() { - Some(binding) => v2_rt::rc_map_insert(svc_locals, binding.name.clone(), binding.clone()), - None => svc_locals, -}; -{ - let __tco_0 = Rc::new(remaining.iter().cloned().skip(1 as usize).collect::>()); -let __tco_1 = v2_rt::rc_list_push(resolved_items, contribution.resolved_item.clone()); -let __tco_2 = next_func_sigs; -let __tco_3 = next_svc_registry; -let __tco_4 = next_svc_locals; -let __tco_5 = v2_rt::rc_map_insert(item_registry, contribution.item_info.clone().name.clone(), contribution.item_info.clone()); -let __tco_6 = v2_rt::rc_list_push(diag_chunks, contribution.resolve_diagnostics.clone()); -remaining = __tco_0; -resolved_items = __tco_1; -func_sigs = __tco_2; -svc_registry = __tco_3; -svc_locals = __tco_4; -item_registry = __tco_5; -diag_chunks = __tco_6; -continue; -} }, -} -} -} - -pub fn build_module_context(contributions: Rc>>, parent_index: Rc>>, resolved_imports: &Rc>>, env: &Rc, module_name: &String) -> Rc { + None => { + break Rc::new(LocalContributionState { + resolved_items: resolved_items, + func_sigs: func_sigs, + svc_registry: svc_registry, + svc_locals: svc_locals, + item_registry: item_registry, + diag_chunks: diag_chunks, + }); + } + Some(contribution) => { + let next_func_sigs = match contribution.func_sig.clone() { + Some(sig) => v2_rt::rc_map_insert(func_sigs, sig.name.clone(), sig.clone()), + None => func_sigs, + }; + let next_svc_registry = if ((contribution.svc_entries.clone().len() as i64) > 0) { + v2_rt::rc_map_insert( + svc_registry, + authored_name_at( + source_indices.clone(), + &contribution.resolved_item.clone(), + ), + contribution.svc_entries.clone(), + ) + } else { + svc_registry + }; + let next_svc_locals = match contribution.svc_local.clone() { + Some(binding) => { + v2_rt::rc_map_insert(svc_locals, binding.name.clone(), binding.clone()) + } + None => svc_locals, + }; + { + let __tco_0 = Rc::new( + remaining + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ); + let __tco_1 = + v2_rt::rc_list_push(resolved_items, contribution.resolved_item.clone()); + let __tco_2 = next_func_sigs; + let __tco_3 = next_svc_registry; + let __tco_4 = next_svc_locals; + let __tco_5 = v2_rt::rc_map_insert( + item_registry, + contribution.item_info.clone().name.clone(), + contribution.item_info.clone(), + ); + let __tco_6 = + v2_rt::rc_list_push(diag_chunks, contribution.resolve_diagnostics.clone()); + remaining = __tco_0; + resolved_items = __tco_1; + func_sigs = __tco_2; + svc_registry = __tco_3; + svc_locals = __tco_4; + item_registry = __tco_5; + diag_chunks = __tco_6; + continue; + } + } + } + } +} + +pub fn build_module_context( + contributions: Rc>>, + parent_index: Rc>>, + resolved_imports: &Rc>>, + env: &Rc, + module_name: &String, +) -> Rc { { - let local = fold_module_contributions(contributions, Rc::new(vec![]), v2_rt::rc_empty_map::>(), v2_rt::rc_empty_map::>>>(), v2_rt::rc_empty_map::>(), v2_rt::rc_empty_map::>(), Rc::new(vec![]), env.source_indices.clone()); -let imported_enum_names = resolved_imports.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, imp: Rc| imp.specific_names.clone().iter().cloned().fold(acc, |inner: Rc>, n: String| v2_rt::rc_map_insert(inner, n.clone(), true))); -let variant_fold = Rc::new(v2_rt::map_values(&env.bindings.clone())).iter().cloned().fold(Rc::new(VariantFoldState { + let local = fold_module_contributions( + contributions, + Rc::new(vec![]), + v2_rt::rc_empty_map::>(), + v2_rt::rc_empty_map::>>>(), + v2_rt::rc_empty_map::>(), + v2_rt::rc_empty_map::>(), + Rc::new(vec![]), + env.source_indices.clone(), + ); + let imported_enum_names = resolved_imports.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, imp: Rc| { + imp.specific_names.clone().iter().cloned().fold( + acc, + |inner: Rc>, n: String| { + v2_rt::rc_map_insert(inner, n.clone(), true) + }, + ) + }, + ); + let variant_fold = Rc::new(v2_rt::map_values(&env.bindings.clone())).iter().cloned().fold(Rc::new(VariantFoldState { locals: v2_rt::rc_empty_map::>(), collision_errors: Rc::new(vec![]), }), |acc: Rc, binding: Rc| { @@ -6250,22 +10872,59 @@ if (curr_is_imported.clone() && prev_is_imported.clone()) { acc.clone() } }); -let imported_variant_locals = variant_fold.locals.clone(); -let variant_collision_errors = variant_fold.collision_errors.clone(); -let env_variant_locals = variant_locals_from_items(local.resolved_items.clone(), imported_variant_locals, env.source_indices.clone()); -let merged_scope = merge_scope_from_imports(resolved_imports.clone(), parent_index, env.clone(), v2_rt::rc_empty_map::>(), local.svc_registry.clone(), local.svc_locals.clone()); -let all_declared_sigs = v2_rt::rc_map_merge(merged_scope.func_sigs.clone(), local.func_sigs.clone()); -let resolve_result = resolve_func_sigs(&all_declared_sigs, &local.resolved_items.clone(), module_name.clone(), &env.source_indices.clone()); -let all_locals = Rc::new(v2_rt::map_values(&merged_scope.svc_locals.clone())).iter().cloned().fold(env_variant_locals, |acc: Rc>>, binding: Rc| v2_rt::rc_map_insert(acc, binding.name.clone(), binding.clone())); -Rc::new(ModuleContext { - resolved_items: local.resolved_items.clone(), - func_env: resolve_result.func_env.clone(), - svc_registry: merged_scope.svc_registry.clone(), - locals: all_locals, - item_registry: local.item_registry.clone(), - diagnostics: v2_rt::concat(v2_rt::concat(Rc::new({ let mut __result = Vec::new(); for c in local.diag_chunks.clone().iter().cloned() { __result.extend((*c.clone()).iter().cloned()); } __result }), resolve_result.diagnostics.clone()), variant_collision_errors), -}) -} + let imported_variant_locals = variant_fold.locals.clone(); + let variant_collision_errors = variant_fold.collision_errors.clone(); + let env_variant_locals = variant_locals_from_items( + local.resolved_items.clone(), + imported_variant_locals, + env.source_indices.clone(), + ); + let merged_scope = merge_scope_from_imports( + resolved_imports.clone(), + parent_index, + env.clone(), + v2_rt::rc_empty_map::>(), + local.svc_registry.clone(), + local.svc_locals.clone(), + ); + let all_declared_sigs = + v2_rt::rc_map_merge(merged_scope.func_sigs.clone(), local.func_sigs.clone()); + let resolve_result = resolve_func_sigs( + &all_declared_sigs, + &local.resolved_items.clone(), + module_name.clone(), + &env.source_indices.clone(), + ); + let all_locals = Rc::new(v2_rt::map_values(&merged_scope.svc_locals.clone())) + .iter() + .cloned() + .fold( + env_variant_locals, + |acc: Rc>>, binding: Rc| { + v2_rt::rc_map_insert(acc, binding.name.clone(), binding.clone()) + }, + ); + Rc::new(ModuleContext { + resolved_items: local.resolved_items.clone(), + func_env: resolve_result.func_env.clone(), + svc_registry: merged_scope.svc_registry.clone(), + locals: all_locals, + item_registry: local.item_registry.clone(), + diagnostics: v2_rt::concat( + v2_rt::concat( + Rc::new({ + let mut __result = Vec::new(); + for c in local.diag_chunks.clone().iter().cloned() { + __result.extend((*c.clone()).iter().cloned()); + } + __result + }), + resolve_result.diagnostics.clone(), + ), + variant_collision_errors, + ), + }) + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -6274,90 +10933,174 @@ pub struct TypecheckModuleResult { pub diagnostics: Rc>>, } -pub fn typecheck_module(resolved: &Rc, parent_index: &Rc>>, source_indices: &Rc>>, intern_table: Rc) -> Rc { +pub fn typecheck_module( + resolved: &Rc, + parent_index: &Rc>>, + source_indices: &Rc>>, + intern_table: Rc, +) -> Rc { { let env_result = build_type_env(&resolved, &parent_index, &source_indices, &intern_table); -let env = env_result.env.clone(); -let env_diags = env_result.diagnostics.clone(); -let env_errors = Rc::new({ let mut __result = Vec::new(); for d in env_diags.clone().iter().cloned() { if is_error_diagnostic(d.diagnostic.clone()) { __result.push(d); } } __result }); -let seed_diags = builtin_kernel_seed_diagnostics(); -if ((env_errors.len() as i64) > 0) { + let env = env_result.env.clone(); + let env_diags = env_result.diagnostics.clone(); + let env_errors = Rc::new({ + let mut __result = Vec::new(); + for d in env_diags.clone().iter().cloned() { + if is_error_diagnostic(d.diagnostic.clone()) { + __result.push(d); + } + } + __result + }); + let seed_diags = builtin_kernel_seed_diagnostics(); + if ((env_errors.len() as i64) > 0) { return Rc::new(TypecheckModuleResult { - typed: Rc::new(TypedModule { - module: resolved.module.clone(), - items: Rc::new(vec![]), - type_env: env.clone(), - func_env: Rc::new(ResolvedFuncEnv { - signatures: v2_rt::rc_empty_map::>(), -}), - item_registry: v2_rt::rc_empty_map::>(), -}), - diagnostics: v2_rt::concat(env_diags.clone(), seed_diags.clone()), -}) + typed: Rc::new(TypedModule { + module: resolved.module.clone(), + items: Rc::new(vec![]), + type_env: env.clone(), + func_env: Rc::new(ResolvedFuncEnv { + signatures: v2_rt::rc_empty_map::>(), + }), + item_registry: v2_rt::rc_empty_map::>(), + }), + diagnostics: v2_rt::concat(env_diags.clone(), seed_diags.clone()), + }); } -let resolved_module_name = authored_name_at(source_indices.clone(), &resolved.module.clone()); -let contributions = Rc::new({ let mut __result = Vec::new(); for item in module_items(resolved.module.clone()).iter().cloned() { __result.push(analyze_item(item.clone(), &env, &resolved_module_name)); } __result }); -let ctx = build_module_context(contributions, parent_index.clone(), &resolved.resolved_imports.clone(), &env, &resolved_module_name); -let data_locals = ctx.resolved_items.clone().iter().cloned().fold(ctx.locals.clone(), |acc: Rc>>, item: Rc| if ((((item.body.clone() != None) && ((item.params.clone().len() as i64) == 0)) && (item.inferred.clone() == None)) && (item.type_annotation.clone() != None)) { - v2_rt::rc_map_insert(acc.clone(), authored_name_at(source_indices.clone(), &item), Rc::new(TypeBinding { - name: authored_name_at(source_indices.clone(), &item), - resolved: item.type_annotation.clone().clone().unwrap(), - provenance: Rc::new(SubValueRelation::SubValueUnknown), -})) - } else { - acc.clone() + let resolved_module_name = + authored_name_at(source_indices.clone(), &resolved.module.clone()); + let contributions = Rc::new({ + let mut __result = Vec::new(); + for item in module_items(resolved.module.clone()).iter().cloned() { + __result.push(analyze_item(item.clone(), &env, &resolved_module_name)); + } + __result }); -let infer_scope = Rc::new(InferScope { - type_env: env.clone(), - func_env: ctx.func_env.clone(), - locals: data_locals.clone(), - match_bound_names: v2_rt::rc_empty_map::(), - module_name: resolved_module_name.clone(), - service_registry: ctx.svc_registry.clone(), - item_registry: ctx.item_registry.clone(), - lambda_param_provenance: v2_rt::rc_empty_map::>(), -}); -let typed_item_results = infer_items(ctx.resolved_items.clone(), infer_scope); -let typed_items = Rc::new({ let mut __result = Vec::new(); for tir in typed_item_results.clone().iter().cloned() { __result.push(tir.item.clone()); } __result }); -let infer_diags = Rc::new({ let mut __result = Vec::new(); for tir in typed_item_results.clone().iter().cloned() { __result.extend((*tir.diagnostics.clone()).iter().cloned()); } __result }); -let updated_func_env = populate_output_provenance(typed_items.clone(), ctx.func_env.clone(), env.clone(), data_locals.clone()); -let reannotated_items = Rc::new({ let mut __result = Vec::new(); for item in typed_items.clone().iter().cloned() { __result.push(if (item.is_self_recursive.clone() && (item.body.clone() != None)) { - Rc::new(Node { - name: item.name.clone(), - span: item.span.clone(), - ident_span: item.ident_span.clone(), - children: item.children.clone(), - params: item.params.clone(), - inferred: item.inferred.clone(), - return_cardinality: item.return_cardinality.clone(), - uses: item.uses.clone(), - body: Some(annotate_descent_evidence(item.body.clone().clone().unwrap(), authored_name_at(source_indices.clone(), &item), &item.params.clone(), &env, data_locals.clone(), updated_func_env.signatures.clone())), - connective: item.connective.clone(), - transport: item.transport.clone(), - properties: item.properties.clone(), - type_annotation: item.type_annotation.clone(), - is_self_recursive: item.is_self_recursive.clone(), - has_non_tail_self_call: item.has_non_tail_self_call.clone(), - match_pattern: item.match_pattern.clone(), - expr_data: item.expr_data.clone(), - ident: None, -}) - } else { - item.clone() - }); } __result }); -let typed_base = module_node(&resolved_module_name, module_imports(resolved.module.clone()), ctx.resolved_items.clone(), &resolved.module.clone().span.clone()); -let typed_module = Rc::new(Node { ident_span: resolved.module.clone().ident_span.clone(), ..(*typed_base).clone() }); -Rc::new(TypecheckModuleResult { - typed: Rc::new(TypedModule { - module: typed_module, - items: reannotated_items, - type_env: env.clone(), - func_env: updated_func_env.clone(), - item_registry: ctx.item_registry.clone(), -}), - diagnostics: v2_rt::concat(v2_rt::concat(v2_rt::concat(env_diags.clone(), ctx.diagnostics.clone()), infer_diags), seed_diags.clone()), -}) -} + let ctx = build_module_context( + contributions, + parent_index.clone(), + &resolved.resolved_imports.clone(), + &env, + &resolved_module_name, + ); + let data_locals = ctx.resolved_items.clone().iter().cloned().fold( + ctx.locals.clone(), + |acc: Rc>>, item: Rc| { + if ((((item.body.clone() != None) && ((item.params.clone().len() as i64) == 0)) + && (item.inferred.clone() == None)) + && (item.type_annotation.clone() != None)) + { + v2_rt::rc_map_insert( + acc.clone(), + authored_name_at(source_indices.clone(), &item), + Rc::new(TypeBinding { + name: authored_name_at(source_indices.clone(), &item), + resolved: item.type_annotation.clone().clone().unwrap(), + provenance: Rc::new(SubValueRelation::SubValueUnknown), + }), + ) + } else { + acc.clone() + } + }, + ); + let infer_scope = Rc::new(InferScope { + type_env: env.clone(), + func_env: ctx.func_env.clone(), + locals: data_locals.clone(), + match_bound_names: v2_rt::rc_empty_map::(), + module_name: resolved_module_name.clone(), + service_registry: ctx.svc_registry.clone(), + item_registry: ctx.item_registry.clone(), + lambda_param_provenance: v2_rt::rc_empty_map::>(), + }); + let typed_item_results = infer_items(ctx.resolved_items.clone(), infer_scope); + let typed_items = Rc::new({ + let mut __result = Vec::new(); + for tir in typed_item_results.clone().iter().cloned() { + __result.push(tir.item.clone()); + } + __result + }); + let infer_diags = Rc::new({ + let mut __result = Vec::new(); + for tir in typed_item_results.clone().iter().cloned() { + __result.extend((*tir.diagnostics.clone()).iter().cloned()); + } + __result + }); + let updated_func_env = populate_output_provenance( + typed_items.clone(), + ctx.func_env.clone(), + env.clone(), + data_locals.clone(), + ); + let reannotated_items = Rc::new({ + let mut __result = Vec::new(); + for item in typed_items.clone().iter().cloned() { + __result.push( + if (item.is_self_recursive.clone() && (item.body.clone() != None)) { + Rc::new(Node { + name: item.name.clone(), + span: item.span.clone(), + ident_span: item.ident_span.clone(), + children: item.children.clone(), + params: item.params.clone(), + inferred: item.inferred.clone(), + return_cardinality: item.return_cardinality.clone(), + uses: item.uses.clone(), + body: Some(annotate_descent_evidence( + item.body.clone().clone().unwrap(), + authored_name_at(source_indices.clone(), &item), + &item.params.clone(), + &env, + data_locals.clone(), + updated_func_env.signatures.clone(), + )), + connective: item.connective.clone(), + transport: item.transport.clone(), + properties: item.properties.clone(), + type_annotation: item.type_annotation.clone(), + is_self_recursive: item.is_self_recursive.clone(), + has_non_tail_self_call: item.has_non_tail_self_call.clone(), + match_pattern: item.match_pattern.clone(), + expr_data: item.expr_data.clone(), + ident: None, + }) + } else { + item.clone() + }, + ); + } + __result + }); + let typed_base = module_node( + &resolved_module_name, + module_imports(resolved.module.clone()), + ctx.resolved_items.clone(), + &resolved.module.clone().span.clone(), + ); + let typed_module = Rc::new(Node { + ident_span: resolved.module.clone().ident_span.clone(), + ..(*typed_base).clone() + }); + Rc::new(TypecheckModuleResult { + typed: Rc::new(TypedModule { + module: typed_module, + items: reannotated_items, + type_env: env.clone(), + func_env: updated_func_env.clone(), + item_registry: ctx.item_registry.clone(), + }), + diagnostics: v2_rt::concat( + v2_rt::concat( + v2_rt::concat(env_diags.clone(), ctx.diagnostics.clone()), + infer_diags, + ), + seed_diags.clone(), + ), + }) + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -6378,227 +11121,494 @@ pub struct BindingsAccum { pub diagnostics: Rc>>, } -pub fn resolve_env_bindings(env: &Rc, module_name: String, local_names: &Rc>, deps_map: Rc>>>) -> Rc { +pub fn resolve_env_bindings( + env: &Rc, + module_name: String, + local_names: &Rc>, + deps_map: Rc>>>, +) -> Rc { { - let remaining = Rc::new({ let mut __result = Vec::new(); for b in Rc::new({ let mut __result = Vec::new(); for b in Rc::new(v2_rt::map_values(&env.bindings.clone())).iter().cloned() { if v2_rt::map_contains_key(&local_names, intern(&env.intern_table.clone(), &b.name.clone()).id.clone()) { __result.push(b); } } __result }).iter().cloned() { __result.push(b.name.clone()); } __result }); -topo_resolve_types(remaining.clone(), env.clone(), module_name, Rc::new(vec![]), local_names.clone(), deps_map, (remaining.clone().len() as i64)) -} + let remaining = Rc::new({ + let mut __result = Vec::new(); + for b in Rc::new({ + let mut __result = Vec::new(); + for b in Rc::new(v2_rt::map_values(&env.bindings.clone())) + .iter() + .cloned() + { + if v2_rt::map_contains_key( + &local_names, + intern(&env.intern_table.clone(), &b.name.clone()) + .id + .clone(), + ) { + __result.push(b); + } + } + __result + }) + .iter() + .cloned() + { + __result.push(b.name.clone()); + } + __result + }); + topo_resolve_types( + remaining.clone(), + env.clone(), + module_name, + Rc::new(vec![]), + local_names.clone(), + deps_map, + (remaining.clone().len() as i64), + ) + } } -pub fn topo_resolve_types(mut remaining: Rc>, mut env: Rc, mut module_name: String, mut diagnostics: Rc>>, mut local_names: Rc>, mut deps_map: Rc>>>, mut fuel: i64) -> Rc { +pub fn topo_resolve_types( + mut remaining: Rc>, + mut env: Rc, + mut module_name: String, + mut diagnostics: Rc>>, + mut local_names: Rc>, + mut deps_map: Rc>>>, + mut fuel: i64, +) -> Rc { loop { if ((remaining.clone().len() as i64) == 0) { return Rc::new(EnvResolveResult { - env: env.clone(), - diagnostics: diagnostics.clone(), -}) + env: env.clone(), + diagnostics: diagnostics.clone(), + }); } -let remaining_set = remaining.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, name: String| v2_rt::rc_map_insert(acc, name.clone(), true)); -let ready = Rc::new({ let mut __result = Vec::new(); for name in remaining.clone().iter().cloned() { if match v2_rt::map_get(&deps_map, name.clone()) { - Some(deps) => { let mut __all = true; for dep in deps.clone().iter().cloned() { if !(((((is_kernel_type(dep.clone()) || (dep.clone().as_str() == "None".to_string().as_str())) || (dep.clone().as_str() == "".to_string().as_str())) || is_recursive_type_by_name(&env, dep.clone())) || (emit_map_has(remaining_set.clone(), dep.clone()) == false))) { __all = false; break; } } __all }, - None => true, -} { __result.push(name); } } __result }); -if ((ready.clone().len() as i64) == 0) { + let remaining_set = remaining.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, name: String| { + v2_rt::rc_map_insert(acc, name.clone(), true) + }, + ); + let ready = Rc::new({ + let mut __result = Vec::new(); + for name in remaining.clone().iter().cloned() { + if match v2_rt::map_get(&deps_map, name.clone()) { + Some(deps) => { + let mut __all = true; + for dep in deps.clone().iter().cloned() { + if !((((is_kernel_type(dep.clone()) + || (dep.clone().as_str() == "None".to_string().as_str())) + || (dep.clone().as_str() == "".to_string().as_str())) + || is_recursive_type_by_name(&env, dep.clone())) + || (emit_map_has(remaining_set.clone(), dep.clone()) == false)) + { + __all = false; + break; + } + } + __all + } + None => true, + } { + __result.push(name); + } + } + __result + }); + if ((ready.clone().len() as i64) == 0) { { - let stuck_accum = remaining.clone().iter().cloned().fold(Rc::new(BindingsAccum { - bindings: env.bindings.clone(), - diagnostics: Rc::new(vec![]), -}), |acc: Rc, name: String| { - let ident = intern(&env.intern_table.clone(), &name).id.clone(); -match v2_rt::map_get(&env.bindings.clone(), ident.clone()) { - Some(binding) => { - let result = resolve_node(binding.resolved.clone(), env.clone(), module_name.clone()); -Rc::new(BindingsAccum { - bindings: v2_rt::rc_map_insert(acc.bindings.clone(), ident.clone(), Rc::new(TypeBinding { - name: name.clone(), - resolved: result.resolved.clone(), - provenance: Rc::new(SubValueRelation::SubValueUnknown), -})), - diagnostics: v2_rt::concat(acc.diagnostics.clone(), result.diagnostics.clone()), -}) -}, - None => acc.clone(), -} -}); -return Rc::new(EnvResolveResult { - env: Rc::new(TypeEnv { - bindings: stuck_accum.bindings.clone(), - recursive_types: env.recursive_types.clone(), - recursive_type_set: env.recursive_type_set.clone(), - inductive_fields: env.inductive_fields.clone(), - source_indices: env.source_indices.clone(), - intern_table: env.intern_table.clone(), -}), - diagnostics: v2_rt::concat(diagnostics.clone(), stuck_accum.diagnostics.clone()), -}) -} + let stuck_accum = remaining.clone().iter().cloned().fold( + Rc::new(BindingsAccum { + bindings: env.bindings.clone(), + diagnostics: Rc::new(vec![]), + }), + |acc: Rc, name: String| { + let ident = intern(&env.intern_table.clone(), &name).id.clone(); + match v2_rt::map_get(&env.bindings.clone(), ident.clone()) { + Some(binding) => { + let result = resolve_node( + binding.resolved.clone(), + env.clone(), + module_name.clone(), + ); + Rc::new(BindingsAccum { + bindings: v2_rt::rc_map_insert( + acc.bindings.clone(), + ident.clone(), + Rc::new(TypeBinding { + name: name.clone(), + resolved: result.resolved.clone(), + provenance: Rc::new(SubValueRelation::SubValueUnknown), + }), + ), + diagnostics: v2_rt::concat( + acc.diagnostics.clone(), + result.diagnostics.clone(), + ), + }) + } + None => acc.clone(), + } + }, + ); + return Rc::new(EnvResolveResult { + env: Rc::new(TypeEnv { + bindings: stuck_accum.bindings.clone(), + recursive_types: env.recursive_types.clone(), + recursive_type_set: env.recursive_type_set.clone(), + inductive_fields: env.inductive_fields.clone(), + source_indices: env.source_indices.clone(), + intern_table: env.intern_table.clone(), + }), + diagnostics: v2_rt::concat( + diagnostics.clone(), + stuck_accum.diagnostics.clone(), + ), + }); + } } -let ready_accum = ready.clone().iter().cloned().fold(Rc::new(BindingsAccum { - bindings: env.bindings.clone(), - diagnostics: Rc::new(vec![]), -}), |acc: Rc, name: String| { - let ident = intern(&env.intern_table.clone(), &name).id.clone(); -match v2_rt::map_get(&env.bindings.clone(), ident.clone()) { - Some(binding) => { - let result = resolve_node(binding.resolved.clone(), env.clone(), module_name.clone()); -Rc::new(BindingsAccum { - bindings: v2_rt::rc_map_insert(acc.bindings.clone(), ident.clone(), Rc::new(TypeBinding { - name: name.clone(), - resolved: result.resolved.clone(), - provenance: Rc::new(SubValueRelation::SubValueUnknown), -})), - diagnostics: v2_rt::concat(acc.diagnostics.clone(), result.diagnostics.clone()), -}) -}, - None => acc.clone(), -} -}); -let ready_set = ready.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, name: String| v2_rt::rc_map_insert(acc, name.clone(), true)); -let next_remaining = Rc::new({ let mut __result = Vec::new(); for name in remaining.clone().iter().cloned() { if (emit_map_has(ready_set.clone(), name.clone()) == false) { __result.push(name); } } __result }); -{ + let ready_accum = ready.clone().iter().cloned().fold( + Rc::new(BindingsAccum { + bindings: env.bindings.clone(), + diagnostics: Rc::new(vec![]), + }), + |acc: Rc, name: String| { + let ident = intern(&env.intern_table.clone(), &name).id.clone(); + match v2_rt::map_get(&env.bindings.clone(), ident.clone()) { + Some(binding) => { + let result = resolve_node( + binding.resolved.clone(), + env.clone(), + module_name.clone(), + ); + Rc::new(BindingsAccum { + bindings: v2_rt::rc_map_insert( + acc.bindings.clone(), + ident.clone(), + Rc::new(TypeBinding { + name: name.clone(), + resolved: result.resolved.clone(), + provenance: Rc::new(SubValueRelation::SubValueUnknown), + }), + ), + diagnostics: v2_rt::concat( + acc.diagnostics.clone(), + result.diagnostics.clone(), + ), + }) + } + None => acc.clone(), + } + }, + ); + let ready_set = ready.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, name: String| { + v2_rt::rc_map_insert(acc, name.clone(), true) + }, + ); + let next_remaining = Rc::new({ + let mut __result = Vec::new(); + for name in remaining.clone().iter().cloned() { + if (emit_map_has(ready_set.clone(), name.clone()) == false) { + __result.push(name); + } + } + __result + }); + { let __tco_0 = next_remaining; -let __tco_1 = Rc::new(TypeEnv { - bindings: ready_accum.bindings.clone(), - recursive_types: env.recursive_types.clone(), - recursive_type_set: env.recursive_type_set.clone(), - inductive_fields: env.inductive_fields.clone(), - source_indices: env.source_indices.clone(), - intern_table: env.intern_table.clone(), -}); -let __tco_2 = v2_rt::concat(diagnostics, ready_accum.diagnostics.clone()); -let __tco_3 = (fuel - 1); -remaining = __tco_0; -env = __tco_1; -diagnostics = __tco_2; -fuel = __tco_3; -continue; -} -} + let __tco_1 = Rc::new(TypeEnv { + bindings: ready_accum.bindings.clone(), + recursive_types: env.recursive_types.clone(), + recursive_type_set: env.recursive_type_set.clone(), + inductive_fields: env.inductive_fields.clone(), + source_indices: env.source_indices.clone(), + intern_table: env.intern_table.clone(), + }); + let __tco_2 = v2_rt::concat(diagnostics, ready_accum.diagnostics.clone()); + let __tco_3 = (fuel - 1); + remaining = __tco_0; + env = __tco_1; + diagnostics = __tco_2; + fuel = __tco_3; + continue; + } + } } -pub fn collect_parent_envs(resolved: &Rc, module_index: Rc>>, source_indices: Rc>>) -> Rc { +pub fn collect_parent_envs( + resolved: &Rc, + module_index: Rc>>, + source_indices: Rc>>, +) -> Rc { { - let modules = Rc::new({ let mut __result = Vec::new(); for imp in resolved.resolved_imports.clone().iter().cloned() { __result.extend((*match v2_rt::map_get(&module_index, imp.module_path.clone()) { - Some(typed) => Rc::new(vec![typed.clone()]), - None => Rc::new(vec![]), -}).iter().cloned()); } __result }); -let resolved_mod_name = authored_name_at(source_indices, &resolved.module.clone()); -let diagnostics = Rc::new({ let mut __result = Vec::new(); for imp in resolved.resolved_imports.clone().iter().cloned() { __result.extend((*match v2_rt::map_get(&module_index, imp.module_path.clone()) { - Some(_) => Rc::new(vec![]), - None => Rc::new(vec![make_error_node(Rc::new(CompilerDiagnostic::InternalError { - message: v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("missing parent environment for imported module '".to_string(), imp.module_path.clone()), "' while ordering '".to_string()), resolved_mod_name.clone()), "'".to_string()), - span: imp.target_module.clone().clone().unwrap().span.clone(), -}), resolved_mod_name.clone())]), -}).iter().cloned()); } __result }); -Rc::new(ParentModulesResult { - modules: modules, - diagnostics: diagnostics, -}) -} + let modules = Rc::new({ + let mut __result = Vec::new(); + for imp in resolved.resolved_imports.clone().iter().cloned() { + __result.extend( + (*match v2_rt::map_get(&module_index, imp.module_path.clone()) { + Some(typed) => Rc::new(vec![typed.clone()]), + None => Rc::new(vec![]), + }) + .iter() + .cloned(), + ); + } + __result + }); + let resolved_mod_name = authored_name_at(source_indices, &resolved.module.clone()); + let diagnostics = Rc::new({ + let mut __result = Vec::new(); + for imp in resolved.resolved_imports.clone().iter().cloned() { + __result.extend( + (*match v2_rt::map_get(&module_index, imp.module_path.clone()) { + Some(_) => Rc::new(vec![]), + None => Rc::new(vec![make_error_node( + Rc::new(CompilerDiagnostic::InternalError { + message: v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "missing parent environment for imported module '" + .to_string(), + imp.module_path.clone(), + ), + "' while ordering '".to_string(), + ), + resolved_mod_name.clone(), + ), + "'".to_string(), + ), + span: imp.target_module.clone().clone().unwrap().span.clone(), + }), + resolved_mod_name.clone(), + )]), + }) + .iter() + .cloned(), + ); + } + __result + }); + Rc::new(ParentModulesResult { + modules: modules, + diagnostics: diagnostics, + }) + } } -pub fn build_fielded_variants(modules: Rc>>, type_summaries: Rc>>) -> Rc> { +pub fn build_fielded_variants( + modules: Rc>>, + type_summaries: Rc>>, +) -> Rc> { { - let result = modules.iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, m: Rc| { - let items = m.items.clone(); -let si = m.type_env.clone().source_indices.clone(); -items.clone().iter().cloned().fold(acc, |inner: Rc>, item: Rc| { - let is_enum = match v2_rt::map_get(&type_summaries, authored_name_at(si.clone(), &item)) { - Some(summary) => match (*summary.repr.clone()).clone() { - TypeRepr::EnumRepr { .. } => true, - _ => false, -}, - None => false, -}; -if is_enum.clone() { - { - let enum_name = authored_name_at(si.clone(), &item); -let variants = item.children.clone(); -variants.clone().iter().cloned().fold(inner.clone(), |vacc: Rc>, variant: Rc| { - let has_fields = ((variant.children.clone().len() as i64) > 0); -if has_fields.clone() { - v2_rt::rc_map_insert(vacc.clone(), v2_rt::concat(v2_rt::concat(enum_name.clone(), "::".to_string()), authored_name_at(si.clone(), &variant)), true) - } else { - vacc.clone() + let result = modules.iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, m: Rc| { + let items = m.items.clone(); + let si = m.type_env.clone().source_indices.clone(); + items.clone().iter().cloned().fold( + acc, + |inner: Rc>, item: Rc| { + let is_enum = match v2_rt::map_get( + &type_summaries, + authored_name_at(si.clone(), &item), + ) { + Some(summary) => match (*summary.repr.clone()).clone() { + TypeRepr::EnumRepr { .. } => true, + _ => false, + }, + None => false, + }; + if is_enum.clone() { + { + let enum_name = authored_name_at(si.clone(), &item); + let variants = item.children.clone(); + variants.clone().iter().cloned().fold( + inner.clone(), + |vacc: Rc>, variant: Rc| { + let has_fields = + ((variant.children.clone().len() as i64) > 0); + if has_fields.clone() { + v2_rt::rc_map_insert( + vacc.clone(), + v2_rt::concat( + v2_rt::concat( + enum_name.clone(), + "::".to_string(), + ), + authored_name_at(si.clone(), &variant), + ), + true, + ) + } else { + vacc.clone() + } + }, + ) } -}) -} - } else { - inner.clone() - } -}) -}); -result -} + } else { + inner.clone() + } + }, + ) + }, + ); + result + } } pub fn build_emit_graph_info(modules: &Rc>>) -> Rc { { let init = Rc::new(EmitInfoBuildState { - type_summaries: v2_rt::rc_empty_map::>(), -}); -let built = modules.clone().iter().cloned().fold(init.clone(), |state: Rc, typed_module: Rc| typed_module.items.clone().iter().cloned().fold(state, |inner_state: Rc, item: Rc| add_emit_item_summary(inner_state, &item, &typed_module.type_env.clone().source_indices.clone()))); -let all_recursive = modules.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, m: Rc| Rc::new(v2_rt::map_keys(&m.type_env.clone().recursive_type_set.clone())).iter().cloned().fold(acc, |inner: Rc>, ident: i64| v2_rt::rc_map_insert(inner, intern_str(m.type_env.clone().intern_table.clone(), ident.clone()), true))); -let fielded = build_fielded_variants(modules.clone(), built.type_summaries.clone()); -let vtoe = derive_variant_to_enum(built.type_summaries.clone()); -Rc::new(EmitGraphInfo { - type_summaries: built.type_summaries.clone(), - recursive_type_set: all_recursive, - fielded_variants: fielded, - shared_types: v2_rt::rc_empty_map::(), - ownership_index: v2_rt::rc_empty_map::>>(), - movable: v2_rt::rc_empty_map::(), - variant_to_enum: vtoe, - owned_bindings: v2_rt::rc_empty_map::(), - read_only_params_index: v2_rt::rc_empty_map::>>(), - read_only_params: v2_rt::rc_empty_map::(), -}) -} -} - -pub fn typecheck(graph: Rc, source_indices: Rc>>, intern_table: Rc) -> Rc { - typecheck_modules(graph.modules.clone(), Rc::new(vec![]), v2_rt::rc_empty_map::>(), v2_rt::rc_empty_map::>(), Rc::new(vec![]), source_indices, intern_table) + type_summaries: v2_rt::rc_empty_map::>(), + }); + let built = modules.clone().iter().cloned().fold( + init.clone(), + |state: Rc, typed_module: Rc| { + typed_module.items.clone().iter().cloned().fold( + state, + |inner_state: Rc, item: Rc| { + add_emit_item_summary( + inner_state, + &item, + &typed_module.type_env.clone().source_indices.clone(), + ) + }, + ) + }, + ); + let all_recursive = modules.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, m: Rc| { + Rc::new(v2_rt::map_keys( + &m.type_env.clone().recursive_type_set.clone(), + )) + .iter() + .cloned() + .fold(acc, |inner: Rc>, ident: i64| { + v2_rt::rc_map_insert( + inner, + intern_str(m.type_env.clone().intern_table.clone(), ident.clone()), + true, + ) + }) + }, + ); + let fielded = build_fielded_variants(modules.clone(), built.type_summaries.clone()); + let vtoe = derive_variant_to_enum(built.type_summaries.clone()); + Rc::new(EmitGraphInfo { + type_summaries: built.type_summaries.clone(), + recursive_type_set: all_recursive, + fielded_variants: fielded, + shared_types: v2_rt::rc_empty_map::(), + ownership_index: v2_rt::rc_empty_map::>>(), + movable: v2_rt::rc_empty_map::(), + variant_to_enum: vtoe, + owned_bindings: v2_rt::rc_empty_map::(), + read_only_params_index: v2_rt::rc_empty_map::>>(), + read_only_params: v2_rt::rc_empty_map::(), + }) + } } -pub fn typecheck_modules(mut remaining: Rc>>, mut modules: Rc>>, mut module_index: Rc>>, mut item_registry: Rc>>, mut diag_chunks: Rc>>>>, mut source_indices: Rc>>, mut intern_table: Rc) -> Rc { +pub fn typecheck( + graph: Rc, + source_indices: Rc>>, + intern_table: Rc, +) -> Rc { + typecheck_modules( + graph.modules.clone(), + Rc::new(vec![]), + v2_rt::rc_empty_map::>(), + v2_rt::rc_empty_map::>(), + Rc::new(vec![]), + source_indices, + intern_table, + ) +} + +pub fn typecheck_modules( + mut remaining: Rc>>, + mut modules: Rc>>, + mut module_index: Rc>>, + mut item_registry: Rc>>, + mut diag_chunks: Rc>>>>, + mut source_indices: Rc>>, + mut intern_table: Rc, +) -> Rc { loop { match remaining.clone().first().cloned() { - None => { let expanded_registry = expand_transitive_services(modules.clone(), item_registry, 5); -break Rc::new(TypedGraph { - modules: modules.clone(), - item_registry: expanded_registry, - diagnostics: Rc::new({ let mut __result = Vec::new(); for c in diag_chunks.iter().cloned() { __result.extend((*c.clone()).iter().cloned()); } __result }), -}); }, - Some(resolved) => { let parent_result = collect_parent_envs(&resolved, module_index.clone(), source_indices.clone()); -let tc_result = typecheck_module(&resolved, &module_index, &source_indices, intern_table.clone()); -let typed = tc_result.typed.clone(); -let tc_diags = tc_result.diagnostics.clone(); -{ - let __tco_0 = Rc::new(remaining.iter().cloned().skip(1 as usize).collect::>()); -let __tco_1 = v2_rt::rc_list_push(modules, typed.clone()); -let __tco_2 = v2_rt::rc_map_insert(module_index, authored_name_at(source_indices.clone(), &typed.module.clone()), typed.clone()); -let __tco_3 = v2_rt::rc_map_merge(item_registry, typed.item_registry.clone()); -let __tco_4 = v2_rt::rc_list_push(v2_rt::rc_list_push(diag_chunks, parent_result.diagnostics.clone()), tc_diags); -remaining = __tco_0; -modules = __tco_1; -module_index = __tco_2; -item_registry = __tco_3; -diag_chunks = __tco_4; -continue; -} }, -} -} -} - -pub fn reconcile(graph: Rc, source_indices: Rc>>, intern_table: Rc) -> Rc { + None => { + let expanded_registry = + expand_transitive_services(modules.clone(), item_registry, 5); + break Rc::new(TypedGraph { + modules: modules.clone(), + item_registry: expanded_registry, + diagnostics: Rc::new({ + let mut __result = Vec::new(); + for c in diag_chunks.iter().cloned() { + __result.extend((*c.clone()).iter().cloned()); + } + __result + }), + }); + } + Some(resolved) => { + let parent_result = + collect_parent_envs(&resolved, module_index.clone(), source_indices.clone()); + let tc_result = typecheck_module( + &resolved, + &module_index, + &source_indices, + intern_table.clone(), + ); + let typed = tc_result.typed.clone(); + let tc_diags = tc_result.diagnostics.clone(); + { + let __tco_0 = Rc::new( + remaining + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ); + let __tco_1 = v2_rt::rc_list_push(modules, typed.clone()); + let __tco_2 = v2_rt::rc_map_insert( + module_index, + authored_name_at(source_indices.clone(), &typed.module.clone()), + typed.clone(), + ); + let __tco_3 = v2_rt::rc_map_merge(item_registry, typed.item_registry.clone()); + let __tco_4 = v2_rt::rc_list_push( + v2_rt::rc_list_push(diag_chunks, parent_result.diagnostics.clone()), + tc_diags, + ); + remaining = __tco_0; + modules = __tco_1; + module_index = __tco_2; + item_registry = __tco_3; + diag_chunks = __tco_4; + continue; + } + } + } + } +} + +pub fn reconcile( + graph: Rc, + source_indices: Rc>>, + intern_table: Rc, +) -> Rc { { let typed = typecheck(graph, source_indices, intern_table); -let emit_info = build_emit_graph_info(&typed.modules.clone()); -Rc::new(ResolvedGraph { - modules: typed.modules.clone(), - item_registry: typed.item_registry.clone(), - diagnostics: typed.diagnostics.clone(), - emit_graph_info: emit_info, -}) -} + let emit_info = build_emit_graph_info(&typed.modules.clone()); + Rc::new(ResolvedGraph { + modules: typed.modules.clone(), + item_registry: typed.item_registry.clone(), + diagnostics: typed.diagnostics.clone(), + emit_graph_info: emit_info, + }) + } } diff --git a/src/v2/stage0/src/v2_compiler_infer_access.rs b/src/v2/stage0/src/v2_compiler_infer_access.rs index 88ef0d55a1d..5351728cdb0 100644 --- a/src/v2/stage0/src/v2_compiler_infer_access.rs +++ b/src/v2/stage0/src/v2_compiler_infer_access.rs @@ -1,16 +1,22 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.infer_access -use std::collections::HashMap; -use std::rc::Rc; +pub use crate::std_types::{is_ordered_element_collection, SourceSpan}; +pub use crate::v2_compiler_infer_types::{ + for_each_element_type_node, node_is_element_collection, node_is_keyed_collection, + node_type_equals, normalize_access_type_node, resolved_type, +}; use crate::v2_rt; -use crate::NonEmptyVec; +use crate::v2_std_core::CompilerDiagnostic::InternalError; +use crate::v2_std_core::InferredNode::{CompilerError, Resolved}; +pub use crate::v2_std_core::{ + authored_name_at, diagnostic_to_message, int_type, make_error_node, string_type, unit_type, + with_optional_cardinality, CompilerDiagnostic, ErrorNode, InferredNode, NewlineIndex, Node, +}; use crate::NonEmptyBTreeSet; -pub use crate::std_types::{SourceSpan, is_ordered_element_collection}; -pub use crate::v2_std_core::{Node, NewlineIndex, authored_name_at, InferredNode, ErrorNode, make_error_node, diagnostic_to_message, with_optional_cardinality, unit_type, string_type, int_type, CompilerDiagnostic}; -use crate::v2_std_core::InferredNode::{Resolved, CompilerError}; -use crate::v2_std_core::CompilerDiagnostic::{InternalError}; -pub use crate::v2_compiler_infer_types::{resolved_type, normalize_access_type_node, node_type_equals, node_is_keyed_collection, node_is_element_collection, for_each_element_type_node}; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] pub struct AccessCheckResultNode { @@ -25,124 +31,210 @@ pub struct KeyedCollectionParts { } pub fn access_error(message: String, span: Rc, module_name: String) -> Rc { - make_error_node(Rc::new(CompilerDiagnostic::InternalError { - message: message, - span: span, -}), module_name) + make_error_node( + Rc::new(CompilerDiagnostic::InternalError { + message: message, + span: span, + }), + module_name, + ) } -pub fn access_result(inferred: Rc, diagnostics: &Rc>>, span: Rc, fallback_message: String) -> Rc { +pub fn access_result( + inferred: Rc, + diagnostics: &Rc>>, + span: Rc, + fallback_message: String, +) -> Rc { if ((diagnostics.clone().len() as i64) == 0) { Rc::new(AccessCheckResultNode { - inferred: Some(Rc::new(InferredNode::Resolved { - node: inferred, -})), - diagnostics: diagnostics.clone(), -}) + inferred: Some(Rc::new(InferredNode::Resolved { node: inferred })), + diagnostics: diagnostics.clone(), + }) } else { { let message = match diagnostics.clone().first().cloned() { - Some(diag) => diagnostic_to_message(diag.diagnostic.clone()), - None => fallback_message, -}; -Rc::new(AccessCheckResultNode { - inferred: Some(Rc::new(InferredNode::CompilerError { - message: message, - span: span, -})), - diagnostics: diagnostics.clone(), -}) -} + Some(diag) => diagnostic_to_message(diag.diagnostic.clone()), + None => fallback_message, + }; + Rc::new(AccessCheckResultNode { + inferred: Some(Rc::new(InferredNode::CompilerError { + message: message, + span: span, + })), + diagnostics: diagnostics.clone(), + }) + } } } -pub fn keyed_collection_parts(n: &Rc, source_indices: Rc>>) -> Option> { +pub fn keyed_collection_parts( + n: &Rc, + source_indices: Rc>>, +) -> Option> { if (node_is_keyed_collection(&n, source_indices) && ((n.children.clone().len() as i64) >= 2)) { match n.children.clone().first().cloned() { - Some(key_child) => match n.children.clone().get(1 as usize).cloned() { - Some(value_child) => Some(Rc::new(KeyedCollectionParts { - key_type: resolved_type(key_child.clone()), - value_type: resolved_type(value_child.clone()), -})), - None => None, -}, - None => None, -} + Some(key_child) => match n.children.clone().get(1 as usize).cloned() { + Some(value_child) => Some(Rc::new(KeyedCollectionParts { + key_type: resolved_type(key_child.clone()), + value_type: resolved_type(value_child.clone()), + })), + None => None, + }, + None => None, + } } else { None } } -pub fn check_index_access_node(base_type: Rc, index_type: Rc, span: &Rc, module_name: String, source_indices: &Rc>>) -> Rc { +pub fn check_index_access_node( + base_type: Rc, + index_type: Rc, + span: &Rc, + module_name: String, + source_indices: &Rc>>, +) -> Rc { { let normed = normalize_access_type_node(base_type); -let normed_index = normalize_access_type_node(index_type); -let base_is_string = node_type_equals(&normed, &string_type(), source_indices.clone()); -let index_is_int = node_type_equals(&normed_index, &int_type(), source_indices.clone()); -if base_is_string { + let normed_index = normalize_access_type_node(index_type); + let base_is_string = node_type_equals(&normed, &string_type(), source_indices.clone()); + let index_is_int = node_type_equals(&normed_index, &int_type(), source_indices.clone()); + if base_is_string { { let diags = if index_is_int { Rc::new(vec![]) } else { - Rc::new(vec![access_error("string index requires an Int index".to_string(), span.clone(), module_name)]) + Rc::new(vec![access_error( + "string index requires an Int index".to_string(), + span.clone(), + module_name, + )]) }; -access_result(string_type(), &diags, span.clone(), "invalid string index access".to_string()) -} + access_result( + string_type(), + &diags, + span.clone(), + "invalid string index access".to_string(), + ) + } } else { match keyed_collection_parts(&normed, source_indices.clone()) { - Some(parts) => { - let key_diags = if node_type_equals(&parts.key_type.clone(), &normed_index, source_indices.clone()) { - Rc::new(vec![]) - } else { - Rc::new(vec![access_error("keyed collection index key type does not match the collection key type".to_string(), span.clone(), module_name)]) - }; -access_result(with_optional_cardinality(&parts.value_type.clone()), &key_diags, span.clone(), "invalid keyed collection index access".to_string()) -}, - None => if node_is_keyed_collection(&normed, source_indices.clone()) { - { - let malformed_diags = Rc::new(vec![access_error("malformed keyed collection type in index access".to_string(), span.clone(), module_name)]); -access_result(unit_type(), &malformed_diags, span.clone(), "malformed keyed collection type in index access".to_string()) -} - } else { - if ((is_ordered_element_collection(authored_name_at(source_indices.clone(), &normed)) && node_is_element_collection(&normed, source_indices.clone())) && index_is_int) { - { - let elem = for_each_element_type_node(normed.clone(), source_indices.clone()); -access_result(with_optional_cardinality(&elem), &Rc::new(vec![]), span.clone(), "list index access".to_string()) -} - } else { - { - let diags = Rc::new(vec![access_error("indexing is only supported for String, keyed collection, and list values".to_string(), span.clone(), module_name)]); -access_result(unit_type(), &diags, span.clone(), "invalid index access".to_string()) -} + Some(parts) => { + let key_diags = if node_type_equals( + &parts.key_type.clone(), + &normed_index, + source_indices.clone(), + ) { + Rc::new(vec![]) + } else { + Rc::new(vec![access_error("keyed collection index key type does not match the collection key type".to_string(), span.clone(), module_name)]) + }; + access_result( + with_optional_cardinality(&parts.value_type.clone()), + &key_diags, + span.clone(), + "invalid keyed collection index access".to_string(), + ) } - }, -} + None => { + if node_is_keyed_collection(&normed, source_indices.clone()) { + { + let malformed_diags = Rc::new(vec![access_error( + "malformed keyed collection type in index access".to_string(), + span.clone(), + module_name, + )]); + access_result( + unit_type(), + &malformed_diags, + span.clone(), + "malformed keyed collection type in index access".to_string(), + ) + } + } else { + if ((is_ordered_element_collection(authored_name_at( + source_indices.clone(), + &normed, + )) && node_is_element_collection(&normed, source_indices.clone())) + && index_is_int) + { + { + let elem = for_each_element_type_node( + normed.clone(), + source_indices.clone(), + ); + access_result( + with_optional_cardinality(&elem), + &Rc::new(vec![]), + span.clone(), + "list index access".to_string(), + ) + } + } else { + { + let diags = Rc::new(vec![access_error("indexing is only supported for String, keyed collection, and list values".to_string(), span.clone(), module_name)]); + access_result( + unit_type(), + &diags, + span.clone(), + "invalid index access".to_string(), + ) + } + } + } + } + } } -} + } } -pub fn check_slice_access_node(base_type: Rc, start_type: Rc, end_type: Rc, span: &Rc, module_name: &String, source_indices: &Rc>>) -> Rc { +pub fn check_slice_access_node( + base_type: Rc, + start_type: Rc, + end_type: Rc, + span: &Rc, + module_name: &String, + source_indices: &Rc>>, +) -> Rc { { let normed_base = normalize_access_type_node(base_type); -let base_is_string = node_type_equals(&normed_base, &string_type(), source_indices.clone()); -let base_diags = if base_is_string { + let base_is_string = node_type_equals(&normed_base, &string_type(), source_indices.clone()); + let base_diags = if base_is_string { Rc::new(vec![]) } else { - Rc::new(vec![access_error("slice is only supported for String values".to_string(), span.clone(), module_name.clone())]) + Rc::new(vec![access_error( + "slice is only supported for String values".to_string(), + span.clone(), + module_name.clone(), + )]) }; -let normed_start = normalize_access_type_node(start_type); -let start_diags = if node_type_equals(&normed_start, &int_type(), source_indices.clone()) { + let normed_start = normalize_access_type_node(start_type); + let start_diags = if node_type_equals(&normed_start, &int_type(), source_indices.clone()) { Rc::new(vec![]) } else { - Rc::new(vec![access_error("slice start requires an Int index".to_string(), span.clone(), module_name.clone())]) + Rc::new(vec![access_error( + "slice start requires an Int index".to_string(), + span.clone(), + module_name.clone(), + )]) }; -let normed_end = normalize_access_type_node(end_type); -let end_diags = if node_type_equals(&normed_end, &int_type(), source_indices.clone()) { + let normed_end = normalize_access_type_node(end_type); + let end_diags = if node_type_equals(&normed_end, &int_type(), source_indices.clone()) { Rc::new(vec![]) } else { - Rc::new(vec![access_error("slice end requires an Int index".to_string(), span.clone(), module_name.clone())]) + Rc::new(vec![access_error( + "slice end requires an Int index".to_string(), + span.clone(), + module_name.clone(), + )]) }; -let all_diags = v2_rt::concat(v2_rt::concat(base_diags, start_diags), end_diags); -access_result(string_type(), &all_diags, span.clone(), "invalid slice access".to_string()) -} + let all_diags = v2_rt::concat(v2_rt::concat(base_diags, start_diags), end_diags); + access_result( + string_type(), + &all_diags, + span.clone(), + "invalid slice access".to_string(), + ) + } } diff --git a/src/v2/stage0/src/v2_compiler_infer_cycle.rs b/src/v2/stage0/src/v2_compiler_infer_cycle.rs index 7ed18be2ecf..f174744c84e 100644 --- a/src/v2/stage0/src/v2_compiler_infer_cycle.rs +++ b/src/v2/stage0/src/v2_compiler_infer_cycle.rs @@ -1,77 +1,144 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.infer_cycle -use std::collections::HashMap; -use std::rc::Rc; +pub use crate::v2_compiler_infer_env::TypeBinding; use crate::v2_rt; -use crate::NonEmptyVec; use crate::NonEmptyBTreeSet; -pub use crate::v2_compiler_infer_env::{TypeBinding}; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; pub fn set_has(m: Rc>, key: String) -> bool { { let result = match v2_rt::map_get(&m, key) { - Some(_) => true, - None => false, -}; -result -} + Some(_) => true, + None => false, + }; + result + } } -pub fn compute_in_graph_deps(all_names: Rc>, deps_map: Rc>>>, name_set: Rc>) -> Rc>>> { +pub fn compute_in_graph_deps( + all_names: Rc>, + deps_map: Rc>>>, + name_set: Rc>, +) -> Rc>>> { { - let result = all_names.iter().cloned().fold(v2_rt::rc_empty_map::>>(), |acc: Rc>>>, name: String| match v2_rt::map_get(&deps_map, name.clone()) { - Some(deps) => { - let local = Rc::new({ let mut __result = Vec::new(); for d in deps.clone().iter().cloned() { if ((d.clone().as_str() != name.clone().as_str()) && set_has(name_set.clone(), d.clone())) { __result.push(d); } } __result }); -v2_rt::rc_map_insert(acc.clone(), name.clone(), local.clone()) -}, - None => v2_rt::rc_map_insert(acc.clone(), name.clone(), Rc::new(vec![])), -}); -result -} + let result = all_names.iter().cloned().fold( + v2_rt::rc_empty_map::>>(), + |acc: Rc>>>, name: String| match v2_rt::map_get( + &deps_map, + name.clone(), + ) { + Some(deps) => { + let local = Rc::new({ + let mut __result = Vec::new(); + for d in deps.clone().iter().cloned() { + if ((d.clone().as_str() != name.clone().as_str()) + && set_has(name_set.clone(), d.clone())) + { + __result.push(d); + } + } + __result + }); + v2_rt::rc_map_insert(acc.clone(), name.clone(), local.clone()) + } + None => v2_rt::rc_map_insert(acc.clone(), name.clone(), Rc::new(vec![])), + }, + ); + result + } } -pub fn build_reverse_adj(all_names: Rc>, local_deps: Rc>>>) -> Rc>>> { - all_names.iter().cloned().fold(v2_rt::rc_empty_map::>>(), |acc: Rc>>>, name: String| match v2_rt::map_get(&local_deps, name.clone()) { - Some(deps) => deps.clone().iter().cloned().fold(acc.clone(), |inner_acc: Rc>>>, dep: String| { - let existing = match v2_rt::map_get(&inner_acc, dep.clone()) { - Some(v) => v.clone(), - None => Rc::new(vec![]), -}; -v2_rt::rc_map_insert(inner_acc.clone(), dep.clone(), v2_rt::rc_list_push(existing.clone(), name.clone())) -}), - None => acc.clone(), -}) +pub fn build_reverse_adj( + all_names: Rc>, + local_deps: Rc>>>, +) -> Rc>>> { + all_names.iter().cloned().fold( + v2_rt::rc_empty_map::>>(), + |acc: Rc>>>, name: String| match v2_rt::map_get( + &local_deps, + name.clone(), + ) { + Some(deps) => deps.clone().iter().cloned().fold( + acc.clone(), + |inner_acc: Rc>>>, dep: String| { + let existing = match v2_rt::map_get(&inner_acc, dep.clone()) { + Some(v) => v.clone(), + None => Rc::new(vec![]), + }; + v2_rt::rc_map_insert( + inner_acc.clone(), + dep.clone(), + v2_rt::rc_list_push(existing.clone(), name.clone()), + ) + }, + ), + None => acc.clone(), + }, + ) } -pub fn build_in_degree(all_names: Rc>, local_deps: Rc>>>) -> Rc> { - all_names.iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, name: String| { - let deg = match v2_rt::map_get(&local_deps, name.clone()) { - Some(deps) => (deps.clone().len() as i64), - None => 0, -}; -v2_rt::rc_map_insert(acc, name.clone(), deg.clone()) -}) +pub fn build_in_degree( + all_names: Rc>, + local_deps: Rc>>>, +) -> Rc> { + all_names.iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, name: String| { + let deg = match v2_rt::map_get(&local_deps, name.clone()) { + Some(deps) => (deps.clone().len() as i64), + None => 0, + }; + v2_rt::rc_map_insert(acc, name.clone(), deg.clone()) + }, + ) } -pub fn kahn_remove_loop(remaining: &Rc>, local_deps: &Rc>>>) -> Rc> { +pub fn kahn_remove_loop( + remaining: &Rc>, + local_deps: &Rc>>>, +) -> Rc> { { let reverse_adj = build_reverse_adj(remaining.clone(), local_deps.clone()); -let in_degree = build_in_degree(remaining.clone(), local_deps.clone()); -let initial_queue = Rc::new({ let mut __result = Vec::new(); for n in remaining.clone().iter().cloned() { if match v2_rt::map_get(&in_degree, n.clone()) { - Some(d) => (d.clone() == 0), - None => true, -} { __result.push(n); } } __result }); -let final_state = kahn_cycle_drain(initial_queue, in_degree.clone(), reverse_adj, 0, (remaining.clone().len() as i64)); -if (final_state.removed_count.clone() == (remaining.clone().len() as i64)) { + let in_degree = build_in_degree(remaining.clone(), local_deps.clone()); + let initial_queue = Rc::new({ + let mut __result = Vec::new(); + for n in remaining.clone().iter().cloned() { + if match v2_rt::map_get(&in_degree, n.clone()) { + Some(d) => (d.clone() == 0), + None => true, + } { + __result.push(n); + } + } + __result + }); + let final_state = kahn_cycle_drain( + initial_queue, + in_degree.clone(), + reverse_adj, + 0, + (remaining.clone().len() as i64), + ); + if (final_state.removed_count.clone() == (remaining.clone().len() as i64)) { Rc::new(vec![]) } else { - Rc::new({ let mut __result = Vec::new(); for n in remaining.clone().iter().cloned() { if match v2_rt::map_get(&final_state.in_degree.clone(), n.clone()) { - Some(d) => (d.clone() > 0), - None => false, -} { __result.push(n); } } __result }) + Rc::new({ + let mut __result = Vec::new(); + for n in remaining.clone().iter().cloned() { + if match v2_rt::map_get(&final_state.in_degree.clone(), n.clone()) { + Some(d) => (d.clone() > 0), + None => false, + } { + __result.push(n); + } + } + __result + }) } -} + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -80,78 +147,147 @@ pub struct KahnState { pub removed_count: i64, } -pub fn kahn_cycle_drain(mut queue: Rc>, mut in_degree: Rc>, mut reverse_adj: Rc>>>, mut removed_count: i64, mut fuel: i64) -> Rc { +pub fn kahn_cycle_drain( + mut queue: Rc>, + mut in_degree: Rc>, + mut reverse_adj: Rc>>>, + mut removed_count: i64, + mut fuel: i64, +) -> Rc { loop { if ((queue.clone().len() as i64) == 0) { return Rc::new(KahnState { - in_degree: in_degree.clone(), - removed_count: removed_count.clone(), -}) + in_degree: in_degree.clone(), + removed_count: removed_count.clone(), + }); } -let result = queue.clone().iter().cloned().fold(Rc::new(KahnState { - in_degree: in_degree.clone(), - removed_count: removed_count.clone(), -}), |state: Rc, node: String| { let state = Rc::try_unwrap(state).unwrap_or_else(|rc| (*rc).clone()); { - let dependents = match v2_rt::map_get(&reverse_adj, node.clone()) { - Some(v) => v.clone(), - None => Rc::new(vec![]), -}; -let new_deg = dependents.clone().iter().cloned().fold(state.in_degree, |deg_acc: Rc>, dep: String| { - let old = match v2_rt::map_get(°_acc, dep.clone()) { - Some(d) => d.clone(), - None => 0, -}; -v2_rt::rc_map_insert(deg_acc.clone(), dep.clone(), (old.clone() - 1)) -}); -Rc::new(KahnState { - in_degree: new_deg.clone(), - removed_count: (state.removed_count + 1), -}) -} }); -let next_queue = queue.clone().iter().cloned().fold(Rc::new(vec![]), |acc: _, node: String| { - let dependents = match v2_rt::map_get(&reverse_adj, node.clone()) { - Some(v) => v.clone(), - None => Rc::new(vec![]), -}; -dependents.clone().iter().cloned().fold(acc, |inner_acc: _, dep: String| { - let deg = match v2_rt::map_get(&result.in_degree.clone(), dep.clone()) { - Some(d) => d.clone(), - None => 0, -}; -if (deg.clone() == 0) { - v2_rt::rc_list_push(inner_acc.clone(), dep.clone()) - } else { - inner_acc.clone() + let result = queue.clone().iter().cloned().fold( + Rc::new(KahnState { + in_degree: in_degree.clone(), + removed_count: removed_count.clone(), + }), + |state: Rc, node: String| { + let state = Rc::try_unwrap(state).unwrap_or_else(|rc| (*rc).clone()); + { + let dependents = match v2_rt::map_get(&reverse_adj, node.clone()) { + Some(v) => v.clone(), + None => Rc::new(vec![]), + }; + let new_deg = dependents.clone().iter().cloned().fold( + state.in_degree, + |deg_acc: Rc>, dep: String| { + let old = match v2_rt::map_get(°_acc, dep.clone()) { + Some(d) => d.clone(), + None => 0, + }; + v2_rt::rc_map_insert(deg_acc.clone(), dep.clone(), (old.clone() - 1)) + }, + ); + Rc::new(KahnState { + in_degree: new_deg.clone(), + removed_count: (state.removed_count + 1), + }) } -}) -}); -{ + }, + ); + let next_queue = + queue + .clone() + .iter() + .cloned() + .fold(Rc::new(vec![]), |acc: _, node: String| { + let dependents = match v2_rt::map_get(&reverse_adj, node.clone()) { + Some(v) => v.clone(), + None => Rc::new(vec![]), + }; + dependents + .clone() + .iter() + .cloned() + .fold(acc, |inner_acc: _, dep: String| { + let deg = match v2_rt::map_get(&result.in_degree.clone(), dep.clone()) { + Some(d) => d.clone(), + None => 0, + }; + if (deg.clone() == 0) { + v2_rt::rc_list_push(inner_acc.clone(), dep.clone()) + } else { + inner_acc.clone() + } + }) + }); + { let __tco_0 = next_queue; -let __tco_1 = result.in_degree.clone(); -let __tco_2 = result.removed_count.clone(); -let __tco_3 = (fuel - 1); -queue = __tco_0; -in_degree = __tco_1; -removed_count = __tco_2; -fuel = __tco_3; -continue; -} -} + let __tco_1 = result.in_degree.clone(); + let __tco_2 = result.removed_count.clone(); + let __tco_3 = (fuel - 1); + queue = __tco_0; + in_degree = __tco_1; + removed_count = __tco_2; + fuel = __tco_3; + continue; + } + } } -pub fn detect_type_cycles_kahn(deps_map: &Rc>>>, bindings: Rc>>) -> Rc> { +pub fn detect_type_cycles_kahn( + deps_map: &Rc>>>, + bindings: Rc>>, +) -> Rc> { { - let all_names = Rc::new({ let mut __result = Vec::new(); for b in Rc::new(v2_rt::map_values(&bindings)).iter().cloned() { __result.push(b.name.clone()); } __result }); -let name_set = all_names.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, n: String| v2_rt::rc_map_insert(acc, n.clone(), true)); -let local_deps = compute_in_graph_deps(all_names.clone(), deps_map.clone(), name_set); -let self_refs = Rc::new({ let mut __result = Vec::new(); for name in all_names.clone().iter().cloned() { if match v2_rt::map_get(&deps_map, name.clone()) { - Some(deps) => { let mut __found = false; for d in deps.clone().iter().cloned() { if (d.clone().as_str() == name.clone().as_str()) { __found = true; break; } } __found }, - None => false, -} { __result.push(name); } } __result }); -let cycle_members = kahn_remove_loop(&all_names, &local_deps); -let sr_set = self_refs.iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, n: String| v2_rt::rc_map_insert(acc, n.clone(), true)); -let cm_set = cycle_members.iter().cloned().fold(sr_set, |acc: Rc>, n: String| v2_rt::rc_map_insert(acc, n.clone(), true)); -let result = Rc::new({ let mut __result = Vec::new(); for n in all_names.clone().iter().cloned() { if set_has(cm_set.clone(), n.clone()) { __result.push(n); } } __result }); -result -} + let all_names = Rc::new({ + let mut __result = Vec::new(); + for b in Rc::new(v2_rt::map_values(&bindings)).iter().cloned() { + __result.push(b.name.clone()); + } + __result + }); + let name_set = all_names.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, n: String| v2_rt::rc_map_insert(acc, n.clone(), true), + ); + let local_deps = compute_in_graph_deps(all_names.clone(), deps_map.clone(), name_set); + let self_refs = Rc::new({ + let mut __result = Vec::new(); + for name in all_names.clone().iter().cloned() { + if match v2_rt::map_get(&deps_map, name.clone()) { + Some(deps) => { + let mut __found = false; + for d in deps.clone().iter().cloned() { + if (d.clone().as_str() == name.clone().as_str()) { + __found = true; + break; + } + } + __found + } + None => false, + } { + __result.push(name); + } + } + __result + }); + let cycle_members = kahn_remove_loop(&all_names, &local_deps); + let sr_set = self_refs.iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, n: String| v2_rt::rc_map_insert(acc, n.clone(), true), + ); + let cm_set = cycle_members + .iter() + .cloned() + .fold(sr_set, |acc: Rc>, n: String| { + v2_rt::rc_map_insert(acc, n.clone(), true) + }); + let result = Rc::new({ + let mut __result = Vec::new(); + for n in all_names.clone().iter().cloned() { + if set_has(cm_set.clone(), n.clone()) { + __result.push(n); + } + } + __result + }); + result + } } diff --git a/src/v2/stage0/src/v2_compiler_infer_emit_info.rs b/src/v2/stage0/src/v2_compiler_infer_emit_info.rs index 228cb3dbe9d..67d890b8ea6 100644 --- a/src/v2/stage0/src/v2_compiler_infer_emit_info.rs +++ b/src/v2/stage0/src/v2_compiler_infer_emit_info.rs @@ -1,40 +1,46 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.infer_emit_info -use std::collections::HashMap; -use std::rc::Rc; +use self::TypeRepr::*; +pub use crate::v2_compiler_infer_types::{ + child_type_node, emit_map_has, node_type_equals, normalize_access_type_node, +}; use crate::v2_rt; -use crate::NonEmptyVec; -use crate::NonEmptyBTreeSet; -pub use crate::v2_std_core::{Node, authored_name_at, NewlineIndex, find_child_named, has_child_named, InferredNode, FieldAccessStyle, FieldValueShape, FieldSummary, with_required_cardinality, Connective, param_node_name_at, Cardinality}; +use crate::v2_std_core::Cardinality::CardOptional; +use crate::v2_std_core::Connective::{Arrow, Conj, NoConnective}; +use crate::v2_std_core::FieldAccessStyle::{EnumAccessor, StoredField, TupleFirst, TupleSecond}; +use crate::v2_std_core::FieldValueShape::{OptionalValue, PlainValue}; use crate::v2_std_core::InferredNode::{Resolved, TypeVariable}; -use crate::v2_std_core::FieldAccessStyle::{StoredField, EnumAccessor, TupleFirst, TupleSecond}; -use crate::v2_std_core::FieldValueShape::{PlainValue, OptionalValue}; -use crate::v2_std_core::Connective::{Conj, NoConnective, Arrow}; -use crate::v2_std_core::Cardinality::{CardOptional}; -pub use crate::v2_compiler_infer_types::{normalize_access_type_node, child_type_node, emit_map_has, node_type_equals}; -use self::TypeRepr::*; +pub use crate::v2_std_core::{ + authored_name_at, find_child_named, has_child_named, param_node_name_at, + with_required_cardinality, Cardinality, Connective, FieldAccessStyle, FieldSummary, + FieldValueShape, InferredNode, NewlineIndex, Node, +}; +use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; pub fn is_type_variable(inferred: Rc) -> bool { match (*inferred).clone() { - InferredNode::TypeVariable { .. } => true, - _ => false, -} + InferredNode::TypeVariable { .. } => true, + _ => false, + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum TypeRepr { StructRepr, - EnumRepr { - unit_only: bool, - }, + EnumRepr { unit_only: bool }, } impl TypeRepr { pub fn unit_only(&self) -> bool { match self { TypeRepr::StructRepr => panic!("no unit_only on unit variant"), - TypeRepr::EnumRepr { unit_only: __val, .. } => __val.clone(), + TypeRepr::EnumRepr { + unit_only: __val, .. + } => __val.clone(), } } } @@ -71,253 +77,532 @@ pub struct EmitInfoBuildState { pub fn empty_emit_graph_info() -> Rc { Rc::new(EmitGraphInfo { - type_summaries: v2_rt::rc_empty_map::>(), - recursive_type_set: v2_rt::rc_empty_map::(), - fielded_variants: v2_rt::rc_empty_map::(), - shared_types: v2_rt::rc_empty_map::(), - ownership_index: v2_rt::rc_empty_map::>>(), - movable: v2_rt::rc_empty_map::(), - variant_to_enum: v2_rt::rc_empty_map::(), - owned_bindings: v2_rt::rc_empty_map::(), - read_only_params_index: v2_rt::rc_empty_map::>>(), - read_only_params: v2_rt::rc_empty_map::(), -}) + type_summaries: v2_rt::rc_empty_map::>(), + recursive_type_set: v2_rt::rc_empty_map::(), + fielded_variants: v2_rt::rc_empty_map::(), + shared_types: v2_rt::rc_empty_map::(), + ownership_index: v2_rt::rc_empty_map::>>(), + movable: v2_rt::rc_empty_map::(), + variant_to_enum: v2_rt::rc_empty_map::(), + owned_bindings: v2_rt::rc_empty_map::(), + read_only_params_index: v2_rt::rc_empty_map::>>(), + read_only_params: v2_rt::rc_empty_map::(), + }) } -pub fn variant_has_fields(emit_info: Rc, enum_name: String, variant_name: String) -> bool { +pub fn variant_has_fields( + emit_info: Rc, + enum_name: String, + variant_name: String, +) -> bool { { let key = v2_rt::concat(v2_rt::concat(enum_name, "::".to_string()), variant_name); -match v2_rt::map_get(&emit_info.fielded_variants.clone(), key) { - Some(v) => v.clone(), - None => false, -} -} + match v2_rt::map_get(&emit_info.fielded_variants.clone(), key) { + Some(v) => v.clone(), + None => false, + } + } } -pub fn lookup_emit_type_summary(emit_info: Rc, type_name: String) -> Option> { +pub fn lookup_emit_type_summary( + emit_info: Rc, + type_name: String, +) -> Option> { v2_rt::map_get(&emit_info.type_summaries.clone(), type_name) } -pub fn derive_variant_to_enum(type_summaries: Rc>>) -> Rc> { - Rc::new(v2_rt::map_values(&type_summaries)).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, summary: Rc| match (*summary.repr.clone()).clone() { - TypeRepr::EnumRepr { .. } => Rc::new(v2_rt::map_keys(&summary.variant_name_set.clone())).iter().cloned().fold(acc.clone(), |inner: Rc>, vn: String| match v2_rt::map_get(&inner, vn.clone()) { - Some(_) => v2_rt::rc_map_insert(inner.clone(), vn.clone(), "".to_string()), - None => v2_rt::rc_map_insert(inner.clone(), vn.clone(), summary.name.clone()), -}), - _ => acc.clone(), -}) +pub fn derive_variant_to_enum( + type_summaries: Rc>>, +) -> Rc> { + Rc::new(v2_rt::map_values(&type_summaries)) + .iter() + .cloned() + .fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, summary: Rc| match (*summary + .repr + .clone()) + .clone() + { + TypeRepr::EnumRepr { .. } => { + Rc::new(v2_rt::map_keys(&summary.variant_name_set.clone())) + .iter() + .cloned() + .fold( + acc.clone(), + |inner: Rc>, vn: String| match v2_rt::map_get( + &inner, + vn.clone(), + ) { + Some(_) => { + v2_rt::rc_map_insert(inner.clone(), vn.clone(), "".to_string()) + } + None => v2_rt::rc_map_insert( + inner.clone(), + vn.clone(), + summary.name.clone(), + ), + }, + ) + } + _ => acc.clone(), + }, + ) } -pub fn is_known_variant(type_summaries: Rc>>, name: String) -> bool { - { let mut __found = false; for summary in Rc::new(v2_rt::map_values(&type_summaries)).iter().cloned() { if match (*summary.repr.clone()).clone() { - TypeRepr::EnumRepr { .. } => emit_map_has(summary.variant_name_set.clone(), name.clone()), - _ => false, -} { __found = true; break; } } __found } +pub fn is_known_variant( + type_summaries: Rc>>, + name: String, +) -> bool { + { + let mut __found = false; + for summary in Rc::new(v2_rt::map_values(&type_summaries)).iter().cloned() { + if match (*summary.repr.clone()).clone() { + TypeRepr::EnumRepr { .. } => { + emit_map_has(summary.variant_name_set.clone(), name.clone()) + } + _ => false, + } { + __found = true; + break; + } + } + __found + } } -pub fn variant_belongs_to_enum(type_summaries: Rc>>, variant_name: String, enum_name: String) -> bool { +pub fn variant_belongs_to_enum( + type_summaries: Rc>>, + variant_name: String, + enum_name: String, +) -> bool { match v2_rt::map_get(&type_summaries, enum_name) { - Some(summary) => match (*summary.repr.clone()).clone() { - TypeRepr::EnumRepr { .. } => emit_map_has(summary.variant_name_set.clone(), variant_name), - _ => false, -}, - None => false, -} + Some(summary) => match (*summary.repr.clone()).clone() { + TypeRepr::EnumRepr { .. } => { + emit_map_has(summary.variant_name_set.clone(), variant_name) + } + _ => false, + }, + None => false, + } } -pub fn is_enum_in_summaries(type_summaries: Rc>>, type_name: String) -> bool { +pub fn is_enum_in_summaries( + type_summaries: Rc>>, + type_name: String, +) -> bool { match v2_rt::map_get(&type_summaries, type_name) { - Some(summary) => match (*summary.repr.clone()).clone() { - TypeRepr::EnumRepr { .. } => true, - _ => false, -}, - None => false, -} + Some(summary) => match (*summary.repr.clone()).clone() { + TypeRepr::EnumRepr { .. } => true, + _ => false, + }, + None => false, + } } -pub fn find_variant_parent(type_summaries: Rc>>, variant_name: String, scope_enums: Rc>) -> Option { - Rc::new({ let mut __result = Vec::new(); for en in scope_enums.iter().cloned() { if variant_belongs_to_enum(type_summaries.clone(), variant_name.clone(), en.clone()) { __result.push(en); } } __result }).first().cloned() +pub fn find_variant_parent( + type_summaries: Rc>>, + variant_name: String, + scope_enums: Rc>, +) -> Option { + Rc::new({ + let mut __result = Vec::new(); + for en in scope_enums.iter().cloned() { + if variant_belongs_to_enum(type_summaries.clone(), variant_name.clone(), en.clone()) { + __result.push(en); + } + } + __result + }) + .first() + .cloned() } pub fn field_value_shape_from_type_node(type_node: Rc) -> FieldValueShape { { let normed = normalize_access_type_node(type_node); -let is_optional = (normed.return_cardinality.clone() == Cardinality::CardOptional); -if is_optional { + let is_optional = (normed.return_cardinality.clone() == Cardinality::CardOptional); + if is_optional { FieldValueShape::OptionalValue } else { FieldValueShape::PlainValue } -} + } } pub fn is_tuple_type(n: &Rc) -> bool { - (((n.connective.clone() == Connective::Conj) && (n.ident_span.clone() == None)) && ((n.children.clone().len() as i64) == 2)) + (((n.connective.clone() == Connective::Conj) && (n.ident_span.clone() == None)) + && ((n.children.clone().len() as i64) == 2)) } -pub fn build_struct_field_summaries(parent: &Rc, source_indices: Rc>>) -> Rc>> { +pub fn build_struct_field_summaries( + parent: &Rc, + source_indices: Rc>>, +) -> Rc>> { { let is_pair = is_tuple_type(&parent); -Rc::new(parent.children.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, pair: (i64, Rc)| { - let idx = pair.0.clone(); -let child = pair.1.clone(); -if (child.inferred.clone() == None) { - acc.clone() - } else { - { - let style = if is_pair.clone() { - if (idx.clone() == 0) { - FieldAccessStyle::TupleFirst + Rc::new( + parent + .children + .clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + .fold( + v2_rt::rc_empty_map::>(), + |acc: Rc>>, pair: (i64, Rc)| { + let idx = pair.0.clone(); + let child = pair.1.clone(); + if (child.inferred.clone() == None) { + acc.clone() + } else { + { + let style = if is_pair.clone() { + if (idx.clone() == 0) { + FieldAccessStyle::TupleFirst + } else { + FieldAccessStyle::TupleSecond + } } else { - FieldAccessStyle::TupleSecond - } - } else { - FieldAccessStyle::StoredField - }; -let key = authored_name_at(source_indices.clone(), &child); -v2_rt::rc_map_insert(acc.clone(), key.clone(), Rc::new(FieldSummary { - access_style: style.clone(), - value_shape: field_value_shape_from_type_node(child_type_node(&child)), -})) -} - } -}) -} + FieldAccessStyle::StoredField + }; + let key = authored_name_at(source_indices.clone(), &child); + v2_rt::rc_map_insert( + acc.clone(), + key.clone(), + Rc::new(FieldSummary { + access_style: style.clone(), + value_shape: field_value_shape_from_type_node(child_type_node( + &child, + )), + }), + ) + } + } + }, + ) + } } -pub fn find_first_enum_field_node(variants: Rc>>, field_name: String, source_indices: Rc>>) -> Option> { +pub fn find_first_enum_field_node( + variants: Rc>>, + field_name: String, + source_indices: Rc>>, +) -> Option> { match variants.first().cloned() { - Some(variant) => match find_child_named(variant.clone(), field_name, source_indices) { - Some(field_child) => Some(field_child.clone()), - None => None, -}, - None => None, -} + Some(variant) => match find_child_named(variant.clone(), field_name, source_indices) { + Some(field_child) => Some(field_child.clone()), + None => None, + }, + None => None, + } } -pub fn enum_field_present_in_all_variants(variants: Rc>>, field_name: String, source_indices: Rc>>) -> bool { - { let mut __all = true; for variant in variants.iter().cloned() { if !(has_child_named(variant.clone(), field_name.clone(), source_indices.clone())) { __all = false; break; } } __all } +pub fn enum_field_present_in_all_variants( + variants: Rc>>, + field_name: String, + source_indices: Rc>>, +) -> bool { + { + let mut __all = true; + for variant in variants.iter().cloned() { + if !(has_child_named(variant.clone(), field_name.clone(), source_indices.clone())) { + __all = false; + break; + } + } + __all + } } -pub fn enum_field_type_consistent(variants: Rc>>, field_name: String, expected: Rc, source_indices: Rc>>) -> bool { - { let mut __all = true; for variant in variants.iter().cloned() { if !(match find_child_named(variant.clone(), field_name.clone(), source_indices.clone()) { - Some(field_child) => node_type_equals(&child_type_node(&field_child), &expected, source_indices.clone()), - None => false, -}) { __all = false; break; } } __all } +pub fn enum_field_type_consistent( + variants: Rc>>, + field_name: String, + expected: Rc, + source_indices: Rc>>, +) -> bool { + { + let mut __all = true; + for variant in variants.iter().cloned() { + if !(match find_child_named(variant.clone(), field_name.clone(), source_indices.clone()) + { + Some(field_child) => node_type_equals( + &child_type_node(&field_child), + &expected, + source_indices.clone(), + ), + None => false, + }) { + __all = false; + break; + } + } + __all + } } -pub fn build_enum_field_summaries(variants: &Rc>>, source_indices: Rc>>) -> Rc>> { +pub fn build_enum_field_summaries( + variants: &Rc>>, + source_indices: Rc>>, +) -> Rc>> { { let first_field_names = match variants.clone().first().cloned() { - Some(first_variant) => Rc::new({ let mut __result = Vec::new(); for f in first_variant.children.clone().iter().cloned() { __result.push(authored_name_at(source_indices.clone(), &f)); } __result }), - None => Rc::new(vec![]), -}; -let shared = Rc::new({ let mut __result = Vec::new(); for field_name in first_field_names.iter().cloned() { if enum_field_present_in_all_variants(variants.clone(), field_name.clone(), source_indices.clone()) { __result.push(field_name); } } __result }); -let consistent = Rc::new({ let mut __result = Vec::new(); for field_name in shared.iter().cloned() { if match find_first_enum_field_node(variants.clone(), field_name.clone(), source_indices.clone()) { - Some(first_field) => enum_field_type_consistent(variants.clone(), field_name.clone(), child_type_node(&first_field), source_indices.clone()), - None => false, -} { __result.push(field_name); } } __result }); -consistent.iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, field_name: String| match find_first_enum_field_node(variants.clone(), field_name.clone(), source_indices.clone()) { - Some(first_field) => v2_rt::rc_map_insert(acc.clone(), field_name.clone(), Rc::new(FieldSummary { - access_style: FieldAccessStyle::EnumAccessor, - value_shape: field_value_shape_from_type_node(child_type_node(&first_field)), -})), - None => acc.clone(), -}) -} + Some(first_variant) => Rc::new({ + let mut __result = Vec::new(); + for f in first_variant.children.clone().iter().cloned() { + __result.push(authored_name_at(source_indices.clone(), &f)); + } + __result + }), + None => Rc::new(vec![]), + }; + let shared = Rc::new({ + let mut __result = Vec::new(); + for field_name in first_field_names.iter().cloned() { + if enum_field_present_in_all_variants( + variants.clone(), + field_name.clone(), + source_indices.clone(), + ) { + __result.push(field_name); + } + } + __result + }); + let consistent = Rc::new({ + let mut __result = Vec::new(); + for field_name in shared.iter().cloned() { + if match find_first_enum_field_node( + variants.clone(), + field_name.clone(), + source_indices.clone(), + ) { + Some(first_field) => enum_field_type_consistent( + variants.clone(), + field_name.clone(), + child_type_node(&first_field), + source_indices.clone(), + ), + None => false, + } { + __result.push(field_name); + } + } + __result + }); + consistent.iter().cloned().fold( + v2_rt::rc_empty_map::>(), + |acc: Rc>>, field_name: String| { + match find_first_enum_field_node( + variants.clone(), + field_name.clone(), + source_indices.clone(), + ) { + Some(first_field) => v2_rt::rc_map_insert( + acc.clone(), + field_name.clone(), + Rc::new(FieldSummary { + access_style: FieldAccessStyle::EnumAccessor, + value_shape: field_value_shape_from_type_node(child_type_node( + &first_field, + )), + }), + ), + None => acc.clone(), + } + }, + ) + } } -pub fn build_field_type_map(children: Rc>>, source_indices: Rc>>) -> Rc> { - children.iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, child: Rc| match child.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: ft, .. }) => { - let resolved_name = authored_name_at(source_indices.clone(), &normalize_access_type_node(ft.clone())); -let ft_is_type_var = if (ft.inferred.clone() != None) { - is_type_variable(ft.inferred.clone().clone().unwrap()) - } else { - false - }; -let key = authored_name_at(source_indices.clone(), &child); -if (((resolved_name.clone().as_str() != "".to_string().as_str()) && !ft_is_type_var.clone()) && (resolved_name.clone().as_str() != "Dynamic".to_string().as_str())) { - v2_rt::rc_map_insert(acc.clone(), key.clone(), resolved_name.clone()) - } else { - acc.clone() - } -}, - _ => acc.clone(), -}) +pub fn build_field_type_map( + children: Rc>>, + source_indices: Rc>>, +) -> Rc> { + children.iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, child: Rc| match child + .inferred + .clone() + .as_deref() + .cloned() + { + Some(InferredNode::Resolved { node: ft, .. }) => { + let resolved_name = authored_name_at( + source_indices.clone(), + &normalize_access_type_node(ft.clone()), + ); + let ft_is_type_var = if (ft.inferred.clone() != None) { + is_type_variable(ft.inferred.clone().clone().unwrap()) + } else { + false + }; + let key = authored_name_at(source_indices.clone(), &child); + if (((resolved_name.clone().as_str() != "".to_string().as_str()) + && !ft_is_type_var.clone()) + && (resolved_name.clone().as_str() != "Dynamic".to_string().as_str())) + { + v2_rt::rc_map_insert(acc.clone(), key.clone(), resolved_name.clone()) + } else { + acc.clone() + } + } + _ => acc.clone(), + }, + ) } -pub fn build_type_summary(item: &Rc, source_indices: &Rc>>) -> Option> { +pub fn build_type_summary( + item: &Rc, + source_indices: &Rc>>, +) -> Option> { { - if (((item.connective.clone() == Connective::NoConnective) || (item.connective.clone() == Connective::Arrow)) || (item.transport.clone() != None)) { - return None + if (((item.connective.clone() == Connective::NoConnective) + || (item.connective.clone() == Connective::Arrow)) + || (item.transport.clone() != None)) + { + return None; } -let gpn = Rc::new({ let mut __result = Vec::new(); for p in item.params.clone().iter().cloned() { __result.push(param_node_name_at(p.clone(), source_indices.clone())); } __result }); -let is_product = (item.connective.clone() == Connective::Conj); -let has_fn = { let mut __found = false; for child in item.children.clone().iter().cloned() { if match child.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => (rt.connective.clone() == Connective::Arrow), - _ => false, -} { __found = true; break; } } __found }; -if is_product { + let gpn = Rc::new({ + let mut __result = Vec::new(); + for p in item.params.clone().iter().cloned() { + __result.push(param_node_name_at(p.clone(), source_indices.clone())); + } + __result + }); + let is_product = (item.connective.clone() == Connective::Conj); + let has_fn = { + let mut __found = false; + for child in item.children.clone().iter().cloned() { + if match child.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => { + (rt.connective.clone() == Connective::Arrow) + } + _ => false, + } { + __found = true; + break; + } + } + __found + }; + if is_product { Some(Rc::new(TypeSummary { - name: authored_name_at(source_indices.clone(), &item), - repr: Rc::new(TypeRepr::StructRepr), - field_summaries: build_struct_field_summaries(&item, source_indices.clone()), - field_type_map: build_field_type_map(item.children.clone(), source_indices.clone()), - variant_name_set: v2_rt::rc_empty_map::(), - generic_param_names: gpn, - has_fn_fields: has_fn, -})) + name: authored_name_at(source_indices.clone(), &item), + repr: Rc::new(TypeRepr::StructRepr), + field_summaries: build_struct_field_summaries(&item, source_indices.clone()), + field_type_map: build_field_type_map(item.children.clone(), source_indices.clone()), + variant_name_set: v2_rt::rc_empty_map::(), + generic_param_names: gpn, + has_fn_fields: has_fn, + })) } else { { - let unit_only = { let mut __all = true; for child in item.children.clone().iter().cloned() { if !(((child.children.clone().len() as i64) == 0)) { __all = false; break; } } __all }; -Some(Rc::new(TypeSummary { - name: authored_name_at(source_indices.clone(), &item), - repr: Rc::new(TypeRepr::EnumRepr { - unit_only: unit_only, -}), - field_summaries: build_enum_field_summaries(&item.children.clone(), source_indices.clone()), - field_type_map: v2_rt::rc_empty_map::(), - variant_name_set: item.children.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, child: Rc| v2_rt::rc_map_insert(acc, authored_name_at(source_indices.clone(), &child), true)), - generic_param_names: gpn, - has_fn_fields: has_fn, -})) -} + let unit_only = { + let mut __all = true; + for child in item.children.clone().iter().cloned() { + if !((child.children.clone().len() as i64) == 0) { + __all = false; + break; + } + } + __all + }; + Some(Rc::new(TypeSummary { + name: authored_name_at(source_indices.clone(), &item), + repr: Rc::new(TypeRepr::EnumRepr { + unit_only: unit_only, + }), + field_summaries: build_enum_field_summaries( + &item.children.clone(), + source_indices.clone(), + ), + field_type_map: v2_rt::rc_empty_map::(), + variant_name_set: item.children.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, child: Rc| { + v2_rt::rc_map_insert( + acc, + authored_name_at(source_indices.clone(), &child), + true, + ) + }, + ), + generic_param_names: gpn, + has_fn_fields: has_fn, + })) + } } -} + } } -pub fn add_emit_item_summary(state: Rc, item: &Rc, source_indices: &Rc>>) -> Rc { +pub fn add_emit_item_summary( + state: Rc, + item: &Rc, + source_indices: &Rc>>, +) -> Rc { match build_type_summary(&item, &source_indices) { - Some(summary) => { - let with_variants = match (*summary.repr.clone()).clone() { - TypeRepr::EnumRepr { .. } => item.children.clone().iter().cloned().fold(state.type_summaries.clone(), |acc: Rc>>, variant: Rc| if ((variant.children.clone().len() as i64) > 0) { - { - let v_has_fn = { let mut __found = false; for vc in variant.children.clone().iter().cloned() { if match vc.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => (rt.connective.clone() == Connective::Arrow), - _ => false, -} { __found = true; break; } } __found }; -let vname = authored_name_at(source_indices.clone(), &variant); -v2_rt::rc_map_insert(acc.clone(), vname.clone(), Rc::new(TypeSummary { - name: vname.clone(), - repr: Rc::new(TypeRepr::StructRepr), - field_summaries: build_struct_field_summaries(&variant, source_indices.clone()), - field_type_map: build_field_type_map(variant.children.clone(), source_indices.clone()), - variant_name_set: v2_rt::rc_empty_map::(), - generic_param_names: Rc::new(vec![]), - has_fn_fields: v_has_fn.clone(), -})) -} - } else { - acc.clone() - }), - _ => state.type_summaries.clone(), -}; -let next_summaries = v2_rt::rc_map_insert(with_variants, summary.name.clone(), summary.clone()); -Rc::new(EmitInfoBuildState { - type_summaries: next_summaries, -}) -}, - None => state, -} + Some(summary) => { + let with_variants = match (*summary.repr.clone()).clone() { + TypeRepr::EnumRepr { .. } => item.children.clone().iter().cloned().fold( + state.type_summaries.clone(), + |acc: Rc>>, variant: Rc| { + if ((variant.children.clone().len() as i64) > 0) { + { + let v_has_fn = { + let mut __found = false; + for vc in variant.children.clone().iter().cloned() { + if match vc.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => { + (rt.connective.clone() == Connective::Arrow) + } + _ => false, + } { + __found = true; + break; + } + } + __found + }; + let vname = authored_name_at(source_indices.clone(), &variant); + v2_rt::rc_map_insert( + acc.clone(), + vname.clone(), + Rc::new(TypeSummary { + name: vname.clone(), + repr: Rc::new(TypeRepr::StructRepr), + field_summaries: build_struct_field_summaries( + &variant, + source_indices.clone(), + ), + field_type_map: build_field_type_map( + variant.children.clone(), + source_indices.clone(), + ), + variant_name_set: v2_rt::rc_empty_map::(), + generic_param_names: Rc::new(vec![]), + has_fn_fields: v_has_fn.clone(), + }), + ) + } + } else { + acc.clone() + } + }, + ), + _ => state.type_summaries.clone(), + }; + let next_summaries = + v2_rt::rc_map_insert(with_variants, summary.name.clone(), summary.clone()); + Rc::new(EmitInfoBuildState { + type_summaries: next_summaries, + }) + } + None => state, + } } diff --git a/src/v2/stage0/src/v2_compiler_infer_env.rs b/src/v2/stage0/src/v2_compiler_infer_env.rs index d3dc148b5eb..0fce851de90 100644 --- a/src/v2/stage0/src/v2_compiler_infer_env.rs +++ b/src/v2/stage0/src/v2_compiler_infer_env.rs @@ -1,15 +1,18 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.infer_env -use std::collections::HashMap; -use std::rc::Rc; +use crate::std_induction::RecursionShape::{DirectRecursion, ListRecursion, OptionalRecursion}; +use crate::std_induction::SubValueRelation::{PreservedValue, SubValueUnknown}; +pub use crate::std_induction::{InductiveField, RecursionShape, SubValueRelation}; use crate::v2_rt; -use crate::NonEmptyVec; +pub use crate::v2_std_core::{ + authored_name_at, empty_intern_table, intern, intern_find, intern_str, merge_intern_tables, + source_text_at, InternTable, NewlineIndex, Node, +}; use crate::NonEmptyBTreeSet; -pub use crate::v2_std_core::{Node, NewlineIndex, InternTable, empty_intern_table, merge_intern_tables, intern, intern_find, intern_str, source_text_at, authored_name_at}; -pub use crate::std_induction::{InductiveField, RecursionShape, SubValueRelation}; -use crate::std_induction::RecursionShape::{DirectRecursion, ListRecursion, OptionalRecursion}; -use crate::std_induction::SubValueRelation::{SubValueUnknown, PreservedValue}; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] pub struct TypeEnv { @@ -30,30 +33,30 @@ pub struct TypeBinding { pub fn is_recursive_type(env: Rc, ident: i64) -> bool { match v2_rt::map_get(&env.recursive_type_set.clone(), ident) { - Some(_) => true, - _ => false, -} + Some(_) => true, + _ => false, + } } pub fn is_recursive_type_by_name(env: &Rc, name: String) -> bool { match intern_find(env.intern_table.clone(), name) { - Some(id) => is_recursive_type(env.clone(), id.clone()), - None => false, -} + Some(id) => is_recursive_type(env.clone(), id.clone()), + None => false, + } } pub fn lookup_type(env: Rc, ident: i64) -> Option> { match v2_rt::map_get(&env.bindings.clone(), ident) { - Some(binding) => Some(binding.resolved.clone()), - None => None, -} + Some(binding) => Some(binding.resolved.clone()), + None => None, + } } pub fn lookup_type_by_name(env: &Rc, name: String) -> Option> { match intern_find(env.intern_table.clone(), name) { - Some(id) => lookup_type(env.clone(), id.clone()), - None => None, -} + Some(id) => lookup_type(env.clone(), id.clone()), + None => None, + } } pub fn authored_name(env: Rc, node: Rc) -> String { @@ -62,102 +65,192 @@ pub fn authored_name(env: Rc, node: Rc) -> String { pub fn lookup_type_for(env: &Rc, node: &Rc) -> Option> { match node.ident.clone() { - Some(id) => lookup_type(env.clone(), id.clone()), - None => lookup_type_by_name(&env, authored_name(env.clone(), node.clone())), -} + Some(id) => lookup_type(env.clone(), id.clone()), + None => lookup_type_by_name(&env, authored_name(env.clone(), node.clone())), + } } pub fn is_recursive_type_for(env: &Rc, node: &Rc) -> bool { match node.ident.clone() { - Some(id) => is_recursive_type(env.clone(), id.clone()), - None => is_recursive_type_by_name(&env, authored_name(env.clone(), node.clone())), -} + Some(id) => is_recursive_type(env.clone(), id.clone()), + None => is_recursive_type_by_name(&env, authored_name(env.clone(), node.clone())), + } } pub fn inductive_fields_for(env: Rc, type_name: String) -> Rc>> { match v2_rt::map_get(&env.inductive_fields.clone(), type_name) { - Some(fields) => fields.clone(), - None => Rc::new(vec![]), -} + Some(fields) => fields.clone(), + None => Rc::new(vec![]), + } } -pub fn is_inductive_field(env: Rc, type_name: String, variant_name: String, field_name: String) -> bool { - { let mut __found = false; for f in inductive_fields_for(env, type_name).iter().cloned() { if ((f.variant_name.clone().as_str() == variant_name.clone().as_str()) && (f.field_name.clone().as_str() == field_name.clone().as_str())) { __found = true; break; } } __found } +pub fn is_inductive_field( + env: Rc, + type_name: String, + variant_name: String, + field_name: String, +) -> bool { + { + let mut __found = false; + for f in inductive_fields_for(env, type_name).iter().cloned() { + if ((f.variant_name.clone().as_str() == variant_name.clone().as_str()) + && (f.field_name.clone().as_str() == field_name.clone().as_str())) + { + __found = true; + break; + } + } + __found + } } -pub fn put_inductive_field(fields: &Rc>>>>, type_name: &String, variant_name: String, field_name: String, shape: RecursionShape) -> Rc>>>> { +pub fn put_inductive_field( + fields: &Rc>>>>, + type_name: &String, + variant_name: String, + field_name: String, + shape: RecursionShape, +) -> Rc>>>> { { let existing = match v2_rt::map_get(&fields, type_name.clone()) { - Some(fs) => fs.clone(), - None => Rc::new(vec![]), -}; -v2_rt::rc_map_insert(fields.clone(), type_name.clone(), v2_rt::concat(existing, Rc::new(vec![Rc::new(InductiveField { - type_name: type_name.clone(), - variant_name: variant_name, - field_name: field_name, - shape: shape, - element_type: type_name.clone(), -})]))) -} + Some(fs) => fs.clone(), + None => Rc::new(vec![]), + }; + v2_rt::rc_map_insert( + fields.clone(), + type_name.clone(), + v2_rt::concat( + existing, + Rc::new(vec![Rc::new(InductiveField { + type_name: type_name.clone(), + variant_name: variant_name, + field_name: field_name, + shape: shape, + element_type: type_name.clone(), + })]), + ), + ) + } } -pub fn put_inductive_field_cross(fields: &Rc>>>>, type_name: &String, variant_name: String, field_name: String, shape: RecursionShape, element_type: String) -> Rc>>>> { +pub fn put_inductive_field_cross( + fields: &Rc>>>>, + type_name: &String, + variant_name: String, + field_name: String, + shape: RecursionShape, + element_type: String, +) -> Rc>>>> { { let existing = match v2_rt::map_get(&fields, type_name.clone()) { - Some(fs) => fs.clone(), - None => Rc::new(vec![]), -}; -v2_rt::rc_map_insert(fields.clone(), type_name.clone(), v2_rt::concat(existing, Rc::new(vec![Rc::new(InductiveField { - type_name: type_name.clone(), - variant_name: variant_name, - field_name: field_name, - shape: shape, - element_type: element_type, -})]))) -} -} - -pub fn merge_inductive_fields(left: Rc>>>>, right: &Rc>>>>) -> Rc>>>> { - Rc::new(v2_rt::map_keys(&right)).iter().cloned().fold(left.clone(), |acc: Rc>>>>, type_name: String| match v2_rt::map_get(&right, type_name.clone()) { - Some(incoming) => { - let existing = match v2_rt::map_get(&acc, type_name.clone()) { - Some(fs) => fs.clone(), - None => Rc::new(vec![]), -}; -v2_rt::rc_map_insert(acc.clone(), type_name.clone(), v2_rt::concat(existing.clone(), incoming.clone())) -}, - None => acc.clone(), -}) + Some(fs) => fs.clone(), + None => Rc::new(vec![]), + }; + v2_rt::rc_map_insert( + fields.clone(), + type_name.clone(), + v2_rt::concat( + existing, + Rc::new(vec![Rc::new(InductiveField { + type_name: type_name.clone(), + variant_name: variant_name, + field_name: field_name, + shape: shape, + element_type: element_type, + })]), + ), + ) + } } -pub fn inductive_fields_list_to_map(fields: Rc>>) -> Rc>>>> { - fields.iter().cloned().fold(v2_rt::rc_empty_map::>>>(), |acc: Rc>>>>, field: Rc| { - let existing = match v2_rt::map_get(&acc, field.type_name.clone()) { - Some(fs) => fs.clone(), - None => Rc::new(vec![]), -}; -v2_rt::rc_map_insert(acc.clone(), field.type_name.clone(), v2_rt::concat(existing.clone(), Rc::new(vec![field.clone()]))) -}) +pub fn merge_inductive_fields( + left: Rc>>>>, + right: &Rc>>>>, +) -> Rc>>>> { + Rc::new(v2_rt::map_keys(&right)).iter().cloned().fold( + left.clone(), + |acc: Rc>>>>, type_name: String| { + match v2_rt::map_get(&right, type_name.clone()) { + Some(incoming) => { + let existing = match v2_rt::map_get(&acc, type_name.clone()) { + Some(fs) => fs.clone(), + None => Rc::new(vec![]), + }; + v2_rt::rc_map_insert( + acc.clone(), + type_name.clone(), + v2_rt::concat(existing.clone(), incoming.clone()), + ) + } + None => acc.clone(), + } + }, + ) +} + +pub fn inductive_fields_list_to_map( + fields: Rc>>, +) -> Rc>>>> { + fields.iter().cloned().fold( + v2_rt::rc_empty_map::>>>(), + |acc: Rc>>>>, field: Rc| { + let existing = match v2_rt::map_get(&acc, field.type_name.clone()) { + Some(fs) => fs.clone(), + None => Rc::new(vec![]), + }; + v2_rt::rc_map_insert( + acc.clone(), + field.type_name.clone(), + v2_rt::concat(existing.clone(), Rc::new(vec![field.clone()])), + ) + }, + ) } pub fn merge_envs(envs: &Rc>>) -> Rc { { - let merged_bindings = envs.clone().iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, env: Rc| v2_rt::rc_map_merge(acc, env.bindings.clone())); -let merged_recursive = envs.clone().iter().cloned().fold(Rc::new(vec![]), |acc: _, env: Rc| v2_rt::concat(acc, env.recursive_types.clone())); -let merged_recursive_set = envs.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, env: Rc| v2_rt::rc_map_merge(acc, env.recursive_type_set.clone())); -let merged_inductive_fields = envs.clone().iter().cloned().fold(v2_rt::rc_empty_map::>>>(), |acc: Rc>>>>, env: Rc| merge_inductive_fields(acc, &env.inductive_fields.clone())); -let merged_source_indices = envs.clone().iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, env: Rc| v2_rt::rc_map_merge(acc, env.source_indices.clone())); -let merged_intern_table = match envs.clone().first().cloned() { - Some(first_env) => first_env.intern_table.clone(), - None => empty_intern_table(), -}; -Rc::new(TypeEnv { - bindings: merged_bindings, - recursive_types: merged_recursive, - recursive_type_set: merged_recursive_set, - inductive_fields: merged_inductive_fields, - source_indices: merged_source_indices, - intern_table: merged_intern_table, -}) -} + let merged_bindings = envs.clone().iter().cloned().fold( + v2_rt::rc_empty_map::>(), + |acc: Rc>>, env: Rc| { + v2_rt::rc_map_merge(acc, env.bindings.clone()) + }, + ); + let merged_recursive = envs + .clone() + .iter() + .cloned() + .fold(Rc::new(vec![]), |acc: _, env: Rc| { + v2_rt::concat(acc, env.recursive_types.clone()) + }); + let merged_recursive_set = envs.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, env: Rc| { + v2_rt::rc_map_merge(acc, env.recursive_type_set.clone()) + }, + ); + let merged_inductive_fields = envs.clone().iter().cloned().fold( + v2_rt::rc_empty_map::>>>(), + |acc: Rc>>>>, env: Rc| { + merge_inductive_fields(acc, &env.inductive_fields.clone()) + }, + ); + let merged_source_indices = envs.clone().iter().cloned().fold( + v2_rt::rc_empty_map::>(), + |acc: Rc>>, env: Rc| { + v2_rt::rc_map_merge(acc, env.source_indices.clone()) + }, + ); + let merged_intern_table = match envs.clone().first().cloned() { + Some(first_env) => first_env.intern_table.clone(), + None => empty_intern_table(), + }; + Rc::new(TypeEnv { + bindings: merged_bindings, + recursive_types: merged_recursive, + recursive_type_set: merged_recursive_set, + inductive_fields: merged_inductive_fields, + source_indices: merged_source_indices, + intern_table: merged_intern_table, + }) + } } diff --git a/src/v2/stage0/src/v2_compiler_infer_items.rs b/src/v2/stage0/src/v2_compiler_infer_items.rs index 774ee8dfc9e..59c2ce01482 100644 --- a/src/v2/stage0/src/v2_compiler_infer_items.rs +++ b/src/v2/stage0/src/v2_compiler_infer_items.rs @@ -1,23 +1,27 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.infer_items -use std::collections::HashMap; -use std::rc::Rc; +use self::ItemKind::*; +pub use crate::std_induction::SubValueRelation; +use crate::std_induction::SubValueRelation::SubValueUnknown; +pub use crate::std_types::SourceSpan; +pub use crate::v2_compiler_infer_emit_info::EmitGraphInfo; +pub use crate::v2_compiler_infer_env::{TypeBinding, TypeEnv}; +pub use crate::v2_compiler_infer_sigs::ResolvedFuncEnv; +pub use crate::v2_compiler_infer_types::child_type_node; use crate::v2_rt; -use crate::NonEmptyVec; -use crate::NonEmptyBTreeSet; -pub use crate::std_types::{SourceSpan}; -pub use crate::v2_std_core::{Node, ErrorNode, make_param_node, param_node_name_at, param_node_type_expr, make_field_node, InferredNode, Cardinality, expr_has_self_call, expr_has_non_tail_self_call, Connective, node_name_span, no_span, NewlineIndex, authored_name_at}; -use crate::v2_std_core::InferredNode::{Resolved, CompilerError, TypeVariable}; -use crate::v2_std_core::Cardinality::{Required}; +use crate::v2_std_core::Cardinality::Required; use crate::v2_std_core::Connective::{Conj, Disj, NoConnective}; -pub use crate::v2_compiler_infer_types::{child_type_node}; -pub use crate::std_induction::{SubValueRelation}; -use crate::std_induction::SubValueRelation::{SubValueUnknown}; -pub use crate::v2_compiler_infer_env::{TypeEnv, TypeBinding}; -pub use crate::v2_compiler_infer_sigs::{ResolvedFuncEnv}; -pub use crate::v2_compiler_infer_emit_info::{EmitGraphInfo}; -use self::ItemKind::*; +use crate::v2_std_core::InferredNode::{CompilerError, Resolved, TypeVariable}; +pub use crate::v2_std_core::{ + authored_name_at, expr_has_non_tail_self_call, expr_has_self_call, make_field_node, + make_param_node, no_span, node_name_span, param_node_name_at, param_node_type_expr, + Cardinality, Connective, ErrorNode, InferredNode, NewlineIndex, Node, +}; +use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; #[derive(Debug, Clone, Copy, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] @@ -66,46 +70,92 @@ pub struct ResolvedGraph { pub emit_graph_info: Rc, } -pub fn inferred_to_outputs(inferred: &Option>, span: Rc, source_indices: Rc>>) -> Rc>> { +pub fn inferred_to_outputs( + inferred: &Option>, + span: Rc, + source_indices: Rc>>, +) -> Rc>> { if (inferred.clone() == None) { Rc::new(vec![]) } else { match (*inferred.clone().unwrap()).clone() { - InferredNode::CompilerError { .. } => Rc::new(vec![]), - InferredNode::TypeVariable { .. } => Rc::new(vec![]), - InferredNode::Resolved { node: rt, .. } => { - let has_structure = (rt.connective.clone() != Connective::NoConnective); -if has_structure { - { - let is_product = (rt.connective.clone() == Connective::Conj); -if is_product { - if (rt.ident_span.clone() == None) { - Rc::new({ let mut __result = Vec::new(); for child in rt.children.clone().iter().cloned() { __result.push({ - let child_type = child_type_node(&child); -make_field_node(&authored_name_at(source_indices.clone(), &child), child_type.clone(), Cardinality::Required, None, None, span.clone(), node_name_span(&child)) -}); } __result }) + InferredNode::CompilerError { .. } => Rc::new(vec![]), + InferredNode::TypeVariable { .. } => Rc::new(vec![]), + InferredNode::Resolved { node: rt, .. } => { + let has_structure = (rt.connective.clone() != Connective::NoConnective); + if has_structure { + { + let is_product = (rt.connective.clone() == Connective::Conj); + if is_product { + if (rt.ident_span.clone() == None) { + Rc::new({ + let mut __result = Vec::new(); + for child in rt.children.clone().iter().cloned() { + __result.push({ + let child_type = child_type_node(&child); + make_field_node( + &authored_name_at(source_indices.clone(), &child), + child_type.clone(), + Cardinality::Required, + None, + None, + span.clone(), + node_name_span(&child), + ) + }); + } + __result + }) + } else { + Rc::new(vec![make_field_node( + &"value".to_string(), + rt.clone(), + Cardinality::Required, + None, + None, + span.clone(), + no_span(), + )]) + } } else { - Rc::new(vec![make_field_node(&"value".to_string(), rt.clone(), Cardinality::Required, None, None, span.clone(), no_span())]) + Rc::new(vec![make_field_node( + &"value".to_string(), + rt.clone(), + Cardinality::Required, + None, + None, + span.clone(), + no_span(), + )]) } - } else { - Rc::new(vec![make_field_node(&"value".to_string(), rt.clone(), Cardinality::Required, None, None, span.clone(), no_span())]) } -} - } else { - if ((rt.connective.clone() == Connective::Conj) && ((rt.children.clone().len() as i64) == 0)) { - Rc::new(vec![]) } else { - Rc::new(vec![make_field_node(&"value".to_string(), rt.clone(), Cardinality::Required, None, None, span.clone(), no_span())]) + if ((rt.connective.clone() == Connective::Conj) + && ((rt.children.clone().len() as i64) == 0)) + { + Rc::new(vec![]) + } else { + Rc::new(vec![make_field_node( + &"value".to_string(), + rt.clone(), + Cardinality::Required, + None, + None, + span.clone(), + no_span(), + )]) + } } } -}, -} + } } } pub fn item_kind(item: &Rc) -> ItemKind { { - let kind = if ((item.connective.clone() != Connective::NoConnective) && (item.transport.clone() == None)) { + let kind = if ((item.connective.clone() != Connective::NoConnective) + && (item.transport.clone() == None)) + { ItemKind::TypeItem } else { if (item.transport.clone() != None) { @@ -130,24 +180,38 @@ pub fn item_kind(item: &Rc) -> ItemKind { } } }; -kind -} + kind + } } -pub fn variant_locals_from_items(items: Rc>>, init: Rc>>, source_indices: Rc>>) -> Rc>> { - items.iter().cloned().fold(init, |acc: Rc>>, item: Rc| { - let is_coproduct = (item.connective.clone() == Connective::Disj); -if is_coproduct.clone() { - item.children.clone().iter().cloned().fold(acc.clone(), |vacc: Rc>>, child: Rc| { - let child_name = authored_name_at(source_indices.clone(), &child); -v2_rt::rc_map_insert(vacc, child_name.clone(), Rc::new(TypeBinding { - name: child_name.clone(), - resolved: item.clone(), - provenance: Rc::new(SubValueRelation::SubValueUnknown), -})) -}) - } else { - acc.clone() - } -}) +pub fn variant_locals_from_items( + items: Rc>>, + init: Rc>>, + source_indices: Rc>>, +) -> Rc>> { + items.iter().cloned().fold( + init, + |acc: Rc>>, item: Rc| { + let is_coproduct = (item.connective.clone() == Connective::Disj); + if is_coproduct.clone() { + item.children.clone().iter().cloned().fold( + acc.clone(), + |vacc: Rc>>, child: Rc| { + let child_name = authored_name_at(source_indices.clone(), &child); + v2_rt::rc_map_insert( + vacc, + child_name.clone(), + Rc::new(TypeBinding { + name: child_name.clone(), + resolved: item.clone(), + provenance: Rc::new(SubValueRelation::SubValueUnknown), + }), + ) + }, + ) + } else { + acc.clone() + } + }, + ) } diff --git a/src/v2/stage0/src/v2_compiler_infer_lookup.rs b/src/v2/stage0/src/v2_compiler_infer_lookup.rs index 8acb05ae1b6..9b5cdb6a1fc 100644 --- a/src/v2/stage0/src/v2_compiler_infer_lookup.rs +++ b/src/v2/stage0/src/v2_compiler_infer_lookup.rs @@ -1,34 +1,53 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.infer_lookup -use std::collections::HashMap; -use std::rc::Rc; -use crate::v2_rt; -use crate::NonEmptyVec; -use crate::NonEmptyBTreeSet; -pub use crate::v2_std_core::{Node, param_node_type_expr, authored_name_at, NewlineIndex, find_child_named, has_child_named, InferredNode, Cardinality, MethodSemantics, FieldAccessStyle, FieldValueShape, FieldSummary, with_optional_cardinality, with_required_cardinality, Connective, ErrorNode}; -use crate::v2_std_core::InferredNode::{Resolved, TypeVariable}; -use crate::v2_std_core::Cardinality::{Required, CardOptional}; -use crate::v2_std_core::MethodSemantics::{PlainMethodSemantics, AlgebraMethodSemantics, ServiceMethodSemantics}; -use crate::v2_std_core::FieldAccessStyle::{OptionalUnwrap}; -use crate::v2_std_core::FieldValueShape::{PlainValue, OptionalValue}; -use crate::v2_std_core::Connective::{Conj, Disj, NoConnective}; -pub use crate::std_algebra::{CollectionSizeEffect, CostShape, AlgebraFieldTemplate, AlgebraTypeTemplate, ContainerSource, kernel_algebra_profile, algebra_templates_for_profile}; -use crate::std_algebra::AlgebraTypeTemplate::{ReceiverSelf, ContainerOf}; -use crate::std_algebra::ContainerSource::{SameAsReceiver, Named}; +use crate::std_algebra::AlgebraTypeTemplate::{ContainerOf, ReceiverSelf}; use crate::std_algebra::CollectionSizeEffect::*; +use crate::std_algebra::ContainerSource::{Named, SameAsReceiver}; use crate::std_algebra::CostShape::*; -pub use crate::v2_compiler_infer_types::{child_type_node, nominal_type_ref, normalize_access_type_node, node_is_keyed_collection, method_receiver_element_node, emit_map_has, enrich_kernel_type}; -pub use crate::v2_compiler_infer_env::{TypeEnv, TypeBinding, authored_name, is_recursive_type, lookup_type, lookup_type_for}; -pub use crate::v2_compiler_infer_emit_info::{build_struct_field_summaries, build_enum_field_summaries}; -pub use crate::v2_compiler_infer_sigs::{ResolvedFuncSig, ResolvedFuncEnv}; -pub use crate::v2_compiler_infer_service::{OpEntry, ServiceMethodResult, check_service_method_call_node}; +pub use crate::std_algebra::{ + algebra_templates_for_profile, kernel_algebra_profile, AlgebraFieldTemplate, + AlgebraTypeTemplate, CollectionSizeEffect, ContainerSource, CostShape, +}; +pub use crate::v2_compiler_infer_emit_info::{ + build_enum_field_summaries, build_struct_field_summaries, +}; +pub use crate::v2_compiler_infer_env::{ + authored_name, is_recursive_type, lookup_type, lookup_type_for, TypeBinding, TypeEnv, +}; +pub use crate::v2_compiler_infer_service::{ + check_service_method_call_node, OpEntry, ServiceMethodResult, +}; +pub use crate::v2_compiler_infer_sigs::{ResolvedFuncEnv, ResolvedFuncSig}; +pub use crate::v2_compiler_infer_types::{ + child_type_node, emit_map_has, enrich_kernel_type, method_receiver_element_node, + node_is_keyed_collection, nominal_type_ref, normalize_access_type_node, +}; +use crate::v2_rt; +use crate::v2_std_core::Cardinality::{CardOptional, Required}; +use crate::v2_std_core::Connective::{Conj, Disj, NoConnective}; +use crate::v2_std_core::FieldAccessStyle::OptionalUnwrap; +use crate::v2_std_core::FieldValueShape::{OptionalValue, PlainValue}; +use crate::v2_std_core::InferredNode::{Resolved, TypeVariable}; +use crate::v2_std_core::MethodSemantics::{ + AlgebraMethodSemantics, PlainMethodSemantics, ServiceMethodSemantics, +}; +pub use crate::v2_std_core::{ + authored_name_at, find_child_named, has_child_named, param_node_type_expr, + with_optional_cardinality, with_required_cardinality, Cardinality, Connective, ErrorNode, + FieldAccessStyle, FieldSummary, FieldValueShape, InferredNode, MethodSemantics, NewlineIndex, + Node, +}; +use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; pub fn is_type_variable(inferred: Rc) -> bool { match (*inferred).clone() { - InferredNode::TypeVariable { .. } => true, - _ => false, -} + InferredNode::TypeVariable { .. } => true, + _ => false, + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -38,221 +57,296 @@ pub struct KnownMethodResolution { pub diagnostics: Rc>>, } -pub fn lookup_in_scope(locals: Rc>>, name: String) -> Option> { +pub fn lookup_in_scope( + locals: Rc>>, + name: String, +) -> Option> { match v2_rt::map_get(&locals, name) { - Some(binding) => Some(binding.resolved.clone()), - None => None, -} + Some(binding) => Some(binding.resolved.clone()), + None => None, + } } pub fn lookup_func_sig(func_env: Rc, name: String) -> Option> { v2_rt::map_get(&func_env.signatures.clone(), name) } -pub fn lookup_field_type_node(n: &Rc, field_name: &String, source_indices: Rc>>) -> Option> { +pub fn lookup_field_type_node( + n: &Rc, + field_name: &String, + source_indices: Rc>>, +) -> Option> { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - { - let is_optional = (n.return_cardinality.clone() == Cardinality::CardOptional); -if is_optional { - { - let inner = with_required_cardinality(&n); -if (field_name.clone().as_str() == "value".to_string().as_str()) { - Some(inner) - } else { - match lookup_field_type_node(&inner, &field_name, source_indices) { - Some(inner_result) => Some(with_optional_cardinality(&inner_result)), - None => None, -} + let is_optional = (n.return_cardinality.clone() == Cardinality::CardOptional); + if is_optional { + { + let inner = with_required_cardinality(&n); + if (field_name.clone().as_str() == "value".to_string().as_str()) { + Some(inner) + } else { + match lookup_field_type_node(&inner, &field_name, source_indices) { + Some(inner_result) => Some(with_optional_cardinality(&inner_result)), + None => None, } -} - } else { - { - let has_structure = (n.connective.clone() != Connective::NoConnective); -if has_structure { - { - let is_product = (n.connective.clone() == Connective::Conj); -if is_product { - match find_child_named(n.clone(), field_name.clone(), source_indices) { - Some(field_child) => Some(child_type_node(&field_child)), - None => None, -} - } else { - lookup_coproduct_common_field_node(&n.children.clone(), &field_name, &source_indices) + } + } + } else { + { + let has_structure = (n.connective.clone() != Connective::NoConnective); + if has_structure { + { + let is_product = (n.connective.clone() == Connective::Conj); + if is_product { + match find_child_named(n.clone(), field_name.clone(), source_indices) { + Some(field_child) => Some(child_type_node(&field_child)), + None => None, } -} - } else { - None + } else { + lookup_coproduct_common_field_node( + &n.children.clone(), + &field_name, + &source_indices, + ) + } } -} + } else { + None + } } -} + } }) } -pub fn lookup_coproduct_common_field_node(variants: &Rc>>, field_name: &String, source_indices: &Rc>>) -> Option> { +pub fn lookup_coproduct_common_field_node( + variants: &Rc>>, + field_name: &String, + source_indices: &Rc>>, +) -> Option> { { - let found_in_all = { let mut __all = true; for v in variants.clone().iter().cloned() { if !(has_child_named(v.clone(), field_name.clone(), source_indices.clone())) { __all = false; break; } } __all }; -let first_field = if found_in_all { + let found_in_all = { + let mut __all = true; + for v in variants.clone().iter().cloned() { + if !(has_child_named(v.clone(), field_name.clone(), source_indices.clone())) { + __all = false; + break; + } + } + __all + }; + let first_field = if found_in_all { match variants.clone().first().cloned() { - Some(first_variant) => find_child_named(first_variant.clone(), field_name.clone(), source_indices.clone()), - None => None, -} + Some(first_variant) => find_child_named( + first_variant.clone(), + field_name.clone(), + source_indices.clone(), + ), + None => None, + } } else { None }; -match first_field { - Some(field_child) => Some(child_type_node(&field_child)), - None => None, -} -} + match first_field { + Some(field_child) => Some(child_type_node(&field_child)), + None => None, + } + } } pub fn resolve_scrutinee_type_node(env: Rc, n: Rc) -> Rc { resolve_scrutinee_type_node_seen(&env, n, &v2_rt::rc_empty_map::()) } -pub fn resolve_scrutinee_type_node_seen(env: &Rc, n: Rc, seen: &Rc>) -> Rc { +pub fn resolve_scrutinee_type_node_seen( + env: &Rc, + n: Rc, + seen: &Rc>, +) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { + let n_is_type_var = if (n.inferred.clone() != None) { + is_type_variable(n.inferred.clone().clone().unwrap()) + } else { + false + }; + if n_is_type_var { + return n.clone(); + } + let normed = normalize_access_type_node(n.clone()); + if ((normed.connective.clone() == Connective::NoConnective) + && ((normed.children.clone().len() as i64) == 0)) { - let n_is_type_var = if (n.inferred.clone() != None) { - is_type_variable(n.inferred.clone().clone().unwrap()) - } else { - false - }; -if n_is_type_var { - return n.clone() - } -let normed = normalize_access_type_node(n.clone()); -if ((normed.connective.clone() == Connective::NoConnective) && ((normed.children.clone().len() as i64) == 0)) { - { - let canonical = authored_name(env.clone(), normed.clone()); -if (normed.inferred.clone() != None) { - { - let next_seen = if (canonical.clone().as_str() == "".to_string().as_str()) { - seen.clone() - } else { - v2_rt::rc_map_insert(seen.clone(), canonical.clone(), true) - }; -match normed.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: target, .. }) => if ((((authored_name(env.clone(), target.clone()).as_str() == canonical.clone().as_str()) && (target.inferred.clone() == None)) && (target.connective.clone() == Connective::NoConnective)) && ((target.children.clone().len() as i64) == 0)) { - normed.clone() - } else { - resolve_scrutinee_type_node_seen(&env, target.clone(), &next_seen) - }, - _ => normed.clone(), -} -} - } else { - if ((canonical.clone().as_str() != "".to_string().as_str()) && emit_map_has(seen.clone(), canonical.clone())) { - nominal_type_ref(&canonical) + { + let canonical = authored_name(env.clone(), normed.clone()); + if (normed.inferred.clone() != None) { + { + let next_seen = if (canonical.clone().as_str() == "".to_string().as_str()) { + seen.clone() } else { - { - let next_seen = if (canonical.clone().as_str() == "".to_string().as_str()) { + v2_rt::rc_map_insert(seen.clone(), canonical.clone(), true) + }; + match normed.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: target, .. }) => { + if ((((authored_name(env.clone(), target.clone()).as_str() + == canonical.clone().as_str()) + && (target.inferred.clone() == None)) + && (target.connective.clone() == Connective::NoConnective)) + && ((target.children.clone().len() as i64) == 0)) + { + normed.clone() + } else { + resolve_scrutinee_type_node_seen( + &env, + target.clone(), + &next_seen, + ) + } + } + _ => normed.clone(), + } + } + } else { + if ((canonical.clone().as_str() != "".to_string().as_str()) + && emit_map_has(seen.clone(), canonical.clone())) + { + nominal_type_ref(&canonical) + } else { + { + let next_seen = + if (canonical.clone().as_str() == "".to_string().as_str()) { seen.clone() } else { v2_rt::rc_map_insert(seen.clone(), canonical.clone(), true) }; -match lookup_type_for(&env, &normed) { - Some(resolved) => if ((((authored_name(env.clone(), resolved.clone()).as_str() == canonical.clone().as_str()) && (resolved.inferred.clone() == None)) && (resolved.connective.clone() == Connective::NoConnective)) && ((resolved.children.clone().len() as i64) == 0)) { - normed.clone() - } else { + match lookup_type_for(&env, &normed) { + Some(resolved) => { + if ((((authored_name(env.clone(), resolved.clone()).as_str() + == canonical.clone().as_str()) + && (resolved.inferred.clone() == None)) + && (resolved.connective.clone() + == Connective::NoConnective)) + && ((resolved.children.clone().len() as i64) == 0)) { - let result = resolve_scrutinee_type_node_seen(&env, resolved.clone(), &next_seen); -let is_optional = (normed.return_cardinality.clone() == Cardinality::CardOptional); -if is_optional { - with_optional_cardinality(&result) - } else { - result + normed.clone() + } else { + { + let result = resolve_scrutinee_type_node_seen( + &env, + resolved.clone(), + &next_seen, + ); + let is_optional = (normed.return_cardinality.clone() + == Cardinality::CardOptional); + if is_optional { + with_optional_cardinality(&result) + } else { + result + } } -} - }, - None => normed.clone(), -} -} + } + } + None => normed.clone(), + } } } -} - } else { - normed.clone() + } } -} + } else { + normed.clone() + } }) } pub fn map_value_type_in_env(type_node: Rc, env: &Rc) -> Option> { { let normed = normalize_access_type_node(type_node); -let resolved = resolve_scrutinee_type_node(env.clone(), normed); -let map_type = normalize_access_type_node(resolved); -if (node_is_keyed_collection(&map_type, env.source_indices.clone()) && ((map_type.children.clone().len() as i64) >= 2)) { + let resolved = resolve_scrutinee_type_node(env.clone(), normed); + let map_type = normalize_access_type_node(resolved); + if (node_is_keyed_collection(&map_type, env.source_indices.clone()) + && ((map_type.children.clone().len() as i64) >= 2)) + { match map_type.children.clone().get(1 as usize).cloned() { - Some(value_type) => Some(value_type.clone()), - None => None, -} + Some(value_type) => Some(value_type.clone()), + None => None, + } } else { None } -} + } } pub fn map_key_type_in_env(type_node: Rc, env: &Rc) -> Option> { { let normed = normalize_access_type_node(type_node); -let resolved = resolve_scrutinee_type_node(env.clone(), normed); -let map_type = normalize_access_type_node(resolved); -if (node_is_keyed_collection(&map_type, env.source_indices.clone()) && ((map_type.children.clone().len() as i64) >= 1)) { + let resolved = resolve_scrutinee_type_node(env.clone(), normed); + let map_type = normalize_access_type_node(resolved); + if (node_is_keyed_collection(&map_type, env.source_indices.clone()) + && ((map_type.children.clone().len() as i64) >= 1)) + { match map_type.children.clone().first().cloned() { - Some(key_type) => Some(key_type.clone()), - None => None, -} + Some(key_type) => Some(key_type.clone()), + None => None, + } } else { None } -} + } } -pub fn field_summary_for_type(base_type: Rc, env: &Rc, field: &String) -> Option> { +pub fn field_summary_for_type( + base_type: Rc, + env: &Rc, + field: &String, +) -> Option> { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - { - let resolved = resolve_scrutinee_type_node(env.clone(), base_type); -let normed = normalize_access_type_node(resolved.clone()); -let normed_opt = (normed.return_cardinality.clone() == Cardinality::CardOptional); -if ((field.clone().as_str() == "value".to_string().as_str()) && normed_opt.clone()) { - Some(Rc::new(FieldSummary { - access_style: FieldAccessStyle::OptionalUnwrap, - value_shape: FieldValueShape::PlainValue, -})) + let resolved = resolve_scrutinee_type_node(env.clone(), base_type); + let normed = normalize_access_type_node(resolved.clone()); + let normed_opt = (normed.return_cardinality.clone() == Cardinality::CardOptional); + if ((field.clone().as_str() == "value".to_string().as_str()) && normed_opt.clone()) { + Some(Rc::new(FieldSummary { + access_style: FieldAccessStyle::OptionalUnwrap, + value_shape: FieldValueShape::PlainValue, + })) + } else { + if normed_opt.clone() { + { + let inner = with_required_cardinality(&normed); + match field_summary_for_type(inner, &env, &field) { + Some(inner_summary) => Some(Rc::new(FieldSummary { + access_style: inner_summary.access_style.clone(), + value_shape: FieldValueShape::OptionalValue, + })), + None => None, + } + } } else { - if normed_opt.clone() { - { - let inner = with_required_cardinality(&normed); -match field_summary_for_type(inner, &env, &field) { - Some(inner_summary) => Some(Rc::new(FieldSummary { - access_style: inner_summary.access_style.clone(), - value_shape: FieldValueShape::OptionalValue, -})), - None => None, -} -} - } else { - { - let no_structure = (resolved.connective.clone() == Connective::NoConnective); -if no_structure { - None - } else { - { - let is_product = (resolved.connective.clone() == Connective::Conj); -if is_product { - v2_rt::map_get(&build_struct_field_summaries(&resolved, env.source_indices.clone()), field.clone()) - } else { - v2_rt::map_get(&build_enum_field_summaries(&resolved.children.clone(), env.source_indices.clone()), field.clone()) - } -} + { + let no_structure = (resolved.connective.clone() == Connective::NoConnective); + if no_structure { + None + } else { + { + let is_product = (resolved.connective.clone() == Connective::Conj); + if is_product { + v2_rt::map_get( + &build_struct_field_summaries( + &resolved, + env.source_indices.clone(), + ), + field.clone(), + ) + } else { + v2_rt::map_get( + &build_enum_field_summaries( + &resolved.children.clone(), + env.source_indices.clone(), + ), + field.clone(), + ) + } } -} + } } } -} + } }) } @@ -271,136 +365,199 @@ pub struct StructuralMethodLookup { pub kernel_diagnostics: Rc>>, } -pub fn lookup_field_in_product(product: Rc, method_name: String, source_indices: Rc>>) -> Option> { +pub fn lookup_field_in_product( + product: Rc, + method_name: String, + source_indices: Rc>>, +) -> Option> { { - let matching = Rc::new({ let mut __result = Vec::new(); for c in product.children.clone().iter().cloned() { if (authored_name_at(source_indices.clone(), &c).as_str() == method_name.clone().as_str()) { __result.push(c); } } __result }); -match matching.first().cloned() { - Some(field) => match field.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => if ((rt.params.clone().len() as i64) > 0) { - match rt.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: return_type, .. }) => Some(Rc::new(MethodFieldResult { - field_node: field.clone(), - result_type: return_type.clone(), - size_effect: None, - cost_shape: None, - algebra_template: None, -})), - _ => Some(Rc::new(MethodFieldResult { - field_node: field.clone(), - result_type: rt.clone(), - size_effect: None, - cost_shape: None, - algebra_template: None, -})), -} - } else { - Some(Rc::new(MethodFieldResult { - field_node: field.clone(), - result_type: rt.clone(), - size_effect: None, - cost_shape: None, - algebra_template: None, -})) - }, - _ => None, -}, - None => None, -} -} + let matching = Rc::new({ + let mut __result = Vec::new(); + for c in product.children.clone().iter().cloned() { + if (authored_name_at(source_indices.clone(), &c).as_str() + == method_name.clone().as_str()) + { + __result.push(c); + } + } + __result + }); + match matching.first().cloned() { + Some(field) => match field.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => { + if ((rt.params.clone().len() as i64) > 0) { + match rt.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { + node: return_type, .. + }) => Some(Rc::new(MethodFieldResult { + field_node: field.clone(), + result_type: return_type.clone(), + size_effect: None, + cost_shape: None, + algebra_template: None, + })), + _ => Some(Rc::new(MethodFieldResult { + field_node: field.clone(), + result_type: rt.clone(), + size_effect: None, + cost_shape: None, + algebra_template: None, + })), + } + } else { + Some(Rc::new(MethodFieldResult { + field_node: field.clone(), + result_type: rt.clone(), + size_effect: None, + cost_shape: None, + algebra_template: None, + })) + } + } + _ => None, + }, + None => None, + } + } } -pub fn lookup_structural_method(receiver_type: &Rc, method_name: &String, source_indices: &Rc>>) -> Rc { +pub fn lookup_structural_method( + receiver_type: &Rc, + method_name: &String, + source_indices: &Rc>>, +) -> Rc { { let is_product = (receiver_type.connective.clone() == Connective::Conj); -if is_product { + if is_product { { - let direct = lookup_field_in_product(receiver_type.clone(), method_name.clone(), source_indices.clone()); -Rc::new(StructuralMethodLookup { - resolution: direct, - kernel_diagnostics: Rc::new(vec![]), -}) -} + let direct = lookup_field_in_product( + receiver_type.clone(), + method_name.clone(), + source_indices.clone(), + ); + Rc::new(StructuralMethodLookup { + resolution: direct, + kernel_diagnostics: Rc::new(vec![]), + }) + } } else { { - let enriched = enrich_kernel_type(&authored_name_at(source_indices.clone(), &receiver_type), &receiver_type, source_indices.clone()); -if ((enriched.ty.clone().connective.clone() == Connective::Conj) && ((enriched.ty.clone().children.clone().len() as i64) > 0)) { + let enriched = enrich_kernel_type( + &authored_name_at(source_indices.clone(), &receiver_type), + &receiver_type, + source_indices.clone(), + ); + if ((enriched.ty.clone().connective.clone() == Connective::Conj) + && ((enriched.ty.clone().children.clone().len() as i64) > 0)) + { { - let base_result = lookup_field_in_product(enriched.ty.clone(), method_name.clone(), source_indices.clone()); -match base_result.clone() { - Some(mfr) => { - let profile = v2_rt::map_get(&kernel_algebra_profile(), authored_name_at(source_indices.clone(), &receiver_type)); -let template_match = match profile { - Some(p) => { - let templates = algebra_templates_for_profile(p.clone()); -Rc::new({ let mut __result = Vec::new(); for t in templates.iter().cloned() { if (t.name.clone().as_str() == method_name.clone().as_str()) { __result.push(t); } } __result }).first().cloned() -}, - None => None, -}; -let resolution = match template_match { - Some(t) => Some(Rc::new(MethodFieldResult { - field_node: mfr.field_node.clone(), - result_type: mfr.result_type.clone(), - size_effect: t.size_effect.clone(), - cost_shape: t.cost_shape.clone(), - algebra_template: Some(t.clone()), -})), - None => base_result.clone(), -}; -Rc::new(StructuralMethodLookup { - resolution: resolution, - kernel_diagnostics: enriched.diagnostics.clone(), -}) -}, - None => Rc::new(StructuralMethodLookup { - resolution: None, - kernel_diagnostics: enriched.diagnostics.clone(), -}), -} -} + let base_result = lookup_field_in_product( + enriched.ty.clone(), + method_name.clone(), + source_indices.clone(), + ); + match base_result.clone() { + Some(mfr) => { + let profile = v2_rt::map_get( + &kernel_algebra_profile(), + authored_name_at(source_indices.clone(), &receiver_type), + ); + let template_match = match profile { + Some(p) => { + let templates = algebra_templates_for_profile(p.clone()); + Rc::new({ + let mut __result = Vec::new(); + for t in templates.iter().cloned() { + if (t.name.clone().as_str() + == method_name.clone().as_str()) + { + __result.push(t); + } + } + __result + }) + .first() + .cloned() + } + None => None, + }; + let resolution = match template_match { + Some(t) => Some(Rc::new(MethodFieldResult { + field_node: mfr.field_node.clone(), + result_type: mfr.result_type.clone(), + size_effect: t.size_effect.clone(), + cost_shape: t.cost_shape.clone(), + algebra_template: Some(t.clone()), + })), + None => base_result.clone(), + }; + Rc::new(StructuralMethodLookup { + resolution: resolution, + kernel_diagnostics: enriched.diagnostics.clone(), + }) + } + None => Rc::new(StructuralMethodLookup { + resolution: None, + kernel_diagnostics: enriched.diagnostics.clone(), + }), + } + } } else { Rc::new(StructuralMethodLookup { - resolution: None, - kernel_diagnostics: enriched.diagnostics.clone(), -}) + resolution: None, + kernel_diagnostics: enriched.diagnostics.clone(), + }) } -} + } } -} + } } -pub fn resolve_known_method_node(receiver: Rc, receiver_type: &Rc, method_name: &String, fold_accumulator_type: Option>, service_registry: Rc>>>>, source_indices: &Rc>>) -> Rc { +pub fn resolve_known_method_node( + receiver: Rc, + receiver_type: &Rc, + method_name: &String, + fold_accumulator_type: Option>, + service_registry: Rc>>>>, + source_indices: &Rc>>, +) -> Rc { { let tier0 = lookup_structural_method(&receiver_type, &method_name, &source_indices); -match tier0.resolution.clone() { - Some(mfr) => { - let semantics = Rc::new(MethodSemantics::AlgebraMethodSemantics { - method_def: mfr.field_node.clone(), - fold_accumulator_type: fold_accumulator_type, - size_effect: mfr.size_effect.clone(), - cost_shape: mfr.cost_shape.clone(), - algebra_template: mfr.algebra_template.clone(), -}); -Rc::new(KnownMethodResolution { - semantics: Some(semantics), - result_type: Some(mfr.result_type.clone()), - diagnostics: tier0.kernel_diagnostics.clone(), -}) -}, - None => match check_service_method_call_node(&receiver_type, method_name.clone(), service_registry, source_indices.clone()) { - Some(svc_result) => Rc::new(KnownMethodResolution { - semantics: Some(Rc::new(MethodSemantics::ServiceMethodSemantics { - service_name: authored_name_at(source_indices.clone(), &receiver_type), - op_params: svc_result.op_params.clone(), -})), - result_type: Some(svc_result.result_type.clone()), - diagnostics: tier0.kernel_diagnostics.clone(), -}), - None => Rc::new(KnownMethodResolution { - semantics: None, - result_type: None, - diagnostics: tier0.kernel_diagnostics.clone(), -}), -}, -} -} + match tier0.resolution.clone() { + Some(mfr) => { + let semantics = Rc::new(MethodSemantics::AlgebraMethodSemantics { + method_def: mfr.field_node.clone(), + fold_accumulator_type: fold_accumulator_type, + size_effect: mfr.size_effect.clone(), + cost_shape: mfr.cost_shape.clone(), + algebra_template: mfr.algebra_template.clone(), + }); + Rc::new(KnownMethodResolution { + semantics: Some(semantics), + result_type: Some(mfr.result_type.clone()), + diagnostics: tier0.kernel_diagnostics.clone(), + }) + } + None => match check_service_method_call_node( + &receiver_type, + method_name.clone(), + service_registry, + source_indices.clone(), + ) { + Some(svc_result) => Rc::new(KnownMethodResolution { + semantics: Some(Rc::new(MethodSemantics::ServiceMethodSemantics { + service_name: authored_name_at(source_indices.clone(), &receiver_type), + op_params: svc_result.op_params.clone(), + })), + result_type: Some(svc_result.result_type.clone()), + diagnostics: tier0.kernel_diagnostics.clone(), + }), + None => Rc::new(KnownMethodResolution { + semantics: None, + result_type: None, + diagnostics: tier0.kernel_diagnostics.clone(), + }), + }, + } + } } diff --git a/src/v2/stage0/src/v2_compiler_infer_method.rs b/src/v2/stage0/src/v2_compiler_infer_method.rs index 18facf0ef9b..9112905ccf9 100644 --- a/src/v2/stage0/src/v2_compiler_infer_method.rs +++ b/src/v2/stage0/src/v2_compiler_infer_method.rs @@ -1,50 +1,58 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.infer_method -use std::collections::HashMap; -use std::rc::Rc; +pub use crate::std_types::SourceSpan; +pub use crate::v2_compiler_infer_types::{make_container_type, make_map_type}; use crate::v2_rt; -use crate::NonEmptyVec; +use crate::v2_std_core::Cardinality::Required; +use crate::v2_std_core::Connective::NoConnective; +use crate::v2_std_core::ExprData::NoExprData; +use crate::v2_std_core::InferredNode::{Resolved, TypeVariable}; +pub use crate::v2_std_core::{ + bool_type, int_type, make_span, string_type, unit_type, with_optional_cardinality, Cardinality, + Connective, ErrorNode, ExprData, InferredNode, Node, +}; use crate::NonEmptyBTreeSet; -pub use crate::std_types::{SourceSpan}; -pub use crate::v2_std_core::{Node, ErrorNode, make_span, with_optional_cardinality, unit_type, bool_type, string_type, int_type, InferredNode, Connective, Cardinality, ExprData}; -use crate::v2_std_core::InferredNode::{TypeVariable, Resolved}; -use crate::v2_std_core::Connective::{NoConnective}; -use crate::v2_std_core::Cardinality::{Required}; -use crate::v2_std_core::ExprData::{NoExprData}; -pub use crate::v2_compiler_infer_types::{make_container_type, make_map_type}; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; pub fn type_variable_node(id: String) -> Rc { Rc::new(Node { - name: "".to_string(), - span: make_span(0, 0), - ident_span: None, - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::TypeVariable { - id: id, -})), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}) + name: "".to_string(), + span: make_span(0, 0), + ident_span: None, + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::TypeVariable { id: id })), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }) } pub fn map_of_type_variables() -> Rc { - make_map_type(type_variable_node("map_key".to_string()), type_variable_node("map_value".to_string())).ty.clone() + make_map_type( + type_variable_node("map_key".to_string()), + type_variable_node("map_value".to_string()), + ) + .ty + .clone() } pub fn list_of_type_variable(id: String) -> Rc { - make_container_type(&"List".to_string(), type_variable_node(id)).ty.clone() + make_container_type(&"List".to_string(), type_variable_node(id)) + .ty + .clone() } pub fn list_of_element(element: Rc) -> Rc { @@ -56,41 +64,86 @@ pub fn seed_node_map(key: String, value: Rc) -> Rc Rc>> { - v2_rt::concat(make_map_type(type_variable_node("map_key".to_string()), type_variable_node("map_value".to_string())).diagnostics.clone(), make_container_type(&"List".to_string(), type_variable_node("collection_element".to_string())).diagnostics.clone()) + v2_rt::concat( + make_map_type( + type_variable_node("map_key".to_string()), + type_variable_node("map_value".to_string()), + ) + .diagnostics + .clone(), + make_container_type( + &"List".to_string(), + type_variable_node("collection_element".to_string()), + ) + .diagnostics + .clone(), + ) } pub fn builtin_function_registry() -> Rc>> { { let m = seed_node_map("count".to_string(), int_type()); -let m = v2_rt::rc_map_insert(m.clone(), "string_length".to_string(), int_type()); -let m = v2_rt::rc_map_insert(m.clone(), "code_point".to_string(), int_type()); -let m = v2_rt::rc_map_insert(m.clone(), "to_int".to_string(), int_type()); -let m = v2_rt::rc_map_insert(m.clone(), "scan_while".to_string(), int_type()); -let m = v2_rt::rc_map_insert(m.clone(), "scan_string_end".to_string(), int_type()); -let m = v2_rt::rc_map_insert(m.clone(), "scan_to_eol".to_string(), int_type()); -let m = v2_rt::rc_map_insert(m.clone(), "skip_horizontal_ws".to_string(), int_type()); -let m = v2_rt::rc_map_insert(m.clone(), "parse_int".to_string(), with_optional_cardinality(&int_type())); -let m = v2_rt::rc_map_insert(m.clone(), "char_at".to_string(), string_type()); -let m = v2_rt::rc_map_insert(m.clone(), "substring".to_string(), string_type()); -let m = v2_rt::rc_map_insert(m.clone(), "from_code_point".to_string(), string_type()); -let m = v2_rt::rc_map_insert(m.clone(), "chars_to_string".to_string(), string_type()); -let m = v2_rt::rc_map_insert(m.clone(), "to_string".to_string(), string_type()); -let m = v2_rt::rc_map_insert(m.clone(), "concat".to_string(), string_type()); -let m = v2_rt::rc_map_insert(m.clone(), "map_insert".to_string(), map_of_type_variables()); -let m = v2_rt::rc_map_insert(m.clone(), "map_merge".to_string(), map_of_type_variables()); -let m = v2_rt::rc_map_insert(m.clone(), "with".to_string(), map_of_type_variables()); -let m = v2_rt::rc_map_insert(m.clone(), "map_contains_key".to_string(), bool_type()); -let m = v2_rt::rc_map_insert(m.clone(), "map_has".to_string(), bool_type()); -let m = v2_rt::rc_map_insert(m.clone(), "emit_map_has".to_string(), bool_type()); -let m = v2_rt::rc_map_insert(m.clone(), "lookup".to_string(), with_optional_cardinality(&type_variable_node("map_value".to_string()))); -let m = v2_rt::rc_map_insert(m.clone(), "map_get".to_string(), with_optional_cardinality(&type_variable_node("map_value".to_string()))); -let m = v2_rt::rc_map_insert(m.clone(), "Some".to_string(), with_optional_cardinality(&type_variable_node("some_inner".to_string()))); -let m = v2_rt::rc_map_insert(m.clone(), "map_keys".to_string(), list_of_type_variable("collection_element".to_string())); -let m = v2_rt::rc_map_insert(m.clone(), "map_values".to_string(), list_of_type_variable("collection_element".to_string())); -let m = v2_rt::rc_map_insert(m.clone(), "reverse".to_string(), list_of_type_variable("collection_element".to_string())); -let m = v2_rt::rc_map_insert(m.clone(), "list_push".to_string(), list_of_type_variable("collection_element".to_string())); -m.clone() -} + let m = v2_rt::rc_map_insert(m.clone(), "string_length".to_string(), int_type()); + let m = v2_rt::rc_map_insert(m.clone(), "code_point".to_string(), int_type()); + let m = v2_rt::rc_map_insert(m.clone(), "to_int".to_string(), int_type()); + let m = v2_rt::rc_map_insert(m.clone(), "scan_while".to_string(), int_type()); + let m = v2_rt::rc_map_insert(m.clone(), "scan_string_end".to_string(), int_type()); + let m = v2_rt::rc_map_insert(m.clone(), "scan_to_eol".to_string(), int_type()); + let m = v2_rt::rc_map_insert(m.clone(), "skip_horizontal_ws".to_string(), int_type()); + let m = v2_rt::rc_map_insert( + m.clone(), + "parse_int".to_string(), + with_optional_cardinality(&int_type()), + ); + let m = v2_rt::rc_map_insert(m.clone(), "char_at".to_string(), string_type()); + let m = v2_rt::rc_map_insert(m.clone(), "substring".to_string(), string_type()); + let m = v2_rt::rc_map_insert(m.clone(), "from_code_point".to_string(), string_type()); + let m = v2_rt::rc_map_insert(m.clone(), "chars_to_string".to_string(), string_type()); + let m = v2_rt::rc_map_insert(m.clone(), "to_string".to_string(), string_type()); + let m = v2_rt::rc_map_insert(m.clone(), "concat".to_string(), string_type()); + let m = v2_rt::rc_map_insert(m.clone(), "map_insert".to_string(), map_of_type_variables()); + let m = v2_rt::rc_map_insert(m.clone(), "map_merge".to_string(), map_of_type_variables()); + let m = v2_rt::rc_map_insert(m.clone(), "with".to_string(), map_of_type_variables()); + let m = v2_rt::rc_map_insert(m.clone(), "map_contains_key".to_string(), bool_type()); + let m = v2_rt::rc_map_insert(m.clone(), "map_has".to_string(), bool_type()); + let m = v2_rt::rc_map_insert(m.clone(), "emit_map_has".to_string(), bool_type()); + let m = v2_rt::rc_map_insert( + m.clone(), + "lookup".to_string(), + with_optional_cardinality(&type_variable_node("map_value".to_string())), + ); + let m = v2_rt::rc_map_insert( + m.clone(), + "map_get".to_string(), + with_optional_cardinality(&type_variable_node("map_value".to_string())), + ); + let m = v2_rt::rc_map_insert( + m.clone(), + "Some".to_string(), + with_optional_cardinality(&type_variable_node("some_inner".to_string())), + ); + let m = v2_rt::rc_map_insert( + m.clone(), + "map_keys".to_string(), + list_of_type_variable("collection_element".to_string()), + ); + let m = v2_rt::rc_map_insert( + m.clone(), + "map_values".to_string(), + list_of_type_variable("collection_element".to_string()), + ); + let m = v2_rt::rc_map_insert( + m.clone(), + "reverse".to_string(), + list_of_type_variable("collection_element".to_string()), + ); + let m = v2_rt::rc_map_insert( + m.clone(), + "list_push".to_string(), + list_of_type_variable("collection_element".to_string()), + ); + m.clone() + } } pub fn infer_builtin_call_type(name: String) -> Option> { @@ -99,7 +152,7 @@ pub fn infer_builtin_call_type(name: String) -> Option> { pub fn resolve_builtin_call_type(name: String) -> Rc { match infer_builtin_call_type(name) { - Some(v) => v.clone(), - None => unit_type(), -} + Some(v) => v.clone(), + None => unit_type(), + } } diff --git a/src/v2/stage0/src/v2_compiler_infer_patterns.rs b/src/v2/stage0/src/v2_compiler_infer_patterns.rs index 54c48623cc0..4bcb95f3031 100644 --- a/src/v2/stage0/src/v2_compiler_infer_patterns.rs +++ b/src/v2/stage0/src/v2_compiler_infer_patterns.rs @@ -1,24 +1,31 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.infer_patterns -use std::collections::HashMap; -use std::rc::Rc; -use crate::v2_rt; -use crate::NonEmptyVec; -use crate::NonEmptyBTreeSet; -pub use crate::std_types::{SourceSpan}; -pub use crate::v2_std_core::{Node, find_child_named, NewlineIndex, authored_name_at, ExprData, InferredNode, is_compiler_error, Cardinality, Connective, ErrorNode, make_error_node, MatchPattern, arm_pattern, LiteralValue, with_optional_cardinality, none_type, error_type, no_span, kernel_span, CompilerDiagnostic}; -use crate::v2_std_core::ExprData::{NoExprData}; -use crate::v2_std_core::InferredNode::{Resolved, CompilerError, TypeVariable}; -use crate::v2_std_core::Cardinality::{Required, CardOptional}; -use crate::v2_std_core::Connective::{Disj, NoConnective}; -use crate::v2_std_core::CompilerDiagnostic::{VariantNotFound, FieldNotFound, NonExhaustiveMatch}; -use crate::v2_std_core::MatchPattern::{LitPattern}; -use crate::v2_std_core::LiteralValue::{LitBool}; -pub use crate::v2_compiler_infer_types::{child_type_node, extract_optional_inner_node, emit_map_has}; -pub use crate::v2_compiler_infer_env::{TypeEnv, lookup_type, lookup_type_by_name}; use self::NodeLookupStatus::*; use self::PatternSubject::*; +pub use crate::std_types::SourceSpan; +pub use crate::v2_compiler_infer_env::{lookup_type, lookup_type_by_name, TypeEnv}; +pub use crate::v2_compiler_infer_types::{ + child_type_node, emit_map_has, extract_optional_inner_node, +}; +use crate::v2_rt; +use crate::v2_std_core::Cardinality::{CardOptional, Required}; +use crate::v2_std_core::CompilerDiagnostic::{FieldNotFound, NonExhaustiveMatch, VariantNotFound}; +use crate::v2_std_core::Connective::{Disj, NoConnective}; +use crate::v2_std_core::ExprData::NoExprData; +use crate::v2_std_core::InferredNode::{CompilerError, Resolved, TypeVariable}; +use crate::v2_std_core::LiteralValue::LitBool; +use crate::v2_std_core::MatchPattern::LitPattern; +pub use crate::v2_std_core::{ + arm_pattern, authored_name_at, error_type, find_child_named, is_compiler_error, kernel_span, + make_error_node, no_span, none_type, with_optional_cardinality, Cardinality, + CompilerDiagnostic, Connective, ErrorNode, ExprData, InferredNode, LiteralValue, MatchPattern, + NewlineIndex, Node, +}; +use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] pub struct NodeLookupResult { @@ -29,9 +36,7 @@ pub struct NodeLookupResult { #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum NodeLookupStatus { - LookupResolved { - node: Rc, - }, + LookupResolved { node: Rc }, LookupFailed, } impl NodeLookupStatus { @@ -46,69 +51,63 @@ impl NodeLookupStatus { #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum PatternSubject { - PatternResolved { - node: Rc, - }, - PatternDynamic { - span: Rc, - }, + PatternResolved { node: Rc }, + PatternDynamic { span: Rc }, PatternLookupBlocked, } pub fn is_type_variable(inferred: Rc) -> bool { match (*inferred).clone() { - InferredNode::TypeVariable { .. } => true, - _ => false, -} + InferredNode::TypeVariable { .. } => true, + _ => false, + } } pub fn synthesize_optional_some_variant(scrut: &Rc) -> Rc { { let inner = extract_optional_inner_node(&scrut); -let value_field = Rc::new(Node { - name: "value".to_string(), - span: scrut.span.clone(), - ident_span: Some(kernel_span(&"value".to_string())), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::Resolved { - node: inner, -})), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -let some_node = Rc::new(Node { - name: "Some".to_string(), - span: scrut.span.clone(), - ident_span: Some(kernel_span(&"Some".to_string())), - children: Rc::new(vec![value_field]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -some_node -} + let value_field = Rc::new(Node { + name: "value".to_string(), + span: scrut.span.clone(), + ident_span: Some(kernel_span(&"value".to_string())), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::Resolved { node: inner })), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + let some_node = Rc::new(Node { + name: "Some".to_string(), + span: scrut.span.clone(), + ident_span: Some(kernel_span(&"Some".to_string())), + children: Rc::new(vec![value_field]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + some_node + } } pub fn pattern_subject_from_node(n: &Rc) -> Rc { @@ -118,179 +117,290 @@ pub fn pattern_subject_from_node(n: &Rc) -> Rc { } else { false }; -if is_error { + if is_error { Rc::new(PatternSubject::PatternLookupBlocked) } else { - Rc::new(PatternSubject::PatternResolved { - node: n.clone(), -}) + Rc::new(PatternSubject::PatternResolved { node: n.clone() }) } -} + } } pub fn pattern_subject_from_inferred(n: Option>) -> Rc { match n.as_deref().cloned() { - Some(InferredNode::Resolved { node: resolved, .. }) => pattern_subject_from_node(&resolved), - _ => Rc::new(PatternSubject::PatternLookupBlocked), -} + Some(InferredNode::Resolved { node: resolved, .. }) => pattern_subject_from_node(&resolved), + _ => Rc::new(PatternSubject::PatternLookupBlocked), + } } pub fn node_lookup_resolved(node: Rc) -> Rc { Rc::new(NodeLookupResult { - status: Rc::new(NodeLookupStatus::LookupResolved { - node: node, -}), - diagnostics: Rc::new(vec![]), -}) + status: Rc::new(NodeLookupStatus::LookupResolved { node: node }), + diagnostics: Rc::new(vec![]), + }) } pub fn node_lookup_failed(diagnostics: Rc>>) -> Rc { Rc::new(NodeLookupResult { - status: Rc::new(NodeLookupStatus::LookupFailed), - diagnostics: diagnostics, -}) + status: Rc::new(NodeLookupStatus::LookupFailed), + diagnostics: diagnostics, + }) } pub fn lookup_result_subject(result: Rc) -> Rc { match (*result.status.clone()).clone() { - NodeLookupStatus::LookupResolved { node: resolved, .. } => pattern_subject_from_node(&resolved), - NodeLookupStatus::LookupFailed => Rc::new(PatternSubject::PatternLookupBlocked), -} + NodeLookupStatus::LookupResolved { node: resolved, .. } => { + pattern_subject_from_node(&resolved) + } + NodeLookupStatus::LookupFailed => Rc::new(PatternSubject::PatternLookupBlocked), + } } pub fn pattern_binding_type(subject: Rc) -> Rc { match (*subject).clone() { - PatternSubject::PatternResolved { node: resolved, .. } => resolved.clone(), - PatternSubject::PatternDynamic { .. } => error_type(), - PatternSubject::PatternLookupBlocked => error_type(), -} + PatternSubject::PatternResolved { node: resolved, .. } => resolved.clone(), + PatternSubject::PatternDynamic { .. } => error_type(), + PatternSubject::PatternLookupBlocked => error_type(), + } } -pub fn variant_not_found_result(scrut: &Rc, variant_name: String, module_name: String, source_indices: Rc>>) -> Rc { - node_lookup_failed(Rc::new(vec![make_error_node(Rc::new(CompilerDiagnostic::VariantNotFound { - variant: variant_name, - type_name: authored_name_at(source_indices, &scrut), - span: scrut.span.clone(), -}), module_name)])) +pub fn variant_not_found_result( + scrut: &Rc, + variant_name: String, + module_name: String, + source_indices: Rc>>, +) -> Rc { + node_lookup_failed(Rc::new(vec![make_error_node( + Rc::new(CompilerDiagnostic::VariantNotFound { + variant: variant_name, + type_name: authored_name_at(source_indices, &scrut), + span: scrut.span.clone(), + }), + module_name, + )])) } -pub fn lookup_variant_in_type(scrut: Rc, variant_name: &String, module_name: String, source_indices: &Rc>>) -> Rc { +pub fn lookup_variant_in_type( + scrut: Rc, + variant_name: &String, + module_name: String, + source_indices: &Rc>>, +) -> Rc { match (*scrut).clone() { - PatternSubject::PatternLookupBlocked => node_lookup_failed(Rc::new(vec![])), - PatternSubject::PatternDynamic { span: dynamic_span, .. } => node_lookup_failed(Rc::new(vec![make_error_node(Rc::new(CompilerDiagnostic::VariantNotFound { - variant: variant_name.clone(), - type_name: "unresolved".to_string(), - span: dynamic_span.clone(), -}), module_name)])), - PatternSubject::PatternResolved { node: scrut_node, .. } => { - let scrut_opt = (scrut_node.return_cardinality.clone() == Cardinality::CardOptional); -if (((scrut_node.connective.clone() == Connective::NoConnective) && ((scrut_node.children.clone().len() as i64) == 0)) && (scrut_opt.clone() == false)) { - node_lookup_failed(Rc::new(vec![])) - } else { + PatternSubject::PatternLookupBlocked => node_lookup_failed(Rc::new(vec![])), + PatternSubject::PatternDynamic { + span: dynamic_span, .. + } => node_lookup_failed(Rc::new(vec![make_error_node( + Rc::new(CompilerDiagnostic::VariantNotFound { + variant: variant_name.clone(), + type_name: "unresolved".to_string(), + span: dynamic_span.clone(), + }), + module_name, + )])), + PatternSubject::PatternResolved { + node: scrut_node, .. + } => { + let scrut_opt = (scrut_node.return_cardinality.clone() == Cardinality::CardOptional); + if (((scrut_node.connective.clone() == Connective::NoConnective) + && ((scrut_node.children.clone().len() as i64) == 0)) + && (scrut_opt.clone() == false)) { - let direct_match = find_child_named(scrut_node.clone(), variant_name.clone(), source_indices.clone()); -let fallback = if (scrut_opt.clone() && (variant_name.clone().as_str() == "Some".to_string().as_str())) { - node_lookup_resolved(synthesize_optional_some_variant(&scrut_node)) - } else { - if (scrut_opt.clone() && (variant_name.clone().as_str() == "None".to_string().as_str())) { - node_lookup_resolved(none_type()) + node_lookup_failed(Rc::new(vec![])) + } else { + { + let direct_match = find_child_named( + scrut_node.clone(), + variant_name.clone(), + source_indices.clone(), + ); + let fallback = if (scrut_opt.clone() + && (variant_name.clone().as_str() == "Some".to_string().as_str())) + { + node_lookup_resolved(synthesize_optional_some_variant(&scrut_node)) } else { - variant_not_found_result(&scrut_node, variant_name.clone(), module_name, source_indices.clone()) + if (scrut_opt.clone() + && (variant_name.clone().as_str() == "None".to_string().as_str())) + { + node_lookup_resolved(none_type()) + } else { + variant_not_found_result( + &scrut_node, + variant_name.clone(), + module_name, + source_indices.clone(), + ) + } + }; + match direct_match { + Some(v) => node_lookup_resolved(v.clone()), + None => fallback, } - }; -match direct_match { - Some(v) => node_lookup_resolved(v.clone()), - None => fallback, -} -} + } + } } -}, -} + } } -pub fn lookup_field_in_variant(variant: Rc, field_name: &String, module_name: String, source_indices: &Rc>>) -> Rc { +pub fn lookup_field_in_variant( + variant: Rc, + field_name: &String, + module_name: String, + source_indices: &Rc>>, +) -> Rc { match (*variant).clone() { - PatternSubject::PatternLookupBlocked => node_lookup_failed(Rc::new(vec![])), - PatternSubject::PatternDynamic { span: dynamic_span, .. } => node_lookup_failed(Rc::new(vec![make_error_node(Rc::new(CompilerDiagnostic::FieldNotFound { - field: field_name.clone(), - type_name: "unresolved".to_string(), - span: dynamic_span.clone(), -}), module_name)])), - PatternSubject::PatternResolved { node: variant_node, .. } => match find_child_named(variant_node.clone(), field_name.clone(), source_indices.clone()) { - Some(field_child) => { - let resolved = child_type_node(&field_child); -node_lookup_resolved(resolved) -}, - None => node_lookup_failed(Rc::new(vec![make_error_node(Rc::new(CompilerDiagnostic::FieldNotFound { - field: field_name.clone(), - type_name: authored_name_at(source_indices.clone(), &variant_node), - span: variant_node.span.clone(), -}), module_name)])), -}, -} + PatternSubject::PatternLookupBlocked => node_lookup_failed(Rc::new(vec![])), + PatternSubject::PatternDynamic { + span: dynamic_span, .. + } => node_lookup_failed(Rc::new(vec![make_error_node( + Rc::new(CompilerDiagnostic::FieldNotFound { + field: field_name.clone(), + type_name: "unresolved".to_string(), + span: dynamic_span.clone(), + }), + module_name, + )])), + PatternSubject::PatternResolved { + node: variant_node, .. + } => match find_child_named( + variant_node.clone(), + field_name.clone(), + source_indices.clone(), + ) { + Some(field_child) => { + let resolved = child_type_node(&field_child); + node_lookup_resolved(resolved) + } + None => node_lookup_failed(Rc::new(vec![make_error_node( + Rc::new(CompilerDiagnostic::FieldNotFound { + field: field_name.clone(), + type_name: authored_name_at(source_indices.clone(), &variant_node), + span: variant_node.span.clone(), + }), + module_name, + )])), + }, + } } -pub fn check_match_exhaustiveness(scrutinee_type: &Rc, arms: &Rc>>, env: &Rc, span: Rc, module_name: String) -> Rc>> { +pub fn check_match_exhaustiveness( + scrutinee_type: &Rc, + arms: &Rc>>, + env: &Rc, + span: Rc, + module_name: String, +) -> Rc>> { { - let scrut_is_optional = (scrutinee_type.return_cardinality.clone() == Cardinality::CardOptional); -let has_structure = (scrutinee_type.connective.clone() != Connective::NoConnective); -let resolved_raw = if has_structure { + let scrut_is_optional = + (scrutinee_type.return_cardinality.clone() == Cardinality::CardOptional); + let has_structure = (scrutinee_type.connective.clone() != Connective::NoConnective); + let resolved_raw = if has_structure { scrutinee_type.clone() } else { - match lookup_type_by_name(&env, authored_name_at(env.source_indices.clone(), &scrutinee_type)) { - Some(def) => def.clone(), - None => scrutinee_type.clone(), -} + match lookup_type_by_name( + &env, + authored_name_at(env.source_indices.clone(), &scrutinee_type), + ) { + Some(def) => def.clone(), + None => scrutinee_type.clone(), + } }; -let resolved = if scrut_is_optional { + let resolved = if scrut_is_optional { with_optional_cardinality(&resolved_raw) } else { resolved_raw }; -let is_coproduct = (resolved.connective.clone() == Connective::Disj); -let resolved_is_optional = (resolved.return_cardinality.clone() == Cardinality::CardOptional); -if (is_coproduct || resolved_is_optional.clone()) { + let is_coproduct = (resolved.connective.clone() == Connective::Disj); + let resolved_is_optional = + (resolved.return_cardinality.clone() == Cardinality::CardOptional); + if (is_coproduct || resolved_is_optional.clone()) { { let variant_names = if resolved_is_optional.clone() { Rc::new(vec!["Some".to_string(), "None".to_string()]) } else { - Rc::new({ let mut __result = Vec::new(); for c in resolved.children.clone().iter().cloned() { __result.push(authored_name_at(env.source_indices.clone(), &c)); } __result }) + Rc::new({ + let mut __result = Vec::new(); + for c in resolved.children.clone().iter().cloned() { + __result.push(authored_name_at(env.source_indices.clone(), &c)); + } + __result + }) + }; + let has_catch_all = { + let mut __found = false; + for arm in arms.clone().iter().cloned() { + if match (*arm_pattern(arm.clone())).clone() { + MatchPattern::Wildcard => true, + MatchPattern::Bind { .. } => true, + _ => false, + } { + __found = true; + break; + } + } + __found }; -let has_catch_all = { let mut __found = false; for arm in arms.clone().iter().cloned() { if match (*arm_pattern(arm.clone())).clone() { - MatchPattern::Wildcard => true, - MatchPattern::Bind { .. } => true, - _ => false, -} { __found = true; break; } } __found }; -if has_catch_all { + if has_catch_all { Rc::new(vec![]) } else { { - let covered_set = arms.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, arm: Rc| match (*arm_pattern(arm.clone())).clone() { - MatchPattern::VariantPattern { name: n, .. } => v2_rt::rc_map_insert(acc.clone(), n.clone(), true), - MatchPattern::LitPattern { value: v, .. } => match (*v.clone()).clone() { - LiteralValue::LitBool { value: b, .. } => if b.clone() { - v2_rt::rc_map_insert(acc.clone(), "True".to_string(), true) - } else { - v2_rt::rc_map_insert(acc.clone(), "False".to_string(), true) - }, - _ => acc.clone(), -}, - _ => acc.clone(), -}); -let uncovered = Rc::new({ let mut __result = Vec::new(); for v in variant_names.iter().cloned() { if (emit_map_has(covered_set.clone(), v.clone()) == false) { __result.push(v); } } __result }); -if ((uncovered.clone().len() as i64) > 0) { - Rc::new(vec![make_error_node(Rc::new(CompilerDiagnostic::NonExhaustiveMatch { - missing: uncovered.clone(), - span: span, -}), module_name)]) + let covered_set = arms.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, arm: Rc| match (*arm_pattern( + arm.clone(), + )) + .clone() + { + MatchPattern::VariantPattern { name: n, .. } => { + v2_rt::rc_map_insert(acc.clone(), n.clone(), true) + } + MatchPattern::LitPattern { value: v, .. } => { + match (*v.clone()).clone() { + LiteralValue::LitBool { value: b, .. } => { + if b.clone() { + v2_rt::rc_map_insert( + acc.clone(), + "True".to_string(), + true, + ) + } else { + v2_rt::rc_map_insert( + acc.clone(), + "False".to_string(), + true, + ) + } + } + _ => acc.clone(), + } + } + _ => acc.clone(), + }, + ); + let uncovered = Rc::new({ + let mut __result = Vec::new(); + for v in variant_names.iter().cloned() { + if (emit_map_has(covered_set.clone(), v.clone()) == false) { + __result.push(v); + } + } + __result + }); + if ((uncovered.clone().len() as i64) > 0) { + Rc::new(vec![make_error_node( + Rc::new(CompilerDiagnostic::NonExhaustiveMatch { + missing: uncovered.clone(), + span: span, + }), + module_name, + )]) } else { Rc::new(vec![]) } -} + } } -} + } } else { Rc::new(vec![]) } -} + } } diff --git a/src/v2/stage0/src/v2_compiler_infer_resolve.rs b/src/v2/stage0/src/v2_compiler_infer_resolve.rs index 7aa5398c202..53f5cbf2aaf 100644 --- a/src/v2/stage0/src/v2_compiler_infer_resolve.rs +++ b/src/v2/stage0/src/v2_compiler_infer_resolve.rs @@ -1,32 +1,55 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.infer_resolve -use std::collections::HashMap; -use std::rc::Rc; +use self::AliasKind::*; +pub use crate::std_induction::SubValueRelation; +use crate::std_induction::SubValueRelation::SubValueUnknown; +pub use crate::std_types::{container_param_name, SourceSpan}; +pub use crate::v2_compiler_infer_env::{ + authored_name, is_recursive_type, is_recursive_type_by_name, is_recursive_type_for, + lookup_type, lookup_type_by_name, lookup_type_for, TypeBinding, TypeEnv, +}; +pub use crate::v2_compiler_infer_types::{ + child_type_node, node_is_keyed_collection, resolved_type, +}; use crate::v2_rt; -use crate::NonEmptyVec; -use crate::NonEmptyBTreeSet; -pub use crate::std_types::{SourceSpan, container_param_name}; -pub use crate::v2_std_core::{Node, authored_name_at, NewlineIndex, make_param_node, param_node_name_at, param_node_type_expr, param_node_default_value, make_field_node, field_node_name_at, field_node_type_expr, field_node_cardinality, field_node_default_value, field_node_from_key, InferredNode, is_compiler_error, ErrorNode, make_error_node, Cardinality, StringPart, MatchPattern, ExprData, ExprErrorKind, make_expr_node, make_named_expr_node, make_expr_error_node, map_children, expr_call_func_at, expr_method_name_at, let_binding_name_at, foreach_variable_at, make_arg_node, arg_name_at, arg_value, make_arm_node, arm_pattern, arm_guard, arm_body, make_field_init_node, field_init_node_name_at, field_init_node_value, make_resource_use_node, resource_use_name_at, resource_use_resource, make_text_part_node, make_interp_part_node, make_transport_node, local_transport_node, is_local_transport, transport_request_body, is_kernel_type, is_container_type, with_optional_cardinality, with_required_cardinality, Connective, no_span, unit_type, string_type, default_ident_span, kernel_span, node_name_span, intern, CompilerDiagnostic}; -use crate::v2_std_core::InferredNode::{Resolved, CompilerError, TypeVariable}; -use crate::v2_std_core::CompilerDiagnostic::{InternalError, ArityMismatch, UnresolvedType}; -use crate::v2_std_core::Cardinality::{Required, CardOptional}; -use crate::v2_std_core::StringPart::{Text, Interpolation}; -use crate::v2_std_core::MatchPattern::{Wildcard}; -use crate::v2_std_core::ExprData::{NoExprData, ExprLiteral, ExprError, ExprVar, ExprFieldAccess, ExprCall, ExprMethodCall, ExprMatch, ExprIf, ExprLet, ExprRecordLit, ExprListLit, ExprBinOp, ExprUnaryOp, ExprLambda, ExprStringInterp, ExprBlock, ExprCast, ExprForEach, ExprIndex, ExprSlice, ExprReturn}; -use crate::v2_std_core::ExprErrorKind::{SemanticExprError}; +use crate::v2_std_core::Cardinality::{CardOptional, Required}; +use crate::v2_std_core::CompilerDiagnostic::{ArityMismatch, InternalError, UnresolvedType}; use crate::v2_std_core::Connective::{Conj, Disj, NoConnective}; -pub use crate::v2_compiler_infer_types::{resolved_type, child_type_node, node_is_keyed_collection}; -pub use crate::std_induction::{SubValueRelation}; -use crate::std_induction::SubValueRelation::{SubValueUnknown}; -pub use crate::v2_compiler_infer_env::{TypeEnv, TypeBinding, lookup_type, lookup_type_by_name, lookup_type_for, is_recursive_type, is_recursive_type_by_name, is_recursive_type_for, authored_name}; -use self::AliasKind::*; +use crate::v2_std_core::ExprData::{ + ExprBinOp, ExprBlock, ExprCall, ExprCast, ExprError, ExprFieldAccess, ExprForEach, ExprIf, + ExprIndex, ExprLambda, ExprLet, ExprListLit, ExprLiteral, ExprMatch, ExprMethodCall, + ExprRecordLit, ExprReturn, ExprSlice, ExprStringInterp, ExprUnaryOp, ExprVar, NoExprData, +}; +use crate::v2_std_core::ExprErrorKind::SemanticExprError; +use crate::v2_std_core::InferredNode::{CompilerError, Resolved, TypeVariable}; +use crate::v2_std_core::MatchPattern::Wildcard; +use crate::v2_std_core::StringPart::{Interpolation, Text}; +pub use crate::v2_std_core::{ + arg_name_at, arg_value, arm_body, arm_guard, arm_pattern, authored_name_at, default_ident_span, + expr_call_func_at, expr_method_name_at, field_init_node_name_at, field_init_node_value, + field_node_cardinality, field_node_default_value, field_node_from_key, field_node_name_at, + field_node_type_expr, foreach_variable_at, intern, is_compiler_error, is_container_type, + is_kernel_type, is_local_transport, kernel_span, let_binding_name_at, local_transport_node, + make_arg_node, make_arm_node, make_error_node, make_expr_error_node, make_expr_node, + make_field_init_node, make_field_node, make_interp_part_node, make_named_expr_node, + make_param_node, make_resource_use_node, make_text_part_node, make_transport_node, + map_children, no_span, node_name_span, param_node_default_value, param_node_name_at, + param_node_type_expr, resource_use_name_at, resource_use_resource, string_type, + transport_request_body, unit_type, with_optional_cardinality, with_required_cardinality, + Cardinality, CompilerDiagnostic, Connective, ErrorNode, ExprData, ExprErrorKind, InferredNode, + MatchPattern, NewlineIndex, Node, StringPart, +}; +use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; pub fn is_type_variable(inferred: Rc) -> bool { match (*inferred).clone() { - InferredNode::TypeVariable { .. } => true, - _ => false, -} + InferredNode::TypeVariable { .. } => true, + _ => false, + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -102,96 +125,139 @@ pub fn resolve_node(n: Rc, env: Rc, module_name: String) -> Rc, env: &Rc) -> bool { { let has_structure = (n.connective.clone() != Connective::NoConnective); -if has_structure { + if has_structure { false } else { match lookup_type_for(&env, &n) { - Some(decl) => if ((decl.params.clone().len() as i64) > 0) { - if is_container_type(authored_name(env.clone(), n.clone())) { - false - } else { - if (decl.inferred.clone() != None) { - true + Some(decl) => { + if ((decl.params.clone().len() as i64) > 0) { + if is_container_type(authored_name(env.clone(), n.clone())) { + false + } else { + if (decl.inferred.clone() != None) { + true + } else { + true + } + } } else { - true + false } } - } else { - false - }, - None => false, -} + None => false, + } } -} + } } -pub fn substitute_type_slots(n: &Rc, slot_bindings: &Rc>>, decl_name: &String, source_indices: &Rc>>) -> Rc { +pub fn substitute_type_slots( + n: &Rc, + slot_bindings: &Rc>>, + decl_name: &String, + source_indices: &Rc>>, +) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - { - let is_slot = (((((n.children.clone().len() as i64) == 0) && (n.connective.clone() == Connective::NoConnective)) && (n.body.clone() == None)) && (n.inferred.clone() == None)); -if is_slot { - match v2_rt::map_get(&slot_bindings, authored_name_at(source_indices.clone(), &n)) { - Some(concrete) => concrete.clone(), - None => n.clone(), -} - } else { - { - let new_children = Rc::new({ let mut __result = Vec::new(); for child in n.children.clone().iter().cloned() { __result.push(if (authored_name_at(source_indices.clone(), &child).as_str() == decl_name.clone().as_str()) { - { - let substituted_args = Rc::new({ let mut __result = Vec::new(); for arg in child.children.clone().iter().cloned() { __result.push(substitute_type_slots(&arg, &slot_bindings, &decl_name, &source_indices)); } __result }); -Rc::new(Node { - name: child.name.clone(), - span: child.span.clone(), - ident_span: child.ident_span.clone(), - children: substituted_args.clone(), - connective: child.connective.clone(), - params: child.params.clone(), - inferred: child.inferred.clone(), - return_cardinality: child.return_cardinality.clone(), - uses: child.uses.clone(), - body: child.body.clone(), - transport: child.transport.clone(), - properties: child.properties.clone(), - type_annotation: child.type_annotation.clone(), - is_self_recursive: child.is_self_recursive.clone(), - has_non_tail_self_call: child.has_non_tail_self_call.clone(), - match_pattern: child.match_pattern.clone(), - expr_data: child.expr_data.clone(), - ident: None, -}) -} - } else { - substitute_type_slots(&child, &slot_bindings, &decl_name, &source_indices) - }); } __result }); -let new_inferred = match n.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => Some(Rc::new(InferredNode::Resolved { - node: substitute_type_slots(&rt, &slot_bindings, &decl_name, &source_indices), -})), - _ => n.inferred.clone(), -}; -Rc::new(Node { - name: n.name.clone(), - span: n.span.clone(), - ident_span: n.ident_span.clone(), - children: new_children, - connective: n.connective.clone(), - params: n.params.clone(), - inferred: new_inferred, - return_cardinality: n.return_cardinality.clone(), - uses: n.uses.clone(), - body: n.body.clone(), - transport: n.transport.clone(), - properties: n.properties.clone(), - type_annotation: n.type_annotation.clone(), - is_self_recursive: n.is_self_recursive.clone(), - has_non_tail_self_call: n.has_non_tail_self_call.clone(), - match_pattern: n.match_pattern.clone(), - expr_data: n.expr_data.clone(), - ident: None, -}) -} + let is_slot = (((((n.children.clone().len() as i64) == 0) + && (n.connective.clone() == Connective::NoConnective)) + && (n.body.clone() == None)) + && (n.inferred.clone() == None)); + if is_slot { + match v2_rt::map_get(&slot_bindings, authored_name_at(source_indices.clone(), &n)) { + Some(concrete) => concrete.clone(), + None => n.clone(), } -} + } else { + { + let new_children = Rc::new({ + let mut __result = Vec::new(); + for child in n.children.clone().iter().cloned() { + __result.push( + if (authored_name_at(source_indices.clone(), &child).as_str() + == decl_name.clone().as_str()) + { + { + let substituted_args = Rc::new({ + let mut __result = Vec::new(); + for arg in child.children.clone().iter().cloned() { + __result.push(substitute_type_slots( + &arg, + &slot_bindings, + &decl_name, + &source_indices, + )); + } + __result + }); + Rc::new(Node { + name: child.name.clone(), + span: child.span.clone(), + ident_span: child.ident_span.clone(), + children: substituted_args.clone(), + connective: child.connective.clone(), + params: child.params.clone(), + inferred: child.inferred.clone(), + return_cardinality: child.return_cardinality.clone(), + uses: child.uses.clone(), + body: child.body.clone(), + transport: child.transport.clone(), + properties: child.properties.clone(), + type_annotation: child.type_annotation.clone(), + is_self_recursive: child.is_self_recursive.clone(), + has_non_tail_self_call: child + .has_non_tail_self_call + .clone(), + match_pattern: child.match_pattern.clone(), + expr_data: child.expr_data.clone(), + ident: None, + }) + } + } else { + substitute_type_slots( + &child, + &slot_bindings, + &decl_name, + &source_indices, + ) + }, + ); + } + __result + }); + let new_inferred = match n.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => { + Some(Rc::new(InferredNode::Resolved { + node: substitute_type_slots( + &rt, + &slot_bindings, + &decl_name, + &source_indices, + ), + })) + } + _ => n.inferred.clone(), + }; + Rc::new(Node { + name: n.name.clone(), + span: n.span.clone(), + ident_span: n.ident_span.clone(), + children: new_children, + connective: n.connective.clone(), + params: n.params.clone(), + inferred: new_inferred, + return_cardinality: n.return_cardinality.clone(), + uses: n.uses.clone(), + body: n.body.clone(), + transport: n.transport.clone(), + properties: n.properties.clone(), + type_annotation: n.type_annotation.clone(), + is_self_recursive: n.is_self_recursive.clone(), + has_non_tail_self_call: n.has_non_tail_self_call.clone(), + match_pattern: n.match_pattern.clone(), + expr_data: n.expr_data.clone(), + ident: None, + }) + } + } }) } @@ -206,185 +272,286 @@ pub enum AliasKind { pub fn classify_alias(target: &Rc) -> AliasKind { { let nc = (target.connective.clone() == Connective::NoConnective); -if (((target.children.clone().len() as i64) > 0) && nc.clone()) { + if (((target.children.clone().len() as i64) > 0) && nc.clone()) { AliasKind::AliasParameterized } else { - if ((((target.children.clone().len() as i64) == 0) && nc.clone()) && (target.ident_span.clone() != None)) { + if ((((target.children.clone().len() as i64) == 0) && nc.clone()) + && (target.ident_span.clone() != None)) + { AliasKind::AliasLeaf } else { AliasKind::AliasPassthrough } } -} + } } -pub fn resolve_alias_target(target: Rc, env: &Rc, module_name: String, depth: i64) -> Rc { +pub fn resolve_alias_target( + target: Rc, + env: &Rc, + module_name: String, + depth: i64, +) -> Rc { match classify_alias(&target) { - AliasKind::AliasParameterized => resolve_node_bounded(&target, &env, &module_name, (depth + 1)).resolved.clone(), - AliasKind::AliasLeaf => match lookup_type_by_name(&env, authored_name_at(env.source_indices.clone(), &target)) { - Some(env_target) => env_target.clone(), - None => target.clone(), -}, - AliasKind::AliasPassthrough => target.clone(), -} + AliasKind::AliasParameterized => { + resolve_node_bounded(&target, &env, &module_name, (depth + 1)) + .resolved + .clone() + } + AliasKind::AliasLeaf => { + match lookup_type_by_name(&env, authored_name_at(env.source_indices.clone(), &target)) { + Some(env_target) => env_target.clone(), + None => target.clone(), + } + } + AliasKind::AliasPassthrough => target.clone(), + } } -pub fn resolve_node_bounded(n: &Rc, env: &Rc, module_name: &String, depth: i64) -> Rc { +pub fn resolve_node_bounded( + n: &Rc, + env: &Rc, + module_name: &String, + depth: i64, +) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - { - if (depth.clone() > 100) { - return Rc::new(NodeResolveResult { - resolved: n.clone(), - diagnostics: Rc::new(vec![make_error_node(Rc::new(CompilerDiagnostic::InternalError { - message: v2_rt::concat(v2_rt::concat("internal: type resolution exceeded depth 100 for '".to_string(), authored_name(env.clone(), n.clone())), "'".to_string()), - span: n.span.clone(), -}), module_name.clone())]), -}) - } -let has_structure = (n.connective.clone() != Connective::NoConnective); -if has_structure { - { - let is_product = (n.connective.clone() == Connective::Conj); -if is_product { - if (n.type_annotation.clone() != None) { - match n.children.clone().first().cloned() { - Some(base) => { - let base_result = resolve_node_bounded(&base, &env, &module_name, (depth.clone() + 1)); -let base_resolved = base_result.resolved.clone(); -let base_diags = base_result.diagnostics.clone(); -Rc::new(NodeResolveResult { - resolved: Rc::new(Node { - name: n.name.clone(), - span: n.span.clone(), - ident_span: n.ident_span.clone(), - children: Rc::new(vec![base_resolved]), - connective: n.connective.clone(), - params: n.params.clone(), - inferred: n.inferred.clone(), - return_cardinality: n.return_cardinality.clone(), - uses: n.uses.clone(), - body: n.body.clone(), - transport: n.transport.clone(), - properties: n.properties.clone(), - type_annotation: n.type_annotation.clone(), - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}), - diagnostics: base_diags, -}) -}, - None => Rc::new(NodeResolveResult { - resolved: n.clone(), - diagnostics: Rc::new(vec![]), -}), -} - } else { - { - let child_results = Rc::new({ let mut __result = Vec::new(); for child in n.children.clone().iter().cloned() { __result.push(if (child.inferred.clone() == None) { - Rc::new(NodeResolveResult { - resolved: child.clone(), - diagnostics: Rc::new(vec![]), -}) - } else { - { - let child_rt = resolved_type(child.clone()); -let rt_result = resolve_node_bounded(&child_rt, &env, &module_name, (depth.clone() + 1)); -let rt_resolved = rt_result.resolved.clone(); -let rt_diags = rt_result.diagnostics.clone(); -Rc::new(NodeResolveResult { - resolved: Rc::new(Node { - name: child.name.clone(), - span: child.span.clone(), - ident_span: child.ident_span.clone(), - children: child.children.clone(), - connective: child.connective.clone(), - params: child.params.clone(), - inferred: Some(Rc::new(InferredNode::Resolved { - node: rt_resolved.clone(), -})), - return_cardinality: child.return_cardinality.clone(), - uses: child.uses.clone(), - body: child.body.clone(), - transport: child.transport.clone(), - properties: child.properties.clone(), - type_annotation: child.type_annotation.clone(), - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}), - diagnostics: rt_diags.clone(), -}) -} - }); } __result }); -let resolved_children = Rc::new({ let mut __result = Vec::new(); for cr in child_results.clone().iter().cloned() { __result.push(cr.resolved.clone()); } __result }); -let all_diags = Rc::new({ let mut __result = Vec::new(); for cr in child_results.clone().iter().cloned() { __result.extend((*cr.diagnostics.clone()).iter().cloned()); } __result }); -Rc::new(NodeResolveResult { - resolved: Rc::new(Node { - name: n.name.clone(), - span: n.span.clone(), - ident_span: n.ident_span.clone(), - children: resolved_children, - connective: n.connective.clone(), - params: n.params.clone(), - inferred: n.inferred.clone(), - return_cardinality: n.return_cardinality.clone(), - uses: n.uses.clone(), - body: n.body.clone(), - transport: n.transport.clone(), - properties: n.properties.clone(), - type_annotation: n.type_annotation.clone(), - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}), - diagnostics: all_diags, -}) -} + if (depth.clone() > 100) { + return Rc::new(NodeResolveResult { + resolved: n.clone(), + diagnostics: Rc::new(vec![make_error_node( + Rc::new(CompilerDiagnostic::InternalError { + message: v2_rt::concat( + v2_rt::concat( + "internal: type resolution exceeded depth 100 for '".to_string(), + authored_name(env.clone(), n.clone()), + ), + "'".to_string(), + ), + span: n.span.clone(), + }), + module_name.clone(), + )]), + }); + } + let has_structure = (n.connective.clone() != Connective::NoConnective); + if has_structure { + { + let is_product = (n.connective.clone() == Connective::Conj); + if is_product { + if (n.type_annotation.clone() != None) { + match n.children.clone().first().cloned() { + Some(base) => { + let base_result = resolve_node_bounded( + &base, + &env, + &module_name, + (depth.clone() + 1), + ); + let base_resolved = base_result.resolved.clone(); + let base_diags = base_result.diagnostics.clone(); + Rc::new(NodeResolveResult { + resolved: Rc::new(Node { + name: n.name.clone(), + span: n.span.clone(), + ident_span: n.ident_span.clone(), + children: Rc::new(vec![base_resolved]), + connective: n.connective.clone(), + params: n.params.clone(), + inferred: n.inferred.clone(), + return_cardinality: n.return_cardinality.clone(), + uses: n.uses.clone(), + body: n.body.clone(), + transport: n.transport.clone(), + properties: n.properties.clone(), + type_annotation: n.type_annotation.clone(), + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }), + diagnostics: base_diags, + }) + } + None => Rc::new(NodeResolveResult { + resolved: n.clone(), + diagnostics: Rc::new(vec![]), + }), } } else { { - let is_optional = (n.return_cardinality.clone() == Cardinality::CardOptional); -if is_optional { - { - let inner = with_required_cardinality(&n); -let inner_result = resolve_node_bounded(&inner, &env, &module_name, (depth.clone() + 1)); -let inner_resolved = inner_result.resolved.clone(); -let inner_diags = inner_result.diagnostics.clone(); -Rc::new(NodeResolveResult { - resolved: with_optional_cardinality(&inner_resolved), - diagnostics: inner_diags, -}) -} - } else { - { - let variant_results = Rc::new({ let mut __result = Vec::new(); for variant_child in n.children.clone().iter().cloned() { __result.push({ - let field_results = Rc::new({ let mut __result = Vec::new(); for field_child in variant_child.children.clone().iter().cloned() { __result.push(if (field_child.inferred.clone() == None) { + let child_results = Rc::new({ + let mut __result = Vec::new(); + for child in n.children.clone().iter().cloned() { + __result.push(if (child.inferred.clone() == None) { + Rc::new(NodeResolveResult { + resolved: child.clone(), + diagnostics: Rc::new(vec![]), + }) + } else { + { + let child_rt = resolved_type(child.clone()); + let rt_result = resolve_node_bounded( + &child_rt, + &env, + &module_name, + (depth.clone() + 1), + ); + let rt_resolved = rt_result.resolved.clone(); + let rt_diags = rt_result.diagnostics.clone(); Rc::new(NodeResolveResult { - resolved: field_child.clone(), - diagnostics: Rc::new(vec![]), -}) - } else { - { - let field_rt = resolved_type(field_child.clone()); -let is_self_ref = ((authored_name(env.clone(), field_rt.clone()).as_str() == authored_name(env.clone(), n.clone()).as_str()) && ((field_rt.children.clone().len() as i64) > 0)); -let rt_result = if is_self_ref.clone() { - Rc::new(NodeResolveResult { - resolved: field_rt.clone(), - diagnostics: Rc::new(vec![]), -}) - } else { - resolve_node_bounded(&field_rt, &env, &module_name, (depth.clone() + 1)) - }; -let rt_resolved = rt_result.resolved.clone(); -let rt_diags = rt_result.diagnostics.clone(); -Rc::new(NodeResolveResult { + resolved: Rc::new(Node { + name: child.name.clone(), + span: child.span.clone(), + ident_span: child.ident_span.clone(), + children: child.children.clone(), + connective: child.connective.clone(), + params: child.params.clone(), + inferred: Some(Rc::new( + InferredNode::Resolved { + node: rt_resolved.clone(), + }, + )), + return_cardinality: child + .return_cardinality + .clone(), + uses: child.uses.clone(), + body: child.body.clone(), + transport: child.transport.clone(), + properties: child.properties.clone(), + type_annotation: child.type_annotation.clone(), + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }), + diagnostics: rt_diags.clone(), + }) + } + }); + } + __result + }); + let resolved_children = Rc::new({ + let mut __result = Vec::new(); + for cr in child_results.clone().iter().cloned() { + __result.push(cr.resolved.clone()); + } + __result + }); + let all_diags = Rc::new({ + let mut __result = Vec::new(); + for cr in child_results.clone().iter().cloned() { + __result.extend((*cr.diagnostics.clone()).iter().cloned()); + } + __result + }); + Rc::new(NodeResolveResult { + resolved: Rc::new(Node { + name: n.name.clone(), + span: n.span.clone(), + ident_span: n.ident_span.clone(), + children: resolved_children, + connective: n.connective.clone(), + params: n.params.clone(), + inferred: n.inferred.clone(), + return_cardinality: n.return_cardinality.clone(), + uses: n.uses.clone(), + body: n.body.clone(), + transport: n.transport.clone(), + properties: n.properties.clone(), + type_annotation: n.type_annotation.clone(), + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }), + diagnostics: all_diags, + }) + } + } + } else { + { + let is_optional = + (n.return_cardinality.clone() == Cardinality::CardOptional); + if is_optional { + { + let inner = with_required_cardinality(&n); + let inner_result = resolve_node_bounded( + &inner, + &env, + &module_name, + (depth.clone() + 1), + ); + let inner_resolved = inner_result.resolved.clone(); + let inner_diags = inner_result.diagnostics.clone(); + Rc::new(NodeResolveResult { + resolved: with_optional_cardinality(&inner_resolved), + diagnostics: inner_diags, + }) + } + } else { + { + let variant_results = Rc::new({ + let mut __result = Vec::new(); + for variant_child in n.children.clone().iter().cloned() { + __result.push({ + let field_results = Rc::new({ + let mut __result = Vec::new(); + for field_child in + variant_child.children.clone().iter().cloned() + { + __result.push( + if (field_child.inferred.clone() == None) { + Rc::new(NodeResolveResult { + resolved: field_child.clone(), + diagnostics: Rc::new(vec![]), + }) + } else { + { + let field_rt = resolved_type( + field_child.clone(), + ); + let is_self_ref = ((authored_name( + env.clone(), + field_rt.clone(), + ) + .as_str() + == authored_name( + env.clone(), + n.clone(), + ) + .as_str()) + && ((field_rt + .children + .clone() + .len() + as i64) + > 0)); + let rt_result = if is_self_ref + .clone() + { + Rc::new(NodeResolveResult { + resolved: field_rt.clone(), + diagnostics: Rc::new( + vec![], + ), + }) + } else { + resolve_node_bounded( + &field_rt, + &env, + &module_name, + (depth.clone() + 1), + ) + }; + let rt_resolved = + rt_result.resolved.clone(); + let rt_diags = + rt_result.diagnostics.clone(); + Rc::new(NodeResolveResult { resolved: Rc::new(Node { name: field_child.name.clone(), span: field_child.span.clone(), @@ -409,1249 +576,2106 @@ Rc::new(NodeResolveResult { }), diagnostics: rt_diags.clone(), }) -} - }); } __result }); -let resolved_fields = Rc::new({ let mut __result = Vec::new(); for fr in field_results.clone().iter().cloned() { __result.push(fr.resolved.clone()); } __result }); -let field_diags = Rc::new({ let mut __result = Vec::new(); for fr in field_results.clone().iter().cloned() { __result.extend((*fr.diagnostics.clone()).iter().cloned()); } __result }); -Rc::new(NodeResolveResult { - resolved: Rc::new(Node { - name: variant_child.name.clone(), - span: variant_child.span.clone(), - ident_span: variant_child.ident_span.clone(), - children: resolved_fields.clone(), - connective: variant_child.connective.clone(), - params: variant_child.params.clone(), - inferred: variant_child.inferred.clone(), - return_cardinality: variant_child.return_cardinality.clone(), - uses: variant_child.uses.clone(), - body: variant_child.body.clone(), - transport: variant_child.transport.clone(), - properties: variant_child.properties.clone(), - type_annotation: variant_child.type_annotation.clone(), - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}), - diagnostics: field_diags.clone(), -}) -}); } __result }); -let resolved_variants = Rc::new({ let mut __result = Vec::new(); for vr in variant_results.clone().iter().cloned() { __result.push(vr.resolved.clone()); } __result }); -let all_diags = Rc::new({ let mut __result = Vec::new(); for vr in variant_results.clone().iter().cloned() { __result.extend((*vr.diagnostics.clone()).iter().cloned()); } __result }); -Rc::new(NodeResolveResult { - resolved: Rc::new(Node { - name: n.name.clone(), - span: n.span.clone(), - ident_span: n.ident_span.clone(), - children: resolved_variants, - connective: n.connective.clone(), - params: n.params.clone(), - inferred: n.inferred.clone(), - return_cardinality: n.return_cardinality.clone(), - uses: n.uses.clone(), - body: n.body.clone(), - transport: n.transport.clone(), - properties: n.properties.clone(), - type_annotation: n.type_annotation.clone(), - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}), - diagnostics: all_diags, -}) -} + } + }, + ); + } + __result + }); + let resolved_fields = Rc::new({ + let mut __result = Vec::new(); + for fr in field_results.clone().iter().cloned() { + __result.push(fr.resolved.clone()); + } + __result + }); + let field_diags = Rc::new({ + let mut __result = Vec::new(); + for fr in field_results.clone().iter().cloned() { + __result.extend( + (*fr.diagnostics.clone()).iter().cloned(), + ); + } + __result + }); + Rc::new(NodeResolveResult { + resolved: Rc::new(Node { + name: variant_child.name.clone(), + span: variant_child.span.clone(), + ident_span: variant_child.ident_span.clone(), + children: resolved_fields.clone(), + connective: variant_child.connective.clone(), + params: variant_child.params.clone(), + inferred: variant_child.inferred.clone(), + return_cardinality: variant_child + .return_cardinality + .clone(), + uses: variant_child.uses.clone(), + body: variant_child.body.clone(), + transport: variant_child.transport.clone(), + properties: variant_child.properties.clone(), + type_annotation: variant_child + .type_annotation + .clone(), + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }), + diagnostics: field_diags.clone(), + }) + }); + } + __result + }); + let resolved_variants = Rc::new({ + let mut __result = Vec::new(); + for vr in variant_results.clone().iter().cloned() { + __result.push(vr.resolved.clone()); + } + __result + }); + let all_diags = Rc::new({ + let mut __result = Vec::new(); + for vr in variant_results.clone().iter().cloned() { + __result.extend((*vr.diagnostics.clone()).iter().cloned()); + } + __result + }); + Rc::new(NodeResolveResult { + resolved: Rc::new(Node { + name: n.name.clone(), + span: n.span.clone(), + ident_span: n.ident_span.clone(), + children: resolved_variants, + connective: n.connective.clone(), + params: n.params.clone(), + inferred: n.inferred.clone(), + return_cardinality: n.return_cardinality.clone(), + uses: n.uses.clone(), + body: n.body.clone(), + transport: n.transport.clone(), + properties: n.properties.clone(), + type_annotation: n.type_annotation.clone(), + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }), + diagnostics: all_diags, + }) } -} + } } -} - } else { - if (((n.children.clone().len() as i64) > 0) && is_user_generic_use_site(&n, &env)) { - { - let type_name = authored_name(env.clone(), n.clone()); -let decl = match lookup_type_for(&env, &n) { - Some(d) => d.clone(), - None => n.clone(), -}; -let expected_arity = (decl.params.clone().len() as i64); -let actual_arity = (n.children.clone().len() as i64); -let arity_diags = if (expected_arity.clone() != actual_arity.clone()) { - Rc::new(vec![make_error_node(Rc::new(CompilerDiagnostic::ArityMismatch { - name: type_name.clone(), - expected: expected_arity.clone(), - got: actual_arity.clone(), - span: n.span.clone(), -}), module_name.clone())]) - } else { - Rc::new(vec![]) - }; -let arg_results = Rc::new({ let mut __result = Vec::new(); for child in n.children.clone().iter().cloned() { __result.push(resolve_node_bounded(&child, &env, &module_name, (depth.clone() + 1))); } __result }); -let resolved_args = Rc::new({ let mut __result = Vec::new(); for ar in arg_results.clone().iter().cloned() { __result.push(ar.resolved.clone()); } __result }); -let arg_diags = Rc::new({ let mut __result = Vec::new(); for ar in arg_results.clone().iter().cloned() { __result.extend((*ar.diagnostics.clone()).iter().cloned()); } __result }); -let slot_bindings = Rc::new(decl.params.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, pair: (i64, Rc)| { + } + } + } else { + if (((n.children.clone().len() as i64) > 0) && is_user_generic_use_site(&n, &env)) { + { + let type_name = authored_name(env.clone(), n.clone()); + let decl = match lookup_type_for(&env, &n) { + Some(d) => d.clone(), + None => n.clone(), + }; + let expected_arity = (decl.params.clone().len() as i64); + let actual_arity = (n.children.clone().len() as i64); + let arity_diags = if (expected_arity.clone() != actual_arity.clone()) { + Rc::new(vec![make_error_node( + Rc::new(CompilerDiagnostic::ArityMismatch { + name: type_name.clone(), + expected: expected_arity.clone(), + got: actual_arity.clone(), + span: n.span.clone(), + }), + module_name.clone(), + )]) + } else { + Rc::new(vec![]) + }; + let arg_results = Rc::new({ + let mut __result = Vec::new(); + for child in n.children.clone().iter().cloned() { + __result.push(resolve_node_bounded( + &child, + &env, + &module_name, + (depth.clone() + 1), + )); + } + __result + }); + let resolved_args = Rc::new({ + let mut __result = Vec::new(); + for ar in arg_results.clone().iter().cloned() { + __result.push(ar.resolved.clone()); + } + __result + }); + let arg_diags = Rc::new({ + let mut __result = Vec::new(); + for ar in arg_results.clone().iter().cloned() { + __result.extend((*ar.diagnostics.clone()).iter().cloned()); + } + __result + }); + let slot_bindings = Rc::new( + decl.params + .clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + .fold( + v2_rt::rc_empty_map::>(), + |acc: Rc>>, pair: (i64, Rc)| { let idx = pair.0.clone(); -let slot_name = authored_name_at(env.source_indices.clone(), &pair.1.clone()); -match Rc::new({ let mut __result = Vec::new(); for p in Rc::new({ let mut __result = Vec::new(); for p in Rc::new(resolved_args.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { if (p.0.clone() == idx.clone()) { __result.push(p); } } __result }).iter().cloned() { __result.push(p.1.clone()); } __result }).first().cloned() { - Some(arg) => v2_rt::rc_map_insert(acc.clone(), slot_name.clone(), arg.clone()), - None => acc.clone(), -} -}); -let is_parameterized_alias = (((decl.inferred.clone() != None) && ((decl.children.clone().len() as i64) == 0)) && (decl.connective.clone() == Connective::NoConnective)); -if is_parameterized_alias { - { - let alias_target = match decl.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: target, .. }) => substitute_type_slots(&target, &slot_bindings, &type_name, &env.source_indices.clone()), - _ => n.clone(), -}; -let target_result = resolve_node_bounded(&alias_target, &env, &module_name, (depth.clone() + 1)); -let is_recursive = is_recursive_type_by_name(&env, type_name.clone()); -let resolved_node = Rc::new(Node { - name: type_name.clone(), - span: n.span.clone(), - ident_span: n.ident_span.clone(), - children: target_result.resolved.clone().children.clone(), - connective: target_result.resolved.clone().connective.clone(), - params: Rc::new(vec![]), - inferred: n.inferred.clone(), - return_cardinality: n.return_cardinality.clone(), - uses: n.uses.clone(), - body: n.body.clone(), - transport: n.transport.clone(), - properties: target_result.resolved.clone().properties.clone(), - type_annotation: n.type_annotation.clone(), - is_self_recursive: is_recursive, - has_non_tail_self_call: n.has_non_tail_self_call.clone(), - match_pattern: n.match_pattern.clone(), - expr_data: n.expr_data.clone(), - ident: None, -}); -Rc::new(NodeResolveResult { - resolved: resolved_node, - diagnostics: v2_rt::concat(v2_rt::concat(arity_diags, arg_diags), target_result.diagnostics.clone()), -}) -} - } else { + let slot_name = + authored_name_at(env.source_indices.clone(), &pair.1.clone()); + match Rc::new({ + let mut __result = Vec::new(); + for p in Rc::new({ + let mut __result = Vec::new(); + for p in Rc::new( + resolved_args + .clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + { + if (p.0.clone() == idx.clone()) { + __result.push(p); + } + } + __result + }) + .iter() + .cloned() + { + __result.push(p.1.clone()); + } + __result + }) + .first() + .cloned() { - let substituted_children = Rc::new({ let mut __result = Vec::new(); for child in decl.children.clone().iter().cloned() { __result.push(substitute_type_slots(&child, &slot_bindings, &type_name, &env.source_indices.clone())); } __result }); -let is_recursive = is_recursive_type_by_name(&env, type_name.clone()); -let result = Rc::new(NodeResolveResult { - resolved: Rc::new(Node { - name: type_name.clone(), - span: n.span.clone(), - ident_span: n.ident_span.clone(), - children: substituted_children, - connective: decl.connective.clone(), - params: Rc::new(vec![]), - inferred: n.inferred.clone(), - return_cardinality: n.return_cardinality.clone(), - uses: n.uses.clone(), - body: n.body.clone(), - transport: n.transport.clone(), - properties: decl.properties.clone(), - type_annotation: n.type_annotation.clone(), - is_self_recursive: is_recursive, - has_non_tail_self_call: n.has_non_tail_self_call.clone(), - match_pattern: n.match_pattern.clone(), - expr_data: n.expr_data.clone(), - ident: None, -}), - diagnostics: v2_rt::concat(arity_diags, arg_diags), -}); -result -} + Some(arg) => v2_rt::rc_map_insert( + acc.clone(), + slot_name.clone(), + arg.clone(), + ), + None => acc.clone(), + } + }, + ); + let is_parameterized_alias = (((decl.inferred.clone() != None) + && ((decl.children.clone().len() as i64) == 0)) + && (decl.connective.clone() == Connective::NoConnective)); + if is_parameterized_alias { + { + let alias_target = match decl.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: target, .. }) => { + substitute_type_slots( + &target, + &slot_bindings, + &type_name, + &env.source_indices.clone(), + ) + } + _ => n.clone(), + }; + let target_result = resolve_node_bounded( + &alias_target, + &env, + &module_name, + (depth.clone() + 1), + ); + let is_recursive = is_recursive_type_by_name(&env, type_name.clone()); + let resolved_node = Rc::new(Node { + name: type_name.clone(), + span: n.span.clone(), + ident_span: n.ident_span.clone(), + children: target_result.resolved.clone().children.clone(), + connective: target_result.resolved.clone().connective.clone(), + params: Rc::new(vec![]), + inferred: n.inferred.clone(), + return_cardinality: n.return_cardinality.clone(), + uses: n.uses.clone(), + body: n.body.clone(), + transport: n.transport.clone(), + properties: target_result.resolved.clone().properties.clone(), + type_annotation: n.type_annotation.clone(), + is_self_recursive: is_recursive, + has_non_tail_self_call: n.has_non_tail_self_call.clone(), + match_pattern: n.match_pattern.clone(), + expr_data: n.expr_data.clone(), + ident: None, + }); + Rc::new(NodeResolveResult { + resolved: resolved_node, + diagnostics: v2_rt::concat( + v2_rt::concat(arity_diags, arg_diags), + target_result.diagnostics.clone(), + ), + }) } -} - } else { - { - let is_map = node_is_keyed_collection(&n, env.source_indices.clone()); -if is_map { + } else { + { + let substituted_children = Rc::new({ + let mut __result = Vec::new(); + for child in decl.children.clone().iter().cloned() { + __result.push(substitute_type_slots( + &child, + &slot_bindings, + &type_name, + &env.source_indices.clone(), + )); + } + __result + }); + let is_recursive = is_recursive_type_by_name(&env, type_name.clone()); + let result = Rc::new(NodeResolveResult { + resolved: Rc::new(Node { + name: type_name.clone(), + span: n.span.clone(), + ident_span: n.ident_span.clone(), + children: substituted_children, + connective: decl.connective.clone(), + params: Rc::new(vec![]), + inferred: n.inferred.clone(), + return_cardinality: n.return_cardinality.clone(), + uses: n.uses.clone(), + body: n.body.clone(), + transport: n.transport.clone(), + properties: decl.properties.clone(), + type_annotation: n.type_annotation.clone(), + is_self_recursive: is_recursive, + has_non_tail_self_call: n.has_non_tail_self_call.clone(), + match_pattern: n.match_pattern.clone(), + expr_data: n.expr_data.clone(), + ident: None, + }), + diagnostics: v2_rt::concat(arity_diags, arg_diags), + }); + result + } + } + } + } else { + { + let is_map = node_is_keyed_collection(&n, env.source_indices.clone()); + if is_map { + { + let type_name = authored_name(env.clone(), n.clone()); + let key_child_node = match n.children.clone().first().cloned() { + Some(k) => k.clone(), + None => unit_type(), + }; + let val_child_node = match n.children.clone().get(1 as usize).cloned() { + Some(v) => v.clone(), + None => unit_type(), + }; + let key_type = child_type_node(&key_child_node); + let val_type = child_type_node(&val_child_node); + let key_result = resolve_node_bounded( + &key_type, + &env, + &module_name, + (depth.clone() + 1), + ); + let key_resolved = key_result.resolved.clone(); + let key_diags = key_result.diagnostics.clone(); + let val_result = resolve_node_bounded( + &val_type, + &env, + &module_name, + (depth.clone() + 1), + ); + let val_resolved = val_result.resolved.clone(); + let val_diags = val_result.diagnostics.clone(); + let key_param_name = if (key_child_node.inferred.clone() != None) { + authored_name(env.clone(), key_child_node.clone()) + } else { + match container_param_name(type_name.clone(), 0) { + Some(pn) => pn.clone(), + None => authored_name(env.clone(), key_child_node.clone()), + } + }; + let val_param_name = if (val_child_node.inferred.clone() != None) { + authored_name(env.clone(), val_child_node.clone()) + } else { + match container_param_name(type_name.clone(), 1) { + Some(pn) => pn.clone(), + None => authored_name(env.clone(), val_child_node.clone()), + } + }; + let resolved_key_child = Rc::new(Node { + name: key_param_name, + span: key_child_node.span.clone(), + ident_span: key_child_node.ident_span.clone(), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::Resolved { + node: key_resolved, + })), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + let resolved_val_child = Rc::new(Node { + name: val_param_name, + span: val_child_node.span.clone(), + ident_span: val_child_node.ident_span.clone(), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::Resolved { + node: val_resolved, + })), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + Rc::new(NodeResolveResult { + resolved: Rc::new(Node { + name: type_name.clone(), + span: n.span.clone(), + ident_span: n.ident_span.clone(), + children: Rc::new(vec![resolved_key_child, resolved_val_child]), + connective: n.connective.clone(), + params: n.params.clone(), + inferred: n.inferred.clone(), + return_cardinality: n.return_cardinality.clone(), + uses: n.uses.clone(), + body: n.body.clone(), + transport: n.transport.clone(), + properties: n.properties.clone(), + type_annotation: n.type_annotation.clone(), + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }), + diagnostics: v2_rt::concat(key_diags, val_diags), + }) + } + } else { + if ((n.children.clone().len() as i64) == 1) { { let type_name = authored_name(env.clone(), n.clone()); -let key_child_node = match n.children.clone().first().cloned() { - Some(k) => k.clone(), - None => unit_type(), -}; -let val_child_node = match n.children.clone().get(1 as usize).cloned() { - Some(v) => v.clone(), - None => unit_type(), -}; -let key_type = child_type_node(&key_child_node); -let val_type = child_type_node(&val_child_node); -let key_result = resolve_node_bounded(&key_type, &env, &module_name, (depth.clone() + 1)); -let key_resolved = key_result.resolved.clone(); -let key_diags = key_result.diagnostics.clone(); -let val_result = resolve_node_bounded(&val_type, &env, &module_name, (depth.clone() + 1)); -let val_resolved = val_result.resolved.clone(); -let val_diags = val_result.diagnostics.clone(); -let key_param_name = if (key_child_node.inferred.clone() != None) { - authored_name(env.clone(), key_child_node.clone()) - } else { - match container_param_name(type_name.clone(), 0) { - Some(pn) => pn.clone(), - None => authored_name(env.clone(), key_child_node.clone()), -} - }; -let val_param_name = if (val_child_node.inferred.clone() != None) { - authored_name(env.clone(), val_child_node.clone()) - } else { - match container_param_name(type_name.clone(), 1) { - Some(pn) => pn.clone(), - None => authored_name(env.clone(), val_child_node.clone()), -} - }; -let resolved_key_child = Rc::new(Node { - name: key_param_name, - span: key_child_node.span.clone(), - ident_span: key_child_node.ident_span.clone(), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::Resolved { - node: key_resolved, -})), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -let resolved_val_child = Rc::new(Node { - name: val_param_name, - span: val_child_node.span.clone(), - ident_span: val_child_node.ident_span.clone(), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::Resolved { - node: val_resolved, -})), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -Rc::new(NodeResolveResult { - resolved: Rc::new(Node { - name: type_name.clone(), - span: n.span.clone(), - ident_span: n.ident_span.clone(), - children: Rc::new(vec![resolved_key_child, resolved_val_child]), - connective: n.connective.clone(), - params: n.params.clone(), - inferred: n.inferred.clone(), - return_cardinality: n.return_cardinality.clone(), - uses: n.uses.clone(), - body: n.body.clone(), - transport: n.transport.clone(), - properties: n.properties.clone(), - type_annotation: n.type_annotation.clone(), - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}), - diagnostics: v2_rt::concat(key_diags, val_diags), -}) -} - } else { - if ((n.children.clone().len() as i64) == 1) { - { - let type_name = authored_name(env.clone(), n.clone()); -match n.children.clone().first().cloned() { - Some(child_node) => { + match n.children.clone().first().cloned() { + Some(child_node) => { let el_type = child_type_node(&child_node); -let el_result = resolve_node_bounded(&el_type, &env, &module_name, (depth.clone() + 1)); -let el_resolved = el_result.resolved.clone(); -let el_diags = el_result.diagnostics.clone(); -let el_param_name = if (child_node.inferred.clone() != None) { + let el_result = resolve_node_bounded( + &el_type, + &env, + &module_name, + (depth.clone() + 1), + ); + let el_resolved = el_result.resolved.clone(); + let el_diags = el_result.diagnostics.clone(); + let el_param_name = if (child_node.inferred.clone() != None) + { authored_name(env.clone(), child_node.clone()) } else { match container_param_name(type_name.clone(), 0) { - Some(pn) => pn.clone(), - None => authored_name(env.clone(), child_node.clone()), -} + Some(pn) => pn.clone(), + None => { + authored_name(env.clone(), child_node.clone()) + } + } }; -let resolved_child = Rc::new(Node { - name: el_param_name, - span: child_node.span.clone(), - ident_span: child_node.ident_span.clone(), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::Resolved { - node: el_resolved, -})), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -Rc::new(NodeResolveResult { - resolved: Rc::new(Node { - name: type_name.clone(), - span: n.span.clone(), - ident_span: n.ident_span.clone(), - children: Rc::new(vec![resolved_child]), - connective: n.connective.clone(), - params: n.params.clone(), - inferred: n.inferred.clone(), - return_cardinality: n.return_cardinality.clone(), - uses: n.uses.clone(), - body: n.body.clone(), - transport: n.transport.clone(), - properties: n.properties.clone(), - type_annotation: n.type_annotation.clone(), - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}), - diagnostics: el_diags, -}) -}, - None => Rc::new(NodeResolveResult { - resolved: n.clone(), - diagnostics: Rc::new(vec![]), -}), -} -} - } else { - if ((n.children.clone().len() as i64) == 0) { - if is_recursive_type_for(&env, &n) { + let resolved_child = Rc::new(Node { + name: el_param_name, + span: child_node.span.clone(), + ident_span: child_node.ident_span.clone(), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::Resolved { + node: el_resolved, + })), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); Rc::new(NodeResolveResult { - resolved: n.clone(), - diagnostics: Rc::new(vec![]), -}) - } else { - match lookup_type_for(&env, &n) { - Some(resolved) => { - let structurally_resolved = if (((resolved.connective.clone() == Connective::NoConnective) && ((resolved.children.clone().len() as i64) == 0)) && (resolved.inferred.clone() != None)) { - match resolved.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: target, .. }) => target.clone(), - _ => resolved.clone(), -} + resolved: Rc::new(Node { + name: type_name.clone(), + span: n.span.clone(), + ident_span: n.ident_span.clone(), + children: Rc::new(vec![resolved_child]), + connective: n.connective.clone(), + params: n.params.clone(), + inferred: n.inferred.clone(), + return_cardinality: n.return_cardinality.clone(), + uses: n.uses.clone(), + body: n.body.clone(), + transport: n.transport.clone(), + properties: n.properties.clone(), + type_annotation: n.type_annotation.clone(), + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }), + diagnostics: el_diags, + }) + } + None => Rc::new(NodeResolveResult { + resolved: n.clone(), + diagnostics: Rc::new(vec![]), + }), + } + } + } else { + if ((n.children.clone().len() as i64) == 0) { + if is_recursive_type_for(&env, &n) { + Rc::new(NodeResolveResult { + resolved: n.clone(), + diagnostics: Rc::new(vec![]), + }) + } else { + match lookup_type_for(&env, &n) { + Some(resolved) => { + let structurally_resolved = if (((resolved + .connective + .clone() + == Connective::NoConnective) + && ((resolved.children.clone().len() as i64) == 0)) + && (resolved.inferred.clone() != None)) + { + match resolved.inferred.clone().as_deref().cloned() + { + Some(InferredNode::Resolved { + node: target, + .. + }) => target.clone(), + _ => resolved.clone(), + } } else { resolved.clone() }; -let is_optional = (n.return_cardinality.clone() == Cardinality::CardOptional); -let final_resolved = if is_optional { + let is_optional = (n.return_cardinality.clone() + == Cardinality::CardOptional); + let final_resolved = if is_optional { with_optional_cardinality(&structurally_resolved) } else { structurally_resolved }; -Rc::new(NodeResolveResult { - resolved: final_resolved, - diagnostics: Rc::new(vec![]), -}) -}, - None => { + Rc::new(NodeResolveResult { + resolved: final_resolved, + diagnostics: Rc::new(vec![]), + }) + } + None => { let n_is_error = if (n.inferred.clone() != None) { - is_compiler_error(n.inferred.clone().clone().unwrap()) + is_compiler_error( + n.inferred.clone().clone().unwrap(), + ) } else { false }; -let n_is_callable = ((n.params.clone().len() as i64) > 0); -let n_is_type_var = if (n.inferred.clone() != None) { - is_type_variable(n.inferred.clone().clone().unwrap()) + let n_is_callable = + ((n.params.clone().len() as i64) > 0); + let n_is_type_var = if (n.inferred.clone() != None) { + is_type_variable( + n.inferred.clone().clone().unwrap(), + ) } else { false }; -if (((is_kernel_type(authored_name(env.clone(), n.clone())) || n_is_type_var) || n_is_error) || n_is_callable) { + if (((is_kernel_type(authored_name( + env.clone(), + n.clone(), + )) || n_is_type_var) + || n_is_error) + || n_is_callable) + { Rc::new(NodeResolveResult { - resolved: n.clone(), - diagnostics: Rc::new(vec![]), -}) + resolved: n.clone(), + diagnostics: Rc::new(vec![]), + }) } else { Rc::new(NodeResolveResult { - resolved: n.clone(), - diagnostics: Rc::new(vec![make_error_node(Rc::new(CompilerDiagnostic::UnresolvedType { - name: authored_name(env.clone(), n.clone()), - span: n.span.clone(), -}), module_name.clone())]), -}) + resolved: n.clone(), + diagnostics: Rc::new(vec![make_error_node( + Rc::new( + CompilerDiagnostic::UnresolvedType { + name: authored_name( + env.clone(), + n.clone(), + ), + span: n.span.clone(), + }, + ), + module_name.clone(), + )]), + }) } -}, -} + } } - } else { - Rc::new(NodeResolveResult { - resolved: n.clone(), - diagnostics: Rc::new(vec![]), -}) } + } else { + Rc::new(NodeResolveResult { + resolved: n.clone(), + diagnostics: Rc::new(vec![]), + }) } } -} + } } } -} + } }) } -pub fn resolve_optional_node(n: &Option>, env: Rc, module_name: String) -> Rc { +pub fn resolve_optional_node( + n: &Option>, + env: Rc, + module_name: String, +) -> Rc { if (n.clone() == None) { Rc::new(NodeResolveResult { - resolved: unit_type(), - diagnostics: Rc::new(vec![]), -}) + resolved: unit_type(), + diagnostics: Rc::new(vec![]), + }) } else { match (*n.clone().unwrap()).clone() { - InferredNode::Resolved { node: inner, .. } => resolve_node(inner.clone(), env, module_name), - InferredNode::CompilerError { message: msg, span: sp, .. } => Rc::new(NodeResolveResult { - resolved: make_expr_error_node(ExprErrorKind::SemanticExprError, &msg, &sp), - diagnostics: Rc::new(vec![make_error_node(Rc::new(CompilerDiagnostic::InternalError { - message: msg.clone(), - span: sp.clone(), -}), module_name)]), -}), - InferredNode::TypeVariable { .. } => Rc::new(NodeResolveResult { - resolved: unit_type(), - diagnostics: Rc::new(vec![]), -}), -} + InferredNode::Resolved { node: inner, .. } => { + resolve_node(inner.clone(), env, module_name) + } + InferredNode::CompilerError { + message: msg, + span: sp, + .. + } => Rc::new(NodeResolveResult { + resolved: make_expr_error_node(ExprErrorKind::SemanticExprError, &msg, &sp), + diagnostics: Rc::new(vec![make_error_node( + Rc::new(CompilerDiagnostic::InternalError { + message: msg.clone(), + span: sp.clone(), + }), + module_name, + )]), + }), + InferredNode::TypeVariable { .. } => Rc::new(NodeResolveResult { + resolved: unit_type(), + diagnostics: Rc::new(vec![]), + }), + } } } pub fn resolve_field(field: &Rc, env: &Rc, module_name: &String) -> Rc { { - let type_result = resolve_node(field_node_type_expr(&field), env.clone(), module_name.clone()); -let type_resolved = type_result.resolved.clone(); -let type_diags = type_result.diagnostics.clone(); -let default_resolved = match field_node_default_value(&field) { - Some(default_value) => Some(resolve_expr_types(&default_value, &env, module_name.clone())), - None => None, -}; -let default_diags = match default_resolved.clone() { - Some(result) => result.diagnostics.clone(), - None => Rc::new(vec![]), -}; -Rc::new(FieldResult { - field: make_field_node(&field_node_name_at(field.clone(), env.source_indices.clone()), type_resolved, field_node_cardinality(field.clone()), match default_resolved.clone() { - Some(result) => Some(result.expr.clone()), - None => None, -}, field_node_from_key(field.clone(), env.source_indices.clone()), field.span.clone(), node_name_span(&field)), - diagnostics: v2_rt::concat(type_diags, default_diags), -}) -} + let type_result = resolve_node( + field_node_type_expr(&field), + env.clone(), + module_name.clone(), + ); + let type_resolved = type_result.resolved.clone(); + let type_diags = type_result.diagnostics.clone(); + let default_resolved = match field_node_default_value(&field) { + Some(default_value) => Some(resolve_expr_types( + &default_value, + &env, + module_name.clone(), + )), + None => None, + }; + let default_diags = match default_resolved.clone() { + Some(result) => result.diagnostics.clone(), + None => Rc::new(vec![]), + }; + Rc::new(FieldResult { + field: make_field_node( + &field_node_name_at(field.clone(), env.source_indices.clone()), + type_resolved, + field_node_cardinality(field.clone()), + match default_resolved.clone() { + Some(result) => Some(result.expr.clone()), + None => None, + }, + field_node_from_key(field.clone(), env.source_indices.clone()), + field.span.clone(), + node_name_span(&field), + ), + diagnostics: v2_rt::concat(type_diags, default_diags), + }) + } } pub fn resolve_param(param: &Rc, env: &Rc, module_name: &String) -> Rc { { - let type_result = resolve_node(param_node_type_expr(¶m), env.clone(), module_name.clone()); -let type_resolved = type_result.resolved.clone(); -let type_diags = type_result.diagnostics.clone(); -let default_resolved = match param_node_default_value(¶m) { - Some(default_value) => Some(resolve_expr_types(&default_value, &env, module_name.clone())), - None => None, -}; -let default_diags = match default_resolved.clone() { - Some(result) => result.diagnostics.clone(), - None => Rc::new(vec![]), -}; -Rc::new(ParamResult { - param: make_param_node(¶m_node_name_at(param.clone(), env.source_indices.clone()), type_resolved, match default_resolved.clone() { - Some(result) => Some(result.expr.clone()), - None => None, -}, param.span.clone(), node_name_span(¶m)), - diagnostics: v2_rt::concat(type_diags, default_diags), -}) -} + let type_result = resolve_node( + param_node_type_expr(¶m), + env.clone(), + module_name.clone(), + ); + let type_resolved = type_result.resolved.clone(); + let type_diags = type_result.diagnostics.clone(); + let default_resolved = match param_node_default_value(¶m) { + Some(default_value) => Some(resolve_expr_types( + &default_value, + &env, + module_name.clone(), + )), + None => None, + }; + let default_diags = match default_resolved.clone() { + Some(result) => result.diagnostics.clone(), + None => Rc::new(vec![]), + }; + Rc::new(ParamResult { + param: make_param_node( + ¶m_node_name_at(param.clone(), env.source_indices.clone()), + type_resolved, + match default_resolved.clone() { + Some(result) => Some(result.expr.clone()), + None => None, + }, + param.span.clone(), + node_name_span(¶m), + ), + diagnostics: v2_rt::concat(type_diags, default_diags), + }) + } } -pub fn resolve_resource_use(ru: &Rc, env: &Rc, module_name: String) -> Rc { +pub fn resolve_resource_use( + ru: &Rc, + env: &Rc, + module_name: String, +) -> Rc { { let type_result = resolve_node(resource_use_resource(&ru), env.clone(), module_name); -let type_resolved = type_result.resolved.clone(); -let type_diags = type_result.diagnostics.clone(); -Rc::new(ResourceUseResult { - resource_use: make_resource_use_node(&resource_use_name_at(ru.clone(), env.source_indices.clone()), type_resolved, ru.span.clone(), node_name_span(&ru)), - diagnostics: type_diags, -}) -} + let type_resolved = type_result.resolved.clone(); + let type_diags = type_result.diagnostics.clone(); + Rc::new(ResourceUseResult { + resource_use: make_resource_use_node( + &resource_use_name_at(ru.clone(), env.source_indices.clone()), + type_resolved, + ru.span.clone(), + node_name_span(&ru), + ), + diagnostics: type_diags, + }) + } } -pub fn resolve_named_arg(arg: &Rc, env: &Rc, module_name: String) -> Rc { +pub fn resolve_named_arg( + arg: &Rc, + env: &Rc, + module_name: String, +) -> Rc { { let value_result = resolve_expr_types(&arg_value(&arg), &env, module_name); -let value_expr = value_result.expr.clone(); -let value_diags = value_result.diagnostics.clone(); -Rc::new(NamedArgResolveResult { - arg: make_arg_node(arg_name_at(arg.clone(), env.source_indices.clone()), value_expr, arg.span.clone(), node_name_span(&arg)), - diagnostics: value_diags, -}) -} + let value_expr = value_result.expr.clone(); + let value_diags = value_result.diagnostics.clone(); + Rc::new(NamedArgResolveResult { + arg: make_arg_node( + arg_name_at(arg.clone(), env.source_indices.clone()), + value_expr, + arg.span.clone(), + node_name_span(&arg), + ), + diagnostics: value_diags, + }) + } } -pub fn resolve_field_init(field_init: &Rc, env: &Rc, module_name: String) -> Rc { +pub fn resolve_field_init( + field_init: &Rc, + env: &Rc, + module_name: String, +) -> Rc { { - let value_result = resolve_expr_types(&field_init_node_value(&field_init), &env, module_name); -let value_expr = value_result.expr.clone(); -let value_diags = value_result.diagnostics.clone(); -Rc::new(FieldInitResolveResult { - field_init: make_field_init_node(&field_init_node_name_at(field_init.clone(), env.source_indices.clone()), value_expr, field_init.span.clone(), node_name_span(&field_init)), - diagnostics: value_diags, -}) -} + let value_result = + resolve_expr_types(&field_init_node_value(&field_init), &env, module_name); + let value_expr = value_result.expr.clone(); + let value_diags = value_result.diagnostics.clone(); + Rc::new(FieldInitResolveResult { + field_init: make_field_init_node( + &field_init_node_name_at(field_init.clone(), env.source_indices.clone()), + value_expr, + field_init.span.clone(), + node_name_span(&field_init), + ), + diagnostics: value_diags, + }) + } } -pub fn resolve_match_arm(arm: &Rc, env: &Rc, module_name: &String) -> Rc { +pub fn resolve_match_arm( + arm: &Rc, + env: &Rc, + module_name: &String, +) -> Rc { { let arm_g = arm_guard(&arm); -let guard_result = match arm_g { - Some(guard) => Some(resolve_expr_types(&guard, &env, module_name.clone())), - None => None, -}; -let guard_diags = match guard_result.clone() { - Some(result) => result.diagnostics.clone(), - None => Rc::new(vec![]), -}; -let body_result = resolve_expr_types(&arm_body(&arm), &env, module_name.clone()); -let body_expr = body_result.expr.clone(); -let body_diags = body_result.diagnostics.clone(); -Rc::new(MatchArmResolveResult { - arm: make_arm_node(arm_pattern(arm.clone()), match guard_result.clone() { - Some(result) => Some(result.expr.clone()), - None => None, -}, body_expr, arm.span.clone()), - diagnostics: v2_rt::concat(guard_diags, body_diags), -}) -} + let guard_result = match arm_g { + Some(guard) => Some(resolve_expr_types(&guard, &env, module_name.clone())), + None => None, + }; + let guard_diags = match guard_result.clone() { + Some(result) => result.diagnostics.clone(), + None => Rc::new(vec![]), + }; + let body_result = resolve_expr_types(&arm_body(&arm), &env, module_name.clone()); + let body_expr = body_result.expr.clone(); + let body_diags = body_result.diagnostics.clone(); + Rc::new(MatchArmResolveResult { + arm: make_arm_node( + arm_pattern(arm.clone()), + match guard_result.clone() { + Some(result) => Some(result.expr.clone()), + None => None, + }, + body_expr, + arm.span.clone(), + ), + diagnostics: v2_rt::concat(guard_diags, body_diags), + }) + } } -pub fn resolve_string_part(part: Rc, env: Rc, module_name: String) -> Rc { +pub fn resolve_string_part( + part: Rc, + env: Rc, + module_name: String, +) -> Rc { match (*part).clone() { - StringPart::Text { value, .. } => Rc::new(StringPartResolveResult { - part: Rc::new(StringPart::Text { - value: value.clone(), -}), - diagnostics: Rc::new(vec![]), -}), - StringPart::Interpolation { expr, .. } => { - let expr_result = resolve_expr_types(&expr, &env, module_name); -let resolved_expr = expr_result.expr.clone(); -let expr_diags = expr_result.diagnostics.clone(); -Rc::new(StringPartResolveResult { - part: Rc::new(StringPart::Interpolation { - expr: resolved_expr, -}), - diagnostics: expr_diags, -}) -}, -} + StringPart::Text { value, .. } => Rc::new(StringPartResolveResult { + part: Rc::new(StringPart::Text { + value: value.clone(), + }), + diagnostics: Rc::new(vec![]), + }), + StringPart::Interpolation { expr, .. } => { + let expr_result = resolve_expr_types(&expr, &env, module_name); + let resolved_expr = expr_result.expr.clone(); + let expr_diags = expr_result.diagnostics.clone(); + Rc::new(StringPartResolveResult { + part: Rc::new(StringPart::Interpolation { + expr: resolved_expr, + }), + diagnostics: expr_diags, + }) + } + } } -pub fn resolve_transport_binding(transport: &Rc, env: &Rc, module_name: &String) -> Rc { +pub fn resolve_transport_binding( + transport: &Rc, + env: &Rc, + module_name: &String, +) -> Rc { if is_local_transport(&transport, &env.source_indices.clone()) { Rc::new(TransportResolveResult { - transport: transport.clone(), - diagnostics: Rc::new(vec![]), -}) + transport: transport.clone(), + diagnostics: Rc::new(vec![]), + }) } else { { - let prop_results = Rc::new({ let mut __result = Vec::new(); for p in transport.properties.clone().iter().cloned() { __result.push({ - let val_result = resolve_expr_types(&field_init_node_value(&p), &env, module_name.clone()); -Rc::new(FieldInitResolveResult { - field_init: make_field_init_node(&field_init_node_name_at(p.clone(), env.source_indices.clone()), val_result.expr.clone(), p.span.clone(), node_name_span(&p)), - diagnostics: val_result.diagnostics.clone(), -}) -}); } __result }); -let resolved_props = Rc::new({ let mut __result = Vec::new(); for pr in prop_results.clone().iter().cloned() { __result.push(pr.field_init.clone()); } __result }); -let prop_diags = Rc::new({ let mut __result = Vec::new(); for pr in prop_results.clone().iter().cloned() { __result.extend((*pr.diagnostics.clone()).iter().cloned()); } __result }); -let child_results = Rc::new({ let mut __result = Vec::new(); for c in transport.children.clone().iter().cloned() { __result.push(resolve_expr_types(&c, &env, module_name.clone())); } __result }); -let resolved_children = Rc::new({ let mut __result = Vec::new(); for cr in child_results.clone().iter().cloned() { __result.push(cr.expr.clone()); } __result }); -let child_diags = Rc::new({ let mut __result = Vec::new(); for cr in child_results.clone().iter().cloned() { __result.extend((*cr.diagnostics.clone()).iter().cloned()); } __result }); -let body_diags = match transport_request_body(transport.clone(), env.source_indices.clone()) { - Some(b) => match (*b.expr_data.clone()).clone() { - ExprData::ExprRecordLit { .. } => Rc::new(vec![]), - _ => Rc::new(vec![make_error_node(Rc::new(CompilerDiagnostic::InternalError { + let prop_results = Rc::new({ + let mut __result = Vec::new(); + for p in transport.properties.clone().iter().cloned() { + __result.push({ + let val_result = resolve_expr_types( + &field_init_node_value(&p), + &env, + module_name.clone(), + ); + Rc::new(FieldInitResolveResult { + field_init: make_field_init_node( + &field_init_node_name_at(p.clone(), env.source_indices.clone()), + val_result.expr.clone(), + p.span.clone(), + node_name_span(&p), + ), + diagnostics: val_result.diagnostics.clone(), + }) + }); + } + __result + }); + let resolved_props = Rc::new({ + let mut __result = Vec::new(); + for pr in prop_results.clone().iter().cloned() { + __result.push(pr.field_init.clone()); + } + __result + }); + let prop_diags = Rc::new({ + let mut __result = Vec::new(); + for pr in prop_results.clone().iter().cloned() { + __result.extend((*pr.diagnostics.clone()).iter().cloned()); + } + __result + }); + let child_results = Rc::new({ + let mut __result = Vec::new(); + for c in transport.children.clone().iter().cloned() { + __result.push(resolve_expr_types(&c, &env, module_name.clone())); + } + __result + }); + let resolved_children = Rc::new({ + let mut __result = Vec::new(); + for cr in child_results.clone().iter().cloned() { + __result.push(cr.expr.clone()); + } + __result + }); + let child_diags = Rc::new({ + let mut __result = Vec::new(); + for cr in child_results.clone().iter().cloned() { + __result.extend((*cr.diagnostics.clone()).iter().cloned()); + } + __result + }); + let body_diags = + match transport_request_body(transport.clone(), env.source_indices.clone()) { + Some(b) => match (*b.expr_data.clone()).clone() { + ExprData::ExprRecordLit { .. } => Rc::new(vec![]), + _ => Rc::new( + vec![make_error_node(Rc::new(CompilerDiagnostic::InternalError { message: "transport body must be a record expression { field: value, ... }".to_string(), span: b.span.clone(), -}), module_name.clone())]), -}, - None => Rc::new(vec![]), -}; -Rc::new(TransportResolveResult { - transport: make_transport_node(resolved_props, resolved_children, transport.body.clone(), transport.span.clone()), - diagnostics: v2_rt::concat(v2_rt::concat(prop_diags, child_diags), body_diags), -}) -} +}), module_name.clone())], + ), + }, + None => Rc::new(vec![]), + }; + Rc::new(TransportResolveResult { + transport: make_transport_node( + resolved_props, + resolved_children, + transport.body.clone(), + transport.span.clone(), + ), + diagnostics: v2_rt::concat(v2_rt::concat(prop_diags, child_diags), body_diags), + }) + } } } -pub fn resolve_expr_types(texpr: &Rc, env: &Rc, module_name: String) -> Rc { +pub fn resolve_expr_types( + texpr: &Rc, + env: &Rc, + module_name: String, +) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*texpr.expr_data.clone()).clone() { - ExprData::ExprLiteral { .. } => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), -}), - ExprData::ExprError { kind, message, .. } => Rc::new(ExprResolveResult { - expr: make_expr_error_node(kind.clone(), &message, &texpr.span.clone()), - diagnostics: Rc::new(vec![make_error_node(Rc::new(CompilerDiagnostic::InternalError { - message: message.clone(), - span: texpr.span.clone(), -}), module_name.clone())]), -}), - ExprData::ExprVar { .. } => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), -}), - ExprData::ExprFieldAccess { .. } => { - let r = match texpr.children.clone().first().cloned() { - Some(base) => resolve_expr_types(&base, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), -}), -}; -Rc::new(ExprResolveResult { - expr: map_children(&texpr, |child| r.expr.clone()), - diagnostics: r.diagnostics.clone(), -}) -}, - ExprData::ExprCall { call_semantics: cs, descent_evidence: de, .. } => { - let resolved_children = Rc::new({ let mut __result = Vec::new(); for arg_node in texpr.children.clone().iter().cloned() { __result.push({ - let val = match arg_node.children.clone().first().cloned() { - Some(v) => v.clone(), - None => arg_node.clone(), -}; -let vr = resolve_expr_types(&val, &env, module_name.clone()); -make_arg_node(if (arg_node.ident_span.clone() == None) { - None - } else { - Some(authored_name(env.clone(), arg_node.clone())) - }, vr.expr.clone(), arg_node.span.clone(), node_name_span(&arg_node)) -}); } __result }); -let all_diags = Rc::new({ let mut __result = Vec::new(); for arg_node in texpr.children.clone().iter().cloned() { __result.extend((*{ - let val = match arg_node.children.clone().first().cloned() { - Some(v) => v.clone(), - None => arg_node.clone(), -}; -let vr = resolve_expr_types(&val, &env, module_name.clone()); -vr.diagnostics.clone() -}).iter().cloned()); } __result }); -Rc::new(ExprResolveResult { - expr: make_named_expr_node(&expr_call_func_at(texpr.clone(), env.source_indices.clone()), Rc::new(ExprData::ExprCall { - call_semantics: cs.clone(), - descent_evidence: de.clone(), -}), resolved_children, texpr.inferred.clone(), texpr.span.clone(), node_name_span(&texpr)), - diagnostics: all_diags, -}) -}, - ExprData::ExprMethodCall { method_semantics: ms, .. } => { - let resolved_children = Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(texpr.children.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { __result.push({ - let idx = pair.0.clone(); -let child = pair.1.clone(); -if (idx.clone() == 0) { + ExprData::ExprLiteral { .. } => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), + }), + ExprData::ExprError { kind, message, .. } => Rc::new(ExprResolveResult { + expr: make_expr_error_node(kind.clone(), &message, &texpr.span.clone()), + diagnostics: Rc::new(vec![make_error_node( + Rc::new(CompilerDiagnostic::InternalError { + message: message.clone(), + span: texpr.span.clone(), + }), + module_name.clone(), + )]), + }), + ExprData::ExprVar { .. } => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), + }), + ExprData::ExprFieldAccess { .. } => { + let r = match texpr.children.clone().first().cloned() { + Some(base) => resolve_expr_types(&base, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), + }), + }; + Rc::new(ExprResolveResult { + expr: map_children(&texpr, |child| r.expr.clone()), + diagnostics: r.diagnostics.clone(), + }) + } + ExprData::ExprCall { + call_semantics: cs, + descent_evidence: de, + .. + } => { + let resolved_children = Rc::new({ + let mut __result = Vec::new(); + for arg_node in texpr.children.clone().iter().cloned() { + __result.push({ + let val = match arg_node.children.clone().first().cloned() { + Some(v) => v.clone(), + None => arg_node.clone(), + }; + let vr = resolve_expr_types(&val, &env, module_name.clone()); + make_arg_node( + if (arg_node.ident_span.clone() == None) { + None + } else { + Some(authored_name(env.clone(), arg_node.clone())) + }, + vr.expr.clone(), + arg_node.span.clone(), + node_name_span(&arg_node), + ) + }); + } + __result + }); + let all_diags = Rc::new({ + let mut __result = Vec::new(); + for arg_node in texpr.children.clone().iter().cloned() { + __result.extend( + (*{ + let val = match arg_node.children.clone().first().cloned() { + Some(v) => v.clone(), + None => arg_node.clone(), + }; + let vr = resolve_expr_types(&val, &env, module_name.clone()); + vr.diagnostics.clone() + }) + .iter() + .cloned(), + ); + } + __result + }); + Rc::new(ExprResolveResult { + expr: make_named_expr_node( + &expr_call_func_at(texpr.clone(), env.source_indices.clone()), + Rc::new(ExprData::ExprCall { + call_semantics: cs.clone(), + descent_evidence: de.clone(), + }), + resolved_children, + texpr.inferred.clone(), + texpr.span.clone(), + node_name_span(&texpr), + ), + diagnostics: all_diags, + }) + } + ExprData::ExprMethodCall { + method_semantics: ms, + .. + } => { + let resolved_children = Rc::new({ + let mut __result = Vec::new(); + for pair in Rc::new( + texpr + .children + .clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() { - let rr = resolve_expr_types(&child, &env, module_name.clone()); -rr.expr.clone() -} - } else { + __result.push({ + let idx = pair.0.clone(); + let child = pair.1.clone(); + if (idx.clone() == 0) { + { + let rr = resolve_expr_types(&child, &env, module_name.clone()); + rr.expr.clone() + } + } else { + { + let val = match child.children.clone().first().cloned() { + Some(v) => v.clone(), + None => child.clone(), + }; + let vr = resolve_expr_types(&val, &env, module_name.clone()); + make_arg_node( + if (child.ident_span.clone() == None) { + None + } else { + Some(authored_name_at( + env.source_indices.clone(), + &child, + )) + }, + vr.expr.clone(), + child.span.clone(), + node_name_span(&child), + ) + } + } + }); + } + __result + }); + let all_diags = Rc::new({ + let mut __result = Vec::new(); + for pair in Rc::new( + texpr + .children + .clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() { - let val = match child.children.clone().first().cloned() { - Some(v) => v.clone(), - None => child.clone(), -}; -let vr = resolve_expr_types(&val, &env, module_name.clone()); -make_arg_node(if (child.ident_span.clone() == None) { - None - } else { - Some(authored_name_at(env.source_indices.clone(), &child)) - }, vr.expr.clone(), child.span.clone(), node_name_span(&child)) -} - } -}); } __result }); -let all_diags = Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(texpr.children.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { __result.extend((*{ - let idx = pair.0.clone(); -let child = pair.1.clone(); -if (idx.clone() == 0) { + __result.extend( + (*{ + let idx = pair.0.clone(); + let child = pair.1.clone(); + if (idx.clone() == 0) { + { + let rr = + resolve_expr_types(&child, &env, module_name.clone()); + rr.diagnostics.clone() + } + } else { + { + let val = match child.children.clone().first().cloned() { + Some(v) => v.clone(), + None => child.clone(), + }; + let vr = + resolve_expr_types(&val, &env, module_name.clone()); + vr.diagnostics.clone() + } + } + }) + .iter() + .cloned(), + ); + } + __result + }); + Rc::new(ExprResolveResult { + expr: make_named_expr_node( + &expr_method_name_at(texpr.clone(), env.source_indices.clone()), + Rc::new(ExprData::ExprMethodCall { + method_semantics: ms.clone(), + }), + resolved_children, + texpr.inferred.clone(), + texpr.span.clone(), + node_name_span(&texpr), + ), + diagnostics: all_diags, + }) + } + ExprData::ExprMatch => { + let resolved_children = Rc::new({ + let mut __result = Vec::new(); + for pair in Rc::new( + texpr + .children + .clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() { - let rr = resolve_expr_types(&child, &env, module_name.clone()); -rr.diagnostics.clone() -} - } else { + __result.push({ + let idx = pair.0.clone(); + let child = pair.1.clone(); + if (idx.clone() == 0) { + { + let sr = resolve_expr_types(&child, &env, module_name.clone()); + sr.expr.clone() + } + } else { + { + let arm_ch = child.children.clone(); + let has_guard = ((arm_ch.clone().len() as i64) == 2); + if has_guard.clone() { + { + let guard_r = match arm_ch.clone().first().cloned() { + Some(g) => resolve_expr_types( + &g, + &env, + module_name.clone(), + ), + None => Rc::new(ExprResolveResult { + expr: child.clone(), + diagnostics: Rc::new(vec![]), + }), + }; + let body_r = + match arm_ch.clone().get(1 as usize).cloned() { + Some(b) => resolve_expr_types( + &b, + &env, + module_name.clone(), + ), + None => Rc::new(ExprResolveResult { + expr: child.clone(), + diagnostics: Rc::new(vec![]), + }), + }; + make_arm_node( + match child.match_pattern.clone() { + Some(p) => p.clone(), + None => Rc::new(MatchPattern::Wildcard), + }, + Some(guard_r.expr.clone()), + body_r.expr.clone(), + child.span.clone(), + ) + } + } else { + { + let body_r = match arm_ch.clone().first().cloned() { + Some(b) => resolve_expr_types( + &b, + &env, + module_name.clone(), + ), + None => Rc::new(ExprResolveResult { + expr: child.clone(), + diagnostics: Rc::new(vec![]), + }), + }; + make_arm_node( + match child.match_pattern.clone() { + Some(p) => p.clone(), + None => Rc::new(MatchPattern::Wildcard), + }, + None, + body_r.expr.clone(), + child.span.clone(), + ) + } + } + } + } + }); + } + __result + }); + let all_diags = Rc::new({ + let mut __result = Vec::new(); + for pair in Rc::new( + texpr + .children + .clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() { - let val = match child.children.clone().first().cloned() { - Some(v) => v.clone(), - None => child.clone(), -}; -let vr = resolve_expr_types(&val, &env, module_name.clone()); -vr.diagnostics.clone() + __result.extend( + (*{ + let idx = pair.0.clone(); + let child = pair.1.clone(); + if (idx.clone() == 0) { + { + let sr = + resolve_expr_types(&child, &env, module_name.clone()); + sr.diagnostics.clone() + } + } else { + { + let arm_ch = child.children.clone(); + let has_guard = ((arm_ch.clone().len() as i64) == 2); + if has_guard.clone() { + { + let guard_r = match arm_ch.clone().first().cloned() + { + Some(g) => resolve_expr_types( + &g, + &env, + module_name.clone(), + ), + None => Rc::new(ExprResolveResult { + expr: child.clone(), + diagnostics: Rc::new(vec![]), + }), + }; + let body_r = + match arm_ch.clone().get(1 as usize).cloned() { + Some(b) => resolve_expr_types( + &b, + &env, + module_name.clone(), + ), + None => Rc::new(ExprResolveResult { + expr: child.clone(), + diagnostics: Rc::new(vec![]), + }), + }; + v2_rt::concat( + guard_r.diagnostics.clone(), + body_r.diagnostics.clone(), + ) + } + } else { + { + let body_r = match arm_ch.clone().first().cloned() { + Some(b) => resolve_expr_types( + &b, + &env, + module_name.clone(), + ), + None => Rc::new(ExprResolveResult { + expr: child.clone(), + diagnostics: Rc::new(vec![]), + }), + }; + body_r.diagnostics.clone() + } + } + } + } + }) + .iter() + .cloned(), + ); + } + __result + }); + Rc::new(ExprResolveResult { + expr: make_expr_node( + Rc::new(ExprData::ExprMatch), + resolved_children, + texpr.inferred.clone(), + texpr.span.clone(), + ), + diagnostics: all_diags, + }) + } + ExprData::ExprIf => { + let ch = texpr.children.clone(); + let cr = match ch.clone().first().cloned() { + Some(c) => resolve_expr_types(&c, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), + }), + }; + let tr = match ch.clone().get(1 as usize).cloned() { + Some(t) => resolve_expr_types(&t, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), + }), + }; + let er = match ch.clone().get(2 as usize).cloned() { + Some(e) => Some(resolve_expr_types(&e, &env, module_name.clone())), + None => None, + }; + let resolved_children = match er.clone() { + Some(r) => Rc::new(vec![cr.expr.clone(), tr.expr.clone(), r.expr.clone()]), + None => Rc::new(vec![cr.expr.clone(), tr.expr.clone()]), + }; + Rc::new(ExprResolveResult { + expr: make_expr_node( + Rc::new(ExprData::ExprIf), + resolved_children, + texpr.inferred.clone(), + texpr.span.clone(), + ), + diagnostics: v2_rt::concat( + v2_rt::concat(cr.diagnostics.clone(), tr.diagnostics.clone()), + match er.clone() { + Some(r) => r.diagnostics.clone(), + None => Rc::new(vec![]), + }, + ), + }) + } + ExprData::ExprLet => { + let ch = texpr.children.clone(); + let vr = match ch.clone().first().cloned() { + Some(v) => resolve_expr_types(&v, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), + }), + }; + let br = match ch.clone().get(1 as usize).cloned() { + Some(bd) => Some(resolve_expr_types(&bd, &env, module_name.clone())), + None => None, + }; + let resolved_children = match br.clone() { + Some(r) => Rc::new(vec![vr.expr.clone(), r.expr.clone()]), + None => Rc::new(vec![vr.expr.clone()]), + }; + Rc::new(ExprResolveResult { + expr: make_named_expr_node( + &let_binding_name_at(texpr.clone(), env.source_indices.clone()), + Rc::new(ExprData::ExprLet), + resolved_children, + texpr.inferred.clone(), + texpr.span.clone(), + node_name_span(&texpr), + ), + diagnostics: v2_rt::concat( + vr.diagnostics.clone(), + match br.clone() { + Some(r) => r.diagnostics.clone(), + None => Rc::new(vec![]), + }, + ), + }) + } + ExprData::ExprRecordLit { + parent_enum: pe, .. + } => { + let resolved_children = Rc::new({ + let mut __result = Vec::new(); + for fi_node in texpr.children.clone().iter().cloned() { + __result.push({ + let val = match fi_node.children.clone().first().cloned() { + Some(v) => v.clone(), + None => fi_node.clone(), + }; + let vr = resolve_expr_types(&val, &env, module_name.clone()); + make_field_init_node( + &authored_name(env.clone(), fi_node.clone()), + vr.expr.clone(), + fi_node.span.clone(), + node_name_span(&fi_node), + ) + }); + } + __result + }); + let all_diags = Rc::new({ + let mut __result = Vec::new(); + for fi_node in texpr.children.clone().iter().cloned() { + __result.extend( + (*{ + let val = match fi_node.children.clone().first().cloned() { + Some(v) => v.clone(), + None => fi_node.clone(), + }; + let vr = resolve_expr_types(&val, &env, module_name.clone()); + vr.diagnostics.clone() + }) + .iter() + .cloned(), + ); + } + __result + }); + Rc::new(ExprResolveResult { + expr: make_named_expr_node( + &authored_name_at(env.source_indices.clone(), &texpr), + Rc::new(ExprData::ExprRecordLit { + parent_enum: pe.clone(), + }), + resolved_children, + texpr.inferred.clone(), + texpr.span.clone(), + node_name_span(&texpr), + ), + diagnostics: all_diags, + }) + } + ExprData::ExprListLit => { + let el_results = Rc::new({ + let mut __result = Vec::new(); + for el in texpr.children.clone().iter().cloned() { + __result.push(resolve_expr_types(&el, &env, module_name.clone())); + } + __result + }); + let resolved_children = Rc::new({ + let mut __result = Vec::new(); + for r in el_results.clone().iter().cloned() { + __result.push(r.expr.clone()); + } + __result + }); + let all_diags = Rc::new({ + let mut __result = Vec::new(); + for r in el_results.clone().iter().cloned() { + __result.extend((*r.diagnostics.clone()).iter().cloned()); + } + __result + }); + Rc::new(ExprResolveResult { + expr: make_expr_node( + Rc::new(ExprData::ExprListLit), + resolved_children, + texpr.inferred.clone(), + texpr.span.clone(), + ), + diagnostics: all_diags, + }) + } + ExprData::ExprBinOp { + op, + algebra_field: af, + .. + } => { + let ch = texpr.children.clone(); + let lr = match ch.clone().first().cloned() { + Some(l) => resolve_expr_types(&l, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), + }), + }; + let rr = match ch.clone().get(1 as usize).cloned() { + Some(r) => resolve_expr_types(&r, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), + }), + }; + Rc::new(ExprResolveResult { + expr: make_expr_node( + Rc::new(ExprData::ExprBinOp { + op: op.clone(), + algebra_field: af.clone(), + }), + Rc::new(vec![lr.expr.clone(), rr.expr.clone()]), + texpr.inferred.clone(), + texpr.span.clone(), + ), + diagnostics: v2_rt::concat(lr.diagnostics.clone(), rr.diagnostics.clone()), + }) + } + ExprData::ExprUnaryOp { op, .. } => { + let r = match texpr.children.clone().first().cloned() { + Some(o) => resolve_expr_types(&o, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), + }), + }; + Rc::new(ExprResolveResult { + expr: make_expr_node( + Rc::new(ExprData::ExprUnaryOp { op: op.clone() }), + Rc::new(vec![r.expr.clone()]), + texpr.inferred.clone(), + texpr.span.clone(), + ), + diagnostics: r.diagnostics.clone(), + }) + } + ExprData::ExprLambda => { + let lam_param_nodes = Rc::new( + texpr + .children + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ); + let r = match texpr.children.clone().first().cloned() { + Some(b) => resolve_expr_types(&b, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), + }), + }; + Rc::new(ExprResolveResult { + expr: make_expr_node( + Rc::new(ExprData::ExprLambda), + v2_rt::concat(Rc::new(vec![r.expr.clone()]), lam_param_nodes), + texpr.inferred.clone(), + texpr.span.clone(), + ), + diagnostics: r.diagnostics.clone(), + }) + } + ExprData::ExprStringInterp => { + let resolved_children = Rc::new({ + let mut __result = Vec::new(); + for part_node in texpr.children.clone().iter().cloned() { + __result.push(match (*part_node.expr_data.clone()).clone() { + ExprData::ExprLiteral { .. } => part_node.clone(), + _ => match part_node.children.clone().first().cloned() { + Some(inner) => { + let r = resolve_expr_types(&inner, &env, module_name.clone()); + make_interp_part_node(r.expr.clone(), part_node.span.clone()) + } + None => part_node.clone(), + }, + }); + } + __result + }); + let all_diags = Rc::new({ + let mut __result = Vec::new(); + for part_node in texpr.children.clone().iter().cloned() { + __result.extend( + (*match (*part_node.expr_data.clone()).clone() { + ExprData::ExprLiteral { .. } => Rc::new(vec![]), + _ => match part_node.children.clone().first().cloned() { + Some(inner) => { + let r = + resolve_expr_types(&inner, &env, module_name.clone()); + r.diagnostics.clone() + } + None => Rc::new(vec![]), + }, + }) + .iter() + .cloned(), + ); + } + __result + }); + Rc::new(ExprResolveResult { + expr: make_expr_node( + Rc::new(ExprData::ExprStringInterp), + resolved_children, + texpr.inferred.clone(), + texpr.span.clone(), + ), + diagnostics: all_diags, + }) + } + ExprData::ExprBlock => { + let stmt_results = Rc::new({ + let mut __result = Vec::new(); + for s in texpr.children.clone().iter().cloned() { + __result.push(resolve_expr_types(&s, &env, module_name.clone())); + } + __result + }); + let resolved_children = Rc::new({ + let mut __result = Vec::new(); + for r in stmt_results.clone().iter().cloned() { + __result.push(r.expr.clone()); + } + __result + }); + let all_diags = Rc::new({ + let mut __result = Vec::new(); + for r in stmt_results.clone().iter().cloned() { + __result.extend((*r.diagnostics.clone()).iter().cloned()); + } + __result + }); + Rc::new(ExprResolveResult { + expr: make_expr_node( + Rc::new(ExprData::ExprBlock), + resolved_children, + texpr.inferred.clone(), + texpr.span.clone(), + ), + diagnostics: all_diags, + }) + } + ExprData::ExprCast => { + let ch = texpr.children.clone(); + let r = match ch.clone().first().cloned() { + Some(inner) => resolve_expr_types(&inner, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), + }), + }; + let tr = match ch.clone().get(1 as usize).cloned() { + Some(target) => resolve_node(target.clone(), env.clone(), module_name.clone()), + None => Rc::new(NodeResolveResult { + resolved: unit_type(), + diagnostics: Rc::new(vec![]), + }), + }; + Rc::new(ExprResolveResult { + expr: make_expr_node( + Rc::new(ExprData::ExprCast), + Rc::new(vec![r.expr.clone(), tr.resolved.clone()]), + texpr.inferred.clone(), + texpr.span.clone(), + ), + diagnostics: v2_rt::concat(r.diagnostics.clone(), tr.diagnostics.clone()), + }) + } + ExprData::ExprForEach => { + let ch = texpr.children.clone(); + let cr = match ch.clone().first().cloned() { + Some(c) => resolve_expr_types(&c, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), + }), + }; + let br = match ch.clone().get(1 as usize).cloned() { + Some(b) => resolve_expr_types(&b, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), + }), + }; + Rc::new(ExprResolveResult { + expr: make_named_expr_node( + &foreach_variable_at(texpr.clone(), env.source_indices.clone()), + Rc::new(ExprData::ExprForEach), + Rc::new(vec![cr.expr.clone(), br.expr.clone()]), + texpr.inferred.clone(), + texpr.span.clone(), + node_name_span(&texpr), + ), + diagnostics: v2_rt::concat(cr.diagnostics.clone(), br.diagnostics.clone()), + }) + } + ExprData::ExprIndex => { + let ch = texpr.children.clone(); + let br = match ch.clone().first().cloned() { + Some(base) => resolve_expr_types(&base, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), + }), + }; + let ir = match ch.clone().get(1 as usize).cloned() { + Some(index) => resolve_expr_types(&index, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), + }), + }; + Rc::new(ExprResolveResult { + expr: make_expr_node( + Rc::new(ExprData::ExprIndex), + Rc::new(vec![br.expr.clone(), ir.expr.clone()]), + texpr.inferred.clone(), + texpr.span.clone(), + ), + diagnostics: v2_rt::concat(br.diagnostics.clone(), ir.diagnostics.clone()), + }) + } + ExprData::ExprSlice => { + let ch = texpr.children.clone(); + let br = match ch.clone().first().cloned() { + Some(base) => resolve_expr_types(&base, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), + }), + }; + let sr = match ch.clone().get(1 as usize).cloned() { + Some(start) => resolve_expr_types(&start, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), + }), + }; + let er = match ch.clone().get(2 as usize).cloned() { + Some(end_e) => resolve_expr_types(&end_e, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), + }), + }; + Rc::new(ExprResolveResult { + expr: make_expr_node( + Rc::new(ExprData::ExprSlice), + Rc::new(vec![br.expr.clone(), sr.expr.clone(), er.expr.clone()]), + texpr.inferred.clone(), + texpr.span.clone(), + ), + diagnostics: v2_rt::concat( + v2_rt::concat(br.diagnostics.clone(), sr.diagnostics.clone()), + er.diagnostics.clone(), + ), + }) + } + ExprData::ExprReturn => { + let r = match texpr.children.clone().first().cloned() { + Some(inner) => resolve_expr_types(&inner, &env, module_name.clone()), + None => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), + }), + }; + Rc::new(ExprResolveResult { + expr: make_expr_node( + Rc::new(ExprData::ExprReturn), + Rc::new(vec![r.expr.clone()]), + texpr.inferred.clone(), + texpr.span.clone(), + ), + diagnostics: r.diagnostics.clone(), + }) + } + ExprData::NoExprData => Rc::new(ExprResolveResult { + expr: texpr.clone(), + diagnostics: Rc::new(vec![]), + }), + } + }) } + +pub fn fn_type_param_names( + item: Rc, + source_indices: Rc>>, +) -> Rc> { + Rc::new({ + let mut __result = Vec::new(); + for p in Rc::new({ + let mut __result = Vec::new(); + for p in item.params.clone().iter().cloned() { + if (param_node_name_at(p.clone(), source_indices.clone()).as_str() + == authored_name_at(source_indices.clone(), ¶m_node_type_expr(&p)).as_str()) + { + __result.push(p); } -}).iter().cloned()); } __result }); -Rc::new(ExprResolveResult { - expr: make_named_expr_node(&expr_method_name_at(texpr.clone(), env.source_indices.clone()), Rc::new(ExprData::ExprMethodCall { - method_semantics: ms.clone(), -}), resolved_children, texpr.inferred.clone(), texpr.span.clone(), node_name_span(&texpr)), - diagnostics: all_diags, -}) -}, - ExprData::ExprMatch => { - let resolved_children = Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(texpr.children.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { __result.push({ - let idx = pair.0.clone(); -let child = pair.1.clone(); -if (idx.clone() == 0) { - { - let sr = resolve_expr_types(&child, &env, module_name.clone()); -sr.expr.clone() -} - } else { - { - let arm_ch = child.children.clone(); -let has_guard = ((arm_ch.clone().len() as i64) == 2); -if has_guard.clone() { - { - let guard_r = match arm_ch.clone().first().cloned() { - Some(g) => resolve_expr_types(&g, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: child.clone(), - diagnostics: Rc::new(vec![]), -}), -}; -let body_r = match arm_ch.clone().get(1 as usize).cloned() { - Some(b) => resolve_expr_types(&b, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: child.clone(), - diagnostics: Rc::new(vec![]), -}), -}; -make_arm_node(match child.match_pattern.clone() { - Some(p) => p.clone(), - None => Rc::new(MatchPattern::Wildcard), -}, Some(guard_r.expr.clone()), body_r.expr.clone(), child.span.clone()) -} - } else { - { - let body_r = match arm_ch.clone().first().cloned() { - Some(b) => resolve_expr_types(&b, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: child.clone(), - diagnostics: Rc::new(vec![]), -}), -}; -make_arm_node(match child.match_pattern.clone() { - Some(p) => p.clone(), - None => Rc::new(MatchPattern::Wildcard), -}, None, body_r.expr.clone(), child.span.clone()) -} - } + } + __result + }) + .iter() + .cloned() + { + __result.push(param_node_name_at(p.clone(), source_indices.clone())); + } + __result + }) } - } -}); } __result }); -let all_diags = Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(texpr.children.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { __result.extend((*{ + +pub fn has_duplicate_type_param_name(names: &Rc>) -> bool { + { + let mut __found = false; + for pair in Rc::new( + names + .clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + { + if { let idx = pair.0.clone(); -let child = pair.1.clone(); -if (idx.clone() == 0) { - { - let sr = resolve_expr_types(&child, &env, module_name.clone()); -sr.diagnostics.clone() -} - } else { + let s = pair.1.clone(); + { + let mut __found = false; + for other in Rc::new( + names + .clone() + .iter() + .cloned() + .skip((idx.clone() + 1) as usize) + .collect::>(), + ) + .iter() + .cloned() { - let arm_ch = child.children.clone(); -let has_guard = ((arm_ch.clone().len() as i64) == 2); -if has_guard.clone() { - { - let guard_r = match arm_ch.clone().first().cloned() { - Some(g) => resolve_expr_types(&g, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: child.clone(), - diagnostics: Rc::new(vec![]), -}), -}; -let body_r = match arm_ch.clone().get(1 as usize).cloned() { - Some(b) => resolve_expr_types(&b, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: child.clone(), - diagnostics: Rc::new(vec![]), -}), -}; -v2_rt::concat(guard_r.diagnostics.clone(), body_r.diagnostics.clone()) -} - } else { - { - let body_r = match arm_ch.clone().first().cloned() { - Some(b) => resolve_expr_types(&b, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: child.clone(), - diagnostics: Rc::new(vec![]), -}), -}; -body_r.diagnostics.clone() -} + if (other.clone().as_str() == s.clone().as_str()) { + __found = true; + break; } -} + } + __found } -}).iter().cloned()); } __result }); -Rc::new(ExprResolveResult { - expr: make_expr_node(Rc::new(ExprData::ExprMatch), resolved_children, texpr.inferred.clone(), texpr.span.clone()), - diagnostics: all_diags, -}) -}, - ExprData::ExprIf => { - let ch = texpr.children.clone(); -let cr = match ch.clone().first().cloned() { - Some(c) => resolve_expr_types(&c, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), -}), -}; -let tr = match ch.clone().get(1 as usize).cloned() { - Some(t) => resolve_expr_types(&t, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), -}), -}; -let er = match ch.clone().get(2 as usize).cloned() { - Some(e) => Some(resolve_expr_types(&e, &env, module_name.clone())), - None => None, -}; -let resolved_children = match er.clone() { - Some(r) => Rc::new(vec![cr.expr.clone(), tr.expr.clone(), r.expr.clone()]), - None => Rc::new(vec![cr.expr.clone(), tr.expr.clone()]), -}; -Rc::new(ExprResolveResult { - expr: make_expr_node(Rc::new(ExprData::ExprIf), resolved_children, texpr.inferred.clone(), texpr.span.clone()), - diagnostics: v2_rt::concat(v2_rt::concat(cr.diagnostics.clone(), tr.diagnostics.clone()), match er.clone() { - Some(r) => r.diagnostics.clone(), - None => Rc::new(vec![]), -}), -}) -}, - ExprData::ExprLet => { - let ch = texpr.children.clone(); -let vr = match ch.clone().first().cloned() { - Some(v) => resolve_expr_types(&v, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), -}), -}; -let br = match ch.clone().get(1 as usize).cloned() { - Some(bd) => Some(resolve_expr_types(&bd, &env, module_name.clone())), - None => None, -}; -let resolved_children = match br.clone() { - Some(r) => Rc::new(vec![vr.expr.clone(), r.expr.clone()]), - None => Rc::new(vec![vr.expr.clone()]), -}; -Rc::new(ExprResolveResult { - expr: make_named_expr_node(&let_binding_name_at(texpr.clone(), env.source_indices.clone()), Rc::new(ExprData::ExprLet), resolved_children, texpr.inferred.clone(), texpr.span.clone(), node_name_span(&texpr)), - diagnostics: v2_rt::concat(vr.diagnostics.clone(), match br.clone() { - Some(r) => r.diagnostics.clone(), - None => Rc::new(vec![]), -}), -}) -}, - ExprData::ExprRecordLit { parent_enum: pe, .. } => { - let resolved_children = Rc::new({ let mut __result = Vec::new(); for fi_node in texpr.children.clone().iter().cloned() { __result.push({ - let val = match fi_node.children.clone().first().cloned() { - Some(v) => v.clone(), - None => fi_node.clone(), -}; -let vr = resolve_expr_types(&val, &env, module_name.clone()); -make_field_init_node(&authored_name(env.clone(), fi_node.clone()), vr.expr.clone(), fi_node.span.clone(), node_name_span(&fi_node)) -}); } __result }); -let all_diags = Rc::new({ let mut __result = Vec::new(); for fi_node in texpr.children.clone().iter().cloned() { __result.extend((*{ - let val = match fi_node.children.clone().first().cloned() { - Some(v) => v.clone(), - None => fi_node.clone(), -}; -let vr = resolve_expr_types(&val, &env, module_name.clone()); -vr.diagnostics.clone() -}).iter().cloned()); } __result }); -Rc::new(ExprResolveResult { - expr: make_named_expr_node(&authored_name_at(env.source_indices.clone(), &texpr), Rc::new(ExprData::ExprRecordLit { - parent_enum: pe.clone(), -}), resolved_children, texpr.inferred.clone(), texpr.span.clone(), node_name_span(&texpr)), - diagnostics: all_diags, -}) -}, - ExprData::ExprListLit => { - let el_results = Rc::new({ let mut __result = Vec::new(); for el in texpr.children.clone().iter().cloned() { __result.push(resolve_expr_types(&el, &env, module_name.clone())); } __result }); -let resolved_children = Rc::new({ let mut __result = Vec::new(); for r in el_results.clone().iter().cloned() { __result.push(r.expr.clone()); } __result }); -let all_diags = Rc::new({ let mut __result = Vec::new(); for r in el_results.clone().iter().cloned() { __result.extend((*r.diagnostics.clone()).iter().cloned()); } __result }); -Rc::new(ExprResolveResult { - expr: make_expr_node(Rc::new(ExprData::ExprListLit), resolved_children, texpr.inferred.clone(), texpr.span.clone()), - diagnostics: all_diags, -}) -}, - ExprData::ExprBinOp { op, algebra_field: af, .. } => { - let ch = texpr.children.clone(); -let lr = match ch.clone().first().cloned() { - Some(l) => resolve_expr_types(&l, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), -}), -}; -let rr = match ch.clone().get(1 as usize).cloned() { - Some(r) => resolve_expr_types(&r, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), -}), -}; -Rc::new(ExprResolveResult { - expr: make_expr_node(Rc::new(ExprData::ExprBinOp { - op: op.clone(), - algebra_field: af.clone(), -}), Rc::new(vec![lr.expr.clone(), rr.expr.clone()]), texpr.inferred.clone(), texpr.span.clone()), - diagnostics: v2_rt::concat(lr.diagnostics.clone(), rr.diagnostics.clone()), -}) -}, - ExprData::ExprUnaryOp { op, .. } => { - let r = match texpr.children.clone().first().cloned() { - Some(o) => resolve_expr_types(&o, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), -}), -}; -Rc::new(ExprResolveResult { - expr: make_expr_node(Rc::new(ExprData::ExprUnaryOp { - op: op.clone(), -}), Rc::new(vec![r.expr.clone()]), texpr.inferred.clone(), texpr.span.clone()), - diagnostics: r.diagnostics.clone(), -}) -}, - ExprData::ExprLambda => { - let lam_param_nodes = Rc::new(texpr.children.clone().iter().cloned().skip(1 as usize).collect::>()); -let r = match texpr.children.clone().first().cloned() { - Some(b) => resolve_expr_types(&b, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), -}), -}; -Rc::new(ExprResolveResult { - expr: make_expr_node(Rc::new(ExprData::ExprLambda), v2_rt::concat(Rc::new(vec![r.expr.clone()]), lam_param_nodes), texpr.inferred.clone(), texpr.span.clone()), - diagnostics: r.diagnostics.clone(), -}) -}, - ExprData::ExprStringInterp => { - let resolved_children = Rc::new({ let mut __result = Vec::new(); for part_node in texpr.children.clone().iter().cloned() { __result.push(match (*part_node.expr_data.clone()).clone() { - ExprData::ExprLiteral { .. } => part_node.clone(), - _ => match part_node.children.clone().first().cloned() { - Some(inner) => { - let r = resolve_expr_types(&inner, &env, module_name.clone()); -make_interp_part_node(r.expr.clone(), part_node.span.clone()) -}, - None => part_node.clone(), -}, -}); } __result }); -let all_diags = Rc::new({ let mut __result = Vec::new(); for part_node in texpr.children.clone().iter().cloned() { __result.extend((*match (*part_node.expr_data.clone()).clone() { - ExprData::ExprLiteral { .. } => Rc::new(vec![]), - _ => match part_node.children.clone().first().cloned() { - Some(inner) => { - let r = resolve_expr_types(&inner, &env, module_name.clone()); -r.diagnostics.clone() -}, - None => Rc::new(vec![]), -}, -}).iter().cloned()); } __result }); -Rc::new(ExprResolveResult { - expr: make_expr_node(Rc::new(ExprData::ExprStringInterp), resolved_children, texpr.inferred.clone(), texpr.span.clone()), - diagnostics: all_diags, -}) -}, - ExprData::ExprBlock => { - let stmt_results = Rc::new({ let mut __result = Vec::new(); for s in texpr.children.clone().iter().cloned() { __result.push(resolve_expr_types(&s, &env, module_name.clone())); } __result }); -let resolved_children = Rc::new({ let mut __result = Vec::new(); for r in stmt_results.clone().iter().cloned() { __result.push(r.expr.clone()); } __result }); -let all_diags = Rc::new({ let mut __result = Vec::new(); for r in stmt_results.clone().iter().cloned() { __result.extend((*r.diagnostics.clone()).iter().cloned()); } __result }); -Rc::new(ExprResolveResult { - expr: make_expr_node(Rc::new(ExprData::ExprBlock), resolved_children, texpr.inferred.clone(), texpr.span.clone()), - diagnostics: all_diags, -}) -}, - ExprData::ExprCast => { - let ch = texpr.children.clone(); -let r = match ch.clone().first().cloned() { - Some(inner) => resolve_expr_types(&inner, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), -}), -}; -let tr = match ch.clone().get(1 as usize).cloned() { - Some(target) => resolve_node(target.clone(), env.clone(), module_name.clone()), - None => Rc::new(NodeResolveResult { - resolved: unit_type(), - diagnostics: Rc::new(vec![]), -}), -}; -Rc::new(ExprResolveResult { - expr: make_expr_node(Rc::new(ExprData::ExprCast), Rc::new(vec![r.expr.clone(), tr.resolved.clone()]), texpr.inferred.clone(), texpr.span.clone()), - diagnostics: v2_rt::concat(r.diagnostics.clone(), tr.diagnostics.clone()), -}) -}, - ExprData::ExprForEach => { - let ch = texpr.children.clone(); -let cr = match ch.clone().first().cloned() { - Some(c) => resolve_expr_types(&c, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), -}), -}; -let br = match ch.clone().get(1 as usize).cloned() { - Some(b) => resolve_expr_types(&b, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), -}), -}; -Rc::new(ExprResolveResult { - expr: make_named_expr_node(&foreach_variable_at(texpr.clone(), env.source_indices.clone()), Rc::new(ExprData::ExprForEach), Rc::new(vec![cr.expr.clone(), br.expr.clone()]), texpr.inferred.clone(), texpr.span.clone(), node_name_span(&texpr)), - diagnostics: v2_rt::concat(cr.diagnostics.clone(), br.diagnostics.clone()), -}) -}, - ExprData::ExprIndex => { - let ch = texpr.children.clone(); -let br = match ch.clone().first().cloned() { - Some(base) => resolve_expr_types(&base, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), -}), -}; -let ir = match ch.clone().get(1 as usize).cloned() { - Some(index) => resolve_expr_types(&index, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), -}), -}; -Rc::new(ExprResolveResult { - expr: make_expr_node(Rc::new(ExprData::ExprIndex), Rc::new(vec![br.expr.clone(), ir.expr.clone()]), texpr.inferred.clone(), texpr.span.clone()), - diagnostics: v2_rt::concat(br.diagnostics.clone(), ir.diagnostics.clone()), -}) -}, - ExprData::ExprSlice => { - let ch = texpr.children.clone(); -let br = match ch.clone().first().cloned() { - Some(base) => resolve_expr_types(&base, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), -}), -}; -let sr = match ch.clone().get(1 as usize).cloned() { - Some(start) => resolve_expr_types(&start, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), -}), -}; -let er = match ch.clone().get(2 as usize).cloned() { - Some(end_e) => resolve_expr_types(&end_e, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), -}), -}; -Rc::new(ExprResolveResult { - expr: make_expr_node(Rc::new(ExprData::ExprSlice), Rc::new(vec![br.expr.clone(), sr.expr.clone(), er.expr.clone()]), texpr.inferred.clone(), texpr.span.clone()), - diagnostics: v2_rt::concat(v2_rt::concat(br.diagnostics.clone(), sr.diagnostics.clone()), er.diagnostics.clone()), -}) -}, - ExprData::ExprReturn => { - let r = match texpr.children.clone().first().cloned() { - Some(inner) => resolve_expr_types(&inner, &env, module_name.clone()), - None => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), -}), -}; -Rc::new(ExprResolveResult { - expr: make_expr_node(Rc::new(ExprData::ExprReturn), Rc::new(vec![r.expr.clone()]), texpr.inferred.clone(), texpr.span.clone()), - diagnostics: r.diagnostics.clone(), -}) -}, - ExprData::NoExprData => Rc::new(ExprResolveResult { - expr: texpr.clone(), - diagnostics: Rc::new(vec![]), -}), -} - }) -} - -pub fn fn_type_param_names(item: Rc, source_indices: Rc>>) -> Rc> { - Rc::new({ let mut __result = Vec::new(); for p in Rc::new({ let mut __result = Vec::new(); for p in item.params.clone().iter().cloned() { if (param_node_name_at(p.clone(), source_indices.clone()).as_str() == authored_name_at(source_indices.clone(), ¶m_node_type_expr(&p)).as_str()) { __result.push(p); } } __result }).iter().cloned() { __result.push(param_node_name_at(p.clone(), source_indices.clone())); } __result }) -} - -pub fn has_duplicate_type_param_name(names: &Rc>) -> bool { - { let mut __found = false; for pair in Rc::new(names.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { if { - let idx = pair.0.clone(); -let s = pair.1.clone(); -{ let mut __found = false; for other in Rc::new(names.clone().iter().cloned().skip((idx.clone() + 1) as usize).collect::>()).iter().cloned() { if (other.clone().as_str() == s.clone().as_str()) { __found = true; break; } } __found } -} { __found = true; break; } } __found } + } { + __found = true; + break; + } + } + __found + } } -pub fn resolve_item_types(item: &Rc, env: &Rc, module_name: &String) -> Rc { +pub fn resolve_item_types( + item: &Rc, + env: &Rc, + module_name: &String, +) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - { - let tp_names = fn_type_param_names(item.clone(), env.source_indices.clone()); -let collision_diags = if has_duplicate_type_param_name(&tp_names) { - Rc::new(vec![make_error_node(Rc::new(CompilerDiagnostic::InternalError { + let tp_names = fn_type_param_names(item.clone(), env.source_indices.clone()); + let collision_diags = if has_duplicate_type_param_name(&tp_names) { + Rc::new(vec![make_error_node(Rc::new(CompilerDiagnostic::InternalError { message: v2_rt::concat(v2_rt::concat("type param name collides with a value param in fn '".to_string(), authored_name_at(env.source_indices.clone(), &item)), "' — a value param shares its name with a declared type param (e.g., `fn f(T: T)`). Rename the value param, or dissolve via ParamKind / params-slot partition.".to_string()), span: item.span.clone(), }), module_name.clone())]) - } else { - Rc::new(vec![]) - }; -let env = tp_names.clone().iter().cloned().fold(env.clone(), |e: Rc, tp_name: String| Rc::new(TypeEnv { - bindings: v2_rt::rc_map_insert(e.bindings.clone(), intern(&e.intern_table.clone(), &tp_name).id.clone(), Rc::new(TypeBinding { - name: tp_name.clone(), - resolved: Rc::new(Node { - name: tp_name.clone(), - span: kernel_span(&tp_name), - ident_span: Some(kernel_span(&tp_name)), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::TypeVariable { - id: tp_name.clone(), -})), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}), - provenance: Rc::new(SubValueRelation::SubValueUnknown), -})), - recursive_types: e.recursive_types.clone(), - recursive_type_set: e.recursive_type_set.clone(), - inductive_fields: e.inductive_fields.clone(), - source_indices: e.source_indices.clone(), - intern_table: e.intern_table.clone(), -})); -let param_results = Rc::new({ let mut __result = Vec::new(); for p in item.params.clone().iter().cloned() { __result.push(resolve_param(&p, &env, &module_name)); } __result }); -let resolved_params = Rc::new({ let mut __result = Vec::new(); for pr in param_results.clone().iter().cloned() { __result.push(pr.param.clone()); } __result }); -let param_diags = Rc::new({ let mut __result = Vec::new(); for pr in param_results.clone().iter().cloned() { __result.extend((*pr.diagnostics.clone()).iter().cloned()); } __result }); -let ret_result = resolve_optional_node(&item.inferred.clone(), env.clone(), module_name.clone()); -let ret_resolved = ret_result.resolved.clone(); -let ret_diags = ret_result.diagnostics.clone(); -let resolved_ret = if (item.inferred.clone() == None) { - None - } else { - Some(Rc::new(InferredNode::Resolved { - node: ret_resolved, -})) - }; -let use_results = Rc::new({ let mut __result = Vec::new(); for u in item.uses.clone().iter().cloned() { __result.push(resolve_resource_use(&u, &env, module_name.clone())); } __result }); -let resolved_uses = Rc::new({ let mut __result = Vec::new(); for ur in use_results.clone().iter().cloned() { __result.push(ur.resource_use.clone()); } __result }); -let use_diags = Rc::new({ let mut __result = Vec::new(); for ur in use_results.clone().iter().cloned() { __result.extend((*ur.diagnostics.clone()).iter().cloned()); } __result }); -let body_resolved = if (item.body.clone() == None) { - Rc::new(ExprResolveResult { - expr: item.clone(), - diagnostics: Rc::new(vec![]), -}) - } else { - resolve_expr_types(&item.body.clone().clone().unwrap(), &env, module_name.clone()) - }; -let resolved_body = if (item.body.clone() == None) { - None - } else { - Some(body_resolved.expr.clone()) - }; -let body_diags = if (item.body.clone() == None) { - Rc::new(vec![]) - } else { - body_resolved.diagnostics.clone() - }; -let anno_resolved = if (item.type_annotation.clone() == None) { - Rc::new(NodeResolveResult { - resolved: unit_type(), - diagnostics: Rc::new(vec![]), -}) - } else { - resolve_node(item.type_annotation.clone().clone().unwrap(), env.clone(), module_name.clone()) - }; -let resolved_anno = if (item.type_annotation.clone() == None) { - None - } else { - Some(anno_resolved.resolved.clone()) - }; -let anno_diags = anno_resolved.diagnostics.clone(); -let transport_resolved = if (item.transport.clone() == None) { - Rc::new(TransportResolveResult { - transport: local_transport_node(no_span()), - diagnostics: Rc::new(vec![]), -}) - } else { - resolve_transport_binding(&item.transport.clone().clone().unwrap(), &env, &module_name) - }; -let resolved_transport = if (item.transport.clone() == None) { - None - } else { - Some(transport_resolved.transport.clone()) - }; -let transport_diags = transport_resolved.diagnostics.clone(); -let prop_results = Rc::new({ let mut __result = Vec::new(); for p in item.properties.clone().iter().cloned() { __result.push(resolve_field_init(&p, &env, module_name.clone())); } __result }); -let resolved_props = Rc::new({ let mut __result = Vec::new(); for pr in prop_results.clone().iter().cloned() { __result.push(pr.field_init.clone()); } __result }); -let prop_diags = Rc::new({ let mut __result = Vec::new(); for pr in prop_results.clone().iter().cloned() { __result.extend((*pr.diagnostics.clone()).iter().cloned()); } __result }); -let child_results = Rc::new({ let mut __result = Vec::new(); for child in item.children.clone().iter().cloned() { __result.push(resolve_item_types(&child, &env, &module_name)); } __result }); -let resolved_children = Rc::new({ let mut __result = Vec::new(); for cr in child_results.clone().iter().cloned() { __result.push(cr.item.clone()); } __result }); -let child_diags = Rc::new({ let mut __result = Vec::new(); for cr in child_results.clone().iter().cloned() { __result.extend((*cr.diagnostics.clone()).iter().cloned()); } __result }); -Rc::new(ItemResult { - item: Rc::new(Node { - name: item.name.clone(), - span: item.span.clone(), - ident_span: item.ident_span.clone(), - children: resolved_children, - params: resolved_params, - inferred: resolved_ret, - return_cardinality: item.return_cardinality.clone(), - uses: resolved_uses, - body: resolved_body, - connective: item.connective.clone(), - transport: resolved_transport, - properties: resolved_props, - type_annotation: resolved_anno, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}), - diagnostics: v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(collision_diags, param_diags), ret_diags), use_diags), body_diags), anno_diags), transport_diags), prop_diags), child_diags), -}) -} + } else { + Rc::new(vec![]) + }; + let env = tp_names.clone().iter().cloned().fold( + env.clone(), + |e: Rc, tp_name: String| { + Rc::new(TypeEnv { + bindings: v2_rt::rc_map_insert( + e.bindings.clone(), + intern(&e.intern_table.clone(), &tp_name).id.clone(), + Rc::new(TypeBinding { + name: tp_name.clone(), + resolved: Rc::new(Node { + name: tp_name.clone(), + span: kernel_span(&tp_name), + ident_span: Some(kernel_span(&tp_name)), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::TypeVariable { + id: tp_name.clone(), + })), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }), + provenance: Rc::new(SubValueRelation::SubValueUnknown), + }), + ), + recursive_types: e.recursive_types.clone(), + recursive_type_set: e.recursive_type_set.clone(), + inductive_fields: e.inductive_fields.clone(), + source_indices: e.source_indices.clone(), + intern_table: e.intern_table.clone(), + }) + }, + ); + let param_results = Rc::new({ + let mut __result = Vec::new(); + for p in item.params.clone().iter().cloned() { + __result.push(resolve_param(&p, &env, &module_name)); + } + __result + }); + let resolved_params = Rc::new({ + let mut __result = Vec::new(); + for pr in param_results.clone().iter().cloned() { + __result.push(pr.param.clone()); + } + __result + }); + let param_diags = Rc::new({ + let mut __result = Vec::new(); + for pr in param_results.clone().iter().cloned() { + __result.extend((*pr.diagnostics.clone()).iter().cloned()); + } + __result + }); + let ret_result = + resolve_optional_node(&item.inferred.clone(), env.clone(), module_name.clone()); + let ret_resolved = ret_result.resolved.clone(); + let ret_diags = ret_result.diagnostics.clone(); + let resolved_ret = if (item.inferred.clone() == None) { + None + } else { + Some(Rc::new(InferredNode::Resolved { node: ret_resolved })) + }; + let use_results = Rc::new({ + let mut __result = Vec::new(); + for u in item.uses.clone().iter().cloned() { + __result.push(resolve_resource_use(&u, &env, module_name.clone())); + } + __result + }); + let resolved_uses = Rc::new({ + let mut __result = Vec::new(); + for ur in use_results.clone().iter().cloned() { + __result.push(ur.resource_use.clone()); + } + __result + }); + let use_diags = Rc::new({ + let mut __result = Vec::new(); + for ur in use_results.clone().iter().cloned() { + __result.extend((*ur.diagnostics.clone()).iter().cloned()); + } + __result + }); + let body_resolved = if (item.body.clone() == None) { + Rc::new(ExprResolveResult { + expr: item.clone(), + diagnostics: Rc::new(vec![]), + }) + } else { + resolve_expr_types( + &item.body.clone().clone().unwrap(), + &env, + module_name.clone(), + ) + }; + let resolved_body = if (item.body.clone() == None) { + None + } else { + Some(body_resolved.expr.clone()) + }; + let body_diags = if (item.body.clone() == None) { + Rc::new(vec![]) + } else { + body_resolved.diagnostics.clone() + }; + let anno_resolved = if (item.type_annotation.clone() == None) { + Rc::new(NodeResolveResult { + resolved: unit_type(), + diagnostics: Rc::new(vec![]), + }) + } else { + resolve_node( + item.type_annotation.clone().clone().unwrap(), + env.clone(), + module_name.clone(), + ) + }; + let resolved_anno = if (item.type_annotation.clone() == None) { + None + } else { + Some(anno_resolved.resolved.clone()) + }; + let anno_diags = anno_resolved.diagnostics.clone(); + let transport_resolved = if (item.transport.clone() == None) { + Rc::new(TransportResolveResult { + transport: local_transport_node(no_span()), + diagnostics: Rc::new(vec![]), + }) + } else { + resolve_transport_binding(&item.transport.clone().clone().unwrap(), &env, &module_name) + }; + let resolved_transport = if (item.transport.clone() == None) { + None + } else { + Some(transport_resolved.transport.clone()) + }; + let transport_diags = transport_resolved.diagnostics.clone(); + let prop_results = Rc::new({ + let mut __result = Vec::new(); + for p in item.properties.clone().iter().cloned() { + __result.push(resolve_field_init(&p, &env, module_name.clone())); + } + __result + }); + let resolved_props = Rc::new({ + let mut __result = Vec::new(); + for pr in prop_results.clone().iter().cloned() { + __result.push(pr.field_init.clone()); + } + __result + }); + let prop_diags = Rc::new({ + let mut __result = Vec::new(); + for pr in prop_results.clone().iter().cloned() { + __result.extend((*pr.diagnostics.clone()).iter().cloned()); + } + __result + }); + let child_results = Rc::new({ + let mut __result = Vec::new(); + for child in item.children.clone().iter().cloned() { + __result.push(resolve_item_types(&child, &env, &module_name)); + } + __result + }); + let resolved_children = Rc::new({ + let mut __result = Vec::new(); + for cr in child_results.clone().iter().cloned() { + __result.push(cr.item.clone()); + } + __result + }); + let child_diags = Rc::new({ + let mut __result = Vec::new(); + for cr in child_results.clone().iter().cloned() { + __result.extend((*cr.diagnostics.clone()).iter().cloned()); + } + __result + }); + Rc::new(ItemResult { + item: Rc::new(Node { + name: item.name.clone(), + span: item.span.clone(), + ident_span: item.ident_span.clone(), + children: resolved_children, + params: resolved_params, + inferred: resolved_ret, + return_cardinality: item.return_cardinality.clone(), + uses: resolved_uses, + body: resolved_body, + connective: item.connective.clone(), + transport: resolved_transport, + properties: resolved_props, + type_annotation: resolved_anno, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }), + diagnostics: v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(collision_diags, param_diags), + ret_diags, + ), + use_diags, + ), + body_diags, + ), + anno_diags, + ), + transport_diags, + ), + prop_diags, + ), + child_diags, + ), + }) }) } diff --git a/src/v2/stage0/src/v2_compiler_infer_service.rs b/src/v2/stage0/src/v2_compiler_infer_service.rs index 5049a189788..8dfabfec682 100644 --- a/src/v2/stage0/src/v2_compiler_infer_service.rs +++ b/src/v2/stage0/src/v2_compiler_infer_service.rs @@ -1,20 +1,26 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.infer_service -use std::collections::HashMap; -use std::rc::Rc; +pub use crate::std_types::SourceSpan; +use crate::v2_compiler_infer_items::ItemKind::FuncItem; +pub use crate::v2_compiler_infer_items::{inferred_to_outputs, ItemInfo, ItemKind, TypedModule}; +pub use crate::v2_compiler_infer_types::{emit_map_has, nominal_type_ref}; use crate::v2_rt; -use crate::NonEmptyVec; -use crate::NonEmptyBTreeSet; -pub use crate::std_types::{SourceSpan}; -pub use crate::v2_std_core::{Node, Connective, ExprData, Cardinality, InferredNode, NewlineIndex, no_span, unit_type, expr_var_name_at, expr_call_func_at, field_access_field_at, field_access_base, method_receiver, param_node_type_expr, authored_name_at}; +use crate::v2_std_core::Cardinality::Required; use crate::v2_std_core::Connective::{Conj, NoConnective}; -use crate::v2_std_core::ExprData::{NoExprData, ExprFieldAccess, ExprMethodCall, ExprCall, ExprVar}; -use crate::v2_std_core::Cardinality::{Required}; -use crate::v2_std_core::InferredNode::{Resolved}; -pub use crate::v2_compiler_infer_types::{emit_map_has, nominal_type_ref}; -pub use crate::v2_compiler_infer_items::{ItemInfo, ItemKind, TypedModule, inferred_to_outputs}; -use crate::v2_compiler_infer_items::ItemKind::{FuncItem}; +use crate::v2_std_core::ExprData::{ + ExprCall, ExprFieldAccess, ExprMethodCall, ExprVar, NoExprData, +}; +use crate::v2_std_core::InferredNode::Resolved; +pub use crate::v2_std_core::{ + authored_name_at, expr_call_func_at, expr_var_name_at, field_access_base, + field_access_field_at, method_receiver, no_span, param_node_type_expr, unit_type, Cardinality, + Connective, ExprData, InferredNode, NewlineIndex, Node, +}; +use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] pub struct UniqueAccum { @@ -35,114 +41,165 @@ pub struct ServiceMethodResult { pub op_params: Rc>>, } -pub fn is_typed_service_call_receiver(receiver: &Rc, source_indices: Rc>>) -> bool { +pub fn is_typed_service_call_receiver( + receiver: &Rc, + source_indices: Rc>>, +) -> bool { match (*receiver.expr_data.clone()).clone() { - ExprData::ExprFieldAccess { .. } => { - let f = field_access_field_at(receiver.clone(), source_indices); -let b = field_access_base(receiver.clone()); -match (*b.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => match Rc::new(f.chars().map(|c| c as i64).collect::>()).first().cloned() { - Some(ch) => ((ch.clone() >= 65) && (ch.clone() <= 90)), - None => false, -}, - _ => false, -} -}, - _ => false, -} + ExprData::ExprFieldAccess { .. } => { + let f = field_access_field_at(receiver.clone(), source_indices); + let b = field_access_base(receiver.clone()); + match (*b.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + match Rc::new(f.chars().map(|c| c as i64).collect::>()) + .first() + .cloned() + { + Some(ch) => ((ch.clone() >= 65) && (ch.clone() <= 90)), + None => false, + } + } + _ => false, + } + } + _ => false, + } } -pub fn extract_typed_service_name(receiver: &Rc, source_indices: &Rc>>) -> Option { +pub fn extract_typed_service_name( + receiver: &Rc, + source_indices: &Rc>>, +) -> Option { match (*receiver.expr_data.clone()).clone() { - ExprData::ExprFieldAccess { .. } => { - let f = field_access_field_at(receiver.clone(), source_indices.clone()); -let b = field_access_base(receiver.clone()); -match (*b.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let ns = expr_var_name_at(b.clone(), source_indices.clone()); -Some(v2_rt::concat(v2_rt::concat(ns, ".".to_string()), f)) -}, - _ => None, -} -}, - _ => None, -} + ExprData::ExprFieldAccess { .. } => { + let f = field_access_field_at(receiver.clone(), source_indices.clone()); + let b = field_access_base(receiver.clone()); + match (*b.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let ns = expr_var_name_at(b.clone(), source_indices.clone()); + Some(v2_rt::concat(v2_rt::concat(ns, ".".to_string()), f)) + } + _ => None, + } + } + _ => None, + } } -pub fn collect_typed_service_calls(texpr: Rc, source_indices: Rc>>) -> Rc> { +pub fn collect_typed_service_calls( + texpr: Rc, + source_indices: Rc>>, +) -> Rc> { { - let result = collect_typed_service_calls_into(&texpr, &Rc::new(UniqueAccum { - seen: v2_rt::rc_empty_map::(), - result: Rc::new(vec![]), -}), &source_indices); -result.result.clone() -} + let result = collect_typed_service_calls_into( + &texpr, + &Rc::new(UniqueAccum { + seen: v2_rt::rc_empty_map::(), + result: Rc::new(vec![]), + }), + &source_indices, + ); + result.result.clone() + } } -pub fn collect_typed_service_calls_into(texpr: &Rc, acc: &Rc, source_indices: &Rc>>) -> Rc { +pub fn collect_typed_service_calls_into( + texpr: &Rc, + acc: &Rc, + source_indices: &Rc>>, +) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - { - let this_acc = match (*texpr.expr_data.clone()).clone() { - ExprData::ExprMethodCall { .. } => { + let this_acc = match (*texpr.expr_data.clone()).clone() { + ExprData::ExprMethodCall { .. } => { let r = method_receiver(texpr.clone()); -if is_typed_service_call_receiver(&r, source_indices.clone()) { + if is_typed_service_call_receiver(&r, source_indices.clone()) { match extract_typed_service_name(&r, &source_indices) { - Some(service_name) => if emit_map_has(acc.seen.clone(), service_name.clone()) { - acc.clone() - } else { - Rc::new(UniqueAccum { - seen: v2_rt::rc_map_insert(acc.seen.clone(), service_name.clone(), true), - result: v2_rt::rc_list_push(acc.result.clone(), service_name.clone()), -}) - }, - None => acc.clone(), -} + Some(service_name) => { + if emit_map_has(acc.seen.clone(), service_name.clone()) { + acc.clone() + } else { + Rc::new(UniqueAccum { + seen: v2_rt::rc_map_insert( + acc.seen.clone(), + service_name.clone(), + true, + ), + result: v2_rt::rc_list_push( + acc.result.clone(), + service_name.clone(), + ), + }) + } + } + None => acc.clone(), + } } else { acc.clone() } -}, - _ => acc.clone(), -}; -let result = texpr.children.clone().iter().cloned().fold(this_acc.clone(), |a: Rc, child: Rc| collect_typed_service_calls_into(&child, &a, &source_indices)); -result -} + } + _ => acc.clone(), + }; + let result = texpr.children.clone().iter().cloned().fold( + this_acc.clone(), + |a: Rc, child: Rc| { + collect_typed_service_calls_into(&child, &a, &source_indices) + }, + ); + result }) } -pub fn collect_called_func_names_into(texpr: &Rc, acc: &Rc, source_indices: &Rc>>) -> Rc { +pub fn collect_called_func_names_into( + texpr: &Rc, + acc: &Rc, + source_indices: &Rc>>, +) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - { - let this_acc = match (*texpr.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { + let this_acc = match (*texpr.expr_data.clone()).clone() { + ExprData::ExprCall { .. } => { let f = expr_call_func_at(texpr.clone(), source_indices.clone()); -if emit_map_has(acc.seen.clone(), f.clone()) { + if emit_map_has(acc.seen.clone(), f.clone()) { acc.clone() } else { Rc::new(UniqueAccum { - seen: v2_rt::rc_map_insert(acc.seen.clone(), f.clone(), true), - result: v2_rt::rc_list_push(acc.result.clone(), f.clone()), -}) + seen: v2_rt::rc_map_insert(acc.seen.clone(), f.clone(), true), + result: v2_rt::rc_list_push(acc.result.clone(), f.clone()), + }) } -}, - _ => acc.clone(), -}; -let result = texpr.children.clone().iter().cloned().fold(this_acc.clone(), |a: Rc, child: Rc| collect_called_func_names_into(&child, &a, &source_indices)); -result -} + } + _ => acc.clone(), + }; + let result = texpr.children.clone().iter().cloned().fold( + this_acc.clone(), + |a: Rc, child: Rc| { + collect_called_func_names_into(&child, &a, &source_indices) + }, + ); + result }) } -pub fn collect_called_func_names(texpr: Rc, source_indices: Rc>>) -> Rc> { +pub fn collect_called_func_names( + texpr: Rc, + source_indices: Rc>>, +) -> Rc> { { - let result = collect_called_func_names_into(&texpr, &Rc::new(UniqueAccum { - seen: v2_rt::rc_empty_map::(), - result: Rc::new(vec![]), -}), &source_indices); -result.result.clone() -} + let result = collect_called_func_names_into( + &texpr, + &Rc::new(UniqueAccum { + seen: v2_rt::rc_empty_map::(), + result: Rc::new(vec![]), + }), + &source_indices, + ); + result.result.clone() + } } -pub fn expand_transitive_services_once(modules: Rc>>, registry: Rc>>) -> Rc>> { +pub fn expand_transitive_services_once( + modules: Rc>>, + registry: Rc>>, +) -> Rc>> { modules.iter().cloned().fold(registry.clone(), |reg: Rc>>, m: Rc| m.items.clone().iter().cloned().fold(reg, |reg2: Rc>>, item: Rc| { let item_name = authored_name_at(m.type_env.clone().source_indices.clone(), &item); match v2_rt::map_get(®2, item_name.clone()) { @@ -186,117 +243,172 @@ if same_count.clone() { } pub fn total_service_count(registry: Rc>>) -> i64 { - Rc::new(v2_rt::map_values(®istry)).iter().cloned().fold(0, |acc: i64, info: Rc| (acc + (info.service_names.clone().len() as i64))) + Rc::new(v2_rt::map_values(®istry)) + .iter() + .cloned() + .fold(0, |acc: i64, info: Rc| { + (acc + (info.service_names.clone().len() as i64)) + }) } -pub fn expand_transitive_services(mut modules: Rc>>, mut registry: Rc>>, mut remaining_passes: i64) -> Rc>> { +pub fn expand_transitive_services( + mut modules: Rc>>, + mut registry: Rc>>, + mut remaining_passes: i64, +) -> Rc>> { loop { if (remaining_passes.clone() <= 0) { break registry.clone(); -} else { + } else { let before = total_service_count(registry.clone()); -let next = expand_transitive_services_once(modules.clone(), registry.clone()); -let after = total_service_count(next.clone()); -if (before == after) { + let next = expand_transitive_services_once(modules.clone(), registry.clone()); + let after = total_service_count(next.clone()); + if (before == after) { break registry.clone(); -} else { + } else { { let __tco_0 = next.clone(); -let __tco_1 = (remaining_passes - 1); -registry = __tco_0; -remaining_passes = __tco_1; -continue; -} -} -} -} + let __tco_1 = (remaining_passes - 1); + registry = __tco_0; + remaining_passes = __tco_1; + continue; + } + } + } + } } -pub fn check_service_field_access_node(base_type: &Rc, field: String, service_registry: Rc>>>>, source_indices: Rc>>) -> Option> { - if ((base_type.connective.clone() == Connective::NoConnective) && ((base_type.children.clone().len() as i64) == 0)) { +pub fn check_service_field_access_node( + base_type: &Rc, + field: String, + service_registry: Rc>>>>, + source_indices: Rc>>, +) -> Option> { + if ((base_type.connective.clone() == Connective::NoConnective) + && ((base_type.children.clone().len() as i64) == 0)) + { { - let path = v2_rt::concat(v2_rt::concat(authored_name_at(source_indices, &base_type), ".".to_string()), field); -match v2_rt::map_get(&service_registry, path.clone()) { - Some(_) => Some(nominal_type_ref(&path)), - None => None, -} -} + let path = v2_rt::concat( + v2_rt::concat( + authored_name_at(source_indices, &base_type), + ".".to_string(), + ), + field, + ); + match v2_rt::map_get(&service_registry, path.clone()) { + Some(_) => Some(nominal_type_ref(&path)), + None => None, + } + } } else { None } } -pub fn check_service_method_call_node(receiver_type: &Rc, method: String, service_registry: Rc>>>>, source_indices: Rc>>) -> Option> { - if ((receiver_type.connective.clone() == Connective::NoConnective) && ((receiver_type.children.clone().len() as i64) == 0)) { - match v2_rt::map_get(&service_registry, authored_name_at(source_indices, &receiver_type)) { - Some(ops) => { - let matching = Rc::new({ let mut __result = Vec::new(); for op in ops.clone().iter().cloned() { if (op.name.clone().as_str() == method.clone().as_str()) { __result.push(op); } } __result }); -match matching.first().cloned() { - Some(op) => if ((op.outputs.clone().len() as i64) == 0) { - Some(Rc::new(ServiceMethodResult { - result_type: unit_type(), - op_params: op.params.clone(), -})) - } else { - Some(Rc::new(ServiceMethodResult { - result_type: Rc::new(Node { - name: "".to_string(), - span: no_span(), - ident_span: None, - children: Rc::new({ let mut __result = Vec::new(); for f in op.outputs.clone().iter().cloned() { __result.push(Rc::new(Node { - name: f.name.clone(), - span: f.span.clone(), - ident_span: f.ident_span.clone(), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::Resolved { - node: param_node_type_expr(&f), -})), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -})); } __result }), - connective: Connective::Conj, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}), - op_params: op.params.clone(), -})) - }, - None => None, -} -}, - None => None, -} +pub fn check_service_method_call_node( + receiver_type: &Rc, + method: String, + service_registry: Rc>>>>, + source_indices: Rc>>, +) -> Option> { + if ((receiver_type.connective.clone() == Connective::NoConnective) + && ((receiver_type.children.clone().len() as i64) == 0)) + { + match v2_rt::map_get( + &service_registry, + authored_name_at(source_indices, &receiver_type), + ) { + Some(ops) => { + let matching = Rc::new({ + let mut __result = Vec::new(); + for op in ops.clone().iter().cloned() { + if (op.name.clone().as_str() == method.clone().as_str()) { + __result.push(op); + } + } + __result + }); + match matching.first().cloned() { + Some(op) => { + if ((op.outputs.clone().len() as i64) == 0) { + Some(Rc::new(ServiceMethodResult { + result_type: unit_type(), + op_params: op.params.clone(), + })) + } else { + Some(Rc::new(ServiceMethodResult { + result_type: Rc::new(Node { + name: "".to_string(), + span: no_span(), + ident_span: None, + children: Rc::new({ + let mut __result = Vec::new(); + for f in op.outputs.clone().iter().cloned() { + __result.push(Rc::new(Node { + name: f.name.clone(), + span: f.span.clone(), + ident_span: f.ident_span.clone(), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::Resolved { + node: param_node_type_expr(&f), + })), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + })); + } + __result + }), + connective: Connective::Conj, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }), + op_params: op.params.clone(), + })) + } + } + None => None, + } + } + None => None, + } } else { None } } -pub fn service_op_entry(child: &Rc, source_indices: &Rc>>) -> Rc { +pub fn service_op_entry( + child: &Rc, + source_indices: &Rc>>, +) -> Rc { Rc::new(OpEntry { - name: authored_name_at(source_indices.clone(), &child), - outputs: inferred_to_outputs(&child.inferred.clone(), child.span.clone(), source_indices.clone()), - params: child.params.clone(), -}) + name: authored_name_at(source_indices.clone(), &child), + outputs: inferred_to_outputs( + &child.inferred.clone(), + child.span.clone(), + source_indices.clone(), + ), + params: child.params.clone(), + }) } diff --git a/src/v2/stage0/src/v2_compiler_infer_sigs.rs b/src/v2/stage0/src/v2_compiler_infer_sigs.rs index 5cdd9f3214c..31d6c47dcbe 100644 --- a/src/v2/stage0/src/v2_compiler_infer_sigs.rs +++ b/src/v2/stage0/src/v2_compiler_infer_sigs.rs @@ -1,17 +1,20 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.infer_sigs -use std::collections::HashMap; -use std::rc::Rc; +pub use crate::std_induction::SubValueRelation; +use crate::std_induction::SubValueRelation::*; +pub use crate::v2_compiler_infer_types::emit_map_has; use crate::v2_rt; -use crate::NonEmptyVec; +use crate::v2_std_core::CompilerDiagnostic::MissingAnnotation; +use crate::v2_std_core::ExprData::ExprCall; +pub use crate::v2_std_core::{ + authored_name_at, expr_call_func_at, make_error_node, no_span, CompilerDiagnostic, + DeclaredFuncSig, ErrorNode, ExprData, NewlineIndex, Node, +}; use crate::NonEmptyBTreeSet; -pub use crate::v2_std_core::{Node, ExprData, expr_call_func_at, ErrorNode, make_error_node, no_span, DeclaredFuncSig, NewlineIndex, authored_name_at, CompilerDiagnostic}; -use crate::v2_std_core::ExprData::{ExprCall}; -use crate::v2_std_core::CompilerDiagnostic::{MissingAnnotation}; -pub use crate::v2_compiler_infer_types::{emit_map_has}; -pub use crate::std_induction::{SubValueRelation}; -use crate::std_induction::SubValueRelation::*; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] pub struct ResolvedFuncSig { @@ -20,7 +23,8 @@ pub struct ResolvedFuncSig { pub inferred: Rc, pub is_async: bool, pub output_provenance: Rc>>>>, - pub variant_provenance: Rc>>>>>>, + pub variant_provenance: + Rc>>>>>>, } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -46,191 +50,457 @@ pub struct CallEdge { pub callee: String, } -pub fn collect_func_call_edges(items: Rc>>, local_func_set: Rc>, source_indices: Rc>>) -> Rc>> { - Rc::new({ let mut __result = Vec::new(); for item in items.iter().cloned() { __result.extend((*if (((item.params.clone().len() as i64) > 0) && (item.body.clone() != None)) { - collect_calls_in_expr(&authored_name_at(source_indices.clone(), &item), &item.body.clone().clone().unwrap(), &local_func_set, &source_indices) - } else { - Rc::new(vec![]) - }).iter().cloned()); } __result }) +pub fn collect_func_call_edges( + items: Rc>>, + local_func_set: Rc>, + source_indices: Rc>>, +) -> Rc>> { + Rc::new({ + let mut __result = Vec::new(); + for item in items.iter().cloned() { + __result.extend( + (*if (((item.params.clone().len() as i64) > 0) && (item.body.clone() != None)) { + collect_calls_in_expr( + &authored_name_at(source_indices.clone(), &item), + &item.body.clone().clone().unwrap(), + &local_func_set, + &source_indices, + ) + } else { + Rc::new(vec![]) + }) + .iter() + .cloned(), + ); + } + __result + }) } -pub fn collect_calls_in_expr(caller: &String, texpr: &Rc, local_func_set: &Rc>, source_indices: &Rc>>) -> Rc>> { +pub fn collect_calls_in_expr( + caller: &String, + texpr: &Rc, + local_func_set: &Rc>, + source_indices: &Rc>>, +) -> Rc>> { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - { - let this_edges = match (*texpr.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => { + let this_edges = match (*texpr.expr_data.clone()).clone() { + ExprData::ExprCall { .. } => { let f = expr_call_func_at(texpr.clone(), source_indices.clone()); -if emit_map_has(local_func_set.clone(), f.clone()) { + if emit_map_has(local_func_set.clone(), f.clone()) { Rc::new(vec![Rc::new(CallEdge { - caller: caller.clone(), - callee: f.clone(), -})]) + caller: caller.clone(), + callee: f.clone(), + })]) } else { Rc::new(vec![]) } -}, - _ => Rc::new(vec![]), -}; -let child_edges = Rc::new({ let mut __result = Vec::new(); for child in texpr.children.clone().iter().cloned() { __result.extend((*collect_calls_in_expr(&caller, &child, &local_func_set, &source_indices)).iter().cloned()); } __result }); -let result = v2_rt::concat(this_edges, child_edges); -result -} + } + _ => Rc::new(vec![]), + }; + let child_edges = Rc::new({ + let mut __result = Vec::new(); + for child in texpr.children.clone().iter().cloned() { + __result.extend( + (*collect_calls_in_expr(&caller, &child, &local_func_set, &source_indices)) + .iter() + .cloned(), + ); + } + __result + }); + let result = v2_rt::concat(this_edges, child_edges); + result }) } -pub fn func_reaches_self(root: String, current: &String, call_edges: &Rc>>, visited: &Rc>) -> bool { +pub fn func_reaches_self( + root: String, + current: &String, + call_edges: &Rc>>, + visited: &Rc>, +) -> bool { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { if emit_map_has(visited.clone(), current.clone()) { false } else { { let next_visited = v2_rt::rc_map_insert(visited.clone(), current.clone(), true); -let callees = Rc::new({ let mut __result = Vec::new(); for e in Rc::new({ let mut __result = Vec::new(); for e in call_edges.clone().iter().cloned() { if (e.caller.clone().as_str() == current.clone().as_str()) { __result.push(e); } } __result }).iter().cloned() { __result.push(e.callee.clone()); } __result }); -{ let mut __found = false; for c in callees.iter().cloned() { if if (c.clone().as_str() == root.clone().as_str()) { - true - } else { - func_reaches_self(root.clone(), &c, &call_edges, &next_visited) - } { __found = true; break; } } __found } -} + let callees = Rc::new({ + let mut __result = Vec::new(); + for e in Rc::new({ + let mut __result = Vec::new(); + for e in call_edges.clone().iter().cloned() { + if (e.caller.clone().as_str() == current.clone().as_str()) { + __result.push(e); + } + } + __result + }) + .iter() + .cloned() + { + __result.push(e.callee.clone()); + } + __result + }); + { + let mut __found = false; + for c in callees.iter().cloned() { + if if (c.clone().as_str() == root.clone().as_str()) { + true + } else { + func_reaches_self(root.clone(), &c, &call_edges, &next_visited) + } { + __found = true; + break; + } + } + __found + } + } } }) } pub fn build_name_set(names: Rc>) -> Rc> { - names.iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, name: String| v2_rt::rc_map_insert(acc, name.clone(), true)) + names.iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, name: String| { + v2_rt::rc_map_insert(acc, name.clone(), true) + }, + ) } -pub fn collect_parent_resolved_sigs(declared_sigs: Rc>>, local_func_set: Rc>) -> Rc>> { - Rc::new(v2_rt::map_values(&declared_sigs)).iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, dsig: Rc| if emit_map_has(local_func_set.clone(), dsig.name.clone()) { - acc.clone() - } else { - if (dsig.inferred.clone() != None) { - v2_rt::rc_map_insert(acc.clone(), dsig.name.clone(), declared_to_resolved(&dsig)) - } else { - acc.clone() - } - }) +pub fn collect_parent_resolved_sigs( + declared_sigs: Rc>>, + local_func_set: Rc>, +) -> Rc>> { + Rc::new(v2_rt::map_values(&declared_sigs)) + .iter() + .cloned() + .fold( + v2_rt::rc_empty_map::>(), + |acc: Rc>>, dsig: Rc| { + if emit_map_has(local_func_set.clone(), dsig.name.clone()) { + acc.clone() + } else { + if (dsig.inferred.clone() != None) { + v2_rt::rc_map_insert( + acc.clone(), + dsig.name.clone(), + declared_to_resolved(&dsig), + ) + } else { + acc.clone() + } + } + }, + ) } pub fn declared_to_resolved(dsig: &Rc) -> Rc { Rc::new(ResolvedFuncSig { - name: dsig.name.clone(), - params: dsig.params.clone(), - inferred: dsig.inferred.clone().clone().unwrap(), - is_async: dsig.is_async.clone(), - output_provenance: dsig.output_provenance.clone(), - variant_provenance: dsig.variant_provenance.clone(), -}) + name: dsig.name.clone(), + params: dsig.params.clone(), + inferred: dsig.inferred.clone().clone().unwrap(), + is_async: dsig.is_async.clone(), + output_provenance: dsig.output_provenance.clone(), + variant_provenance: dsig.variant_provenance.clone(), + }) } -pub fn merge_remaining_declared(declared_sigs: Rc>>, resolved: Rc>>) -> Rc>> { - Rc::new(v2_rt::map_values(&declared_sigs)).iter().cloned().fold(resolved, |acc: Rc>>, dsig: Rc| if (dsig.inferred.clone() != None) { - v2_rt::rc_map_insert(acc.clone(), dsig.name.clone(), declared_to_resolved(&dsig)) - } else { - acc.clone() - }) +pub fn merge_remaining_declared( + declared_sigs: Rc>>, + resolved: Rc>>, +) -> Rc>> { + Rc::new(v2_rt::map_values(&declared_sigs)) + .iter() + .cloned() + .fold( + resolved, + |acc: Rc>>, dsig: Rc| { + if (dsig.inferred.clone() != None) { + v2_rt::rc_map_insert( + acc.clone(), + dsig.name.clone(), + declared_to_resolved(&dsig), + ) + } else { + acc.clone() + } + }, + ) } -pub fn topo_resolve_loop(mut remaining: Rc>, mut resolved: Rc>>, mut declared_sigs: Rc>>, mut call_edges: Rc>>, mut local_func_set: Rc>, mut module_name: String, mut diagnostics: Rc>>, mut fuel: i64) -> Rc { +pub fn topo_resolve_loop( + mut remaining: Rc>, + mut resolved: Rc>>, + mut declared_sigs: Rc>>, + mut call_edges: Rc>>, + mut local_func_set: Rc>, + mut module_name: String, + mut diagnostics: Rc>>, + mut fuel: i64, +) -> Rc { loop { if ((remaining.clone().len() as i64) == 0) { { - let all_resolved = Rc::new(v2_rt::map_values(&declared_sigs)).iter().cloned().fold(resolved.clone(), |acc: Rc>>, dsig: Rc| if (dsig.inferred.clone() != None) { - v2_rt::rc_map_insert(acc.clone(), dsig.name.clone(), declared_to_resolved(&dsig)) - } else { - acc.clone() + let all_resolved = Rc::new(v2_rt::map_values(&declared_sigs)) + .iter() + .cloned() + .fold( + resolved.clone(), + |acc: Rc>>, + dsig: Rc| { + if (dsig.inferred.clone() != None) { + v2_rt::rc_map_insert( + acc.clone(), + dsig.name.clone(), + declared_to_resolved(&dsig), + ) + } else { + acc.clone() + } + }, + ); + return Rc::new(ResolveFuncSigsResult { + func_env: Rc::new(ResolvedFuncEnv { + signatures: all_resolved.clone(), + }), + diagnostics: diagnostics.clone(), }); -return Rc::new(ResolveFuncSigsResult { - func_env: Rc::new(ResolvedFuncEnv { - signatures: all_resolved.clone(), -}), - diagnostics: diagnostics.clone(), -}) -} + } } -let ready = Rc::new({ let mut __result = Vec::new(); for fn_name in remaining.clone().iter().cloned() { if { - let local_callees = Rc::new({ let mut __result = Vec::new(); for c in Rc::new({ let mut __result = Vec::new(); for e in Rc::new({ let mut __result = Vec::new(); for e in call_edges.clone().iter().cloned() { if (e.caller.clone().as_str() == fn_name.clone().as_str()) { __result.push(e); } } __result }).iter().cloned() { __result.push(e.callee.clone()); } __result }).iter().cloned() { if emit_map_has(local_func_set.clone(), c.clone()) { __result.push(c); } } __result }); -{ let mut __all = true; for c in local_callees.clone().iter().cloned() { if !((v2_rt::map_get(&resolved, c.clone()) != None)) { __all = false; break; } } __all } -} { __result.push(fn_name); } } __result }); -if ((ready.clone().len() as i64) == 0) { + let ready = Rc::new({ + let mut __result = Vec::new(); + for fn_name in remaining.clone().iter().cloned() { + if { + let local_callees = Rc::new({ + let mut __result = Vec::new(); + for c in Rc::new({ + let mut __result = Vec::new(); + for e in Rc::new({ + let mut __result = Vec::new(); + for e in call_edges.clone().iter().cloned() { + if (e.caller.clone().as_str() == fn_name.clone().as_str()) { + __result.push(e); + } + } + __result + }) + .iter() + .cloned() + { + __result.push(e.callee.clone()); + } + __result + }) + .iter() + .cloned() + { + if emit_map_has(local_func_set.clone(), c.clone()) { + __result.push(c); + } + } + __result + }); + { + let mut __all = true; + for c in local_callees.clone().iter().cloned() { + if !(v2_rt::map_get(&resolved, c.clone()) != None) { + __all = false; + break; + } + } + __all + } + } { + __result.push(fn_name); + } + } + __result + }); + if ((ready.clone().len() as i64) == 0) { { - let cycle_accum = remaining.clone().iter().cloned().fold(Rc::new(SigsAccum { - signatures: resolved.clone(), - diagnostics: Rc::new(vec![]), -}), |acc: Rc, fn_name: String| match v2_rt::map_get(&declared_sigs, fn_name.clone()) { - Some(dsig) => if (dsig.inferred.clone() != None) { - Rc::new(SigsAccum { - signatures: v2_rt::rc_map_insert(acc.signatures.clone(), fn_name.clone(), declared_to_resolved(&dsig)), - diagnostics: acc.diagnostics.clone(), -}) - } else { + let cycle_accum = remaining.clone().iter().cloned().fold( Rc::new(SigsAccum { - signatures: acc.signatures.clone(), - diagnostics: v2_rt::rc_list_push(acc.diagnostics.clone(), make_error_node(Rc::new(CompilerDiagnostic::MissingAnnotation { - fn_name: fn_name.clone(), - what: "return type (recursive)".to_string(), - span: no_span(), -}), module_name.clone())), -}) - }, - None => acc.clone(), -}); -let all_resolved = Rc::new(v2_rt::map_values(&declared_sigs)).iter().cloned().fold(cycle_accum.signatures.clone(), |acc: Rc>>, dsig: Rc| if (dsig.inferred.clone() != None) { - v2_rt::rc_map_insert(acc.clone(), dsig.name.clone(), declared_to_resolved(&dsig)) - } else { - acc.clone() + signatures: resolved.clone(), + diagnostics: Rc::new(vec![]), + }), + |acc: Rc, fn_name: String| match v2_rt::map_get( + &declared_sigs, + fn_name.clone(), + ) { + Some(dsig) => { + if (dsig.inferred.clone() != None) { + Rc::new(SigsAccum { + signatures: v2_rt::rc_map_insert( + acc.signatures.clone(), + fn_name.clone(), + declared_to_resolved(&dsig), + ), + diagnostics: acc.diagnostics.clone(), + }) + } else { + Rc::new(SigsAccum { + signatures: acc.signatures.clone(), + diagnostics: v2_rt::rc_list_push( + acc.diagnostics.clone(), + make_error_node( + Rc::new(CompilerDiagnostic::MissingAnnotation { + fn_name: fn_name.clone(), + what: "return type (recursive)".to_string(), + span: no_span(), + }), + module_name.clone(), + ), + ), + }) + } + } + None => acc.clone(), + }, + ); + let all_resolved = Rc::new(v2_rt::map_values(&declared_sigs)) + .iter() + .cloned() + .fold( + cycle_accum.signatures.clone(), + |acc: Rc>>, + dsig: Rc| { + if (dsig.inferred.clone() != None) { + v2_rt::rc_map_insert( + acc.clone(), + dsig.name.clone(), + declared_to_resolved(&dsig), + ) + } else { + acc.clone() + } + }, + ); + return Rc::new(ResolveFuncSigsResult { + func_env: Rc::new(ResolvedFuncEnv { + signatures: all_resolved.clone(), + }), + diagnostics: v2_rt::concat( + diagnostics.clone(), + cycle_accum.diagnostics.clone(), + ), }); -return Rc::new(ResolveFuncSigsResult { - func_env: Rc::new(ResolvedFuncEnv { - signatures: all_resolved.clone(), -}), - diagnostics: v2_rt::concat(diagnostics.clone(), cycle_accum.diagnostics.clone()), -}) -} + } } -let ready_accum = ready.clone().iter().cloned().fold(Rc::new(SigsAccum { - signatures: resolved.clone(), - diagnostics: diagnostics.clone(), -}), |acc: Rc, fn_name: String| match v2_rt::map_get(&declared_sigs, fn_name.clone()) { - Some(dsig) => if (dsig.inferred.clone() != None) { - Rc::new(SigsAccum { - signatures: v2_rt::rc_map_insert(acc.signatures.clone(), fn_name.clone(), declared_to_resolved(&dsig)), - diagnostics: acc.diagnostics.clone(), -}) - } else { + let ready_accum = ready.clone().iter().cloned().fold( Rc::new(SigsAccum { - signatures: acc.signatures.clone(), - diagnostics: v2_rt::rc_list_push(acc.diagnostics.clone(), make_error_node(Rc::new(CompilerDiagnostic::MissingAnnotation { - fn_name: fn_name.clone(), - what: "return type".to_string(), - span: no_span(), -}), module_name.clone())), -}) - }, - None => acc.clone(), -}); -let ready_set = ready.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, fn_name: String| v2_rt::rc_map_insert(acc, fn_name.clone(), true)); -let next_remaining = Rc::new({ let mut __result = Vec::new(); for fn_name in remaining.clone().iter().cloned() { if (emit_map_has(ready_set.clone(), fn_name.clone()) == false) { __result.push(fn_name); } } __result }); -{ + signatures: resolved.clone(), + diagnostics: diagnostics.clone(), + }), + |acc: Rc, fn_name: String| match v2_rt::map_get( + &declared_sigs, + fn_name.clone(), + ) { + Some(dsig) => { + if (dsig.inferred.clone() != None) { + Rc::new(SigsAccum { + signatures: v2_rt::rc_map_insert( + acc.signatures.clone(), + fn_name.clone(), + declared_to_resolved(&dsig), + ), + diagnostics: acc.diagnostics.clone(), + }) + } else { + Rc::new(SigsAccum { + signatures: acc.signatures.clone(), + diagnostics: v2_rt::rc_list_push( + acc.diagnostics.clone(), + make_error_node( + Rc::new(CompilerDiagnostic::MissingAnnotation { + fn_name: fn_name.clone(), + what: "return type".to_string(), + span: no_span(), + }), + module_name.clone(), + ), + ), + }) + } + } + None => acc.clone(), + }, + ); + let ready_set = ready.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, fn_name: String| { + v2_rt::rc_map_insert(acc, fn_name.clone(), true) + }, + ); + let next_remaining = Rc::new({ + let mut __result = Vec::new(); + for fn_name in remaining.clone().iter().cloned() { + if (emit_map_has(ready_set.clone(), fn_name.clone()) == false) { + __result.push(fn_name); + } + } + __result + }); + { let __tco_0 = next_remaining; -let __tco_1 = ready_accum.signatures.clone(); -let __tco_2 = ready_accum.diagnostics.clone(); -let __tco_3 = (fuel - 1); -remaining = __tco_0; -resolved = __tco_1; -diagnostics = __tco_2; -fuel = __tco_3; -continue; -} -} + let __tco_1 = ready_accum.signatures.clone(); + let __tco_2 = ready_accum.diagnostics.clone(); + let __tco_3 = (fuel - 1); + remaining = __tco_0; + resolved = __tco_1; + diagnostics = __tco_2; + fuel = __tco_3; + continue; + } + } } -pub fn resolve_func_sigs(declared_sigs: &Rc>>, items: &Rc>>, module_name: String, source_indices: &Rc>>) -> Rc { +pub fn resolve_func_sigs( + declared_sigs: &Rc>>, + items: &Rc>>, + module_name: String, + source_indices: &Rc>>, +) -> Rc { { - let local_func_names = Rc::new({ let mut __result = Vec::new(); for item in Rc::new({ let mut __result = Vec::new(); for item in items.clone().iter().cloned() { if (((item.params.clone().len() as i64) > 0) && (item.body.clone() != None)) { __result.push(item); } } __result }).iter().cloned() { __result.push(authored_name_at(source_indices.clone(), &item)); } __result }); -let local_func_set = build_name_set(local_func_names.clone()); -let call_edges = collect_func_call_edges(items.clone(), local_func_set.clone(), source_indices.clone()); -let parent_resolved = collect_parent_resolved_sigs(declared_sigs.clone(), local_func_set.clone()); -topo_resolve_loop(local_func_names.clone(), parent_resolved, declared_sigs.clone(), call_edges, local_func_set.clone(), module_name, Rc::new(vec![]), (local_func_names.clone().len() as i64)) -} + let local_func_names = Rc::new({ + let mut __result = Vec::new(); + for item in Rc::new({ + let mut __result = Vec::new(); + for item in items.clone().iter().cloned() { + if (((item.params.clone().len() as i64) > 0) && (item.body.clone() != None)) { + __result.push(item); + } + } + __result + }) + .iter() + .cloned() + { + __result.push(authored_name_at(source_indices.clone(), &item)); + } + __result + }); + let local_func_set = build_name_set(local_func_names.clone()); + let call_edges = collect_func_call_edges( + items.clone(), + local_func_set.clone(), + source_indices.clone(), + ); + let parent_resolved = + collect_parent_resolved_sigs(declared_sigs.clone(), local_func_set.clone()); + topo_resolve_loop( + local_func_names.clone(), + parent_resolved, + declared_sigs.clone(), + call_edges, + local_func_set.clone(), + module_name, + Rc::new(vec![]), + (local_func_names.clone().len() as i64), + ) + } } diff --git a/src/v2/stage0/src/v2_compiler_infer_types.rs b/src/v2/stage0/src/v2_compiler_infer_types.rs index 28a9f85640a..139b9825b17 100644 --- a/src/v2/stage0/src/v2_compiler_infer_types.rs +++ b/src/v2/stage0/src/v2_compiler_infer_types.rs @@ -1,64 +1,83 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.infer_types -use std::collections::HashMap; -use std::rc::Rc; +use crate::std_algebra::AlgebraProfile::{ + ApproximateFieldProfile, BooleanAlgebraCollectionProfile, BooleanAlgebraProfile, + FreeMonoidCollectionProfile, FreeMonoidScalarProfile, OrderedRingProfile, + PartialFunctionProfile, +}; +use crate::std_algebra::AlgebraTypeTemplate::{ + AlgebraTypeVariable, ContainerOf, NamedTemplate, OptionalOf, ReceiverElement, ReceiverKey, + ReceiverSelf, ReceiverValue, TupleOf, +}; +use crate::std_algebra::ContainerSource::{Named, SameAsReceiver}; +pub use crate::std_algebra::{ + algebra_templates_for_profile, kernel_algebra_profile, AlgebraFieldTemplate, AlgebraProfile, + AlgebraTypeTemplate, ContainerSource, +}; +pub use crate::std_types::{ + container_expected_arity, container_param_name, is_container_type, SourceSpan, +}; use crate::v2_rt; -use crate::NonEmptyVec; -use crate::NonEmptyBTreeSet; -pub use crate::std_types::{SourceSpan, is_container_type, container_expected_arity, container_param_name}; -pub use crate::std_algebra::{AlgebraProfile, AlgebraTypeTemplate, ContainerSource, AlgebraFieldTemplate, kernel_algebra_profile, algebra_templates_for_profile}; -use crate::std_algebra::AlgebraProfile::{OrderedRingProfile, ApproximateFieldProfile, BooleanAlgebraProfile, BooleanAlgebraCollectionProfile, FreeMonoidScalarProfile, FreeMonoidCollectionProfile, PartialFunctionProfile}; -use crate::std_algebra::AlgebraTypeTemplate::{ReceiverSelf, ReceiverElement, ReceiverKey, ReceiverValue, NamedTemplate, ContainerOf, OptionalOf, TupleOf, AlgebraTypeVariable}; -use crate::std_algebra::ContainerSource::{SameAsReceiver, Named}; -pub use crate::v2_std_core::{Node, make_param_node, param_node_type_expr, find_child_named, NewlineIndex, Connective, Cardinality, ExprErrorKind, make_expr_node, make_expr_error_node, LiteralValue, is_kernel_type, BinOp, AlgebraFieldKind, InferredNode, has_inferred, is_compiler_error, leaf_node_with_span, no_span, make_span, with_optional_cardinality, with_required_cardinality, unit_type, bool_type, string_type, int_type, float_type, none_type, error_type, default_ident_span, kernel_span, authored_name_at, ErrorNode, make_error_node, ExprData, CompilerDiagnostic}; +use crate::v2_std_core::AlgebraFieldKind::{ + AlgAdd, AlgCompare, AlgJoin, AlgMeet, AlgMul, AlgQuotient, AlgReciprocal, AlgRemainder, +}; +use crate::v2_std_core::BinOp::{And, Eq, Ge, Gt, Le, Lt, Ne, NullCoalesce, Or}; +use crate::v2_std_core::Cardinality::{CardOptional, Required}; +use crate::v2_std_core::CompilerDiagnostic::InternalError; use crate::v2_std_core::Connective::{Conj, Disj, NoConnective}; -use crate::v2_std_core::Cardinality::{Required, CardOptional}; -use crate::v2_std_core::ExprData::{NoExprData, ExprLiteral, ExprError}; -use crate::v2_std_core::ExprErrorKind::{SemanticExprError, InternalExprError}; -use crate::v2_std_core::LiteralValue::{LitStr, LitInt, LitFloat, LitBool, LitNull}; -use crate::v2_std_core::BinOp::{Eq, Ne, Lt, Gt, Le, Ge, And, Or, NullCoalesce}; -use crate::v2_std_core::AlgebraFieldKind::{AlgAdd, AlgMul, AlgReciprocal, AlgQuotient, AlgRemainder, AlgCompare, AlgMeet, AlgJoin}; -use crate::v2_std_core::InferredNode::{Resolved, CompilerError, TypeVariable}; -use crate::v2_std_core::CompilerDiagnostic::{InternalError}; +use crate::v2_std_core::ExprData::{ExprError, ExprLiteral, NoExprData}; +use crate::v2_std_core::ExprErrorKind::{InternalExprError, SemanticExprError}; +use crate::v2_std_core::InferredNode::{CompilerError, Resolved, TypeVariable}; +use crate::v2_std_core::LiteralValue::{LitBool, LitFloat, LitInt, LitNull, LitStr}; +pub use crate::v2_std_core::{ + authored_name_at, bool_type, default_ident_span, error_type, find_child_named, float_type, + has_inferred, int_type, is_compiler_error, is_kernel_type, kernel_span, leaf_node_with_span, + make_error_node, make_expr_error_node, make_expr_node, make_param_node, make_span, no_span, + none_type, param_node_type_expr, string_type, unit_type, with_optional_cardinality, + with_required_cardinality, AlgebraFieldKind, BinOp, Cardinality, CompilerDiagnostic, + Connective, ErrorNode, ExprData, ExprErrorKind, InferredNode, LiteralValue, NewlineIndex, Node, +}; +use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; pub fn is_type_variable(inferred: Rc) -> bool { match (*inferred).clone() { - InferredNode::TypeVariable { .. } => true, - _ => false, -} + InferredNode::TypeVariable { .. } => true, + _ => false, + } } pub fn type_variable_node(id: String) -> Rc { Rc::new(Node { - name: "".to_string(), - span: make_span(0, 0), - ident_span: None, - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::TypeVariable { - id: id, -})), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}) + name: "".to_string(), + span: make_span(0, 0), + ident_span: None, + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::TypeVariable { id: id })), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }) } pub fn resolved_type(n: Rc) -> Rc { match n.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => rt.clone(), - _ => error_type(), -} + Some(InferredNode::Resolved { node: rt, .. }) => rt.clone(), + _ => error_type(), + } } pub fn child_type_node(ch: &Rc) -> Rc { @@ -71,20 +90,31 @@ pub fn child_type_node(ch: &Rc) -> Rc { pub fn child_type_at(n: Rc, index: i64) -> Option> { match n.children.clone().get(index as usize).cloned() { - Some(ch) => Some(child_type_node(&ch)), - None => None, -} + Some(ch) => Some(child_type_node(&ch)), + None => None, + } } -pub fn node_is_collection(n: &Rc, source_indices: Rc>>) -> bool { - ((((n.children.clone().len() as i64) > 0) && (n.connective.clone() == Connective::NoConnective)) && is_container_type(authored_name_at(source_indices, &n))) +pub fn node_is_collection( + n: &Rc, + source_indices: Rc>>, +) -> bool { + ((((n.children.clone().len() as i64) > 0) + && (n.connective.clone() == Connective::NoConnective)) + && is_container_type(authored_name_at(source_indices, &n))) } -pub fn node_is_keyed_collection(n: &Rc, source_indices: Rc>>) -> bool { +pub fn node_is_keyed_collection( + n: &Rc, + source_indices: Rc>>, +) -> bool { (node_is_collection(&n, source_indices) && ((n.children.clone().len() as i64) == 2)) } -pub fn node_is_element_collection(n: &Rc, source_indices: Rc>>) -> bool { +pub fn node_is_element_collection( + n: &Rc, + source_indices: Rc>>, +) -> bool { (node_is_collection(&n, source_indices) && ((n.children.clone().len() as i64) == 1)) } @@ -104,143 +134,160 @@ pub fn is_unit_like(n: &Rc) -> bool { ((n.connective.clone() == Connective::Conj) && ((n.children.clone().len() as i64) == 0)) } -pub fn is_fully_resolved(n: &Rc, source_indices: &Rc>>) -> bool { +pub fn is_fully_resolved( + n: &Rc, + source_indices: &Rc>>, +) -> bool { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - { - let self_is_type_var = match n.inferred.clone() { - Some(inf) => is_type_variable(inf.clone()), - None => false, -}; -if self_is_type_var { - false - } else { - { - let under_param = match container_expected_arity(authored_name_at(source_indices.clone(), &n)) { - Some(expected) => ((n.children.clone().len() as i64) < expected.clone()), - None => false, -}; -if under_param { - false - } else { - { let mut __all = true; for ch in n.children.clone().iter().cloned() { if !(is_fully_resolved(&child_type_node(&ch), &source_indices)) { __all = false; break; } } __all } + let self_is_type_var = match n.inferred.clone() { + Some(inf) => is_type_variable(inf.clone()), + None => false, + }; + if self_is_type_var { + false + } else { + { + let under_param = + match container_expected_arity(authored_name_at(source_indices.clone(), &n)) { + Some(expected) => ((n.children.clone().len() as i64) < expected.clone()), + None => false, + }; + if under_param { + false + } else { + { + let mut __all = true; + for ch in n.children.clone().iter().cloned() { + if !(is_fully_resolved(&child_type_node(&ch), &source_indices)) { + __all = false; + break; + } + } + __all } -} + } } -} + } }) } pub fn bare_map_node() -> Option> { match container_param_name("Map".to_string(), 0) { - Some(key_id) => match container_param_name("Map".to_string(), 1) { - Some(val_id) => Some(Rc::new(Node { - name: "Map".to_string(), - span: make_span(0, 0), - ident_span: Some(make_span(0, 0)), - children: Rc::new(vec![Rc::new(Node { - name: key_id.clone(), - span: make_span(0, 0), - ident_span: Some(make_span(0, 0)), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::Resolved { - node: type_variable_node(key_id.clone()), -})), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}), Rc::new(Node { - name: val_id.clone(), - span: make_span(0, 0), - ident_span: Some(make_span(0, 0)), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::Resolved { - node: type_variable_node(val_id.clone()), -})), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -})]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -})), - None => None, -}, - None => None, -} + Some(key_id) => match container_param_name("Map".to_string(), 1) { + Some(val_id) => Some(Rc::new(Node { + name: "Map".to_string(), + span: make_span(0, 0), + ident_span: Some(make_span(0, 0)), + children: Rc::new(vec![ + Rc::new(Node { + name: key_id.clone(), + span: make_span(0, 0), + ident_span: Some(make_span(0, 0)), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::Resolved { + node: type_variable_node(key_id.clone()), + })), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }), + Rc::new(Node { + name: val_id.clone(), + span: make_span(0, 0), + ident_span: Some(make_span(0, 0)), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::Resolved { + node: type_variable_node(val_id.clone()), + })), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }), + ]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + })), + None => None, + }, + None => None, + } } pub fn kernel_container_profile_miss_diagnostic(kind_name: String) -> Rc { { let msg = v2_rt::concat("missing kernel container profile: ".to_string(), kind_name); -make_error_node(Rc::new(CompilerDiagnostic::InternalError { - message: msg, - span: make_span(0, 0), -}), "v2.compiler.infer_types".to_string()) -} + make_error_node( + Rc::new(CompilerDiagnostic::InternalError { + message: msg, + span: make_span(0, 0), + }), + "v2.compiler.infer_types".to_string(), + ) + } } pub fn missing_kernel_container_profile_type(kind_name: String) -> Rc { { let msg = v2_rt::concat("missing kernel container profile: ".to_string(), kind_name); -Rc::new(Node { - name: "".to_string(), - span: make_span(0, 0), - ident_span: None, - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::CompilerError { - message: msg.clone(), - span: make_span(0, 0), -})), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::ExprError { - kind: ExprErrorKind::InternalExprError, - message: msg.clone(), -}), - ident: None, -}) -} + Rc::new(Node { + name: "".to_string(), + span: make_span(0, 0), + ident_span: None, + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::CompilerError { + message: msg.clone(), + span: make_span(0, 0), + })), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::ExprError { + kind: ExprErrorKind::InternalExprError, + message: msg.clone(), + }), + ident: None, + }) + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -251,302 +298,318 @@ pub struct KernelTypeBuild { pub fn make_container_type(kind_name: &String, element: Rc) -> Rc { match container_param_name(kind_name.clone(), 0) { - Some(param_name) => Rc::new(KernelTypeBuild { - ty: Rc::new(Node { - name: kind_name.clone(), - span: kernel_span(&kind_name), - ident_span: Some(kernel_span(&kind_name)), - children: Rc::new(vec![Rc::new(Node { - name: param_name.clone(), - span: kernel_span(¶m_name), - ident_span: Some(kernel_span(¶m_name)), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::Resolved { - node: element, -})), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -})]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}), - diagnostics: Rc::new(vec![]), -}), - None => Rc::new(KernelTypeBuild { - ty: missing_kernel_container_profile_type(kind_name.clone()), - diagnostics: Rc::new(vec![kernel_container_profile_miss_diagnostic(kind_name.clone())]), -}), -} + Some(param_name) => Rc::new(KernelTypeBuild { + ty: Rc::new(Node { + name: kind_name.clone(), + span: kernel_span(&kind_name), + ident_span: Some(kernel_span(&kind_name)), + children: Rc::new(vec![Rc::new(Node { + name: param_name.clone(), + span: kernel_span(¶m_name), + ident_span: Some(kernel_span(¶m_name)), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::Resolved { node: element })), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + })]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }), + diagnostics: Rc::new(vec![]), + }), + None => Rc::new(KernelTypeBuild { + ty: missing_kernel_container_profile_type(kind_name.clone()), + diagnostics: Rc::new(vec![kernel_container_profile_miss_diagnostic( + kind_name.clone(), + )]), + }), + } } pub fn make_map_type(key: Rc, value: Rc) -> Rc { match container_param_name("Map".to_string(), 0) { - Some(key_name) => match container_param_name("Map".to_string(), 1) { - Some(val_name) => Rc::new(KernelTypeBuild { - ty: Rc::new(Node { - name: "Map".to_string(), - span: kernel_span(&"Map".to_string()), - ident_span: Some(kernel_span(&"Map".to_string())), - children: Rc::new(vec![Rc::new(Node { - name: key_name.clone(), - span: kernel_span(&key_name), - ident_span: Some(kernel_span(&key_name)), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::Resolved { - node: key, -})), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}), Rc::new(Node { - name: val_name.clone(), - span: kernel_span(&val_name), - ident_span: Some(kernel_span(&val_name)), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::Resolved { - node: value, -})), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -})]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}), - diagnostics: Rc::new(vec![]), -}), - None => Rc::new(KernelTypeBuild { - ty: missing_kernel_container_profile_type("Map".to_string()), - diagnostics: Rc::new(vec![kernel_container_profile_miss_diagnostic("Map".to_string())]), -}), -}, - None => Rc::new(KernelTypeBuild { - ty: missing_kernel_container_profile_type("Map".to_string()), - diagnostics: Rc::new(vec![kernel_container_profile_miss_diagnostic("Map".to_string())]), -}), -} + Some(key_name) => match container_param_name("Map".to_string(), 1) { + Some(val_name) => Rc::new(KernelTypeBuild { + ty: Rc::new(Node { + name: "Map".to_string(), + span: kernel_span(&"Map".to_string()), + ident_span: Some(kernel_span(&"Map".to_string())), + children: Rc::new(vec![ + Rc::new(Node { + name: key_name.clone(), + span: kernel_span(&key_name), + ident_span: Some(kernel_span(&key_name)), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::Resolved { node: key })), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }), + Rc::new(Node { + name: val_name.clone(), + span: kernel_span(&val_name), + ident_span: Some(kernel_span(&val_name)), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::Resolved { node: value })), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }), + ]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }), + diagnostics: Rc::new(vec![]), + }), + None => Rc::new(KernelTypeBuild { + ty: missing_kernel_container_profile_type("Map".to_string()), + diagnostics: Rc::new(vec![kernel_container_profile_miss_diagnostic( + "Map".to_string(), + )]), + }), + }, + None => Rc::new(KernelTypeBuild { + ty: missing_kernel_container_profile_type("Map".to_string()), + diagnostics: Rc::new(vec![kernel_container_profile_miss_diagnostic( + "Map".to_string(), + )]), + }), + } } pub fn make_callable_type(func_params: Rc>>, ret: Rc) -> Rc { Rc::new(Node { - name: "Callable".to_string(), - span: kernel_span(&"Callable".to_string()), - ident_span: Some(kernel_span(&"Callable".to_string())), - children: Rc::new(vec![]), - connective: Connective::Arrow, - params: func_params, - inferred: Some(Rc::new(InferredNode::Resolved { - node: ret, -})), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}) + name: "Callable".to_string(), + span: kernel_span(&"Callable".to_string()), + ident_span: Some(kernel_span(&"Callable".to_string())), + children: Rc::new(vec![]), + connective: Connective::Arrow, + params: func_params, + inferred: Some(Rc::new(InferredNode::Resolved { node: ret })), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }) } pub fn make_tuple_type(first: Rc, second: Rc) -> Rc { Rc::new(Node { - name: "".to_string(), - span: make_span(0, 0), - ident_span: None, - children: Rc::new(vec![Rc::new(Node { - name: "first".to_string(), - span: kernel_span(&"first".to_string()), - ident_span: Some(kernel_span(&"first".to_string())), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::Resolved { - node: first, -})), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}), Rc::new(Node { - name: "second".to_string(), - span: kernel_span(&"second".to_string()), - ident_span: Some(kernel_span(&"second".to_string())), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::Resolved { - node: second, -})), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -})]), - connective: Connective::Conj, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}) + name: "".to_string(), + span: make_span(0, 0), + ident_span: None, + children: Rc::new(vec![ + Rc::new(Node { + name: "first".to_string(), + span: kernel_span(&"first".to_string()), + ident_span: Some(kernel_span(&"first".to_string())), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::Resolved { node: first })), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }), + Rc::new(Node { + name: "second".to_string(), + span: kernel_span(&"second".to_string()), + ident_span: Some(kernel_span(&"second".to_string())), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::Resolved { node: second })), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }), + ]), + connective: Connective::Conj, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }) } pub fn algebra_value_field(name: &String, type_node: Rc) -> Rc { Rc::new(Node { - name: name.clone(), - span: kernel_span(&name), - ident_span: Some(kernel_span(&name)), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::Resolved { - node: type_node, -})), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}) + name: name.clone(), + span: kernel_span(&name), + ident_span: Some(kernel_span(&name)), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::Resolved { node: type_node })), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }) } -pub fn algebra_method_field(name: &String, param_types: Rc>>, return_type: Rc) -> Rc { +pub fn algebra_method_field( + name: &String, + param_types: Rc>>, + return_type: Rc, +) -> Rc { { - let params = Rc::new({ let mut __result = Vec::new(); for t in param_types.iter().cloned() { __result.push(make_param_node(&"_".to_string(), t.clone(), None, no_span(), no_span())); } __result }); -let callable = make_callable_type(params, return_type); -Rc::new(Node { - name: name.clone(), - span: kernel_span(&name), - ident_span: Some(kernel_span(&name)), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::Resolved { - node: callable, -})), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}) -} + let params = Rc::new({ + let mut __result = Vec::new(); + for t in param_types.iter().cloned() { + __result.push(make_param_node( + &"_".to_string(), + t.clone(), + None, + no_span(), + no_span(), + )); + } + __result + }); + let callable = make_callable_type(params, return_type); + Rc::new(Node { + name: name.clone(), + span: kernel_span(&name), + ident_span: Some(kernel_span(&name)), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::Resolved { node: callable })), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }) + } } -pub fn enrich_base_with_fields(name: String, base: &Rc, fields: Rc>>) -> Rc { +pub fn enrich_base_with_fields( + name: String, + base: &Rc, + fields: Rc>>, +) -> Rc { Rc::new(Node { - name: name, - span: base.span.clone(), - ident_span: base.ident_span.clone(), - children: fields, - connective: Connective::Conj, - params: base.params.clone(), - inferred: base.inferred.clone(), - return_cardinality: base.return_cardinality.clone(), - uses: base.uses.clone(), - body: base.body.clone(), - transport: base.transport.clone(), - properties: base.properties.clone(), - type_annotation: base.type_annotation.clone(), - is_self_recursive: base.is_self_recursive.clone(), - has_non_tail_self_call: base.has_non_tail_self_call.clone(), - match_pattern: base.match_pattern.clone(), - expr_data: base.expr_data.clone(), - ident: None, -}) + name: name, + span: base.span.clone(), + ident_span: base.ident_span.clone(), + children: fields, + connective: Connective::Conj, + params: base.params.clone(), + inferred: base.inferred.clone(), + return_cardinality: base.return_cardinality.clone(), + uses: base.uses.clone(), + body: base.body.clone(), + transport: base.transport.clone(), + properties: base.properties.clone(), + type_annotation: base.type_annotation.clone(), + is_self_recursive: base.is_self_recursive.clone(), + has_non_tail_self_call: base.has_non_tail_self_call.clone(), + match_pattern: base.match_pattern.clone(), + expr_data: base.expr_data.clone(), + ident: None, + }) } pub fn placeholder_type_node(name: String) -> Rc { @@ -557,410 +620,748 @@ pub fn nominal_type_ref(name: &String) -> Rc { leaf_node_with_span(&name, &kernel_span(&name)) } -pub fn algebra_child_or_placeholder(base: Rc, child_index: i64, placeholder: String) -> Rc { - match Rc::new({ let mut __result = Vec::new(); for pair in Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(base.children.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { if (pair.0.clone() == child_index.clone()) { __result.push(pair); } } __result }).iter().cloned() { __result.push(pair.1.clone()); } __result }).first().cloned() { - Some(child) => child_type_node(&child), - None => type_variable_node(placeholder), -} +pub fn algebra_child_or_placeholder( + base: Rc, + child_index: i64, + placeholder: String, +) -> Rc { + match Rc::new({ + let mut __result = Vec::new(); + for pair in Rc::new({ + let mut __result = Vec::new(); + for pair in Rc::new( + base.children + .clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + { + if (pair.0.clone() == child_index.clone()) { + __result.push(pair); + } + } + __result + }) + .iter() + .cloned() + { + __result.push(pair.1.clone()); + } + __result + }) + .first() + .cloned() + { + Some(child) => child_type_node(&child), + None => type_variable_node(placeholder), + } } -pub fn instantiate_algebra_type(template: Rc, base: &Rc, source_indices: &Rc>>) -> Rc { +pub fn instantiate_algebra_type( + template: Rc, + base: &Rc, + source_indices: &Rc>>, +) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - { - let elem = algebra_child_or_placeholder(base.clone(), 0, "T".to_string()); -let key_node = algebra_child_or_placeholder(base.clone(), 0, "K".to_string()); -let val_node = algebra_child_or_placeholder(base.clone(), 1, "V".to_string()); -match (*template).clone() { - AlgebraTypeTemplate::ReceiverSelf => Rc::new(KernelTypeBuild { - ty: base.clone(), - diagnostics: Rc::new(vec![]), -}), - AlgebraTypeTemplate::ReceiverElement => Rc::new(KernelTypeBuild { - ty: elem, - diagnostics: Rc::new(vec![]), -}), - AlgebraTypeTemplate::ReceiverKey => Rc::new(KernelTypeBuild { - ty: key_node, - diagnostics: Rc::new(vec![]), -}), - AlgebraTypeTemplate::ReceiverValue => Rc::new(KernelTypeBuild { - ty: val_node, - diagnostics: Rc::new(vec![]), -}), - AlgebraTypeTemplate::NamedTemplate { name: n, .. } => Rc::new(KernelTypeBuild { - ty: nominal_type_ref(&n), - diagnostics: Rc::new(vec![]), -}), - AlgebraTypeTemplate::AlgebraTypeVariable { id: var_id, .. } => Rc::new(KernelTypeBuild { - ty: type_variable_node(var_id.clone()), - diagnostics: Rc::new(vec![]), -}), - AlgebraTypeTemplate::ContainerOf { source: src, element: inner, .. } => { + let elem = algebra_child_or_placeholder(base.clone(), 0, "T".to_string()); + let key_node = algebra_child_or_placeholder(base.clone(), 0, "K".to_string()); + let val_node = algebra_child_or_placeholder(base.clone(), 1, "V".to_string()); + match (*template).clone() { + AlgebraTypeTemplate::ReceiverSelf => Rc::new(KernelTypeBuild { + ty: base.clone(), + diagnostics: Rc::new(vec![]), + }), + AlgebraTypeTemplate::ReceiverElement => Rc::new(KernelTypeBuild { + ty: elem, + diagnostics: Rc::new(vec![]), + }), + AlgebraTypeTemplate::ReceiverKey => Rc::new(KernelTypeBuild { + ty: key_node, + diagnostics: Rc::new(vec![]), + }), + AlgebraTypeTemplate::ReceiverValue => Rc::new(KernelTypeBuild { + ty: val_node, + diagnostics: Rc::new(vec![]), + }), + AlgebraTypeTemplate::NamedTemplate { name: n, .. } => Rc::new(KernelTypeBuild { + ty: nominal_type_ref(&n), + diagnostics: Rc::new(vec![]), + }), + AlgebraTypeTemplate::AlgebraTypeVariable { id: var_id, .. } => { + Rc::new(KernelTypeBuild { + ty: type_variable_node(var_id.clone()), + diagnostics: Rc::new(vec![]), + }) + } + AlgebraTypeTemplate::ContainerOf { + source: src, + element: inner, + .. + } => { let kind_name = match (*src.clone()).clone() { - ContainerSource::SameAsReceiver => authored_name_at(source_indices.clone(), &base), - ContainerSource::Named { name: n, .. } => n.clone(), -}; -let inner_b = instantiate_algebra_type(inner.clone(), &base, &source_indices); -let built = make_container_type(&kind_name, inner_b.ty.clone()); -Rc::new(KernelTypeBuild { - ty: built.ty.clone(), - diagnostics: v2_rt::concat(inner_b.diagnostics.clone(), built.diagnostics.clone()), -}) -}, - AlgebraTypeTemplate::OptionalOf { inner, .. } => { + ContainerSource::SameAsReceiver => { + authored_name_at(source_indices.clone(), &base) + } + ContainerSource::Named { name: n, .. } => n.clone(), + }; + let inner_b = instantiate_algebra_type(inner.clone(), &base, &source_indices); + let built = make_container_type(&kind_name, inner_b.ty.clone()); + Rc::new(KernelTypeBuild { + ty: built.ty.clone(), + diagnostics: v2_rt::concat( + inner_b.diagnostics.clone(), + built.diagnostics.clone(), + ), + }) + } + AlgebraTypeTemplate::OptionalOf { inner, .. } => { let ib = instantiate_algebra_type(inner.clone(), &base, &source_indices); -Rc::new(KernelTypeBuild { - ty: with_optional_cardinality(&ib.ty.clone()), - diagnostics: ib.diagnostics.clone(), -}) -}, - AlgebraTypeTemplate::TupleOf { first, second, .. } => { + Rc::new(KernelTypeBuild { + ty: with_optional_cardinality(&ib.ty.clone()), + diagnostics: ib.diagnostics.clone(), + }) + } + AlgebraTypeTemplate::TupleOf { first, second, .. } => { let fb = instantiate_algebra_type(first.clone(), &base, &source_indices); -let sb = instantiate_algebra_type(second.clone(), &base, &source_indices); -Rc::new(KernelTypeBuild { - ty: make_tuple_type(fb.ty.clone(), sb.ty.clone()), - diagnostics: v2_rt::concat(fb.diagnostics.clone(), sb.diagnostics.clone()), -}) -}, - AlgebraTypeTemplate::CallableOf { params: p, return_type: r, .. } => { - let param_bs = Rc::new({ let mut __result = Vec::new(); for tp in p.clone().iter().cloned() { __result.push(instantiate_algebra_type(tp.clone(), &base, &source_indices)); } __result }); -let param_diags = Rc::new({ let mut __result = Vec::new(); for b in param_bs.clone().iter().cloned() { __result.extend((*b.diagnostics.clone()).iter().cloned()); } __result }); -let param_nodes = Rc::new({ let mut __result = Vec::new(); for b in param_bs.clone().iter().cloned() { __result.push(b.ty.clone()); } __result }); -let rb = instantiate_algebra_type(r.clone(), &base, &source_indices); -Rc::new(KernelTypeBuild { - ty: make_callable_type(param_nodes, rb.ty.clone()), - diagnostics: v2_rt::concat(param_diags, rb.diagnostics.clone()), -}) -}, -} -} + let sb = instantiate_algebra_type(second.clone(), &base, &source_indices); + Rc::new(KernelTypeBuild { + ty: make_tuple_type(fb.ty.clone(), sb.ty.clone()), + diagnostics: v2_rt::concat(fb.diagnostics.clone(), sb.diagnostics.clone()), + }) + } + AlgebraTypeTemplate::CallableOf { + params: p, + return_type: r, + .. + } => { + let param_bs = Rc::new({ + let mut __result = Vec::new(); + for tp in p.clone().iter().cloned() { + __result.push(instantiate_algebra_type(tp.clone(), &base, &source_indices)); + } + __result + }); + let param_diags = Rc::new({ + let mut __result = Vec::new(); + for b in param_bs.clone().iter().cloned() { + __result.extend((*b.diagnostics.clone()).iter().cloned()); + } + __result + }); + let param_nodes = Rc::new({ + let mut __result = Vec::new(); + for b in param_bs.clone().iter().cloned() { + __result.push(b.ty.clone()); + } + __result + }); + let rb = instantiate_algebra_type(r.clone(), &base, &source_indices); + Rc::new(KernelTypeBuild { + ty: make_callable_type(param_nodes, rb.ty.clone()), + diagnostics: v2_rt::concat(param_diags, rb.diagnostics.clone()), + }) + } + } }) } -pub fn instantiate_algebra_field(template: &Rc, base: &Rc, source_indices: &Rc>>) -> Rc { +pub fn instantiate_algebra_field( + template: &Rc, + base: &Rc, + source_indices: &Rc>>, +) -> Rc { { - let param_bs = Rc::new({ let mut __result = Vec::new(); for tp in template.param_types.clone().iter().cloned() { __result.push(instantiate_algebra_type(tp.clone(), &base, &source_indices)); } __result }); -let param_types = Rc::new({ let mut __result = Vec::new(); for b in param_bs.clone().iter().cloned() { __result.push(b.ty.clone()); } __result }); -let param_diags = Rc::new({ let mut __result = Vec::new(); for b in param_bs.clone().iter().cloned() { __result.extend((*b.diagnostics.clone()).iter().cloned()); } __result }); -let return_b = instantiate_algebra_type(template.return_type.clone(), &base, &source_indices); -let field_ty = if ((param_types.clone().len() as i64) > 0) { - algebra_method_field(&template.name.clone(), param_types.clone(), return_b.ty.clone()) + let param_bs = Rc::new({ + let mut __result = Vec::new(); + for tp in template.param_types.clone().iter().cloned() { + __result.push(instantiate_algebra_type(tp.clone(), &base, &source_indices)); + } + __result + }); + let param_types = Rc::new({ + let mut __result = Vec::new(); + for b in param_bs.clone().iter().cloned() { + __result.push(b.ty.clone()); + } + __result + }); + let param_diags = Rc::new({ + let mut __result = Vec::new(); + for b in param_bs.clone().iter().cloned() { + __result.extend((*b.diagnostics.clone()).iter().cloned()); + } + __result + }); + let return_b = + instantiate_algebra_type(template.return_type.clone(), &base, &source_indices); + let field_ty = if ((param_types.clone().len() as i64) > 0) { + algebra_method_field( + &template.name.clone(), + param_types.clone(), + return_b.ty.clone(), + ) } else { algebra_value_field(&template.name.clone(), return_b.ty.clone()) }; -Rc::new(KernelTypeBuild { - ty: field_ty, - diagnostics: v2_rt::concat(param_diags, return_b.diagnostics.clone()), -}) -} + Rc::new(KernelTypeBuild { + ty: field_ty, + diagnostics: v2_rt::concat(param_diags, return_b.diagnostics.clone()), + }) + } } -pub fn enrich_kernel_type(name: &String, base: &Rc, source_indices: Rc>>) -> Rc { +pub fn enrich_kernel_type( + name: &String, + base: &Rc, + source_indices: Rc>>, +) -> Rc { { let profile = v2_rt::map_get(&kernel_algebra_profile(), name.clone()); -match profile { - Some(p) => { - let field_bs = Rc::new({ let mut __result = Vec::new(); for template in algebra_templates_for_profile(p.clone()).iter().cloned() { __result.push(instantiate_algebra_field(&template, &base, &source_indices)); } __result }); -let fields = Rc::new({ let mut __result = Vec::new(); for b in field_bs.clone().iter().cloned() { __result.push(b.ty.clone()); } __result }); -let field_diags = Rc::new({ let mut __result = Vec::new(); for b in field_bs.clone().iter().cloned() { __result.extend((*b.diagnostics.clone()).iter().cloned()); } __result }); -Rc::new(KernelTypeBuild { - ty: enrich_base_with_fields(name.clone(), &base, fields), - diagnostics: field_diags, -}) -}, - None => Rc::new(KernelTypeBuild { - ty: base.clone(), - diagnostics: Rc::new(vec![]), -}), -} -} + match profile { + Some(p) => { + let field_bs = Rc::new({ + let mut __result = Vec::new(); + for template in algebra_templates_for_profile(p.clone()).iter().cloned() { + __result.push(instantiate_algebra_field(&template, &base, &source_indices)); + } + __result + }); + let fields = Rc::new({ + let mut __result = Vec::new(); + for b in field_bs.clone().iter().cloned() { + __result.push(b.ty.clone()); + } + __result + }); + let field_diags = Rc::new({ + let mut __result = Vec::new(); + for b in field_bs.clone().iter().cloned() { + __result.extend((*b.diagnostics.clone()).iter().cloned()); + } + __result + }); + Rc::new(KernelTypeBuild { + ty: enrich_base_with_fields(name.clone(), &base, fields), + diagnostics: field_diags, + }) + } + None => Rc::new(KernelTypeBuild { + ty: base.clone(), + diagnostics: Rc::new(vec![]), + }), + } + } } -pub fn unify_template(template: Rc, concrete: &Rc, receiver: &Rc, subst: Rc>>, source_indices: &Rc>>) -> Rc>> { - stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - match (*template).clone() { - AlgebraTypeTemplate::AlgebraTypeVariable { id: var_id, .. } => if (v2_rt::map_get(&subst, var_id.clone()) != None) { - subst.clone() - } else { - v2_rt::rc_map_insert(subst.clone(), var_id.clone(), concrete.clone()) - }, - AlgebraTypeTemplate::ReceiverSelf => { +pub fn unify_template( + template: Rc, + concrete: &Rc, + receiver: &Rc, + subst: Rc>>, + source_indices: &Rc>>, +) -> Rc>> { + stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || match (*template).clone() { + AlgebraTypeTemplate::AlgebraTypeVariable { id: var_id, .. } => { + if (v2_rt::map_get(&subst, var_id.clone()) != None) { + subst.clone() + } else { + v2_rt::rc_map_insert(subst.clone(), var_id.clone(), concrete.clone()) + } + } + AlgebraTypeTemplate::ReceiverSelf => { let s1 = match concrete.children.clone().first().cloned() { - Some(k) => if (v2_rt::map_get(&subst, "__key__".to_string()) != None) { + Some(k) => { + if (v2_rt::map_get(&subst, "__key__".to_string()) != None) { + subst.clone() + } else { + v2_rt::rc_map_insert( + subst.clone(), + "__key__".to_string(), + child_type_node(&k), + ) + } + } + None => subst.clone(), + }; + match concrete.children.clone().get(1 as usize).cloned() { + Some(v) => { + if (v2_rt::map_get(&s1, "__value__".to_string()) != None) { + s1.clone() + } else { + v2_rt::rc_map_insert( + s1.clone(), + "__value__".to_string(), + child_type_node(&v), + ) + } + } + None => s1.clone(), + } + } + AlgebraTypeTemplate::ReceiverKey => { + if (v2_rt::map_get(&subst, "__key__".to_string()) != None) { subst.clone() } else { - v2_rt::rc_map_insert(subst.clone(), "__key__".to_string(), child_type_node(&k)) - }, - None => subst.clone(), -}; -match concrete.children.clone().get(1 as usize).cloned() { - Some(v) => if (v2_rt::map_get(&s1, "__value__".to_string()) != None) { - s1.clone() + v2_rt::rc_map_insert(subst.clone(), "__key__".to_string(), concrete.clone()) + } + } + AlgebraTypeTemplate::ReceiverValue => { + if (v2_rt::map_get(&subst, "__value__".to_string()) != None) { + subst.clone() } else { - v2_rt::rc_map_insert(s1.clone(), "__value__".to_string(), child_type_node(&v)) - }, - None => s1.clone(), -} -}, - AlgebraTypeTemplate::ReceiverKey => if (v2_rt::map_get(&subst, "__key__".to_string()) != None) { - subst.clone() - } else { - v2_rt::rc_map_insert(subst.clone(), "__key__".to_string(), concrete.clone()) - }, - AlgebraTypeTemplate::ReceiverValue => if (v2_rt::map_get(&subst, "__value__".to_string()) != None) { - subst.clone() - } else { - v2_rt::rc_map_insert(subst.clone(), "__value__".to_string(), concrete.clone()) - }, - AlgebraTypeTemplate::ReceiverElement => if (v2_rt::map_get(&subst, "__element__".to_string()) != None) { - subst.clone() - } else { - v2_rt::rc_map_insert(subst.clone(), "__element__".to_string(), concrete.clone()) - }, - AlgebraTypeTemplate::CallableOf { return_type: ret_template, .. } => unify_template(ret_template.clone(), &concrete, &receiver, subst.clone(), &source_indices), - AlgebraTypeTemplate::ContainerOf { source: src, element: elem_template, .. } => { + v2_rt::rc_map_insert(subst.clone(), "__value__".to_string(), concrete.clone()) + } + } + AlgebraTypeTemplate::ReceiverElement => { + if (v2_rt::map_get(&subst, "__element__".to_string()) != None) { + subst.clone() + } else { + v2_rt::rc_map_insert(subst.clone(), "__element__".to_string(), concrete.clone()) + } + } + AlgebraTypeTemplate::CallableOf { + return_type: ret_template, + .. + } => unify_template( + ret_template.clone(), + &concrete, + &receiver, + subst.clone(), + &source_indices, + ), + AlgebraTypeTemplate::ContainerOf { + source: src, + element: elem_template, + .. + } => { let expected_name = match (*src.clone()).clone() { - ContainerSource::SameAsReceiver => authored_name_at(source_indices.clone(), &receiver), - ContainerSource::Named { name: n, .. } => n.clone(), -}; -if (authored_name_at(source_indices.clone(), &concrete).as_str() != expected_name.as_str()) { + ContainerSource::SameAsReceiver => { + authored_name_at(source_indices.clone(), &receiver) + } + ContainerSource::Named { name: n, .. } => n.clone(), + }; + if (authored_name_at(source_indices.clone(), &concrete).as_str() + != expected_name.as_str()) + { subst.clone() } else { match concrete.children.clone().first().cloned() { - Some(child) => unify_template(elem_template.clone(), &child_type_node(&child), &receiver, subst.clone(), &source_indices), - None => subst.clone(), -} + Some(child) => unify_template( + elem_template.clone(), + &child_type_node(&child), + &receiver, + subst.clone(), + &source_indices, + ), + None => subst.clone(), + } } -}, - AlgebraTypeTemplate::OptionalOf { inner: inner_template, .. } => match concrete.children.clone().first().cloned() { - Some(child) => unify_template(inner_template.clone(), &child_type_node(&child), &receiver, subst.clone(), &source_indices), - None => subst.clone(), -}, - AlgebraTypeTemplate::TupleOf { first: ft, second: st, .. } => { + } + AlgebraTypeTemplate::OptionalOf { + inner: inner_template, + .. + } => match concrete.children.clone().first().cloned() { + Some(child) => unify_template( + inner_template.clone(), + &child_type_node(&child), + &receiver, + subst.clone(), + &source_indices, + ), + None => subst.clone(), + }, + AlgebraTypeTemplate::TupleOf { + first: ft, + second: st, + .. + } => { let s2 = match concrete.children.clone().first().cloned() { - Some(c) => unify_template(ft.clone(), &child_type_node(&c), &receiver, subst.clone(), &source_indices), - None => subst.clone(), -}; -match concrete.children.clone().get(1 as usize).cloned() { - Some(c) => unify_template(st.clone(), &child_type_node(&c), &receiver, s2, &source_indices), - None => s2, -} -}, - _ => subst.clone(), -} + Some(c) => unify_template( + ft.clone(), + &child_type_node(&c), + &receiver, + subst.clone(), + &source_indices, + ), + None => subst.clone(), + }; + match concrete.children.clone().get(1 as usize).cloned() { + Some(c) => unify_template( + st.clone(), + &child_type_node(&c), + &receiver, + s2, + &source_indices, + ), + None => s2, + } + } + _ => subst.clone(), }) } pub fn is_receiver_self(t: Rc) -> bool { match (*t).clone() { - AlgebraTypeTemplate::ReceiverSelf => true, - _ => false, -} + AlgebraTypeTemplate::ReceiverSelf => true, + _ => false, + } } -pub fn build_type_substitution(param_templates: &Rc>>, arg_types: Rc>>, receiver: Rc, base_subst: Rc>>, source_indices: Rc>>) -> Rc>> { +pub fn build_type_substitution( + param_templates: &Rc>>, + arg_types: Rc>>, + receiver: Rc, + base_subst: Rc>>, + source_indices: Rc>>, +) -> Rc>> { { let first_is_self = match param_templates.clone().first().cloned() { - Some(t) => is_receiver_self(t.clone()), - None => false, -}; -let non_receiver_templates = if first_is_self { - Rc::new(param_templates.clone().iter().cloned().skip(1 as usize).collect::>()) + Some(t) => is_receiver_self(t.clone()), + None => false, + }; + let non_receiver_templates = if first_is_self { + Rc::new( + param_templates + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ) } else { param_templates.clone() }; -let pairs = Rc::new({ let mut __result = Vec::new(); for pair in Rc::new(non_receiver_templates.iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { if (pair.0.clone() < (arg_types.clone().len() as i64)) { __result.push(pair); } } __result }); -pairs.iter().cloned().fold(base_subst.clone(), |subst: Rc>>, pair: (i64, Rc)| { - let arg_type = match Rc::new({ let mut __result = Vec::new(); for ap in Rc::new({ let mut __result = Vec::new(); for ap in Rc::new(arg_types.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { if (ap.0.clone() == pair.0.clone()) { __result.push(ap); } } __result }).iter().cloned() { __result.push(ap.1.clone()); } __result }).first().cloned() { - Some(a) => a.clone(), - None => error_type(), -}; -unify_template(pair.1.clone(), &arg_type, &receiver, subst, &source_indices) -}) -} + let pairs = Rc::new({ + let mut __result = Vec::new(); + for pair in Rc::new( + non_receiver_templates + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + { + if (pair.0.clone() < (arg_types.clone().len() as i64)) { + __result.push(pair); + } + } + __result + }); + pairs.iter().cloned().fold( + base_subst.clone(), + |subst: Rc>>, pair: (i64, Rc)| { + let arg_type = match Rc::new({ + let mut __result = Vec::new(); + for ap in Rc::new({ + let mut __result = Vec::new(); + for ap in Rc::new( + arg_types + .clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + { + if (ap.0.clone() == pair.0.clone()) { + __result.push(ap); + } + } + __result + }) + .iter() + .cloned() + { + __result.push(ap.1.clone()); + } + __result + }) + .first() + .cloned() + { + Some(a) => a.clone(), + None => error_type(), + }; + unify_template(pair.1.clone(), &arg_type, &receiver, subst, &source_indices) + }, + ) + } } -pub fn apply_type_substitution(template: Rc, subst: &Rc>>, receiver: &Rc, source_indices: &Rc>>) -> Rc { - stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - match (*template).clone() { - AlgebraTypeTemplate::AlgebraTypeVariable { id: var_id, .. } => match v2_rt::map_get(&subst, var_id.clone()) { - Some(resolved) => Rc::new(KernelTypeBuild { - ty: resolved.clone(), - diagnostics: Rc::new(vec![]), -}), - None => Rc::new(KernelTypeBuild { - ty: type_variable_node(var_id.clone()), - diagnostics: Rc::new(vec![]), -}), -}, - AlgebraTypeTemplate::ReceiverSelf => { +pub fn apply_type_substitution( + template: Rc, + subst: &Rc>>, + receiver: &Rc, + source_indices: &Rc>>, +) -> Rc { + stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || match (*template).clone() { + AlgebraTypeTemplate::AlgebraTypeVariable { id: var_id, .. } => { + match v2_rt::map_get(&subst, var_id.clone()) { + Some(resolved) => Rc::new(KernelTypeBuild { + ty: resolved.clone(), + diagnostics: Rc::new(vec![]), + }), + None => Rc::new(KernelTypeBuild { + ty: type_variable_node(var_id.clone()), + diagnostics: Rc::new(vec![]), + }), + } + } + AlgebraTypeTemplate::ReceiverSelf => { let receiver_name_str = authored_name_at(source_indices.clone(), &receiver); -let is_bare = (is_container_type(receiver_name_str.clone()) && { let mut __all = true; for ch in receiver.children.clone().iter().cloned() { if !({ - let inner = child_type_node(&ch); -if (inner.inferred.clone() != None) { - is_type_variable(inner.inferred.clone().clone().unwrap()) - } else { - ((inner.ident_span.clone() == None) || !is_kernel_type(authored_name_at(source_indices.clone(), &inner))) + let is_bare = (is_container_type(receiver_name_str.clone()) && { + let mut __all = true; + for ch in receiver.children.clone().iter().cloned() { + if !({ + let inner = child_type_node(&ch); + if (inner.inferred.clone() != None) { + is_type_variable(inner.inferred.clone().clone().unwrap()) + } else { + ((inner.ident_span.clone() == None) + || !is_kernel_type(authored_name_at( + source_indices.clone(), + &inner, + ))) + } + }) { + __all = false; + break; + } } -}) { __all = false; break; } } __all }); -if is_bare { + __all + }); + if is_bare { { let arity = container_expected_arity(receiver_name_str.clone()); -if (arity.clone() == Some(2)) { + if (arity.clone() == Some(2)) { match v2_rt::map_get(&subst, "__key__".to_string()) { - Some(key) => { - let val = match v2_rt::map_get(&subst, "__value__".to_string()) { - Some(v) => v.clone(), - None => type_variable_node("V".to_string()), -}; -make_map_type(key.clone(), val) -}, - None => Rc::new(KernelTypeBuild { - ty: receiver.clone(), - diagnostics: Rc::new(vec![]), -}), -} + Some(key) => { + let val = match v2_rt::map_get(&subst, "__value__".to_string()) { + Some(v) => v.clone(), + None => type_variable_node("V".to_string()), + }; + make_map_type(key.clone(), val) + } + None => Rc::new(KernelTypeBuild { + ty: receiver.clone(), + diagnostics: Rc::new(vec![]), + }), + } } else { if (arity.clone() == Some(1)) { match v2_rt::map_get(&subst, "__element__".to_string()) { - Some(elem) => make_container_type(&receiver_name_str, elem.clone()), - None => Rc::new(KernelTypeBuild { - ty: receiver.clone(), - diagnostics: Rc::new(vec![]), -}), -} + Some(elem) => make_container_type(&receiver_name_str, elem.clone()), + None => Rc::new(KernelTypeBuild { + ty: receiver.clone(), + diagnostics: Rc::new(vec![]), + }), + } } else { Rc::new(KernelTypeBuild { - ty: receiver.clone(), - diagnostics: Rc::new(vec![]), -}) + ty: receiver.clone(), + diagnostics: Rc::new(vec![]), + }) } } -} + } } else { Rc::new(KernelTypeBuild { - ty: receiver.clone(), - diagnostics: Rc::new(vec![]), -}) + ty: receiver.clone(), + diagnostics: Rc::new(vec![]), + }) } -}, - AlgebraTypeTemplate::ReceiverElement => match receiver.children.clone().first().cloned() { - Some(child) => Rc::new(KernelTypeBuild { - ty: child_type_node(&child), - diagnostics: Rc::new(vec![]), -}), - None => match v2_rt::map_get(&subst, "__element__".to_string()) { - Some(elem) => Rc::new(KernelTypeBuild { - ty: elem.clone(), - diagnostics: Rc::new(vec![]), -}), - None => { - let rname = authored_name_at(source_indices.clone(), &receiver); -match container_param_name(rname.clone(), 0) { - Some(n) => Rc::new(KernelTypeBuild { - ty: type_variable_node(n.clone()), - diagnostics: Rc::new(vec![]), -}), - None => Rc::new(KernelTypeBuild { - ty: missing_kernel_container_profile_type(rname.clone()), - diagnostics: Rc::new(vec![kernel_container_profile_miss_diagnostic(rname.clone())]), -}), -} -}, -}, -}, - AlgebraTypeTemplate::ReceiverKey => match receiver.children.clone().first().cloned() { - Some(child) => Rc::new(KernelTypeBuild { - ty: child_type_node(&child), - diagnostics: Rc::new(vec![]), -}), - None => match v2_rt::map_get(&subst, "__key__".to_string()) { - Some(key) => Rc::new(KernelTypeBuild { - ty: key.clone(), - diagnostics: Rc::new(vec![]), -}), - None => { - let rname = authored_name_at(source_indices.clone(), &receiver); -match container_param_name(rname.clone(), 0) { - Some(n) => Rc::new(KernelTypeBuild { - ty: type_variable_node(n.clone()), - diagnostics: Rc::new(vec![]), -}), - None => Rc::new(KernelTypeBuild { - ty: missing_kernel_container_profile_type(rname.clone()), - diagnostics: Rc::new(vec![kernel_container_profile_miss_diagnostic(rname.clone())]), -}), -} -}, -}, -}, - AlgebraTypeTemplate::ReceiverValue => match receiver.children.clone().get(1 as usize).cloned() { - Some(child) => Rc::new(KernelTypeBuild { - ty: child_type_node(&child), - diagnostics: Rc::new(vec![]), -}), - None => match v2_rt::map_get(&subst, "__value__".to_string()) { - Some(val) => Rc::new(KernelTypeBuild { - ty: val, - diagnostics: Rc::new(vec![]), -}), - None => { - let rname = authored_name_at(source_indices.clone(), &receiver); -match container_param_name(rname.clone(), 1) { - Some(n) => Rc::new(KernelTypeBuild { - ty: type_variable_node(n.clone()), - diagnostics: Rc::new(vec![]), -}), - None => Rc::new(KernelTypeBuild { - ty: missing_kernel_container_profile_type(rname.clone()), - diagnostics: Rc::new(vec![kernel_container_profile_miss_diagnostic(rname.clone())]), -}), -} -}, -}, -}, - AlgebraTypeTemplate::NamedTemplate { name: n, .. } => Rc::new(KernelTypeBuild { - ty: nominal_type_ref(&n), - diagnostics: Rc::new(vec![]), -}), - AlgebraTypeTemplate::ContainerOf { source: src, element: inner, .. } => { + } + AlgebraTypeTemplate::ReceiverElement => match receiver.children.clone().first().cloned() { + Some(child) => Rc::new(KernelTypeBuild { + ty: child_type_node(&child), + diagnostics: Rc::new(vec![]), + }), + None => match v2_rt::map_get(&subst, "__element__".to_string()) { + Some(elem) => Rc::new(KernelTypeBuild { + ty: elem.clone(), + diagnostics: Rc::new(vec![]), + }), + None => { + let rname = authored_name_at(source_indices.clone(), &receiver); + match container_param_name(rname.clone(), 0) { + Some(n) => Rc::new(KernelTypeBuild { + ty: type_variable_node(n.clone()), + diagnostics: Rc::new(vec![]), + }), + None => Rc::new(KernelTypeBuild { + ty: missing_kernel_container_profile_type(rname.clone()), + diagnostics: Rc::new(vec![kernel_container_profile_miss_diagnostic( + rname.clone(), + )]), + }), + } + } + }, + }, + AlgebraTypeTemplate::ReceiverKey => match receiver.children.clone().first().cloned() { + Some(child) => Rc::new(KernelTypeBuild { + ty: child_type_node(&child), + diagnostics: Rc::new(vec![]), + }), + None => match v2_rt::map_get(&subst, "__key__".to_string()) { + Some(key) => Rc::new(KernelTypeBuild { + ty: key.clone(), + diagnostics: Rc::new(vec![]), + }), + None => { + let rname = authored_name_at(source_indices.clone(), &receiver); + match container_param_name(rname.clone(), 0) { + Some(n) => Rc::new(KernelTypeBuild { + ty: type_variable_node(n.clone()), + diagnostics: Rc::new(vec![]), + }), + None => Rc::new(KernelTypeBuild { + ty: missing_kernel_container_profile_type(rname.clone()), + diagnostics: Rc::new(vec![kernel_container_profile_miss_diagnostic( + rname.clone(), + )]), + }), + } + } + }, + }, + AlgebraTypeTemplate::ReceiverValue => { + match receiver.children.clone().get(1 as usize).cloned() { + Some(child) => Rc::new(KernelTypeBuild { + ty: child_type_node(&child), + diagnostics: Rc::new(vec![]), + }), + None => match v2_rt::map_get(&subst, "__value__".to_string()) { + Some(val) => Rc::new(KernelTypeBuild { + ty: val, + diagnostics: Rc::new(vec![]), + }), + None => { + let rname = authored_name_at(source_indices.clone(), &receiver); + match container_param_name(rname.clone(), 1) { + Some(n) => Rc::new(KernelTypeBuild { + ty: type_variable_node(n.clone()), + diagnostics: Rc::new(vec![]), + }), + None => Rc::new(KernelTypeBuild { + ty: missing_kernel_container_profile_type(rname.clone()), + diagnostics: Rc::new(vec![ + kernel_container_profile_miss_diagnostic(rname.clone()), + ]), + }), + } + } + }, + } + } + AlgebraTypeTemplate::NamedTemplate { name: n, .. } => Rc::new(KernelTypeBuild { + ty: nominal_type_ref(&n), + diagnostics: Rc::new(vec![]), + }), + AlgebraTypeTemplate::ContainerOf { + source: src, + element: inner, + .. + } => { let kind_name = match (*src.clone()).clone() { - ContainerSource::SameAsReceiver => authored_name_at(source_indices.clone(), &receiver), - ContainerSource::Named { name: n, .. } => n.clone(), -}; -let inner_applied = apply_type_substitution(inner.clone(), &subst, &receiver, &source_indices); -let built = make_container_type(&kind_name, inner_applied.ty.clone()); -Rc::new(KernelTypeBuild { - ty: built.ty.clone(), - diagnostics: v2_rt::concat(inner_applied.diagnostics.clone(), built.diagnostics.clone()), -}) -}, - AlgebraTypeTemplate::OptionalOf { inner, .. } => { + ContainerSource::SameAsReceiver => { + authored_name_at(source_indices.clone(), &receiver) + } + ContainerSource::Named { name: n, .. } => n.clone(), + }; + let inner_applied = + apply_type_substitution(inner.clone(), &subst, &receiver, &source_indices); + let built = make_container_type(&kind_name, inner_applied.ty.clone()); + Rc::new(KernelTypeBuild { + ty: built.ty.clone(), + diagnostics: v2_rt::concat( + inner_applied.diagnostics.clone(), + built.diagnostics.clone(), + ), + }) + } + AlgebraTypeTemplate::OptionalOf { inner, .. } => { let ib = apply_type_substitution(inner.clone(), &subst, &receiver, &source_indices); -Rc::new(KernelTypeBuild { - ty: with_optional_cardinality(&ib.ty.clone()), - diagnostics: ib.diagnostics.clone(), -}) -}, - AlgebraTypeTemplate::TupleOf { first: ft, second: st, .. } => { + Rc::new(KernelTypeBuild { + ty: with_optional_cardinality(&ib.ty.clone()), + diagnostics: ib.diagnostics.clone(), + }) + } + AlgebraTypeTemplate::TupleOf { + first: ft, + second: st, + .. + } => { let fb = apply_type_substitution(ft.clone(), &subst, &receiver, &source_indices); -let sb = apply_type_substitution(st.clone(), &subst, &receiver, &source_indices); -Rc::new(KernelTypeBuild { - ty: make_tuple_type(fb.ty.clone(), sb.ty.clone()), - diagnostics: v2_rt::concat(fb.diagnostics.clone(), sb.diagnostics.clone()), -}) -}, - AlgebraTypeTemplate::CallableOf { params: p, return_type: r, .. } => { - let param_bs = Rc::new({ let mut __result = Vec::new(); for tp in p.clone().iter().cloned() { __result.push(apply_type_substitution(tp.clone(), &subst, &receiver, &source_indices)); } __result }); -let param_nodes = Rc::new({ let mut __result = Vec::new(); for b in param_bs.clone().iter().cloned() { __result.push(b.ty.clone()); } __result }); -let param_diags = Rc::new({ let mut __result = Vec::new(); for b in param_bs.clone().iter().cloned() { __result.extend((*b.diagnostics.clone()).iter().cloned()); } __result }); -let rb = apply_type_substitution(r.clone(), &subst, &receiver, &source_indices); -Rc::new(KernelTypeBuild { - ty: make_callable_type(Rc::new({ let mut __result = Vec::new(); for pn in param_nodes.iter().cloned() { __result.push(make_param_node(&"_".to_string(), pn.clone(), None, no_span(), no_span())); } __result }), rb.ty.clone()), - diagnostics: v2_rt::concat(param_diags, rb.diagnostics.clone()), -}) -}, -} + let sb = apply_type_substitution(st.clone(), &subst, &receiver, &source_indices); + Rc::new(KernelTypeBuild { + ty: make_tuple_type(fb.ty.clone(), sb.ty.clone()), + diagnostics: v2_rt::concat(fb.diagnostics.clone(), sb.diagnostics.clone()), + }) + } + AlgebraTypeTemplate::CallableOf { + params: p, + return_type: r, + .. + } => { + let param_bs = Rc::new({ + let mut __result = Vec::new(); + for tp in p.clone().iter().cloned() { + __result.push(apply_type_substitution( + tp.clone(), + &subst, + &receiver, + &source_indices, + )); + } + __result + }); + let param_nodes = Rc::new({ + let mut __result = Vec::new(); + for b in param_bs.clone().iter().cloned() { + __result.push(b.ty.clone()); + } + __result + }); + let param_diags = Rc::new({ + let mut __result = Vec::new(); + for b in param_bs.clone().iter().cloned() { + __result.extend((*b.diagnostics.clone()).iter().cloned()); + } + __result + }); + let rb = apply_type_substitution(r.clone(), &subst, &receiver, &source_indices); + Rc::new(KernelTypeBuild { + ty: make_callable_type( + Rc::new({ + let mut __result = Vec::new(); + for pn in param_nodes.iter().cloned() { + __result.push(make_param_node( + &"_".to_string(), + pn.clone(), + None, + no_span(), + no_span(), + )); + } + __result + }), + rb.ty.clone(), + ), + diagnostics: v2_rt::concat(param_diags, rb.diagnostics.clone()), + }) + } }) } @@ -973,255 +1374,341 @@ pub fn template_return_has_variables(template: Rc) -> bool } pub fn has_type_variable(t: Rc) -> bool { - stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - match (*t).clone() { - AlgebraTypeTemplate::AlgebraTypeVariable { .. } => true, - AlgebraTypeTemplate::ContainerOf { element: inner, .. } => has_type_variable(inner.clone()), - AlgebraTypeTemplate::OptionalOf { inner, .. } => has_type_variable(inner.clone()), - AlgebraTypeTemplate::TupleOf { first: f, second: s, .. } => (has_type_variable(f.clone()) || has_type_variable(s.clone())), - AlgebraTypeTemplate::CallableOf { return_type: r, .. } => has_type_variable(r.clone()), - _ => false, -} + stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || match (*t).clone() { + AlgebraTypeTemplate::AlgebraTypeVariable { .. } => true, + AlgebraTypeTemplate::ContainerOf { element: inner, .. } => has_type_variable(inner.clone()), + AlgebraTypeTemplate::OptionalOf { inner, .. } => has_type_variable(inner.clone()), + AlgebraTypeTemplate::TupleOf { + first: f, + second: s, + .. + } => (has_type_variable(f.clone()) || has_type_variable(s.clone())), + AlgebraTypeTemplate::CallableOf { return_type: r, .. } => has_type_variable(r.clone()), + _ => false, }) } -pub fn resolve_type_variables_from_template(template: &Rc, arg_types: Rc>>, receiver_type: &Rc, overrides: Rc>>, source_indices: &Rc>>) -> Rc { +pub fn resolve_type_variables_from_template( + template: &Rc, + arg_types: Rc>>, + receiver_type: &Rc, + overrides: Rc>>, + source_indices: &Rc>>, +) -> Rc { { - let subst = build_type_substitution(&template.param_types.clone(), arg_types, receiver_type.clone(), overrides, source_indices.clone()); -apply_type_substitution(template.return_type.clone(), &subst, &receiver_type, &source_indices) -} + let subst = build_type_substitution( + &template.param_types.clone(), + arg_types, + receiver_type.clone(), + overrides, + source_indices.clone(), + ); + apply_type_substitution( + template.return_type.clone(), + &subst, + &receiver_type, + &source_indices, + ) + } } pub fn callable_inferred(n: &Rc) -> Rc { { let is_callable = ((n.params.clone().len() as i64) > 0); -if is_callable { + if is_callable { match n.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: ret, .. }) => ret.clone(), - None => error_type(), - _ => error_type(), -} + Some(InferredNode::Resolved { node: ret, .. }) => ret.clone(), + None => error_type(), + _ => error_type(), + } } else { n.clone() } -} + } } pub fn normalize_access_type_node(mut n: Rc) -> Rc { loop { let has_structure = (n.connective.clone() != Connective::NoConnective); -let unwrapped = if ((n.type_annotation.clone() != None) && has_structure) { + let unwrapped = if ((n.type_annotation.clone() != None) && has_structure) { n.children.clone().first().cloned() } else { None }; -match unwrapped { - Some(base) => { { - let __tco_0 = base.clone(); -n = __tco_0; -continue; -} }, - None => { break n.clone(); }, -} -} + match unwrapped { + Some(base) => { + let __tco_0 = base.clone(); + n = __tco_0; + continue; + } + None => { + break n.clone(); + } + } + } } -pub fn node_type_shape(n: &Rc, source_indices: &Rc>>) -> String { +pub fn node_type_shape( + n: &Rc, + source_indices: &Rc>>, +) -> String { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - { - let __is_leaf = (((n.connective.clone() == Connective::NoConnective) && ((n.children.clone().len() as i64) == 0)) && ((n.properties.clone().len() as i64) == 0)); -let n_name = authored_name_at(source_indices.clone(), &n); -if __is_leaf { - { - let __is_named_ref = match n.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => (((((rt.connective.clone() == Connective::NoConnective) && ((rt.children.clone().len() as i64) == 0)) && (rt.ident_span.clone() != None)) && (authored_name_at(source_indices.clone(), &rt).as_str() != "None".to_string().as_str())) && (is_kernel_type(authored_name_at(source_indices.clone(), &rt)) == false)), - _ => false, -}; -if __is_named_ref { - v2_rt::concat(v2_rt::concat("Named(".to_string(), n_name), ")".to_string()) + let __is_leaf = (((n.connective.clone() == Connective::NoConnective) + && ((n.children.clone().len() as i64) == 0)) + && ((n.properties.clone().len() as i64) == 0)); + let n_name = authored_name_at(source_indices.clone(), &n); + if __is_leaf { + { + let __is_named_ref = match n.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => { + (((((rt.connective.clone() == Connective::NoConnective) + && ((rt.children.clone().len() as i64) == 0)) + && (rt.ident_span.clone() != None)) + && (authored_name_at(source_indices.clone(), &rt).as_str() + != "None".to_string().as_str())) + && (is_kernel_type(authored_name_at(source_indices.clone(), &rt)) + == false)) + } + _ => false, + }; + if __is_named_ref { + v2_rt::concat(v2_rt::concat("Named(".to_string(), n_name), ")".to_string()) + } else { + v2_rt::concat( + v2_rt::concat("Primitive(".to_string(), n_name), + ")".to_string(), + ) + } + } + } else { + { + let is_product = (n.connective.clone() == Connective::Conj); + let is_coproduct = (n.connective.clone() == Connective::Disj); + if is_product { + if (n.ident_span.clone() == None) { + "Product()".to_string() } else { - v2_rt::concat(v2_rt::concat("Primitive(".to_string(), n_name), ")".to_string()) + v2_rt::concat( + v2_rt::concat("Product(".to_string(), n_name), + ")".to_string(), + ) } -} - } else { - { - let is_product = (n.connective.clone() == Connective::Conj); -let is_coproduct = (n.connective.clone() == Connective::Disj); -if is_product { + } else { + if is_coproduct { if (n.ident_span.clone() == None) { - "Product()".to_string() + "Coproduct()".to_string() } else { - v2_rt::concat(v2_rt::concat("Product(".to_string(), n_name), ")".to_string()) + v2_rt::concat( + v2_rt::concat("Coproduct(".to_string(), n_name), + ")".to_string(), + ) } } else { - if is_coproduct { - if (n.ident_span.clone() == None) { - "Coproduct()".to_string() + { + let __is_container = + node_is_element_collection(&n, source_indices.clone()); + let is_optional = + (n.return_cardinality.clone() == Cardinality::CardOptional); + let is_map = node_is_keyed_collection(&n, source_indices.clone()); + if __is_container { + { + let elem_shape = match n.children.clone().first().cloned() { + Some(el) => { + node_type_shape(&child_type_node(&el), &source_indices) + } + None => "?".to_string(), + }; + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("Container(".to_string(), n_name), + ",".to_string(), + ), + elem_shape, + ), + ")".to_string(), + ) + } } else { - v2_rt::concat(v2_rt::concat("Coproduct(".to_string(), n_name), ")".to_string()) - } - } else { - { - let __is_container = node_is_element_collection(&n, source_indices.clone()); -let is_optional = (n.return_cardinality.clone() == Cardinality::CardOptional); -let is_map = node_is_keyed_collection(&n, source_indices.clone()); -if __is_container { + if is_optional { { - let elem_shape = match n.children.clone().first().cloned() { - Some(el) => node_type_shape(&child_type_node(&el), &source_indices), - None => "?".to_string(), -}; -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("Container(".to_string(), n_name), ",".to_string()), elem_shape), ")".to_string()) -} + let inner_shape = node_type_shape( + &with_required_cardinality(&n), + &source_indices, + ); + v2_rt::concat( + v2_rt::concat("Optional(".to_string(), inner_shape), + ")".to_string(), + ) + } } else { - if is_optional { - { - let inner_shape = node_type_shape(&with_required_cardinality(&n), &source_indices); -v2_rt::concat(v2_rt::concat("Optional(".to_string(), inner_shape), ")".to_string()) -} + if is_map { + "Map(...)".to_string() } else { - if is_map { - "Map(...)".to_string() - } else { - v2_rt::concat(v2_rt::concat("Node(".to_string(), n_name), ")".to_string()) - } + v2_rt::concat( + v2_rt::concat("Node(".to_string(), n_name), + ")".to_string(), + ) } } -} + } } } -} + } } -} + } }) } -pub fn node_type_compatible(mut left: Rc, mut right: Rc, mut source_indices: Rc>>) -> bool { +pub fn node_type_compatible( + mut left: Rc, + mut right: Rc, + mut source_indices: Rc>>, +) -> bool { loop { let left_err = if (left.inferred.clone() != None) { is_compiler_error(left.inferred.clone().clone().unwrap()) } else { false }; -let right_err = if (right.inferred.clone() != None) { + let right_err = if (right.inferred.clone() != None) { is_compiler_error(right.inferred.clone().clone().unwrap()) } else { false }; -let left_tv = if (left.inferred.clone() != None) { + let left_tv = if (left.inferred.clone() != None) { is_type_variable(left.inferred.clone().clone().unwrap()) } else { false }; -let right_tv = if (right.inferred.clone() != None) { + let right_tv = if (right.inferred.clone() != None) { is_type_variable(right.inferred.clone().clone().unwrap()) } else { false }; -let left_opt = (left.return_cardinality.clone() == Cardinality::CardOptional); -let right_opt = (right.return_cardinality.clone() == Cardinality::CardOptional); -let right_is_unit = is_unit_like(&right); -let left_is_unit = is_unit_like(&left); -if (left_err || right_err) { + let left_opt = (left.return_cardinality.clone() == Cardinality::CardOptional); + let right_opt = (right.return_cardinality.clone() == Cardinality::CardOptional); + let right_is_unit = is_unit_like(&right); + let left_is_unit = is_unit_like(&left); + if (left_err || right_err) { break true; -} else { + } else { if (left_tv || right_tv) { break true; -} else { + } else { if (left_opt.clone() && right_is_unit) { break true; -} else { + } else { if (left_is_unit && right_opt.clone()) { break true; -} else { - let left_is_container = node_is_element_collection(&left, source_indices.clone()); -let right_is_container = node_is_element_collection(&right, source_indices.clone()); -if (left_is_container && right_is_container) { - if (authored_name_at(source_indices.clone(), &left).as_str() != authored_name_at(source_indices.clone(), &right).as_str()) { + } else { + let left_is_container = + node_is_element_collection(&left, source_indices.clone()); + let right_is_container = + node_is_element_collection(&right, source_indices.clone()); + if (left_is_container && right_is_container) { + if (authored_name_at(source_indices.clone(), &left).as_str() + != authored_name_at(source_indices.clone(), &right).as_str()) + { break false; -} else { + } else { match left.children.clone().first().cloned() { - Some(left_ch) => { match right.children.clone().first().cloned() { - Some(right_ch) => { let left_el = child_type_node(&left_ch); -let right_el = child_type_node(&right_ch); -let left_el_is_unit = is_unit_like(&left_el); -let right_el_is_unit = is_unit_like(&right_el); -if (left_el_is_unit || right_el_is_unit) { - break true; -} else { - { - let __tco_0 = left_el.clone(); -let __tco_1 = right_el.clone(); -left = __tco_0; -right = __tco_1; -continue; -} -} }, - None => { break true; }, -} }, - None => { break true; }, -} -} -} else { + Some(left_ch) => { + match right.children.clone().first().cloned() { + Some(right_ch) => { + let left_el = child_type_node(&left_ch); + let right_el = child_type_node(&right_ch); + let left_el_is_unit = is_unit_like(&left_el); + let right_el_is_unit = is_unit_like(&right_el); + if (left_el_is_unit || right_el_is_unit) { + break true; + } else { + { + let __tco_0 = left_el.clone(); + let __tco_1 = right_el.clone(); + left = __tco_0; + right = __tco_1; + continue; + } + } + } + None => { + break true; + } + } + } + None => { + break true; + } + } + } + } else { if (left_opt.clone() && right_opt.clone()) { let left_inner = with_required_cardinality(&left); -let right_inner = with_required_cardinality(&right); -let left_inner_is_unit = is_unit_like(&left_inner); -let right_inner_is_unit = is_unit_like(&right_inner); -if (left_inner_is_unit || right_inner_is_unit) { + let right_inner = with_required_cardinality(&right); + let left_inner_is_unit = is_unit_like(&left_inner); + let right_inner_is_unit = is_unit_like(&right_inner); + if (left_inner_is_unit || right_inner_is_unit) { break true; -} else { + } else { { let __tco_0 = left_inner.clone(); -let __tco_1 = right_inner.clone(); -left = __tco_0; -right = __tco_1; -continue; -} -} -} else { + let __tco_1 = right_inner.clone(); + left = __tco_0; + right = __tco_1; + continue; + } + } + } else { if (left_opt.clone() || right_opt.clone()) { break false; -} else { - break (authored_name_at(source_indices.clone(), &left).as_str() == authored_name_at(source_indices.clone(), &right).as_str()); -} -} -} -} -} -} -} -} + } else { + break (authored_name_at(source_indices.clone(), &left) + .as_str() + == authored_name_at(source_indices.clone(), &right) + .as_str()); + } + } + } + } + } + } + } + } } -pub fn prefer_specific_type(left: Rc, right: Rc, source_indices: &Rc>>) -> Rc { +pub fn prefer_specific_type( + left: Rc, + right: Rc, + source_indices: &Rc>>, +) -> Rc { { let left_is_container = node_is_element_collection(&left, source_indices.clone()); -let left_is_optional = (left.return_cardinality.clone() == Cardinality::CardOptional); -let left_first_child = left.children.clone().first().cloned(); -let left_norm_name = authored_name_at(source_indices.clone(), &left); -let left_is_unit_inner = if left_is_container.clone() { + let left_is_optional = (left.return_cardinality.clone() == Cardinality::CardOptional); + let left_first_child = left.children.clone().first().cloned(); + let left_norm_name = authored_name_at(source_indices.clone(), &left); + let left_is_unit_inner = if left_is_container.clone() { match left_first_child { - Some(ch) => { - let el = child_type_node(&ch); -let el_is_unit = is_unit_like(&el); -el_is_unit -}, - None => false, -} + Some(ch) => { + let el = child_type_node(&ch); + let el_is_unit = is_unit_like(&el); + el_is_unit + } + None => false, + } } else { if left_is_optional.clone() { { let left_is_unit = is_unit_like(&left); -left_is_unit -} + left_is_unit + } } else { false } }; -let right_is_container = node_is_element_collection(&right, source_indices.clone()); -let right_is_optional = (right.return_cardinality.clone() == Cardinality::CardOptional); -let same_kind = if (left_is_container.clone() && right_is_container) { + let right_is_container = node_is_element_collection(&right, source_indices.clone()); + let right_is_optional = (right.return_cardinality.clone() == Cardinality::CardOptional); + let same_kind = if (left_is_container.clone() && right_is_container) { (left_norm_name.as_str() == authored_name_at(source_indices.clone(), &right).as_str()) } else { if (left_is_optional.clone() && right_is_optional) { @@ -1230,45 +1717,51 @@ let same_kind = if (left_is_container.clone() && right_is_container) { false } }; -if (same_kind && left_is_unit_inner) { + if (same_kind && left_is_unit_inner) { right.clone() } else { - if (is_fully_resolved(&right, &source_indices) && !is_fully_resolved(&left, &source_indices)) { + if (is_fully_resolved(&right, &source_indices) + && !is_fully_resolved(&left, &source_indices)) + { right.clone() } else { left.clone() } } -} + } } -pub fn node_type_equals(left: &Rc, right: &Rc, source_indices: Rc>>) -> bool { +pub fn node_type_equals( + left: &Rc, + right: &Rc, + source_indices: Rc>>, +) -> bool { { let left_err = if (left.inferred.clone() != None) { is_compiler_error(left.inferred.clone().clone().unwrap()) } else { false }; -let right_err = if (right.inferred.clone() != None) { + let right_err = if (right.inferred.clone() != None) { is_compiler_error(right.inferred.clone().clone().unwrap()) } else { false }; -let left_tv = if (left.inferred.clone() != None) { + let left_tv = if (left.inferred.clone() != None) { is_type_variable(left.inferred.clone().clone().unwrap()) } else { false }; -let right_tv = if (right.inferred.clone() != None) { + let right_tv = if (right.inferred.clone() != None) { is_type_variable(right.inferred.clone().clone().unwrap()) } else { false }; -let left_opt = (left.return_cardinality.clone() == Cardinality::CardOptional); -let right_opt = (right.return_cardinality.clone() == Cardinality::CardOptional); -let right_is_unit_eq = is_unit_like(&right); -let left_is_unit_eq = is_unit_like(&left); -if (left_err || right_err) { + let left_opt = (left.return_cardinality.clone() == Cardinality::CardOptional); + let right_opt = (right.return_cardinality.clone() == Cardinality::CardOptional); + let right_is_unit_eq = is_unit_like(&right); + let left_is_unit_eq = is_unit_like(&left); + if (left_err || right_err) { true } else { if (left_tv.clone() && right_tv.clone()) { @@ -1284,7 +1777,11 @@ if (left_err || right_err) { true } else { if (left_opt.clone() && right_opt.clone()) { - node_type_equals_core(&with_required_cardinality(&left), &with_required_cardinality(&right), &source_indices) + node_type_equals_core( + &with_required_cardinality(&left), + &with_required_cardinality(&right), + &source_indices, + ) } else { node_type_equals_core(&left, &right, &source_indices) } @@ -1293,34 +1790,75 @@ if (left_err || right_err) { } } } -} + } } -pub fn node_type_equals_core(left: &Rc, right: &Rc, source_indices: &Rc>>) -> bool { +pub fn node_type_equals_core( + left: &Rc, + right: &Rc, + source_indices: &Rc>>, +) -> bool { { - let left_leaf = (((left.connective.clone() == Connective::NoConnective) && ((left.children.clone().len() as i64) == 0)) && ((left.properties.clone().len() as i64) == 0)); -let right_leaf = (((right.connective.clone() == Connective::NoConnective) && ((right.children.clone().len() as i64) == 0)) && ((right.properties.clone().len() as i64) == 0)); -let left_struct = (left.connective.clone() != Connective::NoConnective); -let right_struct = (right.connective.clone() != Connective::NoConnective); -let left_name = authored_name_at(source_indices.clone(), &left); -let right_name = authored_name_at(source_indices.clone(), &right); -if (left_leaf.clone() && right_leaf.clone()) { + let left_leaf = (((left.connective.clone() == Connective::NoConnective) + && ((left.children.clone().len() as i64) == 0)) + && ((left.properties.clone().len() as i64) == 0)); + let right_leaf = (((right.connective.clone() == Connective::NoConnective) + && ((right.children.clone().len() as i64) == 0)) + && ((right.properties.clone().len() as i64) == 0)); + let left_struct = (left.connective.clone() != Connective::NoConnective); + let right_struct = (right.connective.clone() != Connective::NoConnective); + let left_name = authored_name_at(source_indices.clone(), &left); + let right_name = authored_name_at(source_indices.clone(), &right); + if (left_leaf.clone() && right_leaf.clone()) { (left_name.as_str() == right_name.as_str()) } else { if (left_struct.clone() && right_struct.clone()) { if (left_name.as_str() != right_name.as_str()) { false } else { - if ((left.connective.clone() == Connective::Conj) != (right.connective.clone() == Connective::Conj)) { + if ((left.connective.clone() == Connective::Conj) + != (right.connective.clone() == Connective::Conj)) + { false } else { - if ((left.children.clone().len() as i64) != (right.children.clone().len() as i64)) { + if ((left.children.clone().len() as i64) + != (right.children.clone().len() as i64)) + { false } else { - { let mut __all = true; for pair in Rc::new(left.children.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { if !(match right.children.clone().get(pair.0.clone() as usize).cloned() { - Some(right_child) => node_type_equals(&pair.1.clone(), &right_child, source_indices.clone()), - None => false, -}) { __all = false; break; } } __all } + { + let mut __all = true; + for pair in Rc::new( + left.children + .clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + { + if !(match right + .children + .clone() + .get(pair.0.clone() as usize) + .cloned() + { + Some(right_child) => node_type_equals( + &pair.1.clone(), + &right_child, + source_indices.clone(), + ), + None => false, + }) { + __all = false; + break; + } + } + __all + } } } } @@ -1332,222 +1870,370 @@ if (left_leaf.clone() && right_leaf.clone()) { (left_name.as_str() == right_name.as_str()) } else { { - let left_is_container = node_is_element_collection(&left, source_indices.clone()); -let right_is_container = node_is_element_collection(&right, source_indices.clone()); -if (left_is_container && right_is_container) { + let left_is_container = + node_is_element_collection(&left, source_indices.clone()); + let right_is_container = + node_is_element_collection(&right, source_indices.clone()); + if (left_is_container && right_is_container) { if (left_name.as_str() != right_name.as_str()) { false } else { match left.children.clone().first().cloned() { - Some(left_ch) => match right.children.clone().first().cloned() { - Some(right_ch) => node_type_equals(&child_type_node(&left_ch), &child_type_node(&right_ch), source_indices.clone()), - None => false, -}, - None => false, -} + Some(left_ch) => { + match right.children.clone().first().cloned() { + Some(right_ch) => node_type_equals( + &child_type_node(&left_ch), + &child_type_node(&right_ch), + source_indices.clone(), + ), + None => false, + } + } + None => false, + } } } else { { - let both_maps = (node_is_keyed_collection(&left, source_indices.clone()) && node_is_keyed_collection(&right, source_indices.clone())); -if both_maps { - if (((left.children.clone().len() as i64) == 2) && ((right.children.clone().len() as i64) == 2)) { + let both_maps = + (node_is_keyed_collection(&left, source_indices.clone()) + && node_is_keyed_collection( + &right, + source_indices.clone(), + )); + if both_maps { + if (((left.children.clone().len() as i64) == 2) + && ((right.children.clone().len() as i64) == 2)) + { match left.children.clone().first().cloned() { - Some(left_first) => match right.children.clone().first().cloned() { - Some(right_first) => match left.children.clone().get(1 as usize).cloned() { - Some(left_second) => match right.children.clone().get(1 as usize).cloned() { - Some(right_second) => (node_type_equals(&child_type_node(&left_first), &child_type_node(&right_first), source_indices.clone()) && node_type_equals(&child_type_node(&left_second), &child_type_node(&right_second), source_indices.clone())), - None => false, -}, - None => false, -}, - None => false, -}, - None => false, -} + Some(left_first) => match right + .children + .clone() + .first() + .cloned() + { + Some(right_first) => match left + .children + .clone() + .get(1 as usize) + .cloned() + { + Some(left_second) => match right + .children + .clone() + .get(1 as usize) + .cloned() + { + Some(right_second) => { + (node_type_equals( + &child_type_node(&left_first), + &child_type_node(&right_first), + source_indices.clone(), + ) && node_type_equals( + &child_type_node(&left_second), + &child_type_node(&right_second), + source_indices.clone(), + )) + } + None => false, + }, + None => false, + }, + None => false, + }, + None => false, + } } else { false } } else { - if (((left.params.clone().len() as i64) > 0) && ((right.params.clone().len() as i64) > 0)) { - if ((left.params.clone().len() as i64) != (right.params.clone().len() as i64)) { + if (((left.params.clone().len() as i64) > 0) + && ((right.params.clone().len() as i64) > 0)) + { + if ((left.params.clone().len() as i64) + != (right.params.clone().len() as i64)) + { false } else { { - let params_eq = { let mut __all = true; for pair in Rc::new(left.params.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { if !(match right.params.clone().get(pair.0.clone() as usize).cloned() { - Some(right_param) => node_type_equals(¶m_node_type_expr(&pair.1.clone()), ¶m_node_type_expr(&right_param), source_indices.clone()), - None => false, -}) { __all = false; break; } } __all }; -if (params_eq == false) { + let params_eq = { + let mut __all = true; + for pair in Rc::new( + left.params + .clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + { + if !(match right + .params + .clone() + .get(pair.0.clone() as usize) + .cloned() + { + Some(right_param) => { + node_type_equals( + ¶m_node_type_expr( + &pair.1.clone(), + ), + ¶m_node_type_expr( + &right_param, + ), + source_indices.clone(), + ) + } + None => false, + }) { + __all = false; + break; + } + } + __all + }; + if (params_eq == false) { false } else { - match left.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: left_ret, .. }) => match right.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: right_ret, .. }) => node_type_equals(&left_ret, &right_ret, source_indices.clone()), - None => false, - _ => false, -}, - None => (right.inferred.clone() == None), - _ => false, -} + match left + .inferred + .clone() + .as_deref() + .cloned() + { + Some(InferredNode::Resolved { + node: left_ret, + .. + }) => match right + .inferred + .clone() + .as_deref() + .cloned() + { + Some(InferredNode::Resolved { + node: right_ret, + .. + }) => node_type_equals( + &left_ret, + &right_ret, + source_indices.clone(), + ), + None => false, + _ => false, + }, + None => { + (right.inferred.clone() == None) + } + _ => false, + } } -} + } } } else { false } } -} + } } -} + } } } } } -} + } } -pub fn node_type_deps(n: &Rc, source_indices: &Rc>>) -> Rc> { +pub fn node_type_deps( + n: &Rc, + source_indices: &Rc>>, +) -> Rc> { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - { - let n_is_type_var = if (n.inferred.clone() != None) { - is_type_variable(n.inferred.clone().clone().unwrap()) - } else { - false - }; -if n_is_type_var { - return Rc::new(vec![]) + let n_is_type_var = if (n.inferred.clone() != None) { + is_type_variable(n.inferred.clone().clone().unwrap()) + } else { + false + }; + if n_is_type_var { + return Rc::new(vec![]); + } + let __is_named_ref = if (n.inferred.clone() == None) { + false + } else { + match n.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => { + (((((rt.connective.clone() == Connective::NoConnective) + && ((rt.children.clone().len() as i64) == 0)) + && (rt.ident_span.clone() != None)) + && (authored_name_at(source_indices.clone(), &rt).as_str() + != "None".to_string().as_str())) + && (is_kernel_type(authored_name_at(source_indices.clone(), &rt)) == false)) + } + _ => false, } -let __is_named_ref = if (n.inferred.clone() == None) { - false - } else { - match n.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => (((((rt.connective.clone() == Connective::NoConnective) && ((rt.children.clone().len() as i64) == 0)) && (rt.ident_span.clone() != None)) && (authored_name_at(source_indices.clone(), &rt).as_str() != "None".to_string().as_str())) && (is_kernel_type(authored_name_at(source_indices.clone(), &rt)) == false)), - _ => false, -} - }; -let has_structure = (n.connective.clone() != Connective::NoConnective); -let n_name = authored_name_at(source_indices.clone(), &n); -if __is_named_ref { - match n.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => Rc::new(vec![authored_name_at(source_indices.clone(), &rt)]), - _ => Rc::new(vec![]), -} + }; + let has_structure = (n.connective.clone() != Connective::NoConnective); + let n_name = authored_name_at(source_indices.clone(), &n); + if __is_named_ref { + match n.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => { + Rc::new(vec![authored_name_at(source_indices.clone(), &rt)]) + } + _ => Rc::new(vec![]), + } + } else { + if has_structure { + Rc::new({ + let mut __result = Vec::new(); + for child in n.children.clone().iter().cloned() { + __result.extend( + (*match child.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => { + node_type_deps(&rt, &source_indices) + } + _ => { + if (child.inferred.clone() == None) { + node_type_deps(&child, &source_indices) + } else { + Rc::new(vec![]) + } + } + }) + .iter() + .cloned(), + ); + } + __result + }) } else { - if has_structure { - Rc::new({ let mut __result = Vec::new(); for child in n.children.clone().iter().cloned() { __result.extend((*match child.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => node_type_deps(&rt, &source_indices), - _ => if (child.inferred.clone() == None) { - node_type_deps(&child, &source_indices) - } else { - Rc::new(vec![]) - }, -}).iter().cloned()); } __result }) + if (n.inferred.clone() != None) { + match n.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => { + node_type_deps(&rt, &source_indices) + } + _ => Rc::new(vec![]), + } } else { - if (n.inferred.clone() != None) { - match n.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => node_type_deps(&rt, &source_indices), - _ => Rc::new(vec![]), -} - } else { - if ((n.children.clone().len() as i64) > 0) { - { - let child_deps = Rc::new({ let mut __result = Vec::new(); for child in n.children.clone().iter().cloned() { __result.extend((*node_type_deps(&child, &source_indices)).iter().cloned()); } __result }); -if ((n.ident_span.clone() != None) && (is_kernel_type(n_name.clone()) == false)) { - v2_rt::concat(Rc::new(vec![n_name.clone()]), child_deps) - } else { - child_deps + if ((n.children.clone().len() as i64) > 0) { + { + let child_deps = Rc::new({ + let mut __result = Vec::new(); + for child in n.children.clone().iter().cloned() { + __result.extend( + (*node_type_deps(&child, &source_indices)).iter().cloned(), + ); } -} - } else { - if ((is_kernel_type(n_name.clone()) || (n_name.clone().as_str() == "None".to_string().as_str())) || (n.ident_span.clone() == None)) { - Rc::new(vec![]) + __result + }); + if ((n.ident_span.clone() != None) + && (is_kernel_type(n_name.clone()) == false)) + { + v2_rt::concat(Rc::new(vec![n_name.clone()]), child_deps) } else { - Rc::new(vec![n_name.clone()]) + child_deps } } + } else { + if ((is_kernel_type(n_name.clone()) + || (n_name.clone().as_str() == "None".to_string().as_str())) + || (n.ident_span.clone() == None)) + { + Rc::new(vec![]) + } else { + Rc::new(vec![n_name.clone()]) + } } } } -} + } }) } pub fn infer_literal_node(lit: Rc) -> Rc { match (*lit).clone() { - LiteralValue::LitStr { .. } => string_type(), - LiteralValue::LitInt { .. } => int_type(), - LiteralValue::LitFloat { .. } => float_type(), - LiteralValue::LitBool { .. } => bool_type(), - LiteralValue::LitNull => with_optional_cardinality(&unit_type()), -} + LiteralValue::LitStr { .. } => string_type(), + LiteralValue::LitInt { .. } => int_type(), + LiteralValue::LitFloat { .. } => float_type(), + LiteralValue::LitBool { .. } => bool_type(), + LiteralValue::LitNull => with_optional_cardinality(&unit_type()), + } } -pub fn method_receiver_element_node(receiver_type: Rc, source_indices: Rc>>) -> Rc { +pub fn method_receiver_element_node( + receiver_type: Rc, + source_indices: Rc>>, +) -> Rc { { let normed = normalize_access_type_node(receiver_type.clone()); -let maybe_element = if node_is_keyed_collection(&normed, source_indices) { + let maybe_element = if node_is_keyed_collection(&normed, source_indices) { match normed.children.clone().get(1 as usize).cloned() { - Some(ch) => Some(child_type_node(&ch)), - None => None, -} + Some(ch) => Some(child_type_node(&ch)), + None => None, + } } else { - if ((normed.connective.clone() == Connective::NoConnective) && ((normed.children.clone().len() as i64) == 1)) { + if ((normed.connective.clone() == Connective::NoConnective) + && ((normed.children.clone().len() as i64) == 1)) + { match normed.children.clone().first().cloned() { - Some(ch) => Some(child_type_node(&ch)), - None => None, -} + Some(ch) => Some(child_type_node(&ch)), + None => None, + } } else { None } }; -match maybe_element { - Some(el) => el.clone(), - None => receiver_type.clone(), -} -} + match maybe_element { + Some(el) => el.clone(), + None => receiver_type.clone(), + } + } } pub fn extract_optional_inner_node(n: &Rc) -> Rc { { let is_optional = (n.return_cardinality.clone() == Cardinality::CardOptional); -if is_optional { + if is_optional { with_required_cardinality(&n) } else { n.clone() } -} + } } pub fn algebra_field_kind_name(kind: AlgebraFieldKind) -> String { match kind { - AlgebraFieldKind::AlgAdd => "add".to_string(), - AlgebraFieldKind::AlgMul => "mul".to_string(), - AlgebraFieldKind::AlgReciprocal => "reciprocal".to_string(), - AlgebraFieldKind::AlgQuotient => "quotient".to_string(), - AlgebraFieldKind::AlgRemainder => "remainder".to_string(), - AlgebraFieldKind::AlgCompare => "compare".to_string(), - AlgebraFieldKind::AlgMeet => "meet".to_string(), - AlgebraFieldKind::AlgJoin => "join".to_string(), -} + AlgebraFieldKind::AlgAdd => "add".to_string(), + AlgebraFieldKind::AlgMul => "mul".to_string(), + AlgebraFieldKind::AlgReciprocal => "reciprocal".to_string(), + AlgebraFieldKind::AlgQuotient => "quotient".to_string(), + AlgebraFieldKind::AlgRemainder => "remainder".to_string(), + AlgebraFieldKind::AlgCompare => "compare".to_string(), + AlgebraFieldKind::AlgMeet => "meet".to_string(), + AlgebraFieldKind::AlgJoin => "join".to_string(), + } } pub fn binop_algebra_fields(op: BinOp) -> Rc> { match op { - BinOp::Add => Rc::new(vec![AlgebraFieldKind::AlgAdd]), - BinOp::Sub => Rc::new(vec![AlgebraFieldKind::AlgAdd]), - BinOp::Mul => Rc::new(vec![AlgebraFieldKind::AlgMul]), - BinOp::Div => Rc::new(vec![AlgebraFieldKind::AlgReciprocal, AlgebraFieldKind::AlgQuotient]), - BinOp::Mod => Rc::new(vec![AlgebraFieldKind::AlgRemainder]), - BinOp::Eq => Rc::new(vec![AlgebraFieldKind::AlgCompare]), - BinOp::Ne => Rc::new(vec![AlgebraFieldKind::AlgCompare]), - BinOp::Lt => Rc::new(vec![AlgebraFieldKind::AlgCompare]), - BinOp::Gt => Rc::new(vec![AlgebraFieldKind::AlgCompare]), - BinOp::Le => Rc::new(vec![AlgebraFieldKind::AlgCompare]), - BinOp::Ge => Rc::new(vec![AlgebraFieldKind::AlgCompare]), - BinOp::And => Rc::new(vec![AlgebraFieldKind::AlgMeet]), - BinOp::Or => Rc::new(vec![AlgebraFieldKind::AlgJoin]), - BinOp::NullCoalesce => Rc::new(vec![]), -} + BinOp::Add => Rc::new(vec![AlgebraFieldKind::AlgAdd]), + BinOp::Sub => Rc::new(vec![AlgebraFieldKind::AlgAdd]), + BinOp::Mul => Rc::new(vec![AlgebraFieldKind::AlgMul]), + BinOp::Div => Rc::new(vec![ + AlgebraFieldKind::AlgReciprocal, + AlgebraFieldKind::AlgQuotient, + ]), + BinOp::Mod => Rc::new(vec![AlgebraFieldKind::AlgRemainder]), + BinOp::Eq => Rc::new(vec![AlgebraFieldKind::AlgCompare]), + BinOp::Ne => Rc::new(vec![AlgebraFieldKind::AlgCompare]), + BinOp::Lt => Rc::new(vec![AlgebraFieldKind::AlgCompare]), + BinOp::Gt => Rc::new(vec![AlgebraFieldKind::AlgCompare]), + BinOp::Le => Rc::new(vec![AlgebraFieldKind::AlgCompare]), + BinOp::Ge => Rc::new(vec![AlgebraFieldKind::AlgCompare]), + BinOp::And => Rc::new(vec![AlgebraFieldKind::AlgMeet]), + BinOp::Or => Rc::new(vec![AlgebraFieldKind::AlgJoin]), + BinOp::NullCoalesce => Rc::new(vec![]), + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -1556,23 +2242,43 @@ pub struct AlgebraFieldMatch { pub field_node: Rc, } -pub fn first_matching_algebra_field(mut n: Rc, mut candidates: Rc>, mut source_indices: Rc>>) -> Option> { +pub fn first_matching_algebra_field( + mut n: Rc, + mut candidates: Rc>, + mut source_indices: Rc>>, +) -> Option> { loop { match candidates.clone().first().cloned() { - None => { break None; }, - Some(kind) => { match find_child_named(n.clone(), algebra_field_kind_name(kind.clone()), source_indices.clone()) { - Some(f) => { break Some(Rc::new(AlgebraFieldMatch { - field_kind: kind.clone(), - field_node: f.clone(), -})); }, - None => { { - let __tco_0 = Rc::new(candidates.iter().cloned().skip(1 as usize).collect::>()); -candidates = __tco_0; -continue; -} }, -} }, -} -} + None => { + break None; + } + Some(kind) => { + match find_child_named( + n.clone(), + algebra_field_kind_name(kind.clone()), + source_indices.clone(), + ) { + Some(f) => { + break Some(Rc::new(AlgebraFieldMatch { + field_kind: kind.clone(), + field_node: f.clone(), + })); + } + None => { + let __tco_0 = Rc::new( + candidates + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ); + candidates = __tco_0; + continue; + } + } + } + } + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -1581,113 +2287,132 @@ pub struct BinOpInferred { pub algebra_field: Option, } -pub fn infer_binop_type_node(op: &BinOp, left_type: &Rc, source_indices: Rc>>) -> Rc { +pub fn infer_binop_type_node( + op: &BinOp, + left_type: &Rc, + source_indices: Rc>>, +) -> Rc { match op.clone() { - BinOp::Eq => Rc::new(BinOpInferred { - result_type: bool_type(), - algebra_field: None, -}), - BinOp::Ne => Rc::new(BinOpInferred { - result_type: bool_type(), - algebra_field: None, -}), - BinOp::Lt => Rc::new(BinOpInferred { - result_type: bool_type(), - algebra_field: None, -}), - BinOp::Gt => Rc::new(BinOpInferred { - result_type: bool_type(), - algebra_field: None, -}), - BinOp::Le => Rc::new(BinOpInferred { - result_type: bool_type(), - algebra_field: None, -}), - BinOp::Ge => Rc::new(BinOpInferred { - result_type: bool_type(), - algebra_field: None, -}), - BinOp::And => Rc::new(BinOpInferred { - result_type: bool_type(), - algebra_field: None, -}), - BinOp::Or => Rc::new(BinOpInferred { - result_type: bool_type(), - algebra_field: None, -}), - BinOp::NullCoalesce => Rc::new(BinOpInferred { - result_type: extract_optional_inner_node(&left_type), - algebra_field: None, -}), - _ => { - let candidates = binop_algebra_fields(op.clone()); -let is_product = (left_type.connective.clone() == Connective::Conj); -if is_product { - match first_matching_algebra_field(left_type.clone(), candidates, source_indices) { - Some(m) => match m.field_node.clone().inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => if ((rt.params.clone().len() as i64) > 0) { - match rt.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: return_type, .. }) => Rc::new(BinOpInferred { - result_type: return_type.clone(), - algebra_field: Some(m.field_kind.clone()), -}), - _ => Rc::new(BinOpInferred { - result_type: left_type.clone(), - algebra_field: Some(m.field_kind.clone()), -}), -} + BinOp::Eq => Rc::new(BinOpInferred { + result_type: bool_type(), + algebra_field: None, + }), + BinOp::Ne => Rc::new(BinOpInferred { + result_type: bool_type(), + algebra_field: None, + }), + BinOp::Lt => Rc::new(BinOpInferred { + result_type: bool_type(), + algebra_field: None, + }), + BinOp::Gt => Rc::new(BinOpInferred { + result_type: bool_type(), + algebra_field: None, + }), + BinOp::Le => Rc::new(BinOpInferred { + result_type: bool_type(), + algebra_field: None, + }), + BinOp::Ge => Rc::new(BinOpInferred { + result_type: bool_type(), + algebra_field: None, + }), + BinOp::And => Rc::new(BinOpInferred { + result_type: bool_type(), + algebra_field: None, + }), + BinOp::Or => Rc::new(BinOpInferred { + result_type: bool_type(), + algebra_field: None, + }), + BinOp::NullCoalesce => Rc::new(BinOpInferred { + result_type: extract_optional_inner_node(&left_type), + algebra_field: None, + }), + _ => { + let candidates = binop_algebra_fields(op.clone()); + let is_product = (left_type.connective.clone() == Connective::Conj); + if is_product { + match first_matching_algebra_field(left_type.clone(), candidates, source_indices) { + Some(m) => match m.field_node.clone().inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => { + if ((rt.params.clone().len() as i64) > 0) { + match rt.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { + node: return_type, .. + }) => Rc::new(BinOpInferred { + result_type: return_type.clone(), + algebra_field: Some(m.field_kind.clone()), + }), + _ => Rc::new(BinOpInferred { + result_type: left_type.clone(), + algebra_field: Some(m.field_kind.clone()), + }), + } + } else { + Rc::new(BinOpInferred { + result_type: rt.clone(), + algebra_field: Some(m.field_kind.clone()), + }) + } + } + _ => Rc::new(BinOpInferred { + result_type: left_type.clone(), + algebra_field: None, + }), + }, + None => Rc::new(BinOpInferred { + result_type: left_type.clone(), + algebra_field: None, + }), + } } else { Rc::new(BinOpInferred { - result_type: rt.clone(), - algebra_field: Some(m.field_kind.clone()), -}) - }, - _ => Rc::new(BinOpInferred { - result_type: left_type.clone(), - algebra_field: None, -}), -}, - None => Rc::new(BinOpInferred { - result_type: left_type.clone(), - algebra_field: None, -}), -} - } else { - Rc::new(BinOpInferred { - result_type: left_type.clone(), - algebra_field: None, -}) + result_type: left_type.clone(), + algebra_field: None, + }) + } } -}, -} + } } -pub fn for_each_element_type_node(n: Rc, source_indices: Rc>>) -> Rc { +pub fn for_each_element_type_node( + n: Rc, + source_indices: Rc>>, +) -> Rc { { let normed = normalize_access_type_node(n); -let is_single_child = ((normed.connective.clone() == Connective::NoConnective) && ((normed.children.clone().len() as i64) == 1)); -let extracted = if is_single_child { + let is_single_child = ((normed.connective.clone() == Connective::NoConnective) + && ((normed.children.clone().len() as i64) == 1)); + let extracted = if is_single_child { match normed.children.clone().first().cloned() { - Some(ch) => Some(child_type_node(&ch)), - None => None, -} + Some(ch) => Some(child_type_node(&ch)), + None => None, + } } else { None }; -match extracted { - Some(el) => el.clone(), - None => if ((((normed.connective.clone() == Connective::NoConnective) && ((normed.children.clone().len() as i64) == 0)) && ((normed.properties.clone().len() as i64) == 0)) && (authored_name_at(source_indices, &normed).as_str() == "String".to_string().as_str())) { - string_type() - } else { - normed.clone() - }, -} -} + match extracted { + Some(el) => el.clone(), + None => { + if ((((normed.connective.clone() == Connective::NoConnective) + && ((normed.children.clone().len() as i64) == 0)) + && ((normed.properties.clone().len() as i64) == 0)) + && (authored_name_at(source_indices, &normed).as_str() + == "String".to_string().as_str())) + { + string_type() + } else { + normed.clone() + } + } + } + } } pub fn emit_map_has(m: Rc>, key: String) -> bool { match v2_rt::map_get(&m, key) { - Some(_) => true, - None => false, -} + Some(_) => true, + None => false, + } } diff --git a/src/v2/stage0/src/v2_compiler_languages.rs b/src/v2/stage0/src/v2_compiler_languages.rs index 13c3f2be93f..5656cb0a11b 100644 --- a/src/v2/stage0/src/v2_compiler_languages.rs +++ b/src/v2/stage0/src/v2_compiler_languages.rs @@ -1,47 +1,89 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.languages -use std::collections::HashMap; -use std::rc::Rc; -use crate::v2_rt; -use crate::NonEmptyVec; -use crate::NonEmptyBTreeSet; -pub use crate::v2_compiler_artifact::{RenderTarget}; -use crate::v2_compiler_artifact::RenderTarget::{Rust, Python, Go, Dag}; -pub use crate::v2_std_core::{BinOp, LiteralValue}; -use crate::v2_std_core::BinOp::{Add, Sub, Mul, Div, Mod, Eq, Ne, Lt, Gt, Le, Ge, And, Or, NullCoalesce}; -use crate::v2_std_core::LiteralValue::*; -pub use crate::std_syntax::{ItemForm, ItemFormKind, OperatorSpec, SyntaxSpec, AlgebraFieldKind, BodyKind}; -use crate::std_syntax::ItemFormKind::{FuncForm, StructForm, EnumForm, TypeAliasForm, ModuleForm, OtherForm}; -use crate::std_syntax::BodyKind::{ExprBody, BlockBody, TypeBody, ValueBody, NoBody, ServiceBody, ResourceBody}; -use crate::std_syntax::AlgebraFieldKind::*; -pub use crate::extdeps_languages_rust_syntax::{rust_operators, rust_item_forms}; -pub use crate::extdeps_languages_python_syntax::{python_operators, python_item_forms}; -pub use crate::extdeps_languages_go_syntax::{go_operators, go_item_forms}; -pub use crate::extdeps_languages_dag_syntax::{dag_operators}; -pub use crate::extdeps_languages_rust_emit::{rust_keywords, rust_container_templates, rust_reserved, rust_reserved_escape_prefix, rust_struct_derives, rust_struct_derives_copy, rust_enum_derives, rust_enum_derives_copy, rust_serde_tag, rust_serde_rename_template, rust_source_extension, rust_source_dir, rust_visibility, rust_string_types, rust_method_templates, rust_func_keyword, rust_async_prefix, rust_struct_keyword, rust_enum_keyword, rust_type_alias_keyword, rust_param_separator, rust_return_arrow, rust_param_type_sep, rust_module_keyword, rust_import_keyword, rust_import_from_keyword, rust_lambda_template, rust_error_expr_template, rust_list_literal_empty, rust_list_literal_template, rust_null_coalesce_template, rust_error_type_template, rust_type_arg_open, rust_type_arg_close, rust_void_type, rust_tuple_empty, rust_tuple_pair_template, rust_tuple_multi_template, rust_tuple_separator}; -pub use crate::extdeps_languages_python_emit::{python_keywords, python_reserved, python_reserved_escape_suffix, python_derive_attribute, python_default_value, python_source_extension, python_module_init, python_method_templates, python_string_types, python_func_keyword, python_async_prefix, python_struct_keyword, python_enum_keyword, python_type_alias_keyword, python_param_separator, python_return_arrow, python_param_type_sep, python_module_keyword, python_import_keyword, python_import_from_keyword, python_lambda_template, python_error_expr_template, python_list_literal_empty, python_list_literal_template, python_null_coalesce_template, python_error_type_template, python_type_arg_open, python_type_arg_close, python_void_type, python_tuple_empty, python_tuple_pair_template, python_tuple_multi_template, python_tuple_separator}; -pub use crate::extdeps_languages_go_emit::{go_keywords, go_reserved, go_reserved_escape_suffix, go_manifest_file, go_source_extension, go_method_templates, go_string_types, go_func_keyword, go_async_prefix, go_struct_keyword, go_enum_keyword, go_type_alias_keyword, go_param_separator, go_return_arrow, go_param_type_sep, go_module_keyword, go_import_keyword, go_import_from_keyword, go_lambda_template, go_error_expr_template, go_list_literal_empty, go_list_literal_template, go_null_coalesce_template, go_error_type_template, go_type_arg_open, go_type_arg_close, go_void_type, go_tuple_empty, go_tuple_pair_template, go_tuple_multi_template, go_tuple_separator}; -pub use crate::extdeps_languages_dag_emit::{dag_keywords, dag_container_templates, dag_reserved, dag_string_types, dag_func_keyword, dag_async_prefix, dag_struct_keyword, dag_enum_keyword, dag_type_alias_keyword, dag_param_separator, dag_return_arrow, dag_param_type_sep, dag_module_keyword, dag_import_keyword, dag_import_from_keyword, dag_source_extension, dag_lambda_template, dag_error_expr_template, dag_list_literal_empty, dag_list_literal_template, dag_null_coalesce_template, dag_error_type_template, dag_type_arg_open, dag_type_arg_close, dag_void_type, dag_tuple_empty, dag_tuple_pair_template, dag_tuple_multi_template, dag_tuple_separator}; -use self::ReservedWordStrategy::*; -use self::TestNameStyle::*; -use self::ImportTrigger::*; use self::IfValueForm::*; +use self::ImportTrigger::*; +use self::InterpStyle::*; use self::NamingCase::*; -use self::VisibilitySpec::*; +use self::ReservedWordStrategy::*; use self::ServiceMethodStrategy::*; use self::ServiceReturnStrategy::*; -use self::InterpStyle::*; +use self::TestNameStyle::*; +use self::VisibilitySpec::*; +pub use crate::extdeps_languages_dag_emit::{ + dag_async_prefix, dag_container_templates, dag_enum_keyword, dag_error_expr_template, + dag_error_type_template, dag_func_keyword, dag_import_from_keyword, dag_import_keyword, + dag_keywords, dag_lambda_template, dag_list_literal_empty, dag_list_literal_template, + dag_module_keyword, dag_null_coalesce_template, dag_param_separator, dag_param_type_sep, + dag_reserved, dag_return_arrow, dag_source_extension, dag_string_types, dag_struct_keyword, + dag_tuple_empty, dag_tuple_multi_template, dag_tuple_pair_template, dag_tuple_separator, + dag_type_alias_keyword, dag_type_arg_close, dag_type_arg_open, dag_void_type, +}; +pub use crate::extdeps_languages_dag_syntax::dag_operators; +pub use crate::extdeps_languages_go_emit::{ + go_async_prefix, go_enum_keyword, go_error_expr_template, go_error_type_template, + go_func_keyword, go_import_from_keyword, go_import_keyword, go_keywords, go_lambda_template, + go_list_literal_empty, go_list_literal_template, go_manifest_file, go_method_templates, + go_module_keyword, go_null_coalesce_template, go_param_separator, go_param_type_sep, + go_reserved, go_reserved_escape_suffix, go_return_arrow, go_source_extension, go_string_types, + go_struct_keyword, go_tuple_empty, go_tuple_multi_template, go_tuple_pair_template, + go_tuple_separator, go_type_alias_keyword, go_type_arg_close, go_type_arg_open, go_void_type, +}; +pub use crate::extdeps_languages_go_syntax::{go_item_forms, go_operators}; +pub use crate::extdeps_languages_python_emit::{ + python_async_prefix, python_default_value, python_derive_attribute, python_enum_keyword, + python_error_expr_template, python_error_type_template, python_func_keyword, + python_import_from_keyword, python_import_keyword, python_keywords, python_lambda_template, + python_list_literal_empty, python_list_literal_template, python_method_templates, + python_module_init, python_module_keyword, python_null_coalesce_template, + python_param_separator, python_param_type_sep, python_reserved, python_reserved_escape_suffix, + python_return_arrow, python_source_extension, python_string_types, python_struct_keyword, + python_tuple_empty, python_tuple_multi_template, python_tuple_pair_template, + python_tuple_separator, python_type_alias_keyword, python_type_arg_close, python_type_arg_open, + python_void_type, +}; +pub use crate::extdeps_languages_python_syntax::{python_item_forms, python_operators}; +pub use crate::extdeps_languages_rust_emit::{ + rust_async_prefix, rust_container_templates, rust_enum_derives, rust_enum_derives_copy, + rust_enum_keyword, rust_error_expr_template, rust_error_type_template, rust_func_keyword, + rust_import_from_keyword, rust_import_keyword, rust_keywords, rust_lambda_template, + rust_list_literal_empty, rust_list_literal_template, rust_method_templates, + rust_module_keyword, rust_null_coalesce_template, rust_param_separator, rust_param_type_sep, + rust_reserved, rust_reserved_escape_prefix, rust_return_arrow, rust_serde_rename_template, + rust_serde_tag, rust_source_dir, rust_source_extension, rust_string_types, rust_struct_derives, + rust_struct_derives_copy, rust_struct_keyword, rust_tuple_empty, rust_tuple_multi_template, + rust_tuple_pair_template, rust_tuple_separator, rust_type_alias_keyword, rust_type_arg_close, + rust_type_arg_open, rust_visibility, rust_void_type, +}; +pub use crate::extdeps_languages_rust_syntax::{rust_item_forms, rust_operators}; +use crate::std_syntax::AlgebraFieldKind::*; +use crate::std_syntax::BodyKind::{ + BlockBody, ExprBody, NoBody, ResourceBody, ServiceBody, TypeBody, ValueBody, +}; +use crate::std_syntax::ItemFormKind::{ + EnumForm, FuncForm, ModuleForm, OtherForm, StructForm, TypeAliasForm, +}; +pub use crate::std_syntax::{ + AlgebraFieldKind, BodyKind, ItemForm, ItemFormKind, OperatorSpec, SyntaxSpec, +}; +pub use crate::v2_compiler_artifact::RenderTarget; +use crate::v2_compiler_artifact::RenderTarget::{Dag, Go, Python, Rust}; +use crate::v2_rt; +use crate::v2_std_core::BinOp::{ + Add, And, Div, Eq, Ge, Gt, Le, Lt, Mod, Mul, Ne, NullCoalesce, Or, Sub, +}; +use crate::v2_std_core::LiteralValue::*; +pub use crate::v2_std_core::{BinOp, LiteralValue}; +use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum ReservedWordStrategy { - PrefixEscape { - prefix: String, - }, - SuffixEscape { - suffix: String, - }, + PrefixEscape { prefix: String }, + SuffixEscape { suffix: String }, NoEscape, } @@ -91,18 +133,10 @@ pub struct TestConventions { #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum ImportTrigger { - TypeUsageTrigger { - type_name: String, - }, - TraitImplTrigger { - trait_name: String, - }, - DeriveMacroTrigger { - macro_name: String, - }, - ContainerUsageTrigger { - container: String, - }, + TypeUsageTrigger { type_name: String }, + TraitImplTrigger { trait_name: String }, + DeriveMacroTrigger { macro_name: String }, + ContainerUsageTrigger { container: String }, AsyncUsageTrigger, } @@ -211,12 +245,8 @@ pub enum NamingCase { #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum VisibilitySpec { - KeywordVisibility { - prefix: String, - }, - CaseVisibility { - export_case: NamingCase, - }, + KeywordVisibility { prefix: String }, + CaseVisibility { export_case: NamingCase }, } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -232,64 +262,74 @@ pub struct TcoSyntax { #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum ServiceMethodStrategy { - SelfInParams { - self_param: String, - }, - ExternalReceiver { - var_name: String, - }, + SelfInParams { self_param: String }, + ExternalReceiver { var_name: String }, } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum ServiceReturnStrategy { ArrowReturn, - ErrorTupleReturn { - error_type: String, - }, + ErrorTupleReturn { error_type: String }, } impl ServiceReturnStrategy { pub fn error_type(&self) -> String { match self { ServiceReturnStrategy::ArrowReturn => panic!("no error_type on unit variant"), - ServiceReturnStrategy::ErrorTupleReturn { error_type: __val, .. } => __val.clone(), + ServiceReturnStrategy::ErrorTupleReturn { + error_type: __val, .. + } => __val.clone(), } } } pub fn service_self_param(spec: Rc) -> String { match (*spec.service_method.clone()).clone() { - ServiceMethodStrategy::SelfInParams { self_param: sp, .. } => sp.clone(), - ServiceMethodStrategy::ExternalReceiver { .. } => "".to_string(), -} + ServiceMethodStrategy::SelfInParams { self_param: sp, .. } => sp.clone(), + ServiceMethodStrategy::ExternalReceiver { .. } => "".to_string(), + } } pub fn service_receiver_str(spec: Rc, service_name: String) -> String { match (*spec.service_method.clone()).clone() { - ServiceMethodStrategy::SelfInParams { .. } => "".to_string(), - ServiceMethodStrategy::ExternalReceiver { var_name: v, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("(".to_string(), v.clone()), " *".to_string()), service_name), ") ".to_string()), -} + ServiceMethodStrategy::SelfInParams { .. } => "".to_string(), + ServiceMethodStrategy::ExternalReceiver { var_name: v, .. } => v2_rt::concat( + v2_rt::concat( + v2_rt::concat(v2_rt::concat("(".to_string(), v.clone()), " *".to_string()), + service_name, + ), + ") ".to_string(), + ), + } } pub fn service_method_depth(spec: Rc) -> i64 { match (*spec.service_method.clone()).clone() { - ServiceMethodStrategy::SelfInParams { .. } => 1, - ServiceMethodStrategy::ExternalReceiver { .. } => 0, -} + ServiceMethodStrategy::SelfInParams { .. } => 1, + ServiceMethodStrategy::ExternalReceiver { .. } => 0, + } } pub fn service_methods_inside_class(spec: Rc) -> bool { match (*spec.service_method.clone()).clone() { - ServiceMethodStrategy::SelfInParams { .. } => true, - ServiceMethodStrategy::ExternalReceiver { .. } => false, -} + ServiceMethodStrategy::SelfInParams { .. } => true, + ServiceMethodStrategy::ExternalReceiver { .. } => false, + } } pub fn service_return_str(spec: &Rc, ret_type: String) -> String { match (*spec.service_return.clone()).clone() { - ServiceReturnStrategy::ArrowReturn => v2_rt::concat(spec.items.clone().return_arrow.clone(), ret_type), - ServiceReturnStrategy::ErrorTupleReturn { error_type: et, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" (".to_string(), ret_type), ", ".to_string()), et.clone()), ")".to_string()), -} + ServiceReturnStrategy::ArrowReturn => { + v2_rt::concat(spec.items.clone().return_arrow.clone(), ret_type) + } + ServiceReturnStrategy::ErrorTupleReturn { error_type: et, .. } => v2_rt::concat( + v2_rt::concat( + v2_rt::concat(v2_rt::concat(" (".to_string(), ret_type), ", ".to_string()), + et.clone(), + ), + ")".to_string(), + ), + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -309,12 +349,20 @@ pub struct ItemKeywords { pub fn item_keyword_for_kind(forms: Rc>>, kind: ItemFormKind) -> String { { - let matching = Rc::new({ let mut __result = Vec::new(); for f in forms.iter().cloned() { if (f.kind.clone() == kind.clone()) { __result.push(f); } } __result }); -match matching.first().cloned() { - Some(f) => f.keyword.clone(), - None => "__MISSING_ITEM_KEYWORD__".to_string(), -} -} + let matching = Rc::new({ + let mut __result = Vec::new(); + for f in forms.iter().cloned() { + if (f.kind.clone() == kind.clone()) { + __result.push(f); + } + } + __result + }); + match matching.first().cloned() { + Some(f) => f.keyword.clone(), + None => "__MISSING_ITEM_KEYWORD__".to_string(), + } + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -383,15 +431,15 @@ pub struct RecordLitSyntax { #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum InterpStyle { - FormatArgs { - placeholder: String, - }, + FormatArgs { placeholder: String }, InlineExpr, } impl InterpStyle { pub fn placeholder(&self) -> String { match self { - InterpStyle::FormatArgs { placeholder: __val, .. } => __val.clone(), + InterpStyle::FormatArgs { + placeholder: __val, .. + } => __val.clone(), InterpStyle::InlineExpr => panic!("no placeholder on unit variant"), } } @@ -413,760 +461,838 @@ pub struct StringInterpSyntax { pub fn rust_spec() -> Rc { Rc::new(LanguageSpec { - target_name: "rust".to_string(), - reserved_words: Rc::new(ReservedWords { - keywords: rust_reserved(), - strategy: Rc::new(ReservedWordStrategy::PrefixEscape { - prefix: rust_reserved_escape_prefix(), -}), -}), - scaffold: Rc::new(ProjectScaffold { - manifest_file: Some("Cargo.toml".to_string()), - module_init_file: None, - source_file_extension: rust_source_extension(), - source_dir: Some(rust_source_dir()), -}), - serialization: Rc::new(SerializationSpec { - struct_derives: Some(rust_struct_derives()), - struct_derives_copy: Some(rust_struct_derives_copy()), - enum_derives: Some(rust_enum_derives()), - enum_derives_copy: Some(rust_enum_derives_copy()), - tag_attribute: Some(rust_serde_tag()), - rename_attribute_template: Some(rust_serde_rename_template()), - derive_attribute: None, - default_value: None, -}), - test_conventions: Rc::new(TestConventions { - file_prefix: "".to_string(), - file_suffix: "_test".to_string(), - file_dir: Some("tests/".to_string()), - function_prefix: "test_".to_string(), - name_style: TestNameStyle::SnakeCaseTestNames, - async_decorator: Some("#[tokio::test]".to_string()), -}), - visibility: Rc::new(VisibilitySpec::KeywordVisibility { - prefix: rust_visibility(), -}), - sharing: Rc::new(SharingStrategy { - needs_sharing: true, - wrap_template: "Rc<{0}>".to_string(), - clone_value: "{0}.clone()".to_string(), - deref_clone: "(*{0}).clone()".to_string(), - field_clone: "{0}.{1}.clone()".to_string(), - iter_owned: "{0}.iter().cloned()".to_string(), - clone_suffix: ".cloned()".to_string(), - borrow_param_template: "&{0}".to_string(), - borrow_arg_template: "&{0}".to_string(), -}), - indexing: Rc::new(IndexingSemantics { - list_index: "{0}[({1}) as usize].clone()".to_string(), - map_index: "({0}).get(&{1}).cloned()".to_string(), - string_index: "v2_rt::char_at(&{0}, {1})".to_string(), - list_slice: None, - string_slice: Some("v2_rt::substring(&{0}, {1}, {2})".to_string()), -}), - annotations: Rc::new(AnnotationRequirements { - let_binding_inferred: "let {0} = {1};".to_string(), - let_binding_annotated: "let {0}: {1} = {2};".to_string(), - lambda_param_typed: "{0}: {1}".to_string(), - lambda_param_untyped: "{0}".to_string(), -}), - method_templates: Some(rust_method_templates()), - service_fields: Rc::new(ServiceFieldTemplates { - rest_decl: " pub base_url: String,\n".to_string(), - auth_decl: " pub auth_token: String,\n".to_string(), - shell_decl: " pub working_dir: Option,\n".to_string(), - file_decl: " pub base_path: String,\n".to_string(), - rest_ctor: " base_url: \"{0}\".to_string(),\n".to_string(), - auth_ctor: " auth_token: String::new(),\n".to_string(), - shell_ctor: " working_dir: None,\n".to_string(), - file_ctor: " base_path: \".\".to_string(),\n".to_string(), -}), - block_syntax: Rc::new(BlockSyntax { - block_open: " {\n".to_string(), - block_close: "}".to_string(), - else_clause: "} else {\n".to_string(), - match_keyword: "match ".to_string(), - case_keyword: "".to_string(), - arm_separator: ",".to_string(), - stmt_terminator: ";".to_string(), - significant_whitespace: false, -}), - for_each_syntax: Rc::new(ForEachSyntax { - prefix: "for ".to_string(), - separator: " in ".to_string(), -}), - tco: Rc::new(TcoSyntax { - loop_keyword: "loop".to_string(), - break_return: "break".to_string(), - continue_str: "continue;".to_string(), - temp_var_prefix: "__tco_".to_string(), - temp_decl_prefix: "let ".to_string(), - temp_assign_op: " = ".to_string(), -}), - items: Rc::new(ItemKeywords { - func_keyword: item_keyword_for_kind(rust_item_forms(), ItemFormKind::FuncForm), - async_prefix: rust_async_prefix(), - struct_keyword: item_keyword_for_kind(rust_item_forms(), ItemFormKind::StructForm), - enum_keyword: item_keyword_for_kind(rust_item_forms(), ItemFormKind::EnumForm), - type_alias_keyword: item_keyword_for_kind(rust_item_forms(), ItemFormKind::TypeAliasForm), - param_separator: rust_param_separator(), - return_arrow: rust_return_arrow(), - param_type_sep: rust_param_type_sep(), - module_keyword: item_keyword_for_kind(rust_item_forms(), ItemFormKind::ModuleForm), - import_keyword: rust_import_keyword(), - import_from_keyword: rust_import_from_keyword(), -}), - expression_semantics: Rc::new(ExpressionSemantics { - if_value_form: IfValueForm::IfExpression, - wildcard_case: None, - variant_pattern: Some(Rc::new(VariantPatternSyntax { - open: " { ".to_string(), - close: " }".to_string(), - binding_sep: ": ".to_string(), - empty_suffix: "".to_string(), -})), - guard_prefix: Some(" if ".to_string()), - empty_return_value: "()".to_string(), - return_suffix: "".to_string(), - suppress_unit_return: false, -}), - lambda_template: rust_lambda_template(), - error_expr_template: rust_error_expr_template(), - list_literal_empty: rust_list_literal_empty(), - list_literal_template: rust_list_literal_template(), - null_coalesce_template: rust_null_coalesce_template(), - error_type_template: rust_error_type_template(), - type_arg_open: rust_type_arg_open(), - type_arg_close: rust_type_arg_close(), - void_type: rust_void_type(), - tuple_syntax: Rc::new(TupleSyntax { - empty: rust_tuple_empty(), - pair_template: rust_tuple_pair_template(), - multi_template: rust_tuple_multi_template(), - separator: rust_tuple_separator(), - first_accessor: ".0".to_string(), - second_accessor: ".1".to_string(), -}), - string_interp: Rc::new(StringInterpSyntax { - style: Rc::new(InterpStyle::FormatArgs { - placeholder: "{}".to_string(), -}), - format_template: "format!(\"{0}\", {1})".to_string(), - plain_template: "\"{0}\".to_string()".to_string(), - escape_pairs: Rc::new(vec![Rc::new(EscapePair { - from: "{".to_string(), - to: "{{".to_string(), -}), Rc::new(EscapePair { - from: "}".to_string(), - to: "}}".to_string(), -})]), -}), - callable_type_template: Some("Rc {return}>".to_string()), - naming_case: NamingCase::SnakeCase, - async_call_prefix: "".to_string(), - bridge_method_prefix: "".to_string(), - bridge_method_case: NamingCase::SnakeCase, - bridge_method_overrides: v2_rt::rc_empty_map::(), - record_lit: Rc::new(RecordLitSyntax { - named_open: " {".to_string(), - named_close: "}".to_string(), - named_empty: " {}".to_string(), - named_field_sep: ": ".to_string(), - named_field_join: ", ".to_string(), - anon_empty: "{}".to_string(), - anon_prefix: "{\n".to_string(), - anon_suffix: "}".to_string(), - anon_field_indent: " ".to_string(), -}), - service_method: Rc::new(ServiceMethodStrategy::SelfInParams { - self_param: "&self".to_string(), -}), - service_return: Rc::new(ServiceReturnStrategy::ArrowReturn), -}) + target_name: "rust".to_string(), + reserved_words: Rc::new(ReservedWords { + keywords: rust_reserved(), + strategy: Rc::new(ReservedWordStrategy::PrefixEscape { + prefix: rust_reserved_escape_prefix(), + }), + }), + scaffold: Rc::new(ProjectScaffold { + manifest_file: Some("Cargo.toml".to_string()), + module_init_file: None, + source_file_extension: rust_source_extension(), + source_dir: Some(rust_source_dir()), + }), + serialization: Rc::new(SerializationSpec { + struct_derives: Some(rust_struct_derives()), + struct_derives_copy: Some(rust_struct_derives_copy()), + enum_derives: Some(rust_enum_derives()), + enum_derives_copy: Some(rust_enum_derives_copy()), + tag_attribute: Some(rust_serde_tag()), + rename_attribute_template: Some(rust_serde_rename_template()), + derive_attribute: None, + default_value: None, + }), + test_conventions: Rc::new(TestConventions { + file_prefix: "".to_string(), + file_suffix: "_test".to_string(), + file_dir: Some("tests/".to_string()), + function_prefix: "test_".to_string(), + name_style: TestNameStyle::SnakeCaseTestNames, + async_decorator: Some("#[tokio::test]".to_string()), + }), + visibility: Rc::new(VisibilitySpec::KeywordVisibility { + prefix: rust_visibility(), + }), + sharing: Rc::new(SharingStrategy { + needs_sharing: true, + wrap_template: "Rc<{0}>".to_string(), + clone_value: "{0}.clone()".to_string(), + deref_clone: "(*{0}).clone()".to_string(), + field_clone: "{0}.{1}.clone()".to_string(), + iter_owned: "{0}.iter().cloned()".to_string(), + clone_suffix: ".cloned()".to_string(), + borrow_param_template: "&{0}".to_string(), + borrow_arg_template: "&{0}".to_string(), + }), + indexing: Rc::new(IndexingSemantics { + list_index: "{0}[({1}) as usize].clone()".to_string(), + map_index: "({0}).get(&{1}).cloned()".to_string(), + string_index: "v2_rt::char_at(&{0}, {1})".to_string(), + list_slice: None, + string_slice: Some("v2_rt::substring(&{0}, {1}, {2})".to_string()), + }), + annotations: Rc::new(AnnotationRequirements { + let_binding_inferred: "let {0} = {1};".to_string(), + let_binding_annotated: "let {0}: {1} = {2};".to_string(), + lambda_param_typed: "{0}: {1}".to_string(), + lambda_param_untyped: "{0}".to_string(), + }), + method_templates: Some(rust_method_templates()), + service_fields: Rc::new(ServiceFieldTemplates { + rest_decl: " pub base_url: String,\n".to_string(), + auth_decl: " pub auth_token: String,\n".to_string(), + shell_decl: " pub working_dir: Option,\n".to_string(), + file_decl: " pub base_path: String,\n".to_string(), + rest_ctor: " base_url: \"{0}\".to_string(),\n".to_string(), + auth_ctor: " auth_token: String::new(),\n".to_string(), + shell_ctor: " working_dir: None,\n".to_string(), + file_ctor: " base_path: \".\".to_string(),\n".to_string(), + }), + block_syntax: Rc::new(BlockSyntax { + block_open: " {\n".to_string(), + block_close: "}".to_string(), + else_clause: "} else {\n".to_string(), + match_keyword: "match ".to_string(), + case_keyword: "".to_string(), + arm_separator: ",".to_string(), + stmt_terminator: ";".to_string(), + significant_whitespace: false, + }), + for_each_syntax: Rc::new(ForEachSyntax { + prefix: "for ".to_string(), + separator: " in ".to_string(), + }), + tco: Rc::new(TcoSyntax { + loop_keyword: "loop".to_string(), + break_return: "break".to_string(), + continue_str: "continue;".to_string(), + temp_var_prefix: "__tco_".to_string(), + temp_decl_prefix: "let ".to_string(), + temp_assign_op: " = ".to_string(), + }), + items: Rc::new(ItemKeywords { + func_keyword: item_keyword_for_kind(rust_item_forms(), ItemFormKind::FuncForm), + async_prefix: rust_async_prefix(), + struct_keyword: item_keyword_for_kind(rust_item_forms(), ItemFormKind::StructForm), + enum_keyword: item_keyword_for_kind(rust_item_forms(), ItemFormKind::EnumForm), + type_alias_keyword: item_keyword_for_kind( + rust_item_forms(), + ItemFormKind::TypeAliasForm, + ), + param_separator: rust_param_separator(), + return_arrow: rust_return_arrow(), + param_type_sep: rust_param_type_sep(), + module_keyword: item_keyword_for_kind(rust_item_forms(), ItemFormKind::ModuleForm), + import_keyword: rust_import_keyword(), + import_from_keyword: rust_import_from_keyword(), + }), + expression_semantics: Rc::new(ExpressionSemantics { + if_value_form: IfValueForm::IfExpression, + wildcard_case: None, + variant_pattern: Some(Rc::new(VariantPatternSyntax { + open: " { ".to_string(), + close: " }".to_string(), + binding_sep: ": ".to_string(), + empty_suffix: "".to_string(), + })), + guard_prefix: Some(" if ".to_string()), + empty_return_value: "()".to_string(), + return_suffix: "".to_string(), + suppress_unit_return: false, + }), + lambda_template: rust_lambda_template(), + error_expr_template: rust_error_expr_template(), + list_literal_empty: rust_list_literal_empty(), + list_literal_template: rust_list_literal_template(), + null_coalesce_template: rust_null_coalesce_template(), + error_type_template: rust_error_type_template(), + type_arg_open: rust_type_arg_open(), + type_arg_close: rust_type_arg_close(), + void_type: rust_void_type(), + tuple_syntax: Rc::new(TupleSyntax { + empty: rust_tuple_empty(), + pair_template: rust_tuple_pair_template(), + multi_template: rust_tuple_multi_template(), + separator: rust_tuple_separator(), + first_accessor: ".0".to_string(), + second_accessor: ".1".to_string(), + }), + string_interp: Rc::new(StringInterpSyntax { + style: Rc::new(InterpStyle::FormatArgs { + placeholder: "{}".to_string(), + }), + format_template: "format!(\"{0}\", {1})".to_string(), + plain_template: "\"{0}\".to_string()".to_string(), + escape_pairs: Rc::new(vec![ + Rc::new(EscapePair { + from: "{".to_string(), + to: "{{".to_string(), + }), + Rc::new(EscapePair { + from: "}".to_string(), + to: "}}".to_string(), + }), + ]), + }), + callable_type_template: Some("Rc {return}>".to_string()), + naming_case: NamingCase::SnakeCase, + async_call_prefix: "".to_string(), + bridge_method_prefix: "".to_string(), + bridge_method_case: NamingCase::SnakeCase, + bridge_method_overrides: v2_rt::rc_empty_map::(), + record_lit: Rc::new(RecordLitSyntax { + named_open: " {".to_string(), + named_close: "}".to_string(), + named_empty: " {}".to_string(), + named_field_sep: ": ".to_string(), + named_field_join: ", ".to_string(), + anon_empty: "{}".to_string(), + anon_prefix: "{\n".to_string(), + anon_suffix: "}".to_string(), + anon_field_indent: " ".to_string(), + }), + service_method: Rc::new(ServiceMethodStrategy::SelfInParams { + self_param: "&self".to_string(), + }), + service_return: Rc::new(ServiceReturnStrategy::ArrowReturn), + }) } pub fn python_spec() -> Rc { Rc::new(LanguageSpec { - target_name: "python".to_string(), - reserved_words: Rc::new(ReservedWords { - keywords: python_reserved(), - strategy: Rc::new(ReservedWordStrategy::SuffixEscape { - suffix: python_reserved_escape_suffix(), -}), -}), - scaffold: Rc::new(ProjectScaffold { - manifest_file: Some("requirements.txt".to_string()), - module_init_file: Some(python_module_init()), - source_file_extension: python_source_extension(), - source_dir: None, -}), - serialization: Rc::new(SerializationSpec { - struct_derives: None, - struct_derives_copy: None, - enum_derives: None, - enum_derives_copy: None, - tag_attribute: None, - rename_attribute_template: None, - derive_attribute: Some(python_derive_attribute()), - default_value: Some(python_default_value()), -}), - test_conventions: Rc::new(TestConventions { - file_prefix: "test_".to_string(), - file_suffix: "".to_string(), - file_dir: Some("tests/".to_string()), - function_prefix: "test_".to_string(), - name_style: TestNameStyle::SnakeCaseTestNames, - async_decorator: None, -}), - visibility: Rc::new(VisibilitySpec::KeywordVisibility { - prefix: "".to_string(), -}), - sharing: Rc::new(SharingStrategy { - needs_sharing: false, - wrap_template: "{0}".to_string(), - clone_value: "{0}".to_string(), - deref_clone: "{0}".to_string(), - field_clone: "{0}.{1}".to_string(), - iter_owned: "{0}".to_string(), - clone_suffix: "".to_string(), - borrow_param_template: "{0}".to_string(), - borrow_arg_template: "{0}".to_string(), -}), - indexing: Rc::new(IndexingSemantics { - list_index: "{0}[{1}]".to_string(), - map_index: "{0}[{1}]".to_string(), - string_index: "{0}[{1}]".to_string(), - list_slice: Some("{0}[{1}:{2}]".to_string()), - string_slice: Some("{0}[{1}:{2}]".to_string()), -}), - annotations: Rc::new(AnnotationRequirements { - let_binding_inferred: "{0} = {1}".to_string(), - let_binding_annotated: "{0}: {1} = {2}".to_string(), - lambda_param_typed: "{0}: {1}".to_string(), - lambda_param_untyped: "{0}".to_string(), -}), - method_templates: Some(python_method_templates()), - service_fields: Rc::new(ServiceFieldTemplates { - rest_decl: "base_url: str".to_string(), - auth_decl: "auth_token: str".to_string(), - shell_decl: "working_dir: str | None = None".to_string(), - file_decl: "base_path: str".to_string(), - rest_ctor: "self.base_url = base_url".to_string(), - auth_ctor: "self.auth_token = auth_token".to_string(), - shell_ctor: "self.working_dir = working_dir".to_string(), - file_ctor: "self.base_path = base_path".to_string(), -}), - block_syntax: Rc::new(BlockSyntax { - block_open: ":\n".to_string(), - block_close: "".to_string(), - else_clause: "else:\n".to_string(), - match_keyword: "match ".to_string(), - case_keyword: "case ".to_string(), - arm_separator: "\n".to_string(), - stmt_terminator: "".to_string(), - significant_whitespace: true, -}), - for_each_syntax: Rc::new(ForEachSyntax { - prefix: "for ".to_string(), - separator: " in ".to_string(), -}), - tco: Rc::new(TcoSyntax { - loop_keyword: "while True".to_string(), - break_return: "return".to_string(), - continue_str: "continue".to_string(), - temp_var_prefix: "__tco_".to_string(), - temp_decl_prefix: "".to_string(), - temp_assign_op: " = ".to_string(), -}), - items: Rc::new(ItemKeywords { - func_keyword: item_keyword_for_kind(python_item_forms(), ItemFormKind::FuncForm), - async_prefix: python_async_prefix(), - struct_keyword: item_keyword_for_kind(python_item_forms(), ItemFormKind::StructForm), - enum_keyword: item_keyword_for_kind(python_item_forms(), ItemFormKind::EnumForm), - type_alias_keyword: item_keyword_for_kind(python_item_forms(), ItemFormKind::TypeAliasForm), - param_separator: python_param_separator(), - return_arrow: python_return_arrow(), - param_type_sep: python_param_type_sep(), - module_keyword: item_keyword_for_kind(python_item_forms(), ItemFormKind::ModuleForm), - import_keyword: python_import_keyword(), - import_from_keyword: python_import_from_keyword(), -}), - expression_semantics: Rc::new(ExpressionSemantics { - if_value_form: IfValueForm::ConditionalTernary, - wildcard_case: None, - variant_pattern: Some(Rc::new(VariantPatternSyntax { - open: "(".to_string(), - close: ")".to_string(), - binding_sep: "=".to_string(), - empty_suffix: "()".to_string(), -})), - guard_prefix: Some(" if ".to_string()), - empty_return_value: "None".to_string(), - return_suffix: "".to_string(), - suppress_unit_return: false, -}), - lambda_template: python_lambda_template(), - error_expr_template: python_error_expr_template(), - list_literal_empty: python_list_literal_empty(), - list_literal_template: python_list_literal_template(), - null_coalesce_template: python_null_coalesce_template(), - error_type_template: python_error_type_template(), - type_arg_open: python_type_arg_open(), - type_arg_close: python_type_arg_close(), - void_type: python_void_type(), - tuple_syntax: Rc::new(TupleSyntax { - empty: python_tuple_empty(), - pair_template: python_tuple_pair_template(), - multi_template: python_tuple_multi_template(), - separator: python_tuple_separator(), - first_accessor: "[0]".to_string(), - second_accessor: "[1]".to_string(), -}), - string_interp: Rc::new(StringInterpSyntax { - style: Rc::new(InterpStyle::InlineExpr), - format_template: "f\"{0}\"".to_string(), - plain_template: "f\"{0}\"".to_string(), - escape_pairs: Rc::new(vec![Rc::new(EscapePair { - from: "{".to_string(), - to: "{{".to_string(), -}), Rc::new(EscapePair { - from: "}".to_string(), - to: "}}".to_string(), -})]), -}), - callable_type_template: None, - naming_case: NamingCase::SnakeCase, - async_call_prefix: "await ".to_string(), - bridge_method_prefix: "".to_string(), - bridge_method_case: NamingCase::SnakeCase, - bridge_method_overrides: v2_rt::rc_map_insert(v2_rt::rc_empty_map::(), "with".to_string(), "with_update".to_string()), - record_lit: Rc::new(RecordLitSyntax { - named_open: "(".to_string(), - named_close: ")".to_string(), - named_empty: "()".to_string(), - named_field_sep: "=".to_string(), - named_field_join: ", ".to_string(), - anon_empty: "{}".to_string(), - anon_prefix: "{\n".to_string(), - anon_suffix: "}".to_string(), - anon_field_indent: " ".to_string(), -}), - service_method: Rc::new(ServiceMethodStrategy::SelfInParams { - self_param: "self".to_string(), -}), - service_return: Rc::new(ServiceReturnStrategy::ArrowReturn), -}) + target_name: "python".to_string(), + reserved_words: Rc::new(ReservedWords { + keywords: python_reserved(), + strategy: Rc::new(ReservedWordStrategy::SuffixEscape { + suffix: python_reserved_escape_suffix(), + }), + }), + scaffold: Rc::new(ProjectScaffold { + manifest_file: Some("requirements.txt".to_string()), + module_init_file: Some(python_module_init()), + source_file_extension: python_source_extension(), + source_dir: None, + }), + serialization: Rc::new(SerializationSpec { + struct_derives: None, + struct_derives_copy: None, + enum_derives: None, + enum_derives_copy: None, + tag_attribute: None, + rename_attribute_template: None, + derive_attribute: Some(python_derive_attribute()), + default_value: Some(python_default_value()), + }), + test_conventions: Rc::new(TestConventions { + file_prefix: "test_".to_string(), + file_suffix: "".to_string(), + file_dir: Some("tests/".to_string()), + function_prefix: "test_".to_string(), + name_style: TestNameStyle::SnakeCaseTestNames, + async_decorator: None, + }), + visibility: Rc::new(VisibilitySpec::KeywordVisibility { + prefix: "".to_string(), + }), + sharing: Rc::new(SharingStrategy { + needs_sharing: false, + wrap_template: "{0}".to_string(), + clone_value: "{0}".to_string(), + deref_clone: "{0}".to_string(), + field_clone: "{0}.{1}".to_string(), + iter_owned: "{0}".to_string(), + clone_suffix: "".to_string(), + borrow_param_template: "{0}".to_string(), + borrow_arg_template: "{0}".to_string(), + }), + indexing: Rc::new(IndexingSemantics { + list_index: "{0}[{1}]".to_string(), + map_index: "{0}[{1}]".to_string(), + string_index: "{0}[{1}]".to_string(), + list_slice: Some("{0}[{1}:{2}]".to_string()), + string_slice: Some("{0}[{1}:{2}]".to_string()), + }), + annotations: Rc::new(AnnotationRequirements { + let_binding_inferred: "{0} = {1}".to_string(), + let_binding_annotated: "{0}: {1} = {2}".to_string(), + lambda_param_typed: "{0}: {1}".to_string(), + lambda_param_untyped: "{0}".to_string(), + }), + method_templates: Some(python_method_templates()), + service_fields: Rc::new(ServiceFieldTemplates { + rest_decl: "base_url: str".to_string(), + auth_decl: "auth_token: str".to_string(), + shell_decl: "working_dir: str | None = None".to_string(), + file_decl: "base_path: str".to_string(), + rest_ctor: "self.base_url = base_url".to_string(), + auth_ctor: "self.auth_token = auth_token".to_string(), + shell_ctor: "self.working_dir = working_dir".to_string(), + file_ctor: "self.base_path = base_path".to_string(), + }), + block_syntax: Rc::new(BlockSyntax { + block_open: ":\n".to_string(), + block_close: "".to_string(), + else_clause: "else:\n".to_string(), + match_keyword: "match ".to_string(), + case_keyword: "case ".to_string(), + arm_separator: "\n".to_string(), + stmt_terminator: "".to_string(), + significant_whitespace: true, + }), + for_each_syntax: Rc::new(ForEachSyntax { + prefix: "for ".to_string(), + separator: " in ".to_string(), + }), + tco: Rc::new(TcoSyntax { + loop_keyword: "while True".to_string(), + break_return: "return".to_string(), + continue_str: "continue".to_string(), + temp_var_prefix: "__tco_".to_string(), + temp_decl_prefix: "".to_string(), + temp_assign_op: " = ".to_string(), + }), + items: Rc::new(ItemKeywords { + func_keyword: item_keyword_for_kind(python_item_forms(), ItemFormKind::FuncForm), + async_prefix: python_async_prefix(), + struct_keyword: item_keyword_for_kind(python_item_forms(), ItemFormKind::StructForm), + enum_keyword: item_keyword_for_kind(python_item_forms(), ItemFormKind::EnumForm), + type_alias_keyword: item_keyword_for_kind( + python_item_forms(), + ItemFormKind::TypeAliasForm, + ), + param_separator: python_param_separator(), + return_arrow: python_return_arrow(), + param_type_sep: python_param_type_sep(), + module_keyword: item_keyword_for_kind(python_item_forms(), ItemFormKind::ModuleForm), + import_keyword: python_import_keyword(), + import_from_keyword: python_import_from_keyword(), + }), + expression_semantics: Rc::new(ExpressionSemantics { + if_value_form: IfValueForm::ConditionalTernary, + wildcard_case: None, + variant_pattern: Some(Rc::new(VariantPatternSyntax { + open: "(".to_string(), + close: ")".to_string(), + binding_sep: "=".to_string(), + empty_suffix: "()".to_string(), + })), + guard_prefix: Some(" if ".to_string()), + empty_return_value: "None".to_string(), + return_suffix: "".to_string(), + suppress_unit_return: false, + }), + lambda_template: python_lambda_template(), + error_expr_template: python_error_expr_template(), + list_literal_empty: python_list_literal_empty(), + list_literal_template: python_list_literal_template(), + null_coalesce_template: python_null_coalesce_template(), + error_type_template: python_error_type_template(), + type_arg_open: python_type_arg_open(), + type_arg_close: python_type_arg_close(), + void_type: python_void_type(), + tuple_syntax: Rc::new(TupleSyntax { + empty: python_tuple_empty(), + pair_template: python_tuple_pair_template(), + multi_template: python_tuple_multi_template(), + separator: python_tuple_separator(), + first_accessor: "[0]".to_string(), + second_accessor: "[1]".to_string(), + }), + string_interp: Rc::new(StringInterpSyntax { + style: Rc::new(InterpStyle::InlineExpr), + format_template: "f\"{0}\"".to_string(), + plain_template: "f\"{0}\"".to_string(), + escape_pairs: Rc::new(vec![ + Rc::new(EscapePair { + from: "{".to_string(), + to: "{{".to_string(), + }), + Rc::new(EscapePair { + from: "}".to_string(), + to: "}}".to_string(), + }), + ]), + }), + callable_type_template: None, + naming_case: NamingCase::SnakeCase, + async_call_prefix: "await ".to_string(), + bridge_method_prefix: "".to_string(), + bridge_method_case: NamingCase::SnakeCase, + bridge_method_overrides: v2_rt::rc_map_insert( + v2_rt::rc_empty_map::(), + "with".to_string(), + "with_update".to_string(), + ), + record_lit: Rc::new(RecordLitSyntax { + named_open: "(".to_string(), + named_close: ")".to_string(), + named_empty: "()".to_string(), + named_field_sep: "=".to_string(), + named_field_join: ", ".to_string(), + anon_empty: "{}".to_string(), + anon_prefix: "{\n".to_string(), + anon_suffix: "}".to_string(), + anon_field_indent: " ".to_string(), + }), + service_method: Rc::new(ServiceMethodStrategy::SelfInParams { + self_param: "self".to_string(), + }), + service_return: Rc::new(ServiceReturnStrategy::ArrowReturn), + }) } pub fn go_spec() -> Rc { Rc::new(LanguageSpec { - target_name: "go".to_string(), - reserved_words: Rc::new(ReservedWords { - keywords: go_reserved(), - strategy: Rc::new(ReservedWordStrategy::SuffixEscape { - suffix: go_reserved_escape_suffix(), -}), -}), - scaffold: Rc::new(ProjectScaffold { - manifest_file: Some("go.mod".to_string()), - module_init_file: None, - source_file_extension: ".go".to_string(), - source_dir: None, -}), - serialization: Rc::new(SerializationSpec { - struct_derives: None, - struct_derives_copy: None, - enum_derives: None, - enum_derives_copy: None, - tag_attribute: None, - rename_attribute_template: None, - derive_attribute: None, - default_value: None, -}), - test_conventions: Rc::new(TestConventions { - file_prefix: "".to_string(), - file_suffix: "_test".to_string(), - file_dir: None, - function_prefix: "Test".to_string(), - name_style: TestNameStyle::PascalCaseTestNames, - async_decorator: None, -}), - visibility: Rc::new(VisibilitySpec::CaseVisibility { - export_case: NamingCase::PascalCase, -}), - sharing: Rc::new(SharingStrategy { - needs_sharing: false, - wrap_template: "{0}".to_string(), - clone_value: "{0}".to_string(), - deref_clone: "{0}".to_string(), - field_clone: "{0}.{1}".to_string(), - iter_owned: "{0}".to_string(), - clone_suffix: "".to_string(), - borrow_param_template: "{0}".to_string(), - borrow_arg_template: "{0}".to_string(), -}), - indexing: Rc::new(IndexingSemantics { - list_index: "{0}[{1}]".to_string(), - map_index: "{0}[{1}]".to_string(), - string_index: "{0}[{1}]".to_string(), - list_slice: Some("{0}[{1}:{2}]".to_string()), - string_slice: Some("{0}[{1}:{2}]".to_string()), -}), - annotations: Rc::new(AnnotationRequirements { - let_binding_inferred: "{0} := {1}".to_string(), - let_binding_annotated: "var {0} {1} = {2}".to_string(), - lambda_param_typed: "{0} {1}".to_string(), - lambda_param_untyped: "{0} interface{}".to_string(), -}), - method_templates: Some(go_method_templates()), - service_fields: Rc::new(ServiceFieldTemplates { - rest_decl: "\tBaseURL string".to_string(), - auth_decl: "\tAuthToken string".to_string(), - shell_decl: "\tWorkingDir string".to_string(), - file_decl: "\tBasePath string".to_string(), - rest_ctor: "".to_string(), - auth_ctor: "".to_string(), - shell_ctor: "".to_string(), - file_ctor: "".to_string(), -}), - block_syntax: Rc::new(BlockSyntax { - block_open: " {\n".to_string(), - block_close: "}".to_string(), - else_clause: "} else {\n".to_string(), - match_keyword: "switch ".to_string(), - case_keyword: "case ".to_string(), - arm_separator: "\n".to_string(), - stmt_terminator: "".to_string(), - significant_whitespace: false, -}), - for_each_syntax: Rc::new(ForEachSyntax { - prefix: "for _, ".to_string(), - separator: " := range ".to_string(), -}), - tco: Rc::new(TcoSyntax { - loop_keyword: "for".to_string(), - break_return: "return".to_string(), - continue_str: "continue".to_string(), - temp_var_prefix: "tco".to_string(), - temp_decl_prefix: "".to_string(), - temp_assign_op: " := ".to_string(), -}), - items: Rc::new(ItemKeywords { - func_keyword: item_keyword_for_kind(go_item_forms(), ItemFormKind::FuncForm), - async_prefix: go_async_prefix(), - struct_keyword: item_keyword_for_kind(go_item_forms(), ItemFormKind::StructForm), - enum_keyword: item_keyword_for_kind(go_item_forms(), ItemFormKind::EnumForm), - type_alias_keyword: item_keyword_for_kind(go_item_forms(), ItemFormKind::TypeAliasForm), - param_separator: go_param_separator(), - return_arrow: go_return_arrow(), - param_type_sep: go_param_type_sep(), - module_keyword: item_keyword_for_kind(go_item_forms(), ItemFormKind::ModuleForm), - import_keyword: go_import_keyword(), - import_from_keyword: go_import_from_keyword(), -}), - expression_semantics: Rc::new(ExpressionSemantics { - if_value_form: IfValueForm::IfStatement, - wildcard_case: Some("default".to_string()), - variant_pattern: None, - guard_prefix: None, - empty_return_value: "struct{}{}, nil".to_string(), - return_suffix: ", nil".to_string(), - suppress_unit_return: true, -}), - lambda_template: go_lambda_template(), - error_expr_template: go_error_expr_template(), - list_literal_empty: go_list_literal_empty(), - list_literal_template: go_list_literal_template(), - null_coalesce_template: go_null_coalesce_template(), - error_type_template: go_error_type_template(), - type_arg_open: go_type_arg_open(), - type_arg_close: go_type_arg_close(), - void_type: go_void_type(), - tuple_syntax: Rc::new(TupleSyntax { - empty: go_tuple_empty(), - pair_template: go_tuple_pair_template(), - multi_template: go_tuple_multi_template(), - separator: go_tuple_separator(), - first_accessor: ".First".to_string(), - second_accessor: ".Second".to_string(), -}), - string_interp: Rc::new(StringInterpSyntax { - style: Rc::new(InterpStyle::FormatArgs { - placeholder: "%v".to_string(), -}), - format_template: "fmt.Sprintf(\"{0}\", {1})".to_string(), - plain_template: "\"{0}\"".to_string(), - escape_pairs: Rc::new(vec![Rc::new(EscapePair { - from: "%".to_string(), - to: "%%".to_string(), -})]), -}), - callable_type_template: None, - naming_case: NamingCase::CamelCase, - async_call_prefix: "".to_string(), - bridge_method_prefix: "v2rt.".to_string(), - bridge_method_case: NamingCase::PascalCase, - bridge_method_overrides: v2_rt::rc_empty_map::(), - record_lit: Rc::new(RecordLitSyntax { - named_open: "{".to_string(), - named_close: "}".to_string(), - named_empty: "{}".to_string(), - named_field_sep: ": ".to_string(), - named_field_join: ", ".to_string(), - anon_empty: "map[string]interface{}{}".to_string(), - anon_prefix: "map[string]interface{}{\n".to_string(), - anon_suffix: "}".to_string(), - anon_field_indent: "\t".to_string(), -}), - service_method: Rc::new(ServiceMethodStrategy::ExternalReceiver { - var_name: "c".to_string(), -}), - service_return: Rc::new(ServiceReturnStrategy::ErrorTupleReturn { - error_type: "error".to_string(), -}), -}) + target_name: "go".to_string(), + reserved_words: Rc::new(ReservedWords { + keywords: go_reserved(), + strategy: Rc::new(ReservedWordStrategy::SuffixEscape { + suffix: go_reserved_escape_suffix(), + }), + }), + scaffold: Rc::new(ProjectScaffold { + manifest_file: Some("go.mod".to_string()), + module_init_file: None, + source_file_extension: ".go".to_string(), + source_dir: None, + }), + serialization: Rc::new(SerializationSpec { + struct_derives: None, + struct_derives_copy: None, + enum_derives: None, + enum_derives_copy: None, + tag_attribute: None, + rename_attribute_template: None, + derive_attribute: None, + default_value: None, + }), + test_conventions: Rc::new(TestConventions { + file_prefix: "".to_string(), + file_suffix: "_test".to_string(), + file_dir: None, + function_prefix: "Test".to_string(), + name_style: TestNameStyle::PascalCaseTestNames, + async_decorator: None, + }), + visibility: Rc::new(VisibilitySpec::CaseVisibility { + export_case: NamingCase::PascalCase, + }), + sharing: Rc::new(SharingStrategy { + needs_sharing: false, + wrap_template: "{0}".to_string(), + clone_value: "{0}".to_string(), + deref_clone: "{0}".to_string(), + field_clone: "{0}.{1}".to_string(), + iter_owned: "{0}".to_string(), + clone_suffix: "".to_string(), + borrow_param_template: "{0}".to_string(), + borrow_arg_template: "{0}".to_string(), + }), + indexing: Rc::new(IndexingSemantics { + list_index: "{0}[{1}]".to_string(), + map_index: "{0}[{1}]".to_string(), + string_index: "{0}[{1}]".to_string(), + list_slice: Some("{0}[{1}:{2}]".to_string()), + string_slice: Some("{0}[{1}:{2}]".to_string()), + }), + annotations: Rc::new(AnnotationRequirements { + let_binding_inferred: "{0} := {1}".to_string(), + let_binding_annotated: "var {0} {1} = {2}".to_string(), + lambda_param_typed: "{0} {1}".to_string(), + lambda_param_untyped: "{0} interface{}".to_string(), + }), + method_templates: Some(go_method_templates()), + service_fields: Rc::new(ServiceFieldTemplates { + rest_decl: "\tBaseURL string".to_string(), + auth_decl: "\tAuthToken string".to_string(), + shell_decl: "\tWorkingDir string".to_string(), + file_decl: "\tBasePath string".to_string(), + rest_ctor: "".to_string(), + auth_ctor: "".to_string(), + shell_ctor: "".to_string(), + file_ctor: "".to_string(), + }), + block_syntax: Rc::new(BlockSyntax { + block_open: " {\n".to_string(), + block_close: "}".to_string(), + else_clause: "} else {\n".to_string(), + match_keyword: "switch ".to_string(), + case_keyword: "case ".to_string(), + arm_separator: "\n".to_string(), + stmt_terminator: "".to_string(), + significant_whitespace: false, + }), + for_each_syntax: Rc::new(ForEachSyntax { + prefix: "for _, ".to_string(), + separator: " := range ".to_string(), + }), + tco: Rc::new(TcoSyntax { + loop_keyword: "for".to_string(), + break_return: "return".to_string(), + continue_str: "continue".to_string(), + temp_var_prefix: "tco".to_string(), + temp_decl_prefix: "".to_string(), + temp_assign_op: " := ".to_string(), + }), + items: Rc::new(ItemKeywords { + func_keyword: item_keyword_for_kind(go_item_forms(), ItemFormKind::FuncForm), + async_prefix: go_async_prefix(), + struct_keyword: item_keyword_for_kind(go_item_forms(), ItemFormKind::StructForm), + enum_keyword: item_keyword_for_kind(go_item_forms(), ItemFormKind::EnumForm), + type_alias_keyword: item_keyword_for_kind(go_item_forms(), ItemFormKind::TypeAliasForm), + param_separator: go_param_separator(), + return_arrow: go_return_arrow(), + param_type_sep: go_param_type_sep(), + module_keyword: item_keyword_for_kind(go_item_forms(), ItemFormKind::ModuleForm), + import_keyword: go_import_keyword(), + import_from_keyword: go_import_from_keyword(), + }), + expression_semantics: Rc::new(ExpressionSemantics { + if_value_form: IfValueForm::IfStatement, + wildcard_case: Some("default".to_string()), + variant_pattern: None, + guard_prefix: None, + empty_return_value: "struct{}{}, nil".to_string(), + return_suffix: ", nil".to_string(), + suppress_unit_return: true, + }), + lambda_template: go_lambda_template(), + error_expr_template: go_error_expr_template(), + list_literal_empty: go_list_literal_empty(), + list_literal_template: go_list_literal_template(), + null_coalesce_template: go_null_coalesce_template(), + error_type_template: go_error_type_template(), + type_arg_open: go_type_arg_open(), + type_arg_close: go_type_arg_close(), + void_type: go_void_type(), + tuple_syntax: Rc::new(TupleSyntax { + empty: go_tuple_empty(), + pair_template: go_tuple_pair_template(), + multi_template: go_tuple_multi_template(), + separator: go_tuple_separator(), + first_accessor: ".First".to_string(), + second_accessor: ".Second".to_string(), + }), + string_interp: Rc::new(StringInterpSyntax { + style: Rc::new(InterpStyle::FormatArgs { + placeholder: "%v".to_string(), + }), + format_template: "fmt.Sprintf(\"{0}\", {1})".to_string(), + plain_template: "\"{0}\"".to_string(), + escape_pairs: Rc::new(vec![Rc::new(EscapePair { + from: "%".to_string(), + to: "%%".to_string(), + })]), + }), + callable_type_template: None, + naming_case: NamingCase::CamelCase, + async_call_prefix: "".to_string(), + bridge_method_prefix: "v2rt.".to_string(), + bridge_method_case: NamingCase::PascalCase, + bridge_method_overrides: v2_rt::rc_empty_map::(), + record_lit: Rc::new(RecordLitSyntax { + named_open: "{".to_string(), + named_close: "}".to_string(), + named_empty: "{}".to_string(), + named_field_sep: ": ".to_string(), + named_field_join: ", ".to_string(), + anon_empty: "map[string]interface{}{}".to_string(), + anon_prefix: "map[string]interface{}{\n".to_string(), + anon_suffix: "}".to_string(), + anon_field_indent: "\t".to_string(), + }), + service_method: Rc::new(ServiceMethodStrategy::ExternalReceiver { + var_name: "c".to_string(), + }), + service_return: Rc::new(ServiceReturnStrategy::ErrorTupleReturn { + error_type: "error".to_string(), + }), + }) } pub fn dag_spec() -> Rc { Rc::new(LanguageSpec { - target_name: "dag".to_string(), - reserved_words: Rc::new(ReservedWords { - keywords: dag_reserved(), - strategy: Rc::new(ReservedWordStrategy::NoEscape), -}), - scaffold: Rc::new(ProjectScaffold { - manifest_file: None, - module_init_file: None, - source_file_extension: dag_source_extension(), - source_dir: None, -}), - serialization: Rc::new(SerializationSpec { - struct_derives: None, - struct_derives_copy: None, - enum_derives: None, - enum_derives_copy: None, - tag_attribute: None, - rename_attribute_template: None, - derive_attribute: None, - default_value: None, -}), - test_conventions: Rc::new(TestConventions { - file_prefix: "test_".to_string(), - file_suffix: "".to_string(), - file_dir: Some("tests/".to_string()), - function_prefix: "test_".to_string(), - name_style: TestNameStyle::SnakeCaseTestNames, - async_decorator: None, -}), - visibility: Rc::new(VisibilitySpec::KeywordVisibility { - prefix: "".to_string(), -}), - sharing: Rc::new(SharingStrategy { - needs_sharing: true, - wrap_template: "Rc<{0}>".to_string(), - clone_value: "{0}.clone()".to_string(), - deref_clone: "(*{0}).clone()".to_string(), - field_clone: "{0}.{1}.clone()".to_string(), - iter_owned: "{0}.iter().cloned()".to_string(), - clone_suffix: ".cloned()".to_string(), - borrow_param_template: "&{0}".to_string(), - borrow_arg_template: "&{0}".to_string(), -}), - indexing: Rc::new(IndexingSemantics { - list_index: "{0}[({1}) as usize].clone()".to_string(), - map_index: "({0}).get(&{1}).cloned()".to_string(), - string_index: "v2_rt::char_at(&{0}, {1})".to_string(), - list_slice: None, - string_slice: Some("v2_rt::substring(&{0}, {1}, {2})".to_string()), -}), - annotations: Rc::new(AnnotationRequirements { - let_binding_inferred: "let {0} = {1}".to_string(), - let_binding_annotated: "let {0}: {1} = {2}".to_string(), - lambda_param_typed: "{0}: {1}".to_string(), - lambda_param_untyped: "{0}".to_string(), -}), - method_templates: Some(rust_method_templates()), - service_fields: Rc::new(ServiceFieldTemplates { - rest_decl: " pub base_url: String,\n".to_string(), - auth_decl: " pub auth_token: String,\n".to_string(), - shell_decl: " pub working_dir: Option,\n".to_string(), - file_decl: " pub base_path: String,\n".to_string(), - rest_ctor: " base_url: \"{0}\".to_string(),\n".to_string(), - auth_ctor: " auth_token: String::new(),\n".to_string(), - shell_ctor: " working_dir: None,\n".to_string(), - file_ctor: " base_path: \".\".to_string(),\n".to_string(), -}), - block_syntax: Rc::new(BlockSyntax { - block_open: " {\n".to_string(), - block_close: "}".to_string(), - else_clause: "} else {\n".to_string(), - match_keyword: "match ".to_string(), - case_keyword: "".to_string(), - arm_separator: ",".to_string(), - stmt_terminator: ";".to_string(), - significant_whitespace: false, -}), - for_each_syntax: Rc::new(ForEachSyntax { - prefix: "for ".to_string(), - separator: " in ".to_string(), -}), - tco: Rc::new(TcoSyntax { - loop_keyword: "loop".to_string(), - break_return: "break".to_string(), - continue_str: "continue;".to_string(), - temp_var_prefix: "__tco_".to_string(), - temp_decl_prefix: "let ".to_string(), - temp_assign_op: " = ".to_string(), -}), - items: Rc::new(ItemKeywords { - func_keyword: dag_func_keyword(), - async_prefix: dag_async_prefix(), - struct_keyword: dag_struct_keyword(), - enum_keyword: dag_enum_keyword(), - type_alias_keyword: dag_type_alias_keyword(), - param_separator: dag_param_separator(), - return_arrow: dag_return_arrow(), - param_type_sep: dag_param_type_sep(), - module_keyword: dag_module_keyword(), - import_keyword: dag_import_keyword(), - import_from_keyword: dag_import_from_keyword(), -}), - expression_semantics: Rc::new(ExpressionSemantics { - if_value_form: IfValueForm::IfExpression, - wildcard_case: None, - variant_pattern: Some(Rc::new(VariantPatternSyntax { - open: " { ".to_string(), - close: " }".to_string(), - binding_sep: ": ".to_string(), - empty_suffix: "".to_string(), -})), - guard_prefix: Some(" if ".to_string()), - empty_return_value: "()".to_string(), - return_suffix: "".to_string(), - suppress_unit_return: false, -}), - lambda_template: dag_lambda_template(), - error_expr_template: dag_error_expr_template(), - list_literal_empty: dag_list_literal_empty(), - list_literal_template: dag_list_literal_template(), - null_coalesce_template: dag_null_coalesce_template(), - error_type_template: dag_error_type_template(), - type_arg_open: dag_type_arg_open(), - type_arg_close: dag_type_arg_close(), - void_type: dag_void_type(), - tuple_syntax: Rc::new(TupleSyntax { - empty: dag_tuple_empty(), - pair_template: dag_tuple_pair_template(), - multi_template: dag_tuple_multi_template(), - separator: dag_tuple_separator(), - first_accessor: ".0".to_string(), - second_accessor: ".1".to_string(), -}), - string_interp: Rc::new(StringInterpSyntax { - style: Rc::new(InterpStyle::InlineExpr), - format_template: "\"{0}\"".to_string(), - plain_template: "\"{0}\"".to_string(), - escape_pairs: Rc::new(vec![Rc::new(EscapePair { - from: "{".to_string(), - to: "\\{".to_string(), -}), Rc::new(EscapePair { - from: "}".to_string(), - to: "\\}".to_string(), -})]), -}), - callable_type_template: None, - naming_case: NamingCase::AsAuthored, - async_call_prefix: "".to_string(), - bridge_method_prefix: "".to_string(), - bridge_method_case: NamingCase::SnakeCase, - bridge_method_overrides: v2_rt::rc_empty_map::(), - record_lit: Rc::new(RecordLitSyntax { - named_open: " {".to_string(), - named_close: "}".to_string(), - named_empty: " {}".to_string(), - named_field_sep: ": ".to_string(), - named_field_join: ", ".to_string(), - anon_empty: "{}".to_string(), - anon_prefix: "{\n".to_string(), - anon_suffix: "}".to_string(), - anon_field_indent: " ".to_string(), -}), - service_method: Rc::new(ServiceMethodStrategy::SelfInParams { - self_param: "".to_string(), -}), - service_return: Rc::new(ServiceReturnStrategy::ArrowReturn), -}) + target_name: "dag".to_string(), + reserved_words: Rc::new(ReservedWords { + keywords: dag_reserved(), + strategy: Rc::new(ReservedWordStrategy::NoEscape), + }), + scaffold: Rc::new(ProjectScaffold { + manifest_file: None, + module_init_file: None, + source_file_extension: dag_source_extension(), + source_dir: None, + }), + serialization: Rc::new(SerializationSpec { + struct_derives: None, + struct_derives_copy: None, + enum_derives: None, + enum_derives_copy: None, + tag_attribute: None, + rename_attribute_template: None, + derive_attribute: None, + default_value: None, + }), + test_conventions: Rc::new(TestConventions { + file_prefix: "test_".to_string(), + file_suffix: "".to_string(), + file_dir: Some("tests/".to_string()), + function_prefix: "test_".to_string(), + name_style: TestNameStyle::SnakeCaseTestNames, + async_decorator: None, + }), + visibility: Rc::new(VisibilitySpec::KeywordVisibility { + prefix: "".to_string(), + }), + sharing: Rc::new(SharingStrategy { + needs_sharing: true, + wrap_template: "Rc<{0}>".to_string(), + clone_value: "{0}.clone()".to_string(), + deref_clone: "(*{0}).clone()".to_string(), + field_clone: "{0}.{1}.clone()".to_string(), + iter_owned: "{0}.iter().cloned()".to_string(), + clone_suffix: ".cloned()".to_string(), + borrow_param_template: "&{0}".to_string(), + borrow_arg_template: "&{0}".to_string(), + }), + indexing: Rc::new(IndexingSemantics { + list_index: "{0}[({1}) as usize].clone()".to_string(), + map_index: "({0}).get(&{1}).cloned()".to_string(), + string_index: "v2_rt::char_at(&{0}, {1})".to_string(), + list_slice: None, + string_slice: Some("v2_rt::substring(&{0}, {1}, {2})".to_string()), + }), + annotations: Rc::new(AnnotationRequirements { + let_binding_inferred: "let {0} = {1}".to_string(), + let_binding_annotated: "let {0}: {1} = {2}".to_string(), + lambda_param_typed: "{0}: {1}".to_string(), + lambda_param_untyped: "{0}".to_string(), + }), + method_templates: Some(rust_method_templates()), + service_fields: Rc::new(ServiceFieldTemplates { + rest_decl: " pub base_url: String,\n".to_string(), + auth_decl: " pub auth_token: String,\n".to_string(), + shell_decl: " pub working_dir: Option,\n".to_string(), + file_decl: " pub base_path: String,\n".to_string(), + rest_ctor: " base_url: \"{0}\".to_string(),\n".to_string(), + auth_ctor: " auth_token: String::new(),\n".to_string(), + shell_ctor: " working_dir: None,\n".to_string(), + file_ctor: " base_path: \".\".to_string(),\n".to_string(), + }), + block_syntax: Rc::new(BlockSyntax { + block_open: " {\n".to_string(), + block_close: "}".to_string(), + else_clause: "} else {\n".to_string(), + match_keyword: "match ".to_string(), + case_keyword: "".to_string(), + arm_separator: ",".to_string(), + stmt_terminator: ";".to_string(), + significant_whitespace: false, + }), + for_each_syntax: Rc::new(ForEachSyntax { + prefix: "for ".to_string(), + separator: " in ".to_string(), + }), + tco: Rc::new(TcoSyntax { + loop_keyword: "loop".to_string(), + break_return: "break".to_string(), + continue_str: "continue;".to_string(), + temp_var_prefix: "__tco_".to_string(), + temp_decl_prefix: "let ".to_string(), + temp_assign_op: " = ".to_string(), + }), + items: Rc::new(ItemKeywords { + func_keyword: dag_func_keyword(), + async_prefix: dag_async_prefix(), + struct_keyword: dag_struct_keyword(), + enum_keyword: dag_enum_keyword(), + type_alias_keyword: dag_type_alias_keyword(), + param_separator: dag_param_separator(), + return_arrow: dag_return_arrow(), + param_type_sep: dag_param_type_sep(), + module_keyword: dag_module_keyword(), + import_keyword: dag_import_keyword(), + import_from_keyword: dag_import_from_keyword(), + }), + expression_semantics: Rc::new(ExpressionSemantics { + if_value_form: IfValueForm::IfExpression, + wildcard_case: None, + variant_pattern: Some(Rc::new(VariantPatternSyntax { + open: " { ".to_string(), + close: " }".to_string(), + binding_sep: ": ".to_string(), + empty_suffix: "".to_string(), + })), + guard_prefix: Some(" if ".to_string()), + empty_return_value: "()".to_string(), + return_suffix: "".to_string(), + suppress_unit_return: false, + }), + lambda_template: dag_lambda_template(), + error_expr_template: dag_error_expr_template(), + list_literal_empty: dag_list_literal_empty(), + list_literal_template: dag_list_literal_template(), + null_coalesce_template: dag_null_coalesce_template(), + error_type_template: dag_error_type_template(), + type_arg_open: dag_type_arg_open(), + type_arg_close: dag_type_arg_close(), + void_type: dag_void_type(), + tuple_syntax: Rc::new(TupleSyntax { + empty: dag_tuple_empty(), + pair_template: dag_tuple_pair_template(), + multi_template: dag_tuple_multi_template(), + separator: dag_tuple_separator(), + first_accessor: ".0".to_string(), + second_accessor: ".1".to_string(), + }), + string_interp: Rc::new(StringInterpSyntax { + style: Rc::new(InterpStyle::InlineExpr), + format_template: "\"{0}\"".to_string(), + plain_template: "\"{0}\"".to_string(), + escape_pairs: Rc::new(vec![ + Rc::new(EscapePair { + from: "{".to_string(), + to: "\\{".to_string(), + }), + Rc::new(EscapePair { + from: "}".to_string(), + to: "\\}".to_string(), + }), + ]), + }), + callable_type_template: None, + naming_case: NamingCase::AsAuthored, + async_call_prefix: "".to_string(), + bridge_method_prefix: "".to_string(), + bridge_method_case: NamingCase::SnakeCase, + bridge_method_overrides: v2_rt::rc_empty_map::(), + record_lit: Rc::new(RecordLitSyntax { + named_open: " {".to_string(), + named_close: "}".to_string(), + named_empty: " {}".to_string(), + named_field_sep: ": ".to_string(), + named_field_join: ", ".to_string(), + anon_empty: "{}".to_string(), + anon_prefix: "{\n".to_string(), + anon_suffix: "}".to_string(), + anon_field_indent: " ".to_string(), + }), + service_method: Rc::new(ServiceMethodStrategy::SelfInParams { + self_param: "".to_string(), + }), + service_return: Rc::new(ServiceReturnStrategy::ArrowReturn), + }) } pub fn language_spec_for_target(target: RenderTarget) -> Rc { match target { - RenderTarget::Rust => rust_spec(), - RenderTarget::Go => go_spec(), - RenderTarget::Python => python_spec(), - RenderTarget::Dag => dag_spec(), -} + RenderTarget::Rust => rust_spec(), + RenderTarget::Go => go_spec(), + RenderTarget::Python => python_spec(), + RenderTarget::Dag => dag_spec(), + } } pub fn target_keyword(target: RenderTarget, key: String) -> String { match target { - RenderTarget::Rust => match v2_rt::lookup(&rust_keywords(), key.clone()) { - Some(kw) => kw.clone(), - None => key.clone(), -}, - RenderTarget::Go => match v2_rt::lookup(&go_keywords(), key.clone()) { - Some(kw) => kw.clone(), - None => key.clone(), -}, - RenderTarget::Python => match v2_rt::lookup(&python_keywords(), key.clone()) { - Some(kw) => kw.clone(), - None => key.clone(), -}, - RenderTarget::Dag => key.clone(), -} + RenderTarget::Rust => match v2_rt::lookup(&rust_keywords(), key.clone()) { + Some(kw) => kw.clone(), + None => key.clone(), + }, + RenderTarget::Go => match v2_rt::lookup(&go_keywords(), key.clone()) { + Some(kw) => kw.clone(), + None => key.clone(), + }, + RenderTarget::Python => match v2_rt::lookup(&python_keywords(), key.clone()) { + Some(kw) => kw.clone(), + None => key.clone(), + }, + RenderTarget::Dag => key.clone(), + } } pub fn target_operators(target: RenderTarget) -> Rc>> { match target { - RenderTarget::Rust => rust_operators(), - RenderTarget::Python => python_operators(), - RenderTarget::Go => go_operators(), - RenderTarget::Dag => dag_operators(), -} + RenderTarget::Rust => rust_operators(), + RenderTarget::Python => python_operators(), + RenderTarget::Go => go_operators(), + RenderTarget::Dag => dag_operators(), + } } -pub fn binop_symbol(target: RenderTarget, op: BinOp, algebra_field: Option) -> Option { +pub fn binop_symbol( + target: RenderTarget, + op: BinOp, + algebra_field: Option, +) -> Option { { let ops = target_operators(target); -let op_matching = Rc::new({ let mut __result = Vec::new(); for spec in ops.iter().cloned() { if match spec.binop.clone() { - Some(b) => (b.clone() == op.clone()), - None => false, -} { __result.push(spec); } } __result }); -let specific = match algebra_field { - Some(af) => Rc::new({ let mut __result = Vec::new(); for spec in op_matching.clone().iter().cloned() { if match spec.algebra_field.clone() { - Some(sf) => (sf.clone() == af.clone()), - _ => false, -} { __result.push(spec); } } __result }).first().cloned(), - None => None, -}; -let result = match specific.clone() { - Some(_) => specific.clone(), - None => Rc::new({ let mut __result = Vec::new(); for spec in op_matching.clone().iter().cloned() { if (spec.algebra_field.clone() == None) { __result.push(spec); } } __result }).first().cloned(), -}; -match result { - Some(spec) => Some(spec.symbol.clone()), - None => None, -} -} + let op_matching = Rc::new({ + let mut __result = Vec::new(); + for spec in ops.iter().cloned() { + if match spec.binop.clone() { + Some(b) => (b.clone() == op.clone()), + None => false, + } { + __result.push(spec); + } + } + __result + }); + let specific = match algebra_field { + Some(af) => Rc::new({ + let mut __result = Vec::new(); + for spec in op_matching.clone().iter().cloned() { + if match spec.algebra_field.clone() { + Some(sf) => (sf.clone() == af.clone()), + _ => false, + } { + __result.push(spec); + } + } + __result + }) + .first() + .cloned(), + None => None, + }; + let result = match specific.clone() { + Some(_) => specific.clone(), + None => Rc::new({ + let mut __result = Vec::new(); + for spec in op_matching.clone().iter().cloned() { + if (spec.algebra_field.clone() == None) { + __result.push(spec); + } + } + __result + }) + .first() + .cloned(), + }; + match result { + Some(spec) => Some(spec.symbol.clone()), + None => None, + } + } } pub fn is_string_like(target: RenderTarget, name: String) -> bool { match target { - RenderTarget::Rust => { let mut __found = false; for t in rust_string_types().iter().cloned() { if (t.clone().as_str() == name.clone().as_str()) { __found = true; break; } } __found }, - RenderTarget::Go => { let mut __found = false; for t in go_string_types().iter().cloned() { if (t.clone().as_str() == name.clone().as_str()) { __found = true; break; } } __found }, - RenderTarget::Python => { let mut __found = false; for t in python_string_types().iter().cloned() { if (t.clone().as_str() == name.clone().as_str()) { __found = true; break; } } __found }, - RenderTarget::Dag => false, -} + RenderTarget::Rust => { + let mut __found = false; + for t in rust_string_types().iter().cloned() { + if (t.clone().as_str() == name.clone().as_str()) { + __found = true; + break; + } + } + __found + } + RenderTarget::Go => { + let mut __found = false; + for t in go_string_types().iter().cloned() { + if (t.clone().as_str() == name.clone().as_str()) { + __found = true; + break; + } + } + __found + } + RenderTarget::Python => { + let mut __found = false; + for t in python_string_types().iter().cloned() { + if (t.clone().as_str() == name.clone().as_str()) { + __found = true; + break; + } + } + __found + } + RenderTarget::Dag => false, + } } pub fn scaffold_for_target(target: RenderTarget) -> Rc { @@ -1190,12 +1316,14 @@ pub fn sharing_for_target(target: RenderTarget) -> Rc { } pub fn expression_semantics_for_target(target: RenderTarget) -> Rc { - language_spec_for_target(target).expression_semantics.clone() + language_spec_for_target(target) + .expression_semantics + .clone() } pub fn wrap_shared_type(target: RenderTarget, inner: String) -> String { { let tmpl = sharing_for_target(target).wrap_template.clone(); -v2_rt::replace(tmpl, "{0}".to_string(), inner) -} + v2_rt::replace(tmpl, "{0}".to_string(), inner) + } } diff --git a/src/v2/stage0/src/v2_compiler_normalize.rs b/src/v2/stage0/src/v2_compiler_normalize.rs index 165dbb3cf6f..a3adf7bac7f 100644 --- a/src/v2/stage0/src/v2_compiler_normalize.rs +++ b/src/v2/stage0/src/v2_compiler_normalize.rs @@ -1,18 +1,21 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.normalize -use std::collections::HashMap; -use std::rc::Rc; +pub use crate::std_types::container_expected_arity; +pub use crate::v2_compiler_resolve::{ModuleGraph, ResolvedModule}; use crate::v2_rt; -use crate::NonEmptyVec; +use crate::v2_std_core::CompilerDiagnostic::ArityMismatch; +use crate::v2_std_core::Connective::NoConnective; +use crate::v2_std_core::ExprData::NoExprData; +use crate::v2_std_core::InferredNode::{CompilerError, Resolved}; +pub use crate::v2_std_core::{ + authored_name_at, make_error_node, module_items, CompilerDiagnostic, Connective, ErrorNode, + ExprData, InferredNode, NewlineIndex, Node, +}; use crate::NonEmptyBTreeSet; -pub use crate::v2_std_core::{Node, ErrorNode, NewlineIndex, InferredNode, ExprData, make_error_node, module_items, authored_name_at, Connective, CompilerDiagnostic}; -use crate::v2_std_core::InferredNode::{Resolved, CompilerError}; -use crate::v2_std_core::ExprData::{NoExprData}; -use crate::v2_std_core::Connective::{NoConnective}; -use crate::v2_std_core::CompilerDiagnostic::{ArityMismatch}; -pub use crate::v2_compiler_resolve::{ModuleGraph, ResolvedModule}; -pub use crate::std_types::{container_expected_arity}; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] pub struct NormalizeResult { @@ -20,72 +23,174 @@ pub struct NormalizeResult { pub diagnostics: Rc>>, } -pub fn check_bare_containers(n: &Rc, module_name: &String, source_indices: &Rc>>) -> Rc>> { +pub fn check_bare_containers( + n: &Rc, + module_name: &String, + source_indices: &Rc>>, +) -> Rc>> { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - { - let has_structure = ((match n.body.clone() { - Some(_) => true, - None => false, -} || ((n.uses.clone().len() as i64) > 0)) || ((n.properties.clone().len() as i64) > 0)); -let is_expr = match (*n.expr_data.clone()).clone() { - ExprData::NoExprData => false, - _ => true, -}; -let nname = authored_name_at(source_indices.clone(), &n); -let self_diags = if is_expr { - Rc::new(vec![]) - } else { - match container_expected_arity(nname.clone()) { - Some(expected) => if (((((n.children.clone().len() as i64) == 0) && ((n.params.clone().len() as i64) == 0)) && (n.connective.clone() == Connective::NoConnective)) && !has_structure) { - Rc::new(vec![make_error_node(Rc::new(CompilerDiagnostic::ArityMismatch { - name: nname.clone(), - expected: expected.clone(), - got: 0, - span: n.span.clone(), -}), module_name.clone())]) - } else { - Rc::new(vec![]) + let has_structure = ((match n.body.clone() { + Some(_) => true, + None => false, + } || ((n.uses.clone().len() as i64) > 0)) + || ((n.properties.clone().len() as i64) > 0)); + let is_expr = match (*n.expr_data.clone()).clone() { + ExprData::NoExprData => false, + _ => true, + }; + let nname = authored_name_at(source_indices.clone(), &n); + let self_diags = if is_expr { + Rc::new(vec![]) + } else { + match container_expected_arity(nname.clone()) { + Some(expected) => { + if (((((n.children.clone().len() as i64) == 0) + && ((n.params.clone().len() as i64) == 0)) + && (n.connective.clone() == Connective::NoConnective)) + && !has_structure) + { + Rc::new(vec![make_error_node( + Rc::new(CompilerDiagnostic::ArityMismatch { + name: nname.clone(), + expected: expected.clone(), + got: 0, + span: n.span.clone(), + }), + module_name.clone(), + )]) + } else { + Rc::new(vec![]) + } + } + None => Rc::new(vec![]), + } + }; + let child_diags = Rc::new({ + let mut __result = Vec::new(); + for c in n.children.clone().iter().cloned() { + __result.extend( + (*check_bare_containers(&c, &module_name, &source_indices)) + .iter() + .cloned(), + ); + } + __result + }); + let param_diags = Rc::new({ + let mut __result = Vec::new(); + for p in n.params.clone().iter().cloned() { + __result.extend( + (*check_bare_containers(&p, &module_name, &source_indices)) + .iter() + .cloned(), + ); + } + __result + }); + let type_ann_diags = match n.type_annotation.clone() { + Some(ta) => check_bare_containers(&ta, &module_name, &source_indices), + None => Rc::new(vec![]), + }; + let body_diags = match n.body.clone() { + Some(b) => check_bare_containers(&b, &module_name, &source_indices), + None => Rc::new(vec![]), + }; + let inferred_diags = if ((n.params.clone().len() as i64) > 0) { + Rc::new(vec![]) + } else { + match n.inferred.clone() { + Some(inf) => match (*inf.clone()).clone() { + InferredNode::Resolved { node: rn, .. } => { + check_bare_containers(&rn, &module_name, &source_indices) + } + _ => Rc::new(vec![]), }, - None => Rc::new(vec![]), -} - }; -let child_diags = Rc::new({ let mut __result = Vec::new(); for c in n.children.clone().iter().cloned() { __result.extend((*check_bare_containers(&c, &module_name, &source_indices)).iter().cloned()); } __result }); -let param_diags = Rc::new({ let mut __result = Vec::new(); for p in n.params.clone().iter().cloned() { __result.extend((*check_bare_containers(&p, &module_name, &source_indices)).iter().cloned()); } __result }); -let type_ann_diags = match n.type_annotation.clone() { - Some(ta) => check_bare_containers(&ta, &module_name, &source_indices), - None => Rc::new(vec![]), -}; -let body_diags = match n.body.clone() { - Some(b) => check_bare_containers(&b, &module_name, &source_indices), - None => Rc::new(vec![]), -}; -let inferred_diags = if ((n.params.clone().len() as i64) > 0) { - Rc::new(vec![]) - } else { - match n.inferred.clone() { - Some(inf) => match (*inf.clone()).clone() { - InferredNode::Resolved { node: rn, .. } => check_bare_containers(&rn, &module_name, &source_indices), - _ => Rc::new(vec![]), -}, - None => Rc::new(vec![]), -} - }; -let uses_diags = Rc::new({ let mut __result = Vec::new(); for u in n.uses.clone().iter().cloned() { __result.extend((*check_bare_containers(&u, &module_name, &source_indices)).iter().cloned()); } __result }); -let prop_diags = Rc::new({ let mut __result = Vec::new(); for p in n.properties.clone().iter().cloned() { __result.extend((*check_bare_containers(&p, &module_name, &source_indices)).iter().cloned()); } __result }); -Rc::new({ let mut __result = Vec::new(); for d in Rc::new(vec![self_diags, child_diags, param_diags, type_ann_diags, inferred_diags, body_diags, uses_diags, prop_diags]).iter().cloned() { __result.extend((*d.clone()).iter().cloned()); } __result }) -} + None => Rc::new(vec![]), + } + }; + let uses_diags = Rc::new({ + let mut __result = Vec::new(); + for u in n.uses.clone().iter().cloned() { + __result.extend( + (*check_bare_containers(&u, &module_name, &source_indices)) + .iter() + .cloned(), + ); + } + __result + }); + let prop_diags = Rc::new({ + let mut __result = Vec::new(); + for p in n.properties.clone().iter().cloned() { + __result.extend( + (*check_bare_containers(&p, &module_name, &source_indices)) + .iter() + .cloned(), + ); + } + __result + }); + Rc::new({ + let mut __result = Vec::new(); + for d in Rc::new(vec![ + self_diags, + child_diags, + param_diags, + type_ann_diags, + inferred_diags, + body_diags, + uses_diags, + prop_diags, + ]) + .iter() + .cloned() + { + __result.extend((*d.clone()).iter().cloned()); + } + __result + }) }) } -pub fn normalize_graph(graph: &Rc, source_indices: Rc>>) -> Rc { +pub fn normalize_graph( + graph: &Rc, + source_indices: Rc>>, +) -> Rc { { - let diags = Rc::new({ let mut __result = Vec::new(); for m in graph.modules.clone().iter().cloned() { __result.extend((*{ - let items = module_items(m.module.clone()); -Rc::new({ let mut __result = Vec::new(); for item in items.clone().iter().cloned() { __result.extend((*check_bare_containers(&item, &authored_name_at(source_indices.clone(), &m.module.clone()), &source_indices)).iter().cloned()); } __result }) -}).iter().cloned()); } __result }); -Rc::new(NormalizeResult { - graph: graph.clone(), - diagnostics: diags, -}) -} + let diags = Rc::new({ + let mut __result = Vec::new(); + for m in graph.modules.clone().iter().cloned() { + __result.extend( + (*{ + let items = module_items(m.module.clone()); + Rc::new({ + let mut __result = Vec::new(); + for item in items.clone().iter().cloned() { + __result.extend( + (*check_bare_containers( + &item, + &authored_name_at( + source_indices.clone(), + &m.module.clone(), + ), + &source_indices, + )) + .iter() + .cloned(), + ); + } + __result + }) + }) + .iter() + .cloned(), + ); + } + __result + }); + Rc::new(NormalizeResult { + graph: graph.clone(), + diagnostics: diags, + }) + } } diff --git a/src/v2/stage0/src/v2_compiler_ownership.rs b/src/v2/stage0/src/v2_compiler_ownership.rs index 192be95c9ec..2abaab65c4d 100644 --- a/src/v2/stage0/src/v2_compiler_ownership.rs +++ b/src/v2/stage0/src/v2_compiler_ownership.rs @@ -1,19 +1,28 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.ownership -use std::collections::HashMap; -use std::rc::Rc; -use crate::v2_rt; -use crate::NonEmptyVec; -use crate::NonEmptyBTreeSet; -pub use crate::v2_std_core::{Node, ExprData, VarBindingKind, InferredNode, Cardinality, arg_value, arm_body, field_access_base, if_condition, if_then_branch, if_else_branch, let_value, let_body, lambda_body, lambda_param_names_at, match_scrutinee, match_arm_nodes, method_receiver, method_arg_nodes, foreach_collection, foreach_body, expr_var_name_at, expr_call_func_at, expr_method_name_at, field_access_field_at, authored_name_at, NewlineIndex}; -use crate::v2_std_core::ExprData::{NoExprData, ExprError, ExprLiteral, ExprVar, ExprFieldAccess, ExprCall, ExprMethodCall, ExprMatch, ExprIf, ExprLet, ExprBlock, ExprReturn, ExprLambda, ExprForEach, ExprRecordLit}; -use crate::v2_std_core::VarBindingKind::{LocalValueBinding, FunctionValueBinding}; -use crate::v2_std_core::InferredNode::{Resolved}; -use crate::v2_std_core::Cardinality::{Required}; -pub use crate::v2_compiler_emit::{to_string}; use self::EdgeKind::*; use self::OwnershipDecision::*; +pub use crate::v2_compiler_emit::to_string; +use crate::v2_rt; +use crate::v2_std_core::Cardinality::Required; +use crate::v2_std_core::ExprData::{ + ExprBlock, ExprCall, ExprError, ExprFieldAccess, ExprForEach, ExprIf, ExprLambda, ExprLet, + ExprLiteral, ExprMatch, ExprMethodCall, ExprRecordLit, ExprReturn, ExprVar, NoExprData, +}; +use crate::v2_std_core::InferredNode::Resolved; +use crate::v2_std_core::VarBindingKind::{FunctionValueBinding, LocalValueBinding}; +pub use crate::v2_std_core::{ + arg_value, arm_body, authored_name_at, expr_call_func_at, expr_method_name_at, + expr_var_name_at, field_access_base, field_access_field_at, foreach_body, foreach_collection, + if_condition, if_else_branch, if_then_branch, lambda_body, lambda_param_names_at, let_body, + let_value, match_arm_nodes, match_scrutinee, method_arg_nodes, method_receiver, Cardinality, + ExprData, InferredNode, NewlineIndex, Node, VarBindingKind, +}; +use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; #[derive(Debug, Clone, Copy, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] @@ -39,17 +48,35 @@ pub struct BindingUsage { } pub fn semantic_consumer_count(usage: Rc) -> i64 { - (Rc::new({ let mut __result = Vec::new(); for c in usage.consumers.clone().iter().cloned() { if match c.kind.clone() { - EdgeKind::Consumed => true, - _ => false, -} { __result.push(c); } } __result }).len() as i64) + (Rc::new({ + let mut __result = Vec::new(); + for c in usage.consumers.clone().iter().cloned() { + if match c.kind.clone() { + EdgeKind::Consumed => true, + _ => false, + } { + __result.push(c); + } + } + __result + }) + .len() as i64) } pub fn binding_fan_out(usage: Rc) -> i64 { - (Rc::new({ let mut __result = Vec::new(); for c in usage.consumers.clone().iter().cloned() { if match c.kind.clone() { - EdgeKind::Threaded => false, - _ => true, -} { __result.push(c); } } __result }).len() as i64) + (Rc::new({ + let mut __result = Vec::new(); + for c in usage.consumers.clone().iter().cloned() { + if match c.kind.clone() { + EdgeKind::Threaded => false, + _ => true, + } { + __result.push(c); + } + } + __result + }) + .len() as i64) } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -113,41 +140,48 @@ pub struct UsageAccum { pub fn empty_usage_accum() -> Rc { Rc::new(UsageAccum { - bindings: v2_rt::rc_empty_map::>(), - fold_call_nodes: Rc::new(vec![]), -}) + bindings: v2_rt::rc_empty_map::>(), + fold_call_nodes: Rc::new(vec![]), + }) } -pub fn record_use(accum: &Rc, name: &String, kind: EdgeKind, site: String, binding_kind: Option>, span_start: i64) -> Rc { +pub fn record_use( + accum: &Rc, + name: &String, + kind: EdgeKind, + site: String, + binding_kind: Option>, + span_start: i64, +) -> Rc { { let edge = Rc::new(EdgeClassification { - kind: kind, - site: site, - span_start: span_start, -}); -let existing = match v2_rt::map_get(&accum.bindings.clone(), name.clone()) { - Some(usage) => usage.clone(), - None => Rc::new(BindingUsage { - name: name.clone(), - binding_kind: None, - consumers: Rc::new(vec![]), -}), -}; -let effective_kind = if (existing.binding_kind.clone() != None) { + kind: kind, + site: site, + span_start: span_start, + }); + let existing = match v2_rt::map_get(&accum.bindings.clone(), name.clone()) { + Some(usage) => usage.clone(), + None => Rc::new(BindingUsage { + name: name.clone(), + binding_kind: None, + consumers: Rc::new(vec![]), + }), + }; + let effective_kind = if (existing.binding_kind.clone() != None) { existing.binding_kind.clone() } else { binding_kind }; -let updated = Rc::new(BindingUsage { - name: name.clone(), - binding_kind: effective_kind, - consumers: v2_rt::rc_list_push(existing.consumers.clone(), edge), -}); -Rc::new(UsageAccum { - bindings: v2_rt::rc_map_insert(accum.bindings.clone(), name.clone(), updated), - fold_call_nodes: accum.fold_call_nodes.clone(), -}) -} + let updated = Rc::new(BindingUsage { + name: name.clone(), + binding_kind: effective_kind, + consumers: v2_rt::rc_list_push(existing.consumers.clone(), edge), + }); + Rc::new(UsageAccum { + bindings: v2_rt::rc_map_insert(accum.bindings.clone(), name.clone(), updated), + fold_call_nodes: accum.fold_call_nodes.clone(), + }) + } } pub fn max_usage_by_fan_out(a: Rc, b: Rc) -> Rc { @@ -158,510 +192,1014 @@ pub fn max_usage_by_fan_out(a: Rc, b: Rc) -> Rc>>, key: &String, new_val: Rc) -> Rc>> { +pub fn map_usage_merge_at( + base: &Rc>>, + key: &String, + new_val: Rc, +) -> Rc>> { match v2_rt::map_get(&base, key.clone()) { - Some(existing) => v2_rt::rc_map_insert(base.clone(), key.clone(), max_usage_by_fan_out(existing.clone(), new_val)), - None => v2_rt::rc_map_insert(base.clone(), key.clone(), new_val), -} + Some(existing) => v2_rt::rc_map_insert( + base.clone(), + key.clone(), + max_usage_by_fan_out(existing.clone(), new_val), + ), + None => v2_rt::rc_map_insert(base.clone(), key.clone(), new_val), + } } -pub fn merge_branch_usages(base: &Rc, branches: &Rc>>) -> Rc { +pub fn merge_branch_usages( + base: &Rc, + branches: &Rc>>, +) -> Rc { { - let binding_merged = branches.clone().iter().cloned().fold(base.bindings.clone(), |merged: Rc>>, branch: Rc| Rc::new(v2_rt::map_values(&branch.bindings.clone())).iter().cloned().fold(merged, |acc: Rc>>, usage: Rc| map_usage_merge_at(&acc, &usage.name.clone(), usage.clone()))); -let base_fold_count = (base.fold_call_nodes.clone().len() as i64); -let branch_fold_nodes = Rc::new({ let mut __result = Vec::new(); for b in branches.clone().iter().cloned() { __result.extend((*Rc::new(b.fold_call_nodes.clone().iter().cloned().skip(base_fold_count.clone() as usize).collect::>())).iter().cloned()); } __result }); -Rc::new(UsageAccum { - bindings: binding_merged, - fold_call_nodes: v2_rt::concat(base.fold_call_nodes.clone(), branch_fold_nodes), -}) -} + let binding_merged = branches.clone().iter().cloned().fold( + base.bindings.clone(), + |merged: Rc>>, branch: Rc| { + Rc::new(v2_rt::map_values(&branch.bindings.clone())) + .iter() + .cloned() + .fold( + merged, + |acc: Rc>>, usage: Rc| { + map_usage_merge_at(&acc, &usage.name.clone(), usage.clone()) + }, + ) + }, + ); + let base_fold_count = (base.fold_call_nodes.clone().len() as i64); + let branch_fold_nodes = Rc::new({ + let mut __result = Vec::new(); + for b in branches.clone().iter().cloned() { + __result.extend( + (*Rc::new( + b.fold_call_nodes + .clone() + .iter() + .cloned() + .skip(base_fold_count.clone() as usize) + .collect::>(), + )) + .iter() + .cloned(), + ); + } + __result + }); + Rc::new(UsageAccum { + bindings: binding_merged, + fold_call_nodes: v2_rt::concat(base.fold_call_nodes.clone(), branch_fold_nodes), + }) + } } -pub fn walk_expr(accum: Rc, texpr: &Rc, in_tail: bool, si: &Rc>>) -> Rc { +pub fn walk_expr( + accum: Rc, + texpr: &Rc, + in_tail: bool, + si: &Rc>>, +) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*texpr.expr_data.clone()).clone() { - ExprData::ExprVar { binding_kind: bk, .. } => { - let n = expr_var_name_at(texpr.clone(), si.clone()); -if in_tail.clone() { - record_use(&accum, &n, EdgeKind::Consumed, "return".to_string(), bk.clone(), texpr.span.clone().start.clone()) - } else { - record_use(&accum, &n, EdgeKind::Read, "read".to_string(), bk.clone(), texpr.span.clone().start.clone()) - } -}, - ExprData::ExprLiteral { .. } => accum, - ExprData::ExprFieldAccess { .. } => { - let base_node = field_access_base(texpr.clone()); -match (*base_node.expr_data.clone()).clone() { - ExprData::ExprVar { binding_kind: bk, .. } => { - let vn = expr_var_name_at(base_node.clone(), si.clone()); -let f = field_access_field_at(texpr.clone(), si.clone()); -record_use(&accum, &vn, EdgeKind::Projected, v2_rt::concat(".".to_string(), f), bk.clone(), texpr.span.clone().start.clone()) -}, - _ => walk_expr(accum, &base_node, false, &si), -} -}, - ExprData::ExprCall { .. } => { - let fname = expr_call_func_at(texpr.clone(), si.clone()); -if (fname.as_str() == "fold".to_string().as_str()) { - { - let init_arg = Rc::new({ let mut __result = Vec::new(); for a in texpr.children.clone().iter().cloned() { if (authored_name_at(si.clone(), &a).as_str() == "init".to_string().as_str()) { __result.push(a); } } __result }).first().cloned(); -let threaded_accum = match init_arg { - Some(ia) => { - let ia_val = arg_value(&ia); -match (*ia_val.expr_data.clone()).clone() { - ExprData::ExprVar { binding_kind: bk, .. } => { - let vn = expr_var_name_at(ia_val.clone(), si.clone()); -record_use(&accum, &vn, EdgeKind::Threaded, "fold_init".to_string(), bk.clone(), ia_val.span.clone().start.clone()) -}, - _ => walk_expr(accum, &ia_val, false, &si), -} -}, - None => accum, -}; -let non_init = Rc::new({ let mut __result = Vec::new(); for a in texpr.children.clone().iter().cloned() { if (authored_name_at(si.clone(), &a).as_str() != "init".to_string().as_str()) { __result.push(a); } } __result }); -non_init.iter().cloned().fold(threaded_accum.clone(), |acc: Rc, a: Rc| walk_expr(acc, &arg_value(&a), false, &si)) -} - } else { - texpr.children.clone().iter().cloned().fold(accum, |acc: Rc, a: Rc| walk_expr(acc, &arg_value(&a), false, &si)) - } -}, - ExprData::ExprMethodCall { .. } => { - let recv = method_receiver(texpr.clone()); -let mc_args = method_arg_nodes(texpr.clone()); -let mname = expr_method_name_at(texpr.clone(), si.clone()); -if (mname.as_str() == "fold".to_string().as_str()) { - { - let recv_accum = walk_expr(accum, &recv, false, &si); -let init_arg = Rc::new({ let mut __result = Vec::new(); for a in mc_args.clone().iter().cloned() { if (authored_name_at(si.clone(), &a).as_str() == "init".to_string().as_str()) { __result.push(a); } } __result }).first().cloned(); -let threaded_accum = match init_arg { - Some(ia) => { - let ia_val = arg_value(&ia); -match (*ia_val.expr_data.clone()).clone() { - ExprData::ExprVar { binding_kind: bk, .. } => { - let vn = expr_var_name_at(ia_val.clone(), si.clone()); -record_use(&recv_accum, &vn, EdgeKind::Threaded, "fold_init".to_string(), bk.clone(), ia_val.span.clone().start.clone()) -}, - _ => walk_expr(recv_accum, &ia_val, false, &si), -} -}, - None => recv_accum, -}; -let non_init = Rc::new({ let mut __result = Vec::new(); for a in mc_args.clone().iter().cloned() { if (authored_name_at(si.clone(), &a).as_str() != "init".to_string().as_str()) { __result.push(a); } } __result }); -let walked = non_init.iter().cloned().fold(threaded_accum.clone(), |acc: Rc, a: Rc| walk_expr(acc, &arg_value(&a), false, &si)); -Rc::new(UsageAccum { - bindings: walked.bindings.clone(), - fold_call_nodes: v2_rt::rc_list_push(walked.fold_call_nodes.clone(), texpr.clone()), -}) -} - } else { - { - let recv_accum = walk_expr(accum, &recv, false, &si); -mc_args.clone().iter().cloned().fold(recv_accum, |acc: Rc, a: Rc| walk_expr(acc, &arg_value(&a), false, &si)) -} - } -}, - ExprData::ExprMatch => { - let scrut = match_scrutinee(texpr.clone()); -let arm_nodes = match_arm_nodes(texpr.clone()); -let s_accum = walk_expr(accum, &scrut, false, &si); -let branch_accums = Rc::new({ let mut __result = Vec::new(); for arm_node in arm_nodes.iter().cloned() { __result.push(walk_expr(s_accum.clone(), &arm_body(&arm_node), in_tail.clone(), &si)); } __result }); -merge_branch_usages(&s_accum, &branch_accums) -}, - ExprData::ExprIf => { - let c = if_condition(texpr.clone()); -let t = if_then_branch(texpr.clone()); -let c_accum = walk_expr(accum, &c, false, &si); -let t_accum = walk_expr(c_accum.clone(), &t, in_tail.clone(), &si); -let e_accum = match if_else_branch(texpr.clone()) { - Some(eb) => walk_expr(c_accum.clone(), &eb, in_tail.clone(), &si), - None => c_accum.clone(), -}; -merge_branch_usages(&c_accum, &Rc::new(vec![t_accum, e_accum])) -}, - ExprData::ExprLet => { - let v = let_value(texpr.clone()); -let v_accum = walk_expr(accum, &v, false, &si); -match let_body(texpr.clone()) { - Some(b) => walk_expr(v_accum, &b, in_tail.clone(), &si), - None => v_accum, -} -}, - ExprData::ExprBlock => { - let ss = texpr.children.clone(); -let ss_count = (ss.clone().len() as i64); -if (ss_count.clone() == 0) { - accum - } else { - { - let init_accum = Rc::new({ let mut __result = Vec::new(); for p in Rc::new(ss.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { if (p.0.clone() < (ss_count.clone() - 1)) { __result.push(p); } } __result }).iter().cloned().fold(accum, |acc: Rc, p: (i64, Rc)| walk_expr(acc, &p.1.clone(), false, &si)); -match ss.clone().last().cloned() { - Some(last_expr) => walk_expr(init_accum, &last_expr, in_tail.clone(), &si), - None => init_accum, -} -} - } -}, - ExprData::ExprReturn => texpr.children.clone().iter().cloned().fold(accum, |acc: Rc, child: Rc| walk_expr(acc, &child, true, &si)), - ExprData::ExprLambda => { - let body = lambda_body(texpr.clone()); -let inner = walk_expr(empty_usage_accum(), &body, false, &si); -let binding_merged = Rc::new(v2_rt::map_values(&inner.bindings.clone())).iter().cloned().fold(accum, |acc: Rc, usage: Rc| { - let a1 = record_use(&acc, &usage.name.clone(), EdgeKind::Read, "lambda-capture".to_string(), None, 0); -record_use(&a1, &usage.name.clone(), EdgeKind::Read, "lambda-capture".to_string(), None, 0) -}); -Rc::new(UsageAccum { - bindings: binding_merged.bindings.clone(), - fold_call_nodes: v2_rt::concat(binding_merged.fold_call_nodes.clone(), inner.fold_call_nodes.clone()), -}) -}, - ExprData::ExprForEach => { - let coll = foreach_collection(texpr.clone()); -let coll_accum = walk_expr(accum, &coll, false, &si); -let body = foreach_body(texpr.clone()); -let inner = walk_expr(empty_usage_accum(), &body, false, &si); -let binding_merged = Rc::new(v2_rt::map_values(&inner.bindings.clone())).iter().cloned().fold(coll_accum.clone(), |acc: Rc, usage: Rc| { - let a1 = record_use(&acc, &usage.name.clone(), EdgeKind::Read, "foreach-capture".to_string(), None, 0); -record_use(&a1, &usage.name.clone(), EdgeKind::Read, "foreach-capture".to_string(), None, 0) -}); -Rc::new(UsageAccum { - bindings: binding_merged.bindings.clone(), - fold_call_nodes: v2_rt::concat(binding_merged.fold_call_nodes.clone(), inner.fold_call_nodes.clone()), -}) -}, - _ => texpr.children.clone().iter().cloned().fold(accum, |acc: Rc, child: Rc| walk_expr(acc, &child, false, &si)), -} + ExprData::ExprVar { + binding_kind: bk, .. + } => { + let n = expr_var_name_at(texpr.clone(), si.clone()); + if in_tail.clone() { + record_use( + &accum, + &n, + EdgeKind::Consumed, + "return".to_string(), + bk.clone(), + texpr.span.clone().start.clone(), + ) + } else { + record_use( + &accum, + &n, + EdgeKind::Read, + "read".to_string(), + bk.clone(), + texpr.span.clone().start.clone(), + ) + } + } + ExprData::ExprLiteral { .. } => accum, + ExprData::ExprFieldAccess { .. } => { + let base_node = field_access_base(texpr.clone()); + match (*base_node.expr_data.clone()).clone() { + ExprData::ExprVar { + binding_kind: bk, .. + } => { + let vn = expr_var_name_at(base_node.clone(), si.clone()); + let f = field_access_field_at(texpr.clone(), si.clone()); + record_use( + &accum, + &vn, + EdgeKind::Projected, + v2_rt::concat(".".to_string(), f), + bk.clone(), + texpr.span.clone().start.clone(), + ) + } + _ => walk_expr(accum, &base_node, false, &si), + } + } + ExprData::ExprCall { .. } => { + let fname = expr_call_func_at(texpr.clone(), si.clone()); + if (fname.as_str() == "fold".to_string().as_str()) { + { + let init_arg = Rc::new({ + let mut __result = Vec::new(); + for a in texpr.children.clone().iter().cloned() { + if (authored_name_at(si.clone(), &a).as_str() + == "init".to_string().as_str()) + { + __result.push(a); + } + } + __result + }) + .first() + .cloned(); + let threaded_accum = match init_arg { + Some(ia) => { + let ia_val = arg_value(&ia); + match (*ia_val.expr_data.clone()).clone() { + ExprData::ExprVar { + binding_kind: bk, .. + } => { + let vn = expr_var_name_at(ia_val.clone(), si.clone()); + record_use( + &accum, + &vn, + EdgeKind::Threaded, + "fold_init".to_string(), + bk.clone(), + ia_val.span.clone().start.clone(), + ) + } + _ => walk_expr(accum, &ia_val, false, &si), + } + } + None => accum, + }; + let non_init = Rc::new({ + let mut __result = Vec::new(); + for a in texpr.children.clone().iter().cloned() { + if (authored_name_at(si.clone(), &a).as_str() + != "init".to_string().as_str()) + { + __result.push(a); + } + } + __result + }); + non_init.iter().cloned().fold( + threaded_accum.clone(), + |acc: Rc, a: Rc| { + walk_expr(acc, &arg_value(&a), false, &si) + }, + ) + } + } else { + texpr.children.clone().iter().cloned().fold( + accum, + |acc: Rc, a: Rc| { + walk_expr(acc, &arg_value(&a), false, &si) + }, + ) + } + } + ExprData::ExprMethodCall { .. } => { + let recv = method_receiver(texpr.clone()); + let mc_args = method_arg_nodes(texpr.clone()); + let mname = expr_method_name_at(texpr.clone(), si.clone()); + if (mname.as_str() == "fold".to_string().as_str()) { + { + let recv_accum = walk_expr(accum, &recv, false, &si); + let init_arg = Rc::new({ + let mut __result = Vec::new(); + for a in mc_args.clone().iter().cloned() { + if (authored_name_at(si.clone(), &a).as_str() + == "init".to_string().as_str()) + { + __result.push(a); + } + } + __result + }) + .first() + .cloned(); + let threaded_accum = match init_arg { + Some(ia) => { + let ia_val = arg_value(&ia); + match (*ia_val.expr_data.clone()).clone() { + ExprData::ExprVar { + binding_kind: bk, .. + } => { + let vn = expr_var_name_at(ia_val.clone(), si.clone()); + record_use( + &recv_accum, + &vn, + EdgeKind::Threaded, + "fold_init".to_string(), + bk.clone(), + ia_val.span.clone().start.clone(), + ) + } + _ => walk_expr(recv_accum, &ia_val, false, &si), + } + } + None => recv_accum, + }; + let non_init = Rc::new({ + let mut __result = Vec::new(); + for a in mc_args.clone().iter().cloned() { + if (authored_name_at(si.clone(), &a).as_str() + != "init".to_string().as_str()) + { + __result.push(a); + } + } + __result + }); + let walked = non_init.iter().cloned().fold( + threaded_accum.clone(), + |acc: Rc, a: Rc| { + walk_expr(acc, &arg_value(&a), false, &si) + }, + ); + Rc::new(UsageAccum { + bindings: walked.bindings.clone(), + fold_call_nodes: v2_rt::rc_list_push( + walked.fold_call_nodes.clone(), + texpr.clone(), + ), + }) + } + } else { + { + let recv_accum = walk_expr(accum, &recv, false, &si); + mc_args.clone().iter().cloned().fold( + recv_accum, + |acc: Rc, a: Rc| { + walk_expr(acc, &arg_value(&a), false, &si) + }, + ) + } + } + } + ExprData::ExprMatch => { + let scrut = match_scrutinee(texpr.clone()); + let arm_nodes = match_arm_nodes(texpr.clone()); + let s_accum = walk_expr(accum, &scrut, false, &si); + let branch_accums = Rc::new({ + let mut __result = Vec::new(); + for arm_node in arm_nodes.iter().cloned() { + __result.push(walk_expr( + s_accum.clone(), + &arm_body(&arm_node), + in_tail.clone(), + &si, + )); + } + __result + }); + merge_branch_usages(&s_accum, &branch_accums) + } + ExprData::ExprIf => { + let c = if_condition(texpr.clone()); + let t = if_then_branch(texpr.clone()); + let c_accum = walk_expr(accum, &c, false, &si); + let t_accum = walk_expr(c_accum.clone(), &t, in_tail.clone(), &si); + let e_accum = match if_else_branch(texpr.clone()) { + Some(eb) => walk_expr(c_accum.clone(), &eb, in_tail.clone(), &si), + None => c_accum.clone(), + }; + merge_branch_usages(&c_accum, &Rc::new(vec![t_accum, e_accum])) + } + ExprData::ExprLet => { + let v = let_value(texpr.clone()); + let v_accum = walk_expr(accum, &v, false, &si); + match let_body(texpr.clone()) { + Some(b) => walk_expr(v_accum, &b, in_tail.clone(), &si), + None => v_accum, + } + } + ExprData::ExprBlock => { + let ss = texpr.children.clone(); + let ss_count = (ss.clone().len() as i64); + if (ss_count.clone() == 0) { + accum + } else { + { + let init_accum = Rc::new({ + let mut __result = Vec::new(); + for p in Rc::new( + ss.clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + { + if (p.0.clone() < (ss_count.clone() - 1)) { + __result.push(p); + } + } + __result + }) + .iter() + .cloned() + .fold( + accum, + |acc: Rc, p: (i64, Rc)| { + walk_expr(acc, &p.1.clone(), false, &si) + }, + ); + match ss.clone().last().cloned() { + Some(last_expr) => { + walk_expr(init_accum, &last_expr, in_tail.clone(), &si) + } + None => init_accum, + } + } + } + } + ExprData::ExprReturn => texpr + .children + .clone() + .iter() + .cloned() + .fold(accum, |acc: Rc, child: Rc| { + walk_expr(acc, &child, true, &si) + }), + ExprData::ExprLambda => { + let body = lambda_body(texpr.clone()); + let inner = walk_expr(empty_usage_accum(), &body, false, &si); + let binding_merged = Rc::new(v2_rt::map_values(&inner.bindings.clone())) + .iter() + .cloned() + .fold(accum, |acc: Rc, usage: Rc| { + let a1 = record_use( + &acc, + &usage.name.clone(), + EdgeKind::Read, + "lambda-capture".to_string(), + None, + 0, + ); + record_use( + &a1, + &usage.name.clone(), + EdgeKind::Read, + "lambda-capture".to_string(), + None, + 0, + ) + }); + Rc::new(UsageAccum { + bindings: binding_merged.bindings.clone(), + fold_call_nodes: v2_rt::concat( + binding_merged.fold_call_nodes.clone(), + inner.fold_call_nodes.clone(), + ), + }) + } + ExprData::ExprForEach => { + let coll = foreach_collection(texpr.clone()); + let coll_accum = walk_expr(accum, &coll, false, &si); + let body = foreach_body(texpr.clone()); + let inner = walk_expr(empty_usage_accum(), &body, false, &si); + let binding_merged = Rc::new(v2_rt::map_values(&inner.bindings.clone())) + .iter() + .cloned() + .fold( + coll_accum.clone(), + |acc: Rc, usage: Rc| { + let a1 = record_use( + &acc, + &usage.name.clone(), + EdgeKind::Read, + "foreach-capture".to_string(), + None, + 0, + ); + record_use( + &a1, + &usage.name.clone(), + EdgeKind::Read, + "foreach-capture".to_string(), + None, + 0, + ) + }, + ); + Rc::new(UsageAccum { + bindings: binding_merged.bindings.clone(), + fold_call_nodes: v2_rt::concat( + binding_merged.fold_call_nodes.clone(), + inner.fold_call_nodes.clone(), + ), + }) + } + _ => texpr + .children + .clone() + .iter() + .cloned() + .fold(accum, |acc: Rc, child: Rc| { + walk_expr(acc, &child, false, &si) + }), + } }) } pub fn make_decision(usage: &Rc) -> Rc { { let sc = semantic_consumer_count(usage.clone()); -if (sc.clone() == 1) { + if (sc.clone() == 1) { { - let consumed_sites = Rc::new({ let mut __result = Vec::new(); for c in usage.consumers.clone().iter().cloned() { if match c.kind.clone() { - EdgeKind::Consumed => true, - _ => false, -} { __result.push(c); } } __result }); -let site = match consumed_sites.first().cloned() { - Some(c) => c.site.clone(), - None => "unknown".to_string(), -}; -Rc::new(OwnershipDecision::SoleOwner { - binding: usage.name.clone(), - site: site, -}) -} + let consumed_sites = Rc::new({ + let mut __result = Vec::new(); + for c in usage.consumers.clone().iter().cloned() { + if match c.kind.clone() { + EdgeKind::Consumed => true, + _ => false, + } { + __result.push(c); + } + } + __result + }); + let site = match consumed_sites.first().cloned() { + Some(c) => c.site.clone(), + None => "unknown".to_string(), + }; + Rc::new(OwnershipDecision::SoleOwner { + binding: usage.name.clone(), + site: site, + }) + } } else { if (sc.clone() > 1) { { - let sites = Rc::new({ let mut __result = Vec::new(); for c in Rc::new({ let mut __result = Vec::new(); for c in usage.consumers.clone().iter().cloned() { if match c.kind.clone() { - EdgeKind::Consumed => true, - _ => false, -} { __result.push(c); } } __result }).iter().cloned() { __result.push(c.site.clone()); } __result }); -Rc::new(OwnershipDecision::SharedError { - binding: usage.name.clone(), - consumer_count: sc.clone(), - sites: sites, -}) -} + let sites = Rc::new({ + let mut __result = Vec::new(); + for c in Rc::new({ + let mut __result = Vec::new(); + for c in usage.consumers.clone().iter().cloned() { + if match c.kind.clone() { + EdgeKind::Consumed => true, + _ => false, + } { + __result.push(c); + } + } + __result + }) + .iter() + .cloned() + { + __result.push(c.site.clone()); + } + __result + }); + Rc::new(OwnershipDecision::SharedError { + binding: usage.name.clone(), + consumer_count: sc.clone(), + sites: sites, + }) + } } else { Rc::new(OwnershipDecision::Unclassified { - binding: usage.name.clone(), - reason: "no consumers found".to_string(), -}) + binding: usage.name.clone(), + reason: "no consumers found".to_string(), + }) } } -} + } } pub fn is_owned_local(kind: Option>) -> bool { match kind.as_deref().cloned() { - Some(VarBindingKind::LocalValueBinding) => true, - _ => false, -} + Some(VarBindingKind::LocalValueBinding) => true, + _ => false, + } } pub fn build_movable_set(proof: Rc) -> Rc> { - Rc::new({ let mut __result = Vec::new(); for usage in Rc::new(v2_rt::map_values(&proof.bindings.clone())).iter().cloned() { if ((binding_fan_out(usage.clone()) == 1) && is_owned_local(usage.binding_kind.clone())) { __result.push(usage); } } __result }).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, usage: Rc| v2_rt::rc_map_insert(acc, usage.name.clone(), true)) + Rc::new({ + let mut __result = Vec::new(); + for usage in Rc::new(v2_rt::map_values(&proof.bindings.clone())) + .iter() + .cloned() + { + if ((binding_fan_out(usage.clone()) == 1) && is_owned_local(usage.binding_kind.clone())) + { + __result.push(usage); + } + } + __result + }) + .iter() + .cloned() + .fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, usage: Rc| { + v2_rt::rc_map_insert(acc, usage.name.clone(), true) + }, + ) } -pub fn build_read_only_params(proof: Rc, param_names: Rc>) -> Rc> { - Rc::new({ let mut __result = Vec::new(); for usage in Rc::new(v2_rt::map_values(&proof.bindings.clone())).iter().cloned() { if (((v2_rt::map_contains_key(¶m_names, usage.name.clone()) && is_owned_local(usage.binding_kind.clone())) && (binding_fan_out(usage.clone()) > 1)) && { let mut __all = true; for c in usage.consumers.clone().iter().cloned() { if !(match c.kind.clone() { - EdgeKind::Read => true, - EdgeKind::Projected => true, - EdgeKind::Threaded => true, - _ => false, -}) { __all = false; break; } } __all }) { __result.push(usage); } } __result }).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, usage: Rc| v2_rt::rc_map_insert(acc, usage.name.clone(), true)) +pub fn build_read_only_params( + proof: Rc, + param_names: Rc>, +) -> Rc> { + Rc::new({ + let mut __result = Vec::new(); + for usage in Rc::new(v2_rt::map_values(&proof.bindings.clone())) + .iter() + .cloned() + { + if (((v2_rt::map_contains_key(¶m_names, usage.name.clone()) + && is_owned_local(usage.binding_kind.clone())) + && (binding_fan_out(usage.clone()) > 1)) + && { + let mut __all = true; + for c in usage.consumers.clone().iter().cloned() { + if !(match c.kind.clone() { + EdgeKind::Read => true, + EdgeKind::Projected => true, + EdgeKind::Threaded => true, + _ => false, + }) { + __all = false; + break; + } + } + __all + }) + { + __result.push(usage); + } + } + __result + }) + .iter() + .cloned() + .fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, usage: Rc| { + v2_rt::rc_map_insert(acc, usage.name.clone(), true) + }, + ) } -pub fn collect_callable_refs(texpr: &Rc, si: &Rc>>) -> Rc> { +pub fn collect_callable_refs( + texpr: &Rc, + si: &Rc>>, +) -> Rc> { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*texpr.expr_data.clone()).clone() { - ExprData::ExprVar { binding_kind: bk, .. } => match bk.clone().as_deref().cloned() { - Some(VarBindingKind::FunctionValueBinding) => { - let n = expr_var_name_at(texpr.clone(), si.clone()); -v2_rt::rc_map_insert(v2_rt::rc_empty_map::(), n, true) -}, - _ => v2_rt::rc_empty_map::(), -}, - ExprData::ExprLiteral { .. } => v2_rt::rc_empty_map::(), - ExprData::ExprFieldAccess { .. } => collect_callable_refs(&field_access_base(texpr.clone()), &si), - ExprData::ExprCall { .. } => texpr.children.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, a: Rc| v2_rt::rc_map_merge(acc, collect_callable_refs(&arg_value(&a), &si))), - ExprData::ExprMethodCall { .. } => { - let recv = collect_callable_refs(&method_receiver(texpr.clone()), &si); -method_arg_nodes(texpr.clone()).iter().cloned().fold(recv.clone(), |acc: Rc>, a: Rc| v2_rt::rc_map_merge(acc, collect_callable_refs(&arg_value(&a), &si))) -}, - ExprData::ExprIf => { - let cond = collect_callable_refs(&if_condition(texpr.clone()), &si); -let then_br = collect_callable_refs(&if_then_branch(texpr.clone()), &si); -let else_br = match if_else_branch(texpr.clone()) { - Some(eb) => collect_callable_refs(&eb, &si), - None => v2_rt::rc_empty_map::(), -}; -v2_rt::rc_map_merge(v2_rt::rc_map_merge(cond, then_br), else_br) -}, - ExprData::ExprMatch => { - let scrut = collect_callable_refs(&match_scrutinee(texpr.clone()), &si); -match_arm_nodes(texpr.clone()).iter().cloned().fold(scrut.clone(), |acc: Rc>, arm: Rc| v2_rt::rc_map_merge(acc, collect_callable_refs(&arm_body(&arm), &si))) -}, - ExprData::ExprLet => { - let val = collect_callable_refs(&let_value(texpr.clone()), &si); -match let_body(texpr.clone()) { - Some(lb) => v2_rt::rc_map_merge(val, collect_callable_refs(&lb, &si)), - None => val, -} -}, - ExprData::ExprBlock => texpr.children.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, child: Rc| v2_rt::rc_map_merge(acc, collect_callable_refs(&child, &si))), - ExprData::ExprReturn => match texpr.children.clone().first().cloned() { - Some(child) => collect_callable_refs(&child, &si), - None => v2_rt::rc_empty_map::(), -}, - ExprData::ExprLambda => collect_callable_refs(&lambda_body(texpr.clone()), &si), - ExprData::ExprForEach => { - let col = collect_callable_refs(&foreach_collection(texpr.clone()), &si); -v2_rt::rc_map_merge(col, collect_callable_refs(&foreach_body(texpr.clone()), &si)) -}, - ExprData::ExprRecordLit { .. } => texpr.children.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, field: Rc| v2_rt::rc_map_merge(acc, collect_callable_refs(&arg_value(&field), &si))), - _ => v2_rt::rc_empty_map::(), -} + ExprData::ExprVar { + binding_kind: bk, .. + } => match bk.clone().as_deref().cloned() { + Some(VarBindingKind::FunctionValueBinding) => { + let n = expr_var_name_at(texpr.clone(), si.clone()); + v2_rt::rc_map_insert(v2_rt::rc_empty_map::(), n, true) + } + _ => v2_rt::rc_empty_map::(), + }, + ExprData::ExprLiteral { .. } => v2_rt::rc_empty_map::(), + ExprData::ExprFieldAccess { .. } => { + collect_callable_refs(&field_access_base(texpr.clone()), &si) + } + ExprData::ExprCall { .. } => texpr.children.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, a: Rc| { + v2_rt::rc_map_merge(acc, collect_callable_refs(&arg_value(&a), &si)) + }, + ), + ExprData::ExprMethodCall { .. } => { + let recv = collect_callable_refs(&method_receiver(texpr.clone()), &si); + method_arg_nodes(texpr.clone()).iter().cloned().fold( + recv.clone(), + |acc: Rc>, a: Rc| { + v2_rt::rc_map_merge(acc, collect_callable_refs(&arg_value(&a), &si)) + }, + ) + } + ExprData::ExprIf => { + let cond = collect_callable_refs(&if_condition(texpr.clone()), &si); + let then_br = collect_callable_refs(&if_then_branch(texpr.clone()), &si); + let else_br = match if_else_branch(texpr.clone()) { + Some(eb) => collect_callable_refs(&eb, &si), + None => v2_rt::rc_empty_map::(), + }; + v2_rt::rc_map_merge(v2_rt::rc_map_merge(cond, then_br), else_br) + } + ExprData::ExprMatch => { + let scrut = collect_callable_refs(&match_scrutinee(texpr.clone()), &si); + match_arm_nodes(texpr.clone()).iter().cloned().fold( + scrut.clone(), + |acc: Rc>, arm: Rc| { + v2_rt::rc_map_merge(acc, collect_callable_refs(&arm_body(&arm), &si)) + }, + ) + } + ExprData::ExprLet => { + let val = collect_callable_refs(&let_value(texpr.clone()), &si); + match let_body(texpr.clone()) { + Some(lb) => v2_rt::rc_map_merge(val, collect_callable_refs(&lb, &si)), + None => val, + } + } + ExprData::ExprBlock => texpr.children.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, child: Rc| { + v2_rt::rc_map_merge(acc, collect_callable_refs(&child, &si)) + }, + ), + ExprData::ExprReturn => match texpr.children.clone().first().cloned() { + Some(child) => collect_callable_refs(&child, &si), + None => v2_rt::rc_empty_map::(), + }, + ExprData::ExprLambda => collect_callable_refs(&lambda_body(texpr.clone()), &si), + ExprData::ExprForEach => { + let col = collect_callable_refs(&foreach_collection(texpr.clone()), &si); + v2_rt::rc_map_merge( + col, + collect_callable_refs(&foreach_body(texpr.clone()), &si), + ) + } + ExprData::ExprRecordLit { .. } => texpr.children.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, field: Rc| { + v2_rt::rc_map_merge(acc, collect_callable_refs(&arg_value(&field), &si)) + }, + ), + _ => v2_rt::rc_empty_map::(), + } }) } pub fn fold_terminal_expr(mut body: Rc) -> Rc { loop { match (*body.expr_data.clone()).clone() { - ExprData::ExprLet => { match let_body(body.clone()) { - Some(inner) => { { - let __tco_0 = inner.clone(); -body = __tco_0; -continue; -} }, - None => { break body.clone(); }, -} }, - ExprData::ExprBlock => { match body.children.clone().last().cloned() { - Some(last_child) => { { - let __tco_0 = last_child.clone(); -body = __tco_0; -continue; -} }, - None => { break body.clone(); }, -} }, - _ => { break body.clone(); }, -} -} + ExprData::ExprLet => match let_body(body.clone()) { + Some(inner) => { + let __tco_0 = inner.clone(); + body = __tco_0; + continue; + } + None => { + break body.clone(); + } + }, + ExprData::ExprBlock => match body.children.clone().last().cloned() { + Some(last_child) => { + let __tco_0 = last_child.clone(); + body = __tco_0; + continue; + } + None => { + break body.clone(); + } + }, + _ => { + break body.clone(); + } + } + } } pub fn empty_fold_acc_use_summary() -> Rc { Rc::new(FoldAccUseSummary { - whole_acc_uses: 0, - field_moves: Rc::new(vec![]), - nested_acc_refs: false, -}) + whole_acc_uses: 0, + field_moves: Rc::new(vec![]), + nested_acc_refs: false, + }) } -pub fn merge_fold_acc_use_summaries(left: &Rc, right: &Rc) -> Rc { +pub fn merge_fold_acc_use_summaries( + left: &Rc, + right: &Rc, +) -> Rc { Rc::new(FoldAccUseSummary { - whole_acc_uses: (left.whole_acc_uses.clone() + right.whole_acc_uses.clone()), - field_moves: v2_rt::concat(left.field_moves.clone(), right.field_moves.clone()), - nested_acc_refs: (left.nested_acc_refs.clone() || right.nested_acc_refs.clone()), -}) + whole_acc_uses: (left.whole_acc_uses.clone() + right.whole_acc_uses.clone()), + field_moves: v2_rt::concat(left.field_moves.clone(), right.field_moves.clone()), + nested_acc_refs: (left.nested_acc_refs.clone() || right.nested_acc_refs.clone()), + }) } -pub fn summarize_fold_acc_uses(node: &Rc, acc_name: &String, si: &Rc>>, inside_nested: bool) -> Rc { +pub fn summarize_fold_acc_uses( + node: &Rc, + acc_name: &String, + si: &Rc>>, + inside_nested: bool, +) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*node.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => if (expr_var_name_at(node.clone(), si.clone()).as_str() == acc_name.clone().as_str()) { - if inside_nested.clone() { - Rc::new(FoldAccUseSummary { - whole_acc_uses: 0, - field_moves: Rc::new(vec![]), - nested_acc_refs: true, -}) - } else { - Rc::new(FoldAccUseSummary { - whole_acc_uses: 1, - field_moves: Rc::new(vec![]), - nested_acc_refs: false, -}) + ExprData::ExprVar { .. } => { + if (expr_var_name_at(node.clone(), si.clone()).as_str() + == acc_name.clone().as_str()) + { + if inside_nested.clone() { + Rc::new(FoldAccUseSummary { + whole_acc_uses: 0, + field_moves: Rc::new(vec![]), + nested_acc_refs: true, + }) + } else { + Rc::new(FoldAccUseSummary { + whole_acc_uses: 1, + field_moves: Rc::new(vec![]), + nested_acc_refs: false, + }) + } + } else { + empty_fold_acc_use_summary() + } } - } else { - empty_fold_acc_use_summary() - }, - ExprData::ExprFieldAccess { .. } => { - let base = field_access_base(node.clone()); -let is_direct = match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => (expr_var_name_at(base.clone(), si.clone()).as_str() == acc_name.clone().as_str()), - _ => false, -}; -if is_direct { - if inside_nested.clone() { - Rc::new(FoldAccUseSummary { - whole_acc_uses: 0, - field_moves: Rc::new(vec![]), - nested_acc_refs: true, -}) + ExprData::ExprFieldAccess { .. } => { + let base = field_access_base(node.clone()); + let is_direct = match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + (expr_var_name_at(base.clone(), si.clone()).as_str() + == acc_name.clone().as_str()) + } + _ => false, + }; + if is_direct { + if inside_nested.clone() { + Rc::new(FoldAccUseSummary { + whole_acc_uses: 0, + field_moves: Rc::new(vec![]), + nested_acc_refs: true, + }) + } else { + Rc::new(FoldAccUseSummary { + whole_acc_uses: 0, + field_moves: Rc::new(vec![field_access_field_at( + node.clone(), + si.clone(), + )]), + nested_acc_refs: false, + }) + } } else { + node.children.clone().iter().cloned().fold( + empty_fold_acc_use_summary(), + |acc: Rc, child: Rc| { + merge_fold_acc_use_summaries( + &acc, + &summarize_fold_acc_uses( + &child, + &acc_name, + &si, + inside_nested.clone(), + ), + ) + }, + ) + } + } + ExprData::ExprLambda => { + let body_summary = + summarize_fold_acc_uses(&lambda_body(node.clone()), &acc_name, &si, true); + if (((body_summary.whole_acc_uses.clone() > 0) + || ((body_summary.field_moves.clone().len() as i64) > 0)) + || body_summary.nested_acc_refs.clone()) + { Rc::new(FoldAccUseSummary { - whole_acc_uses: 0, - field_moves: Rc::new(vec![field_access_field_at(node.clone(), si.clone())]), - nested_acc_refs: false, -}) + whole_acc_uses: 0, + field_moves: Rc::new(vec![]), + nested_acc_refs: true, + }) + } else { + empty_fold_acc_use_summary() } - } else { - node.children.clone().iter().cloned().fold(empty_fold_acc_use_summary(), |acc: Rc, child: Rc| merge_fold_acc_use_summaries(&acc, &summarize_fold_acc_uses(&child, &acc_name, &si, inside_nested.clone()))) - } -}, - ExprData::ExprLambda => { - let body_summary = summarize_fold_acc_uses(&lambda_body(node.clone()), &acc_name, &si, true); -if (((body_summary.whole_acc_uses.clone() > 0) || ((body_summary.field_moves.clone().len() as i64) > 0)) || body_summary.nested_acc_refs.clone()) { - Rc::new(FoldAccUseSummary { - whole_acc_uses: 0, - field_moves: Rc::new(vec![]), - nested_acc_refs: true, -}) - } else { - empty_fold_acc_use_summary() - } -}, - ExprData::ExprForEach => { - let coll_summary = summarize_fold_acc_uses(&foreach_collection(node.clone()), &acc_name, &si, inside_nested.clone()); -let body_summary = summarize_fold_acc_uses(&foreach_body(node.clone()), &acc_name, &si, true); -let nested_summary = if (((body_summary.whole_acc_uses.clone() > 0) || ((body_summary.field_moves.clone().len() as i64) > 0)) || body_summary.nested_acc_refs.clone()) { - Rc::new(FoldAccUseSummary { - whole_acc_uses: 0, - field_moves: Rc::new(vec![]), - nested_acc_refs: true, -}) - } else { - empty_fold_acc_use_summary() - }; -merge_fold_acc_use_summaries(&coll_summary, &nested_summary) -}, - _ => node.children.clone().iter().cloned().fold(empty_fold_acc_use_summary(), |acc: Rc, child: Rc| merge_fold_acc_use_summaries(&acc, &summarize_fold_acc_uses(&child, &acc_name, &si, inside_nested.clone()))), -} + } + ExprData::ExprForEach => { + let coll_summary = summarize_fold_acc_uses( + &foreach_collection(node.clone()), + &acc_name, + &si, + inside_nested.clone(), + ); + let body_summary = + summarize_fold_acc_uses(&foreach_body(node.clone()), &acc_name, &si, true); + let nested_summary = if (((body_summary.whole_acc_uses.clone() > 0) + || ((body_summary.field_moves.clone().len() as i64) > 0)) + || body_summary.nested_acc_refs.clone()) + { + Rc::new(FoldAccUseSummary { + whole_acc_uses: 0, + field_moves: Rc::new(vec![]), + nested_acc_refs: true, + }) + } else { + empty_fold_acc_use_summary() + }; + merge_fold_acc_use_summaries(&coll_summary, &nested_summary) + } + _ => node.children.clone().iter().cloned().fold( + empty_fold_acc_use_summary(), + |acc: Rc, child: Rc| { + merge_fold_acc_use_summaries( + &acc, + &summarize_fold_acc_uses(&child, &acc_name, &si, inside_nested.clone()), + ) + }, + ), + } }) } -pub fn fold_lambda_acc_use_summary(lambda_node: &Rc, acc_name: String, si: Rc>>) -> Rc { +pub fn fold_lambda_acc_use_summary( + lambda_node: &Rc, + acc_name: String, + si: Rc>>, +) -> Rc { match (*lambda_node.expr_data.clone()).clone() { - ExprData::ExprLambda => summarize_fold_acc_uses(&lambda_body(lambda_node.clone()), &acc_name, &si, false), - _ => empty_fold_acc_use_summary(), -} + ExprData::ExprLambda => { + summarize_fold_acc_uses(&lambda_body(lambda_node.clone()), &acc_name, &si, false) + } + _ => empty_fold_acc_use_summary(), + } } -pub fn fold_body_constructs_acc_struct(lambda_node: &Rc, acc_type_name: String, si: Rc>>) -> bool { +pub fn fold_body_constructs_acc_struct( + lambda_node: &Rc, + acc_type_name: String, + si: Rc>>, +) -> bool { match (*lambda_node.expr_data.clone()).clone() { - ExprData::ExprLambda => { - let body = lambda_body(lambda_node.clone()); -let terminal = fold_terminal_expr(body); -match (*terminal.expr_data.clone()).clone() { - ExprData::ExprRecordLit { .. } => (authored_name_at(si, &terminal).as_str() == acc_type_name.as_str()), - _ => false, -} -}, - _ => false, -} + ExprData::ExprLambda => { + let body = lambda_body(lambda_node.clone()); + let terminal = fold_terminal_expr(body); + match (*terminal.expr_data.clone()).clone() { + ExprData::ExprRecordLit { .. } => { + (authored_name_at(si, &terminal).as_str() == acc_type_name.as_str()) + } + _ => false, + } + } + _ => false, + } } -pub fn fold_body_safe_field_moves(lambda_node: Rc, acc_name: String, si: Rc>>) -> bool { +pub fn fold_body_safe_field_moves( + lambda_node: Rc, + acc_name: String, + si: Rc>>, +) -> bool { { let summary = fold_lambda_acc_use_summary(&lambda_node, acc_name, si); -let deduped = summary.field_moves.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |seen: Rc>, field: String| v2_rt::rc_map_insert(seen, field.clone(), true)); -((!summary.nested_acc_refs.clone() && (summary.whole_acc_uses.clone() == 0)) && ((Rc::new(v2_rt::map_keys(&deduped)).len() as i64) == (summary.field_moves.clone().len() as i64))) -} + let deduped = summary.field_moves.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |seen: Rc>, field: String| { + v2_rt::rc_map_insert(seen, field.clone(), true) + }, + ); + ((!summary.nested_acc_refs.clone() && (summary.whole_acc_uses.clone() == 0)) + && ((Rc::new(v2_rt::map_keys(&deduped)).len() as i64) + == (summary.field_moves.clone().len() as i64))) + } } -pub fn fold_body_consumes_acc_once(lambda_node: Rc, acc_name: String, si: Rc>>) -> bool { +pub fn fold_body_consumes_acc_once( + lambda_node: Rc, + acc_name: String, + si: Rc>>, +) -> bool { { let summary = fold_lambda_acc_use_summary(&lambda_node, acc_name, si); -((!summary.nested_acc_refs.clone() && (summary.whole_acc_uses.clone() == 1)) && ((summary.field_moves.clone().len() as i64) == 0)) -} + ((!summary.nested_acc_refs.clone() && (summary.whole_acc_uses.clone() == 1)) + && ((summary.field_moves.clone().len() as i64) == 0)) + } } -pub fn analyze_single_fold(method_call: &Rc, si: &Rc>>) -> Rc { +pub fn analyze_single_fold( + method_call: &Rc, + si: &Rc>>, +) -> Rc { { let args = method_arg_nodes(method_call.clone()); -let init_arg_node = match args.clone().first().cloned() { - Some(a) => arg_value(&a), - None => method_call.clone(), -}; -let fold_lambda_node = match args.clone().get(1 as usize).cloned() { - Some(a) => arg_value(&a), - None => method_call.clone(), -}; -let acc_param_name = match (*fold_lambda_node.expr_data.clone()).clone() { - ExprData::ExprLambda => match lambda_param_names_at(fold_lambda_node.clone(), si.clone()).first().cloned() { - Some(n) => n.clone(), - None => "".to_string(), -}, - _ => "".to_string(), -}; -let acc_type_name = match init_arg_node.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: type_node, .. }) => authored_name_at(si.clone(), &type_node), - _ => "".to_string(), -}; -let cond_required = match init_arg_node.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: type_node, .. }) => (type_node.return_cardinality.clone() == Cardinality::Required), - _ => false, -}; -let cond_struct = fold_body_constructs_acc_struct(&fold_lambda_node, acc_type_name.clone(), si.clone()); -let cond_whole_acc = fold_body_consumes_acc_once(fold_lambda_node.clone(), acc_param_name.clone(), si.clone()); -let cond_safe = fold_body_safe_field_moves(fold_lambda_node.clone(), acc_param_name.clone(), si.clone()); -let eligible = ((cond_required && (acc_type_name.clone().as_str() != "".to_string().as_str())) && ((cond_struct.clone() && cond_safe.clone()) || cond_whole_acc.clone())); -Rc::new(FoldAccUnwrapProof { - site_key: (method_call.span.clone().start.clone()).to_string(), - acc_param_name: acc_param_name.clone(), - acc_type_name: acc_type_name.clone(), - body_constructs_acc: cond_struct.clone(), - whole_acc_single_use: cond_whole_acc.clone(), - safe_field_moves: cond_safe.clone(), - eligible: eligible, -}) -} -} - -pub fn analyze_ownership(func_name: String, params: Rc>>, body: Rc, si: &Rc>>) -> Rc { - { - let initial = params.iter().cloned().fold(empty_usage_accum(), |acc: Rc, p: Rc| { let acc = Rc::try_unwrap(acc).unwrap_or_else(|rc| (*rc).clone()); { - let p_name = authored_name_at(si.clone(), &p); -Rc::new(UsageAccum { - bindings: v2_rt::rc_map_insert(acc.bindings, p_name.clone(), Rc::new(BindingUsage { - name: p_name.clone(), - binding_kind: None, - consumers: Rc::new(vec![]), -})), - fold_call_nodes: acc.fold_call_nodes, -}) -} }); -let result = walk_expr(initial, &body, true, &si); -let binding_list = Rc::new(v2_rt::map_values(&result.bindings.clone())); -let decisions = Rc::new({ let mut __result = Vec::new(); for usage in binding_list.iter().cloned() { __result.push(make_decision(&usage)); } __result }); -let fold_proofs = Rc::new({ let mut __result = Vec::new(); for n in result.fold_call_nodes.clone().iter().cloned() { __result.push(analyze_single_fold(&n, &si)); } __result }); -Rc::new(OwnershipProof { - func_name: func_name, - bindings: result.bindings.clone(), - decisions: decisions, - fold_acc_unwrap: fold_proofs, -}) + let init_arg_node = match args.clone().first().cloned() { + Some(a) => arg_value(&a), + None => method_call.clone(), + }; + let fold_lambda_node = match args.clone().get(1 as usize).cloned() { + Some(a) => arg_value(&a), + None => method_call.clone(), + }; + let acc_param_name = match (*fold_lambda_node.expr_data.clone()).clone() { + ExprData::ExprLambda => { + match lambda_param_names_at(fold_lambda_node.clone(), si.clone()) + .first() + .cloned() + { + Some(n) => n.clone(), + None => "".to_string(), + } + } + _ => "".to_string(), + }; + let acc_type_name = match init_arg_node.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { + node: type_node, .. + }) => authored_name_at(si.clone(), &type_node), + _ => "".to_string(), + }; + let cond_required = match init_arg_node.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { + node: type_node, .. + }) => (type_node.return_cardinality.clone() == Cardinality::Required), + _ => false, + }; + let cond_struct = + fold_body_constructs_acc_struct(&fold_lambda_node, acc_type_name.clone(), si.clone()); + let cond_whole_acc = fold_body_consumes_acc_once( + fold_lambda_node.clone(), + acc_param_name.clone(), + si.clone(), + ); + let cond_safe = fold_body_safe_field_moves( + fold_lambda_node.clone(), + acc_param_name.clone(), + si.clone(), + ); + let eligible = ((cond_required + && (acc_type_name.clone().as_str() != "".to_string().as_str())) + && ((cond_struct.clone() && cond_safe.clone()) || cond_whole_acc.clone())); + Rc::new(FoldAccUnwrapProof { + site_key: (method_call.span.clone().start.clone()).to_string(), + acc_param_name: acc_param_name.clone(), + acc_type_name: acc_type_name.clone(), + body_constructs_acc: cond_struct.clone(), + whole_acc_single_use: cond_whole_acc.clone(), + safe_field_moves: cond_safe.clone(), + eligible: eligible, + }) + } } + +pub fn analyze_ownership( + func_name: String, + params: Rc>>, + body: Rc, + si: &Rc>>, +) -> Rc { + { + let initial = + params + .iter() + .cloned() + .fold(empty_usage_accum(), |acc: Rc, p: Rc| { + let acc = Rc::try_unwrap(acc).unwrap_or_else(|rc| (*rc).clone()); + { + let p_name = authored_name_at(si.clone(), &p); + Rc::new(UsageAccum { + bindings: v2_rt::rc_map_insert( + acc.bindings, + p_name.clone(), + Rc::new(BindingUsage { + name: p_name.clone(), + binding_kind: None, + consumers: Rc::new(vec![]), + }), + ), + fold_call_nodes: acc.fold_call_nodes, + }) + } + }); + let result = walk_expr(initial, &body, true, &si); + let binding_list = Rc::new(v2_rt::map_values(&result.bindings.clone())); + let decisions = Rc::new({ + let mut __result = Vec::new(); + for usage in binding_list.iter().cloned() { + __result.push(make_decision(&usage)); + } + __result + }); + let fold_proofs = Rc::new({ + let mut __result = Vec::new(); + for n in result.fold_call_nodes.clone().iter().cloned() { + __result.push(analyze_single_fold(&n, &si)); + } + __result + }); + Rc::new(OwnershipProof { + func_name: func_name, + bindings: result.bindings.clone(), + decisions: decisions, + fold_acc_unwrap: fold_proofs, + }) + } } diff --git a/src/v2/stage0/src/v2_compiler_parse.rs b/src/v2/stage0/src/v2_compiler_parse.rs index 6b3c9cbe2b5..fc895df9842 100644 --- a/src/v2/stage0/src/v2_compiler_parse.rs +++ b/src/v2/stage0/src/v2_compiler_parse.rs @@ -1,35 +1,68 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.parse -use std::collections::HashMap; -use std::rc::Rc; -use crate::v2_rt; -use crate::NonEmptyVec; -use crate::NonEmptyBTreeSet; -pub use crate::v2_std_core::{module_node, import_node, Node, InferredNode, Connective, is_container_type, Cardinality, make_param_node, param_node_type_expr, param_node_default_value, make_field_node, field_node_name_at, field_node_type_expr, field_node_cardinality, field_node_default_value, field_node_from_key, make_variant_node, variant_node_name_at, variant_node_fields, leaf_node_with_span, ExprData, make_expr_node, make_named_expr_node, make_expr_error_node, expr_var_name_at, field_access_field_at, expr_call_func_at, make_arg_node, arg_name_at, arg_value, make_arm_node, make_field_init_node, make_resource_use_node, make_text_part_node, make_interp_part_node, MatchPattern, make_field_binding_node, field_binding_pattern, LiteralValue, ExprErrorKind, BinOp, UnaryOpKind, StringPart, local_transport_node, rest_transport_node, shell_transport_node, file_transport_node, transport_url_key, transport_path_key, transport_method_key, transport_path_template_key, transport_query_key, transport_body_key, transport_stdin_key, transport_response_format_key, transport_headers_key, service_config_properties, OperationModifier, Token, TokenShape, SourceSpan, make_span, ErrorNode, make_error_node, with_required_cardinality, error_type, is_compiler_error, node_name_span, no_span, NewlineIndex, authored_name_at, InternTable, InternResult, empty_intern_table, intern, pre_intern_tokens, CompilerDiagnostic}; -use crate::v2_std_core::InferredNode::{Resolved, CompilerError, TypeVariable}; -use crate::v2_std_core::Connective::{Conj, Disj, NoConnective, Arrow}; -use crate::v2_std_core::Cardinality::{Required, CardOptional}; -use crate::v2_std_core::ExprData::{NoExprData, ExprLiteral, ExprVar, ExprFieldAccess, ExprCall, ExprMethodCall, ExprMatch, ExprIf, ExprLet, ExprRecordLit, ExprListLit, ExprBinOp, ExprUnaryOp, ExprLambda, ExprStringInterp, ExprBlock, ExprCast, ExprForEach, ExprIndex, ExprSlice, ExprReturn}; -use crate::v2_std_core::MatchPattern::{Bind, LitPattern, VariantPattern, Wildcard}; -use crate::v2_std_core::LiteralValue::{LitStr, LitInt, LitFloat, LitBool, LitNull}; -use crate::v2_std_core::ExprErrorKind::{ParseRecoveryError}; -use crate::v2_std_core::BinOp::{Add, Sub, Mul, Div, Mod, Eq, Ne, Lt, Gt, Le, Ge, And, Or, NullCoalesce}; -use crate::v2_std_core::UnaryOpKind::{Not, Neg}; -use crate::v2_std_core::StringPart::{Text, Interpolation}; -use crate::v2_std_core::OperationModifier::{Idempotent, Readonly, Hermetic}; -use crate::v2_std_core::TokenShape::{ShKeyword, ShLBrace, ShRBrace, ShLParen, ShRParen, ShLBracket, ShRBracket, ShLt, ShGt, ShLe, ShGe, ShFatArrow, ShArrow, ShColon, ShComma, ShDot, ShDotDot, ShEq, ShEqEq, ShNe, ShPlus, ShMinus, ShStar, ShSlash, ShPercent, ShBang, ShAnd, ShOr, ShQuestion, ShNullCoalesce, ShPipe, ShPipeArrow, ShLitStr, ShLitInt, ShLitFloat, ShIdent, ShStrBegin, ShStrMid, ShStrEnd, ShNewline, ShEof, ShUnknown}; -use crate::v2_std_core::CompilerDiagnostic::{ParseError}; -pub use crate::v2_compiler_languages::{ItemForm, ItemFormKind, BodyKind, OperatorSpec, SyntaxSpec}; -use crate::v2_compiler_languages::ItemFormKind::{OtherForm}; -use crate::v2_compiler_languages::BodyKind::{ExprBody, BlockBody, TypeBody, ValueBody, NoBody, ServiceBody, ResourceBody}; -pub use crate::extdeps_languages_dag_syntax::{dag_syntax_spec, dag_non_name_keywords}; use self::AdvanceResult::*; use self::EatResult::*; use self::ExpectedToken::*; -use self::ParserHelperIdentity::*; use self::ParserCallIdentity::*; +use self::ParserHelperIdentity::*; use self::ParserResultWitness::*; +pub use crate::extdeps_languages_dag_syntax::{dag_non_name_keywords, dag_syntax_spec}; +use crate::v2_compiler_languages::BodyKind::{ + BlockBody, ExprBody, NoBody, ResourceBody, ServiceBody, TypeBody, ValueBody, +}; +use crate::v2_compiler_languages::ItemFormKind::OtherForm; +pub use crate::v2_compiler_languages::{ + BodyKind, ItemForm, ItemFormKind, OperatorSpec, SyntaxSpec, +}; +use crate::v2_rt; +use crate::v2_std_core::BinOp::{ + Add, And, Div, Eq, Ge, Gt, Le, Lt, Mod, Mul, Ne, NullCoalesce, Or, Sub, +}; +use crate::v2_std_core::Cardinality::{CardOptional, Required}; +use crate::v2_std_core::CompilerDiagnostic::ParseError; +use crate::v2_std_core::Connective::{Arrow, Conj, Disj, NoConnective}; +use crate::v2_std_core::ExprData::{ + ExprBinOp, ExprBlock, ExprCall, ExprCast, ExprFieldAccess, ExprForEach, ExprIf, ExprIndex, + ExprLambda, ExprLet, ExprListLit, ExprLiteral, ExprMatch, ExprMethodCall, ExprRecordLit, + ExprReturn, ExprSlice, ExprStringInterp, ExprUnaryOp, ExprVar, NoExprData, +}; +use crate::v2_std_core::ExprErrorKind::ParseRecoveryError; +use crate::v2_std_core::InferredNode::{CompilerError, Resolved, TypeVariable}; +use crate::v2_std_core::LiteralValue::{LitBool, LitFloat, LitInt, LitNull, LitStr}; +use crate::v2_std_core::MatchPattern::{Bind, LitPattern, VariantPattern, Wildcard}; +use crate::v2_std_core::OperationModifier::{Hermetic, Idempotent, Readonly}; +use crate::v2_std_core::StringPart::{Interpolation, Text}; +use crate::v2_std_core::TokenShape::{ + ShAnd, ShArrow, ShBang, ShColon, ShComma, ShDot, ShDotDot, ShEof, ShEq, ShEqEq, ShFatArrow, + ShGe, ShGt, ShIdent, ShKeyword, ShLBrace, ShLBracket, ShLParen, ShLe, ShLitFloat, ShLitInt, + ShLitStr, ShLt, ShMinus, ShNe, ShNewline, ShNullCoalesce, ShOr, ShPercent, ShPipe, ShPipeArrow, + ShPlus, ShQuestion, ShRBrace, ShRBracket, ShRParen, ShSlash, ShStar, ShStrBegin, ShStrEnd, + ShStrMid, ShUnknown, +}; +use crate::v2_std_core::UnaryOpKind::{Neg, Not}; +pub use crate::v2_std_core::{ + arg_name_at, arg_value, authored_name_at, empty_intern_table, error_type, expr_call_func_at, + expr_var_name_at, field_access_field_at, field_binding_pattern, field_node_cardinality, + field_node_default_value, field_node_from_key, field_node_name_at, field_node_type_expr, + file_transport_node, import_node, intern, is_compiler_error, is_container_type, + leaf_node_with_span, local_transport_node, make_arg_node, make_arm_node, make_error_node, + make_expr_error_node, make_expr_node, make_field_binding_node, make_field_init_node, + make_field_node, make_interp_part_node, make_named_expr_node, make_param_node, + make_resource_use_node, make_span, make_text_part_node, make_variant_node, module_node, + no_span, node_name_span, param_node_default_value, param_node_type_expr, pre_intern_tokens, + rest_transport_node, service_config_properties, shell_transport_node, transport_body_key, + transport_headers_key, transport_method_key, transport_path_key, transport_path_template_key, + transport_query_key, transport_response_format_key, transport_stdin_key, transport_url_key, + variant_node_fields, variant_node_name_at, with_required_cardinality, BinOp, Cardinality, + CompilerDiagnostic, Connective, ErrorNode, ExprData, ExprErrorKind, InferredNode, InternResult, + InternTable, LiteralValue, MatchPattern, NewlineIndex, Node, OperationModifier, SourceSpan, + StringPart, Token, TokenShape, UnaryOpKind, +}; +use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] pub struct ParseContext { @@ -284,9 +317,7 @@ pub struct BindingPower { #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum ExpectedToken { - ExpectKeyword { - text: String, - }, + ExpectKeyword { text: String }, ExpectLBrace, ExpectRBrace, ExpectLParen, @@ -644,12 +675,8 @@ pub enum ParserHelperIdentity { #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum ParserCallIdentity { - ParserCallHelper { - helper: ParserHelperIdentity, - }, - ParserCallFunction { - name: String, - }, + ParserCallHelper { helper: ParserHelperIdentity }, + ParserCallFunction { name: String }, } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -658,9 +685,7 @@ pub enum ParserResultWitness { ParserWitnessAdvance, ParserWitnessExpect, ParserWitnessEat, - ParserWitnessCall { - callee: Rc, - }, + ParserWitnessCall { callee: Rc }, ParserWitnessOpaque, } impl ParserResultWitness { @@ -683,424 +708,482 @@ pub struct DescResult { pub fn token_span(tok: Option>) -> Rc { match tok { - Some(t) => t.span.clone(), - None => make_span(0, 0), -} + Some(t) => t.span.clone(), + None => make_span(0, 0), + } } pub fn advance(tokens: &Rc>>) -> Rc { match tokens.clone().first().cloned() { - Some(t) => Rc::new(AdvanceResult::AdvanceOk { - token: t.clone(), - tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), -}), - None => Rc::new(AdvanceResult::AdvanceEof), -} + Some(t) => Rc::new(AdvanceResult::AdvanceOk { + token: t.clone(), + tokens: Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + }), + None => Rc::new(AdvanceResult::AdvanceEof), + } } pub fn parse_error(msg: String, span: Rc) -> Rc { - make_error_node(Rc::new(CompilerDiagnostic::ParseError { - message: msg, - span: span, -}), "".to_string()) + make_error_node( + Rc::new(CompilerDiagnostic::ParseError { + message: msg, + span: span, + }), + "".to_string(), + ) } pub fn has_err(err: Option>) -> bool { match err { - Some(_) => true, - None => false, -} + Some(_) => true, + None => false, + } } pub fn parse_string_literal_value(tokens: &Rc>>) -> Rc { { let tok = tokens.clone().first().cloned(); -match tok.clone() { - Some(t) => match t.shape.clone() { - TokenShape::ShLitStr => Rc::new(StringLitResult { - value: t.text.clone(), - tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), - err: None, -}), - _ => Rc::new(StringLitResult { - value: "".to_string(), - tokens: tokens.clone(), - err: Some(parse_error("expected string literal".to_string(), token_span(tok.clone()))), -}), -}, - None => Rc::new(StringLitResult { - value: "".to_string(), - tokens: tokens.clone(), - err: Some(parse_error("expected string literal".to_string(), make_span(0, 0))), -}), -} -} + match tok.clone() { + Some(t) => match t.shape.clone() { + TokenShape::ShLitStr => Rc::new(StringLitResult { + value: t.text.clone(), + tokens: Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + err: None, + }), + _ => Rc::new(StringLitResult { + value: "".to_string(), + tokens: tokens.clone(), + err: Some(parse_error( + "expected string literal".to_string(), + token_span(tok.clone()), + )), + }), + }, + None => Rc::new(StringLitResult { + value: "".to_string(), + tokens: tokens.clone(), + err: Some(parse_error( + "expected string literal".to_string(), + make_span(0, 0), + )), + }), + } + } } pub fn parse_int_literal_value(tokens: &Rc>>) -> Rc { { let tok = tokens.clone().first().cloned(); -match tok.clone() { - Some(t) => match t.shape.clone() { - TokenShape::ShLitInt => { - let n_opt = v2_rt::parse_int(t.text.clone()); -match n_opt { - Some(n) => Rc::new(IntLitResult { - value: n.clone(), - tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), - err: None, -}), - None => Rc::new(IntLitResult { - value: 0, - tokens: tokens.clone(), - err: Some(parse_error(v2_rt::concat(v2_rt::concat("internal: ShLitInt token text not parseable as int: '".to_string(), t.text.clone()), "'".to_string()), token_span(tok.clone()))), -}), -} -}, - _ => Rc::new(IntLitResult { - value: 0, - tokens: tokens.clone(), - err: Some(parse_error("expected integer literal".to_string(), token_span(tok.clone()))), -}), -}, - None => Rc::new(IntLitResult { - value: 0, - tokens: tokens.clone(), - err: Some(parse_error("expected integer literal".to_string(), make_span(0, 0))), -}), -} -} + match tok.clone() { + Some(t) => match t.shape.clone() { + TokenShape::ShLitInt => { + let n_opt = v2_rt::parse_int(t.text.clone()); + match n_opt { + Some(n) => Rc::new(IntLitResult { + value: n.clone(), + tokens: Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + err: None, + }), + None => Rc::new(IntLitResult { + value: 0, + tokens: tokens.clone(), + err: Some(parse_error( + v2_rt::concat( + v2_rt::concat( + "internal: ShLitInt token text not parseable as int: '" + .to_string(), + t.text.clone(), + ), + "'".to_string(), + ), + token_span(tok.clone()), + )), + }), + } + } + _ => Rc::new(IntLitResult { + value: 0, + tokens: tokens.clone(), + err: Some(parse_error( + "expected integer literal".to_string(), + token_span(tok.clone()), + )), + }), + }, + None => Rc::new(IntLitResult { + value: 0, + tokens: tokens.clone(), + err: Some(parse_error( + "expected integer literal".to_string(), + make_span(0, 0), + )), + }), + } + } } pub fn is_ident_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShIdent => true, - _ => false, -} + TokenShape::ShIdent => true, + _ => false, + } } pub fn is_lit_str_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShLitStr => true, - _ => false, -} + TokenShape::ShLitStr => true, + _ => false, + } } pub fn is_lit_int_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShLitInt => true, - _ => false, -} + TokenShape::ShLitInt => true, + _ => false, + } } pub fn is_lit_float_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShLitFloat => true, - _ => false, -} + TokenShape::ShLitFloat => true, + _ => false, + } } pub fn is_str_begin_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShStrBegin => true, - _ => false, -} + TokenShape::ShStrBegin => true, + _ => false, + } } pub fn is_str_mid_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShStrMid => true, - _ => false, -} + TokenShape::ShStrMid => true, + _ => false, + } } pub fn is_str_end_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShStrEnd => true, - _ => false, -} + TokenShape::ShStrEnd => true, + _ => false, + } } pub fn is_unknown_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShUnknown => true, - _ => false, -} + TokenShape::ShUnknown => true, + _ => false, + } } pub fn is_newline_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShNewline => true, - _ => false, -} + TokenShape::ShNewline => true, + _ => false, + } } pub fn is_eof_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShEof => true, - _ => false, -} + TokenShape::ShEof => true, + _ => false, + } } pub fn is_keyword_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShKeyword => true, - _ => false, -} + TokenShape::ShKeyword => true, + _ => false, + } } pub fn is_lbrace_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShLBrace => true, - _ => false, -} + TokenShape::ShLBrace => true, + _ => false, + } } pub fn is_rbrace_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShRBrace => true, - _ => false, -} + TokenShape::ShRBrace => true, + _ => false, + } } pub fn is_lparen_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShLParen => true, - _ => false, -} + TokenShape::ShLParen => true, + _ => false, + } } pub fn is_rparen_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShRParen => true, - _ => false, -} + TokenShape::ShRParen => true, + _ => false, + } } pub fn is_lbracket_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShLBracket => true, - _ => false, -} + TokenShape::ShLBracket => true, + _ => false, + } } pub fn is_rbracket_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShRBracket => true, - _ => false, -} + TokenShape::ShRBracket => true, + _ => false, + } } pub fn is_lt_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShLt => true, - _ => false, -} + TokenShape::ShLt => true, + _ => false, + } } pub fn is_gt_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShGt => true, - _ => false, -} + TokenShape::ShGt => true, + _ => false, + } } pub fn is_le_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShLe => true, - _ => false, -} + TokenShape::ShLe => true, + _ => false, + } } pub fn is_ge_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShGe => true, - _ => false, -} + TokenShape::ShGe => true, + _ => false, + } } pub fn is_fat_arrow_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShFatArrow => true, - _ => false, -} + TokenShape::ShFatArrow => true, + _ => false, + } } pub fn is_arrow_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShArrow => true, - _ => false, -} + TokenShape::ShArrow => true, + _ => false, + } } pub fn is_colon_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShColon => true, - _ => false, -} + TokenShape::ShColon => true, + _ => false, + } } pub fn is_comma_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShComma => true, - _ => false, -} + TokenShape::ShComma => true, + _ => false, + } } pub fn is_dot_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShDot => true, - _ => false, -} + TokenShape::ShDot => true, + _ => false, + } } pub fn is_dot_dot_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShDotDot => true, - _ => false, -} + TokenShape::ShDotDot => true, + _ => false, + } } pub fn is_eq_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShEq => true, - _ => false, -} + TokenShape::ShEq => true, + _ => false, + } } pub fn is_eq_eq_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShEqEq => true, - _ => false, -} + TokenShape::ShEqEq => true, + _ => false, + } } pub fn is_ne_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShNe => true, - _ => false, -} + TokenShape::ShNe => true, + _ => false, + } } pub fn is_plus_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShPlus => true, - _ => false, -} + TokenShape::ShPlus => true, + _ => false, + } } pub fn is_minus_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShMinus => true, - _ => false, -} + TokenShape::ShMinus => true, + _ => false, + } } pub fn is_star_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShStar => true, - _ => false, -} + TokenShape::ShStar => true, + _ => false, + } } pub fn is_slash_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShSlash => true, - _ => false, -} + TokenShape::ShSlash => true, + _ => false, + } } pub fn is_percent_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShPercent => true, - _ => false, -} + TokenShape::ShPercent => true, + _ => false, + } } pub fn is_bang_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShBang => true, - _ => false, -} + TokenShape::ShBang => true, + _ => false, + } } pub fn is_and_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShAnd => true, - _ => false, -} + TokenShape::ShAnd => true, + _ => false, + } } pub fn is_or_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShOr => true, - _ => false, -} + TokenShape::ShOr => true, + _ => false, + } } pub fn is_question_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShQuestion => true, - _ => false, -} + TokenShape::ShQuestion => true, + _ => false, + } } pub fn is_null_coalesce_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShNullCoalesce => true, - _ => false, -} + TokenShape::ShNullCoalesce => true, + _ => false, + } } pub fn is_pipe_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShPipe => true, - _ => false, -} + TokenShape::ShPipe => true, + _ => false, + } } pub fn is_pipe_arrow_shape(shape: TokenShape) -> bool { match shape { - TokenShape::ShPipeArrow => true, - _ => false, -} + TokenShape::ShPipeArrow => true, + _ => false, + } } pub fn tok_is_keyword(tok: Option>, kw: String) -> bool { match tok { - Some(t) => (is_keyword_shape(t.shape.clone()) && (t.text.clone().as_str() == kw.as_str())), - None => false, -} + Some(t) => (is_keyword_shape(t.shape.clone()) && (t.text.clone().as_str() == kw.as_str())), + None => false, + } } pub fn tok_keyword_text(tok: Option>) -> String { match tok { - Some(t) => if is_keyword_shape(t.shape.clone()) { - t.text.clone() - } else { - "".to_string() - }, - None => "".to_string(), -} + Some(t) => { + if is_keyword_shape(t.shape.clone()) { + t.text.clone() + } else { + "".to_string() + } + } + None => "".to_string(), + } } pub fn tok_is_ident(tok: Option>) -> bool { match tok { - Some(t) => is_ident_shape(t.shape.clone()), - None => false, -} + Some(t) => is_ident_shape(t.shape.clone()), + None => false, + } } pub fn tok_is_ident_text(tok: Option>, text: String) -> bool { match tok { - Some(t) => (is_ident_shape(t.shape.clone()) && (t.text.clone().as_str() == text.as_str())), - None => false, -} + Some(t) => (is_ident_shape(t.shape.clone()) && (t.text.clone().as_str() == text.as_str())), + None => false, + } } -pub fn drop_leading_type_modifier(tokens: &Rc>>, modifier: String) -> Rc>> { +pub fn drop_leading_type_modifier( + tokens: &Rc>>, + modifier: String, +) -> Rc>> { if tok_is_ident_text(tokens.clone().first().cloned(), modifier) { - skip_newlines(Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>())) + skip_newlines(Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + )) } else { tokens.clone() } @@ -1112,226 +1195,231 @@ pub fn type_body_tokens_after_modifiers(tokens: Rc>>) -> Rc>) -> bool { match tok { - Some(t) => is_newline_shape(t.shape.clone()), - None => false, -} + Some(t) => is_newline_shape(t.shape.clone()), + None => false, + } } pub fn tok_is_eof(tok: Option>) -> bool { match tok { - Some(t) => is_eof_shape(t.shape.clone()), - None => true, -} + Some(t) => is_eof_shape(t.shape.clone()), + None => true, + } } pub fn tok_is_lit_str(tok: Option>) -> bool { match tok { - Some(t) => is_lit_str_shape(t.shape.clone()), - None => false, -} + Some(t) => is_lit_str_shape(t.shape.clone()), + None => false, + } } pub fn tok_is_lbrace(tok: Option>) -> bool { match tok { - Some(t) => is_lbrace_shape(t.shape.clone()), - None => false, -} + Some(t) => is_lbrace_shape(t.shape.clone()), + None => false, + } } pub fn tok_is_rbrace(tok: Option>) -> bool { match tok { - Some(t) => is_rbrace_shape(t.shape.clone()), - None => false, -} + Some(t) => is_rbrace_shape(t.shape.clone()), + None => false, + } } pub fn tok_is_lparen(tok: Option>) -> bool { match tok { - Some(t) => is_lparen_shape(t.shape.clone()), - None => false, -} + Some(t) => is_lparen_shape(t.shape.clone()), + None => false, + } } pub fn tok_is_rparen(tok: Option>) -> bool { match tok { - Some(t) => is_rparen_shape(t.shape.clone()), - None => false, -} + Some(t) => is_rparen_shape(t.shape.clone()), + None => false, + } } pub fn tok_is_lbracket(tok: Option>) -> bool { match tok { - Some(t) => is_lbracket_shape(t.shape.clone()), - None => false, -} + Some(t) => is_lbracket_shape(t.shape.clone()), + None => false, + } } pub fn tok_is_rbracket(tok: Option>) -> bool { match tok { - Some(t) => is_rbracket_shape(t.shape.clone()), - None => false, -} + Some(t) => is_rbracket_shape(t.shape.clone()), + None => false, + } } pub fn tok_is_colon(tok: Option>) -> bool { match tok { - Some(t) => is_colon_shape(t.shape.clone()), - None => false, -} + Some(t) => is_colon_shape(t.shape.clone()), + None => false, + } } pub fn tok_is_comma(tok: Option>) -> bool { match tok { - Some(t) => is_comma_shape(t.shape.clone()), - None => false, -} + Some(t) => is_comma_shape(t.shape.clone()), + None => false, + } } pub fn tok_is_dot(tok: Option>) -> bool { match tok { - Some(t) => is_dot_shape(t.shape.clone()), - None => false, -} + Some(t) => is_dot_shape(t.shape.clone()), + None => false, + } } pub fn tok_is_dot_dot(tok: Option>) -> bool { match tok { - Some(t) => is_dot_dot_shape(t.shape.clone()), - None => false, -} + Some(t) => is_dot_dot_shape(t.shape.clone()), + None => false, + } } pub fn tok_is_eq(tok: Option>) -> bool { match tok { - Some(t) => is_eq_shape(t.shape.clone()), - None => false, -} + Some(t) => is_eq_shape(t.shape.clone()), + None => false, + } } pub fn tok_is_fat_arrow(tok: Option>) -> bool { match tok { - Some(t) => is_fat_arrow_shape(t.shape.clone()), - None => false, -} + Some(t) => is_fat_arrow_shape(t.shape.clone()), + None => false, + } } pub fn tok_is_arrow(tok: Option>) -> bool { match tok { - Some(t) => is_arrow_shape(t.shape.clone()), - None => false, -} + Some(t) => is_arrow_shape(t.shape.clone()), + None => false, + } } pub fn tok_is_lt(tok: Option>) -> bool { match tok { - Some(t) => is_lt_shape(t.shape.clone()), - None => false, -} + Some(t) => is_lt_shape(t.shape.clone()), + None => false, + } } pub fn tok_is_gt(tok: Option>) -> bool { match tok { - Some(t) => is_gt_shape(t.shape.clone()), - None => false, -} + Some(t) => is_gt_shape(t.shape.clone()), + None => false, + } } pub fn tok_is_pipe(tok: Option>) -> bool { match tok { - Some(t) => is_pipe_shape(t.shape.clone()), - None => false, -} + Some(t) => is_pipe_shape(t.shape.clone()), + None => false, + } } pub fn tok_is_pipe_arrow(tok: Option>) -> bool { match tok { - Some(t) => is_pipe_arrow_shape(t.shape.clone()), - None => false, -} + Some(t) => is_pipe_arrow_shape(t.shape.clone()), + None => false, + } } pub fn tok_is_question(tok: Option>) -> bool { match tok { - Some(t) => is_question_shape(t.shape.clone()), - None => false, -} + Some(t) => is_question_shape(t.shape.clone()), + None => false, + } } pub fn tok_span(tok: Option>) -> Rc { match tok { - Some(t) => t.span.clone(), - None => make_span(0, 0), -} + Some(t) => t.span.clone(), + None => make_span(0, 0), + } } pub fn tok_keyword_to_name(tok: Option>) -> Option { match tok { - Some(t) => if is_name_keyword(&t) { - Some(t.text.clone()) - } else { - None - }, - None => None, -} + Some(t) => { + if is_name_keyword(&t) { + Some(t.text.clone()) + } else { + None + } + } + None => None, + } } pub fn tok_is_keyword_name(tok: Option>) -> bool { match tok_keyword_to_name(tok) { - Some(_) => true, - None => false, -} + Some(_) => true, + None => false, + } } pub fn shape_display_name(shape: TokenShape) -> String { match shape { - TokenShape::ShKeyword => "keyword".to_string(), - TokenShape::ShLBrace => "LBrace".to_string(), - TokenShape::ShRBrace => "RBrace".to_string(), - TokenShape::ShLParen => "LParen".to_string(), - TokenShape::ShRParen => "RParen".to_string(), - TokenShape::ShLBracket => "LBracket".to_string(), - TokenShape::ShRBracket => "RBracket".to_string(), - TokenShape::ShLt => "Lt".to_string(), - TokenShape::ShGt => "Gt".to_string(), - TokenShape::ShLe => "Le".to_string(), - TokenShape::ShGe => "Ge".to_string(), - TokenShape::ShFatArrow => "FatArrow".to_string(), - TokenShape::ShArrow => "Arrow".to_string(), - TokenShape::ShColon => "Colon".to_string(), - TokenShape::ShComma => "Comma".to_string(), - TokenShape::ShDot => "Dot".to_string(), - TokenShape::ShDotDot => "DotDot".to_string(), - TokenShape::ShEq => "Eq".to_string(), - TokenShape::ShEqEq => "EqEq".to_string(), - TokenShape::ShNe => "Ne".to_string(), - TokenShape::ShPlus => "Plus".to_string(), - TokenShape::ShMinus => "Minus".to_string(), - TokenShape::ShStar => "Star".to_string(), - TokenShape::ShSlash => "Slash".to_string(), - TokenShape::ShPercent => "Percent".to_string(), - TokenShape::ShBang => "Bang".to_string(), - TokenShape::ShAnd => "And".to_string(), - TokenShape::ShOr => "Or".to_string(), - TokenShape::ShQuestion => "Question".to_string(), - TokenShape::ShNullCoalesce => "NullCoalesce".to_string(), - TokenShape::ShPipe => "Pipe".to_string(), - TokenShape::ShPipeArrow => "PipeArrow".to_string(), - TokenShape::ShLitStr => "LitStr".to_string(), - TokenShape::ShLitInt => "LitInt".to_string(), - TokenShape::ShLitFloat => "LitFloat".to_string(), - TokenShape::ShIdent => "Ident".to_string(), - TokenShape::ShStrBegin => "StrBegin".to_string(), - TokenShape::ShStrMid => "StrMid".to_string(), - TokenShape::ShStrEnd => "StrEnd".to_string(), - TokenShape::ShNewline => "Newline".to_string(), - TokenShape::ShEof => "Eof".to_string(), - TokenShape::ShUnknown => "Unknown".to_string(), -} + TokenShape::ShKeyword => "keyword".to_string(), + TokenShape::ShLBrace => "LBrace".to_string(), + TokenShape::ShRBrace => "RBrace".to_string(), + TokenShape::ShLParen => "LParen".to_string(), + TokenShape::ShRParen => "RParen".to_string(), + TokenShape::ShLBracket => "LBracket".to_string(), + TokenShape::ShRBracket => "RBracket".to_string(), + TokenShape::ShLt => "Lt".to_string(), + TokenShape::ShGt => "Gt".to_string(), + TokenShape::ShLe => "Le".to_string(), + TokenShape::ShGe => "Ge".to_string(), + TokenShape::ShFatArrow => "FatArrow".to_string(), + TokenShape::ShArrow => "Arrow".to_string(), + TokenShape::ShColon => "Colon".to_string(), + TokenShape::ShComma => "Comma".to_string(), + TokenShape::ShDot => "Dot".to_string(), + TokenShape::ShDotDot => "DotDot".to_string(), + TokenShape::ShEq => "Eq".to_string(), + TokenShape::ShEqEq => "EqEq".to_string(), + TokenShape::ShNe => "Ne".to_string(), + TokenShape::ShPlus => "Plus".to_string(), + TokenShape::ShMinus => "Minus".to_string(), + TokenShape::ShStar => "Star".to_string(), + TokenShape::ShSlash => "Slash".to_string(), + TokenShape::ShPercent => "Percent".to_string(), + TokenShape::ShBang => "Bang".to_string(), + TokenShape::ShAnd => "And".to_string(), + TokenShape::ShOr => "Or".to_string(), + TokenShape::ShQuestion => "Question".to_string(), + TokenShape::ShNullCoalesce => "NullCoalesce".to_string(), + TokenShape::ShPipe => "Pipe".to_string(), + TokenShape::ShPipeArrow => "PipeArrow".to_string(), + TokenShape::ShLitStr => "LitStr".to_string(), + TokenShape::ShLitInt => "LitInt".to_string(), + TokenShape::ShLitFloat => "LitFloat".to_string(), + TokenShape::ShIdent => "Ident".to_string(), + TokenShape::ShStrBegin => "StrBegin".to_string(), + TokenShape::ShStrMid => "StrMid".to_string(), + TokenShape::ShStrEnd => "StrEnd".to_string(), + TokenShape::ShNewline => "Newline".to_string(), + TokenShape::ShEof => "Eof".to_string(), + TokenShape::ShUnknown => "Unknown".to_string(), + } } pub fn token_display_name(token: &Rc) -> String { if is_keyword_shape(token.shape.clone()) { - v2_rt::concat("keyword '".to_string(), v2_rt::concat(token.text.clone(), "'".to_string())) + v2_rt::concat( + "keyword '".to_string(), + v2_rt::concat(token.text.clone(), "'".to_string()), + ) } else { shape_display_name(token.shape.clone()) } @@ -1339,170 +1427,213 @@ pub fn token_display_name(token: &Rc) -> String { pub fn expected_token_name(expected: Rc) -> String { match (*expected).clone() { - ExpectedToken::ExpectKeyword { text: kw, .. } => v2_rt::concat("keyword '".to_string(), v2_rt::concat(kw.clone(), "'".to_string())), - ExpectedToken::ExpectLBrace => "LBrace".to_string(), - ExpectedToken::ExpectRBrace => "RBrace".to_string(), - ExpectedToken::ExpectLParen => "LParen".to_string(), - ExpectedToken::ExpectRParen => "RParen".to_string(), - ExpectedToken::ExpectLBracket => "LBracket".to_string(), - ExpectedToken::ExpectRBracket => "RBracket".to_string(), - ExpectedToken::ExpectLt => "Lt".to_string(), - ExpectedToken::ExpectGt => "Gt".to_string(), - ExpectedToken::ExpectFatArrow => "FatArrow".to_string(), - ExpectedToken::ExpectArrow => "Arrow".to_string(), - ExpectedToken::ExpectColon => "Colon".to_string(), - ExpectedToken::ExpectComma => "Comma".to_string(), - ExpectedToken::ExpectDot => "Dot".to_string(), - ExpectedToken::ExpectEq => "Eq".to_string(), - ExpectedToken::ExpectQuestion => "Question".to_string(), - ExpectedToken::ExpectPipe => "Pipe".to_string(), -} + ExpectedToken::ExpectKeyword { text: kw, .. } => v2_rt::concat( + "keyword '".to_string(), + v2_rt::concat(kw.clone(), "'".to_string()), + ), + ExpectedToken::ExpectLBrace => "LBrace".to_string(), + ExpectedToken::ExpectRBrace => "RBrace".to_string(), + ExpectedToken::ExpectLParen => "LParen".to_string(), + ExpectedToken::ExpectRParen => "RParen".to_string(), + ExpectedToken::ExpectLBracket => "LBracket".to_string(), + ExpectedToken::ExpectRBracket => "RBracket".to_string(), + ExpectedToken::ExpectLt => "Lt".to_string(), + ExpectedToken::ExpectGt => "Gt".to_string(), + ExpectedToken::ExpectFatArrow => "FatArrow".to_string(), + ExpectedToken::ExpectArrow => "Arrow".to_string(), + ExpectedToken::ExpectColon => "Colon".to_string(), + ExpectedToken::ExpectComma => "Comma".to_string(), + ExpectedToken::ExpectDot => "Dot".to_string(), + ExpectedToken::ExpectEq => "Eq".to_string(), + ExpectedToken::ExpectQuestion => "Question".to_string(), + ExpectedToken::ExpectPipe => "Pipe".to_string(), + } } pub fn token_matches_expected(token: &Rc, expected: Rc) -> bool { match (*expected).clone() { - ExpectedToken::ExpectKeyword { text: kw, .. } => (is_keyword_shape(token.shape.clone()) && (token.text.clone().as_str() == kw.clone().as_str())), - ExpectedToken::ExpectLBrace => is_lbrace_shape(token.shape.clone()), - ExpectedToken::ExpectRBrace => is_rbrace_shape(token.shape.clone()), - ExpectedToken::ExpectLParen => is_lparen_shape(token.shape.clone()), - ExpectedToken::ExpectRParen => is_rparen_shape(token.shape.clone()), - ExpectedToken::ExpectLBracket => is_lbracket_shape(token.shape.clone()), - ExpectedToken::ExpectRBracket => is_rbracket_shape(token.shape.clone()), - ExpectedToken::ExpectLt => is_lt_shape(token.shape.clone()), - ExpectedToken::ExpectGt => is_gt_shape(token.shape.clone()), - ExpectedToken::ExpectFatArrow => is_fat_arrow_shape(token.shape.clone()), - ExpectedToken::ExpectArrow => is_arrow_shape(token.shape.clone()), - ExpectedToken::ExpectColon => is_colon_shape(token.shape.clone()), - ExpectedToken::ExpectComma => is_comma_shape(token.shape.clone()), - ExpectedToken::ExpectDot => is_dot_shape(token.shape.clone()), - ExpectedToken::ExpectEq => is_eq_shape(token.shape.clone()), - ExpectedToken::ExpectQuestion => is_question_shape(token.shape.clone()), - ExpectedToken::ExpectPipe => is_pipe_shape(token.shape.clone()), -} + ExpectedToken::ExpectKeyword { text: kw, .. } => { + (is_keyword_shape(token.shape.clone()) + && (token.text.clone().as_str() == kw.clone().as_str())) + } + ExpectedToken::ExpectLBrace => is_lbrace_shape(token.shape.clone()), + ExpectedToken::ExpectRBrace => is_rbrace_shape(token.shape.clone()), + ExpectedToken::ExpectLParen => is_lparen_shape(token.shape.clone()), + ExpectedToken::ExpectRParen => is_rparen_shape(token.shape.clone()), + ExpectedToken::ExpectLBracket => is_lbracket_shape(token.shape.clone()), + ExpectedToken::ExpectRBracket => is_rbracket_shape(token.shape.clone()), + ExpectedToken::ExpectLt => is_lt_shape(token.shape.clone()), + ExpectedToken::ExpectGt => is_gt_shape(token.shape.clone()), + ExpectedToken::ExpectFatArrow => is_fat_arrow_shape(token.shape.clone()), + ExpectedToken::ExpectArrow => is_arrow_shape(token.shape.clone()), + ExpectedToken::ExpectColon => is_colon_shape(token.shape.clone()), + ExpectedToken::ExpectComma => is_comma_shape(token.shape.clone()), + ExpectedToken::ExpectDot => is_dot_shape(token.shape.clone()), + ExpectedToken::ExpectEq => is_eq_shape(token.shape.clone()), + ExpectedToken::ExpectQuestion => is_question_shape(token.shape.clone()), + ExpectedToken::ExpectPipe => is_pipe_shape(token.shape.clone()), + } } pub fn expect(tokens: &Rc>>, expected: &Rc) -> Rc { { let tok = tokens.clone().first().cloned(); -let matches = match tok.clone() { - Some(t) => token_matches_expected(&t, expected.clone()), - None => false, -}; -if matches { + let matches = match tok.clone() { + Some(t) => token_matches_expected(&t, expected.clone()), + None => false, + }; + if matches { Rc::new(TokenResult { - token: tok.clone().unwrap(), - tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), - err: None, -}) + token: tok.clone().unwrap(), + tokens: Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + err: None, + }) } else { { let found = match tok.clone() { - Some(t) => token_display_name(&t), - None => "EOF".to_string(), -}; -let wanted = expected_token_name(expected.clone()); -Rc::new(TokenResult { - token: Rc::new(Token { - text: "".to_string(), - span: make_span(0, 0), - shape: TokenShape::ShEof, -}), - tokens: tokens.clone(), - err: Some(parse_error(format!("expected {}, found {}", wanted, found), token_span(tok.clone()))), -}) -} + Some(t) => token_display_name(&t), + None => "EOF".to_string(), + }; + let wanted = expected_token_name(expected.clone()); + Rc::new(TokenResult { + token: Rc::new(Token { + text: "".to_string(), + span: make_span(0, 0), + shape: TokenShape::ShEof, + }), + tokens: tokens.clone(), + err: Some(parse_error( + format!("expected {}, found {}", wanted, found), + token_span(tok.clone()), + )), + }) + } } -} + } } pub fn expect_ident(tokens: &Rc>>) -> Rc { { let tok = tokens.clone().first().cloned(); -let sh = match tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, -}; -match sh.clone() { - Some(TokenShape::ShIdent) => { - let n = tok.clone().unwrap().text.clone(); -let span = tok.clone().unwrap().span.clone(); -Rc::new(NameResult { - name: n, - span: span, - tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), - err: None, -}) -}, - _ => { - let found = match sh.clone() { - Some(shape) => shape_display_name(shape.clone()), - None => "EOF".to_string(), -}; -Rc::new(NameResult { - name: "".to_string(), - span: token_span(tok.clone()), - tokens: tokens.clone(), - err: Some(parse_error(v2_rt::concat("expected identifier, found ".to_string(), found), token_span(tok.clone()))), -}) -}, -} -} + let sh = match tok.clone() { + Some(t) => Some(t.shape.clone()), + None => None, + }; + match sh.clone() { + Some(TokenShape::ShIdent) => { + let n = tok.clone().unwrap().text.clone(); + let span = tok.clone().unwrap().span.clone(); + Rc::new(NameResult { + name: n, + span: span, + tokens: Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + err: None, + }) + } + _ => { + let found = match sh.clone() { + Some(shape) => shape_display_name(shape.clone()), + None => "EOF".to_string(), + }; + Rc::new(NameResult { + name: "".to_string(), + span: token_span(tok.clone()), + tokens: tokens.clone(), + err: Some(parse_error( + v2_rt::concat("expected identifier, found ".to_string(), found), + token_span(tok.clone()), + )), + }) + } + } + } } pub fn expect_name(tokens: &Rc>>) -> Rc { { let tok = tokens.clone().first().cloned(); -let sh = match tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, -}; -match sh { - Some(TokenShape::ShIdent) => { - let n = tok.clone().unwrap().text.clone(); -let span = tok.clone().unwrap().span.clone(); -Rc::new(NameResult { - name: n, - span: span, - tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), - err: None, -}) -}, - _ => { - let kw_name = tok_keyword_to_name(tok.clone()); -match kw_name { - Some(n) => { + let sh = match tok.clone() { + Some(t) => Some(t.shape.clone()), + None => None, + }; + match sh { + Some(TokenShape::ShIdent) => { + let n = tok.clone().unwrap().text.clone(); let span = tok.clone().unwrap().span.clone(); -Rc::new(NameResult { - name: n, - span: span, - tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), - err: None, -}) -}, - None => { - let found = match tok.clone() { - Some(t) => token_display_name(&t), - None => "EOF".to_string(), -}; -Rc::new(NameResult { - name: "".to_string(), - span: token_span(tok.clone()), - tokens: tokens.clone(), - err: Some(parse_error(v2_rt::concat("expected name, found ".to_string(), found), token_span(tok.clone()))), -}) -}, -} -}, -} -} + Rc::new(NameResult { + name: n, + span: span, + tokens: Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + err: None, + }) + } + _ => { + let kw_name = tok_keyword_to_name(tok.clone()); + match kw_name { + Some(n) => { + let span = tok.clone().unwrap().span.clone(); + Rc::new(NameResult { + name: n, + span: span, + tokens: Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + err: None, + }) + } + None => { + let found = match tok.clone() { + Some(t) => token_display_name(&t), + None => "EOF".to_string(), + }; + Rc::new(NameResult { + name: "".to_string(), + span: token_span(tok.clone()), + tokens: tokens.clone(), + err: Some(parse_error( + v2_rt::concat("expected name, found ".to_string(), found), + token_span(tok.clone()), + )), + }) + } + } + } + } + } } pub fn is_name_keyword(token: &Rc) -> bool { if is_keyword_shape(token.shape.clone()) { match v2_rt::lookup(&dag_non_name_keywords(), token.text.clone()) { - Some(_) => false, - None => true, -} + Some(_) => false, + None => true, + } } else { false } @@ -1511,109 +1642,153 @@ pub fn is_name_keyword(token: &Rc) -> bool { pub fn skip_newlines(mut tokens: Rc>>) -> Rc>> { loop { match tokens.clone().first().cloned() { - Some(t) => { if is_newline_shape(t.shape.clone()) { - { - let __tco_0 = Rc::new(tokens.iter().cloned().skip(1 as usize).collect::>()); -tokens = __tco_0; -continue; -} -} else { - break tokens.clone(); -} }, - None => { break tokens.clone(); }, -} -} + Some(t) => { + if is_newline_shape(t.shape.clone()) { + { + let __tco_0 = + Rc::new(tokens.iter().cloned().skip(1 as usize).collect::>()); + tokens = __tco_0; + continue; + } + } else { + break tokens.clone(); + } + } + None => { + break tokens.clone(); + } + } + } } pub fn is_continuation_shape(shape: &TokenShape) -> bool { - (((is_pipe_arrow_shape(shape.clone()) || is_dot_shape(shape.clone())) || is_or_shape(shape.clone())) || is_and_shape(shape.clone())) + (((is_pipe_arrow_shape(shape.clone()) || is_dot_shape(shape.clone())) + || is_or_shape(shape.clone())) + || is_and_shape(shape.clone())) } pub fn skip_continuation_newlines(tokens: &Rc>>) -> Rc>> { { let tok = tokens.clone().first().cloned(); -let is_continuation = if tok_is_newline(tok) { + let is_continuation = if tok_is_newline(tok) { { let after = skip_newlines(tokens.clone()); -match after.first().cloned() { - Some(next) => is_continuation_shape(&next.shape.clone()), - None => false, -} -} + match after.first().cloned() { + Some(next) => is_continuation_shape(&next.shape.clone()), + None => false, + } + } } else { false }; -if is_continuation { + if is_continuation { skip_newlines(tokens.clone()) } else { tokens.clone() } -} + } } pub fn eat(tokens: &Rc>>, expected: Rc) -> Rc { match tokens.clone().first().cloned() { - Some(t) => if token_matches_expected(&t, expected) { - Rc::new(EatResult::EatConsumed { - token: t.clone(), - tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), -}) - } else { - Rc::new(EatResult::EatUnchanged { - tokens: tokens.clone(), -}) - }, - None => Rc::new(EatResult::EatUnchanged { - tokens: tokens.clone(), -}), -} + Some(t) => { + if token_matches_expected(&t, expected) { + Rc::new(EatResult::EatConsumed { + token: t.clone(), + tokens: Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + }) + } else { + Rc::new(EatResult::EatUnchanged { + tokens: tokens.clone(), + }) + } + } + None => Rc::new(EatResult::EatUnchanged { + tokens: tokens.clone(), + }), + } } -pub fn parser_result_base_var(expr: &Rc, source_indices: Rc>>) -> Option { +pub fn parser_result_base_var( + expr: &Rc, + source_indices: Rc>>, +) -> Option { match (*expr.expr_data.clone()).clone() { - ExprData::ExprFieldAccess { .. } => match expr.children.clone().first().cloned() { - Some(base) => match (*base.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => Some(expr_var_name_at(base.clone(), source_indices)), - _ => None, -}, - None => None, -}, - _ => None, -} + ExprData::ExprFieldAccess { .. } => match expr.children.clone().first().cloned() { + Some(base) => match (*base.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => Some(expr_var_name_at(base.clone(), source_indices)), + _ => None, + }, + None => None, + }, + _ => None, + } } -pub fn parser_helper_state_arg_expr(call_node: Rc, source_indices: Rc>>) -> Option> { - Rc::new(call_node.children.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned().fold(None, |acc: _, pair: (i64, Rc)| if (acc.clone() != None) { - acc.clone() - } else { - { - let idx = pair.0.clone(); -let arg_node = pair.1.clone(); -let matches_state = match arg_name_at(arg_node.clone(), source_indices.clone()) { - Some(name) => ((name.clone().as_str() == "state".to_string().as_str()) || (name.clone().as_str() == "tokens".to_string().as_str())), - None => (idx.clone() == 0), -}; -if matches_state.clone() { - Some(arg_value(&arg_node)) - } else { - None +pub fn parser_helper_state_arg_expr( + call_node: Rc, + source_indices: Rc>>, +) -> Option> { + Rc::new( + call_node + .children + .clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + .fold(None, |acc: _, pair: (i64, Rc)| { + if (acc.clone() != None) { + acc.clone() + } else { + { + let idx = pair.0.clone(); + let arg_node = pair.1.clone(); + let matches_state = match arg_name_at(arg_node.clone(), source_indices.clone()) { + Some(name) => { + ((name.clone().as_str() == "state".to_string().as_str()) + || (name.clone().as_str() == "tokens".to_string().as_str())) + } + None => (idx.clone() == 0), + }; + if matches_state.clone() { + Some(arg_value(&arg_node)) + } else { + None + } } -} + } }) } -pub fn parser_progress_flag_var(expr: &Rc, source_indices: &Rc>>) -> Option { +pub fn parser_progress_flag_var( + expr: &Rc, + source_indices: &Rc>>, +) -> Option { match (*expr.expr_data.clone()).clone() { - ExprData::ExprFieldAccess { .. } => { - let field = field_access_field_at(expr.clone(), source_indices.clone()); -if ((field.clone().as_str() == "consumed".to_string().as_str()) || (field.clone().as_str() == "changed".to_string().as_str())) { - parser_result_base_var(&expr, source_indices.clone()) - } else { - None + ExprData::ExprFieldAccess { .. } => { + let field = field_access_field_at(expr.clone(), source_indices.clone()); + if ((field.clone().as_str() == "consumed".to_string().as_str()) + || (field.clone().as_str() == "changed".to_string().as_str())) + { + parser_result_base_var(&expr, source_indices.clone()) + } else { + None + } } -}, - _ => None, -} + _ => None, + } } pub fn parser_helper_identity(callee: &String) -> Option { @@ -1632,69 +1807,83 @@ pub fn parser_helper_identity(callee: &String) -> Option { } } -pub fn parser_passthrough_state_expr(expr: &Rc, source_indices: &Rc>>) -> Option> { +pub fn parser_passthrough_state_expr( + expr: &Rc, + source_indices: &Rc>>, +) -> Option> { match (*expr.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => match parser_helper_identity(&expr_call_func_at(expr.clone(), source_indices.clone())) { - Some(ParserHelperIdentity::ParserHelperSkipNewlines) => parser_helper_state_arg_expr(expr.clone(), source_indices.clone()), - Some(ParserHelperIdentity::ParserHelperSkipContinuationNewlines) => parser_helper_state_arg_expr(expr.clone(), source_indices.clone()), - Some(ParserHelperIdentity::ParserHelperWith) => match expr.children.clone().first().cloned() { - Some(base_arg) => Some(arg_value(&base_arg)), - None => None, -}, - None => None, -}, - _ => None, -} + ExprData::ExprCall { .. } => { + match parser_helper_identity(&expr_call_func_at(expr.clone(), source_indices.clone())) { + Some(ParserHelperIdentity::ParserHelperSkipNewlines) => { + parser_helper_state_arg_expr(expr.clone(), source_indices.clone()) + } + Some(ParserHelperIdentity::ParserHelperSkipContinuationNewlines) => { + parser_helper_state_arg_expr(expr.clone(), source_indices.clone()) + } + Some(ParserHelperIdentity::ParserHelperWith) => { + match expr.children.clone().first().cloned() { + Some(base_arg) => Some(arg_value(&base_arg)), + None => None, + } + } + None => None, + } + } + _ => None, + } } -pub fn parser_result_witness(expr: &Rc, source_indices: Rc>>) -> Rc { +pub fn parser_result_witness( + expr: &Rc, + source_indices: Rc>>, +) -> Rc { match (*expr.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => match expr_call_func_at(expr.clone(), source_indices) { - ref __s if __s == "advance" => Rc::new(ParserResultWitness::ParserWitnessAdvance), - ref __s if __s == "expect" => Rc::new(ParserResultWitness::ParserWitnessExpect), - ref __s if __s == "eat" => Rc::new(ParserResultWitness::ParserWitnessEat), - callee => match parser_helper_identity(&callee) { - Some(helper) => Rc::new(ParserResultWitness::ParserWitnessCall { - callee: Rc::new(ParserCallIdentity::ParserCallHelper { - helper: helper.clone(), -}), -}), - None => Rc::new(ParserResultWitness::ParserWitnessCall { - callee: Rc::new(ParserCallIdentity::ParserCallFunction { - name: callee.clone(), -}), -}), -}, -}, - _ => Rc::new(ParserResultWitness::ParserWitnessOpaque), -} + ExprData::ExprCall { .. } => match expr_call_func_at(expr.clone(), source_indices) { + ref __s if __s == "advance" => Rc::new(ParserResultWitness::ParserWitnessAdvance), + ref __s if __s == "expect" => Rc::new(ParserResultWitness::ParserWitnessExpect), + ref __s if __s == "eat" => Rc::new(ParserResultWitness::ParserWitnessEat), + callee => match parser_helper_identity(&callee) { + Some(helper) => Rc::new(ParserResultWitness::ParserWitnessCall { + callee: Rc::new(ParserCallIdentity::ParserCallHelper { + helper: helper.clone(), + }), + }), + None => Rc::new(ParserResultWitness::ParserWitnessCall { + callee: Rc::new(ParserCallIdentity::ParserCallFunction { + name: callee.clone(), + }), + }), + }, + }, + _ => Rc::new(ParserResultWitness::ParserWitnessOpaque), + } } pub fn leaf_type_node(name: &String, span: &Rc) -> Rc { Rc::new(Node { - name: name.clone(), - span: span.clone(), - ident_span: if (name.clone().as_str() == "".to_string().as_str()) { - None - } else { - Some(span.clone()) - }, - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}) + name: name.clone(), + span: span.clone(), + ident_span: if (name.clone().as_str() == "".to_string().as_str()) { + None + } else { + Some(span.clone()) + }, + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }) } pub fn is_conj_with_children(n: &Rc) -> bool { @@ -1703,338 +1892,455 @@ pub fn is_conj_with_children(n: &Rc) -> bool { pub fn child_inferred_or_empty(ch: Rc) -> Rc { match ch.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => rt.clone(), - _ => error_type(), -} + Some(InferredNode::Resolved { node: rt, .. }) => rt.clone(), + _ => error_type(), + } } -pub fn node_inferred_to_outputs(rt: &Rc, source_indices: Rc>>) -> Rc>> { +pub fn node_inferred_to_outputs( + rt: &Rc, + source_indices: Rc>>, +) -> Rc>> { if is_conj_with_children(&rt) { { - let all_children_typed = { let mut __all = true; for ch in rt.children.clone().iter().cloned() { if !(match ch.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { .. }) => true, - _ => false, -}) { __all = false; break; } } __all }; -if all_children_typed { - Rc::new({ let mut __result = Vec::new(); for ch in rt.children.clone().iter().cloned() { __result.push(make_field_node(&authored_name_at(source_indices.clone(), &ch), child_inferred_or_empty(ch.clone()), Cardinality::Required, ch.body.clone(), None, ch.span.clone(), node_name_span(&ch))); } __result }) + let all_children_typed = { + let mut __all = true; + for ch in rt.children.clone().iter().cloned() { + if !(match ch.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { .. }) => true, + _ => false, + }) { + __all = false; + break; + } + } + __all + }; + if all_children_typed { + Rc::new({ + let mut __result = Vec::new(); + for ch in rt.children.clone().iter().cloned() { + __result.push(make_field_node( + &authored_name_at(source_indices.clone(), &ch), + child_inferred_or_empty(ch.clone()), + Cardinality::Required, + ch.body.clone(), + None, + ch.span.clone(), + node_name_span(&ch), + )); + } + __result + }) } else { Rc::new(vec![]) } -} + } } else { - Rc::new(vec![make_field_node(&"value".to_string(), rt.clone(), Cardinality::Required, None, None, rt.span.clone(), no_span())]) + Rc::new(vec![make_field_node( + &"value".to_string(), + rt.clone(), + Cardinality::Required, + None, + None, + rt.span.clone(), + no_span(), + )]) } } pub fn parse_dotted_ident(tokens: Rc>>) -> Rc { { let r = expect_name(&tokens); -if has_err(r.err.clone()) { - return r.clone() + if has_err(r.err.clone()) { + return r.clone(); } -parse_dotted_ident_rest(r.tokens.clone(), r.name.clone(), r.span.clone()) -} + parse_dotted_ident_rest(r.tokens.clone(), r.name.clone(), r.span.clone()) + } } -pub fn parse_dotted_ident_rest(mut tokens: Rc>>, mut acc: String, mut span: Rc) -> Rc { +pub fn parse_dotted_ident_rest( + mut tokens: Rc>>, + mut acc: String, + mut span: Rc, +) -> Rc { loop { match (*eat(&tokens, Rc::new(ExpectedToken::ExpectDot))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { let r = expect_name(&__ec); -if has_err(r.err.clone()) { - return r.clone() - } -let extended = Rc::new(SourceSpan { - file: span.file.clone(), - start: span.start.clone(), - end: r.span.clone().end.clone(), -}); -{ - let __tco_0 = r.tokens.clone(); -let __tco_1 = v2_rt::concat(v2_rt::concat(acc, ".".to_string()), r.name.clone()); -let __tco_2 = extended; -tokens = __tco_0; -acc = __tco_1; -span = __tco_2; -continue; -} }, - EatResult::EatUnchanged { tokens: __eu, .. } => { break Rc::new(NameResult { - name: acc, - span: span.clone(), - tokens: __eu.clone(), - err: None, -}); }, -} -} + EatResult::EatConsumed { tokens: __ec, .. } => { + let r = expect_name(&__ec); + if has_err(r.err.clone()) { + return r.clone(); + } + let extended = Rc::new(SourceSpan { + file: span.file.clone(), + start: span.start.clone(), + end: r.span.clone().end.clone(), + }); + { + let __tco_0 = r.tokens.clone(); + let __tco_1 = + v2_rt::concat(v2_rt::concat(acc, ".".to_string()), r.name.clone()); + let __tco_2 = extended; + tokens = __tco_0; + acc = __tco_1; + span = __tco_2; + continue; + } + } + EatResult::EatUnchanged { tokens: __eu, .. } => { + break Rc::new(NameResult { + name: acc, + span: span.clone(), + tokens: __eu.clone(), + err: None, + }); + } + } + } } -pub fn parse_with_table(tokens: &Rc>>, source_indices: Rc>>, intern_table: Rc) -> Rc { +pub fn parse_with_table( + tokens: &Rc>>, + source_indices: Rc>>, + intern_table: Rc, +) -> Rc { { let pre_interned = pre_intern_tokens(tokens.clone(), intern_table); -let ctx = Rc::new(ParseContext { - source_indices: source_indices, - intern_table: pre_interned, -}); -let r = parse_module(&tokens, &ctx); -if has_err(r.err.clone()) { + let ctx = Rc::new(ParseContext { + source_indices: source_indices, + intern_table: pre_interned, + }); + let r = parse_module(&tokens, &ctx); + if has_err(r.err.clone()) { Rc::new(ParseWithTableResult { - result: Rc::new(ParseResult { - module: None, - error: r.err.clone(), -}), - intern_table: r.ctx.clone().intern_table.clone(), -}) + result: Rc::new(ParseResult { + module: None, + error: r.err.clone(), + }), + intern_table: r.ctx.clone().intern_table.clone(), + }) } else { Rc::new(ParseWithTableResult { - result: Rc::new(ParseResult { - module: Some(r.module.clone()), - error: None, -}), - intern_table: r.ctx.clone().intern_table.clone(), -}) + result: Rc::new(ParseResult { + module: Some(r.module.clone()), + error: None, + }), + intern_table: r.ctx.clone().intern_table.clone(), + }) } -} + } } -pub fn parse(tokens: Rc>>, source_indices: Rc>>) -> Rc { - parse_with_table(&tokens, source_indices, empty_intern_table()).result.clone() +pub fn parse( + tokens: Rc>>, + source_indices: Rc>>, +) -> Rc { + parse_with_table(&tokens, source_indices, empty_intern_table()) + .result + .clone() } pub fn parse_module(tokens: &Rc>>, ctx: &Rc) -> Rc { { let tokens = skip_newlines(tokens.clone()); -let start_span = token_span(tokens.clone().first().cloned()); -let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { - text: "module".to_string(), -})); -if has_err(r.err.clone()) { + let start_span = token_span(tokens.clone().first().cloned()); + let r = expect( + &tokens, + &Rc::new(ExpectedToken::ExpectKeyword { + text: "module".to_string(), + }), + ); + if has_err(r.err.clone()) { return Rc::new(ModuleResult { - module: module_node(&"".to_string(), Rc::new(vec![]), Rc::new(vec![]), &start_span), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let tokens = r.tokens.clone(); -let r = parse_dotted_ident(tokens.clone()); -if has_err(r.err.clone()) { + module: module_node( + &"".to_string(), + Rc::new(vec![]), + Rc::new(vec![]), + &start_span, + ), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let tokens = r.tokens.clone(); + let r = parse_dotted_ident(tokens.clone()); + if has_err(r.err.clone()) { return Rc::new(ModuleResult { - module: module_node(&"".to_string(), Rc::new(vec![]), Rc::new(vec![]), &start_span), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let mod_name = r.name.clone(); -let mod_name_span = r.span.clone(); -let tokens = skip_newlines(r.tokens.clone()); -let r = parse_imports(tokens.clone(), ctx.clone()); -if has_err(r.err.clone()) { + module: module_node( + &"".to_string(), + Rc::new(vec![]), + Rc::new(vec![]), + &start_span, + ), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let mod_name = r.name.clone(); + let mod_name_span = r.span.clone(); + let tokens = skip_newlines(r.tokens.clone()); + let r = parse_imports(tokens.clone(), ctx.clone()); + if has_err(r.err.clone()) { return Rc::new(ModuleResult { - module: module_node(&"".to_string(), Rc::new(vec![]), Rc::new(vec![]), &start_span), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let imports = r.imports.clone(); -let tokens = r.tokens.clone(); -let ctx = r.ctx.clone(); -let r = parse_items(tokens.clone(), ctx.clone()); -if has_err(r.err.clone()) { + module: module_node( + &"".to_string(), + Rc::new(vec![]), + Rc::new(vec![]), + &start_span, + ), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let imports = r.imports.clone(); + let tokens = r.tokens.clone(); + let ctx = r.ctx.clone(); + let r = parse_items(tokens.clone(), ctx.clone()); + if has_err(r.err.clone()) { return Rc::new(ModuleResult { - module: module_node(&"".to_string(), Rc::new(vec![]), Rc::new(vec![]), &start_span), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let items = r.items.clone(); -let tokens = r.tokens.clone(); -let ctx = r.ctx.clone(); -let mod_ir = intern(&ctx.intern_table.clone(), &mod_name); -let ctx = Rc::new(ParseContext { intern_table: mod_ir.table.clone(), ..(*ctx.clone()).clone() }); -let base_mod = Rc::new(Node { - name: mod_name.clone(), - span: start_span.clone(), - ident_span: Some(mod_name_span), - children: items, - connective: Connective::NoConnective, - params: imports, - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -let r#mod = Rc::new(Node { ident: Some(mod_ir.id.clone()), ..(*base_mod).clone() }); -Rc::new(ModuleResult { - module: r#mod, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}) -} + module: module_node( + &"".to_string(), + Rc::new(vec![]), + Rc::new(vec![]), + &start_span, + ), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let items = r.items.clone(); + let tokens = r.tokens.clone(); + let ctx = r.ctx.clone(); + let mod_ir = intern(&ctx.intern_table.clone(), &mod_name); + let ctx = Rc::new(ParseContext { + intern_table: mod_ir.table.clone(), + ..(*ctx.clone()).clone() + }); + let base_mod = Rc::new(Node { + name: mod_name.clone(), + span: start_span.clone(), + ident_span: Some(mod_name_span), + children: items, + connective: Connective::NoConnective, + params: imports, + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + let r#mod = Rc::new(Node { + ident: Some(mod_ir.id.clone()), + ..(*base_mod).clone() + }); + Rc::new(ModuleResult { + module: r#mod, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }) + } } pub fn parse_imports(tokens: Rc>>, ctx: Rc) -> Rc { parse_imports_acc(tokens, ctx, Rc::new(vec![])) } -pub fn parse_imports_acc(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { +pub fn parse_imports_acc( + mut tokens: Rc>>, + mut ctx: Rc, + mut acc: Rc>>, +) -> Rc { loop { tokens = skip_newlines(tokens.clone()); -if tok_is_keyword(tokens.clone().first().cloned(), "import".to_string()) { + if tok_is_keyword(tokens.clone().first().cloned(), "import".to_string()) { let r = parse_import(&tokens, &ctx); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(ImportsResult { - imports: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) + imports: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); } -{ + { let __tco_0 = r.tokens.clone(); -let __tco_1 = r.ctx.clone(); -let __tco_2 = v2_rt::rc_list_push(acc, r.import.clone()); -tokens = __tco_0; -ctx = __tco_1; -acc = __tco_2; -continue; -} -} else { + let __tco_1 = r.ctx.clone(); + let __tco_2 = v2_rt::rc_list_push(acc, r.import.clone()); + tokens = __tco_0; + ctx = __tco_1; + acc = __tco_2; + continue; + } + } else { break Rc::new(ImportsResult { - imports: acc, - tokens: tokens.clone(), - ctx: ctx, - err: None, -}); -} -} + imports: acc, + tokens: tokens.clone(), + ctx: ctx, + err: None, + }); + } + } } pub fn parse_items(tokens: Rc>>, ctx: Rc) -> Rc { parse_items_acc(tokens, ctx, Rc::new(vec![])) } -pub fn parse_items_acc(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { +pub fn parse_items_acc( + mut tokens: Rc>>, + mut ctx: Rc, + mut acc: Rc>>, +) -> Rc { loop { tokens = skip_newlines(tokens.clone()); -if tok_is_eof(tokens.clone().first().cloned()) { + if tok_is_eof(tokens.clone().first().cloned()) { break Rc::new(ItemsResult { - items: acc.clone(), - tokens: tokens.clone(), - ctx: ctx, - err: None, -}); -} else { + items: acc.clone(), + tokens: tokens.clone(), + ctx: ctx, + err: None, + }); + } else { let r = parse_item(&tokens, ctx); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(ItemsResult { - items: acc.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) + items: acc.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); } -{ + { let __tco_0 = r.tokens.clone(); -let __tco_1 = r.ctx.clone(); -let __tco_2 = v2_rt::rc_list_push(acc, r.item.clone()); -tokens = __tco_0; -ctx = __tco_1; -acc = __tco_2; -continue; -} -} -} + let __tco_1 = r.ctx.clone(); + let __tco_2 = v2_rt::rc_list_push(acc, r.item.clone()); + tokens = __tco_0; + ctx = __tco_1; + acc = __tco_2; + continue; + } + } + } } pub fn parse_import(tokens: &Rc>>, ctx: &Rc) -> Rc { { let start_span = token_span(tokens.clone().first().cloned()); -let err_import = import_node("".to_string(), false, Rc::new(vec![]), &start_span, start_span.clone()); -let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { - text: "import".to_string(), -})); -if has_err(r.err.clone()) { + let err_import = import_node( + "".to_string(), + false, + Rc::new(vec![]), + &start_span, + start_span.clone(), + ); + let r = expect( + &tokens, + &Rc::new(ExpectedToken::ExpectKeyword { + text: "import".to_string(), + }), + ); + if has_err(r.err.clone()) { return Rc::new(ImportResult { - import: err_import.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let tokens = r.tokens.clone(); -let r = parse_dotted_ident(tokens.clone()); -if has_err(r.err.clone()) { + import: err_import.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let tokens = r.tokens.clone(); + let r = parse_dotted_ident(tokens.clone()); + if has_err(r.err.clone()) { return Rc::new(ImportResult { - import: err_import.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let mod_path = r.name.clone(); -let mod_path_span = r.span.clone(); -let tokens = r.tokens.clone(); -match (*eat(&tokens, Rc::new(ExpectedToken::ExpectLBrace))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let r = parse_import_names(__ec.clone(), ctx.clone()); -if has_err(r.err.clone()) { - return Rc::new(ImportResult { - import: err_import.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let names = r.names.clone(); -let tokens = r.tokens.clone(); -let ctx = r.ctx.clone(); -let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); -if has_err(r.err.clone()) { - return Rc::new(ImportResult { - import: err_import.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let tokens = skip_newlines(r.tokens.clone()); -let base_imp = import_node(mod_path.clone(), false, names, &start_span, mod_path_span); -let imp_ir = intern(&ctx.intern_table.clone(), &mod_path); -let ctx = Rc::new(ParseContext { intern_table: imp_ir.table.clone(), ..(*ctx.clone()).clone() }); -let imp = Rc::new(Node { ident: Some(imp_ir.id.clone()), ..(*base_imp).clone() }); -Rc::new(ImportResult { - import: imp, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}) -}, - EatResult::EatUnchanged { tokens: __eu, .. } => { - let tokens = skip_newlines(tokens.clone()); -let base_imp = import_node(mod_path.clone(), true, Rc::new(vec![]), &start_span, mod_path_span); -let imp_ir = intern(&ctx.intern_table.clone(), &mod_path); -let ctx = Rc::new(ParseContext { intern_table: imp_ir.table.clone(), ..(*ctx.clone()).clone() }); -let imp = Rc::new(Node { ident: Some(imp_ir.id.clone()), ..(*base_imp).clone() }); -Rc::new(ImportResult { - import: imp, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}) -}, -} -} + import: err_import.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let mod_path = r.name.clone(); + let mod_path_span = r.span.clone(); + let tokens = r.tokens.clone(); + match (*eat(&tokens, Rc::new(ExpectedToken::ExpectLBrace))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { + let r = parse_import_names(__ec.clone(), ctx.clone()); + if has_err(r.err.clone()) { + return Rc::new(ImportResult { + import: err_import.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let names = r.names.clone(); + let tokens = r.tokens.clone(); + let ctx = r.ctx.clone(); + let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); + if has_err(r.err.clone()) { + return Rc::new(ImportResult { + import: err_import.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let tokens = skip_newlines(r.tokens.clone()); + let base_imp = + import_node(mod_path.clone(), false, names, &start_span, mod_path_span); + let imp_ir = intern(&ctx.intern_table.clone(), &mod_path); + let ctx = Rc::new(ParseContext { + intern_table: imp_ir.table.clone(), + ..(*ctx.clone()).clone() + }); + let imp = Rc::new(Node { + ident: Some(imp_ir.id.clone()), + ..(*base_imp).clone() + }); + Rc::new(ImportResult { + import: imp, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }) + } + EatResult::EatUnchanged { tokens: __eu, .. } => { + let tokens = skip_newlines(tokens.clone()); + let base_imp = import_node( + mod_path.clone(), + true, + Rc::new(vec![]), + &start_span, + mod_path_span, + ); + let imp_ir = intern(&ctx.intern_table.clone(), &mod_path); + let ctx = Rc::new(ParseContext { + intern_table: imp_ir.table.clone(), + ..(*ctx.clone()).clone() + }); + let imp = Rc::new(Node { + ident: Some(imp_ir.id.clone()), + ..(*base_imp).clone() + }); + Rc::new(ImportResult { + import: imp, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }) + } + } + } } pub fn parse_import_names(tokens: Rc>>, ctx: Rc) -> Rc { @@ -2045,60 +2351,72 @@ pub fn parsed_name_leaf(name: String, span: Rc) -> Rc { leaf_node_with_span(&name, &span) } -pub fn parse_import_names_acc(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { +pub fn parse_import_names_acc( + mut tokens: Rc>>, + mut ctx: Rc, + mut acc: Rc>>, +) -> Rc { loop { tokens = skip_newlines(tokens.clone()); -if tok_is_rbrace(tokens.clone().first().cloned()) { + if tok_is_rbrace(tokens.clone().first().cloned()) { break Rc::new(NamesResult { - names: acc, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}); -} else { + names: acc, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }); + } else { let r = parse_dotted_ident(tokens.clone()); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(NamesResult { - names: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let name_node = parsed_name_leaf(r.name.clone(), r.span.clone()); -tokens = skip_newlines(r.tokens.clone()); -let e = eat(&tokens, Rc::new(ExpectedToken::ExpectComma)); -tokens = skip_newlines(match (*e).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), - EatResult::EatUnchanged { .. } => tokens.clone(), -}); -{ + names: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let name_node = parsed_name_leaf(r.name.clone(), r.span.clone()); + tokens = skip_newlines(r.tokens.clone()); + let e = eat(&tokens, Rc::new(ExpectedToken::ExpectComma)); + tokens = skip_newlines(match (*e).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), + EatResult::EatUnchanged { .. } => tokens.clone(), + }); + { let __tco_0 = v2_rt::rc_list_push(acc, name_node); -acc = __tco_0; -continue; -} -} -} + acc = __tco_0; + continue; + } + } + } } pub fn find_item_form(forms: Rc>>, keyword: String) -> Option> { { - let matches = Rc::new({ let mut __result = Vec::new(); for f in forms.iter().cloned() { if (f.keyword.clone().as_str() == keyword.clone().as_str()) { __result.push(f); } } __result }); -match (matches.clone().len() as i64) { - 0 => None, - _ => Some(matches.clone().first().cloned().clone().unwrap()), -} -} + let matches = Rc::new({ + let mut __result = Vec::new(); + for f in forms.iter().cloned() { + if (f.keyword.clone().as_str() == keyword.clone().as_str()) { + __result.push(f); + } + } + __result + }); + match (matches.clone().len() as i64) { + 0 => None, + _ => Some(matches.clone().first().cloned().clone().unwrap()), + } + } } pub fn parse_item(tokens: &Rc>>, ctx: Rc) -> Rc { { let tokens = skip_newlines(tokens.clone()); -let tok = tokens.clone().first().cloned(); -let kw = tok_keyword_text(tok.clone()); -let span = token_span(tok.clone()); -let form = find_item_form(dag_syntax_spec().item_forms.clone(), kw); -match form { + let tok = tokens.clone().first().cloned(); + let kw = tok_keyword_text(tok.clone()); + let span = token_span(tok.clone()); + let form = find_item_form(dag_syntax_spec().item_forms.clone(), kw); + match form { Some(f) => parse_item_by_form(&tokens, &ctx, &f), None => Rc::new(ItemResult { item: Rc::new(Node { @@ -2126,947 +2444,1127 @@ match form { err: Some(parse_error("expected item declaration (type, fn, func, service, resource, data, extern, pattern, interface)".to_string(), span.clone())), }), } -} + } } -pub fn parse_item_prefix(tokens: &Rc>>, ctx: &Rc, form: &Rc) -> Rc { +pub fn parse_item_prefix( + tokens: &Rc>>, + ctx: &Rc, + form: &Rc, +) -> Rc { { let r = expect_ident(&tokens); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(ItemPrefixResult { - name: "".to_string(), - name_span: r.span.clone(), - type_params: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - uses: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let name = r.name.clone(); -let name_span = r.span.clone(); -let tokens = r.tokens.clone(); -let tp_result = if form.has_type_params.clone() { + name: "".to_string(), + name_span: r.span.clone(), + type_params: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + uses: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let name = r.name.clone(); + let name_span = r.span.clone(); + let tokens = r.tokens.clone(); + let tp_result = if form.has_type_params.clone() { parse_optional_type_params(&tokens, ctx.clone()) } else { Rc::new(TypeParamsResult { - params: Rc::new(vec![]), - tokens: tokens.clone(), - ctx: ctx.clone(), -}) + params: Rc::new(vec![]), + tokens: tokens.clone(), + ctx: ctx.clone(), + }) }; -let tokens = tp_result.tokens.clone(); -let ctx = tp_result.ctx.clone(); -let params_result = if form.has_params.clone() { + let tokens = tp_result.tokens.clone(); + let ctx = tp_result.ctx.clone(); + let params_result = if form.has_params.clone() { parse_params(&tokens, &ctx) } else { Rc::new(ParamsResult { - params: Rc::new(vec![]), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}) + params: Rc::new(vec![]), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }) }; -if has_err(params_result.err.clone()) { + if has_err(params_result.err.clone()) { return Rc::new(ItemPrefixResult { - name: name.clone(), - name_span: name_span.clone(), - type_params: tp_result.params.clone(), - params: Rc::new(vec![]), - inferred: None, - uses: Rc::new(vec![]), - tokens: params_result.tokens.clone(), - ctx: params_result.ctx.clone(), - err: params_result.err.clone(), -}) - } -let tokens = params_result.tokens.clone(); -let ctx = params_result.ctx.clone(); -let ret_result = if form.has_return_type.clone() { + name: name.clone(), + name_span: name_span.clone(), + type_params: tp_result.params.clone(), + params: Rc::new(vec![]), + inferred: None, + uses: Rc::new(vec![]), + tokens: params_result.tokens.clone(), + ctx: params_result.ctx.clone(), + err: params_result.err.clone(), + }); + } + let tokens = params_result.tokens.clone(); + let ctx = params_result.ctx.clone(); + let ret_result = if form.has_return_type.clone() { parse_optional_inferred(&tokens, ctx.clone()) } else { Rc::new(OptRetResult { - inferred: None, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}) + inferred: None, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }) }; -if has_err(ret_result.err.clone()) { + if has_err(ret_result.err.clone()) { return Rc::new(ItemPrefixResult { - name: name.clone(), - name_span: name_span.clone(), - type_params: tp_result.params.clone(), - params: params_result.params.clone(), - inferred: None, - uses: Rc::new(vec![]), - tokens: ret_result.tokens.clone(), - ctx: ret_result.ctx.clone(), - err: ret_result.err.clone(), -}) - } -let tokens = ret_result.tokens.clone(); -let ctx = ret_result.ctx.clone(); -let missing_required_ret = (form.return_required.clone() && match ret_result.inferred.clone() { - Some(_) => false, - None => true, -}); -if missing_required_ret { + name: name.clone(), + name_span: name_span.clone(), + type_params: tp_result.params.clone(), + params: params_result.params.clone(), + inferred: None, + uses: Rc::new(vec![]), + tokens: ret_result.tokens.clone(), + ctx: ret_result.ctx.clone(), + err: ret_result.err.clone(), + }); + } + let tokens = ret_result.tokens.clone(); + let ctx = ret_result.ctx.clone(); + let missing_required_ret = (form.return_required.clone() + && match ret_result.inferred.clone() { + Some(_) => false, + None => true, + }); + if missing_required_ret { return Rc::new(ItemPrefixResult { - name: name.clone(), - name_span: name_span.clone(), - type_params: tp_result.params.clone(), - params: params_result.params.clone(), - inferred: None, - uses: Rc::new(vec![]), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: Some(parse_error(v2_rt::concat("expected return type annotation (-> Type) for '".to_string(), v2_rt::concat(form.keyword.clone(), v2_rt::concat(" ".to_string(), name.clone()))), token_span(tokens.clone().first().cloned()))), -}) - } -let uses_result = if form.has_uses.clone() { + name: name.clone(), + name_span: name_span.clone(), + type_params: tp_result.params.clone(), + params: params_result.params.clone(), + inferred: None, + uses: Rc::new(vec![]), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: Some(parse_error( + v2_rt::concat( + "expected return type annotation (-> Type) for '".to_string(), + v2_rt::concat( + form.keyword.clone(), + v2_rt::concat(" ".to_string(), name.clone()), + ), + ), + token_span(tokens.clone().first().cloned()), + )), + }); + } + let uses_result = if form.has_uses.clone() { parse_uses_clause(&skip_newlines(tokens.clone()), ctx.clone()) } else { Rc::new(UsesResult { - uses: Rc::new(vec![]), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}) + uses: Rc::new(vec![]), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }) }; -if has_err(uses_result.err.clone()) { + if has_err(uses_result.err.clone()) { return Rc::new(ItemPrefixResult { - name: name.clone(), - name_span: name_span.clone(), - type_params: tp_result.params.clone(), - params: params_result.params.clone(), - inferred: ret_result.inferred.clone(), - uses: Rc::new(vec![]), - tokens: uses_result.tokens.clone(), - ctx: uses_result.ctx.clone(), - err: uses_result.err.clone(), -}) - } -Rc::new(ItemPrefixResult { - name: name.clone(), - name_span: name_span.clone(), - type_params: tp_result.params.clone(), - params: params_result.params.clone(), - inferred: ret_result.inferred.clone(), - uses: uses_result.uses.clone(), - tokens: uses_result.tokens.clone(), - ctx: uses_result.ctx.clone(), - err: None, -}) -} -} - -pub fn parse_item_by_form(tokens: &Rc>>, ctx: &Rc, form: &Rc) -> Rc { + name: name.clone(), + name_span: name_span.clone(), + type_params: tp_result.params.clone(), + params: params_result.params.clone(), + inferred: ret_result.inferred.clone(), + uses: Rc::new(vec![]), + tokens: uses_result.tokens.clone(), + ctx: uses_result.ctx.clone(), + err: uses_result.err.clone(), + }); + } + Rc::new(ItemPrefixResult { + name: name.clone(), + name_span: name_span.clone(), + type_params: tp_result.params.clone(), + params: params_result.params.clone(), + inferred: ret_result.inferred.clone(), + uses: uses_result.uses.clone(), + tokens: uses_result.tokens.clone(), + ctx: uses_result.ctx.clone(), + err: None, + }) + } +} + +pub fn parse_item_by_form( + tokens: &Rc>>, + ctx: &Rc, + form: &Rc, +) -> Rc { { let start_span = token_span(tokens.clone().first().cloned()); -let dummy = Rc::new(Node { - name: "".to_string(), - span: start_span.clone(), - ident_span: None, - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { - text: form.keyword.clone(), -})); -if has_err(r.err.clone()) { + let dummy = Rc::new(Node { + name: "".to_string(), + span: start_span.clone(), + ident_span: None, + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + let r = expect( + &tokens, + &Rc::new(ExpectedToken::ExpectKeyword { + text: form.keyword.clone(), + }), + ); + if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: dummy.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let tokens = r.tokens.clone(); -match form.body_kind.clone() { - BodyKind::TypeBody => { - let prefix = parse_item_prefix(&tokens, &ctx, &form); -if has_err(prefix.err.clone()) { - return Rc::new(ItemResult { - item: dummy.clone(), - tokens: prefix.tokens.clone(), - ctx: prefix.ctx.clone(), - err: prefix.err.clone(), -}) - } -parse_type_body_from_prefix(&prefix, &start_span) -}, - BodyKind::ExprBody => { - let prefix = parse_item_prefix(&tokens, &ctx, &form); -if has_err(prefix.err.clone()) { - return Rc::new(ItemResult { - item: dummy.clone(), - tokens: prefix.tokens.clone(), - ctx: prefix.ctx.clone(), - err: prefix.err.clone(), -}) - } -parse_fn_body_from_prefix(&prefix, &start_span) -}, - BodyKind::BlockBody => { - let prefix = parse_item_prefix(&tokens, &ctx, &form); -if has_err(prefix.err.clone()) { - return Rc::new(ItemResult { - item: dummy.clone(), - tokens: prefix.tokens.clone(), - ctx: prefix.ctx.clone(), - err: prefix.err.clone(), -}) - } -parse_block_body_from_prefix(&prefix, &start_span) -}, - BodyKind::ServiceBody => parse_service_after_kw(&tokens, &ctx, &start_span), - BodyKind::ResourceBody => parse_resource_after_kw(tokens.clone(), &ctx, &start_span), - BodyKind::ValueBody => parse_data_after_kw(tokens.clone(), &ctx, &start_span), - BodyKind::NoBody => { - let prefix = parse_item_prefix(&tokens, &ctx, &form); -if has_err(prefix.err.clone()) { - return Rc::new(ItemResult { - item: dummy.clone(), - tokens: prefix.tokens.clone(), - ctx: prefix.ctx.clone(), - err: prefix.err.clone(), -}) - } -parse_no_body_from_prefix(&prefix, start_span.clone()) -}, -} -} -} - -pub fn field_to_child_node(field: &Rc, source_indices: &Rc>>) -> Rc { - { - let ret_type = field_node_type_expr(&field); -let props = match field_node_from_key(field.clone(), source_indices.clone()) { - Some(key) => Rc::new(vec![make_field_init_node(&"from_key".to_string(), make_expr_node(Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitStr { - value: key.clone(), -}), -}), Rc::new(vec![]), None, field.span.clone()), field.span.clone(), no_span())]), - None => Rc::new(vec![]), -}; -Rc::new(Node { - name: field_node_name_at(field.clone(), source_indices.clone()), - span: field.span.clone(), - ident_span: field.ident_span.clone(), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::Resolved { - node: ret_type, -})), - return_cardinality: field_node_cardinality(field.clone()), - uses: Rc::new(vec![]), - body: field_node_default_value(&field), - transport: None, - properties: props, - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}) + item: dummy.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let tokens = r.tokens.clone(); + match form.body_kind.clone() { + BodyKind::TypeBody => { + let prefix = parse_item_prefix(&tokens, &ctx, &form); + if has_err(prefix.err.clone()) { + return Rc::new(ItemResult { + item: dummy.clone(), + tokens: prefix.tokens.clone(), + ctx: prefix.ctx.clone(), + err: prefix.err.clone(), + }); + } + parse_type_body_from_prefix(&prefix, &start_span) + } + BodyKind::ExprBody => { + let prefix = parse_item_prefix(&tokens, &ctx, &form); + if has_err(prefix.err.clone()) { + return Rc::new(ItemResult { + item: dummy.clone(), + tokens: prefix.tokens.clone(), + ctx: prefix.ctx.clone(), + err: prefix.err.clone(), + }); + } + parse_fn_body_from_prefix(&prefix, &start_span) + } + BodyKind::BlockBody => { + let prefix = parse_item_prefix(&tokens, &ctx, &form); + if has_err(prefix.err.clone()) { + return Rc::new(ItemResult { + item: dummy.clone(), + tokens: prefix.tokens.clone(), + ctx: prefix.ctx.clone(), + err: prefix.err.clone(), + }); + } + parse_block_body_from_prefix(&prefix, &start_span) + } + BodyKind::ServiceBody => parse_service_after_kw(&tokens, &ctx, &start_span), + BodyKind::ResourceBody => parse_resource_after_kw(tokens.clone(), &ctx, &start_span), + BodyKind::ValueBody => parse_data_after_kw(tokens.clone(), &ctx, &start_span), + BodyKind::NoBody => { + let prefix = parse_item_prefix(&tokens, &ctx, &form); + if has_err(prefix.err.clone()) { + return Rc::new(ItemResult { + item: dummy.clone(), + tokens: prefix.tokens.clone(), + ctx: prefix.ctx.clone(), + err: prefix.err.clone(), + }); + } + parse_no_body_from_prefix(&prefix, start_span.clone()) + } + } + } } + +pub fn field_to_child_node( + field: &Rc, + source_indices: &Rc>>, +) -> Rc { + { + let ret_type = field_node_type_expr(&field); + let props = match field_node_from_key(field.clone(), source_indices.clone()) { + Some(key) => Rc::new(vec![make_field_init_node( + &"from_key".to_string(), + make_expr_node( + Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitStr { value: key.clone() }), + }), + Rc::new(vec![]), + None, + field.span.clone(), + ), + field.span.clone(), + no_span(), + )]), + None => Rc::new(vec![]), + }; + Rc::new(Node { + name: field_node_name_at(field.clone(), source_indices.clone()), + span: field.span.clone(), + ident_span: field.ident_span.clone(), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::Resolved { node: ret_type })), + return_cardinality: field_node_cardinality(field.clone()), + uses: Rc::new(vec![]), + body: field_node_default_value(&field), + transport: None, + properties: props, + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }) + } } -pub fn variant_to_child_node(variant: &Rc, source_indices: &Rc>>) -> Rc { +pub fn variant_to_child_node( + variant: &Rc, + source_indices: &Rc>>, +) -> Rc { { let fields = variant_node_fields(variant.clone()); -let children = Rc::new({ let mut __result = Vec::new(); for f in fields.clone().iter().cloned() { __result.push(field_to_child_node(&f, &source_indices)); } __result }); -Rc::new(Node { - name: variant_node_name_at(variant.clone(), source_indices.clone()), - span: variant.span.clone(), - ident_span: variant.ident_span.clone(), - children: children, - connective: if ((fields.clone().len() as i64) > 0) { - Connective::Conj - } else { - Connective::NoConnective - }, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}) -} + let children = Rc::new({ + let mut __result = Vec::new(); + for f in fields.clone().iter().cloned() { + __result.push(field_to_child_node(&f, &source_indices)); + } + __result + }); + Rc::new(Node { + name: variant_node_name_at(variant.clone(), source_indices.clone()), + span: variant.span.clone(), + ident_span: variant.ident_span.clone(), + children: children, + connective: if ((fields.clone().len() as i64) > 0) { + Connective::Conj + } else { + Connective::NoConnective + }, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }) + } } -pub fn outputs_to_inferred(outputs: &Rc>>, span: Rc, source_indices: Rc>>) -> Option> { +pub fn outputs_to_inferred( + outputs: &Rc>>, + span: Rc, + source_indices: Rc>>, +) -> Option> { if ((outputs.clone().len() as i64) > 0) { Some(Rc::new(InferredNode::Resolved { - node: Rc::new(Node { - name: "".to_string(), - span: span, - ident_span: None, - children: Rc::new({ let mut __result = Vec::new(); for f in outputs.clone().iter().cloned() { __result.push(field_to_child_node(&f, &source_indices)); } __result }), - connective: Connective::Conj, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}), -})) + node: Rc::new(Node { + name: "".to_string(), + span: span, + ident_span: None, + children: Rc::new({ + let mut __result = Vec::new(); + for f in outputs.clone().iter().cloned() { + __result.push(field_to_child_node(&f, &source_indices)); + } + __result + }), + connective: Connective::Conj, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }), + })) } else { None } } -pub fn make_operation_node(name: String, ident_span: Option>, inputs: Rc>>, outputs: Rc>>, response_props: Rc>>, mock_props: Rc>>, exit_props: Rc>>, modifier_props: Rc>>, transport: Option>, span: &Rc, source_indices: &Rc>>) -> Rc { +pub fn make_operation_node( + name: String, + ident_span: Option>, + inputs: Rc>>, + outputs: Rc>>, + response_props: Rc>>, + mock_props: Rc>>, + exit_props: Rc>>, + modifier_props: Rc>>, + transport: Option>, + span: &Rc, + source_indices: &Rc>>, +) -> Rc { { - let all_props = v2_rt::concat(v2_rt::concat(v2_rt::concat(modifier_props, response_props), exit_props), mock_props); -Rc::new(Node { - name: name, - span: span.clone(), - ident_span: ident_span, - children: Rc::new(vec![]), - params: Rc::new({ let mut __result = Vec::new(); for f in inputs.iter().cloned() { __result.push(make_param_node(&field_node_name_at(f.clone(), source_indices.clone()), field_node_type_expr(&f), field_node_default_value(&f), f.span.clone(), node_name_span(&f))); } __result }), - inferred: outputs_to_inferred(&outputs, span.clone(), source_indices.clone()), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: transport, - properties: all_props, - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}) -} + let all_props = v2_rt::concat( + v2_rt::concat(v2_rt::concat(modifier_props, response_props), exit_props), + mock_props, + ); + Rc::new(Node { + name: name, + span: span.clone(), + ident_span: ident_span, + children: Rc::new(vec![]), + params: Rc::new({ + let mut __result = Vec::new(); + for f in inputs.iter().cloned() { + __result.push(make_param_node( + &field_node_name_at(f.clone(), source_indices.clone()), + field_node_type_expr(&f), + field_node_default_value(&f), + f.span.clone(), + node_name_span(&f), + )); + } + __result + }), + inferred: outputs_to_inferred(&outputs, span.clone(), source_indices.clone()), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: transport, + properties: all_props, + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }) + } } -pub fn make_capability_node(name: String, ident_span: Option>, inputs: Rc>>, outputs: Rc>>, span: &Rc, source_indices: &Rc>>) -> Rc { +pub fn make_capability_node( + name: String, + ident_span: Option>, + inputs: Rc>>, + outputs: Rc>>, + span: &Rc, + source_indices: &Rc>>, +) -> Rc { Rc::new(Node { - name: name, - span: span.clone(), - ident_span: ident_span, - children: Rc::new(vec![]), - params: Rc::new({ let mut __result = Vec::new(); for f in inputs.iter().cloned() { __result.push(make_param_node(&field_node_name_at(f.clone(), source_indices.clone()), field_node_type_expr(&f), field_node_default_value(&f), f.span.clone(), node_name_span(&f))); } __result }), - inferred: outputs_to_inferred(&outputs, span.clone(), source_indices.clone()), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}) + name: name, + span: span.clone(), + ident_span: ident_span, + children: Rc::new(vec![]), + params: Rc::new({ + let mut __result = Vec::new(); + for f in inputs.iter().cloned() { + __result.push(make_param_node( + &field_node_name_at(f.clone(), source_indices.clone()), + field_node_type_expr(&f), + field_node_default_value(&f), + f.span.clone(), + node_name_span(&f), + )); + } + __result + }), + inferred: outputs_to_inferred(&outputs, span.clone(), source_indices.clone()), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }) } pub fn parse_type_def(tokens: &Rc>>, ctx: &Rc) -> Rc { { let start_span = token_span(tokens.clone().first().cloned()); -let dummy = Rc::new(Node { - name: "".to_string(), - span: start_span.clone(), - ident_span: None, - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { - text: "type".to_string(), -})); -if has_err(r.err.clone()) { + let dummy = Rc::new(Node { + name: "".to_string(), + span: start_span.clone(), + ident_span: None, + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + let r = expect( + &tokens, + &Rc::new(ExpectedToken::ExpectKeyword { + text: "type".to_string(), + }), + ); + if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: dummy, - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) + item: dummy, + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); } -parse_type_after_kw(&r.tokens.clone(), &ctx, &start_span) -} + parse_type_after_kw(&r.tokens.clone(), &ctx, &start_span) + } } -pub fn parse_type_after_kw(tokens: &Rc>>, ctx: &Rc, start_span: &Rc) -> Rc { +pub fn parse_type_after_kw( + tokens: &Rc>>, + ctx: &Rc, + start_span: &Rc, +) -> Rc { { let dummy = Rc::new(Node { - name: "".to_string(), - span: start_span.clone(), - ident_span: None, - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -let r = expect_ident(&tokens); -if has_err(r.err.clone()) { + name: "".to_string(), + span: start_span.clone(), + ident_span: None, + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + let r = expect_ident(&tokens); + if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: dummy, - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let name = r.name.clone(); -let name_span = r.span.clone(); -let tokens = r.tokens.clone(); -let type_params_result = parse_optional_type_params(&tokens, ctx.clone()); -let type_params = type_params_result.params.clone(); -let tokens = skip_newlines(type_params_result.tokens.clone()); -let ctx = type_params_result.ctx.clone(); -let tokens = type_body_tokens_after_modifiers(tokens.clone()); -match (*eat(&tokens, Rc::new(ExpectedToken::ExpectLBrace))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let r = parse_field_list(skip_newlines(__ec.clone()), ctx.clone()); -let named_dummy = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: Rc::new(vec![]), - params: type_params.clone(), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -if has_err(r.err.clone()) { - return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let tokens = skip_newlines(r.tokens.clone()); -let ctx = r.ctx.clone(); -let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); -if has_err(r2.err.clone()) { - return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), -}) - } -let type_children = Rc::new({ let mut __result = Vec::new(); for f in r.fields.clone().iter().cloned() { __result.push(field_to_child_node(&f, &ctx.source_indices.clone())); } __result }); -let item = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: type_children, - connective: Connective::Conj, - params: type_params.clone(), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -Rc::new(ItemResult { - item: item, - tokens: skip_newlines(r2.tokens.clone()), - ctx: ctx.clone(), - err: None, -}) -}, - EatResult::EatUnchanged { tokens: __eu, .. } => match (*eat(&tokens, Rc::new(ExpectedToken::ExpectEq))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let tokens = skip_newlines(__ec.clone()); -parse_type_body_after_eq(&tokens, &ctx, &name, &name_span, &start_span, &type_params) -}, - EatResult::EatUnchanged { tokens: __eu, .. } => { - let item = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: type_params.clone(), - inferred: Some(Rc::new(InferredNode::Resolved { - node: leaf_type_node(&name, &name_span), -})), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -Rc::new(ItemResult { - item: item, - tokens: __eu.clone(), - ctx: ctx.clone(), - err: None, -}) -}, -}, -} -} + item: dummy, + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let name = r.name.clone(); + let name_span = r.span.clone(); + let tokens = r.tokens.clone(); + let type_params_result = parse_optional_type_params(&tokens, ctx.clone()); + let type_params = type_params_result.params.clone(); + let tokens = skip_newlines(type_params_result.tokens.clone()); + let ctx = type_params_result.ctx.clone(); + let tokens = type_body_tokens_after_modifiers(tokens.clone()); + match (*eat(&tokens, Rc::new(ExpectedToken::ExpectLBrace))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { + let r = parse_field_list(skip_newlines(__ec.clone()), ctx.clone()); + let named_dummy = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: Rc::new(vec![]), + params: type_params.clone(), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + if has_err(r.err.clone()) { + return Rc::new(ItemResult { + item: named_dummy.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let tokens = skip_newlines(r.tokens.clone()); + let ctx = r.ctx.clone(); + let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); + if has_err(r2.err.clone()) { + return Rc::new(ItemResult { + item: named_dummy.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), + }); + } + let type_children = Rc::new({ + let mut __result = Vec::new(); + for f in r.fields.clone().iter().cloned() { + __result.push(field_to_child_node(&f, &ctx.source_indices.clone())); + } + __result + }); + let item = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: type_children, + connective: Connective::Conj, + params: type_params.clone(), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + Rc::new(ItemResult { + item: item, + tokens: skip_newlines(r2.tokens.clone()), + ctx: ctx.clone(), + err: None, + }) + } + EatResult::EatUnchanged { tokens: __eu, .. } => { + match (*eat(&tokens, Rc::new(ExpectedToken::ExpectEq))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { + let tokens = skip_newlines(__ec.clone()); + parse_type_body_after_eq( + &tokens, + &ctx, + &name, + &name_span, + &start_span, + &type_params, + ) + } + EatResult::EatUnchanged { tokens: __eu, .. } => { + let item = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: type_params.clone(), + inferred: Some(Rc::new(InferredNode::Resolved { + node: leaf_type_node(&name, &name_span), + })), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + Rc::new(ItemResult { + item: item, + tokens: __eu.clone(), + ctx: ctx.clone(), + err: None, + }) + } + } + } + } + } } -pub fn parse_type_body_from_prefix(prefix: &Rc, start_span: &Rc) -> Rc { +pub fn parse_type_body_from_prefix( + prefix: &Rc, + start_span: &Rc, +) -> Rc { { let name = prefix.name.clone(); -let name_span = prefix.name_span.clone(); -let type_params = prefix.type_params.clone(); -let ctx = prefix.ctx.clone(); -let named_dummy = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: Rc::new(vec![]), - params: type_params.clone(), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -let tokens = type_body_tokens_after_modifiers(skip_newlines(prefix.tokens.clone())); -match (*eat(&tokens, Rc::new(ExpectedToken::ExpectLBrace))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let r = parse_field_list(skip_newlines(__ec.clone()), ctx.clone()); -if has_err(r.err.clone()) { - return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let tokens = skip_newlines(r.tokens.clone()); -let ctx = r.ctx.clone(); -let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); -if has_err(r2.err.clone()) { - return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), -}) - } -let type_children = Rc::new({ let mut __result = Vec::new(); for f in r.fields.clone().iter().cloned() { __result.push(field_to_child_node(&f, &ctx.source_indices.clone())); } __result }); -let item = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: type_children, - connective: Connective::Conj, - params: type_params.clone(), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -Rc::new(ItemResult { - item: item, - tokens: skip_newlines(r2.tokens.clone()), - ctx: ctx.clone(), - err: None, -}) -}, - EatResult::EatUnchanged { tokens: __eu, .. } => match (*eat(&tokens, Rc::new(ExpectedToken::ExpectEq))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let tokens = skip_newlines(__ec.clone()); -parse_type_body_after_eq(&tokens, &ctx, &name, &name_span, &start_span, &type_params) -}, - EatResult::EatUnchanged { tokens: __eu, .. } => { - let item = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: type_params.clone(), - inferred: Some(Rc::new(InferredNode::Resolved { - node: leaf_type_node(&name, &name_span), -})), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -Rc::new(ItemResult { - item: item, - tokens: __eu.clone(), - ctx: ctx.clone(), - err: None, -}) -}, -}, -} -} + let name_span = prefix.name_span.clone(); + let type_params = prefix.type_params.clone(); + let ctx = prefix.ctx.clone(); + let named_dummy = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: Rc::new(vec![]), + params: type_params.clone(), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + let tokens = type_body_tokens_after_modifiers(skip_newlines(prefix.tokens.clone())); + match (*eat(&tokens, Rc::new(ExpectedToken::ExpectLBrace))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { + let r = parse_field_list(skip_newlines(__ec.clone()), ctx.clone()); + if has_err(r.err.clone()) { + return Rc::new(ItemResult { + item: named_dummy.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let tokens = skip_newlines(r.tokens.clone()); + let ctx = r.ctx.clone(); + let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); + if has_err(r2.err.clone()) { + return Rc::new(ItemResult { + item: named_dummy.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), + }); + } + let type_children = Rc::new({ + let mut __result = Vec::new(); + for f in r.fields.clone().iter().cloned() { + __result.push(field_to_child_node(&f, &ctx.source_indices.clone())); + } + __result + }); + let item = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: type_children, + connective: Connective::Conj, + params: type_params.clone(), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + Rc::new(ItemResult { + item: item, + tokens: skip_newlines(r2.tokens.clone()), + ctx: ctx.clone(), + err: None, + }) + } + EatResult::EatUnchanged { tokens: __eu, .. } => { + match (*eat(&tokens, Rc::new(ExpectedToken::ExpectEq))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { + let tokens = skip_newlines(__ec.clone()); + parse_type_body_after_eq( + &tokens, + &ctx, + &name, + &name_span, + &start_span, + &type_params, + ) + } + EatResult::EatUnchanged { tokens: __eu, .. } => { + let item = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: type_params.clone(), + inferred: Some(Rc::new(InferredNode::Resolved { + node: leaf_type_node(&name, &name_span), + })), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + Rc::new(ItemResult { + item: item, + tokens: __eu.clone(), + ctx: ctx.clone(), + err: None, + }) + } + } + } + } + } } -pub fn parse_type_body_after_eq(tokens: &Rc>>, ctx: &Rc, name: &String, name_span: &Rc, start_span: &Rc, type_params: &Rc>>) -> Rc { +pub fn parse_type_body_after_eq( + tokens: &Rc>>, + ctx: &Rc, + name: &String, + name_span: &Rc, + start_span: &Rc, + type_params: &Rc>>, +) -> Rc { { let dummy = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: Rc::new(vec![]), - params: type_params.clone(), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -if tok_is_ident(tokens.clone().first().cloned()) { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: Rc::new(vec![]), + params: type_params.clone(), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + if tok_is_ident(tokens.clone().first().cloned()) { { let r = expect_ident(&tokens); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: dummy.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) + item: dummy.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); } -let first_name = r.name.clone(); -let first_name_span = r.span.clone(); -let tokens = skip_newlines(r.tokens.clone()); -if (tok_is_lbrace(tokens.clone().first().cloned()) || tok_is_pipe(tokens.clone().first().cloned())) { - { - let r = parse_variant_fields(&tokens, ctx.clone(), &first_name, &first_name_span); -if has_err(r.err.clone()) { - return Rc::new(ItemResult { - item: dummy.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let first_variant = r.variant.clone(); -let rest = parse_more_variants_acc(r.tokens.clone(), r.ctx.clone(), Rc::new(vec![first_variant])); -if has_err(rest.err.clone()) { - return Rc::new(ItemResult { - item: dummy.clone(), - tokens: rest.tokens.clone(), - ctx: rest.ctx.clone(), - err: rest.err.clone(), -}) - } -let variants = rest.variants.clone(); -let type_children = Rc::new({ let mut __result = Vec::new(); for v in variants.iter().cloned() { __result.push(variant_to_child_node(&v, &ctx.source_indices.clone())); } __result }); -let item = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: type_children, - connective: Connective::Disj, - params: type_params.clone(), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -Rc::new(ItemResult { - item: item, - tokens: skip_newlines(rest.tokens.clone()), - ctx: rest.ctx.clone(), - err: None, -}) -} + let first_name = r.name.clone(); + let first_name_span = r.span.clone(); + let tokens = skip_newlines(r.tokens.clone()); + if (tok_is_lbrace(tokens.clone().first().cloned()) + || tok_is_pipe(tokens.clone().first().cloned())) + { + { + let r = parse_variant_fields( + &tokens, + ctx.clone(), + &first_name, + &first_name_span, + ); + if has_err(r.err.clone()) { + return Rc::new(ItemResult { + item: dummy.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let first_variant = r.variant.clone(); + let rest = parse_more_variants_acc( + r.tokens.clone(), + r.ctx.clone(), + Rc::new(vec![first_variant]), + ); + if has_err(rest.err.clone()) { + return Rc::new(ItemResult { + item: dummy.clone(), + tokens: rest.tokens.clone(), + ctx: rest.ctx.clone(), + err: rest.err.clone(), + }); + } + let variants = rest.variants.clone(); + let type_children = Rc::new({ + let mut __result = Vec::new(); + for v in variants.iter().cloned() { + __result + .push(variant_to_child_node(&v, &ctx.source_indices.clone())); + } + __result + }); + let item = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: type_children, + connective: Connective::Disj, + params: type_params.clone(), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + Rc::new(ItemResult { + item: item, + tokens: skip_newlines(rest.tokens.clone()), + ctx: rest.ctx.clone(), + err: None, + }) + } } else { { - let r = finish_type_expr_from_name(&tokens, ctx.clone(), &first_name, &first_name_span); -if has_err(r.err.clone()) { + let r = finish_type_expr_from_name( + &tokens, + ctx.clone(), + &first_name, + &first_name_span, + ); + if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: dummy.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) + item: dummy.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); } -let wr = try_where_clause(&r.tokens.clone(), r.ctx.clone(), &r.type_expr.clone(), &start_span); -if has_err(wr.err.clone()) { + let wr = try_where_clause( + &r.tokens.clone(), + r.ctx.clone(), + &r.type_expr.clone(), + &start_span, + ); + if has_err(wr.err.clone()) { return Rc::new(ItemResult { - item: dummy.clone(), - tokens: wr.tokens.clone(), - ctx: wr.ctx.clone(), - err: wr.err.clone(), -}) + item: dummy.clone(), + tokens: wr.tokens.clone(), + ctx: wr.ctx.clone(), + err: wr.err.clone(), + }); } -let item = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: type_params.clone(), - inferred: Some(Rc::new(InferredNode::Resolved { - node: wr.type_expr.clone(), -})), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -Rc::new(ItemResult { - item: item, - tokens: skip_newlines(wr.tokens.clone()), - ctx: wr.ctx.clone(), - err: None, -}) -} + let item = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: type_params.clone(), + inferred: Some(Rc::new(InferredNode::Resolved { + node: wr.type_expr.clone(), + })), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + Rc::new(ItemResult { + item: item, + tokens: skip_newlines(wr.tokens.clone()), + ctx: wr.ctx.clone(), + err: None, + }) + } } -} + } } else { { let r = parse_type_expr(&tokens, &ctx); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: dummy.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let wr = try_where_clause(&r.tokens.clone(), r.ctx.clone(), &r.type_expr.clone(), &start_span); -if has_err(wr.err.clone()) { + item: dummy.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let wr = try_where_clause( + &r.tokens.clone(), + r.ctx.clone(), + &r.type_expr.clone(), + &start_span, + ); + if has_err(wr.err.clone()) { return Rc::new(ItemResult { - item: dummy.clone(), - tokens: wr.tokens.clone(), - ctx: wr.ctx.clone(), - err: wr.err.clone(), -}) - } -let item = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: type_params.clone(), - inferred: Some(Rc::new(InferredNode::Resolved { - node: wr.type_expr.clone(), -})), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -Rc::new(ItemResult { - item: item, - tokens: skip_newlines(wr.tokens.clone()), - ctx: wr.ctx.clone(), - err: None, -}) -} + item: dummy.clone(), + tokens: wr.tokens.clone(), + ctx: wr.ctx.clone(), + err: wr.err.clone(), + }); + } + let item = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: type_params.clone(), + inferred: Some(Rc::new(InferredNode::Resolved { + node: wr.type_expr.clone(), + })), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + Rc::new(ItemResult { + item: item, + tokens: skip_newlines(wr.tokens.clone()), + ctx: wr.ctx.clone(), + err: None, + }) + } } -} + } } -pub fn try_where_clause(tokens: &Rc>>, ctx: Rc, base_te: &Rc, start_span: &Rc) -> Rc { +pub fn try_where_clause( + tokens: &Rc>>, + ctx: Rc, + base_te: &Rc, + start_span: &Rc, +) -> Rc { if tok_is_keyword(tokens.clone().first().cloned(), "where".to_string()) { match (*advance(&tokens)).clone() { - AdvanceResult::AdvanceOk { tokens: rest, .. } => { - let r = parse_predicates(rest.clone(), ctx); -if has_err(r.err.clone()) { - return Rc::new(TypeResult { - type_expr: base_te.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let predicate_node = Rc::new(Node { - name: "".to_string(), - span: start_span.clone(), - ident_span: None, - children: r.predicates.clone(), - connective: Connective::Conj, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -let refined = Rc::new(Node { - name: "".to_string(), - span: start_span.clone(), - ident_span: None, - children: Rc::new(vec![base_te.clone()]), - connective: Connective::Conj, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: Some(predicate_node), - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -Rc::new(TypeResult { - type_expr: refined, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -}, - AdvanceResult::AdvanceEof => Rc::new(TypeResult { - type_expr: base_te.clone(), - tokens: tokens.clone(), - ctx: ctx, - err: None, -}), -} + AdvanceResult::AdvanceOk { tokens: rest, .. } => { + let r = parse_predicates(rest.clone(), ctx); + if has_err(r.err.clone()) { + return Rc::new(TypeResult { + type_expr: base_te.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let predicate_node = Rc::new(Node { + name: "".to_string(), + span: start_span.clone(), + ident_span: None, + children: r.predicates.clone(), + connective: Connective::Conj, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + let refined = Rc::new(Node { + name: "".to_string(), + span: start_span.clone(), + ident_span: None, + children: Rc::new(vec![base_te.clone()]), + connective: Connective::Conj, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: Some(predicate_node), + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + Rc::new(TypeResult { + type_expr: refined, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } + AdvanceResult::AdvanceEof => Rc::new(TypeResult { + type_expr: base_te.clone(), + tokens: tokens.clone(), + ctx: ctx, + err: None, + }), + } } else { Rc::new(TypeResult { - type_expr: base_te.clone(), - tokens: tokens.clone(), - ctx: ctx, - err: None, -}) + type_expr: base_te.clone(), + tokens: tokens.clone(), + ctx: ctx, + err: None, + }) } } @@ -3074,757 +3572,1005 @@ pub fn parse_predicates(tokens: Rc>>, ctx: Rc) -> Rc parse_predicates_acc(tokens, ctx, Rc::new(vec![])) } -pub fn parse_predicates_acc(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { +pub fn parse_predicates_acc( + mut tokens: Rc>>, + mut ctx: Rc, + mut acc: Rc>>, +) -> Rc { loop { let r = parse_single_predicate(&tokens, &ctx); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(PredsResult { - predicates: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -acc = v2_rt::rc_list_push(acc.clone(), r.predicate.clone()); -match (*eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { { - let __tco_0 = skip_newlines(__ec.clone()); -let __tco_1 = r.ctx.clone(); -tokens = __tco_0; -ctx = __tco_1; -continue; -} }, - EatResult::EatUnchanged { tokens: __eu, .. } => { break Rc::new(PredsResult { - predicates: acc.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}); }, -} -} -} - -pub fn parse_single_predicate(tokens: &Rc>>, ctx: &Rc) -> Rc { + predicates: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + acc = v2_rt::rc_list_push(acc.clone(), r.predicate.clone()); + match (*eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { + let __tco_0 = skip_newlines(__ec.clone()); + let __tco_1 = r.ctx.clone(); + tokens = __tco_0; + ctx = __tco_1; + continue; + } + EatResult::EatUnchanged { tokens: __eu, .. } => { + break Rc::new(PredsResult { + predicates: acc.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }); + } + } + } +} + +pub fn parse_single_predicate( + tokens: &Rc>>, + ctx: &Rc, +) -> Rc { { let zero_span = make_span(0, 0); -let dummy_pred = make_field_init_node(&"".to_string(), make_expr_node(Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitBool { - value: false, -}), -}), Rc::new(vec![]), None, zero_span.clone()), zero_span.clone(), zero_span.clone()); -let r = expect_name(&tokens); -if has_err(r.err.clone()) { + let dummy_pred = make_field_init_node( + &"".to_string(), + make_expr_node( + Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitBool { value: false }), + }), + Rc::new(vec![]), + None, + zero_span.clone(), + ), + zero_span.clone(), + zero_span.clone(), + ); + let r = expect_name(&tokens); + if has_err(r.err.clone()) { return Rc::new(PredResult { - predicate: dummy_pred.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let pred_name = r.name.clone(); -let tokens = r.tokens.clone(); -match (*eat(&tokens, Rc::new(ExpectedToken::ExpectLParen))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let tokens = __ec.clone(); -match pred_name.clone().as_str() { - "pattern" => { - let r2 = parse_string_literal_value(&tokens); -if has_err(r2.err.clone()) { - return Rc::new(PredResult { - predicate: dummy_pred.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), -}) - } -let r3 = expect(&r2.tokens.clone(), &Rc::new(ExpectedToken::ExpectRParen)); -if has_err(r3.err.clone()) { - return Rc::new(PredResult { - predicate: dummy_pred.clone(), - tokens: r3.tokens.clone(), - ctx: ctx.clone(), - err: r3.err.clone(), -}) - } -Rc::new(PredResult { - predicate: make_field_init_node(&"Pattern".to_string(), make_expr_node(Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitStr { - value: r2.value.clone(), -}), -}), Rc::new(vec![]), None, zero_span.clone()), zero_span.clone(), zero_span.clone()), - tokens: r3.tokens.clone(), - ctx: ctx.clone(), - err: None, -}) -}, - "format" => { - let r2 = expect_ident(&tokens); -if has_err(r2.err.clone()) { - return Rc::new(PredResult { - predicate: dummy_pred.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), -}) - } -let r3 = expect(&r2.tokens.clone(), &Rc::new(ExpectedToken::ExpectRParen)); -if has_err(r3.err.clone()) { - return Rc::new(PredResult { - predicate: dummy_pred.clone(), - tokens: r3.tokens.clone(), - ctx: ctx.clone(), - err: r3.err.clone(), -}) - } -Rc::new(PredResult { - predicate: make_field_init_node(&"Format".to_string(), make_expr_node(Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitStr { - value: r2.name.clone(), -}), -}), Rc::new(vec![]), None, zero_span.clone()), zero_span.clone(), zero_span.clone()), - tokens: r3.tokens.clone(), - ctx: ctx.clone(), - err: None, -}) -}, - "brand" => { - let r2 = parse_string_literal_value(&tokens); -if has_err(r2.err.clone()) { - return Rc::new(PredResult { - predicate: dummy_pred.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), -}) - } -let r3 = expect(&r2.tokens.clone(), &Rc::new(ExpectedToken::ExpectRParen)); -if has_err(r3.err.clone()) { - return Rc::new(PredResult { - predicate: dummy_pred.clone(), - tokens: r3.tokens.clone(), - ctx: ctx.clone(), - err: r3.err.clone(), -}) - } -Rc::new(PredResult { - predicate: make_field_init_node(&"Brand".to_string(), make_expr_node(Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitStr { - value: r2.value.clone(), -}), -}), Rc::new(vec![]), None, zero_span.clone()), zero_span.clone(), zero_span.clone()), - tokens: r3.tokens.clone(), - ctx: ctx.clone(), - err: None, -}) -}, - "content" => { - let r2 = expect_ident(&tokens); -if has_err(r2.err.clone()) { - return Rc::new(PredResult { - predicate: dummy_pred.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), -}) - } -let r3 = expect(&r2.tokens.clone(), &Rc::new(ExpectedToken::ExpectRParen)); -if has_err(r3.err.clone()) { - return Rc::new(PredResult { - predicate: dummy_pred.clone(), - tokens: r3.tokens.clone(), - ctx: ctx.clone(), - err: r3.err.clone(), -}) - } -Rc::new(PredResult { - predicate: make_field_init_node(&"ContentEncoding".to_string(), make_expr_node(Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitStr { - value: r2.name.clone(), -}), -}), Rc::new(vec![]), None, zero_span.clone()), zero_span.clone(), zero_span.clone()), - tokens: r3.tokens.clone(), - ctx: ctx.clone(), - err: None, -}) -}, - "domain" => { - let r2 = expect_ident(&tokens); -if has_err(r2.err.clone()) { - return Rc::new(PredResult { - predicate: dummy_pred.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), -}) - } -let r3 = expect(&r2.tokens.clone(), &Rc::new(ExpectedToken::ExpectRParen)); -if has_err(r3.err.clone()) { - return Rc::new(PredResult { - predicate: dummy_pred.clone(), - tokens: r3.tokens.clone(), - ctx: ctx.clone(), - err: r3.err.clone(), -}) + predicate: dummy_pred.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let pred_name = r.name.clone(); + let tokens = r.tokens.clone(); + match (*eat(&tokens, Rc::new(ExpectedToken::ExpectLParen))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { + let tokens = __ec.clone(); + match pred_name.clone().as_str() { + "pattern" => { + let r2 = parse_string_literal_value(&tokens); + if has_err(r2.err.clone()) { + return Rc::new(PredResult { + predicate: dummy_pred.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), + }); + } + let r3 = expect(&r2.tokens.clone(), &Rc::new(ExpectedToken::ExpectRParen)); + if has_err(r3.err.clone()) { + return Rc::new(PredResult { + predicate: dummy_pred.clone(), + tokens: r3.tokens.clone(), + ctx: ctx.clone(), + err: r3.err.clone(), + }); + } + Rc::new(PredResult { + predicate: make_field_init_node( + &"Pattern".to_string(), + make_expr_node( + Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitStr { + value: r2.value.clone(), + }), + }), + Rc::new(vec![]), + None, + zero_span.clone(), + ), + zero_span.clone(), + zero_span.clone(), + ), + tokens: r3.tokens.clone(), + ctx: ctx.clone(), + err: None, + }) + } + "format" => { + let r2 = expect_ident(&tokens); + if has_err(r2.err.clone()) { + return Rc::new(PredResult { + predicate: dummy_pred.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), + }); + } + let r3 = expect(&r2.tokens.clone(), &Rc::new(ExpectedToken::ExpectRParen)); + if has_err(r3.err.clone()) { + return Rc::new(PredResult { + predicate: dummy_pred.clone(), + tokens: r3.tokens.clone(), + ctx: ctx.clone(), + err: r3.err.clone(), + }); + } + Rc::new(PredResult { + predicate: make_field_init_node( + &"Format".to_string(), + make_expr_node( + Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitStr { + value: r2.name.clone(), + }), + }), + Rc::new(vec![]), + None, + zero_span.clone(), + ), + zero_span.clone(), + zero_span.clone(), + ), + tokens: r3.tokens.clone(), + ctx: ctx.clone(), + err: None, + }) + } + "brand" => { + let r2 = parse_string_literal_value(&tokens); + if has_err(r2.err.clone()) { + return Rc::new(PredResult { + predicate: dummy_pred.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), + }); + } + let r3 = expect(&r2.tokens.clone(), &Rc::new(ExpectedToken::ExpectRParen)); + if has_err(r3.err.clone()) { + return Rc::new(PredResult { + predicate: dummy_pred.clone(), + tokens: r3.tokens.clone(), + ctx: ctx.clone(), + err: r3.err.clone(), + }); + } + Rc::new(PredResult { + predicate: make_field_init_node( + &"Brand".to_string(), + make_expr_node( + Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitStr { + value: r2.value.clone(), + }), + }), + Rc::new(vec![]), + None, + zero_span.clone(), + ), + zero_span.clone(), + zero_span.clone(), + ), + tokens: r3.tokens.clone(), + ctx: ctx.clone(), + err: None, + }) + } + "content" => { + let r2 = expect_ident(&tokens); + if has_err(r2.err.clone()) { + return Rc::new(PredResult { + predicate: dummy_pred.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), + }); + } + let r3 = expect(&r2.tokens.clone(), &Rc::new(ExpectedToken::ExpectRParen)); + if has_err(r3.err.clone()) { + return Rc::new(PredResult { + predicate: dummy_pred.clone(), + tokens: r3.tokens.clone(), + ctx: ctx.clone(), + err: r3.err.clone(), + }); + } + Rc::new(PredResult { + predicate: make_field_init_node( + &"ContentEncoding".to_string(), + make_expr_node( + Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitStr { + value: r2.name.clone(), + }), + }), + Rc::new(vec![]), + None, + zero_span.clone(), + ), + zero_span.clone(), + zero_span.clone(), + ), + tokens: r3.tokens.clone(), + ctx: ctx.clone(), + err: None, + }) + } + "domain" => { + let r2 = expect_ident(&tokens); + if has_err(r2.err.clone()) { + return Rc::new(PredResult { + predicate: dummy_pred.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), + }); + } + let r3 = expect(&r2.tokens.clone(), &Rc::new(ExpectedToken::ExpectRParen)); + if has_err(r3.err.clone()) { + return Rc::new(PredResult { + predicate: dummy_pred.clone(), + tokens: r3.tokens.clone(), + ctx: ctx.clone(), + err: r3.err.clone(), + }); + } + Rc::new(PredResult { + predicate: make_field_init_node( + &"Domain".to_string(), + make_expr_node( + Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitStr { + value: r2.name.clone(), + }), + }), + Rc::new(vec![]), + None, + zero_span.clone(), + ), + zero_span.clone(), + zero_span.clone(), + ), + tokens: r3.tokens.clone(), + ctx: ctx.clone(), + err: None, + }) + } + "range" => { + let r2 = parse_named_int_args(tokens.clone(), ctx.clone()); + if has_err(r2.err.clone()) { + return Rc::new(PredResult { + predicate: dummy_pred.clone(), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), + }); + } + let r3 = expect(&r2.tokens.clone(), &Rc::new(ExpectedToken::ExpectRParen)); + if has_err(r3.err.clone()) { + return Rc::new(PredResult { + predicate: dummy_pred.clone(), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: r3.err.clone(), + }); + } + let min_fields = if (r2.min_val.clone() != None) { + Rc::new(vec![make_field_init_node( + &"min".to_string(), + make_expr_node( + Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitInt { + value: r2.min_val.clone().clone().unwrap(), + }), + }), + Rc::new(vec![]), + None, + zero_span.clone(), + ), + zero_span.clone(), + zero_span.clone(), + )]) + } else { + Rc::new(vec![]) + }; + let max_fields = if (r2.max_val.clone() != None) { + Rc::new(vec![make_field_init_node( + &"max".to_string(), + make_expr_node( + Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitInt { + value: r2.max_val.clone().clone().unwrap(), + }), + }), + Rc::new(vec![]), + None, + zero_span.clone(), + ), + zero_span.clone(), + zero_span.clone(), + )]) + } else { + Rc::new(vec![]) + }; + Rc::new(PredResult { + predicate: make_field_init_node( + &"Range".to_string(), + make_expr_node( + Rc::new(ExprData::ExprRecordLit { parent_enum: None }), + v2_rt::concat(min_fields, max_fields), + None, + zero_span.clone(), + ), + zero_span.clone(), + zero_span.clone(), + ), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: None, + }) + } + _ => Rc::new(PredResult { + predicate: dummy_pred.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: Some(parse_error( + v2_rt::concat( + v2_rt::concat( + "unknown where predicate `".to_string(), + pred_name.clone(), + ), + "`".to_string(), + ), + token_span(tokens.clone().first().cloned()), + )), + }), } -Rc::new(PredResult { - predicate: make_field_init_node(&"Domain".to_string(), make_expr_node(Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitStr { - value: r2.name.clone(), -}), -}), Rc::new(vec![]), None, zero_span.clone()), zero_span.clone(), zero_span.clone()), - tokens: r3.tokens.clone(), - ctx: ctx.clone(), - err: None, -}) -}, - "range" => { - let r2 = parse_named_int_args(tokens.clone(), ctx.clone()); -if has_err(r2.err.clone()) { - return Rc::new(PredResult { - predicate: dummy_pred.clone(), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), -}) - } -let r3 = expect(&r2.tokens.clone(), &Rc::new(ExpectedToken::ExpectRParen)); -if has_err(r3.err.clone()) { - return Rc::new(PredResult { - predicate: dummy_pred.clone(), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: r3.err.clone(), -}) - } -let min_fields = if (r2.min_val.clone() != None) { - Rc::new(vec![make_field_init_node(&"min".to_string(), make_expr_node(Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitInt { - value: r2.min_val.clone().clone().unwrap(), -}), -}), Rc::new(vec![]), None, zero_span.clone()), zero_span.clone(), zero_span.clone())]) - } else { - Rc::new(vec![]) - }; -let max_fields = if (r2.max_val.clone() != None) { - Rc::new(vec![make_field_init_node(&"max".to_string(), make_expr_node(Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitInt { - value: r2.max_val.clone().clone().unwrap(), -}), -}), Rc::new(vec![]), None, zero_span.clone()), zero_span.clone(), zero_span.clone())]) - } else { - Rc::new(vec![]) - }; -Rc::new(PredResult { - predicate: make_field_init_node(&"Range".to_string(), make_expr_node(Rc::new(ExprData::ExprRecordLit { - parent_enum: None, -}), v2_rt::concat(min_fields, max_fields), None, zero_span.clone()), zero_span.clone(), zero_span.clone()), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: None, -}) -}, - _ => Rc::new(PredResult { - predicate: dummy_pred.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: Some(parse_error(v2_rt::concat(v2_rt::concat("unknown where predicate `".to_string(), pred_name.clone()), "`".to_string()), token_span(tokens.clone().first().cloned()))), -}), -} -}, - EatResult::EatUnchanged { tokens: __eu, .. } => match pred_name.clone().as_str() { - "non_empty" => Rc::new(PredResult { - predicate: make_field_init_node(&"NonEmpty".to_string(), make_expr_node(Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitBool { - value: true, -}), -}), Rc::new(vec![]), None, zero_span.clone()), zero_span.clone(), zero_span.clone()), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}), - _ => Rc::new(PredResult { - predicate: make_field_init_node(&pred_name, make_expr_node(Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitBool { - value: true, -}), -}), Rc::new(vec![]), None, zero_span.clone()), zero_span.clone(), zero_span.clone()), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}), -}, -} -} + } + EatResult::EatUnchanged { tokens: __eu, .. } => match pred_name.clone().as_str() { + "non_empty" => Rc::new(PredResult { + predicate: make_field_init_node( + &"NonEmpty".to_string(), + make_expr_node( + Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitBool { value: true }), + }), + Rc::new(vec![]), + None, + zero_span.clone(), + ), + zero_span.clone(), + zero_span.clone(), + ), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }), + _ => Rc::new(PredResult { + predicate: make_field_init_node( + &pred_name, + make_expr_node( + Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitBool { value: true }), + }), + Rc::new(vec![]), + None, + zero_span.clone(), + ), + zero_span.clone(), + zero_span.clone(), + ), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }), + }, + } + } } -pub fn parse_named_int_args(tokens: Rc>>, ctx: Rc) -> Rc { +pub fn parse_named_int_args( + tokens: Rc>>, + ctx: Rc, +) -> Rc { { let r = parse_single_named_int(tokens, &ctx); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(RangeArgsResult { - min_val: None, - max_val: None, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -match (*eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let r2 = parse_single_named_int(skip_newlines(__ec.clone()), &r.ctx.clone()); -if has_err(r2.err.clone()) { - return Rc::new(RangeArgsResult { - min_val: None, - max_val: None, - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), -}) - } -let min_val = if (r.arg_name.clone().as_str() == "min".to_string().as_str()) { - Some(r.arg_value.clone()) - } else { - if (r2.arg_name.clone().as_str() == "min".to_string().as_str()) { - Some(r2.arg_value.clone()) + min_val: None, + max_val: None, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + match (*eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { + let r2 = parse_single_named_int(skip_newlines(__ec.clone()), &r.ctx.clone()); + if has_err(r2.err.clone()) { + return Rc::new(RangeArgsResult { + min_val: None, + max_val: None, + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), + }); + } + let min_val = if (r.arg_name.clone().as_str() == "min".to_string().as_str()) { + Some(r.arg_value.clone()) + } else { + if (r2.arg_name.clone().as_str() == "min".to_string().as_str()) { + Some(r2.arg_value.clone()) + } else { + None + } + }; + let max_val = if (r.arg_name.clone().as_str() == "max".to_string().as_str()) { + Some(r.arg_value.clone()) + } else { + if (r2.arg_name.clone().as_str() == "max".to_string().as_str()) { + Some(r2.arg_value.clone()) + } else { + None + } + }; + Rc::new(RangeArgsResult { + min_val: min_val, + max_val: max_val, + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: None, + }) + } + EatResult::EatUnchanged { tokens: __eu, .. } => { + let min_val = if (r.arg_name.clone().as_str() == "min".to_string().as_str()) { + Some(r.arg_value.clone()) } else { None - } - }; -let max_val = if (r.arg_name.clone().as_str() == "max".to_string().as_str()) { - Some(r.arg_value.clone()) - } else { - if (r2.arg_name.clone().as_str() == "max".to_string().as_str()) { - Some(r2.arg_value.clone()) + }; + let max_val = if (r.arg_name.clone().as_str() == "max".to_string().as_str()) { + Some(r.arg_value.clone()) } else { None - } - }; -Rc::new(RangeArgsResult { - min_val: min_val, - max_val: max_val, - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: None, -}) -}, - EatResult::EatUnchanged { tokens: __eu, .. } => { - let min_val = if (r.arg_name.clone().as_str() == "min".to_string().as_str()) { - Some(r.arg_value.clone()) - } else { - None - }; -let max_val = if (r.arg_name.clone().as_str() == "max".to_string().as_str()) { - Some(r.arg_value.clone()) - } else { - None - }; -Rc::new(RangeArgsResult { - min_val: min_val, - max_val: max_val, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -}, -} -} + }; + Rc::new(RangeArgsResult { + min_val: min_val, + max_val: max_val, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } + } + } } -pub fn parse_single_named_int(tokens: Rc>>, ctx: &Rc) -> Rc { +pub fn parse_single_named_int( + tokens: Rc>>, + ctx: &Rc, +) -> Rc { { let r = expect_ident(&tokens); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(NamedIntResult { - arg_name: "".to_string(), - arg_value: 0, - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let name = r.name.clone(); -let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); -if has_err(r2.err.clone()) { + arg_name: "".to_string(), + arg_value: 0, + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let name = r.name.clone(); + let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); + if has_err(r2.err.clone()) { return Rc::new(NamedIntResult { - arg_name: name.clone(), - arg_value: 0, - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), -}) - } -let r3 = parse_int_literal_value(&r2.tokens.clone()); -if has_err(r3.err.clone()) { + arg_name: name.clone(), + arg_value: 0, + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), + }); + } + let r3 = parse_int_literal_value(&r2.tokens.clone()); + if has_err(r3.err.clone()) { return Rc::new(NamedIntResult { - arg_name: name.clone(), - arg_value: 0, - tokens: r3.tokens.clone(), - ctx: ctx.clone(), - err: r3.err.clone(), -}) - } -Rc::new(NamedIntResult { - arg_name: name.clone(), - arg_value: r3.value.clone(), - tokens: r3.tokens.clone(), - ctx: ctx.clone(), - err: None, -}) -} + arg_name: name.clone(), + arg_value: 0, + tokens: r3.tokens.clone(), + ctx: ctx.clone(), + err: r3.err.clone(), + }); + } + Rc::new(NamedIntResult { + arg_name: name.clone(), + arg_value: r3.value.clone(), + tokens: r3.tokens.clone(), + ctx: ctx.clone(), + err: None, + }) + } } -pub fn parse_variant_fields(tokens: &Rc>>, ctx: Rc, vname: &String, vname_span: &Rc) -> Rc { +pub fn parse_variant_fields( + tokens: &Rc>>, + ctx: Rc, + vname: &String, + vname_span: &Rc, +) -> Rc { { let start_span = token_span(tokens.clone().first().cloned()); -match (*eat(&tokens, Rc::new(ExpectedToken::ExpectLBrace))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let r = parse_field_list(skip_newlines(__ec.clone()), ctx); -if has_err(r.err.clone()) { - return Rc::new(VariantResult { - variant: make_variant_node(&vname, Rc::new(vec![]), start_span.clone(), vname_span.clone()), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let tokens = skip_newlines(r.tokens.clone()); -let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); -if has_err(r2.err.clone()) { - return Rc::new(VariantResult { - variant: make_variant_node(&vname, Rc::new(vec![]), start_span.clone(), vname_span.clone()), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), -}) - } -let v = make_variant_node(&vname, r.fields.clone(), start_span.clone(), vname_span.clone()); -Rc::new(VariantResult { - variant: v, - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -}, - EatResult::EatUnchanged { tokens: __eu, .. } => { - let v = make_variant_node(&vname, Rc::new(vec![]), vname_span.clone(), vname_span.clone()); -Rc::new(VariantResult { - variant: v, - tokens: tokens.clone(), - ctx: ctx, - err: None, -}) -}, -} -} + match (*eat(&tokens, Rc::new(ExpectedToken::ExpectLBrace))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { + let r = parse_field_list(skip_newlines(__ec.clone()), ctx); + if has_err(r.err.clone()) { + return Rc::new(VariantResult { + variant: make_variant_node( + &vname, + Rc::new(vec![]), + start_span.clone(), + vname_span.clone(), + ), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let tokens = skip_newlines(r.tokens.clone()); + let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); + if has_err(r2.err.clone()) { + return Rc::new(VariantResult { + variant: make_variant_node( + &vname, + Rc::new(vec![]), + start_span.clone(), + vname_span.clone(), + ), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), + }); + } + let v = make_variant_node( + &vname, + r.fields.clone(), + start_span.clone(), + vname_span.clone(), + ); + Rc::new(VariantResult { + variant: v, + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } + EatResult::EatUnchanged { tokens: __eu, .. } => { + let v = make_variant_node( + &vname, + Rc::new(vec![]), + vname_span.clone(), + vname_span.clone(), + ); + Rc::new(VariantResult { + variant: v, + tokens: tokens.clone(), + ctx: ctx, + err: None, + }) + } + } + } } -pub fn parse_more_variants(tokens: Rc>>, ctx: Rc) -> Rc { +pub fn parse_more_variants( + tokens: Rc>>, + ctx: Rc, +) -> Rc { parse_more_variants_acc(tokens, ctx, Rc::new(vec![])) } -pub fn parse_more_variants_acc(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { +pub fn parse_more_variants_acc( + mut tokens: Rc>>, + mut ctx: Rc, + mut acc: Rc>>, +) -> Rc { loop { tokens = skip_newlines(tokens.clone()); -match (*eat(&tokens, Rc::new(ExpectedToken::ExpectPipe))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { tokens = skip_newlines(__ec.clone()); -let r = expect_ident(&tokens); -if has_err(r.err.clone()) { - return Rc::new(VariantsResult { - variants: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let r2 = parse_variant_fields(&r.tokens.clone(), ctx.clone(), &r.name.clone(), &r.span.clone()); -if has_err(r2.err.clone()) { - return Rc::new(VariantsResult { - variants: Rc::new(vec![]), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), -}) - } -{ - let __tco_0 = r2.tokens.clone(); -let __tco_1 = r2.ctx.clone(); -let __tco_2 = v2_rt::rc_list_push(acc, r2.variant.clone()); -tokens = __tco_0; -ctx = __tco_1; -acc = __tco_2; -continue; -} }, - EatResult::EatUnchanged { tokens: __eu, .. } => { break Rc::new(VariantsResult { - variants: acc, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}); }, -} -} + match (*eat(&tokens, Rc::new(ExpectedToken::ExpectPipe))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { + tokens = skip_newlines(__ec.clone()); + let r = expect_ident(&tokens); + if has_err(r.err.clone()) { + return Rc::new(VariantsResult { + variants: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let r2 = parse_variant_fields( + &r.tokens.clone(), + ctx.clone(), + &r.name.clone(), + &r.span.clone(), + ); + if has_err(r2.err.clone()) { + return Rc::new(VariantsResult { + variants: Rc::new(vec![]), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), + }); + } + { + let __tco_0 = r2.tokens.clone(); + let __tco_1 = r2.ctx.clone(); + let __tco_2 = v2_rt::rc_list_push(acc, r2.variant.clone()); + tokens = __tco_0; + ctx = __tco_1; + acc = __tco_2; + continue; + } + } + EatResult::EatUnchanged { tokens: __eu, .. } => { + break Rc::new(VariantsResult { + variants: acc, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }); + } + } + } } pub fn parse_type_expr(tokens: &Rc>>, ctx: &Rc) -> Rc { { let tokens = skip_newlines(tokens.clone()); -let tok = tokens.clone().first().cloned(); -let sh = match tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, -}; -let span = token_span(tok.clone()); -match sh { - Some(TokenShape::ShLBrace) => { - let r = parse_field_list(skip_newlines(Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>())), ctx.clone()); -if has_err(r.err.clone()) { - return Rc::new(TypeResult { - type_expr: leaf_type_node(&"".to_string(), &span), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let tokens = skip_newlines(r.tokens.clone()); -let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); -if has_err(r2.err.clone()) { - return Rc::new(TypeResult { - type_expr: leaf_type_node(&"".to_string(), &span), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), -}) - } -let te = Rc::new(Node { - name: "".to_string(), - span: span.clone(), - ident_span: None, - children: Rc::new({ let mut __result = Vec::new(); for f in r.fields.clone().iter().cloned() { __result.push(field_to_child_node(&f, &ctx.source_indices.clone())); } __result }), - connective: Connective::Conj, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -Rc::new(TypeResult { - type_expr: te, - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -}, - Some(TokenShape::ShKeyword) => if (tok.clone().unwrap().text.clone().as_str() == "fn".to_string().as_str()) { - parse_callable_type_expr(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), &ctx, &span) - } else { - Rc::new(TypeResult { - type_expr: leaf_type_node(&"".to_string(), &span), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: Some(parse_error("expected type expression".to_string(), span.clone())), -}) - }, - Some(TokenShape::ShIdent) => { - let n = tok.clone().unwrap().text.clone(); -finish_type_expr_from_name(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), ctx.clone(), &n, &span) -}, - _ => Rc::new(TypeResult { - type_expr: leaf_type_node(&"".to_string(), &span), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: Some(parse_error("expected type expression".to_string(), span.clone())), -}), -} -} + let tok = tokens.clone().first().cloned(); + let sh = match tok.clone() { + Some(t) => Some(t.shape.clone()), + None => None, + }; + let span = token_span(tok.clone()); + match sh { + Some(TokenShape::ShLBrace) => { + let r = parse_field_list( + skip_newlines(Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + )), + ctx.clone(), + ); + if has_err(r.err.clone()) { + return Rc::new(TypeResult { + type_expr: leaf_type_node(&"".to_string(), &span), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let tokens = skip_newlines(r.tokens.clone()); + let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); + if has_err(r2.err.clone()) { + return Rc::new(TypeResult { + type_expr: leaf_type_node(&"".to_string(), &span), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), + }); + } + let te = Rc::new(Node { + name: "".to_string(), + span: span.clone(), + ident_span: None, + children: Rc::new({ + let mut __result = Vec::new(); + for f in r.fields.clone().iter().cloned() { + __result.push(field_to_child_node(&f, &ctx.source_indices.clone())); + } + __result + }), + connective: Connective::Conj, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + Rc::new(TypeResult { + type_expr: te, + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } + Some(TokenShape::ShKeyword) => { + if (tok.clone().unwrap().text.clone().as_str() == "fn".to_string().as_str()) { + parse_callable_type_expr( + &Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + &ctx, + &span, + ) + } else { + Rc::new(TypeResult { + type_expr: leaf_type_node(&"".to_string(), &span), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: Some(parse_error( + "expected type expression".to_string(), + span.clone(), + )), + }) + } + } + Some(TokenShape::ShIdent) => { + let n = tok.clone().unwrap().text.clone(); + finish_type_expr_from_name( + &Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + ctx.clone(), + &n, + &span, + ) + } + _ => Rc::new(TypeResult { + type_expr: leaf_type_node(&"".to_string(), &span), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: Some(parse_error( + "expected type expression".to_string(), + span.clone(), + )), + }), + } + } } -pub fn parse_callable_type_expr(tokens: &Rc>>, ctx: &Rc, start_span: &Rc) -> Rc { +pub fn parse_callable_type_expr( + tokens: &Rc>>, + ctx: &Rc, + start_span: &Rc, +) -> Rc { { let dummy_te = leaf_type_node(&"".to_string(), &start_span); -let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectLParen)); -if has_err(r.err.clone()) { + let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectLParen)); + if has_err(r.err.clone()) { return Rc::new(TypeResult { - type_expr: dummy_te.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let tokens = skip_newlines(r.tokens.clone()); -let params_result = if tok_is_rparen(tokens.clone().first().cloned()) { + type_expr: dummy_te.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let tokens = skip_newlines(r.tokens.clone()); + let params_result = if tok_is_rparen(tokens.clone().first().cloned()) { Rc::new(ParamsResult { - params: Rc::new(vec![]), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}) + params: Rc::new(vec![]), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }) } else { parse_callable_param_types(tokens.clone(), ctx.clone(), Rc::new(vec![])) }; -if has_err(params_result.err.clone()) { + if has_err(params_result.err.clone()) { return Rc::new(TypeResult { - type_expr: dummy_te.clone(), - tokens: params_result.tokens.clone(), - ctx: params_result.ctx.clone(), - err: params_result.err.clone(), -}) - } -let tokens = skip_newlines(params_result.tokens.clone()); -let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRParen)); -if has_err(r2.err.clone()) { + type_expr: dummy_te.clone(), + tokens: params_result.tokens.clone(), + ctx: params_result.ctx.clone(), + err: params_result.err.clone(), + }); + } + let tokens = skip_newlines(params_result.tokens.clone()); + let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRParen)); + if has_err(r2.err.clone()) { return Rc::new(TypeResult { - type_expr: dummy_te.clone(), - tokens: r2.tokens.clone(), - ctx: params_result.ctx.clone(), - err: r2.err.clone(), -}) - } -let r3 = expect(&r2.tokens.clone(), &Rc::new(ExpectedToken::ExpectArrow)); -if has_err(r3.err.clone()) { + type_expr: dummy_te.clone(), + tokens: r2.tokens.clone(), + ctx: params_result.ctx.clone(), + err: r2.err.clone(), + }); + } + let r3 = expect(&r2.tokens.clone(), &Rc::new(ExpectedToken::ExpectArrow)); + if has_err(r3.err.clone()) { return Rc::new(TypeResult { - type_expr: dummy_te.clone(), - tokens: r3.tokens.clone(), - ctx: params_result.ctx.clone(), - err: r3.err.clone(), -}) - } -let ret = parse_type_expr(&r3.tokens.clone(), ¶ms_result.ctx.clone()); -if has_err(ret.err.clone()) { + type_expr: dummy_te.clone(), + tokens: r3.tokens.clone(), + ctx: params_result.ctx.clone(), + err: r3.err.clone(), + }); + } + let ret = parse_type_expr(&r3.tokens.clone(), ¶ms_result.ctx.clone()); + if has_err(ret.err.clone()) { return Rc::new(TypeResult { - type_expr: dummy_te.clone(), - tokens: ret.tokens.clone(), - ctx: ret.ctx.clone(), - err: ret.err.clone(), -}) - } -let te = Rc::new(Node { - name: "Callable".to_string(), - span: start_span.clone(), - ident_span: Some(start_span.clone()), - children: Rc::new(vec![]), - connective: Connective::Arrow, - params: params_result.params.clone(), - inferred: Some(Rc::new(InferredNode::Resolved { - node: ret.type_expr.clone(), -})), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -maybe_optional(&ret.tokens.clone(), ret.ctx.clone(), &te, start_span.clone()) -} + type_expr: dummy_te.clone(), + tokens: ret.tokens.clone(), + ctx: ret.ctx.clone(), + err: ret.err.clone(), + }); + } + let te = Rc::new(Node { + name: "Callable".to_string(), + span: start_span.clone(), + ident_span: Some(start_span.clone()), + children: Rc::new(vec![]), + connective: Connective::Arrow, + params: params_result.params.clone(), + inferred: Some(Rc::new(InferredNode::Resolved { + node: ret.type_expr.clone(), + })), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + maybe_optional( + &ret.tokens.clone(), + ret.ctx.clone(), + &te, + start_span.clone(), + ) + } } -pub fn parse_callable_param_types(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { +pub fn parse_callable_param_types( + mut tokens: Rc>>, + mut ctx: Rc, + mut acc: Rc>>, +) -> Rc { loop { let r = parse_type_expr(&tokens, &ctx); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(ParamsResult { - params: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let param = make_param_node(&"".to_string(), r.type_expr.clone(), None, r.type_expr.clone().span.clone(), r.type_expr.clone().span.clone()); -acc = v2_rt::rc_list_push(acc.clone(), param); -match (*eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { tokens = skip_newlines(__ec.clone()); -if tok_is_rparen(tokens.clone().first().cloned()) { - break Rc::new(ParamsResult { - params: acc.clone(), - tokens: tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}); -} else { - { - let __tco_0 = r.ctx.clone(); -ctx = __tco_0; -continue; -} -} }, - EatResult::EatUnchanged { tokens: __eu, .. } => { break Rc::new(ParamsResult { - params: acc.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}); }, -} -} + params: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let param = make_param_node( + &"".to_string(), + r.type_expr.clone(), + None, + r.type_expr.clone().span.clone(), + r.type_expr.clone().span.clone(), + ); + acc = v2_rt::rc_list_push(acc.clone(), param); + match (*eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { + tokens = skip_newlines(__ec.clone()); + if tok_is_rparen(tokens.clone().first().cloned()) { + break Rc::new(ParamsResult { + params: acc.clone(), + tokens: tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }); + } else { + { + let __tco_0 = r.ctx.clone(); + ctx = __tco_0; + continue; + } + } + } + EatResult::EatUnchanged { tokens: __eu, .. } => { + break Rc::new(ParamsResult { + params: acc.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }); + } + } + } } -pub fn finish_type_expr_from_name(tokens: &Rc>>, ctx: Rc, type_name: &String, start_span: &Rc) -> Rc { +pub fn finish_type_expr_from_name( + tokens: &Rc>>, + ctx: Rc, + type_name: &String, + start_span: &Rc, +) -> Rc { { let dummy_te = leaf_type_node(&type_name, &start_span); -match (*eat(&tokens, Rc::new(ExpectedToken::ExpectLt))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let r = parse_type_expr(&__ec, &ctx); -if has_err(r.err.clone()) { - return r.clone() - } -let first_arg = r.type_expr.clone(); -let type_args = collect_type_args(r.tokens.clone(), r.ctx.clone(), Rc::new(vec![first_arg])); -if has_err(type_args.err.clone()) { - return Rc::new(TypeResult { - type_expr: dummy_te.clone(), - tokens: type_args.tokens.clone(), - ctx: type_args.ctx.clone(), - err: type_args.err.clone(), -}) - } -let r3 = expect(&type_args.tokens.clone(), &Rc::new(ExpectedToken::ExpectGt)); -if has_err(r3.err.clone()) { - return Rc::new(TypeResult { - type_expr: dummy_te.clone(), - tokens: r3.tokens.clone(), - ctx: type_args.ctx.clone(), - err: r3.err.clone(), -}) - } -let te = Rc::new(Node { - name: type_name.clone(), - span: start_span.clone(), - ident_span: Some(start_span.clone()), - children: type_args.args.clone(), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -maybe_optional(&r3.tokens.clone(), type_args.ctx.clone(), &te, start_span.clone()) -}, - EatResult::EatUnchanged { tokens: __eu, .. } => { - let te = leaf_type_node(&type_name, &start_span); -maybe_optional(&tokens, ctx, &te, start_span.clone()) -}, -} -} + match (*eat(&tokens, Rc::new(ExpectedToken::ExpectLt))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { + let r = parse_type_expr(&__ec, &ctx); + if has_err(r.err.clone()) { + return r.clone(); + } + let first_arg = r.type_expr.clone(); + let type_args = + collect_type_args(r.tokens.clone(), r.ctx.clone(), Rc::new(vec![first_arg])); + if has_err(type_args.err.clone()) { + return Rc::new(TypeResult { + type_expr: dummy_te.clone(), + tokens: type_args.tokens.clone(), + ctx: type_args.ctx.clone(), + err: type_args.err.clone(), + }); + } + let r3 = expect(&type_args.tokens.clone(), &Rc::new(ExpectedToken::ExpectGt)); + if has_err(r3.err.clone()) { + return Rc::new(TypeResult { + type_expr: dummy_te.clone(), + tokens: r3.tokens.clone(), + ctx: type_args.ctx.clone(), + err: r3.err.clone(), + }); + } + let te = Rc::new(Node { + name: type_name.clone(), + span: start_span.clone(), + ident_span: Some(start_span.clone()), + children: type_args.args.clone(), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + maybe_optional( + &r3.tokens.clone(), + type_args.ctx.clone(), + &te, + start_span.clone(), + ) + } + EatResult::EatUnchanged { tokens: __eu, .. } => { + let te = leaf_type_node(&type_name, &start_span); + maybe_optional(&tokens, ctx, &te, start_span.clone()) + } + } + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -3834,54 +4580,72 @@ pub struct TypeParamsResult { pub ctx: Rc, } -pub fn parse_optional_type_params(tokens: &Rc>>, ctx: Rc) -> Rc { +pub fn parse_optional_type_params( + tokens: &Rc>>, + ctx: Rc, +) -> Rc { match (*eat(&tokens, Rc::new(ExpectedToken::ExpectLt))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let params_result = collect_type_param_names(__ec.clone(), ctx, Rc::new(vec![])); -let r = expect(¶ms_result.tokens.clone(), &Rc::new(ExpectedToken::ExpectGt)); -Rc::new(TypeParamsResult { - params: params_result.params.clone(), - tokens: r.tokens.clone(), - ctx: params_result.ctx.clone(), -}) -}, - EatResult::EatUnchanged { tokens: __eu, .. } => Rc::new(TypeParamsResult { - params: Rc::new(vec![]), - tokens: tokens.clone(), - ctx: ctx, -}), -} + EatResult::EatConsumed { tokens: __ec, .. } => { + let params_result = collect_type_param_names(__ec.clone(), ctx, Rc::new(vec![])); + let r = expect( + ¶ms_result.tokens.clone(), + &Rc::new(ExpectedToken::ExpectGt), + ); + Rc::new(TypeParamsResult { + params: params_result.params.clone(), + tokens: r.tokens.clone(), + ctx: params_result.ctx.clone(), + }) + } + EatResult::EatUnchanged { tokens: __eu, .. } => Rc::new(TypeParamsResult { + params: Rc::new(vec![]), + tokens: tokens.clone(), + ctx: ctx, + }), + } } -pub fn collect_type_param_names(mut tokens: Rc>>, mut ctx: Rc, mut params: Rc>>) -> Rc { +pub fn collect_type_param_names( + mut tokens: Rc>>, + mut ctx: Rc, + mut params: Rc>>, +) -> Rc { loop { if tok_is_ident(tokens.clone().first().cloned()) { let r = expect_ident(&tokens); -let span = r.span.clone(); -let param = make_param_node(&r.name.clone(), leaf_type_node(&r.name.clone(), &span), None, span.clone(), span.clone()); -let next_params = v2_rt::rc_list_push(params, param); -match (*eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { { - let __tco_0 = __ec.clone(); -let __tco_1 = next_params; -tokens = __tco_0; -params = __tco_1; -continue; -} }, - EatResult::EatUnchanged { tokens: __eu, .. } => { break Rc::new(TypeParamsResult { - params: next_params, - tokens: r.tokens.clone(), - ctx: ctx, -}); }, -} -} else { + let span = r.span.clone(); + let param = make_param_node( + &r.name.clone(), + leaf_type_node(&r.name.clone(), &span), + None, + span.clone(), + span.clone(), + ); + let next_params = v2_rt::rc_list_push(params, param); + match (*eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { + let __tco_0 = __ec.clone(); + let __tco_1 = next_params; + tokens = __tco_0; + params = __tco_1; + continue; + } + EatResult::EatUnchanged { tokens: __eu, .. } => { + break Rc::new(TypeParamsResult { + params: next_params, + tokens: r.tokens.clone(), + ctx: ctx, + }); + } + } + } else { break Rc::new(TypeParamsResult { - params: params, - tokens: tokens.clone(), - ctx: ctx, -}); -} -} + params: params, + tokens: tokens.clone(), + ctx: ctx, + }); + } + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -3892,954 +4656,1075 @@ pub struct TypeArgsResult { pub err: Option>, } -pub fn collect_type_args(mut tokens: Rc>>, mut ctx: Rc, mut args: Rc>>) -> Rc { +pub fn collect_type_args( + mut tokens: Rc>>, + mut ctx: Rc, + mut args: Rc>>, +) -> Rc { loop { match (*eat(&tokens, Rc::new(ExpectedToken::ExpectComma))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { let r = parse_type_expr(&__ec, &ctx); -if has_err(r.err.clone()) { - return Rc::new(TypeArgsResult { - args: args.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -{ - let __tco_0 = r.tokens.clone(); -let __tco_1 = r.ctx.clone(); -let __tco_2 = v2_rt::rc_list_push(args, r.type_expr.clone()); -tokens = __tco_0; -ctx = __tco_1; -args = __tco_2; -continue; -} }, - EatResult::EatUnchanged { tokens: __eu, .. } => { break Rc::new(TypeArgsResult { - args: args.clone(), - tokens: tokens.clone(), - ctx: ctx, - err: None, -}); }, -} -} + EatResult::EatConsumed { tokens: __ec, .. } => { + let r = parse_type_expr(&__ec, &ctx); + if has_err(r.err.clone()) { + return Rc::new(TypeArgsResult { + args: args.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + { + let __tco_0 = r.tokens.clone(); + let __tco_1 = r.ctx.clone(); + let __tco_2 = v2_rt::rc_list_push(args, r.type_expr.clone()); + tokens = __tco_0; + ctx = __tco_1; + args = __tco_2; + continue; + } + } + EatResult::EatUnchanged { tokens: __eu, .. } => { + break Rc::new(TypeArgsResult { + args: args.clone(), + tokens: tokens.clone(), + ctx: ctx, + err: None, + }); + } + } + } } -pub fn maybe_optional(tokens: &Rc>>, ctx: Rc, te: &Rc, start_span: Rc) -> Rc { +pub fn maybe_optional( + tokens: &Rc>>, + ctx: Rc, + te: &Rc, + start_span: Rc, +) -> Rc { match (*eat(&tokens, Rc::new(ExpectedToken::ExpectQuestion))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let ote = Rc::new(Node { - name: te.name.clone(), - span: te.span.clone(), - ident_span: te.ident_span.clone(), - children: te.children.clone(), - connective: te.connective.clone(), - params: te.params.clone(), - inferred: te.inferred.clone(), - return_cardinality: Cardinality::CardOptional, - uses: te.uses.clone(), - body: te.body.clone(), - transport: te.transport.clone(), - properties: te.properties.clone(), - type_annotation: te.type_annotation.clone(), - is_self_recursive: te.is_self_recursive.clone(), - has_non_tail_self_call: te.has_non_tail_self_call.clone(), - match_pattern: te.match_pattern.clone(), - expr_data: te.expr_data.clone(), - ident: None, -}); -Rc::new(TypeResult { - type_expr: ote, - tokens: __ec.clone(), - ctx: ctx, - err: None, -}) -}, - EatResult::EatUnchanged { tokens: __eu, .. } => Rc::new(TypeResult { - type_expr: te.clone(), - tokens: tokens.clone(), - ctx: ctx, - err: None, -}), -} + EatResult::EatConsumed { tokens: __ec, .. } => { + let ote = Rc::new(Node { + name: te.name.clone(), + span: te.span.clone(), + ident_span: te.ident_span.clone(), + children: te.children.clone(), + connective: te.connective.clone(), + params: te.params.clone(), + inferred: te.inferred.clone(), + return_cardinality: Cardinality::CardOptional, + uses: te.uses.clone(), + body: te.body.clone(), + transport: te.transport.clone(), + properties: te.properties.clone(), + type_annotation: te.type_annotation.clone(), + is_self_recursive: te.is_self_recursive.clone(), + has_non_tail_self_call: te.has_non_tail_self_call.clone(), + match_pattern: te.match_pattern.clone(), + expr_data: te.expr_data.clone(), + ident: None, + }); + Rc::new(TypeResult { + type_expr: ote, + tokens: __ec.clone(), + ctx: ctx, + err: None, + }) + } + EatResult::EatUnchanged { tokens: __eu, .. } => Rc::new(TypeResult { + type_expr: te.clone(), + tokens: tokens.clone(), + ctx: ctx, + err: None, + }), + } } pub fn parse_field_list(tokens: Rc>>, ctx: Rc) -> Rc { parse_field_list_acc(tokens, ctx, Rc::new(vec![])) } -pub fn parse_field_list_acc(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { +pub fn parse_field_list_acc( + mut tokens: Rc>>, + mut ctx: Rc, + mut acc: Rc>>, +) -> Rc { loop { tokens = skip_newlines(tokens.clone()); -let tok = tokens.clone().first().cloned(); -if ((tok_is_rbrace(tok.clone()) || tok_is_rparen(tok.clone())) || tok_is_eof(tok.clone())) { + let tok = tokens.clone().first().cloned(); + if ((tok_is_rbrace(tok.clone()) || tok_is_rparen(tok.clone())) || tok_is_eof(tok.clone())) { break Rc::new(FieldsResult { - fields: acc, - tokens: tokens.clone(), - ctx: ctx, - err: None, -}); -} else { + fields: acc, + tokens: tokens.clone(), + ctx: ctx, + err: None, + }); + } else { if (tok_is_ident(tok.clone()) || tok_is_keyword_name(tok.clone())) { let r = parse_field(&tokens, &ctx); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(FieldsResult { - fields: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -tokens = r.tokens.clone(); -let e = eat(&tokens, Rc::new(ExpectedToken::ExpectComma)); -tokens = skip_newlines(match (*e).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), - EatResult::EatUnchanged { .. } => tokens.clone(), -}); -{ + fields: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + tokens = r.tokens.clone(); + let e = eat(&tokens, Rc::new(ExpectedToken::ExpectComma)); + tokens = skip_newlines(match (*e).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), + EatResult::EatUnchanged { .. } => tokens.clone(), + }); + { let __tco_0 = r.ctx.clone(); -let __tco_1 = v2_rt::rc_list_push(acc, r.field.clone()); -ctx = __tco_0; -acc = __tco_1; -continue; -} -} else { + let __tco_1 = v2_rt::rc_list_push(acc, r.field.clone()); + ctx = __tco_0; + acc = __tco_1; + continue; + } + } else { break Rc::new(FieldsResult { - fields: acc, - tokens: tokens.clone(), - ctx: ctx, - err: None, -}); -} -} -} + fields: acc, + tokens: tokens.clone(), + ctx: ctx, + err: None, + }); + } + } + } } pub fn parse_field(tokens: &Rc>>, ctx: &Rc) -> Rc { { let start_span = token_span(tokens.clone().first().cloned()); -let dummy_field = make_field_node(&"".to_string(), leaf_type_node(&"".to_string(), &start_span), Cardinality::Required, None, None, start_span.clone(), start_span.clone()); -let r = expect_name(&tokens); -if has_err(r.err.clone()) { + let dummy_field = make_field_node( + &"".to_string(), + leaf_type_node(&"".to_string(), &start_span), + Cardinality::Required, + None, + None, + start_span.clone(), + start_span.clone(), + ); + let r = expect_name(&tokens); + if has_err(r.err.clone()) { return Rc::new(FieldResult { - field: dummy_field.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let name = r.name.clone(); -let name_span = r.span.clone(); -let tokens = r.tokens.clone(); -let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectColon)); -if has_err(r2.err.clone()) { + field: dummy_field.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let name = r.name.clone(); + let name_span = r.span.clone(); + let tokens = r.tokens.clone(); + let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectColon)); + if has_err(r2.err.clone()) { return Rc::new(FieldResult { - field: dummy_field.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), -}) - } -let r3 = parse_type_expr(&r2.tokens.clone(), &ctx); -if has_err(r3.err.clone()) { + field: dummy_field.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), + }); + } + let r3 = parse_type_expr(&r2.tokens.clone(), &ctx); + if has_err(r3.err.clone()) { return Rc::new(FieldResult { - field: dummy_field.clone(), - tokens: r3.tokens.clone(), - ctx: r3.ctx.clone(), - err: r3.err.clone(), -}) - } -let wr = try_where_clause(&r3.tokens.clone(), r3.ctx.clone(), &r3.type_expr.clone(), &start_span); -if has_err(wr.err.clone()) { + field: dummy_field.clone(), + tokens: r3.tokens.clone(), + ctx: r3.ctx.clone(), + err: r3.err.clone(), + }); + } + let wr = try_where_clause( + &r3.tokens.clone(), + r3.ctx.clone(), + &r3.type_expr.clone(), + &start_span, + ); + if has_err(wr.err.clone()) { return Rc::new(FieldResult { - field: dummy_field.clone(), - tokens: wr.tokens.clone(), - ctx: wr.ctx.clone(), - err: wr.err.clone(), -}) - } -let te = wr.type_expr.clone(); -let tokens = wr.tokens.clone(); -let ctx = wr.ctx.clone(); -let from_r = parse_optional_from_key(&tokens, ctx.clone()); -let from_key = from_r.from_key.clone(); -let tokens = from_r.tokens.clone(); -let ctx = from_r.ctx.clone(); -match (*eat(&tokens, Rc::new(ExpectedToken::ExpectEq))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let r4 = parse_expr(__ec.clone(), ctx.clone()); -if has_err(r4.err.clone()) { - return Rc::new(FieldResult { - field: dummy_field.clone(), - tokens: r4.tokens.clone(), - ctx: r4.ctx.clone(), - err: r4.err.clone(), -}) - } -let f = make_field_node(&name, te.clone(), te.return_cardinality.clone(), Some(r4.expr.clone()), from_key, start_span.clone(), name_span); -Rc::new(FieldResult { - field: f, - tokens: r4.tokens.clone(), - ctx: r4.ctx.clone(), - err: None, -}) -}, - EatResult::EatUnchanged { tokens: __eu, .. } => { - let f = make_field_node(&name, te.clone(), te.return_cardinality.clone(), None, from_key, start_span.clone(), name_span); -Rc::new(FieldResult { - field: f, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}) -}, -} -} + field: dummy_field.clone(), + tokens: wr.tokens.clone(), + ctx: wr.ctx.clone(), + err: wr.err.clone(), + }); + } + let te = wr.type_expr.clone(); + let tokens = wr.tokens.clone(); + let ctx = wr.ctx.clone(); + let from_r = parse_optional_from_key(&tokens, ctx.clone()); + let from_key = from_r.from_key.clone(); + let tokens = from_r.tokens.clone(); + let ctx = from_r.ctx.clone(); + match (*eat(&tokens, Rc::new(ExpectedToken::ExpectEq))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { + let r4 = parse_expr(__ec.clone(), ctx.clone()); + if has_err(r4.err.clone()) { + return Rc::new(FieldResult { + field: dummy_field.clone(), + tokens: r4.tokens.clone(), + ctx: r4.ctx.clone(), + err: r4.err.clone(), + }); + } + let f = make_field_node( + &name, + te.clone(), + te.return_cardinality.clone(), + Some(r4.expr.clone()), + from_key, + start_span.clone(), + name_span, + ); + Rc::new(FieldResult { + field: f, + tokens: r4.tokens.clone(), + ctx: r4.ctx.clone(), + err: None, + }) + } + EatResult::EatUnchanged { tokens: __eu, .. } => { + let f = make_field_node( + &name, + te.clone(), + te.return_cardinality.clone(), + None, + from_key, + start_span.clone(), + name_span, + ); + Rc::new(FieldResult { + field: f, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }) + } + } + } } -pub fn parse_optional_from_key(tokens: &Rc>>, ctx: Rc) -> Rc { +pub fn parse_optional_from_key( + tokens: &Rc>>, + ctx: Rc, +) -> Rc { { let tok = tokens.clone().first().cloned(); -let sh = match tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, -}; -match sh { - Some(TokenShape::ShIdent) => if (tok.clone().unwrap().text.clone().as_str() == "from".to_string().as_str()) { - { - let tok2 = tokens.clone().get(1 as usize).cloned(); -let sh2 = match tok2.clone() { - Some(t) => Some(t.shape.clone()), - None => None, -}; -match sh2 { - Some(TokenShape::ShLitStr) => { - let key = tok2.clone().unwrap().text.clone(); -Rc::new(FromKeyResult { - from_key: Some(key), - tokens: Rc::new(tokens.clone().iter().cloned().skip(2 as usize).collect::>()), - ctx: ctx, - err: None, -}) -}, - _ => Rc::new(FromKeyResult { - from_key: None, - tokens: tokens.clone(), - ctx: ctx, - err: None, -}), -} -} - } else { - Rc::new(FromKeyResult { - from_key: None, - tokens: tokens.clone(), - ctx: ctx, - err: None, -}) - }, - _ => Rc::new(FromKeyResult { - from_key: None, - tokens: tokens.clone(), - ctx: ctx, - err: None, -}), -} -} + let sh = match tok.clone() { + Some(t) => Some(t.shape.clone()), + None => None, + }; + match sh { + Some(TokenShape::ShIdent) => { + if (tok.clone().unwrap().text.clone().as_str() == "from".to_string().as_str()) { + { + let tok2 = tokens.clone().get(1 as usize).cloned(); + let sh2 = match tok2.clone() { + Some(t) => Some(t.shape.clone()), + None => None, + }; + match sh2 { + Some(TokenShape::ShLitStr) => { + let key = tok2.clone().unwrap().text.clone(); + Rc::new(FromKeyResult { + from_key: Some(key), + tokens: Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(2 as usize) + .collect::>(), + ), + ctx: ctx, + err: None, + }) + } + _ => Rc::new(FromKeyResult { + from_key: None, + tokens: tokens.clone(), + ctx: ctx, + err: None, + }), + } + } + } else { + Rc::new(FromKeyResult { + from_key: None, + tokens: tokens.clone(), + ctx: ctx, + err: None, + }) + } + } + _ => Rc::new(FromKeyResult { + from_key: None, + tokens: tokens.clone(), + ctx: ctx, + err: None, + }), + } + } } pub fn parse_fn_def(tokens: &Rc>>, ctx: &Rc) -> Rc { { let start_span = token_span(tokens.clone().first().cloned()); -let dummy = Rc::new(Node { - name: "".to_string(), - span: start_span.clone(), - ident_span: None, - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { - text: "fn".to_string(), -})); -if has_err(r.err.clone()) { + let dummy = Rc::new(Node { + name: "".to_string(), + span: start_span.clone(), + ident_span: None, + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + let r = expect( + &tokens, + &Rc::new(ExpectedToken::ExpectKeyword { + text: "fn".to_string(), + }), + ); + if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: dummy, - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) + item: dummy, + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); } -parse_fn_after_kw(&r.tokens.clone(), &ctx, &start_span) -} + parse_fn_after_kw(&r.tokens.clone(), &ctx, &start_span) + } } -pub fn parse_fn_after_kw(tokens: &Rc>>, ctx: &Rc, start_span: &Rc) -> Rc { +pub fn parse_fn_after_kw( + tokens: &Rc>>, + ctx: &Rc, + start_span: &Rc, +) -> Rc { { let dummy = Rc::new(Node { - name: "".to_string(), - span: start_span.clone(), - ident_span: None, - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -let r = expect_ident(&tokens); -if has_err(r.err.clone()) { - return Rc::new(ItemResult { - item: dummy, - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let name = r.name.clone(); -let name_span = r.span.clone(); -let tokens = r.tokens.clone(); -let named_dummy = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -let r = parse_params(&tokens, &ctx); -if has_err(r.err.clone()) { - return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let params = r.params.clone(); -let tokens = r.tokens.clone(); -let ctx = r.ctx.clone(); -let ret = parse_optional_inferred(&tokens, ctx.clone()); -if has_err(ret.err.clone()) { - return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: ret.tokens.clone(), - ctx: ret.ctx.clone(), - err: ret.err.clone(), -}) - } -let inferred = ret.inferred.clone(); -let tokens = ret.tokens.clone(); -let ctx = ret.ctx.clone(); -let r = parse_block(&skip_newlines(tokens.clone()), &ctx); -if has_err(r.err.clone()) { - return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let body = r.expr.clone(); -let item = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: Rc::new(vec![]), - params: params, - inferred: inferred, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: Some(body), - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -Rc::new(ItemResult { - item: item, - tokens: skip_newlines(r.tokens.clone()), - ctx: r.ctx.clone(), - err: None, -}) -} -} - -pub fn parse_fn_body_from_prefix(prefix: &Rc, start_span: &Rc) -> Rc { - { - let name = prefix.name.clone(); -let name_span = prefix.name_span.clone(); -let type_params = prefix.type_params.clone(); -let params = prefix.params.clone(); -let inferred = prefix.inferred.clone(); -let ctx = prefix.ctx.clone(); -let all_params = v2_rt::concat(type_params, params); -let named_dummy = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: Rc::new(vec![]), - params: all_params.clone(), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -let r = parse_block(&skip_newlines(prefix.tokens.clone()), &ctx); -if has_err(r.err.clone()) { + name: "".to_string(), + span: start_span.clone(), + ident_span: None, + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + let r = expect_ident(&tokens); + if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: named_dummy, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let body = r.expr.clone(); -let item = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: Rc::new(vec![]), - params: all_params.clone(), - inferred: inferred, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: Some(body), - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -Rc::new(ItemResult { - item: item, - tokens: skip_newlines(r.tokens.clone()), - ctx: r.ctx.clone(), - err: None, -}) + item: dummy, + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let name = r.name.clone(); + let name_span = r.span.clone(); + let tokens = r.tokens.clone(); + let named_dummy = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + let r = parse_params(&tokens, &ctx); + if has_err(r.err.clone()) { + return Rc::new(ItemResult { + item: named_dummy.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let params = r.params.clone(); + let tokens = r.tokens.clone(); + let ctx = r.ctx.clone(); + let ret = parse_optional_inferred(&tokens, ctx.clone()); + if has_err(ret.err.clone()) { + return Rc::new(ItemResult { + item: named_dummy.clone(), + tokens: ret.tokens.clone(), + ctx: ret.ctx.clone(), + err: ret.err.clone(), + }); + } + let inferred = ret.inferred.clone(); + let tokens = ret.tokens.clone(); + let ctx = ret.ctx.clone(); + let r = parse_block(&skip_newlines(tokens.clone()), &ctx); + if has_err(r.err.clone()) { + return Rc::new(ItemResult { + item: named_dummy.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let body = r.expr.clone(); + let item = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: Rc::new(vec![]), + params: params, + inferred: inferred, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: Some(body), + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + Rc::new(ItemResult { + item: item, + tokens: skip_newlines(r.tokens.clone()), + ctx: r.ctx.clone(), + err: None, + }) + } } + +pub fn parse_fn_body_from_prefix( + prefix: &Rc, + start_span: &Rc, +) -> Rc { + { + let name = prefix.name.clone(); + let name_span = prefix.name_span.clone(); + let type_params = prefix.type_params.clone(); + let params = prefix.params.clone(); + let inferred = prefix.inferred.clone(); + let ctx = prefix.ctx.clone(); + let all_params = v2_rt::concat(type_params, params); + let named_dummy = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: Rc::new(vec![]), + params: all_params.clone(), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + let r = parse_block(&skip_newlines(prefix.tokens.clone()), &ctx); + if has_err(r.err.clone()) { + return Rc::new(ItemResult { + item: named_dummy, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let body = r.expr.clone(); + let item = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: Rc::new(vec![]), + params: all_params.clone(), + inferred: inferred, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: Some(body), + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + Rc::new(ItemResult { + item: item, + tokens: skip_newlines(r.tokens.clone()), + ctx: r.ctx.clone(), + err: None, + }) + } } pub fn parse_func_def(tokens: &Rc>>, ctx: &Rc) -> Rc { { let start_span = token_span(tokens.clone().first().cloned()); -let dummy = Rc::new(Node { - name: "".to_string(), - span: start_span.clone(), - ident_span: None, - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -let kw = tok_keyword_text(tokens.clone().first().cloned()); -let r = if (kw.clone().as_str() == "func".to_string().as_str()) { - expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { - text: "func".to_string(), -})) + let dummy = Rc::new(Node { + name: "".to_string(), + span: start_span.clone(), + ident_span: None, + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + let kw = tok_keyword_text(tokens.clone().first().cloned()); + let r = if (kw.clone().as_str() == "func".to_string().as_str()) { + expect( + &tokens, + &Rc::new(ExpectedToken::ExpectKeyword { + text: "func".to_string(), + }), + ) } else { if (kw.clone().as_str() == "pattern".to_string().as_str()) { - expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { - text: "pattern".to_string(), -})) + expect( + &tokens, + &Rc::new(ExpectedToken::ExpectKeyword { + text: "pattern".to_string(), + }), + ) } else { if (kw.clone().as_str() == "interface".to_string().as_str()) { - expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { - text: "interface".to_string(), -})) + expect( + &tokens, + &Rc::new(ExpectedToken::ExpectKeyword { + text: "interface".to_string(), + }), + ) } else { - expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { - text: "func".to_string(), -})) + expect( + &tokens, + &Rc::new(ExpectedToken::ExpectKeyword { + text: "func".to_string(), + }), + ) } } }; -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: dummy.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let has_uses = (kw.clone().as_str() == "func".to_string().as_str()); -let form = Rc::new(ItemForm { - kind: ItemFormKind::OtherForm, - keyword: kw.clone(), - has_type_params: false, - has_params: true, - has_return_type: true, - return_required: false, - has_uses: has_uses, - body_kind: BodyKind::BlockBody, -}); -let prefix = parse_item_prefix(&r.tokens.clone(), &ctx, &form); -if has_err(prefix.err.clone()) { + item: dummy.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let has_uses = (kw.clone().as_str() == "func".to_string().as_str()); + let form = Rc::new(ItemForm { + kind: ItemFormKind::OtherForm, + keyword: kw.clone(), + has_type_params: false, + has_params: true, + has_return_type: true, + return_required: false, + has_uses: has_uses, + body_kind: BodyKind::BlockBody, + }); + let prefix = parse_item_prefix(&r.tokens.clone(), &ctx, &form); + if has_err(prefix.err.clone()) { return Rc::new(ItemResult { - item: dummy.clone(), - tokens: prefix.tokens.clone(), - ctx: prefix.ctx.clone(), - err: prefix.err.clone(), -}) + item: dummy.clone(), + tokens: prefix.tokens.clone(), + ctx: prefix.ctx.clone(), + err: prefix.err.clone(), + }); } -parse_block_body_from_prefix(&prefix, &start_span) -} + parse_block_body_from_prefix(&prefix, &start_span) + } } -pub fn parse_block_item_after_kw(tokens: &Rc>>, ctx: &Rc, start_span: &Rc, form: Rc) -> Rc { +pub fn parse_block_item_after_kw( + tokens: &Rc>>, + ctx: &Rc, + start_span: &Rc, + form: Rc, +) -> Rc { { let dummy = Rc::new(Node { - name: "".to_string(), - span: start_span.clone(), - ident_span: None, - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -let r = expect_ident(&tokens); -if has_err(r.err.clone()) { + name: "".to_string(), + span: start_span.clone(), + ident_span: None, + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + let r = expect_ident(&tokens); + if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: dummy, - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let name = r.name.clone(); -let name_span = r.span.clone(); -let tokens = r.tokens.clone(); -let named_dummy = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -let r = parse_params(&tokens, &ctx); -if has_err(r.err.clone()) { + item: dummy, + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let name = r.name.clone(); + let name_span = r.span.clone(); + let tokens = r.tokens.clone(); + let named_dummy = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + let r = parse_params(&tokens, &ctx); + if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let params = r.params.clone(); -let tokens = r.tokens.clone(); -let ctx = r.ctx.clone(); -let ret = parse_optional_inferred(&tokens, ctx.clone()); -if has_err(ret.err.clone()) { + item: named_dummy.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let params = r.params.clone(); + let tokens = r.tokens.clone(); + let ctx = r.ctx.clone(); + let ret = parse_optional_inferred(&tokens, ctx.clone()); + if has_err(ret.err.clone()) { return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: ret.tokens.clone(), - ctx: ret.ctx.clone(), - err: ret.err.clone(), -}) - } -let inferred = ret.inferred.clone(); -let tokens = ret.tokens.clone(); -let ctx = ret.ctx.clone(); -let uses_r = if form.has_uses.clone() { + item: named_dummy.clone(), + tokens: ret.tokens.clone(), + ctx: ret.ctx.clone(), + err: ret.err.clone(), + }); + } + let inferred = ret.inferred.clone(); + let tokens = ret.tokens.clone(); + let ctx = ret.ctx.clone(); + let uses_r = if form.has_uses.clone() { parse_uses_clause(&skip_newlines(tokens.clone()), ctx.clone()) } else { Rc::new(UsesResult { - uses: Rc::new(vec![]), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}) + uses: Rc::new(vec![]), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }) }; -if has_err(uses_r.err.clone()) { + if has_err(uses_r.err.clone()) { return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: uses_r.tokens.clone(), - ctx: uses_r.ctx.clone(), - err: uses_r.err.clone(), -}) - } -let uses = uses_r.uses.clone(); -let tokens = uses_r.tokens.clone(); -let ctx = uses_r.ctx.clone(); -let r = parse_block(&skip_newlines(tokens.clone()), &ctx); -if has_err(r.err.clone()) { + item: named_dummy.clone(), + tokens: uses_r.tokens.clone(), + ctx: uses_r.ctx.clone(), + err: uses_r.err.clone(), + }); + } + let uses = uses_r.uses.clone(); + let tokens = uses_r.tokens.clone(); + let ctx = uses_r.ctx.clone(); + let r = parse_block(&skip_newlines(tokens.clone()), &ctx); + if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let body = r.expr.clone(); -let item = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: Rc::new(vec![]), - params: params, - inferred: inferred, - return_cardinality: Cardinality::Required, - uses: uses, - body: Some(body), - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -Rc::new(ItemResult { - item: item, - tokens: skip_newlines(r.tokens.clone()), - ctx: r.ctx.clone(), - err: None, -}) -} + item: named_dummy.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let body = r.expr.clone(); + let item = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: Rc::new(vec![]), + params: params, + inferred: inferred, + return_cardinality: Cardinality::Required, + uses: uses, + body: Some(body), + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + Rc::new(ItemResult { + item: item, + tokens: skip_newlines(r.tokens.clone()), + ctx: r.ctx.clone(), + err: None, + }) + } } -pub fn parse_block_body_from_prefix(prefix: &Rc, start_span: &Rc) -> Rc { +pub fn parse_block_body_from_prefix( + prefix: &Rc, + start_span: &Rc, +) -> Rc { { let name = prefix.name.clone(); -let name_span = prefix.name_span.clone(); -let params = prefix.params.clone(); -let inferred = prefix.inferred.clone(); -let uses = prefix.uses.clone(); -let ctx = prefix.ctx.clone(); -let named_dummy = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -let r = parse_block(&skip_newlines(prefix.tokens.clone()), &ctx); -if has_err(r.err.clone()) { + let name_span = prefix.name_span.clone(); + let params = prefix.params.clone(); + let inferred = prefix.inferred.clone(); + let uses = prefix.uses.clone(); + let ctx = prefix.ctx.clone(); + let named_dummy = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + let r = parse_block(&skip_newlines(prefix.tokens.clone()), &ctx); + if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: named_dummy, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let body = r.expr.clone(); -let item = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: Rc::new(vec![]), - params: params, - inferred: inferred, - return_cardinality: Cardinality::Required, - uses: uses, - body: Some(body), - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -Rc::new(ItemResult { - item: item, - tokens: skip_newlines(r.tokens.clone()), - ctx: r.ctx.clone(), - err: None, -}) -} + item: named_dummy, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let body = r.expr.clone(); + let item = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: Rc::new(vec![]), + params: params, + inferred: inferred, + return_cardinality: Cardinality::Required, + uses: uses, + body: Some(body), + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + Rc::new(ItemResult { + item: item, + tokens: skip_newlines(r.tokens.clone()), + ctx: r.ctx.clone(), + err: None, + }) + } } -pub fn parse_no_body_from_prefix(prefix: &Rc, start_span: Rc) -> Rc { +pub fn parse_no_body_from_prefix( + prefix: &Rc, + start_span: Rc, +) -> Rc { { let item = Rc::new(Node { - name: prefix.name.clone(), - span: start_span, - ident_span: Some(prefix.name_span.clone()), - children: Rc::new(vec![]), - params: prefix.params.clone(), - inferred: prefix.inferred.clone(), - return_cardinality: Cardinality::Required, - uses: prefix.uses.clone(), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -Rc::new(ItemResult { - item: item, - tokens: prefix.tokens.clone(), - ctx: prefix.ctx.clone(), - err: None, -}) -} + name: prefix.name.clone(), + span: start_span, + ident_span: Some(prefix.name_span.clone()), + children: Rc::new(vec![]), + params: prefix.params.clone(), + inferred: prefix.inferred.clone(), + return_cardinality: Cardinality::Required, + uses: prefix.uses.clone(), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + Rc::new(ItemResult { + item: item, + tokens: prefix.tokens.clone(), + ctx: prefix.ctx.clone(), + err: None, + }) + } } pub fn parse_uses_clause(tokens: &Rc>>, ctx: Rc) -> Rc { { let tokens = skip_newlines(tokens.clone()); -let tok = tokens.clone().first().cloned(); -let is_uses = match tok { - Some(t) => (is_ident_shape(t.shape.clone()) && (t.text.clone().as_str() == "uses".to_string().as_str())), - None => false, -}; -if is_uses { + let tok = tokens.clone().first().cloned(); + let is_uses = match tok { + Some(t) => { + (is_ident_shape(t.shape.clone()) + && (t.text.clone().as_str() == "uses".to_string().as_str())) + } + None => false, + }; + if is_uses { { - let r = parse_uses_list(Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), ctx); -if has_err(r.err.clone()) { - return r.clone() + let r = parse_uses_list( + Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + ctx, + ); + if has_err(r.err.clone()) { + return r.clone(); } -Rc::new(UsesResult { - uses: r.uses.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -} + Rc::new(UsesResult { + uses: r.uses.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } } else { Rc::new(UsesResult { - uses: Rc::new(vec![]), - tokens: tokens.clone(), - ctx: ctx, - err: None, -}) + uses: Rc::new(vec![]), + tokens: tokens.clone(), + ctx: ctx, + err: None, + }) } -} + } } pub fn parse_uses_list(tokens: Rc>>, ctx: Rc) -> Rc { parse_uses_list_acc(tokens, ctx, Rc::new(vec![])) } -pub fn parse_uses_list_acc(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { +pub fn parse_uses_list_acc( + mut tokens: Rc>>, + mut ctx: Rc, + mut acc: Rc>>, +) -> Rc { loop { let r = parse_uses_entry(&tokens, &ctx); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(UsesResult { - uses: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -acc = v2_rt::rc_list_push(acc.clone(), r.resource_use.clone()); -match (*eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { { - let __tco_0 = __ec.clone(); -let __tco_1 = r.ctx.clone(); -tokens = __tco_0; -ctx = __tco_1; -continue; -} }, - EatResult::EatUnchanged { tokens: __eu, .. } => { break Rc::new(UsesResult { - uses: acc.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}); }, -} -} + uses: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + acc = v2_rt::rc_list_push(acc.clone(), r.resource_use.clone()); + match (*eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { + let __tco_0 = __ec.clone(); + let __tco_1 = r.ctx.clone(); + tokens = __tco_0; + ctx = __tco_1; + continue; + } + EatResult::EatUnchanged { tokens: __eu, .. } => { + break Rc::new(UsesResult { + uses: acc.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }); + } + } + } } pub fn parse_uses_entry(tokens: &Rc>>, ctx: &Rc) -> Rc { { let start_span = token_span(tokens.clone().first().cloned()); -let dummy = make_resource_use_node(&"".to_string(), leaf_type_node(&"".to_string(), &start_span), start_span.clone(), start_span.clone()); -let r = expect_ident(&tokens); -if has_err(r.err.clone()) { + let dummy = make_resource_use_node( + &"".to_string(), + leaf_type_node(&"".to_string(), &start_span), + start_span.clone(), + start_span.clone(), + ); + let r = expect_ident(&tokens); + if has_err(r.err.clone()) { return Rc::new(ResUseResult { - resource_use: dummy.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let name = r.name.clone(); -let tokens = r.tokens.clone(); -let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectColon)); -if has_err(r2.err.clone()) { + resource_use: dummy.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let name = r.name.clone(); + let tokens = r.tokens.clone(); + let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectColon)); + if has_err(r2.err.clone()) { return Rc::new(ResUseResult { - resource_use: dummy.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), -}) - } -let r3 = parse_type_expr(&r2.tokens.clone(), &ctx); -if has_err(r3.err.clone()) { + resource_use: dummy.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), + }); + } + let r3 = parse_type_expr(&r2.tokens.clone(), &ctx); + if has_err(r3.err.clone()) { return Rc::new(ResUseResult { - resource_use: dummy.clone(), - tokens: r3.tokens.clone(), - ctx: r3.ctx.clone(), - err: r3.err.clone(), -}) - } -match (*eat(&r3.tokens.clone(), Rc::new(ExpectedToken::ExpectLParen))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let ar = parse_resource_config_args(__ec.clone(), r3.ctx.clone()); -if has_err(ar.err.clone()) { - return Rc::new(ResUseResult { - resource_use: dummy.clone(), - tokens: ar.tokens.clone(), - ctx: ar.ctx.clone(), - err: ar.err.clone(), -}) - } -let r4 = expect(&ar.tokens.clone(), &Rc::new(ExpectedToken::ExpectRParen)); -if has_err(r4.err.clone()) { - return Rc::new(ResUseResult { - resource_use: dummy.clone(), - tokens: r4.tokens.clone(), - ctx: ar.ctx.clone(), - err: r4.err.clone(), -}) - } -let res_node = Rc::new(Node { - name: r3.type_expr.clone().name.clone(), - span: r3.type_expr.clone().span.clone(), - ident_span: r3.type_expr.clone().ident_span.clone(), - children: r3.type_expr.clone().children.clone(), - params: r3.type_expr.clone().params.clone(), - inferred: r3.type_expr.clone().inferred.clone(), - return_cardinality: r3.type_expr.clone().return_cardinality.clone(), - uses: r3.type_expr.clone().uses.clone(), - body: r3.type_expr.clone().body.clone(), - connective: r3.type_expr.clone().connective.clone(), - transport: r3.type_expr.clone().transport.clone(), - properties: ar.fields.clone(), - type_annotation: r3.type_expr.clone().type_annotation.clone(), - is_self_recursive: r3.type_expr.clone().is_self_recursive.clone(), - has_non_tail_self_call: r3.type_expr.clone().has_non_tail_self_call.clone(), - match_pattern: r3.type_expr.clone().match_pattern.clone(), - expr_data: r3.type_expr.clone().expr_data.clone(), - ident: None, -}); -let ru = make_resource_use_node(&name, res_node, start_span.clone(), r.span.clone()); -Rc::new(ResUseResult { - resource_use: ru, - tokens: r4.tokens.clone(), - ctx: ar.ctx.clone(), - err: None, -}) -}, - EatResult::EatUnchanged { tokens: __eu, .. } => { - let ru = make_resource_use_node(&name, r3.type_expr.clone(), start_span.clone(), r.span.clone()); -Rc::new(ResUseResult { - resource_use: ru, - tokens: r3.tokens.clone(), - ctx: r3.ctx.clone(), - err: None, -}) -}, -} -} + resource_use: dummy.clone(), + tokens: r3.tokens.clone(), + ctx: r3.ctx.clone(), + err: r3.err.clone(), + }); + } + match (*eat(&r3.tokens.clone(), Rc::new(ExpectedToken::ExpectLParen))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { + let ar = parse_resource_config_args(__ec.clone(), r3.ctx.clone()); + if has_err(ar.err.clone()) { + return Rc::new(ResUseResult { + resource_use: dummy.clone(), + tokens: ar.tokens.clone(), + ctx: ar.ctx.clone(), + err: ar.err.clone(), + }); + } + let r4 = expect(&ar.tokens.clone(), &Rc::new(ExpectedToken::ExpectRParen)); + if has_err(r4.err.clone()) { + return Rc::new(ResUseResult { + resource_use: dummy.clone(), + tokens: r4.tokens.clone(), + ctx: ar.ctx.clone(), + err: r4.err.clone(), + }); + } + let res_node = Rc::new(Node { + name: r3.type_expr.clone().name.clone(), + span: r3.type_expr.clone().span.clone(), + ident_span: r3.type_expr.clone().ident_span.clone(), + children: r3.type_expr.clone().children.clone(), + params: r3.type_expr.clone().params.clone(), + inferred: r3.type_expr.clone().inferred.clone(), + return_cardinality: r3.type_expr.clone().return_cardinality.clone(), + uses: r3.type_expr.clone().uses.clone(), + body: r3.type_expr.clone().body.clone(), + connective: r3.type_expr.clone().connective.clone(), + transport: r3.type_expr.clone().transport.clone(), + properties: ar.fields.clone(), + type_annotation: r3.type_expr.clone().type_annotation.clone(), + is_self_recursive: r3.type_expr.clone().is_self_recursive.clone(), + has_non_tail_self_call: r3.type_expr.clone().has_non_tail_self_call.clone(), + match_pattern: r3.type_expr.clone().match_pattern.clone(), + expr_data: r3.type_expr.clone().expr_data.clone(), + ident: None, + }); + let ru = + make_resource_use_node(&name, res_node, start_span.clone(), r.span.clone()); + Rc::new(ResUseResult { + resource_use: ru, + tokens: r4.tokens.clone(), + ctx: ar.ctx.clone(), + err: None, + }) + } + EatResult::EatUnchanged { tokens: __eu, .. } => { + let ru = make_resource_use_node( + &name, + r3.type_expr.clone(), + start_span.clone(), + r.span.clone(), + ); + Rc::new(ResUseResult { + resource_use: ru, + tokens: r3.tokens.clone(), + ctx: r3.ctx.clone(), + err: None, + }) + } + } + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -4850,768 +5735,981 @@ pub struct ResConfigResult { pub err: Option>, } -pub fn parse_resource_config_args(tokens: Rc>>, ctx: Rc) -> Rc { +pub fn parse_resource_config_args( + tokens: Rc>>, + ctx: Rc, +) -> Rc { parse_resource_config_acc(skip_newlines(tokens), ctx, Rc::new(vec![])) } -pub fn parse_resource_config_acc(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { +pub fn parse_resource_config_acc( + mut tokens: Rc>>, + mut ctx: Rc, + mut acc: Rc>>, +) -> Rc { loop { if tok_is_rparen(tokens.clone().first().cloned()) { return Rc::new(ResConfigResult { - fields: acc.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}) + fields: acc.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }); } -let zero_span = make_span(0, 0); -let r = expect_name(&tokens); -if has_err(r.err.clone()) { + let zero_span = make_span(0, 0); + let r = expect_name(&tokens); + if has_err(r.err.clone()) { return Rc::new(ResConfigResult { - fields: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let field_name = r.name.clone(); -let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); -if has_err(r2.err.clone()) { + fields: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let field_name = r.name.clone(); + let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); + if has_err(r2.err.clone()) { return Rc::new(ResConfigResult { - fields: Rc::new(vec![]), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), -}) - } -let r3 = parse_expr(r2.tokens.clone(), ctx.clone()); -if has_err(r3.err.clone()) { + fields: Rc::new(vec![]), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), + }); + } + let r3 = parse_expr(r2.tokens.clone(), ctx.clone()); + if has_err(r3.err.clone()) { return Rc::new(ResConfigResult { - fields: Rc::new(vec![]), - tokens: r3.tokens.clone(), - ctx: r3.ctx.clone(), - err: r3.err.clone(), -}) - } -let fi = make_field_init_node(&field_name, r3.expr.clone(), zero_span, r.span.clone()); -acc = v2_rt::rc_list_push(acc.clone(), fi); -match (*eat(&r3.tokens.clone(), Rc::new(ExpectedToken::ExpectComma))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { { - let __tco_0 = skip_newlines(__ec.clone()); -let __tco_1 = r3.ctx.clone(); -tokens = __tco_0; -ctx = __tco_1; -continue; -} }, - EatResult::EatUnchanged { tokens: __eu, .. } => { break Rc::new(ResConfigResult { - fields: acc.clone(), - tokens: r3.tokens.clone(), - ctx: r3.ctx.clone(), - err: None, -}); }, -} -} -} - -pub fn parse_optional_inferred(tokens: &Rc>>, ctx: Rc) -> Rc { - match (*eat(&tokens, Rc::new(ExpectedToken::ExpectArrow))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let r = parse_type_expr(&__ec, &ctx); -if has_err(r.err.clone()) { - return Rc::new(OptRetResult { - inferred: None, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -Rc::new(OptRetResult { - inferred: Some(Rc::new(InferredNode::Resolved { - node: r.type_expr.clone(), -})), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -}, - EatResult::EatUnchanged { tokens: __eu, .. } => Rc::new(OptRetResult { - inferred: None, - tokens: tokens.clone(), - ctx: ctx, - err: None, -}), + fields: Rc::new(vec![]), + tokens: r3.tokens.clone(), + ctx: r3.ctx.clone(), + err: r3.err.clone(), + }); + } + let fi = make_field_init_node(&field_name, r3.expr.clone(), zero_span, r.span.clone()); + acc = v2_rt::rc_list_push(acc.clone(), fi); + match (*eat(&r3.tokens.clone(), Rc::new(ExpectedToken::ExpectComma))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { + let __tco_0 = skip_newlines(__ec.clone()); + let __tco_1 = r3.ctx.clone(); + tokens = __tco_0; + ctx = __tco_1; + continue; + } + EatResult::EatUnchanged { tokens: __eu, .. } => { + break Rc::new(ResConfigResult { + fields: acc.clone(), + tokens: r3.tokens.clone(), + ctx: r3.ctx.clone(), + err: None, + }); + } + } + } } + +pub fn parse_optional_inferred( + tokens: &Rc>>, + ctx: Rc, +) -> Rc { + match (*eat(&tokens, Rc::new(ExpectedToken::ExpectArrow))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { + let r = parse_type_expr(&__ec, &ctx); + if has_err(r.err.clone()) { + return Rc::new(OptRetResult { + inferred: None, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + Rc::new(OptRetResult { + inferred: Some(Rc::new(InferredNode::Resolved { + node: r.type_expr.clone(), + })), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } + EatResult::EatUnchanged { tokens: __eu, .. } => Rc::new(OptRetResult { + inferred: None, + tokens: tokens.clone(), + ctx: ctx, + err: None, + }), + } } pub fn parse_service_def(tokens: &Rc>>, ctx: &Rc) -> Rc { { let start_span = token_span(tokens.clone().first().cloned()); -let dummy = Rc::new(Node { - name: "".to_string(), - span: start_span.clone(), - ident_span: None, - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { - text: "service".to_string(), -})); -if has_err(r.err.clone()) { + let dummy = Rc::new(Node { + name: "".to_string(), + span: start_span.clone(), + ident_span: None, + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + let r = expect( + &tokens, + &Rc::new(ExpectedToken::ExpectKeyword { + text: "service".to_string(), + }), + ); + if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: dummy, - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) + item: dummy, + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); } -parse_service_after_kw(&r.tokens.clone(), &ctx, &start_span) -} + parse_service_after_kw(&r.tokens.clone(), &ctx, &start_span) + } } -pub fn parse_service_after_kw(tokens: &Rc>>, ctx: &Rc, start_span: &Rc) -> Rc { +pub fn parse_service_after_kw( + tokens: &Rc>>, + ctx: &Rc, + start_span: &Rc, +) -> Rc { { let dummy = Rc::new(Node { - name: "".to_string(), - span: start_span.clone(), - ident_span: None, - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -let r_ns = expect_name(&tokens); -if has_err(r_ns.err.clone()) { - return Rc::new(ItemResult { - item: dummy, - tokens: r_ns.tokens.clone(), - ctx: ctx.clone(), - err: r_ns.err.clone(), -}) - } -let namespace_root = r_ns.name.clone(); -let r = parse_dotted_ident_rest(r_ns.tokens.clone(), namespace_root.clone(), r_ns.span.clone()); -let name = r.name.clone(); -let svc_name_span = r.span.clone(); -let named_dummy = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(svc_name_span.clone()), - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -let r = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectLBrace)); -if has_err(r.err.clone()) { + name: "".to_string(), + span: start_span.clone(), + ident_span: None, + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + let r_ns = expect_name(&tokens); + if has_err(r_ns.err.clone()) { return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let tokens = skip_newlines(r.tokens.clone()); -let r = parse_service_body(&tokens, ctx.clone()); -if has_err(r.err.clone()) { + item: dummy, + tokens: r_ns.tokens.clone(), + ctx: ctx.clone(), + err: r_ns.err.clone(), + }); + } + let namespace_root = r_ns.name.clone(); + let r = parse_dotted_ident_rest( + r_ns.tokens.clone(), + namespace_root.clone(), + r_ns.span.clone(), + ); + let name = r.name.clone(); + let svc_name_span = r.span.clone(); + let named_dummy = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(svc_name_span.clone()), + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + let r = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectLBrace)); + if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let tokens = skip_newlines(r.tokens.clone()); -let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); -if has_err(r2.err.clone()) { + item: named_dummy.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let tokens = skip_newlines(r.tokens.clone()); + let r = parse_service_body(&tokens, ctx.clone()); + if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), -}) - } -let ns_prop = make_field_init_node(&"namespace_root".to_string(), make_expr_node(Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitStr { - value: namespace_root.clone(), -}), -}), Rc::new(vec![]), None, start_span.clone()), start_span.clone(), no_span()); -let svc_props = match r.config.clone() { - Some(cfg) => service_config_properties(cfg.endpoint.clone(), cfg.auth.clone(), cfg.auth_input.clone(), cfg.auth_source.clone(), cfg.rate_limit.clone(), cfg.retry.clone()), - None => Rc::new(vec![]), -}; -let item = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(svc_name_span.clone()), - children: r.operations.clone(), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: Some(r.transport.clone()), - properties: v2_rt::concat(Rc::new(vec![ns_prop]), svc_props), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -Rc::new(ItemResult { - item: item, - tokens: skip_newlines(r2.tokens.clone()), - ctx: r.ctx.clone(), - err: None, -}) -} -} - -pub fn parse_service_body(tokens: &Rc>>, ctx: Rc) -> Rc { - parse_service_entries(tokens.clone(), ctx, None, local_transport_node(token_span(tokens.clone().first().cloned())), Rc::new(vec![])) + item: named_dummy.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let tokens = skip_newlines(r.tokens.clone()); + let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); + if has_err(r2.err.clone()) { + return Rc::new(ItemResult { + item: named_dummy.clone(), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), + }); + } + let ns_prop = make_field_init_node( + &"namespace_root".to_string(), + make_expr_node( + Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitStr { + value: namespace_root.clone(), + }), + }), + Rc::new(vec![]), + None, + start_span.clone(), + ), + start_span.clone(), + no_span(), + ); + let svc_props = match r.config.clone() { + Some(cfg) => service_config_properties( + cfg.endpoint.clone(), + cfg.auth.clone(), + cfg.auth_input.clone(), + cfg.auth_source.clone(), + cfg.rate_limit.clone(), + cfg.retry.clone(), + ), + None => Rc::new(vec![]), + }; + let item = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(svc_name_span.clone()), + children: r.operations.clone(), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: Some(r.transport.clone()), + properties: v2_rt::concat(Rc::new(vec![ns_prop]), svc_props), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + Rc::new(ItemResult { + item: item, + tokens: skip_newlines(r2.tokens.clone()), + ctx: r.ctx.clone(), + err: None, + }) + } } -pub fn parse_service_entries(mut tokens: Rc>>, mut ctx: Rc, mut config: Option>, mut transport: Rc, mut operations: Rc>>) -> Rc { +pub fn parse_service_body( + tokens: &Rc>>, + ctx: Rc, +) -> Rc { + parse_service_entries( + tokens.clone(), + ctx, + None, + local_transport_node(token_span(tokens.clone().first().cloned())), + Rc::new(vec![]), + ) +} + +pub fn parse_service_entries( + mut tokens: Rc>>, + mut ctx: Rc, + mut config: Option>, + mut transport: Rc, + mut operations: Rc>>, +) -> Rc { loop { tokens = skip_newlines(tokens.clone()); -let tok = tokens.clone().first().cloned(); -if (tok_is_rbrace(tok.clone()) || tok_is_eof(tok.clone())) { + let tok = tokens.clone().first().cloned(); + if (tok_is_rbrace(tok.clone()) || tok_is_eof(tok.clone())) { break Rc::new(ServiceBodyResult { - config: config.clone(), - transport: transport.clone(), - operations: operations.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}); -} else { + config: config.clone(), + transport: transport.clone(), + operations: operations.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }); + } else { let sh = match tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, -}; -let span = token_span(tok.clone()); -match sh { - Some(TokenShape::ShIdent) => { let id = tok.clone().unwrap().text.clone(); -if (id.clone().as_str() == "config".to_string().as_str()) { - let r = expect(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), &Rc::new(ExpectedToken::ExpectLBrace)); -if has_err(r.err.clone()) { - return Rc::new(ServiceBodyResult { - config: config.clone(), - transport: transport.clone(), - operations: operations.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let r2 = parse_service_config_block(skip_newlines(r.tokens.clone()), ctx.clone()); -if has_err(r2.err.clone()) { - return Rc::new(ServiceBodyResult { - config: config.clone(), - transport: transport.clone(), - operations: operations.clone(), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), -}) - } -tokens = skip_newlines(r2.tokens.clone()); -let r3 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); -if has_err(r3.err.clone()) { - return Rc::new(ServiceBodyResult { - config: config.clone(), - transport: transport.clone(), - operations: operations.clone(), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: r3.err.clone(), -}) - } -{ - let __tco_0 = r3.tokens.clone(); -let __tco_1 = r2.ctx.clone(); -let __tco_2 = Some(r2.config.clone()); -tokens = __tco_0; -ctx = __tco_1; -config = __tco_2; -continue; -} -} else { - if (id.clone().as_str() == "transport".to_string().as_str()) { - let r = parse_transport_binding(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), &ctx); -if has_err(r.err.clone()) { - return Rc::new(ServiceBodyResult { - config: config.clone(), - transport: transport.clone(), - operations: operations.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) + Some(t) => Some(t.shape.clone()), + None => None, + }; + let span = token_span(tok.clone()); + match sh { + Some(TokenShape::ShIdent) => { + let id = tok.clone().unwrap().text.clone(); + if (id.clone().as_str() == "config".to_string().as_str()) { + let r = expect( + &Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + &Rc::new(ExpectedToken::ExpectLBrace), + ); + if has_err(r.err.clone()) { + return Rc::new(ServiceBodyResult { + config: config.clone(), + transport: transport.clone(), + operations: operations.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let r2 = parse_service_config_block( + skip_newlines(r.tokens.clone()), + ctx.clone(), + ); + if has_err(r2.err.clone()) { + return Rc::new(ServiceBodyResult { + config: config.clone(), + transport: transport.clone(), + operations: operations.clone(), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), + }); + } + tokens = skip_newlines(r2.tokens.clone()); + let r3 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); + if has_err(r3.err.clone()) { + return Rc::new(ServiceBodyResult { + config: config.clone(), + transport: transport.clone(), + operations: operations.clone(), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: r3.err.clone(), + }); + } + { + let __tco_0 = r3.tokens.clone(); + let __tco_1 = r2.ctx.clone(); + let __tco_2 = Some(r2.config.clone()); + tokens = __tco_0; + ctx = __tco_1; + config = __tco_2; + continue; + } + } else { + if (id.clone().as_str() == "transport".to_string().as_str()) { + let r = parse_transport_binding( + &Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + &ctx, + ); + if has_err(r.err.clone()) { + return Rc::new(ServiceBodyResult { + config: config.clone(), + transport: transport.clone(), + operations: operations.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + { + let __tco_0 = r.tokens.clone(); + let __tco_1 = r.ctx.clone(); + let __tco_2 = r.transport.clone(); + tokens = __tco_0; + ctx = __tco_1; + transport = __tco_2; + continue; + } + } else { + break Rc::new(ServiceBodyResult { + config: config.clone(), + transport: transport.clone(), + operations: operations.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: Some(parse_error( + "expected config, transport, or operation in service block" + .to_string(), + span, + )), + }); + } } -{ - let __tco_0 = r.tokens.clone(); -let __tco_1 = r.ctx.clone(); -let __tco_2 = r.transport.clone(); -tokens = __tco_0; -ctx = __tco_1; -transport = __tco_2; -continue; -} -} else { + } + Some(TokenShape::ShKeyword) => { + let kw_text = tok.clone().unwrap().text.clone(); + if (kw_text.as_str() == "operation".to_string().as_str()) { + let r = parse_operation_def(&tokens, &ctx); + if has_err(r.err.clone()) { + return Rc::new(ServiceBodyResult { + config: config.clone(), + transport: transport.clone(), + operations: operations.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + { + let __tco_0 = r.tokens.clone(); + let __tco_1 = r.ctx.clone(); + let __tco_2 = v2_rt::rc_list_push(operations, r.operation.clone()); + tokens = __tco_0; + ctx = __tco_1; + operations = __tco_2; + continue; + } + } else { + break Rc::new(ServiceBodyResult { + config: config.clone(), + transport: transport.clone(), + operations: operations.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: Some(parse_error( + "expected config, transport, or operation in service block" + .to_string(), + span, + )), + }); + } + } + _ => { break Rc::new(ServiceBodyResult { - config: config.clone(), - transport: transport.clone(), - operations: operations.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: Some(parse_error("expected config, transport, or operation in service block".to_string(), span)), -}); -} -} }, - Some(TokenShape::ShKeyword) => { let kw_text = tok.clone().unwrap().text.clone(); -if (kw_text.as_str() == "operation".to_string().as_str()) { - let r = parse_operation_def(&tokens, &ctx); -if has_err(r.err.clone()) { - return Rc::new(ServiceBodyResult { - config: config.clone(), - transport: transport.clone(), - operations: operations.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -{ - let __tco_0 = r.tokens.clone(); -let __tco_1 = r.ctx.clone(); -let __tco_2 = v2_rt::rc_list_push(operations, r.operation.clone()); -tokens = __tco_0; -ctx = __tco_1; -operations = __tco_2; -continue; -} -} else { - break Rc::new(ServiceBodyResult { - config: config.clone(), - transport: transport.clone(), - operations: operations.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: Some(parse_error("expected config, transport, or operation in service block".to_string(), span)), -}); -} }, - _ => { break Rc::new(ServiceBodyResult { - config: config.clone(), - transport: transport.clone(), - operations: operations.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: Some(parse_error("expected config, transport, or operation in service block".to_string(), span)), -}); }, -} -} -} + config: config.clone(), + transport: transport.clone(), + operations: operations.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: Some(parse_error( + "expected config, transport, or operation in service block".to_string(), + span, + )), + }); + } + } + } + } } -pub fn parse_service_config_block(tokens: Rc>>, ctx: Rc) -> Rc { +pub fn parse_service_config_block( + tokens: Rc>>, + ctx: Rc, +) -> Rc { parse_config_fields(tokens, ctx, None, None, None, None, None, None) } -pub fn parse_config_fields(mut tokens: Rc>>, mut ctx: Rc, mut endpoint: Option>, mut auth: Option>, mut auth_input: Option>, mut auth_source: Option>, mut rate_limit: Option>, mut retry: Option>) -> Rc { +pub fn parse_config_fields( + mut tokens: Rc>>, + mut ctx: Rc, + mut endpoint: Option>, + mut auth: Option>, + mut auth_input: Option>, + mut auth_source: Option>, + mut rate_limit: Option>, + mut retry: Option>, +) -> Rc { loop { tokens = skip_newlines(tokens.clone()); -if (tok_is_rbrace(tokens.clone().first().cloned()) || tok_is_eof(tokens.clone().first().cloned())) { + if (tok_is_rbrace(tokens.clone().first().cloned()) + || tok_is_eof(tokens.clone().first().cloned())) + { let cfg = Rc::new(ServiceConfig { - endpoint: match endpoint { - Some(e) => e.clone(), - None => make_expr_node(Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitStr { - value: "".to_string(), -}), -}), Rc::new(vec![]), None, make_span(0, 0)), -}, - auth: auth, - auth_input: auth_input, - auth_source: auth_source, - rate_limit: rate_limit, - retry: retry, -}); -break Rc::new(ConfigResult { - config: cfg, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}); -} else { + endpoint: match endpoint { + Some(e) => e.clone(), + None => make_expr_node( + Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitStr { + value: "".to_string(), + }), + }), + Rc::new(vec![]), + None, + make_span(0, 0), + ), + }, + auth: auth, + auth_input: auth_input, + auth_source: auth_source, + rate_limit: rate_limit, + retry: retry, + }); + break Rc::new(ConfigResult { + config: cfg, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }); + } else { let dummy_cfg = Rc::new(ServiceConfig { - endpoint: make_expr_node(Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitStr { - value: "".to_string(), -}), -}), Rc::new(vec![]), None, make_span(0, 0)), - auth: None, - auth_input: None, - auth_source: None, - rate_limit: None, - retry: None, -}); -let r = expect_ident(&tokens); -if has_err(r.err.clone()) { + endpoint: make_expr_node( + Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitStr { + value: "".to_string(), + }), + }), + Rc::new(vec![]), + None, + make_span(0, 0), + ), + auth: None, + auth_input: None, + auth_source: None, + rate_limit: None, + retry: None, + }); + let r = expect_ident(&tokens); + if has_err(r.err.clone()) { return Rc::new(ConfigResult { - config: dummy_cfg.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) + config: dummy_cfg.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); } -let fname = r.name.clone(); -let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); -if has_err(r2.err.clone()) { + let fname = r.name.clone(); + let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); + if has_err(r2.err.clone()) { return Rc::new(ConfigResult { - config: dummy_cfg.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), -}) + config: dummy_cfg.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), + }); } -let r3 = parse_expr(r2.tokens.clone(), ctx.clone()); -if has_err(r3.err.clone()) { + let r3 = parse_expr(r2.tokens.clone(), ctx.clone()); + if has_err(r3.err.clone()) { return Rc::new(ConfigResult { - config: dummy_cfg.clone(), - tokens: r3.tokens.clone(), - ctx: r3.ctx.clone(), - err: r3.err.clone(), -}) - } -tokens = r3.tokens.clone(); -ctx = r3.ctx.clone(); -let e = eat(&tokens, Rc::new(ExpectedToken::ExpectComma)); -tokens = match (*e.clone()).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), - EatResult::EatUnchanged { .. } => tokens.clone(), -}; -match fname.as_str() { - "endpoint" => { { - let __tco_0 = Some(r3.expr.clone()); -endpoint = __tco_0; -continue; -} }, - "auth" => { { - let __tco_0 = Some(r3.expr.clone()); -auth = __tco_0; -continue; -} }, - "auth_input" => { { - let __tco_0 = Some(r3.expr.clone()); -auth_input = __tco_0; -continue; -} }, - "auth_source" => { { - let __tco_0 = Some(r3.expr.clone()); -auth_source = __tco_0; -continue; -} }, - "rate_limit" => { { - let __tco_0 = Some(r3.expr.clone()); -rate_limit = __tco_0; -continue; -} }, - "retry" => { { - let __tco_0 = Some(r3.expr.clone()); -retry = __tco_0; -continue; -} }, - _ => { { - continue; -} }, -} -} -} + config: dummy_cfg.clone(), + tokens: r3.tokens.clone(), + ctx: r3.ctx.clone(), + err: r3.err.clone(), + }); + } + tokens = r3.tokens.clone(); + ctx = r3.ctx.clone(); + let e = eat(&tokens, Rc::new(ExpectedToken::ExpectComma)); + tokens = match (*e.clone()).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), + EatResult::EatUnchanged { .. } => tokens.clone(), + }; + match fname.as_str() { + "endpoint" => { + let __tco_0 = Some(r3.expr.clone()); + endpoint = __tco_0; + continue; + } + "auth" => { + let __tco_0 = Some(r3.expr.clone()); + auth = __tco_0; + continue; + } + "auth_input" => { + let __tco_0 = Some(r3.expr.clone()); + auth_input = __tco_0; + continue; + } + "auth_source" => { + let __tco_0 = Some(r3.expr.clone()); + auth_source = __tco_0; + continue; + } + "rate_limit" => { + let __tco_0 = Some(r3.expr.clone()); + rate_limit = __tco_0; + continue; + } + "retry" => { + let __tco_0 = Some(r3.expr.clone()); + retry = __tco_0; + continue; + } + _ => { + continue; + } + } + } + } } -pub fn parse_transport_binding(tokens: &Rc>>, ctx: &Rc) -> Rc { +pub fn parse_transport_binding( + tokens: &Rc>>, + ctx: &Rc, +) -> Rc { { let span = token_span(tokens.clone().first().cloned()); -let dummy = local_transport_node(span); -let tok = tokens.clone().first().cloned(); -let tok_text = match tok.clone() { - Some(t) => t.text.clone(), - None => "".to_string(), -}; -let sh = match tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, -}; -match sh { - Some(TokenShape::ShIdent) => if (tok_text.clone().as_str() == "rest".to_string().as_str()) { - { - let r = expect(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), &Rc::new(ExpectedToken::ExpectLBrace)); -if has_err(r.err.clone()) { - return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let r2 = parse_rest_binding_body(skip_newlines(r.tokens.clone()), ctx.clone()); -if has_err(r2.err.clone()) { - return Rc::new(TransportResult { - transport: r2.transport.clone(), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), -}) - } -let r3 = expect(&skip_newlines(r2.tokens.clone()), &Rc::new(ExpectedToken::ExpectRBrace)); -if has_err(r3.err.clone()) { - return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: r3.err.clone(), -}) - } -Rc::new(TransportResult { - transport: r2.transport.clone(), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: None, -}) -} - } else { - if (tok_text.clone().as_str() == "shell".to_string().as_str()) { - { - let r = expect(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), &Rc::new(ExpectedToken::ExpectLBrace)); -if has_err(r.err.clone()) { - return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let r2 = parse_shell_binding_body(skip_newlines(r.tokens.clone()), ctx.clone()); -if has_err(r2.err.clone()) { - return Rc::new(TransportResult { - transport: r2.transport.clone(), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), -}) - } -let r3 = expect(&skip_newlines(r2.tokens.clone()), &Rc::new(ExpectedToken::ExpectRBrace)); -if has_err(r3.err.clone()) { - return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: r3.err.clone(), -}) - } -Rc::new(TransportResult { - transport: r2.transport.clone(), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: None, -}) -} - } else { - if (tok_text.clone().as_str() == "file".to_string().as_str()) { + let dummy = local_transport_node(span); + let tok = tokens.clone().first().cloned(); + let tok_text = match tok.clone() { + Some(t) => t.text.clone(), + None => "".to_string(), + }; + let sh = match tok.clone() { + Some(t) => Some(t.shape.clone()), + None => None, + }; + match sh { + Some(TokenShape::ShIdent) => { + if (tok_text.clone().as_str() == "rest".to_string().as_str()) { { - let r = expect(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), &Rc::new(ExpectedToken::ExpectLBrace)); -if has_err(r.err.clone()) { + let r = expect( + &Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + &Rc::new(ExpectedToken::ExpectLBrace), + ); + if has_err(r.err.clone()) { return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) + transport: dummy.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); } -let r2 = parse_file_binding_body(skip_newlines(r.tokens.clone()), ctx.clone()); -if has_err(r2.err.clone()) { + let r2 = + parse_rest_binding_body(skip_newlines(r.tokens.clone()), ctx.clone()); + if has_err(r2.err.clone()) { return Rc::new(TransportResult { - transport: r2.transport.clone(), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), -}) + transport: r2.transport.clone(), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), + }); } -let r3 = expect(&skip_newlines(r2.tokens.clone()), &Rc::new(ExpectedToken::ExpectRBrace)); -if has_err(r3.err.clone()) { + let r3 = expect( + &skip_newlines(r2.tokens.clone()), + &Rc::new(ExpectedToken::ExpectRBrace), + ); + if has_err(r3.err.clone()) { return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: r3.err.clone(), -}) + transport: dummy.clone(), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: r3.err.clone(), + }); } -Rc::new(TransportResult { - transport: r2.transport.clone(), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: None, -}) -} + Rc::new(TransportResult { + transport: r2.transport.clone(), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: None, + }) + } } else { - Rc::new(TransportResult { - transport: dummy.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}) + if (tok_text.clone().as_str() == "shell".to_string().as_str()) { + { + let r = expect( + &Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + &Rc::new(ExpectedToken::ExpectLBrace), + ); + if has_err(r.err.clone()) { + return Rc::new(TransportResult { + transport: dummy.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let r2 = parse_shell_binding_body( + skip_newlines(r.tokens.clone()), + ctx.clone(), + ); + if has_err(r2.err.clone()) { + return Rc::new(TransportResult { + transport: r2.transport.clone(), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), + }); + } + let r3 = expect( + &skip_newlines(r2.tokens.clone()), + &Rc::new(ExpectedToken::ExpectRBrace), + ); + if has_err(r3.err.clone()) { + return Rc::new(TransportResult { + transport: dummy.clone(), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: r3.err.clone(), + }); + } + Rc::new(TransportResult { + transport: r2.transport.clone(), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: None, + }) + } + } else { + if (tok_text.clone().as_str() == "file".to_string().as_str()) { + { + let r = expect( + &Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + &Rc::new(ExpectedToken::ExpectLBrace), + ); + if has_err(r.err.clone()) { + return Rc::new(TransportResult { + transport: dummy.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let r2 = parse_file_binding_body( + skip_newlines(r.tokens.clone()), + ctx.clone(), + ); + if has_err(r2.err.clone()) { + return Rc::new(TransportResult { + transport: r2.transport.clone(), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), + }); + } + let r3 = expect( + &skip_newlines(r2.tokens.clone()), + &Rc::new(ExpectedToken::ExpectRBrace), + ); + if has_err(r3.err.clone()) { + return Rc::new(TransportResult { + transport: dummy.clone(), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: r3.err.clone(), + }); + } + Rc::new(TransportResult { + transport: r2.transport.clone(), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: None, + }) + } + } else { + Rc::new(TransportResult { + transport: dummy.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }) + } + } } } - }, - _ => Rc::new(TransportResult { - transport: dummy.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}), -} -} -} - -pub fn parse_rest_binding_body(tokens: Rc>>, ctx: Rc) -> Rc { - parse_rest_fields(tokens, ctx, None, None, None, None, None, None, Rc::new(vec![])) + _ => Rc::new(TransportResult { + transport: dummy.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }), + } + } } -pub fn parse_rest_fields(mut tokens: Rc>>, mut ctx: Rc, mut base_url: Option>, mut method: Option>, mut path_template: Option>, mut query: Option>, mut request_body: Option>, mut response_format: Option>, mut headers: Rc>>) -> Rc { +pub fn parse_rest_binding_body( + tokens: Rc>>, + ctx: Rc, +) -> Rc { + parse_rest_fields( + tokens, + ctx, + None, + None, + None, + None, + None, + None, + Rc::new(vec![]), + ) +} + +pub fn parse_rest_fields( + mut tokens: Rc>>, + mut ctx: Rc, + mut base_url: Option>, + mut method: Option>, + mut path_template: Option>, + mut query: Option>, + mut request_body: Option>, + mut response_format: Option>, + mut headers: Rc>>, +) -> Rc { loop { tokens = skip_newlines(tokens.clone()); -let span = token_span(tokens.clone().first().cloned()); -let dummy = local_transport_node(span.clone()); -if (tok_is_rbrace(tokens.clone().first().cloned()) || tok_is_eof(tokens.clone().first().cloned())) { + let span = token_span(tokens.clone().first().cloned()); + let dummy = local_transport_node(span.clone()); + if (tok_is_rbrace(tokens.clone().first().cloned()) + || tok_is_eof(tokens.clone().first().cloned())) + { let bu = match base_url { - Some(e) => e.clone(), - None => make_expr_node(Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitStr { - value: "".to_string(), -}), -}), Rc::new(vec![]), None, make_span(0, 0)), -}; -break Rc::new(TransportResult { - transport: rest_transport_node(bu, Rc::new(vec![]), headers, method, path_template, query, request_body, response_format, span.clone()), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}); -} else { + Some(e) => e.clone(), + None => make_expr_node( + Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitStr { + value: "".to_string(), + }), + }), + Rc::new(vec![]), + None, + make_span(0, 0), + ), + }; + break Rc::new(TransportResult { + transport: rest_transport_node( + bu, + Rc::new(vec![]), + headers, + method, + path_template, + query, + request_body, + response_format, + span.clone(), + ), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }); + } else { let r = expect_ident(&tokens); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) + transport: dummy.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); } -let fname = r.name.clone(); -let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); -if has_err(r2.err.clone()) { + let fname = r.name.clone(); + let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); + if has_err(r2.err.clone()) { return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), -}) + transport: dummy.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), + }); } -let r3 = parse_expr(r2.tokens.clone(), ctx.clone()); -if has_err(r3.err.clone()) { + let r3 = parse_expr(r2.tokens.clone(), ctx.clone()); + if has_err(r3.err.clone()) { return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r3.tokens.clone(), - ctx: r3.ctx.clone(), - err: r3.err.clone(), -}) - } -let e = eat(&r3.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); -tokens = match (*e.clone()).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), - EatResult::EatUnchanged { .. } => r3.tokens.clone(), -}; -ctx = r3.ctx.clone(); -if (fname.clone().as_str() == transport_url_key().as_str()) { + transport: dummy.clone(), + tokens: r3.tokens.clone(), + ctx: r3.ctx.clone(), + err: r3.err.clone(), + }); + } + let e = eat(&r3.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); + tokens = match (*e.clone()).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), + EatResult::EatUnchanged { .. } => r3.tokens.clone(), + }; + ctx = r3.ctx.clone(); + if (fname.clone().as_str() == transport_url_key().as_str()) { { let __tco_0 = Some(r3.expr.clone()); -base_url = __tco_0; -continue; -} -} else { + base_url = __tco_0; + continue; + } + } else { if (fname.clone().as_str() == transport_method_key().as_str()) { { let __tco_0 = Some(r3.expr.clone()); -method = __tco_0; -continue; -} -} else { + method = __tco_0; + continue; + } + } else { if (fname.clone().as_str() == transport_path_template_key().as_str()) { { let __tco_0 = Some(r3.expr.clone()); -path_template = __tco_0; -continue; -} -} else { + path_template = __tco_0; + continue; + } + } else { if (fname.clone().as_str() == transport_query_key().as_str()) { { let __tco_0 = Some(r3.expr.clone()); -query = __tco_0; -continue; -} -} else { + query = __tco_0; + continue; + } + } else { if (fname.clone().as_str() == transport_body_key().as_str()) { { let __tco_0 = Some(r3.expr.clone()); -request_body = __tco_0; -continue; -} -} else { - if (fname.clone().as_str() == transport_response_format_key().as_str()) { + request_body = __tco_0; + continue; + } + } else { + if (fname.clone().as_str() + == transport_response_format_key().as_str()) + { { let __tco_0 = Some(r3.expr.clone()); -response_format = __tco_0; -continue; -} -} else { - if (fname.clone().as_str() == transport_headers_key().as_str()) { + response_format = __tco_0; + continue; + } + } else { + if (fname.clone().as_str() == transport_headers_key().as_str()) + { let h = match (*r3.expr.clone().expr_data.clone()).clone() { ExprData::ExprRecordLit { .. } => r3.expr.clone().children.clone(), _ => return Rc::new(TransportResult { @@ -5624,812 +6722,1048 @@ continue; }), "".to_string())), }), }; -{ + { let __tco_0 = h; -headers = __tco_0; -continue; -} -} else { + headers = __tco_0; + continue; + } + } else { { continue; -} -} -} -} -} -} -} -} -} -} + } + } + } + } + } + } + } + } + } + } } -pub fn parse_shell_binding_body(tokens: Rc>>, ctx: Rc) -> Rc { +pub fn parse_shell_binding_body( + tokens: Rc>>, + ctx: Rc, +) -> Rc { parse_shell_fields(tokens, ctx, Rc::new(vec![]), None) } -pub fn parse_shell_fields(mut tokens: Rc>>, mut ctx: Rc, mut argv: Rc>>, mut stdin: Option>) -> Rc { +pub fn parse_shell_fields( + mut tokens: Rc>>, + mut ctx: Rc, + mut argv: Rc>>, + mut stdin: Option>, +) -> Rc { loop { tokens = skip_newlines(tokens.clone()); -let span = token_span(tokens.clone().first().cloned()); -let dummy = local_transport_node(span.clone()); -if (tok_is_rbrace(tokens.clone().first().cloned()) || tok_is_eof(tokens.clone().first().cloned())) { + let span = token_span(tokens.clone().first().cloned()); + let dummy = local_transport_node(span.clone()); + if (tok_is_rbrace(tokens.clone().first().cloned()) + || tok_is_eof(tokens.clone().first().cloned())) + { break Rc::new(TransportResult { - transport: shell_transport_node(argv, Rc::new(vec![]), stdin, &span), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}); -} else { + transport: shell_transport_node(argv, Rc::new(vec![]), stdin, &span), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }); + } else { let r = expect_ident(&tokens); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) + transport: dummy.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); } -let fname = r.name.clone(); -let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); -if has_err(r2.err.clone()) { + let fname = r.name.clone(); + let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); + if has_err(r2.err.clone()) { return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), -}) + transport: dummy.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), + }); } -if (fname.clone().as_str() == "argv".to_string().as_str()) { + if (fname.clone().as_str() == "argv".to_string().as_str()) { let r3 = expect(&r2.tokens.clone(), &Rc::new(ExpectedToken::ExpectLBracket)); -if has_err(r3.err.clone()) { + if has_err(r3.err.clone()) { return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r3.tokens.clone(), - ctx: ctx.clone(), - err: r3.err.clone(), -}) + transport: dummy.clone(), + tokens: r3.tokens.clone(), + ctx: ctx.clone(), + err: r3.err.clone(), + }); } -let r4 = parse_expr_list_until(r3.tokens.clone(), ctx.clone(), Rc::new(ExpectedToken::ExpectRBracket)); -if has_err(r4.err.clone()) { + let r4 = parse_expr_list_until( + r3.tokens.clone(), + ctx.clone(), + Rc::new(ExpectedToken::ExpectRBracket), + ); + if has_err(r4.err.clone()) { return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r4.tokens.clone(), - ctx: r4.ctx.clone(), - err: r4.err.clone(), -}) + transport: dummy.clone(), + tokens: r4.tokens.clone(), + ctx: r4.ctx.clone(), + err: r4.err.clone(), + }); } -let r5 = expect(&r4.tokens.clone(), &Rc::new(ExpectedToken::ExpectRBracket)); -if has_err(r5.err.clone()) { + let r5 = expect(&r4.tokens.clone(), &Rc::new(ExpectedToken::ExpectRBracket)); + if has_err(r5.err.clone()) { return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r5.tokens.clone(), - ctx: r4.ctx.clone(), - err: r5.err.clone(), -}) - } -let e = eat(&r5.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); -tokens = match (*e).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), - EatResult::EatUnchanged { .. } => r5.tokens.clone(), -}; -{ + transport: dummy.clone(), + tokens: r5.tokens.clone(), + ctx: r4.ctx.clone(), + err: r5.err.clone(), + }); + } + let e = eat(&r5.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); + tokens = match (*e).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), + EatResult::EatUnchanged { .. } => r5.tokens.clone(), + }; + { let __tco_0 = r4.ctx.clone(); -let __tco_1 = r4.exprs.clone(); -ctx = __tco_0; -argv = __tco_1; -continue; -} -} else { + let __tco_1 = r4.exprs.clone(); + ctx = __tco_0; + argv = __tco_1; + continue; + } + } else { if (fname.clone().as_str() == transport_stdin_key().as_str()) { let r3 = parse_expr(r2.tokens.clone(), ctx.clone()); -if has_err(r3.err.clone()) { + if has_err(r3.err.clone()) { return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r3.tokens.clone(), - ctx: r3.ctx.clone(), - err: r3.err.clone(), -}) + transport: dummy.clone(), + tokens: r3.tokens.clone(), + ctx: r3.ctx.clone(), + err: r3.err.clone(), + }); } -let e = eat(&r3.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); -tokens = match (*e).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), - EatResult::EatUnchanged { .. } => r3.tokens.clone(), -}; -{ + let e = eat(&r3.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); + tokens = match (*e).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), + EatResult::EatUnchanged { .. } => r3.tokens.clone(), + }; + { let __tco_0 = r3.ctx.clone(); -let __tco_1 = Some(r3.expr.clone()); -ctx = __tco_0; -stdin = __tco_1; -continue; -} -} else { + let __tco_1 = Some(r3.expr.clone()); + ctx = __tco_0; + stdin = __tco_1; + continue; + } + } else { let r3 = parse_expr(r2.tokens.clone(), ctx.clone()); -if has_err(r3.err.clone()) { + if has_err(r3.err.clone()) { return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r3.tokens.clone(), - ctx: r3.ctx.clone(), - err: r3.err.clone(), -}) + transport: dummy.clone(), + tokens: r3.tokens.clone(), + ctx: r3.ctx.clone(), + err: r3.err.clone(), + }); } -let e = eat(&r3.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); -tokens = match (*e).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), - EatResult::EatUnchanged { .. } => r3.tokens.clone(), -}; -{ + let e = eat(&r3.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); + tokens = match (*e).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), + EatResult::EatUnchanged { .. } => r3.tokens.clone(), + }; + { let __tco_0 = r3.ctx.clone(); -ctx = __tco_0; -continue; -} -} -} -} -} + ctx = __tco_0; + continue; + } + } + } + } + } } -pub fn parse_file_binding_body(tokens: Rc>>, ctx: Rc) -> Rc { +pub fn parse_file_binding_body( + tokens: Rc>>, + ctx: Rc, +) -> Rc { parse_file_fields(tokens, ctx, None) } -pub fn parse_file_fields(mut tokens: Rc>>, mut ctx: Rc, mut base_path: Option>) -> Rc { +pub fn parse_file_fields( + mut tokens: Rc>>, + mut ctx: Rc, + mut base_path: Option>, +) -> Rc { loop { tokens = skip_newlines(tokens.clone()); -let span = token_span(tokens.clone().first().cloned()); -let dummy = local_transport_node(span.clone()); -if (tok_is_rbrace(tokens.clone().first().cloned()) || tok_is_eof(tokens.clone().first().cloned())) { + let span = token_span(tokens.clone().first().cloned()); + let dummy = local_transport_node(span.clone()); + if (tok_is_rbrace(tokens.clone().first().cloned()) + || tok_is_eof(tokens.clone().first().cloned())) + { let bp = match base_path { - Some(e) => e.clone(), - None => make_expr_node(Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitStr { - value: "".to_string(), -}), -}), Rc::new(vec![]), None, make_span(0, 0)), -}; -break Rc::new(TransportResult { - transport: file_transport_node(bp, span.clone()), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}); -} else { + Some(e) => e.clone(), + None => make_expr_node( + Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitStr { + value: "".to_string(), + }), + }), + Rc::new(vec![]), + None, + make_span(0, 0), + ), + }; + break Rc::new(TransportResult { + transport: file_transport_node(bp, span.clone()), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }); + } else { let r = expect_ident(&tokens); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) + transport: dummy.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); } -let fname = r.name.clone(); -let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); -if has_err(r2.err.clone()) { + let fname = r.name.clone(); + let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); + if has_err(r2.err.clone()) { return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), -}) + transport: dummy.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), + }); } -let r3 = parse_expr(r2.tokens.clone(), ctx.clone()); -if has_err(r3.err.clone()) { + let r3 = parse_expr(r2.tokens.clone(), ctx.clone()); + if has_err(r3.err.clone()) { return Rc::new(TransportResult { - transport: dummy.clone(), - tokens: r3.tokens.clone(), - ctx: r3.ctx.clone(), - err: r3.err.clone(), -}) - } -let e = eat(&r3.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); -tokens = match (*e.clone()).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), - EatResult::EatUnchanged { .. } => r3.tokens.clone(), -}; -if ((fname.clone().as_str() == "path".to_string().as_str()) || (fname.clone().as_str() == transport_path_key().as_str())) { + transport: dummy.clone(), + tokens: r3.tokens.clone(), + ctx: r3.ctx.clone(), + err: r3.err.clone(), + }); + } + let e = eat(&r3.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); + tokens = match (*e.clone()).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), + EatResult::EatUnchanged { .. } => r3.tokens.clone(), + }; + if ((fname.clone().as_str() == "path".to_string().as_str()) + || (fname.clone().as_str() == transport_path_key().as_str())) + { { let __tco_0 = r3.ctx.clone(); -let __tco_1 = Some(r3.expr.clone()); -ctx = __tco_0; -base_path = __tco_1; -continue; -} -} else { + let __tco_1 = Some(r3.expr.clone()); + ctx = __tco_0; + base_path = __tco_1; + continue; + } + } else { { let __tco_0 = r3.ctx.clone(); -ctx = __tco_0; -continue; -} -} -} -} + ctx = __tco_0; + continue; + } + } + } + } } pub fn parse_operation_def(tokens: &Rc>>, ctx: &Rc) -> Rc { { let start_span = token_span(tokens.clone().first().cloned()); -let dummy_op = make_operation_node("".to_string(), None, Rc::new(vec![]), Rc::new(vec![]), Rc::new(vec![]), Rc::new(vec![]), Rc::new(vec![]), Rc::new(vec![]), None, &start_span, &ctx.source_indices.clone()); -let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { - text: "operation".to_string(), -})); -if has_err(r.err.clone()) { + let dummy_op = make_operation_node( + "".to_string(), + None, + Rc::new(vec![]), + Rc::new(vec![]), + Rc::new(vec![]), + Rc::new(vec![]), + Rc::new(vec![]), + Rc::new(vec![]), + None, + &start_span, + &ctx.source_indices.clone(), + ); + let r = expect( + &tokens, + &Rc::new(ExpectedToken::ExpectKeyword { + text: "operation".to_string(), + }), + ); + if has_err(r.err.clone()) { return Rc::new(OpResult { - operation: dummy_op.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let r = expect_ident(&r.tokens.clone()); -if has_err(r.err.clone()) { + operation: dummy_op.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let r = expect_ident(&r.tokens.clone()); + if has_err(r.err.clone()) { return Rc::new(OpResult { - operation: dummy_op.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let name = r.name.clone(); -let name_span = r.span.clone(); -let tokens = skip_newlines(r.tokens.clone()); -if tok_is_lbrace(tokens.clone().first().cloned()) { + operation: dummy_op.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let name = r.name.clone(); + let name_span = r.span.clone(); + let tokens = skip_newlines(r.tokens.clone()); + if tok_is_lbrace(tokens.clone().first().cloned()) { parse_operation_v1_body(&tokens, &ctx, name, name_span, &start_span) } else { parse_operation_v2_inline(&tokens, &ctx, name, name_span, &start_span) } -} + } } -pub fn parse_operation_v2_inline(tokens: &Rc>>, ctx: &Rc, name: String, name_span: Rc, start_span: &Rc) -> Rc { +pub fn parse_operation_v2_inline( + tokens: &Rc>>, + ctx: &Rc, + name: String, + name_span: Rc, + start_span: &Rc, +) -> Rc { { - let dummy_op = make_operation_node("".to_string(), None, Rc::new(vec![]), Rc::new(vec![]), Rc::new(vec![]), Rc::new(vec![]), Rc::new(vec![]), Rc::new(vec![]), None, &start_span, &ctx.source_indices.clone()); -let mods_r = parse_operation_modifiers(tokens.clone(), ctx.clone()); -let modifiers = mods_r.modifiers.clone(); -let mod_props = modifiers_to_props(modifiers, start_span.clone()); -let tokens = mods_r.tokens.clone(); -let ctx = mods_r.ctx.clone(); -let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectLParen)); -if has_err(r.err.clone()) { + let dummy_op = make_operation_node( + "".to_string(), + None, + Rc::new(vec![]), + Rc::new(vec![]), + Rc::new(vec![]), + Rc::new(vec![]), + Rc::new(vec![]), + Rc::new(vec![]), + None, + &start_span, + &ctx.source_indices.clone(), + ); + let mods_r = parse_operation_modifiers(tokens.clone(), ctx.clone()); + let modifiers = mods_r.modifiers.clone(); + let mod_props = modifiers_to_props(modifiers, start_span.clone()); + let tokens = mods_r.tokens.clone(); + let ctx = mods_r.ctx.clone(); + let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectLParen)); + if has_err(r.err.clone()) { return Rc::new(OpResult { - operation: dummy_op.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let r = parse_field_list(skip_newlines(r.tokens.clone()), ctx.clone()); -if has_err(r.err.clone()) { + operation: dummy_op.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let r = parse_field_list(skip_newlines(r.tokens.clone()), ctx.clone()); + if has_err(r.err.clone()) { return Rc::new(OpResult { - operation: dummy_op.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let inputs = r.fields.clone(); -let r = expect(&skip_newlines(r.tokens.clone()), &Rc::new(ExpectedToken::ExpectRParen)); -if has_err(r.err.clone()) { + operation: dummy_op.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let inputs = r.fields.clone(); + let r = expect( + &skip_newlines(r.tokens.clone()), + &Rc::new(ExpectedToken::ExpectRParen), + ); + if has_err(r.err.clone()) { return Rc::new(OpResult { - operation: dummy_op.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let tokens = r.tokens.clone(); -let ret = parse_optional_inferred(&tokens, ctx.clone()); -if has_err(ret.err.clone()) { + operation: dummy_op.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let tokens = r.tokens.clone(); + let ret = parse_optional_inferred(&tokens, ctx.clone()); + if has_err(ret.err.clone()) { return Rc::new(OpResult { - operation: dummy_op.clone(), - tokens: ret.tokens.clone(), - ctx: ret.ctx.clone(), - err: ret.err.clone(), -}) - } -let tokens = ret.tokens.clone(); -let ctx = ret.ctx.clone(); -let outputs = match ret.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => node_inferred_to_outputs(&rt, ctx.source_indices.clone()), - _ => Rc::new(vec![]), -}; -let tokens = skip_newlines(tokens.clone()); -let resp_r = parse_optional_response_block(&tokens, &ctx); -if has_err(resp_r.err.clone()) { + operation: dummy_op.clone(), + tokens: ret.tokens.clone(), + ctx: ret.ctx.clone(), + err: ret.err.clone(), + }); + } + let tokens = ret.tokens.clone(); + let ctx = ret.ctx.clone(); + let outputs = match ret.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => { + node_inferred_to_outputs(&rt, ctx.source_indices.clone()) + } + _ => Rc::new(vec![]), + }; + let tokens = skip_newlines(tokens.clone()); + let resp_r = parse_optional_response_block(&tokens, &ctx); + if has_err(resp_r.err.clone()) { return Rc::new(OpResult { - operation: dummy_op.clone(), - tokens: resp_r.tokens.clone(), - ctx: resp_r.ctx.clone(), - err: resp_r.err.clone(), -}) - } -let tokens = skip_newlines(resp_r.tokens.clone()); -let ctx = resp_r.ctx.clone(); -let mock_r = parse_optional_mock_response_block(&tokens, &ctx); -if has_err(mock_r.err.clone()) { + operation: dummy_op.clone(), + tokens: resp_r.tokens.clone(), + ctx: resp_r.ctx.clone(), + err: resp_r.err.clone(), + }); + } + let tokens = skip_newlines(resp_r.tokens.clone()); + let ctx = resp_r.ctx.clone(); + let mock_r = parse_optional_mock_response_block(&tokens, &ctx); + if has_err(mock_r.err.clone()) { return Rc::new(OpResult { - operation: dummy_op.clone(), - tokens: mock_r.tokens.clone(), - ctx: mock_r.ctx.clone(), - err: mock_r.err.clone(), -}) - } -let tokens = skip_newlines(mock_r.tokens.clone()); -let ctx = mock_r.ctx.clone(); -let op = make_operation_node(name, Some(name_span), inputs, outputs, resp_r.responses.clone(), mock_r.mocks.clone(), Rc::new(vec![]), mod_props, None, &start_span, &ctx.source_indices.clone()); -Rc::new(OpResult { - operation: op, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}) -} + operation: dummy_op.clone(), + tokens: mock_r.tokens.clone(), + ctx: mock_r.ctx.clone(), + err: mock_r.err.clone(), + }); + } + let tokens = skip_newlines(mock_r.tokens.clone()); + let ctx = mock_r.ctx.clone(); + let op = make_operation_node( + name, + Some(name_span), + inputs, + outputs, + resp_r.responses.clone(), + mock_r.mocks.clone(), + Rc::new(vec![]), + mod_props, + None, + &start_span, + &ctx.source_indices.clone(), + ); + Rc::new(OpResult { + operation: op, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }) + } } -pub fn parse_operation_v1_body(tokens: &Rc>>, ctx: &Rc, name: String, name_span: Rc, start_span: &Rc) -> Rc { +pub fn parse_operation_v1_body( + tokens: &Rc>>, + ctx: &Rc, + name: String, + name_span: Rc, + start_span: &Rc, +) -> Rc { { - let dummy_op = make_operation_node("".to_string(), None, Rc::new(vec![]), Rc::new(vec![]), Rc::new(vec![]), Rc::new(vec![]), Rc::new(vec![]), Rc::new(vec![]), None, &start_span, &ctx.source_indices.clone()); -let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectLBrace)); -if has_err(r.err.clone()) { + let dummy_op = make_operation_node( + "".to_string(), + None, + Rc::new(vec![]), + Rc::new(vec![]), + Rc::new(vec![]), + Rc::new(vec![]), + Rc::new(vec![]), + Rc::new(vec![]), + None, + &start_span, + &ctx.source_indices.clone(), + ); + let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectLBrace)); + if has_err(r.err.clone()) { return Rc::new(OpResult { - operation: dummy_op.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let tokens = skip_newlines(r.tokens.clone()); -let r2 = parse_op_body_entries(tokens.clone(), ctx.clone(), Rc::new(vec![]), Rc::new(vec![]), Rc::new(vec![]), None, Rc::new(vec![]), Rc::new(vec![]), Rc::new(vec![])); -if has_err(r2.err.clone()) { + operation: dummy_op.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let tokens = skip_newlines(r.tokens.clone()); + let r2 = parse_op_body_entries( + tokens.clone(), + ctx.clone(), + Rc::new(vec![]), + Rc::new(vec![]), + Rc::new(vec![]), + None, + Rc::new(vec![]), + Rc::new(vec![]), + Rc::new(vec![]), + ); + if has_err(r2.err.clone()) { return Rc::new(OpResult { - operation: dummy_op.clone(), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), -}) - } -let r3 = expect(&skip_newlines(r2.tokens.clone()), &Rc::new(ExpectedToken::ExpectRBrace)); -if has_err(r3.err.clone()) { + operation: dummy_op.clone(), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), + }); + } + let r3 = expect( + &skip_newlines(r2.tokens.clone()), + &Rc::new(ExpectedToken::ExpectRBrace), + ); + if has_err(r3.err.clone()) { return Rc::new(OpResult { - operation: dummy_op.clone(), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: r3.err.clone(), -}) - } -let op = make_operation_node(name, Some(name_span), r2.inputs.clone(), r2.outputs.clone(), r2.response_props.clone(), r2.mock_props.clone(), r2.exit_props.clone(), r2.modifier_props.clone(), r2.transport.clone(), &start_span, &ctx.source_indices.clone()); -Rc::new(OpResult { - operation: op, - tokens: skip_newlines(r3.tokens.clone()), - ctx: r2.ctx.clone(), - err: None, -}) -} + operation: dummy_op.clone(), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: r3.err.clone(), + }); + } + let op = make_operation_node( + name, + Some(name_span), + r2.inputs.clone(), + r2.outputs.clone(), + r2.response_props.clone(), + r2.mock_props.clone(), + r2.exit_props.clone(), + r2.modifier_props.clone(), + r2.transport.clone(), + &start_span, + &ctx.source_indices.clone(), + ); + Rc::new(OpResult { + operation: op, + tokens: skip_newlines(r3.tokens.clone()), + ctx: r2.ctx.clone(), + err: None, + }) + } } -pub fn parse_op_body_entries(mut tokens: Rc>>, mut ctx: Rc, mut inputs: Rc>>, mut outputs: Rc>>, mut modifier_props: Rc>>, mut transport: Option>, mut exit_props: Rc>>, mut response_props: Rc>>, mut mock_props: Rc>>) -> Rc { +pub fn parse_op_body_entries( + mut tokens: Rc>>, + mut ctx: Rc, + mut inputs: Rc>>, + mut outputs: Rc>>, + mut modifier_props: Rc>>, + mut transport: Option>, + mut exit_props: Rc>>, + mut response_props: Rc>>, + mut mock_props: Rc>>, +) -> Rc { loop { tokens = skip_newlines(tokens.clone()); -let tok = tokens.clone().first().cloned(); -let span = token_span(tok.clone()); -let mk_result = Rc::new(OpBodyResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - modifier_props: modifier_props.clone(), - transport: transport.clone(), - exit_props: exit_props.clone(), - response_props: response_props.clone(), - mock_props: mock_props.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}); -if (tok_is_rbrace(tok.clone()) || tok_is_eof(tok.clone())) { + let tok = tokens.clone().first().cloned(); + let span = token_span(tok.clone()); + let mk_result = Rc::new(OpBodyResult { + inputs: inputs.clone(), + outputs: outputs.clone(), + modifier_props: modifier_props.clone(), + transport: transport.clone(), + exit_props: exit_props.clone(), + response_props: response_props.clone(), + mock_props: mock_props.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }); + if (tok_is_rbrace(tok.clone()) || tok_is_eof(tok.clone())) { break mk_result; -} else { + } else { let sh = match tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, -}; -match sh { - Some(TokenShape::ShKeyword) => { let kw_text = tok.clone().unwrap().text.clone(); -if (kw_text.clone().as_str() == "input".to_string().as_str()) { - let r = expect(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), &Rc::new(ExpectedToken::ExpectLBrace)); -if has_err(r.err.clone()) { - return Rc::new(OpBodyResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - modifier_props: modifier_props.clone(), - transport: transport.clone(), - exit_props: exit_props.clone(), - response_props: response_props.clone(), - mock_props: mock_props.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let r2 = parse_field_list(skip_newlines(r.tokens.clone()), ctx.clone()); -if has_err(r2.err.clone()) { - return Rc::new(OpBodyResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - modifier_props: modifier_props.clone(), - transport: transport.clone(), - exit_props: exit_props.clone(), - response_props: response_props.clone(), - mock_props: mock_props.clone(), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), -}) - } -let r3 = expect(&skip_newlines(r2.tokens.clone()), &Rc::new(ExpectedToken::ExpectRBrace)); -if has_err(r3.err.clone()) { - return Rc::new(OpBodyResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - modifier_props: modifier_props.clone(), - transport: transport.clone(), - exit_props: exit_props.clone(), - response_props: response_props.clone(), - mock_props: mock_props.clone(), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: r3.err.clone(), -}) - } -{ - let __tco_0 = r3.tokens.clone(); -let __tco_1 = r2.ctx.clone(); -let __tco_2 = r2.fields.clone(); -tokens = __tco_0; -ctx = __tco_1; -inputs = __tco_2; -continue; -} -} else { - if (kw_text.clone().as_str() == "output".to_string().as_str()) { - let r = expect(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), &Rc::new(ExpectedToken::ExpectLBrace)); -if has_err(r.err.clone()) { - return Rc::new(OpBodyResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - modifier_props: modifier_props.clone(), - transport: transport.clone(), - exit_props: exit_props.clone(), - response_props: response_props.clone(), - mock_props: mock_props.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let r2 = parse_field_list(skip_newlines(r.tokens.clone()), ctx.clone()); -if has_err(r2.err.clone()) { - return Rc::new(OpBodyResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - modifier_props: modifier_props.clone(), - transport: transport.clone(), - exit_props: exit_props.clone(), - response_props: response_props.clone(), - mock_props: mock_props.clone(), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), -}) - } -let r3 = expect(&skip_newlines(r2.tokens.clone()), &Rc::new(ExpectedToken::ExpectRBrace)); -if has_err(r3.err.clone()) { - return Rc::new(OpBodyResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - modifier_props: modifier_props.clone(), - transport: transport.clone(), - exit_props: exit_props.clone(), - response_props: response_props.clone(), - mock_props: mock_props.clone(), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: r3.err.clone(), -}) - } -{ - let __tco_0 = r3.tokens.clone(); -let __tco_1 = r2.ctx.clone(); -let __tco_2 = r2.fields.clone(); -tokens = __tco_0; -ctx = __tco_1; -outputs = __tco_2; -continue; -} -} else { - if (kw_text.clone().as_str() == "idempotent".to_string().as_str()) { - let prop = modifier_to_prop("idempotent".to_string(), &span); -{ - let __tco_0 = Rc::new(tokens.iter().cloned().skip(1 as usize).collect::>()); -let __tco_1 = v2_rt::rc_list_push(modifier_props, prop); -tokens = __tco_0; -modifier_props = __tco_1; -continue; -} -} else { - if (kw_text.clone().as_str() == "readonly".to_string().as_str()) { - let prop = modifier_to_prop("readonly".to_string(), &span); -{ - let __tco_0 = Rc::new(tokens.iter().cloned().skip(1 as usize).collect::>()); -let __tco_1 = v2_rt::rc_list_push(modifier_props, prop); -tokens = __tco_0; -modifier_props = __tco_1; -continue; -} -} else { - if (kw_text.clone().as_str() == "hermetic".to_string().as_str()) { - let prop = modifier_to_prop("hermetic".to_string(), &span); -{ - let __tco_0 = Rc::new(tokens.iter().cloned().skip(1 as usize).collect::>()); -let __tco_1 = v2_rt::rc_list_push(modifier_props, prop); -tokens = __tco_0; -modifier_props = __tco_1; -continue; -} -} else { - break mk_result; -} -} -} -} -} }, - Some(TokenShape::ShIdent) => { let id = tok.clone().unwrap().text.clone(); -if (id.clone().as_str() == "transport".to_string().as_str()) { - let r = parse_transport_binding(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), &ctx); -if has_err(r.err.clone()) { - return Rc::new(OpBodyResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - modifier_props: modifier_props.clone(), - transport: transport.clone(), - exit_props: exit_props.clone(), - response_props: response_props.clone(), - mock_props: mock_props.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -{ - let __tco_0 = r.tokens.clone(); -let __tco_1 = r.ctx.clone(); -let __tco_2 = Some(r.transport.clone()); -tokens = __tco_0; -ctx = __tco_1; -transport = __tco_2; -continue; -} -} else { - if (id.clone().as_str() == "exit".to_string().as_str()) { - let r = expect(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), &Rc::new(ExpectedToken::ExpectLBrace)); -if has_err(r.err.clone()) { - return Rc::new(OpBodyResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - modifier_props: modifier_props.clone(), - transport: transport.clone(), - exit_props: exit_props.clone(), - response_props: response_props.clone(), - mock_props: mock_props.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let r2 = parse_exit_entries(skip_newlines(r.tokens.clone()), ctx.clone()); -if has_err(r2.err.clone()) { - return Rc::new(OpBodyResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - modifier_props: modifier_props.clone(), - transport: transport.clone(), - exit_props: exit_props.clone(), - response_props: response_props.clone(), - mock_props: mock_props.clone(), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), -}) - } -let r3 = expect(&skip_newlines(r2.tokens.clone()), &Rc::new(ExpectedToken::ExpectRBrace)); -if has_err(r3.err.clone()) { - return Rc::new(OpBodyResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - modifier_props: modifier_props.clone(), - transport: transport.clone(), - exit_props: exit_props.clone(), - response_props: response_props.clone(), - mock_props: mock_props.clone(), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: r3.err.clone(), -}) + Some(t) => Some(t.shape.clone()), + None => None, + }; + match sh { + Some(TokenShape::ShKeyword) => { + let kw_text = tok.clone().unwrap().text.clone(); + if (kw_text.clone().as_str() == "input".to_string().as_str()) { + let r = expect( + &Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + &Rc::new(ExpectedToken::ExpectLBrace), + ); + if has_err(r.err.clone()) { + return Rc::new(OpBodyResult { + inputs: inputs.clone(), + outputs: outputs.clone(), + modifier_props: modifier_props.clone(), + transport: transport.clone(), + exit_props: exit_props.clone(), + response_props: response_props.clone(), + mock_props: mock_props.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let r2 = parse_field_list(skip_newlines(r.tokens.clone()), ctx.clone()); + if has_err(r2.err.clone()) { + return Rc::new(OpBodyResult { + inputs: inputs.clone(), + outputs: outputs.clone(), + modifier_props: modifier_props.clone(), + transport: transport.clone(), + exit_props: exit_props.clone(), + response_props: response_props.clone(), + mock_props: mock_props.clone(), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), + }); + } + let r3 = expect( + &skip_newlines(r2.tokens.clone()), + &Rc::new(ExpectedToken::ExpectRBrace), + ); + if has_err(r3.err.clone()) { + return Rc::new(OpBodyResult { + inputs: inputs.clone(), + outputs: outputs.clone(), + modifier_props: modifier_props.clone(), + transport: transport.clone(), + exit_props: exit_props.clone(), + response_props: response_props.clone(), + mock_props: mock_props.clone(), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: r3.err.clone(), + }); + } + { + let __tco_0 = r3.tokens.clone(); + let __tco_1 = r2.ctx.clone(); + let __tco_2 = r2.fields.clone(); + tokens = __tco_0; + ctx = __tco_1; + inputs = __tco_2; + continue; + } + } else { + if (kw_text.clone().as_str() == "output".to_string().as_str()) { + let r = expect( + &Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + &Rc::new(ExpectedToken::ExpectLBrace), + ); + if has_err(r.err.clone()) { + return Rc::new(OpBodyResult { + inputs: inputs.clone(), + outputs: outputs.clone(), + modifier_props: modifier_props.clone(), + transport: transport.clone(), + exit_props: exit_props.clone(), + response_props: response_props.clone(), + mock_props: mock_props.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let r2 = parse_field_list(skip_newlines(r.tokens.clone()), ctx.clone()); + if has_err(r2.err.clone()) { + return Rc::new(OpBodyResult { + inputs: inputs.clone(), + outputs: outputs.clone(), + modifier_props: modifier_props.clone(), + transport: transport.clone(), + exit_props: exit_props.clone(), + response_props: response_props.clone(), + mock_props: mock_props.clone(), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), + }); + } + let r3 = expect( + &skip_newlines(r2.tokens.clone()), + &Rc::new(ExpectedToken::ExpectRBrace), + ); + if has_err(r3.err.clone()) { + return Rc::new(OpBodyResult { + inputs: inputs.clone(), + outputs: outputs.clone(), + modifier_props: modifier_props.clone(), + transport: transport.clone(), + exit_props: exit_props.clone(), + response_props: response_props.clone(), + mock_props: mock_props.clone(), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: r3.err.clone(), + }); + } + { + let __tco_0 = r3.tokens.clone(); + let __tco_1 = r2.ctx.clone(); + let __tco_2 = r2.fields.clone(); + tokens = __tco_0; + ctx = __tco_1; + outputs = __tco_2; + continue; + } + } else { + if (kw_text.clone().as_str() == "idempotent".to_string().as_str()) { + let prop = modifier_to_prop("idempotent".to_string(), &span); + { + let __tco_0 = Rc::new( + tokens.iter().cloned().skip(1 as usize).collect::>(), + ); + let __tco_1 = v2_rt::rc_list_push(modifier_props, prop); + tokens = __tco_0; + modifier_props = __tco_1; + continue; + } + } else { + if (kw_text.clone().as_str() == "readonly".to_string().as_str()) { + let prop = modifier_to_prop("readonly".to_string(), &span); + { + let __tco_0 = Rc::new( + tokens + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ); + let __tco_1 = v2_rt::rc_list_push(modifier_props, prop); + tokens = __tco_0; + modifier_props = __tco_1; + continue; + } + } else { + if (kw_text.clone().as_str() == "hermetic".to_string().as_str()) + { + let prop = modifier_to_prop("hermetic".to_string(), &span); + { + let __tco_0 = Rc::new( + tokens + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ); + let __tco_1 = v2_rt::rc_list_push(modifier_props, prop); + tokens = __tco_0; + modifier_props = __tco_1; + continue; + } + } else { + break mk_result; + } + } + } + } } -{ - let __tco_0 = r3.tokens.clone(); -let __tco_1 = r2.ctx.clone(); -let __tco_2 = r2.entries.clone(); -tokens = __tco_0; -ctx = __tco_1; -exit_props = __tco_2; -continue; -} -} else { - if (id.clone().as_str() == "response".to_string().as_str()) { - let r = parse_optional_response_block(&tokens, &ctx); -if has_err(r.err.clone()) { + } + Some(TokenShape::ShIdent) => { + let id = tok.clone().unwrap().text.clone(); + if (id.clone().as_str() == "transport".to_string().as_str()) { + let r = parse_transport_binding( + &Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + &ctx, + ); + if has_err(r.err.clone()) { return Rc::new(OpBodyResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - modifier_props: modifier_props.clone(), - transport: transport.clone(), - exit_props: exit_props.clone(), - response_props: response_props.clone(), - mock_props: mock_props.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) + inputs: inputs.clone(), + outputs: outputs.clone(), + modifier_props: modifier_props.clone(), + transport: transport.clone(), + exit_props: exit_props.clone(), + response_props: response_props.clone(), + mock_props: mock_props.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); } -{ + { let __tco_0 = r.tokens.clone(); -let __tco_1 = r.ctx.clone(); -let __tco_2 = r.responses.clone(); -tokens = __tco_0; -ctx = __tco_1; -response_props = __tco_2; -continue; -} -} else { - if (id.clone().as_str() == "mock_response".to_string().as_str()) { - let r = parse_optional_mock_response_block(&tokens, &ctx); -if has_err(r.err.clone()) { + let __tco_1 = r.ctx.clone(); + let __tco_2 = Some(r.transport.clone()); + tokens = __tco_0; + ctx = __tco_1; + transport = __tco_2; + continue; + } + } else { + if (id.clone().as_str() == "exit".to_string().as_str()) { + let r = expect( + &Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + &Rc::new(ExpectedToken::ExpectLBrace), + ); + if has_err(r.err.clone()) { return Rc::new(OpBodyResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - modifier_props: modifier_props.clone(), - transport: transport.clone(), - exit_props: exit_props.clone(), - response_props: response_props.clone(), - mock_props: mock_props.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) + inputs: inputs.clone(), + outputs: outputs.clone(), + modifier_props: modifier_props.clone(), + transport: transport.clone(), + exit_props: exit_props.clone(), + response_props: response_props.clone(), + mock_props: mock_props.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); } -{ - let __tco_0 = r.tokens.clone(); -let __tco_1 = r.ctx.clone(); -let __tco_2 = r.mocks.clone(); -tokens = __tco_0; -ctx = __tco_1; -mock_props = __tco_2; -continue; -} -} else { - if peek_is_colon_after_ident(tokens.clone()) { - let r = expect_ident(&tokens); -if has_err(r.err.clone()) { + let r2 = + parse_exit_entries(skip_newlines(r.tokens.clone()), ctx.clone()); + if has_err(r2.err.clone()) { + return Rc::new(OpBodyResult { + inputs: inputs.clone(), + outputs: outputs.clone(), + modifier_props: modifier_props.clone(), + transport: transport.clone(), + exit_props: exit_props.clone(), + response_props: response_props.clone(), + mock_props: mock_props.clone(), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), + }); + } + let r3 = expect( + &skip_newlines(r2.tokens.clone()), + &Rc::new(ExpectedToken::ExpectRBrace), + ); + if has_err(r3.err.clone()) { + return Rc::new(OpBodyResult { + inputs: inputs.clone(), + outputs: outputs.clone(), + modifier_props: modifier_props.clone(), + transport: transport.clone(), + exit_props: exit_props.clone(), + response_props: response_props.clone(), + mock_props: mock_props.clone(), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: r3.err.clone(), + }); + } + { + let __tco_0 = r3.tokens.clone(); + let __tco_1 = r2.ctx.clone(); + let __tco_2 = r2.entries.clone(); + tokens = __tco_0; + ctx = __tco_1; + exit_props = __tco_2; + continue; + } + } else { + if (id.clone().as_str() == "response".to_string().as_str()) { + let r = parse_optional_response_block(&tokens, &ctx); + if has_err(r.err.clone()) { return Rc::new(OpBodyResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - modifier_props: modifier_props.clone(), - transport: transport.clone(), - exit_props: exit_props.clone(), - response_props: response_props.clone(), - mock_props: mock_props.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) + inputs: inputs.clone(), + outputs: outputs.clone(), + modifier_props: modifier_props.clone(), + transport: transport.clone(), + exit_props: exit_props.clone(), + response_props: response_props.clone(), + mock_props: mock_props.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); } -let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); -if has_err(r2.err.clone()) { - return Rc::new(OpBodyResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - modifier_props: modifier_props.clone(), - transport: transport.clone(), - exit_props: exit_props.clone(), - response_props: response_props.clone(), - mock_props: mock_props.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), -}) + { + let __tco_0 = r.tokens.clone(); + let __tco_1 = r.ctx.clone(); + let __tco_2 = r.responses.clone(); + tokens = __tco_0; + ctx = __tco_1; + response_props = __tco_2; + continue; } -let r3 = parse_expr(r2.tokens.clone(), ctx.clone()); -if has_err(r3.err.clone()) { - return Rc::new(OpBodyResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - modifier_props: modifier_props.clone(), - transport: transport.clone(), - exit_props: exit_props.clone(), - response_props: response_props.clone(), - mock_props: mock_props.clone(), - tokens: r3.tokens.clone(), - ctx: r3.ctx.clone(), - err: r3.err.clone(), -}) + } else { + if (id.clone().as_str() == "mock_response".to_string().as_str()) { + let r = parse_optional_mock_response_block(&tokens, &ctx); + if has_err(r.err.clone()) { + return Rc::new(OpBodyResult { + inputs: inputs.clone(), + outputs: outputs.clone(), + modifier_props: modifier_props.clone(), + transport: transport.clone(), + exit_props: exit_props.clone(), + response_props: response_props.clone(), + mock_props: mock_props.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + { + let __tco_0 = r.tokens.clone(); + let __tco_1 = r.ctx.clone(); + let __tco_2 = r.mocks.clone(); + tokens = __tco_0; + ctx = __tco_1; + mock_props = __tco_2; + continue; + } + } else { + if peek_is_colon_after_ident(tokens.clone()) { + let r = expect_ident(&tokens); + if has_err(r.err.clone()) { + return Rc::new(OpBodyResult { + inputs: inputs.clone(), + outputs: outputs.clone(), + modifier_props: modifier_props.clone(), + transport: transport.clone(), + exit_props: exit_props.clone(), + response_props: response_props.clone(), + mock_props: mock_props.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let r2 = expect( + &r.tokens.clone(), + &Rc::new(ExpectedToken::ExpectColon), + ); + if has_err(r2.err.clone()) { + return Rc::new(OpBodyResult { + inputs: inputs.clone(), + outputs: outputs.clone(), + modifier_props: modifier_props.clone(), + transport: transport.clone(), + exit_props: exit_props.clone(), + response_props: response_props.clone(), + mock_props: mock_props.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), + }); + } + let r3 = parse_expr(r2.tokens.clone(), ctx.clone()); + if has_err(r3.err.clone()) { + return Rc::new(OpBodyResult { + inputs: inputs.clone(), + outputs: outputs.clone(), + modifier_props: modifier_props.clone(), + transport: transport.clone(), + exit_props: exit_props.clone(), + response_props: response_props.clone(), + mock_props: mock_props.clone(), + tokens: r3.tokens.clone(), + ctx: r3.ctx.clone(), + err: r3.err.clone(), + }); + } + { + let __tco_0 = skip_newlines(r3.tokens.clone()); + let __tco_1 = r3.ctx.clone(); + tokens = __tco_0; + ctx = __tco_1; + continue; + } + } else { + break Rc::new(OpBodyResult { + inputs: inputs.clone(), + outputs: outputs.clone(), + modifier_props: modifier_props.clone(), + transport: transport.clone(), + exit_props: exit_props.clone(), + response_props: response_props.clone(), + mock_props: mock_props.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: Some(parse_error( + format!( + "unexpected '{}' in operation body", + id.clone() + ), + span, + )), + }); + } } -{ - let __tco_0 = skip_newlines(r3.tokens.clone()); -let __tco_1 = r3.ctx.clone(); -tokens = __tco_0; -ctx = __tco_1; -continue; -} -} else { - break Rc::new(OpBodyResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - modifier_props: modifier_props.clone(), - transport: transport.clone(), - exit_props: exit_props.clone(), - response_props: response_props.clone(), - mock_props: mock_props.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: Some(parse_error(format!("unexpected '{}' in operation body", id.clone()), span)), -}); -} -} -} -} -} }, - _ => { break Rc::new(OpBodyResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - modifier_props: modifier_props.clone(), - transport: transport.clone(), - exit_props: exit_props.clone(), - response_props: response_props.clone(), - mock_props: mock_props.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: Some(parse_error("unexpected token in operation body".to_string(), span)), -}); }, -} -} -} + } + } + } + } + _ => { + break Rc::new(OpBodyResult { + inputs: inputs.clone(), + outputs: outputs.clone(), + modifier_props: modifier_props.clone(), + transport: transport.clone(), + exit_props: exit_props.clone(), + response_props: response_props.clone(), + mock_props: mock_props.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: Some(parse_error( + "unexpected token in operation body".to_string(), + span, + )), + }); + } + } + } + } } pub fn modifier_to_prop(name: String, span: &Rc) -> Rc { - make_field_init_node(&name, make_expr_node(Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitBool { - value: true, -}), -}), Rc::new(vec![]), None, span.clone()), span.clone(), span.clone()) -} - -pub fn modifiers_to_props(modifiers: Rc>, span: Rc) -> Rc>> { - Rc::new({ let mut __result = Vec::new(); for m in modifiers.iter().cloned() { __result.push(match m.clone() { - OperationModifier::Idempotent => modifier_to_prop("idempotent".to_string(), &span), - OperationModifier::Readonly => modifier_to_prop("readonly".to_string(), &span), - OperationModifier::Hermetic => modifier_to_prop("hermetic".to_string(), &span), -}); } __result }) + make_field_init_node( + &name, + make_expr_node( + Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitBool { value: true }), + }), + Rc::new(vec![]), + None, + span.clone(), + ), + span.clone(), + span.clone(), + ) +} + +pub fn modifiers_to_props( + modifiers: Rc>, + span: Rc, +) -> Rc>> { + Rc::new({ + let mut __result = Vec::new(); + for m in modifiers.iter().cloned() { + __result.push(match m.clone() { + OperationModifier::Idempotent => modifier_to_prop("idempotent".to_string(), &span), + OperationModifier::Readonly => modifier_to_prop("readonly".to_string(), &span), + OperationModifier::Hermetic => modifier_to_prop("hermetic".to_string(), &span), + }); + } + __result + }) } -pub fn status_expr_to_str(expr: &Rc, source_indices: Rc>>) -> String { +pub fn status_expr_to_str( + expr: &Rc, + source_indices: Rc>>, +) -> String { match (*expr.expr_data.clone()).clone() { - ExprData::ExprLiteral { value: v, .. } => match (*v.clone()).clone() { - LiteralValue::LitInt { value: n, .. } => int_to_string(n.clone()), - LiteralValue::LitStr { value: s, .. } => s.clone(), - _ => "_".to_string(), -}, - ExprData::ExprVar { .. } => expr_var_name_at(expr.clone(), source_indices), - _ => "_".to_string(), -} + ExprData::ExprLiteral { value: v, .. } => match (*v.clone()).clone() { + LiteralValue::LitInt { value: n, .. } => int_to_string(n.clone()), + LiteralValue::LitStr { value: s, .. } => s.clone(), + _ => "_".to_string(), + }, + ExprData::ExprVar { .. } => expr_var_name_at(expr.clone(), source_indices), + _ => "_".to_string(), + } } pub fn int_to_string(value: i64) -> String { @@ -6438,8 +7772,8 @@ pub fn int_to_string(value: i64) -> String { } else { { let digits = int_to_string_acc(value.clone(), Rc::new(vec![])); -digits.join(&"".to_string()) -} + digits.join(&"".to_string()) + } } } @@ -6447,2195 +7781,2828 @@ pub fn int_to_string_acc(mut value: i64, mut acc: Rc>) -> Rc>()).iter().cloned() { if (p.0.clone() == digit.clone()) { __result.push(p); } } __result }).first().cloned() { - Some(p) => p.1.clone(), - None => "?".to_string(), -}; -{ + let rest = ((value.clone() - digit.clone()) / 10); + let digit_chars = Rc::new(vec![ + "0".to_string(), + "1".to_string(), + "2".to_string(), + "3".to_string(), + "4".to_string(), + "5".to_string(), + "6".to_string(), + "7".to_string(), + "8".to_string(), + "9".to_string(), + ]); + let ch = match Rc::new({ + let mut __result = Vec::new(); + for p in Rc::new( + digit_chars + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + { + if (p.0.clone() == digit.clone()) { + __result.push(p); + } + } + __result + }) + .first() + .cloned() + { + Some(p) => p.1.clone(), + None => "?".to_string(), + }; + { let __tco_0 = rest; -let __tco_1 = v2_rt::concat(Rc::new(vec![ch]), acc); -value = __tco_0; -acc = __tco_1; -continue; -} -} -} + let __tco_1 = v2_rt::concat(Rc::new(vec![ch]), acc); + value = __tco_0; + acc = __tco_1; + continue; + } + } + } } pub fn first_child_or_self(n: Rc) -> Rc { match n.children.clone().first().cloned() { - Some(ch) => ch.clone(), - None => n.clone(), -} + Some(ch) => ch.clone(), + None => n.clone(), + } } pub fn last_child_or_self(n: Rc) -> Rc { match n.children.clone().last().cloned() { - Some(ch) => ch.clone(), - None => n.clone(), -} + Some(ch) => ch.clone(), + None => n.clone(), + } } -pub fn node_to_name_str(n: &Rc, source_indices: &Rc>>) -> String { +pub fn node_to_name_str( + n: &Rc, + source_indices: &Rc>>, +) -> String { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - { - let is_optional = (n.return_cardinality.clone() == Cardinality::CardOptional); -let effective_n = if is_optional.clone() { - with_required_cardinality(&n) - } else { - n.clone() - }; -let opt_prefix = if is_optional.clone() { - "Optional_".to_string() - } else { - "".to_string() - }; -let effective_name = authored_name_at(source_indices.clone(), &effective_n); -let is_keyed_container = (is_container_type(effective_name.clone()) && ((effective_n.children.clone().len() as i64) == 2)); -if is_keyed_container { - match effective_n.children.clone().last().cloned() { - Some(ch) => v2_rt::concat(v2_rt::concat(v2_rt::concat(opt_prefix, effective_name.clone()), "_".to_string()), node_to_name_str(&ch, &source_indices)), - None => v2_rt::concat(opt_prefix, effective_name.clone()), -} + let is_optional = (n.return_cardinality.clone() == Cardinality::CardOptional); + let effective_n = if is_optional.clone() { + with_required_cardinality(&n) + } else { + n.clone() + }; + let opt_prefix = if is_optional.clone() { + "Optional_".to_string() + } else { + "".to_string() + }; + let effective_name = authored_name_at(source_indices.clone(), &effective_n); + let is_keyed_container = (is_container_type(effective_name.clone()) + && ((effective_n.children.clone().len() as i64) == 2)); + if is_keyed_container { + match effective_n.children.clone().last().cloned() { + Some(ch) => v2_rt::concat( + v2_rt::concat( + v2_rt::concat(opt_prefix, effective_name.clone()), + "_".to_string(), + ), + node_to_name_str(&ch, &source_indices), + ), + None => v2_rt::concat(opt_prefix, effective_name.clone()), + } + } else { + if (effective_n.type_annotation.clone() != None) { + match effective_n.children.clone().first().cloned() { + Some(ch) => v2_rt::concat(opt_prefix, node_to_name_str(&ch, &source_indices)), + None => v2_rt::concat(opt_prefix, effective_name.clone()), + } } else { - if (effective_n.type_annotation.clone() != None) { + if is_container_type(effective_name.clone()) { match effective_n.children.clone().first().cloned() { - Some(ch) => v2_rt::concat(opt_prefix, node_to_name_str(&ch, &source_indices)), - None => v2_rt::concat(opt_prefix, effective_name.clone()), -} + Some(ch) => v2_rt::concat( + v2_rt::concat(opt_prefix, "List_".to_string()), + node_to_name_str(&ch, &source_indices), + ), + None => v2_rt::concat(opt_prefix, effective_name.clone()), + } } else { - if is_container_type(effective_name.clone()) { - match effective_n.children.clone().first().cloned() { - Some(ch) => v2_rt::concat(v2_rt::concat(opt_prefix, "List_".to_string()), node_to_name_str(&ch, &source_indices)), - None => v2_rt::concat(opt_prefix, effective_name.clone()), -} - } else { - if (effective_n.ident_span.clone() == None) { - { - let is_conj = (effective_n.connective.clone() == Connective::Conj); -let is_disj = (effective_n.connective.clone() == Connective::Disj); -if is_conj { - v2_rt::concat(opt_prefix, "Record".to_string()) + if (effective_n.ident_span.clone() == None) { + { + let is_conj = (effective_n.connective.clone() == Connective::Conj); + let is_disj = (effective_n.connective.clone() == Connective::Disj); + if is_conj { + v2_rt::concat(opt_prefix, "Record".to_string()) + } else { + if is_disj { + v2_rt::concat(opt_prefix, "Union".to_string()) } else { - if is_disj { - v2_rt::concat(opt_prefix, "Union".to_string()) - } else { - v2_rt::concat(opt_prefix, effective_name.clone()) - } + v2_rt::concat(opt_prefix, effective_name.clone()) } -} - } else { - v2_rt::concat(opt_prefix, effective_name.clone()) + } } + } else { + v2_rt::concat(opt_prefix, effective_name.clone()) } } } -} + } }) } -pub fn parse_exit_entries(tokens: Rc>>, ctx: Rc) -> Rc { +pub fn parse_exit_entries( + tokens: Rc>>, + ctx: Rc, +) -> Rc { parse_exit_entries_acc(tokens, ctx, Rc::new(vec![])) } -pub fn parse_exit_entries_acc(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { +pub fn parse_exit_entries_acc( + mut tokens: Rc>>, + mut ctx: Rc, + mut acc: Rc>>, +) -> Rc { loop { tokens = skip_newlines(tokens.clone()); -if (tok_is_rbrace(tokens.clone().first().cloned()) || tok_is_eof(tokens.clone().first().cloned())) { + if (tok_is_rbrace(tokens.clone().first().cloned()) + || tok_is_eof(tokens.clone().first().cloned())) + { break Rc::new(ExitEntriesResult { - entries: acc, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}); -} else { + entries: acc, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }); + } else { let r = parse_status_pattern(&tokens, &ctx); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(ExitEntriesResult { - entries: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let code = r.expr.clone(); -let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectFatArrow)); -if has_err(r2.err.clone()) { + entries: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let code = r.expr.clone(); + let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectFatArrow)); + if has_err(r2.err.clone()) { return Rc::new(ExitEntriesResult { - entries: Rc::new(vec![]), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), -}) - } -let r3 = parse_type_expr(&r2.tokens.clone(), &r.ctx.clone()); -if has_err(r3.err.clone()) { + entries: Rc::new(vec![]), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), + }); + } + let r3 = parse_type_expr(&r2.tokens.clone(), &r.ctx.clone()); + if has_err(r3.err.clone()) { return Rc::new(ExitEntriesResult { - entries: Rc::new(vec![]), - tokens: r3.tokens.clone(), - ctx: r3.ctx.clone(), - err: r3.err.clone(), -}) - } -let desc_tok = r3.tokens.clone().first().cloned(); -let desc_sh = match desc_tok { - Some(t) => Some(t.shape.clone()), - None => None, -}; -let desc_tokens = match desc_sh { - Some(TokenShape::ShLitStr) => Rc::new(r3.tokens.clone().iter().cloned().skip(1 as usize).collect::>()), - _ => r3.tokens.clone(), -}; -let code_str = status_expr_to_str(&code, ctx.source_indices.clone()); -let type_name = node_to_name_str(&r3.type_expr.clone(), &ctx.source_indices.clone()); -let prop_name = v2_rt::concat("exit_".to_string(), code_str); -let entry = make_field_init_node(&prop_name, make_named_expr_node(&type_name, Rc::new(ExprData::ExprVar { - binding_kind: None, -}), Rc::new(vec![]), None, r3.type_expr.clone().span.clone(), r3.type_expr.clone().span.clone()), r3.type_expr.clone().span.clone(), no_span()); -let e = eat(&desc_tokens, Rc::new(ExpectedToken::ExpectComma)); -tokens = skip_newlines(match (*e).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), - EatResult::EatUnchanged { .. } => desc_tokens.clone(), -}); -{ + entries: Rc::new(vec![]), + tokens: r3.tokens.clone(), + ctx: r3.ctx.clone(), + err: r3.err.clone(), + }); + } + let desc_tok = r3.tokens.clone().first().cloned(); + let desc_sh = match desc_tok { + Some(t) => Some(t.shape.clone()), + None => None, + }; + let desc_tokens = match desc_sh { + Some(TokenShape::ShLitStr) => Rc::new( + r3.tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + _ => r3.tokens.clone(), + }; + let code_str = status_expr_to_str(&code, ctx.source_indices.clone()); + let type_name = node_to_name_str(&r3.type_expr.clone(), &ctx.source_indices.clone()); + let prop_name = v2_rt::concat("exit_".to_string(), code_str); + let entry = make_field_init_node( + &prop_name, + make_named_expr_node( + &type_name, + Rc::new(ExprData::ExprVar { binding_kind: None }), + Rc::new(vec![]), + None, + r3.type_expr.clone().span.clone(), + r3.type_expr.clone().span.clone(), + ), + r3.type_expr.clone().span.clone(), + no_span(), + ); + let e = eat(&desc_tokens, Rc::new(ExpectedToken::ExpectComma)); + tokens = skip_newlines(match (*e).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), + EatResult::EatUnchanged { .. } => desc_tokens.clone(), + }); + { let __tco_0 = r3.ctx.clone(); -let __tco_1 = v2_rt::rc_list_push(acc, entry); -ctx = __tco_0; -acc = __tco_1; -continue; -} -} -} + let __tco_1 = v2_rt::rc_list_push(acc, entry); + ctx = __tco_0; + acc = __tco_1; + continue; + } + } + } } -pub fn parse_operation_modifiers(tokens: Rc>>, ctx: Rc) -> Rc { +pub fn parse_operation_modifiers( + tokens: Rc>>, + ctx: Rc, +) -> Rc { parse_operation_modifiers_acc(tokens, ctx, Rc::new(vec![])) } -pub fn parse_operation_modifiers_acc(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>) -> Rc { +pub fn parse_operation_modifiers_acc( + mut tokens: Rc>>, + mut ctx: Rc, + mut acc: Rc>, +) -> Rc { loop { let kw = tok_keyword_text(tokens.clone().first().cloned()); -if (kw.clone().as_str() == "idempotent".to_string().as_str()) { + if (kw.clone().as_str() == "idempotent".to_string().as_str()) { { let __tco_0 = Rc::new(tokens.iter().cloned().skip(1 as usize).collect::>()); -let __tco_1 = v2_rt::rc_list_push(acc, OperationModifier::Idempotent); -tokens = __tco_0; -acc = __tco_1; -continue; -} -} else { + let __tco_1 = v2_rt::rc_list_push(acc, OperationModifier::Idempotent); + tokens = __tco_0; + acc = __tco_1; + continue; + } + } else { if (kw.clone().as_str() == "readonly".to_string().as_str()) { { - let __tco_0 = Rc::new(tokens.iter().cloned().skip(1 as usize).collect::>()); -let __tco_1 = v2_rt::rc_list_push(acc, OperationModifier::Readonly); -tokens = __tco_0; -acc = __tco_1; -continue; -} -} else { + let __tco_0 = + Rc::new(tokens.iter().cloned().skip(1 as usize).collect::>()); + let __tco_1 = v2_rt::rc_list_push(acc, OperationModifier::Readonly); + tokens = __tco_0; + acc = __tco_1; + continue; + } + } else { if (kw.clone().as_str() == "hermetic".to_string().as_str()) { { - let __tco_0 = Rc::new(tokens.iter().cloned().skip(1 as usize).collect::>()); -let __tco_1 = v2_rt::rc_list_push(acc, OperationModifier::Hermetic); -tokens = __tco_0; -acc = __tco_1; -continue; -} -} else { + let __tco_0 = + Rc::new(tokens.iter().cloned().skip(1 as usize).collect::>()); + let __tco_1 = v2_rt::rc_list_push(acc, OperationModifier::Hermetic); + tokens = __tco_0; + acc = __tco_1; + continue; + } + } else { break Rc::new(ModsResult { - modifiers: acc, - tokens: tokens.clone(), - ctx: ctx, - err: None, -}); -} -} -} -} + modifiers: acc, + tokens: tokens.clone(), + ctx: ctx, + err: None, + }); + } + } + } + } } pub fn parse_status_pattern(tokens: &Rc>>, ctx: &Rc) -> Rc { { let tok = tokens.clone().first().cloned(); -let sh = match tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, -}; -let span = token_span(tok.clone()); -match sh { - Some(TokenShape::ShLitInt) => { - let n_opt = v2_rt::parse_int(tok.clone().unwrap().text.clone()); -let n = match n_opt { - Some(v) => v.clone(), - None => return Rc::new(ExprResult { - expr: make_expr_error_node(ExprErrorKind::InternalExprError, &v2_rt::concat(v2_rt::concat("internal: ShLitInt token text not parseable as int: '".to_string(), tok.clone().unwrap().text.clone()), "'".to_string()), &span), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}), -}; -let next_tok = tokens.clone().get(1 as usize).cloned(); -match next_tok { - Some(t) => if (is_ident_shape(t.shape.clone()) && (t.text.clone().as_str() == "xx".to_string().as_str())) { - Rc::new(ExprResult { - expr: make_expr_node(Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitStr { - value: format!("{}xx", n), -}), -}), Rc::new(vec![]), None, span.clone()), - tokens: Rc::new(tokens.clone().iter().cloned().skip(2 as usize).collect::>()), - ctx: ctx.clone(), - err: None, -}) - } else { - Rc::new(ExprResult { - expr: make_expr_node(Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitInt { - value: n, -}), -}), Rc::new(vec![]), None, span.clone()), - tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), - ctx: ctx.clone(), - err: None, -}) - }, - None => Rc::new(ExprResult { - expr: make_expr_node(Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitInt { - value: n, -}), -}), Rc::new(vec![]), None, span.clone()), - tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), - ctx: ctx.clone(), - err: None, -}), -} -}, - Some(TokenShape::ShIdent) => { - let id = tok.clone().unwrap().text.clone(); -Rc::new(ExprResult { - expr: make_expr_node(Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitStr { - value: id, -}), -}), Rc::new(vec![]), None, span.clone()), - tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), - ctx: ctx.clone(), - err: None, -}) -}, - _ => Rc::new(ExprResult { - expr: make_expr_node(Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitStr { - value: "_".to_string(), -}), -}), Rc::new(vec![]), None, span.clone()), - tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), - ctx: ctx.clone(), - err: None, -}), -} -} + let sh = match tok.clone() { + Some(t) => Some(t.shape.clone()), + None => None, + }; + let span = token_span(tok.clone()); + match sh { + Some(TokenShape::ShLitInt) => { + let n_opt = v2_rt::parse_int(tok.clone().unwrap().text.clone()); + let n = match n_opt { + Some(v) => v.clone(), + None => { + return Rc::new(ExprResult { + expr: make_expr_error_node( + ExprErrorKind::InternalExprError, + &v2_rt::concat( + v2_rt::concat( + "internal: ShLitInt token text not parseable as int: '" + .to_string(), + tok.clone().unwrap().text.clone(), + ), + "'".to_string(), + ), + &span, + ), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }) + } + }; + let next_tok = tokens.clone().get(1 as usize).cloned(); + match next_tok { + Some(t) => { + if (is_ident_shape(t.shape.clone()) + && (t.text.clone().as_str() == "xx".to_string().as_str())) + { + Rc::new(ExprResult { + expr: make_expr_node( + Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitStr { + value: format!("{}xx", n), + }), + }), + Rc::new(vec![]), + None, + span.clone(), + ), + tokens: Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(2 as usize) + .collect::>(), + ), + ctx: ctx.clone(), + err: None, + }) + } else { + Rc::new(ExprResult { + expr: make_expr_node( + Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitInt { value: n }), + }), + Rc::new(vec![]), + None, + span.clone(), + ), + tokens: Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + ctx: ctx.clone(), + err: None, + }) + } + } + None => Rc::new(ExprResult { + expr: make_expr_node( + Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitInt { value: n }), + }), + Rc::new(vec![]), + None, + span.clone(), + ), + tokens: Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + ctx: ctx.clone(), + err: None, + }), + } + } + Some(TokenShape::ShIdent) => { + let id = tok.clone().unwrap().text.clone(); + Rc::new(ExprResult { + expr: make_expr_node( + Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitStr { value: id }), + }), + Rc::new(vec![]), + None, + span.clone(), + ), + tokens: Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + ctx: ctx.clone(), + err: None, + }) + } + _ => Rc::new(ExprResult { + expr: make_expr_node( + Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitStr { + value: "_".to_string(), + }), + }), + Rc::new(vec![]), + None, + span.clone(), + ), + tokens: Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + ctx: ctx.clone(), + err: None, + }), + } + } } -pub fn parse_optional_response_block(tokens: &Rc>>, ctx: &Rc) -> Rc { +pub fn parse_optional_response_block( + tokens: &Rc>>, + ctx: &Rc, +) -> Rc { { let tok = tokens.clone().first().cloned(); -let is_response = match tok { - Some(t) => (is_ident_shape(t.shape.clone()) && (t.text.clone().as_str() == "response".to_string().as_str())), - None => false, -}; -if is_response { + let is_response = match tok { + Some(t) => { + (is_ident_shape(t.shape.clone()) + && (t.text.clone().as_str() == "response".to_string().as_str())) + } + None => false, + }; + if is_response { { - let r = expect(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), &Rc::new(ExpectedToken::ExpectLBrace)); -if has_err(r.err.clone()) { + let r = expect( + &Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + &Rc::new(ExpectedToken::ExpectLBrace), + ); + if has_err(r.err.clone()) { return Rc::new(ResponsesResult { - responses: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) + responses: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); } -let r2 = parse_response_entries(skip_newlines(r.tokens.clone()), ctx.clone()); -if has_err(r2.err.clone()) { + let r2 = parse_response_entries(skip_newlines(r.tokens.clone()), ctx.clone()); + if has_err(r2.err.clone()) { return Rc::new(ResponsesResult { - responses: Rc::new(vec![]), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), -}) - } -let r3 = expect(&skip_newlines(r2.tokens.clone()), &Rc::new(ExpectedToken::ExpectRBrace)); -if has_err(r3.err.clone()) { + responses: Rc::new(vec![]), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), + }); + } + let r3 = expect( + &skip_newlines(r2.tokens.clone()), + &Rc::new(ExpectedToken::ExpectRBrace), + ); + if has_err(r3.err.clone()) { return Rc::new(ResponsesResult { - responses: Rc::new(vec![]), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: r3.err.clone(), -}) - } -Rc::new(ResponsesResult { - responses: r2.entries.clone(), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: None, -}) -} + responses: Rc::new(vec![]), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: r3.err.clone(), + }); + } + Rc::new(ResponsesResult { + responses: r2.entries.clone(), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: None, + }) + } } else { Rc::new(ResponsesResult { - responses: Rc::new(vec![]), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}) + responses: Rc::new(vec![]), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }) } -} + } } -pub fn parse_response_entries(tokens: Rc>>, ctx: Rc) -> Rc { +pub fn parse_response_entries( + tokens: Rc>>, + ctx: Rc, +) -> Rc { parse_response_entries_acc(tokens, ctx, Rc::new(vec![])) } -pub fn parse_response_entries_acc(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { +pub fn parse_response_entries_acc( + mut tokens: Rc>>, + mut ctx: Rc, + mut acc: Rc>>, +) -> Rc { loop { tokens = skip_newlines(tokens.clone()); -if (tok_is_rbrace(tokens.clone().first().cloned()) || tok_is_eof(tokens.clone().first().cloned())) { + if (tok_is_rbrace(tokens.clone().first().cloned()) + || tok_is_eof(tokens.clone().first().cloned())) + { break Rc::new(RespEntriesResult { - entries: acc, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}); -} else { + entries: acc, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }); + } else { let r = parse_status_pattern(&tokens, &ctx); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(RespEntriesResult { - entries: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let status = r.expr.clone(); -let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectFatArrow)); -if has_err(r2.err.clone()) { + entries: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let status = r.expr.clone(); + let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectFatArrow)); + if has_err(r2.err.clone()) { return Rc::new(RespEntriesResult { - entries: Rc::new(vec![]), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), -}) - } -let r3 = parse_type_expr(&r2.tokens.clone(), &r.ctx.clone()); -if has_err(r3.err.clone()) { + entries: Rc::new(vec![]), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), + }); + } + let r3 = parse_type_expr(&r2.tokens.clone(), &r.ctx.clone()); + if has_err(r3.err.clone()) { return Rc::new(RespEntriesResult { - entries: Rc::new(vec![]), - tokens: r3.tokens.clone(), - ctx: r3.ctx.clone(), - err: r3.err.clone(), -}) - } -let status_str = status_expr_to_str(&status, ctx.source_indices.clone()); -let type_name = node_to_name_str(&r3.type_expr.clone(), &ctx.source_indices.clone()); -let prop_name = v2_rt::concat("response_".to_string(), status_str); -let entry = make_field_init_node(&prop_name, make_named_expr_node(&type_name, Rc::new(ExprData::ExprVar { - binding_kind: None, -}), Rc::new(vec![]), None, r3.type_expr.clone().span.clone(), r3.type_expr.clone().span.clone()), r3.type_expr.clone().span.clone(), no_span()); -let e = eat(&r3.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); -tokens = skip_newlines(match (*e).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), - EatResult::EatUnchanged { .. } => r3.tokens.clone(), -}); -{ + entries: Rc::new(vec![]), + tokens: r3.tokens.clone(), + ctx: r3.ctx.clone(), + err: r3.err.clone(), + }); + } + let status_str = status_expr_to_str(&status, ctx.source_indices.clone()); + let type_name = node_to_name_str(&r3.type_expr.clone(), &ctx.source_indices.clone()); + let prop_name = v2_rt::concat("response_".to_string(), status_str); + let entry = make_field_init_node( + &prop_name, + make_named_expr_node( + &type_name, + Rc::new(ExprData::ExprVar { binding_kind: None }), + Rc::new(vec![]), + None, + r3.type_expr.clone().span.clone(), + r3.type_expr.clone().span.clone(), + ), + r3.type_expr.clone().span.clone(), + no_span(), + ); + let e = eat(&r3.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); + tokens = skip_newlines(match (*e).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), + EatResult::EatUnchanged { .. } => r3.tokens.clone(), + }); + { let __tco_0 = r3.ctx.clone(); -let __tco_1 = v2_rt::rc_list_push(acc, entry); -ctx = __tco_0; -acc = __tco_1; -continue; -} -} -} + let __tco_1 = v2_rt::rc_list_push(acc, entry); + ctx = __tco_0; + acc = __tco_1; + continue; + } + } + } } -pub fn parse_optional_mock_response_block(tokens: &Rc>>, ctx: &Rc) -> Rc { +pub fn parse_optional_mock_response_block( + tokens: &Rc>>, + ctx: &Rc, +) -> Rc { { let tok = tokens.clone().first().cloned(); -let is_mock = match tok { - Some(t) => (is_ident_shape(t.shape.clone()) && (t.text.clone().as_str() == "mock_response".to_string().as_str())), - None => false, -}; -if is_mock { + let is_mock = match tok { + Some(t) => { + (is_ident_shape(t.shape.clone()) + && (t.text.clone().as_str() == "mock_response".to_string().as_str())) + } + None => false, + }; + if is_mock { { - let r = expect(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), &Rc::new(ExpectedToken::ExpectLBrace)); -if has_err(r.err.clone()) { + let r = expect( + &Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + &Rc::new(ExpectedToken::ExpectLBrace), + ); + if has_err(r.err.clone()) { return Rc::new(MocksResult { - mocks: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) + mocks: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); } -let r2 = parse_mock_response_entries(skip_newlines(r.tokens.clone()), ctx.clone()); -if has_err(r2.err.clone()) { + let r2 = parse_mock_response_entries(skip_newlines(r.tokens.clone()), ctx.clone()); + if has_err(r2.err.clone()) { return Rc::new(MocksResult { - mocks: Rc::new(vec![]), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), -}) - } -let r3 = expect(&skip_newlines(r2.tokens.clone()), &Rc::new(ExpectedToken::ExpectRBrace)); -if has_err(r3.err.clone()) { + mocks: Rc::new(vec![]), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), + }); + } + let r3 = expect( + &skip_newlines(r2.tokens.clone()), + &Rc::new(ExpectedToken::ExpectRBrace), + ); + if has_err(r3.err.clone()) { return Rc::new(MocksResult { - mocks: Rc::new(vec![]), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: r3.err.clone(), -}) - } -Rc::new(MocksResult { - mocks: r2.entries.clone(), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: None, -}) -} + mocks: Rc::new(vec![]), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: r3.err.clone(), + }); + } + Rc::new(MocksResult { + mocks: r2.entries.clone(), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: None, + }) + } } else { Rc::new(MocksResult { - mocks: Rc::new(vec![]), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}) + mocks: Rc::new(vec![]), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }) } -} + } } -pub fn parse_mock_response_entries(tokens: Rc>>, ctx: Rc) -> Rc { +pub fn parse_mock_response_entries( + tokens: Rc>>, + ctx: Rc, +) -> Rc { parse_mock_response_entries_acc(tokens, ctx, Rc::new(vec![])) } -pub fn parse_mock_response_entries_acc(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { +pub fn parse_mock_response_entries_acc( + mut tokens: Rc>>, + mut ctx: Rc, + mut acc: Rc>>, +) -> Rc { loop { tokens = skip_newlines(tokens.clone()); -if (tok_is_rbrace(tokens.clone().first().cloned()) || tok_is_eof(tokens.clone().first().cloned())) { + if (tok_is_rbrace(tokens.clone().first().cloned()) + || tok_is_eof(tokens.clone().first().cloned())) + { break Rc::new(MockEntriesResult { - entries: acc, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}); -} else { + entries: acc, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }); + } else { let r = parse_status_pattern(&tokens, &ctx); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(MockEntriesResult { - entries: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let status = r.expr.clone(); -let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectFatArrow)); -if has_err(r2.err.clone()) { + entries: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let status = r.expr.clone(); + let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectFatArrow)); + if has_err(r2.err.clone()) { return Rc::new(MockEntriesResult { - entries: Rc::new(vec![]), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), -}) - } -let r3 = parse_expr(r2.tokens.clone(), r.ctx.clone()); -if has_err(r3.err.clone()) { + entries: Rc::new(vec![]), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), + }); + } + let r3 = parse_expr(r2.tokens.clone(), r.ctx.clone()); + if has_err(r3.err.clone()) { return Rc::new(MockEntriesResult { - entries: Rc::new(vec![]), - tokens: r3.tokens.clone(), - ctx: r3.ctx.clone(), - err: r3.err.clone(), -}) - } -let body = r3.expr.clone(); -let desc_tok = r3.tokens.clone().first().cloned(); -let desc_sh = match desc_tok { - Some(t) => Some(t.shape.clone()), - None => None, -}; -let desc_tokens = match desc_sh { - Some(TokenShape::ShLitStr) => Rc::new(r3.tokens.clone().iter().cloned().skip(1 as usize).collect::>()), - _ => r3.tokens.clone(), -}; -let status_str = status_expr_to_str(&status, ctx.source_indices.clone()); -let prop_name = v2_rt::concat("mock_".to_string(), status_str); -let entry = make_field_init_node(&prop_name, body, make_span(0, 0), make_span(0, 0)); -let e = eat(&desc_tokens, Rc::new(ExpectedToken::ExpectComma)); -tokens = skip_newlines(match (*e).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), - EatResult::EatUnchanged { .. } => desc_tokens.clone(), -}); -{ + entries: Rc::new(vec![]), + tokens: r3.tokens.clone(), + ctx: r3.ctx.clone(), + err: r3.err.clone(), + }); + } + let body = r3.expr.clone(); + let desc_tok = r3.tokens.clone().first().cloned(); + let desc_sh = match desc_tok { + Some(t) => Some(t.shape.clone()), + None => None, + }; + let desc_tokens = match desc_sh { + Some(TokenShape::ShLitStr) => Rc::new( + r3.tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + _ => r3.tokens.clone(), + }; + let status_str = status_expr_to_str(&status, ctx.source_indices.clone()); + let prop_name = v2_rt::concat("mock_".to_string(), status_str); + let entry = make_field_init_node(&prop_name, body, make_span(0, 0), make_span(0, 0)); + let e = eat(&desc_tokens, Rc::new(ExpectedToken::ExpectComma)); + tokens = skip_newlines(match (*e).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), + EatResult::EatUnchanged { .. } => desc_tokens.clone(), + }); + { let __tco_0 = r3.ctx.clone(); -let __tco_1 = v2_rt::rc_list_push(acc, entry); -ctx = __tco_0; -acc = __tco_1; -continue; -} -} -} + let __tco_1 = v2_rt::rc_list_push(acc, entry); + ctx = __tco_0; + acc = __tco_1; + continue; + } + } + } } pub fn parse_resource_def(tokens: &Rc>>, ctx: &Rc) -> Rc { { let start_span = token_span(tokens.clone().first().cloned()); -let dummy = Rc::new(Node { - name: "".to_string(), - span: start_span.clone(), - ident_span: None, - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { - text: "resource".to_string(), -})); -if has_err(r.err.clone()) { + let dummy = Rc::new(Node { + name: "".to_string(), + span: start_span.clone(), + ident_span: None, + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + let r = expect( + &tokens, + &Rc::new(ExpectedToken::ExpectKeyword { + text: "resource".to_string(), + }), + ); + if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: dummy, - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) + item: dummy, + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); } -parse_resource_after_kw(r.tokens.clone(), &ctx, &start_span) -} + parse_resource_after_kw(r.tokens.clone(), &ctx, &start_span) + } } -pub fn parse_resource_after_kw(tokens: Rc>>, ctx: &Rc, start_span: &Rc) -> Rc { +pub fn parse_resource_after_kw( + tokens: Rc>>, + ctx: &Rc, + start_span: &Rc, +) -> Rc { { let dummy = Rc::new(Node { - name: "".to_string(), - span: start_span.clone(), - ident_span: None, - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -let r = expect_ident(&tokens); -if has_err(r.err.clone()) { + name: "".to_string(), + span: start_span.clone(), + ident_span: None, + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + let r = expect_ident(&tokens); + if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: dummy, - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let name = r.name.clone(); -let name_span = r.span.clone(); -let named_dummy = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -let r = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectLBrace)); -if has_err(r.err.clone()) { + item: dummy, + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let name = r.name.clone(); + let name_span = r.span.clone(); + let named_dummy = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + let r = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectLBrace)); + if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let r = parse_resource_entries(skip_newlines(r.tokens.clone()), ctx.clone(), Rc::new(vec![]), Rc::new(vec![])); -if has_err(r.err.clone()) { + item: named_dummy.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let r = parse_resource_entries( + skip_newlines(r.tokens.clone()), + ctx.clone(), + Rc::new(vec![]), + Rc::new(vec![]), + ); + if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let r2 = expect(&skip_newlines(r.tokens.clone()), &Rc::new(ExpectedToken::ExpectRBrace)); -if has_err(r2.err.clone()) { + item: named_dummy.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let r2 = expect( + &skip_newlines(r.tokens.clone()), + &Rc::new(ExpectedToken::ExpectRBrace), + ); + if has_err(r2.err.clone()) { return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), -}) - } -let item = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: r.capabilities.clone(), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: r.properties.clone(), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -Rc::new(ItemResult { - item: item, - tokens: skip_newlines(r2.tokens.clone()), - ctx: r.ctx.clone(), - err: None, -}) -} + item: named_dummy.clone(), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), + }); + } + let item = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: r.capabilities.clone(), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: r.properties.clone(), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + Rc::new(ItemResult { + item: item, + tokens: skip_newlines(r2.tokens.clone()), + ctx: r.ctx.clone(), + err: None, + }) + } } -pub fn parse_resource_entries(mut tokens: Rc>>, mut ctx: Rc, mut properties: Rc>>, mut capabilities: Rc>>) -> Rc { +pub fn parse_resource_entries( + mut tokens: Rc>>, + mut ctx: Rc, + mut properties: Rc>>, + mut capabilities: Rc>>, +) -> Rc { loop { tokens = skip_newlines(tokens.clone()); -let tok = tokens.clone().first().cloned(); -let span = token_span(tok.clone()); -if (tok_is_rbrace(tok.clone()) || tok_is_eof(tok.clone())) { + let tok = tokens.clone().first().cloned(); + let span = token_span(tok.clone()); + if (tok_is_rbrace(tok.clone()) || tok_is_eof(tok.clone())) { break Rc::new(ResPropResult { - properties: properties.clone(), - capabilities: capabilities.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}); -} else { + properties: properties.clone(), + capabilities: capabilities.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }); + } else { let sh = match tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, -}; -match sh { - Some(TokenShape::ShKeyword) => { let kw_text = tok_keyword_text(tok.clone()); -if (kw_text.clone().as_str() == "capability".to_string().as_str()) { - let r = parse_capability(&tokens, &ctx); -if has_err(r.err.clone()) { - return Rc::new(ResPropResult { - properties: properties.clone(), - capabilities: capabilities.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -{ - let __tco_0 = r.tokens.clone(); -let __tco_1 = r.ctx.clone(); -let __tco_2 = v2_rt::rc_list_push(capabilities, r.capability.clone()); -tokens = __tco_0; -ctx = __tco_1; -capabilities = __tco_2; -continue; -} -} else { - if (kw_text.clone().as_str() == "acquire".to_string().as_str()) { - let r = expect(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), &Rc::new(ExpectedToken::ExpectLBrace)); -if has_err(r.err.clone()) { - return Rc::new(ResPropResult { - properties: properties.clone(), - capabilities: capabilities.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let r2 = skip_until_rbrace(&skip_newlines(r.tokens.clone())); -let r3 = expect(&r2.tokens.clone(), &Rc::new(ExpectedToken::ExpectRBrace)); -if has_err(r3.err.clone()) { - return Rc::new(ResPropResult { - properties: properties.clone(), - capabilities: capabilities.clone(), - tokens: r3.tokens.clone(), - ctx: ctx.clone(), - err: r3.err.clone(), -}) + Some(t) => Some(t.shape.clone()), + None => None, + }; + match sh { + Some(TokenShape::ShKeyword) => { + let kw_text = tok_keyword_text(tok.clone()); + if (kw_text.clone().as_str() == "capability".to_string().as_str()) { + let r = parse_capability(&tokens, &ctx); + if has_err(r.err.clone()) { + return Rc::new(ResPropResult { + properties: properties.clone(), + capabilities: capabilities.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + { + let __tco_0 = r.tokens.clone(); + let __tco_1 = r.ctx.clone(); + let __tco_2 = v2_rt::rc_list_push(capabilities, r.capability.clone()); + tokens = __tco_0; + ctx = __tco_1; + capabilities = __tco_2; + continue; + } + } else { + if (kw_text.clone().as_str() == "acquire".to_string().as_str()) { + let r = expect( + &Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + &Rc::new(ExpectedToken::ExpectLBrace), + ); + if has_err(r.err.clone()) { + return Rc::new(ResPropResult { + properties: properties.clone(), + capabilities: capabilities.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let r2 = skip_until_rbrace(&skip_newlines(r.tokens.clone())); + let r3 = + expect(&r2.tokens.clone(), &Rc::new(ExpectedToken::ExpectRBrace)); + if has_err(r3.err.clone()) { + return Rc::new(ResPropResult { + properties: properties.clone(), + capabilities: capabilities.clone(), + tokens: r3.tokens.clone(), + ctx: ctx.clone(), + err: r3.err.clone(), + }); + } + { + let __tco_0 = skip_newlines(r3.tokens.clone()); + tokens = __tco_0; + continue; + } + } else { + if (kw_text.clone().as_str() == "release".to_string().as_str()) { + let r = expect( + &Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + &Rc::new(ExpectedToken::ExpectLBrace), + ); + if has_err(r.err.clone()) { + return Rc::new(ResPropResult { + properties: properties.clone(), + capabilities: capabilities.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let r2 = skip_until_rbrace(&skip_newlines(r.tokens.clone())); + let r3 = expect( + &r2.tokens.clone(), + &Rc::new(ExpectedToken::ExpectRBrace), + ); + if has_err(r3.err.clone()) { + return Rc::new(ResPropResult { + properties: properties.clone(), + capabilities: capabilities.clone(), + tokens: r3.tokens.clone(), + ctx: ctx.clone(), + err: r3.err.clone(), + }); + } + { + let __tco_0 = skip_newlines(r3.tokens.clone()); + tokens = __tco_0; + continue; + } + } else { + break Rc::new(ResPropResult { + properties: properties.clone(), + capabilities: capabilities.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: Some(parse_error( + "unexpected keyword in resource block".to_string(), + span, + )), + }); + } + } } -{ - let __tco_0 = skip_newlines(r3.tokens.clone()); -tokens = __tco_0; -continue; -} -} else { - if (kw_text.clone().as_str() == "release".to_string().as_str()) { - let r = expect(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), &Rc::new(ExpectedToken::ExpectLBrace)); -if has_err(r.err.clone()) { + } + Some(TokenShape::ShIdent) => { + if peek_is_colon_after_ident(tokens.clone()) { + let r = expect_ident(&tokens); + if has_err(r.err.clone()) { return Rc::new(ResPropResult { - properties: properties.clone(), - capabilities: capabilities.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) + properties: properties.clone(), + capabilities: capabilities.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); } -let r2 = skip_until_rbrace(&skip_newlines(r.tokens.clone())); -let r3 = expect(&r2.tokens.clone(), &Rc::new(ExpectedToken::ExpectRBrace)); -if has_err(r3.err.clone()) { + let fname = r.name.clone(); + let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); + if has_err(r2.err.clone()) { return Rc::new(ResPropResult { - properties: properties.clone(), - capabilities: capabilities.clone(), - tokens: r3.tokens.clone(), - ctx: ctx.clone(), - err: r3.err.clone(), -}) + properties: properties.clone(), + capabilities: capabilities.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), + }); + } + let r3 = parse_expr(r2.tokens.clone(), ctx.clone()); + if has_err(r3.err.clone()) { + return Rc::new(ResPropResult { + properties: properties.clone(), + capabilities: capabilities.clone(), + tokens: r3.tokens.clone(), + ctx: r3.ctx.clone(), + err: r3.err.clone(), + }); } -{ + let fi = make_field_init_node( + &fname, + r3.expr.clone(), + make_span(0, 0), + r.span.clone(), + ); + { let __tco_0 = skip_newlines(r3.tokens.clone()); -tokens = __tco_0; -continue; -} -} else { + let __tco_1 = r3.ctx.clone(); + let __tco_2 = v2_rt::rc_list_push(properties, fi); + tokens = __tco_0; + ctx = __tco_1; + properties = __tco_2; + continue; + } + } else { break Rc::new(ResPropResult { - properties: properties.clone(), - capabilities: capabilities.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: Some(parse_error("unexpected keyword in resource block".to_string(), span)), -}); -} -} -} }, - Some(TokenShape::ShIdent) => { if peek_is_colon_after_ident(tokens.clone()) { - let r = expect_ident(&tokens); -if has_err(r.err.clone()) { - return Rc::new(ResPropResult { - properties: properties.clone(), - capabilities: capabilities.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let fname = r.name.clone(); -let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); -if has_err(r2.err.clone()) { - return Rc::new(ResPropResult { - properties: properties.clone(), - capabilities: capabilities.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), -}) - } -let r3 = parse_expr(r2.tokens.clone(), ctx.clone()); -if has_err(r3.err.clone()) { - return Rc::new(ResPropResult { - properties: properties.clone(), - capabilities: capabilities.clone(), - tokens: r3.tokens.clone(), - ctx: r3.ctx.clone(), - err: r3.err.clone(), -}) - } -let fi = make_field_init_node(&fname, r3.expr.clone(), make_span(0, 0), r.span.clone()); -{ - let __tco_0 = skip_newlines(r3.tokens.clone()); -let __tco_1 = r3.ctx.clone(); -let __tco_2 = v2_rt::rc_list_push(properties, fi); -tokens = __tco_0; -ctx = __tco_1; -properties = __tco_2; -continue; -} -} else { - break Rc::new(ResPropResult { - properties: properties.clone(), - capabilities: capabilities.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: Some(parse_error("unexpected token in resource block".to_string(), span)), -}); -} }, - _ => { break Rc::new(ResPropResult { - properties: properties.clone(), - capabilities: capabilities.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: Some(parse_error("expected capability, acquire, release, or property in resource block".to_string(), span)), -}); }, -} -} -} + properties: properties.clone(), + capabilities: capabilities.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: Some(parse_error( + "unexpected token in resource block".to_string(), + span, + )), + }); + } + } + _ => { + break Rc::new(ResPropResult { + properties: properties.clone(), + capabilities: capabilities.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: Some(parse_error( + "expected capability, acquire, release, or property in resource block" + .to_string(), + span, + )), + }); + } + } + } + } } pub fn skip_until_rbrace(tokens: &Rc>>) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { - { - let tokens = skip_newlines(tokens.clone()); -let tok = tokens.clone().first().cloned(); -if (tok_is_rbrace(tok.clone()) || tok_is_eof(tok.clone())) { - Rc::new(UnitResult { - tokens: tokens.clone(), - err: None, -}) - } else { - { - let sh = match tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, -}; -match sh { - Some(TokenShape::ShLBrace) => { - let inner = skip_until_rbrace(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>())); -let r = expect(&inner.tokens.clone(), &Rc::new(ExpectedToken::ExpectRBrace)); -if has_err(r.err.clone()) { + let tokens = skip_newlines(tokens.clone()); + let tok = tokens.clone().first().cloned(); + if (tok_is_rbrace(tok.clone()) || tok_is_eof(tok.clone())) { + Rc::new(UnitResult { + tokens: tokens.clone(), + err: None, + }) + } else { + { + let sh = match tok.clone() { + Some(t) => Some(t.shape.clone()), + None => None, + }; + match sh { + Some(TokenShape::ShLBrace) => { + let inner = skip_until_rbrace(&Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + )); + let r = + expect(&inner.tokens.clone(), &Rc::new(ExpectedToken::ExpectRBrace)); + if has_err(r.err.clone()) { return Rc::new(UnitResult { - tokens: r.tokens.clone(), - err: r.err.clone(), -}) + tokens: r.tokens.clone(), + err: r.err.clone(), + }); } -skip_until_rbrace(&r.tokens.clone()) -}, - _ => skip_until_rbrace(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>())), -} -} + skip_until_rbrace(&r.tokens.clone()) + } + _ => skip_until_rbrace(&Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + )), + } } -} + } }) } pub fn parse_capability(tokens: &Rc>>, ctx: &Rc) -> Rc { { let start_span = token_span(tokens.clone().first().cloned()); -let dummy_cap = make_capability_node("".to_string(), None, Rc::new(vec![]), Rc::new(vec![]), &start_span, &ctx.source_indices.clone()); -let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { - text: "capability".to_string(), -})); -if has_err(r.err.clone()) { + let dummy_cap = make_capability_node( + "".to_string(), + None, + Rc::new(vec![]), + Rc::new(vec![]), + &start_span, + &ctx.source_indices.clone(), + ); + let r = expect( + &tokens, + &Rc::new(ExpectedToken::ExpectKeyword { + text: "capability".to_string(), + }), + ); + if has_err(r.err.clone()) { return Rc::new(CapResult { - capability: dummy_cap.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let r = expect_ident(&r.tokens.clone()); -if has_err(r.err.clone()) { + capability: dummy_cap.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let r = expect_ident(&r.tokens.clone()); + if has_err(r.err.clone()) { return Rc::new(CapResult { - capability: dummy_cap.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let name = r.name.clone(); -let name_span = r.span.clone(); -let tokens = r.tokens.clone(); -if tok_is_lbrace(tokens.clone().first().cloned()) { + capability: dummy_cap.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let name = r.name.clone(); + let name_span = r.span.clone(); + let tokens = r.tokens.clone(); + if tok_is_lbrace(tokens.clone().first().cloned()) { { let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectLBrace)); -if has_err(r2.err.clone()) { + if has_err(r2.err.clone()) { return Rc::new(CapResult { - capability: dummy_cap.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), -}) + capability: dummy_cap.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), + }); } -let io = parse_input_output_blocks(skip_newlines(r2.tokens.clone()), ctx.clone()); -if has_err(io.err.clone()) { + let io = parse_input_output_blocks(skip_newlines(r2.tokens.clone()), ctx.clone()); + if has_err(io.err.clone()) { return Rc::new(CapResult { - capability: dummy_cap.clone(), - tokens: io.tokens.clone(), - ctx: io.ctx.clone(), - err: io.err.clone(), -}) - } -let r3 = expect(&skip_newlines(io.tokens.clone()), &Rc::new(ExpectedToken::ExpectRBrace)); -if has_err(r3.err.clone()) { + capability: dummy_cap.clone(), + tokens: io.tokens.clone(), + ctx: io.ctx.clone(), + err: io.err.clone(), + }); + } + let r3 = expect( + &skip_newlines(io.tokens.clone()), + &Rc::new(ExpectedToken::ExpectRBrace), + ); + if has_err(r3.err.clone()) { return Rc::new(CapResult { - capability: dummy_cap.clone(), - tokens: r3.tokens.clone(), - ctx: io.ctx.clone(), - err: r3.err.clone(), -}) - } -let cap = make_capability_node(name, Some(name_span), io.inputs.clone(), io.outputs.clone(), &start_span, &ctx.source_indices.clone()); -Rc::new(CapResult { - capability: cap, - tokens: skip_newlines(r3.tokens.clone()), - ctx: io.ctx.clone(), - err: None, -}) -} + capability: dummy_cap.clone(), + tokens: r3.tokens.clone(), + ctx: io.ctx.clone(), + err: r3.err.clone(), + }); + } + let cap = make_capability_node( + name, + Some(name_span), + io.inputs.clone(), + io.outputs.clone(), + &start_span, + &ctx.source_indices.clone(), + ); + Rc::new(CapResult { + capability: cap, + tokens: skip_newlines(r3.tokens.clone()), + ctx: io.ctx.clone(), + err: None, + }) + } } else { if tok_is_lparen(tokens.clone().first().cloned()) { { let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectLParen)); -if has_err(r2.err.clone()) { + if has_err(r2.err.clone()) { return Rc::new(CapResult { - capability: dummy_cap.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), -}) + capability: dummy_cap.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), + }); } -let r3 = parse_field_list(skip_newlines(r2.tokens.clone()), ctx.clone()); -if has_err(r3.err.clone()) { + let r3 = parse_field_list(skip_newlines(r2.tokens.clone()), ctx.clone()); + if has_err(r3.err.clone()) { return Rc::new(CapResult { - capability: dummy_cap.clone(), - tokens: r3.tokens.clone(), - ctx: r3.ctx.clone(), - err: r3.err.clone(), -}) + capability: dummy_cap.clone(), + tokens: r3.tokens.clone(), + ctx: r3.ctx.clone(), + err: r3.err.clone(), + }); } -let inputs = r3.fields.clone(); -let r4 = expect(&skip_newlines(r3.tokens.clone()), &Rc::new(ExpectedToken::ExpectRParen)); -if has_err(r4.err.clone()) { + let inputs = r3.fields.clone(); + let r4 = expect( + &skip_newlines(r3.tokens.clone()), + &Rc::new(ExpectedToken::ExpectRParen), + ); + if has_err(r4.err.clone()) { return Rc::new(CapResult { - capability: dummy_cap.clone(), - tokens: r4.tokens.clone(), - ctx: r3.ctx.clone(), - err: r4.err.clone(), -}) + capability: dummy_cap.clone(), + tokens: r4.tokens.clone(), + ctx: r3.ctx.clone(), + err: r4.err.clone(), + }); } -let ret = parse_optional_inferred(&r4.tokens.clone(), r3.ctx.clone()); -if has_err(ret.err.clone()) { + let ret = parse_optional_inferred(&r4.tokens.clone(), r3.ctx.clone()); + if has_err(ret.err.clone()) { return Rc::new(CapResult { - capability: dummy_cap.clone(), - tokens: ret.tokens.clone(), - ctx: ret.ctx.clone(), - err: ret.err.clone(), -}) + capability: dummy_cap.clone(), + tokens: ret.tokens.clone(), + ctx: ret.ctx.clone(), + err: ret.err.clone(), + }); } -let outputs = match ret.inferred.clone().as_deref().cloned() { - Some(InferredNode::Resolved { node: rt, .. }) => node_inferred_to_outputs(&rt, ret.ctx.clone().source_indices.clone()), - _ => Rc::new(vec![]), -}; -let cap = make_capability_node(name, Some(name_span), inputs, outputs, &start_span, &ctx.source_indices.clone()); -Rc::new(CapResult { - capability: cap, - tokens: skip_newlines(ret.tokens.clone()), - ctx: ret.ctx.clone(), - err: None, -}) -} + let outputs = match ret.inferred.clone().as_deref().cloned() { + Some(InferredNode::Resolved { node: rt, .. }) => { + node_inferred_to_outputs(&rt, ret.ctx.clone().source_indices.clone()) + } + _ => Rc::new(vec![]), + }; + let cap = make_capability_node( + name, + Some(name_span), + inputs, + outputs, + &start_span, + &ctx.source_indices.clone(), + ); + Rc::new(CapResult { + capability: cap, + tokens: skip_newlines(ret.tokens.clone()), + ctx: ret.ctx.clone(), + err: None, + }) + } } else { { - let cap = make_capability_node(name, Some(name_span), Rc::new(vec![]), Rc::new(vec![]), &start_span, &ctx.source_indices.clone()); -Rc::new(CapResult { - capability: cap, - tokens: skip_newlines(tokens.clone()), - ctx: ctx.clone(), - err: None, -}) -} + let cap = make_capability_node( + name, + Some(name_span), + Rc::new(vec![]), + Rc::new(vec![]), + &start_span, + &ctx.source_indices.clone(), + ); + Rc::new(CapResult { + capability: cap, + tokens: skip_newlines(tokens.clone()), + ctx: ctx.clone(), + err: None, + }) + } } } -} + } } -pub fn parse_input_output_blocks(tokens: Rc>>, ctx: Rc) -> Rc { +pub fn parse_input_output_blocks( + tokens: Rc>>, + ctx: Rc, +) -> Rc { parse_io_blocks_acc(tokens, ctx, Rc::new(vec![]), Rc::new(vec![])) } -pub fn parse_io_blocks_acc(mut tokens: Rc>>, mut ctx: Rc, mut inputs: Rc>>, mut outputs: Rc>>) -> Rc { +pub fn parse_io_blocks_acc( + mut tokens: Rc>>, + mut ctx: Rc, + mut inputs: Rc>>, + mut outputs: Rc>>, +) -> Rc { loop { tokens = skip_newlines(tokens.clone()); -if (tok_is_rbrace(tokens.clone().first().cloned()) || tok_is_eof(tokens.clone().first().cloned())) { + if (tok_is_rbrace(tokens.clone().first().cloned()) + || tok_is_eof(tokens.clone().first().cloned())) + { break Rc::new(IOResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}); -} else { + inputs: inputs.clone(), + outputs: outputs.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }); + } else { let kw = tok_keyword_text(tokens.clone().first().cloned()); -if (kw.clone().as_str() == "input".to_string().as_str()) { - let r = expect(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), &Rc::new(ExpectedToken::ExpectLBrace)); -if has_err(r.err.clone()) { + if (kw.clone().as_str() == "input".to_string().as_str()) { + let r = expect( + &Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + &Rc::new(ExpectedToken::ExpectLBrace), + ); + if has_err(r.err.clone()) { return Rc::new(IOResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) + inputs: inputs.clone(), + outputs: outputs.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); } -let r2 = parse_field_list(skip_newlines(r.tokens.clone()), ctx.clone()); -if has_err(r2.err.clone()) { + let r2 = parse_field_list(skip_newlines(r.tokens.clone()), ctx.clone()); + if has_err(r2.err.clone()) { return Rc::new(IOResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), -}) - } -let r3 = expect(&skip_newlines(r2.tokens.clone()), &Rc::new(ExpectedToken::ExpectRBrace)); -if has_err(r3.err.clone()) { + inputs: inputs.clone(), + outputs: outputs.clone(), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), + }); + } + let r3 = expect( + &skip_newlines(r2.tokens.clone()), + &Rc::new(ExpectedToken::ExpectRBrace), + ); + if has_err(r3.err.clone()) { return Rc::new(IOResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: r3.err.clone(), -}) - } -{ + inputs: inputs.clone(), + outputs: outputs.clone(), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: r3.err.clone(), + }); + } + { let __tco_0 = r3.tokens.clone(); -let __tco_1 = r2.ctx.clone(); -let __tco_2 = r2.fields.clone(); -tokens = __tco_0; -ctx = __tco_1; -inputs = __tco_2; -continue; -} -} else { + let __tco_1 = r2.ctx.clone(); + let __tco_2 = r2.fields.clone(); + tokens = __tco_0; + ctx = __tco_1; + inputs = __tco_2; + continue; + } + } else { if (kw.clone().as_str() == "output".to_string().as_str()) { - let r = expect(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), &Rc::new(ExpectedToken::ExpectLBrace)); -if has_err(r.err.clone()) { + let r = expect( + &Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + &Rc::new(ExpectedToken::ExpectLBrace), + ); + if has_err(r.err.clone()) { return Rc::new(IOResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) + inputs: inputs.clone(), + outputs: outputs.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); } -let r2 = parse_field_list(skip_newlines(r.tokens.clone()), ctx.clone()); -if has_err(r2.err.clone()) { + let r2 = parse_field_list(skip_newlines(r.tokens.clone()), ctx.clone()); + if has_err(r2.err.clone()) { return Rc::new(IOResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), -}) + inputs: inputs.clone(), + outputs: outputs.clone(), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), + }); } -let r3 = expect(&skip_newlines(r2.tokens.clone()), &Rc::new(ExpectedToken::ExpectRBrace)); -if has_err(r3.err.clone()) { + let r3 = expect( + &skip_newlines(r2.tokens.clone()), + &Rc::new(ExpectedToken::ExpectRBrace), + ); + if has_err(r3.err.clone()) { return Rc::new(IOResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - tokens: r3.tokens.clone(), - ctx: r2.ctx.clone(), - err: r3.err.clone(), -}) + inputs: inputs.clone(), + outputs: outputs.clone(), + tokens: r3.tokens.clone(), + ctx: r2.ctx.clone(), + err: r3.err.clone(), + }); } -{ + { let __tco_0 = r3.tokens.clone(); -let __tco_1 = r2.ctx.clone(); -let __tco_2 = r2.fields.clone(); -tokens = __tco_0; -ctx = __tco_1; -outputs = __tco_2; -continue; -} -} else { + let __tco_1 = r2.ctx.clone(); + let __tco_2 = r2.fields.clone(); + tokens = __tco_0; + ctx = __tco_1; + outputs = __tco_2; + continue; + } + } else { break Rc::new(IOResult { - inputs: inputs.clone(), - outputs: outputs.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}); -} -} -} -} + inputs: inputs.clone(), + outputs: outputs.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }); + } + } + } + } } pub fn parse_data_def(tokens: &Rc>>, ctx: &Rc) -> Rc { { let start_span = token_span(tokens.clone().first().cloned()); -let dummy = Rc::new(Node { - name: "".to_string(), - span: start_span.clone(), - ident_span: None, - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { - text: "data".to_string(), -})); -if has_err(r.err.clone()) { + let dummy = Rc::new(Node { + name: "".to_string(), + span: start_span.clone(), + ident_span: None, + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + let r = expect( + &tokens, + &Rc::new(ExpectedToken::ExpectKeyword { + text: "data".to_string(), + }), + ); + if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: dummy, - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) + item: dummy, + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); } -parse_data_after_kw(r.tokens.clone(), &ctx, &start_span) -} + parse_data_after_kw(r.tokens.clone(), &ctx, &start_span) + } } -pub fn parse_data_after_kw(tokens: Rc>>, ctx: &Rc, start_span: &Rc) -> Rc { +pub fn parse_data_after_kw( + tokens: Rc>>, + ctx: &Rc, + start_span: &Rc, +) -> Rc { { let dummy = Rc::new(Node { - name: "".to_string(), - span: start_span.clone(), - ident_span: None, - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -let r = expect_ident(&tokens); -if has_err(r.err.clone()) { + name: "".to_string(), + span: start_span.clone(), + ident_span: None, + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + let r = expect_ident(&tokens); + if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: dummy, - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let name = r.name.clone(); -let name_span = r.span.clone(); -let named_dummy = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -let r = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); -if has_err(r.err.clone()) { + item: dummy, + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let name = r.name.clone(); + let name_span = r.span.clone(); + let named_dummy = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + let r = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); + if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let r = parse_type_expr(&r.tokens.clone(), &ctx); -if has_err(r.err.clone()) { + item: named_dummy.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let r = parse_type_expr(&r.tokens.clone(), &ctx); + if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let te = r.type_expr.clone(); -let r = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectEq)); -if has_err(r.err.clone()) { + item: named_dummy.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let te = r.type_expr.clone(); + let r = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectEq)); + if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let r = parse_expr(r.tokens.clone(), ctx.clone()); -if has_err(r.err.clone()) { + item: named_dummy.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let r = parse_expr(r.tokens.clone(), ctx.clone()); + if has_err(r.err.clone()) { return Rc::new(ItemResult { - item: named_dummy.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let item = Rc::new(Node { - name: name.clone(), - span: start_span.clone(), - ident_span: Some(name_span.clone()), - children: Rc::new(vec![]), - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: Some(r.expr.clone()), - connective: Connective::NoConnective, - transport: None, - properties: Rc::new(vec![]), - type_annotation: Some(te), - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -Rc::new(ItemResult { - item: item, - tokens: skip_newlines(r.tokens.clone()), - ctx: r.ctx.clone(), - err: None, -}) -} + item: named_dummy.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let item = Rc::new(Node { + name: name.clone(), + span: start_span.clone(), + ident_span: Some(name_span.clone()), + children: Rc::new(vec![]), + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: Some(r.expr.clone()), + connective: Connective::NoConnective, + transport: None, + properties: Rc::new(vec![]), + type_annotation: Some(te), + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + Rc::new(ItemResult { + item: item, + tokens: skip_newlines(r.tokens.clone()), + ctx: r.ctx.clone(), + err: None, + }) + } } pub fn parse_params(tokens: &Rc>>, ctx: &Rc) -> Rc { { let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectLParen)); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(ParamsResult { - params: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) + params: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); } -let tokens = skip_newlines(r.tokens.clone()); -if tok_is_rparen(tokens.clone().first().cloned()) { + let tokens = skip_newlines(r.tokens.clone()); + if tok_is_rparen(tokens.clone().first().cloned()) { Rc::new(ParamsResult { - params: Rc::new(vec![]), - tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), - ctx: ctx.clone(), - err: None, -}) + params: Rc::new(vec![]), + tokens: Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + ctx: ctx.clone(), + err: None, + }) } else { { let r = parse_param_list(tokens.clone(), ctx.clone()); -if has_err(r.err.clone()) { - return r.clone() + if has_err(r.err.clone()) { + return r.clone(); } -let tokens = skip_newlines(r.tokens.clone()); -let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRParen)); -if has_err(r2.err.clone()) { + let tokens = skip_newlines(r.tokens.clone()); + let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRParen)); + if has_err(r2.err.clone()) { return Rc::new(ParamsResult { - params: Rc::new(vec![]), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), -}) + params: Rc::new(vec![]), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), + }); } -Rc::new(ParamsResult { - params: r.params.clone(), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -} + Rc::new(ParamsResult { + params: r.params.clone(), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } } -} + } } pub fn parse_param_list(tokens: Rc>>, ctx: Rc) -> Rc { parse_param_list_acc(tokens, ctx, Rc::new(vec![])) } -pub fn parse_param_list_acc(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { +pub fn parse_param_list_acc( + mut tokens: Rc>>, + mut ctx: Rc, + mut acc: Rc>>, +) -> Rc { loop { let r = parse_param(&tokens, &ctx); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(ParamsResult { - params: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -acc = v2_rt::rc_list_push(acc.clone(), r.param.clone()); -match (*eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { tokens = skip_newlines(__ec.clone()); -if tok_is_rparen(tokens.clone().first().cloned()) { - break Rc::new(ParamsResult { - params: acc.clone(), - tokens: tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}); -} else { - { - let __tco_0 = r.ctx.clone(); -ctx = __tco_0; -continue; -} -} }, - EatResult::EatUnchanged { tokens: __eu, .. } => { break Rc::new(ParamsResult { - params: acc.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}); }, -} -} + params: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + acc = v2_rt::rc_list_push(acc.clone(), r.param.clone()); + match (*eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { + tokens = skip_newlines(__ec.clone()); + if tok_is_rparen(tokens.clone().first().cloned()) { + break Rc::new(ParamsResult { + params: acc.clone(), + tokens: tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }); + } else { + { + let __tco_0 = r.ctx.clone(); + ctx = __tco_0; + continue; + } + } + } + EatResult::EatUnchanged { tokens: __eu, .. } => { + break Rc::new(ParamsResult { + params: acc.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }); + } + } + } } pub fn parse_param(tokens: &Rc>>, ctx: &Rc) -> Rc { { let start_span = token_span(tokens.clone().first().cloned()); -let dummy_param = make_param_node(&"".to_string(), leaf_type_node(&"".to_string(), &start_span), None, start_span.clone(), start_span.clone()); -let r = expect_name(&tokens); -if has_err(r.err.clone()) { + let dummy_param = make_param_node( + &"".to_string(), + leaf_type_node(&"".to_string(), &start_span), + None, + start_span.clone(), + start_span.clone(), + ); + let r = expect_name(&tokens); + if has_err(r.err.clone()) { return Rc::new(ParamResult { - param: dummy_param.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let name = r.name.clone(); -let name_span = r.span.clone(); -let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); -if has_err(r2.err.clone()) { + param: dummy_param.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let name = r.name.clone(); + let name_span = r.span.clone(); + let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectColon)); + if has_err(r2.err.clone()) { return Rc::new(ParamResult { - param: dummy_param.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), -}) - } -let r3 = parse_type_expr(&r2.tokens.clone(), &ctx); -if has_err(r3.err.clone()) { + param: dummy_param.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), + }); + } + let r3 = parse_type_expr(&r2.tokens.clone(), &ctx); + if has_err(r3.err.clone()) { return Rc::new(ParamResult { - param: dummy_param.clone(), - tokens: r3.tokens.clone(), - ctx: r3.ctx.clone(), - err: r3.err.clone(), -}) - } -let wr = try_where_clause(&r3.tokens.clone(), r3.ctx.clone(), &r3.type_expr.clone(), &start_span); -if has_err(wr.err.clone()) { + param: dummy_param.clone(), + tokens: r3.tokens.clone(), + ctx: r3.ctx.clone(), + err: r3.err.clone(), + }); + } + let wr = try_where_clause( + &r3.tokens.clone(), + r3.ctx.clone(), + &r3.type_expr.clone(), + &start_span, + ); + if has_err(wr.err.clone()) { return Rc::new(ParamResult { - param: dummy_param.clone(), - tokens: wr.tokens.clone(), - ctx: wr.ctx.clone(), - err: wr.err.clone(), -}) - } -let type_expr = wr.type_expr.clone(); -let tokens = wr.tokens.clone(); -let ctx = wr.ctx.clone(); -match (*eat(&tokens, Rc::new(ExpectedToken::ExpectEq))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let r4 = parse_expr(__ec.clone(), ctx.clone()); -if has_err(r4.err.clone()) { - return Rc::new(ParamResult { - param: dummy_param.clone(), - tokens: r4.tokens.clone(), - ctx: r4.ctx.clone(), - err: r4.err.clone(), -}) - } -let p = make_param_node(&name, type_expr, Some(r4.expr.clone()), start_span.clone(), name_span); -Rc::new(ParamResult { - param: p, - tokens: r4.tokens.clone(), - ctx: r4.ctx.clone(), - err: None, -}) -}, - EatResult::EatUnchanged { tokens: __eu, .. } => { - let p = make_param_node(&name, type_expr, None, start_span.clone(), name_span); -Rc::new(ParamResult { - param: p, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}) -}, -} -} + param: dummy_param.clone(), + tokens: wr.tokens.clone(), + ctx: wr.ctx.clone(), + err: wr.err.clone(), + }); + } + let type_expr = wr.type_expr.clone(); + let tokens = wr.tokens.clone(); + let ctx = wr.ctx.clone(); + match (*eat(&tokens, Rc::new(ExpectedToken::ExpectEq))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { + let r4 = parse_expr(__ec.clone(), ctx.clone()); + if has_err(r4.err.clone()) { + return Rc::new(ParamResult { + param: dummy_param.clone(), + tokens: r4.tokens.clone(), + ctx: r4.ctx.clone(), + err: r4.err.clone(), + }); + } + let p = make_param_node( + &name, + type_expr, + Some(r4.expr.clone()), + start_span.clone(), + name_span, + ); + Rc::new(ParamResult { + param: p, + tokens: r4.tokens.clone(), + ctx: r4.ctx.clone(), + err: None, + }) + } + EatResult::EatUnchanged { tokens: __eu, .. } => { + let p = make_param_node(&name, type_expr, None, start_span.clone(), name_span); + Rc::new(ParamResult { + param: p, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }) + } + } + } } pub fn parse_block(tokens: &Rc>>, ctx: &Rc) -> Rc { { let dummy_expr = parse_recovery_placeholder(); -let block_span = token_span(tokens.clone().first().cloned()); -let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectLBrace)); -if has_err(r.err.clone()) { + let block_span = token_span(tokens.clone().first().cloned()); + let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectLBrace)); + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let tokens = skip_newlines(r.tokens.clone()); -let r = parse_stmts(tokens.clone(), ctx.clone()); -if has_err(r.err.clone()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let tokens = skip_newlines(r.tokens.clone()); + let r = parse_stmts(tokens.clone(), ctx.clone()); + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let stmts = r.stmts.clone(); -let tokens = skip_newlines(r.tokens.clone()); -let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); -if has_err(r.err.clone()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let stmts = r.stmts.clone(); + let tokens = skip_newlines(r.tokens.clone()); + let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); } -if ((stmts.clone().len() as i64) == 1) { + if ((stmts.clone().len() as i64) == 1) { Rc::new(ExprResult { - expr: stmts.clone().first().cloned().clone().unwrap(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: None, -}) + expr: stmts.clone().first().cloned().clone().unwrap(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: None, + }) } else { Rc::new(ExprResult { - expr: make_expr_node(Rc::new(ExprData::ExprBlock), stmts.clone(), None, block_span), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: None, -}) + expr: make_expr_node( + Rc::new(ExprData::ExprBlock), + stmts.clone(), + None, + block_span, + ), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: None, + }) } -} + } } pub fn parse_stmts(tokens: Rc>>, ctx: Rc) -> Rc { parse_stmts_acc(tokens, ctx, Rc::new(vec![])) } -pub fn parse_stmts_acc(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { +pub fn parse_stmts_acc( + mut tokens: Rc>>, + mut ctx: Rc, + mut acc: Rc>>, +) -> Rc { loop { tokens = skip_newlines(tokens.clone()); -if (tok_is_rbrace(tokens.clone().first().cloned()) || tok_is_eof(tokens.clone().first().cloned())) { + if (tok_is_rbrace(tokens.clone().first().cloned()) + || tok_is_eof(tokens.clone().first().cloned())) + { break Rc::new(StmtsResult { - stmts: acc.clone(), - tokens: tokens.clone(), - ctx: ctx, - err: None, -}); -} else { + stmts: acc.clone(), + tokens: tokens.clone(), + ctx: ctx, + err: None, + }); + } else { let r = parse_stmt(&tokens, ctx); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(StmtsResult { - stmts: acc.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) + stmts: acc.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); } -{ + { let __tco_0 = r.tokens.clone(); -let __tco_1 = r.ctx.clone(); -let __tco_2 = v2_rt::rc_list_push(acc, r.expr.clone()); -tokens = __tco_0; -ctx = __tco_1; -acc = __tco_2; -continue; -} -} -} + let __tco_1 = r.ctx.clone(); + let __tco_2 = v2_rt::rc_list_push(acc, r.expr.clone()); + tokens = __tco_0; + ctx = __tco_1; + acc = __tco_2; + continue; + } + } + } } pub fn parse_stmt(tokens: &Rc>>, ctx: Rc) -> Rc { { let tok = tokens.clone().first().cloned(); -let sh = match tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, -}; -match sh { - Some(TokenShape::ShKeyword) => { - let kw_text = tok_keyword_text(tok.clone()); -if (kw_text.clone().as_str() == "let".to_string().as_str()) { - parse_let(&tokens, &ctx) - } else { - if (kw_text.clone().as_str() == "return".to_string().as_str()) { - parse_return(&tokens, &ctx) + let sh = match tok.clone() { + Some(t) => Some(t.shape.clone()), + None => None, + }; + match sh { + Some(TokenShape::ShKeyword) => { + let kw_text = tok_keyword_text(tok.clone()); + if (kw_text.clone().as_str() == "let".to_string().as_str()) { + parse_let(&tokens, &ctx) } else { - if peek_is_eq_after_ident(tokens.clone()) { - parse_bare_assignment(&tokens, &ctx) + if (kw_text.clone().as_str() == "return".to_string().as_str()) { + parse_return(&tokens, &ctx) } else { - parse_expr(tokens.clone(), ctx) + if peek_is_eq_after_ident(tokens.clone()) { + parse_bare_assignment(&tokens, &ctx) + } else { + parse_expr(tokens.clone(), ctx) + } } } } -}, - Some(TokenShape::ShIdent) => if (peek_text_is(tokens.clone(), "node".to_string()) && peek_is_node_decl(&tokens)) { - parse_node_decl(&tokens, &ctx) - } else { - if peek_is_eq_after_ident(tokens.clone()) { - parse_bare_assignment(&tokens, &ctx) - } else { - if is_constraint_bracket_after_ident(&tokens) { - parse_constrained_assignment(&tokens, &ctx) + Some(TokenShape::ShIdent) => { + if (peek_text_is(tokens.clone(), "node".to_string()) && peek_is_node_decl(&tokens)) + { + parse_node_decl(&tokens, &ctx) } else { - parse_expr(tokens.clone(), ctx) + if peek_is_eq_after_ident(tokens.clone()) { + parse_bare_assignment(&tokens, &ctx) + } else { + if is_constraint_bracket_after_ident(&tokens) { + parse_constrained_assignment(&tokens, &ctx) + } else { + parse_expr(tokens.clone(), ctx) + } + } } } - }, - _ => parse_expr(tokens.clone(), ctx), -} -} + _ => parse_expr(tokens.clone(), ctx), + } + } } pub fn peek_is_eq_after_ident(tokens: Rc>>) -> bool { match tokens.get(1 as usize).cloned() { - Some(t) => is_eq_shape(t.shape.clone()), - None => false, -} + Some(t) => is_eq_shape(t.shape.clone()), + None => false, + } } pub fn peek_is_node_decl(tokens: &Rc>>) -> bool { { let t1 = tokens.clone().get(1 as usize).cloned(); -let t2 = tokens.clone().get(2 as usize).cloned(); -let name_ok = match t1 { - Some(t) => (is_ident_shape(t.shape.clone()) || is_name_keyword(&t)), - None => false, -}; -let decl_ok = match t2 { - Some(t) => ((is_colon_shape(t.shape.clone()) || is_lbracket_shape(t.shape.clone())) || is_eq_shape(t.shape.clone())), - None => false, -}; -(name_ok && decl_ok) -} + let t2 = tokens.clone().get(2 as usize).cloned(); + let name_ok = match t1 { + Some(t) => (is_ident_shape(t.shape.clone()) || is_name_keyword(&t)), + None => false, + }; + let decl_ok = match t2 { + Some(t) => { + ((is_colon_shape(t.shape.clone()) || is_lbracket_shape(t.shape.clone())) + || is_eq_shape(t.shape.clone())) + } + None => false, + }; + (name_ok && decl_ok) + } } pub fn is_constraint_bracket_after_ident(tokens: &Rc>>) -> bool { match tokens.clone().get(1 as usize).cloned() { - Some(t) => (is_lbracket_shape(t.shape.clone()) && is_constraint_bracket(Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()))), - None => false, -} + Some(t) => { + (is_lbracket_shape(t.shape.clone()) + && is_constraint_bracket(Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ))) + } + None => false, + } } -pub fn parse_constrained_assignment(tokens: &Rc>>, ctx: &Rc) -> Rc { +pub fn parse_constrained_assignment( + tokens: &Rc>>, + ctx: &Rc, +) -> Rc { { let span = token_span(tokens.clone().first().cloned()); -let dummy_expr = parse_recovery_placeholder(); -let r = expect_name(&tokens); -if has_err(r.err.clone()) { + let dummy_expr = parse_recovery_placeholder(); + let r = expect_name(&tokens); + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let name = r.name.clone(); -let name_span = r.span.clone(); -let cr = try_constraint_annotations(&r.tokens.clone(), ctx.clone()); -if has_err(cr.err.clone()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let name = r.name.clone(); + let name_span = r.span.clone(); + let cr = try_constraint_annotations(&r.tokens.clone(), ctx.clone()); + if has_err(cr.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: cr.tokens.clone(), - ctx: cr.ctx.clone(), - err: cr.err.clone(), -}) - } -let r2 = expect(&cr.tokens.clone(), &Rc::new(ExpectedToken::ExpectEq)); -if has_err(r2.err.clone()) { + expr: dummy_expr.clone(), + tokens: cr.tokens.clone(), + ctx: cr.ctx.clone(), + err: cr.err.clone(), + }); + } + let r2 = expect(&cr.tokens.clone(), &Rc::new(ExpectedToken::ExpectEq)); + if has_err(r2.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r2.tokens.clone(), - ctx: cr.ctx.clone(), - err: r2.err.clone(), -}) - } -let r3 = parse_expr(r2.tokens.clone(), cr.ctx.clone()); -if has_err(r3.err.clone()) { - return r3.clone() - } -let node = make_named_expr_node(&name, Rc::new(ExprData::ExprLet), Rc::new(vec![r3.expr.clone()]), None, span, name_span); -let node = Rc::new(Node { - name: node.name.clone(), - span: node.span.clone(), - ident_span: node.ident_span.clone(), - children: node.children.clone(), - params: node.params.clone(), - inferred: node.inferred.clone(), - return_cardinality: node.return_cardinality.clone(), - uses: node.uses.clone(), - body: node.body.clone(), - connective: node.connective.clone(), - transport: node.transport.clone(), - properties: cr.constraints.clone(), - type_annotation: node.type_annotation.clone(), - is_self_recursive: node.is_self_recursive.clone(), - has_non_tail_self_call: node.has_non_tail_self_call.clone(), - match_pattern: node.match_pattern.clone(), - expr_data: node.expr_data.clone(), - ident: None, -}); -Rc::new(ExprResult { - expr: node.clone(), - tokens: r3.tokens.clone(), - ctx: r3.ctx.clone(), - err: None, -}) -} + expr: dummy_expr.clone(), + tokens: r2.tokens.clone(), + ctx: cr.ctx.clone(), + err: r2.err.clone(), + }); + } + let r3 = parse_expr(r2.tokens.clone(), cr.ctx.clone()); + if has_err(r3.err.clone()) { + return r3.clone(); + } + let node = make_named_expr_node( + &name, + Rc::new(ExprData::ExprLet), + Rc::new(vec![r3.expr.clone()]), + None, + span, + name_span, + ); + let node = Rc::new(Node { + name: node.name.clone(), + span: node.span.clone(), + ident_span: node.ident_span.clone(), + children: node.children.clone(), + params: node.params.clone(), + inferred: node.inferred.clone(), + return_cardinality: node.return_cardinality.clone(), + uses: node.uses.clone(), + body: node.body.clone(), + connective: node.connective.clone(), + transport: node.transport.clone(), + properties: cr.constraints.clone(), + type_annotation: node.type_annotation.clone(), + is_self_recursive: node.is_self_recursive.clone(), + has_non_tail_self_call: node.has_non_tail_self_call.clone(), + match_pattern: node.match_pattern.clone(), + expr_data: node.expr_data.clone(), + ident: None, + }); + Rc::new(ExprResult { + expr: node.clone(), + tokens: r3.tokens.clone(), + ctx: r3.ctx.clone(), + err: None, + }) + } } pub fn peek_text_is(tokens: Rc>>, expected: String) -> bool { match tokens.first().cloned() { - Some(t) => (is_ident_shape(t.shape.clone()) && (t.text.clone().as_str() == expected.as_str())), - None => false, -} + Some(t) => { + (is_ident_shape(t.shape.clone()) && (t.text.clone().as_str() == expected.as_str())) + } + None => false, + } } pub fn parse_node_decl(tokens: &Rc>>, ctx: &Rc) -> Rc { { let span = token_span(tokens.clone().first().cloned()); -let dummy_expr = parse_recovery_placeholder(); -let tokens = Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()); -let r = expect_name(&tokens); -if has_err(r.err.clone()) { + let dummy_expr = parse_recovery_placeholder(); + let tokens = Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ); + let r = expect_name(&tokens); + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let name = r.name.clone(); -let name_span = r.span.clone(); -let cr = try_constraint_annotations(&r.tokens.clone(), ctx.clone()); -if has_err(cr.err.clone()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let name = r.name.clone(); + let name_span = r.span.clone(); + let cr = try_constraint_annotations(&r.tokens.clone(), ctx.clone()); + if has_err(cr.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: cr.tokens.clone(), - ctx: cr.ctx.clone(), - err: cr.err.clone(), -}) - } -let e_colon = eat(&cr.tokens.clone(), Rc::new(ExpectedToken::ExpectColon)); -let tokens = match (*e_colon.clone()).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), - EatResult::EatUnchanged { .. } => { - let r2 = expect(&cr.tokens.clone(), &Rc::new(ExpectedToken::ExpectEq)); -if has_err(r2.err.clone()) { - return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r2.tokens.clone(), - ctx: cr.ctx.clone(), - err: r2.err.clone(), -}) - } -r2.tokens.clone() -}, -}; -let r3 = parse_expr(tokens.clone(), cr.ctx.clone()); -if has_err(r3.err.clone()) { - return r3.clone() + expr: dummy_expr.clone(), + tokens: cr.tokens.clone(), + ctx: cr.ctx.clone(), + err: cr.err.clone(), + }); + } + let e_colon = eat(&cr.tokens.clone(), Rc::new(ExpectedToken::ExpectColon)); + let tokens = match (*e_colon.clone()).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), + EatResult::EatUnchanged { .. } => { + let r2 = expect(&cr.tokens.clone(), &Rc::new(ExpectedToken::ExpectEq)); + if has_err(r2.err.clone()) { + return Rc::new(ExprResult { + expr: dummy_expr.clone(), + tokens: r2.tokens.clone(), + ctx: cr.ctx.clone(), + err: r2.err.clone(), + }); + } + r2.tokens.clone() + } + }; + let r3 = parse_expr(tokens.clone(), cr.ctx.clone()); + if has_err(r3.err.clone()) { + return r3.clone(); } -let ret = parse_optional_inferred(&r3.tokens.clone(), r3.ctx.clone()); -if has_err(ret.err.clone()) { + let ret = parse_optional_inferred(&r3.tokens.clone(), r3.ctx.clone()); + if has_err(ret.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: ret.tokens.clone(), - ctx: ret.ctx.clone(), - err: ret.err.clone(), -}) - } -let type_ann = match (*e_colon.clone()).clone() { - EatResult::EatConsumed { .. } => Some(r3.expr.clone()), - EatResult::EatUnchanged { .. } => None, -}; -let node = Rc::new(Node { - name: name, - span: span, - ident_span: Some(name_span), - children: Rc::new(vec![r3.expr.clone()]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: ret.inferred.clone(), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: cr.constraints.clone(), - type_annotation: type_ann, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::ExprLet), - ident: None, -}); -Rc::new(ExprResult { - expr: node, - tokens: ret.tokens.clone(), - ctx: ret.ctx.clone(), - err: None, -}) -} + expr: dummy_expr.clone(), + tokens: ret.tokens.clone(), + ctx: ret.ctx.clone(), + err: ret.err.clone(), + }); + } + let type_ann = match (*e_colon.clone()).clone() { + EatResult::EatConsumed { .. } => Some(r3.expr.clone()), + EatResult::EatUnchanged { .. } => None, + }; + let node = Rc::new(Node { + name: name, + span: span, + ident_span: Some(name_span), + children: Rc::new(vec![r3.expr.clone()]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: ret.inferred.clone(), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: cr.constraints.clone(), + type_annotation: type_ann, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::ExprLet), + ident: None, + }); + Rc::new(ExprResult { + expr: node, + tokens: ret.tokens.clone(), + ctx: ret.ctx.clone(), + err: None, + }) + } } -pub fn parse_bare_assignment(tokens: &Rc>>, ctx: &Rc) -> Rc { +pub fn parse_bare_assignment( + tokens: &Rc>>, + ctx: &Rc, +) -> Rc { { let span = token_span(tokens.clone().first().cloned()); -let dummy_expr = parse_recovery_placeholder(); -let r = expect_name(&tokens); -if has_err(r.err.clone()) { + let dummy_expr = parse_recovery_placeholder(); + let r = expect_name(&tokens); + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let name = r.name.clone(); -let name_span = r.span.clone(); -let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectEq)); -if has_err(r2.err.clone()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let name = r.name.clone(); + let name_span = r.span.clone(); + let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectEq)); + if has_err(r2.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), -}) - } -let r3 = parse_expr(r2.tokens.clone(), ctx.clone()); -if has_err(r3.err.clone()) { - return r3.clone() - } -let cr = try_constraint_annotations(&r3.tokens.clone(), r3.ctx.clone()); -if has_err(cr.err.clone()) { + expr: dummy_expr.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), + }); + } + let r3 = parse_expr(r2.tokens.clone(), ctx.clone()); + if has_err(r3.err.clone()) { + return r3.clone(); + } + let cr = try_constraint_annotations(&r3.tokens.clone(), r3.ctx.clone()); + if has_err(cr.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: cr.tokens.clone(), - ctx: cr.ctx.clone(), - err: cr.err.clone(), -}) - } -let node = make_named_expr_node(&name, Rc::new(ExprData::ExprLet), Rc::new(vec![r3.expr.clone()]), None, span, name_span); -if ((cr.constraints.clone().len() as i64) > 0) { + expr: dummy_expr.clone(), + tokens: cr.tokens.clone(), + ctx: cr.ctx.clone(), + err: cr.err.clone(), + }); + } + let node = make_named_expr_node( + &name, + Rc::new(ExprData::ExprLet), + Rc::new(vec![r3.expr.clone()]), + None, + span, + name_span, + ); + if ((cr.constraints.clone().len() as i64) > 0) { { let node = Rc::new(Node { - name: node.name.clone(), - span: node.span.clone(), - ident_span: node.ident_span.clone(), - children: node.children.clone(), - params: node.params.clone(), - inferred: node.inferred.clone(), - return_cardinality: node.return_cardinality.clone(), - uses: node.uses.clone(), - body: node.body.clone(), - connective: node.connective.clone(), - transport: node.transport.clone(), - properties: cr.constraints.clone(), - type_annotation: node.type_annotation.clone(), - is_self_recursive: node.is_self_recursive.clone(), - has_non_tail_self_call: node.has_non_tail_self_call.clone(), - match_pattern: node.match_pattern.clone(), - expr_data: node.expr_data.clone(), - ident: None, -}); -Rc::new(ExprResult { - expr: node.clone(), - tokens: cr.tokens.clone(), - ctx: cr.ctx.clone(), - err: None, -}) -} + name: node.name.clone(), + span: node.span.clone(), + ident_span: node.ident_span.clone(), + children: node.children.clone(), + params: node.params.clone(), + inferred: node.inferred.clone(), + return_cardinality: node.return_cardinality.clone(), + uses: node.uses.clone(), + body: node.body.clone(), + connective: node.connective.clone(), + transport: node.transport.clone(), + properties: cr.constraints.clone(), + type_annotation: node.type_annotation.clone(), + is_self_recursive: node.is_self_recursive.clone(), + has_non_tail_self_call: node.has_non_tail_self_call.clone(), + match_pattern: node.match_pattern.clone(), + expr_data: node.expr_data.clone(), + ident: None, + }); + Rc::new(ExprResult { + expr: node.clone(), + tokens: cr.tokens.clone(), + ctx: cr.ctx.clone(), + err: None, + }) + } } else { Rc::new(ExprResult { - expr: node.clone(), - tokens: cr.tokens.clone(), - ctx: cr.ctx.clone(), - err: None, -}) + expr: node.clone(), + tokens: cr.tokens.clone(), + ctx: cr.ctx.clone(), + err: None, + }) } -} + } } pub fn parse_expr(tokens: Rc>>, ctx: Rc) -> Rc { parse_expr_bp(tokens, ctx, 0) } -pub fn parse_expr_bp(tokens: Rc>>, ctx: Rc, min_bp: i64) -> Rc { +pub fn parse_expr_bp( + tokens: Rc>>, + ctx: Rc, + min_bp: i64, +) -> Rc { { let r = parse_prefix(&tokens, ctx); -if has_err(r.err.clone()) { - return r.clone() + if has_err(r.err.clone()) { + return r.clone(); } -let lhs = r.expr.clone(); -parse_expr_loop(r.tokens.clone(), r.ctx.clone(), lhs, min_bp) -} + let lhs = r.expr.clone(); + parse_expr_loop(r.tokens.clone(), r.ctx.clone(), lhs, min_bp) + } } -pub fn parse_expr_loop(mut tokens: Rc>>, mut ctx: Rc, mut lhs: Rc, mut min_bp: i64) -> Rc { +pub fn parse_expr_loop( + mut tokens: Rc>>, + mut ctx: Rc, + mut lhs: Rc, + mut min_bp: i64, +) -> Rc { loop { if tok_is_eof(tokens.clone().first().cloned()) { break Rc::new(ExprResult { - expr: lhs.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}); -} else { + expr: lhs.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }); + } else { let loop_span = token_span(tokens.clone().first().cloned()); -tokens = skip_continuation_newlines(&tokens); -let post = try_postfix(&tokens, &ctx, &lhs, min_bp.clone()); -if has_err(post.err.clone()) { + tokens = skip_continuation_newlines(&tokens); + let post = try_postfix(&tokens, &ctx, &lhs, min_bp.clone()); + if has_err(post.err.clone()) { break Rc::new(ExprResult { - expr: lhs.clone(), - tokens: post.tokens.clone(), - ctx: post.ctx.clone(), - err: post.err.clone(), -}); -} else { + expr: lhs.clone(), + tokens: post.tokens.clone(), + ctx: post.ctx.clone(), + err: post.err.clone(), + }); + } else { if post.changed.clone() { { let __tco_0 = post.tokens.clone(); -let __tco_1 = post.ctx.clone(); -let __tco_2 = post.expr.clone(); -tokens = __tco_0; -ctx = __tco_1; -lhs = __tco_2; -continue; -} -} else { + let __tco_1 = post.ctx.clone(); + let __tco_2 = post.expr.clone(); + tokens = __tco_0; + ctx = __tco_1; + lhs = __tco_2; + continue; + } + } else { let bp = infix_bp(tokens.clone()); -match bp { - Some(bps) => { if (bps.left.clone() < min_bp.clone()) { - break Rc::new(ExprResult { - expr: lhs.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}); -} else { - match (*advance(&tokens)).clone() { - AdvanceResult::AdvanceOk { token: op_tok, tokens: rest, .. } => { let op_shape = op_tok.shape.clone(); -if is_dot_shape(op_shape.clone()) { - let r = expect_name(&rest); -if has_err(r.err.clone()) { - return Rc::new(ExprResult { - expr: lhs.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let new_lhs = make_named_expr_node(&r.name.clone(), Rc::new(ExprData::ExprFieldAccess { - summary: None, -}), Rc::new(vec![lhs.clone()]), None, loop_span, r.span.clone()); -{ - let __tco_0 = r.tokens.clone(); -let __tco_1 = new_lhs; -tokens = __tco_0; -lhs = __tco_1; -continue; -} -} else { - if is_pipe_arrow_shape(op_shape.clone()) { - let r = parse_pipe_rhs(&rest, &ctx, lhs.clone(), loop_span); -if has_err(r.err.clone()) { - return Rc::new(ExprResult { - expr: r.expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -{ - let __tco_0 = r.tokens.clone(); -let __tco_1 = r.ctx.clone(); -let __tco_2 = r.expr.clone(); -tokens = __tco_0; -ctx = __tco_1; -lhs = __tco_2; -continue; -} -} else { - tokens = skip_newlines(rest.clone()); -let r = parse_expr_bp(tokens.clone(), ctx.clone(), bps.right.clone()); -if has_err(r.err.clone()) { - return Rc::new(ExprResult { - expr: r.expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) + match bp { + Some(bps) => { + if (bps.left.clone() < min_bp.clone()) { + break Rc::new(ExprResult { + expr: lhs.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }); + } else { + match (*advance(&tokens)).clone() { + AdvanceResult::AdvanceOk { + token: op_tok, + tokens: rest, + .. + } => { + let op_shape = op_tok.shape.clone(); + if is_dot_shape(op_shape.clone()) { + let r = expect_name(&rest); + if has_err(r.err.clone()) { + return Rc::new(ExprResult { + expr: lhs.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let new_lhs = make_named_expr_node( + &r.name.clone(), + Rc::new(ExprData::ExprFieldAccess { + summary: None, + }), + Rc::new(vec![lhs.clone()]), + None, + loop_span, + r.span.clone(), + ); + { + let __tco_0 = r.tokens.clone(); + let __tco_1 = new_lhs; + tokens = __tco_0; + lhs = __tco_1; + continue; + } + } else { + if is_pipe_arrow_shape(op_shape.clone()) { + let r = parse_pipe_rhs( + &rest, + &ctx, + lhs.clone(), + loop_span, + ); + if has_err(r.err.clone()) { + return Rc::new(ExprResult { + expr: r.expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + { + let __tco_0 = r.tokens.clone(); + let __tco_1 = r.ctx.clone(); + let __tco_2 = r.expr.clone(); + tokens = __tco_0; + ctx = __tco_1; + lhs = __tco_2; + continue; + } + } else { + tokens = skip_newlines(rest.clone()); + let r = parse_expr_bp( + tokens.clone(), + ctx.clone(), + bps.right.clone(), + ); + if has_err(r.err.clone()) { + return Rc::new(ExprResult { + expr: r.expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let binop_opt = find_operator_binop( + dag_syntax_spec().operators.clone(), + op_tok.text.clone(), + ); + match binop_opt { + Some(binop) => { + let new_lhs = make_expr_node( + Rc::new(ExprData::ExprBinOp { + op: binop.clone(), + algebra_field: None, + }), + Rc::new(vec![ + lhs.clone(), + r.expr.clone(), + ]), + None, + loop_span, + ); + { + let __tco_0 = r.tokens.clone(); + let __tco_1 = r.ctx.clone(); + let __tco_2 = new_lhs; + tokens = __tco_0; + ctx = __tco_1; + lhs = __tco_2; + continue; + } + } + None => { + break Rc::new(ExprResult { + expr: lhs.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: Some(parse_error( + v2_rt::concat( + "unknown binary operator: " + .to_string(), + op_tok.text.clone(), + ), + loop_span, + )), + }); + } + } + } + } + } + AdvanceResult::AdvanceEof => { + break Rc::new(ExprResult { + expr: lhs.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }); + } } -let binop_opt = find_operator_binop(dag_syntax_spec().operators.clone(), op_tok.text.clone()); -match binop_opt { - Some(binop) => { let new_lhs = make_expr_node(Rc::new(ExprData::ExprBinOp { - op: binop.clone(), - algebra_field: None, -}), Rc::new(vec![lhs.clone(), r.expr.clone()]), None, loop_span); -{ - let __tco_0 = r.tokens.clone(); -let __tco_1 = r.ctx.clone(); -let __tco_2 = new_lhs; -tokens = __tco_0; -ctx = __tco_1; -lhs = __tco_2; -continue; -} }, - None => { break Rc::new(ExprResult { - expr: lhs.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: Some(parse_error(v2_rt::concat("unknown binary operator: ".to_string(), op_tok.text.clone()), loop_span)), -}); }, -} -} -} }, - AdvanceResult::AdvanceEof => { break Rc::new(ExprResult { - expr: lhs.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}); }, -} -} }, - None => { break Rc::new(ExprResult { - expr: lhs.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}); }, -} -} -} -} -} + } + } + None => { + break Rc::new(ExprResult { + expr: lhs.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }); + } + } + } + } + } + } } pub fn find_operator_bp(ops: Rc>>, symbol: String) -> Option { { - let matching = Rc::new({ let mut __result = Vec::new(); for op in ops.iter().cloned() { if (op.symbol.clone().as_str() == symbol.clone().as_str()) { __result.push(op); } } __result }); -if ((matching.clone().len() as i64) > 0) { + let matching = Rc::new({ + let mut __result = Vec::new(); + for op in ops.iter().cloned() { + if (op.symbol.clone().as_str() == symbol.clone().as_str()) { + __result.push(op); + } + } + __result + }); + if ((matching.clone().len() as i64) > 0) { { let op = matching.clone().first().cloned().clone().unwrap(); -Some(BindingPower { - left: op.left_bp.clone(), - right: op.right_bp.clone(), -}) -} + Some(BindingPower { + left: op.left_bp.clone(), + right: op.right_bp.clone(), + }) + } } else { None } -} + } } pub fn infix_bp(tokens: Rc>>) -> Option { match tokens.first().cloned() { - Some(t) => find_operator_bp(dag_syntax_spec().operators.clone(), t.text.clone()), - None => None, -} + Some(t) => find_operator_bp(dag_syntax_spec().operators.clone(), t.text.clone()), + None => None, + } } pub fn find_operator_binop(ops: Rc>>, symbol: String) -> Option { { - let matching = Rc::new({ let mut __result = Vec::new(); for op in ops.iter().cloned() { if (op.symbol.clone().as_str() == symbol.clone().as_str()) { __result.push(op); } } __result }); -if ((matching.clone().len() as i64) > 0) { - matching.clone().first().cloned().clone().unwrap().binop.clone() + let matching = Rc::new({ + let mut __result = Vec::new(); + for op in ops.iter().cloned() { + if (op.symbol.clone().as_str() == symbol.clone().as_str()) { + __result.push(op); + } + } + __result + }); + if ((matching.clone().len() as i64) > 0) { + matching + .clone() + .first() + .cloned() + .clone() + .unwrap() + .binop + .clone() } else { None } -} + } } -pub fn parse_pipe_rhs(tokens: &Rc>>, ctx: &Rc, receiver: Rc, span: Rc) -> Rc { +pub fn parse_pipe_rhs( + tokens: &Rc>>, + ctx: &Rc, + receiver: Rc, + span: Rc, +) -> Rc { { let dummy_expr = parse_recovery_placeholder(); -let r = expect_name(&tokens); -if has_err(r.err.clone()) { + let r = expect_name(&tokens); + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let method = r.name.clone(); -let tokens = skip_newlines(r.tokens.clone()); -if tok_is_lparen(tokens.clone().first().cloned()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let method = r.name.clone(); + let tokens = skip_newlines(r.tokens.clone()); + if tok_is_lparen(tokens.clone().first().cloned()) { { let r2 = parse_call_args(&tokens, &ctx); -if has_err(r2.err.clone()) { + if has_err(r2.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), -}) - } -Rc::new(ExprResult { - expr: make_named_expr_node(&method, Rc::new(ExprData::ExprMethodCall { - method_semantics: None, -}), v2_rt::concat(Rc::new(vec![receiver]), Rc::new({ let mut __result = Vec::new(); for na in r2.args.clone().iter().cloned() { __result.push(make_arg_node(arg_name_at(na.clone(), ctx.source_indices.clone()), arg_value(&na), na.span.clone(), node_name_span(&na))); } __result })), None, span, r.span.clone()), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: None, -}) -} + expr: dummy_expr.clone(), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), + }); + } + Rc::new(ExprResult { + expr: make_named_expr_node( + &method, + Rc::new(ExprData::ExprMethodCall { + method_semantics: None, + }), + v2_rt::concat( + Rc::new(vec![receiver]), + Rc::new({ + let mut __result = Vec::new(); + for na in r2.args.clone().iter().cloned() { + __result.push(make_arg_node( + arg_name_at(na.clone(), ctx.source_indices.clone()), + arg_value(&na), + na.span.clone(), + node_name_span(&na), + )); + } + __result + }), + ), + None, + span, + r.span.clone(), + ), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: None, + }) + } } else { Rc::new(ExprResult { - expr: make_named_expr_node(&method, Rc::new(ExprData::ExprMethodCall { - method_semantics: None, -}), Rc::new(vec![receiver]), None, span, r.span.clone()), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}) + expr: make_named_expr_node( + &method, + Rc::new(ExprData::ExprMethodCall { + method_semantics: None, + }), + Rc::new(vec![receiver]), + None, + span, + r.span.clone(), + ), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }) } -} + } } pub fn parse_prefix(tokens: &Rc>>, ctx: Rc) -> Rc { { let tok = tokens.clone().first().cloned(); -let sh = match tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, -}; -let span = token_span(tok.clone()); -match sh { - Some(TokenShape::ShBang) => { - let r = parse_expr_bp(Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), ctx, 12); -if has_err(r.err.clone()) { - return Rc::new(ExprResult { - expr: r.expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -Rc::new(ExprResult { - expr: make_expr_node(Rc::new(ExprData::ExprUnaryOp { - op: UnaryOpKind::Not, -}), Rc::new(vec![r.expr.clone()]), None, span), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -}, - Some(TokenShape::ShMinus) => { - let r = parse_expr_bp(Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), ctx, 12); -if has_err(r.err.clone()) { - return Rc::new(ExprResult { - expr: r.expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -Rc::new(ExprResult { - expr: make_expr_node(Rc::new(ExprData::ExprUnaryOp { - op: UnaryOpKind::Neg, -}), Rc::new(vec![r.expr.clone()]), None, span), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -}, - _ => parse_primary(&tokens, &ctx), -} -} + let sh = match tok.clone() { + Some(t) => Some(t.shape.clone()), + None => None, + }; + let span = token_span(tok.clone()); + match sh { + Some(TokenShape::ShBang) => { + let r = parse_expr_bp( + Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + ctx, + 12, + ); + if has_err(r.err.clone()) { + return Rc::new(ExprResult { + expr: r.expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + Rc::new(ExprResult { + expr: make_expr_node( + Rc::new(ExprData::ExprUnaryOp { + op: UnaryOpKind::Not, + }), + Rc::new(vec![r.expr.clone()]), + None, + span, + ), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } + Some(TokenShape::ShMinus) => { + let r = parse_expr_bp( + Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + ctx, + 12, + ); + if has_err(r.err.clone()) { + return Rc::new(ExprResult { + expr: r.expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + Rc::new(ExprResult { + expr: make_expr_node( + Rc::new(ExprData::ExprUnaryOp { + op: UnaryOpKind::Neg, + }), + Rc::new(vec![r.expr.clone()]), + None, + span, + ), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } + _ => parse_primary(&tokens, &ctx), + } + } } pub fn parse_primary(tokens: &Rc>>, ctx: &Rc) -> Rc { { let tok = tokens.clone().first().cloned(); -let sh = match tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, -}; -let span = token_span(tok.clone()); -match sh.clone() { - Some(TokenShape::ShKeyword) => { - let kw_text = tok.clone().unwrap().text.clone(); -let lit_val = v2_rt::lookup(&dag_syntax_spec().keyword_literals.clone(), kw_text.clone()); -match lit_val { - Some(lv) => Rc::new(ExprResult { - expr: make_expr_node(Rc::new(ExprData::ExprLiteral { - value: lv.clone(), -}), Rc::new(vec![]), None, span.clone()), - tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), - ctx: ctx.clone(), - err: None, -}), - None => if (kw_text.clone().as_str() == "match".to_string().as_str()) { - parse_match(&tokens, &ctx) - } else { - if (kw_text.clone().as_str() == "if".to_string().as_str()) { - parse_if(&tokens, &ctx) - } else { - if (kw_text.clone().as_str() == "for".to_string().as_str()) { - parse_for(&tokens, &ctx) - } else { - if (kw_text.clone().as_str() == "let".to_string().as_str()) { - parse_let(&tokens, &ctx) + let sh = match tok.clone() { + Some(t) => Some(t.shape.clone()), + None => None, + }; + let span = token_span(tok.clone()); + match sh.clone() { + Some(TokenShape::ShKeyword) => { + let kw_text = tok.clone().unwrap().text.clone(); + let lit_val = + v2_rt::lookup(&dag_syntax_spec().keyword_literals.clone(), kw_text.clone()); + match lit_val { + Some(lv) => Rc::new(ExprResult { + expr: make_expr_node( + Rc::new(ExprData::ExprLiteral { value: lv.clone() }), + Rc::new(vec![]), + None, + span.clone(), + ), + tokens: Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + ctx: ctx.clone(), + err: None, + }), + None => { + if (kw_text.clone().as_str() == "match".to_string().as_str()) { + parse_match(&tokens, &ctx) } else { - if (kw_text.clone().as_str() == "return".to_string().as_str()) { - parse_return(&tokens, &ctx) + if (kw_text.clone().as_str() == "if".to_string().as_str()) { + parse_if(&tokens, &ctx) } else { - if (kw_text.clone().as_str() == "fn".to_string().as_str()) { - parse_fn_lambda(&tokens, &ctx) + if (kw_text.clone().as_str() == "for".to_string().as_str()) { + parse_for(&tokens, &ctx) } else { - { - let kw_name = tok_keyword_to_name(tok.clone()); -match kw_name { + if (kw_text.clone().as_str() == "let".to_string().as_str()) { + parse_let(&tokens, &ctx) + } else { + if (kw_text.clone().as_str() + == "return".to_string().as_str()) + { + parse_return(&tokens, &ctx) + } else { + if (kw_text.clone().as_str() + == "fn".to_string().as_str()) + { + parse_fn_lambda(&tokens, &ctx) + } else { + { + let kw_name = tok_keyword_to_name(tok.clone()); + match kw_name { Some(n) => parse_ident_expr(&tokens, ctx.clone(), &n), None => Rc::new(ExprResult { expr: parse_recovery_expr(span.clone(), format!("expected expression, found keyword '{}'", kw_text.clone())), @@ -8644,389 +10611,519 @@ match kw_name { err: Some(parse_error(format!("expected expression, found keyword '{}'", kw_text.clone()), span.clone())), }), } -} + } + } + } + } } } } } } - }, -} -}, - Some(TokenShape::ShLitInt) => { - let n_opt = v2_rt::parse_int(tok.clone().unwrap().text.clone()); -let n = match n_opt { - Some(v) => v.clone(), - None => return Rc::new(ExprResult { - expr: make_expr_error_node(ExprErrorKind::InternalExprError, &v2_rt::concat(v2_rt::concat("internal: ShLitInt token text not parseable as int: '".to_string(), tok.clone().unwrap().text.clone()), "'".to_string()), &span), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}), -}; -Rc::new(ExprResult { - expr: make_expr_node(Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitInt { - value: n.clone(), -}), -}), Rc::new(vec![]), None, span.clone()), - tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), - ctx: ctx.clone(), - err: None, -}) -}, - Some(TokenShape::ShLitFloat) => { - let f = tok.clone().unwrap().text.clone(); -Rc::new(ExprResult { - expr: make_expr_node(Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitFloat { - value: f, -}), -}), Rc::new(vec![]), None, span.clone()), - tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), - ctx: ctx.clone(), - err: None, -}) -}, - Some(TokenShape::ShLitStr) => { - let s = tok.clone().unwrap().text.clone(); -Rc::new(ExprResult { - expr: make_expr_node(Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitStr { - value: s, -}), -}), Rc::new(vec![]), None, span.clone()), - tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), - ctx: ctx.clone(), - err: None, -}) -}, - Some(TokenShape::ShStrBegin) => parse_string_interp(&tokens, ctx.clone()), - Some(TokenShape::ShIdent) => { - let n = tok.clone().unwrap().text.clone(); -parse_ident_expr(&tokens, ctx.clone(), &n) -}, - Some(TokenShape::ShLParen) => parse_paren_expr(&tokens, &ctx), - Some(TokenShape::ShLBracket) => parse_list_literal(&tokens, &ctx), - Some(TokenShape::ShLBrace) => parse_brace_expr(&tokens, ctx.clone()), - _ => { - let tag = match sh.clone() { - Some(shape) => shape_display_name(shape.clone()), - None => "EOF".to_string(), -}; -Rc::new(ExprResult { - expr: parse_recovery_expr(span.clone(), format!("expected expression, found {}", tag.clone())), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: Some(parse_error(format!("expected expression, found {}", tag.clone()), span.clone())), -}) -}, -} -} + } + Some(TokenShape::ShLitInt) => { + let n_opt = v2_rt::parse_int(tok.clone().unwrap().text.clone()); + let n = match n_opt { + Some(v) => v.clone(), + None => { + return Rc::new(ExprResult { + expr: make_expr_error_node( + ExprErrorKind::InternalExprError, + &v2_rt::concat( + v2_rt::concat( + "internal: ShLitInt token text not parseable as int: '" + .to_string(), + tok.clone().unwrap().text.clone(), + ), + "'".to_string(), + ), + &span, + ), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }) + } + }; + Rc::new(ExprResult { + expr: make_expr_node( + Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitInt { value: n.clone() }), + }), + Rc::new(vec![]), + None, + span.clone(), + ), + tokens: Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + ctx: ctx.clone(), + err: None, + }) + } + Some(TokenShape::ShLitFloat) => { + let f = tok.clone().unwrap().text.clone(); + Rc::new(ExprResult { + expr: make_expr_node( + Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitFloat { value: f }), + }), + Rc::new(vec![]), + None, + span.clone(), + ), + tokens: Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + ctx: ctx.clone(), + err: None, + }) + } + Some(TokenShape::ShLitStr) => { + let s = tok.clone().unwrap().text.clone(); + Rc::new(ExprResult { + expr: make_expr_node( + Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitStr { value: s }), + }), + Rc::new(vec![]), + None, + span.clone(), + ), + tokens: Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + ctx: ctx.clone(), + err: None, + }) + } + Some(TokenShape::ShStrBegin) => parse_string_interp(&tokens, ctx.clone()), + Some(TokenShape::ShIdent) => { + let n = tok.clone().unwrap().text.clone(); + parse_ident_expr(&tokens, ctx.clone(), &n) + } + Some(TokenShape::ShLParen) => parse_paren_expr(&tokens, &ctx), + Some(TokenShape::ShLBracket) => parse_list_literal(&tokens, &ctx), + Some(TokenShape::ShLBrace) => parse_brace_expr(&tokens, ctx.clone()), + _ => { + let tag = match sh.clone() { + Some(shape) => shape_display_name(shape.clone()), + None => "EOF".to_string(), + }; + Rc::new(ExprResult { + expr: parse_recovery_expr( + span.clone(), + format!("expected expression, found {}", tag.clone()), + ), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: Some(parse_error( + format!("expected expression, found {}", tag.clone()), + span.clone(), + )), + }) + } + } + } } pub fn parse_lambda_body(tokens: &Rc>>, ctx: Rc) -> Rc { { let tokens = skip_newlines(tokens.clone()); -let tok = tokens.clone().first().cloned(); -let is_block = (tok_is_keyword(tok.clone(), "let".to_string()) || tok_is_keyword(tok.clone(), "return".to_string())); -if is_block { + let tok = tokens.clone().first().cloned(); + let is_block = (tok_is_keyword(tok.clone(), "let".to_string()) + || tok_is_keyword(tok.clone(), "return".to_string())); + if is_block { { let r = parse_lambda_stmts(tokens.clone(), ctx, Rc::new(vec![])); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: parse_recovery_placeholder(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let span = token_span(tokens.clone().first().cloned()); -if ((r.stmts.clone().len() as i64) == 1) { + expr: parse_recovery_placeholder(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let span = token_span(tokens.clone().first().cloned()); + if ((r.stmts.clone().len() as i64) == 1) { Rc::new(ExprResult { - expr: r.stmts.clone().first().cloned().clone().unwrap(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) + expr: r.stmts.clone().first().cloned().clone().unwrap(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) } else { Rc::new(ExprResult { - expr: make_expr_node(Rc::new(ExprData::ExprBlock), r.stmts.clone(), None, span), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) + expr: make_expr_node( + Rc::new(ExprData::ExprBlock), + r.stmts.clone(), + None, + span, + ), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) } -} + } } else { parse_expr(tokens.clone(), ctx) } -} + } } -pub fn parse_lambda_stmts(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { +pub fn parse_lambda_stmts( + mut tokens: Rc>>, + mut ctx: Rc, + mut acc: Rc>>, +) -> Rc { loop { tokens = skip_newlines(tokens.clone()); -let tok = tokens.clone().first().cloned(); -if ((tok_is_rparen(tok.clone()) || tok_is_rbrace(tok.clone())) || tok_is_eof(tok.clone())) { + let tok = tokens.clone().first().cloned(); + if ((tok_is_rparen(tok.clone()) || tok_is_rbrace(tok.clone())) || tok_is_eof(tok.clone())) { break Rc::new(StmtsResult { - stmts: acc.clone(), - tokens: tokens.clone(), - ctx: ctx, - err: None, -}); -} else { + stmts: acc.clone(), + tokens: tokens.clone(), + ctx: ctx, + err: None, + }); + } else { let r = parse_stmt(&tokens, ctx); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(StmtsResult { - stmts: acc.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) + stmts: acc.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); } -{ + { let __tco_0 = r.tokens.clone(); -let __tco_1 = r.ctx.clone(); -let __tco_2 = v2_rt::rc_list_push(acc, r.expr.clone()); -tokens = __tco_0; -ctx = __tco_1; -acc = __tco_2; -continue; -} -} -} + let __tco_1 = r.ctx.clone(); + let __tco_2 = v2_rt::rc_list_push(acc, r.expr.clone()); + tokens = __tco_0; + ctx = __tco_1; + acc = __tco_2; + continue; + } + } + } } -pub fn parse_ident_expr(tokens: &Rc>>, ctx: Rc, name: &String) -> Rc { +pub fn parse_ident_expr( + tokens: &Rc>>, + ctx: Rc, + name: &String, +) -> Rc { { let span = token_span(tokens.clone().first().cloned()); -let tokens = Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()); -if tok_is_fat_arrow(tokens.clone().first().cloned()) { + let tokens = Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ); + if tok_is_fat_arrow(tokens.clone().first().cloned()) { { - let r = parse_lambda_body(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), ctx); -if has_err(r.err.clone()) { - return r.clone() + let r = parse_lambda_body( + &Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + ctx, + ); + if has_err(r.err.clone()) { + return r.clone(); } -Rc::new(ExprResult { - expr: make_expr_node(Rc::new(ExprData::ExprLambda), v2_rt::concat(Rc::new(vec![r.expr.clone()]), Rc::new(vec![parsed_name_leaf(name.clone(), span.clone())])), None, span.clone()), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -} + Rc::new(ExprResult { + expr: make_expr_node( + Rc::new(ExprData::ExprLambda), + v2_rt::concat( + Rc::new(vec![r.expr.clone()]), + Rc::new(vec![parsed_name_leaf(name.clone(), span.clone())]), + ), + None, + span.clone(), + ), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } } else { - if (is_uppercase_start(name.clone()) && tok_is_lbrace(tokens.clone().first().cloned())) { + if (is_uppercase_start(name.clone()) && tok_is_lbrace(tokens.clone().first().cloned())) + { parse_record_literal(&tokens, &ctx, name.clone(), &span) } else { Rc::new(ExprResult { - expr: make_named_expr_node(&name, Rc::new(ExprData::ExprVar { - binding_kind: None, -}), Rc::new(vec![]), None, span.clone(), span.clone()), - tokens: tokens.clone(), - ctx: ctx, - err: None, -}) + expr: make_named_expr_node( + &name, + Rc::new(ExprData::ExprVar { binding_kind: None }), + Rc::new(vec![]), + None, + span.clone(), + span.clone(), + ), + tokens: tokens.clone(), + ctx: ctx, + err: None, + }) } } -} + } } pub fn is_uppercase_start(name: String) -> bool { { let ch = v2_rt::char_at(&name, 0); -((ch.clone() >= "A".to_string()) && (ch.clone() <= "Z".to_string())) -} + ((ch.clone() >= "A".to_string()) && (ch.clone() <= "Z".to_string())) + } } -pub fn try_postfix(tokens: &Rc>>, ctx: &Rc, lhs: &Rc, min_bp: i64) -> Rc { +pub fn try_postfix( + tokens: &Rc>>, + ctx: &Rc, + lhs: &Rc, + min_bp: i64, +) -> Rc { { let tok = tokens.clone().first().cloned(); -let sh = match tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, -}; -let span = token_span(tok.clone()); -match sh { - Some(TokenShape::ShLParen) => if (14 < min_bp) { - Rc::new(PostfixResult { - expr: lhs.clone(), - changed: false, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}) - } else { - { - let r = parse_call_args(&tokens, &ctx); -if has_err(r.err.clone()) { - return Rc::new(PostfixResult { - expr: lhs.clone(), - changed: false, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let call_expr = make_call_expr(&lhs, r.args.clone(), span, ctx.source_indices.clone()); -Rc::new(PostfixResult { - expr: call_expr, - changed: true, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -} - }, - Some(TokenShape::ShIdent) => if (tok.clone().unwrap().text.clone().as_str() == "as".to_string().as_str()) { - if (13 < min_bp) { - Rc::new(PostfixResult { - expr: lhs.clone(), - changed: false, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}) - } else { - { - let r = parse_type_expr(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), &ctx); -if has_err(r.err.clone()) { - return Rc::new(PostfixResult { - expr: lhs.clone(), - changed: false, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -Rc::new(PostfixResult { - expr: make_expr_node(Rc::new(ExprData::ExprCast), Rc::new(vec![lhs.clone(), r.type_expr.clone()]), None, span), - changed: true, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -} - } - } else { - Rc::new(PostfixResult { - expr: lhs.clone(), - changed: false, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}) - }, - Some(TokenShape::ShLBracket) => if (14 < min_bp) { - Rc::new(PostfixResult { - expr: lhs.clone(), - changed: false, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}) - } else { - if is_constraint_bracket(tokens.clone()) { - Rc::new(PostfixResult { - expr: lhs.clone(), - changed: false, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}) - } else { - { - let r = parse_index_or_slice(&tokens, &ctx, lhs.clone(), span); -if has_err(r.err.clone()) { - return Rc::new(PostfixResult { - expr: lhs.clone(), - changed: false, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -Rc::new(PostfixResult { - expr: r.expr.clone(), - changed: true, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -} - } - }, - Some(TokenShape::ShLBrace) => match (*lhs.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => { - let n = expr_var_name_at(lhs.clone(), ctx.source_indices.clone()); -if (is_uppercase_start(n.clone()) && (14 <= min_bp)) { - Rc::new(PostfixResult { - expr: lhs.clone(), - changed: false, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}) - } else { - if is_uppercase_start(n.clone()) { + let sh = match tok.clone() { + Some(t) => Some(t.shape.clone()), + None => None, + }; + let span = token_span(tok.clone()); + match sh { + Some(TokenShape::ShLParen) => { + if (14 < min_bp) { + Rc::new(PostfixResult { + expr: lhs.clone(), + changed: false, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }) + } else { { - let r = parse_record_literal(&tokens, &ctx, n.clone(), &lhs.span.clone()); -if has_err(r.err.clone()) { + let r = parse_call_args(&tokens, &ctx); + if has_err(r.err.clone()) { return Rc::new(PostfixResult { - expr: lhs.clone(), - changed: false, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) + expr: lhs.clone(), + changed: false, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); } -Rc::new(PostfixResult { - expr: r.expr.clone(), - changed: true, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -} + let call_expr = + make_call_expr(&lhs, r.args.clone(), span, ctx.source_indices.clone()); + Rc::new(PostfixResult { + expr: call_expr, + changed: true, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } + } + } + Some(TokenShape::ShIdent) => { + if (tok.clone().unwrap().text.clone().as_str() == "as".to_string().as_str()) { + if (13 < min_bp) { + Rc::new(PostfixResult { + expr: lhs.clone(), + changed: false, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }) + } else { + { + let r = parse_type_expr( + &Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + &ctx, + ); + if has_err(r.err.clone()) { + return Rc::new(PostfixResult { + expr: lhs.clone(), + changed: false, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + Rc::new(PostfixResult { + expr: make_expr_node( + Rc::new(ExprData::ExprCast), + Rc::new(vec![lhs.clone(), r.type_expr.clone()]), + None, + span, + ), + changed: true, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } + } } else { Rc::new(PostfixResult { - expr: lhs.clone(), - changed: false, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}) + expr: lhs.clone(), + changed: false, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }) } } -}, - _ => Rc::new(PostfixResult { - expr: lhs.clone(), - changed: false, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}), -}, - _ => Rc::new(PostfixResult { - expr: lhs.clone(), - changed: false, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}), -} -} + Some(TokenShape::ShLBracket) => { + if (14 < min_bp) { + Rc::new(PostfixResult { + expr: lhs.clone(), + changed: false, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }) + } else { + if is_constraint_bracket(tokens.clone()) { + Rc::new(PostfixResult { + expr: lhs.clone(), + changed: false, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }) + } else { + { + let r = parse_index_or_slice(&tokens, &ctx, lhs.clone(), span); + if has_err(r.err.clone()) { + return Rc::new(PostfixResult { + expr: lhs.clone(), + changed: false, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + Rc::new(PostfixResult { + expr: r.expr.clone(), + changed: true, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } + } + } + } + Some(TokenShape::ShLBrace) => match (*lhs.expr_data.clone()).clone() { + ExprData::ExprVar { .. } => { + let n = expr_var_name_at(lhs.clone(), ctx.source_indices.clone()); + if (is_uppercase_start(n.clone()) && (14 <= min_bp)) { + Rc::new(PostfixResult { + expr: lhs.clone(), + changed: false, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }) + } else { + if is_uppercase_start(n.clone()) { + { + let r = parse_record_literal( + &tokens, + &ctx, + n.clone(), + &lhs.span.clone(), + ); + if has_err(r.err.clone()) { + return Rc::new(PostfixResult { + expr: lhs.clone(), + changed: false, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + Rc::new(PostfixResult { + expr: r.expr.clone(), + changed: true, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } + } else { + Rc::new(PostfixResult { + expr: lhs.clone(), + changed: false, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }) + } + } + } + _ => Rc::new(PostfixResult { + expr: lhs.clone(), + changed: false, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }), + }, + _ => Rc::new(PostfixResult { + expr: lhs.clone(), + changed: false, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }), + } + } } pub fn is_constraint_bracket(tokens: Rc>>) -> bool { match tokens.get(1 as usize).cloned() { - Some(t) => if is_ident_shape(t.shape.clone()) { - ((t.text.clone().as_str() == "after".to_string().as_str()) || (t.text.clone().as_str() == "when".to_string().as_str())) - } else { - false - }, - None => false, -} + Some(t) => { + if is_ident_shape(t.shape.clone()) { + ((t.text.clone().as_str() == "after".to_string().as_str()) + || (t.text.clone().as_str() == "when".to_string().as_str())) + } else { + false + } + } + None => false, + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -9037,2240 +11134,2964 @@ pub struct ConstraintsResult { pub err: Option>, } -pub fn parse_constraint_annotations(tokens: &Rc>>, ctx: Rc) -> Rc { +pub fn parse_constraint_annotations( + tokens: &Rc>>, + ctx: Rc, +) -> Rc { match (*eat(&tokens, Rc::new(ExpectedToken::ExpectLBracket))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { - let r = parse_constraint_list(__ec.clone(), ctx, Rc::new(vec![])); -if has_err(r.err.clone()) { - return r.clone() - } -let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectRBracket)); -if has_err(r2.err.clone()) { - return Rc::new(ConstraintsResult { - constraints: Rc::new(vec![]), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), -}) - } -Rc::new(ConstraintsResult { - constraints: r.constraints.clone(), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -}, - EatResult::EatUnchanged { tokens: __eu, .. } => Rc::new(ConstraintsResult { - constraints: Rc::new(vec![]), - tokens: tokens.clone(), - ctx: ctx, - err: None, -}), -} + EatResult::EatConsumed { tokens: __ec, .. } => { + let r = parse_constraint_list(__ec.clone(), ctx, Rc::new(vec![])); + if has_err(r.err.clone()) { + return r.clone(); + } + let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectRBracket)); + if has_err(r2.err.clone()) { + return Rc::new(ConstraintsResult { + constraints: Rc::new(vec![]), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), + }); + } + Rc::new(ConstraintsResult { + constraints: r.constraints.clone(), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } + EatResult::EatUnchanged { tokens: __eu, .. } => Rc::new(ConstraintsResult { + constraints: Rc::new(vec![]), + tokens: tokens.clone(), + ctx: ctx, + err: None, + }), + } } -pub fn parse_constraint_list(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { +pub fn parse_constraint_list( + mut tokens: Rc>>, + mut ctx: Rc, + mut acc: Rc>>, +) -> Rc { loop { tokens = skip_newlines(tokens.clone()); -let tok = tokens.clone().first().cloned(); -let is_constraint_kw = match tok.clone() { - Some(t) => (is_ident_shape(t.shape.clone()) && ((t.text.clone().as_str() == "after".to_string().as_str()) || (t.text.clone().as_str() == "when".to_string().as_str()))), - None => false, -}; -if !is_constraint_kw { + let tok = tokens.clone().first().cloned(); + let is_constraint_kw = match tok.clone() { + Some(t) => { + (is_ident_shape(t.shape.clone()) + && ((t.text.clone().as_str() == "after".to_string().as_str()) + || (t.text.clone().as_str() == "when".to_string().as_str()))) + } + None => false, + }; + if !is_constraint_kw { return Rc::new(ConstraintsResult { - constraints: acc.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}) - } -let kw_name = tok.clone().unwrap().text.clone(); -let r = parse_expr(Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), ctx.clone()); -if has_err(r.err.clone()) { + constraints: acc.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }); + } + let kw_name = tok.clone().unwrap().text.clone(); + let r = parse_expr( + Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + ctx.clone(), + ); + if has_err(r.err.clone()) { return Rc::new(ConstraintsResult { - constraints: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let fi = make_field_init_node(&kw_name, r.expr.clone(), make_span(0, 0), make_span(0, 0)); -acc = v2_rt::rc_list_push(acc.clone(), fi); -match (*eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { { - let __tco_0 = __ec.clone(); -let __tco_1 = r.ctx.clone(); -tokens = __tco_0; -ctx = __tco_1; -continue; -} }, - EatResult::EatUnchanged { tokens: __eu, .. } => { break Rc::new(ConstraintsResult { - constraints: acc.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}); }, -} -} -} - -pub fn try_constraint_annotations(tokens: &Rc>>, ctx: Rc) -> Rc { + constraints: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let fi = make_field_init_node(&kw_name, r.expr.clone(), make_span(0, 0), make_span(0, 0)); + acc = v2_rt::rc_list_push(acc.clone(), fi); + match (*eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { + let __tco_0 = __ec.clone(); + let __tco_1 = r.ctx.clone(); + tokens = __tco_0; + ctx = __tco_1; + continue; + } + EatResult::EatUnchanged { tokens: __eu, .. } => { + break Rc::new(ConstraintsResult { + constraints: acc.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }); + } + } + } +} + +pub fn try_constraint_annotations( + tokens: &Rc>>, + ctx: Rc, +) -> Rc { if is_constraint_bracket(tokens.clone()) { parse_constraint_annotations(&tokens, ctx) } else { Rc::new(ConstraintsResult { - constraints: Rc::new(vec![]), - tokens: tokens.clone(), - ctx: ctx, - err: None, -}) + constraints: Rc::new(vec![]), + tokens: tokens.clone(), + ctx: ctx, + err: None, + }) } } -pub fn make_call_expr(lhs: &Rc, args: Rc>>, span: Rc, source_indices: Rc>>) -> Rc { +pub fn make_call_expr( + lhs: &Rc, + args: Rc>>, + span: Rc, + source_indices: Rc>>, +) -> Rc { match (*lhs.expr_data.clone()).clone() { - ExprData::ExprVar { .. } => make_named_expr_node(&expr_var_name_at(lhs.clone(), source_indices), Rc::new(ExprData::ExprCall { - call_semantics: None, - descent_evidence: None, -}), args, None, lhs.span.clone(), node_name_span(&lhs)), - ExprData::ExprFieldAccess { .. } => make_named_expr_node(&field_access_field_at(lhs.clone(), source_indices), Rc::new(ExprData::ExprMethodCall { - method_semantics: None, -}), v2_rt::concat(Rc::new(vec![lhs.children.clone().first().cloned().clone().unwrap()]), args), None, lhs.span.clone(), node_name_span(&lhs)), - _ => make_named_expr_node(&"".to_string(), Rc::new(ExprData::ExprCall { - call_semantics: None, - descent_evidence: None, -}), args, None, lhs.span.clone(), no_span()), -} + ExprData::ExprVar { .. } => make_named_expr_node( + &expr_var_name_at(lhs.clone(), source_indices), + Rc::new(ExprData::ExprCall { + call_semantics: None, + descent_evidence: None, + }), + args, + None, + lhs.span.clone(), + node_name_span(&lhs), + ), + ExprData::ExprFieldAccess { .. } => make_named_expr_node( + &field_access_field_at(lhs.clone(), source_indices), + Rc::new(ExprData::ExprMethodCall { + method_semantics: None, + }), + v2_rt::concat( + Rc::new(vec![lhs.children.clone().first().cloned().clone().unwrap()]), + args, + ), + None, + lhs.span.clone(), + node_name_span(&lhs), + ), + _ => make_named_expr_node( + &"".to_string(), + Rc::new(ExprData::ExprCall { + call_semantics: None, + descent_evidence: None, + }), + args, + None, + lhs.span.clone(), + no_span(), + ), + } } -pub fn parse_index_or_slice(tokens: &Rc>>, ctx: &Rc, base: Rc, span: Rc) -> Rc { +pub fn parse_index_or_slice( + tokens: &Rc>>, + ctx: &Rc, + base: Rc, + span: Rc, +) -> Rc { { let dummy_expr = parse_recovery_placeholder(); -let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectLBracket)); -if has_err(r.err.clone()) { + let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectLBracket)); + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let r = parse_expr(r.tokens.clone(), ctx.clone()); -if has_err(r.err.clone()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let r = parse_expr(r.tokens.clone(), ctx.clone()); + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: r.expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let first_expr = r.expr.clone(); -let tokens = r.tokens.clone(); -let ctx = r.ctx.clone(); -if tok_is_dot_dot(tokens.clone().first().cloned()) { + expr: r.expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let first_expr = r.expr.clone(); + let tokens = r.tokens.clone(); + let ctx = r.ctx.clone(); + if tok_is_dot_dot(tokens.clone().first().cloned()) { { - let r = parse_expr(Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), ctx.clone()); -if has_err(r.err.clone()) { + let r = parse_expr( + Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + ctx.clone(), + ); + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: r.expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let end_expr = r.expr.clone(); -let r = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectRBracket)); -if has_err(r.err.clone()) { + expr: r.expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let end_expr = r.expr.clone(); + let r = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectRBracket)); + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); } -Rc::new(ExprResult { - expr: make_expr_node(Rc::new(ExprData::ExprSlice), Rc::new(vec![base, first_expr, end_expr]), None, span), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: None, -}) -} + Rc::new(ExprResult { + expr: make_expr_node( + Rc::new(ExprData::ExprSlice), + Rc::new(vec![base, first_expr, end_expr]), + None, + span, + ), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: None, + }) + } } else { { let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBracket)); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); } -Rc::new(ExprResult { - expr: make_expr_node(Rc::new(ExprData::ExprIndex), Rc::new(vec![base, first_expr]), None, span), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: None, -}) -} + Rc::new(ExprResult { + expr: make_expr_node( + Rc::new(ExprData::ExprIndex), + Rc::new(vec![base, first_expr]), + None, + span, + ), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: None, + }) + } } -} + } } pub fn parse_call_args(tokens: &Rc>>, ctx: &Rc) -> Rc { { let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectLParen)); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(ArgsResult { - args: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) + args: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); } -let tokens = skip_newlines(r.tokens.clone()); -if tok_is_rparen(tokens.clone().first().cloned()) { + let tokens = skip_newlines(r.tokens.clone()); + if tok_is_rparen(tokens.clone().first().cloned()) { Rc::new(ArgsResult { - args: Rc::new(vec![]), - tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), - ctx: ctx.clone(), - err: None, -}) + args: Rc::new(vec![]), + tokens: Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + ctx: ctx.clone(), + err: None, + }) } else { { let r = parse_arg_list(tokens.clone(), ctx.clone()); -if has_err(r.err.clone()) { - return r.clone() + if has_err(r.err.clone()) { + return r.clone(); } -let tokens = skip_newlines(r.tokens.clone()); -let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRParen)); -if has_err(r2.err.clone()) { + let tokens = skip_newlines(r.tokens.clone()); + let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRParen)); + if has_err(r2.err.clone()) { return Rc::new(ArgsResult { - args: Rc::new(vec![]), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), -}) + args: Rc::new(vec![]), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), + }); } -Rc::new(ArgsResult { - args: r.args.clone(), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -} + Rc::new(ArgsResult { + args: r.args.clone(), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } } -} + } } pub fn parse_arg_list(tokens: Rc>>, ctx: Rc) -> Rc { parse_arg_list_acc(tokens, ctx, Rc::new(vec![])) } -pub fn parse_arg_list_acc(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { +pub fn parse_arg_list_acc( + mut tokens: Rc>>, + mut ctx: Rc, + mut acc: Rc>>, +) -> Rc { loop { tokens = skip_newlines(tokens.clone()); -let r = parse_single_arg(&tokens, ctx); -if has_err(r.err.clone()) { + let r = parse_single_arg(&tokens, ctx); + if has_err(r.err.clone()) { return Rc::new(ArgsResult { - args: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -acc = v2_rt::rc_list_push(acc.clone(), r.arg.clone()); -match (*eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { tokens = skip_newlines(__ec.clone()); -if tok_is_rparen(tokens.clone().first().cloned()) { - break Rc::new(ArgsResult { - args: acc.clone(), - tokens: tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}); -} else { - { - let __tco_0 = r.ctx.clone(); -ctx = __tco_0; -continue; -} -} }, - EatResult::EatUnchanged { tokens: __eu, .. } => { break Rc::new(ArgsResult { - args: acc.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}); }, -} -} + args: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + acc = v2_rt::rc_list_push(acc.clone(), r.arg.clone()); + match (*eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { + tokens = skip_newlines(__ec.clone()); + if tok_is_rparen(tokens.clone().first().cloned()) { + break Rc::new(ArgsResult { + args: acc.clone(), + tokens: tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }); + } else { + { + let __tco_0 = r.ctx.clone(); + ctx = __tco_0; + continue; + } + } + } + EatResult::EatUnchanged { tokens: __eu, .. } => { + break Rc::new(ArgsResult { + args: acc.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }); + } + } + } } pub fn parse_single_arg(tokens: &Rc>>, ctx: Rc) -> Rc { { let span = token_span(tokens.clone().first().cloned()); -let dummy_arg = make_arg_node(None, parse_recovery_placeholder(), span.clone(), span.clone()); -let tok = tokens.clone().first().cloned(); -let is_name_token = (tok_is_ident(tok.clone()) || tok_is_keyword_name(tok.clone())); -if is_name_token { + let dummy_arg = make_arg_node( + None, + parse_recovery_placeholder(), + span.clone(), + span.clone(), + ); + let tok = tokens.clone().first().cloned(); + let is_name_token = (tok_is_ident(tok.clone()) || tok_is_keyword_name(tok.clone())); + if is_name_token { { let name_r = expect_name(&tokens); -if has_err(name_r.err.clone()) { + if has_err(name_r.err.clone()) { { let r = parse_expr(tokens.clone(), ctx); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(ArgResult { - arg: dummy_arg, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) + arg: dummy_arg, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); } -let arg = make_arg_node(None, r.expr.clone(), span.clone(), span.clone()); -Rc::new(ArgResult { - arg: arg, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -} + let arg = make_arg_node(None, r.expr.clone(), span.clone(), span.clone()); + Rc::new(ArgResult { + arg: arg, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } } else { if tok_is_colon(name_r.tokens.clone().first().cloned()) { { - let r = parse_expr(Rc::new(name_r.tokens.clone().iter().cloned().skip(1 as usize).collect::>()), ctx); -if has_err(r.err.clone()) { + let r = parse_expr( + Rc::new( + name_r + .tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + ctx, + ); + if has_err(r.err.clone()) { return Rc::new(ArgResult { - arg: dummy_arg, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) + arg: dummy_arg, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); } -let arg = make_arg_node(Some(name_r.name.clone()), r.expr.clone(), span.clone(), name_r.span.clone()); -Rc::new(ArgResult { - arg: arg, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -} + let arg = make_arg_node( + Some(name_r.name.clone()), + r.expr.clone(), + span.clone(), + name_r.span.clone(), + ); + Rc::new(ArgResult { + arg: arg, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } } else { { let r = parse_expr(tokens.clone(), ctx); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(ArgResult { - arg: dummy_arg, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) + arg: dummy_arg, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); } -let arg = make_arg_node(None, r.expr.clone(), span.clone(), span.clone()); -Rc::new(ArgResult { - arg: arg, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -} + let arg = + make_arg_node(None, r.expr.clone(), span.clone(), span.clone()); + Rc::new(ArgResult { + arg: arg, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } } } -} + } } else { { let r = parse_expr(tokens.clone(), ctx); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(ArgResult { - arg: dummy_arg, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) + arg: dummy_arg, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); } -let arg = make_arg_node(None, r.expr.clone(), span.clone(), span.clone()); -Rc::new(ArgResult { - arg: arg, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -} + let arg = make_arg_node(None, r.expr.clone(), span.clone(), span.clone()); + Rc::new(ArgResult { + arg: arg, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } } -} + } } pub fn parse_match(tokens: &Rc>>, ctx: &Rc) -> Rc { { let span = token_span(tokens.clone().first().cloned()); -let dummy_expr = parse_recovery_placeholder(); -let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { - text: "match".to_string(), -})); -if has_err(r.err.clone()) { + let dummy_expr = parse_recovery_placeholder(); + let r = expect( + &tokens, + &Rc::new(ExpectedToken::ExpectKeyword { + text: "match".to_string(), + }), + ); + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let r = parse_expr_no_brace(r.tokens.clone(), ctx.clone()); -if has_err(r.err.clone()) { - return r.clone() - } -let scrutinee = r.expr.clone(); -let r = expect(&skip_newlines(r.tokens.clone()), &Rc::new(ExpectedToken::ExpectLBrace)); -if has_err(r.err.clone()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let r = parse_expr_no_brace(r.tokens.clone(), ctx.clone()); + if has_err(r.err.clone()) { + return r.clone(); + } + let scrutinee = r.expr.clone(); + let r = expect( + &skip_newlines(r.tokens.clone()), + &Rc::new(ExpectedToken::ExpectLBrace), + ); + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let r = parse_match_arms(skip_newlines(r.tokens.clone()), ctx.clone()); -if has_err(r.err.clone()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let r = parse_match_arms(skip_newlines(r.tokens.clone()), ctx.clone()); + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let arms = r.arms.clone(); -let r = expect(&skip_newlines(r.tokens.clone()), &Rc::new(ExpectedToken::ExpectRBrace)); -if has_err(r.err.clone()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let arms = r.arms.clone(); + let r = expect( + &skip_newlines(r.tokens.clone()), + &Rc::new(ExpectedToken::ExpectRBrace), + ); + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -Rc::new(ExprResult { - expr: make_expr_node(Rc::new(ExprData::ExprMatch), v2_rt::concat(Rc::new(vec![scrutinee]), arms), None, span), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: None, -}) -} + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + Rc::new(ExprResult { + expr: make_expr_node( + Rc::new(ExprData::ExprMatch), + v2_rt::concat(Rc::new(vec![scrutinee]), arms), + None, + span, + ), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: None, + }) + } } pub fn parse_expr_no_brace(tokens: Rc>>, ctx: Rc) -> Rc { parse_expr_bp_no_brace(tokens, ctx, 0) } -pub fn parse_expr_bp_no_brace(tokens: Rc>>, ctx: Rc, min_bp: i64) -> Rc { +pub fn parse_expr_bp_no_brace( + tokens: Rc>>, + ctx: Rc, + min_bp: i64, +) -> Rc { { let r = parse_prefix(&tokens, ctx); -if has_err(r.err.clone()) { - return r.clone() + if has_err(r.err.clone()) { + return r.clone(); } -let lhs = r.expr.clone(); -parse_expr_loop_no_brace(r.tokens.clone(), r.ctx.clone(), lhs, min_bp) -} + let lhs = r.expr.clone(); + parse_expr_loop_no_brace(r.tokens.clone(), r.ctx.clone(), lhs, min_bp) + } } -pub fn parse_expr_loop_no_brace(mut tokens: Rc>>, mut ctx: Rc, mut lhs: Rc, mut min_bp: i64) -> Rc { +pub fn parse_expr_loop_no_brace( + mut tokens: Rc>>, + mut ctx: Rc, + mut lhs: Rc, + mut min_bp: i64, +) -> Rc { loop { let tok = tokens.clone().first().cloned(); -if (tok_is_eof(tok.clone()) || tok_is_lbrace(tok.clone())) { + if (tok_is_eof(tok.clone()) || tok_is_lbrace(tok.clone())) { break Rc::new(ExprResult { - expr: lhs.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}); -} else { + expr: lhs.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }); + } else { let loop_span = token_span(tok.clone()); -tokens = skip_continuation_newlines(&tokens); -if (tok_is_lparen(tokens.clone().first().cloned()) && (14 >= min_bp.clone())) { + tokens = skip_continuation_newlines(&tokens); + if (tok_is_lparen(tokens.clone().first().cloned()) && (14 >= min_bp.clone())) { let r = parse_call_args(&tokens, &ctx); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: lhs.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let span = token_span(tokens.clone().first().cloned()); -let new_lhs = make_call_expr(&lhs, r.args.clone(), span, ctx.source_indices.clone()); -{ + expr: lhs.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let span = token_span(tokens.clone().first().cloned()); + let new_lhs = + make_call_expr(&lhs, r.args.clone(), span, ctx.source_indices.clone()); + { let __tco_0 = r.tokens.clone(); -let __tco_1 = r.ctx.clone(); -let __tco_2 = new_lhs; -tokens = __tco_0; -ctx = __tco_1; -lhs = __tco_2; -continue; -} -} else { + let __tco_1 = r.ctx.clone(); + let __tco_2 = new_lhs; + tokens = __tco_0; + ctx = __tco_1; + lhs = __tco_2; + continue; + } + } else { if (tok_is_lbracket(tokens.clone().first().cloned()) && (14 >= min_bp.clone())) { let span = token_span(tokens.clone().first().cloned()); -let r = parse_index_or_slice(&tokens, &ctx, lhs.clone(), span); -if has_err(r.err.clone()) { + let r = parse_index_or_slice(&tokens, &ctx, lhs.clone(), span); + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: r.expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) + expr: r.expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); } -{ + { let __tco_0 = r.tokens.clone(); -let __tco_1 = r.ctx.clone(); -let __tco_2 = r.expr.clone(); -tokens = __tco_0; -ctx = __tco_1; -lhs = __tco_2; -continue; -} -} else { + let __tco_1 = r.ctx.clone(); + let __tco_2 = r.expr.clone(); + tokens = __tco_0; + ctx = __tco_1; + lhs = __tco_2; + continue; + } + } else { let bp = infix_bp(tokens.clone()); -match bp { - Some(bps) => { if (bps.left.clone() < min_bp.clone()) { - break Rc::new(ExprResult { - expr: lhs.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}); -} else { - match (*advance(&tokens)).clone() { - AdvanceResult::AdvanceOk { token: op_tok, tokens: rest, .. } => { let op_shape = op_tok.shape.clone(); -if is_dot_shape(op_shape.clone()) { - let r = expect_name(&rest); -if has_err(r.err.clone()) { - return Rc::new(ExprResult { - expr: lhs.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let new_lhs = make_named_expr_node(&r.name.clone(), Rc::new(ExprData::ExprFieldAccess { - summary: None, -}), Rc::new(vec![lhs.clone()]), None, loop_span, r.span.clone()); -{ - let __tco_0 = r.tokens.clone(); -let __tco_1 = new_lhs; -tokens = __tco_0; -lhs = __tco_1; -continue; -} -} else { - if is_pipe_arrow_shape(op_shape.clone()) { - let r = parse_pipe_rhs(&rest, &ctx, lhs.clone(), loop_span); -if has_err(r.err.clone()) { - return Rc::new(ExprResult { - expr: r.expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -{ - let __tco_0 = r.tokens.clone(); -let __tco_1 = r.ctx.clone(); -let __tco_2 = r.expr.clone(); -tokens = __tco_0; -ctx = __tco_1; -lhs = __tco_2; -continue; -} -} else { - tokens = skip_newlines(rest.clone()); -let r = parse_expr_bp_no_brace(tokens.clone(), ctx.clone(), bps.right.clone()); -if has_err(r.err.clone()) { - return Rc::new(ExprResult { - expr: r.expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) + match bp { + Some(bps) => { + if (bps.left.clone() < min_bp.clone()) { + break Rc::new(ExprResult { + expr: lhs.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }); + } else { + match (*advance(&tokens)).clone() { + AdvanceResult::AdvanceOk { + token: op_tok, + tokens: rest, + .. + } => { + let op_shape = op_tok.shape.clone(); + if is_dot_shape(op_shape.clone()) { + let r = expect_name(&rest); + if has_err(r.err.clone()) { + return Rc::new(ExprResult { + expr: lhs.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let new_lhs = make_named_expr_node( + &r.name.clone(), + Rc::new(ExprData::ExprFieldAccess { + summary: None, + }), + Rc::new(vec![lhs.clone()]), + None, + loop_span, + r.span.clone(), + ); + { + let __tco_0 = r.tokens.clone(); + let __tco_1 = new_lhs; + tokens = __tco_0; + lhs = __tco_1; + continue; + } + } else { + if is_pipe_arrow_shape(op_shape.clone()) { + let r = parse_pipe_rhs( + &rest, + &ctx, + lhs.clone(), + loop_span, + ); + if has_err(r.err.clone()) { + return Rc::new(ExprResult { + expr: r.expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + { + let __tco_0 = r.tokens.clone(); + let __tco_1 = r.ctx.clone(); + let __tco_2 = r.expr.clone(); + tokens = __tco_0; + ctx = __tco_1; + lhs = __tco_2; + continue; + } + } else { + tokens = skip_newlines(rest.clone()); + let r = parse_expr_bp_no_brace( + tokens.clone(), + ctx.clone(), + bps.right.clone(), + ); + if has_err(r.err.clone()) { + return Rc::new(ExprResult { + expr: r.expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let binop_opt = find_operator_binop( + dag_syntax_spec().operators.clone(), + op_tok.text.clone(), + ); + match binop_opt { + Some(binop) => { + let new_lhs = make_expr_node( + Rc::new(ExprData::ExprBinOp { + op: binop.clone(), + algebra_field: None, + }), + Rc::new(vec![ + lhs.clone(), + r.expr.clone(), + ]), + None, + loop_span, + ); + { + let __tco_0 = r.tokens.clone(); + let __tco_1 = r.ctx.clone(); + let __tco_2 = new_lhs; + tokens = __tco_0; + ctx = __tco_1; + lhs = __tco_2; + continue; + } + } + None => { + break Rc::new(ExprResult { + expr: lhs.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: Some(parse_error( + v2_rt::concat( + "unknown binary operator: " + .to_string(), + op_tok.text.clone(), + ), + loop_span, + )), + }); + } + } + } + } + } + AdvanceResult::AdvanceEof => { + break Rc::new(ExprResult { + expr: lhs.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }); + } } -let binop_opt = find_operator_binop(dag_syntax_spec().operators.clone(), op_tok.text.clone()); -match binop_opt { - Some(binop) => { let new_lhs = make_expr_node(Rc::new(ExprData::ExprBinOp { - op: binop.clone(), - algebra_field: None, -}), Rc::new(vec![lhs.clone(), r.expr.clone()]), None, loop_span); -{ - let __tco_0 = r.tokens.clone(); -let __tco_1 = r.ctx.clone(); -let __tco_2 = new_lhs; -tokens = __tco_0; -ctx = __tco_1; -lhs = __tco_2; -continue; -} }, - None => { break Rc::new(ExprResult { - expr: lhs.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: Some(parse_error(v2_rt::concat("unknown binary operator: ".to_string(), op_tok.text.clone()), loop_span)), -}); }, -} -} -} }, - AdvanceResult::AdvanceEof => { break Rc::new(ExprResult { - expr: lhs.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}); }, -} -} }, - None => { break Rc::new(ExprResult { - expr: lhs.clone(), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}); }, -} -} -} -} -} + } + } + None => { + break Rc::new(ExprResult { + expr: lhs.clone(), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }); + } + } + } + } + } + } } pub fn parse_match_arms(tokens: Rc>>, ctx: Rc) -> Rc { parse_match_arms_acc(tokens, ctx, Rc::new(vec![])) } -pub fn parse_match_arms_acc(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { +pub fn parse_match_arms_acc( + mut tokens: Rc>>, + mut ctx: Rc, + mut acc: Rc>>, +) -> Rc { loop { tokens = skip_newlines(tokens.clone()); -if (tok_is_rbrace(tokens.clone().first().cloned()) || tok_is_eof(tokens.clone().first().cloned())) { + if (tok_is_rbrace(tokens.clone().first().cloned()) + || tok_is_eof(tokens.clone().first().cloned())) + { break Rc::new(ArmsResult { - arms: acc.clone(), - tokens: tokens.clone(), - ctx: ctx, - err: None, -}); -} else { + arms: acc.clone(), + tokens: tokens.clone(), + ctx: ctx, + err: None, + }); + } else { let r = parse_match_arm(&tokens, &ctx); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(ArmsResult { - arms: acc.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let e = eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); -tokens = skip_newlines(match (*e).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), - EatResult::EatUnchanged { .. } => r.tokens.clone(), -}); -{ + arms: acc.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let e = eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); + tokens = skip_newlines(match (*e).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), + EatResult::EatUnchanged { .. } => r.tokens.clone(), + }); + { let __tco_0 = r.ctx.clone(); -let __tco_1 = v2_rt::rc_list_push(acc, r.arm.clone()); -ctx = __tco_0; -acc = __tco_1; -continue; -} -} -} + let __tco_1 = v2_rt::rc_list_push(acc, r.arm.clone()); + ctx = __tco_0; + acc = __tco_1; + continue; + } + } + } } pub fn parse_match_arm(tokens: &Rc>>, ctx: &Rc) -> Rc { { let arm_span = token_span(tokens.clone().first().cloned()); -let dummy_arm = make_arm_node(Rc::new(MatchPattern::Wildcard), None, parse_recovery_placeholder(), make_span(0, 0)); -let r = parse_pattern(&tokens, &ctx); -if has_err(r.err.clone()) { + let dummy_arm = make_arm_node( + Rc::new(MatchPattern::Wildcard), + None, + parse_recovery_placeholder(), + make_span(0, 0), + ); + let r = parse_pattern(&tokens, &ctx); + if has_err(r.err.clone()) { return Rc::new(ArmResult { - arm: dummy_arm.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let pat = r.pattern.clone(); -let tokens = r.tokens.clone(); -let ctx = r.ctx.clone(); -let guard_r = parse_optional_guard(&tokens, ctx.clone()); -if has_err(guard_r.err.clone()) { + arm: dummy_arm.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let pat = r.pattern.clone(); + let tokens = r.tokens.clone(); + let ctx = r.ctx.clone(); + let guard_r = parse_optional_guard(&tokens, ctx.clone()); + if has_err(guard_r.err.clone()) { return Rc::new(ArmResult { - arm: dummy_arm.clone(), - tokens: guard_r.tokens.clone(), - ctx: guard_r.ctx.clone(), - err: guard_r.err.clone(), -}) - } -let guard = guard_r.guard.clone(); -let tokens = guard_r.tokens.clone(); -let ctx = guard_r.ctx.clone(); -let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectFatArrow)); -if has_err(r.err.clone()) { + arm: dummy_arm.clone(), + tokens: guard_r.tokens.clone(), + ctx: guard_r.ctx.clone(), + err: guard_r.err.clone(), + }); + } + let guard = guard_r.guard.clone(); + let tokens = guard_r.tokens.clone(); + let ctx = guard_r.ctx.clone(); + let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectFatArrow)); + if has_err(r.err.clone()) { return Rc::new(ArmResult { - arm: dummy_arm.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let tokens = skip_newlines(r.tokens.clone()); -let r = if tok_is_lbrace(tokens.clone().first().cloned()) { + arm: dummy_arm.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let tokens = skip_newlines(r.tokens.clone()); + let r = if tok_is_lbrace(tokens.clone().first().cloned()) { parse_block(&tokens, &ctx) } else { parse_match_arm_body(&tokens, ctx.clone()) }; -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(ArmResult { - arm: dummy_arm.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let arm = make_arm_node(pat, guard, r.expr.clone(), arm_span); -Rc::new(ArmResult { - arm: arm, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -} + arm: dummy_arm.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let arm = make_arm_node(pat, guard, r.expr.clone(), arm_span); + Rc::new(ArmResult { + arm: arm, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } } pub fn parse_match_arm_body(tokens: &Rc>>, ctx: Rc) -> Rc { { let tok = tokens.clone().first().cloned(); -let is_block = (tok_is_keyword(tok.clone(), "let".to_string()) || tok_is_keyword(tok.clone(), "return".to_string())); -if is_block { + let is_block = (tok_is_keyword(tok.clone(), "let".to_string()) + || tok_is_keyword(tok.clone(), "return".to_string())); + if is_block { { let r = parse_match_arm_stmts(tokens.clone(), ctx, Rc::new(vec![])); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: parse_recovery_placeholder(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let span = token_span(tokens.clone().first().cloned()); -if ((r.stmts.clone().len() as i64) == 1) { + expr: parse_recovery_placeholder(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let span = token_span(tokens.clone().first().cloned()); + if ((r.stmts.clone().len() as i64) == 1) { Rc::new(ExprResult { - expr: r.stmts.clone().first().cloned().clone().unwrap(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) + expr: r.stmts.clone().first().cloned().clone().unwrap(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) } else { Rc::new(ExprResult { - expr: make_expr_node(Rc::new(ExprData::ExprBlock), r.stmts.clone(), None, span), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) + expr: make_expr_node( + Rc::new(ExprData::ExprBlock), + r.stmts.clone(), + None, + span, + ), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) } -} + } } else { parse_expr(tokens.clone(), ctx) } -} + } } -pub fn parse_match_arm_stmts(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { +pub fn parse_match_arm_stmts( + mut tokens: Rc>>, + mut ctx: Rc, + mut acc: Rc>>, +) -> Rc { loop { tokens = skip_newlines(tokens.clone()); -if (tok_is_rbrace(tokens.clone().first().cloned()) || tok_is_eof(tokens.clone().first().cloned())) { + if (tok_is_rbrace(tokens.clone().first().cloned()) + || tok_is_eof(tokens.clone().first().cloned())) + { break Rc::new(StmtsResult { - stmts: acc.clone(), - tokens: tokens.clone(), - ctx: ctx, - err: None, -}); -} else { + stmts: acc.clone(), + tokens: tokens.clone(), + ctx: ctx, + err: None, + }); + } else { if looks_like_arm_start(&tokens) { break Rc::new(StmtsResult { - stmts: acc.clone(), - tokens: tokens.clone(), - ctx: ctx, - err: None, -}); -} else { + stmts: acc.clone(), + tokens: tokens.clone(), + ctx: ctx, + err: None, + }); + } else { let r = parse_stmt(&tokens, ctx); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(StmtsResult { - stmts: acc.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) + stmts: acc.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); } -{ + { let __tco_0 = r.tokens.clone(); -let __tco_1 = r.ctx.clone(); -let __tco_2 = v2_rt::rc_list_push(acc, r.expr.clone()); -tokens = __tco_0; -ctx = __tco_1; -acc = __tco_2; -continue; -} -} -} -} + let __tco_1 = r.ctx.clone(); + let __tco_2 = v2_rt::rc_list_push(acc, r.expr.clone()); + tokens = __tco_0; + ctx = __tco_1; + acc = __tco_2; + continue; + } + } + } + } } pub fn looks_like_arm_start(tokens: &Rc>>) -> bool { { let tok = tokens.clone().first().cloned(); -let sh = match tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, -}; -match sh { - Some(TokenShape::ShIdent) => { - let n = tok.clone().unwrap().text.clone(); -if (n.clone().as_str() == "_".to_string().as_str()) { - peek_is_fat_arrow_at(tokens.clone(), 1) - } else { - if is_uppercase_start(n.clone()) { - if peek_is_fat_arrow_at(tokens.clone(), 1) { - true - } else { - if peek_is_expected_at(tokens.clone(), 1, Rc::new(ExpectedToken::ExpectLBrace)) { - scan_for_fat_arrow_after_braces(Rc::new(tokens.clone().iter().cloned().skip(2 as usize).collect::>()), 1) + let sh = match tok.clone() { + Some(t) => Some(t.shape.clone()), + None => None, + }; + match sh { + Some(TokenShape::ShIdent) => { + let n = tok.clone().unwrap().text.clone(); + if (n.clone().as_str() == "_".to_string().as_str()) { + peek_is_fat_arrow_at(tokens.clone(), 1) + } else { + if is_uppercase_start(n.clone()) { + if peek_is_fat_arrow_at(tokens.clone(), 1) { + true } else { - false + if peek_is_expected_at( + tokens.clone(), + 1, + Rc::new(ExpectedToken::ExpectLBrace), + ) { + scan_for_fat_arrow_after_braces( + Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(2 as usize) + .collect::>(), + ), + 1, + ) + } else { + false + } } + } else { + false } - } else { - false } } -}, - _ => false, -} -} + _ => false, + } + } } pub fn peek_is_fat_arrow_at(tokens: Rc>>, offset: i64) -> bool { match tokens.get(offset as usize).cloned() { - Some(t) => is_fat_arrow_shape(t.shape.clone()), - None => false, -} + Some(t) => is_fat_arrow_shape(t.shape.clone()), + None => false, + } } -pub fn peek_is_expected_at(tokens: Rc>>, offset: i64, expected: Rc) -> bool { +pub fn peek_is_expected_at( + tokens: Rc>>, + offset: i64, + expected: Rc, +) -> bool { match tokens.get(offset as usize).cloned() { - Some(t) => token_matches_expected(&t, expected), - None => false, -} + Some(t) => token_matches_expected(&t, expected), + None => false, + } } pub fn scan_for_fat_arrow_after_braces(mut remaining: Rc>>, mut depth: i64) -> bool { loop { if (depth.clone() <= 0) { match remaining.clone().first().cloned() { - Some(t) => { break is_fat_arrow_shape(t.shape.clone()); }, - None => { break false; }, -} -} else { + Some(t) => { + break is_fat_arrow_shape(t.shape.clone()); + } + None => { + break false; + } + } + } else { match remaining.clone().first().cloned() { - Some(t) => { if is_lbrace_shape(t.shape.clone()) { - { - let __tco_0 = Rc::new(remaining.iter().cloned().skip(1 as usize).collect::>()); -let __tco_1 = (depth + 1); -remaining = __tco_0; -depth = __tco_1; -continue; -} -} else { - if is_rbrace_shape(t.shape.clone()) { - { - let __tco_0 = Rc::new(remaining.iter().cloned().skip(1 as usize).collect::>()); -let __tco_1 = (depth - 1); -remaining = __tco_0; -depth = __tco_1; -continue; -} -} else { - { - let __tco_0 = Rc::new(remaining.iter().cloned().skip(1 as usize).collect::>()); -remaining = __tco_0; -continue; -} -} -} }, - None => { break false; }, -} -} -} + Some(t) => { + if is_lbrace_shape(t.shape.clone()) { + { + let __tco_0 = Rc::new( + remaining + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ); + let __tco_1 = (depth + 1); + remaining = __tco_0; + depth = __tco_1; + continue; + } + } else { + if is_rbrace_shape(t.shape.clone()) { + { + let __tco_0 = Rc::new( + remaining + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ); + let __tco_1 = (depth - 1); + remaining = __tco_0; + depth = __tco_1; + continue; + } + } else { + { + let __tco_0 = Rc::new( + remaining + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ); + remaining = __tco_0; + continue; + } + } + } + } + None => { + break false; + } + } + } + } } pub fn parse_optional_guard(tokens: &Rc>>, ctx: Rc) -> Rc { if tok_is_keyword(tokens.clone().first().cloned(), "if".to_string()) { { - let r = parse_expr(Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), ctx); -if has_err(r.err.clone()) { + let r = parse_expr( + Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + ctx, + ); + if has_err(r.err.clone()) { return Rc::new(GuardResult { - guard: None, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -Rc::new(GuardResult { - guard: Some(r.expr.clone()), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -} + guard: None, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + Rc::new(GuardResult { + guard: Some(r.expr.clone()), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } } else { Rc::new(GuardResult { - guard: None, - tokens: tokens.clone(), - ctx: ctx, - err: None, -}) + guard: None, + tokens: tokens.clone(), + ctx: ctx, + err: None, + }) } } pub fn parse_pattern(tokens: &Rc>>, ctx: &Rc) -> Rc { { let tok = tokens.clone().first().cloned(); -let sh = match tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, -}; -let span = token_span(tok.clone()); -match sh { - Some(TokenShape::ShIdent) => { - let n = tok.clone().unwrap().text.clone(); -if (n.clone().as_str() == "_".to_string().as_str()) { - Rc::new(PatternResult { - pattern: Rc::new(MatchPattern::Wildcard), - tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), - ctx: ctx.clone(), - err: None, -}) - } else { - if is_uppercase_start(n.clone()) { - parse_variant_pattern(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), ctx.clone(), n.clone()) - } else { + let sh = match tok.clone() { + Some(t) => Some(t.shape.clone()), + None => None, + }; + let span = token_span(tok.clone()); + match sh { + Some(TokenShape::ShIdent) => { + let n = tok.clone().unwrap().text.clone(); + if (n.clone().as_str() == "_".to_string().as_str()) { Rc::new(PatternResult { - pattern: Rc::new(MatchPattern::Bind { - name: n.clone(), -}), - tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), - ctx: ctx.clone(), - err: None, -}) - } - } -}, - Some(TokenShape::ShKeyword) => { - let kw_text = tok.clone().unwrap().text.clone(); -let lit_val = v2_rt::lookup(&dag_syntax_spec().keyword_literals.clone(), kw_text); -match lit_val { - Some(lv) => Rc::new(PatternResult { - pattern: Rc::new(MatchPattern::LitPattern { - value: lv.clone(), -}), - tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), - ctx: ctx.clone(), - err: None, -}), - None => Rc::new(PatternResult { - pattern: Rc::new(MatchPattern::Wildcard), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}), -} -}, - Some(TokenShape::ShLitInt) => { - let n_opt = v2_rt::parse_int(tok.clone().unwrap().text.clone()); -let n = match n_opt { - Some(v) => v.clone(), - None => return Rc::new(PatternResult { - pattern: Rc::new(MatchPattern::Wildcard), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: Some(parse_error(v2_rt::concat(v2_rt::concat("internal: ShLitInt token text not parseable as int: '".to_string(), tok.clone().unwrap().text.clone()), "'".to_string()), span)), -}), -}; -Rc::new(PatternResult { - pattern: Rc::new(MatchPattern::LitPattern { - value: Rc::new(LiteralValue::LitInt { - value: n.clone(), -}), -}), - tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), - ctx: ctx.clone(), - err: None, -}) -}, - Some(TokenShape::ShLitStr) => { - let s = tok.clone().unwrap().text.clone(); -Rc::new(PatternResult { - pattern: Rc::new(MatchPattern::LitPattern { - value: Rc::new(LiteralValue::LitStr { - value: s, -}), -}), - tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), - ctx: ctx.clone(), - err: None, -}) -}, - _ => Rc::new(PatternResult { - pattern: Rc::new(MatchPattern::Wildcard), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}), -} -} + pattern: Rc::new(MatchPattern::Wildcard), + tokens: Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + ctx: ctx.clone(), + err: None, + }) + } else { + if is_uppercase_start(n.clone()) { + parse_variant_pattern( + &Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + ctx.clone(), + n.clone(), + ) + } else { + Rc::new(PatternResult { + pattern: Rc::new(MatchPattern::Bind { name: n.clone() }), + tokens: Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + ctx: ctx.clone(), + err: None, + }) + } + } + } + Some(TokenShape::ShKeyword) => { + let kw_text = tok.clone().unwrap().text.clone(); + let lit_val = v2_rt::lookup(&dag_syntax_spec().keyword_literals.clone(), kw_text); + match lit_val { + Some(lv) => Rc::new(PatternResult { + pattern: Rc::new(MatchPattern::LitPattern { value: lv.clone() }), + tokens: Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + ctx: ctx.clone(), + err: None, + }), + None => Rc::new(PatternResult { + pattern: Rc::new(MatchPattern::Wildcard), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }), + } + } + Some(TokenShape::ShLitInt) => { + let n_opt = v2_rt::parse_int(tok.clone().unwrap().text.clone()); + let n = match n_opt { + Some(v) => v.clone(), + None => { + return Rc::new(PatternResult { + pattern: Rc::new(MatchPattern::Wildcard), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: Some(parse_error( + v2_rt::concat( + v2_rt::concat( + "internal: ShLitInt token text not parseable as int: '" + .to_string(), + tok.clone().unwrap().text.clone(), + ), + "'".to_string(), + ), + span, + )), + }) + } + }; + Rc::new(PatternResult { + pattern: Rc::new(MatchPattern::LitPattern { + value: Rc::new(LiteralValue::LitInt { value: n.clone() }), + }), + tokens: Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + ctx: ctx.clone(), + err: None, + }) + } + Some(TokenShape::ShLitStr) => { + let s = tok.clone().unwrap().text.clone(); + Rc::new(PatternResult { + pattern: Rc::new(MatchPattern::LitPattern { + value: Rc::new(LiteralValue::LitStr { value: s }), + }), + tokens: Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + ctx: ctx.clone(), + err: None, + }) + } + _ => Rc::new(PatternResult { + pattern: Rc::new(MatchPattern::Wildcard), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }), + } + } } -pub fn parse_variant_pattern(tokens: &Rc>>, ctx: Rc, name: String) -> Rc { +pub fn parse_variant_pattern( + tokens: &Rc>>, + ctx: Rc, + name: String, +) -> Rc { { let span = token_span(tokens.clone().first().cloned()); -if tok_is_lbrace(tokens.clone().first().cloned()) { + if tok_is_lbrace(tokens.clone().first().cloned()) { { - let r = parse_variant_bindings_brace(skip_newlines(Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>())), ctx); -if has_err(r.err.clone()) { + let r = parse_variant_bindings_brace( + skip_newlines(Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + )), + ctx, + ); + if has_err(r.err.clone()) { return Rc::new(PatternResult { - pattern: Rc::new(MatchPattern::Wildcard), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let r2 = expect(&skip_newlines(r.tokens.clone()), &Rc::new(ExpectedToken::ExpectRBrace)); -if has_err(r2.err.clone()) { + pattern: Rc::new(MatchPattern::Wildcard), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let r2 = expect( + &skip_newlines(r.tokens.clone()), + &Rc::new(ExpectedToken::ExpectRBrace), + ); + if has_err(r2.err.clone()) { return Rc::new(PatternResult { - pattern: Rc::new(MatchPattern::Wildcard), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), -}) - } -Rc::new(PatternResult { - pattern: Rc::new(MatchPattern::VariantPattern { - name: name, - parent_enum: None, - field_bindings: r.field_bindings.clone(), -}), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -} + pattern: Rc::new(MatchPattern::Wildcard), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), + }); + } + Rc::new(PatternResult { + pattern: Rc::new(MatchPattern::VariantPattern { + name: name, + parent_enum: None, + field_bindings: r.field_bindings.clone(), + }), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } } else { if tok_is_lparen(tokens.clone().first().cloned()) { { - let r = parse_pattern(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), &ctx); -if has_err(r.err.clone()) { + let r = parse_pattern( + &Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + &ctx, + ); + if has_err(r.err.clone()) { return Rc::new(PatternResult { - pattern: Rc::new(MatchPattern::Wildcard), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) + pattern: Rc::new(MatchPattern::Wildcard), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); } -let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectRParen)); -if has_err(r2.err.clone()) { + let r2 = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectRParen)); + if has_err(r2.err.clone()) { return Rc::new(PatternResult { - pattern: Rc::new(MatchPattern::Wildcard), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), -}) + pattern: Rc::new(MatchPattern::Wildcard), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), + }); } -let fb = make_field_binding_node(&"0".to_string(), r.pattern.clone(), span.clone(), span.clone()); -Rc::new(PatternResult { - pattern: Rc::new(MatchPattern::VariantPattern { - name: name, - parent_enum: None, - field_bindings: Rc::new(vec![fb]), -}), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -} + let fb = make_field_binding_node( + &"0".to_string(), + r.pattern.clone(), + span.clone(), + span.clone(), + ); + Rc::new(PatternResult { + pattern: Rc::new(MatchPattern::VariantPattern { + name: name, + parent_enum: None, + field_bindings: Rc::new(vec![fb]), + }), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } } else { Rc::new(PatternResult { - pattern: Rc::new(MatchPattern::VariantPattern { - name: name, - parent_enum: None, - field_bindings: Rc::new(vec![]), -}), - tokens: tokens.clone(), - ctx: ctx, - err: None, -}) + pattern: Rc::new(MatchPattern::VariantPattern { + name: name, + parent_enum: None, + field_bindings: Rc::new(vec![]), + }), + tokens: tokens.clone(), + ctx: ctx, + err: None, + }) } } -} + } } -pub fn parse_variant_bindings_brace(tokens: Rc>>, ctx: Rc) -> Rc { +pub fn parse_variant_bindings_brace( + tokens: Rc>>, + ctx: Rc, +) -> Rc { parse_variant_bindings_brace_acc(tokens, ctx, Rc::new(vec![])) } -pub fn parse_variant_bindings_brace_acc(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { +pub fn parse_variant_bindings_brace_acc( + mut tokens: Rc>>, + mut ctx: Rc, + mut acc: Rc>>, +) -> Rc { loop { tokens = skip_newlines(tokens.clone()); -if (tok_is_rbrace(tokens.clone().first().cloned()) || tok_is_eof(tokens.clone().first().cloned())) { + if (tok_is_rbrace(tokens.clone().first().cloned()) + || tok_is_eof(tokens.clone().first().cloned())) + { break Rc::new(BindingsResult { - field_bindings: acc, - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}); -} else { + field_bindings: acc, + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }); + } else { let bind_span = token_span(tokens.clone().first().cloned()); -let r = expect_name(&tokens); -if has_err(r.err.clone()) { - return Rc::new(BindingsResult { - field_bindings: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let field_name = r.name.clone(); -let field_name_span = r.span.clone(); -tokens = r.tokens.clone(); -match (*eat(&tokens, Rc::new(ExpectedToken::ExpectColon))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { let r2 = parse_pattern(&__ec, &ctx); -if has_err(r2.err.clone()) { + let r = expect_name(&tokens); + if has_err(r.err.clone()) { return Rc::new(BindingsResult { - field_bindings: Rc::new(vec![]), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), -}) - } -let e2 = eat(&r2.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); -tokens = skip_newlines(match (*e2).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), - EatResult::EatUnchanged { .. } => r2.tokens.clone(), -}); -let fb = make_field_binding_node(&field_name, r2.pattern.clone(), bind_span, field_name_span); -{ - let __tco_0 = r2.ctx.clone(); -let __tco_1 = v2_rt::rc_list_push(acc, fb); -ctx = __tco_0; -acc = __tco_1; -continue; -} }, - EatResult::EatUnchanged { tokens: __eu, .. } => { let e2 = eat(&tokens, Rc::new(ExpectedToken::ExpectComma)); -tokens = skip_newlines(match (*e2).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), - EatResult::EatUnchanged { .. } => tokens.clone(), -}); -let fb = make_field_binding_node(&field_name, Rc::new(MatchPattern::Bind { - name: field_name.clone(), -}), bind_span, field_name_span); -{ - let __tco_0 = v2_rt::rc_list_push(acc, fb); -acc = __tco_0; -continue; -} }, -} -} -} + field_bindings: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let field_name = r.name.clone(); + let field_name_span = r.span.clone(); + tokens = r.tokens.clone(); + match (*eat(&tokens, Rc::new(ExpectedToken::ExpectColon))).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => { + let r2 = parse_pattern(&__ec, &ctx); + if has_err(r2.err.clone()) { + return Rc::new(BindingsResult { + field_bindings: Rc::new(vec![]), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), + }); + } + let e2 = eat(&r2.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); + tokens = skip_newlines(match (*e2).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), + EatResult::EatUnchanged { .. } => r2.tokens.clone(), + }); + let fb = make_field_binding_node( + &field_name, + r2.pattern.clone(), + bind_span, + field_name_span, + ); + { + let __tco_0 = r2.ctx.clone(); + let __tco_1 = v2_rt::rc_list_push(acc, fb); + ctx = __tco_0; + acc = __tco_1; + continue; + } + } + EatResult::EatUnchanged { tokens: __eu, .. } => { + let e2 = eat(&tokens, Rc::new(ExpectedToken::ExpectComma)); + tokens = skip_newlines(match (*e2).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), + EatResult::EatUnchanged { .. } => tokens.clone(), + }); + let fb = make_field_binding_node( + &field_name, + Rc::new(MatchPattern::Bind { + name: field_name.clone(), + }), + bind_span, + field_name_span, + ); + { + let __tco_0 = v2_rt::rc_list_push(acc, fb); + acc = __tco_0; + continue; + } + } + } + } + } } pub fn parse_if(tokens: &Rc>>, ctx: &Rc) -> Rc { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { + let span = token_span(tokens.clone().first().cloned()); + let dummy_expr = parse_recovery_placeholder(); + let r = expect( + &tokens, + &Rc::new(ExpectedToken::ExpectKeyword { + text: "if".to_string(), + }), + ); + if has_err(r.err.clone()) { + return Rc::new(ExprResult { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let r = parse_expr_no_brace(r.tokens.clone(), ctx.clone()); + if has_err(r.err.clone()) { + return Rc::new(ExprResult { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let condition = r.expr.clone(); + let r = parse_block(&skip_newlines(r.tokens.clone()), &r.ctx.clone()); + if has_err(r.err.clone()) { + return Rc::new(ExprResult { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let then_branch = r.expr.clone(); + let tokens = skip_newlines(r.tokens.clone()); + let ctx = r.ctx.clone(); + match (*eat( + &tokens, + Rc::new(ExpectedToken::ExpectKeyword { + text: "else".to_string(), + }), + )) + .clone() { - let span = token_span(tokens.clone().first().cloned()); -let dummy_expr = parse_recovery_placeholder(); -let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { - text: "if".to_string(), -})); -if has_err(r.err.clone()) { - return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let r = parse_expr_no_brace(r.tokens.clone(), ctx.clone()); -if has_err(r.err.clone()) { - return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let condition = r.expr.clone(); -let r = parse_block(&skip_newlines(r.tokens.clone()), &r.ctx.clone()); -if has_err(r.err.clone()) { - return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let then_branch = r.expr.clone(); -let tokens = skip_newlines(r.tokens.clone()); -let ctx = r.ctx.clone(); -match (*eat(&tokens, Rc::new(ExpectedToken::ExpectKeyword { - text: "else".to_string(), -}))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { + EatResult::EatConsumed { tokens: __ec, .. } => { let tokens = skip_newlines(__ec.clone()); -if tok_is_keyword(tokens.clone().first().cloned(), "if".to_string()) { + if tok_is_keyword(tokens.clone().first().cloned(), "if".to_string()) { { let r2 = parse_if(&tokens, &ctx); -if has_err(r2.err.clone()) { + if has_err(r2.err.clone()) { return Rc::new(ExprResult { - expr: r2.expr.clone(), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), -}) + expr: r2.expr.clone(), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), + }); } -Rc::new(ExprResult { - expr: make_expr_node(Rc::new(ExprData::ExprIf), Rc::new(vec![condition, then_branch, r2.expr.clone()]), None, span), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: None, -}) -} + Rc::new(ExprResult { + expr: make_expr_node( + Rc::new(ExprData::ExprIf), + Rc::new(vec![condition, then_branch, r2.expr.clone()]), + None, + span, + ), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: None, + }) + } } else { { let r2 = parse_block(&tokens, &ctx); -if has_err(r2.err.clone()) { + if has_err(r2.err.clone()) { return Rc::new(ExprResult { - expr: r2.expr.clone(), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: r2.err.clone(), -}) + expr: r2.expr.clone(), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: r2.err.clone(), + }); } -Rc::new(ExprResult { - expr: make_expr_node(Rc::new(ExprData::ExprIf), Rc::new(vec![condition, then_branch, r2.expr.clone()]), None, span), - tokens: r2.tokens.clone(), - ctx: r2.ctx.clone(), - err: None, -}) -} + Rc::new(ExprResult { + expr: make_expr_node( + Rc::new(ExprData::ExprIf), + Rc::new(vec![condition, then_branch, r2.expr.clone()]), + None, + span, + ), + tokens: r2.tokens.clone(), + ctx: r2.ctx.clone(), + err: None, + }) + } } -}, - EatResult::EatUnchanged { tokens: __eu, .. } => Rc::new(ExprResult { - expr: make_expr_node(Rc::new(ExprData::ExprIf), Rc::new(vec![condition, then_branch]), None, span), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}), -} -} + } + EatResult::EatUnchanged { tokens: __eu, .. } => Rc::new(ExprResult { + expr: make_expr_node( + Rc::new(ExprData::ExprIf), + Rc::new(vec![condition, then_branch]), + None, + span, + ), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }), + } }) } pub fn parse_let(tokens: &Rc>>, ctx: &Rc) -> Rc { { let span = token_span(tokens.clone().first().cloned()); -let dummy_expr = parse_recovery_placeholder(); -let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { - text: "let".to_string(), -})); -if has_err(r.err.clone()) { + let dummy_expr = parse_recovery_placeholder(); + let r = expect( + &tokens, + &Rc::new(ExpectedToken::ExpectKeyword { + text: "let".to_string(), + }), + ); + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let r = expect_name(&r.tokens.clone()); -if has_err(r.err.clone()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let r = expect_name(&r.tokens.clone()); + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let name = r.name.clone(); -let name_span = r.span.clone(); -let r = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectEq)); -if has_err(r.err.clone()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let name = r.name.clone(); + let name_span = r.span.clone(); + let r = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectEq)); + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let r = parse_expr(r.tokens.clone(), ctx.clone()); -if has_err(r.err.clone()) { - return r.clone() - } -Rc::new(ExprResult { - expr: make_named_expr_node(&name, Rc::new(ExprData::ExprLet), Rc::new(vec![r.expr.clone()]), None, span, name_span), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -} + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let r = parse_expr(r.tokens.clone(), ctx.clone()); + if has_err(r.err.clone()) { + return r.clone(); + } + Rc::new(ExprResult { + expr: make_named_expr_node( + &name, + Rc::new(ExprData::ExprLet), + Rc::new(vec![r.expr.clone()]), + None, + span, + name_span, + ), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } } pub fn parse_return(tokens: &Rc>>, ctx: &Rc) -> Rc { { let span = token_span(tokens.clone().first().cloned()); -let dummy_expr = parse_recovery_placeholder(); -let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { - text: "return".to_string(), -})); -if has_err(r.err.clone()) { + let dummy_expr = parse_recovery_placeholder(); + let r = expect( + &tokens, + &Rc::new(ExpectedToken::ExpectKeyword { + text: "return".to_string(), + }), + ); + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr, - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let r = parse_expr(r.tokens.clone(), ctx.clone()); -if has_err(r.err.clone()) { - return r.clone() - } -Rc::new(ExprResult { - expr: make_expr_node(Rc::new(ExprData::ExprReturn), Rc::new(vec![r.expr.clone()]), None, span), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -} + expr: dummy_expr, + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let r = parse_expr(r.tokens.clone(), ctx.clone()); + if has_err(r.err.clone()) { + return r.clone(); + } + Rc::new(ExprResult { + expr: make_expr_node( + Rc::new(ExprData::ExprReturn), + Rc::new(vec![r.expr.clone()]), + None, + span, + ), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } } pub fn parse_for(tokens: &Rc>>, ctx: &Rc) -> Rc { { let span = token_span(tokens.clone().first().cloned()); -let dummy_expr = parse_recovery_placeholder(); -let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { - text: "for".to_string(), -})); -if has_err(r.err.clone()) { + let dummy_expr = parse_recovery_placeholder(); + let r = expect( + &tokens, + &Rc::new(ExpectedToken::ExpectKeyword { + text: "for".to_string(), + }), + ); + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let r = expect_name(&r.tokens.clone()); -if has_err(r.err.clone()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let r = expect_name(&r.tokens.clone()); + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let var_name = r.name.clone(); -let var_name_span = r.span.clone(); -let r = expect(&r.tokens.clone(), &Rc::new(ExpectedToken::ExpectKeyword { - text: "in".to_string(), -})); -if has_err(r.err.clone()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let var_name = r.name.clone(); + let var_name_span = r.span.clone(); + let r = expect( + &r.tokens.clone(), + &Rc::new(ExpectedToken::ExpectKeyword { + text: "in".to_string(), + }), + ); + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let r = parse_expr_no_brace(r.tokens.clone(), ctx.clone()); -if has_err(r.err.clone()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let r = parse_expr_no_brace(r.tokens.clone(), ctx.clone()); + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: r.expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let collection = r.expr.clone(); -let r = parse_block(&skip_newlines(r.tokens.clone()), &r.ctx.clone()); -if has_err(r.err.clone()) { + expr: r.expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let collection = r.expr.clone(); + let r = parse_block(&skip_newlines(r.tokens.clone()), &r.ctx.clone()); + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: r.expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let body = r.expr.clone(); -let for_expr = make_named_expr_node(&var_name, Rc::new(ExprData::ExprForEach), Rc::new(vec![collection, body]), None, span, var_name_span); -Rc::new(ExprResult { - expr: for_expr, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -} + expr: r.expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let body = r.expr.clone(); + let for_expr = make_named_expr_node( + &var_name, + Rc::new(ExprData::ExprForEach), + Rc::new(vec![collection, body]), + None, + span, + var_name_span, + ); + Rc::new(ExprResult { + expr: for_expr, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } } -pub fn parse_record_literal(tokens: &Rc>>, ctx: &Rc, name: String, span: &Rc) -> Rc { +pub fn parse_record_literal( + tokens: &Rc>>, + ctx: &Rc, + name: String, + span: &Rc, +) -> Rc { { let dummy_expr = parse_recovery_placeholder(); -let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectLBrace)); -if has_err(r.err.clone()) { + let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectLBrace)); + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let tokens = skip_newlines(r.tokens.clone()); -let r = parse_field_init_list(tokens.clone(), ctx.clone()); -if has_err(r.err.clone()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let tokens = skip_newlines(r.tokens.clone()); + let r = parse_field_init_list(tokens.clone(), ctx.clone()); + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let tokens = skip_newlines(r.tokens.clone()); -let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); -if has_err(r2.err.clone()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let tokens = skip_newlines(r.tokens.clone()); + let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); + if has_err(r2.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), -}) - } -Rc::new(ExprResult { - expr: make_named_expr_node(&name, Rc::new(ExprData::ExprRecordLit { - parent_enum: None, -}), r.fields.clone(), None, span.clone(), span.clone()), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -} + expr: dummy_expr.clone(), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), + }); + } + Rc::new(ExprResult { + expr: make_named_expr_node( + &name, + Rc::new(ExprData::ExprRecordLit { parent_enum: None }), + r.fields.clone(), + None, + span.clone(), + span.clone(), + ), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } } -pub fn parse_field_init_list(tokens: Rc>>, ctx: Rc) -> Rc { +pub fn parse_field_init_list( + tokens: Rc>>, + ctx: Rc, +) -> Rc { parse_field_init_list_acc(tokens, ctx, Rc::new(vec![])) } -pub fn parse_field_init_list_acc(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { +pub fn parse_field_init_list_acc( + mut tokens: Rc>>, + mut ctx: Rc, + mut acc: Rc>>, +) -> Rc { loop { tokens = skip_newlines(tokens.clone()); -if (tok_is_rbrace(tokens.clone().first().cloned()) || tok_is_eof(tokens.clone().first().cloned())) { + if (tok_is_rbrace(tokens.clone().first().cloned()) + || tok_is_eof(tokens.clone().first().cloned())) + { break Rc::new(FieldInitsResult { - fields: acc, - tokens: tokens.clone(), - ctx: ctx, - err: None, -}); -} else { + fields: acc, + tokens: tokens.clone(), + ctx: ctx, + err: None, + }); + } else { let r = parse_field_init(&tokens, &ctx); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(FieldInitsResult { - fields: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let e = eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); -tokens = skip_newlines(match (*e).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), - EatResult::EatUnchanged { .. } => r.tokens.clone(), -}); -{ + fields: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let e = eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); + tokens = skip_newlines(match (*e).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), + EatResult::EatUnchanged { .. } => r.tokens.clone(), + }); + { let __tco_0 = r.ctx.clone(); -let __tco_1 = v2_rt::rc_list_push(acc, r.field.clone()); -ctx = __tco_0; -acc = __tco_1; -continue; -} -} -} + let __tco_1 = v2_rt::rc_list_push(acc, r.field.clone()); + ctx = __tco_0; + acc = __tco_1; + continue; + } + } + } } -pub fn parse_field_init(tokens: &Rc>>, ctx: &Rc) -> Rc { +pub fn parse_field_init( + tokens: &Rc>>, + ctx: &Rc, +) -> Rc { { let zero_span = make_span(0, 0); -let span = token_span(tokens.clone().first().cloned()); -let dummy_fi = make_field_init_node(&"".to_string(), parse_recovery_placeholder(), zero_span.clone(), zero_span.clone()); -let tok = tokens.clone().first().cloned(); -if (tok_is_ident(tok.clone()) || tok_is_keyword_name(tok.clone())) { + let span = token_span(tokens.clone().first().cloned()); + let dummy_fi = make_field_init_node( + &"".to_string(), + parse_recovery_placeholder(), + zero_span.clone(), + zero_span.clone(), + ); + let tok = tokens.clone().first().cloned(); + if (tok_is_ident(tok.clone()) || tok_is_keyword_name(tok.clone())) { { let name_r = expect_name(&tokens); -if has_err(name_r.err.clone()) { + if has_err(name_r.err.clone()) { return Rc::new(FieldInitResult { - field: dummy_fi.clone(), - tokens: name_r.tokens.clone(), - ctx: ctx.clone(), - err: name_r.err.clone(), -}) + field: dummy_fi.clone(), + tokens: name_r.tokens.clone(), + ctx: ctx.clone(), + err: name_r.err.clone(), + }); } -let n = name_r.name.clone(); -if tok_is_colon(name_r.tokens.clone().first().cloned()) { + let n = name_r.name.clone(); + if tok_is_colon(name_r.tokens.clone().first().cloned()) { { - let r = parse_expr(Rc::new(name_r.tokens.clone().iter().cloned().skip(1 as usize).collect::>()), ctx.clone()); -if has_err(r.err.clone()) { + let r = parse_expr( + Rc::new( + name_r + .tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + ctx.clone(), + ); + if has_err(r.err.clone()) { return Rc::new(FieldInitResult { - field: dummy_fi.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) + field: dummy_fi.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); } -let fi = make_field_init_node(&n, r.expr.clone(), span.clone(), name_r.span.clone()); -Rc::new(FieldInitResult { - field: fi, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -} + let fi = make_field_init_node( + &n, + r.expr.clone(), + span.clone(), + name_r.span.clone(), + ); + Rc::new(FieldInitResult { + field: fi, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } } else { { - let fi = make_field_init_node(&n, make_named_expr_node(&n, Rc::new(ExprData::ExprVar { - binding_kind: None, -}), Rc::new(vec![]), None, span.clone(), name_r.span.clone()), span.clone(), name_r.span.clone()); -Rc::new(FieldInitResult { - field: fi, - tokens: name_r.tokens.clone(), - ctx: ctx.clone(), - err: None, -}) -} + let fi = make_field_init_node( + &n, + make_named_expr_node( + &n, + Rc::new(ExprData::ExprVar { binding_kind: None }), + Rc::new(vec![]), + None, + span.clone(), + name_r.span.clone(), + ), + span.clone(), + name_r.span.clone(), + ); + Rc::new(FieldInitResult { + field: fi, + tokens: name_r.tokens.clone(), + ctx: ctx.clone(), + err: None, + }) + } } -} + } } else { if (tok_is_lit_str(tok.clone()) && peek_is_colon_after_ident(tokens.clone())) { { let str_name = match tok.clone() { - Some(t) => t.text.clone(), - None => "_".to_string(), -}; -let r = parse_expr(Rc::new(tokens.clone().iter().cloned().skip(2 as usize).collect::>()), ctx.clone()); -if has_err(r.err.clone()) { + Some(t) => t.text.clone(), + None => "_".to_string(), + }; + let r = parse_expr( + Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(2 as usize) + .collect::>(), + ), + ctx.clone(), + ); + if has_err(r.err.clone()) { return Rc::new(FieldInitResult { - field: dummy_fi.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) + field: dummy_fi.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); } -let fi = make_field_init_node(&str_name, r.expr.clone(), span.clone(), no_span()); -Rc::new(FieldInitResult { - field: fi, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -} + let fi = + make_field_init_node(&str_name, r.expr.clone(), span.clone(), no_span()); + Rc::new(FieldInitResult { + field: fi, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } } else { { let r = parse_expr(tokens.clone(), ctx.clone()); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(FieldInitResult { - field: dummy_fi.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) + field: dummy_fi.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); } -let fi = make_field_init_node(&"_".to_string(), r.expr.clone(), span.clone(), no_span()); -Rc::new(FieldInitResult { - field: fi, - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -} + let fi = make_field_init_node( + &"_".to_string(), + r.expr.clone(), + span.clone(), + no_span(), + ); + Rc::new(FieldInitResult { + field: fi, + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } } } -} + } } pub fn parse_list_literal(tokens: &Rc>>, ctx: &Rc) -> Rc { { let span = token_span(tokens.clone().first().cloned()); -let dummy_expr = parse_recovery_placeholder(); -let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectLBracket)); -if has_err(r.err.clone()) { + let dummy_expr = parse_recovery_placeholder(); + let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectLBracket)); + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) - } -let r = parse_expr_list_until(skip_newlines(r.tokens.clone()), ctx.clone(), Rc::new(ExpectedToken::ExpectRBracket)); -if has_err(r.err.clone()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); + } + let r = parse_expr_list_until( + skip_newlines(r.tokens.clone()), + ctx.clone(), + Rc::new(ExpectedToken::ExpectRBracket), + ); + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let r2 = expect(&skip_newlines(r.tokens.clone()), &Rc::new(ExpectedToken::ExpectRBracket)); -if has_err(r2.err.clone()) { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let r2 = expect( + &skip_newlines(r.tokens.clone()), + &Rc::new(ExpectedToken::ExpectRBracket), + ); + if has_err(r2.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), -}) - } -Rc::new(ExprResult { - expr: make_expr_node(Rc::new(ExprData::ExprListLit), r.exprs.clone(), None, span), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -} + expr: dummy_expr.clone(), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), + }); + } + Rc::new(ExprResult { + expr: make_expr_node(Rc::new(ExprData::ExprListLit), r.exprs.clone(), None, span), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } } -pub fn parse_expr_list_until(tokens: Rc>>, ctx: Rc, end_expected: Rc) -> Rc { +pub fn parse_expr_list_until( + tokens: Rc>>, + ctx: Rc, + end_expected: Rc, +) -> Rc { parse_expr_list_until_acc(tokens, ctx, end_expected, Rc::new(vec![])) } -pub fn parse_expr_list_until_acc(mut tokens: Rc>>, mut ctx: Rc, mut end_expected: Rc, mut acc: Rc>>) -> Rc { +pub fn parse_expr_list_until_acc( + mut tokens: Rc>>, + mut ctx: Rc, + mut end_expected: Rc, + mut acc: Rc>>, +) -> Rc { loop { tokens = skip_newlines(tokens.clone()); -let at_end_tag = match tokens.clone().first().cloned() { - Some(t) => token_matches_expected(&t, end_expected.clone()), - None => false, -}; -if (at_end_tag || tok_is_eof(tokens.clone().first().cloned())) { + let at_end_tag = match tokens.clone().first().cloned() { + Some(t) => token_matches_expected(&t, end_expected.clone()), + None => false, + }; + if (at_end_tag || tok_is_eof(tokens.clone().first().cloned())) { break Rc::new(ExprsResult { - exprs: acc, - tokens: tokens.clone(), - ctx: ctx, - err: None, -}); -} else { + exprs: acc, + tokens: tokens.clone(), + ctx: ctx, + err: None, + }); + } else { let r = parse_expr(tokens.clone(), ctx); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(ExprsResult { - exprs: Rc::new(vec![]), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let e = eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); -tokens = skip_newlines(match (*e).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), - EatResult::EatUnchanged { .. } => r.tokens.clone(), -}); -{ + exprs: Rc::new(vec![]), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let e = eat(&r.tokens.clone(), Rc::new(ExpectedToken::ExpectComma)); + tokens = skip_newlines(match (*e).clone() { + EatResult::EatConsumed { tokens: __ec, .. } => __ec.clone(), + EatResult::EatUnchanged { .. } => r.tokens.clone(), + }); + { let __tco_0 = r.ctx.clone(); -let __tco_1 = v2_rt::rc_list_push(acc, r.expr.clone()); -ctx = __tco_0; -acc = __tco_1; -continue; -} -} -} + let __tco_1 = v2_rt::rc_list_push(acc, r.expr.clone()); + ctx = __tco_0; + acc = __tco_1; + continue; + } + } + } } pub fn parse_paren_expr(tokens: &Rc>>, ctx: &Rc) -> Rc { { let span = token_span(tokens.clone().first().cloned()); -let dummy_expr = parse_recovery_placeholder(); -let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectLParen)); -if has_err(r.err.clone()) { + let dummy_expr = parse_recovery_placeholder(); + let r = expect(&tokens, &Rc::new(ExpectedToken::ExpectLParen)); + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: ctx.clone(), - err: r.err.clone(), -}) + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: ctx.clone(), + err: r.err.clone(), + }); } -let tokens = skip_newlines(r.tokens.clone()); -if tok_is_rparen(tokens.clone().first().cloned()) { + let tokens = skip_newlines(r.tokens.clone()); + if tok_is_rparen(tokens.clone().first().cloned()) { Rc::new(ExprResult { - expr: make_expr_node(Rc::new(ExprData::ExprRecordLit { - parent_enum: None, -}), Rc::new(vec![]), None, span), - tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), - ctx: ctx.clone(), - err: None, -}) + expr: make_expr_node( + Rc::new(ExprData::ExprRecordLit { parent_enum: None }), + Rc::new(vec![]), + None, + span, + ), + tokens: Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + ctx: ctx.clone(), + err: None, + }) } else { { let lambda_r = try_lambda_params(&tokens, &ctx); -if lambda_r.is_lambda.clone() { + if lambda_r.is_lambda.clone() { { let r = parse_lambda_body(&lambda_r.tokens.clone(), lambda_r.ctx.clone()); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: r.expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) + expr: r.expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); } -Rc::new(ExprResult { - expr: make_expr_node(Rc::new(ExprData::ExprLambda), v2_rt::concat(Rc::new(vec![r.expr.clone()]), Rc::new({ let mut __result = Vec::new(); for p in lambda_r.params.clone().iter().cloned() { __result.push(parsed_name_leaf(p.name.clone(), p.span.clone())); } __result })), None, span), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -} + Rc::new(ExprResult { + expr: make_expr_node( + Rc::new(ExprData::ExprLambda), + v2_rt::concat( + Rc::new(vec![r.expr.clone()]), + Rc::new({ + let mut __result = Vec::new(); + for p in lambda_r.params.clone().iter().cloned() { + __result.push(parsed_name_leaf( + p.name.clone(), + p.span.clone(), + )); + } + __result + }), + ), + None, + span, + ), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } } else { { let r = parse_expr(lambda_r.tokens.clone(), lambda_r.ctx.clone()); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: r.expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) + expr: r.expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); } -let tokens = skip_newlines(r.tokens.clone()); -let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRParen)); -if has_err(r2.err.clone()) { + let tokens = skip_newlines(r.tokens.clone()); + let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRParen)); + if has_err(r2.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), -}) + expr: dummy_expr.clone(), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), + }); } -Rc::new(ExprResult { - expr: r.expr.clone(), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -} + Rc::new(ExprResult { + expr: r.expr.clone(), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } } -} + } } -} + } } pub fn parse_fn_lambda(tokens: &Rc>>, ctx: &Rc) -> Rc { { let span = token_span(tokens.clone().first().cloned()); -let dummy = parse_recovery_placeholder(); -let r1 = expect(&tokens, &Rc::new(ExpectedToken::ExpectKeyword { - text: "fn".to_string(), -})); -if has_err(r1.err.clone()) { + let dummy = parse_recovery_placeholder(); + let r1 = expect( + &tokens, + &Rc::new(ExpectedToken::ExpectKeyword { + text: "fn".to_string(), + }), + ); + if has_err(r1.err.clone()) { return Rc::new(ExprResult { - expr: dummy.clone(), - tokens: r1.tokens.clone(), - ctx: ctx.clone(), - err: r1.err.clone(), -}) - } -let r2 = expect(&r1.tokens.clone(), &Rc::new(ExpectedToken::ExpectLParen)); -if has_err(r2.err.clone()) { + expr: dummy.clone(), + tokens: r1.tokens.clone(), + ctx: ctx.clone(), + err: r1.err.clone(), + }); + } + let r2 = expect(&r1.tokens.clone(), &Rc::new(ExpectedToken::ExpectLParen)); + if has_err(r2.err.clone()) { return Rc::new(ExprResult { - expr: dummy.clone(), - tokens: r2.tokens.clone(), - ctx: ctx.clone(), - err: r2.err.clone(), -}) - } -let params_r = collect_fn_lambda_params(r2.tokens.clone(), ctx.clone(), Rc::new(vec![])); -let r3 = expect(¶ms_r.tokens.clone(), &Rc::new(ExpectedToken::ExpectRParen)); -if has_err(r3.err.clone()) { + expr: dummy.clone(), + tokens: r2.tokens.clone(), + ctx: ctx.clone(), + err: r2.err.clone(), + }); + } + let params_r = collect_fn_lambda_params(r2.tokens.clone(), ctx.clone(), Rc::new(vec![])); + let r3 = expect( + ¶ms_r.tokens.clone(), + &Rc::new(ExpectedToken::ExpectRParen), + ); + if has_err(r3.err.clone()) { return Rc::new(ExprResult { - expr: dummy.clone(), - tokens: r3.tokens.clone(), - ctx: params_r.ctx.clone(), - err: r3.err.clone(), -}) - } -let tokens = skip_newlines(r3.tokens.clone()); -let body_r = parse_brace_expr(&tokens, params_r.ctx.clone()); -if has_err(body_r.err.clone()) { - return body_r.clone() - } -Rc::new(ExprResult { - expr: make_expr_node(Rc::new(ExprData::ExprLambda), v2_rt::concat(Rc::new(vec![body_r.expr.clone()]), Rc::new({ let mut __result = Vec::new(); for p in params_r.params.clone().iter().cloned() { __result.push(parsed_name_leaf(p.name.clone(), p.span.clone())); } __result })), None, span), - tokens: body_r.tokens.clone(), - ctx: body_r.ctx.clone(), - err: None, -}) -} + expr: dummy.clone(), + tokens: r3.tokens.clone(), + ctx: params_r.ctx.clone(), + err: r3.err.clone(), + }); + } + let tokens = skip_newlines(r3.tokens.clone()); + let body_r = parse_brace_expr(&tokens, params_r.ctx.clone()); + if has_err(body_r.err.clone()) { + return body_r.clone(); + } + Rc::new(ExprResult { + expr: make_expr_node( + Rc::new(ExprData::ExprLambda), + v2_rt::concat( + Rc::new(vec![body_r.expr.clone()]), + Rc::new({ + let mut __result = Vec::new(); + for p in params_r.params.clone().iter().cloned() { + __result.push(parsed_name_leaf(p.name.clone(), p.span.clone())); + } + __result + }), + ), + None, + span, + ), + tokens: body_r.tokens.clone(), + ctx: body_r.ctx.clone(), + err: None, + }) + } } -pub fn collect_fn_lambda_params(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { +pub fn collect_fn_lambda_params( + mut tokens: Rc>>, + mut ctx: Rc, + mut acc: Rc>>, +) -> Rc { loop { tokens = skip_newlines(tokens.clone()); -if tok_is_rparen(tokens.clone().first().cloned()) { + if tok_is_rparen(tokens.clone().first().cloned()) { break Rc::new(IdentCollectResult { - success: true, - params: acc, - tokens: tokens.clone(), - ctx: ctx, - err: None, -}); -} else { + success: true, + params: acc, + tokens: tokens.clone(), + ctx: ctx, + err: None, + }); + } else { let name_r = expect_ident(&tokens); -if has_err(name_r.err.clone()) { + if has_err(name_r.err.clone()) { break Rc::new(IdentCollectResult { - success: false, - params: acc, - tokens: name_r.tokens.clone(), - ctx: ctx, - err: name_r.err.clone(), -}); -} else { + success: false, + params: acc, + tokens: name_r.tokens.clone(), + ctx: ctx, + err: name_r.err.clone(), + }); + } else { tokens = skip_newlines(name_r.tokens.clone()); -if tok_is_comma(tokens.clone().first().cloned()) { + if tok_is_comma(tokens.clone().first().cloned()) { { - let __tco_0 = Rc::new(tokens.iter().cloned().skip(1 as usize).collect::>()); -let __tco_1 = v2_rt::rc_list_push(acc, Rc::new(ParserParam { - name: name_r.name.clone(), - span: name_r.span.clone(), -})); -tokens = __tco_0; -acc = __tco_1; -continue; -} -} else { + let __tco_0 = + Rc::new(tokens.iter().cloned().skip(1 as usize).collect::>()); + let __tco_1 = v2_rt::rc_list_push( + acc, + Rc::new(ParserParam { + name: name_r.name.clone(), + span: name_r.span.clone(), + }), + ); + tokens = __tco_0; + acc = __tco_1; + continue; + } + } else { break Rc::new(IdentCollectResult { - success: true, - params: v2_rt::rc_list_push(acc, Rc::new(ParserParam { - name: name_r.name.clone(), - span: name_r.span.clone(), -})), - tokens: tokens.clone(), - ctx: ctx, - err: None, -}); -} -} -} -} + success: true, + params: v2_rt::rc_list_push( + acc, + Rc::new(ParserParam { + name: name_r.name.clone(), + span: name_r.span.clone(), + }), + ), + tokens: tokens.clone(), + ctx: ctx, + err: None, + }); + } + } + } + } } -pub fn try_lambda_params(tokens: &Rc>>, ctx: &Rc) -> Rc { +pub fn try_lambda_params( + tokens: &Rc>>, + ctx: &Rc, +) -> Rc { { let r = collect_lambda_idents(tokens.clone(), ctx.clone(), Rc::new(vec![])); -if (r.success.clone() && ((r.params.clone().len() as i64) >= 2)) { + if (r.success.clone() && ((r.params.clone().len() as i64) >= 2)) { if tok_is_rparen(r.tokens.clone().first().cloned()) { { - let after_rparen = Rc::new(r.tokens.clone().iter().cloned().skip(1 as usize).collect::>()); -if tok_is_fat_arrow(after_rparen.clone().first().cloned()) { + let after_rparen = Rc::new( + r.tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ); + if tok_is_fat_arrow(after_rparen.clone().first().cloned()) { Rc::new(LambdaCheckResult { - is_lambda: true, - params: r.params.clone(), - tokens: Rc::new(after_rparen.clone().iter().cloned().skip(1 as usize).collect::>()), - ctx: r.ctx.clone(), - err: None, -}) + is_lambda: true, + params: r.params.clone(), + tokens: Rc::new( + after_rparen + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + ctx: r.ctx.clone(), + err: None, + }) } else { Rc::new(LambdaCheckResult { - is_lambda: false, - params: Rc::new(vec![]), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}) + is_lambda: false, + params: Rc::new(vec![]), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }) } -} + } } else { Rc::new(LambdaCheckResult { - is_lambda: false, - params: Rc::new(vec![]), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}) + is_lambda: false, + params: Rc::new(vec![]), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }) } } else { Rc::new(LambdaCheckResult { - is_lambda: false, - params: Rc::new(vec![]), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}) + is_lambda: false, + params: Rc::new(vec![]), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }) } -} + } } -pub fn collect_lambda_idents(mut tokens: Rc>>, mut ctx: Rc, mut acc: Rc>>) -> Rc { +pub fn collect_lambda_idents( + mut tokens: Rc>>, + mut ctx: Rc, + mut acc: Rc>>, +) -> Rc { loop { if tok_is_ident(tokens.clone().first().cloned()) { let tok = tokens.clone().first().cloned(); -let param = Rc::new(ParserParam { - name: tok.clone().unwrap().text.clone(), - span: tok.clone().unwrap().span.clone(), -}); -let new_acc = v2_rt::rc_list_push(acc, param); -match (*eat(&Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), Rc::new(ExpectedToken::ExpectComma))).clone() { - EatResult::EatConsumed { tokens: __ec, .. } => { { - let __tco_0 = __ec.clone(); -let __tco_1 = new_acc; -tokens = __tco_0; -acc = __tco_1; -continue; -} }, - EatResult::EatUnchanged { tokens: __eu, .. } => { break Rc::new(IdentCollectResult { - success: true, - params: new_acc, - tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), - ctx: ctx, - err: None, -}); }, -} -} else { + let param = Rc::new(ParserParam { + name: tok.clone().unwrap().text.clone(), + span: tok.clone().unwrap().span.clone(), + }); + let new_acc = v2_rt::rc_list_push(acc, param); + match (*eat( + &Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + Rc::new(ExpectedToken::ExpectComma), + )) + .clone() + { + EatResult::EatConsumed { tokens: __ec, .. } => { + let __tco_0 = __ec.clone(); + let __tco_1 = new_acc; + tokens = __tco_0; + acc = __tco_1; + continue; + } + EatResult::EatUnchanged { tokens: __eu, .. } => { + break Rc::new(IdentCollectResult { + success: true, + params: new_acc, + tokens: Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + ctx: ctx, + err: None, + }); + } + } + } else { break Rc::new(IdentCollectResult { - success: false, - params: acc, - tokens: tokens.clone(), - ctx: ctx, - err: None, -}); -} -} + success: false, + params: acc, + tokens: tokens.clone(), + ctx: ctx, + err: None, + }); + } + } } pub fn parse_string_interp(tokens: &Rc>>, ctx: Rc) -> Rc { { let tok = tokens.clone().first().cloned(); -let span = token_span(tok.clone()); -let sh = match tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, -}; -match sh { - Some(TokenShape::ShStrBegin) => { - let prefix = tok.clone().unwrap().text.clone(); -let parts_init = if (v2_rt::string_length(&prefix) > 0) { - Rc::new(vec![Rc::new(StringPart::Text { - value: prefix.clone(), -})]) - } else { - Rc::new(vec![]) - }; -parse_interp_parts(Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), ctx, parts_init, span.clone()) -}, - _ => Rc::new(ExprResult { - expr: parse_recovery_expr(span.clone(), "expected string interpolation".to_string()), - tokens: tokens.clone(), - ctx: ctx, - err: Some(parse_error("expected string interpolation".to_string(), span.clone())), -}), -} -} + let span = token_span(tok.clone()); + let sh = match tok.clone() { + Some(t) => Some(t.shape.clone()), + None => None, + }; + match sh { + Some(TokenShape::ShStrBegin) => { + let prefix = tok.clone().unwrap().text.clone(); + let parts_init = if (v2_rt::string_length(&prefix) > 0) { + Rc::new(vec![Rc::new(StringPart::Text { + value: prefix.clone(), + })]) + } else { + Rc::new(vec![]) + }; + parse_interp_parts( + Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + ctx, + parts_init, + span.clone(), + ) + } + _ => Rc::new(ExprResult { + expr: parse_recovery_expr( + span.clone(), + "expected string interpolation".to_string(), + ), + tokens: tokens.clone(), + ctx: ctx, + err: Some(parse_error( + "expected string interpolation".to_string(), + span.clone(), + )), + }), + } + } } -pub fn parse_interp_parts(mut tokens: Rc>>, mut ctx: Rc, mut parts: Rc>>, mut span: Rc) -> Rc { +pub fn parse_interp_parts( + mut tokens: Rc>>, + mut ctx: Rc, + mut parts: Rc>>, + mut span: Rc, +) -> Rc { loop { let r = parse_expr(tokens.clone(), ctx.clone()); -if has_err(r.err.clone()) { - return r.clone() - } -let new_parts = v2_rt::rc_list_push(parts, Rc::new(StringPart::Interpolation { - expr: r.expr.clone(), -})); -tokens = r.tokens.clone(); -ctx = r.ctx.clone(); -let interp_tok = tokens.clone().first().cloned(); -let interp_sh = match interp_tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, -}; -match interp_sh { - Some(TokenShape::ShStrMid) => { let mid = interp_tok.clone().unwrap().text.clone(); -let mid_parts = if (v2_rt::string_length(&mid) > 0) { - v2_rt::rc_list_push(new_parts, Rc::new(StringPart::Text { - value: mid.clone(), -})) - } else { - new_parts - }; -{ - let __tco_0 = Rc::new(tokens.iter().cloned().skip(1 as usize).collect::>()); -let __tco_1 = mid_parts; -tokens = __tco_0; -parts = __tco_1; -continue; -} }, - Some(TokenShape::ShStrEnd) => { let suffix = interp_tok.clone().unwrap().text.clone(); -let final_parts = if (v2_rt::string_length(&suffix) > 0) { - v2_rt::rc_list_push(new_parts, Rc::new(StringPart::Text { - value: suffix.clone(), -})) - } else { - new_parts + if has_err(r.err.clone()) { + return r.clone(); + } + let new_parts = v2_rt::rc_list_push( + parts, + Rc::new(StringPart::Interpolation { + expr: r.expr.clone(), + }), + ); + tokens = r.tokens.clone(); + ctx = r.ctx.clone(); + let interp_tok = tokens.clone().first().cloned(); + let interp_sh = match interp_tok.clone() { + Some(t) => Some(t.shape.clone()), + None => None, }; -break Rc::new(ExprResult { - expr: make_expr_node(Rc::new(ExprData::ExprStringInterp), Rc::new({ let mut __result = Vec::new(); for p in final_parts.iter().cloned() { __result.push(match (*p.clone()).clone() { - StringPart::Text { value: v, .. } => make_text_part_node(v.clone(), span.clone()), - StringPart::Interpolation { expr: e, .. } => make_interp_part_node(e.clone(), span.clone()), -}); } __result }), None, span.clone()), - tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), - ctx: ctx.clone(), - err: None, -}); }, - _ => { break Rc::new(ExprResult { - expr: make_expr_node(Rc::new(ExprData::ExprStringInterp), Rc::new({ let mut __result = Vec::new(); for p in new_parts.iter().cloned() { __result.push(match (*p.clone()).clone() { - StringPart::Text { value: v, .. } => make_text_part_node(v.clone(), span.clone()), - StringPart::Interpolation { expr: e, .. } => make_interp_part_node(e.clone(), span.clone()), -}); } __result }), None, span.clone()), - tokens: tokens.clone(), - ctx: ctx.clone(), - err: None, -}); }, -} -} + match interp_sh { + Some(TokenShape::ShStrMid) => { + let mid = interp_tok.clone().unwrap().text.clone(); + let mid_parts = if (v2_rt::string_length(&mid) > 0) { + v2_rt::rc_list_push(new_parts, Rc::new(StringPart::Text { value: mid.clone() })) + } else { + new_parts + }; + { + let __tco_0 = + Rc::new(tokens.iter().cloned().skip(1 as usize).collect::>()); + let __tco_1 = mid_parts; + tokens = __tco_0; + parts = __tco_1; + continue; + } + } + Some(TokenShape::ShStrEnd) => { + let suffix = interp_tok.clone().unwrap().text.clone(); + let final_parts = if (v2_rt::string_length(&suffix) > 0) { + v2_rt::rc_list_push( + new_parts, + Rc::new(StringPart::Text { + value: suffix.clone(), + }), + ) + } else { + new_parts + }; + break Rc::new(ExprResult { + expr: make_expr_node( + Rc::new(ExprData::ExprStringInterp), + Rc::new({ + let mut __result = Vec::new(); + for p in final_parts.iter().cloned() { + __result.push(match (*p.clone()).clone() { + StringPart::Text { value: v, .. } => { + make_text_part_node(v.clone(), span.clone()) + } + StringPart::Interpolation { expr: e, .. } => { + make_interp_part_node(e.clone(), span.clone()) + } + }); + } + __result + }), + None, + span.clone(), + ), + tokens: Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + ctx: ctx.clone(), + err: None, + }); + } + _ => { + break Rc::new(ExprResult { + expr: make_expr_node( + Rc::new(ExprData::ExprStringInterp), + Rc::new({ + let mut __result = Vec::new(); + for p in new_parts.iter().cloned() { + __result.push(match (*p.clone()).clone() { + StringPart::Text { value: v, .. } => { + make_text_part_node(v.clone(), span.clone()) + } + StringPart::Interpolation { expr: e, .. } => { + make_interp_part_node(e.clone(), span.clone()) + } + }); + } + __result + }), + None, + span.clone(), + ), + tokens: tokens.clone(), + ctx: ctx.clone(), + err: None, + }); + } + } + } } pub fn parse_brace_expr(tokens: &Rc>>, ctx: Rc) -> Rc { { let span = token_span(tokens.clone().first().cloned()); -let dummy_expr = parse_recovery_placeholder(); -let tokens = skip_newlines(Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>())); -let tok = tokens.clone().first().cloned(); -if tok_is_rbrace(tok.clone()) { + let dummy_expr = parse_recovery_placeholder(); + let tokens = skip_newlines(Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + )); + let tok = tokens.clone().first().cloned(); + if tok_is_rbrace(tok.clone()) { Rc::new(ExprResult { - expr: make_expr_node(Rc::new(ExprData::ExprRecordLit { - parent_enum: None, -}), Rc::new(vec![]), None, span), - tokens: Rc::new(tokens.clone().iter().cloned().skip(1 as usize).collect::>()), - ctx: ctx, - err: None, -}) + expr: make_expr_node( + Rc::new(ExprData::ExprRecordLit { parent_enum: None }), + Rc::new(vec![]), + None, + span, + ), + tokens: Rc::new( + tokens + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ), + ctx: ctx, + err: None, + }) } else { { let sh = match tok.clone() { - Some(t) => Some(t.shape.clone()), - None => None, -}; -match sh { - Some(TokenShape::ShKeyword) => { - let brace_kw = tok_keyword_text(tok.clone()); -if ((brace_kw.clone().as_str() == "let".to_string().as_str()) || (brace_kw.clone().as_str() == "return".to_string().as_str())) { + Some(t) => Some(t.shape.clone()), + None => None, + }; + match sh { + Some(TokenShape::ShKeyword) => { + let brace_kw = tok_keyword_text(tok.clone()); + if ((brace_kw.clone().as_str() == "let".to_string().as_str()) + || (brace_kw.clone().as_str() == "return".to_string().as_str())) { - let r = parse_stmts(tokens.clone(), ctx); -if has_err(r.err.clone()) { - return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let tokens = skip_newlines(r.tokens.clone()); -let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); -if has_err(r2.err.clone()) { - return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), -}) - } -if ((r.stmts.clone().len() as i64) == 1) { - Rc::new(ExprResult { - expr: r.stmts.clone().first().cloned().clone().unwrap(), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) - } else { - Rc::new(ExprResult { - expr: make_expr_node(Rc::new(ExprData::ExprBlock), r.stmts.clone(), None, span), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) - } -} - } else { - if (tok_is_keyword_name(tok.clone()) && peek_is_colon_after_ident(tokens.clone())) { { - let r = parse_field_init_list(tokens.clone(), ctx); -if has_err(r.err.clone()) { + let r = parse_stmts(tokens.clone(), ctx); + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); } -let tokens = skip_newlines(r.tokens.clone()); -let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); -if has_err(r2.err.clone()) { + let tokens = skip_newlines(r.tokens.clone()); + let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); + if has_err(r2.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), -}) + expr: dummy_expr.clone(), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), + }); } -Rc::new(ExprResult { - expr: make_expr_node(Rc::new(ExprData::ExprRecordLit { - parent_enum: None, -}), r.fields.clone(), None, span), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -} + if ((r.stmts.clone().len() as i64) == 1) { + Rc::new(ExprResult { + expr: r.stmts.clone().first().cloned().clone().unwrap(), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } else { + Rc::new(ExprResult { + expr: make_expr_node( + Rc::new(ExprData::ExprBlock), + r.stmts.clone(), + None, + span, + ), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } + } } else { + if (tok_is_keyword_name(tok.clone()) + && peek_is_colon_after_ident(tokens.clone())) { - let r = parse_expr(tokens.clone(), ctx); -if has_err(r.err.clone()) { - return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) + { + let r = parse_field_init_list(tokens.clone(), ctx); + if has_err(r.err.clone()) { + return Rc::new(ExprResult { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let tokens = skip_newlines(r.tokens.clone()); + let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); + if has_err(r2.err.clone()) { + return Rc::new(ExprResult { + expr: dummy_expr.clone(), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), + }); + } + Rc::new(ExprResult { + expr: make_expr_node( + Rc::new(ExprData::ExprRecordLit { parent_enum: None }), + r.fields.clone(), + None, + span, + ), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) } -let tokens = skip_newlines(r.tokens.clone()); -let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); -if has_err(r2.err.clone()) { - return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), -}) + } else { + { + let r = parse_expr(tokens.clone(), ctx); + if has_err(r.err.clone()) { + return Rc::new(ExprResult { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let tokens = skip_newlines(r.tokens.clone()); + let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); + if has_err(r2.err.clone()) { + return Rc::new(ExprResult { + expr: dummy_expr.clone(), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), + }); + } + Rc::new(ExprResult { + expr: r.expr.clone(), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) } -Rc::new(ExprResult { - expr: r.expr.clone(), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -} + } } } -}, - _ => { - let ident_or_keyword = (tok_is_ident(tok.clone()) || tok_is_keyword_name(tok.clone())); -if (ident_or_keyword && peek_is_colon_after_ident(tokens.clone())) { - { - let r = parse_field_init_list(tokens.clone(), ctx); -if has_err(r.err.clone()) { - return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let tokens = skip_newlines(r.tokens.clone()); -let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); -if has_err(r2.err.clone()) { - return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), -}) - } -Rc::new(ExprResult { - expr: make_expr_node(Rc::new(ExprData::ExprRecordLit { - parent_enum: None, -}), r.fields.clone(), None, span), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -} - } else { - if (tok_is_lit_str(tok.clone()) && peek_is_colon_after_ident(tokens.clone())) { + _ => { + let ident_or_keyword = + (tok_is_ident(tok.clone()) || tok_is_keyword_name(tok.clone())); + if (ident_or_keyword && peek_is_colon_after_ident(tokens.clone())) { { let r = parse_field_init_list(tokens.clone(), ctx); -if has_err(r.err.clone()) { + if has_err(r.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); } -let tokens = skip_newlines(r.tokens.clone()); -let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); -if has_err(r2.err.clone()) { + let tokens = skip_newlines(r.tokens.clone()); + let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); + if has_err(r2.err.clone()) { return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), -}) + expr: dummy_expr.clone(), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), + }); } -Rc::new(ExprResult { - expr: make_expr_node(Rc::new(ExprData::ExprRecordLit { - parent_enum: None, -}), r.fields.clone(), None, span), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) -} + Rc::new(ExprResult { + expr: make_expr_node( + Rc::new(ExprData::ExprRecordLit { parent_enum: None }), + r.fields.clone(), + None, + span, + ), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } } else { + if (tok_is_lit_str(tok.clone()) + && peek_is_colon_after_ident(tokens.clone())) { - let r = parse_stmts(tokens.clone(), ctx); -if has_err(r.err.clone()) { - return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r.tokens.clone(), - ctx: r.ctx.clone(), - err: r.err.clone(), -}) - } -let tokens = skip_newlines(r.tokens.clone()); -let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); -if has_err(r2.err.clone()) { - return Rc::new(ExprResult { - expr: dummy_expr.clone(), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: r2.err.clone(), -}) - } -if ((r.stmts.clone().len() as i64) == 1) { - Rc::new(ExprResult { - expr: r.stmts.clone().first().cloned().clone().unwrap(), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) - } else { + { + let r = parse_field_init_list(tokens.clone(), ctx); + if has_err(r.err.clone()) { + return Rc::new(ExprResult { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let tokens = skip_newlines(r.tokens.clone()); + let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); + if has_err(r2.err.clone()) { + return Rc::new(ExprResult { + expr: dummy_expr.clone(), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), + }); + } Rc::new(ExprResult { - expr: make_expr_node(Rc::new(ExprData::ExprBlock), r.stmts.clone(), None, span), - tokens: r2.tokens.clone(), - ctx: r.ctx.clone(), - err: None, -}) + expr: make_expr_node( + Rc::new(ExprData::ExprRecordLit { parent_enum: None }), + r.fields.clone(), + None, + span, + ), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) } -} + } else { + { + let r = parse_stmts(tokens.clone(), ctx); + if has_err(r.err.clone()) { + return Rc::new(ExprResult { + expr: dummy_expr.clone(), + tokens: r.tokens.clone(), + ctx: r.ctx.clone(), + err: r.err.clone(), + }); + } + let tokens = skip_newlines(r.tokens.clone()); + let r2 = expect(&tokens, &Rc::new(ExpectedToken::ExpectRBrace)); + if has_err(r2.err.clone()) { + return Rc::new(ExprResult { + expr: dummy_expr.clone(), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: r2.err.clone(), + }); + } + if ((r.stmts.clone().len() as i64) == 1) { + Rc::new(ExprResult { + expr: r.stmts.clone().first().cloned().clone().unwrap(), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } else { + Rc::new(ExprResult { + expr: make_expr_node( + Rc::new(ExprData::ExprBlock), + r.stmts.clone(), + None, + span, + ), + tokens: r2.tokens.clone(), + ctx: r.ctx.clone(), + err: None, + }) + } + } + } } } -}, -} -} + } + } } -} + } } pub fn peek_is_colon_after_ident(tokens: Rc>>) -> bool { match tokens.get(1 as usize).cloned() { - Some(t) => is_colon_shape(t.shape.clone()), - None => false, -} + Some(t) => is_colon_shape(t.shape.clone()), + None => false, + } } diff --git a/src/v2/stage0/src/v2_compiler_resolve.rs b/src/v2/stage0/src/v2_compiler_resolve.rs index 6544945bd40..be03f94ffd6 100644 --- a/src/v2/stage0/src/v2_compiler_resolve.rs +++ b/src/v2/stage0/src/v2_compiler_resolve.rs @@ -1,15 +1,21 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.resolve -use std::collections::HashMap; -use std::rc::Rc; +pub use crate::std_types::kernel_type_set; use crate::v2_rt; -use crate::NonEmptyVec; -use crate::NonEmptyBTreeSet; -pub use crate::std_types::{kernel_type_set}; -pub use crate::v2_std_core::{Node, Connective, ErrorNode, make_error_node, no_span, module_node, import_node, import_is_all, import_specific_names_at, module_imports, module_items, NewlineIndex, authored_name_at, CompilerDiagnostic}; +use crate::v2_std_core::CompilerDiagnostic::{ + CircularDependency, DuplicateModule, MissingExport, UnresolvedImport, +}; use crate::v2_std_core::Connective::{Conj, Disj, NoConnective}; -use crate::v2_std_core::CompilerDiagnostic::{UnresolvedImport, MissingExport, DuplicateModule, CircularDependency}; +pub use crate::v2_std_core::{ + authored_name_at, import_is_all, import_node, import_specific_names_at, make_error_node, + module_imports, module_items, module_node, no_span, CompilerDiagnostic, Connective, ErrorNode, + NewlineIndex, Node, +}; +use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] pub struct ModuleGraph { @@ -46,56 +52,130 @@ pub struct ResolveAccum { pub fn map_has(m: Rc>, key: String) -> bool { match v2_rt::map_get(&m, key) { - Some(_) => true, - None => false, -} + Some(_) => true, + None => false, + } } -pub fn resolve_modules(modules: &Rc>>, source_indices: &Rc>>) -> Rc { +pub fn resolve_modules( + modules: &Rc>>, + source_indices: &Rc>>, +) -> Rc { { let dup_diags = check_duplicate_modules(modules.clone(), source_indices.clone()); -let module_index = modules.clone().iter().cloned().fold(v2_rt::rc_empty_map::>(), |acc: Rc>>, m: Rc| v2_rt::rc_map_insert(acc, authored_name_at(source_indices.clone(), &m), m.clone())); -let export_sets = modules.clone().iter().cloned().fold(v2_rt::rc_empty_map::>>(), |acc: Rc>>>, m: Rc| { - let exported = get_exported_names(&m, source_indices.clone()); -let exported_set = exported.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |inner_acc: Rc>, name: String| v2_rt::rc_map_insert(inner_acc, name.clone(), true)); -v2_rt::rc_map_insert(acc, authored_name_at(source_indices.clone(), &m), exported_set.clone()) -}); -let resolve_accum = modules.clone().iter().cloned().fold(Rc::new(ResolveAccum { - imports_by_name: v2_rt::rc_empty_map::>>>(), - diagnostics: Rc::new(vec![]), -}), |acc: Rc, m: Rc| { let acc = Rc::try_unwrap(acc).unwrap_or_else(|rc| (*rc).clone()); { - let result = resolve_module_imports(&m, module_index.clone(), export_sets.clone(), source_indices.clone()); -Rc::new(ResolveAccum { - imports_by_name: v2_rt::rc_map_insert(acc.imports_by_name, authored_name_at(source_indices.clone(), &m), result.resolved_imports.clone()), - diagnostics: v2_rt::concat(acc.diagnostics, result.diagnostics.clone()), -}) -} }); -let imports_by_name = resolve_accum.imports_by_name.clone(); -let import_diags = resolve_accum.diagnostics.clone(); -let topo_result = topological_sort(&modules, source_indices.clone()); -let topo_diags = match topo_result.cycle_error.clone() { - Some(diag) => Rc::new(vec![diag.clone()]), - None => Rc::new(vec![]), -}; -let sorted_names = topo_result.sorted.clone(); -let sorted_order_map = Rc::new(sorted_names.iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, pair: (i64, String)| v2_rt::rc_map_insert(acc, pair.1.clone(), pair.0.clone())); -let acyclic_resolved = Rc::new({ let mut __result = Vec::new(); for m in modules.clone().iter().cloned() { __result.extend((*match v2_rt::map_get(&sorted_order_map, authored_name_at(source_indices.clone(), &m)) { - Some(order) => match v2_rt::map_get(&imports_by_name, authored_name_at(source_indices.clone(), &m)) { - Some(imps) => Rc::new(vec![Rc::new(ResolvedModule { - module: m.clone(), - resolved_imports: imps.clone(), - dep_order: order.clone(), -})]), - None => Rc::new(vec![]), -}, - None => Rc::new(vec![]), -}).iter().cloned()); } __result }); -let sorted_resolved = Rc::new({ let mut __sorted: Vec<_> = acyclic_resolved.iter().cloned().collect(); __sorted.sort_by(|a: &Rc, b: &Rc| { let __ka = (|m: Rc| m.dep_order.clone())(a.clone()); let __kb = (|m: Rc| m.dep_order.clone())(b.clone()); __ka.partial_cmp(&__kb).unwrap_or(std::cmp::Ordering::Equal) }); __sorted }); -Rc::new(ModuleGraph { - modules: sorted_resolved, - diagnostics: v2_rt::concat(v2_rt::concat(dup_diags, import_diags), topo_diags), -}) -} + let module_index = modules.clone().iter().cloned().fold( + v2_rt::rc_empty_map::>(), + |acc: Rc>>, m: Rc| { + v2_rt::rc_map_insert(acc, authored_name_at(source_indices.clone(), &m), m.clone()) + }, + ); + let export_sets = modules.clone().iter().cloned().fold( + v2_rt::rc_empty_map::>>(), + |acc: Rc>>>, m: Rc| { + let exported = get_exported_names(&m, source_indices.clone()); + let exported_set = exported.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |inner_acc: Rc>, name: String| { + v2_rt::rc_map_insert(inner_acc, name.clone(), true) + }, + ); + v2_rt::rc_map_insert( + acc, + authored_name_at(source_indices.clone(), &m), + exported_set.clone(), + ) + }, + ); + let resolve_accum = modules.clone().iter().cloned().fold( + Rc::new(ResolveAccum { + imports_by_name: v2_rt::rc_empty_map::>>>(), + diagnostics: Rc::new(vec![]), + }), + |acc: Rc, m: Rc| { + let acc = Rc::try_unwrap(acc).unwrap_or_else(|rc| (*rc).clone()); + { + let result = resolve_module_imports( + &m, + module_index.clone(), + export_sets.clone(), + source_indices.clone(), + ); + Rc::new(ResolveAccum { + imports_by_name: v2_rt::rc_map_insert( + acc.imports_by_name, + authored_name_at(source_indices.clone(), &m), + result.resolved_imports.clone(), + ), + diagnostics: v2_rt::concat(acc.diagnostics, result.diagnostics.clone()), + }) + } + }, + ); + let imports_by_name = resolve_accum.imports_by_name.clone(); + let import_diags = resolve_accum.diagnostics.clone(); + let topo_result = topological_sort(&modules, source_indices.clone()); + let topo_diags = match topo_result.cycle_error.clone() { + Some(diag) => Rc::new(vec![diag.clone()]), + None => Rc::new(vec![]), + }; + let sorted_names = topo_result.sorted.clone(); + let sorted_order_map = Rc::new( + sorted_names + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + .fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, pair: (i64, String)| { + v2_rt::rc_map_insert(acc, pair.1.clone(), pair.0.clone()) + }, + ); + let acyclic_resolved = Rc::new({ + let mut __result = Vec::new(); + for m in modules.clone().iter().cloned() { + __result.extend( + (*match v2_rt::map_get( + &sorted_order_map, + authored_name_at(source_indices.clone(), &m), + ) { + Some(order) => match v2_rt::map_get( + &imports_by_name, + authored_name_at(source_indices.clone(), &m), + ) { + Some(imps) => Rc::new(vec![Rc::new(ResolvedModule { + module: m.clone(), + resolved_imports: imps.clone(), + dep_order: order.clone(), + })]), + None => Rc::new(vec![]), + }, + None => Rc::new(vec![]), + }) + .iter() + .cloned(), + ); + } + __result + }); + let sorted_resolved = Rc::new({ + let mut __sorted: Vec<_> = acyclic_resolved.iter().cloned().collect(); + __sorted.sort_by(|a: &Rc, b: &Rc| { + let __ka = (|m: Rc| m.dep_order.clone())(a.clone()); + let __kb = (|m: Rc| m.dep_order.clone())(b.clone()); + __ka.partial_cmp(&__kb).unwrap_or(std::cmp::Ordering::Equal) + }); + __sorted + }); + Rc::new(ModuleGraph { + modules: sorted_resolved, + diagnostics: v2_rt::concat(v2_rt::concat(dup_diags, import_diags), topo_diags), + }) + } } pub fn find_module(module_index: Rc>>, path: String) -> Option> { @@ -108,16 +188,58 @@ pub struct ModuleResolveResult { pub diagnostics: Rc>>, } -pub fn resolve_module_imports(module: &Rc, module_index: Rc>>, export_sets: Rc>>>, source_indices: Rc>>) -> Rc { +pub fn resolve_module_imports( + module: &Rc, + module_index: Rc>>, + export_sets: Rc>>>, + source_indices: Rc>>, +) -> Rc { { - let results = Rc::new({ let mut __result = Vec::new(); for imp in module_imports(module.clone()).iter().cloned() { __result.push(resolve_import(&imp, module_index.clone(), &authored_name_at(source_indices.clone(), &module), export_sets.clone(), &source_indices)); } __result }); -let resolved = Rc::new({ let mut __result = Vec::new(); for r in Rc::new({ let mut __result = Vec::new(); for r in results.clone().iter().cloned() { if ((r.resolved.clone().target_module.clone() != None) && ((r.diagnostics.clone().len() as i64) == 0)) { __result.push(r); } } __result }).iter().cloned() { __result.push(r.resolved.clone()); } __result }); -let diags = Rc::new({ let mut __result = Vec::new(); for r in results.clone().iter().cloned() { __result.extend((*r.diagnostics.clone()).iter().cloned()); } __result }); -Rc::new(ModuleResolveResult { - resolved_imports: resolved, - diagnostics: diags, -}) -} + let results = Rc::new({ + let mut __result = Vec::new(); + for imp in module_imports(module.clone()).iter().cloned() { + __result.push(resolve_import( + &imp, + module_index.clone(), + &authored_name_at(source_indices.clone(), &module), + export_sets.clone(), + &source_indices, + )); + } + __result + }); + let resolved = Rc::new({ + let mut __result = Vec::new(); + for r in Rc::new({ + let mut __result = Vec::new(); + for r in results.clone().iter().cloned() { + if ((r.resolved.clone().target_module.clone() != None) + && ((r.diagnostics.clone().len() as i64) == 0)) + { + __result.push(r); + } + } + __result + }) + .iter() + .cloned() + { + __result.push(r.resolved.clone()); + } + __result + }); + let diags = Rc::new({ + let mut __result = Vec::new(); + for r in results.clone().iter().cloned() { + __result.extend((*r.diagnostics.clone()).iter().cloned()); + } + __result + }); + Rc::new(ModuleResolveResult { + resolved_imports: resolved, + diagnostics: diags, + }) + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -126,82 +248,165 @@ pub struct ImportResolveResult { pub diagnostics: Rc>>, } -pub fn resolve_import(import: &Rc, module_index: Rc>>, importing_module: &String, export_sets: Rc>>>, source_indices: &Rc>>) -> Rc { +pub fn resolve_import( + import: &Rc, + module_index: Rc>>, + importing_module: &String, + export_sets: Rc>>>, + source_indices: &Rc>>, +) -> Rc { { let import_path = authored_name_at(source_indices.clone(), &import); -let target = find_module(module_index, import_path.clone()); -match target { - None => { - let diag = make_error_node(Rc::new(CompilerDiagnostic::UnresolvedImport { - module_path: import_path.clone(), - importing_module: importing_module.clone(), - span: import.span.clone(), -}), importing_module.clone()); -Rc::new(ImportResolveResult { - resolved: Rc::new(ResolvedImport { - module_path: import_path.clone(), - is_all: import_is_all(import.clone()), - specific_names: import_specific_names_at(import.clone(), source_indices.clone()), - target_module: None, -}), - diagnostics: Rc::new(vec![diag]), -}) -}, - Some(target_mod) => { - let exported_set = match v2_rt::map_get(&export_sets, import_path.clone()) { - Some(set) => set.clone(), - None => v2_rt::rc_empty_map::(), -}; -let name_diags = if import_is_all(import.clone()) { - Rc::new(vec![]) - } else { - Rc::new({ let mut __result = Vec::new(); for child in Rc::new({ let mut __result = Vec::new(); for child in import.children.clone().iter().cloned() { if (v2_rt::map_has(&exported_set, authored_name_at(source_indices.clone(), &child)) == false) { __result.push(child); } } __result }).iter().cloned() { __result.push(make_error_node(Rc::new(CompilerDiagnostic::MissingExport { - name: authored_name_at(source_indices.clone(), &child), - module_path: import_path.clone(), - importing_module: importing_module.clone(), - span: child.span.clone(), -}), importing_module.clone())); } __result }) - }; -Rc::new(ImportResolveResult { - resolved: Rc::new(ResolvedImport { - module_path: import_path.clone(), - is_all: import_is_all(import.clone()), - specific_names: import_specific_names_at(import.clone(), source_indices.clone()), - target_module: Some(target_mod.clone()), -}), - diagnostics: name_diags, -}) -}, -} -} + let target = find_module(module_index, import_path.clone()); + match target { + None => { + let diag = make_error_node( + Rc::new(CompilerDiagnostic::UnresolvedImport { + module_path: import_path.clone(), + importing_module: importing_module.clone(), + span: import.span.clone(), + }), + importing_module.clone(), + ); + Rc::new(ImportResolveResult { + resolved: Rc::new(ResolvedImport { + module_path: import_path.clone(), + is_all: import_is_all(import.clone()), + specific_names: import_specific_names_at( + import.clone(), + source_indices.clone(), + ), + target_module: None, + }), + diagnostics: Rc::new(vec![diag]), + }) + } + Some(target_mod) => { + let exported_set = match v2_rt::map_get(&export_sets, import_path.clone()) { + Some(set) => set.clone(), + None => v2_rt::rc_empty_map::(), + }; + let name_diags = if import_is_all(import.clone()) { + Rc::new(vec![]) + } else { + Rc::new({ + let mut __result = Vec::new(); + for child in Rc::new({ + let mut __result = Vec::new(); + for child in import.children.clone().iter().cloned() { + if (v2_rt::map_has( + &exported_set, + authored_name_at(source_indices.clone(), &child), + ) == false) + { + __result.push(child); + } + } + __result + }) + .iter() + .cloned() + { + __result.push(make_error_node( + Rc::new(CompilerDiagnostic::MissingExport { + name: authored_name_at(source_indices.clone(), &child), + module_path: import_path.clone(), + importing_module: importing_module.clone(), + span: child.span.clone(), + }), + importing_module.clone(), + )); + } + __result + }) + }; + Rc::new(ImportResolveResult { + resolved: Rc::new(ResolvedImport { + module_path: import_path.clone(), + is_all: import_is_all(import.clone()), + specific_names: import_specific_names_at( + import.clone(), + source_indices.clone(), + ), + target_module: Some(target_mod.clone()), + }), + diagnostics: name_diags, + }) + } + } + } } -pub fn get_exported_names(module: &Rc, source_indices: Rc>>) -> Rc> { +pub fn get_exported_names( + module: &Rc, + source_indices: Rc>>, +) -> Rc> { { - let item_names = Rc::new({ let mut __result = Vec::new(); for item in module_items(module.clone()).iter().cloned() { __result.push(get_item_name(item.clone(), source_indices.clone())); } __result }); -let variant_names = Rc::new({ let mut __result = Vec::new(); for item in module_items(module.clone()).iter().cloned() { __result.extend((*get_variant_names(&item, source_indices.clone())).iter().cloned()); } __result }); -let imported_names = Rc::new({ let mut __result = Vec::new(); for imp in module_imports(module.clone()).iter().cloned() { __result.extend((*if import_is_all(imp.clone()) { - Rc::new(vec![]) - } else { - import_specific_names_at(imp.clone(), source_indices.clone()) - }).iter().cloned()); } __result }); -v2_rt::concat(v2_rt::concat(v2_rt::concat(item_names, variant_names), imported_names), Rc::new(v2_rt::map_keys(&kernel_type_set()))) -} + let item_names = Rc::new({ + let mut __result = Vec::new(); + for item in module_items(module.clone()).iter().cloned() { + __result.push(get_item_name(item.clone(), source_indices.clone())); + } + __result + }); + let variant_names = Rc::new({ + let mut __result = Vec::new(); + for item in module_items(module.clone()).iter().cloned() { + __result.extend( + (*get_variant_names(&item, source_indices.clone())) + .iter() + .cloned(), + ); + } + __result + }); + let imported_names = Rc::new({ + let mut __result = Vec::new(); + for imp in module_imports(module.clone()).iter().cloned() { + __result.extend( + (*if import_is_all(imp.clone()) { + Rc::new(vec![]) + } else { + import_specific_names_at(imp.clone(), source_indices.clone()) + }) + .iter() + .cloned(), + ); + } + __result + }); + v2_rt::concat( + v2_rt::concat(v2_rt::concat(item_names, variant_names), imported_names), + Rc::new(v2_rt::map_keys(&kernel_type_set())), + ) + } } -pub fn get_item_name(item: Rc, source_indices: Rc>>) -> String { +pub fn get_item_name( + item: Rc, + source_indices: Rc>>, +) -> String { authored_name_at(source_indices, &item) } -pub fn get_variant_names(item: &Rc, source_indices: Rc>>) -> Rc> { +pub fn get_variant_names( + item: &Rc, + source_indices: Rc>>, +) -> Rc> { { let is_coproduct = (item.connective.clone() == Connective::Disj); -if is_coproduct { - Rc::new({ let mut __result = Vec::new(); for c in item.children.clone().iter().cloned() { __result.push(authored_name_at(source_indices.clone(), &c)); } __result }) + if is_coproduct { + Rc::new({ + let mut __result = Vec::new(); + for c in item.children.clone().iter().cloned() { + __result.push(authored_name_at(source_indices.clone(), &c)); + } + __result + }) } else { Rc::new(vec![]) } -} + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -210,31 +415,47 @@ pub struct DuplicateCheckState { pub diagnostics: Rc>>, } -pub fn check_duplicate_modules(modules: Rc>>, source_indices: Rc>>) -> Rc>> { +pub fn check_duplicate_modules( + modules: Rc>>, + source_indices: Rc>>, +) -> Rc>> { { - let result = modules.iter().cloned().fold(Rc::new(DuplicateCheckState { - seen_names: v2_rt::rc_empty_map::(), - diagnostics: Rc::new(vec![]), -}), |state: Rc, m: Rc| { - let m_name = authored_name_at(source_indices.clone(), &m); -let is_dup = v2_rt::map_has(&state.seen_names.clone(), m_name.clone()); -if is_dup.clone() { - Rc::new(DuplicateCheckState { - seen_names: state.seen_names.clone(), - diagnostics: v2_rt::concat(state.diagnostics.clone(), Rc::new(vec![make_error_node(Rc::new(CompilerDiagnostic::DuplicateModule { - name: m_name.clone(), - span: m.span.clone(), -}), m_name.clone())])), -}) - } else { - Rc::new(DuplicateCheckState { - seen_names: v2_rt::rc_map_insert(state.seen_names.clone(), m_name.clone(), true), - diagnostics: state.diagnostics.clone(), -}) - } -}); -result.diagnostics.clone() -} + let result = modules.iter().cloned().fold( + Rc::new(DuplicateCheckState { + seen_names: v2_rt::rc_empty_map::(), + diagnostics: Rc::new(vec![]), + }), + |state: Rc, m: Rc| { + let m_name = authored_name_at(source_indices.clone(), &m); + let is_dup = v2_rt::map_has(&state.seen_names.clone(), m_name.clone()); + if is_dup.clone() { + Rc::new(DuplicateCheckState { + seen_names: state.seen_names.clone(), + diagnostics: v2_rt::concat( + state.diagnostics.clone(), + Rc::new(vec![make_error_node( + Rc::new(CompilerDiagnostic::DuplicateModule { + name: m_name.clone(), + span: m.span.clone(), + }), + m_name.clone(), + )]), + ), + }) + } else { + Rc::new(DuplicateCheckState { + seen_names: v2_rt::rc_map_insert( + state.seen_names.clone(), + m_name.clone(), + true, + ), + diagnostics: state.diagnostics.clone(), + }) + } + }, + ); + result.diagnostics.clone() + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -243,14 +464,22 @@ pub struct TopoResult { pub cycle_error: Option>, } -pub fn adjacency_add_edge(adjacency: &Rc>>>, from_module: &String, to_module: String) -> Rc>>> { +pub fn adjacency_add_edge( + adjacency: &Rc>>>, + from_module: &String, + to_module: String, +) -> Rc>>> { { let existing = match v2_rt::map_get(&adjacency, from_module.clone()) { - Some(lst) => lst.clone(), - None => Rc::new(vec![]), -}; -v2_rt::rc_map_insert(adjacency.clone(), from_module.clone(), v2_rt::rc_list_push(existing, to_module)) -} + Some(lst) => lst.clone(), + None => Rc::new(vec![]), + }; + v2_rt::rc_map_insert( + adjacency.clone(), + from_module.clone(), + v2_rt::rc_list_push(existing, to_module), + ) + } } pub fn topo_sort_key(name: String) -> String { @@ -261,67 +490,201 @@ pub fn topo_sort_key(name: String) -> String { } } -pub fn topological_sort(modules: &Rc>>, source_indices: Rc>>) -> Rc { +pub fn topological_sort( + modules: &Rc>>, + source_indices: Rc>>, +) -> Rc { { - let module_names = Rc::new({ let mut __result = Vec::new(); for m in modules.clone().iter().cloned() { __result.push(authored_name_at(source_indices.clone(), &m)); } __result }); -let has_std_types = { let mut __found = false; for name in module_names.clone().iter().cloned() { if (name.clone().as_str() == "std.types".to_string().as_str()) { __found = true; break; } } __found }; -let explicit_edges = Rc::new({ let mut __result = Vec::new(); for m in modules.clone().iter().cloned() { __result.extend((*Rc::new({ let mut __result = Vec::new(); for imp in module_imports(m.clone()).iter().cloned() { __result.push(Rc::new(DepEdge { - from_module: authored_name_at(source_indices.clone(), &imp), - to_module: authored_name_at(source_indices.clone(), &m), -})); } __result })).iter().cloned()); } __result }); -let implicit_std_types_edges = if has_std_types.clone() { - Rc::new({ let mut __result = Vec::new(); for m in modules.clone().iter().cloned() { __result.extend((*{ - let m_name = authored_name_at(source_indices.clone(), &m); -let imports_std_types = { let mut __found = false; for imp in module_imports(m.clone()).iter().cloned() { if (authored_name_at(source_indices.clone(), &imp).as_str() == "std.types".to_string().as_str()) { __found = true; break; } } __found }; -if ((((m_name.clone().as_str() != "std.types".to_string().as_str()) && (m_name.clone().as_str() != "std.algebra".to_string().as_str())) && (m_name.clone().as_str() != "std.error_primitives".to_string().as_str())) && (imports_std_types.clone() == false)) { - Rc::new(vec![Rc::new(DepEdge { - from_module: "std.types".to_string(), - to_module: m_name.clone(), -})]) - } else { - Rc::new(vec![]) + let module_names = Rc::new({ + let mut __result = Vec::new(); + for m in modules.clone().iter().cloned() { + __result.push(authored_name_at(source_indices.clone(), &m)); + } + __result + }); + let has_std_types = { + let mut __found = false; + for name in module_names.clone().iter().cloned() { + if (name.clone().as_str() == "std.types".to_string().as_str()) { + __found = true; + break; + } + } + __found + }; + let explicit_edges = Rc::new({ + let mut __result = Vec::new(); + for m in modules.clone().iter().cloned() { + __result.extend( + (*Rc::new({ + let mut __result = Vec::new(); + for imp in module_imports(m.clone()).iter().cloned() { + __result.push(Rc::new(DepEdge { + from_module: authored_name_at(source_indices.clone(), &imp), + to_module: authored_name_at(source_indices.clone(), &m), + })); + } + __result + })) + .iter() + .cloned(), + ); + } + __result + }); + let implicit_std_types_edges = if has_std_types.clone() { + Rc::new({ + let mut __result = Vec::new(); + for m in modules.clone().iter().cloned() { + __result.extend( + (*{ + let m_name = authored_name_at(source_indices.clone(), &m); + let imports_std_types = { + let mut __found = false; + for imp in module_imports(m.clone()).iter().cloned() { + if (authored_name_at(source_indices.clone(), &imp).as_str() + == "std.types".to_string().as_str()) + { + __found = true; + break; + } + } + __found + }; + if ((((m_name.clone().as_str() != "std.types".to_string().as_str()) + && (m_name.clone().as_str() + != "std.algebra".to_string().as_str())) + && (m_name.clone().as_str() + != "std.error_primitives".to_string().as_str())) + && (imports_std_types.clone() == false)) + { + Rc::new(vec![Rc::new(DepEdge { + from_module: "std.types".to_string(), + to_module: m_name.clone(), + })]) + } else { + Rc::new(vec![]) + } + }) + .iter() + .cloned(), + ); } -}).iter().cloned()); } __result }) + __result + }) } else { Rc::new(vec![]) }; -let adjacency = v2_rt::concat(explicit_edges, implicit_std_types_edges).iter().cloned().fold(v2_rt::rc_empty_map::>>(), |acc: Rc>>>, edge: Rc| adjacency_add_edge(&acc, &edge.from_module.clone(), edge.to_module.clone())); -let in_degree_map = modules.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, m: Rc| { - let m_name = authored_name_at(source_indices.clone(), &m); -let imports_std_types = { let mut __found = false; for imp in module_imports(m.clone()).iter().cloned() { if (authored_name_at(source_indices.clone(), &imp).as_str() == "std.types".to_string().as_str()) { __found = true; break; } } __found }; -let implicit_std_types_in_degree = if ((((has_std_types.clone() && (m_name.clone().as_str() != "std.types".to_string().as_str())) && (m_name.clone().as_str() != "std.algebra".to_string().as_str())) && (m_name.clone().as_str() != "std.error_primitives".to_string().as_str())) && (imports_std_types.clone() == false)) { - 1 - } else { - 0 - }; -v2_rt::rc_map_insert(acc, m_name.clone(), ((module_imports(m.clone()).len() as i64) + implicit_std_types_in_degree.clone())) -}); -let initial_queue = Rc::new({ let mut __sorted: Vec<_> = Rc::new({ let mut __result = Vec::new(); for name in module_names.clone().iter().cloned() { if match v2_rt::map_get(&in_degree_map, name.clone()) { - Some(0) => true, - _ => false, -} { __result.push(name); } } __result }).iter().cloned().collect(); __sorted.sort_by(|a: &String, b: &String| { let __ka = (|name: String| topo_sort_key(name.clone()))(a.clone()); let __kb = (|name: String| topo_sort_key(name.clone()))(b.clone()); __ka.partial_cmp(&__kb).unwrap_or(std::cmp::Ordering::Equal) }); __sorted }); -let module_count = (modules.clone().len() as i64); -let result = kahn_drain(initial_queue, Rc::new(vec![]), in_degree_map.clone(), adjacency, module_count.clone()); -if ((result.sorted.clone().len() as i64) == module_count.clone()) { + let adjacency = v2_rt::concat(explicit_edges, implicit_std_types_edges) + .iter() + .cloned() + .fold( + v2_rt::rc_empty_map::>>(), + |acc: Rc>>>, edge: Rc| { + adjacency_add_edge(&acc, &edge.from_module.clone(), edge.to_module.clone()) + }, + ); + let in_degree_map = modules.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, m: Rc| { + let m_name = authored_name_at(source_indices.clone(), &m); + let imports_std_types = { + let mut __found = false; + for imp in module_imports(m.clone()).iter().cloned() { + if (authored_name_at(source_indices.clone(), &imp).as_str() + == "std.types".to_string().as_str()) + { + __found = true; + break; + } + } + __found + }; + let implicit_std_types_in_degree = if ((((has_std_types.clone() + && (m_name.clone().as_str() != "std.types".to_string().as_str())) + && (m_name.clone().as_str() != "std.algebra".to_string().as_str())) + && (m_name.clone().as_str() != "std.error_primitives".to_string().as_str())) + && (imports_std_types.clone() == false)) + { + 1 + } else { + 0 + }; + v2_rt::rc_map_insert( + acc, + m_name.clone(), + ((module_imports(m.clone()).len() as i64) + + implicit_std_types_in_degree.clone()), + ) + }, + ); + let initial_queue = Rc::new({ + let mut __sorted: Vec<_> = Rc::new({ + let mut __result = Vec::new(); + for name in module_names.clone().iter().cloned() { + if match v2_rt::map_get(&in_degree_map, name.clone()) { + Some(0) => true, + _ => false, + } { + __result.push(name); + } + } + __result + }) + .iter() + .cloned() + .collect(); + __sorted.sort_by(|a: &String, b: &String| { + let __ka = (|name: String| topo_sort_key(name.clone()))(a.clone()); + let __kb = (|name: String| topo_sort_key(name.clone()))(b.clone()); + __ka.partial_cmp(&__kb).unwrap_or(std::cmp::Ordering::Equal) + }); + __sorted + }); + let module_count = (modules.clone().len() as i64); + let result = kahn_drain( + initial_queue, + Rc::new(vec![]), + in_degree_map.clone(), + adjacency, + module_count.clone(), + ); + if ((result.sorted.clone().len() as i64) == module_count.clone()) { Rc::new(TopoResult { - sorted: result.sorted.clone(), - cycle_error: None, -}) + sorted: result.sorted.clone(), + cycle_error: None, + }) } else { { - let sorted_set = result.sorted.clone().iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, name: String| v2_rt::rc_map_insert(acc, name.clone(), true)); -let cycle_members = Rc::new({ let mut __result = Vec::new(); for name in module_names.clone().iter().cloned() { if (v2_rt::map_has(&sorted_set, name.clone()) == false) { __result.push(name); } } __result }); -let cycle_desc = cycle_members.clone().join(&" -> ".to_string()); -Rc::new(TopoResult { - sorted: result.sorted.clone(), - cycle_error: Some(make_error_node(Rc::new(CompilerDiagnostic::CircularDependency { - modules: cycle_members.clone(), - span: no_span(), -}), "".to_string())), -}) -} + let sorted_set = result.sorted.clone().iter().cloned().fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, name: String| { + v2_rt::rc_map_insert(acc, name.clone(), true) + }, + ); + let cycle_members = Rc::new({ + let mut __result = Vec::new(); + for name in module_names.clone().iter().cloned() { + if (v2_rt::map_has(&sorted_set, name.clone()) == false) { + __result.push(name); + } + } + __result + }); + let cycle_desc = cycle_members.clone().join(&" -> ".to_string()); + Rc::new(TopoResult { + sorted: result.sorted.clone(), + cycle_error: Some(make_error_node( + Rc::new(CompilerDiagnostic::CircularDependency { + modules: cycle_members.clone(), + span: no_span(), + }), + "".to_string(), + )), + }) + } } -} + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -330,53 +693,112 @@ pub struct KahnDrainState { pub in_degree_map: Rc>, } -pub fn kahn_drain(mut queue: Rc>, mut sorted: Rc>, mut in_degree_map: Rc>, mut adjacency: Rc>>>, mut fuel: i64) -> Rc { +pub fn kahn_drain( + mut queue: Rc>, + mut sorted: Rc>, + mut in_degree_map: Rc>, + mut adjacency: Rc>>>, + mut fuel: i64, +) -> Rc { loop { if ((queue.clone().len() as i64) == 0) { return Rc::new(KahnDrainState { - sorted: sorted.clone(), - in_degree_map: in_degree_map.clone(), -}) + sorted: sorted.clone(), + in_degree_map: in_degree_map.clone(), + }); } -let batch_result = queue.clone().iter().cloned().fold(Rc::new(KahnDrainState { - sorted: sorted.clone(), - in_degree_map: in_degree_map.clone(), -}), |state: Rc, node: String| { let state = Rc::try_unwrap(state).unwrap_or_else(|rc| (*rc).clone()); { - let new_sorted = v2_rt::rc_list_push(state.sorted, node.clone()); -let neighbors = match v2_rt::map_get(&adjacency, node.clone()) { - Some(ns) => ns.clone(), - None => Rc::new(vec![]), -}; -let new_degrees = neighbors.clone().iter().cloned().fold(state.in_degree_map, |deg_map: Rc>, neighbor: String| { - let current = match v2_rt::map_get(°_map, neighbor.clone()) { - Some(d) => d.clone(), - None => 0, -}; -v2_rt::rc_map_insert(deg_map.clone(), neighbor.clone(), (current.clone() - 1)) -}); -Rc::new(KahnDrainState { - sorted: new_sorted.clone(), - in_degree_map: new_degrees.clone(), -}) -} }); -let new_zero_set = Rc::new({ let mut __result = Vec::new(); for neighbor in Rc::new({ let mut __result = Vec::new(); for node in queue.clone().iter().cloned() { __result.extend((*match v2_rt::map_get(&adjacency, node.clone()) { - Some(ns) => ns.clone(), - None => Rc::new(vec![]), -}).iter().cloned()); } __result }).iter().cloned() { if match v2_rt::map_get(&batch_result.in_degree_map.clone(), neighbor.clone()) { - Some(0) => true, - _ => false, -} { __result.push(neighbor); } } __result }).iter().cloned().fold(v2_rt::rc_empty_map::(), |acc: Rc>, name: String| v2_rt::rc_map_insert(acc, name.clone(), true)); -let new_zero = Rc::new({ let mut __sorted: Vec<_> = Rc::new(v2_rt::map_keys(&new_zero_set)).iter().cloned().collect(); __sorted.sort_by(|a: &String, b: &String| { let __ka = (|name: String| name.clone())(a.clone()); let __kb = (|name: String| name.clone())(b.clone()); __ka.partial_cmp(&__kb).unwrap_or(std::cmp::Ordering::Equal) }); __sorted }); -{ + let batch_result = queue.clone().iter().cloned().fold( + Rc::new(KahnDrainState { + sorted: sorted.clone(), + in_degree_map: in_degree_map.clone(), + }), + |state: Rc, node: String| { + let state = Rc::try_unwrap(state).unwrap_or_else(|rc| (*rc).clone()); + { + let new_sorted = v2_rt::rc_list_push(state.sorted, node.clone()); + let neighbors = match v2_rt::map_get(&adjacency, node.clone()) { + Some(ns) => ns.clone(), + None => Rc::new(vec![]), + }; + let new_degrees = neighbors.clone().iter().cloned().fold( + state.in_degree_map, + |deg_map: Rc>, neighbor: String| { + let current = match v2_rt::map_get(°_map, neighbor.clone()) { + Some(d) => d.clone(), + None => 0, + }; + v2_rt::rc_map_insert( + deg_map.clone(), + neighbor.clone(), + (current.clone() - 1), + ) + }, + ); + Rc::new(KahnDrainState { + sorted: new_sorted.clone(), + in_degree_map: new_degrees.clone(), + }) + } + }, + ); + let new_zero_set = Rc::new({ + let mut __result = Vec::new(); + for neighbor in Rc::new({ + let mut __result = Vec::new(); + for node in queue.clone().iter().cloned() { + __result.extend( + (*match v2_rt::map_get(&adjacency, node.clone()) { + Some(ns) => ns.clone(), + None => Rc::new(vec![]), + }) + .iter() + .cloned(), + ); + } + __result + }) + .iter() + .cloned() + { + if match v2_rt::map_get(&batch_result.in_degree_map.clone(), neighbor.clone()) { + Some(0) => true, + _ => false, + } { + __result.push(neighbor); + } + } + __result + }) + .iter() + .cloned() + .fold( + v2_rt::rc_empty_map::(), + |acc: Rc>, name: String| { + v2_rt::rc_map_insert(acc, name.clone(), true) + }, + ); + let new_zero = Rc::new({ + let mut __sorted: Vec<_> = Rc::new(v2_rt::map_keys(&new_zero_set)) + .iter() + .cloned() + .collect(); + __sorted.sort_by(|a: &String, b: &String| { + let __ka = (|name: String| name.clone())(a.clone()); + let __kb = (|name: String| name.clone())(b.clone()); + __ka.partial_cmp(&__kb).unwrap_or(std::cmp::Ordering::Equal) + }); + __sorted + }); + { let __tco_0 = new_zero; -let __tco_1 = batch_result.sorted.clone(); -let __tco_2 = batch_result.in_degree_map.clone(); -let __tco_3 = (fuel - 1); -queue = __tco_0; -sorted = __tco_1; -in_degree_map = __tco_2; -fuel = __tco_3; -continue; -} -} + let __tco_1 = batch_result.sorted.clone(); + let __tco_2 = batch_result.in_degree_map.clone(); + let __tco_3 = (fuel - 1); + queue = __tco_0; + sorted = __tco_1; + in_degree_map = __tco_2; + fuel = __tco_3; + continue; + } + } } diff --git a/src/v2/stage0/src/v2_compiler_runtime_rust.rs b/src/v2/stage0/src/v2_compiler_runtime_rust.rs index 7b659e92b96..5c7fbc9d8fd 100644 --- a/src/v2/stage0/src/v2_compiler_runtime_rust.rs +++ b/src/v2/stage0/src/v2_compiler_runtime_rust.rs @@ -1,14 +1,26 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.runtime_rust -use std::collections::HashMap; -use std::rc::Rc; use crate::v2_rt; -use crate::NonEmptyVec; use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; pub fn rt_header() -> String { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("//! Runtime shims for v2 compiler intrinsic operations.\n".to_string(), "//! Generated by the v2 compiler -- do not edit.\n\n".to_string()), "#![allow(unused_variables, dead_code)]\n\n".to_string()), "use std::collections::HashMap;\n".to_string()), "use std::rc::Rc;\n\n".to_string()) + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "//! Runtime shims for v2 compiler intrinsic operations.\n".to_string(), + "//! Generated by the v2 compiler -- do not edit.\n\n".to_string(), + ), + "#![allow(unused_variables, dead_code)]\n\n".to_string(), + ), + "use std::collections::HashMap;\n".to_string(), + ), + "use std::rc::Rc;\n\n".to_string(), + ) } pub fn rt_concat_trait() -> String { @@ -28,7 +40,23 @@ pub fn rt_scanner_ops() -> String { } pub fn rt_unicode_ops() -> String { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("pub fn code_point(c: String) -> i64 {\n".to_string(), " c.chars().next().map(|ch| ch as i64).unwrap_or(0)\n".to_string()), "}\n\n".to_string()), "pub fn from_code_point(cp: i64) -> String {\n".to_string()), " char::from_u32(cp as u32).map(|c| c.to_string()).unwrap_or_default()\n".to_string()), "}\n\n".to_string()) + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "pub fn code_point(c: String) -> i64 {\n".to_string(), + " c.chars().next().map(|ch| ch as i64).unwrap_or(0)\n".to_string(), + ), + "}\n\n".to_string(), + ), + "pub fn from_code_point(cp: i64) -> String {\n".to_string(), + ), + " char::from_u32(cp as u32).map(|c| c.to_string()).unwrap_or_default()\n" + .to_string(), + ), + "}\n\n".to_string(), + ) } pub fn rt_rc_container_ops() -> String { @@ -36,9 +64,53 @@ pub fn rt_rc_container_ops() -> String { } pub fn rt_filesystem() -> String { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("#[derive(Debug, Clone)]\n".to_string(), "pub struct FilesystemReadResult {\n".to_string()), " pub content: String,\n".to_string()), "}\n\n".to_string()), "pub fn filesystem_read(path: String) -> FilesystemReadResult {\n".to_string()), " let content = std::fs::read_to_string(&path)\n".to_string()), " .unwrap_or_else(|e| panic!(\"failed to read {}: {}\", path, e));\n".to_string()), " FilesystemReadResult { content }\n".to_string()), "}\n".to_string()) + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + "#[derive(Debug, Clone)]\n".to_string(), + "pub struct FilesystemReadResult {\n".to_string(), + ), + " pub content: String,\n".to_string(), + ), + "}\n\n".to_string(), + ), + "pub fn filesystem_read(path: String) -> FilesystemReadResult {\n" + .to_string(), + ), + " let content = std::fs::read_to_string(&path)\n".to_string(), + ), + " .unwrap_or_else(|e| panic!(\"failed to read {}: {}\", path, e));\n" + .to_string(), + ), + " FilesystemReadResult { content }\n".to_string(), + ), + "}\n".to_string(), + ) } pub fn rust_runtime_source() -> String { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(rt_header(), rt_concat_trait()), rt_string_ops()), rt_collection_ops()), rt_rc_container_ops()), rt_scanner_ops()), rt_unicode_ops()), rt_filesystem()) + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(rt_header(), rt_concat_trait()), + rt_string_ops(), + ), + rt_collection_ops(), + ), + rt_rc_container_ops(), + ), + rt_scanner_ops(), + ), + rt_unicode_ops(), + ), + rt_filesystem(), + ) } diff --git a/src/v2/stage0/src/v2_compiler_tokenize.rs b/src/v2/stage0/src/v2_compiler_tokenize.rs index 74bb7d656f5..843451120d1 100644 --- a/src/v2/stage0/src/v2_compiler_tokenize.rs +++ b/src/v2/stage0/src/v2_compiler_tokenize.rs @@ -1,22 +1,28 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.tokenize -use std::collections::HashMap; -use std::rc::Rc; +use self::StringScanResult::*; +pub use crate::extdeps_languages_dag_syntax::dag_keyword_set; +pub use crate::std_types::SourceSpan; use crate::v2_rt; -use crate::NonEmptyVec; -use crate::NonEmptyBTreeSet; -pub use crate::std_types::{SourceSpan}; +use crate::v2_std_core::TokenShape::{ + ShAnd, ShArrow, ShBang, ShColon, ShComma, ShDot, ShDotDot, ShEof, ShEq, ShEqEq, ShFatArrow, + ShGe, ShGt, ShIdent, ShKeyword, ShLBrace, ShLBracket, ShLParen, ShLe, ShLitFloat, ShLitInt, + ShLitStr, ShLt, ShMinus, ShNe, ShNewline, ShNullCoalesce, ShOr, ShPercent, ShPipe, ShPipeArrow, + ShPlus, ShQuestion, ShRBrace, ShRBracket, ShRParen, ShSlash, ShStar, ShStrBegin, ShStrEnd, + ShStrMid, ShUnknown, +}; pub use crate::v2_std_core::{make_file_span, Token, TokenShape}; -use crate::v2_std_core::TokenShape::{ShKeyword, ShLBrace, ShRBrace, ShLParen, ShRParen, ShLBracket, ShRBracket, ShLt, ShGt, ShLe, ShGe, ShFatArrow, ShArrow, ShColon, ShComma, ShDot, ShDotDot, ShEq, ShEqEq, ShNe, ShPlus, ShMinus, ShStar, ShSlash, ShPercent, ShBang, ShAnd, ShOr, ShQuestion, ShNullCoalesce, ShPipe, ShPipeArrow, ShLitStr, ShLitInt, ShLitFloat, ShIdent, ShStrBegin, ShStrMid, ShStrEnd, ShNewline, ShEof, ShUnknown}; -pub use crate::extdeps_languages_dag_syntax::{dag_keyword_set}; -use self::StringScanResult::*; +use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; pub fn is_keyword_text(text: String) -> bool { match v2_rt::lookup(&dag_keyword_set(), text) { - Some(_) => true, - None => false, -} + Some(_) => true, + None => false, + } } pub fn single_punct() -> Rc> { @@ -69,10 +75,10 @@ pub struct SourceRef { pub fn make_token(text: String, span: Rc, shape: TokenShape) -> Rc { Rc::new(Token { - text: text, - span: span, - shape: shape, -}) + text: text, + span: span, + shape: shape, + }) } pub fn source_char(source: Rc, pos: i64) -> String { @@ -87,316 +93,520 @@ pub fn source_substring(source: Rc, start: i64, end: i64) -> String { v2_rt::chars_to_string(&source.source_chars.clone(), start, end) } -pub fn source_scan_while(mut source: Rc, mut start: i64, mut pred: impl Fn(String) -> bool + Clone) -> i64 { +pub fn source_scan_while( + mut source: Rc, + mut start: i64, + mut pred: impl Fn(String) -> bool + Clone, +) -> i64 { loop { if (start.clone() >= source_len(source.clone())) { break source_len(source.clone()); -} else { - if pred(v2_rt::from_code_point(source.source_chars.clone()[(start.clone()) as usize].clone())) { + } else { + if pred(v2_rt::from_code_point( + source.source_chars.clone()[(start.clone()) as usize].clone(), + )) { { let __tco_0 = (start + 1); -start = __tco_0; -continue; -} -} else { + start = __tco_0; + continue; + } + } else { break start.clone(); -} -} -} + } + } + } } pub fn source_skip_ws(mut source: Rc, mut start: i64) -> i64 { loop { if (start.clone() >= source_len(source.clone())) { break start.clone(); -} else { + } else { let ch = source.source_chars.clone()[(start.clone()) as usize].clone(); -if ((ch.clone() == v2_rt::code_point(" ".to_string())) || (ch.clone() == v2_rt::code_point("\t".to_string()))) { + if ((ch.clone() == v2_rt::code_point(" ".to_string())) + || (ch.clone() == v2_rt::code_point("\t".to_string()))) + { { let __tco_0 = (start + 1); -start = __tco_0; -continue; -} -} else { + start = __tco_0; + continue; + } + } else { break start.clone(); -} -} -} + } + } + } } pub fn source_scan_to_eol(mut source: Rc, mut start: i64) -> i64 { loop { if (start.clone() >= source_len(source.clone())) { break source_len(source.clone()); -} else { - if (source.source_chars.clone()[(start.clone()) as usize].clone() == v2_rt::code_point("\n".to_string())) { + } else { + if (source.source_chars.clone()[(start.clone()) as usize].clone() + == v2_rt::code_point("\n".to_string())) + { break start.clone(); -} else { + } else { { let __tco_0 = (start + 1); -start = __tco_0; -continue; -} -} -} -} + start = __tco_0; + continue; + } + } + } + } } pub fn tokenize(source: &String, file: String) -> Rc>> { { let c = Rc::new(source.clone().chars().map(|c| c as i64).collect::>()); -let src = Rc::new(SourceRef { - file: file, - text: source.clone(), - source_chars: c, -}); -let initial = Rc::new(TokPos { - pos: 0, - interp_depth: Rc::new(vec![]), -}); -let final_state = tokenize_loop(src.clone(), Rc::new(vec![]), initial, (source_len(src.clone()) + 1)); -let eof_span = make_file_span(src.file.clone(), final_state.pos.clone(), final_state.pos.clone()); -v2_rt::rc_list_push(final_state.tokens.clone(), make_token("".to_string(), eof_span, TokenShape::ShEof)) -} + let src = Rc::new(SourceRef { + file: file, + text: source.clone(), + source_chars: c, + }); + let initial = Rc::new(TokPos { + pos: 0, + interp_depth: Rc::new(vec![]), + }); + let final_state = tokenize_loop( + src.clone(), + Rc::new(vec![]), + initial, + (source_len(src.clone()) + 1), + ); + let eof_span = make_file_span( + src.file.clone(), + final_state.pos.clone(), + final_state.pos.clone(), + ); + v2_rt::rc_list_push( + final_state.tokens.clone(), + make_token("".to_string(), eof_span, TokenShape::ShEof), + ) + } } pub fn scan_next_token(source: &Rc, pos: &Rc) -> Rc { { let ch = source_char(source.clone(), pos.pos.clone()); -if (ch.clone().as_str() == "\n".to_string().as_str()) { + if (ch.clone().as_str() == "\n".to_string().as_str()) { return Rc::new(ScanResult { - pos: (pos.pos.clone() + 1), - token: make_token("\n".to_string(), make_file_span(source.file.clone(), pos.pos.clone(), (pos.pos.clone() + 1)), TokenShape::ShNewline), - interp_depth: pos.interp_depth.clone(), -}) + pos: (pos.pos.clone() + 1), + token: make_token( + "\n".to_string(), + make_file_span(source.file.clone(), pos.pos.clone(), (pos.pos.clone() + 1)), + TokenShape::ShNewline, + ), + interp_depth: pos.interp_depth.clone(), + }); } -if ((ch.clone().as_str() == "}".to_string().as_str()) && ((pos.interp_depth.clone().len() as i64) > 0)) { + if ((ch.clone().as_str() == "}".to_string().as_str()) + && ((pos.interp_depth.clone().len() as i64) > 0)) + { { let top = pos.interp_depth.clone().last().cloned().clone().unwrap(); -if (top.clone() == 0) { + if (top.clone() == 0) { { let popped = drop_last(&pos.interp_depth.clone()); -let cont_pos = Rc::new(TokPos { - pos: (pos.pos.clone() + 1), - interp_depth: popped, -}); -return scan_str_cont(&source, &cont_pos, pos.pos.clone()) -} + let cont_pos = Rc::new(TokPos { + pos: (pos.pos.clone() + 1), + interp_depth: popped, + }); + return scan_str_cont(&source, &cont_pos, pos.pos.clone()); + } } else { return Rc::new(ScanResult { - pos: (pos.pos.clone() + 1), - token: make_token("}".to_string(), make_file_span(source.file.clone(), pos.pos.clone(), (pos.pos.clone() + 1)), TokenShape::ShRBrace), - interp_depth: replace_last(pos.interp_depth.clone(), (top.clone() - 1)), -}) + pos: (pos.pos.clone() + 1), + token: make_token( + "}".to_string(), + make_file_span( + source.file.clone(), + pos.pos.clone(), + (pos.pos.clone() + 1), + ), + TokenShape::ShRBrace, + ), + interp_depth: replace_last(pos.interp_depth.clone(), (top.clone() - 1)), + }); } -} + } } -scan_token(&source, &pos, &ch) -} + scan_token(&source, &pos, &ch) + } } -pub fn tokenize_loop(mut source: Rc, mut tokens: Rc>>, mut pos: Rc, mut fuel: i64) -> Rc { +pub fn tokenize_loop( + mut source: Rc, + mut tokens: Rc>>, + mut pos: Rc, + mut fuel: i64, +) -> Rc { loop { let s = skip_spaces_and_comments(source.clone(), pos, fuel.clone()); -if (s.pos.clone() >= source_len(source.clone())) { + if (s.pos.clone() >= source_len(source.clone())) { return Rc::new(TokenizerState { - pos: s.pos.clone(), - tokens: tokens.clone(), - interp_depth: s.interp_depth.clone(), -}) + pos: s.pos.clone(), + tokens: tokens.clone(), + interp_depth: s.interp_depth.clone(), + }); } -let result = scan_next_token(&source, &s); -{ + let result = scan_next_token(&source, &s); + { let __tco_0 = v2_rt::rc_list_push(tokens, result.token.clone()); -let __tco_1 = Rc::new(TokPos { - pos: result.pos.clone(), - interp_depth: result.interp_depth.clone(), -}); -let __tco_2 = (fuel - 1); -tokens = __tco_0; -pos = __tco_1; -fuel = __tco_2; -continue; -} -} + let __tco_1 = Rc::new(TokPos { + pos: result.pos.clone(), + interp_depth: result.interp_depth.clone(), + }); + let __tco_2 = (fuel - 1); + tokens = __tco_0; + pos = __tco_1; + fuel = __tco_2; + continue; + } + } } pub fn scan_token(source: &Rc, pos: &Rc, ch: &String) -> Rc { { if (ch.clone().as_str() == "\"".to_string().as_str()) { - return scan_string(&source, &pos) + return scan_string(&source, &pos); } -if is_digit(ch.clone()) { - return scan_number(&source, &pos) + if is_digit(ch.clone()) { + return scan_number(&source, &pos); } -if is_ident_start(&ch) { - return scan_ident(&source, &pos) + if is_ident_start(&ch) { + return scan_ident(&source, &pos); } -let next_ch = if ((pos.pos.clone() + 1) < source_len(source.clone())) { + let next_ch = if ((pos.pos.clone() + 1) < source_len(source.clone())) { source_char(source.clone(), (pos.pos.clone() + 1)) } else { "".to_string() }; -if ((ch.clone().as_str() == "=".to_string().as_str()) && (next_ch.clone().as_str() == ">".to_string().as_str())) { - return emit(&pos, TokenShape::ShFatArrow, "=>".to_string(), 2, source.file.clone()) + if ((ch.clone().as_str() == "=".to_string().as_str()) + && (next_ch.clone().as_str() == ">".to_string().as_str())) + { + return emit( + &pos, + TokenShape::ShFatArrow, + "=>".to_string(), + 2, + source.file.clone(), + ); } -if ((ch.clone().as_str() == "-".to_string().as_str()) && (next_ch.clone().as_str() == ">".to_string().as_str())) { - return emit(&pos, TokenShape::ShArrow, "->".to_string(), 2, source.file.clone()) + if ((ch.clone().as_str() == "-".to_string().as_str()) + && (next_ch.clone().as_str() == ">".to_string().as_str())) + { + return emit( + &pos, + TokenShape::ShArrow, + "->".to_string(), + 2, + source.file.clone(), + ); } -if ((ch.clone().as_str() == "=".to_string().as_str()) && (next_ch.clone().as_str() == "=".to_string().as_str())) { - return emit(&pos, TokenShape::ShEqEq, "==".to_string(), 2, source.file.clone()) + if ((ch.clone().as_str() == "=".to_string().as_str()) + && (next_ch.clone().as_str() == "=".to_string().as_str())) + { + return emit( + &pos, + TokenShape::ShEqEq, + "==".to_string(), + 2, + source.file.clone(), + ); } -if ((ch.clone().as_str() == "!".to_string().as_str()) && (next_ch.clone().as_str() == "=".to_string().as_str())) { - return emit(&pos, TokenShape::ShNe, "!=".to_string(), 2, source.file.clone()) + if ((ch.clone().as_str() == "!".to_string().as_str()) + && (next_ch.clone().as_str() == "=".to_string().as_str())) + { + return emit( + &pos, + TokenShape::ShNe, + "!=".to_string(), + 2, + source.file.clone(), + ); } -if ((ch.clone().as_str() == "<".to_string().as_str()) && (next_ch.clone().as_str() == "=".to_string().as_str())) { - return emit(&pos, TokenShape::ShLe, "<=".to_string(), 2, source.file.clone()) + if ((ch.clone().as_str() == "<".to_string().as_str()) + && (next_ch.clone().as_str() == "=".to_string().as_str())) + { + return emit( + &pos, + TokenShape::ShLe, + "<=".to_string(), + 2, + source.file.clone(), + ); } -if ((ch.clone().as_str() == ">".to_string().as_str()) && (next_ch.clone().as_str() == "=".to_string().as_str())) { - return emit(&pos, TokenShape::ShGe, ">=".to_string(), 2, source.file.clone()) + if ((ch.clone().as_str() == ">".to_string().as_str()) + && (next_ch.clone().as_str() == "=".to_string().as_str())) + { + return emit( + &pos, + TokenShape::ShGe, + ">=".to_string(), + 2, + source.file.clone(), + ); } -if ((ch.clone().as_str() == "&".to_string().as_str()) && (next_ch.clone().as_str() == "&".to_string().as_str())) { - return emit(&pos, TokenShape::ShAnd, "&&".to_string(), 2, source.file.clone()) + if ((ch.clone().as_str() == "&".to_string().as_str()) + && (next_ch.clone().as_str() == "&".to_string().as_str())) + { + return emit( + &pos, + TokenShape::ShAnd, + "&&".to_string(), + 2, + source.file.clone(), + ); } -if ((ch.clone().as_str() == "|".to_string().as_str()) && (next_ch.clone().as_str() == "|".to_string().as_str())) { - return emit(&pos, TokenShape::ShOr, "||".to_string(), 2, source.file.clone()) + if ((ch.clone().as_str() == "|".to_string().as_str()) + && (next_ch.clone().as_str() == "|".to_string().as_str())) + { + return emit( + &pos, + TokenShape::ShOr, + "||".to_string(), + 2, + source.file.clone(), + ); } -if ((ch.clone().as_str() == "|".to_string().as_str()) && (next_ch.clone().as_str() == ">".to_string().as_str())) { - return emit(&pos, TokenShape::ShPipeArrow, "|>".to_string(), 2, source.file.clone()) + if ((ch.clone().as_str() == "|".to_string().as_str()) + && (next_ch.clone().as_str() == ">".to_string().as_str())) + { + return emit( + &pos, + TokenShape::ShPipeArrow, + "|>".to_string(), + 2, + source.file.clone(), + ); } -if (ch.clone().as_str() == "|".to_string().as_str()) { - return emit(&pos, TokenShape::ShPipe, "|".to_string(), 1, source.file.clone()) + if (ch.clone().as_str() == "|".to_string().as_str()) { + return emit( + &pos, + TokenShape::ShPipe, + "|".to_string(), + 1, + source.file.clone(), + ); } -if ((ch.clone().as_str() == "?".to_string().as_str()) && (next_ch.clone().as_str() == "?".to_string().as_str())) { - return emit(&pos, TokenShape::ShNullCoalesce, "??".to_string(), 2, source.file.clone()) + if ((ch.clone().as_str() == "?".to_string().as_str()) + && (next_ch.clone().as_str() == "?".to_string().as_str())) + { + return emit( + &pos, + TokenShape::ShNullCoalesce, + "??".to_string(), + 2, + source.file.clone(), + ); } -if ((ch.clone().as_str() == ".".to_string().as_str()) && (next_ch.clone().as_str() == ".".to_string().as_str())) { - return emit(&pos, TokenShape::ShDotDot, "..".to_string(), 2, source.file.clone()) + if ((ch.clone().as_str() == ".".to_string().as_str()) + && (next_ch.clone().as_str() == ".".to_string().as_str())) + { + return emit( + &pos, + TokenShape::ShDotDot, + "..".to_string(), + 2, + source.file.clone(), + ); } -if (ch.clone().as_str() == "=".to_string().as_str()) { - return emit(&pos, TokenShape::ShEq, "=".to_string(), 1, source.file.clone()) + if (ch.clone().as_str() == "=".to_string().as_str()) { + return emit( + &pos, + TokenShape::ShEq, + "=".to_string(), + 1, + source.file.clone(), + ); } -if (ch.clone().as_str() == "<".to_string().as_str()) { - return emit(&pos, TokenShape::ShLt, "<".to_string(), 1, source.file.clone()) + if (ch.clone().as_str() == "<".to_string().as_str()) { + return emit( + &pos, + TokenShape::ShLt, + "<".to_string(), + 1, + source.file.clone(), + ); } -if (ch.clone().as_str() == ">".to_string().as_str()) { - return emit(&pos, TokenShape::ShGt, ">".to_string(), 1, source.file.clone()) + if (ch.clone().as_str() == ">".to_string().as_str()) { + return emit( + &pos, + TokenShape::ShGt, + ">".to_string(), + 1, + source.file.clone(), + ); } -if (ch.clone().as_str() == "-".to_string().as_str()) { - return emit(&pos, TokenShape::ShMinus, "-".to_string(), 1, source.file.clone()) + if (ch.clone().as_str() == "-".to_string().as_str()) { + return emit( + &pos, + TokenShape::ShMinus, + "-".to_string(), + 1, + source.file.clone(), + ); } -if (ch.clone().as_str() == "!".to_string().as_str()) { - return emit(&pos, TokenShape::ShBang, "!".to_string(), 1, source.file.clone()) + if (ch.clone().as_str() == "!".to_string().as_str()) { + return emit( + &pos, + TokenShape::ShBang, + "!".to_string(), + 1, + source.file.clone(), + ); } -if (ch.clone().as_str() == "?".to_string().as_str()) { - return emit(&pos, TokenShape::ShQuestion, "?".to_string(), 1, source.file.clone()) + if (ch.clone().as_str() == "?".to_string().as_str()) { + return emit( + &pos, + TokenShape::ShQuestion, + "?".to_string(), + 1, + source.file.clone(), + ); } -if (ch.clone().as_str() == "{".to_string().as_str()) { + if (ch.clone().as_str() == "{".to_string().as_str()) { { let new_depth = if ((pos.interp_depth.clone().len() as i64) > 0) { - replace_last(pos.interp_depth.clone(), (pos.interp_depth.clone().last().cloned().clone().unwrap() + 1)) + replace_last( + pos.interp_depth.clone(), + (pos.interp_depth.clone().last().cloned().clone().unwrap() + 1), + ) } else { pos.interp_depth.clone() }; -let tok = make_token("{".to_string(), make_file_span(source.file.clone(), pos.pos.clone(), (pos.pos.clone() + 1)), TokenShape::ShLBrace); -return Rc::new(ScanResult { - pos: (pos.pos.clone() + 1), - token: tok.clone(), - interp_depth: new_depth, -}) -} + let tok = make_token( + "{".to_string(), + make_file_span(source.file.clone(), pos.pos.clone(), (pos.pos.clone() + 1)), + TokenShape::ShLBrace, + ); + return Rc::new(ScanResult { + pos: (pos.pos.clone() + 1), + token: tok.clone(), + interp_depth: new_depth, + }); + } } -if (ch.clone().as_str() == "}".to_string().as_str()) { + if (ch.clone().as_str() == "}".to_string().as_str()) { { - let tok = make_token("}".to_string(), make_file_span(source.file.clone(), pos.pos.clone(), (pos.pos.clone() + 1)), TokenShape::ShRBrace); -return Rc::new(ScanResult { - pos: (pos.pos.clone() + 1), - token: tok.clone(), - interp_depth: pos.interp_depth.clone(), -}) -} + let tok = make_token( + "}".to_string(), + make_file_span(source.file.clone(), pos.pos.clone(), (pos.pos.clone() + 1)), + TokenShape::ShRBrace, + ); + return Rc::new(ScanResult { + pos: (pos.pos.clone() + 1), + token: tok.clone(), + interp_depth: pos.interp_depth.clone(), + }); + } } -match v2_rt::lookup(&single_punct(), ch.clone()) { - Some(sh) => emit(&pos, sh.clone(), ch.clone(), 1, source.file.clone()), - None => emit(&pos, TokenShape::ShUnknown, ch.clone(), 1, source.file.clone()), -} -} + match v2_rt::lookup(&single_punct(), ch.clone()) { + Some(sh) => emit(&pos, sh.clone(), ch.clone(), 1, source.file.clone()), + None => emit( + &pos, + TokenShape::ShUnknown, + ch.clone(), + 1, + source.file.clone(), + ), + } + } } -pub fn emit(pos: &Rc, shape: TokenShape, text: String, len: i64, file: String) -> Rc { +pub fn emit( + pos: &Rc, + shape: TokenShape, + text: String, + len: i64, + file: String, +) -> Rc { { - let token = make_token(text, make_file_span(file, pos.pos.clone(), (pos.pos.clone() + len.clone())), shape); -Rc::new(ScanResult { - pos: (pos.pos.clone() + len.clone()), - token: token, - interp_depth: pos.interp_depth.clone(), -}) -} + let token = make_token( + text, + make_file_span(file, pos.pos.clone(), (pos.pos.clone() + len.clone())), + shape, + ); + Rc::new(ScanResult { + pos: (pos.pos.clone() + len.clone()), + token: token, + interp_depth: pos.interp_depth.clone(), + }) + } } pub fn scan_ident(source: &Rc, pos: &Rc) -> Rc { { let end = source_scan_while(source.clone(), pos.pos.clone(), is_ident_char); -let text = source_substring(source.clone(), pos.pos.clone(), end.clone()); -let shape = if is_keyword_text(text.clone()) { + let text = source_substring(source.clone(), pos.pos.clone(), end.clone()); + let shape = if is_keyword_text(text.clone()) { TokenShape::ShKeyword } else { TokenShape::ShIdent }; -let token = make_token(text.clone(), make_file_span(source.file.clone(), pos.pos.clone(), end.clone()), shape); -Rc::new(ScanResult { - pos: end.clone(), - token: token, - interp_depth: pos.interp_depth.clone(), -}) -} + let token = make_token( + text.clone(), + make_file_span(source.file.clone(), pos.pos.clone(), end.clone()), + shape, + ); + Rc::new(ScanResult { + pos: end.clone(), + token: token, + interp_depth: pos.interp_depth.clone(), + }) + } } pub fn scan_number(source: &Rc, pos: &Rc) -> Rc { { let int_end = source_scan_while(source.clone(), pos.pos.clone(), is_digit); -if ((((int_end.clone() + 1) < source_len(source.clone())) && (source_char(source.clone(), int_end.clone()).as_str() == ".".to_string().as_str())) && is_digit(source_char(source.clone(), (int_end.clone() + 1)))) { + if ((((int_end.clone() + 1) < source_len(source.clone())) + && (source_char(source.clone(), int_end.clone()).as_str() == ".".to_string().as_str())) + && is_digit(source_char(source.clone(), (int_end.clone() + 1)))) + { { let frac_end = source_scan_while(source.clone(), (int_end.clone() + 1), is_digit); -let text = source_substring(source.clone(), pos.pos.clone(), frac_end.clone()); -let token = make_token(text.clone(), make_file_span(source.file.clone(), pos.pos.clone(), frac_end.clone()), TokenShape::ShLitFloat); -return Rc::new(ScanResult { - pos: frac_end.clone(), - token: token.clone(), - interp_depth: pos.interp_depth.clone(), -}) -} - } -let text = source_substring(source.clone(), pos.pos.clone(), int_end.clone()); -let parsed = v2_rt::parse_int(text.clone()); -let shape = match parsed { - Some(_) => TokenShape::ShLitInt, - None => TokenShape::ShUnknown, -}; -let token = make_token(text.clone(), make_file_span(source.file.clone(), pos.pos.clone(), int_end.clone()), shape); -Rc::new(ScanResult { - pos: int_end.clone(), - token: token.clone(), - interp_depth: pos.interp_depth.clone(), -}) -} + let text = source_substring(source.clone(), pos.pos.clone(), frac_end.clone()); + let token = make_token( + text.clone(), + make_file_span(source.file.clone(), pos.pos.clone(), frac_end.clone()), + TokenShape::ShLitFloat, + ); + return Rc::new(ScanResult { + pos: frac_end.clone(), + token: token.clone(), + interp_depth: pos.interp_depth.clone(), + }); + } + } + let text = source_substring(source.clone(), pos.pos.clone(), int_end.clone()); + let parsed = v2_rt::parse_int(text.clone()); + let shape = match parsed { + Some(_) => TokenShape::ShLitInt, + None => TokenShape::ShUnknown, + }; + let token = make_token( + text.clone(), + make_file_span(source.file.clone(), pos.pos.clone(), int_end.clone()), + shape, + ); + Rc::new(ScanResult { + pos: int_end.clone(), + token: token.clone(), + interp_depth: pos.interp_depth.clone(), + }) + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum StringScanResult { - ClosedString { - content: String, - end_pos: i64, - }, - InterpolationStart { - content: String, - end_pos: i64, - }, - UnterminatedString { - content: String, - end_pos: i64, - }, + ClosedString { content: String, end_pos: i64 }, + InterpolationStart { content: String, end_pos: i64 }, + UnterminatedString { content: String, end_pos: i64 }, } impl StringScanResult { pub fn content(&self) -> String { @@ -418,135 +628,179 @@ impl StringScanResult { pub fn scan_string(source: &Rc, pos: &Rc) -> Rc { { let span_start = pos.pos.clone(); -let body_start = (pos.pos.clone() + 1); -let result = scan_string_body(source.clone(), body_start, Rc::new(vec![])); -match (*result).clone() { - StringScanResult::ClosedString { content, end_pos, .. } => { - let processed = process_escapes(content.clone()); -let token = make_token(processed, make_file_span(source.file.clone(), span_start, (end_pos.clone() + 1)), TokenShape::ShLitStr); -Rc::new(ScanResult { - pos: (end_pos.clone() + 1), - token: token, - interp_depth: pos.interp_depth.clone(), -}) -}, - StringScanResult::InterpolationStart { content, end_pos, .. } => { - let processed = process_escapes(content.clone()); -let token = make_token(processed, make_file_span(source.file.clone(), span_start, (end_pos.clone() + 1)), TokenShape::ShStrBegin); -Rc::new(ScanResult { - pos: (end_pos.clone() + 1), - token: token, - interp_depth: Rc::new(v2_rt::append(pos.interp_depth.clone(), 0)), -}) -}, - StringScanResult::UnterminatedString { content, end_pos, .. } => { - let processed = process_escapes(content.clone()); -let token = make_token(processed, make_file_span(source.file.clone(), span_start, end_pos.clone()), TokenShape::ShUnknown); -Rc::new(ScanResult { - pos: end_pos.clone(), - token: token, - interp_depth: pos.interp_depth.clone(), -}) -}, -} -} + let body_start = (pos.pos.clone() + 1); + let result = scan_string_body(source.clone(), body_start, Rc::new(vec![])); + match (*result).clone() { + StringScanResult::ClosedString { + content, end_pos, .. + } => { + let processed = process_escapes(content.clone()); + let token = make_token( + processed, + make_file_span(source.file.clone(), span_start, (end_pos.clone() + 1)), + TokenShape::ShLitStr, + ); + Rc::new(ScanResult { + pos: (end_pos.clone() + 1), + token: token, + interp_depth: pos.interp_depth.clone(), + }) + } + StringScanResult::InterpolationStart { + content, end_pos, .. + } => { + let processed = process_escapes(content.clone()); + let token = make_token( + processed, + make_file_span(source.file.clone(), span_start, (end_pos.clone() + 1)), + TokenShape::ShStrBegin, + ); + Rc::new(ScanResult { + pos: (end_pos.clone() + 1), + token: token, + interp_depth: Rc::new(v2_rt::append(pos.interp_depth.clone(), 0)), + }) + } + StringScanResult::UnterminatedString { + content, end_pos, .. + } => { + let processed = process_escapes(content.clone()); + let token = make_token( + processed, + make_file_span(source.file.clone(), span_start, end_pos.clone()), + TokenShape::ShUnknown, + ); + Rc::new(ScanResult { + pos: end_pos.clone(), + token: token, + interp_depth: pos.interp_depth.clone(), + }) + } + } + } } pub fn scan_str_cont(source: &Rc, pos: &Rc, span_start: i64) -> Rc { { let result = scan_string_body(source.clone(), pos.pos.clone(), Rc::new(vec![])); -match (*result).clone() { - StringScanResult::ClosedString { content, end_pos, .. } => { - let processed = process_escapes(content.clone()); -let token = make_token(processed, make_file_span(source.file.clone(), span_start, (end_pos.clone() + 1)), TokenShape::ShStrEnd); -Rc::new(ScanResult { - pos: (end_pos.clone() + 1), - token: token, - interp_depth: pos.interp_depth.clone(), -}) -}, - StringScanResult::InterpolationStart { content, end_pos, .. } => { - let processed = process_escapes(content.clone()); -let token = make_token(processed, make_file_span(source.file.clone(), span_start, (end_pos.clone() + 1)), TokenShape::ShStrMid); -Rc::new(ScanResult { - pos: (end_pos.clone() + 1), - token: token, - interp_depth: Rc::new(v2_rt::append(pos.interp_depth.clone(), 0)), -}) -}, - StringScanResult::UnterminatedString { content, end_pos, .. } => { - let processed = process_escapes(content.clone()); -let token = make_token(processed, make_file_span(source.file.clone(), span_start, end_pos.clone()), TokenShape::ShUnknown); -Rc::new(ScanResult { - pos: end_pos.clone(), - token: token, - interp_depth: pos.interp_depth.clone(), -}) -}, -} -} -} - -pub fn scan_string_body(mut source: Rc, mut pos: i64, mut acc: Rc>) -> Rc { + match (*result).clone() { + StringScanResult::ClosedString { + content, end_pos, .. + } => { + let processed = process_escapes(content.clone()); + let token = make_token( + processed, + make_file_span(source.file.clone(), span_start, (end_pos.clone() + 1)), + TokenShape::ShStrEnd, + ); + Rc::new(ScanResult { + pos: (end_pos.clone() + 1), + token: token, + interp_depth: pos.interp_depth.clone(), + }) + } + StringScanResult::InterpolationStart { + content, end_pos, .. + } => { + let processed = process_escapes(content.clone()); + let token = make_token( + processed, + make_file_span(source.file.clone(), span_start, (end_pos.clone() + 1)), + TokenShape::ShStrMid, + ); + Rc::new(ScanResult { + pos: (end_pos.clone() + 1), + token: token, + interp_depth: Rc::new(v2_rt::append(pos.interp_depth.clone(), 0)), + }) + } + StringScanResult::UnterminatedString { + content, end_pos, .. + } => { + let processed = process_escapes(content.clone()); + let token = make_token( + processed, + make_file_span(source.file.clone(), span_start, end_pos.clone()), + TokenShape::ShUnknown, + ); + Rc::new(ScanResult { + pos: end_pos.clone(), + token: token, + interp_depth: pos.interp_depth.clone(), + }) + } + } + } +} + +pub fn scan_string_body( + mut source: Rc, + mut pos: i64, + mut acc: Rc>, +) -> Rc { loop { if (pos.clone() >= source_len(source.clone())) { break Rc::new(StringScanResult::UnterminatedString { - content: acc.join(&"".to_string()), - end_pos: pos.clone(), -}); -} else { + content: acc.join(&"".to_string()), + end_pos: pos.clone(), + }); + } else { let ch = source_char(source.clone(), pos.clone()); -if (ch.clone().as_str() == "\"".to_string().as_str()) { + if (ch.clone().as_str() == "\"".to_string().as_str()) { break Rc::new(StringScanResult::ClosedString { - content: acc.join(&"".to_string()), - end_pos: pos.clone(), -}); -} else { + content: acc.join(&"".to_string()), + end_pos: pos.clone(), + }); + } else { if (ch.clone().as_str() == "\\".to_string().as_str()) { if ((pos.clone() + 1) < source_len(source.clone())) { let escaped = source_char(source.clone(), (pos.clone() + 1)); -{ + { let __tco_0 = (pos + 2); -let __tco_1 = v2_rt::rc_list_push(v2_rt::rc_list_push(acc, "\\".to_string()), escaped); -pos = __tco_0; -acc = __tco_1; -continue; -} -} else { + let __tco_1 = v2_rt::rc_list_push( + v2_rt::rc_list_push(acc, "\\".to_string()), + escaped, + ); + pos = __tco_0; + acc = __tco_1; + continue; + } + } else { break Rc::new(StringScanResult::UnterminatedString { - content: v2_rt::rc_list_push(acc, "\\".to_string()).join(&"".to_string()), - end_pos: (pos.clone() + 1), -}); -} -} else { + content: v2_rt::rc_list_push(acc, "\\".to_string()) + .join(&"".to_string()), + end_pos: (pos.clone() + 1), + }); + } + } else { if (ch.clone().as_str() == "{".to_string().as_str()) { if should_start_interpolation(&source, pos.clone()) { break Rc::new(StringScanResult::InterpolationStart { - content: acc.join(&"".to_string()), - end_pos: pos.clone(), -}); -} else { + content: acc.join(&"".to_string()), + end_pos: pos.clone(), + }); + } else { { let __tco_0 = (pos + 1); -let __tco_1 = v2_rt::rc_list_push(acc, "{".to_string()); -pos = __tco_0; -acc = __tco_1; -continue; -} -} -} else { + let __tco_1 = v2_rt::rc_list_push(acc, "{".to_string()); + pos = __tco_0; + acc = __tco_1; + continue; + } + } + } else { { let __tco_0 = (pos + 1); -let __tco_1 = v2_rt::rc_list_push(acc, ch.clone()); -pos = __tco_0; -acc = __tco_1; -continue; -} -} -} -} -} -} + let __tco_1 = v2_rt::rc_list_push(acc, ch.clone()); + pos = __tco_0; + acc = __tco_1; + continue; + } + } + } + } + } + } } pub fn should_start_interpolation(source: &Rc, pos: i64) -> bool { @@ -555,8 +809,10 @@ pub fn should_start_interpolation(source: &Rc, pos: i64) -> bool { } else { { let next = source_char(source.clone(), (pos.clone() + 1)); -(((is_ident_start(&next) || (next.clone().as_str() == "(".to_string().as_str())) || (next.clone().as_str() == "!".to_string().as_str())) || (next.clone().as_str() == "-".to_string().as_str())) -} + (((is_ident_start(&next) || (next.clone().as_str() == "(".to_string().as_str())) + || (next.clone().as_str() == "!".to_string().as_str())) + || (next.clone().as_str() == "-".to_string().as_str())) + } } } @@ -568,11 +824,13 @@ pub fn process_escapes_loop(mut source: String, mut pos: i64, mut acc: Rc= v2_rt::string_length(&source)) { break acc.join(&"".to_string()); -} else { + } else { let ch = v2_rt::char_at(&source, pos.clone()); -if ((ch.clone().as_str() == "\\".to_string().as_str()) && ((pos.clone() + 1) < v2_rt::string_length(&source))) { + if ((ch.clone().as_str() == "\\".to_string().as_str()) + && ((pos.clone() + 1) < v2_rt::string_length(&source))) + { let next = v2_rt::char_at(&source, (pos.clone() + 1)); -let resolved = if (next.clone().as_str() == "\"".to_string().as_str()) { + let resolved = if (next.clone().as_str() == "\"".to_string().as_str()) { "\"".to_string() } else { if (next.clone().as_str() == "\\".to_string().as_str()) { @@ -597,61 +855,85 @@ let resolved = if (next.clone().as_str() == "\"".to_string().as_str()) { } } }; -{ + { let __tco_0 = (pos + 2); -let __tco_1 = v2_rt::rc_list_push(acc, resolved); -pos = __tco_0; -acc = __tco_1; -continue; -} -} else { + let __tco_1 = v2_rt::rc_list_push(acc, resolved); + pos = __tco_0; + acc = __tco_1; + continue; + } + } else { { let __tco_0 = (pos + 1); -let __tco_1 = v2_rt::rc_list_push(acc, ch.clone()); -pos = __tco_0; -acc = __tco_1; -continue; -} -} -} -} + let __tco_1 = v2_rt::rc_list_push(acc, ch.clone()); + pos = __tco_0; + acc = __tco_1; + continue; + } + } + } + } } pub fn drop_last(stack: &Rc>) -> Rc> { { let len = (stack.clone().len() as i64); -Rc::new(stack.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned().fold(Rc::new(vec![]), |result: Rc>, pair: (i64, i64)| if (pair.0.clone() < (len.clone() - 1)) { - Rc::new(v2_rt::append(result.clone(), pair.1.clone())) - } else { - result.clone() + Rc::new( + stack + .clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + .fold(Rc::new(vec![]), |result: Rc>, pair: (i64, i64)| { + if (pair.0.clone() < (len.clone() - 1)) { + Rc::new(v2_rt::append(result.clone(), pair.1.clone())) + } else { + result.clone() + } }) -} + } } pub fn replace_last(stack: Rc>, value: i64) -> Rc> { { let prefix = drop_last(&stack); -Rc::new(v2_rt::append(prefix, value)) -} + Rc::new(v2_rt::append(prefix, value)) + } } -pub fn skip_spaces_and_comments(mut source: Rc, mut pos: Rc, mut fuel: i64) -> Rc { +pub fn skip_spaces_and_comments( + mut source: Rc, + mut pos: Rc, + mut fuel: i64, +) -> Rc { loop { let p = source_skip_ws(source.clone(), pos.pos.clone()); -if ((((p.clone() + 1) < source_len(source.clone())) && (source_char(source.clone(), p.clone()).as_str() == "/".to_string().as_str())) && (source_char(source.clone(), (p.clone() + 1)).as_str() == "/".to_string().as_str())) { + if ((((p.clone() + 1) < source_len(source.clone())) + && (source_char(source.clone(), p.clone()).as_str() == "/".to_string().as_str())) + && (source_char(source.clone(), (p.clone() + 1)).as_str() == "/".to_string().as_str())) + { { let eol = source_scan_to_eol(source.clone(), p.clone()); -return skip_spaces_and_comments(source.clone(), Rc::new(TokPos { - pos: eol, - interp_depth: pos.interp_depth.clone(), -}), (fuel - 1)) -} + return skip_spaces_and_comments( + source.clone(), + Rc::new(TokPos { + pos: eol, + interp_depth: pos.interp_depth.clone(), + }), + (fuel - 1), + ); + } } -break Rc::new(TokPos { - pos: p.clone(), - interp_depth: pos.interp_depth.clone(), -}); -} + break Rc::new(TokPos { + pos: p.clone(), + interp_depth: pos.interp_depth.clone(), + }); + } } pub fn is_digit(ch: String) -> bool { @@ -659,7 +941,9 @@ pub fn is_digit(ch: String) -> bool { } pub fn is_ident_start(ch: &String) -> bool { - ((((ch.clone() >= "a".to_string()) && (ch.clone() <= "z".to_string())) || ((ch.clone() >= "A".to_string()) && (ch.clone() <= "Z".to_string()))) || (ch.clone().as_str() == "_".to_string().as_str())) + ((((ch.clone() >= "a".to_string()) && (ch.clone() <= "z".to_string())) + || ((ch.clone() >= "A".to_string()) && (ch.clone() <= "Z".to_string()))) + || (ch.clone().as_str() == "_".to_string().as_str())) } pub fn is_ident_char(ch: String) -> bool { diff --git a/src/v2/stage0/src/v2_compiler_trace.rs b/src/v2/stage0/src/v2_compiler_trace.rs index 5fe94ef6c4b..33e848a24bd 100644 --- a/src/v2/stage0/src/v2_compiler_trace.rs +++ b/src/v2/stage0/src/v2_compiler_trace.rs @@ -1,14 +1,14 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.compiler.trace -use std::collections::HashMap; -use std::rc::Rc; -use crate::v2_rt; -use crate::NonEmptyVec; -use crate::NonEmptyBTreeSet; -pub use crate::v2_std_core::{SourceSpan}; use self::TraceEvent::*; use self::TraceFilter::*; +use crate::v2_rt; +pub use crate::v2_std_core::SourceSpan; +use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] pub struct SpanMapping { @@ -67,103 +67,193 @@ pub struct Trace { pub fn empty_trace() -> Rc { Rc::new(Trace { - events: Rc::new(vec![]), - stack: Rc::new(vec![]), -}) + events: Rc::new(vec![]), + stack: Rc::new(vec![]), + }) } pub fn trace_push_event(trace: &Rc, event: Rc) -> Rc { Rc::new(Trace { - events: v2_rt::rc_list_push(trace.events.clone(), event), - stack: trace.stack.clone(), -}) + events: v2_rt::rc_list_push(trace.events.clone(), event), + stack: trace.stack.clone(), + }) } pub fn trace_push_frame(trace: &Rc, frame: Rc) -> Rc { Rc::new(Trace { - events: trace.events.clone(), - stack: v2_rt::rc_list_push(trace.stack.clone(), frame), -}) + events: trace.events.clone(), + stack: v2_rt::rc_list_push(trace.stack.clone(), frame), + }) } pub fn trace_pop_frame(trace: &Rc) -> Rc { { let n = (trace.stack.clone().len() as i64); -if (n.clone() <= 1) { + if (n.clone() <= 1) { Rc::new(Trace { - events: trace.events.clone(), - stack: Rc::new(vec![]), -}) + events: trace.events.clone(), + stack: Rc::new(vec![]), + }) } else { Rc::new(Trace { - events: trace.events.clone(), - stack: Rc::new(trace.stack.clone().iter().cloned().take((n.clone() - 1) as usize).collect::>()), -}) + events: trace.events.clone(), + stack: Rc::new( + trace + .stack + .clone() + .iter() + .cloned() + .take((n.clone() - 1) as usize) + .collect::>(), + ), + }) } -} + } } pub fn event_span(event: Rc) -> Rc { match (*event).clone() { - TraceEvent::TraceEnter { span: s, .. } => s.clone(), - TraceEvent::TraceExit { span: s, .. } => s.clone(), - TraceEvent::TraceError { span: s, .. } => s.clone(), -} + TraceEvent::TraceEnter { span: s, .. } => s.clone(), + TraceEvent::TraceExit { span: s, .. } => s.clone(), + TraceEvent::TraceError { span: s, .. } => s.clone(), + } } pub fn event_node_id(event: Rc) -> String { match (*event).clone() { - TraceEvent::TraceEnter { node_id: id, .. } => id.clone(), - TraceEvent::TraceExit { node_id: id, .. } => id.clone(), - TraceEvent::TraceError { node_id: id, .. } => id.clone(), -} + TraceEvent::TraceEnter { node_id: id, .. } => id.clone(), + TraceEvent::TraceExit { node_id: id, .. } => id.clone(), + TraceEvent::TraceError { node_id: id, .. } => id.clone(), + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum TraceFilter { - FilterByFunc { - func_name: String, - }, - FilterBySpan { - start: i64, - end: i64, - }, + FilterByFunc { func_name: String }, + FilterBySpan { start: i64, end: i64 }, FilterErrors, } pub fn event_matches_span(event: Rc, filter_start: i64, filter_end: i64) -> bool { { let sp = event_span(event); -((sp.start.clone() >= filter_start) && (sp.start.clone() < filter_end)) -} + ((sp.start.clone() >= filter_start) && (sp.start.clone() < filter_end)) + } } pub fn replay_trace(trace: Rc, filter: Rc) -> Rc>> { match (*filter).clone() { - TraceFilter::FilterByFunc { func_name: name, .. } => Rc::new({ let mut __result = Vec::new(); for e in trace.events.clone().iter().cloned() { if (event_node_id(e.clone()).as_str() == name.clone().as_str()) { __result.push(e); } } __result }), - TraceFilter::FilterBySpan { start: s, end: e, .. } => Rc::new({ let mut __result = Vec::new(); for ev in trace.events.clone().iter().cloned() { if event_matches_span(ev.clone(), s.clone(), e.clone()) { __result.push(ev); } } __result }), - TraceFilter::FilterErrors => Rc::new({ let mut __result = Vec::new(); for e in trace.events.clone().iter().cloned() { if match (*e.clone()).clone() { - TraceEvent::TraceError { .. } => true, - _ => false, -} { __result.push(e); } } __result }), -} + TraceFilter::FilterByFunc { + func_name: name, .. + } => Rc::new({ + let mut __result = Vec::new(); + for e in trace.events.clone().iter().cloned() { + if (event_node_id(e.clone()).as_str() == name.clone().as_str()) { + __result.push(e); + } + } + __result + }), + TraceFilter::FilterBySpan { + start: s, end: e, .. + } => Rc::new({ + let mut __result = Vec::new(); + for ev in trace.events.clone().iter().cloned() { + if event_matches_span(ev.clone(), s.clone(), e.clone()) { + __result.push(ev); + } + } + __result + }), + TraceFilter::FilterErrors => Rc::new({ + let mut __result = Vec::new(); + for e in trace.events.clone().iter().cloned() { + if match (*e.clone()).clone() { + TraceEvent::TraceError { .. } => true, + _ => false, + } { + __result.push(e); + } + } + __result + }), + } } pub fn format_span(sp: &Rc) -> String { - v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("[".to_string(), (sp.start.clone()).to_string()), "..".to_string()), (sp.end.clone()).to_string()), ")".to_string()) + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("[".to_string(), (sp.start.clone()).to_string()), + "..".to_string(), + ), + (sp.end.clone()).to_string(), + ), + ")".to_string(), + ) } pub fn format_trace_event(event: Rc) -> String { match (*event).clone() { - TraceEvent::TraceEnter { node_id: id, span: sp, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat("> ".to_string(), id.clone()), " at ".to_string()), format_span(&sp)), - TraceEvent::TraceExit { node_id: id, span: sp, output: out, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("< ".to_string(), id.clone()), " at ".to_string()), format_span(&sp)), ": ".to_string()), out.clone()), - TraceEvent::TraceError { node_id: id, span: sp, message: msg, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("! ".to_string(), id.clone()), " at ".to_string()), format_span(&sp)), ": ".to_string()), msg.clone()), -} + TraceEvent::TraceEnter { + node_id: id, + span: sp, + .. + } => v2_rt::concat( + v2_rt::concat( + v2_rt::concat("> ".to_string(), id.clone()), + " at ".to_string(), + ), + format_span(&sp), + ), + TraceEvent::TraceExit { + node_id: id, + span: sp, + output: out, + .. + } => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("< ".to_string(), id.clone()), + " at ".to_string(), + ), + format_span(&sp), + ), + ": ".to_string(), + ), + out.clone(), + ), + TraceEvent::TraceError { + node_id: id, + span: sp, + message: msg, + .. + } => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("! ".to_string(), id.clone()), + " at ".to_string(), + ), + format_span(&sp), + ), + ": ".to_string(), + ), + msg.clone(), + ), + } } pub fn format_trace(trace: Rc) -> Rc> { - Rc::new({ let mut __result = Vec::new(); for e in trace.events.clone().iter().cloned() { __result.push(format_trace_event(e.clone())); } __result }) + Rc::new({ + let mut __result = Vec::new(); + for e in trace.events.clone().iter().cloned() { + __result.push(format_trace_event(e.clone())); + } + __result + }) } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -174,13 +264,17 @@ pub struct ReproCase { pub trace: Option>, } -pub fn capture_repro(func_name: String, inputs: Rc>, trace: Rc) -> Rc { +pub fn capture_repro( + func_name: String, + inputs: Rc>, + trace: Rc, +) -> Rc { Rc::new(ReproCase { - func_name: func_name, - inputs: inputs, - expected_output: None, - trace: Some(trace), -}) + func_name: func_name, + inputs: inputs, + expected_output: None, + trace: Some(trace), + }) } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -190,5 +284,16 @@ pub struct SourceMap { } pub fn remap_location(source_map: Rc, generated_line: i64) -> Option> { - Rc::new({ let mut __result = Vec::new(); for m in source_map.mappings.clone().iter().cloned() { if (m.generated_line.clone() <= generated_line.clone()) { __result.push(m); } } __result }).last().cloned().map(|m| m.source_span.clone()) + Rc::new({ + let mut __result = Vec::new(); + for m in source_map.mappings.clone().iter().cloned() { + if (m.generated_line.clone() <= generated_line.clone()) { + __result.push(m); + } + } + __result + }) + .last() + .cloned() + .map(|m| m.source_span.clone()) } diff --git a/src/v2/stage0/src/v2_rt.rs b/src/v2/stage0/src/v2_rt.rs index 8e6da305b01..ffaae8d00d3 100644 --- a/src/v2/stage0/src/v2_rt.rs +++ b/src/v2/stage0/src/v2_rt.rs @@ -11,52 +11,84 @@ pub trait V2Concat { } impl V2Concat for String { - fn v2_concat(mut self, other: String) -> String { self.push_str(&other); self } + fn v2_concat(mut self, other: String) -> String { + self.push_str(&other); + self + } } impl V2Concat for Vec { - fn v2_concat(mut self, other: Vec) -> Vec { self.extend(other); self } + fn v2_concat(mut self, other: Vec) -> Vec { + self.extend(other); + self + } } -pub fn concat(a: T, b: T) -> T { a.v2_concat(b) } +pub fn concat(a: T, b: T) -> T { + a.v2_concat(b) +} pub fn char_at(s: &str, pos: i64) -> String { let pos = pos.max(0) as usize; if s.is_ascii() { let bytes = s.as_bytes(); - if pos >= bytes.len() { return String::new(); } + if pos >= bytes.len() { + return String::new(); + } return String::from(bytes[pos] as char); } - s.chars().nth(pos).map(|ch| ch.to_string()).unwrap_or_default() + s.chars() + .nth(pos) + .map(|ch| ch.to_string()) + .unwrap_or_default() } pub fn string_length(s: &str) -> i64 { - if s.is_ascii() { s.len() as i64 } else { s.chars().count() as i64 } + if s.is_ascii() { + s.len() as i64 + } else { + s.chars().count() as i64 + } } pub fn substring(s: &str, start: i64, end: i64) -> String { let start = start.max(0) as usize; let end = end.max(0) as usize; - if end <= start { return String::new(); } + if end <= start { + return String::new(); + } if s.is_ascii() { let len = s.len(); - if start >= len { return String::new(); } + if start >= len { + return String::new(); + } return s[start..end.min(len)].to_string(); } - s.chars().skip(start).take(end.saturating_sub(start)).collect() + s.chars() + .skip(start) + .take(end.saturating_sub(start)) + .collect() } pub fn string_contains(s: &str, sub: String) -> bool { s.contains(&*sub) } -pub fn contains(s: String, sub: String) -> bool { string_contains(&s, sub) } +pub fn contains(s: String, sub: String) -> bool { + string_contains(&s, sub) +} -pub fn count(items: Rc>) -> i64 { items.len() as i64 } +pub fn count(items: Rc>) -> i64 { + items.len() as i64 +} -pub fn str_eq(a: String, b: String) -> bool { a == b } +pub fn str_eq(a: String, b: String) -> bool { + a == b +} -pub fn to_string(value: i64) -> String { value.to_string() } +pub fn to_string(value: i64) -> String { + value.to_string() +} pub fn clamp(val: i64, min_val: i64, max_val: i64) -> i64 { val.clamp(min_val, max_val) @@ -68,31 +100,58 @@ pub fn lookup(table: &HashMap, key: String) -> Option { pub fn index_by String>(list: Vec, key_fn: F) -> HashMap { let mut map = HashMap::new(); - for item in list { let key = key_fn(&item); map.insert(key, item); } + for item in list { + let key = key_fn(&item); + map.insert(key, item); + } map } -pub fn empty_map() -> HashMap { HashMap::new() } +pub fn empty_map() -> HashMap { + HashMap::new() +} -pub fn map_insert(mut map: HashMap, key: K, value: V) -> HashMap { - map.insert(key, value); map +pub fn map_insert( + mut map: HashMap, + key: K, + value: V, +) -> HashMap { + map.insert(key, value); + map } -pub fn map_merge(mut base: HashMap, overlay: HashMap) -> HashMap { - base.extend(overlay); base +pub fn map_merge( + mut base: HashMap, + overlay: HashMap, +) -> HashMap { + base.extend(overlay); + base } -pub fn map_get(m: &HashMap, key: K) -> Option { +pub fn map_get( + m: &HashMap, + key: K, +) -> Option { m.get(&key).cloned() } -pub fn map_keys(m: &HashMap) -> Vec { m.keys().cloned().collect() } +pub fn map_keys(m: &HashMap) -> Vec { + m.keys().cloned().collect() +} -pub fn map_values(m: &HashMap) -> Vec { m.values().cloned().collect() } +pub fn map_values(m: &HashMap) -> Vec { + m.values().cloned().collect() +} -pub fn list_concat(mut a: Vec, b: Vec) -> Vec { a.extend(b); a } +pub fn list_concat(mut a: Vec, b: Vec) -> Vec { + a.extend(b); + a +} -pub fn list_push(mut list: Vec, item: T) -> Vec { list.push(item); list } +pub fn list_push(mut list: Vec, item: T) -> Vec { + list.push(item); + list +} pub fn append(list: Rc>, item: T) -> Vec { let mut v = (*list).clone(); @@ -110,7 +169,9 @@ pub fn chars_to_string(chars: &Rc>, start: i64, end: i64) -> String { .collect() } -pub fn parse_int(s: String) -> Option { s.parse::().ok() } +pub fn parse_int(s: String) -> Option { + s.parse::().ok() +} pub fn map_contains_key(m: &HashMap, key: K) -> bool { m.contains_key(&key) @@ -121,7 +182,9 @@ pub fn map_has(m: &HashMap, key: K) } pub fn reverse(list: Rc>) -> Rc> { - let mut v = (*list).clone(); v.reverse(); Rc::new(v) + let mut v = (*list).clone(); + v.reverse(); + Rc::new(v) } pub fn replace(s: String, from: String, to: String) -> String { @@ -146,13 +209,20 @@ pub fn rc_list_concat(a: Rc>, b: Rc>) -> Rc> { result } -pub fn rc_map_insert(map: Rc>, key: K, value: V) -> Rc> { +pub fn rc_map_insert( + map: Rc>, + key: K, + value: V, +) -> Rc> { let mut m = map; Rc::make_mut(&mut m).insert(key, value); m } -pub fn rc_map_merge(base: Rc>, overlay: Rc>) -> Rc> { +pub fn rc_map_merge( + base: Rc>, + overlay: Rc>, +) -> Rc> { let mut result = base; let inner = Rc::make_mut(&mut result); for (k, v) in overlay.iter() { @@ -161,14 +231,21 @@ pub fn rc_map_merge(base: R result } -pub fn rc_index_by String>(list: Rc>, key_fn: F) -> Rc> { +pub fn rc_index_by String>( + list: Rc>, + key_fn: F, +) -> Rc> { Rc::new(list.iter().map(|v| (key_fn(v), v.clone())).collect()) } -pub fn rc_empty_map() -> Rc> { Rc::new(HashMap::new()) } +pub fn rc_empty_map() -> Rc> { + Rc::new(HashMap::new()) +} impl V2Concat for Rc> { - fn v2_concat(self, other: Rc>) -> Rc> { rc_list_concat(self, other) } + fn v2_concat(self, other: Rc>) -> Rc> { + rc_list_concat(self, other) + } } pub fn scan_while(s: &str, start: i64, pred: impl Fn(String) -> bool) -> i64 { @@ -176,14 +253,20 @@ pub fn scan_while(s: &str, start: i64, pred: impl Fn(String) -> bool) -> i64 { if s.is_ascii() { let bytes = s.as_bytes(); let mut pos = start.min(bytes.len()); - while pos < bytes.len() && pred(String::from(bytes[pos] as char)) { pos += 1; } + while pos < bytes.len() && pred(String::from(bytes[pos] as char)) { + pos += 1; + } return pos as i64; } let char_len = s.chars().count(); let start = start.min(char_len); let mut pos = start; for ch in s.chars().skip(start) { - if pred(ch.to_string()) { pos += 1; } else { break; } + if pred(ch.to_string()) { + pos += 1; + } else { + break; + } } pos as i64 } @@ -193,14 +276,20 @@ pub fn skip_horizontal_ws(s: &str, start: i64) -> i64 { if s.is_ascii() { let bytes = s.as_bytes(); let mut pos = start.min(bytes.len()); - while pos < bytes.len() && (bytes[pos] == b' ' || bytes[pos] == b'\t') { pos += 1; } + while pos < bytes.len() && (bytes[pos] == b' ' || bytes[pos] == b'\t') { + pos += 1; + } return pos as i64; } let char_len = s.chars().count(); let start = start.min(char_len); let mut pos = start; for ch in s.chars().skip(start) { - if ch == ' ' || ch == '\t' { pos += 1; } else { break; } + if ch == ' ' || ch == '\t' { + pos += 1; + } else { + break; + } } pos as i64 } @@ -210,14 +299,20 @@ pub fn scan_to_eol(s: &str, start: i64) -> i64 { if s.is_ascii() { let bytes = s.as_bytes(); let start = start.min(bytes.len()); - for i in start..bytes.len() { if bytes[i] == b'\n' { return i as i64; } } + for i in start..bytes.len() { + if bytes[i] == b'\n' { + return i as i64; + } + } return bytes.len() as i64; } let char_len = s.chars().count(); let start = start.min(char_len); let mut pos = start; for ch in s.chars().skip(start) { - if ch == '\n' { return pos as i64; } + if ch == '\n' { + return pos as i64; + } pos += 1; } pos as i64 @@ -229,9 +324,13 @@ pub fn scan_string_end(s: &str, start: i64) -> i64 { let bytes = s.as_bytes(); let mut pos = start.min(bytes.len()); while pos < bytes.len() { - if bytes[pos] == b'\\' { pos += 2; } - else if bytes[pos] == b'\"' { return (pos + 1) as i64; } - else { pos += 1; } + if bytes[pos] == b'\\' { + pos += 2; + } else if bytes[pos] == b'\"' { + return (pos + 1) as i64; + } else { + pos += 1; + } } return bytes.len() as i64; } @@ -260,7 +359,9 @@ pub fn code_point(c: String) -> i64 { } pub fn from_code_point(cp: i64) -> String { - char::from_u32(cp as u32).map(|c| c.to_string()).unwrap_or_default() + char::from_u32(cp as u32) + .map(|c| c.to_string()) + .unwrap_or_default() } #[derive(Debug, Clone)] @@ -269,7 +370,7 @@ pub struct FilesystemReadResult { } pub fn filesystem_read(path: String) -> FilesystemReadResult { - let content = std::fs::read_to_string(&path) - .unwrap_or_else(|e| panic!("failed to read {}: {}", path, e)); + let content = + std::fs::read_to_string(&path).unwrap_or_else(|e| panic!("failed to read {}: {}", path, e)); FilesystemReadResult { content } } diff --git a/src/v2/stage0/src/v2_std_core.rs b/src/v2/stage0/src/v2_std_core.rs index edbf24b96d4..800cac37ccc 100644 --- a/src/v2/stage0/src/v2_std_core.rs +++ b/src/v2/stage0/src/v2_std_core.rs @@ -1,39 +1,46 @@ // Generated by v2 compiler -- do not edit. // Source module: v2.std.core -use std::collections::HashMap; -use std::rc::Rc; -use crate::v2_rt; -use crate::NonEmptyVec; -use crate::NonEmptyBTreeSet; -pub use crate::std_types::{FilePath, NonEmptyStr, SourceSpan, kernel_type_set, is_kernel_type, container_type_arity, is_container_type, container_expected_arity}; -pub use crate::std_syntax::{BinOp, LiteralValue, AlgebraFieldKind}; -use crate::std_syntax::BinOp::{Add, Sub, Mul, Div, Mod, Eq, Ne, Lt, Gt, Le, Ge, And, Or, NullCoalesce}; -use crate::std_syntax::LiteralValue::{LitStr, LitInt, LitFloat, LitBool, LitNull}; -use crate::std_syntax::AlgebraFieldKind::{AlgAdd, AlgMul, AlgReciprocal, AlgQuotient, AlgRemainder, AlgCompare, AlgMeet, AlgJoin}; -pub use crate::std_algebra::{CollectionSizeEffect, CostShape, AlgebraFieldTemplate}; -use crate::std_algebra::CollectionSizeEffect::*; -use crate::std_algebra::CostShape::*; -pub use crate::std_induction::{SubValueRelation}; -use crate::std_induction::SubValueRelation::*; -use self::TokenShape::*; -use self::Connective::*; +use self::CallSemantics::*; use self::Cardinality::*; +use self::CompilerDiagnostic::*; +use self::Connective::*; +use self::ExprData::*; +use self::ExprErrorKind::*; use self::FieldAccessStyle::*; use self::FieldValueShape::*; +use self::FunctionSizeEffect::*; use self::InferredNode::*; -use self::VarBindingKind::*; -use self::CallSemantics::*; -use self::MethodSemantics::*; -use self::ExprErrorKind::*; -use self::ExprData::*; use self::MatchPattern::*; -use self::UnaryOpKind::*; -use self::StringPart::*; -use self::OperationModifier::*; -use self::CompilerDiagnostic::*; +use self::MethodSemantics::*; use self::NodeFieldRole::*; -use self::FunctionSizeEffect::*; +use self::OperationModifier::*; +use self::StringPart::*; +use self::TokenShape::*; +use self::UnaryOpKind::*; +use self::VarBindingKind::*; +use crate::std_algebra::CollectionSizeEffect::*; +use crate::std_algebra::CostShape::*; +pub use crate::std_algebra::{AlgebraFieldTemplate, CollectionSizeEffect, CostShape}; +pub use crate::std_induction::SubValueRelation; +use crate::std_induction::SubValueRelation::*; +use crate::std_syntax::AlgebraFieldKind::{ + AlgAdd, AlgCompare, AlgJoin, AlgMeet, AlgMul, AlgQuotient, AlgReciprocal, AlgRemainder, +}; +use crate::std_syntax::BinOp::{ + Add, And, Div, Eq, Ge, Gt, Le, Lt, Mod, Mul, Ne, NullCoalesce, Or, Sub, +}; +use crate::std_syntax::LiteralValue::{LitBool, LitFloat, LitInt, LitNull, LitStr}; +pub use crate::std_syntax::{AlgebraFieldKind, BinOp, LiteralValue}; +pub use crate::std_types::{ + container_expected_arity, container_type_arity, is_container_type, is_kernel_type, + kernel_type_set, FilePath, NonEmptyStr, SourceSpan, +}; +use crate::v2_rt; +use crate::NonEmptyBTreeSet; +use crate::NonEmptyVec; +use std::collections::HashMap; +use std::rc::Rc; #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] pub struct Token { @@ -145,18 +152,18 @@ pub enum InferredNode { pub fn inferred_to_node(inferred: Rc) -> Option> { match (*inferred).clone() { - InferredNode::Resolved { node: n, .. } => Some(n.clone()), - InferredNode::CompilerError { .. } => None, - InferredNode::TypeVariable { .. } => None, -} + InferredNode::Resolved { node: n, .. } => Some(n.clone()), + InferredNode::CompilerError { .. } => None, + InferredNode::TypeVariable { .. } => None, + } } pub fn is_compiler_error(inferred: Rc) -> bool { match (*inferred).clone() { - InferredNode::Resolved { .. } => false, - InferredNode::CompilerError { .. } => true, - InferredNode::TypeVariable { .. } => false, -} + InferredNode::Resolved { .. } => false, + InferredNode::CompilerError { .. } => true, + InferredNode::TypeVariable { .. } => false, + } } pub fn has_inferred(n: Rc) -> bool { @@ -168,9 +175,7 @@ pub fn has_inferred(n: Rc) -> bool { pub enum VarBindingKind { LocalValueBinding, FunctionValueBinding, - VariantValueBinding { - parent_enum: String, - }, + VariantValueBinding { parent_enum: String }, MatchBoundBinding, } impl VarBindingKind { @@ -178,7 +183,9 @@ impl VarBindingKind { match self { VarBindingKind::LocalValueBinding => panic!("no parent_enum on unit variant"), VarBindingKind::FunctionValueBinding => panic!("no parent_enum on unit variant"), - VarBindingKind::VariantValueBinding { parent_enum: __val, .. } => __val.clone(), + VarBindingKind::VariantValueBinding { + parent_enum: __val, .. + } => __val.clone(), VarBindingKind::MatchBoundBinding => panic!("no parent_enum on unit variant"), } } @@ -291,12 +298,8 @@ pub enum UnaryOpKind { #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[serde(tag = "_variant")] pub enum StringPart { - Text { - value: String, - }, - Interpolation { - expr: Rc, - }, + Text { value: String }, + Interpolation { expr: Rc }, } #[derive(Debug, Clone, Copy, PartialEq, serde::Serialize, serde::Deserialize)] @@ -437,44 +440,208 @@ pub struct ErrorDAG { pub fn diagnostic_to_span(d: Rc) -> Rc { match (*d).clone() { - CompilerDiagnostic::UnresolvedImport { span: s, .. } => s.clone(), - CompilerDiagnostic::MissingExport { span: s, .. } => s.clone(), - CompilerDiagnostic::UnresolvedType { span: s, .. } => s.clone(), - CompilerDiagnostic::TypeMismatch { span: s, .. } => s.clone(), - CompilerDiagnostic::ArityMismatch { span: s, .. } => s.clone(), - CompilerDiagnostic::VariantNotFound { span: s, .. } => s.clone(), - CompilerDiagnostic::FieldNotFound { span: s, .. } => s.clone(), - CompilerDiagnostic::NonExhaustiveMatch { span: s, .. } => s.clone(), - CompilerDiagnostic::CircularDependency { span: s, .. } => s.clone(), - CompilerDiagnostic::DuplicateModule { span: s, .. } => s.clone(), - CompilerDiagnostic::MissingAnnotation { span: s, .. } => s.clone(), - CompilerDiagnostic::ParseError { span: s, .. } => s.clone(), - CompilerDiagnostic::InternalError { span: s, .. } => s.clone(), - CompilerDiagnostic::ComplexityUnknown { span: s, .. } => s.clone(), - CompilerDiagnostic::OwnershipViolation { span: s, .. } => s.clone(), - CompilerDiagnostic::VariantCollision { span: s, .. } => s.clone(), -} + CompilerDiagnostic::UnresolvedImport { span: s, .. } => s.clone(), + CompilerDiagnostic::MissingExport { span: s, .. } => s.clone(), + CompilerDiagnostic::UnresolvedType { span: s, .. } => s.clone(), + CompilerDiagnostic::TypeMismatch { span: s, .. } => s.clone(), + CompilerDiagnostic::ArityMismatch { span: s, .. } => s.clone(), + CompilerDiagnostic::VariantNotFound { span: s, .. } => s.clone(), + CompilerDiagnostic::FieldNotFound { span: s, .. } => s.clone(), + CompilerDiagnostic::NonExhaustiveMatch { span: s, .. } => s.clone(), + CompilerDiagnostic::CircularDependency { span: s, .. } => s.clone(), + CompilerDiagnostic::DuplicateModule { span: s, .. } => s.clone(), + CompilerDiagnostic::MissingAnnotation { span: s, .. } => s.clone(), + CompilerDiagnostic::ParseError { span: s, .. } => s.clone(), + CompilerDiagnostic::InternalError { span: s, .. } => s.clone(), + CompilerDiagnostic::ComplexityUnknown { span: s, .. } => s.clone(), + CompilerDiagnostic::OwnershipViolation { span: s, .. } => s.clone(), + CompilerDiagnostic::VariantCollision { span: s, .. } => s.clone(), + } } pub fn diagnostic_to_message(d: Rc) -> String { match (*d).clone() { - CompilerDiagnostic::UnresolvedImport { module_path: m, importing_module: i, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("unresolved import: module '".to_string(), m.clone()), "' not found (imported by '".to_string()), i.clone()), "')".to_string()), - CompilerDiagnostic::MissingExport { name: n, module_path: m, importing_module: i, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("name '".to_string(), n.clone()), "' not found in module '".to_string()), m.clone()), "' (imported by '".to_string()), i.clone()), "')".to_string()), - CompilerDiagnostic::UnresolvedType { name: n, .. } => v2_rt::concat(v2_rt::concat("unresolved type '".to_string(), n.clone()), "'".to_string()), - CompilerDiagnostic::TypeMismatch { expected: e, got: g, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("type mismatch: expected '".to_string(), e.clone()), "', got '".to_string()), g.clone()), "'".to_string()), - CompilerDiagnostic::ArityMismatch { name: n, expected: e, got: g, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("type ".to_string(), n.clone()), " expects ".to_string()), (e.clone()).to_string()), " type arguments, got ".to_string()), (g.clone()).to_string()), - CompilerDiagnostic::VariantNotFound { variant: v, type_name: t, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("variant '".to_string(), v.clone()), "' not found in type '".to_string()), t.clone()), "'".to_string()), - CompilerDiagnostic::FieldNotFound { field: f, type_name: t, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("field '".to_string(), f.clone()), "' not found in type '".to_string()), t.clone()), "'".to_string()), - CompilerDiagnostic::NonExhaustiveMatch { missing: ms, .. } => v2_rt::concat("non-exhaustive match: missing variant(s) ".to_string(), ms.clone().join(&", ".to_string())), - CompilerDiagnostic::CircularDependency { modules: ms, .. } => v2_rt::concat("circular dependency detected: ".to_string(), ms.clone().join(&" -> ".to_string())), - CompilerDiagnostic::DuplicateModule { name: n, .. } => v2_rt::concat(v2_rt::concat("duplicate module declaration: '".to_string(), n.clone()), "'".to_string()), - CompilerDiagnostic::MissingAnnotation { fn_name: f, what: w, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("function '".to_string(), f.clone()), "' requires ".to_string()), w.clone()), " annotation".to_string()), - CompilerDiagnostic::ParseError { message: m, .. } => m.clone(), - CompilerDiagnostic::InternalError { message: m, .. } => m.clone(), - CompilerDiagnostic::ComplexityUnknown { func_name: f, reason: r, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat("complexity: ".to_string(), f.clone()), ": ".to_string()), r.clone()), - CompilerDiagnostic::OwnershipViolation { binding: b, fn_name: f, consumers: c, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("ownership: binding '".to_string(), b.clone()), "' in '".to_string()), f.clone()), "' has ".to_string()), (c.clone()).to_string()), " consumers".to_string()), - CompilerDiagnostic::VariantCollision { variant: v, enum1: e1, enum2: e2, .. } => v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat("variant '".to_string(), v.clone()), "' appears in both '".to_string()), e1.clone()), "' and '".to_string()), e2.clone()), "'".to_string()), -} + CompilerDiagnostic::UnresolvedImport { + module_path: m, + importing_module: i, + .. + } => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("unresolved import: module '".to_string(), m.clone()), + "' not found (imported by '".to_string(), + ), + i.clone(), + ), + "')".to_string(), + ), + CompilerDiagnostic::MissingExport { + name: n, + module_path: m, + importing_module: i, + .. + } => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("name '".to_string(), n.clone()), + "' not found in module '".to_string(), + ), + m.clone(), + ), + "' (imported by '".to_string(), + ), + i.clone(), + ), + "')".to_string(), + ), + CompilerDiagnostic::UnresolvedType { name: n, .. } => v2_rt::concat( + v2_rt::concat("unresolved type '".to_string(), n.clone()), + "'".to_string(), + ), + CompilerDiagnostic::TypeMismatch { + expected: e, + got: g, + .. + } => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("type mismatch: expected '".to_string(), e.clone()), + "', got '".to_string(), + ), + g.clone(), + ), + "'".to_string(), + ), + CompilerDiagnostic::ArityMismatch { + name: n, + expected: e, + got: g, + .. + } => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("type ".to_string(), n.clone()), + " expects ".to_string(), + ), + (e.clone()).to_string(), + ), + " type arguments, got ".to_string(), + ), + (g.clone()).to_string(), + ), + CompilerDiagnostic::VariantNotFound { + variant: v, + type_name: t, + .. + } => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("variant '".to_string(), v.clone()), + "' not found in type '".to_string(), + ), + t.clone(), + ), + "'".to_string(), + ), + CompilerDiagnostic::FieldNotFound { + field: f, + type_name: t, + .. + } => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("field '".to_string(), f.clone()), + "' not found in type '".to_string(), + ), + t.clone(), + ), + "'".to_string(), + ), + CompilerDiagnostic::NonExhaustiveMatch { missing: ms, .. } => v2_rt::concat( + "non-exhaustive match: missing variant(s) ".to_string(), + ms.clone().join(&", ".to_string()), + ), + CompilerDiagnostic::CircularDependency { modules: ms, .. } => v2_rt::concat( + "circular dependency detected: ".to_string(), + ms.clone().join(&" -> ".to_string()), + ), + CompilerDiagnostic::DuplicateModule { name: n, .. } => v2_rt::concat( + v2_rt::concat("duplicate module declaration: '".to_string(), n.clone()), + "'".to_string(), + ), + CompilerDiagnostic::MissingAnnotation { + fn_name: f, + what: w, + .. + } => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("function '".to_string(), f.clone()), + "' requires ".to_string(), + ), + w.clone(), + ), + " annotation".to_string(), + ), + CompilerDiagnostic::ParseError { message: m, .. } => m.clone(), + CompilerDiagnostic::InternalError { message: m, .. } => m.clone(), + CompilerDiagnostic::ComplexityUnknown { + func_name: f, + reason: r, + .. + } => v2_rt::concat( + v2_rt::concat( + v2_rt::concat("complexity: ".to_string(), f.clone()), + ": ".to_string(), + ), + r.clone(), + ), + CompilerDiagnostic::OwnershipViolation { + binding: b, + fn_name: f, + consumers: c, + .. + } => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("ownership: binding '".to_string(), b.clone()), + "' in '".to_string(), + ), + f.clone(), + ), + "' has ".to_string(), + ), + (c.clone()).to_string(), + ), + " consumers".to_string(), + ), + CompilerDiagnostic::VariantCollision { + variant: v, + enum1: e1, + enum2: e2, + .. + } => v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat("variant '".to_string(), v.clone()), + "' appears in both '".to_string(), + ), + e1.clone(), + ), + "' and '".to_string(), + ), + e2.clone(), + ), + "'".to_string(), + ), + } } pub fn is_error_diagnostic(d: Rc) -> bool { @@ -483,16 +650,16 @@ pub fn is_error_diagnostic(d: Rc) -> bool { pub fn is_interpreter_blocking_diagnostic(d: Rc) -> bool { match (*d).clone() { - CompilerDiagnostic::ComplexityUnknown { .. } => false, - _ => true, -} + CompilerDiagnostic::ComplexityUnknown { .. } => false, + _ => true, + } } pub fn make_error_node(diagnostic: Rc, module_name: String) -> Rc { Rc::new(ErrorNode { - diagnostic: diagnostic, - module_name: module_name, -}) + diagnostic: diagnostic, + module_name: module_name, + }) } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -502,7 +669,8 @@ pub struct DeclaredFuncSig { pub inferred: Option>, pub is_async: bool, pub output_provenance: Rc>>>>, - pub variant_provenance: Rc>>>>>>, + pub variant_provenance: + Rc>>>>>>, } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -542,359 +710,464 @@ pub fn default_ident_span(name: String, span: Rc) -> Option) -> Rc { match n.ident_span.clone() { - Some(s) => s.clone(), - None => n.span.clone(), -} + Some(s) => s.clone(), + None => n.span.clone(), + } } -pub fn make_expr_node(expr_data: Rc, children: Rc>>, inferred: Option>, span: Rc) -> Rc { +pub fn make_expr_node( + expr_data: Rc, + children: Rc>>, + inferred: Option>, + span: Rc, +) -> Rc { Rc::new(Node { - name: "".to_string(), - span: span, - ident_span: None, - children: children, - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: inferred, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: expr_data, - ident: None, -}) -} - -pub fn make_named_expr_node(name: &String, expr_data: Rc, children: Rc>>, inferred: Option>, span: Rc, name_span: Rc) -> Rc { + name: "".to_string(), + span: span, + ident_span: None, + children: children, + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: inferred, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: expr_data, + ident: None, + }) +} + +pub fn make_named_expr_node( + name: &String, + expr_data: Rc, + children: Rc>>, + inferred: Option>, + span: Rc, + name_span: Rc, +) -> Rc { Rc::new(Node { - name: name.clone(), - span: span, - ident_span: default_ident_span(name.clone(), name_span), - children: children, - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: inferred, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: expr_data, - ident: None, -}) -} - -pub fn make_expr_error_node(kind: ExprErrorKind, message: &String, span: &Rc) -> Rc { + name: name.clone(), + span: span, + ident_span: default_ident_span(name.clone(), name_span), + children: children, + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: inferred, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: expr_data, + ident: None, + }) +} + +pub fn make_expr_error_node( + kind: ExprErrorKind, + message: &String, + span: &Rc, +) -> Rc { Rc::new(Node { - name: "".to_string(), - span: span.clone(), - ident_span: None, - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::CompilerError { - message: message.clone(), - span: span.clone(), -})), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::ExprError { - kind: kind, - message: message.clone(), -}), - ident: None, -}) -} - -pub fn make_arg_node(name: Option, value: Rc, span: Rc, name_span: Rc) -> Rc { + name: "".to_string(), + span: span.clone(), + ident_span: None, + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::CompilerError { + message: message.clone(), + span: span.clone(), + })), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::ExprError { + kind: kind, + message: message.clone(), + }), + ident: None, + }) +} + +pub fn make_arg_node( + name: Option, + value: Rc, + span: Rc, + name_span: Rc, +) -> Rc { { let arg_name = match name { - Some(n) => n.clone(), - None => "".to_string(), -}; -Rc::new(Node { - name: arg_name.clone(), - span: span, - ident_span: default_ident_span(arg_name.clone(), name_span), - children: Rc::new(vec![value]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}) -} -} - -pub fn make_arm_node(pattern: Rc, guard: Option>, body: Rc, span: Rc) -> Rc { + Some(n) => n.clone(), + None => "".to_string(), + }; + Rc::new(Node { + name: arg_name.clone(), + span: span, + ident_span: default_ident_span(arg_name.clone(), name_span), + children: Rc::new(vec![value]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }) + } +} + +pub fn make_arm_node( + pattern: Rc, + guard: Option>, + body: Rc, + span: Rc, +) -> Rc { { let children = match guard { - Some(g) => Rc::new(vec![g.clone(), body]), - None => Rc::new(vec![body]), -}; -Rc::new(Node { - name: "".to_string(), - span: span, - ident_span: None, - children: children, - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: Some(pattern), - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}) -} -} - -pub fn make_resource_use_node(name: &String, resource: Rc, span: Rc, name_span: Rc) -> Rc { + Some(g) => Rc::new(vec![g.clone(), body]), + None => Rc::new(vec![body]), + }; + Rc::new(Node { + name: "".to_string(), + span: span, + ident_span: None, + children: children, + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: Some(pattern), + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }) + } +} + +pub fn make_resource_use_node( + name: &String, + resource: Rc, + span: Rc, + name_span: Rc, +) -> Rc { Rc::new(Node { - name: name.clone(), - span: span, - ident_span: default_ident_span(name.clone(), name_span), - children: Rc::new(vec![resource]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}) -} - -pub fn resource_use_name_at(n: Rc, source_indices: Rc>>) -> String { + name: name.clone(), + span: span, + ident_span: default_ident_span(name.clone(), name_span), + children: Rc::new(vec![resource]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }) +} + +pub fn resource_use_name_at( + n: Rc, + source_indices: Rc>>, +) -> String { authored_name_at(source_indices, &n) } pub fn resource_use_resource(n: &Rc) -> Rc { match n.children.clone().first().cloned() { - Some(v) => v.clone(), - None => make_expr_error_node(ExprErrorKind::InternalExprError, &"malformed resource-use: missing resource".to_string(), &n.span.clone()), -} + Some(v) => v.clone(), + None => make_expr_error_node( + ExprErrorKind::InternalExprError, + &"malformed resource-use: missing resource".to_string(), + &n.span.clone(), + ), + } } -pub fn make_field_init_node(name: &String, value: Rc, span: Rc, name_span: Rc) -> Rc { +pub fn make_field_init_node( + name: &String, + value: Rc, + span: Rc, + name_span: Rc, +) -> Rc { Rc::new(Node { - name: name.clone(), - span: span, - ident_span: default_ident_span(name.clone(), name_span), - children: Rc::new(vec![value]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}) -} - -pub fn make_field_binding_node(field_name: &String, binding: Rc, span: Rc, name_span: Rc) -> Rc { + name: name.clone(), + span: span, + ident_span: default_ident_span(name.clone(), name_span), + children: Rc::new(vec![value]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }) +} + +pub fn make_field_binding_node( + field_name: &String, + binding: Rc, + span: Rc, + name_span: Rc, +) -> Rc { Rc::new(Node { - name: field_name.clone(), - span: span, - ident_span: default_ident_span(field_name.clone(), name_span), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: Some(binding), - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}) -} - -pub fn field_binding_name_at(n: Rc, source_indices: Rc>>) -> String { + name: field_name.clone(), + span: span, + ident_span: default_ident_span(field_name.clone(), name_span), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: Some(binding), + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }) +} + +pub fn field_binding_name_at( + n: Rc, + source_indices: Rc>>, +) -> String { authored_name_at(source_indices, &n) } pub fn field_binding_pattern(n: Rc) -> Rc { match n.match_pattern.clone() { - Some(p) => p.clone(), - None => Rc::new(MatchPattern::Wildcard), -} + Some(p) => p.clone(), + None => Rc::new(MatchPattern::Wildcard), + } } pub fn make_text_part_node(text: String, span: Rc) -> Rc { Rc::new(Node { - name: "".to_string(), - span: span, - ident_span: None, - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::ExprLiteral { - value: Rc::new(LiteralValue::LitStr { - value: text, -}), -}), - ident: None, -}) + name: "".to_string(), + span: span, + ident_span: None, + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::ExprLiteral { + value: Rc::new(LiteralValue::LitStr { value: text }), + }), + ident: None, + }) } pub fn make_interp_part_node(expr: Rc, span: Rc) -> Rc { Rc::new(Node { - name: "".to_string(), - span: span, - ident_span: None, - children: Rc::new(vec![expr]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}) -} - -pub fn make_param_node(name: &String, type_expr: Rc, default_value: Option>, span: Rc, name_span: Rc) -> Rc { + name: "".to_string(), + span: span, + ident_span: None, + children: Rc::new(vec![expr]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }) +} + +pub fn make_param_node( + name: &String, + type_expr: Rc, + default_value: Option>, + span: Rc, + name_span: Rc, +) -> Rc { { let children = match default_value { - Some(dv) => Rc::new(vec![type_expr, dv.clone()]), - None => Rc::new(vec![type_expr]), -}; -Rc::new(Node { - name: name.clone(), - span: span, - ident_span: default_ident_span(name.clone(), name_span), - children: children, - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}) -} -} - -pub fn param_node_name_at(n: Rc, source_indices: Rc>>) -> String { + Some(dv) => Rc::new(vec![type_expr, dv.clone()]), + None => Rc::new(vec![type_expr]), + }; + Rc::new(Node { + name: name.clone(), + span: span, + ident_span: default_ident_span(name.clone(), name_span), + children: children, + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }) + } +} + +pub fn param_node_name_at( + n: Rc, + source_indices: Rc>>, +) -> String { authored_name_at(source_indices, &n) } -pub fn generic_param_name_at(n: Rc, source_indices: Rc>>) -> String { +pub fn generic_param_name_at( + n: Rc, + source_indices: Rc>>, +) -> String { authored_name_at(source_indices, &n) } -pub fn authored_name_at(source_indices: Rc>>, node: &Rc) -> String { +pub fn authored_name_at( + source_indices: Rc>>, + node: &Rc, +) -> String { match node.ident_span.clone() { - Some(span) => match v2_rt::map_get(&source_indices, span.file.clone()) { - Some(index) => { - let text = source_text_at(index.clone(), &span); -if (text.clone().as_str() == "".to_string().as_str()) { - "".to_string() - } else { - text.clone() - } -}, - None => if ((v2_rt::string_length(&span.file.clone()) > 8) && (v2_rt::substring(&span.file.clone(), 0, 8).as_str() == " "".to_string(), -} + Some(span) => match v2_rt::map_get(&source_indices, span.file.clone()) { + Some(index) => { + let text = source_text_at(index.clone(), &span); + if (text.clone().as_str() == "".to_string().as_str()) { + "".to_string() + } else { + text.clone() + } + } + None => { + if ((v2_rt::string_length(&span.file.clone()) > 8) + && (v2_rt::substring(&span.file.clone(), 0, 8).as_str() + == " "".to_string(), + } } -pub fn find_child_named(n: Rc, name: String, source_indices: Rc>>) -> Option> { - match Rc::new({ let mut __result = Vec::new(); for c in n.children.clone().iter().cloned() { if (authored_name_at(source_indices.clone(), &c).as_str() == name.clone().as_str()) { __result.push(c); } } __result }).first().cloned() { - Some(ch) => Some(ch.clone()), - None => None, -} +pub fn find_child_named( + n: Rc, + name: String, + source_indices: Rc>>, +) -> Option> { + match Rc::new({ + let mut __result = Vec::new(); + for c in n.children.clone().iter().cloned() { + if (authored_name_at(source_indices.clone(), &c).as_str() == name.clone().as_str()) { + __result.push(c); + } + } + __result + }) + .first() + .cloned() + { + Some(ch) => Some(ch.clone()), + None => None, + } } -pub fn has_child_named(n: Rc, name: String, source_indices: Rc>>) -> bool { - { let mut __found = false; for c in n.children.clone().iter().cloned() { if (authored_name_at(source_indices.clone(), &c).as_str() == name.clone().as_str()) { __found = true; break; } } __found } +pub fn has_child_named( + n: Rc, + name: String, + source_indices: Rc>>, +) -> bool { + { + let mut __found = false; + for c in n.children.clone().iter().cloned() { + if (authored_name_at(source_indices.clone(), &c).as_str() == name.clone().as_str()) { + __found = true; + break; + } + } + __found + } } pub fn param_node_type_expr(n: &Rc) -> Rc { match n.children.clone().first().cloned() { - Some(v) => v.clone(), - None => make_expr_error_node(ExprErrorKind::InternalExprError, &"malformed param: missing type_expr".to_string(), &n.span.clone()), -} + Some(v) => v.clone(), + None => make_expr_error_node( + ExprErrorKind::InternalExprError, + &"malformed param: missing type_expr".to_string(), + &n.span.clone(), + ), + } } pub fn param_node_default_value(n: &Rc) -> Option> { @@ -909,67 +1182,82 @@ pub fn param_node_span(n: Rc) -> Rc { n.span.clone() } -pub fn make_field_node(name: &String, type_expr: Rc, cardinality: Cardinality, default_value: Option>, from_key: Option, span: Rc, name_span: Rc) -> Rc { +pub fn make_field_node( + name: &String, + type_expr: Rc, + cardinality: Cardinality, + default_value: Option>, + from_key: Option, + span: Rc, + name_span: Rc, +) -> Rc { { let children = match default_value { - Some(dv) => Rc::new(vec![type_expr, dv.clone()]), - None => Rc::new(vec![type_expr]), -}; -let props = match from_key { - Some(fk) => Rc::new(vec![Rc::new(Node { - name: fk.clone(), - span: make_span(0, 0), - ident_span: default_ident_span(fk.clone(), make_span(0, 0)), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -})]), - None => Rc::new(vec![]), -}; -Rc::new(Node { - name: name.clone(), - span: span, - ident_span: default_ident_span(name.clone(), name_span), - children: children, - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: cardinality, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: props, - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}) -} -} - -pub fn field_node_name_at(n: Rc, source_indices: Rc>>) -> String { + Some(dv) => Rc::new(vec![type_expr, dv.clone()]), + None => Rc::new(vec![type_expr]), + }; + let props = match from_key { + Some(fk) => Rc::new(vec![Rc::new(Node { + name: fk.clone(), + span: make_span(0, 0), + ident_span: default_ident_span(fk.clone(), make_span(0, 0)), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + })]), + None => Rc::new(vec![]), + }; + Rc::new(Node { + name: name.clone(), + span: span, + ident_span: default_ident_span(name.clone(), name_span), + children: children, + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: cardinality, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: props, + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }) + } +} + +pub fn field_node_name_at( + n: Rc, + source_indices: Rc>>, +) -> String { authored_name_at(source_indices, &n) } pub fn field_node_type_expr(n: &Rc) -> Rc { match n.children.clone().first().cloned() { - Some(v) => v.clone(), - None => make_expr_error_node(ExprErrorKind::InternalExprError, &"malformed field: missing type_expr".to_string(), &n.span.clone()), -} + Some(v) => v.clone(), + None => make_expr_error_node( + ExprErrorKind::InternalExprError, + &"malformed field: missing type_expr".to_string(), + &n.span.clone(), + ), + } } pub fn field_node_cardinality(n: Rc) -> Cardinality { @@ -984,41 +1272,52 @@ pub fn field_node_default_value(n: &Rc) -> Option> { } } -pub fn field_node_from_key(n: Rc, source_indices: Rc>>) -> Option { +pub fn field_node_from_key( + n: Rc, + source_indices: Rc>>, +) -> Option { match n.properties.clone().first().cloned() { - Some(p) => Some(authored_name_at(source_indices, &p)), - None => None, -} + Some(p) => Some(authored_name_at(source_indices, &p)), + None => None, + } } pub fn field_node_span(n: Rc) -> Rc { n.span.clone() } -pub fn make_variant_node(name: &String, fields: Rc>>, span: Rc, name_span: Rc) -> Rc { +pub fn make_variant_node( + name: &String, + fields: Rc>>, + span: Rc, + name_span: Rc, +) -> Rc { Rc::new(Node { - name: name.clone(), - span: span, - ident_span: default_ident_span(name.clone(), name_span), - children: fields, - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}) -} - -pub fn variant_node_name_at(n: Rc, source_indices: Rc>>) -> String { + name: name.clone(), + span: span, + ident_span: default_ident_span(name.clone(), name_span), + children: fields, + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }) +} + +pub fn variant_node_name_at( + n: Rc, + source_indices: Rc>>, +) -> String { authored_name_at(source_indices, &n) } @@ -1059,7 +1358,49 @@ pub fn wrapper_child_roles() -> Rc>>>> { } pub fn is_child_accessor_in_model(name: String) -> bool { - ({ let mut __found = false; for roles in Rc::new(v2_rt::map_values(&expr_child_roles())).iter().cloned() { if { let mut __found = false; for r in roles.clone().iter().cloned() { if (r.accessor.clone().as_str() == name.clone().as_str()) { __found = true; break; } } __found } { __found = true; break; } } __found } || { let mut __found = false; for roles in Rc::new(v2_rt::map_values(&wrapper_child_roles())).iter().cloned() { if { let mut __found = false; for r in roles.clone().iter().cloned() { if (r.accessor.clone().as_str() == name.clone().as_str()) { __found = true; break; } } __found } { __found = true; break; } } __found }) + ({ + let mut __found = false; + for roles in Rc::new(v2_rt::map_values(&expr_child_roles())) + .iter() + .cloned() + { + if { + let mut __found = false; + for r in roles.clone().iter().cloned() { + if (r.accessor.clone().as_str() == name.clone().as_str()) { + __found = true; + break; + } + } + __found + } { + __found = true; + break; + } + } + __found + } || { + let mut __found = false; + for roles in Rc::new(v2_rt::map_values(&wrapper_child_roles())) + .iter() + .cloned() + { + if { + let mut __found = false; + for r in roles.clone().iter().cloned() { + if (r.accessor.clone().as_str() == name.clone().as_str()) { + __found = true; + break; + } + } + __found + } { + __found = true; + break; + } + } + __found + }) } pub fn child_roles_for_variant(variant_name: String) -> Option>>> { @@ -1091,17 +1432,17 @@ pub fn node_field_roles() -> Rc> { pub fn is_children_list_field(field_name: String) -> bool { match v2_rt::lookup(&node_field_roles(), field_name) { - Some(NodeFieldRole::ChildrenListField) => true, - _ => false, -} + Some(NodeFieldRole::ChildrenListField) => true, + _ => false, + } } pub fn is_sub_value_field(field_name: String) -> bool { match v2_rt::lookup(&node_field_roles(), field_name) { - Some(NodeFieldRole::SubValueField) => true, - Some(NodeFieldRole::ChildrenListField) => true, - _ => false, -} + Some(NodeFieldRole::SubValueField) => true, + Some(NodeFieldRole::ChildrenListField) => true, + _ => false, + } } #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] @@ -1109,91 +1450,111 @@ pub fn is_sub_value_field(field_name: String) -> bool { pub enum FunctionSizeEffect { TreeSizePreserving, TreeSizeReducing, - PropertyContraction { - domain_size: i64, - }, + PropertyContraction { domain_size: i64 }, } impl FunctionSizeEffect { pub fn domain_size(&self) -> i64 { match self { FunctionSizeEffect::TreeSizePreserving => panic!("no domain_size on unit variant"), FunctionSizeEffect::TreeSizeReducing => panic!("no domain_size on unit variant"), - FunctionSizeEffect::PropertyContraction { domain_size: __val, .. } => __val.clone(), + FunctionSizeEffect::PropertyContraction { + domain_size: __val, .. + } => __val.clone(), } } } pub fn function_size_effects() -> Rc>> { thread_local! { - static CACHED: Rc>> = { - let mut __m = HashMap::new(); - __m.insert("with_required_cardinality".to_string(), Rc::new(FunctionSizeEffect::PropertyContraction { - domain_size: 2, -})); - __m.insert("resolved_type".to_string(), Rc::new(FunctionSizeEffect::TreeSizeReducing)); - __m.insert("param_node_type_expr".to_string(), Rc::new(FunctionSizeEffect::TreeSizeReducing)); - __m.insert("field_binding_pattern".to_string(), Rc::new(FunctionSizeEffect::TreeSizeReducing)); - __m.insert("wrapper_inner_arg".to_string(), Rc::new(FunctionSizeEffect::TreeSizeReducing)); - __m.insert("extractor_inner_arg".to_string(), Rc::new(FunctionSizeEffect::TreeSizeReducing)); - __m.insert("child_type_node".to_string(), Rc::new(FunctionSizeEffect::TreeSizeReducing)); - Rc::new(__m) - }; - } + static CACHED: Rc>> = { + let mut __m = HashMap::new(); + __m.insert("with_required_cardinality".to_string(), Rc::new(FunctionSizeEffect::PropertyContraction { + domain_size: 2, + })); + __m.insert("resolved_type".to_string(), Rc::new(FunctionSizeEffect::TreeSizeReducing)); + __m.insert("param_node_type_expr".to_string(), Rc::new(FunctionSizeEffect::TreeSizeReducing)); + __m.insert("field_binding_pattern".to_string(), Rc::new(FunctionSizeEffect::TreeSizeReducing)); + __m.insert("wrapper_inner_arg".to_string(), Rc::new(FunctionSizeEffect::TreeSizeReducing)); + __m.insert("extractor_inner_arg".to_string(), Rc::new(FunctionSizeEffect::TreeSizeReducing)); + __m.insert("child_type_node".to_string(), Rc::new(FunctionSizeEffect::TreeSizeReducing)); + Rc::new(__m) + }; + } CACHED.with(|c| c.clone()) } pub fn is_tree_size_preserving(func_name: String) -> bool { - match v2_rt::lookup(&function_size_effects(), func_name).as_deref().cloned() { - Some(FunctionSizeEffect::TreeSizePreserving) => true, - Some(FunctionSizeEffect::PropertyContraction { .. }) => true, - _ => false, -} + match v2_rt::lookup(&function_size_effects(), func_name) + .as_deref() + .cloned() + { + Some(FunctionSizeEffect::TreeSizePreserving) => true, + Some(FunctionSizeEffect::PropertyContraction { .. }) => true, + _ => false, + } } pub fn is_tree_size_reducing(func_name: String) -> bool { - match v2_rt::lookup(&function_size_effects(), func_name).as_deref().cloned() { - Some(FunctionSizeEffect::TreeSizeReducing) => true, - _ => false, -} + match v2_rt::lookup(&function_size_effects(), func_name) + .as_deref() + .cloned() + { + Some(FunctionSizeEffect::TreeSizeReducing) => true, + _ => false, + } } pub fn is_property_contraction(func_name: String) -> bool { - match v2_rt::lookup(&function_size_effects(), func_name).as_deref().cloned() { - Some(FunctionSizeEffect::PropertyContraction { .. }) => true, - _ => false, -} + match v2_rt::lookup(&function_size_effects(), func_name) + .as_deref() + .cloned() + { + Some(FunctionSizeEffect::PropertyContraction { .. }) => true, + _ => false, + } } pub fn expr_child_at(texpr: &Rc, index: i64, role: String) -> Rc { match texpr.children.clone().get(index as usize).cloned() { - Some(v) => v.clone(), - None => make_expr_error_node(ExprErrorKind::InternalExprError, &v2_rt::concat("malformed node: missing ".to_string(), role), &texpr.span.clone()), -} + Some(v) => v.clone(), + None => make_expr_error_node( + ExprErrorKind::InternalExprError, + &v2_rt::concat("malformed node: missing ".to_string(), role), + &texpr.span.clone(), + ), + } } -pub fn arg_name_at(n: Rc, source_indices: Rc>>) -> Option { +pub fn arg_name_at( + n: Rc, + source_indices: Rc>>, +) -> Option { { let name = authored_name_at(source_indices, &n); -if (name.clone().as_str() == "".to_string().as_str()) { + if (name.clone().as_str() == "".to_string().as_str()) { None } else { Some(name.clone()) } -} + } } pub fn arg_value(n: &Rc) -> Rc { match n.children.clone().first().cloned() { - Some(v) => v.clone(), - None => make_expr_error_node(ExprErrorKind::InternalExprError, &"malformed arg: missing value".to_string(), &n.span.clone()), -} + Some(v) => v.clone(), + None => make_expr_error_node( + ExprErrorKind::InternalExprError, + &"malformed arg: missing value".to_string(), + &n.span.clone(), + ), + } } pub fn arm_pattern(n: Rc) -> Rc { match n.match_pattern.clone() { - Some(p) => p.clone(), - None => Rc::new(MatchPattern::Wildcard), -} + Some(p) => p.clone(), + None => Rc::new(MatchPattern::Wildcard), + } } pub fn arm_guard(n: &Rc) -> Option> { @@ -1206,20 +1567,31 @@ pub fn arm_guard(n: &Rc) -> Option> { pub fn arm_body(n: &Rc) -> Rc { match n.children.clone().last().cloned() { - Some(v) => v.clone(), - None => make_expr_error_node(ExprErrorKind::InternalExprError, &"malformed arm: missing body".to_string(), &n.span.clone()), -} + Some(v) => v.clone(), + None => make_expr_error_node( + ExprErrorKind::InternalExprError, + &"malformed arm: missing body".to_string(), + &n.span.clone(), + ), + } } -pub fn field_init_node_name_at(n: Rc, source_indices: Rc>>) -> String { +pub fn field_init_node_name_at( + n: Rc, + source_indices: Rc>>, +) -> String { authored_name_at(source_indices, &n) } pub fn field_init_node_value(n: &Rc) -> Rc { match n.children.clone().first().cloned() { - Some(v) => v.clone(), - None => make_expr_error_node(ExprErrorKind::InternalExprError, &"malformed field-init: missing value".to_string(), &n.span.clone()), -} + Some(v) => v.clone(), + None => make_expr_error_node( + ExprErrorKind::InternalExprError, + &"malformed field-init: missing value".to_string(), + &n.span.clone(), + ), + } } pub fn if_condition(texpr: Rc) -> Rc { @@ -1239,7 +1611,15 @@ pub fn match_scrutinee(texpr: Rc) -> Rc { } pub fn match_arm_nodes(texpr: Rc) -> Rc>> { - Rc::new(texpr.children.clone().iter().cloned().skip(1 as usize).collect::>()) + Rc::new( + texpr + .children + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ) } pub fn binop_left(texpr: Rc) -> Rc { @@ -1254,7 +1634,10 @@ pub fn unaryop_operand(texpr: Rc) -> Rc { expr_child_at(&texpr, 0, "unaryop operand".to_string()) } -pub fn expr_var_name_at(texpr: Rc, source_indices: Rc>>) -> String { +pub fn expr_var_name_at( + texpr: Rc, + source_indices: Rc>>, +) -> String { authored_name_at(source_indices, &texpr) } @@ -1262,26 +1645,35 @@ pub fn field_access_base(texpr: Rc) -> Rc { expr_child_at(&texpr, 0, "field access base".to_string()) } -pub fn field_access_field_at(texpr: Rc, source_indices: Rc>>) -> String { +pub fn field_access_field_at( + texpr: Rc, + source_indices: Rc>>, +) -> String { authored_name_at(source_indices, &texpr) } pub fn expr_field_access_summary(texpr: Rc) -> Option> { match (*texpr.expr_data.clone()).clone() { - ExprData::ExprFieldAccess { summary: s, .. } => s.clone(), - _ => None, -} + ExprData::ExprFieldAccess { summary: s, .. } => s.clone(), + _ => None, + } } -pub fn expr_call_func_at(texpr: Rc, source_indices: Rc>>) -> String { +pub fn expr_call_func_at( + texpr: Rc, + source_indices: Rc>>, +) -> String { authored_name_at(source_indices, &texpr) } pub fn expr_call_descent_evidence(texpr: Rc) -> Option>>> { match (*texpr.expr_data.clone()).clone() { - ExprData::ExprCall { descent_evidence: de, .. } => de.clone(), - _ => None, -} + ExprData::ExprCall { + descent_evidence: de, + .. + } => de.clone(), + _ => None, + } } pub fn method_receiver(texpr: Rc) -> Rc { @@ -1289,26 +1681,60 @@ pub fn method_receiver(texpr: Rc) -> Rc { } pub fn method_arg_nodes(texpr: Rc) -> Rc>> { - Rc::new(texpr.children.clone().iter().cloned().skip(1 as usize).collect::>()) -} - -pub fn expr_method_name_at(texpr: Rc, source_indices: Rc>>) -> String { + Rc::new( + texpr + .children + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ) +} + +pub fn expr_method_name_at( + texpr: Rc, + source_indices: Rc>>, +) -> String { authored_name_at(source_indices, &texpr) } pub fn expr_method_call_semantics(texpr: Rc) -> Option> { match (*texpr.expr_data.clone()).clone() { - ExprData::ExprMethodCall { method_semantics: ms, .. } => ms.clone(), - _ => None, -} + ExprData::ExprMethodCall { + method_semantics: ms, + .. + } => ms.clone(), + _ => None, + } } pub fn lambda_body(texpr: Rc) -> Rc { expr_child_at(&texpr, 0, "lambda body".to_string()) } -pub fn lambda_param_names_at(texpr: Rc, source_indices: Rc>>) -> Rc> { - Rc::new({ let mut __result = Vec::new(); for n in Rc::new(texpr.children.clone().iter().cloned().skip(1 as usize).collect::>()).iter().cloned() { __result.push(authored_name_at(source_indices.clone(), &n)); } __result }) +pub fn lambda_param_names_at( + texpr: Rc, + source_indices: Rc>>, +) -> Rc> { + Rc::new({ + let mut __result = Vec::new(); + for n in Rc::new( + texpr + .children + .clone() + .iter() + .cloned() + .skip(1 as usize) + .collect::>(), + ) + .iter() + .cloned() + { + __result.push(authored_name_at(source_indices.clone(), &n)); + } + __result + }) } pub fn let_value(texpr: Rc) -> Rc { @@ -1319,7 +1745,10 @@ pub fn let_body(texpr: Rc) -> Option> { texpr.children.clone().get(1 as usize).cloned() } -pub fn let_binding_name_at(texpr: Rc, source_indices: Rc>>) -> String { +pub fn let_binding_name_at( + texpr: Rc, + source_indices: Rc>>, +) -> String { authored_name_at(source_indices, &texpr) } @@ -1339,7 +1768,10 @@ pub fn foreach_body(texpr: Rc) -> Rc { expr_child_at(&texpr, 1, "foreach body".to_string()) } -pub fn foreach_variable_at(texpr: Rc, source_indices: Rc>>) -> String { +pub fn foreach_variable_at( + texpr: Rc, + source_indices: Rc>>, +) -> String { authored_name_at(source_indices, &texpr) } @@ -1371,15 +1803,18 @@ pub fn block_stmts(texpr: Rc) -> Rc>> { texpr.children.clone() } -pub fn record_lit_type_name_at(texpr: Rc, source_indices: Rc>>) -> Option { +pub fn record_lit_type_name_at( + texpr: Rc, + source_indices: Rc>>, +) -> Option { { let name = authored_name_at(source_indices, &texpr); -if (name.clone().as_str() == "".to_string().as_str()) { + if (name.clone().as_str() == "".to_string().as_str()) { None } else { Some(name.clone()) } -} + } } pub fn transport_url_key() -> String { @@ -1490,138 +1925,245 @@ pub fn transport_headers_key() -> String { CACHED.with(|c| c.clone()) } -pub fn make_transport_node(properties: Rc>>, children: Rc>>, body: Option>, span: Rc) -> Rc { +pub fn make_transport_node( + properties: Rc>>, + children: Rc>>, + body: Option>, + span: Rc, +) -> Rc { Rc::new(Node { - name: "".to_string(), - span: span, - ident_span: None, - children: children, - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: body, - transport: None, - properties: properties, - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}) + name: "".to_string(), + span: span, + ident_span: None, + children: children, + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: body, + transport: None, + properties: properties, + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }) } pub fn local_transport_node(span: Rc) -> Rc { make_transport_node(Rc::new(vec![]), Rc::new(vec![]), None, span) } -pub fn rest_transport_node(base_url: Rc, auth_props: Rc>>, headers: Rc>>, method: Option>, path: Option>, query: Option>, request_body: Option>, response_format: Option>, span: Rc) -> Rc { +pub fn rest_transport_node( + base_url: Rc, + auth_props: Rc>>, + headers: Rc>>, + method: Option>, + path: Option>, + query: Option>, + request_body: Option>, + response_format: Option>, + span: Rc, +) -> Rc { { let zero_span = make_span(0, 0); -let url_field = make_field_init_node(&transport_url_key(), base_url, zero_span.clone(), zero_span.clone()); -let method_props = match method { - Some(m) => Rc::new(vec![make_field_init_node(&transport_method_key(), m.clone(), zero_span.clone(), zero_span.clone())]), - None => Rc::new(vec![]), -}; -let path_props = match path { - Some(p) => Rc::new(vec![make_field_init_node(&transport_path_template_key(), p.clone(), zero_span.clone(), zero_span.clone())]), - None => Rc::new(vec![]), -}; -let query_props = match query { - Some(q) => Rc::new(vec![make_field_init_node(&transport_query_key(), q.clone(), zero_span.clone(), zero_span.clone())]), - None => Rc::new(vec![]), -}; -let body_props = match request_body { - Some(b) => Rc::new(vec![make_field_init_node(&transport_body_key(), b.clone(), zero_span.clone(), zero_span.clone())]), - None => Rc::new(vec![]), -}; -let rf_props = match response_format { - Some(rf) => Rc::new(vec![make_field_init_node(&transport_response_format_key(), rf.clone(), zero_span.clone(), zero_span.clone())]), - None => Rc::new(vec![]), -}; -let props = v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(Rc::new(vec![url_field]), method_props), path_props), query_props), body_props), rf_props), auth_props), headers); -make_transport_node(props, Rc::new(vec![]), None, span) -} + let url_field = make_field_init_node( + &transport_url_key(), + base_url, + zero_span.clone(), + zero_span.clone(), + ); + let method_props = match method { + Some(m) => Rc::new(vec![make_field_init_node( + &transport_method_key(), + m.clone(), + zero_span.clone(), + zero_span.clone(), + )]), + None => Rc::new(vec![]), + }; + let path_props = match path { + Some(p) => Rc::new(vec![make_field_init_node( + &transport_path_template_key(), + p.clone(), + zero_span.clone(), + zero_span.clone(), + )]), + None => Rc::new(vec![]), + }; + let query_props = match query { + Some(q) => Rc::new(vec![make_field_init_node( + &transport_query_key(), + q.clone(), + zero_span.clone(), + zero_span.clone(), + )]), + None => Rc::new(vec![]), + }; + let body_props = match request_body { + Some(b) => Rc::new(vec![make_field_init_node( + &transport_body_key(), + b.clone(), + zero_span.clone(), + zero_span.clone(), + )]), + None => Rc::new(vec![]), + }; + let rf_props = match response_format { + Some(rf) => Rc::new(vec![make_field_init_node( + &transport_response_format_key(), + rf.clone(), + zero_span.clone(), + zero_span.clone(), + )]), + None => Rc::new(vec![]), + }; + let props = v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(Rc::new(vec![url_field]), method_props), + path_props, + ), + query_props, + ), + body_props, + ), + rf_props, + ), + auth_props, + ), + headers, + ); + make_transport_node(props, Rc::new(vec![]), None, span) + } } -pub fn shell_transport_node(argv: Rc>>, env: Rc>>, stdin: Option>, span: &Rc) -> Rc { +pub fn shell_transport_node( + argv: Rc>>, + env: Rc>>, + stdin: Option>, + span: &Rc, +) -> Rc { { let shell_marker = Rc::new(Node { - name: "".to_string(), - span: span.clone(), - ident_span: None, - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}); -let zero_span = make_span(0, 0); -let stdin_props = match stdin { - Some(s) => Rc::new(vec![make_field_init_node(&transport_stdin_key(), s.clone(), zero_span.clone(), zero_span.clone())]), - None => Rc::new(vec![]), -}; -let all_props = v2_rt::concat(env, stdin_props); -Rc::new(Node { - name: "".to_string(), - span: span.clone(), - ident_span: None, - children: argv, - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: Some(shell_marker), - transport: None, - properties: all_props, - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}) -} + name: "".to_string(), + span: span.clone(), + ident_span: None, + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }); + let zero_span = make_span(0, 0); + let stdin_props = match stdin { + Some(s) => Rc::new(vec![make_field_init_node( + &transport_stdin_key(), + s.clone(), + zero_span.clone(), + zero_span.clone(), + )]), + None => Rc::new(vec![]), + }; + let all_props = v2_rt::concat(env, stdin_props); + Rc::new(Node { + name: "".to_string(), + span: span.clone(), + ident_span: None, + children: argv, + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: Some(shell_marker), + transport: None, + properties: all_props, + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }) + } } pub fn file_transport_node(base_path: Rc, span: Rc) -> Rc { { - let path_field = make_field_init_node(&transport_path_key(), base_path, make_span(0, 0), make_span(0, 0)); -make_transport_node(Rc::new(vec![path_field]), Rc::new(vec![]), None, span) -} + let path_field = make_field_init_node( + &transport_path_key(), + base_path, + make_span(0, 0), + make_span(0, 0), + ); + make_transport_node(Rc::new(vec![path_field]), Rc::new(vec![]), None, span) + } } -pub fn find_property(props: Rc>>, prop_name: String, source_indices: Rc>>) -> Option> { - match Rc::new({ let mut __result = Vec::new(); for p in props.iter().cloned() { if (field_init_node_name_at(p.clone(), source_indices.clone()).as_str() == prop_name.clone().as_str()) { __result.push(p); } } __result }).first().cloned() { - Some(fi) => Some(field_init_node_value(&fi)), - None => None, -} +pub fn find_property( + props: Rc>>, + prop_name: String, + source_indices: Rc>>, +) -> Option> { + match Rc::new({ + let mut __result = Vec::new(); + for p in props.iter().cloned() { + if (field_init_node_name_at(p.clone(), source_indices.clone()).as_str() + == prop_name.clone().as_str()) + { + __result.push(p); + } + } + __result + }) + .first() + .cloned() + { + Some(fi) => Some(field_init_node_value(&fi)), + None => None, + } } -pub fn find_property_string(props: Rc>>, prop_name: String, source_indices: Rc>>) -> Option { +pub fn find_property_string( + props: Rc>>, + prop_name: String, + source_indices: Rc>>, +) -> Option { match find_property(props, prop_name, source_indices) { - Some(n) => match (*n.expr_data.clone()).clone() { - ExprData::ExprLiteral { ref value, .. } => { let LiteralValue::LitStr { value: s, .. } = value.as_ref() else { unreachable!() }; Some(s.clone()) }, - _ => None, -}, - None => None, -} + Some(n) => match (*n.expr_data.clone()).clone() { + ExprData::ExprLiteral { ref value, .. } => { + let LiteralValue::LitStr { value: s, .. } = value.as_ref() else { + unreachable!() + }; + Some(s.clone()) + } + _ => None, + }, + None => None, + } } -pub fn transport_base_path(t: Rc, source_indices: Rc>>) -> Option> { +pub fn transport_base_path( + t: Rc, + source_indices: Rc>>, +) -> Option> { find_property(t.properties.clone(), transport_path_key(), source_indices) } @@ -1629,7 +2171,10 @@ pub fn transport_has_argv(t: Rc) -> bool { ((t.children.clone().len() as i64) > 0) } -pub fn is_rest_transport(t: Rc, source_indices: Rc>>) -> bool { +pub fn is_rest_transport( + t: Rc, + source_indices: Rc>>, +) -> bool { (transport_base_url(t, source_indices) != None) } @@ -1637,18 +2182,28 @@ pub fn is_shell_transport(t: Rc) -> bool { (t.body.clone() != None) } -pub fn is_file_transport(t: Rc, source_indices: Rc>>) -> bool { +pub fn is_file_transport( + t: Rc, + source_indices: Rc>>, +) -> bool { (transport_base_path(t, source_indices) != None) } -pub fn is_local_transport(t: &Rc, source_indices: &Rc>>) -> bool { - ((!is_rest_transport(t.clone(), source_indices.clone()) && !is_shell_transport(t.clone())) && !is_file_transport(t.clone(), source_indices.clone())) +pub fn is_local_transport( + t: &Rc, + source_indices: &Rc>>, +) -> bool { + ((!is_rest_transport(t.clone(), source_indices.clone()) && !is_shell_transport(t.clone())) + && !is_file_transport(t.clone(), source_indices.clone())) } -pub fn field_init_operation_modifier(field_init: Rc, source_indices: Rc>>) -> Option { +pub fn field_init_operation_modifier( + field_init: Rc, + source_indices: Rc>>, +) -> Option { { let fi_name = field_init_node_name_at(field_init, source_indices); -if (fi_name.clone().as_str() == "idempotent".to_string().as_str()) { + if (fi_name.clone().as_str() == "idempotent".to_string().as_str()) { Some(OperationModifier::Idempotent) } else { if (fi_name.clone().as_str() == "readonly".to_string().as_str()) { @@ -1661,304 +2216,700 @@ if (fi_name.clone().as_str() == "idempotent".to_string().as_str()) { } } } -} + } } pub fn operation_modifier_name(modifier: OperationModifier) -> String { match modifier { - OperationModifier::Idempotent => "idempotent".to_string(), - OperationModifier::Readonly => "readonly".to_string(), - OperationModifier::Hermetic => "hermetic".to_string(), -} + OperationModifier::Idempotent => "idempotent".to_string(), + OperationModifier::Readonly => "readonly".to_string(), + OperationModifier::Hermetic => "hermetic".to_string(), + } } -pub fn transport_base_url(t: Rc, source_indices: Rc>>) -> Option> { +pub fn transport_base_url( + t: Rc, + source_indices: Rc>>, +) -> Option> { find_property(t.properties.clone(), transport_url_key(), source_indices) } -pub fn transport_auth_token(t: Rc, source_indices: Rc>>) -> Option> { - find_property(t.properties.clone(), transport_auth_token_key(), source_indices) -} - -pub fn transport_auth_header_name(t: Rc, source_indices: Rc>>) -> Option { - find_property_string(t.properties.clone(), transport_auth_header_key(), source_indices) -} - -pub fn transport_has_auth(t: Rc, source_indices: Rc>>) -> bool { - match find_property(t.properties.clone(), transport_auth_token_key(), source_indices) { - Some(_) => true, - None => false, -} +pub fn transport_auth_token( + t: Rc, + source_indices: Rc>>, +) -> Option> { + find_property( + t.properties.clone(), + transport_auth_token_key(), + source_indices, + ) +} + +pub fn transport_auth_header_name( + t: Rc, + source_indices: Rc>>, +) -> Option { + find_property_string( + t.properties.clone(), + transport_auth_header_key(), + source_indices, + ) +} + +pub fn transport_has_auth( + t: Rc, + source_indices: Rc>>, +) -> bool { + match find_property( + t.properties.clone(), + transport_auth_token_key(), + source_indices, + ) { + Some(_) => true, + None => false, + } } -pub fn transport_method(t: Rc, source_indices: Rc>>) -> Option> { +pub fn transport_method( + t: Rc, + source_indices: Rc>>, +) -> Option> { find_property(t.properties.clone(), transport_method_key(), source_indices) } -pub fn transport_path_template(t: Rc, source_indices: Rc>>) -> Option> { - find_property(t.properties.clone(), transport_path_template_key(), source_indices) +pub fn transport_path_template( + t: Rc, + source_indices: Rc>>, +) -> Option> { + find_property( + t.properties.clone(), + transport_path_template_key(), + source_indices, + ) } -pub fn transport_query(t: Rc, source_indices: Rc>>) -> Option> { +pub fn transport_query( + t: Rc, + source_indices: Rc>>, +) -> Option> { find_property(t.properties.clone(), transport_query_key(), source_indices) } -pub fn transport_request_body(t: Rc, source_indices: Rc>>) -> Option> { +pub fn transport_request_body( + t: Rc, + source_indices: Rc>>, +) -> Option> { find_property(t.properties.clone(), transport_body_key(), source_indices) } -pub fn transport_stdin(t: Rc, source_indices: Rc>>) -> Option> { +pub fn transport_stdin( + t: Rc, + source_indices: Rc>>, +) -> Option> { find_property(t.properties.clone(), transport_stdin_key(), source_indices) } -pub fn transport_response_format(t: Rc, source_indices: Rc>>) -> Option> { - find_property(t.properties.clone(), transport_response_format_key(), source_indices) +pub fn transport_response_format( + t: Rc, + source_indices: Rc>>, +) -> Option> { + find_property( + t.properties.clone(), + transport_response_format_key(), + source_indices, + ) } pub fn is_config_reserved_key(name: &String) -> bool { - ((((((((((((name.clone().as_str() == transport_url_key().as_str()) || (name.clone().as_str() == transport_path_key().as_str())) || (name.clone().as_str() == transport_auth_scheme_key().as_str())) || (name.clone().as_str() == transport_auth_header_key().as_str())) || (name.clone().as_str() == transport_auth_token_key().as_str())) || (name.clone().as_str() == transport_method_key().as_str())) || (name.clone().as_str() == transport_path_template_key().as_str())) || (name.clone().as_str() == transport_query_key().as_str())) || (name.clone().as_str() == transport_body_key().as_str())) || (name.clone().as_str() == transport_stdin_key().as_str())) || (name.clone().as_str() == transport_response_format_key().as_str())) || (name.clone().as_str() == transport_headers_key().as_str())) -} - -pub fn transport_headers(t: Rc, source_indices: Rc>>) -> Rc>> { - Rc::new({ let mut __result = Vec::new(); for p in t.properties.clone().iter().cloned() { if !is_config_reserved_key(&field_init_node_name_at(p.clone(), source_indices.clone())) { __result.push(p); } } __result }) + ((((((((((((name.clone().as_str() == transport_url_key().as_str()) + || (name.clone().as_str() == transport_path_key().as_str())) + || (name.clone().as_str() == transport_auth_scheme_key().as_str())) + || (name.clone().as_str() == transport_auth_header_key().as_str())) + || (name.clone().as_str() == transport_auth_token_key().as_str())) + || (name.clone().as_str() == transport_method_key().as_str())) + || (name.clone().as_str() == transport_path_template_key().as_str())) + || (name.clone().as_str() == transport_query_key().as_str())) + || (name.clone().as_str() == transport_body_key().as_str())) + || (name.clone().as_str() == transport_stdin_key().as_str())) + || (name.clone().as_str() == transport_response_format_key().as_str())) + || (name.clone().as_str() == transport_headers_key().as_str())) +} + +pub fn transport_headers( + t: Rc, + source_indices: Rc>>, +) -> Rc>> { + Rc::new({ + let mut __result = Vec::new(); + for p in t.properties.clone().iter().cloned() { + if !is_config_reserved_key(&field_init_node_name_at(p.clone(), source_indices.clone())) + { + __result.push(p); + } + } + __result + }) } -pub fn transport_env(t: Rc, source_indices: Rc>>) -> Rc>> { - Rc::new({ let mut __result = Vec::new(); for p in t.properties.clone().iter().cloned() { if !is_config_reserved_key(&field_init_node_name_at(p.clone(), source_indices.clone())) { __result.push(p); } } __result }) +pub fn transport_env( + t: Rc, + source_indices: Rc>>, +) -> Rc>> { + Rc::new({ + let mut __result = Vec::new(); + for p in t.properties.clone().iter().cloned() { + if !is_config_reserved_key(&field_init_node_name_at(p.clone(), source_indices.clone())) + { + __result.push(p); + } + } + __result + }) } pub fn map_children(node: &Rc, transform: impl Fn(Rc) -> Rc + Clone) -> Rc { Rc::new(Node { - name: node.name.clone(), - ident: node.ident.clone(), - span: node.span.clone(), - ident_span: node.ident_span.clone(), - children: Rc::new({ let mut __result = Vec::new(); for child in node.children.clone().iter().cloned() { __result.push(transform(child.clone())); } __result }), - connective: node.connective.clone(), - params: node.params.clone(), - inferred: node.inferred.clone(), - return_cardinality: node.return_cardinality.clone(), - uses: node.uses.clone(), - body: node.body.clone(), - transport: node.transport.clone(), - properties: node.properties.clone(), - type_annotation: node.type_annotation.clone(), - is_self_recursive: node.is_self_recursive.clone(), - has_non_tail_self_call: node.has_non_tail_self_call.clone(), - match_pattern: node.match_pattern.clone(), - expr_data: node.expr_data.clone(), -}) -} - -pub fn expr_has_self_call(texpr: &Rc, fn_name: &String, source_indices: &Rc>>) -> bool { + name: node.name.clone(), + ident: node.ident.clone(), + span: node.span.clone(), + ident_span: node.ident_span.clone(), + children: Rc::new({ + let mut __result = Vec::new(); + for child in node.children.clone().iter().cloned() { + __result.push(transform(child.clone())); + } + __result + }), + connective: node.connective.clone(), + params: node.params.clone(), + inferred: node.inferred.clone(), + return_cardinality: node.return_cardinality.clone(), + uses: node.uses.clone(), + body: node.body.clone(), + transport: node.transport.clone(), + properties: node.properties.clone(), + type_annotation: node.type_annotation.clone(), + is_self_recursive: node.is_self_recursive.clone(), + has_non_tail_self_call: node.has_non_tail_self_call.clone(), + match_pattern: node.match_pattern.clone(), + expr_data: node.expr_data.clone(), + }) +} + +pub fn expr_has_self_call( + texpr: &Rc, + fn_name: &String, + source_indices: &Rc>>, +) -> bool { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*texpr.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => if (expr_call_func_at(texpr.clone(), source_indices.clone()).as_str() == fn_name.clone().as_str()) { - true - } else { - { let mut __found = false; for child in texpr.children.clone().iter().cloned() { if expr_has_self_call(&child, &fn_name, &source_indices) { __found = true; break; } } __found } - }, - _ => { let mut __found = false; for child in texpr.children.clone().iter().cloned() { if expr_has_self_call(&child, &fn_name, &source_indices) { __found = true; break; } } __found }, -} + ExprData::ExprCall { .. } => { + if (expr_call_func_at(texpr.clone(), source_indices.clone()).as_str() + == fn_name.clone().as_str()) + { + true + } else { + { + let mut __found = false; + for child in texpr.children.clone().iter().cloned() { + if expr_has_self_call(&child, &fn_name, &source_indices) { + __found = true; + break; + } + } + __found + } + } + } + _ => { + let mut __found = false; + for child in texpr.children.clone().iter().cloned() { + if expr_has_self_call(&child, &fn_name, &source_indices) { + __found = true; + break; + } + } + __found + } + } }) } -pub fn expr_has_non_tail_self_call(texpr: &Rc, fn_name: &String, in_tail: bool, source_indices: &Rc>>) -> bool { +pub fn expr_has_non_tail_self_call( + texpr: &Rc, + fn_name: &String, + in_tail: bool, + source_indices: &Rc>>, +) -> bool { stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { match (*texpr.expr_data.clone()).clone() { - ExprData::ExprCall { .. } => if (expr_call_func_at(texpr.clone(), source_indices.clone()).as_str() == fn_name.clone().as_str()) { - if (in_tail.clone() == false) { - true - } else { - { let mut __found = false; for child in texpr.children.clone().iter().cloned() { if expr_has_non_tail_self_call(&child, &fn_name, false, &source_indices) { __found = true; break; } } __found } - } - } else { - { let mut __found = false; for child in texpr.children.clone().iter().cloned() { if expr_has_non_tail_self_call(&child, &fn_name, false, &source_indices) { __found = true; break; } } __found } - }, - ExprData::ExprError { .. } => false, - ExprData::ExprVar { .. } => false, - ExprData::ExprLiteral { .. } => false, - ExprData::ExprFieldAccess { .. } => { let mut __found = false; for child in texpr.children.clone().iter().cloned() { if expr_has_non_tail_self_call(&child, &fn_name, false, &source_indices) { __found = true; break; } } __found }, - ExprData::ExprMethodCall { .. } => { let mut __found = false; for child in texpr.children.clone().iter().cloned() { if expr_has_non_tail_self_call(&child, &fn_name, false, &source_indices) { __found = true; break; } } __found }, - ExprData::ExprIf => { - let cond_bad = expr_has_non_tail_self_call(&if_condition(texpr.clone()), &fn_name, false, &source_indices); -let then_bad = expr_has_non_tail_self_call(&if_then_branch(texpr.clone()), &fn_name, in_tail.clone(), &source_indices); -let else_bad = match if_else_branch(texpr.clone()) { - Some(e) => expr_has_non_tail_self_call(&e, &fn_name, in_tail.clone(), &source_indices), - None => false, -}; -((cond_bad || then_bad) || else_bad) -}, - ExprData::ExprMatch => { - let scrut_bad = expr_has_non_tail_self_call(&match_scrutinee(texpr.clone()), &fn_name, false, &source_indices); -let arms_bad = { let mut __found = false; for arm_node in match_arm_nodes(texpr.clone()).iter().cloned() { if expr_has_non_tail_self_call(&arm_body(&arm_node), &fn_name, in_tail.clone(), &source_indices) { __found = true; break; } } __found }; -(scrut_bad || arms_bad) -}, - ExprData::ExprLet => { - let val_bad = expr_has_non_tail_self_call(&let_value(texpr.clone()), &fn_name, false, &source_indices); -let body_bad = match let_body(texpr.clone()) { - Some(b) => expr_has_non_tail_self_call(&b, &fn_name, in_tail.clone(), &source_indices), - None => false, -}; -(val_bad || body_bad) -}, - ExprData::ExprBlock => { - let ss = texpr.children.clone(); -let ss_count = (ss.clone().len() as i64); -if (ss_count.clone() == 0) { - false - } else { + ExprData::ExprCall { .. } => { + if (expr_call_func_at(texpr.clone(), source_indices.clone()).as_str() + == fn_name.clone().as_str()) { - let init_bad = { let mut __found = false; for p in Rc::new({ let mut __result = Vec::new(); for p in Rc::new(ss.clone().iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned() { if (p.0.clone() < (ss_count.clone() - 1)) { __result.push(p); } } __result }).iter().cloned() { if expr_has_non_tail_self_call(&p.1.clone(), &fn_name, false, &source_indices) { __found = true; break; } } __found }; -let last_bad = match ss.clone().last().cloned() { - Some(last_expr) => expr_has_non_tail_self_call(&last_expr, &fn_name, in_tail.clone(), &source_indices), - None => false, -}; -(init_bad || last_bad) -} + if (in_tail.clone() == false) { + true + } else { + { + let mut __found = false; + for child in texpr.children.clone().iter().cloned() { + if expr_has_non_tail_self_call( + &child, + &fn_name, + false, + &source_indices, + ) { + __found = true; + break; + } + } + __found + } + } + } else { + { + let mut __found = false; + for child in texpr.children.clone().iter().cloned() { + if expr_has_non_tail_self_call(&child, &fn_name, false, &source_indices) + { + __found = true; + break; + } + } + __found + } + } } -}, - ExprData::ExprReturn => { let mut __found = false; for child in texpr.children.clone().iter().cloned() { if expr_has_non_tail_self_call(&child, &fn_name, true, &source_indices) { __found = true; break; } } __found }, - ExprData::NoExprData => { let mut __found = false; for child in texpr.children.clone().iter().cloned() { if expr_has_non_tail_self_call(&child, &fn_name, in_tail.clone(), &source_indices) { __found = true; break; } } __found }, - _ => { let mut __found = false; for child in texpr.children.clone().iter().cloned() { if expr_has_non_tail_self_call(&child, &fn_name, false, &source_indices) { __found = true; break; } } __found }, -} + ExprData::ExprError { .. } => false, + ExprData::ExprVar { .. } => false, + ExprData::ExprLiteral { .. } => false, + ExprData::ExprFieldAccess { .. } => { + let mut __found = false; + for child in texpr.children.clone().iter().cloned() { + if expr_has_non_tail_self_call(&child, &fn_name, false, &source_indices) { + __found = true; + break; + } + } + __found + } + ExprData::ExprMethodCall { .. } => { + let mut __found = false; + for child in texpr.children.clone().iter().cloned() { + if expr_has_non_tail_self_call(&child, &fn_name, false, &source_indices) { + __found = true; + break; + } + } + __found + } + ExprData::ExprIf => { + let cond_bad = expr_has_non_tail_self_call( + &if_condition(texpr.clone()), + &fn_name, + false, + &source_indices, + ); + let then_bad = expr_has_non_tail_self_call( + &if_then_branch(texpr.clone()), + &fn_name, + in_tail.clone(), + &source_indices, + ); + let else_bad = match if_else_branch(texpr.clone()) { + Some(e) => { + expr_has_non_tail_self_call(&e, &fn_name, in_tail.clone(), &source_indices) + } + None => false, + }; + ((cond_bad || then_bad) || else_bad) + } + ExprData::ExprMatch => { + let scrut_bad = expr_has_non_tail_self_call( + &match_scrutinee(texpr.clone()), + &fn_name, + false, + &source_indices, + ); + let arms_bad = { + let mut __found = false; + for arm_node in match_arm_nodes(texpr.clone()).iter().cloned() { + if expr_has_non_tail_self_call( + &arm_body(&arm_node), + &fn_name, + in_tail.clone(), + &source_indices, + ) { + __found = true; + break; + } + } + __found + }; + (scrut_bad || arms_bad) + } + ExprData::ExprLet => { + let val_bad = expr_has_non_tail_self_call( + &let_value(texpr.clone()), + &fn_name, + false, + &source_indices, + ); + let body_bad = match let_body(texpr.clone()) { + Some(b) => { + expr_has_non_tail_self_call(&b, &fn_name, in_tail.clone(), &source_indices) + } + None => false, + }; + (val_bad || body_bad) + } + ExprData::ExprBlock => { + let ss = texpr.children.clone(); + let ss_count = (ss.clone().len() as i64); + if (ss_count.clone() == 0) { + false + } else { + { + let init_bad = { + let mut __found = false; + for p in Rc::new({ + let mut __result = Vec::new(); + for p in Rc::new( + ss.clone() + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + { + if (p.0.clone() < (ss_count.clone() - 1)) { + __result.push(p); + } + } + __result + }) + .iter() + .cloned() + { + if expr_has_non_tail_self_call( + &p.1.clone(), + &fn_name, + false, + &source_indices, + ) { + __found = true; + break; + } + } + __found + }; + let last_bad = match ss.clone().last().cloned() { + Some(last_expr) => expr_has_non_tail_self_call( + &last_expr, + &fn_name, + in_tail.clone(), + &source_indices, + ), + None => false, + }; + (init_bad || last_bad) + } + } + } + ExprData::ExprReturn => { + let mut __found = false; + for child in texpr.children.clone().iter().cloned() { + if expr_has_non_tail_self_call(&child, &fn_name, true, &source_indices) { + __found = true; + break; + } + } + __found + } + ExprData::NoExprData => { + let mut __found = false; + for child in texpr.children.clone().iter().cloned() { + if expr_has_non_tail_self_call( + &child, + &fn_name, + in_tail.clone(), + &source_indices, + ) { + __found = true; + break; + } + } + __found + } + _ => { + let mut __found = false; + for child in texpr.children.clone().iter().cloned() { + if expr_has_non_tail_self_call(&child, &fn_name, false, &source_indices) { + __found = true; + break; + } + } + __found + } + } }) } -pub fn service_config_properties(endpoint: Rc, auth: Option>, auth_input: Option>, auth_source: Option>, rate_limit: Option>, retry: Option>) -> Rc>> { +pub fn service_config_properties( + endpoint: Rc, + auth: Option>, + auth_input: Option>, + auth_source: Option>, + rate_limit: Option>, + retry: Option>, +) -> Rc>> { { let zero_span = make_span(0, 0); -let ep_prop = Rc::new(vec![make_field_init_node(&"svc_endpoint".to_string(), endpoint, zero_span.clone(), zero_span.clone())]); -let auth_prop = match auth { - Some(a) => Rc::new(vec![make_field_init_node(&"svc_auth".to_string(), a.clone(), zero_span.clone(), zero_span.clone())]), - None => Rc::new(vec![]), -}; -let auth_input_prop = match auth_input { - Some(ai) => Rc::new(vec![make_field_init_node(&"svc_auth_input".to_string(), ai.clone(), zero_span.clone(), zero_span.clone())]), - None => Rc::new(vec![]), -}; -let auth_source_prop = match auth_source { - Some(src) => Rc::new(vec![make_field_init_node(&"svc_auth_source".to_string(), src.clone(), zero_span.clone(), zero_span.clone())]), - None => Rc::new(vec![]), -}; -let rate_prop = match rate_limit { - Some(r) => Rc::new(vec![make_field_init_node(&"svc_rate_limit".to_string(), r.clone(), zero_span.clone(), zero_span.clone())]), - None => Rc::new(vec![]), -}; -let retry_prop = match retry { - Some(r) => Rc::new(vec![make_field_init_node(&"svc_retry".to_string(), r.clone(), zero_span.clone(), zero_span.clone())]), - None => Rc::new(vec![]), -}; -v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(ep_prop, auth_prop), auth_input_prop), auth_source_prop), rate_prop), retry_prop) -} + let ep_prop = Rc::new(vec![make_field_init_node( + &"svc_endpoint".to_string(), + endpoint, + zero_span.clone(), + zero_span.clone(), + )]); + let auth_prop = match auth { + Some(a) => Rc::new(vec![make_field_init_node( + &"svc_auth".to_string(), + a.clone(), + zero_span.clone(), + zero_span.clone(), + )]), + None => Rc::new(vec![]), + }; + let auth_input_prop = match auth_input { + Some(ai) => Rc::new(vec![make_field_init_node( + &"svc_auth_input".to_string(), + ai.clone(), + zero_span.clone(), + zero_span.clone(), + )]), + None => Rc::new(vec![]), + }; + let auth_source_prop = match auth_source { + Some(src) => Rc::new(vec![make_field_init_node( + &"svc_auth_source".to_string(), + src.clone(), + zero_span.clone(), + zero_span.clone(), + )]), + None => Rc::new(vec![]), + }; + let rate_prop = match rate_limit { + Some(r) => Rc::new(vec![make_field_init_node( + &"svc_rate_limit".to_string(), + r.clone(), + zero_span.clone(), + zero_span.clone(), + )]), + None => Rc::new(vec![]), + }; + let retry_prop = match retry { + Some(r) => Rc::new(vec![make_field_init_node( + &"svc_retry".to_string(), + r.clone(), + zero_span.clone(), + zero_span.clone(), + )]), + None => Rc::new(vec![]), + }; + v2_rt::concat( + v2_rt::concat( + v2_rt::concat( + v2_rt::concat(v2_rt::concat(ep_prop, auth_prop), auth_input_prop), + auth_source_prop, + ), + rate_prop, + ), + retry_prop, + ) + } } -pub fn has_service_config(n: Rc, source_indices: Rc>>) -> bool { - { let mut __found = false; for p in n.properties.clone().iter().cloned() { if (field_init_node_name_at(p.clone(), source_indices.clone()).as_str() == "svc_endpoint".to_string().as_str()) { __found = true; break; } } __found } +pub fn has_service_config( + n: Rc, + source_indices: Rc>>, +) -> bool { + { + let mut __found = false; + for p in n.properties.clone().iter().cloned() { + if (field_init_node_name_at(p.clone(), source_indices.clone()).as_str() + == "svc_endpoint".to_string().as_str()) + { + __found = true; + break; + } + } + __found + } } -pub fn service_config_endpoint(n: Rc, source_indices: Rc>>) -> Option> { - find_property(n.properties.clone(), "svc_endpoint".to_string(), source_indices) +pub fn service_config_endpoint( + n: Rc, + source_indices: Rc>>, +) -> Option> { + find_property( + n.properties.clone(), + "svc_endpoint".to_string(), + source_indices, + ) } -pub fn service_config_auth(n: Rc, source_indices: Rc>>) -> Option> { +pub fn service_config_auth( + n: Rc, + source_indices: Rc>>, +) -> Option> { find_property(n.properties.clone(), "svc_auth".to_string(), source_indices) } -pub fn service_config_rate_limit(n: Rc, source_indices: Rc>>) -> Option> { - find_property(n.properties.clone(), "svc_rate_limit".to_string(), source_indices) -} - -pub fn service_config_retry(n: Rc, source_indices: Rc>>) -> Option> { - find_property(n.properties.clone(), "svc_retry".to_string(), source_indices) -} - -pub fn service_config_auth_input(n: Rc, source_indices: Rc>>) -> Option> { - find_property(n.properties.clone(), "svc_auth_input".to_string(), source_indices) -} - -pub fn service_config_auth_source(n: Rc, source_indices: Rc>>) -> Option> { - find_property(n.properties.clone(), "svc_auth_source".to_string(), source_indices) +pub fn service_config_rate_limit( + n: Rc, + source_indices: Rc>>, +) -> Option> { + find_property( + n.properties.clone(), + "svc_rate_limit".to_string(), + source_indices, + ) +} + +pub fn service_config_retry( + n: Rc, + source_indices: Rc>>, +) -> Option> { + find_property( + n.properties.clone(), + "svc_retry".to_string(), + source_indices, + ) +} + +pub fn service_config_auth_input( + n: Rc, + source_indices: Rc>>, +) -> Option> { + find_property( + n.properties.clone(), + "svc_auth_input".to_string(), + source_indices, + ) +} + +pub fn service_config_auth_source( + n: Rc, + source_indices: Rc>>, +) -> Option> { + find_property( + n.properties.clone(), + "svc_auth_source".to_string(), + source_indices, + ) +} + +pub fn module_node( + name: &String, + imports: Rc>>, + items: Rc>>, + span: &Rc, +) -> Rc { + Rc::new(Node { + name: name.clone(), + span: span.clone(), + ident_span: default_ident_span(name.clone(), span.clone()), + children: items, + connective: Connective::NoConnective, + params: imports, + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }) } -pub fn module_node(name: &String, imports: Rc>>, items: Rc>>, span: &Rc) -> Rc { - Rc::new(Node { - name: name.clone(), - span: span.clone(), - ident_span: default_ident_span(name.clone(), span.clone()), - children: items, - connective: Connective::NoConnective, - params: imports, - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}) -} - -pub fn import_node(module_path: String, is_all: bool, specific_names: Rc>>, span: &Rc, name_span: Rc) -> Rc { +pub fn import_node( + module_path: String, + is_all: bool, + specific_names: Rc>>, + span: &Rc, + name_span: Rc, +) -> Rc { { let wildcard_marker = if is_all { Some(Rc::new(Node { - name: "".to_string(), - span: span.clone(), - ident_span: None, - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -})) + name: "".to_string(), + span: span.clone(), + ident_span: None, + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + })) } else { None }; -Rc::new(Node { - name: module_path, - span: span.clone(), - ident_span: Some(name_span), - children: specific_names, - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: wildcard_marker, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}) -} + Rc::new(Node { + name: module_path, + span: span.clone(), + ident_span: Some(name_span), + children: specific_names, + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: wildcard_marker, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }) + } } pub fn import_is_all(n: Rc) -> bool { (n.body.clone() != None) } -pub fn import_specific_names_at(n: Rc, source_indices: Rc>>) -> Rc> { - Rc::new({ let mut __result = Vec::new(); for c in n.children.clone().iter().cloned() { __result.push(authored_name_at(source_indices.clone(), &c)); } __result }) +pub fn import_specific_names_at( + n: Rc, + source_indices: Rc>>, +) -> Rc> { + Rc::new({ + let mut __result = Vec::new(); + for c in n.children.clone().iter().cloned() { + __result.push(authored_name_at(source_indices.clone(), &c)); + } + __result + }) } pub fn module_imports(n: Rc) -> Rc>> { @@ -1971,200 +2922,203 @@ pub fn module_items(n: Rc) -> Rc>> { pub fn leaf_node_with_span(name: &String, span: &Rc) -> Rc { Rc::new(Node { - name: name.clone(), - span: span.clone(), - ident_span: default_ident_span(name.clone(), span.clone()), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}) + name: name.clone(), + span: span.clone(), + ident_span: default_ident_span(name.clone(), span.clone()), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }) } pub fn kernel_span(name: &String) -> Rc { Rc::new(SourceSpan { - file: v2_rt::concat(v2_rt::concat("".to_string()), - start: 0, - end: v2_rt::string_length(&name), -}) + file: v2_rt::concat( + v2_rt::concat("".to_string(), + ), + start: 0, + end: v2_rt::string_length(&name), + }) } pub fn unit_type() -> Rc { thread_local! { - static CACHED: Rc = { - Rc::new(Node { - name: "Unit".to_string(), - span: kernel_span(&"Unit".to_string()), - ident_span: Some(kernel_span(&"Unit".to_string())), - children: Rc::new(vec![]), - connective: Connective::Conj, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}) - }; - } + static CACHED: Rc = { + Rc::new(Node { + name: "Unit".to_string(), + span: kernel_span(&"Unit".to_string()), + ident_span: Some(kernel_span(&"Unit".to_string())), + children: Rc::new(vec![]), + connective: Connective::Conj, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }) + }; + } CACHED.with(|c| c.clone()) } pub fn bool_type() -> Rc { thread_local! { - static CACHED: Rc = { - Rc::new(Node { - name: "Bool".to_string(), - span: kernel_span(&"Bool".to_string()), - ident_span: Some(kernel_span(&"Bool".to_string())), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}) - }; - } + static CACHED: Rc = { + Rc::new(Node { + name: "Bool".to_string(), + span: kernel_span(&"Bool".to_string()), + ident_span: Some(kernel_span(&"Bool".to_string())), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }) + }; + } CACHED.with(|c| c.clone()) } pub fn string_type() -> Rc { thread_local! { - static CACHED: Rc = { - Rc::new(Node { - name: "String".to_string(), - span: kernel_span(&"String".to_string()), - ident_span: Some(kernel_span(&"String".to_string())), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}) - }; - } + static CACHED: Rc = { + Rc::new(Node { + name: "String".to_string(), + span: kernel_span(&"String".to_string()), + ident_span: Some(kernel_span(&"String".to_string())), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }) + }; + } CACHED.with(|c| c.clone()) } pub fn int_type() -> Rc { thread_local! { - static CACHED: Rc = { - Rc::new(Node { - name: "Int".to_string(), - span: kernel_span(&"Int".to_string()), - ident_span: Some(kernel_span(&"Int".to_string())), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}) - }; - } + static CACHED: Rc = { + Rc::new(Node { + name: "Int".to_string(), + span: kernel_span(&"Int".to_string()), + ident_span: Some(kernel_span(&"Int".to_string())), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }) + }; + } CACHED.with(|c| c.clone()) } pub fn float_type() -> Rc { thread_local! { - static CACHED: Rc = { - Rc::new(Node { - name: "Float".to_string(), - span: kernel_span(&"Float".to_string()), - ident_span: Some(kernel_span(&"Float".to_string())), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}) - }; - } + static CACHED: Rc = { + Rc::new(Node { + name: "Float".to_string(), + span: kernel_span(&"Float".to_string()), + ident_span: Some(kernel_span(&"Float".to_string())), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }) + }; + } CACHED.with(|c| c.clone()) } pub fn none_type() -> Rc { thread_local! { - static CACHED: Rc = { - Rc::new(Node { - name: "None".to_string(), - span: kernel_span(&"None".to_string()), - ident_span: Some(kernel_span(&"None".to_string())), - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: None, - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::NoExprData), - ident: None, -}) - }; - } + static CACHED: Rc = { + Rc::new(Node { + name: "None".to_string(), + span: kernel_span(&"None".to_string()), + ident_span: Some(kernel_span(&"None".to_string())), + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: None, + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::NoExprData), + ident: None, + }) + }; + } CACHED.with(|c| c.clone()) } @@ -2179,52 +3133,52 @@ pub fn tuple_type_name() -> String { pub fn error_type() -> Rc { thread_local! { - static CACHED: Rc = { - Rc::new(Node { - name: "".to_string(), - span: make_span(0, 0), - ident_span: None, - children: Rc::new(vec![]), - connective: Connective::NoConnective, - params: Rc::new(vec![]), - inferred: Some(Rc::new(InferredNode::CompilerError { - message: "unresolved type".to_string(), - span: make_span(0, 0), -})), - return_cardinality: Cardinality::Required, - uses: Rc::new(vec![]), - body: None, - transport: None, - properties: Rc::new(vec![]), - type_annotation: None, - is_self_recursive: false, - has_non_tail_self_call: false, - match_pattern: None, - expr_data: Rc::new(ExprData::ExprError { - kind: ExprErrorKind::SemanticExprError, - message: "unresolved type".to_string(), -}), - ident: None, -}) - }; - } + static CACHED: Rc = { + Rc::new(Node { + name: "".to_string(), + span: make_span(0, 0), + ident_span: None, + children: Rc::new(vec![]), + connective: Connective::NoConnective, + params: Rc::new(vec![]), + inferred: Some(Rc::new(InferredNode::CompilerError { + message: "unresolved type".to_string(), + span: make_span(0, 0), + })), + return_cardinality: Cardinality::Required, + uses: Rc::new(vec![]), + body: None, + transport: None, + properties: Rc::new(vec![]), + type_annotation: None, + is_self_recursive: false, + has_non_tail_self_call: false, + match_pattern: None, + expr_data: Rc::new(ExprData::ExprError { + kind: ExprErrorKind::SemanticExprError, + message: "unresolved type".to_string(), + }), + ident: None, + }) + }; + } CACHED.with(|c| c.clone()) } pub fn make_span(start: i64, end: i64) -> Rc { Rc::new(SourceSpan { - file: "".to_string(), - start: start, - end: end, -}) + file: "".to_string(), + start: start, + end: end, + }) } pub fn make_file_span(file: String, start: i64, end: i64) -> Rc { Rc::new(SourceSpan { - file: file, - start: start, - end: end, -}) + file: file, + start: start, + end: end, + }) } pub fn no_span() -> Rc { @@ -2247,17 +3201,29 @@ pub struct NewlineIndex { pub fn build_newline_index(file: String, source: &String) -> Rc { { let char_codes = Rc::new(source.clone().chars().map(|c| c as i64).collect::>()); -let offsets = Rc::new(char_codes.iter().cloned().enumerate().map(|(i, v)| (i as i64, v)).collect::>()).iter().cloned().fold(Rc::new(vec![]), |acc: _, pair: (i64, i64)| if (pair.1.clone() == 10) { - v2_rt::rc_list_push(acc.clone(), pair.0.clone()) - } else { - acc.clone() + let offsets = Rc::new( + char_codes + .iter() + .cloned() + .enumerate() + .map(|(i, v)| (i as i64, v)) + .collect::>(), + ) + .iter() + .cloned() + .fold(Rc::new(vec![]), |acc: _, pair: (i64, i64)| { + if (pair.1.clone() == 10) { + v2_rt::rc_list_push(acc.clone(), pair.0.clone()) + } else { + acc.clone() + } }); -Rc::new(NewlineIndex { - file: file, - offsets: offsets, - source: source.clone(), -}) -} + Rc::new(NewlineIndex { + file: file, + offsets: offsets, + source: source.clone(), + }) + } } pub fn byte_to_line_col(index: &Rc, offset: i64) -> LineCol { @@ -2267,40 +3233,65 @@ pub fn byte_to_line_col(index: &Rc, offset: i64) -> LineCol { } else { offset.clone() }; -let line = ((Rc::new({ let mut __result = Vec::new(); for o in index.offsets.clone().iter().cloned() { if (o.clone() < clamped.clone()) { __result.push(o); } } __result }).len() as i64) + 1); -let line_start = if (line.clone() <= 1) { + let line = ((Rc::new({ + let mut __result = Vec::new(); + for o in index.offsets.clone().iter().cloned() { + if (o.clone() < clamped.clone()) { + __result.push(o); + } + } + __result + }) + .len() as i64) + + 1); + let line_start = if (line.clone() <= 1) { 0 } else { - match index.offsets.clone().get((line.clone() - 2) as usize).cloned() { - Some(o) => (o.clone() + 1), - None => 0, -} + match index + .offsets + .clone() + .get((line.clone() - 2) as usize) + .cloned() + { + Some(o) => (o.clone() + 1), + None => 0, + } }; -let col = ((clamped.clone() - line_start) + 1); -LineCol { - line: line.clone(), - col: col, -} -} + let col = ((clamped.clone() - line_start) + 1); + LineCol { + line: line.clone(), + col: col, + } + } } pub fn source_line_at(index: &Rc, line: i64) -> String { { let src_len = v2_rt::string_length(&index.source.clone()); -let line_start = if (line.clone() <= 1) { + let line_start = if (line.clone() <= 1) { 0 } else { - match index.offsets.clone().get((line.clone() - 2) as usize).cloned() { - Some(o) => (o.clone() + 1), - None => src_len.clone(), -} + match index + .offsets + .clone() + .get((line.clone() - 2) as usize) + .cloned() + { + Some(o) => (o.clone() + 1), + None => src_len.clone(), + } }; -let line_end = match index.offsets.clone().get((line.clone() - 1) as usize).cloned() { - Some(o) => o.clone(), - None => src_len.clone(), -}; -v2_rt::substring(&index.source.clone(), line_start, line_end) -} + let line_end = match index + .offsets + .clone() + .get((line.clone() - 1) as usize) + .cloned() + { + Some(o) => o.clone(), + None => src_len.clone(), + }; + v2_rt::substring(&index.source.clone(), line_start, line_end) + } } pub fn source_text_at(index: Rc, span: &Rc) -> String { @@ -2322,119 +3313,135 @@ pub struct InternResult { pub fn empty_intern_table() -> Rc { Rc::new(InternTable { - strings: Rc::new(vec!["".to_string()]), - index: v2_rt::rc_map_insert(v2_rt::rc_empty_map::(), "".to_string(), 0), - next_id: 1, -}) + strings: Rc::new(vec!["".to_string()]), + index: v2_rt::rc_map_insert(v2_rt::rc_empty_map::(), "".to_string(), 0), + next_id: 1, + }) } pub fn intern(table: &Rc, s: &String) -> Rc { match v2_rt::map_get(&table.index.clone(), s.clone()) { - Some(id) => Rc::new(InternResult { - table: table.clone(), - id: id.clone(), -}), - None => { - let id = table.next_id.clone(); -Rc::new(InternResult { - table: Rc::new(InternTable { - strings: v2_rt::rc_list_push(table.strings.clone(), s.clone()), - index: v2_rt::rc_map_insert(table.index.clone(), s.clone(), id.clone()), - next_id: (id.clone() + 1), -}), - id: id.clone(), -}) -}, -} + Some(id) => Rc::new(InternResult { + table: table.clone(), + id: id.clone(), + }), + None => { + let id = table.next_id.clone(); + Rc::new(InternResult { + table: Rc::new(InternTable { + strings: v2_rt::rc_list_push(table.strings.clone(), s.clone()), + index: v2_rt::rc_map_insert(table.index.clone(), s.clone(), id.clone()), + next_id: (id.clone() + 1), + }), + id: id.clone(), + }) + } + } } pub fn intern_str(table: Rc, id: i64) -> String { match table.strings.clone().get(id as usize).cloned() { - Some(s) => s.clone(), - None => "".to_string(), -} + Some(s) => s.clone(), + None => "".to_string(), + } } pub fn intern_find(table: Rc, s: String) -> Option { match v2_rt::map_get(&table.index.clone(), s) { - Some(id) => Some(id.clone()), - None => None, -} + Some(id) => Some(id.clone()), + None => None, + } } pub fn intern_find_or_empty(table: Rc, s: String) -> i64 { match v2_rt::map_get(&table.index.clone(), s) { - Some(id) => id.clone(), - None => 0, -} + Some(id) => id.clone(), + None => 0, + } } pub fn merge_intern_tables(tables: Rc>>) -> Rc { - tables.iter().cloned().fold(empty_intern_table(), |merged: Rc, t: Rc| t.strings.clone().iter().cloned().fold(merged, |m: Rc, s: String| if (s.clone().as_str() == "".to_string().as_str()) { - m.clone() - } else { - intern(&m, &s).table.clone() - })) + tables.iter().cloned().fold( + empty_intern_table(), + |merged: Rc, t: Rc| { + t.strings + .clone() + .iter() + .cloned() + .fold(merged, |m: Rc, s: String| { + if (s.clone().as_str() == "".to_string().as_str()) { + m.clone() + } else { + intern(&m, &s).table.clone() + } + }) + }, + ) } pub fn is_internable_token(shape: TokenShape) -> bool { match shape { - TokenShape::ShIdent => true, - TokenShape::ShKeyword => true, - _ => false, -} + TokenShape::ShIdent => true, + TokenShape::ShKeyword => true, + _ => false, + } } pub fn pre_intern_tokens(tokens: Rc>>, table: Rc) -> Rc { - tokens.iter().cloned().fold(table, |t: Rc, tok: Rc| if is_internable_token(tok.shape.clone()) { - intern(&t, &tok.text.clone()).table.clone() - } else { - t.clone() - }) + tokens + .iter() + .cloned() + .fold(table, |t: Rc, tok: Rc| { + if is_internable_token(tok.shape.clone()) { + intern(&t, &tok.text.clone()).table.clone() + } else { + t.clone() + } + }) } pub fn with_optional_cardinality(n: &Rc) -> Rc { Rc::new(Node { - name: n.name.clone(), - ident: n.ident.clone(), - span: n.span.clone(), - ident_span: n.ident_span.clone(), - children: n.children.clone(), - connective: n.connective.clone(), - params: n.params.clone(), - inferred: n.inferred.clone(), - return_cardinality: Cardinality::CardOptional, - uses: n.uses.clone(), - body: n.body.clone(), - transport: n.transport.clone(), - properties: n.properties.clone(), - type_annotation: n.type_annotation.clone(), - is_self_recursive: n.is_self_recursive.clone(), - has_non_tail_self_call: n.has_non_tail_self_call.clone(), - match_pattern: n.match_pattern.clone(), - expr_data: n.expr_data.clone(), -}) + name: n.name.clone(), + ident: n.ident.clone(), + span: n.span.clone(), + ident_span: n.ident_span.clone(), + children: n.children.clone(), + connective: n.connective.clone(), + params: n.params.clone(), + inferred: n.inferred.clone(), + return_cardinality: Cardinality::CardOptional, + uses: n.uses.clone(), + body: n.body.clone(), + transport: n.transport.clone(), + properties: n.properties.clone(), + type_annotation: n.type_annotation.clone(), + is_self_recursive: n.is_self_recursive.clone(), + has_non_tail_self_call: n.has_non_tail_self_call.clone(), + match_pattern: n.match_pattern.clone(), + expr_data: n.expr_data.clone(), + }) } pub fn with_required_cardinality(n: &Rc) -> Rc { Rc::new(Node { - name: n.name.clone(), - ident: n.ident.clone(), - span: n.span.clone(), - ident_span: n.ident_span.clone(), - children: n.children.clone(), - connective: n.connective.clone(), - params: n.params.clone(), - inferred: n.inferred.clone(), - return_cardinality: Cardinality::Required, - uses: n.uses.clone(), - body: n.body.clone(), - transport: n.transport.clone(), - properties: n.properties.clone(), - type_annotation: n.type_annotation.clone(), - is_self_recursive: n.is_self_recursive.clone(), - has_non_tail_self_call: n.has_non_tail_self_call.clone(), - match_pattern: n.match_pattern.clone(), - expr_data: n.expr_data.clone(), -}) + name: n.name.clone(), + ident: n.ident.clone(), + span: n.span.clone(), + ident_span: n.ident_span.clone(), + children: n.children.clone(), + connective: n.connective.clone(), + params: n.params.clone(), + inferred: n.inferred.clone(), + return_cardinality: Cardinality::Required, + uses: n.uses.clone(), + body: n.body.clone(), + transport: n.transport.clone(), + properties: n.properties.clone(), + type_annotation: n.type_annotation.clone(), + is_self_recursive: n.is_self_recursive.clone(), + has_non_tail_self_call: n.has_non_tail_self_call.clone(), + match_pattern: n.match_pattern.clone(), + expr_data: n.expr_data.clone(), + }) }